From 500843bce431d9efaf9e4ef275501a6535024fc8 Mon Sep 17 00:00:00 2001 From: walshjon Date: Thu, 19 Mar 2015 03:19:04 -0700 Subject: [PATCH 001/519] user option to enforce LAB isotropic elastic, disable S(a,b) --- src/input_xml.F90 | 23 +++- src/list_header.F90 | 247 ++++++++++++++++++++++++++++++++++++++++ src/material_header.F90 | 3 + src/physics.F90 | 52 ++++++--- 4 files changed, 306 insertions(+), 19 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 4c1f3c244c..9b6259a57c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -7,7 +7,7 @@ module input_xml use error, only: fatal_error, warning use geometry_header, only: Cell, Surface, Lattice, RectLattice, HexLattice use global - use list_header, only: ListChar, ListReal + use list_header, only: ListChar, ListLog, ListReal use mesh_header, only: StructuredMesh use output, only: write_message use plot_header @@ -1577,6 +1577,7 @@ contains character(MAX_LINE_LEN) :: temp_str ! temporary string when reading type(ListChar) :: list_names ! temporary list of nuclide names type(ListReal) :: list_density ! temporary list of nuclide densities + type(ListLog) :: list_iso_lab ! temporary list of isotropic lab scatterers type(Material), pointer :: mat => null() type(Node), pointer :: doc => null() type(Node), pointer :: node_mat => null() @@ -1731,6 +1732,20 @@ contains end if end if + ! Check enforced isotropic lab scattering + if (check_for_node(node_nuc, "lab")) then + call get_node_value(node_nuc, "lab", temp_str) + if (trim(adjustl(to_lower(temp_str))) == "true") then + call list_iso_lab % append(.true.) + else if (trim(adjustl(to_lower(temp_str))) == "false") then + call list_iso_lab % append(.false.) + else + call fatal_error("Isotropic lab scattering must be true or false") + end if + else + call list_iso_lab % append(.false.) + end if + ! store full name call get_node_value(node_nuc, "name", temp_str) if (check_for_node(node_nuc, "xs")) & @@ -1822,6 +1837,7 @@ contains allocate(mat % names(n)) allocate(mat % nuclide(n)) allocate(mat % atom_density(n)) + allocate(mat % p0(n)) ALL_NUCLIDES: do j = 1, mat % n_nuclides ! Check that this nuclide is listed in the cross_sections.xml file @@ -1858,6 +1874,10 @@ contains ! Copy name and atom/weight percent mat % names(j) = name mat % atom_density(j) = list_density % get_item(j) + + ! Copy isotropic lab scattering flag + mat % p0(j) = list_iso_lab % get_item(j) + end do ALL_NUCLIDES ! Check to make sure either all atom percents or all weight percents are @@ -1874,6 +1894,7 @@ contains ! Clear lists call list_names % clear() call list_density % clear() + call list_iso_lab % clear() ! ======================================================================= ! READ AND PARSE TAG FOR S(a,b) DATA diff --git a/src/list_header.F90 b/src/list_header.F90 index a9311ec64a..e4cc56ed0a 100644 --- a/src/list_header.F90 +++ b/src/list_header.F90 @@ -34,6 +34,13 @@ module list_header type(ListElemChar), pointer :: prev => null() end type ListElemChar + type :: ListElemLog + logical :: data + type(ListElemLog), pointer :: next => null() + type(ListElemLog), pointer :: prev => null() + end type ListElemLog + + !=============================================================================== ! LIST* types contain the linked list with convenience methods. We originally ! considered using unlimited polymorphism to provide a single type, but compiler @@ -107,6 +114,28 @@ module list_header procedure :: size => list_size_char ! Size of list end type ListChar + type, public :: ListLog + private + integer :: count = 0 ! Number of elements in list + + ! Used in get_item for fast sequential lookups + integer :: last_index = huge(0) + type(ListElemLog), pointer :: last_elem => null() + + ! Pointers to beginning and end of list + type(ListElemLog), public, pointer :: head => null() + type(ListElemLog), public, pointer :: tail => null() + contains + procedure :: append => list_append_log ! Add item to end of list + procedure :: clear => list_clear_log ! Remove all items + procedure :: contains => list_contains_log ! Does list contain? + procedure :: get_item => list_get_item_log ! Get i-th item in list + procedure :: index => list_index_log ! Determine index of given item + procedure :: insert => list_insert_log ! Insert item in i-th position + procedure :: remove => list_remove_log ! Remove specified item + procedure :: size => list_size_log ! Size of list + end type ListLog + contains !=============================================================================== @@ -189,6 +218,31 @@ contains end subroutine list_append_char + subroutine list_append_log(this, data) + class(ListLog) :: this + logical :: data + + type(ListElemLog), pointer :: elem + + ! Create element and set dat + allocate(elem) + elem % data = data + + if (.not. associated(this % head)) then + ! If list is empty, set head and tail to new element + this % head => elem + this % tail => elem + else + ! Otherwise append element at end of list + this % tail % next => elem + elem % prev => this % tail + this % tail => this % tail % next + end if + + this % count = this % count + 1 + + end subroutine list_append_log + !=============================================================================== ! LIST_CLEAR removes all elements from the list !=============================================================================== @@ -271,6 +325,32 @@ contains end subroutine list_clear_char + subroutine list_clear_log(this) + class(ListLog) :: this + + type(ListElemLog), pointer :: current => null() + type(ListElemLog), pointer :: next => null() + + if (this % count > 0) then + current => this % head + do while (associated(current)) + ! Set pointer to next element + next => current % next + + ! Deallocate memory for current element + deallocate(current) + + ! Move to next element + current => next + end do + + nullify(this % head) + nullify(this % tail) + this % count = 0 + end if + + end subroutine list_clear_log + !=============================================================================== ! LIST_CONTAINS determines whether the list contains a specified item. Since it ! relies on the index method, it is O(n). @@ -303,6 +383,15 @@ contains end function list_contains_char + function list_contains_log(this, data) result(in_list) + class(ListLog) :: this + logical :: data + logical :: in_list + + in_list = (this % index(data) > 0) + + end function list_contains_log + !=============================================================================== ! LIST_GET_ITEM returns the item in the list at position 'i_list'. If the index ! is out of bounds, an error code is returned. @@ -407,6 +496,39 @@ contains end function list_get_item_char + function list_get_item_log(this, i_list) result(data) + class(ListLog) :: this + integer :: i_list + logical :: data + + integer :: last_index + + if (i_list < 1 .or. i_list > this % count) then + ! Check for index out of bounds + data = .false. + elseif (i_list == 1) then + data = this % head % data + this % last_index = 1 + this % last_elem => this % head + elseif (i_list == this % count) then + data = this % tail % data + this % last_index = this % count + this % last_elem => this % tail + else + if (i_list < this % last_index) then + this % last_index = 1 + this % last_elem => this % head + end if + + do last_index = this % last_index + 1, i_list + this % last_elem => this % last_elem % next + this % last_index = last_index + end do + data = this % last_elem % data + end if + + end function list_get_item_log + !=============================================================================== ! LIST_INDEX determines the first index in the list that contains 'data'. If ! 'data' is not present in the list, the return value is -1. @@ -475,6 +597,27 @@ contains end function list_index_char + function list_index_log(this, data) result(i_list) + + class(ListLog) :: this + logical :: data + integer :: i_list + + type(ListElemLog), pointer :: elem + + i_list = 0 + elem => this % head + do while (associated(elem)) + i_list = i_list + 1 + if (data .eqv. elem % data) exit + elem => elem % next + end do + + ! Check if we reached the end of the list + if (.not. associated(elem)) i_list = -1 + + end function list_index_log + !=============================================================================== ! LIST_INSERT inserts 'data' at index 'i_list' within the list. If 'i_list' ! exceeds the size of the list, the data is appends at the end of the list. @@ -646,6 +789,62 @@ contains end subroutine list_insert_char + subroutine list_insert_log(this, i_list, data) + + class(ListLog) :: this + integer :: i_list + logical :: data + + integer :: i + type(ListElemLog), pointer :: elem => null() + type(ListElemLog), pointer :: new_elem => null() + + if (i_list > this % count) then + ! Check whether specified index is greater than number of elements -- if + ! so, just append it to the end of the list + call this % append(data) + + else if (i_list == 1) then + ! Check for new head element + allocate(new_elem) + new_elem % data = data + new_elem % next => this % head + this % head => new_elem + this % count = this % count + 1 + + else + ! Default case with new element somewhere in middle of list + if (i_list >= this % last_index) then + i = this % last_index + elem => this % last_elem + else + i = 0 + elem => this % head + end if + do while (associated(elem)) + i = i + 1 + if (i == i_list - 1) then + ! Allocate new element + allocate(new_elem) + new_elem % data = data + + ! Put it before the i-th element + new_elem % prev => elem % prev + new_elem % next => elem + new_elem % prev % next => new_elem + new_elem % next % prev => new_elem + this % count = this % count + 1 + this % last_index = i_list + this % last_elem => new_elem + exit + end if + i = i + 1 + elem => elem % next + end do + end if + + end subroutine list_insert_log + !=============================================================================== ! LIST_REMOVE removes the first item in the list that contains 'data'. If 'data' ! is not in the list, no action is taken. @@ -768,6 +967,45 @@ contains end subroutine list_remove_char + subroutine list_remove_log(this, data) + + class(ListLog) :: this + logical :: data + + type(ListElemLog), pointer :: elem => null() + + elem => this % head + do while (associated(elem)) + ! Check for matching data + if (elem % data .eqv. data) then + + ! Determine whether the current element is the head, tail, or a middle + ! element + if (associated(elem, this % head)) then + this % head => elem % next + if (associated(elem, this % tail)) nullify(this % tail) + if (associated(this % head)) nullify(this % head % prev) + deallocate(elem) + else if (associated(elem, this % tail)) then + this % tail => elem % prev + deallocate(this % tail % next) + else + elem % prev % next => elem % next + elem % next % prev => elem % prev + deallocate(elem) + end if + + ! Decrease count and exit + this % count = this % count - 1 + exit + end if + + ! Advance pointers + elem => elem % next + end do + + end subroutine list_remove_log + !=============================================================================== ! LIST_SIZE returns the number of elements in the list !=============================================================================== @@ -799,4 +1037,13 @@ contains end function list_size_char + function list_size_log(this) result(size) + + class(ListLog) :: this + integer :: size + + size = this % count + + end function list_size_log + end module list_header diff --git a/src/material_header.F90 b/src/material_header.F90 index fca735fd2a..8dd2714006 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -25,6 +25,9 @@ module material_header ! Does this material contain fissionable nuclides? logical :: fissionable = .false. + ! enforce isotropic scattering in lab + logical, allocatable :: p0(:) + end type Material end module material_header diff --git a/src/physics.F90 b/src/physics.F90 index 69bbcff345..624421b00e 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -73,11 +73,12 @@ contains type(Particle), intent(inout) :: p integer :: i_nuclide ! index in nuclides array + integer :: i_nuc_mat ! index in material's nuclides array integer :: i_reaction ! index in nuc % reactions array type(Nuclide), pointer, save :: nuc => null() !$omp threadprivate(nuc) - i_nuclide = sample_nuclide(p, 'total ') + call sample_nuclide(p, 'total ', i_nuclide, i_nuc_mat) ! Get pointer to table nuc => nuclides(i_nuclide) @@ -107,7 +108,7 @@ contains ! Sample a scattering reaction and determine the secondary energy of the ! exiting neutron - call scatter(p, i_nuclide) + call scatter(p, i_nuclide, i_nuc_mat) ! Play russian roulette if survival biasing is turned on @@ -122,13 +123,13 @@ contains ! SAMPLE_NUCLIDE !=============================================================================== - function sample_nuclide(p, base) result(i_nuclide) + subroutine sample_nuclide(p, base, i_nuclide, i_nuc_mat) type(Particle), intent(in) :: p character(7), intent(in) :: base ! which reaction to sample based on - integer :: i_nuclide + integer, intent(out) :: i_nuclide + integer, intent(out) :: i_nuc_mat - integer :: i real(8) :: prob real(8) :: cutoff real(8) :: atom_density ! atom density of nuclide in atom/b-cm @@ -149,20 +150,20 @@ contains cutoff = prn() * material_xs % fission end select - i = 0 + i_nuc_mat = 0 prob = ZERO do while (prob < cutoff) - i = i + 1 + i_nuc_mat = i_nuc_mat + 1 ! Check to make sure that a nuclide was sampled - if (i > mat % n_nuclides) then + if (i_nuc_mat > mat % n_nuclides) then call write_particle_restart(p) call fatal_error("Did not sample any nuclide during collision.") end if ! Find atom density - i_nuclide = mat % nuclide(i) - atom_density = mat % atom_density(i) + i_nuclide = mat % nuclide(i_nuc_mat) + atom_density = mat % atom_density(i_nuc_mat) ! Determine microscopic cross section select case (base) @@ -179,7 +180,7 @@ contains prob = prob + sigma end do - end function sample_nuclide + end subroutine sample_nuclide !=============================================================================== ! SAMPLE_FISSION @@ -303,10 +304,11 @@ contains ! SCATTER !=============================================================================== - subroutine scatter(p, i_nuclide) + subroutine scatter(p, i_nuclide, i_nuc_mat) type(Particle), intent(inout) :: p integer, intent(in) :: i_nuclide + integer, intent(in) :: i_nuc_mat integer :: i integer :: i_grid @@ -334,6 +336,10 @@ contains ! ELASTIC SCATTERING if (micro_xs(i_nuclide) % index_sab /= NONE) then + if (materials(p % material) % p0(i_nuc_mat)) & + & call fatal_error("thermal scattering law data and isotropic lab& + & scattering specified for the same nuclide") + ! S(a,b) scattering call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, & p % E, p % coord0 % uvw, p % mu) @@ -344,7 +350,8 @@ contains ! Perform collision physics for elastic scattering call elastic_scatter(i_nuclide, rxn, & - p % E, p % coord0 % uvw, p % mu, p % wgt) + p % E, p % coord0 % uvw, p % mu, p % wgt, & + & materials(p % material) % p0(i_nuc_mat)) end if p % event_MT = ELASTIC @@ -402,17 +409,19 @@ contains ! target. !=============================================================================== - subroutine elastic_scatter(i_nuclide, rxn, E, uvw, mu_lab, wgt) + subroutine elastic_scatter(i_nuclide, rxn, E, uvw, mu_lab, wgt, iso_lab) integer, intent(in) :: i_nuclide type(Reaction), pointer :: rxn real(8), intent(inout) :: E real(8), intent(inout) :: uvw(3) - real(8), intent(out) :: mu_lab real(8), intent(inout) :: wgt + logical, intent(in) :: iso_lab real(8) :: awr ! atomic weight ratio of target real(8) :: mu_cm ! cosine of polar angle in center-of-mass + real(8), intent(out) :: mu_lab ! cosine of polar angle in lab system + real(8) :: phi ! azimuthal angle real(8) :: vel ! magnitude of velocity real(8) :: v_n(3) ! velocity of neutron real(8) :: v_cm(3) ! velocity of center-of-mass @@ -466,10 +475,17 @@ contains ! compute cosine of scattering angle in LAB frame by taking dot product of ! neutron's pre- and post-collision angle - mu_lab = dot_product(uvw, v_n) / vel + if (iso_lab) then + mu_lab = TWO * prn() - ONE + phi = TWO * PI * prn() + uvw = [mu_lab, cos(phi)*sqrt(ONE - mu_lab*mu_lab), & + & sin(phi)*sqrt(ONE - mu_lab*mu_lab)] + else + ! Set energy and direction of particle in LAB frame + uvw = v_n / vel + end if - ! Set energy and direction of particle in LAB frame - uvw = v_n / vel + mu_lab = dot_product(uvw, v_n) / vel end subroutine elastic_scatter From 77a995bbeae985d18a19b1eded7c2d5312f7dd9d Mon Sep 17 00:00:00 2001 From: walshjon Date: Sun, 22 Mar 2015 09:28:36 -0700 Subject: [PATCH 002/519] option to force all collisions to be lab isotropic --- src/physics.F90 | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/physics.F90 b/src/physics.F90 index 624421b00e..5691c9c0f1 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -394,7 +394,7 @@ contains ! Perform collision physics for inelastic scattering call inelastic_scatter(nuc, rxn, p % E, p % coord0 % uvw, & - p % mu, p % wgt) + p % mu, p % wgt, materials(p % material) % p0(i_nuc_mat)) p % event_MT = rxn % MT end if @@ -416,16 +416,17 @@ contains real(8), intent(inout) :: E real(8), intent(inout) :: uvw(3) real(8), intent(inout) :: wgt + real(8), intent(out) :: mu_lab ! cosine of polar angle in lab system logical, intent(in) :: iso_lab real(8) :: awr ! atomic weight ratio of target real(8) :: mu_cm ! cosine of polar angle in center-of-mass - real(8), intent(out) :: mu_lab ! cosine of polar angle in lab system real(8) :: phi ! azimuthal angle real(8) :: vel ! magnitude of velocity real(8) :: v_n(3) ! velocity of neutron real(8) :: v_cm(3) ! velocity of center-of-mass real(8) :: v_t(3) ! velocity of target nucleus + real(8) :: uvw_in(3) ! incoming direction real(8) :: uvw_cm(3) ! directional cosines in center-of-mass type(Nuclide), pointer, save :: nuc => null() !$omp threadprivate(nuc) @@ -439,6 +440,9 @@ contains ! Neutron velocity in LAB v_n = vel * uvw + ! incoming direction + uvw_in(:) = uvw(:) + ! Sample velocity of target nucleus if (.not. micro_xs(i_nuclide) % use_ptable) then call sample_target_velocity(nuc, v_t, E, uvw, v_n, wgt, & @@ -474,18 +478,17 @@ contains vel = sqrt(E) ! compute cosine of scattering angle in LAB frame by taking dot product of - ! neutron's pre- and post-collision angle + ! neutron's pre- and post-collision unit vectors if (iso_lab) then - mu_lab = TWO * prn() - ONE + uvw(1) = TWO * prn() - ONE phi = TWO * PI * prn() - uvw = [mu_lab, cos(phi)*sqrt(ONE - mu_lab*mu_lab), & - & sin(phi)*sqrt(ONE - mu_lab*mu_lab)] + uvw(2) = cos(phi) * sqrt(ONE - uvw(1)*uvw(1)) + uvw(3) = sin(phi) * sqrt(ONE - uvw(1)*uvw(1)) else - ! Set energy and direction of particle in LAB frame uvw = v_n / vel end if - mu_lab = dot_product(uvw, v_n) / vel + mu_lab = dot_product(uvw_in, uvw) end subroutine elastic_scatter @@ -1293,7 +1296,7 @@ contains ! than fission), i.e. level scattering, (n,np), (n,na), etc. !=============================================================================== - subroutine inelastic_scatter(nuc, rxn, E, uvw, mu, wgt) + subroutine inelastic_scatter(nuc, rxn, E, uvw, mu, wgt, iso_lab) type(Nuclide), pointer :: nuc type(Reaction), pointer :: rxn @@ -1301,6 +1304,7 @@ contains real(8), intent(inout) :: uvw(3) ! directional cosines real(8), intent(out) :: mu ! cosine of scattering angle in lab real(8), intent(inout) :: wgt ! particle weight + logical, intent(in) :: iso_lab integer :: law ! secondary energy distribution law real(8) :: A ! atomic weight ratio of nuclide @@ -1308,9 +1312,12 @@ contains real(8) :: E_cm ! outgoing energy in center-of-mass real(8) :: Q ! Q-value of reaction real(8) :: yield ! neutron yield + real(8) :: uvw_in(3) ! incoming direction + real(8) :: phi ! azimuthal angle - ! copy energy of neutron + ! copy energy, direction of neutron E_in = E + uvw_in(:) = uvw(:) ! determine A and Q A = nuc % awr @@ -1344,8 +1351,17 @@ contains mu = mu * sqrt(E_cm/E) + ONE/(A+ONE) * sqrt(E_in/E) end if - ! change direction of particle - uvw = rotate_angle(uvw, mu) + ! compute cosine of scattering angle in LAB frame by taking dot product of + ! neutron's pre- and post-collision unit vectors + if (iso_lab) then + uvw(1) = TWO * prn() - ONE + phi = TWO * PI * prn() + uvw(2) = cos(phi) * sqrt(ONE - uvw(1)*uvw(1)) + uvw(3) = sin(phi) * sqrt(ONE - uvw(1)*uvw(1)) + mu = dot_product(uvw_in, uvw) + else + uvw = rotate_angle(uvw_in, mu) + end if ! change weight of particle based on yield if (rxn % multiplicity_with_E) then From 26bb80aff66528c8931d7adeced7bc2ee4f5864c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 1 Apr 2015 15:42:30 -0400 Subject: [PATCH 003/519] implemented delayed group tallies for computing delayed fractions --- src/ace.F90 | 52 +++++- src/ace_header.F90 | 38 ++-- src/bank_header.F90 | 9 +- src/constants.F90 | 72 ++++---- src/cross_section.F90 | 17 +- src/global.F90 | 7 +- src/hdf5_summary.F90 | 4 + src/initialize.F90 | 23 +-- src/input_xml.F90 | 153 +++++++++++++++- src/output.F90 | 73 +++++--- src/particle_header.F90 | 11 +- src/physics.F90 | 70 +++++--- src/tally.F90 | 389 +++++++++++++++++++++++++++++++++++++++- src/tracking.F90 | 5 + 14 files changed, 803 insertions(+), 120 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 3c75fe4a96..b566c40b65 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -5,7 +5,7 @@ module ace use constants use endf, only: reaction_name, is_fission, is_disappearance use error, only: fatal_error, warning - use fission, only: nu_total + use fission, only: nu_total, nu_delayed use global use list_header, only: ListInt use material_header, only: Material @@ -378,6 +378,10 @@ contains call generate_nu_fission(nuc) end if + if (nuc % fissionable .and. .not. data_0K) then + call generate_delay_nu_fission(nuc) + end if + case (ACE_THERMAL) sab => sab_tables(i_table) sab % name = name @@ -461,6 +465,7 @@ contains allocate(nuc % fission(NE)) allocate(nuc % nu_fission(NE)) allocate(nuc % absorption(NE)) + allocate(nuc % delay_nu_fission(NE)) ! initialize cross sections nuc % total = ZERO @@ -468,6 +473,7 @@ contains nuc % fission = ZERO nuc % nu_fission = ZERO nuc % absorption = ZERO + nuc % delay_nu_fission = ZERO ! Read data from XSS -- only the energy grid, elastic scattering and heating ! cross section values are actually read from here. The total and absorption @@ -635,6 +641,23 @@ contains ! Allocate space for secondary energy distribution NPCR = NXS(8) + + ! Check to make sure nuclide does not have more than the maximum number + ! of delayed groups + if (NPCR > MAX_DELAYED_GROUPS) then + call fatal_error("Encountered nuclide with " // trim(to_str(NPCR)) & + &// " delayed groups while the maximum number of delayed groups" & + &// " set in constants.F90 is " // trim(to_str(MAX_DELAYED_GROUPS))) + end if + + if (n_delayed_groups == 0) then + n_delayed_groups = NPCR + else if (n_delayed_groups /= NPCR) then + call fatal_error("Encountered nuclides with different numbers of " & + &// " delayed groups. Nuclides with " // trim(to_str(n_delayed_groups)) & + &// " and " // trim(to_str(NPCR)) // " delayed groups encountered.") + end if + nuc % n_precursor = NPCR allocate(nuc % nu_d_edist(NPCR)) @@ -1386,6 +1409,33 @@ contains end subroutine generate_nu_fission +!=============================================================================== +! GENERATE_DELAYED_NU_FISSION precalculates the microscopic nu-fission cross section for +! a given nuclide. This is done so that the nu_total function does not need to +! be called during cross section lookups. +!=============================================================================== + + subroutine generate_delay_nu_fission(nuc) + + type(Nuclide), pointer :: nuc + + integer :: i ! index on nuclide energy grid + real(8) :: E ! energy + real(8) :: nu_delay ! # of neutrons per fission + + do i = 1, nuc % n_grid + ! determine energy + E = nuc % energy(i) + + ! determine total nu at given energy + nu_delay = nu_delayed(nuc, E) + + ! determine delay-nu-fission microscopic cross section + nuc % delay_nu_fission(i) = nu_delay * nuc % fission(i) + end do + + end subroutine generate_delay_nu_fission + !=============================================================================== ! READ_THERMAL_DATA reads elastic and inelastic cross sections and corresponding ! secondary energy/angle distributions derived from experimental S(a,b) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 1f34a2311b..9462ff2dc9 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -113,6 +113,7 @@ module ace_header real(8), allocatable :: nu_fission(:) ! neutron production real(8), allocatable :: absorption(:) ! absorption (MT > 100) real(8), allocatable :: heating(:) ! heating + real(8), allocatable :: delay_nu_fission(:) ! delayed neutron production ! Resonance scattering info logical :: resonant = .false. ! resonant scatterer? @@ -256,16 +257,17 @@ module ace_header !=============================================================================== type NuclideMicroXS - integer :: index_grid ! index on nuclide energy grid - integer :: index_temp ! temperature index for nuclide - real(8) :: last_E = 0.0 ! last evaluated energy - real(8) :: interp_factor ! interpolation factor on nuc. energy grid - real(8) :: total ! microscropic total xs - real(8) :: elastic ! microscopic elastic scattering xs - real(8) :: absorption ! microscopic absorption xs - real(8) :: fission ! microscopic fission xs - real(8) :: nu_fission ! microscopic production xs - real(8) :: kappa_fission ! microscopic energy-released from fission + integer :: index_grid ! index on nuclide energy grid + integer :: index_temp ! temperature index for nuclide + real(8) :: last_E = 0.0 ! last evaluated energy + real(8) :: interp_factor ! interpolation factor on nuc. energy grid + real(8) :: total ! microscropic total xs + real(8) :: elastic ! microscopic elastic scattering xs + real(8) :: absorption ! microscopic absorption xs + real(8) :: fission ! microscopic fission xs + real(8) :: nu_fission ! microscopic production xs + real(8) :: kappa_fission ! microscopic energy-released from fission + real(8) :: delay_nu_fission ! microscopic delayed production xs ! Information for S(a,b) use integer :: index_sab ! index in sab_tables (zero means no table) @@ -283,12 +285,13 @@ module ace_header !=============================================================================== type MaterialMacroXS - real(8) :: total ! macroscopic total xs - real(8) :: elastic ! macroscopic elastic scattering xs - real(8) :: absorption ! macroscopic absorption xs - real(8) :: fission ! macroscopic fission xs - real(8) :: nu_fission ! macroscopic production xs - real(8) :: kappa_fission ! macroscopic energy-released from fission + real(8) :: total ! macroscopic total xs + real(8) :: elastic ! macroscopic elastic scattering xs + real(8) :: absorption ! macroscopic absorption xs + real(8) :: fission ! macroscopic fission xs + real(8) :: nu_fission ! macroscopic production xs + real(8) :: kappa_fission ! macroscopic energy-released from fission + real(8) :: delay_nu_fission ! macroscopic delayed production xs end type MaterialMacroXS contains @@ -377,7 +380,8 @@ module ace_header if (allocated(this % energy)) & deallocate(this % energy, this % total, this % elastic, & - & this % fission, this % nu_fission, this % absorption) + & this % fission, this % nu_fission, this % absorption, & + this % delay_nu_fission) if (allocated(this % energy_0K)) & deallocate(this % energy_0K) diff --git a/src/bank_header.F90 b/src/bank_header.F90 index 1a91f86f7a..ac8f6cd5c4 100644 --- a/src/bank_header.F90 +++ b/src/bank_header.F90 @@ -14,10 +14,11 @@ module bank_header ! sites are sent from one processor to another. sequence - real(8) :: wgt ! weight of bank site - real(8) :: xyz(3) ! location of bank particle - real(8) :: uvw(3) ! diretional cosines - real(8) :: E ! energy + real(8) :: wgt ! weight of bank site + real(8) :: xyz(3) ! location of bank particle + real(8) :: uvw(3) ! diretional cosines + real(8) :: E ! energy + integer :: delayed_group ! delayed group end type Bank end module bank_header diff --git a/src/constants.F90 b/src/constants.F90 index bac301e36a..5f30877070 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -253,28 +253,29 @@ module constants EVENT_ABSORB = 2 ! Tally score type - integer, parameter :: N_SCORE_TYPES = 20 + integer, parameter :: N_SCORE_TYPES = 21 integer, parameter :: & - SCORE_FLUX = -1, & ! flux - SCORE_TOTAL = -2, & ! total reaction rate - SCORE_SCATTER = -3, & ! scattering rate - SCORE_NU_SCATTER = -4, & ! scattering production rate - SCORE_SCATTER_N = -5, & ! arbitrary scattering moment - SCORE_SCATTER_PN = -6, & ! system for scoring 0th through nth moment - SCORE_NU_SCATTER_N = -7, & ! arbitrary nu-scattering moment - SCORE_NU_SCATTER_PN = -8, & ! system for scoring 0th through nth nu-scatter moment - SCORE_TRANSPORT = -9, & ! transport reaction rate - SCORE_N_1N = -10, & ! (n,1n) rate - SCORE_ABSORPTION = -11, & ! absorption rate - SCORE_FISSION = -12, & ! fission rate - SCORE_NU_FISSION = -13, & ! neutron production rate - SCORE_KAPPA_FISSION = -14, & ! fission energy production rate - SCORE_CURRENT = -15, & ! partial current - SCORE_FLUX_YN = -16, & ! angular moment of flux - SCORE_TOTAL_YN = -17, & ! angular moment of total reaction rate - SCORE_SCATTER_YN = -18, & ! angular flux-weighted scattering moment (0:N) - SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N) - SCORE_EVENTS = -20 ! number of events + SCORE_FLUX = -1, & ! flux + SCORE_TOTAL = -2, & ! total reaction rate + SCORE_SCATTER = -3, & ! scattering rate + SCORE_NU_SCATTER = -4, & ! scattering production rate + SCORE_SCATTER_N = -5, & ! arbitrary scattering moment + SCORE_SCATTER_PN = -6, & ! system for scoring 0th through nth moment + SCORE_NU_SCATTER_N = -7, & ! arbitrary nu-scattering moment + SCORE_NU_SCATTER_PN = -8, & ! system for scoring 0th through nth nu-scatter moment + SCORE_TRANSPORT = -9, & ! transport reaction rate + SCORE_N_1N = -10, & ! (n,1n) rate + SCORE_ABSORPTION = -11, & ! absorption rate + SCORE_FISSION = -12, & ! fission rate + SCORE_NU_FISSION = -13, & ! neutron production rate + SCORE_KAPPA_FISSION = -14, & ! fission energy production rate + SCORE_CURRENT = -15, & ! partial current + SCORE_FLUX_YN = -16, & ! angular moment of flux + SCORE_TOTAL_YN = -17, & ! angular moment of total reaction rate + SCORE_SCATTER_YN = -18, & ! angular flux-weighted scattering moment (0:N) + SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N) + SCORE_EVENTS = -20, & ! number of events + SCORE_DELAY_NU_FISSION = -21 ! delayed neutron production rate ! Maximum scattering order supported integer, parameter :: MAX_ANG_ORDER = 10 @@ -297,16 +298,17 @@ module constants integer, parameter :: NO_BIN_FOUND = -1 ! Tally filter and map types - integer, parameter :: N_FILTER_TYPES = 8 + integer, parameter :: N_FILTER_TYPES = 9 integer, parameter :: & - FILTER_UNIVERSE = 1, & - FILTER_MATERIAL = 2, & - FILTER_CELL = 3, & - FILTER_CELLBORN = 4, & - FILTER_SURFACE = 5, & - FILTER_MESH = 6, & - FILTER_ENERGYIN = 7, & - FILTER_ENERGYOUT = 8 + FILTER_UNIVERSE = 1, & + FILTER_MATERIAL = 2, & + FILTER_CELL = 3, & + FILTER_CELLBORN = 4, & + FILTER_SURFACE = 5, & + FILTER_MESH = 6, & + FILTER_ENERGYIN = 7, & + FILTER_ENERGYOUT = 8, & + FILTER_DELAYGROUP = 9 ! Tally surface current directions integer, parameter :: & @@ -398,4 +400,14 @@ module constants ! constant for writing out no residual real(8), parameter :: CMFD_NORES = 99999.0_8 + !============================================================================= + ! DELAYED NEUTRON PRECURSOR CONSTANTS + + ! Since cross section libraries come with different numbers of delayed groups + ! (e.g. ENDF/B-VII.1 has 6 and JEFF 3.1.1 has 8 delayed groups) and we don't + ! yet know what cross section library is being used when the tallies.xml file + ! is read in, we want to have an upper bound on the size of the array we + ! use to store the bins for delayed group tallies. + integer, parameter :: MAX_DELAYED_GROUPS = 8 + end module constants diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 1672405e8d..07504db230 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -4,7 +4,7 @@ module cross_section use constants use energy_grid, only: grid_method, log_spacing use error, only: fatal_error - use fission, only: nu_total + use fission, only: nu_total, nu_delayed use global use list_header, only: ListElemInt use material_header, only: Material @@ -42,6 +42,7 @@ contains material_xs % fission = ZERO material_xs % nu_fission = ZERO material_xs % kappa_fission = ZERO + material_xs % delay_nu_fission = ZERO ! Exit subroutine if material is void if (p % material == MATERIAL_VOID) return @@ -122,6 +123,10 @@ contains ! Add contributions to material macroscopic energy release from fission material_xs % kappa_fission = material_xs % kappa_fission + & atom_density * micro_xs(i_nuclide) % kappa_fission + + ! Add contributions to material macroscopic delay-nu-fission cross section + material_xs % delay_nu_fission = material_xs % delay_nu_fission + & + atom_density * micro_xs(i_nuclide) % delay_nu_fission end do end subroutine calculate_xs @@ -203,6 +208,7 @@ contains micro_xs(i_nuclide) % fission = ZERO micro_xs(i_nuclide) % nu_fission = ZERO micro_xs(i_nuclide) % kappa_fission = ZERO + micro_xs(i_nuclide) % delay_nu_fission = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * nuc % total(i_grid) & @@ -231,6 +237,11 @@ contains micro_xs(i_nuclide) % kappa_fission = & nuc % reactions(nuc % index_fission(1)) % Q_value * & micro_xs(i_nuclide) % fission + + ! Calculate microscopic nuclide delayed nu-fission cross section + micro_xs(i_nuclide) % delay_nu_fission = (ONE - f) * nuc % delay_nu_fission( & + i_grid) + f * nuc % delay_nu_fission(i_grid+1) + end if ! If there is S(a,b) data for this nuclide, we need to do a few @@ -498,10 +509,12 @@ contains micro_xs(i_nuclide) % fission = fission micro_xs(i_nuclide) % total = elastic + inelastic + capture + fission - ! Determine nu-fission cross section + ! Determine nu-fission and delay nu-fission cross section if (nuc % fissionable) then micro_xs(i_nuclide) % nu_fission = nu_total(nuc, E) * & micro_xs(i_nuclide) % fission + micro_xs(i_nuclide) % delay_nu_fission = nu_delayed(nuc, E) * & + micro_xs(i_nuclide) % fission end if end subroutine calculate_urr_xs diff --git a/src/global.F90 b/src/global.F90 index 004c43746e..007a772da2 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -68,9 +68,10 @@ module global type(NuclideMicroXS), allocatable :: micro_xs(:) ! Cache for each nuclide type(MaterialMacroXS) :: material_xs ! Cache for current material - integer :: n_nuclides_total ! Number of nuclide cross section tables - integer :: n_sab_tables ! Number of S(a,b) thermal scattering tables - integer :: n_listings ! Number of listings in cross_sections.xml + integer :: n_nuclides_total ! Number of nuclide cross section tables + integer :: n_sab_tables ! Number of S(a,b) thermal scattering tables + integer :: n_listings ! Number of listings in cross_sections.xml + integer :: n_delayed_groups = 0 ! Number of delayed groups in cross section library ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index e10ddc9828..6bd835b6ae 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -546,6 +546,10 @@ contains call su % write_data("energyout", "type_name", & group="tallies/tally " // trim(to_str(t % id)) & // "/filter " // trim(to_str(j))) + case(FILTER_DELAYGROUP) + call su % write_data("delaygroup", "type_name", & + group="tallies/tally " // trim(to_str(t % id)) & + // "/filter " // trim(to_str(j))) end select end do FILTER_LOOP diff --git a/src/initialize.F90 b/src/initialize.F90 index e39331675c..3550b3c283 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -173,9 +173,9 @@ contains subroutine initialize_mpi() - integer :: bank_blocks(4) ! Count for each datatype - integer :: bank_types(4) ! Datatypes - integer(MPI_ADDRESS_KIND) :: bank_disp(4) ! Displacements + integer :: bank_blocks(5) ! Count for each datatype + integer :: bank_types(5) ! Datatypes + integer(MPI_ADDRESS_KIND) :: bank_disp(5) ! Displacements integer :: temp_type ! temporary derived type integer :: result_blocks(1) ! Count for each datatype integer :: result_types(1) ! Datatypes @@ -207,18 +207,19 @@ contains ! CREATE MPI_BANK TYPE ! Determine displacements for MPI_BANK type - call MPI_GET_ADDRESS(b % wgt, bank_disp(1), mpi_err) - call MPI_GET_ADDRESS(b % xyz, bank_disp(2), mpi_err) - call MPI_GET_ADDRESS(b % uvw, bank_disp(3), mpi_err) - call MPI_GET_ADDRESS(b % E, bank_disp(4), mpi_err) + call MPI_GET_ADDRESS(b % wgt, bank_disp(1), mpi_err) + call MPI_GET_ADDRESS(b % xyz, bank_disp(2), mpi_err) + call MPI_GET_ADDRESS(b % uvw, bank_disp(3), mpi_err) + call MPI_GET_ADDRESS(b % E, bank_disp(4), mpi_err) + call MPI_GET_ADDRESS(b % delayed_group, bank_disp(5), mpi_err) ! Adjust displacements bank_disp = bank_disp - bank_disp(1) ! Define MPI_BANK for fission sites - bank_blocks = (/ 1, 3, 3, 1 /) - bank_types = (/ MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8 /) - call MPI_TYPE_CREATE_STRUCT(4, bank_blocks, bank_disp, & + bank_blocks = (/ 1, 3, 3, 1, 1 /) + bank_types = (/ MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8 /) + call MPI_TYPE_CREATE_STRUCT(5, bank_blocks, bank_disp, & bank_types, MPI_BANK, mpi_err) call MPI_TYPE_COMMIT(MPI_BANK, mpi_err) @@ -291,6 +292,8 @@ contains c_loc(tmpb(1)%uvw)), coordinates_t, hdf5_err) call h5tinsert_f(hdf5_bank_t, "E", h5offsetof(c_loc(tmpb(1)), & c_loc(tmpb(1)%E)), H5T_NATIVE_DOUBLE, hdf5_err) + call h5tinsert_f(hdf5_bank_t, "delayed_group", h5offsetof(c_loc(tmpb(1)), & + c_loc(tmpb(1)%delayed_group)), H5T_NATIVE_DOUBLE, hdf5_err) ! Determine type for integer(8) hdf5_integer8_t = h5kind_to_type(8, H5_INTEGER_KIND) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 4c1f3c244c..f9cef299a1 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1952,6 +1952,7 @@ contains subroutine read_tallies_xml() + integer :: d ! delayed group index integer :: i ! loop over user-specified tallies integer :: j ! loop over words integer :: k ! another loop index @@ -2357,6 +2358,20 @@ contains ! Set to analog estimator t % estimator = ESTIMATOR_ANALOG + case ('delaygroup') + ! Set type of filter + t % filters(j) % type = FILTER_DELAYGROUP + + ! Set number of bins + t % filters(j) % n_bins = MAX_DELAYED_GROUPS + + ! Allocate and store bins + allocate(t % filters(j) % int_bins(MAX_DELAYED_GROUPS)) + + do d = 1, MAX_DELAYED_GROUPS + t % filters(j) % int_bins(d) = d + end do + case default ! Specified tally filter is invalid, raise error call fatal_error("Unknown filter type '" & @@ -2593,6 +2608,12 @@ contains call fatal_error("Cannot tally flux with an outgoing energy & &filter.") end if + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally flux with a & + &delaygroup energy filter.") + end if + case ('flux-yn') ! Prohibit user from tallying flux for an individual nuclide if (.not. (t % n_nuclide_bins == 1 .and. & @@ -2605,6 +2626,11 @@ contains &filter.") end if + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally flux with a & + &delaygroup energy filter.") + end if + t % score_bins(j : j + n_bins - 1) = SCORE_FLUX_YN t % moment_order(j : j + n_bins - 1) = n_order j = j + n_bins - 1 @@ -2616,25 +2642,53 @@ contains &outgoing energy filter.") end if + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally total reaction rate with a & + &delaygroup energy filter.") + end if + case ('total-yn') if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally total reaction rate with an & &outgoing energy filter.") end if + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally total reaction rate with a & + &delaygroup energy filter.") + end if + t % score_bins(j : j + n_bins - 1) = SCORE_TOTAL_YN t % moment_order(j : j + n_bins - 1) = n_order j = j + n_bins - 1 case ('scatter') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally scatter with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_SCATTER case ('nu-scatter') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally nu scatter with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_NU_SCATTER ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG case ('scatter-n') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally scatter n with a & + &delaygroup energy filter.") + end if + if (n_order == 0) then t % score_bins(j) = SCORE_SCATTER else @@ -2645,6 +2699,12 @@ contains t % moment_order(j) = n_order case ('nu-scatter-n') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally nu scatter n with a & + &delaygroup energy filter.") + end if + ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG if (n_order == 0) then @@ -2655,6 +2715,12 @@ contains t % moment_order(j) = n_order case ('scatter-pn') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally scatter pn with a & + &delaygroup energy filter.") + end if + t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_PN @@ -2662,6 +2728,12 @@ contains j = j + n_bins - 1 case ('nu-scatter-pn') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally nu scatter pn with a & + &delaygroup energy filter.") + end if + t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_PN @@ -2669,6 +2741,12 @@ contains j = j + n_bins - 1 case ('scatter-yn') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally scatter yn with a & + &delaygroup energy filter.") + end if + t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_YN @@ -2676,6 +2754,12 @@ contains j = j + n_bins - 1 case ('nu-scatter-yn') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally nu scatter yn with a & + &delaygroup energy filter.") + end if + t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_YN @@ -2683,48 +2767,115 @@ contains j = j + n_bins - 1 case('transport') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally transport reaction rate with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_TRANSPORT ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG case ('diffusion') - call fatal_error("Diffusion score no longer supported for tallies, & + call fatal_error("Diffusion score no longer supported for tallies, & &please remove") case ('n1n') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally n1n with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_N_1N ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG case ('n2n') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally n2n with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = N_2N case ('n3n') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally n3n with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = N_3N case ('n4n') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally n4n with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = N_4N case ('absorption') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally absorption rate with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_ABSORPTION if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally absorption rate with an outgoing & &energy filter.") end if case ('fission') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally fission rate with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally fission rate with an outgoing & &energy filter.") end if case ('nu-fission') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally nu fission rate with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_NU_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG end if + case ('delay-nu-fission') + + t % score_bins(j) = SCORE_DELAY_NU_FISSION + if (t % find_filter(FILTER_ENERGYOUT) > 0) then + ! Set tally estimator to analog + t % estimator = ESTIMATOR_ANALOG + end if case ('kappa-fission') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally kappa fission with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_KAPPA_FISSION case ('current') + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + call fatal_error("Cannot tally current with a & + &delaygroup energy filter.") + end if + t % score_bins(j) = SCORE_CURRENT t % type = TALLY_SURFACE_CURRENT diff --git a/src/output.F90 b/src/output.F90 index 5599d8c56f..40b69eed70 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -317,6 +317,7 @@ contains ! Display weight, energy, grid index, and interpolation factor write(ou,*) ' Weight = ' // to_str(p % wgt) write(ou,*) ' Energy = ' // to_str(p % E) + write(ou,*) ' Delayed Group = ' // to_str(p % delayed_group) write(ou,*) end subroutine print_particle @@ -837,6 +838,17 @@ contains write(unit_,*) ' Outgoing Energy Bins:' // trim(string) end if + ! Write any delayed group bins if present + j = t % find_filter(FILTER_DELAYGROUP) + if (j > 0) then + string = "" + do i = 1, t % filters(j) % n_bins + string = trim(string) // ' ' // trim(to_str(& + t % filters(j) % int_bins(i))) + end do + write(unit_,*) ' Delay Group Bins:' // trim(string) + end if + ! Write nuclides bins write(unit_,fmt='(1X,A)',advance='no') ' Nuclide Bins:' do i = 1, t % n_nuclide_bins @@ -934,6 +946,8 @@ contains string = trim(string) // ' kappa-fission' case (SCORE_CURRENT) string = trim(string) // ' current' + case (SCORE_DELAY_NU_FISSION) + string = trim(string) // ' delay-nu-fission' case default string = trim(string) // ' ' // reaction_name(t % score_bins(j)) end select @@ -1706,35 +1720,37 @@ contains if (n_tallies == 0) return ! Initialize names for tally filter types - filter_name(FILTER_UNIVERSE) = "Universe" - filter_name(FILTER_MATERIAL) = "Material" - filter_name(FILTER_CELL) = "Cell" - filter_name(FILTER_CELLBORN) = "Birth Cell" - filter_name(FILTER_SURFACE) = "Surface" - filter_name(FILTER_MESH) = "Mesh" - filter_name(FILTER_ENERGYIN) = "Incoming Energy" - filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" + filter_name(FILTER_UNIVERSE) = "Universe" + filter_name(FILTER_MATERIAL) = "Material" + filter_name(FILTER_CELL) = "Cell" + filter_name(FILTER_CELLBORN) = "Birth Cell" + filter_name(FILTER_SURFACE) = "Surface" + filter_name(FILTER_MESH) = "Mesh" + filter_name(FILTER_ENERGYIN) = "Incoming Energy" + filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" + filter_name(FILTER_DELAYGROUP) = "Delay Group" ! Initialize names for scores - score_names(abs(SCORE_FLUX)) = "Flux" - score_names(abs(SCORE_TOTAL)) = "Total Reaction Rate" - score_names(abs(SCORE_SCATTER)) = "Scattering Rate" - score_names(abs(SCORE_NU_SCATTER)) = "Scattering Production Rate" - score_names(abs(SCORE_TRANSPORT)) = "Transport Rate" - score_names(abs(SCORE_N_1N)) = "(n,1n) Rate" - score_names(abs(SCORE_ABSORPTION)) = "Absorption Rate" - score_names(abs(SCORE_FISSION)) = "Fission Rate" - score_names(abs(SCORE_NU_FISSION)) = "Nu-Fission Rate" - score_names(abs(SCORE_KAPPA_FISSION)) = "Kappa-Fission Rate" - score_names(abs(SCORE_EVENTS)) = "Events" - score_names(abs(SCORE_FLUX_YN)) = "Flux Moment" - score_names(abs(SCORE_TOTAL_YN)) = "Total Reaction Rate Moment" - score_names(abs(SCORE_SCATTER_N)) = "Scattering Rate Moment" - score_names(abs(SCORE_SCATTER_PN)) = "Scattering Rate Moment" - score_names(abs(SCORE_SCATTER_YN)) = "Scattering Rate Moment" - score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment" - score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment" - score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_FLUX)) = "Flux" + score_names(abs(SCORE_TOTAL)) = "Total Reaction Rate" + score_names(abs(SCORE_SCATTER)) = "Scattering Rate" + score_names(abs(SCORE_NU_SCATTER)) = "Scattering Production Rate" + score_names(abs(SCORE_TRANSPORT)) = "Transport Rate" + score_names(abs(SCORE_N_1N)) = "(n,1n) Rate" + score_names(abs(SCORE_ABSORPTION)) = "Absorption Rate" + score_names(abs(SCORE_FISSION)) = "Fission Rate" + score_names(abs(SCORE_NU_FISSION)) = "Nu-Fission Rate" + score_names(abs(SCORE_KAPPA_FISSION)) = "Kappa-Fission Rate" + score_names(abs(SCORE_EVENTS)) = "Events" + score_names(abs(SCORE_FLUX_YN)) = "Flux Moment" + score_names(abs(SCORE_TOTAL_YN)) = "Total Reaction Rate Moment" + score_names(abs(SCORE_SCATTER_N)) = "Scattering Rate Moment" + score_names(abs(SCORE_SCATTER_PN)) = "Scattering Rate Moment" + score_names(abs(SCORE_SCATTER_YN)) = "Scattering Rate Moment" + score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_DELAY_NU_FISSION)) = "Delay-Nu-fission Rate" ! Create filename for tally output filename = trim(path_output) // "tallies.out" @@ -2143,6 +2159,9 @@ contains E0 = t % filters(i_filter) % real_bins(bin) E1 = t % filters(i_filter) % real_bins(bin + 1) label = "[" // trim(to_str(E0)) // ", " // trim(to_str(E1)) // ")" + case (FILTER_DELAYGROUP) + i = t % filters(i_filter) % int_bins(bin) + label = to_str(i) end select end function get_label diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 3e9dca7d56..7b922837ea 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -1,6 +1,6 @@ module particle_header - use constants, only: NEUTRON, ONE, NONE, ZERO + use constants, only: NEUTRON, ONE, NONE, ZERO, MAX_DELAYED_GROUPS use geometry_header, only: BASE_UNIVERSE implicit none @@ -63,10 +63,13 @@ module particle_header integer :: event ! scatter, absorption integer :: event_nuclide ! index in nuclides array integer :: event_MT ! reaction MT + integer :: delayed_group ! delayed group ! Post-collision physical data integer :: n_bank ! number of fission sites banked real(8) :: wgt_bank ! weight of fission sites banked + integer :: n_delay_bank(MAX_DELAYED_GROUPS) ! number of delayed fission + ! sites banked ! Indices for various arrays integer :: surface ! index for surface particle is on @@ -115,6 +118,7 @@ contains subroutine initialize_particle(this) class(Particle) :: this + integer :: d ! Clear coordinate lists call this % clear() @@ -135,6 +139,11 @@ contains this % wgt_bank = ZERO this % n_collision = 0 this % fission = .false. + this % delayed_group = 0 + + do d = 1, MAX_DELAYED_GROUPS + this % n_delay_bank(d) = 0 + end do ! Set up base level coordinates allocate(this % coord0) diff --git a/src/physics.F90 b/src/physics.F90 index 69bbcff345..2b728336ef 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1059,14 +1059,16 @@ contains integer, intent(in) :: i_nuclide integer, intent(in) :: i_reaction - integer :: i ! loop index - integer :: nu ! actual number of neutrons produced - integer :: ijk(3) ! indices in ufs mesh - real(8) :: nu_t ! total nu - real(8) :: mu ! fission neutron angular cosine - real(8) :: phi ! fission neutron azimuthal angle - real(8) :: weight ! weight adjustment for ufs method - logical :: in_mesh ! source site in ufs mesh? + integer :: d ! delayed group index + integer :: nu_delay(n_delayed_groups) ! number of delayed neutrons born + integer :: i ! loop index + integer :: nu ! actual number of neutrons produced + integer :: ijk(3) ! indices in ufs mesh + real(8) :: nu_t ! total nu + real(8) :: mu ! fission neutron angular cosine + real(8) :: phi ! fission neutron azimuthal angle + real(8) :: weight ! weight adjustment for ufs method + logical :: in_mesh ! source site in ufs mesh? type(Nuclide), pointer, save :: nuc => null() type(Reaction), pointer, save :: rxn => null() !$omp threadprivate(nuc, rxn) @@ -1117,6 +1119,13 @@ contains ! Bank source neutrons if (nu == 0 .or. n_bank == size(fission_bank)) return + + ! Initialize counter of delayed neutrons encountered for each delayed group + ! to zero. + do d = 1, n_delayed_groups + nu_delay(d) = 0 + end do + p % fission = .true. ! Fission neutrons will be banked do i = int(n_bank,4) + 1, int(min(n_bank + nu, int(size(fission_bank),8)),4) ! Bank source neutrons by copying particle data @@ -1139,15 +1148,26 @@ contains ! Sample secondary energy distribution for fission reaction and set energy ! in fission bank - fission_bank(i) % E = sample_fission_energy(nuc, rxn, p % E) + fission_bank(i) % E = sample_fission_energy(nuc, rxn, p) + + ! Set the delayed group of the neutron + fission_bank(i) % delayed_group = p % delayed_group + + ! Increment the number of neutrons born delayed + if (p % delayed_group > 0) then + nu_delay(p % delayed_group) = nu_delay(p % delayed_group) + 1 + end if end do ! increment number of bank sites n_bank = min(n_bank + nu, int(size(fission_bank),8)) - ! Store total weight banked for analog fission tallies + ! Store total and delayed weight banked for analog fission tallies p % n_bank = nu p % wgt_bank = nu/weight + do d = 1, n_delayed_groups + p % n_delay_bank(d) = nu_delay(d) + end do end subroutine create_fission_sites @@ -1155,12 +1175,12 @@ contains ! SAMPLE_FISSION_ENERGY !=============================================================================== - function sample_fission_energy(nuc, rxn, E) result(E_out) + function sample_fission_energy(nuc, rxn, p) result(E_out) - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn - real(8), intent(in) :: E ! incoming energy of neutron - real(8) :: E_out ! outgoing energy of fission neutron + type(Nuclide), pointer :: nuc + type(Reaction), pointer :: rxn + type(Particle), intent(inout) :: p ! Particle caussing fission + real(8) :: E_out ! outgoing energy of fission neutron integer :: j ! index on nu energy grid / precursor group integer :: lc ! index before start of energies/nu values @@ -1179,10 +1199,10 @@ contains !$omp threadprivate(edist) ! Determine total nu - nu_t = nu_total(nuc, E) + nu_t = nu_total(nuc, p % E) ! Determine delayed nu - nu_d = nu_delayed(nuc, E) + nu_d = nu_delayed(nuc, p % E) ! Determine delayed neutron fraction beta = nu_d / nu_t @@ -1202,7 +1222,7 @@ contains ! determine delayed neutron precursor yield for group j yield = interpolate_tab1(nuc % nu_d_precursor_data( & - lc+1:lc+2+2*NR+2*NE), E) + lc+1:lc+2+2*NR+2*NE), p % E) ! Check if this group is sampled prob = prob + yield @@ -1217,6 +1237,9 @@ contains ! n_precursor -- check for this condition j = min(j, nuc % n_precursor) + ! set the delayed group for the particle born from fission + p % delayed_group = j + ! select energy distribution for group j law = nuc % nu_d_edist(j) % law edist => nuc % nu_d_edist(j) @@ -1225,9 +1248,9 @@ contains n_sample = 0 do if (law == 44 .or. law == 61) then - call sample_energy(edist, E, E_out, mu) + call sample_energy(edist, p % E, E_out, mu) else - call sample_energy(edist, E, E_out) + call sample_energy(edist, p % E, E_out) end if ! resample if energy is >= 20 MeV @@ -1246,14 +1269,17 @@ contains ! ==================================================================== ! PROMPT NEUTRON SAMPLED + ! set the delayed group for the particle born from fission to 0 + p % delayed_group = 0 + ! sample from prompt neutron energy distribution law = rxn % edist % law n_sample = 0 do if (law == 44 .or. law == 61) then - call sample_energy(rxn%edist, E, E_out, prob) + call sample_energy(rxn%edist, p % E, E_out, prob) else - call sample_energy(rxn%edist, E, E_out) + call sample_energy(rxn%edist, p % E, E_out) end if ! resample if energy is >= 20 MeV diff --git a/src/tally.F90 b/src/tally.F90 index c96f1ecd6e..335bcf82ca 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -14,6 +14,9 @@ module tally use search, only: binary_search use string, only: to_str use tally_header, only: TallyResult, TallyMapItem, TallyMapElement + use fission, only: nu_total, nu_delayed + use output, only: write_message + use interpolation, only: interpolate_tab1 #ifdef MPI use mpi @@ -42,12 +45,18 @@ contains integer :: k ! loop index for nuclide bins integer :: n ! loop index for legendre order integer :: num_nm ! Number of N,M orders in harmonic - integer :: l ! scoring bin loop index, allowing for changing - ! position during the loop + integer :: l ! scoring bin loop index, allowing for + ! changing position during the loop integer :: filter_index ! single index for single bin integer :: score_bin ! scoring bin, e.g. SCORE_FLUX integer :: i_nuclide ! index in nuclides array integer :: score_index ! scoring bin index + integer :: lc ! pointer for interpolating in precursor + ! yield table + integer :: NR ! number of interpolation regions + integer :: NE ! number of interpolation energies + integer :: d ! delayed neutron index + real(8) :: yield ! delayed neutron yield real(8) :: score ! analog tally score real(8) :: last_wgt ! pre-collision particle weight real(8) :: wgt ! post-collision particle weight @@ -526,6 +535,107 @@ contains micro_xs(p % event_nuclide) % kappa_fission / & micro_xs(p % event_nuclide) % absorption end if + case (SCORE_DELAY_NU_FISSION) + + if (survival_biasing) then + ! No fission events occur if survival biasing is on -- need to + ! calculate fraction of absorptions that would have resulted in + ! delayed-nu-fission + + if (t % find_filter(FILTER_ENERGYOUT) > 0) then + ! Normally, we only need to make contributions to one scoring + ! bin. However, in the case of fission, since multiple fission + ! neutrons were emitted with different energies, multiple + ! outgoing energy bins may have been scored to. The following + ! logic treats this special case and results to multiple bins + + call score_fission_delayed_eout(p, t, score_index) + + else + + ! Normally, we only need to make contributions to one scoring + ! bin. However, in the case of fission, since multiple delayed + ! neutron groups will produce a fractional amount of neutrons on + ! each collision, multiple delayed group bins need to be scored to. + + if (micro_xs(p % event_nuclide) % fission > ZERO) then + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + + lc = 1 + do d = 1, n_delayed_groups + + ! determine number of interpolation regions and energies + NR = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 1)) + NE = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) + + ! determine delayed neutron precursor yield for group d + yield = interpolate_tab1(nuclides(p % event_nuclide) % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), p % E) + + ! advance pointer + lc = lc + 2 + 2*NR + 2*NE + 1 + + score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) % & + delay_nu_fission / micro_xs(p % event_nuclide) % absorption + + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + end do + else + score = p % absorb_wgt * micro_xs(p % event_nuclide) % & + delay_nu_fission / micro_xs(p % event_nuclide) % absorption + + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + end if + end if + end if + + cycle SCORE_LOOP + + else + + ! Skip any non-fission events or fission events that don't produce + ! delayed neutrons + if (.not. p % fission) cycle SCORE_LOOP + + if (t % find_filter(FILTER_ENERGYOUT) > 0) then + ! Normally, we only need to make contributions to one scoring + ! bin. However, in the case of fission, since multiple fission + ! neutrons were emitted with different energies, multiple + ! outgoing energy bins may have been scored to. The following + ! logic treats this special case and results to multiple bins + + call score_fission_delayed_eout(p, t, score_index) + cycle SCORE_LOOP + + else + ! If there is no outgoing energy filter, than we only need to + ! score to one bin. For the score to be 'analog', we need to + ! score the number of delayed particles that were banked in the + ! fission bank. Since this was weighted by 1/keff, we multiply + ! by keff to get the proper score. + + score = ZERO + + ! Loop over the neutrons produce from fission and check which + ! ones are delayed. If a delayed neutron is encountered, add + ! its contribution to the fission bank to the score. + do d = 1, n_delayed_groups + score = keff * p % wgt_bank / p % n_bank * p % n_delay_bank(d) + + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + else + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + end if + end do + cycle SCORE_LOOP + end if + end if case (SCORE_EVENTS) ! Simply count number of scoring events score = ONE @@ -624,6 +734,77 @@ contains end subroutine score_fission_eout + !=============================================================================== + ! SCORE_FISSION_DELAYED_EOUT handles a special case where we need to store + ! delayed neutron production rate with an outgoing energy filter (think of a + ! fission matrix). In this case, we may need to score to multiple bins if there + ! were multiple neutrons produced with different energies. + !=============================================================================== + + subroutine score_fission_delayed_eout(p, t, i_score) + + type(Particle), intent(in) :: p + type(TallyObject), pointer :: t + integer, intent(in) :: i_score ! index for score + + integer :: j ! delayed group + integer :: i ! index of outgoing energy filter + integer :: n ! number of energies on filter + integer :: k ! loop index for bank sites + integer :: bin_energyout ! original outgoing energy bin + integer :: i_filter ! index for matching filter bin combination + real(8) :: score ! actual score + real(8) :: E_out ! energy of fission bank site + + ! save original outgoing energy bin and score index + i = t % find_filter(FILTER_ENERGYOUT) + bin_energyout = matching_bins(i) + + ! Get number of energies on filter + n = size(t % filters(i) % real_bins) + + ! Since the creation of fission sites is weighted such that it is + ! expected to create n_particles sites, we need to multiply the + ! score by keff to get the true nu-fission rate. Otherwise, the sum + ! of all nu-fission rates would be ~1.0. + + ! loop over number of particles banked + do k = 1, p % n_bank + + ! get the delayed group + j = fission_bank(n_bank - p % n_bank + k) % delayed_group + + ! check if the particle was born delayed + if (j /= 0) then + + ! determine score based on bank site weight and keff + score = keff * fission_bank(n_bank - p % n_bank + k) % wgt + + ! determine outgoing energy from fission bank + E_out = fission_bank(n_bank - p % n_bank + k) % E + + ! check if outgoing energy is within specified range on filter + if (E_out < t % filters(i) % real_bins(1) .or. & + E_out > t % filters(i) % real_bins(n)) cycle + + ! change outgoing energy bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, n, E_out) + + ! determine scoring index + i_filter = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 + + ! Add score to tally + !$omp atomic + t % results(i_score, i_filter) % value = & + t % results(i_score, i_filter) % value + score + end if + end do + + ! reset outgoing energy bin and score index + matching_bins(i) = bin_energyout + + end subroutine score_fission_delayed_eout + !=============================================================================== ! SCORE_TRACKLENGTH_TALLY calculates fluxes and reaction rates based on the ! track-length estimate of the flux. This is triggered at every event (surface @@ -651,6 +832,13 @@ contains integer :: i_energy ! index in nuclide energy grid integer :: score_bin ! scoring type, e.g. SCORE_FLUX integer :: score_index ! scoring bin index + integer :: lc ! pointer for interpolating in precursor + ! yield table + integer :: NR ! number of interpolation regions + integer :: NE ! number of interpolation energies + integer :: d ! delayed neutron index + integer :: d_nuclide ! delayed neutron index for specific nuclide + real(8) :: yield ! delayed neutron yield real(8) :: f ! interpolation factor real(8) :: flux ! tracklength estimate of flux real(8) :: score ! actual score (e.g., flux*xs) @@ -830,6 +1018,47 @@ contains ! For number of events, just score unity score = ONE + case (SCORE_DELAY_NU_FISSION) + + if (micro_xs(i_nuclide) % fission > ZERO) then + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + + lc = 1 + do d = 1, n_delayed_groups + + ! determine number of interpolation regions and energies + NR = int(nuclides(i_nuclide) % nu_d_precursor_data(lc + 1)) + NE = int(nuclides(i_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) + + ! determine delayed neutron precursor yield for group d + yield = interpolate_tab1(nuclides(i_nuclide) % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), p % E) + + ! advance pointer + lc = lc + 2 + 2*NR + 2*NE + 1 + + ! Delay-nu-fission cross section is pre-calculated + score = micro_xs(i_nuclide) % delay_nu_fission * yield * & + atom_density * flux + + !$omp critical + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + !$omp critical end + end do + else + score = micro_xs(i_nuclide) % delay_nu_fission * & + atom_density * flux + + !$omp critical + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + !$omp critical end + end if + end if + + cycle SCORE_LOOP + case default ! Any other cross section has to be calculated on-the-fly. For ! cross sections that are used often (e.g. n2n, ngamma, etc. for @@ -957,6 +1186,51 @@ contains ! For number of events, just score unity score = ONE + case (SCORE_DELAY_NU_FISSION) + + if (p % material /= MATERIAL_VOID) then + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + do d_nuclide = 1, materials(p % material) % n_nuclides + if (micro_xs(d_nuclide) % fission > ZERO) then + + lc = 1 + do d = 1, n_delayed_groups + + ! determine number of interpolation regions and energies + NR = int(nuclides(d_nuclide) % nu_d_precursor_data(lc + 1)) + NE = int(nuclides(d_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) + + ! determine delayed neutron precursor yield for group d + yield = interpolate_tab1(nuclides(d_nuclide) % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), p % E) + + ! advance pointer + lc = lc + 2 + 2*NR + 2*NE + 1 + + ! Delay-nu-fission cross section is pre-calculated + score = micro_xs(d_nuclide) % delay_nu_fission * yield * & + materials(p % material) % atom_density(d_nuclide) * flux + + !$omp critical + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + !$omp critical end + end do + end if + end do + else + ! Delay-nu-fission cross section is pre-calculated + score = material_xs % delay_nu_fission * flux + + !$omp critical + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + !$omp critical end + end if + end if + + cycle SCORE_LOOP + case default ! Any other cross section has to be calculated on-the-fly. This ! is somewhat costly since it requires a loop over each nuclide @@ -1056,6 +1330,13 @@ contains integer :: score_bin ! type of score, e.g. SCORE_FLUX integer :: score_index ! scoring bin index integer :: i_energy ! index in nuclide energy grid + integer :: lc ! pointer for interpolating in precursor + ! yield table + integer :: NR ! number of interpolation regions + integer :: NE ! number of interpolation energies + integer :: d ! delayed neutron index + integer :: d_nuclide ! delayed neutron index for specific nuclide + real(8) :: yield ! delayed neutron yield real(8) :: f ! interpolation factor real(8) :: score ! actual scoring tally value real(8) :: atom_density ! atom density of single nuclide in atom/b-cm @@ -1168,6 +1449,47 @@ contains case (SCORE_EVENTS) score = ONE + case (SCORE_DELAY_NU_FISSION) + + if (micro_xs(i_nuclide) % fission > ZERO) then + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + + lc = 1 + do d = 1, n_delayed_groups + + ! determine number of interpolation regions and energies + NR = int(nuclides(i_nuclide) % nu_d_precursor_data(lc + 1)) + NE = int(nuclides(i_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) + + ! determine delayed neutron precursor yield for group d + yield = interpolate_tab1(nuclides(i_nuclide) % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), p % E) + + ! advance pointer + lc = lc + 2 + 2*NR + 2*NE + 1 + + ! Delay-nu-fission cross section is pre-calculated + score = micro_xs(i_nuclide) % delay_nu_fission * yield * & + atom_density * flux + + !$omp critical + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + !$omp critical end + end do + else + score = micro_xs(i_nuclide) % delay_nu_fission * & + atom_density * flux + + !$omp critical + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + !$omp critical end + end if + end if + + cycle SCORE_LOOP + case default ! Any other cross section has to be calculated on-the-fly. For cross ! sections that are used often (e.g. n2n, ngamma, etc. for depletion), @@ -1307,6 +1629,51 @@ contains case (SCORE_EVENTS) score = ONE + case (SCORE_DELAY_NU_FISSION) + + if (p % material /= MATERIAL_VOID) then + if (t % find_filter(FILTER_DELAYGROUP) > 0) then + do d_nuclide = 1, materials(p % material) % n_nuclides + if (micro_xs(d_nuclide) % fission > ZERO) then + + lc = 1 + do d = 1, n_delayed_groups + + ! determine number of interpolation regions and energies + NR = int(nuclides(d_nuclide) % nu_d_precursor_data(lc + 1)) + NE = int(nuclides(d_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) + + ! determine delayed neutron precursor yield for group d + yield = interpolate_tab1(nuclides(d_nuclide) % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), p % E) + + ! advance pointer + lc = lc + 2 + 2*NR + 2*NE + 1 + + ! Delay-nu-fission cross section is pre-calculated + score = micro_xs(d_nuclide) % delay_nu_fission * yield * & + materials(p % material) % atom_density(d_nuclide) * flux + + !$omp critical + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + !$omp critical end + end do + end if + end do + else + ! Delay-nu-fission cross section is pre-calculated + score = material_xs % delay_nu_fission * flux + + !$omp critical + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + !$omp critical end + end if + end if + + cycle MATERIAL_SCORE_LOOP + case default ! Any other cross section has to be calculated on-the-fly. This is ! somewhat costly since it requires a loop over each nuclide in a @@ -1698,6 +2065,9 @@ contains score = micro_xs(i_nuclide) % kappa_fission * atom_density * flux case (SCORE_EVENTS) score = ONE + case (SCORE_DELAY_NU_FISSION) + score = micro_xs(i_nuclide) % delay_nu_fission * & + atom_density * flux case default call fatal_error("Invalid score type on tally " & &// to_str(t % id) // ".") @@ -1773,6 +2143,8 @@ contains score = material_xs % kappa_fission * flux case (SCORE_EVENTS) score = ONE + case (SCORE_DELAY_NU_FISSION) + score = material_xs % delay_nu_fission * flux case default call fatal_error("Invalid score type on tally " & &// to_str(t % id) // ".") @@ -1899,6 +2271,19 @@ contains n + 1, p % E) end if + case (FILTER_DELAYGROUP) + + if (survival_biasing .and. t % find_filter(FILTER_ENERGYOUT) <= 0) then + matching_bins(i) = 1 + elseif (active_tracklength_tallies % size() > 0) then + matching_bins(i) = 1 + else + if (p % delayed_group == 0) then + matching_bins = NO_BIN_FOUND + else + matching_bins(i) = p % delayed_group + end if + end if end select ! If the current filter didn't match, exit this subroutine diff --git a/src/tracking.F90 b/src/tracking.F90 index c939f7991d..772ce3dd34 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -28,6 +28,7 @@ contains type(Particle), intent(inout) :: p + integer :: d ! delayed group index integer :: surface_crossed ! surface which particle is on integer :: lattice_translation(3) ! in-lattice translation vector integer :: last_cell ! most recent cell particle was in @@ -165,6 +166,10 @@ contains p % n_bank = 0 p % wgt_bank = ZERO + do d = 1, n_delayed_groups + p % n_delay_bank = 0 + end do + ! Reset fission logical p % fission = .false. From c734994c267278fab2493469442be33ce08982b9 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 1 Apr 2015 15:49:56 -0400 Subject: [PATCH 004/519] fixed comment in ace.F90 for generating delayed nu fission --- src/ace.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index b566c40b65..3deceace54 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -1410,9 +1410,9 @@ contains end subroutine generate_nu_fission !=============================================================================== -! GENERATE_DELAYED_NU_FISSION precalculates the microscopic nu-fission cross section for -! a given nuclide. This is done so that the nu_total function does not need to -! be called during cross section lookups. +! GENERATE_DELAYED_NU_FISSION precalculates the microscopic delay-nu-fission +! cross section for a given nuclide. This is done so that the nu_delayed +! function does not need to be called during cross section lookups. !=============================================================================== subroutine generate_delay_nu_fission(nuc) From 460b0a75a74cdcdb714a7f7b457cfcfe611b1fd8 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 1 Apr 2015 20:44:49 -0400 Subject: [PATCH 005/519] fixed omp error in tally.F90 --- src/tally.F90 | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 335bcf82ca..a8e94027ed 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -562,6 +562,7 @@ contains if (t % find_filter(FILTER_DELAYGROUP) > 0) then +!$omp critical lc = 1 do d = 1, n_delayed_groups @@ -582,6 +583,7 @@ contains t % results(score_index, d) % value = & t % results(score_index, d) % value + score end do +!$omp end critical else score = p % absorb_wgt * micro_xs(p % event_nuclide) % & delay_nu_fission / micro_xs(p % event_nuclide) % absorption @@ -622,6 +624,7 @@ contains ! Loop over the neutrons produce from fission and check which ! ones are delayed. If a delayed neutron is encountered, add ! its contribution to the fission bank to the score. +!$omp critical do d = 1, n_delayed_groups score = keff * p % wgt_bank / p % n_bank * p % n_delay_bank(d) @@ -633,6 +636,7 @@ contains t % results(score_index, 1) % value + score end if end do +!$omp end critical cycle SCORE_LOOP end if end if @@ -1023,6 +1027,7 @@ contains if (micro_xs(i_nuclide) % fission > ZERO) then if (t % find_filter(FILTER_DELAYGROUP) > 0) then +!$omp critical lc = 1 do d = 1, n_delayed_groups @@ -1041,19 +1046,16 @@ contains score = micro_xs(i_nuclide) % delay_nu_fission * yield * & atom_density * flux - !$omp critical t % results(score_index, d) % value = & t % results(score_index, d) % value + score - !$omp critical end end do +!$omp end critical else score = micro_xs(i_nuclide) % delay_nu_fission * & atom_density * flux - !$omp critical t % results(score_index, 1) % value = & t % results(score_index, 1) % value + score - !$omp critical end end if end if @@ -1190,6 +1192,8 @@ contains if (p % material /= MATERIAL_VOID) then if (t % find_filter(FILTER_DELAYGROUP) > 0) then + +!$omp critical do d_nuclide = 1, materials(p % material) % n_nuclides if (micro_xs(d_nuclide) % fission > ZERO) then @@ -1211,21 +1215,18 @@ contains score = micro_xs(d_nuclide) % delay_nu_fission * yield * & materials(p % material) % atom_density(d_nuclide) * flux - !$omp critical t % results(score_index, d) % value = & t % results(score_index, d) % value + score - !$omp critical end end do end if end do +!$omp end critical else ! Delay-nu-fission cross section is pre-calculated score = material_xs % delay_nu_fission * flux - !$omp critical t % results(score_index, 1) % value = & t % results(score_index, 1) % value + score - !$omp critical end end if end if @@ -1454,6 +1455,7 @@ contains if (micro_xs(i_nuclide) % fission > ZERO) then if (t % find_filter(FILTER_DELAYGROUP) > 0) then +!$omp critical lc = 1 do d = 1, n_delayed_groups @@ -1472,19 +1474,16 @@ contains score = micro_xs(i_nuclide) % delay_nu_fission * yield * & atom_density * flux - !$omp critical t % results(score_index, d) % value = & t % results(score_index, d) % value + score - !$omp critical end end do +!$omp end critical else score = micro_xs(i_nuclide) % delay_nu_fission * & atom_density * flux - !$omp critical t % results(score_index, 1) % value = & t % results(score_index, 1) % value + score - !$omp critical end end if end if @@ -1633,6 +1632,7 @@ contains if (p % material /= MATERIAL_VOID) then if (t % find_filter(FILTER_DELAYGROUP) > 0) then +!$omp critical do d_nuclide = 1, materials(p % material) % n_nuclides if (micro_xs(d_nuclide) % fission > ZERO) then @@ -1654,21 +1654,18 @@ contains score = micro_xs(d_nuclide) % delay_nu_fission * yield * & materials(p % material) % atom_density(d_nuclide) * flux - !$omp critical t % results(score_index, d) % value = & t % results(score_index, d) % value + score - !$omp critical end end do end if end do +!$omp end critical else ! Delay-nu-fission cross section is pre-calculated score = material_xs % delay_nu_fission * flux - !$omp critical t % results(score_index, 1) % value = & t % results(score_index, 1) % value + score - !$omp critical end end if end if From 8158b7c685c42f32965d0e6e8ee4bb8e3ea1e31e Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 1 Apr 2015 21:11:44 -0400 Subject: [PATCH 006/519] fixed indentation error --- src/input_xml.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index f9cef299a1..2a307eb0d1 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2778,7 +2778,7 @@ contains ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG case ('diffusion') - call fatal_error("Diffusion score no longer supported for tallies, & + call fatal_error("Diffusion score no longer supported for tallies, & &please remove") case ('n1n') From 115cfc15ef91afb5113199375326d9943e51116d Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 2 Apr 2015 08:36:15 -0400 Subject: [PATCH 007/519] removed n_delayed_groups global variable --- src/ace.F90 | 8 -------- src/global.F90 | 1 - src/physics.F90 | 6 +++--- src/tally.F90 | 12 ++++++------ src/tracking.F90 | 5 +++-- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 3deceace54..d8ea5e8794 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -650,14 +650,6 @@ contains &// " set in constants.F90 is " // trim(to_str(MAX_DELAYED_GROUPS))) end if - if (n_delayed_groups == 0) then - n_delayed_groups = NPCR - else if (n_delayed_groups /= NPCR) then - call fatal_error("Encountered nuclides with different numbers of " & - &// " delayed groups. Nuclides with " // trim(to_str(n_delayed_groups)) & - &// " and " // trim(to_str(NPCR)) // " delayed groups encountered.") - end if - nuc % n_precursor = NPCR allocate(nuc % nu_d_edist(NPCR)) diff --git a/src/global.F90 b/src/global.F90 index 007a772da2..b26ebca504 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -71,7 +71,6 @@ module global integer :: n_nuclides_total ! Number of nuclide cross section tables integer :: n_sab_tables ! Number of S(a,b) thermal scattering tables integer :: n_listings ! Number of listings in cross_sections.xml - integer :: n_delayed_groups = 0 ! Number of delayed groups in cross section library ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict diff --git a/src/physics.F90 b/src/physics.F90 index 2b728336ef..ad142638f5 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1060,7 +1060,7 @@ contains integer, intent(in) :: i_reaction integer :: d ! delayed group index - integer :: nu_delay(n_delayed_groups) ! number of delayed neutrons born + integer :: nu_delay(MAX_DELAYED_GROUPS) ! number of delayed neutrons born integer :: i ! loop index integer :: nu ! actual number of neutrons produced integer :: ijk(3) ! indices in ufs mesh @@ -1122,7 +1122,7 @@ contains ! Initialize counter of delayed neutrons encountered for each delayed group ! to zero. - do d = 1, n_delayed_groups + do d = 1, MAX_DELAYED_GROUPS nu_delay(d) = 0 end do @@ -1165,7 +1165,7 @@ contains ! Store total and delayed weight banked for analog fission tallies p % n_bank = nu p % wgt_bank = nu/weight - do d = 1, n_delayed_groups + do d = 1, MAX_DELAYED_GROUPS p % n_delay_bank(d) = nu_delay(d) end do diff --git a/src/tally.F90 b/src/tally.F90 index a8e94027ed..7bd5668cce 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -564,7 +564,7 @@ contains !$omp critical lc = 1 - do d = 1, n_delayed_groups + do d = 1, nuclides(p % event_nuclide) % n_precursor ! determine number of interpolation regions and energies NR = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 1)) @@ -625,7 +625,7 @@ contains ! ones are delayed. If a delayed neutron is encountered, add ! its contribution to the fission bank to the score. !$omp critical - do d = 1, n_delayed_groups + do d = 1, nuclides(p % event_nuclide) % n_precursor score = keff * p % wgt_bank / p % n_bank * p % n_delay_bank(d) if (t % find_filter(FILTER_DELAYGROUP) > 0) then @@ -1029,7 +1029,7 @@ contains !$omp critical lc = 1 - do d = 1, n_delayed_groups + do d = 1, nuclides(i_nuclide) % n_precursor ! determine number of interpolation regions and energies NR = int(nuclides(i_nuclide) % nu_d_precursor_data(lc + 1)) @@ -1198,7 +1198,7 @@ contains if (micro_xs(d_nuclide) % fission > ZERO) then lc = 1 - do d = 1, n_delayed_groups + do d = 1, nuclides(d_nuclide) % n_precursor ! determine number of interpolation regions and energies NR = int(nuclides(d_nuclide) % nu_d_precursor_data(lc + 1)) @@ -1457,7 +1457,7 @@ contains !$omp critical lc = 1 - do d = 1, n_delayed_groups + do d = 1, nuclides(i_nuclide) % n_precursor ! determine number of interpolation regions and energies NR = int(nuclides(i_nuclide) % nu_d_precursor_data(lc + 1)) @@ -1637,7 +1637,7 @@ contains if (micro_xs(d_nuclide) % fission > ZERO) then lc = 1 - do d = 1, n_delayed_groups + do d = 1, nuclides(d_nuclide) % n_precursor ! determine number of interpolation regions and energies NR = int(nuclides(d_nuclide) % nu_d_precursor_data(lc + 1)) diff --git a/src/tracking.F90 b/src/tracking.F90 index 772ce3dd34..e9fd2cf583 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -15,7 +15,8 @@ module tracking score_surface_current use track_output, only: initialize_particle_track, write_particle_track, & finalize_particle_track - + use constants, only: MAX_DELAYED_GROUPS + implicit none contains @@ -166,7 +167,7 @@ contains p % n_bank = 0 p % wgt_bank = ZERO - do d = 1, n_delayed_groups + do d = 1, MAX_DELAYED_GROUPS p % n_delay_bank = 0 end do From 430d1cf0c334573ed08baab92f33c6d8117f2ce7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 2 Apr 2015 08:41:30 -0400 Subject: [PATCH 008/519] removed write_message from tally.F90 --- src/tally.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tally.F90 b/src/tally.F90 index 7bd5668cce..845c3a021f 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -15,7 +15,6 @@ module tally use string, only: to_str use tally_header, only: TallyResult, TallyMapItem, TallyMapElement use fission, only: nu_total, nu_delayed - use output, only: write_message use interpolation, only: interpolate_tab1 #ifdef MPI From 99dd8386449424a6c084cffe3aa56ebe07e4912e Mon Sep 17 00:00:00 2001 From: walshjon Date: Sun, 26 Apr 2015 23:35:36 -0400 Subject: [PATCH 009/519] change to input file specification --- src/input_xml.F90 | 11 ++++++----- src/physics.F90 | 6 +++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 9b6259a57c..0df77fe376 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1733,14 +1733,15 @@ contains end if ! Check enforced isotropic lab scattering - if (check_for_node(node_nuc, "lab")) then - call get_node_value(node_nuc, "lab", temp_str) - if (trim(adjustl(to_lower(temp_str))) == "true") then + if (check_for_node(node_nuc, "scattering")) then + call get_node_value(node_nuc, "scattering", temp_str) + if (trim(adjustl(to_lower(temp_str))) == "lab") then call list_iso_lab % append(.true.) - else if (trim(adjustl(to_lower(temp_str))) == "false") then + else if (trim(adjustl(to_lower(temp_str))) == "ace") then call list_iso_lab % append(.false.) else - call fatal_error("Isotropic lab scattering must be true or false") + call fatal_error("Scattering must be isotropic in lab or follow& + & the ACE file data") end if else call list_iso_lab % append(.false.) diff --git a/src/physics.F90 b/src/physics.F90 index 5691c9c0f1..6cda2f9e47 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -337,8 +337,8 @@ contains if (micro_xs(i_nuclide) % index_sab /= NONE) then if (materials(p % material) % p0(i_nuc_mat)) & - & call fatal_error("thermal scattering law data and isotropic lab& - & scattering specified for the same nuclide") + call fatal_error("thermal scattering law data and isotropic lab& + & scattering specified for the same nuclide") ! S(a,b) scattering call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, & @@ -351,7 +351,7 @@ contains ! Perform collision physics for elastic scattering call elastic_scatter(i_nuclide, rxn, & p % E, p % coord0 % uvw, p % mu, p % wgt, & - & materials(p % material) % p0(i_nuc_mat)) + materials(p % material) % p0(i_nuc_mat)) end if p % event_MT = ELASTIC From 4e808a4257bbb1d399d511307597168a4bb1b2f3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 27 Apr 2015 00:39:02 -0400 Subject: [PATCH 010/519] Added paragraph on new scattering subelement for nuclides --- docs/source/usersguide/input.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index d98804c867..c1231e9a8e 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1015,6 +1015,15 @@ Each ``material`` element can have the following attributes or sub-elements: .. note:: If one nuclide is specified in atom percent, all others must also be given in atom percent. The same applies for weight percentages. + An optional attribute/sub-element for each nuclide is ``scattering``. This + attribute may be set to "ace" to use the scattering laws specified in the + ACE files (default). Alternatively, when set to "lab", the ACE scattering + laws are used to sample the outgoing energy but an isotropic-in-lab + distribution is used to sample the outgoing angle at each scattering + interaction. The ``scattering`` attribute may be most useful when using + OpenMC to compute multi-group cross-sections for deterministic transport + codes and to quantify the effects of anisotropic scattering. + *Default*: None :element: From 25d9f8b2a3adcaae699813be8921b6b33445ff0f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 27 Apr 2015 00:52:49 -0400 Subject: [PATCH 011/519] Added routines to Python API for nuclide-based scattering laws --- src/utils/openmc/material.py | 14 ++++++++++++++ src/utils/openmc/nuclide.py | 24 ++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/utils/openmc/material.py b/src/utils/openmc/material.py index 87255083bd..c7292416e6 100644 --- a/src/utils/openmc/material.py +++ b/src/utils/openmc/material.py @@ -271,6 +271,12 @@ class Material(object): self._sab.append((name, xs)) + def make_isotropic_in_lab(self): + + for nuclide_name in self._nuclides: + self._nuclides[nuclide_name][0].make_isotropic_in_lab() + + def get_all_nuclides(self): nuclides = {} @@ -331,6 +337,9 @@ class Material(object): if not nuclide[0]._xs is None: xml_element.set("xs", nuclide[0]._xs) + if not nuclide[0]._scattering is None: + xml_element.set("scattering", nuclide[0]._scattering) + return xml_element @@ -496,6 +505,11 @@ class MaterialsFile(object): self._materials.remove(material) + def make_isotropic_in_lab(self): + + for material in self._materials: + materials.make_isotropic_in_lab() + def create_material_subelements(self): diff --git a/src/utils/openmc/nuclide.py b/src/utils/openmc/nuclide.py index c2287b23d9..d9d49d039e 100644 --- a/src/utils/openmc/nuclide.py +++ b/src/utils/openmc/nuclide.py @@ -9,6 +9,7 @@ class Nuclide(object): self._name = '' self._xs = None self._zaid = None + self._scattering = None # Set the Material class attributes self.name = name @@ -54,6 +55,11 @@ class Nuclide(object): return self._zaid + @property + def scattering(self): + return self._scattering + + @name.setter def name(self, name): @@ -87,10 +93,24 @@ class Nuclide(object): self._zaid = zaid + @scattering.setter + def scattering(self, scattering): + + if not scattering in ['ace', 'lab']: + msg = 'Unable to set scattering for Nuclide to {0} ' \ + 'which is not "ace" or "lab"'.format(scattering) + raise ValueError(msg) + + self._scattering = scattering + + def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) if self._zaid is not None: - string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) - return string \ No newline at end of file + string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) + if self._scattering is not None: + string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t', + self._scattering) + return string From e44e253993a89f44b826f28869b8b1d9b78b2da5 Mon Sep 17 00:00:00 2001 From: walshjon Date: Mon, 27 Apr 2015 15:28:43 -0700 Subject: [PATCH 012/519] re-enable S(a,b) w/ forced iso lab scattering --- src/physics.F90 | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/physics.F90 b/src/physics.F90 index 394277ff36..35cd00de5d 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -332,13 +332,11 @@ contains ! ELASTIC SCATTERING if (micro_xs(i_nuclide) % index_sab /= NONE) then - if (materials(p % material) % p0(i_nuc_mat)) & - call fatal_error("thermal scattering law data and isotropic lab& - & scattering specified for the same nuclide") ! S(a,b) scattering call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, & - p % E, p % coord0 % uvw, p % mu) + p % E, p % coord0 % uvw, p % mu, & + materials(p % material) % p0(i_nuc_mat)) else ! get pointer to elastic scattering reaction @@ -492,13 +490,15 @@ contains ! according to a specified S(a,b) table. !=============================================================================== - subroutine sab_scatter(i_nuclide, i_sab, E, uvw, mu) + subroutine sab_scatter(i_nuclide, i_sab, E, uvw, mu_lab, iso_lab) integer, intent(in) :: i_nuclide ! index in micro_xs integer, intent(in) :: i_sab ! index in sab_tables real(8), intent(inout) :: E ! incoming/outgoing energy real(8), intent(inout) :: uvw(3) ! directional cosines - real(8), intent(out) :: mu ! scattering cosine + real(8) :: uvw_in(3) ! incoming direction + real(8), intent(out) :: mu_lab ! cosine of polar angle in lab system + logical, intent(in) :: iso_lab integer :: i ! incoming energy bin integer :: j ! outgoing energy bin @@ -522,10 +522,14 @@ contains real(8) :: c_j, c_j1 ! cumulative probability real(8) :: frac ! interpolation factor on outgoing energy real(8) :: r1 ! RNG for outgoing energy + real(8) :: phi ! azimuthal angle ! Get pointer to S(a,b) table sab => sab_tables(i_sab) + ! incoming direction + uvw_in(:) = uvw(:) + ! Determine whether inelastic or elastic scattering will occur if (prn() < micro_xs(i_nuclide) % elastic_sab / & micro_xs(i_nuclide) % elastic) then @@ -555,7 +559,7 @@ contains mu_i1jk = sab % elastic_mu(k,i+1) ! Cosine of angle between incoming and outgoing neutron - mu = (1 - f)*mu_ijk + f*mu_i1jk + mu_lab = (1 - f)*mu_ijk + f*mu_i1jk elseif (sab % elastic_mode == SAB_ELASTIC_EXACT) then ! This treatment is used for data derived in the coherent @@ -571,7 +575,7 @@ contains end if ! Characteristic scattering cosine for this Bragg edge - mu = ONE - TWO*sab % elastic_e_in(k) / E + mu_lab = ONE - TWO*sab % elastic_e_in(k) / E end if @@ -646,7 +650,7 @@ contains mu_i1jk = sab % inelastic_mu(k,j,i+1) ! Cosine of angle between incoming and outgoing neutron - mu = (1 - f)*mu_ijk + f*mu_i1jk + mu_lab = (1 - f)*mu_ijk + f*mu_i1jk else if (sab % secondary_mode == SAB_SECONDARY_CONT) then ! Continuous secondary energy - this is to be similar to @@ -723,7 +727,7 @@ contains ! Will use mu from the randomly chosen incoming and closest outgoing ! energy bins - mu = sab % inelastic_data(l) % mu(k, j) + mu_lab = sab % inelastic_data(l) % mu(k, j) else call fatal_error("Invalid secondary energy mode on S(a,b) table " & @@ -731,8 +735,19 @@ contains end if ! (inelastic secondary energy treatment) end if ! (elastic or inelastic) - ! change direction of particle - uvw = rotate_angle(uvw, mu) + + ! compute cosine of scattering angle in LAB frame by taking dot product of + ! neutron's pre- and post-collision unit vectors + if (iso_lab) then + uvw(1) = TWO * prn() - ONE + phi = TWO * PI * prn() + uvw(2) = cos(phi) * sqrt(ONE - uvw(1)*uvw(1)) + uvw(3) = sin(phi) * sqrt(ONE - uvw(1)*uvw(1)) + mu_lab = dot_product(uvw_in, uvw) + else + ! change direction of particle + uvw = rotate_angle(uvw, mu_lab) + end if end subroutine sab_scatter From 77b4b727bdcb41625c176c6c94c0b13b6c62a5b1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 29 Apr 2015 23:51:30 -0400 Subject: [PATCH 013/519] Removed ListLog and made iso_lab list ListInt --- src/input_xml.F90 | 18 ++-- src/list_header.F90 | 246 -------------------------------------------- 2 files changed, 11 insertions(+), 253 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index a9c7618429..01379a231c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -7,7 +7,7 @@ module input_xml use error, only: fatal_error, warning use geometry_header, only: Cell, Surface, Lattice, RectLattice, HexLattice use global - use list_header, only: ListChar, ListLog, ListReal + use list_header, only: ListChar, ListInt, ListReal use mesh_header, only: StructuredMesh use output, only: write_message use plot_header @@ -1581,7 +1581,7 @@ contains character(MAX_LINE_LEN) :: temp_str ! temporary string when reading type(ListChar) :: list_names ! temporary list of nuclide names type(ListReal) :: list_density ! temporary list of nuclide densities - type(ListLog) :: list_iso_lab ! temporary list of isotropic lab scatterers + type(ListInt) :: list_iso_lab ! temporary list of isotropic lab scatterers type(Material), pointer :: mat => null() type(Node), pointer :: doc => null() type(Node), pointer :: node_mat => null() @@ -1740,15 +1740,15 @@ contains if (check_for_node(node_nuc, "scattering")) then call get_node_value(node_nuc, "scattering", temp_str) if (trim(adjustl(to_lower(temp_str))) == "lab") then - call list_iso_lab % append(.true.) + call list_iso_lab % append(1) else if (trim(adjustl(to_lower(temp_str))) == "ace") then - call list_iso_lab % append(.false.) + call list_iso_lab % append(0) else call fatal_error("Scattering must be isotropic in lab or follow& & the ACE file data") end if else - call list_iso_lab % append(.false.) + call list_iso_lab % append(0) end if ! store full name @@ -1880,8 +1880,12 @@ contains mat % names(j) = name mat % atom_density(j) = list_density % get_item(j) - ! Copy isotropic lab scattering flag - mat % p0(j) = list_iso_lab % get_item(j) + ! Cast integer isotropic lab scattering flag to boolean + if (list_iso_lab % get_item(j) == 1) then + mat % p0(j) = .true. + else + mat % p0(j) = .false. + end if end do ALL_NUCLIDES diff --git a/src/list_header.F90 b/src/list_header.F90 index e4cc56ed0a..9d6c13b2ca 100644 --- a/src/list_header.F90 +++ b/src/list_header.F90 @@ -34,12 +34,6 @@ module list_header type(ListElemChar), pointer :: prev => null() end type ListElemChar - type :: ListElemLog - logical :: data - type(ListElemLog), pointer :: next => null() - type(ListElemLog), pointer :: prev => null() - end type ListElemLog - !=============================================================================== ! LIST* types contain the linked list with convenience methods. We originally @@ -114,28 +108,6 @@ module list_header procedure :: size => list_size_char ! Size of list end type ListChar - type, public :: ListLog - private - integer :: count = 0 ! Number of elements in list - - ! Used in get_item for fast sequential lookups - integer :: last_index = huge(0) - type(ListElemLog), pointer :: last_elem => null() - - ! Pointers to beginning and end of list - type(ListElemLog), public, pointer :: head => null() - type(ListElemLog), public, pointer :: tail => null() - contains - procedure :: append => list_append_log ! Add item to end of list - procedure :: clear => list_clear_log ! Remove all items - procedure :: contains => list_contains_log ! Does list contain? - procedure :: get_item => list_get_item_log ! Get i-th item in list - procedure :: index => list_index_log ! Determine index of given item - procedure :: insert => list_insert_log ! Insert item in i-th position - procedure :: remove => list_remove_log ! Remove specified item - procedure :: size => list_size_log ! Size of list - end type ListLog - contains !=============================================================================== @@ -218,31 +190,6 @@ contains end subroutine list_append_char - subroutine list_append_log(this, data) - class(ListLog) :: this - logical :: data - - type(ListElemLog), pointer :: elem - - ! Create element and set dat - allocate(elem) - elem % data = data - - if (.not. associated(this % head)) then - ! If list is empty, set head and tail to new element - this % head => elem - this % tail => elem - else - ! Otherwise append element at end of list - this % tail % next => elem - elem % prev => this % tail - this % tail => this % tail % next - end if - - this % count = this % count + 1 - - end subroutine list_append_log - !=============================================================================== ! LIST_CLEAR removes all elements from the list !=============================================================================== @@ -325,32 +272,6 @@ contains end subroutine list_clear_char - subroutine list_clear_log(this) - class(ListLog) :: this - - type(ListElemLog), pointer :: current => null() - type(ListElemLog), pointer :: next => null() - - if (this % count > 0) then - current => this % head - do while (associated(current)) - ! Set pointer to next element - next => current % next - - ! Deallocate memory for current element - deallocate(current) - - ! Move to next element - current => next - end do - - nullify(this % head) - nullify(this % tail) - this % count = 0 - end if - - end subroutine list_clear_log - !=============================================================================== ! LIST_CONTAINS determines whether the list contains a specified item. Since it ! relies on the index method, it is O(n). @@ -383,15 +304,6 @@ contains end function list_contains_char - function list_contains_log(this, data) result(in_list) - class(ListLog) :: this - logical :: data - logical :: in_list - - in_list = (this % index(data) > 0) - - end function list_contains_log - !=============================================================================== ! LIST_GET_ITEM returns the item in the list at position 'i_list'. If the index ! is out of bounds, an error code is returned. @@ -496,39 +408,6 @@ contains end function list_get_item_char - function list_get_item_log(this, i_list) result(data) - class(ListLog) :: this - integer :: i_list - logical :: data - - integer :: last_index - - if (i_list < 1 .or. i_list > this % count) then - ! Check for index out of bounds - data = .false. - elseif (i_list == 1) then - data = this % head % data - this % last_index = 1 - this % last_elem => this % head - elseif (i_list == this % count) then - data = this % tail % data - this % last_index = this % count - this % last_elem => this % tail - else - if (i_list < this % last_index) then - this % last_index = 1 - this % last_elem => this % head - end if - - do last_index = this % last_index + 1, i_list - this % last_elem => this % last_elem % next - this % last_index = last_index - end do - data = this % last_elem % data - end if - - end function list_get_item_log - !=============================================================================== ! LIST_INDEX determines the first index in the list that contains 'data'. If ! 'data' is not present in the list, the return value is -1. @@ -597,27 +476,6 @@ contains end function list_index_char - function list_index_log(this, data) result(i_list) - - class(ListLog) :: this - logical :: data - integer :: i_list - - type(ListElemLog), pointer :: elem - - i_list = 0 - elem => this % head - do while (associated(elem)) - i_list = i_list + 1 - if (data .eqv. elem % data) exit - elem => elem % next - end do - - ! Check if we reached the end of the list - if (.not. associated(elem)) i_list = -1 - - end function list_index_log - !=============================================================================== ! LIST_INSERT inserts 'data' at index 'i_list' within the list. If 'i_list' ! exceeds the size of the list, the data is appends at the end of the list. @@ -789,62 +647,6 @@ contains end subroutine list_insert_char - subroutine list_insert_log(this, i_list, data) - - class(ListLog) :: this - integer :: i_list - logical :: data - - integer :: i - type(ListElemLog), pointer :: elem => null() - type(ListElemLog), pointer :: new_elem => null() - - if (i_list > this % count) then - ! Check whether specified index is greater than number of elements -- if - ! so, just append it to the end of the list - call this % append(data) - - else if (i_list == 1) then - ! Check for new head element - allocate(new_elem) - new_elem % data = data - new_elem % next => this % head - this % head => new_elem - this % count = this % count + 1 - - else - ! Default case with new element somewhere in middle of list - if (i_list >= this % last_index) then - i = this % last_index - elem => this % last_elem - else - i = 0 - elem => this % head - end if - do while (associated(elem)) - i = i + 1 - if (i == i_list - 1) then - ! Allocate new element - allocate(new_elem) - new_elem % data = data - - ! Put it before the i-th element - new_elem % prev => elem % prev - new_elem % next => elem - new_elem % prev % next => new_elem - new_elem % next % prev => new_elem - this % count = this % count + 1 - this % last_index = i_list - this % last_elem => new_elem - exit - end if - i = i + 1 - elem => elem % next - end do - end if - - end subroutine list_insert_log - !=============================================================================== ! LIST_REMOVE removes the first item in the list that contains 'data'. If 'data' ! is not in the list, no action is taken. @@ -967,45 +769,6 @@ contains end subroutine list_remove_char - subroutine list_remove_log(this, data) - - class(ListLog) :: this - logical :: data - - type(ListElemLog), pointer :: elem => null() - - elem => this % head - do while (associated(elem)) - ! Check for matching data - if (elem % data .eqv. data) then - - ! Determine whether the current element is the head, tail, or a middle - ! element - if (associated(elem, this % head)) then - this % head => elem % next - if (associated(elem, this % tail)) nullify(this % tail) - if (associated(this % head)) nullify(this % head % prev) - deallocate(elem) - else if (associated(elem, this % tail)) then - this % tail => elem % prev - deallocate(this % tail % next) - else - elem % prev % next => elem % next - elem % next % prev => elem % prev - deallocate(elem) - end if - - ! Decrease count and exit - this % count = this % count - 1 - exit - end if - - ! Advance pointers - elem => elem % next - end do - - end subroutine list_remove_log - !=============================================================================== ! LIST_SIZE returns the number of elements in the list !=============================================================================== @@ -1037,13 +800,4 @@ contains end function list_size_char - function list_size_log(this) result(size) - - class(ListLog) :: this - integer :: size - - size = this % count - - end function list_size_log - end module list_header From 08ad9d7425082a314036fda6cf82a378c09b94b3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 26 Jul 2015 17:59:11 -0700 Subject: [PATCH 014/519] Removed remaining errant merge conflict metadata from nuclide.py --- openmc/nuclide.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 7de1e900c6..25abe815b7 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -92,8 +92,6 @@ class Nuclide(object): check_type('zaid', zaid, Integral) self._zaid = zaid -<<<<<<< HEAD - @scattering.setter def scattering(self, scattering): @@ -104,18 +102,12 @@ class Nuclide(object): self._scattering = scattering - -======= ->>>>>>> develop def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) if self._zaid is not None: string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) -<<<<<<< HEAD if self._scattering is not None: string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t', self._scattering) -======= ->>>>>>> develop return string From a20c2bdc7003f8e0b4f523c6af6a55cbb005f57b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 3 Aug 2015 20:44:22 -0700 Subject: [PATCH 015/519] Added new EnergyGroups class for MGXS calculations --- openmc/mgxs/__init__.py | 1 + openmc/mgxs/groups.py | 257 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 258 insertions(+) create mode 100644 openmc/mgxs/__init__.py create mode 100644 openmc/mgxs/groups.py diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py new file mode 100644 index 0000000000..8d5086de7c --- /dev/null +++ b/openmc/mgxs/__init__.py @@ -0,0 +1 @@ +__author__ = 'wboyd' diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py new file mode 100644 index 0000000000..913851247d --- /dev/null +++ b/openmc/mgxs/groups.py @@ -0,0 +1,257 @@ +import copy +from numbers import Real, Integral + +import numpy as np + +from openmc.checkvalue import * + +class EnergyGroups(object): + """An energy groups structure used for multi-group cross-sections. + + Parameters + ---------- + group_edges : NumPy array + The energy group boundaries [MeV] + num_groups : Integral + The number of energy groups + + Attributes + ---------- + group_edges : NumPy array + The energy group boundaries [MeV] + num_groups : Integral + The number of energy groups + + """ + + def __init__(self): + self._group_edges = None + self._num_groups = None + + 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.group_edges = copy.deepcopy(self._group_edges, memo) + + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + + @property + def group_edges(self): + return self._group_edges + + @property + def num_groups(self): + return self._num_groups + + @group_edges.setter + def group_edges(self, edges): + check_type('group edges', edges, list, Integral) + check_length('number of group edges', edges, 2) + self._group_edges = np.array(edges) + self._num_groups = len(edges)-1 + + def __eq__(self, other): + if not isinstance(other, EnergyGroups): + return False + elif self._group_edges != other._group_edges: + return False + + def generate_bin_edges(self, start, stop, num_groups, type='linear'): + """Generate equally or logarithmically-spaced energy group boundaries. + + Parameters + ---------- + start : Real + The lowest energy in MeV + stop : Real + The highest energy in MeV + num_groups : Integral + The number of energy groups + type : str + The spacing between groups ('linear' or 'logarithmic') + + """ + check_type('first edge', start, Real) + check_type('last edge', stop, Real) + check_type('number of groups', num_groups, Integral) + check_type('type', type, str) + check_greater_than('first edge', start, 0, equality=True) + check_greater_than('first edge', stop, start, equality=False) + check_greater_than('number of groups', num_groups, 0) + check_value('type', type, ('linear', 'logarithmic')) + + if type == 'linear': + self._group_edges = np.linspace(start, stop, num_groups+1) + elif type == 'logarithmic': + self._group_edges = \ + np.logspace(np.log10(start), np.log10(stop), num_groups+1) + + self._num_groups = num_groups + + def get_group(self, energy): + """Returns the energy group in which the given energy resides. + + Parameters + ---------- + energy : Real + The energy of interest in MeV + + Returns + ------- + Integral + The energy group index, starting at 1 for the highest energies + + Raises + ------ + ValueError + If the group edges have not yet been set. + + """ + + if self._group_edges is None: + msg = 'Unable to get energy group for energy "{0}" eV since ' \ + 'the group edges have not yet been set'.format(energy) + raise ValueError(msg) + + index = np.where(self._group_edges > energy)[0] + group = self._num_groups - index + return group + + def get_group_bounds(self, group): + """Returns the energy boundaries for the energy group of interest. + + Parameters + ---------- + group : Integral + The energy group index, starting at 1 for the highest energies + + Returns + ------- + 2-tuple + The low and high energy bounds for the group in MeV + + Raises + ------ + ValueError + If the group edges have not yet been set. + + """ + + if self._group_edges is None: + msg = 'Unable to get energy group bounds for group "{0}" since ' \ + 'the group edges have not yet been set'.format(group) + raise ValueError(msg) + + lower = self._group_edges[self._num_groups-group] + upper = self._group_edges[self._num_groups-group+1] + return (lower, upper) + + + def get_group_indices(self, groups='all'): + """Returns the array indices for one or more energy groups. + + Parameters + ---------- + groups : str, tuple + The energy groups of interest - a tuple of the energy group indices, + starting at 1 for the highest energies (default is 'all') + + Returns + ------- + NumPy.ndarray + The NumPy array indices for each energy group of interest + + Raises + ------ + ValueError + If the group edges have not yet been set, or if a group is requested + that is outside the bounds of the number of energy groups. + + """ + + if self._group_edges is None: + msg = 'Unable to get energy group indices for groups "{0}" since ' \ + 'the group edges have not yet been set'.format(groups) + raise ValueError(msg) + + if groups == 'all': + indices = np.arange(self._num_groups) + else: + indices = np.zeros(len(groups), dtype=np.int64) + + for i, group in enumerate(groups): + if group > 0 and group <= self._num_groups: + indices[i] = group - 1 + else: + msg = 'Unable to get energy group index for group "{0}" ' \ + 'since it is outside the group bounds'.format(group) + raise ValueError(msg) + + return indices + + + def get_condensed_groups(self, coarse_groups): + """Return a coarsened version of this EnergyGroups object. + + This method merges together energy groups in this object into wider + energy groups as defined by the list of groups specified by the user, + and returns a new, coarse EnergyGroups object. + + Parameters + ---------- + coarse_groups : list + The energy groups of interest - a list of 2-tuples, each directly + corresponding to one of the new coarse groups. The values in the + 2-tuples are upper/lower energy groups used to construct a new + coarse group. + + Returns + ------- + EnergyGroups + A coarsened version of this EnergyGroups object. + + Raises + ------ + ValueError + If the group edges have not yet been set. + """ + + check_type('group edges', coarse_groups, list) + for group in coarse_groups: + check_value('group edges', group, tuple) + check_length('group edges', group, 2) + check_greater_than('lower group', group[0], 1, True) + check_less_than('lower group', group[0], self.num_groups, True) + check_greater_than('upper group', group[0], 1, True) + check_less_than('upper group', group[0], self.num_groups, True) + check_less_than('lower group', group[0], group[1], False) + + # Compute the group indices into the coarse group + group_bounds = list() + for group in coarse_groups: + group_bounds.append(group[0]) + group_bounds.append(coarse_groups[-1][1]) + + # Determine the indices mapping the fine-to-coarse energy groups + group_bounds = np.asarray(group_bounds) + group_indices = np.flipud(self._num_groups - group_bounds) + group_indices[-1] += 1 + + # Determine the edges between coarse energy groups and sort + # in increasing order in case the user passed in unordered groups + group_edges = self._group_edges[group_indices] + group_edges = np.sort(group_edges) + + # Create a new condensed EnergyGroups object + condensed_groups = EnergyGroups() + condensed_groups.group_edges = group_edges + return condensed_groups \ No newline at end of file From cfc81640439acf0f25ee5daf60916b182a2fe320 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 9 Aug 2015 16:16:03 -0700 Subject: [PATCH 016/519] First implementation of MultiGroupXS class --- openmc/mgxs/__init__.py | 2 +- openmc/mgxs/groups.py | 82 ++-- openmc/mgxs/mgxs.py | 836 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 879 insertions(+), 41 deletions(-) create mode 100644 openmc/mgxs/mgxs.py diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py index 8d5086de7c..4f5c1ea125 100644 --- a/openmc/mgxs/__init__.py +++ b/openmc/mgxs/__init__.py @@ -1 +1 @@ -__author__ = 'wboyd' +from groups import EnergyGroups \ No newline at end of file diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index 913851247d..061f1c61a8 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -1,9 +1,15 @@ -import copy +from collections import Iterable from numbers import Real, Integral +import copy +import sys import numpy as np -from openmc.checkvalue import * +import openmc.checkvalue as cv + + +if sys.version_info[0] >= 3: + basestring = str class EnergyGroups(object): """An energy groups structure used for multi-group cross-sections. @@ -54,8 +60,8 @@ class EnergyGroups(object): @group_edges.setter def group_edges(self, edges): - check_type('group edges', edges, list, Integral) - check_length('number of group edges', edges, 2) + cv.check_type('group edges', edges, Iterable, Integral) + cv.check_length('number of group edges', edges, 2) self._group_edges = np.array(edges) self._num_groups = len(edges)-1 @@ -80,19 +86,20 @@ class EnergyGroups(object): The spacing between groups ('linear' or 'logarithmic') """ - check_type('first edge', start, Real) - check_type('last edge', stop, Real) - check_type('number of groups', num_groups, Integral) - check_type('type', type, str) - check_greater_than('first edge', start, 0, equality=True) - check_greater_than('first edge', stop, start, equality=False) - check_greater_than('number of groups', num_groups, 0) - check_value('type', type, ('linear', 'logarithmic')) + + cv.check_type('first edge', start, Real) + cv.check_type('last edge', stop, Real) + cv.check_type('number of groups', num_groups, Integral) + cv.check_type('type', type, basestring) + cv.check_greater_than('first edge', start, 0, True) + cv.check_greater_than('first edge', stop, start, False) + cv.check_greater_than('number of groups', num_groups, 0) + cv.check_value('type', type, ('linear', 'logarithmic')) if type == 'linear': - self._group_edges = np.linspace(start, stop, num_groups+1) + self.group_edges = np.linspace(start, stop, num_groups+1) elif type == 'logarithmic': - self._group_edges = \ + self.group_edges = \ np.logspace(np.log10(start), np.log10(stop), num_groups+1) self._num_groups = num_groups @@ -117,13 +124,13 @@ class EnergyGroups(object): """ - if self._group_edges is None: + if self.group_edges is None: msg = 'Unable to get energy group for energy "{0}" eV since ' \ 'the group edges have not yet been set'.format(energy) raise ValueError(msg) - index = np.where(self._group_edges > energy)[0] - group = self._num_groups - index + index = np.where(self.group_edges > energy)[0] + group = self.num_groups - index return group def get_group_bounds(self, group): @@ -146,16 +153,15 @@ class EnergyGroups(object): """ - if self._group_edges is None: + if self.group_edges is None: msg = 'Unable to get energy group bounds for group "{0}" since ' \ 'the group edges have not yet been set'.format(group) raise ValueError(msg) - lower = self._group_edges[self._num_groups-group] - upper = self._group_edges[self._num_groups-group+1] + lower = self.group_edges[self.num_groups-group] + upper = self.group_edges[self.num_groups-group+1] return (lower, upper) - def get_group_indices(self, groups='all'): """Returns the array indices for one or more energy groups. @@ -178,27 +184,23 @@ class EnergyGroups(object): """ - if self._group_edges is None: + if self.group_edges is None: msg = 'Unable to get energy group indices for groups "{0}" since ' \ 'the group edges have not yet been set'.format(groups) raise ValueError(msg) if groups == 'all': - indices = np.arange(self._num_groups) + indices = np.arange(self.num_groups) else: indices = np.zeros(len(groups), dtype=np.int64) for i, group in enumerate(groups): - if group > 0 and group <= self._num_groups: - indices[i] = group - 1 - else: - msg = 'Unable to get energy group index for group "{0}" ' \ - 'since it is outside the group bounds'.format(group) - raise ValueError(msg) + cv.check_greater_than('group', group, 0) + cv.check_less_than('group', group, self.num_groups, True) + indices[i] = group - 1 return indices - def get_condensed_groups(self, coarse_groups): """Return a coarsened version of this EnergyGroups object. @@ -225,15 +227,15 @@ class EnergyGroups(object): If the group edges have not yet been set. """ - check_type('group edges', coarse_groups, list) + cv.check_type('group edges', coarse_groups, Iterable) for group in coarse_groups: - check_value('group edges', group, tuple) - check_length('group edges', group, 2) - check_greater_than('lower group', group[0], 1, True) - check_less_than('lower group', group[0], self.num_groups, True) - check_greater_than('upper group', group[0], 1, True) - check_less_than('upper group', group[0], self.num_groups, True) - check_less_than('lower group', group[0], group[1], False) + cv.check_value('group edges', group, Iterable) + cv.check_length('group edges', group, 2) + cv.check_greater_than('lower group', group[0], 1, True) + cv.check_less_than('lower group', group[0], self.num_groups, True) + cv.check_greater_than('upper group', group[0], 1, True) + cv.check_less_than('upper group', group[0], self.num_groups, True) + cv.check_less_than('lower group', group[0], group[1], False) # Compute the group indices into the coarse group group_bounds = list() @@ -243,12 +245,12 @@ class EnergyGroups(object): # Determine the indices mapping the fine-to-coarse energy groups group_bounds = np.asarray(group_bounds) - group_indices = np.flipud(self._num_groups - group_bounds) + group_indices = np.flipud(self.num_groups - group_bounds) group_indices[-1] += 1 # Determine the edges between coarse energy groups and sort # in increasing order in case the user passed in unordered groups - group_edges = self._group_edges[group_indices] + group_edges = self.group_edges[group_indices] group_edges = np.sort(group_edges) # Create a new condensed EnergyGroups object diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py new file mode 100644 index 0000000000..792d8d30ca --- /dev/null +++ b/openmc/mgxs/mgxs.py @@ -0,0 +1,836 @@ +from collections import Iterable +from numbers import Integral, Real +import os +import sys +import copy +import abc +import pickle +import subprocess + +import numpy as np + +import openmc +import openmc.checkvalue as cv +from openmc.mgxs import EnergyGroups + + +if sys.version_info[0] >= 3: + basestring = str + + +# Supported cross-section types +XS_TYPES = ['total', + 'transport', + 'absorption', + 'capture', + 'scatter', + 'nu-scatter', + 'scatter matrix', + 'nu-scatter matrix', + 'fission', + 'nu-fission', + 'chi'] + +# Supported domain types +DOMAIN_TYPES = ['cell', + 'distribcell', + 'universe', + 'material', + 'mesh'] + +# Supported domain objects +DOMAINS = [openmc.Cell, + openmc.Universe, + openmc.Material, + openmc.Mesh] + +# LaTeX Greek symbols for each cross-section type +GREEK = dict() +GREEK['total'] = '$\\Sigma_{t}$' +GREEK['transport'] = '$\\Sigma_{tr}$' +GREEK['absorption'] = '$\\Sigma_{a}$' +GREEK['capture'] = '$\\Sigma_{c}$' +GREEK['scatter'] = '$\\Sigma_{s}$' +GREEK['nu-scatter'] = '$\\nu\\Sigma_{s}$' +GREEK['scatter matrix'] = '$\\Sigma_{s}$' +GREEK['nu-scatter matrix'] = '$\\nu\\Sigma_{s}$' +GREEK['fission'] = '$\\Sigma_{f}$' +GREEK['nu-fission'] = '$\\nu\\Sigma_{f}$' +GREEK['chi'] = '$\\chi$' +GREEK['diffusion'] = '$D$' + + +def flip_axis(arr, axis=0): + """Flip contents of `axis` in array 'arr' + Taken verbatim from: + https://github.com/nipy/nibabel/blob/master/nibabel/orientations.py + """ + arr = np.asanyarray(arr) + arr = arr.swapaxes(0, axis) + arr = np.flipud(arr) + return arr.swapaxes(axis, 0) + + +class MultiGroupXS(object): + """ + + """ + + # This is an abstract class which cannot be instantiated + metaclass__ = abc.ABCMeta + + def __init__(self, name='', domain=None, + domain_type=None, energy_groups=None): + """ + :param name: + :param domain: + :param domain_type: + :param energy_groups: + :return: + """ + + self._name = '' + self._xs_type = None + self._domain = None + self._domain_type = None + self._energy_groups = None + self._num_groups = None + self._tallies = dict() + self._xs = None + + # A dictionary used to compute indices into the xs array + # Keys - Domain ID (ie, Material ID, Region ID for districell, etc) + # Values - Offset/stride into xs array + self._subdomain_offsets = dict() + self._offset = None + + self.name = name + if not domain_type is None: + self.domain_type = domain_type + if not domain is None: + self.domain = domain + if not energy_groups is None: + self.energy_groups = energy_groups + + 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._name = self._name + clone._xs_type = self._xs_type + clone._domain = self._domain + clone._domain_type = self._domain_type + clone._energy_groups = copy.deepcopy(self._energy_groups, memo) + clone._num_groups = self._num_groups + clone._xs = copy.deepcopy(self._xs, memo) + clone._subdomain_offsets = copy.deepcopy(self._subdomain_offsets, memo) + clone._offset = copy.deepcopy(self._offset, memo) + + clone._tallies = dict() + for tally_type, tally in self._tallies.items(): + clone._tallies[tally_type] = copy.deepcopy(tally, memo) + + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + + @property + def name(self): + return self._name + + @property + def domain(self): + return self._domain + + @property + def domain_type(self): + return self._domain_type + + @property + def energy_groups(self): + return self._energy_groups + + @property + def num_groups(self): + return self._num_groups + + @name.setter + def name(self, name): + cv.check_type('MultiGroupXS name', name, basestring) + self._name = name + + @domain.setter + def domain(self, domain): + cv.check_type('MultiGroupXS domain', domain, DOMAINS) + self._domain = domain + if self._domain_type in ['material', 'cell', 'universe', 'mesh']: + self._subdomain_offsets[domain.id] = 0 + + @energy_groups.setter + def energy_groups(self, energy_groups): + cv.check_type('MultiGroupXS energy groups', energy_groups, + openmc.mgxs.EnergyGroups) + self._energy_groups = energy_groups + self._num_groups = energy_groups._num_groups + + @domain_type.setter + def domain_type(self, domain_type): + cv.check_type('MultiGroupXS domain type', domain_type, DOMAIN_TYPES) + self._domain_type = domain_type + + def find_domain_offset(self): + tally = self.tallies[self.tallies.keys()[0]] + filter = tally.find_filter(self.domain_type, [self.domain.id]) + self._offset = filter.offset + + def set_subdomain_offset(self, domain_id, offset): + """ + :param domain_id: + :param offset: + :return: + """ + + cv.check_type('subdomain id', domain_id, Integral) + cv.check_type('subdomain offset', offset, Integral) + self._subdomain_offsets[domain_id] = offset + + @abc.abstractmethod + def _create_tallies(self, scores, filters, keys, estimator): + """ + + :param scores: + :param filters: + :param keys: + :param estimator: + :return: + """ + + if self.energy_groups is None: + raise ValueError('Unable to create Tallies without energy groups') + elif self.domain is None: + raise ValueError('Unable to create Tallies without a domain') + elif self.domain_type is None: + raise ValueError('Unable to create Tallies without a domain type') + + cv.check_type('scores', scores, Iterable, basestring) + cv.check_value('scores', scores, openmc.SCORE_TYPES) + cv.check_type('filters', scores, Iterable, openmc.Filter) + cv.check_type('keys', keys, Iterable, basestring) + cv.check_value('# scores', len(scores), len(keys)) + cv.check_type('estimator', estimator, basestring) + cv.check_value('estimator', estimator, ['analog', 'tracklength']) + + # Create a domain Filter object + domain_filter = openmc.Filter(self.domain_type, self.domain.id) + + for score, key, filters in zip(scores, keys, filters): + self.tallies[key] = openmc.Tally(name=self.name) + self.tallies[key].add_score(score) + self.tallies[key].estimator = estimator + self.tallies[key].add_filter(domain_filter) + + # Add all non-domain specific Filters (ie, energy) to the Tally + for filter in filters: + self.tallies[key].add_filter(filter) + + def get_subdomain_offsets(self, subdomains='all'): + """ + + :param subdomains: + :return: + """ + + if subdomains != 'all': + cv.check_type('subdomains', subdomains, Iterable, Integral) + + if subdomains == 'all': + offsets = np.arange(self.xs.shape[1]) + else: + offsets = np.zeros(len(subdomains), dtype=np.int64) + + for i, subdomain in enumerate(subdomains): + if subdomain in self._subdomain_offsets: + offsets[i] = self._subdomain_offsets[subdomain] + else: + msg = 'Unable to get index for subdomain "{0}" since it ' \ + 'is not a subdomain in cross-section'.format(subdomain) + raise ValueError(msg) + + return offsets + + def get_subdomains(self, offsets='all'): + + if offsets != 'all': + cv.check_type('offsets', offsets, Iterable, Integral) + + if offsets == 'all': + offsets = self.get_subdomain_offsets() + + subdomains = np.zeros(len(offsets), dtype=np.int64) + keys = self._subdomain_offsets.keys() + values = self._subdomain_offsets.values() + + for i, offset in enumerate(offsets): + if offset in values: + subdomains[i] = keys[values.index(offset)] + else: + msg = 'Unable to get subdomain for offset "{0}" since it ' \ + 'is not an offset in the cross-section'.format(offset) + raise ValueError(msg) + + return subdomains + + def get_xs(self, groups='all', subdomains='all', metric='mean'): + + if self.xs is None: + msg = 'Unable to get cross-section since it has not been computed' + raise ValueError(msg) + + cv.check_value('metric', metric, ['mean', 'std. dev.', 'rel. err.']) + if groups != 'all': + cv.check_value('groups', groups, Iterable, Integral) + if subdomains != 'all': + cv.check_value('subdomains', subdomains, Iterable, Integral) + + # FIXME: Make this use Tally.get_values() + + def get_condensed_xs(self, coarse_groups): + """This routine takes in a collection of 2-tuples of energy groups""" + + cv.check_value('coarse groups', coarse_groups, EnergyGroups) + + # FIXME: this should use the Tally.slice(...) routine + + def get_domain_vg_xs(self, subdomains='all'): + + if self.domain_type != 'distribcell': + msg = 'Unable to compute domain averaged "{0}" xs for "{1}"' \ + '"{2}" since it is not a distribcell'.format(self._xs_type, + self._domain_type, self._domain.id) + raise ValueError(msg) + + if subdomains != 'all': + cv.check_value('subdomains', subdomains, Iterable, Integral) + + # FIXME: This should use tally arithmetic + + def print_xs(self, subdomains='all'): + + if subdomains != 'all': + cv.check_value('subdomains', subdomains, Iterable, Integral) + + string = 'Multi-Group XS\n' + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.xs_type) + string += '{0: <16}{1}{2}\n'.format('\tDomain Type', '=\t', self.domain_type) + string += '{0: <16}{1}{2}\n'.format('\tDomain ID', '=\t', self.domain.id) + + if subdomains == 'all': + subdomains = self._subdomain_offsets.keys() + + # Loop over all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += '{0: <16}{1}{2}\n'.format('\tSubDomain', '=\t', subdomain) + + string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + + # Loop over energy groups ranges + for group in range(1,self.num_groups+1): + bounds = self._energy_groups.getGroupBounds(group) + string += '{0: <12}Group {1} [{2: <10} - ' \ + '{3: <10}MeV]:\t'.format('', group, bounds[0], bounds[1]) + average = self.get_xs([group], [subdomain], 'mean') + rel_err = self.get_xs([group], [subdomain], 'rel. err.') + string += '{:.2e}+/-{:1.2e}%'.format(average[0,0,0], rel_err[0,0,0]) + string += '\n' + string += '\n' + + print(string) + + def dump_to_file(self, filename='multigroupxs', directory='multigroupxs'): + + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + # Create an empty dictionary to store the data + xs_results = dict() + + # Store all of this MultiGroupXS' class attributes in the dictionary + xs_results['name'] = self.name + xs_results['xs type'] = self.xs_type + xs_results['domain type'] = self.domain_type + xs_results['domain'] = self.domain + xs_results['energy groups'] = self.energy_groups + xs_results['tallies'] = self.tallies + xs_results['xs'] = self.xs + xs_results['offset'] = self._offset + xs_results['subdomain offsets'] = self._subdomain_offsets + + # Pickle the MultiGroupXS results to a file + filename = directory + '/' + filename + '.pkl' + filename = filename.replace(' ', '-') + pickle.dump(xs_results, open(filename, 'wb')) + + def restore_from_file(self, filename='multigroupxs', directory='multigroupxs'): + + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + + filename = directory + '/' + filename + '.pkl' + filename = filename.replace(' ', '-') + + # Check that the file exists + if not os.path.exists(filename): + msg = 'Unable to import from filename="{0}"'.format(filename) + raise ValueError(msg) + + # Load the pickle file into a dictionary + xs_results = pickle.load(open(filename, 'rb')) + + # Store the MultiGroupXS class attributes + self.name = xs_results['name'] + self.xs_type = xs_results['xs type'] + self.domain_type = xs_results['domain type'] + self.domain = xs_results['domain'] + self.energy_groups = xs_results['energy groups'] + self.tallies = xs_results['tallies'] + self.xs = xs_results['xs'] + self._offset = xs_results['offset'] + self._subdomain_offsets = xs_results['subdomain offsets'] + + def exportResults(self, subdomains='all', filename='multigroupxs', + directory='multigroupxs', format='hdf5', append=True): + + if subdomains != 'all': + cv.check_type('submdomains', subdomains, Iterable, Integral) + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + cv.check_values('format', format, ['hdf5', 'pickle']) + cv.check_type('append', append, bool) + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + # FIXME: Use tally arithmetic!!! + + def print_pdf(self, subdomains='all', filename='multigroupxs', + directory='multigroupxs'): + + if subdomains != 'all': + cv.check_type('submdomains', subdomains, Iterable, Integral) + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + filename = filename.replace(' ', '-') + + # Generate LaTeX file + self.exportResults(subdomains, filename, '.', 'latex', False) + + # Compile LaTeX to PDF + FNULL = open(os.devnull, 'w') + subprocess.check_call('pdflatex {0}.tex'.format(filename), + shell=True, stdout=FNULL) + + # Move PDF to requested directory and cleanup temporary LaTeX files + if directory != '.': + os.system('mv {0}.pdf {1}'.format(filename, directory)) + os.system('rm {0}.tex {0}.aux {0}.log'.format(filename)) + + +class TotalXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(TotalXS, self).__init__(name, domain, domain_type, groups) + self.xs_type = 'total' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'total'] + estimator = 'tracklength' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(TotalXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['total'] / self.tallies['flux'] + + +class TransportXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(TransportXS, self).__init__(name, domain, domain_type, groups) + self.xs_type = 'transport' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'total', 'scatter-1'] + estimator = 'analog' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + energyout_filter = openmc.Filter('energyout', group_edges) + filters = [[energy_filter], [energy_filter], [energyout_filter]] + + # Initialize the Tallies + super(TransportXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['total'] - self.tallies['scatter-1'] + self.xs /= self.tallies['flux'] + + +class AbsorptionXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(AbsorptionXS, self).__init__(name, domain, domain_type, groups) + self.xs_type = 'absorption' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'absorption'] + estimator = 'tracklength' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(AbsorptionXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['absorption'] / self.tallies['flux'] + + +class CaptureXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(CaptureXS, self).__init__(name, domain, domain_type, groups) + self._xs_type = 'capture' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'absorption', 'fission'] + estimator = 'tracklength' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter], [energy_filter]] + + # Intialize the Tallies + super(CaptureXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['absorption'] - self.tallies['fission'] + self.xs /= self.tallies['flux'] + + +class FissionXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, energy_groups=None): + super(FissionXS, self).__init__(name, domain, domain_type, energy_groups) + self._xs_type = 'fission' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'fission'] + estimator = 'tracklength' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self._energy_groups._group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(FissionXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['fission'] / self.tallies['flux'] + + +class NuFissionXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(NuFissionXS, self).__init__(name, domain, domain_type, groups) + self._xs_type = 'nu-fission' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'nu-fission'] + estimator = 'tracklength' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(NuFissionXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['nu-fission'] / self.tallies['flux'] + + +class ScatterXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, energy_groups=None): + super(ScatterXS, self).__init__(name, domain, domain_type, energy_groups) + self._xs_type = 'scatter' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'scatter'] + estimator = 'tracklength' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(ScatterXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['scatter'] / self.tallies['flux'] + + +class NuScatterXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(NuScatterXS, self).__init__(name, domain, domain_type, groups) + self._xs_type = 'nu-scatter' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'nu-scatter'] + estimator = 'analog' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(NuScatterXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['nu-scatter'] / self.tallies['flux'] + + +class ScatterMatrixXS(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(ScatterMatrixXS, self).__init__(name, domain, domain_type, groups) + self._xs_type = 'scatter matrix' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'scatter', 'scatter-1'] + estimator = 'analog' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + energyout_filter = openmc.Filter('energyout', group_edges) + filters = [[energy_filter], [energy_filter, energyout_filter], [energyout_filter]] + + # Intialize the Tallies + super(ScatterMatrixXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['scatter'] - self.tallies['scatter-1'] + self.xs /= self.tallies['flux'] + + def get_condensed_xs(self, coarse_groups): + """This routine takes in a collection of 2-tuples of energy groups""" + + cv.check_value('coarse groups', coarse_groups, EnergyGroups) + + # FIXME: this should use the Tally.slice(...) routine + + # Error checking for the group bounds is done here + new_groups = self.energy_groups.getCondensedGroups(coarse_groups) + num_coarse_groups = new_groups._num_groups + + def get_xs(self, in_groups='all', out_groups='all', + subdomains='all', metric='mean'): + + if self.xs is None: + msg = 'Unable to get cross-section since it has not been computed' + raise ValueError(msg) + + cv.check_value('metric', metric, ['mean', 'std. dev.', 'rel. err.']) + if in_groups != 'all': + cv.check_value('in groups', in_groups, Iterable, Integral) + if out_groups != 'all': + cv.check_value('out groups', out_groups, Iterable, Integral) + if subdomains != 'all': + cv.check_value('subdomains', subdomains, Iterable, Integral) + + # FIXME: Make this use Tally.get_values() + + def print_xs(self, subdomains='all'): + + if subdomains != 'all': + cv.check_value('subdomains', subdomains, Iterable, Integral) + + string = 'Multi-Group XS\n' + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.xs_type) + string += '{0: <16}{1}{2}\n'.format('\tDomain Type', '=\t', self.domain_type) + string += '{0: <16}{1}{2}\n'.format('\tDomain ID', '=\t', self.domain.id) + + string += '{0: <16}\n'.format('\tEnergy Groups:') + + # Loop over energy groups ranges + for group in range(1,self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += '{0: <12}Group {1} [{2: <10} - ' \ + '{3: <10}MeV]\n'.format('', group, bounds[0], bounds[1]) + + if subdomains == 'all': + subdomains = self._subdomain_offsets.keys() + + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += '{0: <16}{1}{2}\n'.format('\tSubDomain', '=\t', subdomain) + + string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + + # Loop over energy groups ranges + for in_group in range(1,self.num_groups+1): + for out_group in range(1,self.num_groups+1): + string += '{0: <12}Group {1} -> Group {2}:\t\t'.format('', in_group, out_group) + average = self.get_xs([in_group], [out_group], [subdomain], 'mean') + rel_err = self.get_xs([in_group], [out_group], [subdomain], 'rel. err.') + string += '{:.2e}+/-{:1.2e}%'.format(average[0,0,0], rel_err[0,0,0]) + string += '\n' + string += '\n' + print(string) + + +class NuScatterMatrixXS(ScatterMatrixXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(NuScatterMatrixXS, self).__init__(name, domain, domain_type, groups) + self.xs_type = 'nu-scatter matrix' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['flux', 'nu-scatter', 'scatter-1'] + estimator = 'analog' + keys = scores + + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + energyout_filter = openmc.Filter('energyout', group_edges) + filters = [[energy_filter], [energy_filter, energyout_filter], [energyout_filter]] + + # Intialize the Tallies + super(ScatterMatrixXS, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + self.xs = self.tallies['nu-scatter'] - self.tallies['scatter-1'] + self.xs /= self.tallies['flux'] + + +class Chi(MultiGroupXS): + + def __init__(self, name='', domain=None, domain_type=None, groups=None): + super(Chi, self).__init__(name, domain, domain_type, groups) + self._xs_type = 'chi' + + def create_tallies(self): + + # Create a list of scores for each Tally to be created + scores = ['nu-fission', 'nu-fission'] + estimator = 'analog' + keys = ['nu-fission-in', 'nu-fission-out'] + + # Create the non-domain specific Filters for the Tallies + group_edges = self._energy_groups._group_edges + energy_filter = openmc.Filter('energy', group_edges) + energyout_filter = openmc.Filter('energyout', group_edges) + filters = [[energy_filter], [energyout_filter]] + + # Intialize the Tallies + super(Chi, self)._create_tallies(scores, filters, keys, estimator) + + def compute_xs(self): + + # Extract and clean the Tally data + tally_data, zero_indices = super(Chi, self).getAllTallyData() + nu_fission_in = tally_data['nu-fission-in'] + nu_fission_out = tally_data['nu-fission-out'] + + # Set any zero reaction rates to -1 + nu_fission_in[0, zero_indices['nu-fission-in']] = -1. + + # FIXME - uncertainty propagation + self._xs = infermc.error_prop.arithmetic.divide_by_scalar(nu_fission_out, + nu_fission_in.sum(2)[0, :, np.newaxis, ...], + corr, False) + + # Compute the total across all groups per subdomain + norm = self._xs.sum(2)[0, :, np.newaxis, ...] + + # Set any zero norms (in non-fissionable domains) to -1 + norm_indices = norm == 0. + norm[norm_indices] = -1. + + # Normalize chi to 1.0 + # FIXME - uncertainty propagation + self._xs = infermc.error_prop.arithmetic.divide_by_scalar(self._xs, norm, + corr, False) + + # For any region without flux or reaction rate, convert xs to zero + self._xs[:, norm_indices] = 0. + + # FIXME - uncertainty propagation - this is just a temporary fix + self._xs[1, ...] = 0. + + # Correct -0.0 to +0.0 + self._xs += 0. \ No newline at end of file From 0a78549adfb569dc48348223c0c96123c2a63c32 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 9 Aug 2015 16:18:59 -0700 Subject: [PATCH 017/519] Added openmc.mgxs to setup.py --- openmc/mgxs/mgxs.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 792d8d30ca..f5b977f6b4 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1,5 +1,5 @@ from collections import Iterable -from numbers import Integral, Real +from numbers import Integral import os import sys import copy @@ -165,7 +165,7 @@ class MultiGroupXS(object): cv.check_type('MultiGroupXS name', name, basestring) self._name = name - @domain.setter + @domain.setterr def domain(self, domain): cv.check_type('MultiGroupXS domain', domain, DOMAINS) self._domain = domain diff --git a/setup.py b/setup.py index b86582dd04..afaa9dcfc5 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ except ImportError: kwargs = {'name': 'openmc', 'version': '0.6.2', - 'packages': ['openmc'], + 'packages': ['openmc', 'openmc.mgxs'], 'scripts': glob.glob('scripts/openmc-*'), # Metadata From 8b6f2dde26591bb44b05772f87d8a6d8f8e88a03 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 9 Aug 2015 21:23:19 -0700 Subject: [PATCH 018/519] Added initial docstrings to MultiGroupXS class --- openmc/mgxs/mgxs.py | 566 ++++++++++++++++++++++++++++---------------- 1 file changed, 368 insertions(+), 198 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index f5b977f6b4..c01c8438a1 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -57,38 +57,63 @@ GREEK['nu-scatter matrix'] = '$\\nu\\Sigma_{s}$' GREEK['fission'] = '$\\Sigma_{f}$' GREEK['nu-fission'] = '$\\nu\\Sigma_{f}$' GREEK['chi'] = '$\\chi$' -GREEK['diffusion'] = '$D$' - - -def flip_axis(arr, axis=0): - """Flip contents of `axis` in array 'arr' - Taken verbatim from: - https://github.com/nipy/nibabel/blob/master/nibabel/orientations.py - """ - arr = np.asanyarray(arr) - arr = arr.swapaxes(0, axis) - arr = np.flipud(arr) - return arr.swapaxes(axis, 0) class MultiGroupXS(object): - """ + """A multi-group cross-section for some energy groups structure within + some spatial domain. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross-sections for deterministic neutronics calculations. + + Parameters + ---------- + name : str, optional + Name of the multi-group cross-section. If not specified, the name is + the empty string. + domain : Material or Cell or Universe or Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe' or 'mesh'} + The domain type for spatial homogenization + energy_groups : EnergyGroups + The energy group structure for energy condensation + + Attributes + ---------- + name : str, optional + Name of the multi-group cross-section + xs_type : str + Cross-section type (e.g., 'total', 'nu-fission', etc.) + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe' or 'mesh'} + Domain type for spatial homogenization + energy_groups : EnergyGroups + Energy group structure for energy condensation + num_groups : Integral + Number of energy groups + tallies : dict + Tallies needed to compute the multi-group cross-section + xs : Tally + Derived tally for the multi-group cross-section. This attribute + is None unless the multi-group cross-section has been computed. + subdomain_offsets : dict + Integral subdomain IDs (keys) mapped to integral tally data array + offsets (values). When the domain_type is 'distribcell', each subdomain + ID corresponds to an instance of the cell domain. For all other domain + types, there is only one subdomain for the domain and this dictionary + will trivially map zero to zero. + offset : Integral + The filter offset for the domain filter """ # This is an abstract class which cannot be instantiated metaclass__ = abc.ABCMeta - def __init__(self, name='', domain=None, - domain_type=None, energy_groups=None): - """ - :param name: - :param domain: - :param domain_type: - :param energy_groups: - :return: - """ - + def __init__(self, domain=None, domain_type=None, + energy_groups=None, name=''): self._name = '' self._xs_type = None self._domain = None @@ -96,12 +121,13 @@ class MultiGroupXS(object): self._energy_groups = None self._num_groups = None self._tallies = dict() - self._xs = None + self._xs_tally = None # A dictionary used to compute indices into the xs array # Keys - Domain ID (ie, Material ID, Region ID for districell, etc) # Values - Offset/stride into xs array - self._subdomain_offsets = dict() + # NOTE: This is primarily used for distribcell domain types + self._subdomain_indices = dict() self._offset = None self.name = name @@ -118,19 +144,19 @@ class MultiGroupXS(object): # 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._name = self._name - clone._xs_type = self._xs_type - clone._domain = self._domain - clone._domain_type = self._domain_type - clone._energy_groups = copy.deepcopy(self._energy_groups, memo) - clone._num_groups = self._num_groups - clone._xs = copy.deepcopy(self._xs, memo) - clone._subdomain_offsets = copy.deepcopy(self._subdomain_offsets, memo) - clone._offset = copy.deepcopy(self._offset, memo) + clone._name = self.name + clone._xs_type = self.xs_type + clone._domain = self.domain + clone._domain_type = self.domain_type + clone._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._num_groups = self.num_groups + clone._xs_tally = copy.deepcopy(self.xs_tally, memo) + clone._subdomain_offsets = copy.deepcopy(self.subdomain_indices, memo) + clone._offset = copy.deepcopy(self.offset, memo) clone._tallies = dict() - for tally_type, tally in self._tallies.items(): - clone._tallies[tally_type] = copy.deepcopy(tally, memo) + for tally_type, tally in self.tallies.items(): + clone.tallies[tally_type] = copy.deepcopy(tally, memo) memo[id(self)] = clone @@ -160,145 +186,248 @@ class MultiGroupXS(object): def num_groups(self): return self._num_groups + @property + def tallies(self): + return self._tallies + + @property + def xs_tally(self): + return self._xs_tally + + @property + def offset(self): + return self._offset + + @property + def subdomain_indices(self): + return self._subdomain_indices + @name.setter def name(self, name): - cv.check_type('MultiGroupXS name', name, basestring) + cv.check_type('name', name, basestring) self._name = name - @domain.setterr + @domain.setter def domain(self, domain): - cv.check_type('MultiGroupXS domain', domain, DOMAINS) + cv.check_type('domain', domain, DOMAINS) self._domain = domain if self._domain_type in ['material', 'cell', 'universe', 'mesh']: - self._subdomain_offsets[domain.id] = 0 - - @energy_groups.setter - def energy_groups(self, energy_groups): - cv.check_type('MultiGroupXS energy groups', energy_groups, - openmc.mgxs.EnergyGroups) - self._energy_groups = energy_groups - self._num_groups = energy_groups._num_groups + self._subdomain_indices[domain.id] = 0 @domain_type.setter def domain_type(self, domain_type): - cv.check_type('MultiGroupXS domain type', domain_type, DOMAIN_TYPES) + cv.check_type('domain type', domain_type, DOMAIN_TYPES) self._domain_type = domain_type - def find_domain_offset(self): + @energy_groups.setter + def energy_groups(self, energy_groups): + cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) + self._energy_groups = energy_groups + self._num_groups = energy_groups._num_groups + + def _find_domain_offset(self): + """Finds and stores the offset of the domain tally filter""" tally = self.tallies[self.tallies.keys()[0]] filter = tally.find_filter(self.domain_type, [self.domain.id]) self._offset = filter.offset - def set_subdomain_offset(self, domain_id, offset): - """ - :param domain_id: - :param offset: - :return: + def set_subdomain_index(self, subdomain_id, offset): + """Set the filter bin index for a subdomain of the domain. + + This is primary useful when the domain type is 'distribcell', in which + case it can be useful to map each subdomain (a cell instance) to its + filter bin in the derived multi-group cross-section tally data array. + + Parameters + ---------- + subdomain_id : Integral + The ID for the subdomain + index : Integral + The filter bin index for the subdomain + """ - cv.check_type('subdomain id', domain_id, Integral) + cv.check_type('subdomain id', subdomain_id, Integral) cv.check_type('subdomain offset', offset, Integral) - self._subdomain_offsets[domain_id] = offset + cv.check_greater_than('subdomain id', subdomain_id, 0, True) + cv.check_greater_than('subdomain offset', subdomain_id, 0, True) + self._subdomain_indices[subdomain_id] = offset @abc.abstractmethod - def _create_tallies(self, scores, filters, keys, estimator): + def _create_tallies(self, scores, all_filters, keys, estimator): + """Instantiates tallies needed to compute the multi-group cross-section + + This is a helper method for MultiGroupXS subclasses to create tallies + for input file generation. The tallies are stored in the tallies dict. + + Parameters + ---------- + scores : Iterable of str + Scores for each tally + filters : Iterable of tuple of Filter + Tuples of non-spatial domain filters for each tally + keys : Iterable of str + Key string used to store each tally in the tallies dictionary + estimator : {'analog' or 'tracklength'} + Type of estimator to use for each tally + """ - :param scores: - :param filters: - :param keys: - :param estimator: - :return: - """ - - if self.energy_groups is None: - raise ValueError('Unable to create Tallies without energy groups') - elif self.domain is None: - raise ValueError('Unable to create Tallies without a domain') - elif self.domain_type is None: - raise ValueError('Unable to create Tallies without a domain type') - - cv.check_type('scores', scores, Iterable, basestring) cv.check_value('scores', scores, openmc.SCORE_TYPES) - cv.check_type('filters', scores, Iterable, openmc.Filter) + # FIXME : Use @smharper's recursive iterable checker + # cv.check_type('filters', all_filters, openmc.Filter) cv.check_type('keys', keys, Iterable, basestring) - cv.check_value('# scores', len(scores), len(keys)) - cv.check_type('estimator', estimator, basestring) + cv.check_length('scores', scores, len(keys)) cv.check_value('estimator', estimator, ['analog', 'tracklength']) # Create a domain Filter object domain_filter = openmc.Filter(self.domain_type, self.domain.id) - for score, key, filters in zip(scores, keys, filters): + for score, key, filters in zip(scores, keys, all_filters): self.tallies[key] = openmc.Tally(name=self.name) self.tallies[key].add_score(score) self.tallies[key].estimator = estimator self.tallies[key].add_filter(domain_filter) - # Add all non-domain specific Filters (ie, energy) to the Tally + # Add all non-domain specific Filters (i.e., 'energy') to the Tally for filter in filters: self.tallies[key].add_filter(filter) - def get_subdomain_offsets(self, subdomains='all'): - """ + def get_subdomain_indices(self, subdomains='all'): + """Get the indices for one or more subdomains. + + This method can be used to extract the indices into the multi-group + cross-section tally data array for a subdomain (i.e., cell instance). + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest + + Returns + indices : NumPy ndarray + Array of subdomain indices indexed in the order of the subdomains + + Raises + ------ + ValueError + When one of the subdomains is not a valid subdomain ID. - :param subdomains: - :return: """ if subdomains != 'all': cv.check_type('subdomains', subdomains, Iterable, Integral) if subdomains == 'all': - offsets = np.arange(self.xs.shape[1]) + # FIXME: This isn't correct any more!! + # indices = np.arange(self.xs.shape[1]) else: - offsets = np.zeros(len(subdomains), dtype=np.int64) + indices = np.zeros(len(subdomains), dtype=np.int64) for i, subdomain in enumerate(subdomains): - if subdomain in self._subdomain_offsets: - offsets[i] = self._subdomain_offsets[subdomain] + if subdomain in self.subdomain_indices: + indices[i] = self.subdomain_indices[subdomain] else: msg = 'Unable to get index for subdomain "{0}" since it ' \ - 'is not a subdomain in cross-section'.format(subdomain) + 'is not a valid subdomain'.format(subdomain) raise ValueError(msg) - return offsets + return indices - def get_subdomains(self, offsets='all'): + def get_subdomains(self, indices='all'): + """Get the subdomain IDs for one or more indices. - if offsets != 'all': - cv.check_type('offsets', offsets, Iterable, Integral) + This method can be used to extract the subdomains for the multi-group + cross-section from their indices in the tally data array. - if offsets == 'all': - offsets = self.get_subdomain_offsets() + See also : get_subdomain_offsets - subdomains = np.zeros(len(offsets), dtype=np.int64) - keys = self._subdomain_offsets.keys() - values = self._subdomain_offsets.values() + Parameters + ---------- + indices : Iterable of Integral or 'all' + Subdomain indices of interest - for i, offset in enumerate(offsets): - if offset in values: - subdomains[i] = keys[values.index(offset)] + Returns + subdomains : NumPy ndarray + Array of subdomain IDs indexed in the order of the indices + + Raises + ------ + ValueError + When one of the indices is not a valid subdomain index. + + """ + + if indices != 'all': + cv.check_type('offsets', indices, Iterable, Integral) + + if indices == 'all': + indices = self.get_subdomain_indices() + + subdomains = np.zeros(len(indices), dtype=np.int64) + keys = self.subdomain_indices.keys() + values = self.subdomain_indices.values() + + for i, index in enumerate(indices): + if index in values: + subdomains[i] = keys[values.index(indices)] else: msg = 'Unable to get subdomain for offset "{0}" since it ' \ - 'is not an offset in the cross-section'.format(offset) + 'is not a valid index'.format(index) raise ValueError(msg) return subdomains - def get_xs(self, groups='all', subdomains='all', metric='mean'): + def get_xs(self, groups='all', subdomains='all', value='mean'): + """ - if self.xs is None: + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev' or 'rel_err' are accepted + + Returns + ------- + xs : ndarray + A NumPy array of the multi-group cross-section indexed in the order + each group and subdomain is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + + """ + + if self.xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) - - cv.check_value('metric', metric, ['mean', 'std. dev.', 'rel. err.']) if groups != 'all': cv.check_value('groups', groups, Iterable, Integral) if subdomains != 'all': cv.check_value('subdomains', subdomains, Iterable, Integral) - # FIXME: Make this use Tally.get_values() + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + filters.append(self.domain_type) + filter_bins.append(subdomains) + + # Construct a collection of the energy group filter bins + filters.append('energy') + filter_bins.append(self.energy_groups.get_group_bounds(groups)) + + # Query the multi-group cross-section tally for the data + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + return xs def get_condensed_xs(self, coarse_groups): """This routine takes in a collection of 2-tuples of energy groups""" @@ -307,54 +436,97 @@ class MultiGroupXS(object): # FIXME: this should use the Tally.slice(...) routine - def get_domain_vg_xs(self, subdomains='all'): + def get_subdomain_avg_xs(self, subdomains='all'): + """Construct a subdomain-averaged version of this cross-section. - if self.domain_type != 'distribcell': - msg = 'Unable to compute domain averaged "{0}" xs for "{1}"' \ - '"{2}" since it is not a distribcell'.format(self._xs_type, - self._domain_type, self._domain.id) - raise ValueError(msg) + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + The subdomain IDs to average across + + Returns + ------- + MultiGroupXS + This MultiGroupXS averaged across subdomains of interest + + """ if subdomains != 'all': cv.check_value('subdomains', subdomains, Iterable, Integral) - # FIXME: This should use tally arithmetic + avg_xs = copy.deepcopy(self) + + if self.domain_type == 'distribcell': + avg_xs.domain_type = 'cell' + avg_xs._subdomain_indices = {} + avg_xs._offset = 0 + + # Spatially average each tally + for key, old_tally in avg_xs.tallies.items(): + # FIXME: Need to create Tally.mean(...) + slice_tally = old_tally.slice(filters=[avg_xs.domain_type], + filter_bins=subdomains) + avg_tally = slice_tally.mean(filters=[avg_xs.domain_type], + filter_bins=subdomains) + avg_xs.tallies[key] = avg_tally + + avg_xs.compute_xs() + + return avg_xs def print_xs(self, subdomains='all'): + """Prints a string representation for the multi-group cross-section. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + The subdomain IDs of the cross-sections to include in the report + + """ if subdomains != 'all': cv.check_value('subdomains', subdomains, Iterable, Integral) string = 'Multi-Group XS\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.xs_type) - string += '{0: <16}{1}{2}\n'.format('\tDomain Type', '=\t', self.domain_type) - string += '{0: <16}{1}{2}\n'.format('\tDomain ID', '=\t', self.domain.id) + string += '{0: <16}=\t{1}\n'.format('\tType', self.xs_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - if subdomains == 'all': - subdomains = self._subdomain_offsets.keys() + if self.xs_tally is not None: + if subdomains == 'all': + subdomains = self.get_subdomain_indices() - # Loop over all subdomains - for subdomain in subdomains: + # Loop over all subdomains + for subdomain in subdomains: - if self.domain_type == 'distribcell': - string += '{0: <16}{1}{2}\n'.format('\tSubDomain', '=\t', subdomain) + if self.domain_type == 'distribcell': + string += '{0: <16}=\t{1}\n'.format('\tSubDomain', subdomain) - string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') - # Loop over energy groups ranges - for group in range(1,self.num_groups+1): - bounds = self._energy_groups.getGroupBounds(group) - string += '{0: <12}Group {1} [{2: <10} - ' \ - '{3: <10}MeV]:\t'.format('', group, bounds[0], bounds[1]) - average = self.get_xs([group], [subdomain], 'mean') - rel_err = self.get_xs([group], [subdomain], 'rel. err.') - string += '{:.2e}+/-{:1.2e}%'.format(average[0,0,0], rel_err[0,0,0]) + # Loop over energy groups ranges + for group in range(1,self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += '{0: <12}Group {1} [{2: <10} - ' \ + '{3: <10}MeV]:\t'.format('', group, bounds[0], bounds[1]) + average = self.get_xs([group], [subdomain], 'mean') + rel_err = self.get_xs([group], [subdomain], 'rel_err')*100. + string += '{:.2e}+/-{:1.2e}%'.format(average, rel_err) + string += '\n' string += '\n' - string += '\n' print(string) - def dump_to_file(self, filename='multigroupxs', directory='multigroupxs'): + def pickle(self, filename='mgxs', directory='mgxs'): + """Store the MultiGroupXS as a pickled binary file. + + Parameters + ---------- + filename : str + Filename for the pickled binary file (default is 'mgxs') + directory : str + Directory for the pickled binary file (default is 'mgxs') + """ cv.check_type('filename', filename, basestring) cv.check_type('directory', directory, basestring) @@ -368,21 +540,30 @@ class MultiGroupXS(object): # Store all of this MultiGroupXS' class attributes in the dictionary xs_results['name'] = self.name - xs_results['xs type'] = self.xs_type - xs_results['domain type'] = self.domain_type + xs_results['xs_type'] = self.xs_type + xs_results['domain_type'] = self.domain_type xs_results['domain'] = self.domain - xs_results['energy groups'] = self.energy_groups + xs_results['energy_groups'] = self.energy_groups xs_results['tallies'] = self.tallies - xs_results['xs'] = self.xs + xs_results['xs_tally'] = self.xs_tally xs_results['offset'] = self._offset - xs_results['subdomain offsets'] = self._subdomain_offsets + xs_results['subdomain_indices'] = self._subdomain_indices - # Pickle the MultiGroupXS results to a file + # Pickle the MultiGroupXS results to a binary file filename = directory + '/' + filename + '.pkl' filename = filename.replace(' ', '-') pickle.dump(xs_results, open(filename, 'wb')) - def restore_from_file(self, filename='multigroupxs', directory='multigroupxs'): + def restore_from_file(self, filename='mgxs', directory='mgxs'): + """Restore the MultiGroupXS from a pickled binary file. + + Parameters + ---------- + filename : str + Filename for the pickled binary file (default is 'mgxs') + directory : str + Directory for the pickled binary file (default is 'mgxs') + """ cv.check_type('filename', filename, basestring) cv.check_type('directory', directory, basestring) @@ -400,17 +581,34 @@ class MultiGroupXS(object): # Store the MultiGroupXS class attributes self.name = xs_results['name'] - self.xs_type = xs_results['xs type'] - self.domain_type = xs_results['domain type'] + self.xs_type = xs_results['xs_type'] + self.domain_type = xs_results['domain_type'] self.domain = xs_results['domain'] - self.energy_groups = xs_results['energy groups'] + self.energy_groups = xs_results['energy_groups'] self.tallies = xs_results['tallies'] - self.xs = xs_results['xs'] + self.xs_tally = xs_results['xs_tally'] self._offset = xs_results['offset'] - self._subdomain_offsets = xs_results['subdomain offsets'] + self._subdomain_indices = xs_results['subdomain_indices'] - def exportResults(self, subdomains='all', filename='multigroupxs', - directory='multigroupxs', format='hdf5', append=True): + def export_xs_data(self, subdomains='all', filename='mgxs', + directory='mgxs', format='hdf5', append=True): + """Export the multi-group cross-secttion data to a file. + + This routine leverages the functionality in the Pandas library to + export DataFrames to CSV, HDF5, LaTeX and PDF files. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + filename : str + Filename for the exported file (default is 'mgxs') + directory : str + Directory for the exported file (default is 'mgxs') + format : {'csv', 'hdf5', 'latex', 'pdf'} + The format for the exported data file + append : bool + If True (default), appends to an existing file if possible + """ if subdomains != 'all': cv.check_type('submdomains', subdomains, Iterable, Integral) @@ -423,35 +621,7 @@ class MultiGroupXS(object): if not os.path.exists(directory): os.makedirs(directory) - # FIXME: Use tally arithmetic!!! - - def print_pdf(self, subdomains='all', filename='multigroupxs', - directory='multigroupxs'): - - if subdomains != 'all': - cv.check_type('submdomains', subdomains, Iterable, Integral) - cv.check_type('filename', filename, basestring) - cv.check_type('directory', directory, basestring) - - # Make directory if it does not exist - if not os.path.exists(directory): - os.makedirs(directory) - - filename = filename.replace(' ', '-') - - # Generate LaTeX file - self.exportResults(subdomains, filename, '.', 'latex', False) - - # Compile LaTeX to PDF - FNULL = open(os.devnull, 'w') - subprocess.check_call('pdflatex {0}.tex'.format(filename), - shell=True, stdout=FNULL) - - # Move PDF to requested directory and cleanup temporary LaTeX files - if directory != '.': - os.system('mv {0}.pdf {1}'.format(filename, directory)) - os.system('rm {0}.tex {0}.aux {0}.log'.format(filename)) - + # FIXME: Use pandas dataframes!! class TotalXS(MultiGroupXS): @@ -475,7 +645,7 @@ class TotalXS(MultiGroupXS): super(TotalXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['total'] / self.tallies['flux'] + self.xs_tally = self.tallies['total'] / self.tallies['flux'] class TransportXS(MultiGroupXS): @@ -501,8 +671,8 @@ class TransportXS(MultiGroupXS): super(TransportXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['total'] - self.tallies['scatter-1'] - self.xs /= self.tallies['flux'] + self.xs_tally = self.tallies['total'] - self.tallies['scatter-1'] + self.xs_tally /= self.tallies['flux'] class AbsorptionXS(MultiGroupXS): @@ -527,7 +697,7 @@ class AbsorptionXS(MultiGroupXS): super(AbsorptionXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['absorption'] / self.tallies['flux'] + self.xs_tally = self.tallies['absorption'] / self.tallies['flux'] class CaptureXS(MultiGroupXS): @@ -552,8 +722,8 @@ class CaptureXS(MultiGroupXS): super(CaptureXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['absorption'] - self.tallies['fission'] - self.xs /= self.tallies['flux'] + self.xs_tally = self.tallies['absorption'] - self.tallies['fission'] + self.xs_tally /= self.tallies['flux'] class FissionXS(MultiGroupXS): @@ -578,7 +748,7 @@ class FissionXS(MultiGroupXS): super(FissionXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['fission'] / self.tallies['flux'] + self.xs_tally = self.tallies['fission'] / self.tallies['flux'] class NuFissionXS(MultiGroupXS): @@ -603,7 +773,7 @@ class NuFissionXS(MultiGroupXS): super(NuFissionXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['nu-fission'] / self.tallies['flux'] + self.xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] class ScatterXS(MultiGroupXS): @@ -628,7 +798,7 @@ class ScatterXS(MultiGroupXS): super(ScatterXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['scatter'] / self.tallies['flux'] + self.xs_tally = self.tallies['scatter'] / self.tallies['flux'] class NuScatterXS(MultiGroupXS): @@ -653,7 +823,7 @@ class NuScatterXS(MultiGroupXS): super(NuScatterXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['nu-scatter'] / self.tallies['flux'] + self.xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] class ScatterMatrixXS(MultiGroupXS): @@ -679,8 +849,8 @@ class ScatterMatrixXS(MultiGroupXS): super(ScatterMatrixXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['scatter'] - self.tallies['scatter-1'] - self.xs /= self.tallies['flux'] + self.xs_tally = self.tallies['scatter'] - self.tallies['scatter-1'] + self.xs_tally /= self.tallies['flux'] def get_condensed_xs(self, coarse_groups): """This routine takes in a collection of 2-tuples of energy groups""" @@ -694,13 +864,13 @@ class ScatterMatrixXS(MultiGroupXS): num_coarse_groups = new_groups._num_groups def get_xs(self, in_groups='all', out_groups='all', - subdomains='all', metric='mean'): + subdomains='all', value='mean'): - if self.xs is None: + if self.xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) - cv.check_value('metric', metric, ['mean', 'std. dev.', 'rel. err.']) + cv.check_value('value', value, ['mean', 'std. dev.', 'rel. err.']) if in_groups != 'all': cv.check_value('in groups', in_groups, Iterable, Integral) if out_groups != 'all': @@ -729,7 +899,7 @@ class ScatterMatrixXS(MultiGroupXS): '{3: <10}MeV]\n'.format('', group, bounds[0], bounds[1]) if subdomains == 'all': - subdomains = self._subdomain_offsets.keys() + subdomains = self._subdomain_indices.keys() for subdomain in subdomains: @@ -773,8 +943,8 @@ class NuScatterMatrixXS(ScatterMatrixXS): super(ScatterMatrixXS, self)._create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs = self.tallies['nu-scatter'] - self.tallies['scatter-1'] - self.xs /= self.tallies['flux'] + self.xs_tally = self.tallies['nu-scatter'] - self.tallies['scatter-1'] + self.xs_tally /= self.tallies['flux'] class Chi(MultiGroupXS): @@ -810,12 +980,12 @@ class Chi(MultiGroupXS): nu_fission_in[0, zero_indices['nu-fission-in']] = -1. # FIXME - uncertainty propagation - self._xs = infermc.error_prop.arithmetic.divide_by_scalar(nu_fission_out, + self._xs_tally = infermc.error_prop.arithmetic.divide_by_scalar(nu_fission_out, nu_fission_in.sum(2)[0, :, np.newaxis, ...], corr, False) # Compute the total across all groups per subdomain - norm = self._xs.sum(2)[0, :, np.newaxis, ...] + norm = self._xs_tally.sum(2)[0, :, np.newaxis, ...] # Set any zero norms (in non-fissionable domains) to -1 norm_indices = norm == 0. @@ -823,14 +993,14 @@ class Chi(MultiGroupXS): # Normalize chi to 1.0 # FIXME - uncertainty propagation - self._xs = infermc.error_prop.arithmetic.divide_by_scalar(self._xs, norm, + self._xs_tally = infermc.error_prop.arithmetic.divide_by_scalar(self._xs_tally, norm, corr, False) # For any region without flux or reaction rate, convert xs to zero - self._xs[:, norm_indices] = 0. + self._xs_tally[:, norm_indices] = 0. # FIXME - uncertainty propagation - this is just a temporary fix - self._xs[1, ...] = 0. + self._xs_tally[1, ...] = 0. # Correct -0.0 to +0.0 - self._xs += 0. \ No newline at end of file + self._xs_tally += 0. \ No newline at end of file From 2c8c771998a37f4746352d3ce0675221d904992d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 1 Jul 2015 16:34:19 +0700 Subject: [PATCH 019/519] Change fixed source simulations to use source_bank rather than dummy source site. This makes fixed source and eigenvalue modes more similar. --- CMakeLists.txt | 2 +- src/eigenvalue.F90 | 4 +- src/fixed_source.F90 | 50 +++---------------- src/global.F90 | 4 -- src/initialize.F90 | 45 ++++++++--------- src/particle_restart_write.F90 | 7 +-- src/source.F90 | 2 +- tests/test_fixed_source/results_true.dat | 8 +-- .../results_true.dat | 8 +-- .../test_particle_restart_fixed.py | 2 +- 10 files changed, 44 insertions(+), 88 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45b626324c..b6bafd5469 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -317,7 +317,7 @@ foreach(test ${TESTS}) elseif(${test} MATCHES "test_particle_restart_eigval") set(RESTART_FILE particle_12_616.h5) elseif(${test} MATCHES "test_particle_restart_fixed") - set(RESTART_FILE particle_7_6144.h5) + set(RESTART_FILE particle_7_928.h5) else(${test} MATCHES "test_statepoint_restart") message(FATAL_ERROR "Restart test ${test} not recognized") endif(${test} MATCHES "test_statepoint_restart") diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index c4b9b9a678..6c8825579c 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -16,7 +16,7 @@ module eigenvalue use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_skip use search, only: binary_search - use source, only: get_source_particle + use source, only: get_source_particle, initialize_source use state_point, only: write_state_point, write_source_point use string, only: to_str use tally, only: synchronize_tallies, setup_active_usertallies, & @@ -44,6 +44,8 @@ contains type(Particle) :: p integer(8) :: i_work + if (.not. restart_run) call initialize_source() + if (master) call header("K EIGENVALUE SIMULATION", level=1) ! Display column titles diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 index 9dbd57324f..c0397fe0b1 100644 --- a/src/fixed_source.F90 +++ b/src/fixed_source.F90 @@ -9,7 +9,7 @@ module fixed_source use output, only: write_message, header use particle_header, only: Particle use random_lcg, only: set_particle_seed - use source, only: sample_external_source, copy_source_attributes + use source, only: initialize_source, get_source_particle use state_point, only: write_state_point use string, only: to_str use tally, only: synchronize_tallies, setup_active_usertallies @@ -22,16 +22,13 @@ contains subroutine run_fixedsource() - integer(8) :: i ! index over histories in single cycle type(Particle) :: p + integer(8) :: i_work ! index over histories in single cycle + + if (.not. restart_run) call initialize_source() if (master) call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) - ! Allocate particle and dummy source site -!$omp parallel - allocate(source_site) -!$omp end parallel - ! Turn timer and tallies on tallies_on = .true. !$omp parallel @@ -50,6 +47,7 @@ contains end if call initialize_batch() + overall_gen = current_batch ! Start timer for transport call time_transport % start() @@ -57,21 +55,11 @@ contains ! ======================================================================= ! LOOP OVER PARTICLES !$omp parallel do schedule(static) firstprivate(p) - PARTICLE_LOOP: do i = 1, work - - ! Set unique particle ID - p % id = (current_batch - 1)*n_particles + work_index(rank) + i - - ! set particle trace - trace = .false. - if (current_batch == trace_batch .and. current_gen == trace_gen .and. & - work_index(rank) + i == trace_particle) trace = .true. - - ! set random number seed - call set_particle_seed(p % id) + PARTICLE_LOOP: do i_work = 1, work + current_work = i_work ! grab source particle from bank - call sample_source_particle(p) + call get_source_particle(p, current_work) ! transport particle call transport(p) @@ -151,26 +139,4 @@ contains end subroutine finalize_batch -!=============================================================================== -! SAMPLE_SOURCE_PARTICLE -!=============================================================================== - - subroutine sample_source_particle(p) - - type(Particle), intent(inout) :: p - - ! Set particle - call p % initialize() - - ! Sample the external source distribution - call sample_external_source(source_site) - - ! Copy source attributes to the particle - call copy_source_attributes(p, source_site) - - ! Determine whether to create track file - if (write_all_tracks) p % write_track = .true. - - end subroutine sample_source_particle - end module fixed_source diff --git a/src/global.F90 b/src/global.F90 index a5ff7453ea..564fcda843 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -283,10 +283,6 @@ module global ! Mode to run in (fixed source, eigenvalue, plotting, etc) integer :: run_mode = NONE - ! Fixed source particle bank - type(Bank), pointer :: source_site => null() -!$omp threadprivate(source_site) - ! Restart run logical :: restart_run = .false. integer :: restart_batch diff --git a/src/initialize.F90 b/src/initialize.F90 index 409d531a38..fd63963bf1 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -20,7 +20,6 @@ module initialize write_message use output_interface use random_lcg, only: initialize_prng - use source, only: initialize_source use state_point, only: load_state_point use string, only: to_str, str_to_int, starts_with, ends_with use tally_header, only: TallyObject, TallyResult, TallyFilter @@ -141,13 +140,9 @@ contains ! Determine how much work each processor should do call calculate_work() - ! Allocate banks and create source particles -- for a fixed source - ! calculation, the external source distribution is sampled during the - ! run, not at initialization - if (run_mode == MODE_EIGENVALUE) then - call allocate_banks() - if (.not. restart_run) call initialize_source() - end if + ! Allocate source bank, and for eigenvalu simulations also allocate the + ! fission bank + call allocate_banks() ! If this is a restart run, load the state point data and binary source ! file @@ -904,31 +899,33 @@ contains call fatal_error("Failed to allocate source bank.") end if + if (run_mode == MODE_EIGENVALUE) then #ifdef _OPENMP - ! If OpenMP is being used, each thread needs its own private fission - ! bank. Since the private fission banks need to be combined at the end of a - ! generation, there is also a 'master_fission_bank' that is used to collect - ! the sites from each thread. + ! If OpenMP is being used, each thread needs its own private fission + ! bank. Since the private fission banks need to be combined at the end of + ! a generation, there is also a 'master_fission_bank' that is used to + ! collect the sites from each thread. - n_threads = omp_get_max_threads() + n_threads = omp_get_max_threads() !$omp parallel - thread_id = omp_get_thread_num() + thread_id = omp_get_thread_num() - if (thread_id == 0) then - allocate(fission_bank(3*work)) - else - allocate(fission_bank(3*work/n_threads)) - end if + if (thread_id == 0) then + allocate(fission_bank(3*work)) + else + allocate(fission_bank(3*work/n_threads)) + end if !$omp end parallel - allocate(master_fission_bank(3*work), STAT=alloc_err) + allocate(master_fission_bank(3*work), STAT=alloc_err) #else - allocate(fission_bank(3*work), STAT=alloc_err) + allocate(fission_bank(3*work), STAT=alloc_err) #endif - ! Check for allocation errors - if (alloc_err /= 0) then - call fatal_error("Failed to allocate fission bank.") + ! Check for allocation errors + if (alloc_err /= 0) then + call fatal_error("Failed to allocate fission bank.") + end if end if end subroutine allocate_banks diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index 0ac55bd273..f138a67403 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -43,12 +43,7 @@ contains call pr % file_create(filename) ! Get information about source particle - select case (run_mode) - case (MODE_EIGENVALUE) - src => source_bank(current_work) - case (MODE_FIXEDSOURCE) - src => source_site - end select + src => source_bank(current_work) ! Write data to file call pr % write_data(FILETYPE_PARTICLE_RESTART, 'filetype') diff --git a/src/source.F90 b/src/source.F90 index 7cfdcf655c..04b5ac760f 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -78,7 +78,7 @@ contains ! Write out initial source if (write_initial_source) then - call write_message('Writing out initial source guess...', 1) + call write_message('Writing out initial source...', 1) #ifdef HDF5 filename = trim(path_output) // 'initial_source.h5' #else diff --git a/tests/test_fixed_source/results_true.dat b/tests/test_fixed_source/results_true.dat index 99eb15e10d..0940301886 100644 --- a/tests/test_fixed_source/results_true.dat +++ b/tests/test_fixed_source/results_true.dat @@ -1,6 +1,6 @@ tally 1: -4.483337E+02 -2.017057E+04 +4.538791E+02 +2.073271E+04 leakage: -9.820000E+00 -9.648000E+00 +9.830000E+00 +9.663900E+00 diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index ffe7d2cae5..81aed707cf 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -3,14 +3,14 @@ current batch: current gen: 0.000000E+00 particle id: -6.144000E+03 +9.280000E+02 run mode: 1.000000E+00 particle weight: 1.000000E+00 particle energy: -5.749729E+00 +4.412022E+00 particle xyz: -8.754675E+00 2.551620E+00 4.394350E-01 +5.572639E+00 -9.139472E+00 -1.974824E+00 particle uvw: --5.971721E-01 -4.845709E-01 6.391999E-01 +1.410422E-01 5.330426E-01 -8.342498E-01 diff --git a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py index 05dcf76a68..385a429407 100644 --- a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py +++ b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py @@ -6,5 +6,5 @@ from testing_harness import ParticleRestartTestHarness if __name__ == '__main__': - harness = ParticleRestartTestHarness('particle_7_6144.*') + harness = ParticleRestartTestHarness('particle_7_928.*') harness.main() From 14c62e70b69a2455571cd0bdb03caedfbe4c3f1c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 2 Jul 2015 20:01:24 +0700 Subject: [PATCH 020/519] Combined main batch/particle loop structure for eigenvalue and fixed source simulations in one 'simulation' mode. The fixed_source module is now gone, and the eigenvalue module consists specifically of eigenvalue-related subroutines. --- src/eigenvalue.F90 | 286 +-------------- src/fixed_source.F90 | 142 -------- src/main.F90 | 9 +- src/simulation.F90 | 325 ++++++++++++++++++ .../results_true.dat | 2 +- 5 files changed, 331 insertions(+), 433 deletions(-) delete mode 100644 src/fixed_source.F90 create mode 100644 src/simulation.F90 diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 6c8825579c..6a4591705c 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -4,275 +4,24 @@ module eigenvalue use message_passing #endif - use cmfd_execute, only: cmfd_init_batch, execute_cmfd use constants, only: ZERO use error, only: fatal_error, warning use global use math, only: t_percentile use mesh, only: count_bank_sites use mesh_header, only: StructuredMesh - use output, only: write_message, header, print_columns, & - print_batch_keff, print_generation use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_skip use search, only: binary_search - use source, only: get_source_particle, initialize_source - use state_point, only: write_state_point, write_source_point use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies, & - reset_result - use trigger, only: check_triggers - use tracking, only: transport implicit none - private - public :: run_eigenvalue - real(8) :: keff_generation ! Single-generation k on each - ! processor - real(8) :: k_sum(2) = ZERO ! Used to reduce sum and sum_sq + real(8) :: keff_generation ! Single-generation k on each processor + real(8) :: k_sum(2) = ZERO ! Used to reduce sum and sum_sq contains -!=============================================================================== -! RUN_EIGENVALUE encompasses all the main logic where iterations are performed -! over the batches, generations, and histories in a k-eigenvalue calculation. -!=============================================================================== - - subroutine run_eigenvalue() - - type(Particle) :: p - integer(8) :: i_work - - if (.not. restart_run) call initialize_source() - - if (master) call header("K EIGENVALUE SIMULATION", level=1) - - ! Display column titles - if(master) call print_columns() - - ! Turn on inactive timer - call time_inactive % start() - - ! ========================================================================== - ! LOOP OVER BATCHES - BATCH_LOOP: do current_batch = 1, n_max_batches - - call initialize_batch() - - ! Handle restart runs - if (restart_run .and. current_batch <= restart_batch) then - call replay_batch_history() - cycle BATCH_LOOP - end if - - ! ======================================================================= - ! LOOP OVER GENERATIONS - GENERATION_LOOP: do current_gen = 1, gen_per_batch - - call initialize_generation() - - ! Start timer for transport - call time_transport % start() - - ! ==================================================================== - ! LOOP OVER PARTICLES -!$omp parallel do schedule(static) firstprivate(p) - PARTICLE_LOOP: do i_work = 1, work - current_work = i_work - - ! grab source particle from bank - call get_source_particle(p, current_work) - - ! transport particle - call transport(p) - - end do PARTICLE_LOOP -!$omp end parallel do - - ! Accumulate time for transport - call time_transport % stop() - - call finalize_generation() - - end do GENERATION_LOOP - - call finalize_batch() - - if (satisfy_triggers) exit BATCH_LOOP - - end do BATCH_LOOP - - call time_active % stop() - - ! ========================================================================== - ! END OF RUN WRAPUP - - if (master) call header("SIMULATION FINISHED", level=1) - - ! Clear particle - call p % clear() - - end subroutine run_eigenvalue - -!=============================================================================== -! INITIALIZE_BATCH -!=============================================================================== - - subroutine initialize_batch() - - call write_message("Simulating batch " // trim(to_str(current_batch)) & - &// "...", 8) - - ! Reset total starting particle weight used for normalizing tallies - total_weight = ZERO - - if (current_batch == n_inactive + 1) then - ! Switch from inactive batch timer to active batch timer - call time_inactive % stop() - call time_active % start() - - ! Enable active batches (and tallies_on if it hasn't been enabled) - active_batches = .true. - tallies_on = .true. - - ! Add user tallies to active tallies list -!$omp parallel - call setup_active_usertallies() -!$omp end parallel - end if - - ! check CMFD initialize batch - if (cmfd_run) call cmfd_init_batch() - - end subroutine initialize_batch - -!=============================================================================== -! INITIALIZE_GENERATION -!=============================================================================== - - subroutine initialize_generation() - - ! set overall generation number - overall_gen = gen_per_batch*(current_batch - 1) + current_gen - - ! Reset number of fission bank sites - n_bank = 0 - - ! Count source sites if using uniform fission source weighting - if (ufs) call count_source_for_ufs() - - ! Store current value of tracklength k - keff_generation = global_tallies(K_TRACKLENGTH) % value - - end subroutine initialize_generation - -!=============================================================================== -! FINALIZE_GENERATION -!=============================================================================== - - subroutine finalize_generation() - - ! Update global tallies with the omp private accumulation variables -!$omp parallel -!$omp critical - global_tallies(K_TRACKLENGTH) % value = & - global_tallies(K_TRACKLENGTH) % value + global_tally_tracklength - global_tallies(K_COLLISION) % value = & - global_tallies(K_COLLISION) % value + global_tally_collision - global_tallies(LEAKAGE) % value = & - global_tallies(LEAKAGE) % value + global_tally_leakage - global_tallies(K_ABSORPTION) % value = & - global_tallies(K_ABSORPTION) % value + global_tally_absorption -!$omp end critical - - ! reset private tallies - global_tally_tracklength = ZERO - global_tally_collision = ZERO - global_tally_leakage = ZERO - global_tally_absorption = ZERO -!$omp end parallel - -#ifdef _OPENMP - ! Join the fission bank from each thread into one global fission bank - call join_bank_from_threads() -#endif - - ! Distribute fission bank across processors evenly - call time_bank % start() - call synchronize_bank() - call time_bank % stop() - - ! Calculate shannon entropy - if (entropy_on) call shannon_entropy() - - ! Collect results and statistics - call calculate_generation_keff() - call calculate_average_keff() - - ! Write generation output - if (master .and. current_gen /= gen_per_batch) call print_generation() - - end subroutine finalize_generation - -!=============================================================================== -! FINALIZE_BATCH handles synchronization and accumulation of tallies, -! calculation of Shannon entropy, getting single-batch estimate of keff, and -! turning on tallies when appropriate -!=============================================================================== - - subroutine finalize_batch() - - ! Collect tallies - call time_tallies % start() - call synchronize_tallies() - call time_tallies % stop() - - ! Reset global tally results - if (.not. active_batches) then - call reset_result(global_tallies) - n_realizations = 0 - end if - - ! Perform CMFD calculation if on - if (cmfd_on) call execute_cmfd() - - ! Display output - if (master) call print_batch_keff() - - ! Calculate combined estimate of k-effective - if (master) call calculate_combined_keff() - - ! Check_triggers - if (master) call check_triggers() -#ifdef MPI - call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & - MPI_COMM_WORLD, mpi_err) -#endif - if (satisfy_triggers .or. & - (trigger_on .and. current_batch == n_max_batches)) then - call statepoint_batch % add(current_batch) - end if - - ! Write out state point if it's been specified for this batch - if (statepoint_batch % contains(current_batch)) then - call write_state_point() - end if - - ! Write out source point if it's been specified for this batch - if ((sourcepoint_batch % contains(current_batch) .or. source_latest) .and. & - source_write) then - call write_source_point() - end if - - if (master .and. current_batch == n_max_batches) then - ! Make sure combined estimate of k-effective is calculated at the last - ! batch in case no state point is written - call calculate_combined_keff() - end if - - end subroutine finalize_batch - !=============================================================================== ! SYNCHRONIZE_BANK samples source sites from the fission sites that were ! accumulated during the generation. This routine is what allows this Monte @@ -832,37 +581,6 @@ contains end subroutine count_source_for_ufs -!=============================================================================== -! REPLAY_BATCH_HISTORY displays keff and entropy for each generation within a -! batch using data read from a state point file -!=============================================================================== - - subroutine replay_batch_history - - ! Write message at beginning - if (current_batch == 1) then - call write_message("Replaying history from state point...", 1) - end if - - do current_gen = 1, gen_per_batch - overall_gen = overall_gen + 1 - call calculate_average_keff() - - ! print out batch keff - if (current_gen < gen_per_batch) then - if (master) call print_generation() - else - if (master) call print_batch_keff() - end if - end do - - ! Write message at end - if (current_batch == restart_batch) then - call write_message("Resuming simulation...", 1) - end if - - end subroutine replay_batch_history - #ifdef _OPENMP !=============================================================================== ! JOIN_BANK_FROM_THREADS diff --git a/src/fixed_source.F90 b/src/fixed_source.F90 deleted file mode 100644 index c0397fe0b1..0000000000 --- a/src/fixed_source.F90 +++ /dev/null @@ -1,142 +0,0 @@ -module fixed_source - -#ifdef MPI - use message_passing -#endif - - use constants, only: ZERO, MAX_LINE_LEN - use global - use output, only: write_message, header - use particle_header, only: Particle - use random_lcg, only: set_particle_seed - use source, only: initialize_source, get_source_particle - use state_point, only: write_state_point - use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies - use trigger, only: check_triggers - use tracking, only: transport - - implicit none - -contains - - subroutine run_fixedsource() - - type(Particle) :: p - integer(8) :: i_work ! index over histories in single cycle - - if (.not. restart_run) call initialize_source() - - if (master) call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) - - ! Turn timer and tallies on - tallies_on = .true. -!$omp parallel - call setup_active_usertallies() -!$omp end parallel - call time_active % start() - - ! ========================================================================== - ! LOOP OVER BATCHES - BATCH_LOOP: do current_batch = 1, n_max_batches - - ! In a restart run, skip any batches that have already been simulated - if (restart_run .and. current_batch <= restart_batch) then - if (current_batch > n_inactive) n_realizations = n_realizations + 1 - cycle BATCH_LOOP - end if - - call initialize_batch() - overall_gen = current_batch - - ! Start timer for transport - call time_transport % start() - - ! ======================================================================= - ! LOOP OVER PARTICLES -!$omp parallel do schedule(static) firstprivate(p) - PARTICLE_LOOP: do i_work = 1, work - current_work = i_work - - ! grab source particle from bank - call get_source_particle(p, current_work) - - ! transport particle - call transport(p) - - end do PARTICLE_LOOP -!$omp end parallel do - - ! Accumulate time for transport - call time_transport % stop() - - call finalize_batch() - - if (satisfy_triggers) exit BATCH_LOOP - - end do BATCH_LOOP - - call time_active % stop() - - ! ========================================================================== - ! END OF RUN WRAPUP - - if (master) call header("SIMULATION FINISHED", level=1) - - end subroutine run_fixedsource - -!=============================================================================== -! INITIALIZE_BATCH -!=============================================================================== - - subroutine initialize_batch() - - call write_message("Simulating batch " // trim(to_str(current_batch)) & - &// "...", 1) - - ! Reset total starting particle weight used for normalizing tallies - total_weight = ZERO - - end subroutine initialize_batch - -!=============================================================================== -! FINALIZE_BATCH -!=============================================================================== - - subroutine finalize_batch() - -! Update global tallies with the omp private accumulation variables -!$omp parallel -!$omp critical - global_tallies(LEAKAGE) % value = & - global_tallies(LEAKAGE) % value + global_tally_leakage -!$omp end critical - - ! reset private tallies - global_tally_leakage = ZERO -!$omp end parallel - - ! Collect and accumulate tallies - call time_tallies % start() - call synchronize_tallies() - call time_tallies % stop() - - ! Check_triggers - if (master) call check_triggers() -#ifdef MPI - call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & - MPI_COMM_WORLD, mpi_err) -#endif - if (satisfy_triggers .or. & - (trigger_on .and. current_batch == n_max_batches)) then - call statepoint_batch % add(current_batch) - end if - - ! Write out state point if it's been specified for this batch - if (statepoint_batch % contains(current_batch)) then - call write_state_point() - end if - - end subroutine finalize_batch - -end module fixed_source diff --git a/src/main.F90 b/src/main.F90 index e4a33f0096..aff1e21146 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -1,13 +1,12 @@ program main use constants - use eigenvalue, only: run_eigenvalue use finalize, only: finalize_run - use fixed_source, only: run_fixedsource use global use initialize, only: initialize_run use particle_restart, only: run_particle_restart use plot, only: run_plot + use simulation, only: run_simulation implicit none @@ -16,10 +15,8 @@ program main ! start problem based on mode select case (run_mode) - case (MODE_FIXEDSOURCE) - call run_fixedsource() - case (MODE_EIGENVALUE) - call run_eigenvalue() + case (MODE_FIXEDSOURCE, MODE_EIGENVALUE) + call run_simulation() case (MODE_PLOTTING) call run_plot() case (MODE_PARTICLE) diff --git a/src/simulation.F90 b/src/simulation.F90 new file mode 100644 index 0000000000..64459f3fd7 --- /dev/null +++ b/src/simulation.F90 @@ -0,0 +1,325 @@ +module simulation + +#ifdef MPI + use mpi +#endif + + use cmfd_execute, only: cmfd_init_batch, execute_cmfd + use constants, only: ZERO + use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & + calculate_combined_keff, calculate_generation_keff, & + shannon_entropy, synchronize_bank, keff_generation +#ifdef _OPENMP + use eigenvalue, only: join_bank_from_threads +#endif + use global + use output, only: write_message, header, print_columns, & + print_batch_keff, print_generation + use particle_header, only: Particle + use source, only: get_source_particle, initialize_source + use state_point, only: write_state_point, write_source_point + use string, only: to_str + use tally, only: synchronize_tallies, setup_active_usertallies, & + reset_result + use trigger, only: check_triggers + use tracking, only: transport + + implicit none + private + public :: run_simulation + +contains + +!=============================================================================== +! RUN_EIGENVALUE encompasses all the main logic where iterations are performed +! over the batches, generations, and histories in a k-eigenvalue calculation. +!=============================================================================== + + subroutine run_simulation() + + type(Particle) :: p + integer(8) :: i_work + + if (.not. restart_run) call initialize_source() + + ! Display header + if (master) then + if (run_mode == MODE_FIXEDSOURCE) then + call header("FIXED SOURCE TRANSPORT SIMULATION", level=1) + elseif (run_mode == MODE_EIGENVALUE) then + call header("K EIGENVALUE SIMULATION", level=1) + call print_columns() + end if + end if + + ! Turn on inactive timer + call time_inactive % start() + + ! ========================================================================== + ! LOOP OVER BATCHES + BATCH_LOOP: do current_batch = 1, n_max_batches + + call initialize_batch() + + ! Handle restart runs + if (restart_run .and. current_batch <= restart_batch) then + call replay_batch_history() + cycle BATCH_LOOP + end if + + ! ======================================================================= + ! LOOP OVER GENERATIONS + GENERATION_LOOP: do current_gen = 1, gen_per_batch + + call initialize_generation() + + ! Start timer for transport + call time_transport % start() + + ! ==================================================================== + ! LOOP OVER PARTICLES +!$omp parallel do schedule(static) firstprivate(p) + PARTICLE_LOOP: do i_work = 1, work + current_work = i_work + + ! grab source particle from bank + call get_source_particle(p, current_work) + + ! transport particle + call transport(p) + + end do PARTICLE_LOOP +!$omp end parallel do + + ! Accumulate time for transport + call time_transport % stop() + + call finalize_generation() + + end do GENERATION_LOOP + + call finalize_batch() + + if (satisfy_triggers) exit BATCH_LOOP + + end do BATCH_LOOP + + call time_active % stop() + + ! ========================================================================== + ! END OF RUN WRAPUP + + if (master) call header("SIMULATION FINISHED", level=1) + + ! Clear particle + call p % clear() + + end subroutine run_simulation + +!=============================================================================== +! INITIALIZE_BATCH +!=============================================================================== + + subroutine initialize_batch() + + if (run_mode == MODE_FIXEDSOURCE) then + call write_message("Simulating batch " // trim(to_str(current_batch)) & + // "...", 1) + end if + + ! Reset total starting particle weight used for normalizing tallies + total_weight = ZERO + + if (current_batch == n_inactive + 1) then + ! Switch from inactive batch timer to active batch timer + call time_inactive % stop() + call time_active % start() + + ! Enable active batches (and tallies_on if it hasn't been enabled) + active_batches = .true. + tallies_on = .true. + + ! Add user tallies to active tallies list +!$omp parallel + call setup_active_usertallies() +!$omp end parallel + end if + + ! check CMFD initialize batch + if (run_mode == MODE_EIGENVALUE) then + if (cmfd_run) call cmfd_init_batch() + end if + + end subroutine initialize_batch + +!=============================================================================== +! INITIALIZE_GENERATION +!=============================================================================== + + subroutine initialize_generation() + + ! set overall generation number + overall_gen = gen_per_batch*(current_batch - 1) + current_gen + + if (run_mode == MODE_EIGENVALUE) then + ! Reset number of fission bank sites + n_bank = 0 + + ! Count source sites if using uniform fission source weighting + if (ufs) call count_source_for_ufs() + + ! Store current value of tracklength k + keff_generation = global_tallies(K_TRACKLENGTH) % value + end if + + end subroutine initialize_generation + +!=============================================================================== +! FINALIZE_GENERATION +!=============================================================================== + + subroutine finalize_generation() + + ! Update global tallies with the omp private accumulation variables +!$omp parallel +!$omp critical + if (run_mode == MODE_EIGENVALUE) then + global_tallies(K_COLLISION) % value = & + global_tallies(K_COLLISION) % value + global_tally_collision + global_tallies(K_ABSORPTION) % value = & + global_tallies(K_ABSORPTION) % value + global_tally_absorption + global_tallies(K_TRACKLENGTH) % value = & + global_tallies(K_TRACKLENGTH) % value + global_tally_tracklength + end if + global_tallies(LEAKAGE) % value = & + global_tallies(LEAKAGE) % value + global_tally_leakage +!$omp end critical + + ! reset private tallies + if (run_mode == MODE_EIGENVALUE) then + global_tally_collision = 0 + global_tally_absorption = 0 + global_tally_tracklength = 0 + end if + global_tally_leakage = 0 +!$omp end parallel + + if (run_mode == MODE_EIGENVALUE) then +#ifdef _OPENMP + ! Join the fission bank from each thread into one global fission bank + call join_bank_from_threads() +#endif + + ! Distribute fission bank across processors evenly + call time_bank % start() + call synchronize_bank() + call time_bank % stop() + + ! Calculate shannon entropy + if (entropy_on) call shannon_entropy() + + ! Collect results and statistics + call calculate_generation_keff() + call calculate_average_keff() + + ! Write generation output + if (master .and. current_gen /= gen_per_batch) call print_generation() + end if + + end subroutine finalize_generation + +!=============================================================================== +! FINALIZE_BATCH handles synchronization and accumulation of tallies, +! calculation of Shannon entropy, getting single-batch estimate of keff, and +! turning on tallies when appropriate +!=============================================================================== + + subroutine finalize_batch() + + ! Collect tallies + call time_tallies % start() + call synchronize_tallies() + call time_tallies % stop() + + ! Reset global tally results + if (.not. active_batches) then + call reset_result(global_tallies) + n_realizations = 0 + end if + + if (run_mode == MODE_EIGENVALUE) then + ! Perform CMFD calculation if on + if (cmfd_on) call execute_cmfd() + + ! Display output + if (master) call print_batch_keff() + + ! Calculate combined estimate of k-effective + if (master) call calculate_combined_keff() + end if + + ! Check_triggers + if (master) call check_triggers() +#ifdef MPI + call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & + MPI_COMM_WORLD, mpi_err) +#endif + if (satisfy_triggers .or. & + (trigger_on .and. current_batch == n_max_batches)) then + call statepoint_batch % add(current_batch) + end if + + ! Write out state point if it's been specified for this batch + if (statepoint_batch % contains(current_batch)) then + call write_state_point() + end if + + ! Write out source point if it's been specified for this batch + if ((sourcepoint_batch % contains(current_batch) .or. source_latest) .and. & + source_write) then + call write_source_point() + end if + + if (master .and. current_batch == n_max_batches .and. & + run_mode == MODE_EIGENVALUE) then + ! Make sure combined estimate of k-effective is calculated at the last + ! batch in case no state point is written + call calculate_combined_keff() + end if + + end subroutine finalize_batch + +!=============================================================================== +! REPLAY_BATCH_HISTORY displays keff and entropy for each generation within a +! batch using data read from a state point file +!=============================================================================== + + subroutine replay_batch_history + + ! Write message at beginning + if (current_batch == 1) then + call write_message("Replaying history from state point...", 1) + end if + + if (run_mode == MODE_EIGENVALUE) then + do current_gen = 1, gen_per_batch + overall_gen = overall_gen + 1 + call calculate_average_keff() + + ! print out batch keff + if (current_gen < gen_per_batch) then + if (master) call print_generation() + else + if (master) call print_batch_keff() + end if + end do + end if + + ! Write message at end + if (current_batch == restart_batch) then + call write_message("Resuming simulation...", 1) + end if + + end subroutine replay_batch_history + +end module simulation diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index 81aed707cf..701c3e1333 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -1,7 +1,7 @@ current batch: 7.000000E+00 current gen: -0.000000E+00 +1.000000E+00 particle id: 9.280000E+02 run mode: From 6791b43b2b71fc3f7e666e841555726e46b3f4ff Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 2 Jul 2015 20:10:41 +0700 Subject: [PATCH 021/519] Don't show eigenvalue-related timing information for fixed source runs --- src/output.F90 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index 939451c6fb..d1d4ec72aa 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1547,11 +1547,15 @@ contains write(ou,100) "Total time in simulation", time_inactive % elapsed + & time_active % elapsed write(ou,100) " Time in transport only", time_transport % elapsed - write(ou,100) " Time in inactive batches", time_inactive % elapsed + if (run_mode == MODE_EIGENVALUE) then + write(ou,100) " Time in inactive batches", time_inactive % elapsed + end if write(ou,100) " Time in active batches", time_active % elapsed - write(ou,100) " Time synchronizing fission bank", time_bank % elapsed - write(ou,100) " Sampling source sites", time_bank_sample % elapsed - write(ou,100) " SEND/RECV source sites", time_bank_sendrecv % elapsed + if (run_mode == MODE_EIGENVALUE) then + write(ou,100) " Time synchronizing fission bank", time_bank % elapsed + write(ou,100) " Sampling source sites", time_bank_sample % elapsed + write(ou,100) " SEND/RECV source sites", time_bank_sendrecv % elapsed + end if write(ou,100) " Time accumulating tallies", time_tallies % elapsed if (cmfd_run) write(ou,100) " Time in CMFD", time_cmfd % elapsed if (cmfd_run) write(ou,100) " Building matrices", & From 68dcbab15f073a05693a01b7885bfdf6d445b035 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 15 Jul 2015 14:35:30 +0200 Subject: [PATCH 022/519] Implement secondary particle bank capability --- src/constants.F90 | 3 ++ src/particle_header.F90 | 32 ++++++++++++++++++- src/simulation.F90 | 49 +++++++++++++++++++++++++++-- src/source.F90 | 70 ----------------------------------------- src/tracking.F90 | 39 +++++++++++++---------- 5 files changed, 104 insertions(+), 89 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 3aaf08f0eb..38bedf0224 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -44,6 +44,9 @@ module constants integer, parameter :: MAX_EVENTS = 10000 integer, parameter :: MAX_SAMPLE = 100000 + ! Maximum number of secondary particles created + integer, parameter :: MAX_SECONDARY = 1000 + ! Maximum number of words in a single line, length of line, and length of ! single word integer, parameter :: MAX_WORDS = 500 diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 7c2586c3e2..ba712b1d30 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -1,6 +1,7 @@ module particle_header - use constants, only: NEUTRON, ONE, NONE, ZERO + use bank_header, only: Bank + use constants, only: NEUTRON, ONE, NONE, ZERO, MAX_SECONDARY use geometry_header, only: BASE_UNIVERSE implicit none @@ -79,9 +80,14 @@ module particle_header ! Track output logical :: write_track = .false. + ! Secondary particles created + integer :: n_secondary = 0 + type(Bank) :: secondary_bank(MAX_SECONDARY) + contains procedure :: initialize => initialize_particle procedure :: clear => clear_particle + procedure :: initialize_from_source => initialize_from_source end type Particle contains @@ -114,6 +120,7 @@ contains this % wgt_bank = ZERO this % n_collision = 0 this % fission = .false. + this % n_secondary = 0 ! Set up base level coordinates this % coord(1) % universe = BASE_UNIVERSE @@ -154,4 +161,27 @@ contains end subroutine reset_coord +!=============================================================================== +! INITIALIZE_FROM_SOURCE +!=============================================================================== + + subroutine initialize_from_source(this, src) + class(Particle), intent(inout) :: this + type(Bank), intent(in) :: src + + ! set defaults + call this % initialize() + + ! copy attributes from source bank site + this % wgt = src % wgt + this % last_wgt = src % wgt + this % coord(1) % xyz = src % xyz + this % coord(1) % uvw = src % uvw + this % last_xyz = src % xyz + this % last_uvw = src % uvw + this % E = src % E + this % last_E = src % E + + end subroutine initialize_from_source + end module particle_header diff --git a/src/simulation.F90 b/src/simulation.F90 index 64459f3fd7..ab9b422480 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -16,7 +16,8 @@ module simulation use output, only: write_message, header, print_columns, & print_batch_keff, print_generation use particle_header, only: Particle - use source, only: get_source_particle, initialize_source + use random_lcg, only: set_particle_seed + use source, only: initialize_source use state_point, only: write_state_point, write_source_point use string, only: to_str use tally, only: synchronize_tallies, setup_active_usertallies, & @@ -83,7 +84,7 @@ contains current_work = i_work ! grab source particle from bank - call get_source_particle(p, current_work) + call initialize_history(p, current_work) ! transport particle call transport(p) @@ -116,6 +117,50 @@ contains end subroutine run_simulation +!=============================================================================== +! INITIALIZE_HISTORY +!=============================================================================== + + subroutine initialize_history(p, index_source) + + type(Particle), intent(inout) :: p + integer(8), intent(in) :: index_source + + integer(8) :: particle_seed ! unique index for particle + integer :: i + + ! set defaults + call p % initialize_from_source(source_bank(index_source)) + + ! set identifier for particle + p % id = work_index(rank) + index_source + + ! set random number seed + particle_seed = (overall_gen - 1)*n_particles + p % id + call set_particle_seed(particle_seed) + + ! set particle trace + trace = .false. + if (current_batch == trace_batch .and. current_gen == trace_gen .and. & + p % id == trace_particle) trace = .true. + + ! Set particle track. + p % write_track = .false. + if (write_all_tracks) then + p % write_track = .true. + else if (allocated(track_identifiers)) then + do i=1, size(track_identifiers(1,:)) + if (current_batch == track_identifiers(1,i) .and. & + ¤t_gen == track_identifiers(2,i) .and. & + &p % id == track_identifiers(3,i)) then + p % write_track = .true. + exit + end if + end do + end if + + end subroutine initialize_history + !=============================================================================== ! INITIALIZE_BATCH !=============================================================================== diff --git a/src/source.F90 b/src/source.F90 index 04b5ac760f..32be6069cd 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -245,74 +245,4 @@ contains end subroutine sample_external_source -!=============================================================================== -! GET_SOURCE_PARTICLE returns the next source particle -!=============================================================================== - - subroutine get_source_particle(p, index_source) - - type(Particle), intent(inout) :: p - integer(8), intent(in) :: index_source - - integer(8) :: particle_seed ! unique index for particle - integer :: i - type(Bank), pointer :: src - - ! set defaults - call p % initialize() - - ! Copy attributes from source to particle - src => source_bank(index_source) - call copy_source_attributes(p, src) - - ! set identifier for particle - p % id = work_index(rank) + index_source - - ! set random number seed - particle_seed = (overall_gen - 1)*n_particles + p % id - call set_particle_seed(particle_seed) - - ! set particle trace - trace = .false. - if (current_batch == trace_batch .and. current_gen == trace_gen .and. & - p % id == trace_particle) trace = .true. - - ! Set particle track. - p % write_track = .false. - if (write_all_tracks) then - p % write_track = .true. - else if (allocated(track_identifiers)) then - do i=1, size(track_identifiers(1,:)) - if (current_batch == track_identifiers(1,i) .and. & - ¤t_gen == track_identifiers(2,i) .and. & - &p % id == track_identifiers(3,i)) then - p % write_track = .true. - exit - end if - end do - end if - - end subroutine get_source_particle - -!=============================================================================== -! COPY_SOURCE_ATTRIBUTES -!=============================================================================== - - subroutine copy_source_attributes(p, src) - - type(Particle), intent(inout) :: p - type(Bank), pointer :: src - - ! copy attributes from source bank site - p % wgt = src % wgt - p % last_wgt = src % wgt - p % coord(1) % xyz = src % xyz - p % coord(1) % uvw = src % uvw - p % last_xyz = src % xyz - p % last_uvw = src % uvw - p % E = src % E - p % last_E = src % E - - end subroutine copy_source_attributes - end module source diff --git a/src/tracking.F90 b/src/tracking.F90 index e5faeb209d..ba452a0141 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -45,20 +45,6 @@ contains call write_message("Simulating Particle " // trim(to_str(p % id))) end if - ! If the cell hasn't been determined based on the particle's location, - ! initiate a search for the current cell - if (p % coord(p % n_coord) % cell == NONE) then - call find_cell(p, found_cell) - - ! Particle couldn't be located - if (.not. found_cell) then - call fatal_error("Could not locate particle " // trim(to_str(p % id))) - end if - - ! set birth cell attribute - p % cell_born = p % coord(p % n_coord) % cell - end if - ! Initialize number of events to zero n_event = 0 @@ -74,7 +60,19 @@ contains call initialize_particle_track() endif - do while (p % alive) + EVENT_LOOP: do + ! If the cell hasn't been determined based on the particle's location, + ! initiate a search for the current cell. This generally happens at the + ! beginning of the history and again for any secondary particles + if (p % coord(p % n_coord) % cell == NONE) then + call find_cell(p, found_cell) + if (.not. found_cell) then + call fatal_error("Could not locate particle " // trim(to_str(p % id))) + end if + + ! set birth cell attribute + if (p % cell_born == NONE) p % cell_born = p % coord(p % n_coord) % cell + end if ! Write particle track. if (p % write_track) call write_particle_track(p) @@ -197,7 +195,16 @@ contains p % alive = .false. end if - end do + ! Check for secondary particles if this particle is dead + if (.not. p % alive) then + if (p % n_secondary > 0) then + call p % initialize_from_source(p % secondary_bank(p % n_secondary)) + p % n_secondary = p % n_secondary - 1 + else + exit EVENT_LOOP + end if + end if + end do EVENT_LOOP ! Finish particle track output. if (p % write_track) then From 3da9bcf32573a263ebca81eb1b0f86e3ddb255f3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 10:56:21 +0200 Subject: [PATCH 023/519] Create secondary neutrons for inelastic reactions with integral multiplicity. --- src/particle_header.F90 | 24 ++++++++++++++++++++-- src/physics.F90 | 44 ++++++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/particle_header.F90 b/src/particle_header.F90 index ba712b1d30..9164845e80 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -87,7 +87,8 @@ module particle_header contains procedure :: initialize => initialize_particle procedure :: clear => clear_particle - procedure :: initialize_from_source => initialize_from_source + procedure :: initialize_from_source + procedure :: create_secondary end type Particle contains @@ -120,7 +121,6 @@ contains this % wgt_bank = ZERO this % n_collision = 0 this % fission = .false. - this % n_secondary = 0 ! Set up base level coordinates this % coord(1) % universe = BASE_UNIVERSE @@ -184,4 +184,24 @@ contains end subroutine initialize_from_source +!=============================================================================== +! CREATE_SECONDARY +!=============================================================================== + + subroutine create_secondary(this, uvw, type) + class(Particle), intent(inout) :: this + real(8), intent(in) :: uvw(3) + integer, intent(in) :: type + + integer :: n + + n = this % n_secondary + 1 + this % secondary_bank(n) % wgt = this % wgt + this % secondary_bank(n) % xyz(:) = this % coord(1) % xyz + this % secondary_bank(n) % uvw(:) = uvw + this % secondary_bank(n) % E = this % E + this % n_secondary = n + + end subroutine create_secondary + end module particle_header diff --git a/src/physics.F90 b/src/physics.F90 index 9ca59a9872..11bc3720fe 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -382,8 +382,7 @@ contains end do ! Perform collision physics for inelastic scattering - call inelastic_scatter(nuc, rxn, p % E, p % coord(1) % uvw, & - p % mu, p % wgt) + call inelastic_scatter(nuc, rxn, p) p % event_MT = rxn % MT end if @@ -1268,24 +1267,23 @@ contains ! than fission), i.e. level scattering, (n,np), (n,na), etc. !=============================================================================== - subroutine inelastic_scatter(nuc, rxn, E, uvw, mu, wgt) + subroutine inelastic_scatter(nuc, rxn, p) + type(Nuclide), pointer :: nuc + type(Reaction), pointer :: rxn + type(Particle), intent(inout) :: p - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn - real(8), intent(inout) :: E ! energy in lab (incoming/outgoing) - real(8), intent(inout) :: uvw(3) ! directional cosines - real(8), intent(out) :: mu ! cosine of scattering angle in lab - real(8), intent(inout) :: wgt ! particle weight - - integer :: law ! secondary energy distribution law - real(8) :: A ! atomic weight ratio of nuclide - real(8) :: E_in ! incoming energy - real(8) :: E_cm ! outgoing energy in center-of-mass - real(8) :: Q ! Q-value of reaction - real(8) :: yield ! neutron yield + integer :: i ! loop index + integer :: law ! secondary energy distribution law + real(8) :: E ! energy in lab (incoming/outgoing) + real(8) :: mu ! cosine of scattering angle in lab + real(8) :: A ! atomic weight ratio of nuclide + real(8) :: E_in ! incoming energy + real(8) :: E_cm ! outgoing energy in center-of-mass + real(8) :: Q ! Q-value of reaction + real(8) :: yield ! neutron yield ! copy energy of neutron - E_in = E + E_in = p % E ! determine A and Q A = nuc % awr @@ -1319,16 +1317,22 @@ contains mu = mu * sqrt(E_cm/E) + ONE/(A+ONE) * sqrt(E_in/E) end if + ! Set outgoing energy and scattering angle + p % E = E + p % mu = mu + ! change direction of particle - uvw = rotate_angle(uvw, mu) + p % coord(1) % uvw = rotate_angle(p % coord(1) % uvw, mu) ! change weight of particle based on yield if (rxn % multiplicity_with_E) then yield = interpolate_tab1(rxn % multiplicity_E, E_in) + p % wgt = yield * p % wgt else - yield = rxn % multiplicity + do i = 1, rxn % multiplicity - 1 + call p % create_secondary(p % coord(1) % uvw, NEUTRON) + end do end if - wgt = yield * wgt end subroutine inelastic_scatter From 23481c64384d147388afe684a4d8c269364823e1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 22:05:41 +0400 Subject: [PATCH 024/519] Update test results since modeling (n,xn) as secondary particles changes answers --- CMakeLists.txt | 4 +- tests/test_basic/results_true.dat | 2 +- tests/test_cmfd_feed/results_true.dat | 500 +- tests/test_cmfd_nofeed/results_true.dat | 502 +- tests/test_density_atombcm/results_true.dat | 2 +- tests/test_density_atomcm3/results_true.dat | 2 +- tests/test_density_kgm3/results_true.dat | 2 +- tests/test_density_sum/results_true.dat | 2 +- .../results_true.dat | 2 +- .../results_true.dat | 2 +- tests/test_energy_grid/results_true.dat | 2 +- tests/test_entropy/results_true.dat | 16 +- tests/test_filter_cell/results_true.dat | 14 +- tests/test_filter_cellborn/results_true.dat | 6 +- tests/test_filter_energy/results_true.dat | 18 +- tests/test_filter_energyout/results_true.dat | 18 +- .../results_true.dat | 66 +- tests/test_filter_material/results_true.dat | 18 +- tests/test_filter_mesh_2d/results_true.dat | 590 +-- tests/test_filter_mesh_3d/results_true.dat | 1634 +++---- tests/test_filter_universe/results_true.dat | 18 +- tests/test_infinite_cell/results_true.dat | 2 +- tests/test_lattice_mixed/results_true.dat | 2 +- tests/test_lattice_multiple/results_true.dat | 2 +- tests/test_many_scores/results_true.dat | 214 +- tests/test_natural_element/results_true.dat | 2 +- tests/test_output/results_true.dat | 2 +- .../results_true.dat | 10 +- .../test_particle_restart_eigval.py | 2 +- tests/test_ptables_off/results_true.dat | 2 +- tests/test_reflective_cone/results_true.dat | 2 +- .../test_reflective_cylinder/results_true.dat | 2 +- tests/test_reflective_plane/results_true.dat | 2 +- tests/test_reflective_sphere/results_true.dat | 2 +- .../results_true.dat | 2 +- tests/test_rotation/results_true.dat | 2 +- tests/test_salphabeta/results_true.dat | 2 +- .../test_salphabeta_multiple/results_true.dat | 2 +- tests/test_score_MT/results_true.dat | 42 +- tests/test_score_absorption/results_true.dat | 22 +- tests/test_score_current/results_true.dat | 2 +- tests/test_score_events/results_true.dat | 18 +- tests/test_score_fission/results_true.dat | 18 +- tests/test_score_flux/results_true.dat | 26 +- tests/test_score_flux_yn/results_true.dat | 890 ++-- .../test_score_kappafission/results_true.dat | 10 +- tests/test_score_nufission/results_true.dat | 10 +- tests/test_score_nuscatter/results_true.dat | 14 +- tests/test_score_nuscatter_n/results_true.dat | 62 +- .../test_score_nuscatter_pn/results_true.dat | 42 +- .../test_score_nuscatter_yn/results_true.dat | 70 +- tests/test_score_scatter/results_true.dat | 14 +- tests/test_score_scatter_n/results_true.dat | 62 +- tests/test_score_scatter_pn/results_true.dat | 42 +- tests/test_score_scatter_yn/results_true.dat | 106 +- tests/test_score_total/results_true.dat | 14 +- tests/test_score_total_yn/results_true.dat | 414 +- tests/test_seed/results_true.dat | 2 +- tests/test_source_angle_mono/results_true.dat | 2 +- .../results_true.dat | 2 +- .../test_source_energy_mono/results_true.dat | 2 +- tests/test_source_file/results_true.dat | 2 +- tests/test_source_point/results_true.dat | 2 +- .../test_sourcepoint_latest/results_true.dat | 2 +- .../test_sourcepoint_restart/results_true.dat | 3960 ++++++++-------- tests/test_statepoint_batch/results_true.dat | 2 +- .../test_statepoint_interval/results_true.dat | 2 +- .../test_statepoint_restart/results_true.dat | 4208 ++++++++--------- .../results_true.dat | 2 +- tests/test_survival_biasing/results_true.dat | 2 +- tests/test_tally_assumesep/results_true.dat | 14 +- tests/test_trace/results_true.dat | 2 +- tests/test_translation/results_true.dat | 2 +- .../results_true.dat | 50 +- .../test_trigger_batch_interval/settings.xml | 6 +- .../test_trigger_batch_interval.py | 2 +- .../results_true.dat | 50 +- .../settings.xml | 6 +- .../test_trigger_no_batch_interval.py | 2 +- tests/test_trigger_no_status/results_true.dat | 50 +- tests/test_trigger_tallies/results_true.dat | 50 +- tests/test_trigger_tallies/settings.xml | 4 +- tests/test_uniform_fs/results_true.dat | 2 +- .../test_union_energy_grids/results_true.dat | 2 +- tests/test_universe/results_true.dat | 2 +- tests/test_void/results_true.dat | 2 +- 86 files changed, 6994 insertions(+), 6994 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b6bafd5469..fd122a14ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -315,7 +315,7 @@ foreach(test ${TESTS}) elseif(${test} MATCHES "test_sourcepoint_restart") set(RESTART_FILE statepoint.07.h5 source.07.h5) elseif(${test} MATCHES "test_particle_restart_eigval") - set(RESTART_FILE particle_12_616.h5) + set(RESTART_FILE particle_9_555.h5) elseif(${test} MATCHES "test_particle_restart_fixed") set(RESTART_FILE particle_7_928.h5) else(${test} MATCHES "test_statepoint_restart") @@ -330,7 +330,7 @@ foreach(test ${TESTS}) elseif(${test} MATCHES "test_sourcepoint_restart") set(RESTART_FILE statepoint.07.binary source.07.binary) elseif(${test} MATCHES "test_particle_restart_eigval") - set(RESTART_FILE particle_12_616.binary) + set(RESTART_FILE particle_9_555.binary) elseif(${test} MATCHES "test_particle_restart_fixed") set(RESTART_FILE particle_7_6144.binary) else(${test} MATCHES "test_statepoint_restart") diff --git a/tests/test_basic/results_true.dat b/tests/test_basic/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_basic/results_true.dat +++ b/tests/test_basic/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_cmfd_feed/results_true.dat b/tests/test_cmfd_feed/results_true.dat index a1dd0d815e..26380d403f 100644 --- a/tests/test_cmfd_feed/results_true.dat +++ b/tests/test_cmfd_feed/results_true.dat @@ -1,128 +1,128 @@ k-combined: -1.177396E+00 4.883437E-03 +1.172666E+00 8.502438E-03 tally 1: -1.107335E+01 -1.235221E+01 -2.002676E+01 -4.017045E+01 -2.844184E+01 -8.111731E+01 -3.428492E+01 -1.177848E+02 -3.735839E+01 -1.397523E+02 -3.894180E+01 -1.517824E+02 -3.528006E+01 -1.246308E+02 -2.863448E+01 -8.222321E+01 -2.125384E+01 -4.535192E+01 -1.112124E+01 -1.241089E+01 +1.170812E+01 +1.376785E+01 +2.179886E+01 +4.765478E+01 +2.945614E+01 +8.709999E+01 +3.527293E+01 +1.245879E+02 +3.829349E+01 +1.470691E+02 +3.709040E+01 +1.379455E+02 +3.380335E+01 +1.145311E+02 +2.801351E+01 +7.871047E+01 +2.029625E+01 +4.131602E+01 +1.084302E+01 +1.180329E+01 tally 2: -2.243113E+01 -2.535057E+01 -1.557550E+01 -1.222813E+01 -2.164704E+00 -2.389690E-01 -4.049814E+01 -8.218116E+01 -2.854669E+01 -4.085264E+01 -3.934452E+00 -7.833208E-01 -5.706024E+01 -1.633739E+02 -4.049737E+01 -8.234850E+01 -5.231368E+00 -1.386110E+00 -6.798682E+01 -2.320807E+02 -4.819178E+01 -1.166820E+02 -6.247056E+00 -1.968990E+00 -7.449317E+01 -2.782374E+02 -5.315156E+01 -1.417287E+02 -6.667584E+00 -2.250879E+00 -7.530107E+01 -2.849330E+02 -5.378916E+01 -1.454619E+02 -7.071012E+00 -2.522919E+00 -6.820303E+01 -2.335083E+02 -4.850330E+01 -1.181013E+02 -6.241747E+00 -1.973368E+00 -5.831373E+01 -1.704779E+02 -4.149124E+01 -8.633656E+01 -5.385636E+00 -1.468642E+00 -4.184350E+01 -8.792430E+01 -2.971699E+01 -4.435896E+01 -3.784806E+00 -7.343249E-01 -2.202673E+01 -2.444732E+01 -1.531988E+01 -1.183160E+01 -2.073873E+00 -2.272561E-01 +2.270565E+01 +2.599927E+01 +1.590852E+01 +1.276260E+01 +2.252857E+00 +2.614120E-01 +4.313167E+01 +9.326539E+01 +3.044479E+01 +4.648169E+01 +4.023051E+00 +8.172006E-01 +5.859113E+01 +1.725665E+02 +4.171599E+01 +8.755981E+01 +5.512216E+00 +1.531207E+00 +6.892516E+01 +2.383198E+02 +4.904413E+01 +1.207096E+02 +6.542718E+00 +2.155749E+00 +7.421495E+01 +2.764539E+02 +5.288881E+01 +1.405388E+02 +6.811354E+00 +2.358827E+00 +7.278191E+01 +2.661597E+02 +5.169924E+01 +1.343999E+02 +6.516967E+00 +2.148745E+00 +6.655238E+01 +2.222812E+02 +4.729758E+01 +1.123214E+02 +6.102046E+00 +1.890147E+00 +5.708495E+01 +1.636585E+02 +4.068603E+01 +8.317681E+01 +5.394757E+00 +1.465413E+00 +4.136562E+01 +8.598520E+01 +2.958591E+01 +4.402226E+01 +3.765802E+00 +7.200302E-01 +2.275517E+01 +2.614738E+01 +1.589295E+01 +1.276624E+01 +2.232715E+00 +2.558645E-01 tally 3: -1.500439E+01 -1.135466E+01 -9.942586E-01 -5.051831E-02 -2.744453E+01 -3.776958E+01 -1.781992E+00 -1.612021E-01 -3.901013E+01 -7.642401E+01 -2.472924E+00 -3.077607E-01 -4.642527E+01 -1.082730E+02 -2.924369E+00 -4.335819E-01 -5.109083E+01 -1.309660E+02 -3.325865E+00 -5.592642E-01 -5.182512E+01 -1.350762E+02 -3.259912E+00 -5.350517E-01 -4.672480E+01 -1.095974E+02 -3.097309E+00 -4.854729E-01 -3.997405E+01 -8.014326E+01 -2.589176E+00 -3.374615E-01 -2.861624E+01 -4.114210E+01 -1.806237E+00 -1.656944E-01 -1.474531E+01 -1.096355E+01 -9.807860E-01 -4.934364E-02 +1.529144E+01 +1.179942E+01 +1.023883E+00 +5.386625E-02 +2.936854E+01 +4.326483E+01 +1.881629E+00 +1.788063E-01 +4.015056E+01 +8.114284E+01 +2.594958E+00 +3.407980E-01 +4.720593E+01 +1.118311E+02 +3.161769E+00 +5.053887E-01 +5.095790E+01 +1.304930E+02 +3.308202E+00 +5.528151E-01 +4.979520E+01 +1.246892E+02 +3.163884E+00 +5.062497E-01 +4.554330E+01 +1.041770E+02 +3.019145E+00 +4.618487E-01 +3.921119E+01 +7.727273E+01 +2.472070E+00 +3.099171E-01 +2.843166E+01 +4.067093E+01 +1.823607E+00 +1.688171E-01 +1.530477E+01 +1.184246E+01 +1.047996E+00 +5.549017E-02 tally 4: 0.000000E+00 0.000000E+00 @@ -160,8 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.050887E+00 -4.698799E-01 +3.111592E+00 +4.883699E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -208,10 +208,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.388951E+00 -1.456464E+00 -2.664528E+00 -3.577345E-01 +5.536088E+00 +1.540676E+00 +2.727975E+00 +3.757452E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -256,10 +256,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.165280E+00 -2.573230E+00 -4.930263E+00 -1.218988E+00 +7.518115E+00 +2.840502E+00 +5.271874E+00 +1.398895E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -304,10 +304,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.550278E+00 -3.668687E+00 -6.985934E+00 -2.450395E+00 +8.764240E+00 +3.855378E+00 +7.176540E+00 +2.591613E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -352,10 +352,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.236725E+00 -4.281659E+00 -8.429932E+00 -3.565265E+00 +9.381092E+00 +4.414024E+00 +8.597689E+00 +3.710217E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -400,10 +400,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.396613E+00 -4.431004E+00 -9.307625E+00 -4.351276E+00 +9.158655E+00 +4.215178E+00 +9.188880E+00 +4.244766E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -448,10 +448,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.721885E+00 -3.821463E+00 -9.438995E+00 -4.479948E+00 +8.362511E+00 +3.509173E+00 +9.159213E+00 +4.209143E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -496,10 +496,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.096946E+00 -2.525113E+00 -8.605114E+00 -3.710134E+00 +7.029505E+00 +2.479106E+00 +8.613258E+00 +3.719199E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -544,10 +544,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.222832E+00 -1.373166E+00 -7.480684E+00 -2.804650E+00 +5.119892E+00 +1.320586E+00 +7.401001E+00 +2.749355E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -592,10 +592,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.726690E+00 -3.773397E-01 -5.470375E+00 -1.504111E+00 +2.765680E+00 +3.903229E-01 +5.461998E+00 +1.501206E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -642,8 +642,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.026290E+00 -4.597502E-01 +3.044921E+00 +4.656739E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -662,114 +662,114 @@ k cmfd 0.000000E+00 0.000000E+00 0.000000E+00 -1.150583E+00 -1.159578E+00 -1.162798E+00 -1.171003E+00 -1.162732E+00 -1.165591E+00 -1.166032E+00 -1.165387E+00 -1.165451E+00 -1.170726E+00 -1.170820E+00 -1.167945E+00 -1.166050E+00 -1.165757E+00 -1.167631E+00 -1.168366E+00 +1.177990E+00 +1.160010E+00 +1.155990E+00 +1.160167E+00 +1.162166E+00 +1.161566E+00 +1.164454E+00 +1.166269E+00 +1.168529E+00 +1.168622E+00 +1.170296E+00 +1.168644E+00 +1.172975E+00 +1.176543E+00 +1.173389E+00 +1.178422E+00 cmfd entropy 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.215201E+00 -3.212850E+00 -3.214094E+00 -3.208054E+00 -3.212891E+00 -3.213349E+00 -3.208290E+00 -3.206895E+00 -3.208786E+00 -3.209630E+00 -3.212321E+00 -3.211750E+00 -3.212453E+00 -3.213370E+00 -3.211791E+00 -3.212685E+00 +3.214145E+00 +3.225292E+00 +3.229509E+00 +3.228530E+00 +3.224203E+00 +3.225547E+00 +3.224720E+00 +3.224546E+00 +3.224527E+00 +3.223579E+00 +3.224380E+00 +3.223483E+00 +3.222819E+00 +3.223067E+00 +3.224007E+00 +3.220616E+00 cmfd balance 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -6.348026E-03 -5.102747E-03 -4.043947E-03 -3.952742E-03 -2.533934E-03 -2.215030E-03 -2.945032E-03 -2.597862E-03 -2.300873E-03 -1.991974E-03 -1.679430E-03 -1.636923E-03 -1.581336E-03 -1.431472E-03 -1.419168E-03 -1.256242E-03 +4.801684E-03 +2.802571E-03 +1.828029E-03 +2.220542E-03 +1.709900E-03 +2.008246E-03 +2.578373E-03 +2.000076E-03 +1.645365E-03 +1.462882E-03 +1.208273E-03 +1.146126E-03 +1.214196E-03 +1.082376E-03 +8.967163E-04 +1.154433E-03 cmfd dominance ratio 0.000E+00 0.000E+00 0.000E+00 0.000E+00 - 5.524E-01 - 5.476E-01 + 5.472E-01 + 5.521E-01 + 5.445E-01 + 5.527E-01 + 5.488E-01 + 5.078E-01 5.474E-01 - 5.419E-01 - 5.443E-01 - 5.448E-01 - 5.408E-01 - 5.391E-01 - 5.400E-01 - 5.396E-01 - 5.408E-01 - 5.398E-01 - 5.398E-01 - 5.399E-01 - 5.388E-01 - 5.389E-01 + 5.475E-01 + 5.473E-01 + 5.469E-01 + 5.461E-01 + 5.455E-01 + 5.454E-01 + 5.459E-01 + 5.460E-01 + 5.432E-01 cmfd openmc source comparison 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.388554E-03 -7.868057E-03 -6.387209E-03 -6.979018E-03 -5.634468E-03 -5.579466E-03 -5.647779E-03 -5.289856E-03 -4.550547E-03 -4.373716E-03 -4.042350E-03 -3.813510E-03 -3.749151E-03 -3.358126E-03 -3.562360E-03 -3.904942E-03 +9.186654E-03 +6.033650E-03 +3.920380E-03 +4.218939E-03 +4.591972E-03 +4.042772E-03 +4.100500E-03 +3.664495E-03 +3.266803E-03 +3.164213E-03 +3.310474E-03 +3.165822E-03 +3.849586E-03 +2.718170E-03 +2.431480E-03 +3.322902E-03 cmfd source -4.142294E-02 -7.484382E-02 -1.050784E-01 -1.256771E-01 -1.444717E-01 -1.420230E-01 -1.350735E-01 -1.118744E-01 -7.755343E-02 -4.198177E-02 +4.296288E-02 +7.964357E-02 +1.107722E-01 +1.359821E-01 +1.425321E-01 +1.356719E-01 +1.285829E-01 +1.040603E-01 +7.630230E-02 +4.348975E-02 diff --git a/tests/test_cmfd_nofeed/results_true.dat b/tests/test_cmfd_nofeed/results_true.dat index da9b802e7e..e70287bf77 100644 --- a/tests/test_cmfd_nofeed/results_true.dat +++ b/tests/test_cmfd_nofeed/results_true.dat @@ -1,128 +1,128 @@ k-combined: -1.170519E+00 8.422960E-03 +1.171115E+00 6.173328E-03 tally 1: -1.078122E+01 -1.170828E+01 -1.999878E+01 -4.018561E+01 -2.812898E+01 -7.936860E+01 -3.362276E+01 -1.133841E+02 -3.714459E+01 -1.382628E+02 -3.828125E+01 -1.470408E+02 -3.599263E+01 -1.299451E+02 -3.090749E+01 -9.596105E+01 -2.144103E+01 -4.630323E+01 -1.143002E+01 -1.314355E+01 +1.151618E+01 +1.331859E+01 +2.120660E+01 +4.514836E+01 +2.759616E+01 +7.639131E+01 +3.216668E+01 +1.036501E+02 +3.664720E+01 +1.345450E+02 +3.771246E+01 +1.424209E+02 +3.523750E+01 +1.245225E+02 +2.973298E+01 +8.860064E+01 +2.152108E+01 +4.647187E+01 +1.169538E+01 +1.375047E+01 tally 2: -2.247115E+01 -2.548076E+01 -1.574700E+01 -1.251937E+01 -2.119907E+00 -2.284737E-01 -4.160187E+01 -8.733627E+01 -2.945600E+01 -4.383448E+01 -4.027136E+00 -8.279807E-01 -5.722117E+01 -1.643758E+02 -4.057100E+01 -8.267151E+01 -5.388803E+00 -1.465180E+00 -6.769175E+01 -2.300722E+02 -4.800300E+01 -1.157663E+02 -6.213554E+00 -1.946061E+00 -7.376629E+01 -2.729166E+02 -5.253400E+01 -1.385018E+02 -6.438590E+00 -2.103693E+00 -7.454128E+01 -2.790080E+02 -5.311800E+01 -1.417584E+02 -6.784745E+00 -2.328936E+00 -6.907125E+01 -2.397912E+02 -4.912000E+01 -1.213330E+02 -6.405754E+00 -2.075535E+00 -6.012056E+01 -1.815248E+02 -4.280600E+01 -9.207864E+01 -5.534450E+00 -1.555396E+00 -4.229808E+01 -8.999380E+01 -3.003200E+01 -4.541718E+01 -3.844618E+00 -7.537006E-01 -2.272774E+01 -2.597695E+01 -1.577800E+01 -1.252728E+01 -2.221451E+00 -2.528223E-01 +2.274639E+01 +2.606952E+01 +1.588200E+01 +1.270445E+01 +2.140989E+00 +2.357207E-01 +4.205792E+01 +8.880940E+01 +2.970000E+01 +4.427086E+01 +3.919645E+00 +7.773724E-01 +5.560960E+01 +1.559764E+02 +3.947900E+01 +7.872700E+01 +5.238942E+00 +1.400918E+00 +6.492259E+01 +2.117369E+02 +4.612200E+01 +1.069035E+02 +5.989449E+00 +1.813201E+00 +7.217377E+01 +2.608499E+02 +5.148500E+01 +1.327923E+02 +6.607336E+00 +2.205529E+00 +7.305896E+01 +2.681514E+02 +5.187500E+01 +1.352457E+02 +6.722921E+00 +2.290262E+00 +6.884269E+01 +2.380550E+02 +4.904800E+01 +1.208314E+02 +6.177320E+00 +1.927173E+00 +5.902100E+01 +1.748370E+02 +4.201000E+01 +8.858460E+01 +5.542381E+00 +1.549108E+00 +4.268091E+01 +9.151405E+01 +3.029500E+01 +4.614050E+01 +3.822093E+00 +7.420139E-01 +2.362279E+01 +2.812041E+01 +1.653100E+01 +1.377737E+01 +2.336090E+00 +2.851840E-01 tally 3: -1.517200E+01 -1.162361E+01 -9.172562E-01 -4.342120E-02 -2.835000E+01 -4.061736E+01 -1.868192E+00 -1.761390E-01 -3.911800E+01 -7.686442E+01 -2.478956E+00 -3.088180E-01 -4.617600E+01 -1.071239E+02 -2.980518E+00 -4.488545E-01 -5.059100E+01 -1.284662E+02 -3.257651E+00 -5.341674E-01 -5.115000E+01 -1.314866E+02 -3.365441E+00 -5.729274E-01 -4.732100E+01 -1.126317E+02 -3.051596E+00 -4.705140E-01 -4.120700E+01 -8.535705E+01 -2.704451E+00 -3.705800E-01 -2.900900E+01 -4.238065E+01 -1.872660E+00 -1.780668E-01 -1.520000E+01 -1.162785E+01 -1.007084E+00 -5.171907E-02 +1.523800E+01 +1.170551E+01 +1.071050E+00 +5.839198E-02 +2.862100E+01 +4.111143E+01 +1.892774E+00 +1.812712E-01 +3.804200E+01 +7.314552E+01 +2.423654E+00 +2.968521E-01 +4.433500E+01 +9.878201E+01 +2.823929E+00 +4.033633E-01 +4.954300E+01 +1.229796E+02 +3.226029E+00 +5.265680E-01 +4.999000E+01 +1.256279E+02 +3.232464E+00 +5.286388E-01 +4.723500E+01 +1.120638E+02 +3.015553E+00 +4.606928E-01 +4.050800E+01 +8.237529E+01 +2.592073E+00 +3.412174E-01 +2.911800E+01 +4.263022E+01 +1.875109E+00 +1.785438E-01 +1.592800E+01 +1.279461E+01 +1.038638E+00 +5.538157E-02 tally 4: 0.000000E+00 0.000000E+00 @@ -160,8 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.017000E+00 -4.575810E-01 +3.065000E+00 +4.742170E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -208,10 +208,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.447000E+00 -1.491865E+00 -2.697000E+00 -3.709330E-01 +5.420000E+00 +1.474674E+00 +2.693000E+00 +3.667090E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -256,10 +256,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.403000E+00 -2.751813E+00 -5.151000E+00 -1.334701E+00 +7.243000E+00 +2.637431E+00 +5.092000E+00 +1.305200E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -304,10 +304,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.635000E+00 -3.741143E+00 -7.048000E+00 -2.495310E+00 +8.280000E+00 +3.445670E+00 +6.765000E+00 +2.307253E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -352,10 +352,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.381000E+00 -4.415619E+00 -8.456000E+00 -3.587840E+00 +8.980000E+00 +4.046484E+00 +8.108000E+00 +3.299338E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -400,10 +400,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.297000E+00 -4.334551E+00 -9.198000E+00 -4.240540E+00 +9.016000E+00 +4.079320E+00 +8.962000E+00 +4.034032E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -448,10 +448,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.737000E+00 -3.843559E+00 -9.508000E+00 -4.553256E+00 +8.465000E+00 +3.595665E+00 +9.296000E+00 +4.340524E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -496,10 +496,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.338000E+00 -2.709162E+00 -8.888000E+00 -3.969398E+00 +7.247000E+00 +2.638527E+00 +8.865000E+00 +3.946315E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -544,10 +544,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.354000E+00 -1.442386E+00 -7.584000E+00 -2.887298E+00 +5.179000E+00 +1.353661E+00 +7.492000E+00 +2.817588E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -592,10 +592,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.707000E+00 -3.709270E-01 -5.507000E+00 -1.522587E+00 +2.821000E+00 +4.067990E-01 +5.617000E+00 +1.587757E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -642,8 +642,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.112000E+00 -4.868600E-01 +3.134000E+00 +4.937920E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -662,114 +662,114 @@ k cmfd 0.000000E+00 0.000000E+00 0.000000E+00 -1.150583E+00 -1.160876E+00 -1.160893E+00 -1.157393E+00 -1.157826E+00 -1.163206E+00 -1.169286E+00 -1.169322E+00 -1.169866E+00 -1.177576E+00 -1.183172E+00 -1.184784E+00 -1.186581E+00 -1.183233E+00 -1.181032E+00 -1.180107E+00 +1.177990E+00 +1.160491E+00 +1.145875E+00 +1.148719E+00 +1.140676E+00 +1.141509E+00 +1.143597E+00 +1.141954E+00 +1.150311E+00 +1.155088E+00 +1.155464E+00 +1.152786E+00 +1.156950E+00 +1.159040E+00 +1.160571E+00 +1.161251E+00 cmfd entropy 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.215201E+00 -3.214833E+00 -3.211409E+00 -3.218241E+00 -3.220068E+00 -3.217667E+00 -3.214425E+00 -3.215427E+00 -3.214339E+00 -3.212343E+00 -3.211075E+00 -3.211281E+00 -3.209704E+00 -3.210597E+00 -3.213481E+00 -3.213943E+00 +3.214145E+00 +3.222082E+00 +3.225870E+00 +3.230292E+00 +3.228784E+00 +3.228863E+00 +3.228331E+00 +3.230222E+00 +3.231212E+00 +3.230979E+00 +3.229831E+00 +3.229258E+00 +3.228559E+00 +3.227915E+00 +3.227427E+00 +3.229561E+00 cmfd balance 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -6.348026E-03 -4.651411E-03 -3.551519E-03 -2.893286E-03 -2.930836E-03 -2.342081E-03 -2.443793E-03 -2.380658E-03 -2.091259E-03 -2.144887E-03 -2.055334E-03 -1.907704E-03 -1.879350E-03 -1.598308E-03 -1.247988E-03 -1.179680E-03 +4.801684E-03 +3.228380E-03 +2.568997E-03 +2.195796E-03 +2.248884E-03 +3.405416E-03 +2.332198E-03 +2.576061E-03 +2.326651E-03 +2.324425E-03 +2.205364E-03 +2.112702E-03 +1.864656E-03 +1.804877E-03 +1.557106E-03 +1.312058E-03 cmfd dominance ratio 0.000E+00 0.000E+00 0.000E+00 0.000E+00 - 5.524E-01 - 5.492E-01 - 5.459E-01 - 5.486E-01 - 5.475E-01 - 5.455E-01 - 5.433E-01 - 5.425E-01 - 5.412E-01 - 5.404E-01 - 5.399E-01 - 5.400E-01 - 5.401E-01 - 5.414E-01 - 5.433E-01 - 5.437E-01 + 5.472E-01 + 5.510E-01 + 5.519E-01 + 5.535E-01 + 5.535E-01 + 5.505E-01 + 5.488E-01 + 5.505E-01 + 5.510E-01 + 5.513E-01 + 5.510E-01 + 5.508E-01 + 5.487E-01 + 5.489E-01 + 5.481E-01 + 5.499E-01 cmfd openmc source comparison 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.388554E-03 -6.525044E-03 -5.810856E-03 -3.651620E-03 -3.448625E-03 -3.805838E-03 -4.064235E-03 -3.244723E-03 -3.963513E-03 -4.186768E-03 -3.785555E-03 -2.732731E-03 -2.308430E-03 -2.074797E-03 -1.581512E-03 -1.729988E-03 +9.186654E-03 +5.964812E-03 +4.465905E-03 +4.119425E-03 +4.973577E-03 +4.092492E-03 +4.063342E-03 +2.804589E-03 +3.632667E-03 +5.005042E-03 +3.428575E-03 +3.007070E-03 +3.091465E-03 +3.030625E-03 +2.751739E-03 +1.762364E-03 cmfd source -3.816410E-02 -7.860013E-02 -1.050204E-01 -1.270331E-01 -1.389768E-01 -1.438216E-01 -1.304530E-01 -1.155470E-01 -7.975741E-02 -4.262650E-02 +4.538792E-02 +8.103354E-02 +1.045198E-01 +1.221411E-01 +1.398214E-01 +1.401011E-01 +1.305055E-01 +1.120110E-01 +8.032924E-02 +4.414939E-02 diff --git a/tests/test_density_atombcm/results_true.dat b/tests/test_density_atombcm/results_true.dat index 384fb593eb..2956b53888 100644 --- a/tests/test_density_atombcm/results_true.dat +++ b/tests/test_density_atombcm/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.760126E+00 1.038820E-02 +1.752274E+00 4.032481E-02 diff --git a/tests/test_density_atomcm3/results_true.dat b/tests/test_density_atomcm3/results_true.dat index 3feb35ba1e..0bd16fc4de 100644 --- a/tests/test_density_atomcm3/results_true.dat +++ b/tests/test_density_atomcm3/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.092203E+00 1.990176E-02 +1.092376E+00 1.759788E-02 diff --git a/tests/test_density_kgm3/results_true.dat b/tests/test_density_kgm3/results_true.dat index c5942e1a23..6b008101fb 100644 --- a/tests/test_density_kgm3/results_true.dat +++ b/tests/test_density_kgm3/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.085745E-01 9.674599E-03 +7.994522E-01 1.065745E-02 diff --git a/tests/test_density_sum/results_true.dat b/tests/test_density_sum/results_true.dat index 418331925d..9b16f2d988 100644 --- a/tests/test_density_sum/results_true.dat +++ b/tests/test_density_sum/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.319139E-01 1.688777E-02 +3.231215E-01 6.421320E-03 diff --git a/tests/test_eigenvalue_genperbatch/results_true.dat b/tests/test_eigenvalue_genperbatch/results_true.dat index d6aac0453a..9e87c901d9 100644 --- a/tests/test_eigenvalue_genperbatch/results_true.dat +++ b/tests/test_eigenvalue_genperbatch/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.012381E-01 1.890480E-03 +3.015627E-01 5.978844E-03 diff --git a/tests/test_eigenvalue_no_inactive/results_true.dat b/tests/test_eigenvalue_no_inactive/results_true.dat index d7575db1fe..fbbe84cc37 100644 --- a/tests/test_eigenvalue_no_inactive/results_true.dat +++ b/tests/test_eigenvalue_no_inactive/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.066374E-01 7.794575E-03 +3.130246E-01 6.960311E-03 diff --git a/tests/test_energy_grid/results_true.dat b/tests/test_energy_grid/results_true.dat index 05cda2e980..9556a981bc 100644 --- a/tests/test_energy_grid/results_true.dat +++ b/tests/test_energy_grid/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.215828E-01 2.966835E-03 +3.155788E-01 7.559348E-03 diff --git a/tests/test_entropy/results_true.dat b/tests/test_entropy/results_true.dat index a3515ba2bb..8b37789c32 100644 --- a/tests/test_entropy/results_true.dat +++ b/tests/test_entropy/results_true.dat @@ -1,13 +1,13 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 entropy: 7.608094E+00 8.167702E+00 8.273634E+00 -8.238974E+00 -8.307173E+00 -8.239618E+00 -8.230443E+00 -8.201657E+00 -8.289158E+00 -8.364683E+00 +8.239452E+00 +8.234598E+00 +8.278421E+00 +8.260773E+00 +8.351860E+00 +8.303719E+00 +8.271058E+00 diff --git a/tests/test_filter_cell/results_true.dat b/tests/test_filter_cell/results_true.dat index 0838e7baed..f3aa5d89b1 100644 --- a/tests/test_filter_cell/results_true.dat +++ b/tests/test_filter_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.517577E+01 -4.747271E+01 -3.151504E+00 -2.051857E+00 -4.536316E+01 -4.258781E+02 +1.423676E+01 +4.330937E+01 +2.914798E+00 +1.831649E+00 +4.088282E+01 +3.662539E+02 diff --git a/tests/test_filter_cellborn/results_true.dat b/tests/test_filter_cellborn/results_true.dat index d2fa7f7004..36dcf40d06 100644 --- a/tests/test_filter_cellborn/results_true.dat +++ b/tests/test_filter_cellborn/results_true.dat @@ -1,10 +1,10 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -7.449502E+01 -1.145793E+03 +7.007584E+01 +1.050827E+03 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_energy/results_true.dat b/tests/test_filter_energy/results_true.dat index 9e3ab7965b..e3f6cff98d 100644 --- a/tests/test_filter_energy/results_true.dat +++ b/tests/test_filter_energy/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.687671E+01 -1.475192E+02 -4.148025E+01 -3.443331E+02 -5.223662E+01 -5.466362E+02 -1.050254E+01 -2.218108E+01 +2.770022E+01 +1.559167E+02 +4.285040E+01 +3.679177E+02 +5.288354E+01 +5.619308E+02 +1.134904E+01 +2.579927E+01 diff --git a/tests/test_filter_energyout/results_true.dat b/tests/test_filter_energyout/results_true.dat index fa0bfa6466..649f4d7259 100644 --- a/tests/test_filter_energyout/results_true.dat +++ b/tests/test_filter_energyout/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.740000E+01 -1.516786E+02 -4.163000E+01 -3.469463E+02 -5.041000E+01 -5.097599E+02 -6.990000E+00 -9.850700E+00 +2.835000E+01 +1.631463E+02 +4.252000E+01 +3.622146E+02 +5.192000E+01 +5.401444E+02 +7.390000E+00 +1.097710E+01 diff --git a/tests/test_filter_group_transfer/results_true.dat b/tests/test_filter_group_transfer/results_true.dat index 2222558273..f2d5faa991 100644 --- a/tests/test_filter_group_transfer/results_true.dat +++ b/tests/test_filter_group_transfer/results_true.dat @@ -1,54 +1,54 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.470000E+01 -1.233286E+02 +2.571000E+01 +1.344145E+02 0.000000E+00 0.000000E+00 -7.000000E-02 -2.100000E-03 +2.000000E-02 +2.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.590851E-01 -1.552999E-01 +8.909862E-01 +1.660072E-01 0.000000E+00 0.000000E+00 -2.474615E+00 -1.227479E+00 -2.700000E+00 -1.469800E+00 +2.269580E+00 +1.046926E+00 +2.640000E+00 +1.397800E+00 0.000000E+00 0.000000E+00 -3.712000E+01 -2.758636E+02 +3.799000E+01 +2.892451E+02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.370712E-01 -2.596756E-02 +3.267964E-01 +2.170374E-02 0.000000E+00 0.000000E+00 -9.771334E-01 -1.963983E-01 +8.811378E-01 +1.642094E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.440000E+00 -3.947400E+00 +4.510000E+00 +4.068900E+00 0.000000E+00 0.000000E+00 -4.688000E+01 -4.409726E+02 -2.867366E-02 -2.783031E-04 +4.842000E+01 +4.700146E+02 +6.079426E-02 +8.532151E-04 0.000000E+00 0.000000E+00 -1.080794E-01 -2.580055E-03 +1.182446E-01 +3.979568E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -57,11 +57,11 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.530000E+00 -2.494900E+00 -1.572766E-01 -5.137814E-03 -6.990000E+00 -9.850700E+00 -3.134136E-01 -2.138680E-02 +3.500000E+00 +2.455800E+00 +1.158638E-01 +2.993934E-03 +7.390000E+00 +1.097710E+01 +3.126942E-01 +2.185793E-02 diff --git a/tests/test_filter_material/results_true.dat b/tests/test_filter_material/results_true.dat index 3d15ea4322..86e1e943ce 100644 --- a/tests/test_filter_material/results_true.dat +++ b/tests/test_filter_material/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.819256E+01 -1.591068E+02 -6.599750E+00 -8.721650E+00 -5.383171E+01 -5.950793E+02 -4.140672E+01 -3.649396E+02 +2.923791E+01 +1.711686E+02 +6.753642E+00 +9.145065E+00 +4.921142E+01 +5.186991E+02 +4.731999E+01 +4.905260E+02 diff --git a/tests/test_filter_mesh_2d/results_true.dat b/tests/test_filter_mesh_2d/results_true.dat index 01aea5afe2..21946086b9 100644 --- a/tests/test_filter_mesh_2d/results_true.dat +++ b/tests/test_filter_mesh_2d/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -45,8 +45,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.751430E-01 -7.658753E-01 +3.228098E-02 +1.042062E-03 +3.222708E-01 +1.038585E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -73,14 +75,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.182335E-01 +3.748630E-01 +2.711997E-01 +5.338821E-02 +3.359680E-01 +5.168399E-02 0.000000E+00 0.000000E+00 -1.287286E-01 -1.657106E-02 -7.512292E-01 -1.499955E-01 -2.231206E+00 -1.531548E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.706070E-01 +1.373496E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -95,120 +109,106 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -6.855163E-02 -4.699326E-03 -6.967594E-02 -4.854737E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.993440E-02 -9.986884E-03 -1.978123E-01 -3.912972E-02 -8.758664E-02 -7.671419E-03 -4.204632E-01 -7.722514E-02 -2.486465E+00 -1.923132E+00 -1.697091E-01 -1.631523E-02 -0.000000E+00 -0.000000E+00 +3.931419E-01 +9.002841E-02 +1.092722E+00 +3.733055E-01 +2.384227E+00 +1.926937E+00 +9.101131E-01 +3.634496E-01 +3.284661E-01 +1.078900E-01 0.000000E+00 0.000000E+00 6.885295E-02 4.740728E-03 0.000000E+00 0.000000E+00 -6.175782E-01 -2.022672E-01 -1.204200E-02 -8.137904E-05 -2.136417E-01 -1.678274E-02 -2.932366E-01 -4.285227E-02 -6.387464E-01 -1.526040E-01 +2.419633E-02 +5.854622E-04 +9.286912E-02 +7.247209E-03 +5.629729E-01 +9.281109E-02 +7.345786E-01 +1.755550E-01 +1.219449E-01 +1.487057E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.062751E+00 -3.899247E-01 -1.264401E+00 -5.654864E-01 -1.615537E+00 -5.605431E-01 -4.267750E-01 -1.013728E-01 -2.024264E+00 -9.373843E-01 -1.122195E-01 -7.011342E-03 -8.223839E-01 -2.170405E-01 -1.239203E+00 -4.165595E-01 -1.169828E+00 -4.406334E-01 -1.373464E+00 -6.398480E-01 -2.824398E+00 -2.991665E+00 -6.158518E-01 -1.951901E-01 -7.188149E-01 -1.091668E-01 -7.595527E-01 -2.108412E-01 -5.784902E-01 -1.362812E-01 -7.167515E-01 -3.225769E-01 -2.081496E-02 -4.332627E-04 -9.212853E-01 -2.277306E-01 -1.266470E+00 -6.777774E-01 +1.983303E-01 +3.797884E-02 +4.840974E-02 +1.266547E-03 +1.183485E+00 +4.184814E-01 +3.027254E-01 +8.598449E-02 +9.889868E-01 +4.608531E-01 +8.698103E-01 +4.598559E-01 +1.332831E+00 +4.809984E-01 +1.564949E+00 +5.782651E-01 +1.143572E+00 +4.399439E-01 +1.326651E+00 +6.376565E-01 +1.716813E+00 +1.314280E+00 +7.673229E-01 +2.364966E-01 +2.539284E+00 +1.945563E+00 +1.263219E+00 +4.919339E-01 +5.430042E-01 +1.300266E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.553587E-01 +1.738170E-01 +2.048487E+00 +1.239856E+00 3.761862E-01 8.452912E-02 -1.350273E-02 -1.823238E-04 -3.348203E-01 -6.603737E-02 -2.382593E-01 -2.884302E-02 -1.548117E+00 -7.256982E-01 -9.635803E-01 -4.452538E-01 -1.030188E+00 -3.496685E-01 -7.053043E-01 -2.814424E-01 -1.260458E-01 -8.365754E-03 -1.484515E+00 -7.183840E-01 -1.887042E+00 -1.143800E+00 -3.798783E+00 -4.487065E+00 -2.274180E+00 -1.991784E+00 -1.903719E-01 -3.237886E-02 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 +9.675232E-02 +9.361012E-03 +2.319594E-01 +2.331698E-02 +1.573495E+00 +6.394722E-01 +4.432570E-01 +1.005943E-01 +9.353148E-01 +3.125416E-01 +8.359366E-01 +2.985072E-01 +1.657665E+00 +9.207020E-01 +3.737550E+00 +3.558505E+00 +1.742376E+00 +8.732217E-01 +5.153816E+00 +6.543973E+00 +1.653035E+00 +1.061068E+00 +9.963191E-01 +3.716347E-01 +2.282805E-01 +2.383414E-02 +8.749983E-01 +2.714666E-01 1.728411E-01 1.190218E-02 9.250054E-02 @@ -219,28 +219,28 @@ tally 1: 1.711154E-02 3.218800E-01 7.906855E-02 -9.721141E-01 -3.463278E-01 -8.364857E-01 -2.612988E-01 -6.317454E-01 -1.837078E-01 -2.134394E-01 -1.710045E-02 -3.743814E-02 -1.401614E-03 -1.314651E+00 -7.700853E-01 -7.389940E-01 -2.322340E-01 -6.147456E-01 -1.001719E-01 -3.157573E+00 -2.794673E+00 -6.671644E-01 -1.996570E-01 -0.000000E+00 -0.000000E+00 +1.057036E+00 +3.778638E-01 +9.231639E-01 +2.991795E-01 +3.375678E-01 +1.041383E-01 +1.181686E-01 +8.023920E-03 +4.912969E-01 +2.073894E-01 +9.395786E-01 +4.653730E-01 +6.998437E-01 +2.917085E-01 +3.074214E+00 +2.819088E+00 +2.570673E+00 +1.358321E+00 +1.108912E+00 +3.843307E-01 +4.950896E-02 +2.451137E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -255,24 +255,24 @@ tally 1: 7.670183E-03 0.000000E+00 0.000000E+00 -9.451595E-01 -2.560533E-01 -2.255990E+00 -1.237092E+00 -9.318430E-01 -2.664794E-01 -5.320317E-01 -2.267827E-01 -9.971891E-01 -5.070904E-01 -7.088786E-02 -5.025089E-03 -3.601108E-02 -1.296798E-03 -3.683352E+00 -3.243246E+00 -3.708141E+00 -3.629996E+00 +6.469411E-01 +1.789549E-01 +7.829878E-01 +2.033989E-01 +8.994770E-01 +2.351438E-01 +4.712797E-01 +7.213659E-02 +2.133532E+00 +9.765422E-01 +4.533607E-01 +1.511497E-01 +1.878729E+00 +2.099266E+00 +4.287190E+00 +4.748691E+00 +1.961229E+00 +1.085868E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -285,28 +285,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.238471E-01 -1.533812E-02 -2.580606E+00 -1.878196E+00 -2.843921E+00 -1.997749E+00 -1.145124E+00 -4.571704E-01 -1.135664E+00 -4.319756E-01 +1.061692E-01 +1.127190E-02 +1.912282E-01 +3.656822E-02 +3.289827E-01 +1.075283E-01 +1.750908E+00 +8.092384E-01 +2.156426E+00 +9.498067E-01 +1.480596E+00 +6.002164E-01 +3.249216E-01 +1.005106E-01 8.875810E-02 7.878000E-03 -7.494206E-02 -5.616313E-03 -1.007353E+00 -3.619658E-01 -1.649444E+00 -7.918743E-01 +2.458176E-01 +4.377921E-02 +2.766784E+00 +2.677426E+00 +2.703501E+00 +2.548083E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -319,28 +319,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.286351E-01 -1.805028E-01 -1.595058E+00 -6.351621E-01 -1.568755E+00 -6.468874E-01 -2.301331E+00 -1.845232E+00 -4.577930E-01 -1.589685E-01 +1.981880E-01 +3.927848E-02 +2.789456E-01 +5.304261E-02 +3.897689E-01 +9.413685E-02 +9.140885E-01 +2.822974E-01 +1.887726E+00 +7.592780E-01 +1.841624E+00 +1.680236E+00 +4.059938E-01 +1.562853E-01 2.897077E-01 8.393057E-02 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -1.772980E-01 -3.143459E-02 +2.445051E-01 +5.978276E-02 +2.234657E-01 +2.716625E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -353,24 +353,24 @@ tally 1: 0.000000E+00 4.783335E-02 2.288029E-03 -8.744336E-01 -2.611835E-01 -1.754522E+00 -1.459573E+00 -3.549403E-01 -6.365363E-02 -1.843261E+00 -9.517219E-01 -1.009556E+00 -4.611770E-01 -1.540221E+00 -7.611324E-01 -8.030427E-01 -2.255596E-01 +5.606011E-01 +1.607491E-01 +1.908325E+00 +1.505641E+00 +1.255795E-01 +1.541635E-02 +7.395548E-01 +2.274416E-01 +5.986733E-01 +9.576988E-02 +1.095026E+00 +4.872910E-01 +1.043470E+00 +3.153965E-01 1.004973E+00 6.046910E-01 -1.664911E-01 -2.771927E-02 +1.724071E-01 +2.775427E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -385,114 +385,114 @@ tally 1: 0.000000E+00 5.470039E-01 2.992133E-01 -4.902613E-01 -1.163360E-01 +4.313918E-01 +1.128703E-01 1.088037E+00 6.007745E-01 1.013469E+00 5.646900E-01 -5.529904E-01 -2.308161E-01 -3.523818E-01 -1.241729E-01 -2.031343E-01 -4.126355E-02 -2.664927E+00 -2.323850E+00 -2.601166E+00 -1.593528E+00 -1.726764E+00 -6.491827E-01 -7.083106E-02 -3.090181E-03 +4.738741E-01 +2.245567E-01 +6.086518E-02 +3.704570E-03 +1.126662E+00 +4.675322E-01 +1.008459E+00 +4.616352E-01 +1.309592E+00 +5.665211E-01 +1.334050E+00 +5.264819E-01 +7.324996E-01 +2.577124E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +3.227736E-01 +1.041828E-01 +9.218244E-01 +2.000301E-01 +2.119900E+00 +1.123846E+00 +4.366404E-02 +1.015133E-03 0.000000E+00 0.000000E+00 -2.213571E-01 -2.455759E-02 -1.471329E+00 -7.001977E-01 -6.348345E-01 -1.603344E-01 -0.000000E+00 -0.000000E+00 -7.240936E-01 -1.701659E-01 -1.280272E+00 -3.624213E-01 -9.794833E-01 -4.411714E-01 +2.309730E-01 +2.570742E-02 +1.270911E+00 +4.617932E-01 +1.107069E+00 +4.574496E-01 1.269137E-01 1.610709E-02 -1.120245E-01 -1.254949E-02 +2.207099E-01 +4.871286E-02 +9.075694E-02 +8.236821E-03 +1.046380E-01 +7.875036E-03 +2.836364E-01 +3.508209E-02 +4.509177E-01 +7.393615E-02 +1.077505E+00 +3.209541E-01 +1.204982E-02 +1.451982E-04 0.000000E+00 0.000000E+00 -8.072240E-01 -2.272369E-01 -3.032594E-01 -5.076695E-02 -7.265258E-01 -1.893670E-01 -2.902123E-01 -3.514713E-02 +0.000000E+00 +0.000000E+00 +2.502937E-01 +5.035125E-02 +1.367234E+00 +5.128884E-01 +5.563575E-01 +2.510519E-01 +3.174809E-01 +1.007941E-01 +9.152129E-01 +2.609325E-01 +9.040668E-01 +2.263595E-01 +7.868812E-01 +2.436310E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.608891E-02 -4.586038E-03 -1.319691E+00 -5.856361E-01 -7.752262E-01 -3.101466E-01 -2.606443E-01 -6.793546E-02 -3.686503E-01 -6.346661E-02 -6.935008E-01 -1.992259E-01 -1.591064E+00 -6.804860E-01 -2.418186E-01 -5.847626E-02 0.000000E+00 0.000000E+00 -5.946272E-02 -3.535814E-03 -3.120645E-02 -9.738427E-04 -7.515014E-02 -5.647544E-03 -8.673868E-01 -3.013632E-01 -2.427216E-01 -2.798481E-02 +3.390904E-01 +4.907887E-02 +6.577001E-01 +2.346964E-01 +1.023735E-01 +8.287220E-03 1.499600E-02 2.248801E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079687E-01 -5.125039E-02 -1.649743E+00 -9.187008E-01 -8.924207E-01 -2.872456E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.137844E-02 -5.984482E-03 +1.395650E-01 +1.947839E-02 +1.040555E+00 +3.043523E-01 +1.426976E+00 +6.218295E-01 +8.342758E-01 +2.539692E-01 +3.101170E-01 +9.617255E-02 +6.319919E-02 +3.629541E-03 +1.292774E-01 +8.674372E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -515,14 +515,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.400001E-01 -3.766524E-01 -2.709865E+00 -1.701203E+00 -2.332406E-01 -4.591958E-02 -9.579949E-02 -9.177542E-03 +9.587357E-01 +4.992769E-01 +1.756477E+00 +7.884472E-01 +2.541705E-01 +4.325743E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -551,10 +551,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.366480E-01 -8.328374E-02 -7.405305E-01 -5.483854E-01 +2.422913E-01 +5.870510E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_mesh_3d/results_true.dat b/tests/test_filter_mesh_3d/results_true.dat index a67c77c034..239a9f01a6 100644 --- a/tests/test_filter_mesh_3d/results_true.dat +++ b/tests/test_filter_mesh_3d/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -753,12 +753,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.228098E-02 +1.042062E-03 0.000000E+00 0.000000E+00 -4.083602E-01 -1.667580E-01 -4.667828E-01 -2.178862E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -789,6 +787,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.222708E-01 +1.038585E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1261,14 +1261,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.009463E-01 +4.037943E-02 +1.741795E-01 +3.033850E-02 +4.431077E-01 +1.023945E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.287286E-01 -1.657106E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1295,14 +1299,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.269274E-02 -5.149605E-04 -9.624622E-02 -9.263335E-03 -1.387020E-01 -1.620196E-02 -4.935882E-01 -8.865346E-02 +1.699856E-01 +1.749182E-02 +1.012141E-01 +1.024430E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1329,14 +1329,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.467757E+00 -6.282919E-01 -3.159457E-01 -4.516223E-02 -2.050369E-01 -3.908542E-02 -2.424662E-01 -5.878987E-02 +2.427282E-01 +4.346756E-02 +8.576175E-02 +6.594648E-03 +7.478060E-03 +5.592138E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1581,6 +1579,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.645869E-02 +4.416757E-03 +3.041483E-01 +9.250621E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1655,8 +1657,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.855163E-02 -4.699326E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1687,10 +1687,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.206687E-02 -1.769622E-03 -2.760907E-02 -7.622607E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1777,8 +1773,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.993440E-02 -9.986884E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1809,10 +1803,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.032141E-03 -6.451529E-05 -1.897802E-01 -3.601652E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1843,8 +1833,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.758664E-02 -7.671419E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1855,6 +1843,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.931419E-01 +9.002841E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1875,12 +1865,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.797399E-03 -4.620463E-05 -1.681205E-01 -1.033597E-02 -2.455452E-01 -4.194938E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1891,6 +1875,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.775906E-01 +3.153842E-02 +8.691809E-01 +2.255229E-01 +4.595089E-02 +2.111485E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1907,12 +1897,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.983445E-01 -1.408489E-02 -3.095279E-01 -4.471018E-02 -1.669298E+00 -8.584140E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.073032E-01 +5.796376E-03 +6.104378E-01 +1.438907E-01 +1.357192E+00 +7.800106E-01 3.092946E-01 4.828943E-02 0.000000E+00 @@ -1943,14 +1943,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.234167E-01 -1.523167E-02 -4.629242E-02 -1.083563E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +5.051275E-01 +9.608655E-02 +4.049856E-01 +1.640133E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2005,6 +2001,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.816781E-02 +3.300694E-04 +3.102983E-01 +9.628505E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2115,16 +2115,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.728847E-01 -2.988911E-02 -3.848345E-01 -1.480976E-01 -5.985907E-02 -3.583109E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.419633E-02 +5.854622E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2149,8 +2145,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.914572E-03 -1.532387E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2163,12 +2157,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.098236E-02 +1.206123E-04 +5.047052E-02 +2.547273E-03 0.000000E+00 0.000000E+00 -8.127433E-03 -6.605517E-05 0.000000E+00 0.000000E+00 +1.065577E-02 +7.244766E-05 +2.076046E-02 +4.309969E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2185,30 +2185,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.026040E-02 -4.104838E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.065355E-02 -1.134982E-04 -2.799724E-03 -7.838457E-06 -0.000000E+00 -0.000000E+00 -1.799280E-01 -1.619126E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.209931E-01 +7.784762E-03 +1.059137E-01 +1.121770E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.883880E-01 +1.626283E-02 +1.476781E-01 +2.180883E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2231,10 +2225,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.464783E-03 +2.986386E-05 +4.827060E-01 +1.236578E-01 +2.938269E-02 +8.633425E-04 1.103939E-01 1.218681E-02 -1.828427E-01 -1.294521E-02 +1.066312E-01 +7.137023E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2265,10 +2265,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.028489E-01 -8.403390E-02 -3.358975E-01 -5.596699E-02 +6.448951E-03 +4.158897E-05 +1.154960E-01 +1.333932E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2353,10 +2353,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.843200E-01 -4.652895E-02 -7.784310E-01 -2.074140E-01 +1.230857E-01 +1.515010E-02 +7.524451E-02 +5.162294E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2387,10 +2387,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.580039E-01 -1.495118E-02 -1.106397E+00 -4.900888E-01 +5.738188E-03 +3.292680E-05 +1.158207E-02 +1.341443E-04 +3.108948E-02 +9.665557E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2419,14 +2421,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.670560E-01 +3.010896E-01 +2.777708E-01 +4.851013E-02 +3.865801E-02 +1.326182E-03 0.000000E+00 0.000000E+00 -6.311586E-01 -1.452469E-01 -8.935124E-01 -2.041594E-01 -9.086642E-02 -7.846733E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2453,8 +2455,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.240497E-01 -1.538832E-02 9.205825E-02 8.474722E-03 2.106671E-01 @@ -2487,12 +2487,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.706461E-01 -1.626955E-01 -9.690652E-01 -2.037373E-01 -1.260082E-01 -1.587806E-02 +2.518202E-01 +6.341342E-02 +3.500938E-01 +5.019217E-02 +1.285282E-01 +1.588441E-02 2.585446E-01 6.684532E-02 0.000000E+00 @@ -2523,8 +2523,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.960309E-02 -3.842813E-04 +3.653135E-01 +1.287514E-01 +2.216045E-03 +4.910856E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2543,10 +2545,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -9.261638E-02 -4.454613E-03 +5.022807E-01 +1.147015E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2577,12 +2577,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.905316E-02 -6.249402E-03 -6.679360E-01 -1.650894E-01 -7.539474E-02 -5.684366E-03 +0.000000E+00 +0.000000E+00 +1.172250E+00 +3.690965E-01 +1.605816E-01 +1.294116E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2613,10 +2613,10 @@ tally 1: 0.000000E+00 5.892971E-02 3.472710E-03 -1.107212E+00 -3.413570E-01 -7.306165E-02 -5.338004E-03 +1.338644E+00 +4.668912E-01 +1.673747E-01 +1.423295E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2627,8 +2627,8 @@ tally 1: 0.000000E+00 1.452260E-01 2.109060E-02 -6.184555E-01 -1.333723E-01 +5.921989E-01 +1.326829E-01 3.816328E-02 1.456436E-03 9.153520E-02 @@ -2663,8 +2663,8 @@ tally 1: 6.125553E-04 7.610286E-01 2.001560E-01 -4.985084E-01 -1.084317E-01 +4.516947E-01 +1.062402E-01 8.917764E-02 4.968510E-03 0.000000E+00 @@ -2693,24 +2693,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.736533E-01 -3.015548E-02 -1.425017E+00 -8.058899E-01 -9.850395E-01 -5.477477E-01 0.000000E+00 0.000000E+00 +1.101299E+00 +7.922298E-01 +4.529165E-02 +2.051333E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +5.702227E-01 +1.629185E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.406884E-01 -5.793092E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2727,28 +2725,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.047508E-02 -4.966737E-03 -7.482142E-02 -5.598244E-03 -1.212516E-02 -1.470196E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.428465E-01 -5.897443E-02 0.000000E+00 0.000000E+00 -2.031988E-01 -4.128976E-02 -1.238475E-02 -1.533819E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.749741E-01 +3.841679E-02 +1.876567E-01 +2.180115E-02 +4.802267E-02 +2.306177E-03 +2.219757E-01 +2.083367E-02 +3.469381E-02 +1.203661E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2763,26 +2759,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.198784E-01 -1.437083E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.380516E-01 -4.157334E-02 -7.271496E-02 -5.287466E-03 -1.248706E-01 -9.290399E-03 -6.329934E-02 -4.006806E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +9.220451E-03 +8.501673E-05 +2.421186E-01 +2.296140E-02 +5.301518E-01 +1.266721E-01 +1.676517E+00 +1.032348E+00 +8.127651E-02 +4.329985E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2805,12 +2801,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.932483E-01 -3.411782E-02 -7.125726E-02 -5.077597E-03 -1.721584E-01 -1.580114E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.516265E-01 +6.305270E-02 +3.999873E-02 +1.599899E-03 +5.487047E-01 +1.292105E-01 3.228887E-01 1.042571E-01 0.000000E+00 @@ -2839,12 +2839,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.935296E-02 -3.745370E-04 -4.914514E-02 -2.415245E-03 -3.076980E-01 -3.868177E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.407100E-01 +4.223910E-02 2.022942E-01 4.092294E-02 0.000000E+00 @@ -2875,10 +2875,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.698116E-02 -5.106926E-03 -6.397704E-01 -2.487693E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2901,10 +2897,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.219865E-02 -1.488072E-04 -8.616309E-03 -7.424078E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2931,12 +2923,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.457861E-01 -1.063058E-02 -7.360906E-01 -1.562063E-01 -3.940865E-02 -1.553041E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2947,6 +2933,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.553587E-01 +1.738170E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2965,12 +2953,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.452849E-02 -4.309152E-03 -3.655566E-01 -3.753615E-02 -8.473380E-02 -7.179817E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2981,6 +2963,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +6.145563E-02 +3.776795E-03 +2.005189E-01 +2.429212E-02 +5.673596E-01 +1.649938E-01 +4.875014E-01 +2.376576E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 7.157679E-01 3.770273E-01 1.588325E-02 @@ -3031,8 +3031,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.350273E-02 -1.823238E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3065,8 +3063,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.380680E-01 -5.667635E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3121,10 +3121,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.227568E-02 -6.769287E-03 -2.170015E-02 -4.708966E-04 +0.000000E+00 +0.000000E+00 +9.767592E-02 +5.284927E-03 1.342835E-01 1.803205E-02 0.000000E+00 @@ -3155,12 +3155,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.298723E-01 -8.434738E-03 -1.192701E+00 -5.059301E-01 -5.555691E-02 -3.086570E-03 +6.575074E-02 +4.323159E-03 +1.123042E+00 +4.745625E-01 +2.147144E-01 +2.841768E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3169,10 +3169,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.271892E-02 -5.288041E-03 -6.134910E-01 -2.517865E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.138141E-01 +1.295364E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3189,12 +3191,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -2.698309E-01 -5.659690E-02 -7.539545E-03 -5.684475E-05 +2.478967E-01 +2.397512E-02 +8.154628E-02 +5.533841E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3203,12 +3203,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.063682E-01 -2.953689E-02 -7.099357E-01 -1.432662E-01 -2.190760E-02 -4.799429E-04 +1.673829E-01 +2.801704E-02 +6.238670E-01 +1.323614E-01 +1.087831E-01 +8.027300E-03 3.528173E-02 1.244801E-03 0.000000E+00 @@ -3221,8 +3221,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.669518E-02 -3.214344E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3239,10 +3239,10 @@ tally 1: 0.000000E+00 3.125593E-03 9.769332E-06 -5.487602E-01 -2.355803E-01 -7.840909E-02 -6.147986E-03 +5.982046E-01 +2.380250E-01 +1.595969E-01 +1.273945E-02 7.500945E-02 5.626417E-03 0.000000E+00 @@ -3273,22 +3273,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.849728E-02 -2.351986E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.004455E-02 +4.017842E-04 +1.241994E+00 +5.276343E-01 +3.956269E-01 +6.857794E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -6.355630E-02 -4.039404E-03 -1.399218E-02 -1.957812E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3313,18 +3313,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.567716E-02 -2.424343E-03 -3.815100E-01 -7.061468E-02 -1.998464E-01 -3.993860E-02 -2.952749E-01 -4.970731E-02 -3.559995E-01 -4.240327E-02 -4.275883E-02 -1.828318E-03 +2.517820E-01 +4.088147E-02 +5.984204E-01 +1.119676E-01 +1.600304E+00 +1.060307E+00 +6.251595E-01 +1.631053E-01 +5.084364E-01 +8.750385E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3349,18 +3347,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.056649E-01 -2.528092E-02 -2.212242E-01 -4.870093E-02 -8.268043E-01 -2.499121E-01 -5.858178E-01 -1.482815E-01 -4.753061E-02 -2.259158E-03 0.000000E+00 0.000000E+00 +1.482851E-01 +2.198847E-02 +8.661057E-02 +3.979426E-03 +5.328694E-01 +1.185445E-01 +9.819716E-02 +6.261752E-03 +1.971175E-01 +3.885531E-02 +5.055466E-01 +1.332461E-01 +1.737497E-01 +3.018896E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3381,22 +3383,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.448612E-01 +3.179981E-02 +1.336292E+00 +6.509631E-01 +1.788953E+00 +9.402141E-01 +6.484030E-01 +1.952075E-01 +1.239995E-01 +9.457065E-03 +5.379761E-01 +9.948097E-02 +3.422476E-01 +3.688467E-02 +1.310833E-01 +9.116867E-03 0.000000E+00 0.000000E+00 -1.275494E-01 -1.626884E-02 -8.930936E-01 -4.412573E-01 -1.069465E+00 -3.083849E-01 -5.312952E-01 -1.686403E-01 -3.756270E-01 -7.982176E-02 -6.071797E-01 -1.008227E-01 -1.945731E-01 -2.288397E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3415,24 +3419,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -2.147490E-02 -4.611712E-04 -3.020948E-01 -4.980152E-02 -6.199369E-01 -1.339903E-01 -6.953972E-01 -2.667255E-01 -5.032688E-01 -1.089400E-01 -8.876085E-02 -2.663780E-03 +1.452794E-01 +7.962998E-03 +4.950124E-01 +1.019817E-01 +5.154252E-01 +1.349222E-01 +2.369650E-01 +5.615241E-02 +3.458235E-02 +1.195939E-03 1.129905E-02 1.276685E-04 -3.194782E-02 -1.020663E-03 +2.144713E-01 +2.715780E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3453,18 +3453,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.936255E-03 -2.436661E-05 -1.854356E-01 -3.062993E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3475,6 +3463,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.439196E-02 +4.146324E-03 +9.319271E-01 +3.289332E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3483,6 +3475,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.887911E-02 +4.077886E-03 +1.394014E-01 +1.214028E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3513,6 +3509,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.093347E-01 +4.640925E-02 +5.656636E-01 +1.123158E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3735,10 +3735,10 @@ tally 1: 0.000000E+00 1.203590E-02 1.448628E-04 -9.089783E-01 -3.025426E-01 -4.101062E-02 -1.363081E-03 +8.166865E-01 +2.864876E-01 +2.182247E-01 +3.276791E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3769,10 +3769,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.394140E-02 -5.731908E-04 -2.225881E-01 -4.954545E-02 +3.880416E-02 +7.940924E-04 +2.944035E-01 +5.470290E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3781,8 +3783,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.901226E-02 -3.614661E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3797,10 +3797,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.232218E-03 -2.737611E-05 -2.699331E-01 -7.286389E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3833,8 +3833,8 @@ tally 1: 0.000000E+00 3.625873E-02 1.314696E-03 -9.527085E-02 -9.076535E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3859,14 +3859,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.282000E-01 +1.643523E-02 +8.992357E-04 +8.086249E-07 +4.549792E-02 +2.070061E-03 +2.792616E-01 +7.798705E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3891,16 +3891,16 @@ tally 1: 2.325049E-04 0.000000E+00 0.000000E+00 -5.591708E-01 -3.126720E-01 -3.457017E-02 -1.195097E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.186688E-01 +4.781605E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3929,18 +3929,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.005099E-01 -4.873543E-02 -2.482142E-01 -4.941861E-02 -1.464043E-02 -2.143420E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.799587E-02 +7.837689E-04 0.000000E+00 0.000000E+00 +2.165781E-01 +4.136640E-02 +1.206583E-01 +1.455843E-02 +3.350979E-02 +1.122906E-03 +1.254721E-01 +1.574324E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3957,6 +3961,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.255610E-02 +1.576557E-04 +2.059029E-01 +2.931063E-02 +9.625207E-02 +9.264462E-03 +4.926052E-01 +1.231087E-01 +3.607423E-01 +6.495313E-02 +2.101048E-01 +2.385810E-02 +7.843494E-01 +1.955825E-01 +9.077784E-01 +3.297447E-01 +3.922359E-03 +1.538490E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3965,18 +3987,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.139114E-01 -1.297580E-02 -1.219324E-01 -1.125290E-02 -6.096339E-02 -3.716535E-03 -2.370045E-02 -5.617113E-04 -2.338106E-01 -2.733856E-02 -6.042735E-02 -3.651465E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3987,8 +3997,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.913074E-02 +1.799353E-03 +1.249107E-02 +1.560268E-04 0.000000E+00 0.000000E+00 +1.115404E+00 +4.366528E-01 +3.732357E-01 +4.158215E-02 +3.846227E-01 +8.126419E-02 +6.157885E-01 +1.590298E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3997,22 +4019,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.026371E-02 -4.106181E-04 -1.407747E-01 -1.661272E-02 -2.901913E-01 -8.421099E-02 -1.716410E+00 -1.502067E+00 -2.139592E-01 -1.215205E-02 -3.926381E-01 -8.132843E-02 -2.213252E-01 -2.664541E-02 -1.620099E-01 -2.624722E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4031,22 +4037,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.163882E-01 -1.978213E-01 -4.192042E-02 -1.757322E-03 -0.000000E+00 -0.000000E+00 -8.855834E-03 -7.842579E-05 -0.000000E+00 -0.000000E+00 +5.663121E-01 +1.953137E-01 +4.644811E-01 +1.590726E-01 +5.000400E-02 +1.273713E-03 +2.811483E-02 +7.904436E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4055,6 +4053,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.950896E-02 +2.451137E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4339,10 +4339,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.248694E-01 -4.178173E-02 -2.015109E-01 -2.180554E-02 +0.000000E+00 +0.000000E+00 +1.281618E-01 +1.642545E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4373,12 +4373,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.775166E-01 -3.538689E-01 -1.077083E+00 -2.861243E-01 -3.389587E-01 -8.732863E-02 +1.429077E-02 +2.042262E-04 +5.105813E-01 +9.939542E-02 +1.956841E-01 +3.829226E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4407,14 +4407,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.278622E-01 -9.618710E-03 -4.878786E-01 -1.035002E-01 -2.623630E-01 -2.385512E-02 -5.373920E-02 -2.887901E-03 +2.524256E-01 +3.390159E-02 +5.341258E-01 +7.612387E-02 +1.129256E-01 +5.367542E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4439,16 +4439,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -7.796193E-03 -6.078062E-05 -2.370024E-01 -5.617015E-02 -2.378547E-01 -5.657486E-02 -0.000000E+00 -0.000000E+00 +1.789538E-02 +3.202447E-04 +1.070161E-01 +1.145246E-02 +2.004171E-01 +4.016700E-02 +9.277615E-02 +4.350522E-03 +3.796585E-03 +1.441406E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4475,10 +4475,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.812701E-02 +7.911289E-04 0.000000E+00 0.000000E+00 -4.102160E-02 -1.682772E-03 +7.255598E-01 +2.637695E-01 +4.236781E-01 +1.206021E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4507,10 +4511,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.088786E-02 -5.025089E-03 0.000000E+00 0.000000E+00 +3.455666E-01 +1.088929E-01 +1.077941E-01 +5.813092E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4535,8 +4541,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.759532E-03 +7.672939E-05 +3.873698E-01 +1.500554E-01 +3.320720E-02 +5.664804E-04 +9.751133E-01 +4.762440E-01 +3.549373E-01 +1.259805E-01 0.000000E+00 0.000000E+00 +4.558589E-03 +2.078073E-05 +1.147837E-01 +1.317530E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4551,12 +4571,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.601108E-02 -1.296798E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.491942E-01 +1.942842E-02 +1.215608E-02 +7.465030E-05 +9.749153E-01 +3.525441E-01 +1.238276E+00 +4.724746E-01 +7.559328E-01 +1.539006E-01 +7.550630E-01 +2.671451E-01 +4.016529E-01 +1.049033E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4577,24 +4609,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.772849E-01 -3.142995E-02 -1.629085E+00 -7.553358E-01 -5.130574E-01 -1.026482E-01 -5.456703E-01 -1.139540E-01 -5.551969E-01 -1.452833E-01 -2.630569E-01 -2.654789E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.915923E-01 +1.106962E-02 +1.039274E+00 +3.820648E-01 +6.748249E-01 +1.513006E-01 +5.553735E-02 +3.084397E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4611,18 +4639,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.711181E-02 -7.588468E-03 -2.593229E-01 -4.929782E-02 -2.365670E-01 -1.635697E-02 -1.481640E+00 -5.785514E-01 -1.000401E+00 -2.814448E-01 -6.430985E-01 -1.924484E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4817,6 +4833,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.061692E-01 +1.127190E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4849,6 +4867,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.912282E-01 +3.656822E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4899,6 +4919,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.289827E-01 +1.075283E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4919,10 +4941,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.624881E-02 -2.640238E-04 -1.075983E-01 -1.157740E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4935,6 +4953,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.320797E+00 +4.972727E-01 +4.301105E-01 +6.331514E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4949,16 +4971,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.629487E-02 -3.169112E-03 -8.055202E-02 -6.488629E-03 -1.251664E+00 -7.810326E-01 -1.181564E+00 -3.437055E-01 -1.053167E-02 -1.109161E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4971,6 +4983,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.915487E-02 +2.416202E-03 +9.120705E-02 +8.318727E-03 +1.320105E+00 +4.411682E-01 +6.959590E-01 +2.389648E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4983,26 +5003,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.454179E-02 -2.652959E-03 -5.029692E-01 -1.783517E-01 -1.339070E+00 -4.343746E-01 -8.199937E-01 -2.745378E-01 -1.173457E-01 -1.377002E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.736827E-02 -2.243753E-03 5.662623E-02 3.206529E-03 0.000000E+00 @@ -5017,16 +5017,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.166586E-02 +1.360923E-04 +1.891160E-02 +3.576487E-04 +1.256901E+00 +4.792247E-01 +1.364915E-01 +1.696517E-02 0.000000E+00 0.000000E+00 -1.927614E-01 -2.918695E-02 -7.330554E-01 -1.766129E-01 -1.008246E-01 -7.669486E-03 -1.448854E-02 -2.099179E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5055,12 +5055,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.565334E-01 -2.186541E-01 -5.729858E-02 -3.283127E-03 -9.691043E-02 -9.391631E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5123,14 +5123,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.925951E-02 +4.796880E-03 +1.765581E-01 +2.014257E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -7.494206E-02 -5.616313E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5155,18 +5157,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.724677E-02 -3.277192E-03 -1.383438E-01 -1.452928E-02 -2.848872E-02 -8.116069E-04 -3.524549E-01 -5.552654E-02 -4.295071E-01 -9.355140E-02 -1.311425E-03 -1.719836E-06 +1.007236E-01 +1.014525E-02 +3.069376E-01 +6.982061E-02 +1.339942E+00 +5.632235E-01 +8.027545E-01 +2.263816E-01 +1.881835E-01 +3.541303E-02 +2.824222E-02 +7.976228E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5189,26 +5191,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.834417E-02 -2.211153E-03 -1.613421E-01 -2.257097E-02 -1.472879E-01 -2.169372E-02 -4.810374E-01 -8.988575E-02 -6.467051E-01 -1.822459E-01 -1.547275E-01 -2.394060E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 +6.475515E-01 +1.949499E-01 +8.916929E-01 +2.187649E-01 +9.737449E-01 +4.547148E-01 +1.905118E-01 +3.629474E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5419,6 +5411,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.851330E-02 +8.130086E-04 +1.696747E-01 +2.878950E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5449,6 +5445,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.753509E-02 +7.581810E-04 +2.514105E-01 +5.075004E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5495,12 +5495,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.687121E-01 -2.627261E-02 -1.004106E-01 -1.008228E-02 -3.964673E-02 -1.571863E-03 +0.000000E+00 +0.000000E+00 +6.990313E-02 +4.886448E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5527,14 +5527,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.594872E-01 -9.743264E-02 -8.625384E-01 -2.783049E-01 -3.514218E-03 -1.234973E-05 -1.894941E-01 -2.742554E-02 +6.620581E-01 +1.938858E-01 +4.607570E-02 +1.247203E-03 +0.000000E+00 +0.000000E+00 +2.593018E-02 +6.723742E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5545,8 +5545,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.861976E-01 -3.466955E-02 +3.904410E-02 +1.524442E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5561,12 +5561,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.293501E-01 -5.455683E-02 -2.937497E-01 -8.628891E-02 -6.693709E-01 -1.892115E-01 +3.389223E-01 +5.464846E-02 +1.061647E-01 +1.127094E-02 +1.313508E+00 +4.346493E-01 4.161910E-02 1.732150E-03 0.000000E+00 @@ -5579,8 +5579,8 @@ tally 1: 0.000000E+00 4.016283E-01 1.613053E-01 -4.606785E-01 -1.064675E-01 +5.599819E-01 +9.812234E-02 5.139185E-01 1.322866E-01 2.373992E-01 @@ -5597,10 +5597,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.911517E-01 -3.262245E-02 -3.678584E-01 -7.759535E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5631,8 +5631,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.179923E-02 -2.683160E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5735,6 +5735,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.532915E-01 +2.349830E-02 +0.000000E+00 +0.000000E+00 +2.637807E-03 +6.958026E-06 +9.521605E-03 +9.066095E-05 +7.905417E-02 +6.249562E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5763,20 +5773,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.772980E-01 -3.143459E-02 -0.000000E+00 -0.000000E+00 +5.147382E-02 +2.649554E-03 +1.719918E-01 +1.490049E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -5989,12 +5989,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.231433E-01 -5.413470E-02 -3.993293E-01 -6.467221E-02 -1.519610E-01 -1.155574E-02 +1.305564E-01 +1.704497E-02 +3.518664E-01 +6.212556E-02 +7.817833E-02 +6.111852E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6025,10 +6025,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.649249E-01 -3.073604E-02 -8.553717E-01 -3.211418E-01 +4.740424E-01 +8.028915E-02 +8.000570E-01 +3.176809E-01 5.666391E-01 2.831913E-01 1.643713E-02 @@ -6073,10 +6073,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.186326E-01 -1.190957E-02 -1.107282E-01 -1.226074E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6095,6 +6091,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.873816E-02 +9.749225E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 6.179053E-03 @@ -6105,12 +6105,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.475983E-02 -2.178526E-04 -1.747711E+00 -8.535011E-01 -7.461108E-02 -5.566814E-03 +1.154173E-01 +1.332115E-02 +5.192203E-01 +1.359491E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6123,28 +6121,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.833423E-01 -3.201970E-02 -1.016493E-02 -1.033258E-04 -3.086254E-01 -9.524964E-02 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.668929E-02 -7.417426E-04 -1.031629E-01 -8.133494E-03 -2.133233E-01 -4.550684E-02 +3.643669E-01 +3.773661E-02 +1.333650E-01 +1.778623E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6157,28 +6139,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.950700E-01 -3.542385E-02 -1.821781E-01 -3.288596E-02 -2.994706E-01 -3.126060E-02 -3.853993E-01 -1.485326E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.946618E-02 -3.536227E-03 -6.995394E-02 -4.893554E-03 -3.103240E-01 -5.643704E-02 +3.057922E-02 +4.821714E-04 +2.611439E-02 +4.539126E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6189,16 +6153,52 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.934409E-02 -3.268161E-03 -2.618772E-02 -6.857965E-04 0.000000E+00 0.000000E+00 -1.910915E-01 -1.213214E-02 -5.264194E-01 -1.438040E-01 +0.000000E+00 +0.000000E+00 +4.328371E-01 +6.083581E-02 +3.822069E-02 +1.398374E-03 +1.903328E-01 +2.231214E-02 +3.952764E-01 +1.486302E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.256222E-02 +1.578095E-04 +9.794148E-02 +9.592534E-03 +1.849303E-01 +1.553794E-02 +7.480357E-01 +1.929178E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6529,8 +6529,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.886952E-02 -3.465621E-03 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6653,8 +6653,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.911625E-02 -6.259380E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6669,14 +6667,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.747648E-02 -1.404486E-03 -9.038474E-02 -8.169402E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +6.086518E-02 +3.704570E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6685,10 +6681,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.907522E-01 -3.638640E-02 -3.376837E-02 -1.140303E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6703,10 +6695,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.260430E-02 -1.063040E-03 -4.728569E-02 -2.235937E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6715,14 +6703,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.249148E-02 +1.805526E-03 +1.045383E+00 +4.214718E-01 +3.878770E-02 +1.504486E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.942084E-02 -7.996086E-03 -3.382348E-02 -1.144027E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6737,10 +6727,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.663872E-01 -5.237415E-01 -1.495861E+00 -7.117933E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.784801E-02 +7.755114E-04 +6.779315E-01 +3.352682E-01 3.026790E-01 9.161460E-02 0.000000E+00 @@ -6767,16 +6767,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.127783E-01 -2.689445E-01 -6.677764E-01 -2.034903E-01 +1.879990E-01 +2.203070E-02 0.000000E+00 0.000000E+00 -1.272042E+00 -5.287947E-01 -4.856872E-02 -2.358920E-03 +0.000000E+00 +0.000000E+00 +9.811002E-01 +4.685901E-01 +1.404927E-01 +1.080893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6801,12 +6801,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.244965E-01 -1.453503E-01 -7.596171E-01 -1.897008E-01 -1.137881E-01 -1.294772E-02 +7.572692E-01 +2.087347E-01 +2.362405E-01 +4.910426E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 1.965530E-01 @@ -6835,12 +6835,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -3.595460E-02 -1.292733E-03 -1.651469E-02 -2.727349E-04 +1.751268E-03 +3.066940E-06 +1.553462E-01 +2.413243E-02 +1.672350E-01 +2.796753E-02 0.000000E+00 0.000000E+00 1.836178E-02 @@ -6941,6 +6941,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.696487E-02 +1.366401E-03 +2.858087E-01 +8.168661E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -6969,14 +6973,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.052881E-01 -1.108559E-02 -0.000000E+00 -0.000000E+00 +1.258698E-01 +1.150919E-02 +6.798857E-01 +1.661025E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7007,12 +7007,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.003097E-01 -2.774596E-01 -5.697479E-01 -1.238519E-01 -1.088816E-02 -1.185520E-04 +1.008727E+00 +3.651038E-01 +9.120679E-01 +2.558101E-01 +8.721740E-03 +7.606874E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7039,16 +7039,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.182615E-02 -2.685950E-03 -2.603394E-01 -5.501423E-02 -2.189565E-01 -1.689961E-02 -1.037124E-01 -1.075626E-02 0.000000E+00 0.000000E+00 +2.739345E-02 +7.504010E-04 +1.627060E-02 +2.647323E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7107,12 +7103,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.145166E-01 -1.639307E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.309730E-01 +2.570742E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7141,8 +7137,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.237360E+00 -3.492227E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.115905E+00 +4.082126E-01 2.502204E-02 6.261023E-04 0.000000E+00 @@ -7247,12 +7247,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.753553E-02 -9.513180E-03 -1.448897E-02 -2.099304E-04 0.000000E+00 0.000000E+00 +2.207099E-01 +4.871286E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7285,6 +7283,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.075694E-02 +8.236821E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7315,10 +7315,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.767451E-02 +3.123882E-04 +8.696348E-02 +7.562648E-03 0.000000E+00 0.000000E+00 -8.072240E-01 -2.272369E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7345,16 +7347,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.679628E-02 -1.915958E-04 -2.060666E-01 -4.246344E-02 -9.954401E-04 -9.909010E-07 -7.940105E-02 -6.304526E-03 0.000000E+00 0.000000E+00 +1.690390E-01 +2.753878E-02 +1.145975E-01 +7.543314E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7379,14 +7377,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.430716E-01 -3.335909E-02 -4.349688E-01 -6.259047E-02 -4.848533E-02 -1.782050E-03 0.000000E+00 0.000000E+00 +2.712297E-01 +3.081804E-02 +1.728614E-01 +2.076746E-02 +6.826625E-03 +4.660281E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7415,10 +7413,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.242016E-02 -5.026638E-04 -2.677921E-01 -2.943321E-02 +2.649622E-02 +7.020499E-04 +4.161446E-01 +8.806248E-02 +6.348647E-01 +9.989011E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7451,6 +7451,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.204982E-02 +1.451982E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7551,12 +7553,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.608891E-02 -4.586038E-03 +2.282300E-01 +4.986445E-02 +2.206365E-02 +4.868048E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7587,10 +7587,10 @@ tally 1: 0.000000E+00 1.875562E-01 3.517735E-02 -5.878488E-01 -1.352380E-01 -5.442859E-01 -1.595781E-01 +7.738485E-01 +2.045432E-01 +4.058292E-01 +8.243188E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7623,16 +7623,18 @@ tally 1: 0.000000E+00 4.994213E-01 2.494217E-01 +2.744213E-02 +7.530707E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.949405E-02 +7.018464E-04 0.000000E+00 0.000000E+00 -2.758048E-01 -6.072497E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7659,14 +7661,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.459022E-03 +7.155505E-05 +3.090219E-01 +9.549453E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.606443E-01 -6.793546E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7681,12 +7685,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.226097E-01 +1.395661E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.686503E-01 -6.346661E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7715,14 +7719,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.316493E-01 +1.591047E-02 +6.576990E-01 +1.877309E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.533157E-01 -1.071208E-02 -5.401851E-01 -1.739213E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7749,14 +7753,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.546941E-01 +7.107193E-02 +3.321871E-01 +6.515778E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.221279E+00 -4.624743E-01 -3.697846E-01 -6.689364E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7787,10 +7791,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.040339E-01 -4.162983E-02 -3.778476E-02 -1.427688E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7861,8 +7861,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.946272E-02 -3.535814E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7895,8 +7893,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.120645E-02 -9.738427E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7931,6 +7927,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +8.249399E-02 +4.667888E-03 +1.814462E-01 +3.292273E-02 7.515014E-02 5.647544E-03 0.000000E+00 @@ -7957,14 +7957,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.638111E-01 -6.959629E-02 +0.000000E+00 +0.000000E+00 3.109046E-01 8.622176E-02 -2.304832E-01 -3.175419E-02 -6.218789E-02 -3.867333E-03 +2.380422E-01 +3.181133E-02 +1.087532E-01 +6.035666E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -7995,8 +7995,8 @@ tally 1: 0.000000E+00 5.246408E-03 2.752480E-05 -1.779567E-01 -2.094888E-02 +3.760855E-02 +1.251291E-03 5.951856E-02 3.037461E-03 0.000000E+00 @@ -8141,6 +8141,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.395650E-01 +1.947839E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8163,18 +8165,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.822292E-01 +4.829456E-02 +6.080756E-02 +3.418907E-03 0.000000E+00 0.000000E+00 -7.333695E-02 -4.658577E-03 -2.790184E-02 -6.568068E-04 -0.000000E+00 -0.000000E+00 -1.525932E-01 -2.328469E-02 +1.804108E-01 +2.405851E-02 5.413665E-02 2.930777E-03 +4.041026E-01 +8.374291E-02 +5.886833E-02 +3.465481E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8197,20 +8201,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +7.093664E-02 +5.032006E-03 5.703113E-02 3.252549E-03 -8.140441E-01 -2.724079E-01 -5.579561E-01 -2.869147E-01 -2.207115E-01 -4.871356E-02 +7.402747E-01 +2.678271E-01 +2.389658E-02 +5.209213E-04 +5.348373E-01 +8.455667E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8239,10 +8239,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.039206E-01 -1.196352E-01 -3.885001E-01 -7.594576E-02 +5.453284E-01 +1.497004E-01 +1.851055E-01 +1.721223E-02 +1.038418E-01 +1.078313E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8261,6 +8263,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.010211E-02 +3.612264E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8293,6 +8297,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.319919E-02 +3.629541E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8325,14 +8331,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.137844E-02 -5.984482E-03 +1.292774E-01 +8.674372E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8747,14 +8747,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.235904E-01 -1.794288E-01 -2.296533E-01 -2.653997E-02 -1.867564E-01 -3.487796E-02 0.000000E+00 0.000000E+00 +4.601224E-01 +1.283387E-01 +4.851011E-01 +1.238875E-01 +1.351214E-02 +1.825779E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8781,12 +8781,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.285152E-02 -5.700776E-03 -1.646014E+00 -6.255979E-01 -9.809995E-01 -3.058040E-01 +7.746478E-03 +6.000792E-05 +1.551243E+00 +5.797918E-01 +1.974875E-01 +1.837196E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8817,10 +8817,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.189281E-01 -4.001687E-02 -1.431247E-02 -2.048469E-04 +2.541705E-01 +4.325743E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -8851,8 +8853,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.579949E-02 -9.177542E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -9359,12 +9359,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.668786E-02 +2.784846E-04 +2.256035E-01 +5.089693E-02 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 -2.836882E-01 -8.047901E-02 -5.295973E-02 -2.804733E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -9395,8 +9397,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.405305E-01 -5.483854E-01 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_universe/results_true.dat b/tests/test_filter_universe/results_true.dat index c63da0083d..856d97d593 100644 --- a/tests/test_filter_universe/results_true.dat +++ b/tests/test_filter_universe/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -6.369043E+01 -8.385422E+02 -7.330762E+00 -1.137874E+01 -5.011385E+01 -5.251276E+02 -5.132453E+00 -5.801019E+00 +5.803437E+01 +7.324822E+02 +7.168085E+00 +1.101286E+01 +5.815302E+01 +7.373019E+02 +5.778029E+00 +7.558661E+00 diff --git a/tests/test_infinite_cell/results_true.dat b/tests/test_infinite_cell/results_true.dat index 45eaa4f917..0b8d929518 100644 --- a/tests/test_infinite_cell/results_true.dat +++ b/tests/test_infinite_cell/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.998895E-02 2.846817E-04 +9.788797E-02 1.378250E-03 diff --git a/tests/test_lattice_mixed/results_true.dat b/tests/test_lattice_mixed/results_true.dat index d23feb91f0..7cea76ba00 100644 --- a/tests/test_lattice_mixed/results_true.dat +++ b/tests/test_lattice_mixed/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.605085E-01 8.180822E-03 +9.922449E-01 1.281824E-02 diff --git a/tests/test_lattice_multiple/results_true.dat b/tests/test_lattice_multiple/results_true.dat index f2e3d93c93..6caffdd953 100644 --- a/tests/test_lattice_multiple/results_true.dat +++ b/tests/test_lattice_multiple/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index 191122f13e..ab1c43254f 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -1,111 +1,111 @@ k-combined: 0.000000E+00 0.000000E+00 tally 1: -2.254760E+01 -1.695439E+02 -1.017400E+01 -3.450623E+01 -8.690000E+00 -2.517771E+01 -8.696000E+00 -2.521248E+01 -5.224881E-01 -9.127522E-02 -8.690000E+00 -2.517771E+01 -9.665236E-01 -3.121401E-01 -5.224881E-01 -9.127522E-02 -5.199964E-01 -9.041516E-02 -8.696000E+00 -2.521248E+01 -9.666447E-01 -3.122176E-01 -5.199964E-01 -9.041516E-02 -9.262308E+00 -2.859762E+01 -8.684000E+00 -2.514296E+01 -1.484000E+00 -7.346160E-01 -1.804688E+00 -1.089100E+00 -1.334833E+02 -5.960573E+03 -2.254760E+01 -1.695439E+02 --6.230152E-02 -1.023784E-02 --2.696818E-01 -8.525477E-02 --1.670294E-01 -4.366614E-02 -1.331953E-02 -8.064039E-05 --2.490295E-01 -2.511425E-02 -8.289978E-02 -2.753446E-03 --1.390686E-01 -1.592673E-02 -1.600203E-01 -1.344513E-02 -1.017400E+01 -3.450623E+01 --6.564301E-02 -2.564587E-03 --1.245391E-01 -1.143479E-02 --5.550309E-02 -9.334547E-03 -4.671277E-02 -1.795787E-03 --9.901000E-02 -4.609654E-03 -2.619012E-02 -3.011793E-04 --7.090362E-02 -2.450750E-03 -4.059073E-02 -8.841300E-04 -8.690000E+00 -2.517771E+01 --2.685052E-02 -2.769798E-04 -4.047919E-03 -3.384947E-03 --1.325869E-01 -8.610169E-03 --1.594962E-02 -5.528670E-04 --1.320550E-02 -1.856248E-04 -1.185337E-02 -3.428536E-04 -2.622196E-02 -3.774884E-04 -2.938463E-02 -6.660370E-04 -8.696000E+00 -2.521248E+01 --2.634867E-02 -2.718345E-04 -4.042613E-03 -3.367272E-03 --1.328903E-01 -8.576852E-03 --1.632965E-02 -5.577169E-04 --1.408565E-02 -1.815109E-04 -1.202519E-02 -3.685250E-04 -2.634054E-02 -3.730853E-04 -2.941341E-02 -6.479457E-04 +2.247257E+01 +1.683779E+02 1.014000E+01 -3.427460E+01 +3.427342E+01 +8.628000E+00 +2.481430E+01 +8.628000E+00 +2.481430E+01 +5.102293E-01 +8.710841E-02 +8.628000E+00 +2.481430E+01 +9.329009E-01 +2.902534E-01 +5.102293E-01 +8.710841E-02 +5.102293E-01 +8.710841E-02 +8.628000E+00 +2.481430E+01 +9.329009E-01 +2.902534E-01 +5.102293E-01 +8.710841E-02 +9.212024E+00 +2.829472E+01 +8.628000E+00 +2.481430E+01 +1.512000E+00 +7.620560E-01 +1.816851E+00 +1.102658E+00 +1.338067E+02 +5.986137E+03 +2.247257E+01 +1.683779E+02 +-1.512960E-01 +2.623972E-02 +-3.775020E-01 +1.055377E-01 +-1.916133E-01 +4.680798E-02 +2.754367E-02 +3.320008E-04 +-2.028374E-02 +1.319357E-02 +8.974271E-03 +1.681081E-03 +-1.658978E-01 +1.520448E-02 +2.878360E-01 +5.645480E-02 +1.014000E+01 +3.427342E+01 +-4.798897E-02 +1.551226E-03 +-1.818770E-01 +1.492633E-02 +-6.340651E-02 +9.011305E-03 +3.395308E-02 +4.612818E-04 +-2.640250E-02 +6.434787E-04 +-8.242639E-03 +9.516540E-04 +-8.378601E-02 +2.645988E-03 +9.567484E-02 +7.262477E-03 +8.628000E+00 +2.481430E+01 +-4.712248E-02 +1.140942E-03 +-6.431930E-02 +4.290580E-03 +-9.251642E-02 +8.134201E-03 +1.020119E-04 +1.154184E-04 +-2.994164E-02 +3.079076E-04 +2.128844E-02 +2.046549E-04 +1.637972E-02 +1.459209E-04 +4.629047E-02 +7.823267E-04 +8.628000E+00 +2.481430E+01 +-4.712248E-02 +1.140942E-03 +-6.431930E-02 +4.290580E-03 +-9.251642E-02 +8.134201E-03 +1.020119E-04 +1.154184E-04 +-2.994164E-02 +3.079076E-04 +2.128844E-02 +2.046549E-04 +1.637972E-02 +1.459209E-04 +4.629047E-02 +7.823267E-04 +1.014000E+01 +3.427342E+01 diff --git a/tests/test_natural_element/results_true.dat b/tests/test_natural_element/results_true.dat index 4b132ea37d..1c8668e128 100644 --- a/tests/test_natural_element/results_true.dat +++ b/tests/test_natural_element/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.053229E+00 9.241274E-02 +1.013112E+00 2.551515E-02 diff --git a/tests/test_output/results_true.dat b/tests/test_output/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_output/results_true.dat +++ b/tests/test_output/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index a93cbb27b2..bbc23fb6ef 100644 --- a/tests/test_particle_restart_eigval/results_true.dat +++ b/tests/test_particle_restart_eigval/results_true.dat @@ -1,16 +1,16 @@ current batch: -1.200000E+01 +9.000000E+00 current gen: 1.000000E+00 particle id: -6.160000E+02 +5.550000E+02 run mode: 2.000000E+00 particle weight: 1.000000E+00 particle energy: -3.545295E-01 +2.831611E-01 particle xyz: -3.516323E+01 -5.400148E+01 -1.588825E+01 +4.973847E+01 6.971699E+00 -5.201827E+01 particle uvw: -4.129799E-01 7.649720E-01 4.942322E-01 +6.945105E-01 6.295355E-01 -3.483393E-01 diff --git a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py index 64123b2e09..a9f4563d0a 100644 --- a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py +++ b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py @@ -6,5 +6,5 @@ from testing_harness import ParticleRestartTestHarness if __name__ == '__main__': - harness = ParticleRestartTestHarness('particle_12_616.*') + harness = ParticleRestartTestHarness('particle_9_555.*') harness.main() diff --git a/tests/test_ptables_off/results_true.dat b/tests/test_ptables_off/results_true.dat index 17d6e91453..2d6511cd25 100644 --- a/tests/test_ptables_off/results_true.dat +++ b/tests/test_ptables_off/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.984064E-01 3.464413E-03 +2.998034E-01 5.227986E-03 diff --git a/tests/test_reflective_cone/results_true.dat b/tests/test_reflective_cone/results_true.dat index 60b34bf66b..c8b833bff4 100644 --- a/tests/test_reflective_cone/results_true.dat +++ b/tests/test_reflective_cone/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.281477E+00 5.206704E-03 +2.269987E+00 4.469683E-03 diff --git a/tests/test_reflective_cylinder/results_true.dat b/tests/test_reflective_cylinder/results_true.dat index f98c517889..0a11f3ef31 100644 --- a/tests/test_reflective_cylinder/results_true.dat +++ b/tests/test_reflective_cylinder/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.276055E+00 3.186526E-03 +2.272436E+00 7.831006E-04 diff --git a/tests/test_reflective_plane/results_true.dat b/tests/test_reflective_plane/results_true.dat index 049d45606c..c5ba8e63fb 100644 --- a/tests/test_reflective_plane/results_true.dat +++ b/tests/test_reflective_plane/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.281505E+00 3.254688E-03 +2.276127E+00 4.678320E-03 diff --git a/tests/test_reflective_sphere/results_true.dat b/tests/test_reflective_sphere/results_true.dat index 47aa5c763e..f25a72dc95 100644 --- a/tests/test_reflective_sphere/results_true.dat +++ b/tests/test_reflective_sphere/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.280812E+00 5.087968E-03 +2.271012E+00 3.466350E-03 diff --git a/tests/test_resonance_scattering/results_true.dat b/tests/test_resonance_scattering/results_true.dat index 62b0ac2239..0dda991cac 100644 --- a/tests/test_resonance_scattering/results_true.dat +++ b/tests/test_resonance_scattering/results_true.dat @@ -1,2 +1,2 @@ k-combined: -6.452021E-02 1.738736E-03 +6.842112E-02 8.480934E-04 diff --git a/tests/test_rotation/results_true.dat b/tests/test_rotation/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_rotation/results_true.dat +++ b/tests/test_rotation/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_salphabeta/results_true.dat b/tests/test_salphabeta/results_true.dat index c2cd683bed..a04ee8fc89 100644 --- a/tests/test_salphabeta/results_true.dat +++ b/tests/test_salphabeta/results_true.dat @@ -1,2 +1,2 @@ k-combined: -8.418898E-01 5.633536E-03 +8.538165E-01 6.355606E-03 diff --git a/tests/test_salphabeta_multiple/results_true.dat b/tests/test_salphabeta_multiple/results_true.dat index 57e620610a..593c5adc74 100644 --- a/tests/test_salphabeta_multiple/results_true.dat +++ b/tests/test_salphabeta_multiple/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.686128E-01 5.056987E-02 +9.141547E-01 2.728809E-02 diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index 03b91f89fa..248f6657d0 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -9,27 +9,27 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.107640E-02 -4.232516E-05 -1.107640E-02 -4.232516E-05 -3.509526E-01 -2.565440E-02 -1.171523E+00 -2.824070E-01 -5.592851E-04 -1.423656E-07 -5.592851E-04 -1.423656E-07 -3.027322E-02 -1.983924E-04 -1.477313E-02 -4.495633E-05 +6.261679E-03 +2.310296E-05 +6.261679E-03 +2.310296E-05 +3.434524E-01 +2.482946E-02 +1.059004E+00 +2.432555E-01 +3.828838E-04 +9.365499E-08 +3.828838E-04 +9.365499E-08 +3.226036E-02 +2.229037E-04 +1.450446E-02 +4.382852E-05 8.650696E-08 7.483455E-15 8.650696E-08 7.483455E-15 -1.097403E-04 -3.424171E-09 -6.866942E-02 -9.952916E-04 +7.312640E-05 +2.080857E-09 +6.101318E-02 +8.452067E-04 diff --git a/tests/test_score_absorption/results_true.dat b/tests/test_score_absorption/results_true.dat index dfdadbae7a..bacbf26a37 100644 --- a/tests/test_score_absorption/results_true.dat +++ b/tests/test_score_absorption/results_true.dat @@ -1,20 +1,20 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -2.267589E+00 -1.054691E+00 -1.476133E-02 -4.485759E-05 -3.306896E-01 -2.302248E-02 +2.006479E+00 +8.808050E-01 +1.444838E-02 +4.349668E-05 +2.926865E-01 +1.944083E-02 tally 2: 0.000000E+00 0.000000E+00 -2.290000E+00 -1.070700E+00 +2.030000E+00 +8.879000E-01 0.000000E+00 0.000000E+00 -3.800000E-01 -3.820000E-02 +4.000000E-01 +4.240000E-02 diff --git a/tests/test_score_current/results_true.dat b/tests/test_score_current/results_true.dat index 09d9a8ecf6..936e2d04bc 100644 --- a/tests/test_score_current/results_true.dat +++ b/tests/test_score_current/results_true.dat @@ -1 +1 @@ -8f7125c9686a94f0fdbd76b1667f84b9dab60c068e23d4f2b0105ce058fa533a8a4a221355614add10d54f3b18c14af41891e0fd0593154c73894e5dcb6fe5c2 \ No newline at end of file +1e6945632c55491d4584f4976cc6f5c7340874703cfaf739dd956b7124b4260955efb5b6ba041b32536f9a74572d071e0293dced55a41ea305223f698b734c2a \ No newline at end of file diff --git a/tests/test_score_events/results_true.dat b/tests/test_score_events/results_true.dat index fd18a5aba1..35ae33eb86 100644 --- a/tests/test_score_events/results_true.dat +++ b/tests/test_score_events/results_true.dat @@ -1,12 +1,12 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -5.627000E+01 -6.565251E+02 -4.892000E+01 -5.009100E+02 +5.328000E+01 +6.082750E+02 +5.594000E+01 +6.836068E+02 tally 2: -1.458000E+01 -4.391620E+01 -1.269000E+01 -3.363670E+01 +1.372000E+01 +4.018980E+01 +1.474000E+01 +4.802520E+01 diff --git a/tests/test_score_fission/results_true.dat b/tests/test_score_fission/results_true.dat index 1a3d333838..904c0d8895 100644 --- a/tests/test_score_fission/results_true.dat +++ b/tests/test_score_fission/results_true.dat @@ -1,20 +1,20 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.089685E+00 -2.438289E-01 +9.432574E-01 +1.970463E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.094323E-01 -1.773090E-01 +1.039280E+00 +2.345809E-01 tally 2: -1.081920E+00 -2.404883E-01 +8.953531E-01 +1.798609E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.945760E-01 -2.073005E-01 +9.923196E-01 +2.067216E-01 diff --git a/tests/test_score_flux/results_true.dat b/tests/test_score_flux/results_true.dat index 9c21a0f3d8..31e1d92926 100644 --- a/tests/test_score_flux/results_true.dat +++ b/tests/test_score_flux/results_true.dat @@ -1,15 +1,15 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -3.403102E+01 -2.393236E+02 -1.143060E+01 -2.704386E+01 -5.691243E+01 -6.685581E+02 -2.924945E+01 -1.782032E+02 -9.965051E+00 -2.067319E+01 -4.931805E+01 -5.050490E+02 +3.224218E+01 +2.217821E+02 +1.079687E+01 +2.494701E+01 +5.252579E+01 +5.951604E+02 +3.325822E+01 +2.414028E+02 +1.145800E+01 +2.880575E+01 +5.605671E+01 +6.804062E+02 diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 8c04c7c898..2e5df97cf4 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -1,448 +1,448 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -3.403102E+01 -2.393236E+02 -1.143060E+01 -2.704386E+01 -5.691243E+01 -6.685581E+02 -2.924945E+01 -1.782032E+02 -9.965051E+00 -2.067319E+01 -4.931805E+01 -5.050490E+02 +3.224218E+01 +2.217821E+02 +1.079687E+01 +2.494701E+01 +5.252579E+01 +5.951604E+02 +3.325822E+01 +2.414028E+02 +1.145800E+01 +2.880575E+01 +5.605671E+01 +6.804062E+02 tally 2: -3.403102E+01 -2.393236E+02 --3.055588E-01 -3.594044E-02 -3.171128E-01 -3.805380E-01 --7.374877E-01 -2.391349E-01 --1.621986E-01 -5.578051E-02 -4.710459E-01 -1.850595E-01 --4.839599E-01 -2.440735E-01 -1.124798E-01 -8.640649E-02 --4.976706E-01 -8.943606E-02 -1.323704E-01 -6.713903E-02 --6.954103E-02 -7.876989E-02 -1.343675E-01 -2.569171E-02 --5.205013E-01 -7.985579E-02 -2.037295E-01 -1.501360E-01 --1.290735E-01 -5.069422E-02 --2.045060E-01 -2.197889E-01 -1.307602E-01 -5.938649E-02 --3.317004E-01 -1.359233E-01 --4.347480E-01 -7.528253E-02 -7.685982E-02 -4.559715E-02 --4.668784E-02 -4.065614E-02 -1.447872E-01 -5.538956E-02 --2.027337E-01 -7.095051E-02 --4.673353E-01 -1.235371E-01 --3.321732E-01 -6.905624E-02 --3.028859E-01 -3.382353E-02 --2.320613E-01 -2.845904E-02 -8.038034E-02 -3.466746E-02 -1.766484E-01 -9.996559E-02 -3.385184E-02 -5.510769E-02 -6.952638E-02 -2.741119E-02 -3.630715E-01 -5.336447E-02 -2.876222E-01 -9.938256E-02 --3.473240E-02 -1.031412E-01 -1.280013E-01 -2.331384E-02 -1.550774E-01 -3.881493E-02 -1.143060E+01 -2.704386E+01 --1.955516E-01 -9.789273E-03 -4.070149E-02 -3.530892E-02 --1.446334E-01 -3.374966E-02 --4.072014E-02 -1.407320E-02 -1.056190E-01 -2.144988E-02 --1.491728E-01 -1.699068E-02 -3.130540E-02 -4.945783E-03 --1.706770E-01 -6.943395E-03 -6.278466E-02 -4.522701E-03 --6.491915E-02 -1.218265E-02 --6.226375E-02 -8.920919E-03 --2.647477E-01 -2.028918E-02 --9.179913E-03 -1.186941E-02 --8.959288E-02 -9.826050E-03 --4.800079E-02 -3.500548E-02 -9.919028E-02 -1.278789E-02 --1.274511E-01 -9.357943E-03 --9.037073E-02 -4.686665E-03 --7.895199E-03 -8.526809E-03 --2.071827E-02 -5.844891E-03 --1.422877E-02 -2.008170E-03 --7.787500E-02 -9.642362E-03 --6.105504E-02 -7.600775E-03 --1.249117E-01 -1.314509E-02 --9.183605E-02 -7.513215E-03 --9.171222E-02 -4.220465E-03 -8.798390E-02 -5.037483E-03 -4.366496E-02 -8.411743E-03 -1.605678E-02 -6.994511E-03 --2.179875E-02 -1.352098E-03 -1.116755E-01 -7.354424E-03 -9.995739E-02 -9.710026E-03 -3.010324E-02 -1.179938E-02 -2.175815E-02 -1.281441E-03 -2.374886E-02 -6.943432E-03 -5.691243E+01 -6.685581E+02 --7.130295E-01 -1.971869E-01 -1.138602E+00 -1.071873E+00 --1.436194E+00 -7.200870E-01 --2.384966E-01 -1.129688E-01 -8.003085E-01 -5.809429E-01 --3.499868E-01 -3.310435E-01 -2.580763E-01 -2.238385E-01 --3.576056E-01 -1.437071E-01 -2.560747E-01 -4.492224E-02 --4.006295E-01 -2.456809E-01 -8.176054E-02 -3.924768E-01 --8.105689E-01 -2.397175E-01 -3.777117E-01 -4.811523E-01 --4.932440E-01 -1.789106E-01 --3.705746E-02 -5.517840E-01 -7.049764E-01 -4.243943E-01 --4.833188E-01 -2.014189E-01 --5.420278E-01 -1.201572E-01 -7.606099E-02 -1.451071E-01 -2.244026E-01 -7.628680E-02 -2.495758E-01 -1.882655E-01 --1.373888E-01 -1.958724E-01 --3.799191E-01 -2.258678E-01 --5.909624E-01 -2.940322E-01 --6.336238E-01 -1.272552E-01 --5.544697E-01 -9.027652E-02 -4.161023E-01 -1.084744E-01 -5.550548E-01 -1.838427E-01 -3.060033E-01 -8.542356E-02 -3.623817E-01 -4.245612E-02 -4.779023E-01 -8.081477E-02 -1.089872E-01 -1.402042E-01 --1.107440E-01 -3.140479E-01 -2.333168E-01 -1.035674E-01 --5.959476E-02 -2.482914E-01 -2.924945E+01 -1.782032E+02 -5.986908E-01 -4.163713E-01 -3.376452E-01 -1.744277E-01 -1.272993E-01 -1.526084E-01 --2.551267E-01 -7.284601E-02 -4.755790E-02 -6.832796E-02 --3.425133E-01 -7.756266E-02 -3.823240E-01 -1.789133E-01 --3.767347E-01 -1.676013E-01 -1.655399E-01 -1.153056E-01 -1.432265E-01 -2.956364E-02 --2.989439E-01 -5.066565E-02 --3.226047E-02 -5.960686E-02 --9.968550E-02 -4.039270E-02 --1.235291E-02 -2.805714E-01 --7.494860E-02 -2.838999E-02 -3.042503E-02 -7.425538E-02 --1.849034E-01 -8.599532E-02 --5.209242E-01 -1.174277E-01 --2.314402E-01 -4.065974E-02 --4.179560E-01 -1.382716E-01 -1.026654E-01 -1.611177E-02 --2.270386E-01 -5.157513E-02 -7.884296E-02 -2.677093E-02 -7.284620E-01 -1.871262E-01 -1.360134E-01 -9.437335E-03 --3.088199E-01 -2.292832E-02 --2.543226E-01 -1.264440E-01 -6.256788E-02 -7.604299E-02 --3.478518E-01 -6.632508E-02 -2.842847E-01 -4.906462E-02 -1.546241E-01 -3.362908E-02 --2.247690E-01 -1.912574E-02 --3.459210E-02 -1.248892E-01 --2.204075E-01 -4.281299E-02 -2.145675E-01 -5.593188E-02 -9.965051E+00 -2.067319E+01 -2.381967E-01 -4.786935E-02 --1.924308E-02 -4.029344E-02 -3.179175E-02 -2.098033E-02 --1.652308E-02 -9.391525E-03 --5.733039E-02 -1.788395E-02 -4.942155E-02 -1.206623E-03 -1.874861E-02 -1.917059E-02 --1.179838E-01 -2.185564E-02 --9.270508E-03 -1.659002E-02 -7.496511E-02 -6.849931E-03 --1.004441E-01 -4.570271E-03 --9.899601E-02 -1.027435E-02 --9.963860E-02 -4.686519E-03 --1.740638E-02 -3.936514E-02 -2.520349E-02 -5.900520E-03 -1.227791E-03 -6.173783E-03 --3.068441E-02 -6.867402E-03 --7.765654E-02 -1.399383E-02 -7.333551E-02 -4.139444E-03 --3.508914E-02 -1.421599E-02 -4.334120E-02 -4.918888E-03 --1.106116E-01 -1.143785E-02 -7.254477E-03 -1.337965E-03 -2.365948E-01 -2.473485E-02 -5.176646E-02 -1.514750E-03 --8.723610E-02 -2.395100E-03 --1.010207E-01 -1.081070E-02 --5.113298E-02 -6.053279E-03 --1.601115E-01 -8.304230E-03 --5.105345E-03 -5.079654E-03 --8.894549E-02 -2.505026E-03 --1.023874E-01 -4.311776E-03 -7.972837E-02 -1.178305E-02 --2.560942E-02 -4.101793E-03 -2.312203E-02 -3.036209E-03 -4.931805E+01 -5.050490E+02 -1.513494E+00 -1.676567E+00 -6.650656E-01 -1.400732E+00 -4.934620E-01 -7.673322E-01 --2.964442E-02 -2.262500E-01 --2.225956E-01 -4.872938E-01 -2.498269E-01 -9.442256E-02 --1.454141E-01 -2.683171E-01 --3.720260E-01 -2.266316E-01 -2.473591E-01 -3.624408E-01 -2.096941E-01 -6.664835E-02 --4.700220E-01 -9.789465E-02 --1.626165E-01 -1.315362E-01 -3.519966E-01 -1.140516E-01 --1.185342E-01 -5.708362E-01 --1.333083E-01 -1.352294E-01 -1.375803E-01 -1.572243E-01 --6.099544E-02 -2.042264E-01 --3.664336E-01 -1.762506E-01 --1.717957E-01 -5.864778E-02 --5.153204E-01 -2.484316E-01 --2.258513E-01 -8.839687E-02 --9.307565E-01 -4.802462E-01 -1.108577E-01 -4.451363E-02 -1.118965E+00 -5.173979E-01 -4.314600E-01 -5.176751E-02 --2.864059E-01 -9.159895E-02 --4.471918E-01 -1.743046E-01 --7.850808E-02 -1.317732E-01 --7.445394E-01 -1.479808E-01 -7.480873E-01 -2.696289E-01 -1.731449E-01 -5.301367E-02 --3.663464E-01 -3.430563E-02 -3.553351E-01 -2.051544E-01 --4.312304E-01 -2.164291E-01 -2.436515E-01 -8.025128E-02 +3.224218E+01 +2.217821E+02 +-4.524803E-01 +1.326110E-01 +-2.725152E-01 +4.845463E-01 +-4.030063E-01 +1.825349E-01 +-2.145346E-01 +7.197305E-02 +2.488985E-01 +4.295894E-02 +-6.797085E-01 +2.125889E-01 +1.698034E-01 +3.750580E-02 +-6.596628E-02 +6.507545E-02 +4.519597E-02 +1.432412E-02 +6.227959E-01 +1.066624E-01 +2.328135E-01 +8.583522E-02 +-8.899482E-01 +1.982834E-01 +3.269468E-01 +5.392549E-02 +1.684792E-01 +1.461138E-01 +-2.026161E-01 +1.992812E-01 +2.599678E-01 +7.704699E-02 +-3.329837E-01 +8.761827E-02 +-5.287177E-01 +9.089410E-02 +3.666982E-01 +4.451200E-02 +2.096594E-01 +4.539545E-02 +2.091762E-01 +4.861771E-02 +1.476292E-01 +2.837569E-02 +-4.091772E-01 +1.141307E-01 +-1.652694E-01 +5.552090E-02 +8.207679E-02 +1.659512E-02 +-1.203575E-01 +6.408952E-02 +-8.219791E-03 +9.915873E-02 +-3.768675E-02 +8.535079E-02 +1.305167E-01 +1.917693E-02 +1.823050E-01 +1.945159E-02 +2.999655E-01 +4.587948E-02 +3.687435E-01 +1.382795E-01 +1.220376E-01 +6.297901E-02 +3.899923E-01 +5.894393E-02 +-1.878957E-02 +1.159448E-01 +1.079687E+01 +2.494701E+01 +-1.067271E-01 +9.075462E-03 +-2.571244E-02 +4.402172E-02 +-3.646387E-02 +2.948533E-02 +-1.043828E-01 +1.600528E-02 +4.361032E-02 +3.875958E-03 +-3.096545E-01 +3.184604E-02 +8.723730E-02 +4.599654E-03 +6.541966E-03 +9.605866E-03 +5.837907E-02 +3.026784E-03 +1.523399E-01 +7.846764E-03 +2.778305E-02 +8.106935E-03 +-2.895648E-01 +1.983532E-02 +4.866247E-02 +1.048055E-02 +2.600097E-02 +1.465465E-02 +-6.958338E-02 +3.287519E-02 +1.690742E-01 +1.204714E-02 +-1.127534E-01 +7.881362E-03 +-1.662306E-01 +9.412057E-03 +1.674047E-01 +6.690449E-03 +-4.370664E-02 +5.828314E-03 +9.323095E-02 +4.400433E-03 +1.353164E-02 +1.389416E-03 +-1.062009E-01 +1.297730E-02 +-5.331064E-02 +5.321055E-03 +7.698466E-02 +3.247975E-03 +-2.095250E-02 +4.788058E-03 +-8.861817E-03 +7.657174E-03 +1.769365E-02 +1.144058E-03 +1.788678E-02 +2.746804E-03 +4.403056E-03 +6.918351E-04 +1.059091E-01 +1.394217E-02 +1.442934E-01 +1.318500E-02 +2.199047E-02 +5.838245E-03 +8.175546E-02 +3.242012E-03 +7.359786E-03 +1.673277E-02 +5.252579E+01 +5.951604E+02 +-8.293789E-01 +2.900775E-01 +6.285324E-01 +1.487344E+00 +-4.765860E-01 +8.058451E-01 +-3.101266E-01 +1.597231E-01 +3.333449E-01 +1.162003E-01 +-1.314742E+00 +4.565068E-01 +4.726655E-01 +1.161194E-01 +2.824987E-01 +8.732802E-02 +1.025468E-01 +4.935830E-02 +4.216767E-01 +1.225700E-01 +-4.022783E-02 +1.178843E-01 +-7.967853E-01 +2.698001E-01 +3.741686E-01 +2.849501E-01 +3.377745E-01 +3.722806E-01 +9.234355E-02 +4.498496E-01 +8.019475E-01 +3.404218E-01 +-3.086622E-01 +1.857604E-01 +-8.474654E-01 +1.733363E-01 +8.124627E-01 +1.415201E-01 +-3.075481E-01 +3.345921E-02 +7.126178E-01 +2.478330E-01 +2.983972E-01 +2.913106E-02 +-6.759256E-01 +4.245338E-01 +-3.491214E-01 +1.017784E-01 +1.637602E-01 +7.414687E-02 +-3.344942E-01 +1.165491E-01 +-6.038784E-02 +1.791698E-01 +2.645086E-01 +8.129446E-02 +-2.738265E-01 +6.616303E-02 +1.135151E-02 +4.140154E-02 +4.679883E-01 +1.914750E-01 +2.876984E-01 +1.355086E-01 +-2.741613E-01 +1.060457E-01 +5.972204E-01 +2.144153E-01 +-9.215131E-02 +4.815135E-01 +3.325822E+01 +2.414028E+02 +-3.072951E-02 +3.385901E-01 +9.729550E-01 +3.745599E-01 +-5.237870E-01 +3.101477E-01 +-5.994810E-01 +1.696123E-01 +-3.402784E-01 +1.910685E-01 +-3.779571E-01 +2.598004E-01 +-4.804007E-01 +1.417261E-01 +-5.444032E-01 +1.756801E-01 +-9.921809E-02 +6.889191E-02 +-3.768065E-01 +8.931168E-02 +5.814513E-02 +1.660714E-02 +-1.263664E-01 +2.650287E-01 +1.951860E-01 +2.090892E-01 +3.576168E-01 +2.511782E-01 +-9.547988E-02 +7.900044E-03 +5.460746E-01 +1.319868E-01 +-1.577655E-01 +8.575762E-02 +2.938792E-02 +7.941653E-02 +-7.505627E-01 +2.530444E-01 +-2.399786E-01 +1.105633E-01 +2.035740E-01 +2.442135E-02 +1.190368E-01 +8.652216E-02 +5.753449E-01 +9.353813E-02 +4.911025E-01 +6.795258E-02 +-2.967023E-03 +7.063512E-03 +-2.158307E-01 +4.680921E-02 +-1.811238E-01 +7.008450E-02 +1.809785E-01 +3.414843E-02 +-1.380825E-01 +3.469381E-02 +3.722241E-01 +3.956589E-02 +2.064516E-01 +2.676312E-02 +-3.889056E-01 +6.737109E-02 +1.625815E-01 +1.356347E-02 +-5.278455E-01 +1.297993E-01 +-1.269304E-02 +1.253029E-02 +1.145800E+01 +2.880575E+01 +6.201234E-02 +4.410457E-02 +2.694694E-01 +6.262339E-02 +-1.173739E-01 +4.727885E-02 +-1.785056E-01 +1.745391E-02 +-4.744392E-02 +2.117667E-02 +3.998416E-02 +6.058339E-02 +-1.927536E-01 +1.710512E-02 +-1.800560E-01 +2.420071E-02 +-1.136912E-01 +1.049357E-02 +-1.104415E-01 +1.181394E-02 +3.486245E-02 +3.673104E-03 +-8.343502E-02 +2.270299E-02 +-3.064437E-02 +1.197968E-02 +1.912081E-01 +2.808487E-02 +2.601014E-02 +1.311244E-03 +1.295023E-01 +1.108983E-02 +-1.158397E-01 +1.033182E-02 +8.316701E-02 +2.061897E-02 +-1.136796E-01 +3.133021E-02 +-1.722931E-02 +2.168654E-02 +1.464014E-01 +8.570818E-03 +5.859338E-02 +6.076029E-03 +1.776223E-01 +1.345571E-02 +1.582455E-01 +9.719314E-03 +9.088118E-03 +1.681557E-03 +-6.298727E-02 +5.287397E-03 +5.793395E-03 +6.397495E-03 +-1.835123E-02 +4.506573E-03 +-7.558061E-02 +4.462082E-03 +3.136371E-02 +3.181332E-03 +-2.787527E-02 +1.765822E-03 +-9.878307E-02 +3.381183E-03 +1.279690E-01 +4.386067E-03 +-1.043523E-01 +5.381331E-03 +1.000162E-02 +6.707280E-04 +5.605671E+01 +6.804062E+02 +1.431465E-01 +1.700768E+00 +2.010680E+00 +2.307036E+00 +-5.276592E-01 +1.006050E+00 +-9.123132E-01 +4.824313E-01 +-3.276490E-01 +5.842232E-01 +6.749445E-02 +6.049661E-01 +-1.317515E+00 +4.738014E-01 +-9.470910E-01 +4.937085E-01 +-3.338536E-01 +2.196164E-01 +-3.032729E-01 +1.241029E-01 +-3.285269E-01 +5.276607E-02 +-4.107012E-01 +6.402858E-01 +3.357626E-01 +2.672801E-01 +1.000507E+00 +5.263322E-01 +-1.834202E-01 +9.495434E-02 +8.133484E-01 +3.011488E-01 +-4.083516E-01 +2.428630E-01 +4.032934E-01 +1.825835E-01 +-8.291267E-01 +6.773284E-01 +-2.401557E-01 +2.280331E-01 +4.325658E-01 +1.163540E-01 +6.671759E-02 +2.181769E-01 +6.984462E-01 +1.716985E-01 +7.108347E-01 +1.386394E-01 +1.709795E-01 +5.320122E-02 +-2.354809E-01 +7.105363E-02 +1.600239E-01 +9.179874E-02 +2.802111E-02 +6.149546E-02 +-4.005049E-01 +2.195356E-01 +7.914623E-01 +2.273026E-01 +3.392453E-01 +1.101813E-01 +-7.821576E-01 +1.637944E-01 +4.736782E-01 +1.531480E-01 +-5.253391E-01 +1.093913E-01 +2.235961E-01 +5.449263E-02 diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index f9f4c44b9a..dadcdd281b 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.135627E+02 -9.364189E+03 +1.848110E+02 +7.563211E+03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.782510E+02 -6.811324E+03 +2.035912E+02 +8.999693E+03 diff --git a/tests/test_score_nufission/results_true.dat b/tests/test_score_nufission/results_true.dat index 21d6586b68..5d0b44662e 100644 --- a/tests/test_score_nufission/results_true.dat +++ b/tests/test_score_nufission/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -2.879098E+00 -1.700626E+00 +2.486342E+00 +1.368793E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.401881E+00 -1.235627E+00 +2.733038E+00 +1.616903E+00 diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index e2be939c75..df695d8a87 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.239000E+01 -3.172630E+01 -3.570000E+00 -2.668900E+00 -4.450000E+01 -4.100412E+02 +1.169000E+01 +2.915330E+01 +3.200000E+00 +2.342600E+00 +4.064000E+01 +3.595168E+02 diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index 9b84b70786..b46a1e184d 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.239000E+01 -3.172630E+01 -1.431689E+00 -4.209133E-01 -6.192790E-01 -1.440589E-01 -4.143123E-01 -5.479770E-02 -2.942906E-01 -3.458523E-02 -3.570000E+00 -2.668900E+00 -3.298388E-01 -4.816449E-02 -3.308381E-01 -3.018261E-02 -5.366444E-02 -7.235974E-03 --7.363858E-02 -7.113489E-03 -4.450000E+01 -4.100412E+02 -2.317316E+01 -1.102855E+02 -8.679054E+00 -1.538963E+01 -7.128469E-01 -1.440027E-01 --1.172445E+00 -3.514659E-01 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 +3.200000E+00 +2.342600E+00 +3.809941E-01 +2.965326E-02 +4.319242E-01 +3.738822E-02 +9.261909E-02 +6.711328E-03 +-6.052442E-02 +7.087230E-03 +4.064000E+01 +3.595168E+02 +2.096700E+01 +9.516606E+01 +7.560566E+00 +1.248694E+01 +2.093348E-01 +4.278510E-02 +-1.449929E+00 +4.356371E-01 diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 18a93153ed..3c34895d90 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.239000E+01 -3.172630E+01 -1.431689E+00 -4.209133E-01 -6.192790E-01 -1.440589E-01 -4.143123E-01 -5.479770E-02 -2.942906E-01 -3.458523E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 tally 2: -1.239000E+01 -3.172630E+01 -1.431689E+00 -4.209133E-01 -6.192790E-01 -1.440589E-01 -4.143123E-01 -5.479770E-02 -2.942906E-01 -3.458523E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index e6ca67827c..1e8e143ef4 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.239000E+01 -3.172630E+01 +1.169000E+01 +2.915330E+01 tally 2: -1.239000E+01 -3.172630E+01 --1.558408E-01 -1.069360E-02 --4.768057E-02 -2.298561E-02 -7.015981E-02 -1.366523E-02 --2.449791E-02 -5.899048E-03 -9.535825E-02 -6.335188E-03 --9.915129E-03 -2.116965E-03 --2.535001E-03 -2.410993E-03 -1.030312E-01 -1.128648E-02 --4.471182E-02 -6.335010E-03 -4.744793E-02 -2.215754E-03 -6.507318E-02 -2.747856E-03 --8.724368E-02 -3.500811E-03 -5.479971E-03 -2.059588E-04 --1.345855E-01 -5.547202E-03 -8.586379E-02 -3.537507E-03 +1.169000E+01 +2.915330E+01 +-2.198379E-01 +2.828670E-02 +-1.317276E-01 +9.568596E-03 +8.309792E-02 +1.155410E-02 +-2.288506E-02 +3.710542E-03 +-2.720674E-02 +1.789163E-03 +-1.323964E-02 +1.819112E-04 +8.941597E-02 +4.265616E-03 +1.516805E-01 +1.332526E-02 +-1.832782E-02 +6.611171E-03 +1.311371E-02 +2.840648E-03 +3.728365E-02 +2.866806E-03 +-5.100587E-02 +2.957146E-03 +3.388028E-02 +2.481570E-03 +-7.766921E-02 +3.129377E-03 +1.666131E-02 +3.828290E-03 diff --git a/tests/test_score_scatter/results_true.dat b/tests/test_score_scatter/results_true.dat index 9619e0f49d..5f0ae8b1dd 100644 --- a/tests/test_score_scatter/results_true.dat +++ b/tests/test_score_scatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.290818E+01 -3.438677E+01 -3.136743E+00 -2.032819E+00 -4.503247E+01 -4.196453E+02 +1.223028E+01 +3.185078E+01 +2.900350E+00 +1.814004E+00 +4.059013E+01 +3.609499E+02 diff --git a/tests/test_score_scatter_n/results_true.dat b/tests/test_score_scatter_n/results_true.dat index 418eabad78..b46a1e184d 100644 --- a/tests/test_score_scatter_n/results_true.dat +++ b/tests/test_score_scatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.238000E+01 -3.168320E+01 -1.437080E+00 -4.234943E-01 -6.199204E-01 -1.441510E-01 -4.101424E-01 -5.414561E-02 -2.977431E-01 -3.433685E-02 -3.570000E+00 -2.668900E+00 -3.298388E-01 -4.816449E-02 -3.308381E-01 -3.018261E-02 -5.366444E-02 -7.235974E-03 --7.363858E-02 -7.113489E-03 -4.450000E+01 -4.100412E+02 -2.317316E+01 -1.102855E+02 -8.679054E+00 -1.538963E+01 -7.128469E-01 -1.440027E-01 --1.172445E+00 -3.514659E-01 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 +3.200000E+00 +2.342600E+00 +3.809941E-01 +2.965326E-02 +4.319242E-01 +3.738822E-02 +9.261909E-02 +6.711328E-03 +-6.052442E-02 +7.087230E-03 +4.064000E+01 +3.595168E+02 +2.096700E+01 +9.516606E+01 +7.560566E+00 +1.248694E+01 +2.093348E-01 +4.278510E-02 +-1.449929E+00 +4.356371E-01 diff --git a/tests/test_score_scatter_pn/results_true.dat b/tests/test_score_scatter_pn/results_true.dat index d6767ea031..3c34895d90 100644 --- a/tests/test_score_scatter_pn/results_true.dat +++ b/tests/test_score_scatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.238000E+01 -3.168320E+01 -1.437080E+00 -4.234943E-01 -6.199204E-01 -1.441510E-01 -4.101424E-01 -5.414561E-02 -2.977431E-01 -3.433685E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 tally 2: -1.238000E+01 -3.168320E+01 -1.437080E+00 -4.234943E-01 -6.199204E-01 -1.441510E-01 -4.101424E-01 -5.414561E-02 -2.977431E-01 -3.433685E-02 +1.169000E+01 +2.915330E+01 +1.247253E+00 +3.767436E-01 +5.330812E-01 +1.385083E-01 +2.987823E-01 +5.699361E-02 +2.645512E-01 +2.905381E-02 diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 23f56743bd..9df7ea42a7 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -1,56 +1,56 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.238000E+01 -3.168320E+01 +1.169000E+01 +2.915330E+01 tally 2: -1.238000E+01 -3.168320E+01 --1.570048E-01 -1.067590E-02 --4.730723E-02 -2.307294E-02 -6.490976E-02 -1.426908E-02 --2.426427E-02 -5.909294E-03 -9.534163E-02 -6.333588E-03 --1.023123E-02 -2.132217E-03 --2.609941E-03 -2.406916E-03 -1.035322E-01 -1.128320E-02 --4.271935E-02 -6.478440E-03 -4.721270E-02 -2.212864E-03 -6.453502E-02 -2.750693E-03 --8.681394E-02 -3.493602E-03 -3.052598E-03 -1.842182E-04 --1.350899E-01 -5.564227E-03 -8.846033E-02 -3.537258E-03 -5.729362E-02 -2.064207E-03 -1.780469E-02 -2.838072E-03 --4.570340E-02 -2.812380E-03 -2.213430E-02 -5.564728E-04 --3.159434E-03 -3.500419E-03 --1.547339E-02 -1.929157E-03 -6.653362E-02 -1.421509E-03 -1.226039E-02 -1.144939E-03 -5.785933E-03 -4.218074E-04 +1.169000E+01 +2.915330E+01 +-2.198379E-01 +2.828670E-02 +-1.317276E-01 +9.568596E-03 +8.309792E-02 +1.155410E-02 +-2.288506E-02 +3.710542E-03 +-2.720674E-02 +1.789163E-03 +-1.323964E-02 +1.819112E-04 +8.941597E-02 +4.265616E-03 +1.516805E-01 +1.332526E-02 +-1.832782E-02 +6.611171E-03 +1.311371E-02 +2.840648E-03 +3.728365E-02 +2.866806E-03 +-5.100587E-02 +2.957146E-03 +3.388028E-02 +2.481570E-03 +-7.766921E-02 +3.129377E-03 +1.666131E-02 +3.828290E-03 +8.102553E-02 +2.118169E-03 +6.303084E-03 +7.156173E-04 +-2.083478E-03 +2.683340E-03 +6.794806E-03 +3.912783E-04 +1.005390E-01 +2.920205E-03 +-5.332517E-02 +2.205372E-03 +-1.584725E-02 +8.984498E-04 +3.486904E-02 +6.448722E-04 +-2.420912E-02 +6.352276E-04 diff --git a/tests/test_score_total/results_true.dat b/tests/test_score_total/results_true.dat index 0838e7baed..f3aa5d89b1 100644 --- a/tests/test_score_total/results_true.dat +++ b/tests/test_score_total/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.517577E+01 -4.747271E+01 -3.151504E+00 -2.051857E+00 -4.536316E+01 -4.258781E+02 +1.423676E+01 +4.330937E+01 +2.914798E+00 +1.831649E+00 +4.088282E+01 +3.662539E+02 diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index b2dcd39e12..bcfdb9080f 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -1,14 +1,14 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: 0.000000E+00 0.000000E+00 -1.517577E+01 -4.747271E+01 -3.151504E+00 -2.051857E+00 -4.536316E+01 -4.258781E+02 +1.423676E+01 +4.330937E+01 +2.914798E+00 +1.831649E+00 +4.088282E+01 +3.662539E+02 tally 2: 0.000000E+00 0.000000E+00 @@ -110,106 +110,106 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -8.795501E-01 -1.600341E-01 --1.530661E-02 -5.215322E-04 -1.571095E-02 -9.166057E-04 -7.226990E-03 -3.683499E-04 --2.456165E-02 -1.571441E-04 -1.387449E-02 -5.600648E-04 --2.186870E-02 -2.081164E-04 --1.106814E-02 -1.065144E-04 --4.579593E-03 -2.008225E-04 -7.573253E-03 -2.493075E-04 --1.505016E-02 -1.451400E-04 -1.503792E-02 -9.539029E-05 --1.183668E-02 -1.741393E-04 -4.060912E-03 -5.890591E-05 -1.789747E-02 -8.239749E-05 --2.168438E-02 -1.555757E-04 --1.045826E-02 -8.108402E-05 -1.227413E-02 -2.502871E-04 --2.806122E-02 -1.886120E-04 --4.918718E-03 -2.129038E-04 --1.014729E-02 -6.914145E-05 --5.873760E-03 -2.229738E-04 -6.666511E-03 -1.394147E-04 --3.245528E-03 -1.550876E-04 --1.037659E-02 -2.163837E-04 -1.517577E+01 -4.747271E+01 --2.463504E-01 -2.376091E-02 -7.930151E-02 -3.516796E-02 --1.611736E-01 -2.658129E-02 --9.124923E-02 -1.181443E-02 -2.766258E-01 -2.310767E-02 --2.269608E-01 -3.593659E-02 --5.345296E-02 -1.169733E-02 --1.838169E-01 -1.625334E-02 --7.883035E-02 -8.514293E-03 --4.922148E-02 -7.767910E-03 -1.144559E-01 -4.638553E-03 --2.027207E-01 -2.158672E-02 -5.449222E-02 -1.287150E-02 -5.384229E-02 -6.688120E-03 --8.231311E-02 -2.743044E-02 -1.172790E-02 -1.089457E-02 --1.545389E-01 -2.655167E-02 --2.290221E-01 -1.443721E-02 -2.773254E-02 -1.070478E-02 --2.522703E-02 -1.136507E-02 --1.287564E-02 -4.969443E-03 -3.471629E-02 -7.559603E-03 --2.261509E-01 -2.383142E-02 --1.463402E-01 -1.526988E-02 +7.812543E-01 +1.349265E-01 +-7.005988E-03 +2.198486E-04 +3.237937E-02 +7.569491E-04 +-3.865436E-04 +4.048167E-04 +-1.003877E-02 +3.195619E-04 +3.738815E-03 +3.506174E-04 +-2.549288E-02 +3.086810E-04 +1.693002E-02 +1.255885E-04 +3.059341E-03 +1.971678E-04 +9.247344E-03 +2.402855E-04 +6.618469E-04 +1.639025E-04 +1.992953E-02 +1.365376E-04 +3.262256E-03 +1.341040E-05 +2.864166E-03 +4.394787E-05 +1.494351E-03 +1.001007E-04 +-1.091424E-02 +1.221030E-04 +9.875992E-03 +1.141979E-04 +1.263647E-02 +2.400023E-04 +-2.944398E-03 +1.246417E-04 +1.970051E-03 +1.600160E-04 +6.148931E-03 +4.774182E-05 +1.107728E-02 +1.095420E-04 +1.382599E-02 +1.537793E-04 +-1.296297E-02 +1.392028E-04 +-1.479385E-02 +1.650074E-04 +1.423676E+01 +4.330937E+01 +-2.802155E-01 +3.016146E-02 +-8.009314E-02 +4.251899E-02 +-7.383773E-02 +1.547362E-02 +-1.274422E-01 +2.290306E-02 +1.370426E-01 +1.002935E-02 +-2.607280E-01 +3.414307E-02 +1.497421E-02 +2.944540E-03 +-2.866477E-02 +9.113662E-03 +-3.949118E-02 +4.437767E-03 +2.283116E-01 +1.792907E-02 +1.334103E-01 +1.587762E-02 +-3.139096E-01 +2.330713E-02 +1.025884E-03 +5.754195E-03 +1.099489E-01 +1.861634E-02 +-7.863729E-02 +2.276108E-02 +1.219111E-01 +1.363203E-02 +-1.261893E-01 +1.937908E-02 +-1.995428E-01 +1.383344E-02 +8.803472E-02 +3.742219E-03 +1.501143E-01 +1.288322E-02 +4.522115E-02 +8.283014E-03 +1.113588E-01 +8.523967E-03 +-1.820582E-01 +1.648932E-02 +-1.121108E-01 +1.059879E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -260,56 +260,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -3.151504E+00 -2.051857E+00 --4.923938E-02 -1.416150E-03 --1.041702E-02 -8.114498E-04 --3.212977E-02 -2.419393E-03 -2.557299E-02 -1.124488E-03 -4.083178E-02 -1.351219E-03 --3.910818E-02 -8.908208E-04 -5.659008E-03 -4.488733E-04 --1.625829E-02 -2.325228E-04 -2.554220E-02 -7.666018E-04 --2.251672E-02 -7.703442E-04 --8.302474E-03 -2.748216E-04 --7.692439E-02 -2.167893E-03 -7.267774E-03 -7.781907E-04 -6.821338E-03 -9.518920E-04 --2.203951E-02 -2.214610E-03 -2.052514E-02 -3.756195E-04 --4.158575E-02 -9.330262E-04 --3.000932E-02 -4.584914E-04 --2.247072E-02 -2.519845E-04 -1.589401E-02 -2.302726E-04 --7.793787E-04 -1.588955E-04 --4.634907E-03 -5.395803E-04 --1.193817E-02 -1.674419E-04 --1.682320E-02 -8.389254E-04 +2.914798E+00 +1.831649E+00 +-3.213884E-02 +1.391026E-03 +-1.124311E-02 +2.059984E-03 +-1.372399E-02 +2.990198E-03 +-6.931800E-03 +1.073303E-03 +-5.448993E-03 +3.542504E-04 +-7.264172E-02 +1.742045E-03 +1.526380E-02 +5.962297E-04 +1.576474E-02 +5.335071E-04 +2.028206E-02 +2.915489E-04 +4.014298E-02 +4.285950E-04 +8.228146E-03 +6.388002E-04 +-8.183952E-02 +2.031634E-03 +1.014523E-02 +1.159653E-03 +9.321030E-03 +7.480844E-04 +-3.156017E-02 +2.064357E-03 +3.606483E-02 +4.060244E-04 +-3.866234E-02 +1.046100E-03 +-5.723297E-02 +1.042437E-03 +2.894838E-02 +2.922848E-04 +-1.529225E-03 +2.472179E-04 +9.484410E-03 +4.172637E-04 +-4.442548E-04 +2.518508E-04 +-3.065480E-02 +3.571846E-04 +-6.519117E-03 +1.779322E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -360,53 +360,53 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -4.536316E+01 -4.258781E+02 --6.747275E-01 -3.006113E-01 -5.302096E-01 -4.167797E-01 --4.347270E-01 -3.702158E-01 --7.344613E-02 -5.940699E-02 -1.081217E+00 -4.070812E-01 --3.172368E-02 -3.124338E-02 -2.656115E-01 -8.561866E-02 --1.286933E-01 -8.347414E-02 -1.258195E-01 -3.329577E-02 --3.751107E-01 -9.007513E-02 -4.283879E-01 -1.067035E-01 --3.467870E-01 -6.788988E-02 -4.218567E-02 -4.465188E-02 -6.876561E-02 -5.655954E-02 --1.116047E-01 -1.073179E-01 -4.077067E-01 -1.148942E-01 --3.218725E-01 -4.739201E-02 --4.297438E-01 -9.739104E-02 -2.199014E-01 -2.328443E-02 -6.007636E-01 -1.194137E-01 --2.194826E-01 -5.017106E-02 -2.266133E-01 -1.131899E-01 -7.161662E-04 -3.345992E-02 --1.987041E-01 -1.381432E-01 +4.088282E+01 +3.662539E+02 +-9.859591E-01 +2.743013E-01 +2.392244E-01 +3.795971E-01 +-3.389717E-01 +7.054539E-01 +-1.673679E-01 +1.081377E-01 +2.918680E-01 +7.161035E-02 +-5.627453E-01 +9.124299E-02 +7.185542E-01 +2.062140E-01 +8.533956E-02 +3.649126E-02 +7.630639E-02 +1.623523E-02 +3.785290E-02 +4.181389E-02 +1.388919E-01 +1.307834E-01 +-2.682812E-01 +6.653584E-02 +7.151084E-02 +3.466772E-02 +6.941393E-02 +2.821800E-02 +2.392050E-02 +1.132504E-01 +3.749985E-01 +8.337209E-02 +-2.998887E-01 +6.767226E-02 +-3.629285E-01 +7.246083E-02 +3.989685E-01 +4.378581E-02 +1.330115E-01 +2.634398E-02 +2.649739E-01 +4.300042E-02 +5.793351E-01 +7.399884E-02 +-2.236528E-01 +3.130205E-02 +-3.695818E-01 +4.703480E-02 diff --git a/tests/test_seed/results_true.dat b/tests/test_seed/results_true.dat index 860e9e9af6..df79ce1ced 100644 --- a/tests/test_seed/results_true.dat +++ b/tests/test_seed/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.984828E-01 5.293550E-03 +2.951164E-01 2.504580E-03 diff --git a/tests/test_source_angle_mono/results_true.dat b/tests/test_source_angle_mono/results_true.dat index 1aca9a5057..42e948758a 100644 --- a/tests/test_source_angle_mono/results_true.dat +++ b/tests/test_source_angle_mono/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.034005E-01 5.499077E-03 +2.964943E-01 1.201478E-02 diff --git a/tests/test_source_energy_maxwell/results_true.dat b/tests/test_source_energy_maxwell/results_true.dat index 349c65ef9c..37b8b36b99 100644 --- a/tests/test_source_energy_maxwell/results_true.dat +++ b/tests/test_source_energy_maxwell/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.008495E-01 6.113736E-03 +2.886671E-01 7.534631E-03 diff --git a/tests/test_source_energy_mono/results_true.dat b/tests/test_source_energy_mono/results_true.dat index b7af42bcae..029376bf37 100644 --- a/tests/test_source_energy_mono/results_true.dat +++ b/tests/test_source_energy_mono/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.964207E-01 7.263112E-03 +3.002731E-01 7.561170E-03 diff --git a/tests/test_source_file/results_true.dat b/tests/test_source_file/results_true.dat index 738a15c584..fee61dda26 100644 --- a/tests/test_source_file/results_true.dat +++ b/tests/test_source_file/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.031470E-01 4.441814E-03 +2.962911E-01 4.073420E-03 diff --git a/tests/test_source_point/results_true.dat b/tests/test_source_point/results_true.dat index 040f4e188f..fe9a0d78d4 100644 --- a/tests/test_source_point/results_true.dat +++ b/tests/test_source_point/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.025384E-01 4.682677E-03 +3.041148E-01 4.558319E-03 diff --git a/tests/test_sourcepoint_latest/results_true.dat b/tests/test_sourcepoint_latest/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_sourcepoint_latest/results_true.dat +++ b/tests/test_sourcepoint_latest/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_sourcepoint_restart/results_true.dat b/tests/test_sourcepoint_restart/results_true.dat index 917fc0cdfb..0e4eef9a9d 100644 --- a/tests/test_sourcepoint_restart/results_true.dat +++ b/tests/test_sourcepoint_restart/results_true.dat @@ -1,16 +1,116 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 tally 1: -1.200000E-02 -4.000000E-05 -8.118392E-03 -1.773579E-05 -3.683496E-03 -4.911153E-06 -1.507354E-03 -2.420229E-06 -6.245016E-03 -9.775028E-06 +7.000000E-03 +2.100000E-05 +1.127639E-03 +7.464355E-07 +-1.264355E-03 +1.192757E-06 +8.769846E-04 +1.117508E-06 +3.359153E-03 +4.366438E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.107648E-04 +3.730336E-07 +1.000000E-03 +1.000000E-06 +6.713061E-04 +4.506518E-07 +1.759778E-04 +3.096817E-08 +-2.506458E-04 +6.282332E-08 +6.069794E-04 +3.684240E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-03 +1.500000E-05 +4.398928E-03 +8.198908E-06 +1.784486E-03 +3.422315E-06 +8.494423E-04 +9.262242E-07 +4.566637E-03 +5.646039E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.069794E-04 +3.684240E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +3.000000E-06 +-1.419189E-03 +9.791601E-07 +-3.125982E-05 +5.086129E-07 +3.291570E-04 +1.943609E-07 +1.525426E-03 +8.346311E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -23,34 +123,254 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 --6.834146E-04 -4.670555E-07 -2.005832E-04 -4.023363E-08 -2.271406E-04 -5.159283E-08 -1.822902E-03 -3.322972E-06 -3.000000E-03 -9.000000E-06 -2.089393E-03 -4.365565E-06 -1.135864E-03 -1.290186E-06 -8.092128E-04 -6.548254E-07 +-1.542107E-05 +2.378095E-10 +-4.996433E-04 +2.496434E-07 +2.312244E-05 +5.346472E-10 +3.053824E-04 +9.325841E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +8.600000E-05 +3.995253E-03 +1.648172E-05 +3.349403E-03 +1.166653E-05 +4.208940E-03 +7.077664E-06 +1.033905E-02 +2.197265E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.029991E-04 +1.818050E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.620000E-04 +7.996640E-03 +1.882484E-05 +3.921034E-03 +1.157453E-05 +1.644629E-03 +3.217857E-06 +1.159182E-02 +3.534975E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +2.500000E-05 +4.691861E-03 +7.999548E-06 +1.771537E-03 +3.385525E-06 +7.888659E-04 +1.911759E-06 +4.561602E-03 +4.337486E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.107648E-04 +3.730336E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-3.878617E-04 +1.504367E-07 +-2.743449E-04 +7.526515E-08 +4.359210E-04 +1.900271E-07 +3.034897E-04 +9.210600E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.600000E-02 +5.600000E-05 +4.563082E-03 +6.119552E-06 +1.839038E-03 +1.089339E-06 +1.944879E-03 +2.372975E-06 +8.524215E-03 +1.874218E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 1.300000E-02 -5.100000E-05 -4.806354E-03 -1.638996E-05 -2.497355E-03 -3.759321E-06 -2.012128E-03 -2.901025E-06 -6.823095E-03 -1.298557E-05 +5.300000E-05 +6.763364E-03 +1.445064E-05 +2.970216E-03 +3.071874E-06 +2.622002E-03 +3.547897E-06 +5.177618E-03 +8.040228E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -59,8 +379,688 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.993246E-04 -1.796295E-07 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.400000E-05 +1.172941E-04 +1.212454E-06 +4.110442E-04 +5.740547E-06 +1.788140E-03 +9.775061E-07 +3.946448E-03 +3.956113E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.109694E-04 +1.866863E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.168648E-04 +8.406410E-07 +7.609615E-04 +5.790624E-07 +5.515881E-04 +3.042494E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +2.020000E-04 +1.305502E-02 +4.343057E-05 +8.214305E-03 +2.001202E-05 +3.511762E-03 +1.412559E-05 +1.401995E-02 +4.269615E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.400000E-02 +1.320000E-04 +5.207205E-03 +9.311400E-06 +3.232372E-03 +3.475980E-06 +2.062884E-03 +4.773104E-06 +1.039066E-02 +2.611825E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.171802E-04 +4.646485E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.221939E-03 +7.467452E-07 +1.000000E-03 +1.000000E-06 +9.910929E-04 +9.822652E-07 +9.733978E-04 +9.475032E-07 +9.471508E-04 +8.970946E-07 +0.000000E+00 +0.000000E+00 +1.200000E-02 +5.000000E-05 +2.602864E-03 +4.471106E-06 +4.677566E-03 +1.033338E-05 +3.640584E-03 +3.605122E-06 +4.845169E-03 +8.244364E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +3.700000E-05 +3.786358E-03 +5.908272E-06 +3.416266E-03 +7.032934E-06 +3.353945E-03 +5.140933E-06 +4.261660E-03 +4.981501E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.136905E-04 +1.883305E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.700000E-02 +2.090000E-04 +7.046302E-03 +1.594429E-05 +6.489218E-03 +1.057182E-05 +5.057204E-03 +8.269888E-06 +1.274541E-02 +3.591083E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.503843E-03 +2.261544E-06 +3.000000E-03 +5.000000E-06 +3.434984E-04 +2.731822E-07 +-1.911976E-04 +2.018778E-08 +-5.635206E-04 +2.075189E-07 +2.764973E-03 +3.917274E-06 +2.000000E-03 +2.000000E-06 +1.802029E-03 +1.623906E-06 +1.435858E-03 +1.032682E-06 +9.559957E-04 +4.622600E-07 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.540000E-04 +1.210267E-02 +4.180540E-05 +5.431699E-03 +2.284317E-05 +6.108638E-03 +1.136078E-05 +1.309420E-02 +3.810504E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.124312E-04 +1.875678E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.044609E-04 +3.653729E-07 +1.000000E-03 +1.000000E-06 +9.341546E-04 +8.726448E-07 +8.089673E-04 +6.544280E-07 +6.367311E-04 +4.054265E-07 +3.022304E-04 +9.134324E-08 +2.100000E-02 +9.900000E-05 +1.206996E-02 +4.033646E-05 +6.345510E-03 +1.603169E-05 +1.976558E-03 +4.386164E-06 +1.001209E-02 +2.316074E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.815901E-03 +1.829916E-06 +2.000000E-03 +2.000000E-06 +1.977802E-03 +1.955858E-06 +1.933788E-03 +1.869841E-06 +1.868714E-03 +1.746332E-06 +0.000000E+00 +0.000000E+00 +1.100000E-02 +3.900000E-05 +2.604154E-03 +9.668124E-06 +1.503936E-04 +1.170450E-06 +5.645599E-04 +1.841604E-06 +5.455481E-03 +1.116233E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +1.000000E-03 +1.000000E-06 +9.936377E-04 +9.873159E-07 +9.809739E-04 +9.623097E-07 +9.621293E-04 +9.256927E-07 +0.000000E+00 +0.000000E+00 +4.100000E-02 +3.610000E-04 +1.275568E-02 +3.756672E-05 +7.436840E-03 +1.784918E-05 +6.238119E-03 +1.114039E-05 +1.706095E-02 +6.393171E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.510747E-03 +8.216143E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.500000E-02 +1.570000E-04 +4.743361E-03 +1.500512E-05 +2.243747E-03 +1.216909E-05 +6.504387E-04 +5.012686E-06 +1.369930E-02 +4.220232E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.124312E-04 +1.875678E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.205998E-03 +7.272200E-07 +2.000000E-03 +2.000000E-06 +1.935082E-03 +1.872342E-06 +1.808514E-03 +1.635965E-06 +1.626644E-03 +1.325172E-06 +0.000000E+00 +0.000000E+00 +1.800000E-02 +1.180000E-04 +6.144587E-03 +1.810176E-05 +3.517233E-03 +7.894223E-06 +5.434668E-03 +1.689927E-05 +7.002945E-03 +1.633731E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.111025E-04 +2.767076E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-03 +1.400000E-05 +2.937841E-03 +3.083257E-06 +1.316488E-03 +1.378720E-06 +1.917209E-03 +1.388887E-06 +2.434865E-03 +1.665821E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.100000E-02 +4.290000E-04 +1.555575E-02 +6.845536E-05 +1.492622E-02 +7.523417E-05 +4.779064E-03 +1.568962E-05 +1.858109E-02 +9.770216E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +1.000000E-03 +1.000000E-06 +-7.961895E-04 +6.339178E-07 +4.508767E-04 +2.032898E-07 +-6.751245E-05 +4.557931E-09 +2.105380E-03 +4.432627E-06 +1.000000E-03 +1.000000E-06 +7.706275E-04 +5.938667E-07 +3.908001E-04 +1.527247E-07 +-1.181620E-05 +1.396226E-10 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.870000E-04 +8.530317E-03 +2.513821E-05 +2.769866E-03 +1.832987E-06 +3.367000E-03 +3.408158E-06 +1.029151E-02 +3.475479E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.110000E-04 +1.493458E-02 +4.520237E-05 +8.130453E-03 +1.434362E-05 +5.917132E-03 +7.829616E-06 +1.005025E-02 +2.033292E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -83,14 +1083,14 @@ tally 1: 0.000000E+00 7.000000E-03 1.100000E-05 --2.517807E-05 -3.415722E-06 -1.479050E-03 -1.509604E-06 --4.624719E-04 -1.787423E-06 -3.839667E-03 -3.396077E-06 +2.102923E-03 +3.237003E-06 +5.338761E-04 +1.665334E-06 +2.177563E-03 +1.210407E-06 +3.049393E-03 +2.236660E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -99,18 +1099,78 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.038170E-04 -9.230477E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.300000E-02 +2.470000E-04 +1.392809E-02 +4.644694E-05 +6.658849E-03 +2.448402E-05 +2.971606E-03 +4.596585E-06 +1.583003E-02 +5.281056E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.146617E-04 +4.615975E-07 1.000000E-03 1.000000E-06 -2.553692E-04 -6.521341E-08 --4.021799E-04 -1.617487E-07 --3.414200E-04 -1.165676E-07 -2.962222E-04 -8.774759E-08 +5.742336E-04 +3.297442E-07 +-5.383652E-06 +2.898371E-11 +-3.879749E-04 +1.505245E-07 +1.213130E-03 +5.521442E-07 +2.000000E-03 +2.000000E-06 +1.895662E-03 +1.796999E-06 +1.695499E-03 +1.439233E-06 +1.415735E-03 +1.008516E-06 +3.007686E-04 +9.046177E-08 +4.000000E-02 +3.460000E-04 +1.325054E-02 +4.611581E-05 +4.279513E-03 +1.445432E-05 +5.681074E-03 +8.701686E-06 +1.883326E-02 +7.820565E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -119,62 +1179,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.200000E-02 -1.140000E-04 -1.358164E-03 -1.242643E-05 -1.986239E-05 -5.467378E-06 -1.233135E-03 -7.603089E-06 -9.455567E-03 -1.937818E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +9.052295E-04 +4.558347E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -183,8 +1189,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.525429E-03 +8.388512E-07 +3.000000E-03 +3.000000E-06 +2.694249E-03 +2.442268E-06 +2.163402E-03 +1.718872E-06 +1.541834E-03 +1.227757E-06 0.000000E+00 0.000000E+00 +2.000000E-02 +1.000000E-04 +5.928221E-03 +9.217060E-06 +5.152240E-03 +1.183310E-05 +2.057268E-03 +2.929338E-06 +9.478909E-03 +2.313196E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -193,6 +1219,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.057201E-04 +1.834492E-07 +1.000000E-03 +1.000000E-06 +9.405199E-04 +8.845778E-07 +8.268666E-04 +6.837084E-07 +6.691277E-04 +4.477318E-07 +6.124312E-04 +1.875678E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -201,16 +1239,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +6.124312E-04 +1.875678E-07 1.400000E-02 5.200000E-05 -4.571175E-03 -9.190534E-06 -4.041031E-03 -5.995154E-06 -2.577281E-04 -1.101532E-06 -8.329519E-03 -1.844018E-05 +6.537971E-03 +1.724690E-05 +3.839523E-03 +8.693753E-06 +4.048043E-03 +5.450370E-06 +7.581656E-03 +1.459334E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -229,68 +1269,208 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-03 -1.000000E-05 -4.520960E-04 -2.298902E-06 -4.635765E-04 -2.661361E-07 --3.704326E-04 -7.038297E-08 -2.349751E-03 -4.331174E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.215268E-03 -1.476876E-06 +6.069794E-04 +3.684240E-07 1.000000E-03 1.000000E-06 -9.835700E-04 -9.674099E-07 -9.511149E-04 -9.046195E-07 -9.034334E-04 -8.161919E-07 +5.703488E-04 +3.252978E-07 +-1.205336E-05 +1.452836E-10 +-3.916902E-04 +1.534212E-07 0.000000E+00 0.000000E+00 +3.200000E-02 +2.340000E-04 +1.368605E-02 +4.005184E-05 +6.894848E-03 +1.073483E-05 +5.553663E-03 +7.001843E-06 +1.492310E-02 +4.851599E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.224455E-03 +5.613642E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.800000E-02 +1.860000E-04 +1.044511E-02 +6.915901E-05 +6.444951E-03 +3.586496E-05 +5.196826E-03 +1.312451E-05 +1.156517E-02 +3.164422E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.057201E-04 +1.834492E-07 1.000000E-03 1.000000E-06 -9.302087E-04 -8.652883E-07 -7.979324E-04 -6.366961E-07 -6.169336E-04 -3.806071E-07 -5.774597E-04 -3.334597E-07 +-6.535773E-04 +4.271632E-07 +1.407448E-04 +1.980911E-08 +2.824055E-04 +7.975284E-08 +1.822205E-03 +1.106831E-06 +2.000000E-03 +2.000000E-06 +1.954998E-03 +1.911525E-06 +1.867287E-03 +1.747820E-06 +1.741309E-03 +1.532659E-06 +0.000000E+00 +0.000000E+00 +1.900000E-02 +1.010000E-04 +1.062788E-02 +3.182295E-05 +6.707513E-03 +1.259151E-05 +6.889024E-03 +1.429877E-05 +8.202036E-03 +2.430378E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.500000E-02 +4.500000E-05 +3.192578E-03 +7.201112E-06 +4.457942E-03 +6.346144E-06 +3.572536E-03 +4.921318E-06 +7.292620E-03 +1.123722E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.111025E-04 +2.767076E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.069794E-04 +3.684240E-07 +1.000000E-03 +1.000000E-06 +9.537549E-04 +9.096483E-07 +8.644725E-04 +7.473127E-07 +7.383215E-04 +5.451186E-07 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.310000E-04 +7.696543E-03 +2.602323E-05 +5.553275E-03 +1.677303E-05 +3.110421E-03 +1.605284E-05 +1.157943E-02 +3.065139E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.000000E-03 +1.000000E-06 +-1.849356E-05 +3.420117E-10 +-4.994870E-04 +2.494872E-07 +2.772452E-05 +7.686492E-10 +9.104691E-04 +8.289540E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -301,6 +1481,466 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.600000E-02 +1.460000E-04 +1.097600E-02 +2.696995E-05 +8.425033E-03 +2.480653E-05 +3.259803E-03 +4.519527E-06 +1.278442E-02 +3.571130E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.600000E-02 +6.000000E-05 +2.471171E-03 +8.220215E-06 +2.563821E-04 +8.785791E-07 +1.300883E-03 +3.079168E-06 +7.314002E-03 +1.134821E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.022304E-04 +9.134324E-08 +1.000000E-03 +1.000000E-06 +-5.657444E-04 +3.200667E-07 +-1.989995E-05 +3.960081E-10 +3.959267E-04 +1.567580E-07 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.800000E-05 +5.436075E-03 +7.868978E-06 +2.425522E-03 +1.963607E-06 +7.168734E-04 +1.273978E-06 +4.589694E-03 +5.548791E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.100000E-02 +1.070000E-04 +7.539735E-03 +2.068189E-05 +3.936810E-03 +7.972494E-06 +2.420366E-04 +1.148364E-06 +9.428594E-03 +2.131421E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.053824E-04 +9.325841E-08 +2.000000E-03 +2.000000E-06 +1.606787E-04 +1.589809E-06 +1.384713E-03 +1.050316E-06 +7.117279E-04 +6.789060E-07 +9.257840E-04 +4.781566E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.600000E-02 +5.100000E-04 +1.468472E-02 +4.705766E-05 +8.285657E-03 +2.501121E-05 +5.066048E-03 +7.892505E-06 +1.769628E-02 +7.226941E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.216485E-03 +5.564829E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.130000E-04 +9.030313E-03 +2.036594E-05 +5.561323E-03 +2.088769E-05 +3.949070E-03 +5.399490E-06 +1.065996E-02 +2.405722E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.124312E-04 +1.875678E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.044609E-04 +3.653729E-07 +1.000000E-03 +1.000000E-06 +9.969425E-04 +9.938944E-07 +9.908416E-04 +9.817670E-07 +9.817251E-04 +9.637842E-07 +0.000000E+00 +0.000000E+00 +1.300000E-02 +4.300000E-05 +1.119189E-03 +4.668647E-06 +-1.976393E-04 +4.632517E-06 +2.358914E-03 +3.047107E-06 +6.688330E-03 +1.125860E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.000000E-03 +1.000000E-06 +-3.353539E-04 +1.124622E-07 +-3.313067E-04 +1.097641E-07 +4.087442E-04 +1.670718E-07 +9.161472E-04 +8.393257E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.980000E-04 +1.024848E-02 +3.100622E-05 +-1.145555E-04 +2.521646E-06 +1.453177E-03 +1.505423E-06 +1.124135E-02 +3.412415E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.029991E-04 +1.818050E-07 +1.000000E-03 +1.000000E-06 +-2.499079E-04 +6.245395E-08 +-4.063191E-04 +1.650952E-07 +3.358425E-04 +1.127902E-07 +6.044609E-04 +3.653729E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +8.700000E-05 +6.743817E-03 +2.313239E-05 +1.353852E-03 +7.358462E-06 +3.054381E-03 +5.051576E-06 +7.932519E-03 +1.438883E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +9.000000E-05 +4.678519E-03 +8.162854E-06 +2.588181E-03 +7.958110E-06 +2.322176E-03 +3.426024E-06 +8.534070E-03 +1.767419E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.029991E-04 +1.818050E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +3.300000E-05 +7.244624E-03 +1.778235E-05 +2.926133E-03 +9.287629E-06 +9.851866E-04 +6.097573E-06 +3.660351E-03 +3.716102E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.034897E-04 +9.210600E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.053824E-04 +9.325841E-08 +1.000000E-03 +1.000000E-06 +1.744930E-04 +3.044781E-08 +-4.543283E-04 +2.064142E-07 +-2.484572E-04 +6.173098E-08 +0.000000E+00 +0.000000E+00 +1.000000E-02 +2.600000E-05 +3.641369E-03 +6.818931E-06 +2.110606E-03 +2.176630E-06 +1.892973E-03 +1.812944E-06 +5.777456E-03 +9.494012E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.034897E-04 +9.210600E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -322,15 +1962,15 @@ tally 1: 0.000000E+00 0.000000E+00 1.300000E-02 -4.700000E-05 -6.197649E-03 -1.101082E-05 -5.066781E-03 -9.709157E-06 -2.134240E-03 -1.351796E-06 -5.604113E-03 -8.598750E-06 +3.900000E-05 +1.682557E-03 +1.846926E-06 +4.172846E-04 +1.892148E-06 +7.276646E-04 +1.085417E-06 +6.092709E-03 +8.907893E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -339,48 +1979,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.000000E-05 --9.379228E-05 -1.179295E-06 -1.623379E-03 -1.703479E-06 --8.659077E-05 -7.366687E-07 -2.943759E-03 -2.593311E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 +3.053824E-04 +9.325841E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -403,14 +2003,14 @@ tally 1: 0.000000E+00 5.000000E-03 7.000000E-06 -2.431919E-03 -1.726875E-06 --5.793826E-04 -1.604970E-07 --1.845208E-03 -8.995877E-07 -1.788227E-03 -8.910514E-07 +1.580450E-03 +1.753085E-06 +3.349602E-04 +3.639488E-07 +2.690006E-04 +2.374932E-07 +1.830811E-03 +9.321096E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -419,6 +2019,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -447,6 +2049,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.034897E-04 +9.210600E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -477,380 +2081,56 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.900000E-02 +1.250000E-04 +2.138118E-03 +8.791773E-06 +2.868574E-03 +9.339641E-06 +5.807501E-04 +1.660344E-06 +8.165982E-03 +2.226036E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.000000E-02 -1.940000E-04 -9.461264E-03 -1.947969E-05 -3.587007E-03 -6.174074E-06 -4.090547E-03 -7.913444E-06 -1.296390E-02 -3.766012E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.793837E-04 -2.578025E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.044609E-04 +3.653729E-07 1.000000E-03 1.000000E-06 --8.123463E-04 -6.599064E-07 -4.898597E-04 -2.399625E-07 --1.216619E-04 -1.480163E-08 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-02 -6.500000E-05 -3.611706E-03 -1.040980E-05 -9.737058E-04 -4.485811E-06 --7.198322E-05 -1.665155E-06 -7.644305E-03 -1.681345E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -1.000000E-03 -1.000000E-06 -9.957690E-04 -9.915560E-07 -9.873340E-04 -9.748284E-07 -9.747484E-04 -9.501344E-07 -0.000000E+00 -0.000000E+00 -1.300000E-02 -4.500000E-05 -3.079966E-03 -9.332877E-06 -1.443410E-03 -2.514831E-06 -1.111923E-03 -1.429512E-06 -6.483010E-03 -9.477194E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.937562E-04 -2.663195E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.370200E-04 -7.006024E-07 -5.509036E-04 -3.034948E-07 -2.105156E-04 -4.431682E-08 -3.038170E-04 -9.230477E-08 -9.000000E-03 -1.900000E-05 --2.021899E-04 -8.445484E-06 -2.148061E-03 -2.701015E-06 -1.264629E-03 -5.949953E-07 -4.409634E-03 -5.032698E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -9.987845E-04 -9.975704E-07 -9.963556E-04 -9.927245E-07 -9.927178E-04 -9.854887E-07 -0.000000E+00 -0.000000E+00 -3.300000E-02 -2.270000E-04 -1.837920E-02 -7.801676E-05 -1.150357E-02 -2.715434E-05 -5.741625E-03 -6.838179E-06 -1.540397E-02 -4.998202E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -1.000000E-03 -1.000000E-06 -5.247170E-04 -2.753280E-07 --8.700807E-05 -7.570404E-09 --4.259024E-04 -1.813928E-07 -1.196497E-03 -7.159790E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.500000E-02 -1.430000E-04 -8.404687E-03 -2.505155E-05 -6.898191E-03 -1.367706E-05 -3.899114E-03 -3.607028E-06 -1.271358E-02 -3.382031E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -1.940000E-04 -1.736738E-02 -7.398587E-05 -7.729434E-03 -1.773562E-05 -4.523718E-03 -5.898914E-06 -1.567397E-02 -5.134448E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -2.300000E-05 --7.007722E-04 -2.822943E-06 --5.777080E-04 -9.868563E-07 -1.257117E-03 -3.672741E-07 -5.315767E-03 -6.276521E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.400000E-02 -1.220000E-04 -1.229985E-02 -3.184724E-05 -1.060332E-02 -2.381543E-05 -7.803741E-03 -1.463189E-05 -1.117224E-02 -2.961846E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.480499E-03 -6.139848E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.822902E-03 -3.322972E-06 -2.000000E-03 -4.000000E-06 -1.879286E-03 -3.531714E-06 -1.649674E-03 -2.721425E-06 -1.333434E-03 -1.778047E-06 +2.312419E-04 +5.347280E-08 +-4.197908E-04 +1.762243E-07 +-3.159499E-04 +9.982435E-08 0.000000E+00 0.000000E+00 2.100000E-02 -1.010000E-04 -8.226424E-03 -1.799176E-05 -6.115955E-03 -1.432832E-05 -5.108113E-03 -8.009589E-06 -1.030852E-02 -2.790767E-05 +1.070000E-04 +2.216472E-03 +6.388960E-06 +4.896969E-03 +6.428816E-06 +2.155707E-03 +2.884510E-06 +1.038058E-02 +2.477423E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -859,38 +2139,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.861614E-04 -2.617623E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.661896E-04 -7.502844E-07 +3.007686E-04 +9.046177E-08 1.000000E-03 1.000000E-06 -8.824739E-04 -7.787602E-07 -6.681402E-04 -4.464114E-07 -3.943779E-04 -1.555340E-07 -2.887299E-04 -8.336493E-08 -2.400000E-02 -1.340000E-04 -5.157290E-03 -7.361769E-06 -3.873191E-03 -7.075290E-06 -8.178477E-04 -5.349982E-06 -1.151979E-02 -2.707490E-05 +7.019813E-04 +4.927778E-07 +2.391667E-04 +5.720072E-08 +-1.881699E-04 +3.540793E-08 +2.131373E-03 +2.696833E-06 +1.000000E-03 +1.000000E-06 +9.937981E-04 +9.876347E-07 +9.814521E-04 +9.632483E-07 +9.630767E-04 +9.275168E-07 +0.000000E+00 +0.000000E+00 +6.000000E-03 +1.000000E-05 +2.774441E-03 +2.455060E-06 +-4.125360E-04 +1.557128E-06 +-9.369606E-04 +2.349382E-06 +3.666415E-03 +4.871762E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -899,8 +2179,20 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -8.880544E-04 -2.629944E-07 +6.057201E-04 +1.834492E-07 +1.000000E-03 +1.000000E-06 +8.429685E-04 +7.105959E-07 +5.658938E-04 +3.202358E-07 +2.330721E-04 +5.432261E-08 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -909,28 +2201,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.362820E-03 -2.089719E-06 3.000000E-03 -3.000000E-06 -2.788384E-03 -2.594798E-06 -2.392197E-03 -1.932048E-06 -1.861371E-03 -1.235196E-06 +5.000000E-06 +1.596397E-03 +1.275630E-06 +4.822532E-04 +1.627925E-07 +2.983020E-04 +9.401537E-08 +1.221939E-03 +7.467452E-07 0.000000E+00 0.000000E+00 -1.000000E-02 -3.600000E-05 -1.316990E-03 -3.149836E-06 --3.200310E-04 -2.746500E-07 --1.360513E-03 -1.090571E-06 -4.126370E-03 -6.612189E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -939,8 +2221,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.038170E-04 -9.230477E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -961,296 +2241,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.700000E-02 -1.810000E-04 -9.818267E-03 -4.983755E-05 -3.336597E-03 -8.390727E-06 -2.160979E-03 -5.064669E-06 -1.384908E-02 -4.570937E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.925469E-04 -1.756697E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.832949E-04 -7.802099E-07 -1.000000E-03 -1.000000E-06 -2.811985E-04 -7.907261E-08 --3.813911E-04 -1.454592E-07 --3.662100E-04 -1.341098E-07 -0.000000E+00 -0.000000E+00 -3.100000E-02 -2.130000E-04 -1.202681E-02 -3.022795E-05 -7.515466E-03 -1.650504E-05 -5.404032E-03 -1.127927E-05 -1.330371E-02 -4.078117E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -3.000000E-03 -3.000000E-06 -2.638441E-04 -1.166669E-06 -2.500034E-04 -9.610467E-07 -1.533129E-03 -8.706796E-07 -1.174177E-03 -5.193538E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.800000E-02 -2.980000E-04 -1.429526E-02 -5.478450E-05 -1.510549E-03 -2.039833E-05 -5.571300E-03 -7.961775E-06 -1.713980E-02 -6.035252E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.804596E-04 -2.584372E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.774597E-04 -3.334597E-07 -2.000000E-03 -4.000000E-06 -1.885369E-03 -3.554618E-06 -1.668235E-03 -2.783008E-06 -1.371259E-03 -1.880351E-06 -2.887299E-04 -8.336493E-08 -1.800000E-02 -7.600000E-05 -1.188269E-02 -3.305188E-05 -6.397672E-03 -1.039477E-05 -5.195583E-03 -8.228666E-06 -6.541819E-03 -1.138522E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.800000E-02 -1.920000E-04 -9.138883E-03 -2.389639E-05 -8.073407E-03 -1.777984E-05 -4.397066E-03 -1.246700E-05 -1.396848E-02 -4.880190E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.184277E-03 -3.507420E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.888633E-04 -3.467599E-07 -1.000000E-03 -1.000000E-06 -9.872275E-04 -9.746182E-07 -9.619273E-04 -9.253040E-07 -9.245834E-04 -8.548545E-07 -0.000000E+00 -0.000000E+00 -2.800000E-02 -1.960000E-04 -9.225605E-03 -2.308636E-05 -5.671475E-03 -8.733020E-06 -2.978790E-03 -7.550647E-06 -1.623921E-02 -6.654244E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --2.171929E-04 -4.717275E-08 --4.292409E-04 -1.842477E-07 -3.001754E-04 -9.010526E-08 -5.982486E-04 -1.789948E-07 -1.000000E-03 -1.000000E-06 -9.264912E-04 -8.583859E-07 -7.875789E-04 -6.202805E-07 -5.984807E-04 -3.581791E-07 -0.000000E+00 -0.000000E+00 -4.000000E-02 -3.760000E-04 -1.836389E-02 -1.034063E-04 -1.618617E-02 -7.468163E-05 -1.265008E-02 -4.683455E-05 -1.680380E-02 -6.300115E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.481316E-03 -7.904264E-07 -1.000000E-03 -1.000000E-06 --7.356303E-04 -5.411519E-07 -3.117279E-04 -9.717427E-08 -1.082261E-04 -1.171288E-08 -5.888633E-04 -3.467599E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 8.000000E-03 -2.200000E-05 -1.034121E-03 -5.652456E-07 --8.248086E-04 -1.478042E-06 --7.162554E-04 -2.662167E-07 -4.452971E-03 -6.246366E-06 +4.000000E-05 +-7.915490E-05 +1.150292E-07 +2.293529E-03 +2.932682E-06 +1.356149E-03 +9.471925E-07 +4.579650E-03 +7.918475E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1259,8 +2259,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.899392E-04 -1.740147E-07 +3.022304E-04 +9.134324E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1281,296 +2281,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.700000E-02 -1.650000E-04 -1.022719E-02 -3.691933E-05 -8.344427E-03 -2.163687E-05 -2.493470E-03 -3.777443E-06 -1.562097E-02 -5.500554E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -1.000000E-03 -1.000000E-06 --2.406040E-04 -5.789029E-08 --4.131646E-04 -1.707050E-07 -3.260844E-04 -1.063311E-07 -2.628743E-03 -4.454101E-06 -1.000000E-03 -1.000000E-06 -8.584065E-04 -7.368618E-07 -6.052926E-04 -3.663792E-07 -2.937076E-04 -8.626413E-08 -2.887299E-04 -8.336493E-08 -2.400000E-02 -1.460000E-04 -1.482825E-02 -6.559075E-05 -7.894674E-03 -1.733357E-05 -4.942543E-03 -5.919157E-06 -9.954930E-03 -2.766286E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.887299E-04 -8.336493E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -9.637579E-04 -9.288293E-07 -8.932439E-04 -7.978848E-07 -7.922796E-04 -6.277069E-07 -0.000000E+00 -0.000000E+00 -2.800000E-02 -2.080000E-04 -9.690534E-03 -3.443096E-05 -4.888498E-03 -1.094678E-05 -2.994444E-03 -6.032009E-06 -1.236682E-02 -3.585861E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.191871E-03 -5.399087E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.832949E-04 -7.802099E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -3.100000E-05 -6.119200E-03 -1.291899E-05 -5.129096E-03 -1.114323E-05 -4.761296E-03 -9.710486E-06 -3.829174E-03 -6.324914E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.944316E-04 -8.668999E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.774597E-04 -3.334597E-07 -1.000000E-03 -1.000000E-06 -9.885814E-04 -9.772933E-07 -9.659399E-04 -9.330399E-07 -9.324628E-04 -8.694869E-07 -0.000000E+00 -0.000000E+00 -2.300000E-02 -1.270000E-04 -5.315630E-03 -1.185056E-05 -2.837051E-03 -6.724635E-06 -2.570238E-03 -6.855367E-06 -1.266746E-02 -3.785511E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.031416E-04 -4.565438E-07 -1.000000E-03 -1.000000E-06 -9.914618E-04 -9.829965E-07 -9.744947E-04 -9.496400E-07 -9.493160E-04 -9.012008E-07 -0.000000E+00 -0.000000E+00 -9.000000E-03 -2.900000E-05 -2.008698E-03 -7.210242E-06 -1.288698E-03 -6.087002E-07 --5.193923E-04 -4.491465E-07 -3.876462E-03 -4.440238E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.700000E-02 -2.030000E-04 -1.013137E-02 -3.117050E-05 -3.372227E-03 -8.195716E-06 -3.788344E-03 -6.816175E-06 -1.323056E-02 -4.179593E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.183098E-03 -8.764183E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.500688E-04 -7.226169E-07 -5.839254E-04 -3.409689E-07 -2.605821E-04 -6.790302E-08 -0.000000E+00 -0.000000E+00 1.100000E-02 -2.700000E-05 -7.820374E-03 -1.524804E-05 -4.579486E-03 -8.746643E-06 -3.441507E-03 -5.197609E-06 -4.452744E-03 -4.715167E-06 +3.300000E-05 +5.093647E-03 +1.217545E-05 +1.852586E-03 +4.478970E-06 +9.768799E-04 +1.395189E-06 +4.578572E-03 +5.491453E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1579,8 +2299,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.887299E-04 -8.336493E-08 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1589,388 +2309,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.774597E-04 -3.334597E-07 +3.053824E-04 +9.325841E-08 1.000000E-03 1.000000E-06 -9.729463E-04 -9.466245E-07 -9.199368E-04 -8.462837E-07 -8.431176E-04 -7.108474E-07 -0.000000E+00 -0.000000E+00 -3.800000E-02 -3.240000E-04 -1.253787E-02 -4.293627E-05 -1.235024E-02 -4.427860E-05 -1.055055E-02 -3.831635E-05 -1.944951E-02 -9.030483E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.944316E-04 -8.668999E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.600000E-02 -1.500000E-04 -5.912427E-03 -8.576381E-06 -6.340156E-03 -2.278116E-05 -1.617551E-03 -6.023906E-06 -1.264835E-02 -3.597963E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.804596E-04 -2.584372E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.300000E-02 -1.230000E-04 -4.119009E-03 -9.246641E-06 -5.235271E-03 -1.144493E-05 --4.185262E-04 -5.960141E-06 -1.208764E-02 -3.425774E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -1.000000E-03 -1.000000E-06 -8.637115E-04 -7.459975E-07 -6.189963E-04 -3.831564E-07 -3.152494E-04 -9.938217E-08 -0.000000E+00 -0.000000E+00 -1.500000E-02 -5.700000E-05 --1.957197E-03 -1.258480E-05 -2.792528E-03 -9.542338E-06 --3.511546E-04 -3.064697E-06 -6.238135E-03 -9.183145E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.200000E-02 -1.080000E-04 -9.763854E-03 -2.367740E-05 -4.590661E-03 -6.936237E-06 -2.901204E-03 -1.887464E-06 -1.005417E-02 -2.274048E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -1.000000E-03 -1.000000E-06 --2.499079E-04 -6.245395E-08 --4.063191E-04 -1.650952E-07 -3.358425E-04 -1.127902E-07 -1.185094E-03 -7.026788E-07 -1.000000E-03 -1.000000E-06 -9.786988E-04 -9.578514E-07 -9.367771E-04 -8.775513E-07 -8.755719E-04 -7.666261E-07 -3.038170E-04 -9.230477E-08 -2.000000E-02 -9.800000E-05 -7.857549E-03 -1.428798E-05 -5.459113E-03 -9.636925E-06 -1.887884E-03 -1.537243E-06 -1.001700E-02 -2.607271E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.800000E-02 -8.200000E-05 -8.495126E-03 -2.651261E-05 -4.998924E-03 -1.299981E-05 -3.448762E-03 -4.943207E-06 -8.610805E-03 -1.917491E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.038562E-04 -4.569667E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.200000E-05 -3.227340E-03 -4.394334E-06 -2.414906E-03 -2.934558E-06 -3.208300E-03 -3.506847E-06 -3.262105E-03 -4.123831E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.200000E-02 -5.400000E-05 -4.005144E-03 -5.369960E-06 -4.643787E-03 -9.269182E-06 -2.657135E-03 -3.511892E-06 -4.987572E-03 -8.363876E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +9.817451E-04 +9.638234E-07 +9.457351E-04 +8.944149E-07 +8.929546E-04 +7.973680E-07 0.000000E+00 0.000000E+00 4.000000E-03 -6.000000E-06 -1.406973E-03 -2.042054E-06 -1.350269E-03 -1.571414E-06 -1.514228E-03 -1.025767E-06 -1.776109E-03 -1.051978E-06 +4.000000E-06 +-1.284380E-03 +9.356368E-07 +-5.965448E-04 +6.643272E-07 +3.352677E-04 +2.956621E-07 +1.526686E-03 +6.527074E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2003,374 +2363,14 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 --9.859558E-04 -9.721088E-07 -9.581632E-04 -9.180766E-07 --9.172070E-04 -8.412686E-07 -1.487277E-03 -7.925940E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -1.300000E-05 -1.259188E-03 -2.542709E-06 -1.153212E-03 -5.113126E-07 -1.180102E-03 -1.512230E-06 -2.952791E-03 -2.256416E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -2.900000E-05 -3.658677E-03 -5.084397E-06 -1.342768E-03 -7.844439E-07 -1.434698E-03 -1.591990E-06 -4.727265E-03 -6.802376E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-03 -6.000000E-06 --3.169496E-04 -4.640012E-07 -3.870584E-04 -1.106745E-06 -2.229627E-03 -2.248204E-06 -2.384967E-03 -3.528132E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.887299E-04 -8.336493E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-03 -2.000000E-06 -1.104635E-03 -1.006490E-06 -5.097352E-04 -1.218176E-06 -8.274440E-04 -9.952021E-07 -8.879520E-04 -4.383151E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.400000E-02 -4.200000E-05 -3.129225E-03 -5.993671E-06 -4.628419E-03 -5.138563E-06 -2.799257E-03 -6.824571E-06 -6.214149E-03 -8.661850E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.962222E-04 -8.774759E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.200000E-02 -3.800000E-05 -4.480587E-03 -8.674795E-06 -3.647946E-03 -4.377407E-06 -3.360220E-03 -5.133585E-06 -7.650887E-03 -1.640283E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -3.100000E-05 -4.975831E-03 -8.184805E-06 -2.183561E-03 -2.575450E-06 -2.014752E-03 -5.318808E-06 -3.529684E-03 -5.223931E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.832949E-04 -7.802099E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +-3.965739E-04 +1.572709E-07 +-2.640937E-04 +6.974547E-08 +4.389371E-04 +1.926657E-07 +3.053824E-04 +9.325841E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2402,11 +2402,11 @@ tally 1: 0.000000E+00 0.000000E+00 tally 2: -5.604521E-01 -6.286639E-02 -6.095321E-01 -7.435628E-02 -3.539776E+00 -2.507806E+00 -3.963740E+01 -3.144698E+02 +5.720364E-01 +6.548043E-02 +6.217988E-01 +7.736906E-02 +3.624477E+00 +2.628737E+00 +4.047526E+01 +3.278231E+02 diff --git a/tests/test_statepoint_batch/results_true.dat b/tests/test_statepoint_batch/results_true.dat index 786fd55461..95b536997e 100644 --- a/tests/test_statepoint_batch/results_true.dat +++ b/tests/test_statepoint_batch/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.109090E-01 5.807935E-03 +3.051173E-01 6.930168E-04 diff --git a/tests/test_statepoint_interval/results_true.dat b/tests/test_statepoint_interval/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_statepoint_interval/results_true.dat +++ b/tests/test_statepoint_interval/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_statepoint_restart/results_true.dat b/tests/test_statepoint_restart/results_true.dat index 378d07639f..7fb39ef0ac 100644 --- a/tests/test_statepoint_restart/results_true.dat +++ b/tests/test_statepoint_restart/results_true.dat @@ -1,16 +1,36 @@ k-combined: 0.000000E+00 0.000000E+00 tally 1: -6.000000E-03 -2.600000E-05 -3.531902E-03 -1.021953E-05 -9.975346E-04 -1.809348E-06 -1.606025E-04 -5.146498E-07 -3.612566E-03 -7.304701E-06 +1.000000E-03 +1.000000E-06 +6.655302E-04 +4.429305E-07 +1.643958E-04 +2.702597E-08 +-2.613362E-04 +6.829663E-08 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -23,2034 +43,174 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 --6.834146E-04 -4.670555E-07 -2.005832E-04 -4.023363E-08 -2.271406E-04 -5.159283E-08 -1.822902E-03 -3.322972E-06 -3.000000E-03 -9.000000E-06 -2.089393E-03 -4.365565E-06 -1.135864E-03 -1.290186E-06 -8.092128E-04 -6.548254E-07 +3.222834E-05 +1.038666E-09 +-4.984420E-04 +2.484444E-07 +-4.825883E-05 +2.328915E-09 +1.221939E-03 +7.467452E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-5.510082E-04 +3.036101E-07 +-4.458491E-05 +1.987814E-09 +4.082832E-04 +1.666952E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-03 +2.000000E-05 +-1.959329E-04 +1.780222E-06 +-1.481510E-03 +1.429609E-06 +2.196341E-04 +1.036368E-06 +3.355616E-03 +5.662237E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 9.000000E-03 4.100000E-05 -5.652386E-03 -1.597604E-05 -2.688047E-03 -3.713200E-06 -2.194373E-03 -2.457094E-06 -4.490780E-03 -1.011172E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -2.287185E-05 -1.868964E-06 -1.070450E-03 -8.923889E-07 -6.823621E-04 -7.961600E-07 -1.494157E-03 -1.155142E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -4.500000E-05 --5.457243E-04 -9.054533E-06 --4.642719E-04 -6.489071E-07 -4.050968E-04 -1.775928E-06 -3.579329E-03 -7.065658E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -2.500000E-05 -3.948480E-03 -7.932459E-06 -1.825370E-03 -1.929280E-06 -9.348098E-04 -5.448323E-07 -4.195272E-03 -8.801845E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.215268E-03 -1.476876E-06 -1.000000E-03 -1.000000E-06 -9.835700E-04 -9.674099E-07 -9.511149E-04 -9.046195E-07 -9.034334E-04 -8.161919E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.000000E-05 -2.837861E-03 -4.029451E-06 -2.881422E-03 -5.264923E-06 -6.079138E-04 -2.481989E-07 -2.380679E-03 -3.512909E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --3.562118E-04 -1.268868E-07 --3.096697E-04 -9.589534E-08 -4.213212E-04 -1.775116E-07 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -1.625863E-03 -1.397973E-06 --7.273518E-05 -2.624738E-08 --9.756535E-04 -5.212160E-07 -9.031416E-04 -4.565438E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.200000E-05 -3.200356E-03 -6.305597E-06 -4.448554E-04 -8.305799E-07 --1.337748E-04 -7.137799E-07 -4.794597E-03 -1.149629E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --8.123463E-04 -6.599064E-07 -4.898597E-04 -2.399625E-07 --1.216619E-04 -1.480163E-08 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -3.600000E-05 -2.521971E-03 -6.360336E-06 -2.020703E-03 -4.083242E-06 -4.407398E-04 -1.942515E-07 -2.955076E-03 -8.732472E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -2.500000E-05 -3.210520E-03 -7.168481E-06 -5.465390E-04 -2.109809E-06 -2.437003E-04 -7.534680E-07 -2.397298E-03 -2.874072E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.370200E-04 -7.006024E-07 -5.509036E-04 -3.034948E-07 -2.105156E-04 -4.431682E-08 -3.038170E-04 -9.230477E-08 -3.000000E-03 -5.000000E-06 --5.652293E-04 -2.826536E-07 --4.965795E-04 -1.814108E-07 -4.241721E-04 -1.785027E-07 -1.494157E-03 -1.155142E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -9.987845E-04 -9.975704E-07 -9.963556E-04 -9.927245E-07 -9.927178E-04 -9.854887E-07 -0.000000E+00 -0.000000E+00 -1.500000E-02 -1.130000E-04 -6.948075E-03 -3.012964E-05 -4.659628E-03 -1.149973E-05 -2.300471E-03 -2.760542E-06 -6.009865E-03 -1.888067E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.300000E-02 -8.900000E-05 -3.756467E-03 -7.490548E-06 -3.458886E-03 -8.908312E-06 -1.955536E-03 -1.939721E-06 -5.672810E-03 -1.709769E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-02 -1.170000E-04 -1.030992E-02 -5.340950E-05 -5.378168E-03 -1.477216E-05 -2.698876E-03 -3.931578E-06 -7.470784E-03 -2.887854E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -1.127335E-03 -1.646568E-06 -2.677722E-05 -4.627248E-07 -4.736469E-04 -1.133017E-07 -2.085172E-03 -2.552337E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -2.500000E-05 -4.643996E-03 -1.123518E-05 -5.365579E-03 -1.452653E-05 -3.188541E-03 -5.332163E-06 -2.397298E-03 -2.874072E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.822902E-03 -3.322972E-06 -2.000000E-03 -4.000000E-06 -1.879286E-03 -3.531714E-06 -1.649674E-03 -2.721425E-06 -1.333434E-03 -1.778047E-06 -0.000000E+00 -0.000000E+00 -5.000000E-03 -1.300000E-05 -2.119503E-03 -2.510375E-06 -2.082062E-03 -2.331440E-06 -3.351745E-04 -2.838723E-07 -1.510776E-03 -1.564201E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.100000E-02 -7.300000E-05 -3.488060E-03 -6.088204E-06 -4.865073E-04 -2.426361E-07 --1.552382E-03 -3.383588E-06 -3.899764E-03 -7.666624E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -8.964005E-04 -8.035339E-07 -7.053009E-04 -4.974493E-07 -4.561198E-04 -2.080453E-07 -0.000000E+00 -0.000000E+00 -2.000000E-03 -2.000000E-06 -1.915339E-04 -2.525471E-07 --6.211793E-04 -2.122635E-07 --1.146914E-04 -3.101272E-07 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.600000E-05 --4.219550E-04 -1.772971E-07 --5.155325E-04 -1.340113E-07 --6.251664E-04 -1.343175E-06 -3.620876E-03 -8.262609E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -3.400000E-05 -5.071850E-03 -1.313386E-05 -2.724384E-03 -7.394944E-06 -2.290869E-03 -6.048295E-06 -3.620876E-03 -8.262609E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -1.000000E-03 -1.000000E-06 -9.548992E-04 -9.118325E-07 -8.677487E-04 -7.529878E-07 -7.444215E-04 -5.541633E-07 -5.910151E-04 -3.492989E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.300000E-02 -8.500000E-05 -9.564268E-03 -4.579281E-05 -5.459886E-03 -1.501050E-05 -2.874517E-03 -4.642749E-06 -6.592570E-03 -2.173517E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.000000E-05 -4.435015E-03 -1.032581E-05 -2.521759E-03 -3.179660E-06 -1.353941E-03 -9.392372E-07 -2.422227E-03 -4.610259E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.300000E-02 -1.090000E-04 -1.100864E-03 -1.263113E-06 -2.894751E-03 -6.130418E-06 --1.408599E-04 -4.071904E-07 -7.537259E-03 -3.418566E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.993246E-04 -1.796295E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.600000E-02 -1.460000E-04 -4.074270E-03 -1.077055E-05 -2.219886E-03 -2.502730E-06 -1.500629E-03 -1.970345E-06 -8.940012E-03 -4.598689E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --2.171929E-04 -4.717275E-08 --4.292409E-04 -1.842477E-07 -3.001754E-04 -9.010526E-08 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.600000E-02 -1.460000E-04 -4.558047E-03 -2.458088E-05 -4.224970E-03 -1.162419E-05 -3.278961E-03 -7.369638E-06 -7.462474E-03 -2.983182E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-03 -4.000000E-06 --7.774760E-05 -6.044689E-09 --9.888880E-04 -9.778994E-07 -1.150490E-04 -1.323627E-08 -1.510776E-03 -1.564201E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.800000E-05 -1.830475E-03 -4.175502E-06 -5.295634E-04 -6.803525E-07 --6.336822E-04 -3.621057E-07 -3.883146E-03 -7.896401E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -1.000000E-03 -1.000000E-06 --2.406040E-04 -5.789029E-08 --4.131646E-04 -1.707050E-07 -3.260844E-04 -1.063311E-07 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-03 -3.700000E-05 -3.454215E-03 -1.675190E-05 -1.858250E-03 -3.338471E-06 -1.085475E-03 -6.518317E-07 -2.372370E-03 -4.371216E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -9.637579E-04 -9.288293E-07 -8.932439E-04 -7.978848E-07 -7.922796E-04 -6.277069E-07 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.000000E-05 -1.718655E-03 -5.820327E-06 -1.009025E-03 -1.093834E-06 -7.699062E-05 -4.576237E-09 -3.587638E-03 -6.586531E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.031416E-04 -4.565438E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 -8.821806E-04 -7.782426E-07 -6.673640E-04 -4.453746E-07 -3.931055E-04 -1.545319E-07 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.600000E-05 -1.227695E-03 -5.443406E-06 -2.043844E-04 -8.931431E-07 --1.326053E-03 -9.027914E-07 -2.709425E-03 -4.108894E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.031416E-04 -4.565438E-07 -1.000000E-03 -1.000000E-06 -9.914618E-04 -9.829965E-07 -9.744947E-04 -9.496400E-07 -9.493160E-04 -9.012008E-07 -0.000000E+00 -0.000000E+00 -6.000000E-03 -2.600000E-05 -2.958450E-03 -5.562605E-06 -3.172420E-04 -6.855086E-08 -2.704203E-05 -6.951536E-08 -2.413917E-03 -3.672271E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.038170E-04 -9.230477E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.000000E-03 -1.700000E-05 -1.519186E-03 -1.241308E-06 --2.611610E-04 -2.188069E-06 -3.469316E-04 -8.929955E-07 -3.562710E-03 -9.101691E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.114510E-04 -8.307430E-07 -1.000000E-03 -1.000000E-06 -8.500688E-04 -7.226169E-07 -5.839254E-04 -3.409689E-07 -2.605821E-04 -6.790302E-08 -0.000000E+00 -0.000000E+00 -4.000000E-03 -1.000000E-05 -3.088118E-03 -7.629969E-06 -1.972096E-03 -5.348162E-06 -1.349791E-03 -3.293530E-06 -1.814593E-03 -2.394944E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.000000E-05 -5.974452E-03 -2.318079E-05 -3.480849E-03 -1.552533E-05 -3.253745E-03 -8.999790E-06 -4.777978E-03 -1.205544E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-03 -4.500000E-05 -2.829108E-03 -4.741955E-06 -4.557223E-03 -1.257560E-05 -1.915865E-03 -3.032559E-06 -4.465851E-03 -1.204317E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -3.400000E-05 -9.777793E-04 -5.838760E-07 -3.108961E-03 -5.045918E-06 -9.790439E-04 -2.045088E-06 -5.377302E-03 -1.508923E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.955076E-04 -8.732472E-08 -1.000000E-03 -1.000000E-06 -8.637115E-04 -7.459975E-07 -6.189963E-04 -3.831564E-07 -3.152494E-04 -9.938217E-08 -0.000000E+00 -0.000000E+00 -8.000000E-03 -4.000000E-05 --2.016521E-03 -3.282699E-06 --2.864647E-04 -5.009517E-06 --1.038509E-03 -9.421948E-07 -3.013242E-03 -5.308856E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -3.400000E-05 -3.498315E-03 -7.919249E-06 -8.129080E-04 -1.259805E-06 -1.181971E-03 -7.715331E-07 -2.996623E-03 -4.490737E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.865227E-04 -7.859225E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -1.000000E-03 -1.000000E-06 -9.786988E-04 -9.578514E-07 -9.367771E-04 -8.775513E-07 -8.755719E-04 -7.666261E-07 -3.038170E-04 -9.230477E-08 -8.000000E-03 -5.000000E-05 -2.793720E-03 -4.229256E-06 -2.872177E-03 -4.544501E-06 -1.077428E-03 -9.288883E-07 -3.849908E-03 -1.266706E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -5.800000E-05 -4.954781E-03 -1.712892E-05 -4.126960E-03 -1.107068E-05 -2.518231E-03 -4.154059E-06 -4.819525E-03 -1.335200E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.076340E-04 -3.692191E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-03 -2.000000E-06 -6.612504E-04 -8.898055E-07 -3.347082E-04 -7.163327E-07 -8.531489E-04 -3.808616E-07 -1.190340E-03 -8.782273E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-03 -5.000000E-06 -4.625274E-04 -1.150077E-06 -5.123029E-04 -8.692268E-07 -8.248357E-04 -5.505055E-07 -1.198649E-03 -7.185180E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-03 -1.000000E-06 --9.859558E-04 -9.721088E-07 -9.581632E-04 -9.180766E-07 --9.172070E-04 -8.412686E-07 -8.948321E-04 -4.416037E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +5.210818E-03 +1.357783E-05 +1.394382E-03 +9.898987E-07 +2.796067E-04 +6.984712E-07 +3.684681E-03 +7.605759E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2083,14 +243,14 @@ tally 1: 0.000000E+00 4.000000E-03 8.000000E-06 --2.701471E-04 -1.370723E-06 -6.964728E-04 -2.988117E-07 -8.616833E-04 -1.449401E-06 -1.494157E-03 -1.155142E-06 +1.019723E-03 +2.941013E-06 +3.796068E-04 +1.213513E-06 +6.991567E-04 +2.907192E-07 +2.133677E-03 +2.313409E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2121,16 +281,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.000000E-03 -1.600000E-05 -6.207788E-04 -3.853663E-07 -1.877009E-04 -3.523162E-08 -9.779406E-04 -9.563678E-07 -2.676187E-03 -4.648130E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2161,16 +311,266 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +3.200000E-05 +7.394988E-04 +4.098659E-07 +4.040769E-04 +3.143715E-07 +1.784935E-04 +3.163907E-07 +2.744646E-03 +3.801137E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.000000E-03 +4.500000E-05 +4.871111E-03 +1.225810E-05 +2.381697E-03 +2.840243E-06 +2.498800E-03 +3.161161E-06 +3.656384E-03 +6.838240E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +9.405302E-04 +8.589283E-07 +2.623590E-03 +3.990114E-06 +6.768145E-04 +3.652890E-07 +1.212507E-03 +9.103805E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.109694E-04 +1.866863E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.168648E-04 +8.406410E-07 +7.609615E-04 +5.790624E-07 +5.515881E-04 +3.042494E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +8.000000E-05 +6.636635E-03 +2.425315E-05 +4.338045E-03 +1.464490E-05 +3.621511E-03 +1.385488E-05 +7.040297E-03 +2.530812E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +5.800000E-05 +1.624971E-03 +3.694766E-06 +1.160491E-03 +1.280447E-06 +-8.692024E-05 +3.035696E-06 +4.305083E-03 +1.106984E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.221939E-03 +7.467452E-07 +1.000000E-03 +1.000000E-06 +9.910929E-04 +9.822652E-07 +9.733978E-04 +9.475032E-07 +9.471508E-04 +8.970946E-07 +0.000000E+00 +0.000000E+00 2.000000E-03 4.000000E-06 -4.298228E-04 -1.847476E-07 -9.681780E-04 -9.373686E-07 -1.370924E-03 -1.879433E-06 -6.076340E-04 -3.692191E-07 +3.249184E-04 +1.055720E-07 +9.928009E-04 +9.856536E-07 +1.088489E-03 +1.184808E-06 +9.023059E-04 +8.141559E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2203,14 +603,1294 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 -9.975034E-04 -9.950130E-07 -9.925195E-04 -9.850950E-07 -9.850671E-04 -9.703571E-07 -2.955076E-04 -8.732472E-08 +9.686373E-04 +9.382582E-07 +9.073874E-04 +8.233518E-07 +8.191239E-04 +6.709640E-07 +6.204016E-04 +3.848982E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-02 +1.530000E-04 +1.597072E-03 +3.005651E-06 +2.949088E-03 +4.679665E-06 +3.631393E-03 +7.090560E-06 +5.460996E-03 +1.769365E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.503843E-03 +2.261544E-06 +2.000000E-03 +4.000000E-06 +-1.555019E-04 +2.418085E-08 +-6.469952E-05 +4.186027E-09 +-1.256495E-04 +1.578779E-08 +2.462742E-03 +3.825930E-06 +2.000000E-03 +2.000000E-06 +1.802029E-03 +1.623906E-06 +1.435858E-03 +1.032682E-06 +9.559957E-04 +4.622600E-07 +0.000000E+00 +0.000000E+00 +1.400000E-02 +1.060000E-04 +3.845354E-03 +1.771893E-05 +7.969986E-04 +1.251583E-05 +2.663540E-03 +3.580311E-06 +7.322201E-03 +2.693121E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +5.800000E-05 +7.529857E-03 +3.304826E-05 +4.385729E-03 +1.180121E-05 +2.219847E-03 +3.711400E-06 +4.549258E-03 +1.248547E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.328181E-03 +8.967072E-07 +-4.616880E-04 +2.148940E-07 +-1.029769E-03 +5.645716E-07 +1.522708E-03 +1.199054E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +1.000000E-03 +1.000000E-06 +9.936377E-04 +9.873159E-07 +9.809739E-04 +9.623097E-07 +9.621293E-04 +9.256927E-07 +0.000000E+00 +0.000000E+00 +2.000000E-02 +2.000000E-04 +7.111929E-03 +2.528978E-05 +1.084601E-03 +1.073353E-06 +1.275976E-03 +2.215783E-06 +7.350498E-03 +2.790619E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-03 +2.500000E-05 +1.990597E-03 +2.484498E-06 +-4.860874E-04 +2.969876E-07 +6.661989E-04 +2.268944E-07 +4.577555E-03 +1.050456E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.015373E-04 +3.618471E-07 +1.000000E-03 +1.000000E-06 +9.615527E-04 +9.245836E-07 +8.868754E-04 +7.865479E-07 +7.802605E-04 +6.088065E-07 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-3.730183E-04 +1.391426E-07 +-2.912860E-04 +8.484756E-08 +4.297706E-04 +1.847027E-07 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +2.287183E-03 +2.659902E-06 +1.571504E-03 +1.313687E-06 +1.459898E-03 +1.179754E-06 +9.117381E-04 +4.580716E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.200000E-02 +2.600000E-04 +6.732483E-03 +2.695948E-05 +5.717821E-03 +2.889220E-05 +-2.356418E-04 +7.546819E-07 +8.892069E-03 +4.212262E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +1.000000E-03 +1.000000E-06 +-7.961895E-04 +6.339178E-07 +4.508767E-04 +2.032898E-07 +-6.751245E-05 +4.557931E-09 +2.105380E-03 +4.432627E-06 +1.000000E-03 +1.000000E-06 +7.706275E-04 +5.938667E-07 +3.908001E-04 +1.527247E-07 +-1.181620E-05 +1.396226E-10 +0.000000E+00 +0.000000E+00 +1.300000E-02 +1.450000E-04 +5.254317E-03 +2.007625E-05 +1.153872E-03 +6.667482E-07 +1.643586E-03 +1.926972E-06 +5.733468E-03 +2.652835E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +6.100000E-05 +6.423451E-03 +2.063127E-05 +3.306770E-03 +5.779309E-06 +2.784620E-03 +3.970295E-06 +3.976017E-03 +7.971626E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +6.140550E-04 +1.773047E-06 +-1.620585E-04 +8.222999E-07 +1.423762E-03 +1.013556E-06 +1.832908E-03 +1.680177E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-02 +1.250000E-04 +4.942916E-03 +1.235885E-05 +1.021964E-03 +5.222106E-07 +9.236822E-04 +1.479238E-06 +7.322201E-03 +2.693121E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +1.000000E-03 +1.000000E-06 +5.742336E-04 +3.297442E-07 +-5.383652E-06 +2.898371E-11 +-3.879749E-04 +1.505245E-07 +3.007686E-04 +9.046177E-08 +1.000000E-03 +1.000000E-06 +9.585989E-04 +9.189118E-07 +8.783677E-04 +7.715298E-07 +7.642712E-04 +5.841105E-07 +3.007686E-04 +9.046177E-08 +1.300000E-02 +8.900000E-05 +5.419508E-03 +1.767227E-05 +2.993901E-03 +4.531596E-06 +2.675067E-03 +3.968688E-06 +5.780629E-03 +1.774150E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.221939E-03 +7.467452E-07 +2.000000E-03 +2.000000E-06 +1.775152E-03 +1.597527E-06 +1.396291E-03 +1.130413E-06 +9.794822E-04 +9.115176E-07 +0.000000E+00 +0.000000E+00 +8.000000E-03 +5.000000E-05 +2.406686E-03 +4.825540E-06 +4.960582E-04 +1.033420E-06 +1.240589E-03 +2.480639E-06 +5.226253E-03 +1.611788E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.405199E-04 +8.845778E-07 +8.268666E-04 +6.837084E-07 +6.691277E-04 +4.477318E-07 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +6.000000E-03 +2.600000E-05 +8.982135E-05 +2.560934E-07 +-7.114096E-04 +2.713326E-07 +8.252336E-04 +1.794332E-06 +2.716350E-03 +5.885778E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.300000E-02 +8.900000E-05 +6.195490E-03 +1.953479E-05 +2.111239E-03 +2.311139E-06 +2.268320E-03 +3.353244E-06 +5.808926E-03 +1.694986E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.000000E-03 +4.100000E-05 +-8.217874E-04 +4.663323E-07 +7.383083E-04 +5.193896E-06 +8.200240E-04 +3.424935E-07 +3.976017E-03 +7.971626E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +2.748347E-03 +4.220881E-06 +2.045316E-03 +2.683544E-06 +2.280529E-03 +2.612273E-06 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.306024E-04 +8.660208E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +6.000000E-03 +1.800000E-05 +2.626871E-03 +3.665081E-06 +1.681981E-03 +1.510257E-06 +1.862830E-03 +2.103749E-06 +2.735214E-03 +4.122645E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +6.500000E-05 +6.880553E-03 +2.448726E-05 +3.974657E-03 +9.611600E-06 +3.058908E-03 +1.181515E-05 +4.295650E-03 +1.005573E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +7.200000E-05 +6.025175E-03 +1.856579E-05 +5.884402E-03 +2.141913E-05 +1.752856E-03 +2.842294E-06 +6.401031E-03 +2.082068E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-03 +1.700000E-05 +3.189581E-03 +6.250530E-06 +1.000837E-03 +5.036982E-07 +-3.117653E-04 +2.901990E-07 +2.754079E-03 +3.853002E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +-5.657444E-04 +3.200667E-07 +-1.989995E-05 +3.960081E-10 +3.959267E-04 +1.567580E-07 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +9.000000E-06 +1.797289E-03 +3.230248E-06 +7.121477E-04 +5.071544E-07 +4.492929E-04 +2.018641E-07 +1.551004E-03 +2.405613E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +6.500000E-05 +6.283851E-03 +1.995229E-05 +1.355416E-03 +1.756870E-06 +-4.317669E-04 +7.579610E-07 +4.267354E-03 +9.253637E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +9.682863E-04 +9.375784E-07 +9.063676E-04 +8.215023E-07 +8.171815E-04 +6.677855E-07 +6.204016E-04 +3.848982E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.800000E-02 +1.640000E-04 +7.069243E-03 +2.506156E-05 +4.321329E-03 +1.796567E-05 +2.557673E-03 +3.894493E-06 +6.438760E-03 +2.205150E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +7.200000E-05 +4.666186E-03 +1.284828E-05 +2.641891E-03 +1.762435E-05 +9.754238E-04 +2.039232E-06 +5.498725E-03 +1.512159E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +1.714892E-04 +9.981511E-07 +-4.305094E-04 +9.268480E-08 +-2.287903E-04 +5.786188E-08 +2.443878E-03 +2.986981E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +8.500000E-05 +4.472745E-03 +1.447325E-05 +6.072016E-04 +5.846134E-07 +9.336487E-04 +9.381432E-07 +5.169660E-03 +1.440996E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +3.400000E-05 +3.030014E-03 +1.297316E-05 +1.879812E-03 +5.805316E-06 +2.471474E-03 +4.341265E-06 +3.374480E-03 +6.162391E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-03 +2.900000E-05 +-7.617232E-05 +3.053607E-08 +1.791545E-04 +5.297145E-08 +1.386068E-03 +1.737839E-06 +3.054847E-03 +4.667158E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-03 +4.000000E-06 +1.083160E-03 +1.173236E-06 +-4.570050E-05 +2.088536E-09 +-6.290949E-04 +3.957604E-07 +6.204016E-04 +3.848982E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2243,14 +1923,14 @@ tally 1: 0.000000E+00 6.000000E-03 2.000000E-05 --2.695842E-04 -1.341496E-06 -1.562492E-03 -1.831644E-06 --7.471975E-04 -2.484564E-06 -2.388989E-03 -3.013861E-06 +2.716180E-03 +5.893679E-06 +1.554292E-03 +1.376524E-06 +7.264867E-04 +1.331497E-06 +3.045415E-03 +4.796216E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2281,16 +1961,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.000000E-03 -4.000000E-06 -1.468316E-03 -2.155952E-06 -6.405092E-04 -4.102520E-07 --1.375320E-04 -1.891505E-08 -1.198649E-03 -7.185180E-07 +7.000000E-03 +2.500000E-05 +9.648146E-04 +5.981145E-07 +4.634865E-05 +7.955048E-07 +-1.328560E-04 +3.379815E-07 +3.355616E-03 +5.662237E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2299,8 +1979,328 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.955076E-04 -8.732472E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.289998E-03 +8.380263E-07 +-3.762753E-05 +1.288533E-07 +-2.613682E-04 +4.197617E-08 +1.221939E-03 +7.467452E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +8.500000E-05 +3.095504E-03 +7.078598E-06 +-9.175432E-04 +6.837255E-07 +-7.570383E-04 +4.237745E-07 +4.530394E-03 +1.567294E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-02 +7.300000E-05 +3.067467E-03 +5.676919E-06 +2.403624E-03 +2.913670E-06 +1.402382E-03 +1.691430E-06 +5.216821E-03 +1.489979E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.007686E-04 +9.046177E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.008832E-03 +8.754929E-07 +-8.318856E-04 +3.573666E-07 +-9.886180E-04 +7.790297E-07 +1.851773E-03 +2.496075E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-03 +1.000000E-06 +8.429685E-04 +7.105959E-07 +5.658938E-04 +3.202358E-07 +2.330721E-04 +5.432261E-08 +6.015373E-04 +3.618471E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +5.000000E-06 +1.596397E-03 +1.275630E-06 +4.822532E-04 +1.627925E-07 +2.983020E-04 +9.401537E-08 +1.221939E-03 +7.467452E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.204016E-04 +3.848982E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +9.000000E-06 +2.576209E-03 +6.636855E-06 +1.844839E-03 +3.403429E-06 +9.997002E-04 +9.994005E-07 +1.240803E-03 +1.539593E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2323,14 +2323,14 @@ tally 1: 0.000000E+00 1.000000E-03 1.000000E-06 -9.489856E-04 -9.005736E-07 -8.508605E-04 -7.239635E-07 -7.131001E-04 -5.085118E-07 -2.955076E-04 -8.732472E-08 +1.590395E-04 +2.529356E-08 +-4.620597E-04 +2.134991E-07 +-2.285026E-04 +5.221342E-08 +3.102008E-04 +9.622454E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2402,11 +2402,11 @@ tally 1: 0.000000E+00 0.000000E+00 tally 2: -2.181843E-01 -2.381339E-02 -2.370439E-01 -2.810520E-02 -1.375356E+00 -9.460863E-01 -1.543948E+01 -1.192513E+02 +2.288800E-01 +2.621372E-02 +2.489848E-01 +3.102301E-02 +1.451035E+00 +1.053707E+00 +1.618797E+01 +1.311489E+02 diff --git a/tests/test_statepoint_sourcesep/results_true.dat b/tests/test_statepoint_sourcesep/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_statepoint_sourcesep/results_true.dat +++ b/tests/test_statepoint_sourcesep/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_survival_biasing/results_true.dat b/tests/test_survival_biasing/results_true.dat index 0f3509e448..a97654cfa2 100644 --- a/tests/test_survival_biasing/results_true.dat +++ b/tests/test_survival_biasing/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.025211E+00 1.372397E-02 +9.997733E-01 2.995572E-02 diff --git a/tests/test_tally_assumesep/results_true.dat b/tests/test_tally_assumesep/results_true.dat index a2f3586ae4..4835227f24 100644 --- a/tests/test_tally_assumesep/results_true.dat +++ b/tests/test_tally_assumesep/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.517577E+01 -4.747271E+01 +1.423676E+01 +4.330937E+01 tally 2: -3.151504E+00 -2.051857E+00 +2.914798E+00 +1.831649E+00 tally 3: -4.536316E+01 -4.258781E+02 +4.088282E+01 +3.662539E+02 diff --git a/tests/test_trace/results_true.dat b/tests/test_trace/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_trace/results_true.dat +++ b/tests/test_trace/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_translation/results_true.dat b/tests/test_translation/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_translation/results_true.dat +++ b/tests/test_translation/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_trigger_batch_interval/results_true.dat b/tests/test_trigger_batch_interval/results_true.dat index 65fa51bb4f..c901e1e54d 100644 --- a/tests/test_trigger_batch_interval/results_true.dat +++ b/tests/test_trigger_batch_interval/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.851940E-01 4.283950E-03 +9.875001E-01 3.961945E-03 tally 1: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.128147E+01 +3.021699E+01 +4.842434E+00 +1.563989E+00 +4.695086E+00 +1.470132E+00 +1.643904E+01 +1.803258E+01 +2.128147E+01 +3.021699E+01 +4.842434E+00 +1.563989E+00 +4.695086E+00 +1.470132E+00 +1.643904E+01 +1.803258E+01 tally 2: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.128147E+01 +3.021699E+01 +4.842434E+00 +1.563989E+00 +4.695086E+00 +1.470132E+00 +1.643904E+01 +1.803258E+01 diff --git a/tests/test_trigger_batch_interval/settings.xml b/tests/test_trigger_batch_interval/settings.xml index d7afd9231d..b8e1e9c96a 100644 --- a/tests/test_trigger_batch_interval/settings.xml +++ b/tests/test_trigger_batch_interval/settings.xml @@ -1,15 +1,15 @@ - 10 + 15 5 1000 std_dev - 0.00445 + 0.004 - + true 30 diff --git a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py index d5e176fea9..e5c5b54b6b 100644 --- a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py +++ b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py @@ -6,5 +6,5 @@ from testing_harness import TestHarness if __name__ == '__main__': - harness = TestHarness('statepoint.19.*', True) + harness = TestHarness('statepoint.20.*', True) harness.main() diff --git a/tests/test_trigger_no_batch_interval/results_true.dat b/tests/test_trigger_no_batch_interval/results_true.dat index 65fa51bb4f..d06a91646c 100644 --- a/tests/test_trigger_no_batch_interval/results_true.dat +++ b/tests/test_trigger_no_batch_interval/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.851940E-01 4.283950E-03 +9.853099E-01 3.825057E-03 tally 1: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.409492E+01 +3.417475E+01 +5.477076E+00 +1.765385E+00 +5.309347E+00 +1.658803E+00 +1.861784E+01 +2.040621E+01 +2.409492E+01 +3.417475E+01 +5.477076E+00 +1.765385E+00 +5.309347E+00 +1.658803E+00 +1.861784E+01 +2.040621E+01 tally 2: -1.972289E+01 -2.779778E+01 -4.489781E+00 -1.440247E+00 -4.356175E+00 -1.355797E+00 -1.523311E+01 -1.658397E+01 +2.409492E+01 +3.417475E+01 +5.477076E+00 +1.765385E+00 +5.309347E+00 +1.658803E+00 +1.861784E+01 +2.040621E+01 diff --git a/tests/test_trigger_no_batch_interval/settings.xml b/tests/test_trigger_no_batch_interval/settings.xml index 5ceff1082b..5412af35f9 100644 --- a/tests/test_trigger_no_batch_interval/settings.xml +++ b/tests/test_trigger_no_batch_interval/settings.xml @@ -1,15 +1,15 @@ - 10 + 15 5 1000 std_dev - 0.00445 + 0.004 - + true 30 diff --git a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py index d5e176fea9..ff19e3d08d 100644 --- a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py +++ b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py @@ -6,5 +6,5 @@ from testing_harness import TestHarness if __name__ == '__main__': - harness = TestHarness('statepoint.19.*', True) + harness = TestHarness('statepoint.22.*', True) harness.main() diff --git a/tests/test_trigger_no_status/results_true.dat b/tests/test_trigger_no_status/results_true.dat index b9dc78dd03..0b541099b9 100644 --- a/tests/test_trigger_no_status/results_true.dat +++ b/tests/test_trigger_no_status/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.809303E-01 7.264435E-03 +9.906276E-01 1.800527E-03 tally 1: -7.031241E+00 -9.892232E+00 -1.599216E+00 -5.115987E-01 -1.550710E+00 -4.810241E-01 -5.432025E+00 -5.904811E+00 -7.031241E+00 -9.892232E+00 -1.599216E+00 -5.115987E-01 -1.550710E+00 -4.810241E-01 -5.432025E+00 -5.904811E+00 +7.043320E+00 +9.922203E+00 +1.610208E+00 +5.185662E-01 +1.564118E+00 +4.893096E-01 +5.433111E+00 +5.904259E+00 +7.043320E+00 +9.922203E+00 +1.610208E+00 +5.185662E-01 +1.564118E+00 +4.893096E-01 +5.433111E+00 +5.904259E+00 tally 2: -7.031241E+00 -9.892232E+00 -1.599216E+00 -5.115987E-01 -1.550710E+00 -4.810241E-01 -5.432025E+00 -5.904811E+00 +7.043320E+00 +9.922203E+00 +1.610208E+00 +5.185662E-01 +1.564118E+00 +4.893096E-01 +5.433111E+00 +5.904259E+00 diff --git a/tests/test_trigger_tallies/results_true.dat b/tests/test_trigger_tallies/results_true.dat index 86b1c14d5c..0519260ddc 100644 --- a/tests/test_trigger_tallies/results_true.dat +++ b/tests/test_trigger_tallies/results_true.dat @@ -1,28 +1,28 @@ k-combined: -9.824135E-01 6.844127E-03 +9.875396E-01 4.095985E-03 tally 1: -1.408810E+01 -1.985836E+01 -3.199600E+00 -1.024050E+00 -3.102648E+00 -9.629173E-01 -1.088850E+01 -1.186391E+01 -1.408810E+01 -1.985836E+01 -3.199600E+00 -1.024050E+00 -3.102648E+00 -9.629173E-01 -1.088850E+01 -1.186391E+01 +1.415943E+01 +2.006888E+01 +3.225529E+00 +1.040975E+00 +3.128858E+00 +9.794019E-01 +1.093390E+01 +1.196901E+01 +1.415943E+01 +2.006888E+01 +3.225529E+00 +1.040975E+00 +3.128858E+00 +9.794019E-01 +1.093390E+01 +1.196901E+01 tally 2: -1.408810E+01 -1.985836E+01 -3.199600E+00 -1.024050E+00 -3.102648E+00 -9.629173E-01 -1.088850E+01 -1.186391E+01 +1.415943E+01 +2.006888E+01 +3.225529E+00 +1.040975E+00 +3.128858E+00 +9.794019E-01 +1.093390E+01 +1.196901E+01 diff --git a/tests/test_trigger_tallies/settings.xml b/tests/test_trigger_tallies/settings.xml index c6d986ce85..895c0ee72c 100644 --- a/tests/test_trigger_tallies/settings.xml +++ b/tests/test_trigger_tallies/settings.xml @@ -6,10 +6,10 @@ 1000 std_dev - 0.02 + 0.001 - + true 15 diff --git a/tests/test_uniform_fs/results_true.dat b/tests/test_uniform_fs/results_true.dat index eb3d0e715e..a29a363b25 100644 --- a/tests/test_uniform_fs/results_true.dat +++ b/tests/test_uniform_fs/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.623468E-01 4.795863E-03 +3.546115E-01 2.982307E-03 diff --git a/tests/test_union_energy_grids/results_true.dat b/tests/test_union_energy_grids/results_true.dat index 05cda2e980..9556a981bc 100644 --- a/tests/test_union_energy_grids/results_true.dat +++ b/tests/test_union_energy_grids/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.215828E-01 2.966835E-03 +3.155788E-01 7.559348E-03 diff --git a/tests/test_universe/results_true.dat b/tests/test_universe/results_true.dat index f2dfdeca14..5263a6b7fd 100644 --- a/tests/test_universe/results_true.dat +++ b/tests/test_universe/results_true.dat @@ -1,2 +1,2 @@ k-combined: -3.011726E-01 1.841644E-03 +3.021779E-01 3.813358E-03 diff --git a/tests/test_void/results_true.dat b/tests/test_void/results_true.dat index 921d07692f..4e99b86760 100644 --- a/tests/test_void/results_true.dat +++ b/tests/test_void/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.069802E+00 2.223092E-02 +1.045350E+00 2.750547E-02 From fa02c7eb29735f09f3344392d5ae717b768732d5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 4 Aug 2015 09:47:29 +1200 Subject: [PATCH 025/519] Update documentation to reflect creation of secondary neutrons --- docs/source/methods/physics.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index ed10b32343..d0a6a2c992 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -187,11 +187,11 @@ secondary photons from nuclear de-excitation are tracked in OpenMC. ------------------------ 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`. Rather than tracking multiple secondary neutrons, the -weight of the outgoing neutron is multiplied by the number of secondary -neutrons, e.g. for :math:`(n,2n)`, only one outgoing neutron is tracked but its -weight is doubled. +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. .. _fission: From 2ce198257789e65acd9030a3954525953745ca64 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 20 Aug 2015 13:47:13 +0700 Subject: [PATCH 026/519] Extend particle track file format to include tracks from secondary particles --- scripts/openmc-track-to-vtk | 53 ++++++++++++++++--------- src/track_output.F90 | 77 +++++++++++++++++++++++++++++-------- src/tracking.F90 | 5 ++- 3 files changed, 101 insertions(+), 34 deletions(-) diff --git a/scripts/openmc-track-to-vtk b/scripts/openmc-track-to-vtk index 8db57e2a3f..f44b3871ac 100755 --- a/scripts/openmc-track-to-vtk +++ b/scripts/openmc-track-to-vtk @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python """Convert binary particle track to VTK poly data. Usage information can be obtained by running 'track.py --help': @@ -64,26 +64,43 @@ def main(): for fname in args.input: # Write coordinate values to points array. if fname.endswith('.binary'): - track = open(fname, 'rb').read() - coords = [struct.unpack("ddd", track[24*i : 24*(i+1)]) - for i in range(len(track)/24)] - n_points = len(coords) - for triplet in coords: - points.InsertNextPoint(triplet) + track = open(fname, 'rb') + + # Determine number of particles and tracks/particle + n_particles = struct.unpack('i', track.read(4))[0] + n_coords = struct.unpack('i'*n_particles, track.read(4*n_particles)) + + coords = [] + for i in range(n_particles): + # Read coordinates for each particle + coords.append([struct.unpack('ddd', track.read(24)) + for j in range(n_coords[i])]) + + # Add coordinates to points data + for triplet in coords[i]: + points.InsertNextPoint(triplet) + else: - coords = h5py.File(fname).get('coordinates') - n_points = coords.shape[0] - for i in range(n_points): - points.InsertNextPoint(coords[i, :]) + track = h5py.File(fname) + n_particles = track['n_particles'].value[0] + n_coords = track['n_coords'] + coords = [] + for i in range(n_particles): + coords.append(track['coordinates_' + str(i + 1)].value) + for j in range(n_coords[i]): + points.InsertNextPoint(coords[i][j,:]) - # Create VTK line and assign points to line. - line = vtk.vtkPolyLine() - line.GetPointIds().SetNumberOfIds(n_points) - for i in range(n_points): - line.GetPointIds().SetId(i, point_offset+i) + for i in range(n_particles): + # Create VTK line and assign points to line. + line = vtk.vtkPolyLine() + line.GetPointIds().SetNumberOfIds(n_coords[i]) + for j in range(n_coords[i]): + line.GetPointIds().SetId(j, point_offset + j) + + # Add line to cell array + cells.InsertNextCell(line) + point_offset += n_coords[i] - cells.InsertNextCell(line) - point_offset += n_points data = vtk.vtkPolyData() data.SetPoints(points) data.SetLines(cells) diff --git a/src/track_output.F90 b/src/track_output.F90 index fba699e8ef..9143058a2a 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -12,9 +12,12 @@ module track_output implicit none - integer, private :: n_tracks ! total number of tracks - real(8), private, allocatable :: coords(:,:) ! track coordinates -!$omp threadprivate(n_tracks, coords) + type, private :: TrackCoordinates + real(8), allocatable :: coords(:,:) + end type TrackCoordinates + + type(TrackCoordinates), private, allocatable :: tracks(:) +!$omp threadprivate(tracks) contains @@ -23,7 +26,7 @@ contains !=============================================================================== subroutine initialize_particle_track() - n_tracks = 0 + allocate(tracks(1)) end subroutine initialize_particle_track !=============================================================================== @@ -32,23 +35,50 @@ contains subroutine write_particle_track(p) type(Particle), intent(in) :: p - real(8), allocatable :: new_coords(:, :) + integer :: i + integer :: n_tracks + ! Add another column to coords - n_tracks = n_tracks + 1 - if (allocated(coords)) then - allocate(new_coords(3, n_tracks)) - new_coords(:, 1:n_tracks-1) = coords - call move_alloc(FROM=new_coords, TO=coords) + i = size(tracks) + if (allocated(tracks(i) % coords)) then + n_tracks = size(tracks(i) % coords, 2) + allocate(new_coords(3, n_tracks + 1)) + new_coords(:, 1:n_tracks) = tracks(i) % coords + call move_alloc(FROM=new_coords, TO=tracks(i) % coords) else - allocate(coords(3,1)) + n_tracks = 0 + allocate(tracks(i) % coords(3, 1)) end if ! Write current coordinates into the newest column. - coords(:, n_tracks) = p % coord(1) % xyz + n_tracks = n_tracks + 1 + tracks(i) % coords(:, n_tracks) = p % coord(1) % xyz end subroutine write_particle_track +!=============================================================================== +! ADD_PARTICLE_TRACK creates a new entry in the track coordinates for a +! secondary particle +!=============================================================================== + + subroutine add_particle_track() + type(TrackCoordinates), allocatable :: new_tracks(:) + + integer :: i + + ! Determine current number of particle tracks + i = size(tracks) + + ! Create array one larger than current + allocate(new_tracks(i + 1)) + + ! Copy memory and move allocation + new_tracks(1:i) = tracks(i) + call move_alloc(FROM=new_tracks, TO=tracks) + + end subroutine add_particle_track + !=============================================================================== ! FINALIZE_PARTICLE_TRACK writes the particle track array to disk. !=============================================================================== @@ -60,6 +90,10 @@ contains character(MAX_FILE_LEN) :: fname type(BinaryOutput) :: binout + integer :: i + integer, allocatable :: n_coords(:) + integer :: n_particle_tracks + #ifdef HDF5 fname = trim(path_output) // 'track_' // trim(to_str(current_batch)) & // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & @@ -69,13 +103,26 @@ contains // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & // '.binary' #endif + + ! Determine total number of particles and number of coordinates for each + n_particle_tracks = size(tracks) + allocate(n_coords(n_particle_tracks)) + do i = 1, n_particle_tracks + n_coords(i) = size(tracks(i) % coords, 2) + end do + !$omp critical (FinalizeParticleTrack) call binout % file_create(fname) - length = [3, n_tracks] - call binout % write_data(coords, 'coordinates', length=length) + call binout % write_data(n_particle_tracks, 'n_particles') + call binout % write_data(n_coords, 'n_coords', length=n_particle_tracks) + do i = 1, n_particle_tracks + length(:) = [3, n_coords(i)] + call binout % write_data(tracks(i) % coords, 'coordinates_' // & + trim(to_str(i)), length=length) + end do call binout % file_close() !$omp end critical (FinalizeParticleTrack) - deallocate(coords) + deallocate(tracks) end subroutine finalize_particle_track end module track_output diff --git a/src/tracking.F90 b/src/tracking.F90 index ba452a0141..173babd2f5 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -15,7 +15,7 @@ module tracking use tally, only: score_analog_tally, score_tracklength_tally, & score_surface_current use track_output, only: initialize_particle_track, write_particle_track, & - finalize_particle_track + add_particle_track, finalize_particle_track implicit none @@ -200,6 +200,9 @@ contains if (p % n_secondary > 0) then call p % initialize_from_source(p % secondary_bank(p % n_secondary)) p % n_secondary = p % n_secondary - 1 + + ! Enter new particle in particle track file + if (p % write_track) call add_particle_track() else exit EVENT_LOOP end if From 56525c01d13859aaa42d107f1f9e56b0e9b7a3fc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 21 Aug 2015 11:02:05 +0700 Subject: [PATCH 027/519] Add comments describing a number of procedures --- src/eigenvalue.F90 | 4 +++- src/particle_header.F90 | 11 +++++++---- src/source.F90 | 3 ++- src/track_output.F90 | 3 ++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 6a4591705c..33d63b7cc9 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -583,7 +583,9 @@ contains #ifdef _OPENMP !=============================================================================== -! JOIN_BANK_FROM_THREADS +! JOIN_BANK_FROM_THREADS joins threadprivate fission banks into a single fission +! bank that can be sampled. Note that this operation is necessarily sequential +! to preserve the order of the bank when using varying numbers of threads. !=============================================================================== subroutine join_bank_from_threads() diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 9164845e80..cf3bb5efa0 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -129,7 +129,7 @@ contains end subroutine initialize_particle !=============================================================================== -! CLEAR_PARTICLE +! CLEAR_PARTICLE resets all coordinate levels for the particle !=============================================================================== subroutine clear_particle(this) @@ -145,7 +145,7 @@ contains end subroutine clear_particle !=============================================================================== -! RESET_COORD +! RESET_COORD clears data from a single coordinate level !=============================================================================== elemental subroutine reset_coord(this) @@ -162,7 +162,9 @@ contains end subroutine reset_coord !=============================================================================== -! INITIALIZE_FROM_SOURCE +! INITIALIZE_FROM_SOURCE initializes a particle from data stored in a source +! site. The source site may have been produced from an external source, from +! fission, or simply as a secondary particle. !=============================================================================== subroutine initialize_from_source(this, src) @@ -185,7 +187,8 @@ contains end subroutine initialize_from_source !=============================================================================== -! CREATE_SECONDARY +! CREATE_SECONDARY stores the current phase space attributes of the particle in +! the secondary bank and increments the number of sites in the secondary bank. !=============================================================================== subroutine create_secondary(this, uvw, type) diff --git a/src/source.F90 b/src/source.F90 index 32be6069cd..e824829154 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -92,7 +92,8 @@ contains end subroutine initialize_source !=============================================================================== -! SAMPLE_EXTERNAL_SOURCE +! SAMPLE_EXTERNAL_SOURCE samples the user-specified external source and stores +! the position, angle, and energy in a Bank type. !=============================================================================== subroutine sample_external_source(site) diff --git a/src/track_output.F90 b/src/track_output.F90 index 9143058a2a..6ab514cdb8 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -22,7 +22,8 @@ module track_output contains !=============================================================================== -! INITIALIZE_PARTICLE_TRACK +! INITIALIZE_PARTICLE_TRACK allocates the array to store particle track +! information !=============================================================================== subroutine initialize_particle_track() From 621601bf90c97538bd149b1efaab8bbbe9f5fe67 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 25 Aug 2015 16:42:39 +0700 Subject: [PATCH 028/519] Fix typo in comment --- src/simulation.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/simulation.F90 b/src/simulation.F90 index ab9b422480..cc230d645b 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -32,8 +32,9 @@ module simulation contains !=============================================================================== -! RUN_EIGENVALUE encompasses all the main logic where iterations are performed -! over the batches, generations, and histories in a k-eigenvalue calculation. +! RUN_SIMULATION encompasses all the main logic where iterations are performed +! over the batches, generations, and histories in a fixed source or k-eigenvalue +! calculation. !=============================================================================== subroutine run_simulation() From 48f5de2b41b334db2c1ce0dd930ef6e29bd1f2de Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 25 Aug 2015 16:42:56 +0700 Subject: [PATCH 029/519] Check to make sure limit on secondary particles is not exceeded --- src/particle_header.F90 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/particle_header.F90 b/src/particle_header.F90 index cf3bb5efa0..66df6b6e5d 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -2,6 +2,7 @@ module particle_header use bank_header, only: Bank use constants, only: NEUTRON, ONE, NONE, ZERO, MAX_SECONDARY + use error, only: fatal_error use geometry_header, only: BASE_UNIVERSE implicit none @@ -198,6 +199,12 @@ contains integer :: n + ! Check to make sure that the hard-limit on secondary particles is not + ! exceeded. + if (this % n_secondary == MAX_SECONDARY) then + call fatal_error("Too many secondary particles created.") + end if + n = this % n_secondary + 1 this % secondary_bank(n) % wgt = this % wgt this % secondary_bank(n) % xyz(:) = this % coord(1) % xyz From ec788085b3baf9c514c8fe73354550dcfe4badcb Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 25 Aug 2015 19:42:19 -0400 Subject: [PATCH 030/519] Added support for change-in-angle (mu) filters for scattering scores --- openmc/constants.py | 3 ++- openmc/statepoint.py | 3 +-- openmc/tallies.py | 20 +++++++++++++-- src/constants.F90 | 5 ++-- src/hdf5_summary.F90 | 7 +++++- src/input_xml.F90 | 60 ++++++++++++++++++++++++++++++++++++++++++-- src/output.F90 | 14 ++++++++++- src/state_point.F90 | 6 +++-- src/tally.F90 | 8 +++++- 9 files changed, 112 insertions(+), 14 deletions(-) diff --git a/openmc/constants.py b/openmc/constants.py index a6b535e6d1..1423a50029 100644 --- a/openmc/constants.py +++ b/openmc/constants.py @@ -35,7 +35,8 @@ FILTER_TYPES = {1: 'universe', 6: 'mesh', 7: 'energy', 8: 'energyout', - 9: 'distribcell'} + 9: 'distribcell', + 10:'mu'} SCORE_TYPES = {-1: 'flux', -2: 'total', diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 6a4713e91d..8df9369bf7 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -377,7 +377,7 @@ class StatePoint(object): raise ValueError(msg) # Read the bin values - if FILTER_TYPES[filter_type] in ['energy', 'energyout']: + if FILTER_TYPES[filter_type] in ['energy', 'energyout', 'mu']: bins = self._get_double( n_bins+1, path='{0}{1}/bins'.format(subbase, j)) @@ -417,7 +417,6 @@ class StatePoint(object): path='{0}{1}/n_score_bins'.format(base, tally_key))[0] tally.num_score_bins = n_score_bins - scores = [SCORE_TYPES[j] for j in self._get_int( n_score_bins, path='{0}{1}/score_bins'.format(base, tally_key))] n_user_scores = self._get_int( diff --git a/openmc/tallies.py b/openmc/tallies.py index 6e418a2be4..5bf064f23d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -373,7 +373,7 @@ class Tally(object): if score in self.scores: return else: - self._scores.append(score) + self._scores.append(score.strip()) @num_score_bins.setter def num_score_bins(self, num_score_bins): @@ -896,7 +896,7 @@ class Tally(object): bins = list(itertools.product(*xyz)) # Create list of 2-tuples for energy boundary bins - elif filter.type in ['energy', 'energyout']: + elif filter.type in ['energy', 'energyout', 'mu']: bins = [] for k in range(filter.num_bins): bins.append((filter.bins[k], filter.bins[k+1])) @@ -1251,6 +1251,22 @@ class Tally(object): filter_bins = np.tile(filter_bins, tile_factor) df[filter.type + ' [MeV]'] = filter_bins + elif 'mu' is filter.type: + bins = filter.bins + num_bins = filter.num_bins + + # Create strings for + template = '{0:.2f} - {1:.2f}' + filter_bins = [] + for i in range(num_bins): + filter_bins.append(template.format(bins[i], bins[i+1])) + + # Tile the mu bins into a DataFrame column + filter_bins = np.repeat(filter_bins, filter.stride) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + df[filter.type] = filter_bins + # universe, material, surface, cell, and cellborn filters else: filter_bins = np.repeat(filter.bins, filter.stride) diff --git a/src/constants.F90 b/src/constants.F90 index 3aaf08f0eb..e42848acfb 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -300,7 +300,7 @@ module constants integer, parameter :: NO_BIN_FOUND = -1 ! Tally filter and map types - integer, parameter :: N_FILTER_TYPES = 9 + integer, parameter :: N_FILTER_TYPES = 10 integer, parameter :: & FILTER_UNIVERSE = 1, & FILTER_MATERIAL = 2, & @@ -310,7 +310,8 @@ module constants FILTER_MESH = 6, & FILTER_ENERGYIN = 7, & FILTER_ENERGYOUT = 8, & - FILTER_DISTRIBCELL = 9 + FILTER_DISTRIBCELL = 9, & + FILTER_MU = 10 ! Tally surface current directions integer, parameter :: & diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index 375ab74601..4033019b1c 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -607,7 +607,8 @@ contains ! Write filter bins if (t % filters(j) % type == FILTER_ENERGYIN .or. & - t % filters(j) % type == FILTER_ENERGYOUT) then + t % filters(j) % type == FILTER_ENERGYOUT .or. & + t % filters(j) % type == FILTER_MU) then call su % write_data(t % filters(j) % real_bins, "bins", & length=size(t % filters(j) % real_bins), & group="tallies/tally " // trim(to_str(t % id)) & @@ -653,6 +654,10 @@ contains call su % write_data("energyout", "type_name", & group="tallies/tally " // trim(to_str(t % id)) & // "/filter " // trim(to_str(j))) + case(FILTER_MU) + call su % write_data("mu", "type_name", & + group="tallies/tally " // trim(to_str(t % id)) & + // "/filter " // trim(to_str(j))) end select end do FILTER_LOOP diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5c939a394f..22f991ab9e 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2085,6 +2085,9 @@ contains integer :: imomstr ! Index of MOMENT_STRS & MOMENT_N_STRS logical :: file_exists ! does tallies.xml file exist? real(8) :: rarray3(3) ! temporary double prec. array + integer :: Nmu ! Number of angular bins + real(8) :: dmu ! Mu spacing if using automatic allocation + integer :: imu ! Loop counter for building mu filter bins character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word character(MAX_WORD_LEN) :: score_name @@ -2350,8 +2353,9 @@ contains ! Determine number of bins if (check_for_node(node_filt, "bins")) then - if (trim(temp_str) == 'energy' .or. & - trim(temp_str) == 'energyout') then + if ((trim(temp_str) == 'energy' .or. & + trim(temp_str) == 'energyout') .or. & + (trim(temp_str) == 'mu')) then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2487,6 +2491,40 @@ contains ! Set to analog estimator t % estimator = ESTIMATOR_ANALOG + case ('mu') + ! Set type of filter + t % filters(j) % type = FILTER_MU + + ! Set number of bins + t % filters(j) % n_bins = n_words - 1 + + ! Allocate and store bins + allocate(t % filters(j) % real_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % real_bins) + + ! Easter egg! Allow a user to input a negative number, if it is only one + ! and that will mean you subivide [-1,1] evenly with the input + ! being the number of bins + if (n_words == 1) then + Nmu = abs(int(t % filters(j) % real_bins(1))) + if (Nmu > 1) then + t % filters(j) % n_bins = Nmu - 1 + dmu = TWO / (real(Nmu,8) - ONE) + deallocate(t % filters(j) % real_bins) + allocate(t % filters(j) % real_bins(Nmu)) + do imu = 1, Nmu + t % filters(j) % real_bins(imu) = -ONE + (imu - 1) * dmu + end do + else + call fatal_error("Must have more than one bin for mu filter & + & on tally " // trim(to_str(t % id)) // ".") + end if + + end if + + ! Set to analog estimator + t % estimator = ESTIMATOR_ANALOG + case default ! Specified tally filter is invalid, raise error call fatal_error("Unknown filter type '" & @@ -2656,6 +2694,7 @@ contains ! scores then strip off the n and store it as an integer to be used ! later. Then perform the select case on this modified (number ! removed) string + n_order = -1 score_name = sarray(l) do imomstr = 1, size(MOMENT_STRS) if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then @@ -2701,6 +2740,23 @@ contains end do end if + ! Check to see if the mu filter is applied and if that makes sense. + if ((.not. starts_with(score_name,'scatter')) .and. & + (.not. starts_with(score_name,'nu-scatter'))) then + if (t % find_filter(FILTER_MU) > 0) then + call fatal_error("Cannot tally " // trim(score_name) //" with a & + &change of angle (mu) filter.") + end if + ! Also check to see if this is a legendre expansion or not. + ! If so, we can accept this score and filter combo for p0, but not + ! elsewhere. + else if (n_order > 0) then + if (t % find_filter(FILTER_MU) > 0) then + call fatal_error("Cannot tally " // trim(score_name) //" with a & + &change of angle (mu) filter unless order is 0.") + end if + end if + select case (trim(score_name)) case ('flux') ! Prohibit user from tallying flux for an individual nuclide diff --git a/src/output.F90 b/src/output.F90 index 939451c6fb..9225e7a586 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -853,6 +853,17 @@ contains write(unit_,*) ' Outgoing Energy Bins:' // trim(string) end if + ! Write any change-in-angle bins if present + j = t % find_filter(FILTER_MU) + if (j > 0) then + string = "" + do i = 1, t % filters(j) % n_bins + 1 + string = trim(string) // ' ' // trim(to_str(& + t % filters(j) % real_bins(i))) + end do + write(unit_,*) ' Change-in-Angle Bins:' // trim(string) + end if + ! Write nuclides bins write(unit_,fmt='(1X,A)',advance='no') ' Nuclide Bins:' do i = 1, t % n_nuclide_bins @@ -1734,6 +1745,7 @@ contains filter_name(FILTER_MESH) = "Mesh" filter_name(FILTER_ENERGYIN) = "Incoming Energy" filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" + filter_name(FILTER_MU) = "Change-in-Angle" ! Initialize names for scores score_names(abs(SCORE_FLUX)) = "Flux" @@ -2171,7 +2183,7 @@ contains label = "Index (" // trim(to_str(ijk(1))) // ", " // & trim(to_str(ijk(2))) // ", " // trim(to_str(ijk(3))) // ")" end if - case (FILTER_ENERGYIN, FILTER_ENERGYOUT) + case (FILTER_ENERGYIN, FILTER_ENERGYOUT, FILTER_MU) E0 = t % filters(i_filter) % real_bins(bin) E1 = t % filters(i_filter) % real_bins(bin + 1) label = "[" // trim(to_str(E0)) // ", " // trim(to_str(E1)) // ")" diff --git a/src/state_point.F90 b/src/state_point.F90 index 6b983231f6..23c46117dd 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -256,7 +256,8 @@ contains group="tallies/tally " // trim(to_str(tally % id)) // & "/filter " // to_str(j)) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & - tally % filters(j) % type == FILTER_ENERGYOUT) then + tally % filters(j) % type == FILTER_ENERGYOUT .or. & + tally % filters(j) % type == FILTER_MU) then call sp % write_data(tally % filters(j) % real_bins, "bins", & group="tallies/tally " // trim(to_str(tally % id)) // & "/filter " // to_str(j), & @@ -843,7 +844,8 @@ contains group="tallies/tally " // trim(to_str(curr_key)) // & "/filter " // to_str(j)) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & - tally % filters(j) % type == FILTER_ENERGYOUT) then + tally % filters(j) % type == FILTER_ENERGYOUT .or. & + tally % filters(j) % type == FILTER_MU) then call sp % read_data(tally % filters(j) % real_bins, "bins", & group="tallies/tally " // trim(to_str(curr_key)) // & "/filter " // to_str(j), & diff --git a/src/tally.F90 b/src/tally.F90 index e78e58f284..d3fce52905 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -990,7 +990,6 @@ contains matching_bins(i) = binary_search(t % filters(i) % real_bins, & k + 1, p % E) end if - end select ! Check if no matching bin was found @@ -1245,6 +1244,13 @@ contains n + 1, p % E) end if + case (FILTER_MU) + ! determine mu bin + n = t % filters(i) % n_bins + ! search to find incoming energy bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, p % mu) + end select ! If the current filter didn't match, exit this subroutine From a64255bdc8d71e2d6118e5e2b55f22a155bb75b4 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 25 Aug 2015 20:03:19 -0400 Subject: [PATCH 031/519] Cleaned up automatic binning code for mu filters and updated documentation/rng files --- docs/source/usersguide/input.rst | 15 +++++++++++++++ src/input_xml.F90 | 9 +++++---- src/relaxng/tallies.rnc | 6 +++--- src/relaxng/tallies.rng | 2 ++ src/tally.F90 | 1 + 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 93e8236ec1..6e244bc9b4 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1251,6 +1251,21 @@ The ```` element accepts the following sub-elements: two post-collision energy bins will be created, one with energies between 0 and 1 MeV and the other with energies between 1 and 20 MeV. + :mu: + A monotonically increasing list of bounding **post-collision** + cosines of the change in a particle's angle (i.e., :math:`\mu`), + which represents a portion of the possible values of :math:'\[-1,1\]'. + For example, spanning all of :math:'\[-1,1\]' with five equi-width + bins can be specified as: + ```` + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:'\[-1,1\]' should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:'\[-1,1\]' can be instead written as: + ````. + :mesh: The ``id`` of a structured mesh to be tallied over. diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 22f991ab9e..b1cabb4cbb 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2508,13 +2508,14 @@ contains if (n_words == 1) then Nmu = abs(int(t % filters(j) % real_bins(1))) if (Nmu > 1) then - t % filters(j) % n_bins = Nmu - 1 - dmu = TWO / (real(Nmu,8) - ONE) + t % filters(j) % n_bins = Nmu + dmu = TWO / (real(Nmu,8)) deallocate(t % filters(j) % real_bins) - allocate(t % filters(j) % real_bins(Nmu)) - do imu = 1, Nmu + allocate(t % filters(j) % real_bins(Nmu + 1)) + do imu = 1, Nmu + 1 t % filters(j) % real_bins(imu) = -ONE + (imu - 1) * dmu end do + t % filters(j) % real_bins(Nmu + 1) = ONE else call fatal_error("Must have more than one bin for mu filter & & on tally " // trim(to_str(t % id)) // ".") diff --git a/src/relaxng/tallies.rnc b/src/relaxng/tallies.rnc index c2e0860b8e..d3e5e87e83 100644 --- a/src/relaxng/tallies.rnc +++ b/src/relaxng/tallies.rnc @@ -23,16 +23,16 @@ element tallies { attribute estimator { ( "analog" | "tracklength" ) })? & element filter { (element type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" ) } | + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu") } | attribute type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" ) }) & + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu") }) & (element bins { list { xsd:double+ } } | attribute bins { list { xsd:double+ } }) }* & element nuclides { list { xsd:string { maxLength = "12" }+ } }? & - element scores { + element scores { list { xsd:string { maxLength = "20" }+ } } & element trigger { diff --git a/src/relaxng/tallies.rng b/src/relaxng/tallies.rng index 9ea941feab..ce0d2d1bcd 100644 --- a/src/relaxng/tallies.rng +++ b/src/relaxng/tallies.rng @@ -151,6 +151,7 @@ mesh energy energyout + mu @@ -164,6 +165,7 @@ mesh energy energyout + mu diff --git a/src/tally.F90 b/src/tally.F90 index d3fce52905..fc05145db4 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1247,6 +1247,7 @@ contains case (FILTER_MU) ! determine mu bin n = t % filters(i) % n_bins + ! search to find incoming energy bin matching_bins(i) = binary_search(t % filters(i) % real_bins, & n + 1, p % mu) From dc13a47dda8683270bc670c01e100e4e0ba3c4c3 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 25 Aug 2015 20:39:09 -0400 Subject: [PATCH 032/519] Added check to make sure mu was between -1 and 1 to help with tallying. This will probably result in changes to the tests. --- src/physics.F90 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/physics.F90 b/src/physics.F90 index 9ca59a9872..043bea6911 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -388,6 +388,13 @@ contains end if + ! Check p % mu to ensure it falls within the expected range + if (p % mu < -ONE) then + p % mu = -ONE + else if (p % mu > ONE) then + p % mu = ONE + end if + ! Set event component p % event = EVENT_SCATTER From c922f35bdcf55433700149cfbf2a919da135bdcd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 26 Aug 2015 10:02:56 +0700 Subject: [PATCH 033/519] Fix typo in initialize module --- src/initialize.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/initialize.F90 b/src/initialize.F90 index fd63963bf1..b944b6677b 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -140,7 +140,7 @@ contains ! Determine how much work each processor should do call calculate_work() - ! Allocate source bank, and for eigenvalu simulations also allocate the + ! Allocate source bank, and for eigenvalue simulations also allocate the ! fission bank call allocate_banks() From de58e3c76e293ab6047f96f2cfbcb10ab739f323 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 26 Aug 2015 20:32:00 -0400 Subject: [PATCH 034/519] Added test for mu filter --- tests/test_filter_mu/geometry.xml | 181 + tests/test_filter_mu/materials.xml | 272 ++ tests/test_filter_mu/results_true.dat | 4661 ++++++++++++++++++++++++ tests/test_filter_mu/settings.xml | 19 + tests/test_filter_mu/tallies.xml | 27 + tests/test_filter_mu/test_filter_mu.py | 10 + 6 files changed, 5170 insertions(+) create mode 100644 tests/test_filter_mu/geometry.xml create mode 100644 tests/test_filter_mu/materials.xml create mode 100644 tests/test_filter_mu/results_true.dat create mode 100644 tests/test_filter_mu/settings.xml create mode 100644 tests/test_filter_mu/tallies.xml create mode 100644 tests/test_filter_mu/test_filter_mu.py diff --git a/tests/test_filter_mu/geometry.xml b/tests/test_filter_mu/geometry.xml new file mode 100644 index 0000000000..b85dd04df9 --- /dev/null +++ b/tests/test_filter_mu/geometry.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + + + diff --git a/tests/test_filter_mu/materials.xml b/tests/test_filter_mu/materials.xml new file mode 100644 index 0000000000..9c0b74f3f1 --- /dev/null +++ b/tests/test_filter_mu/materials.xml @@ -0,0 +1,272 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_filter_mu/results_true.dat b/tests/test_filter_mu/results_true.dat new file mode 100644 index 0000000000..b319bd47d5 --- /dev/null +++ b/tests/test_filter_mu/results_true.dat @@ -0,0 +1,4661 @@ +k-combined: +1.093844E+00 1.626801E-02 +tally 1: +1.169000E+01 +2.745630E+01 +1.171000E+01 +2.755450E+01 +1.319000E+01 +3.518910E+01 +1.319000E+01 +3.518910E+01 +3.113000E+01 +1.944005E+02 +3.113000E+01 +1.944005E+02 +7.042000E+01 +9.930924E+02 +7.042000E+01 +9.930924E+02 +tally 2: +1.169000E+01 +2.745630E+01 +1.171000E+01 +2.755450E+01 +1.319000E+01 +3.518910E+01 +1.319000E+01 +3.518910E+01 +3.113000E+01 +1.944005E+02 +3.113000E+01 +1.944005E+02 +7.042000E+01 +9.930924E+02 +7.042000E+01 +9.930924E+02 +tally 3: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +2.000000E-01 +4.000000E-02 +2.000000E-01 +4.000000E-02 +3.000000E-01 +9.000000E-02 +3.000000E-01 +9.000000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +4.000000E-02 +6.000000E-04 +4.000000E-02 +6.000000E-04 +7.000000E-02 +1.300000E-03 +7.000000E-02 +1.300000E-03 +1.500000E-01 +6.300000E-03 +1.500000E-01 +6.300000E-03 +3.800000E-01 +3.860000E-02 +3.800000E-01 +3.860000E-02 +1.400000E-01 +5.800000E-03 +1.400000E-01 +5.800000E-03 +1.000000E-01 +4.400000E-03 +1.000000E-01 +4.400000E-03 +5.600000E-01 +1.062000E-01 +5.600000E-01 +1.062000E-01 +1.090000E+00 +3.691000E-01 +1.090000E+00 +3.691000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.200000E-01 +1.440000E-02 +1.200000E-01 +1.440000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.200000E-01 +6.200000E-03 +1.200000E-01 +6.200000E-03 +1.900000E-01 +1.870000E-02 +1.900000E-01 +1.870000E-02 +2.500000E-01 +2.790000E-02 +2.500000E-01 +2.790000E-02 +2.400000E-01 +2.060000E-02 +2.400000E-01 +2.060000E-02 +7.400000E-01 +1.752000E-01 +7.400000E-01 +1.752000E-01 +1.310000E+00 +4.805000E-01 +1.310000E+00 +4.805000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +9.000000E-02 +6.500000E-03 +9.000000E-02 +6.500000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-02 +3.400000E-03 +9.000000E-02 +4.500000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.000000E-01 +5.200000E-03 +1.000000E-01 +5.200000E-03 +3.200000E-01 +6.400000E-02 +3.200000E-01 +6.400000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +5.000000E-02 +9.000000E-04 +5.000000E-02 +9.000000E-04 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.100000E-01 +6.500000E-03 +1.100000E-01 +6.500000E-03 +1.400000E-01 +8.400000E-03 +1.400000E-01 +8.400000E-03 +1.000000E-01 +3.800000E-03 +1.000000E-01 +3.800000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +8.000000E-02 +2.600000E-03 +8.000000E-02 +2.600000E-03 +4.000000E-01 +6.180000E-02 +4.000000E-01 +6.180000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-02 +3.800000E-03 +8.000000E-02 +3.800000E-03 +1.000000E-01 +3.600000E-03 +1.000000E-01 +3.600000E-03 +2.700000E-01 +2.570000E-02 +2.700000E-01 +2.570000E-02 +5.500000E-01 +1.073000E-01 +5.500000E-01 +1.073000E-01 +9.000000E-02 +3.300000E-03 +9.000000E-02 +3.300000E-03 +7.000000E-02 +2.500000E-03 +7.000000E-02 +2.500000E-03 +2.800000E-01 +2.860000E-02 +2.800000E-01 +2.860000E-02 +8.100000E-01 +2.205000E-01 +8.100000E-01 +2.205000E-01 +1.500000E-01 +5.500000E-03 +1.500000E-01 +5.500000E-03 +1.300000E-01 +5.100000E-03 +1.300000E-01 +5.100000E-03 +3.200000E-01 +2.740000E-02 +3.200000E-01 +2.740000E-02 +9.100000E-01 +1.667000E-01 +9.100000E-01 +1.667000E-01 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +7.000000E-02 +3.700000E-03 +7.000000E-02 +3.700000E-03 +2.700000E-01 +4.250000E-02 +2.700000E-01 +4.250000E-02 +2.300000E-01 +1.390000E-02 +2.300000E-01 +1.390000E-02 +1.700000E-01 +7.300000E-03 +1.700000E-01 +7.300000E-03 +4.600000E-01 +5.060000E-02 +4.600000E-01 +5.060000E-02 +1.180000E+00 +3.338000E-01 +1.180000E+00 +3.338000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +9.000000E-02 +2.900000E-03 +9.000000E-02 +2.900000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +2.300000E-01 +2.010000E-02 +2.300000E-01 +2.010000E-02 +4.000000E-01 +4.680000E-02 +4.000000E-01 +4.680000E-02 +1.000000E-01 +2.800000E-03 +1.000000E-01 +2.800000E-03 +1.100000E-01 +3.900000E-03 +1.100000E-01 +3.900000E-03 +3.100000E-01 +2.810000E-02 +3.100000E-01 +2.810000E-02 +6.000000E-01 +9.540000E-02 +6.000000E-01 +9.540000E-02 +1.300000E-01 +5.100000E-03 +1.300000E-01 +5.100000E-03 +8.000000E-02 +2.600000E-03 +8.000000E-02 +2.600000E-03 +3.000000E-01 +2.860000E-02 +3.000000E-01 +2.860000E-02 +6.200000E-01 +1.282000E-01 +6.200000E-01 +1.282000E-01 +1.500000E-01 +9.300000E-03 +1.500000E-01 +9.300000E-03 +1.300000E-01 +9.700000E-03 +1.300000E-01 +9.700000E-03 +3.400000E-01 +4.180000E-02 +3.400000E-01 +4.180000E-02 +7.700000E-01 +1.905000E-01 +7.700000E-01 +1.905000E-01 +2.700000E-01 +3.470000E-02 +2.700000E-01 +3.470000E-02 +2.700000E-01 +3.050000E-02 +2.700000E-01 +3.050000E-02 +5.200000E-01 +1.032000E-01 +5.200000E-01 +1.032000E-01 +1.680000E+00 +1.022600E+00 +1.680000E+00 +1.022600E+00 +7.000000E-02 +3.700000E-03 +7.000000E-02 +3.700000E-03 +6.000000E-02 +2.000000E-03 +6.000000E-02 +2.000000E-03 +1.700000E-01 +1.490000E-02 +1.700000E-01 +1.490000E-02 +4.200000E-01 +9.000000E-02 +4.200000E-01 +9.000000E-02 +7.000000E-02 +1.900000E-03 +7.000000E-02 +1.900000E-03 +1.000000E-01 +3.000000E-03 +1.000000E-01 +3.000000E-03 +1.500000E-01 +5.900000E-03 +1.500000E-01 +5.900000E-03 +4.400000E-01 +4.520000E-02 +4.400000E-01 +4.520000E-02 +9.000000E-02 +4.500000E-03 +9.000000E-02 +4.500000E-03 +1.000000E-01 +3.000000E-03 +1.000000E-01 +3.000000E-03 +2.000000E-01 +1.680000E-02 +2.000000E-01 +1.680000E-02 +4.400000E-01 +8.340000E-02 +4.400000E-01 +8.340000E-02 +6.000000E-02 +1.400000E-03 +6.000000E-02 +1.400000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +5.000000E-02 +1.100000E-03 +5.000000E-02 +1.100000E-03 +2.100000E-01 +1.850000E-02 +2.100000E-01 +1.850000E-02 +1.100000E-01 +1.010000E-02 +1.100000E-01 +1.010000E-02 +9.000000E-02 +5.300000E-03 +9.000000E-02 +5.300000E-03 +2.700000E-01 +4.050000E-02 +2.700000E-01 +4.050000E-02 +3.700000E-01 +6.970000E-02 +3.700000E-01 +6.970000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +9.000000E-02 +5.100000E-03 +9.000000E-02 +5.100000E-03 +9.000000E-02 +2.700000E-03 +9.000000E-02 +2.700000E-03 +2.100000E-01 +1.170000E-02 +2.100000E-01 +1.170000E-02 +5.000000E-01 +7.140000E-02 +5.000000E-01 +7.140000E-02 +1.100000E-01 +8.300000E-03 +1.100000E-01 +8.300000E-03 +2.200000E-01 +3.060000E-02 +2.200000E-01 +3.060000E-02 +3.300000E-01 +5.030000E-02 +3.300000E-01 +5.030000E-02 +6.400000E-01 +1.712000E-01 +6.400000E-01 +1.712000E-01 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +2.400000E-01 +4.860000E-02 +2.400000E-01 +4.860000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.200000E-01 +8.000000E-03 +1.200000E-01 +8.000000E-03 +1.200000E-01 +8.000000E-03 +1.200000E-01 +8.000000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.400000E-01 +1.060000E-02 +1.400000E-01 +1.060000E-02 +1.000000E-01 +3.600000E-03 +1.000000E-01 +3.600000E-03 +2.600000E-01 +2.140000E-02 +2.600000E-01 +2.140000E-02 +3.400000E-01 +3.800000E-02 +3.400000E-01 +3.800000E-02 +9.300000E-01 +2.659000E-01 +9.300000E-01 +2.659000E-01 +1.200000E-01 +7.400000E-03 +1.200000E-01 +7.400000E-03 +1.100000E-01 +5.900000E-03 +1.100000E-01 +5.900000E-03 +2.100000E-01 +2.450000E-02 +2.100000E-01 +2.450000E-02 +5.200000E-01 +1.386000E-01 +5.200000E-01 +1.386000E-01 +8.000000E-02 +2.200000E-03 +8.000000E-02 +2.200000E-03 +2.100000E-01 +1.470000E-02 +2.100000E-01 +1.470000E-02 +1.900000E-01 +1.510000E-02 +1.900000E-01 +1.510000E-02 +7.200000E-01 +1.746000E-01 +7.200000E-01 +1.746000E-01 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.600000E-01 +1.460000E-02 +1.600000E-01 +1.460000E-02 +4.600000E-01 +1.258000E-01 +4.600000E-01 +1.258000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +8.000000E-02 +3.400000E-03 +8.000000E-02 +3.400000E-03 +1.100000E-01 +5.900000E-03 +1.100000E-01 +5.900000E-03 +1.000000E-01 +3.000000E-03 +1.000000E-01 +3.000000E-03 +3.000000E-01 +2.740000E-02 +3.000000E-01 +2.740000E-02 +9.100000E-01 +2.855000E-01 +9.100000E-01 +2.855000E-01 +1.900000E-01 +1.050000E-02 +1.900000E-01 +1.050000E-02 +2.100000E-01 +1.790000E-02 +2.100000E-01 +1.790000E-02 +4.000000E-01 +5.600000E-02 +4.000000E-01 +5.600000E-02 +1.060000E+00 +3.794000E-01 +1.060000E+00 +3.794000E-01 +2.800000E-01 +4.620000E-02 +2.800000E-01 +4.620000E-02 +4.100000E-01 +4.890000E-02 +4.100000E-01 +4.890000E-02 +1.000000E+00 +3.262000E-01 +1.000000E+00 +3.262000E-01 +2.040000E+00 +1.229000E+00 +2.040000E+00 +1.229000E+00 +1.700000E-01 +1.250000E-02 +1.800000E-01 +1.320000E-02 +2.400000E-01 +2.000000E-02 +2.400000E-01 +2.000000E-02 +4.600000E-01 +8.820000E-02 +4.600000E-01 +8.820000E-02 +1.340000E+00 +7.578000E-01 +1.340000E+00 +7.578000E-01 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.100000E-01 +1.210000E-02 +1.100000E-01 +1.210000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +1.500000E-01 +1.070000E-02 +1.500000E-01 +1.070000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +1.000000E-01 +5.800000E-03 +1.000000E-01 +5.800000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +9.000000E-02 +5.300000E-03 +9.000000E-02 +5.300000E-03 +1.000000E-01 +5.000000E-03 +1.000000E-01 +5.000000E-03 +2.900000E-01 +3.130000E-02 +2.900000E-01 +3.130000E-02 +5.500000E-01 +1.173000E-01 +5.500000E-01 +1.173000E-01 +4.000000E-02 +6.000000E-04 +4.000000E-02 +6.000000E-04 +6.000000E-02 +2.600000E-03 +6.000000E-02 +2.600000E-03 +2.100000E-01 +1.490000E-02 +2.100000E-01 +1.490000E-02 +4.300000E-01 +7.830000E-02 +4.300000E-01 +7.830000E-02 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +1.900000E-01 +1.810000E-02 +1.900000E-01 +1.810000E-02 +2.500000E-01 +2.330000E-02 +2.500000E-01 +2.330000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +8.000000E-02 +2.400000E-03 +8.000000E-02 +2.400000E-03 +1.300000E-01 +6.700000E-03 +1.300000E-01 +6.700000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.500000E-01 +1.130000E-02 +1.500000E-01 +1.130000E-02 +1.800000E-01 +1.580000E-02 +1.800000E-01 +1.580000E-02 +2.600000E-01 +3.140000E-02 +2.600000E-01 +3.140000E-02 +6.600000E-01 +2.018000E-01 +6.600000E-01 +2.018000E-01 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +7.000000E-02 +2.700000E-03 +7.000000E-02 +2.700000E-03 +1.700000E-01 +1.250000E-02 +1.700000E-01 +1.250000E-02 +3.700000E-01 +5.690000E-02 +3.700000E-01 +5.690000E-02 +6.000000E-02 +1.400000E-03 +6.000000E-02 +1.400000E-03 +1.200000E-01 +4.800000E-03 +1.200000E-01 +4.800000E-03 +1.800000E-01 +9.400000E-03 +1.800000E-01 +9.400000E-03 +3.100000E-01 +2.570000E-02 +3.100000E-01 +2.570000E-02 +3.000000E-01 +2.540000E-02 +3.000000E-01 +2.540000E-02 +3.500000E-01 +5.010000E-02 +3.500000E-01 +5.010000E-02 +6.100000E-01 +1.107000E-01 +6.100000E-01 +1.107000E-01 +1.520000E+00 +5.836000E-01 +1.520000E+00 +5.836000E-01 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.100000E-01 +8.300000E-03 +1.100000E-01 +8.300000E-03 +1.700000E-01 +1.150000E-02 +1.700000E-01 +1.150000E-02 +4.000000E-01 +5.920000E-02 +4.000000E-01 +5.920000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-01 +5.500000E-03 +1.500000E-01 +5.500000E-03 +5.000000E-02 +7.000000E-04 +5.000000E-02 +7.000000E-04 +2.200000E-01 +1.420000E-02 +2.200000E-01 +1.420000E-02 +5.900000E-01 +1.033000E-01 +5.900000E-01 +1.033000E-01 +1.900000E-01 +7.900000E-03 +1.900000E-01 +7.900000E-03 +2.800000E-01 +2.320000E-02 +2.800000E-01 +2.320000E-02 +6.600000E-01 +1.226000E-01 +6.600000E-01 +1.226000E-01 +1.300000E+00 +4.144000E-01 +1.300000E+00 +4.144000E-01 +1.100000E-01 +3.500000E-03 +1.100000E-01 +3.500000E-03 +7.000000E-02 +1.700000E-03 +7.000000E-02 +1.700000E-03 +2.100000E-01 +1.890000E-02 +2.100000E-01 +1.890000E-02 +4.400000E-01 +5.180000E-02 +4.400000E-01 +5.180000E-02 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-01 +6.600000E-03 +1.000000E-01 +6.600000E-03 +3.400000E-01 +9.100000E-02 +3.400000E-01 +9.100000E-02 +1.200000E-01 +7.400000E-03 +1.200000E-01 +7.400000E-03 +1.000000E-01 +5.400000E-03 +1.000000E-01 +5.400000E-03 +2.300000E-01 +3.050000E-02 +2.300000E-01 +3.050000E-02 +5.400000E-01 +1.374000E-01 +5.400000E-01 +1.374000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.800000E-01 +2.040000E-02 +2.800000E-01 +2.040000E-02 +2.900000E-01 +2.070000E-02 +2.900000E-01 +2.070000E-02 +8.900000E-01 +1.935000E-01 +8.900000E-01 +1.935000E-01 +1.960000E+00 +1.036600E+00 +1.960000E+00 +1.036600E+00 +4.200000E-01 +5.360000E-02 +4.200000E-01 +5.360000E-02 +4.400000E-01 +4.940000E-02 +4.400000E-01 +4.940000E-02 +9.300000E-01 +2.219000E-01 +9.300000E-01 +2.219000E-01 +2.010000E+00 +1.042100E+00 +2.010000E+00 +1.042100E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +1.900000E-01 +9.100000E-03 +1.900000E-01 +9.100000E-03 +3.600000E-01 +4.720000E-02 +3.600000E-01 +4.720000E-02 +6.800000E-01 +1.514000E-01 +6.800000E-01 +1.514000E-01 +1.340000E+00 +4.926000E-01 +1.340000E+00 +4.926000E-01 +2.000000E-01 +1.420000E-02 +2.000000E-01 +1.420000E-02 +2.800000E-01 +2.160000E-02 +2.800000E-01 +2.160000E-02 +6.500000E-01 +1.185000E-01 +6.500000E-01 +1.185000E-01 +1.460000E+00 +5.016000E-01 +1.460000E+00 +5.016000E-01 +5.000000E-02 +9.000000E-04 +5.000000E-02 +9.000000E-04 +1.300000E-01 +7.300000E-03 +1.300000E-01 +7.300000E-03 +2.700000E-01 +2.850000E-02 +2.700000E-01 +2.850000E-02 +6.900000E-01 +1.553000E-01 +6.900000E-01 +1.553000E-01 +1.000000E-01 +3.800000E-03 +1.000000E-01 +3.800000E-03 +8.000000E-02 +2.400000E-03 +8.000000E-02 +2.400000E-03 +2.600000E-01 +2.380000E-02 +2.600000E-01 +2.380000E-02 +4.500000E-01 +6.730000E-02 +4.500000E-01 +6.730000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.300000E-01 +1.690000E-02 +1.300000E-01 +1.690000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.200000E-01 +5.400000E-03 +1.200000E-01 +5.400000E-03 +1.100000E-01 +5.300000E-03 +1.100000E-01 +5.300000E-03 +2.600000E-01 +2.640000E-02 +2.600000E-01 +2.640000E-02 +5.600000E-01 +1.062000E-01 +5.600000E-01 +1.062000E-01 +1.000000E-01 +4.600000E-03 +1.000000E-01 +4.600000E-03 +1.800000E-01 +1.020000E-02 +1.800000E-01 +1.020000E-02 +2.500000E-01 +2.330000E-02 +2.500000E-01 +2.330000E-02 +9.800000E-01 +2.862000E-01 +9.800000E-01 +2.862000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +1.300000E-01 +9.700000E-03 +1.300000E-01 +9.700000E-03 +2.600000E-01 +3.380000E-02 +2.600000E-01 +3.380000E-02 +1.700000E-01 +7.900000E-03 +1.700000E-01 +7.900000E-03 +1.500000E-01 +7.900000E-03 +1.500000E-01 +7.900000E-03 +4.400000E-01 +5.900000E-02 +4.400000E-01 +5.900000E-02 +8.500000E-01 +1.735000E-01 +8.500000E-01 +1.735000E-01 +1.200000E-01 +4.400000E-03 +1.200000E-01 +4.400000E-03 +1.600000E-01 +8.000000E-03 +1.600000E-01 +8.000000E-03 +3.500000E-01 +3.190000E-02 +3.500000E-01 +3.190000E-02 +8.700000E-01 +2.063000E-01 +8.700000E-01 +2.063000E-01 +2.100000E-01 +2.630000E-02 +2.100000E-01 +2.630000E-02 +3.300000E-01 +3.550000E-02 +3.300000E-01 +3.550000E-02 +5.500000E-01 +1.175000E-01 +5.500000E-01 +1.175000E-01 +1.090000E+00 +4.213000E-01 +1.090000E+00 +4.213000E-01 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.300000E-01 +1.250000E-02 +1.300000E-01 +1.250000E-02 +3.200000E-01 +8.000000E-02 +3.200000E-01 +8.000000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.700000E-01 +2.890000E-02 +1.700000E-01 +2.890000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.100000E-01 +1.210000E-02 +1.100000E-01 +1.210000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.200000E-01 +4.800000E-03 +1.200000E-01 +4.800000E-03 +8.000000E-02 +5.000000E-03 +8.000000E-02 +5.000000E-03 +1.700000E-01 +1.170000E-02 +1.700000E-01 +1.170000E-02 +5.300000E-01 +9.450000E-02 +5.300000E-01 +9.450000E-02 +1.900000E-01 +2.310000E-02 +1.900000E-01 +2.310000E-02 +1.500000E-01 +1.170000E-02 +1.500000E-01 +1.170000E-02 +4.300000E-01 +8.550000E-02 +4.300000E-01 +8.550000E-02 +8.900000E-01 +3.441000E-01 +8.900000E-01 +3.441000E-01 +9.000000E-02 +3.500000E-03 +9.000000E-02 +3.500000E-03 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +7.000000E-02 +2.500000E-03 +7.000000E-02 +2.500000E-03 +1.400000E-01 +1.300000E-02 +1.400000E-01 +1.300000E-02 +2.300000E-01 +1.370000E-02 +2.300000E-01 +1.370000E-02 +2.100000E-01 +1.190000E-02 +2.100000E-01 +1.190000E-02 +4.400000E-01 +6.200000E-02 +4.400000E-01 +6.200000E-02 +9.800000E-01 +2.580000E-01 +9.800000E-01 +2.580000E-01 +1.300000E-01 +1.030000E-02 +1.300000E-01 +1.030000E-02 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +2.400000E-01 +2.880000E-02 +2.400000E-01 +2.880000E-02 +5.900000E-01 +1.613000E-01 +5.900000E-01 +1.613000E-01 +1.300000E-01 +5.500000E-03 +1.300000E-01 +5.500000E-03 +1.600000E-01 +7.800000E-03 +1.600000E-01 +7.800000E-03 +3.900000E-01 +4.730000E-02 +3.900000E-01 +4.730000E-02 +6.900000E-01 +1.465000E-01 +6.900000E-01 +1.465000E-01 +8.000000E-02 +3.000000E-03 +8.000000E-02 +3.000000E-03 +1.100000E-01 +6.900000E-03 +1.100000E-01 +6.900000E-03 +1.400000E-01 +7.000000E-03 +1.400000E-01 +7.000000E-03 +4.900000E-01 +6.630000E-02 +4.900000E-01 +6.630000E-02 +9.000000E-02 +5.300000E-03 +9.000000E-02 +5.300000E-03 +1.500000E-01 +1.730000E-02 +1.500000E-01 +1.730000E-02 +2.200000E-01 +2.440000E-02 +2.200000E-01 +2.440000E-02 +4.600000E-01 +1.220000E-01 +4.600000E-01 +1.220000E-01 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +2.700000E-01 +7.290000E-02 +2.700000E-01 +7.290000E-02 +4.000000E-02 +8.000000E-04 +4.000000E-02 +8.000000E-04 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +1.100000E-01 +4.100000E-03 +1.100000E-01 +4.100000E-03 +2.400000E-01 +3.440000E-02 +2.400000E-01 +3.440000E-02 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +1.000000E-01 +5.200000E-03 +1.000000E-01 +5.200000E-03 +2.300000E-01 +2.890000E-02 +2.300000E-01 +2.890000E-02 +5.100000E-01 +1.313000E-01 +5.100000E-01 +1.313000E-01 +1.300000E-01 +9.700000E-03 +1.300000E-01 +9.700000E-03 +1.100000E-01 +6.500000E-03 +1.100000E-01 +6.500000E-03 +2.000000E-01 +2.320000E-02 +2.000000E-01 +2.320000E-02 +5.800000E-01 +2.194000E-01 +5.800000E-01 +2.194000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +1.600000E-01 +1.780000E-02 +1.600000E-01 +1.780000E-02 +2.500000E-01 +5.770000E-02 +2.500000E-01 +5.770000E-02 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +3.200000E-01 +1.024000E-01 +3.200000E-01 +1.024000E-01 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +1.800000E-01 +1.160000E-02 +1.800000E-01 +1.160000E-02 +2.400000E-01 +1.700000E-02 +2.400000E-01 +1.700000E-02 +7.000000E-01 +2.108000E-01 +7.000000E-01 +2.108000E-01 +1.580000E+00 +7.900000E-01 +1.580000E+00 +7.900000E-01 +2.000000E-01 +8.400000E-03 +2.000000E-01 +8.400000E-03 +3.000000E-01 +2.160000E-02 +3.000000E-01 +2.160000E-02 +8.100000E-01 +1.547000E-01 +8.100000E-01 +1.547000E-01 +1.390000E+00 +4.307000E-01 +1.390000E+00 +4.307000E-01 +1.000000E-01 +3.000000E-03 +1.000000E-01 +3.000000E-03 +1.400000E-01 +6.000000E-03 +1.400000E-01 +6.000000E-03 +3.400000E-01 +3.180000E-02 +3.400000E-01 +3.180000E-02 +8.900000E-01 +1.627000E-01 +8.900000E-01 +1.627000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.400000E-01 +1.000000E-02 +1.400000E-01 +1.000000E-02 +1.600000E-01 +1.140000E-02 +1.600000E-01 +1.140000E-02 +1.000000E-01 +4.200000E-03 +1.000000E-01 +4.200000E-03 +3.500000E-01 +3.710000E-02 +3.500000E-01 +3.710000E-02 +7.500000E-01 +1.665000E-01 +7.500000E-01 +1.665000E-01 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +9.000000E-02 +6.500000E-03 +9.000000E-02 +6.500000E-03 +2.100000E-01 +1.710000E-02 +2.100000E-01 +1.710000E-02 +3.600000E-01 +5.340000E-02 +3.600000E-01 +5.340000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +4.000000E-02 +6.000000E-04 +4.000000E-02 +6.000000E-04 +2.400000E-01 +1.980000E-02 +2.400000E-01 +1.980000E-02 +4.400000E-01 +6.260000E-02 +4.400000E-01 +6.260000E-02 +8.000000E-02 +2.800000E-03 +8.000000E-02 +2.800000E-03 +7.000000E-02 +1.300000E-03 +7.000000E-02 +1.300000E-03 +3.400000E-01 +2.660000E-02 +3.400000E-01 +2.660000E-02 +6.000000E-01 +8.560000E-02 +6.000000E-01 +8.560000E-02 +1.300000E-01 +7.300000E-03 +1.300000E-01 +7.300000E-03 +8.000000E-02 +3.400000E-03 +8.000000E-02 +3.400000E-03 +2.000000E-01 +2.180000E-02 +2.000000E-01 +2.180000E-02 +5.300000E-01 +1.241000E-01 +5.300000E-01 +1.241000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.100000E-01 +1.210000E-02 +1.100000E-01 +1.210000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +6.000000E-04 +4.000000E-02 +6.000000E-04 +1.100000E-01 +4.300000E-03 +1.100000E-01 +4.300000E-03 +2.200000E-01 +1.660000E-02 +2.200000E-01 +1.660000E-02 +3.700000E-01 +5.770000E-02 +3.700000E-01 +5.770000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-02 +3.400000E-03 +8.000000E-02 +3.400000E-03 +2.000000E-01 +2.420000E-02 +2.000000E-01 +2.420000E-02 +7.000000E-02 +1.900000E-03 +7.000000E-02 +1.900000E-03 +8.000000E-02 +3.000000E-03 +8.000000E-02 +3.000000E-03 +1.700000E-01 +9.500000E-03 +1.700000E-01 +9.500000E-03 +3.900000E-01 +5.270000E-02 +3.900000E-01 +5.270000E-02 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +5.000000E-02 +1.100000E-03 +5.000000E-02 +1.100000E-03 +2.200000E-01 +2.920000E-02 +2.200000E-01 +2.920000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +1.300000E-01 +6.900000E-03 +1.300000E-01 +6.900000E-03 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +4.300000E-01 +6.570000E-02 +4.300000E-01 +6.570000E-02 +6.800000E-01 +1.570000E-01 +6.800000E-01 +1.570000E-01 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +7.000000E-02 +3.700000E-03 +7.000000E-02 +3.700000E-03 +2.100000E-01 +2.610000E-02 +2.100000E-01 +2.610000E-02 +4.100000E-01 +9.630000E-02 +4.100000E-01 +9.630000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.600000E-01 +2.560000E-02 +1.600000E-01 +2.560000E-02 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +7.000000E-02 +2.100000E-03 +7.000000E-02 +2.100000E-03 +2.100000E-01 +2.250000E-02 +2.100000E-01 +2.250000E-02 +5.000000E-02 +9.000000E-04 +5.000000E-02 +9.000000E-04 +9.000000E-02 +3.500000E-03 +9.000000E-02 +3.500000E-03 +1.900000E-01 +2.050000E-02 +1.900000E-01 +2.050000E-02 +4.200000E-01 +7.100000E-02 +4.200000E-01 +7.100000E-02 +1.600000E-01 +8.200000E-03 +1.600000E-01 +8.200000E-03 +1.700000E-01 +8.700000E-03 +1.700000E-01 +8.700000E-03 +3.900000E-01 +4.150000E-02 +3.900000E-01 +4.150000E-02 +8.500000E-01 +1.881000E-01 +8.500000E-01 +1.881000E-01 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.100000E-01 +1.210000E-02 +1.100000E-01 +1.210000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.000000E-01 +4.200000E-03 +1.000000E-01 +4.200000E-03 +1.400000E-01 +9.400000E-03 +1.400000E-01 +9.400000E-03 +2.000000E-01 +1.620000E-02 +2.000000E-01 +1.620000E-02 +3.700000E-01 +5.070000E-02 +3.700000E-01 +5.070000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-02 +2.500000E-03 +7.000000E-02 +2.500000E-03 +1.100000E-01 +4.900000E-03 +1.100000E-01 +4.900000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +9.000000E-02 +5.300000E-03 +9.000000E-02 +5.300000E-03 +7.000000E-02 +1.900000E-03 +7.000000E-02 +1.900000E-03 +1.500000E-01 +1.370000E-02 +1.500000E-01 +1.370000E-02 +1.500000E-01 +8.300000E-03 +1.500000E-01 +8.300000E-03 +1.700000E-01 +1.250000E-02 +1.700000E-01 +1.250000E-02 +3.000000E-01 +3.220000E-02 +3.000000E-01 +3.220000E-02 +8.200000E-01 +2.246000E-01 +8.200000E-01 +2.246000E-01 +1.500000E-01 +7.700000E-03 +1.500000E-01 +7.700000E-03 +1.000000E-01 +3.400000E-03 +1.000000E-01 +3.400000E-03 +2.100000E-01 +1.850000E-02 +2.100000E-01 +1.850000E-02 +4.500000E-01 +7.370000E-02 +4.500000E-01 +7.370000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-01 +1.130000E-02 +1.500000E-01 +1.130000E-02 +7.000000E-02 +3.700000E-03 +7.000000E-02 +3.700000E-03 +2.200000E-01 +2.600000E-02 +2.200000E-01 +2.600000E-02 +4.000000E-01 +8.080000E-02 +4.000000E-01 +8.080000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +3.400000E-01 +6.500000E-02 +3.400000E-01 +6.500000E-02 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.600000E-01 +2.260000E-02 +1.600000E-01 +2.260000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-02 +4.000000E-03 +8.000000E-02 +4.000000E-03 +8.000000E-02 +3.200000E-03 +8.000000E-02 +3.200000E-03 +1.900000E-01 +1.810000E-02 +1.900000E-01 +1.810000E-02 +3.700000E-01 +6.890000E-02 +3.700000E-01 +6.890000E-02 +2.400000E-01 +1.400000E-02 +2.400000E-01 +1.400000E-02 +3.300000E-01 +2.670000E-02 +3.300000E-01 +2.670000E-02 +6.000000E-01 +9.100000E-02 +6.000000E-01 +9.100000E-02 +1.430000E+00 +4.629000E-01 +1.430000E+00 +4.629000E-01 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.000000E-01 +8.200000E-03 +1.000000E-01 +8.200000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.100000E-01 +1.210000E-02 +1.100000E-01 +1.210000E-02 +1.000000E-01 +6.800000E-03 +1.000000E-01 +6.800000E-03 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +1.800000E-01 +3.240000E-02 +1.800000E-01 +3.240000E-02 +2.100000E-01 +4.410000E-02 +2.100000E-01 +4.410000E-02 +2.400000E-01 +5.760000E-02 +2.400000E-01 +5.760000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 diff --git a/tests/test_filter_mu/settings.xml b/tests/test_filter_mu/settings.xml new file mode 100644 index 0000000000..517637a59f --- /dev/null +++ b/tests/test_filter_mu/settings.xml @@ -0,0 +1,19 @@ + + + + + 10 + 5 + 100 + + + + + + -160 -160 -183 + 160 160 183 + + + + + diff --git a/tests/test_filter_mu/tallies.xml b/tests/test_filter_mu/tallies.xml new file mode 100644 index 0000000000..b72a8ba5ec --- /dev/null +++ b/tests/test_filter_mu/tallies.xml @@ -0,0 +1,27 @@ + + + + + rectangular + -182.07 -182.07 + 182.07 182.07 + 17 17 + + + + + scatter nu-scatter + + + + + scatter nu-scatter + + + + + + scatter nu-scatter + + + diff --git a/tests/test_filter_mu/test_filter_mu.py b/tests/test_filter_mu/test_filter_mu.py new file mode 100644 index 0000000000..1777db993e --- /dev/null +++ b/tests/test_filter_mu/test_filter_mu.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() From 95a52717902dc0b72235e851ea2afd31c6770a26 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 28 Aug 2015 20:54:44 -0400 Subject: [PATCH 035/519] Added capabilities for tallying over polar and azimuthal angles, added bounds checking for these new filters and mu while doing filter match searching, updated docs and tests. --- docs/source/usersguide/input.rst | 28 + openmc/constants.py | 4 +- openmc/statepoint.py | 3 +- openmc/tallies.py | 7 +- src/constants.F90 | 24 +- src/hdf5_summary.F90 | 12 +- src/input_xml.F90 | 96 +- src/output.F90 | 25 +- src/physics.F90 | 23 + src/relaxng/tallies.rnc | 6 +- src/relaxng/tallies.rng | 4 + src/search.F90 | 2 + src/state_point.F90 | 8 +- src/tally.F90 | 54 +- tests/test_filter_azimuthal/geometry.xml | 181 + tests/test_filter_azimuthal/materials.xml | 272 + tests/test_filter_azimuthal/results_true.dat | 2926 +++++++ tests/test_filter_azimuthal/settings.xml | 19 + tests/test_filter_azimuthal/tallies.xml | 34 + .../test_filter_azimuthal.py | 10 + tests/test_filter_mu/results_true.dat | 6978 ++++++++--------- tests/test_filter_polar/geometry.xml | 181 + tests/test_filter_polar/materials.xml | 272 + tests/test_filter_polar/results_true.dat | 2926 +++++++ tests/test_filter_polar/settings.xml | 19 + tests/test_filter_polar/tallies.xml | 34 + tests/test_filter_polar/test_filter_polar.py | 10 + 27 files changed, 10627 insertions(+), 3531 deletions(-) create mode 100644 tests/test_filter_azimuthal/geometry.xml create mode 100644 tests/test_filter_azimuthal/materials.xml create mode 100644 tests/test_filter_azimuthal/results_true.dat create mode 100644 tests/test_filter_azimuthal/settings.xml create mode 100644 tests/test_filter_azimuthal/tallies.xml create mode 100644 tests/test_filter_azimuthal/test_filter_azimuthal.py create mode 100644 tests/test_filter_polar/geometry.xml create mode 100644 tests/test_filter_polar/materials.xml create mode 100644 tests/test_filter_polar/results_true.dat create mode 100644 tests/test_filter_polar/settings.xml create mode 100644 tests/test_filter_polar/tallies.xml create mode 100644 tests/test_filter_polar/test_filter_polar.py diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 6e244bc9b4..7424121989 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1266,6 +1266,34 @@ The ```` element accepts the following sub-elements: :math:'\[-1,1\]' can be instead written as: ````. + :polar: + A monotonically increasing list of bounding particle polar angles + which represents a portion of the possible values of :math:'\[0,\pi\]'. + For example, spanning all of :math:'\[0,\pi\]' with five equi-width + bins can be specified as: + ```` + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:'\[0,\pi\]' should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:'\[0,\pi\]' can be instead written as: + ````. + + :azimuthal: + A monotonically increasing list of bounding particle azimuthal angles + which represents a portion of the possible values of :math:'\[-\pi,\pi\]'. + For example, spanning all of :math:'\[-\pi,\pi\]' with five equi-width + bins can be specified as: + ```` + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:'\[-\pi,\pi\]' should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:'\[-\pi,\pi\]' can be instead written as: + ````. + :mesh: The ``id`` of a structured mesh to be tallied over. diff --git a/openmc/constants.py b/openmc/constants.py index 1423a50029..8ba0d4cd5f 100644 --- a/openmc/constants.py +++ b/openmc/constants.py @@ -36,7 +36,9 @@ FILTER_TYPES = {1: 'universe', 7: 'energy', 8: 'energyout', 9: 'distribcell', - 10:'mu'} + 10:'mu', + 11: 'polar', + 12: 'azimuthal'} SCORE_TYPES = {-1: 'flux', -2: 'total', diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 8df9369bf7..ed3e9c1197 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -377,7 +377,8 @@ class StatePoint(object): raise ValueError(msg) # Read the bin values - if FILTER_TYPES[filter_type] in ['energy', 'energyout', 'mu']: + if FILTER_TYPES[filter_type] in ['energy', 'energyout', 'mu', + 'polar', 'azimuthal']: bins = self._get_double( n_bins+1, path='{0}{1}/bins'.format(subbase, j)) diff --git a/openmc/tallies.py b/openmc/tallies.py index 5bf064f23d..9423afbbcd 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -896,7 +896,8 @@ class Tally(object): bins = list(itertools.product(*xyz)) # Create list of 2-tuples for energy boundary bins - elif filter.type in ['energy', 'energyout', 'mu']: + elif filter.type in ['energy', 'energyout', 'mu', 'polar', + 'azimuthal']: bins = [] for k in range(filter.num_bins): bins.append((filter.bins[k], filter.bins[k+1])) @@ -1251,12 +1252,12 @@ class Tally(object): filter_bins = np.tile(filter_bins, tile_factor) df[filter.type + ' [MeV]'] = filter_bins - elif 'mu' is filter.type: + elif filter.type in ['mu', 'polar', 'azimuthal']: bins = filter.bins num_bins = filter.num_bins # Create strings for - template = '{0:.2f} - {1:.2f}' + template = '{0:1.2f} - {1:1.2f}' filter_bins = [] for i in range(num_bins): filter_bins.append(template.format(bins[i], bins[i+1])) diff --git a/src/constants.F90 b/src/constants.F90 index ee64e54325..d3b8d3f786 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -303,18 +303,20 @@ module constants integer, parameter :: NO_BIN_FOUND = -1 ! Tally filter and map types - integer, parameter :: N_FILTER_TYPES = 10 + integer, parameter :: N_FILTER_TYPES = 12 integer, parameter :: & - FILTER_UNIVERSE = 1, & - FILTER_MATERIAL = 2, & - FILTER_CELL = 3, & - FILTER_CELLBORN = 4, & - FILTER_SURFACE = 5, & - FILTER_MESH = 6, & - FILTER_ENERGYIN = 7, & - FILTER_ENERGYOUT = 8, & - FILTER_DISTRIBCELL = 9, & - FILTER_MU = 10 + FILTER_UNIVERSE = 1, & + FILTER_MATERIAL = 2, & + FILTER_CELL = 3, & + FILTER_CELLBORN = 4, & + FILTER_SURFACE = 5, & + FILTER_MESH = 6, & + FILTER_ENERGYIN = 7, & + FILTER_ENERGYOUT = 8, & + FILTER_DISTRIBCELL = 9, & + FILTER_MU = 10, & + FILTER_POLAR = 11, & + FILTER_AZIMUTHAL = 12 ! Tally surface current directions integer, parameter :: & diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index 4033019b1c..658423f130 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -608,7 +608,9 @@ contains ! Write filter bins if (t % filters(j) % type == FILTER_ENERGYIN .or. & t % filters(j) % type == FILTER_ENERGYOUT .or. & - t % filters(j) % type == FILTER_MU) then + t % filters(j) % type == FILTER_MU .or. & + t % filters(j) % type == FILTER_POLAR .or. & + t % filters(j) % type == FILTER_AZIMUTHAL) then call su % write_data(t % filters(j) % real_bins, "bins", & length=size(t % filters(j) % real_bins), & group="tallies/tally " // trim(to_str(t % id)) & @@ -658,6 +660,14 @@ contains call su % write_data("mu", "type_name", & group="tallies/tally " // trim(to_str(t % id)) & // "/filter " // trim(to_str(j))) + case(FILTER_POLAR) + call su % write_data("polar", "type_name", & + group="tallies/tally " // trim(to_str(t % id)) & + // "/filter " // trim(to_str(j))) + case(FILTER_AZIMUTHAL) + call su % write_data("azimuthal", "type_name", & + group="tallies/tally " // trim(to_str(t % id)) & + // "/filter " // trim(to_str(j))) end select end do FILTER_LOOP diff --git a/src/input_xml.F90 b/src/input_xml.F90 index b1cabb4cbb..e47a8809de 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2085,9 +2085,9 @@ contains integer :: imomstr ! Index of MOMENT_STRS & MOMENT_N_STRS logical :: file_exists ! does tallies.xml file exist? real(8) :: rarray3(3) ! temporary double prec. array - integer :: Nmu ! Number of angular bins - real(8) :: dmu ! Mu spacing if using automatic allocation - integer :: imu ! Loop counter for building mu filter bins + integer :: Nangle ! Number of angular bins + real(8) :: dangle ! Mu spacing if using automatic allocation + integer :: iangle ! Loop counter for building mu filter bins character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word character(MAX_WORD_LEN) :: score_name @@ -2355,7 +2355,8 @@ contains if (check_for_node(node_filt, "bins")) then if ((trim(temp_str) == 'energy' .or. & trim(temp_str) == 'energyout') .or. & - (trim(temp_str) == 'mu')) then + (trim(temp_str) == 'mu' .or. trim(temp_str) == 'polar') .or. & + (trim(temp_str) == 'azimuthal')) then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2502,23 +2503,22 @@ contains allocate(t % filters(j) % real_bins(n_words)) call get_node_array(node_filt, "bins", t % filters(j) % real_bins) - ! Easter egg! Allow a user to input a negative number, if it is only one - ! and that will mean you subivide [-1,1] evenly with the input - ! being the number of bins + ! Allow a user to input a lone number which will mean that + ! you subivide [-1,1] evenly with the input being the number of bins if (n_words == 1) then - Nmu = abs(int(t % filters(j) % real_bins(1))) - if (Nmu > 1) then - t % filters(j) % n_bins = Nmu - dmu = TWO / (real(Nmu,8)) + Nangle = abs(int(t % filters(j) % real_bins(1))) + if (Nangle > 1) then + t % filters(j) % n_bins = Nangle + dangle = TWO / (real(Nangle,8)) deallocate(t % filters(j) % real_bins) - allocate(t % filters(j) % real_bins(Nmu + 1)) - do imu = 1, Nmu + 1 - t % filters(j) % real_bins(imu) = -ONE + (imu - 1) * dmu + allocate(t % filters(j) % real_bins(Nangle + 1)) + do iangle = 1, Nangle + 1 + t % filters(j) % real_bins(iangle) = -ONE + (iangle - 1) * dangle end do - t % filters(j) % real_bins(Nmu + 1) = ONE + t % filters(j) % real_bins(Nangle + 1) = ONE else - call fatal_error("Must have more than one bin for mu filter & - & on tally " // trim(to_str(t % id)) // ".") + call fatal_error("Number of bins for mu filter must be& + & greater than 1 on tally " // trim(to_str(t % id)) // ".") end if end if @@ -2526,6 +2526,68 @@ contains ! Set to analog estimator t % estimator = ESTIMATOR_ANALOG + case ('polar') + ! Set type of filter + t % filters(j) % type = FILTER_POLAR + + ! Set number of bins + t % filters(j) % n_bins = n_words - 1 + + ! Allocate and store bins + allocate(t % filters(j) % real_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % real_bins) + + ! Allow a user to input a lone number which will mean that + ! you subivide [0,pi] evenly with the input being the number of bins + if (n_words == 1) then + Nangle = abs(int(t % filters(j) % real_bins(1))) + if (Nangle > 1) then + t % filters(j) % n_bins = Nangle + dangle = PI / (real(Nangle,8)) + deallocate(t % filters(j) % real_bins) + allocate(t % filters(j) % real_bins(Nangle + 1)) + do iangle = 1, Nangle + 1 + t % filters(j) % real_bins(iangle) = (iangle - 1) * dangle + end do + t % filters(j) % real_bins(Nangle + 1) = PI + else + call fatal_error("Number of bins for polar filter must be& + & greater than 1 on tally " // trim(to_str(t % id)) // ".") + end if + + end if + + case ('azimuthal') + ! Set type of filter + t % filters(j) % type = FILTER_AZIMUTHAL + + ! Set number of bins + t % filters(j) % n_bins = n_words - 1 + + ! Allocate and store bins + allocate(t % filters(j) % real_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % real_bins) + + ! Allow a user to input a lone number which will mean that + ! you subivide [0,2pi] evenly with the input being the number of bins + if (n_words == 1) then + Nangle = abs(int(t % filters(j) % real_bins(1))) + if (Nangle > 1) then + t % filters(j) % n_bins = Nangle + dangle = TWO * PI / (real(Nangle,8)) + deallocate(t % filters(j) % real_bins) + allocate(t % filters(j) % real_bins(Nangle + 1)) + do iangle = 1, Nangle + 1 + t % filters(j) % real_bins(iangle) = -PI + (iangle - 1) * dangle + end do + t % filters(j) % real_bins(Nangle + 1) = PI + else + call fatal_error("Number of bins for azimuthal filter must be& + & greater than 1 on tally " // trim(to_str(t % id)) // ".") + end if + + end if + case default ! Specified tally filter is invalid, raise error call fatal_error("Unknown filter type '" & diff --git a/src/output.F90 b/src/output.F90 index 9c62de610e..b6de97ad2b 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -864,6 +864,26 @@ contains write(unit_,*) ' Change-in-Angle Bins:' // trim(string) end if + ! Write any neutron angle bins if present, first polar then azimuthal + j = t % find_filter(FILTER_POLAR) + if (j > 0) then + string = "" + do i = 1, t % filters(j) % n_bins + 1 + string = trim(string) // ' ' // trim(to_str(& + t % filters(j) % real_bins(i))) + end do + write(unit_,*) ' Polar Angle Bins:' // trim(string) + end if + j = t % find_filter(FILTER_AZIMUTHAL) + if (j > 0) then + string = "" + do i = 1, t % filters(j) % n_bins + 1 + string = trim(string) // ' ' // trim(to_str(& + t % filters(j) % real_bins(i))) + end do + write(unit_,*) ' Azimuthal Angle Bins:' // trim(string) + end if + ! Write nuclides bins write(unit_,fmt='(1X,A)',advance='no') ' Nuclide Bins:' do i = 1, t % n_nuclide_bins @@ -1750,6 +1770,8 @@ contains filter_name(FILTER_ENERGYIN) = "Incoming Energy" filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" filter_name(FILTER_MU) = "Change-in-Angle" + filter_name(FILTER_POLAR) = "Polar Angle" + filter_name(FILTER_AZIMUTHAL) = "Azimuthal Angle" ! Initialize names for scores score_names(abs(SCORE_FLUX)) = "Flux" @@ -2187,7 +2209,8 @@ contains label = "Index (" // trim(to_str(ijk(1))) // ", " // & trim(to_str(ijk(2))) // ", " // trim(to_str(ijk(3))) // ")" end if - case (FILTER_ENERGYIN, FILTER_ENERGYOUT, FILTER_MU) + case (FILTER_ENERGYIN, FILTER_ENERGYOUT, FILTER_MU, FILTER_POLAR, & + FILTER_AZIMUTHAL) E0 = t % filters(i_filter) % real_bins(bin) E1 = t % filters(i_filter) % real_bins(bin + 1) label = "[" // trim(to_str(E0)) // ", " // trim(to_str(E1)) // ")" diff --git a/src/physics.F90 b/src/physics.F90 index 85a2b0b6fc..9ea9f076b5 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -472,6 +472,12 @@ contains ! Set energy and direction of particle in LAB frame uvw = v_n / vel + ! Because of floating-point roundoff, it may be possible for mu_lab to be + ! outside of the range [-1,1). In these cases, we just set mu_lab to exactly + ! -1 or 1 + + if (abs(mu_lab) > ONE) mu_lab = sign(ONE,mu_lab) + end subroutine elastic_scatter !=============================================================================== @@ -718,6 +724,12 @@ contains end if ! (inelastic secondary energy treatment) end if ! (elastic or inelastic) + ! Because of floating-point roundoff, it may be possible for mu to be + ! outside of the range [-1,1). In these cases, we just set mu to exactly + ! -1 or 1 + + if (abs(mu) > ONE) mu = sign(ONE,mu) + ! change direction of particle uvw = rotate_angle(uvw, mu) @@ -1305,6 +1317,11 @@ contains ! sample outgoing energy if (law == 44 .or. law == 61) then call sample_energy(rxn%edist, E_in, E, mu) + ! Because of floating-point roundoff, it may be possible for mu to be + ! outside of the range [-1,1). In these cases, we just set mu to exactly + ! -1 or 1 + + if (abs(mu) > ONE) mu = sign(ONE,mu) elseif (law == 66) then call sample_energy(rxn%edist, E_in, E, A=A, Q=Q) else @@ -1322,6 +1339,12 @@ contains ! determine outgoing angle in lab mu = mu * sqrt(E_cm/E) + ONE/(A+ONE) * sqrt(E_in/E) + + ! Because of floating-point roundoff, it may be possible for mu to be + ! outside of the range [-1,1). In these cases, we just set mu to exactly + ! -1 or 1 + + if (abs(mu) > ONE) mu = sign(ONE,mu) end if ! Set outgoing energy and scattering angle diff --git a/src/relaxng/tallies.rnc b/src/relaxng/tallies.rnc index d3e5e87e83..dfa754888f 100644 --- a/src/relaxng/tallies.rnc +++ b/src/relaxng/tallies.rnc @@ -23,9 +23,11 @@ element tallies { attribute estimator { ( "analog" | "tracklength" ) })? & element filter { (element type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu") } | + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu" | + "polar" | "azimuthal") } | attribute type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu") }) & + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu" | + "polar" | "azimuthal") }) & (element bins { list { xsd:double+ } } | attribute bins { list { xsd:double+ } }) }* & diff --git a/src/relaxng/tallies.rng b/src/relaxng/tallies.rng index ce0d2d1bcd..8b182f41cc 100644 --- a/src/relaxng/tallies.rng +++ b/src/relaxng/tallies.rng @@ -152,6 +152,8 @@ energy energyout mu + polar + azimuthal @@ -166,6 +168,8 @@ energy energyout mu + polar + azimuthal diff --git a/src/search.F90 b/src/search.F90 index dab7fa67ca..a6657b71de 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -34,6 +34,8 @@ contains R = n if (val < array(L) .or. val > array(R)) then +write(*,*) val +write(*,*) array call fatal_error("Value outside of array during binary search") end if diff --git a/src/state_point.F90 b/src/state_point.F90 index 23c46117dd..4beff50d8d 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -257,7 +257,9 @@ contains "/filter " // to_str(j)) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & tally % filters(j) % type == FILTER_ENERGYOUT .or. & - tally % filters(j) % type == FILTER_MU) then + tally % filters(j) % type == FILTER_MU .or. & + tally % filters(j) % type == FILTER_POLAR .or. & + tally % filters(j) % type == FILTER_AZIMUTHAL) then call sp % write_data(tally % filters(j) % real_bins, "bins", & group="tallies/tally " // trim(to_str(tally % id)) // & "/filter " // to_str(j), & @@ -845,7 +847,9 @@ contains "/filter " // to_str(j)) if (tally % filters(j) % type == FILTER_ENERGYIN .or. & tally % filters(j) % type == FILTER_ENERGYOUT .or. & - tally % filters(j) % type == FILTER_MU) then + tally % filters(j) % type == FILTER_MU .or. & + tally % filters(j) % type == FILTER_POLAR .or. & + tally % filters(j) % type == FILTER_AZIMUTHAL) then call sp % read_data(tally % filters(j) % real_bins, "bins", & group="tallies/tally " // trim(to_str(curr_key)) // & "/filter " // to_str(j), & diff --git a/src/tally.F90 b/src/tally.F90 index fc05145db4..fe9127c30b 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1134,6 +1134,7 @@ contains integer :: n ! number of bins for single filter integer :: offset ! offset for distribcell real(8) :: E ! particle energy + real(8) :: theta, phi ! Polar and Azimuthal Angles, respectively type(TallyObject), pointer :: t type(StructuredMesh), pointer :: m @@ -1248,9 +1249,56 @@ contains ! determine mu bin n = t % filters(i) % n_bins - ! search to find incoming energy bin - matching_bins(i) = binary_search(t % filters(i) % real_bins, & - n + 1, p % mu) + ! check if particle is within mu bins + if (p % mu < t % filters(i) % real_bins(1) .or. & + p % mu > t % filters(i) % real_bins(n + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find mu bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, p % mu) + end if + + case (FILTER_POLAR) + ! make sure the correct direction vector is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + theta = acos(p % coord(1) % uvw(3)) + else + theta = acos(p % last_uvw(3)) + end if + + ! determine polar angle bin + n = t % filters(i) % n_bins + + ! check if particle is within polar angle bins + if (theta < t % filters(i) % real_bins(1) .or. & + theta > t % filters(i) % real_bins(n + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find polar angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, theta) + end if + + case (FILTER_AZIMUTHAL) + ! make sure the correct direction vector is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + phi = atan2(p % coord(1) % uvw(2), p % coord(1) % uvw(1)) + else + phi = atan2(p % last_uvw(2), p % last_uvw(1)) + end if + ! determine mu bin + n = t % filters(i) % n_bins + + ! check if particle is within azimuthal angle bins + if (phi < t % filters(i) % real_bins(1) .or. & + phi > t % filters(i) % real_bins(n + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find azimuthal angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, phi) + end if end select diff --git a/tests/test_filter_azimuthal/geometry.xml b/tests/test_filter_azimuthal/geometry.xml new file mode 100644 index 0000000000..b85dd04df9 --- /dev/null +++ b/tests/test_filter_azimuthal/geometry.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + + + diff --git a/tests/test_filter_azimuthal/materials.xml b/tests/test_filter_azimuthal/materials.xml new file mode 100644 index 0000000000..9c0b74f3f1 --- /dev/null +++ b/tests/test_filter_azimuthal/materials.xml @@ -0,0 +1,272 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_filter_azimuthal/results_true.dat b/tests/test_filter_azimuthal/results_true.dat new file mode 100644 index 0000000000..4db1c808ff --- /dev/null +++ b/tests/test_filter_azimuthal/results_true.dat @@ -0,0 +1,2926 @@ +k-combined: +1.005983E+00 2.248579E-02 +tally 1: +4.425771E+01 +3.941365E+02 +4.568410E+01 +4.186261E+02 +4.331348E+01 +3.761395E+02 +4.303935E+01 +3.722809E+02 +4.442206E+01 +3.973876E+02 +tally 2: +4.465691E+01 +4.000577E+02 +4.493676E+01 +4.042794E+02 +4.526714E+01 +4.105857E+02 +4.187211E+01 +3.514841E+02 +4.448687E+01 +3.969539E+02 +tally 3: +4.425771E+01 +3.941365E+02 +4.568410E+01 +4.186261E+02 +4.333417E+01 +3.764991E+02 +4.301865E+01 +3.719138E+02 +4.442206E+01 +3.973876E+02 +tally 4: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.474302E-01 +2.173566E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.250677E-01 +1.806825E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.379743E+00 +1.311268E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.411476E-01 +1.292788E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.041947E-01 +1.293434E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.858540E-01 +1.488833E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.338682E-01 +3.487437E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.915994E+00 +1.046110E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.383099E+00 +6.158644E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.733692E-01 +4.271368E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.358559E-01 +1.127992E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.715092E-02 +2.223209E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.510162E-02 +9.044318E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.239565E-01 +3.408418E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.837242E-01 +3.095588E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.994150E-01 +2.866219E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.724238E-01 +7.421475E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.433355E-01 +1.157425E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.547867E-01 +1.313519E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.879130E+00 +9.055069E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.368540E-01 +6.270785E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.652111E+00 +1.033642E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.310051E+00 +9.755343E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.097363E+00 +1.364448E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.373035E+00 +1.305514E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.745973E+00 +1.053371E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.139451E+00 +1.572197E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.774043E+00 +3.284606E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.295905E+00 +6.522302E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.221434E+00 +5.018537E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.562734E+00 +8.637801E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.649733E-01 +2.226711E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.288704E+00 +7.109246E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.466278E+00 +1.578589E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.807475E-01 +4.695137E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.126927E-02 +8.330079E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.720195E-01 +8.707551E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.990373E+00 +2.342787E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.189163E+00 +5.672280E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.799118E+00 +9.852508E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.604690E+00 +9.452433E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.751744E+00 +2.548820E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.590271E+00 +1.069990E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.160807E+00 +2.684910E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.968641E+00 +1.977620E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.115995E+00 +3.927279E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.487088E+00 +8.377840E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.815094E-01 +7.655932E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.566015E+00 +8.425867E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.544552E-01 +3.858396E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.145926E-01 +8.654276E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.404772E-01 +5.782929E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.354304E-01 +9.779168E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.473896E-01 +4.381391E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.075755E+00 +1.180059E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.798183E+00 +1.189243E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.205742E-01 +2.287243E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.535623E-01 +4.961922E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.019654E+00 +6.953712E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.843585E+00 +1.633603E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.369353E+00 +1.220652E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.262961E+00 +8.319161E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.391250E+00 +3.942772E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.547550E+00 +6.442982E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.755185E-02 +1.410142E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.166100E-01 +1.359789E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.772549E-01 +3.883777E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.561903E+00 +8.529594E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.673305E+00 +8.100900E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.189537E-01 +2.053395E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.216662E+00 +2.266186E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.018099E-01 +2.801217E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.099694E+00 +1.039958E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.640385E+00 +1.310152E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.780649E+00 +3.660598E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.628211E-01 +2.651070E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.962156E-01 +3.850057E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.052562E-01 +2.499929E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.634501E+00 +1.758133E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.767142E+00 +2.999082E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.209998E+00 +1.296913E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.850185E-01 +1.260300E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.631538E-02 +9.276652E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.024256E-01 +9.618585E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.570476E+00 +8.807549E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.207632E+00 +6.365426E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.273172E-01 +1.071365E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.150722E-01 +1.477306E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.365363E-01 +1.545056E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.634484E+00 +1.006786E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.963647E+00 +1.921299E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.855612E+00 +3.738770E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.949577E-01 +6.996292E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.933716E-01 +8.606692E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.047296E-01 +9.286014E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.528920E-01 +6.502654E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.143609E-01 +1.307841E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.259810E-01 +4.281927E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.829227E+00 +2.711068E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.771012E-02 +5.375002E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.504231E-01 +3.192897E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.258896E+00 +4.828866E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.744319E+00 +1.102318E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.315201E+00 +5.202230E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.383778E+00 +1.064894E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.373598E-01 +1.384092E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.752996E-01 +3.072994E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.414144E-01 +1.165638E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.117217E-01 +1.695148E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.020974E-01 +1.807843E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.790545E+00 +1.606987E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.811463E+00 +1.690787E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.624100E-01 +3.163050E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.499073E-01 +2.247220E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.384807E+00 +6.489982E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.600506E+00 +1.075835E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.003754E+00 +1.473659E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.138289E+00 +1.397348E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.361580E+00 +9.669336E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.832439E-01 +8.022708E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.635807E+00 +6.575567E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.431523E+00 +2.763717E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.943625E-02 +2.266446E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.659683E-01 +3.141838E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.404488E+00 +1.657632E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.337272E+00 +6.818393E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.906319E-01 +3.634051E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.968808E-01 +8.813823E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.401085E-02 +7.057823E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.438771E-01 +6.726955E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.135095E-01 +1.453647E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.117081E-01 +2.474125E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.890267E+00 +9.971621E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.217831E-02 +2.722576E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.875279E-01 +7.222991E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.465873E+00 +1.684795E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.582101E-01 +2.308163E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.975907E-01 +1.580784E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.163055E+00 +4.040199E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.387764E+00 +4.357290E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.196106E+00 +5.866078E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.414320E-01 +1.354077E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.331388E+00 +7.999297E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.385501E-01 +1.119957E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.319981E-02 +1.742350E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.395770E-02 +8.828049E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.930196E+00 +1.056890E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.430206E+00 +1.555413E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.266456E+00 +6.181299E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.998920E-01 +3.995682E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.956201E-02 +4.777812E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.595216E-01 +1.454967E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.292285E+00 +8.702623E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.864587E-01 +8.205860E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.004358E+00 +5.599700E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.878242E-01 +3.111548E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.003831E-01 +1.007678E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.390952E-01 +2.937091E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.752746E+00 +1.853071E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.861695E-01 +8.327886E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.125953E-01 +2.392175E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.518722E-01 +1.238140E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.082653E-02 +9.502751E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.871455E-02 +6.195980E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.032079E-01 +9.193502E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 diff --git a/tests/test_filter_azimuthal/settings.xml b/tests/test_filter_azimuthal/settings.xml new file mode 100644 index 0000000000..517637a59f --- /dev/null +++ b/tests/test_filter_azimuthal/settings.xml @@ -0,0 +1,19 @@ + + + + + 10 + 5 + 100 + + + + + + -160 -160 -183 + 160 160 183 + + + + + diff --git a/tests/test_filter_azimuthal/tallies.xml b/tests/test_filter_azimuthal/tallies.xml new file mode 100644 index 0000000000..b0c29d29be --- /dev/null +++ b/tests/test_filter_azimuthal/tallies.xml @@ -0,0 +1,34 @@ + + + + + rectangular + -182.07 -182.07 + 182.07 182.07 + 17 17 + + + + + flux + + + + + flux + analog + + + + + + flux + + + + + + flux + + + diff --git a/tests/test_filter_azimuthal/test_filter_azimuthal.py b/tests/test_filter_azimuthal/test_filter_azimuthal.py new file mode 100644 index 0000000000..1777db993e --- /dev/null +++ b/tests/test_filter_azimuthal/test_filter_azimuthal.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_filter_mu/results_true.dat b/tests/test_filter_mu/results_true.dat index b319bd47d5..eb8c278fd0 100644 --- a/tests/test_filter_mu/results_true.dat +++ b/tests/test_filter_mu/results_true.dat @@ -1,39 +1,39 @@ k-combined: -1.093844E+00 1.626801E-02 +1.005983E+00 2.248579E-02 tally 1: -1.169000E+01 -2.745630E+01 -1.171000E+01 -2.755450E+01 -1.319000E+01 -3.518910E+01 -1.319000E+01 -3.518910E+01 -3.113000E+01 -1.944005E+02 -3.113000E+01 -1.944005E+02 -7.042000E+01 -9.930924E+02 -7.042000E+01 -9.930924E+02 +1.238000E+01 +3.065560E+01 +1.238000E+01 +3.065560E+01 +1.397000E+01 +3.913670E+01 +1.397000E+01 +3.913670E+01 +3.167000E+01 +2.010715E+02 +3.167000E+01 +2.010715E+02 +7.216000E+01 +1.042565E+03 +7.216000E+01 +1.042565E+03 tally 2: -1.169000E+01 -2.745630E+01 -1.171000E+01 -2.755450E+01 -1.319000E+01 -3.518910E+01 -1.319000E+01 -3.518910E+01 -3.113000E+01 -1.944005E+02 -3.113000E+01 -1.944005E+02 -7.042000E+01 -9.930924E+02 -7.042000E+01 -9.930924E+02 +1.238000E+01 +3.065560E+01 +1.238000E+01 +3.065560E+01 +1.397000E+01 +3.913670E+01 +1.397000E+01 +3.913670E+01 +3.167000E+01 +2.010715E+02 +3.167000E+01 +2.010715E+02 +7.216000E+01 +1.042565E+03 +7.216000E+01 +1.042565E+03 tally 3: 0.000000E+00 0.000000E+00 @@ -387,22 +387,38 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -1.000000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 1.000000E-02 -1.000000E-01 +1.000000E-04 1.000000E-02 +1.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 2.000000E-01 4.000000E-02 2.000000E-01 4.000000E-02 -3.000000E-01 -9.000000E-02 -3.000000E-01 -9.000000E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -611,438 +627,402 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 4.000000E-02 -6.000000E-04 +8.000000E-04 4.000000E-02 -6.000000E-04 -7.000000E-02 -1.300000E-03 -7.000000E-02 -1.300000E-03 -1.500000E-01 -6.300000E-03 -1.500000E-01 -6.300000E-03 -3.800000E-01 -3.860000E-02 -3.800000E-01 -3.860000E-02 -1.400000E-01 -5.800000E-03 -1.400000E-01 -5.800000E-03 -1.000000E-01 -4.400000E-03 -1.000000E-01 -4.400000E-03 -5.600000E-01 -1.062000E-01 -5.600000E-01 -1.062000E-01 -1.090000E+00 -3.691000E-01 -1.090000E+00 -3.691000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.200000E-01 -1.440000E-02 -1.200000E-01 -1.440000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.200000E-01 -6.200000E-03 -1.200000E-01 -6.200000E-03 -1.900000E-01 -1.870000E-02 -1.900000E-01 -1.870000E-02 -2.500000E-01 -2.790000E-02 -2.500000E-01 -2.790000E-02 -2.400000E-01 -2.060000E-02 -2.400000E-01 -2.060000E-02 -7.400000E-01 -1.752000E-01 -7.400000E-01 -1.752000E-01 -1.310000E+00 -4.805000E-01 -1.310000E+00 -4.805000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -9.000000E-02 -6.500000E-03 -9.000000E-02 -6.500000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +8.000000E-04 8.000000E-02 3.400000E-03 +8.000000E-02 +3.400000E-03 +1.400000E-01 +1.000000E-02 +1.400000E-01 +1.000000E-02 +4.500000E-01 +1.025000E-01 +4.500000E-01 +1.025000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.600000E-01 +1.780000E-02 +1.600000E-01 +1.780000E-02 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.600000E-01 +2.260000E-02 +1.600000E-01 +2.260000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.900000E-01 +3.610000E-02 +1.900000E-01 +3.610000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.000000E-02 +4.100000E-03 +9.000000E-02 +4.100000E-03 +3.300000E-01 +7.250000E-02 +3.300000E-01 +7.250000E-02 +6.000000E-02 +1.200000E-03 +6.000000E-02 +1.200000E-03 +1.400000E-01 +7.800000E-03 +1.400000E-01 +7.800000E-03 +2.600000E-01 +2.100000E-02 +2.600000E-01 +2.100000E-02 +5.600000E-01 +9.800000E-02 +5.600000E-01 +9.800000E-02 +2.700000E-01 +2.870000E-02 +2.700000E-01 +2.870000E-02 +2.200000E-01 +1.900000E-02 +2.200000E-01 +1.900000E-02 +6.300000E-01 +1.643000E-01 +6.300000E-01 +1.643000E-01 +1.150000E+00 +4.549000E-01 +1.150000E+00 +4.549000E-01 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 9.000000E-02 4.500000E-03 +9.000000E-02 +4.500000E-03 +1.200000E-01 +6.200000E-03 +1.200000E-01 +6.200000E-03 +4.600000E-01 +9.860000E-02 +4.600000E-01 +9.860000E-02 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.400000E-01 +1.960000E-02 +1.400000E-01 +1.960000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 2.000000E-02 4.000000E-04 2.000000E-02 4.000000E-04 -1.000000E-01 -5.200000E-03 -1.000000E-01 -5.200000E-03 -3.200000E-01 -6.400000E-02 -3.200000E-01 -6.400000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1059,174 +1039,110 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -5.000000E-02 +3.000000E-02 9.000000E-04 -5.000000E-02 +3.000000E-02 9.000000E-04 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.100000E-01 -6.500000E-03 -1.100000E-01 -6.500000E-03 -1.400000E-01 -8.400000E-03 -1.400000E-01 -8.400000E-03 -1.000000E-01 -3.800000E-03 -1.000000E-01 -3.800000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -8.000000E-02 -2.600000E-03 -8.000000E-02 -2.600000E-03 -4.000000E-01 -6.180000E-02 -4.000000E-01 -6.180000E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-02 -3.800000E-03 -8.000000E-02 -3.800000E-03 -1.000000E-01 -3.600000E-03 -1.000000E-01 -3.600000E-03 -2.700000E-01 -2.570000E-02 -2.700000E-01 -2.570000E-02 -5.500000E-01 -1.073000E-01 -5.500000E-01 -1.073000E-01 -9.000000E-02 -3.300000E-03 -9.000000E-02 -3.300000E-03 -7.000000E-02 -2.500000E-03 -7.000000E-02 -2.500000E-03 -2.800000E-01 -2.860000E-02 -2.800000E-01 -2.860000E-02 -8.100000E-01 -2.205000E-01 -8.100000E-01 -2.205000E-01 -1.500000E-01 -5.500000E-03 -1.500000E-01 -5.500000E-03 -1.300000E-01 -5.100000E-03 -1.300000E-01 -5.100000E-03 -3.200000E-01 -2.740000E-02 -3.200000E-01 -2.740000E-02 -9.100000E-01 -1.667000E-01 -9.100000E-01 -1.667000E-01 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 4.000000E-02 1.000000E-03 4.000000E-02 1.000000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +8.000000E-04 +4.000000E-02 +8.000000E-04 +1.100000E-01 +4.500000E-03 +1.100000E-01 +4.500000E-03 +2.500000E-01 +2.630000E-02 +2.500000E-01 +2.630000E-02 +9.000000E-02 +2.900000E-03 +9.000000E-02 +2.900000E-03 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +2.200000E-01 +1.740000E-02 +2.200000E-01 +1.740000E-02 +4.500000E-01 +6.810000E-02 +4.500000E-01 +6.810000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 7.000000E-02 -3.700000E-03 +4.900000E-03 7.000000E-02 -3.700000E-03 -2.700000E-01 -4.250000E-02 -2.700000E-01 -4.250000E-02 -2.300000E-01 -1.390000E-02 -2.300000E-01 -1.390000E-02 -1.700000E-01 -7.300000E-03 -1.700000E-01 -7.300000E-03 -4.600000E-01 -5.060000E-02 -4.600000E-01 -5.060000E-02 -1.180000E+00 -3.338000E-01 -1.180000E+00 -3.338000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 +4.900000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 2.000000E-02 4.000000E-04 2.000000E-02 @@ -1236,49 +1152,133 @@ tally 3: 4.000000E-02 1.600000E-03 9.000000E-02 -2.900000E-03 +8.100000E-03 9.000000E-02 -2.900000E-03 +8.100000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +1.700000E-01 +1.150000E-02 +1.700000E-01 +1.150000E-02 +1.400000E-01 +8.600000E-03 +1.400000E-01 +8.600000E-03 +3.200000E-01 +3.420000E-02 +3.200000E-01 +3.420000E-02 +5.200000E-01 +8.280000E-02 +5.200000E-01 +8.280000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 3.000000E-02 -5.000000E-04 +9.000000E-04 3.000000E-02 -5.000000E-04 -2.300000E-01 -2.010000E-02 -2.300000E-01 -2.010000E-02 -4.000000E-01 -4.680000E-02 -4.000000E-01 -4.680000E-02 -1.000000E-01 -2.800000E-03 -1.000000E-01 -2.800000E-03 -1.100000E-01 -3.900000E-03 -1.100000E-01 -3.900000E-03 -3.100000E-01 -2.810000E-02 -3.100000E-01 -2.810000E-02 -6.000000E-01 -9.540000E-02 -6.000000E-01 -9.540000E-02 +9.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.900000E-01 +3.610000E-02 +1.900000E-01 +3.610000E-02 +1.600000E-01 +1.100000E-02 +1.600000E-01 +1.100000E-02 +8.000000E-02 +3.200000E-03 +8.000000E-02 +3.200000E-03 +2.700000E-01 +3.650000E-02 +2.700000E-01 +3.650000E-02 +5.900000E-01 +1.701000E-01 +5.900000E-01 +1.701000E-01 +8.000000E-02 +2.400000E-03 +8.000000E-02 +2.400000E-03 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.800000E-01 +2.340000E-02 +1.800000E-01 +2.340000E-02 +4.100000E-01 +8.590000E-02 +4.100000E-01 +8.590000E-02 +1.600000E-01 +7.800000E-03 +1.600000E-01 +7.800000E-03 1.300000E-01 -5.100000E-03 +5.700000E-03 1.300000E-01 +5.700000E-03 +2.900000E-01 +2.530000E-02 +2.900000E-01 +2.530000E-02 +6.100000E-01 +9.270000E-02 +6.100000E-01 +9.270000E-02 +1.300000E-01 +4.500000E-03 +1.300000E-01 +4.500000E-03 +1.500000E-01 5.100000E-03 +1.500000E-01 +5.100000E-03 +3.800000E-01 +3.700000E-02 +3.800000E-01 +3.700000E-02 +8.400000E-01 +1.970000E-01 +8.400000E-01 +1.970000E-01 +1.200000E-01 +5.000000E-03 +1.200000E-01 +5.000000E-03 8.000000E-02 2.600000E-03 8.000000E-02 2.600000E-03 -3.000000E-01 -2.860000E-02 -3.000000E-01 -2.860000E-02 +2.900000E-01 +2.850000E-02 +2.900000E-01 +2.850000E-02 6.200000E-01 1.282000E-01 6.200000E-01 @@ -1295,154 +1295,154 @@ tally 3: 4.180000E-02 3.400000E-01 4.180000E-02 -7.700000E-01 -1.905000E-01 -7.700000E-01 -1.905000E-01 -2.700000E-01 -3.470000E-02 -2.700000E-01 -3.470000E-02 -2.700000E-01 -3.050000E-02 -2.700000E-01 -3.050000E-02 -5.200000E-01 -1.032000E-01 -5.200000E-01 -1.032000E-01 -1.680000E+00 -1.022600E+00 -1.680000E+00 -1.022600E+00 -7.000000E-02 -3.700000E-03 -7.000000E-02 -3.700000E-03 -6.000000E-02 -2.000000E-03 -6.000000E-02 -2.000000E-03 -1.700000E-01 -1.490000E-02 -1.700000E-01 -1.490000E-02 -4.200000E-01 -9.000000E-02 -4.200000E-01 -9.000000E-02 -7.000000E-02 -1.900000E-03 -7.000000E-02 -1.900000E-03 +7.500000E-01 +1.901000E-01 +7.500000E-01 +1.901000E-01 +1.100000E-01 +8.500000E-03 +1.100000E-01 +8.500000E-03 +1.600000E-01 +1.060000E-02 +1.600000E-01 +1.060000E-02 +3.100000E-01 +4.930000E-02 +3.100000E-01 +4.930000E-02 +9.900000E-01 +4.805000E-01 +9.900000E-01 +4.805000E-01 1.000000E-01 -3.000000E-03 +4.400000E-03 1.000000E-01 -3.000000E-03 +4.400000E-03 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 1.500000E-01 -5.900000E-03 +9.300000E-03 1.500000E-01 -5.900000E-03 -4.400000E-01 -4.520000E-02 -4.400000E-01 -4.520000E-02 -9.000000E-02 -4.500000E-03 -9.000000E-02 -4.500000E-03 -1.000000E-01 -3.000000E-03 -1.000000E-01 -3.000000E-03 -2.000000E-01 -1.680000E-02 -2.000000E-01 -1.680000E-02 -4.400000E-01 -8.340000E-02 -4.400000E-01 -8.340000E-02 -6.000000E-02 -1.400000E-03 -6.000000E-02 -1.400000E-03 +9.300000E-03 +4.000000E-01 +6.160000E-02 +4.000000E-01 +6.160000E-02 +3.400000E-01 +3.580000E-02 +3.400000E-01 +3.580000E-02 +3.300000E-01 +3.450000E-02 +3.300000E-01 +3.450000E-02 +6.700000E-01 +1.431000E-01 +6.700000E-01 +1.431000E-01 +1.250000E+00 +4.875000E-01 +1.250000E+00 +4.875000E-01 +1.500000E-01 +7.700000E-03 +1.500000E-01 +7.700000E-03 +1.600000E-01 +7.800000E-03 +1.600000E-01 +7.800000E-03 +3.500000E-01 +4.250000E-02 +3.500000E-01 +4.250000E-02 +7.100000E-01 +1.677000E-01 +7.100000E-01 +1.677000E-01 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 3.000000E-02 5.000000E-04 3.000000E-02 5.000000E-04 -5.000000E-02 -1.100000E-03 -5.000000E-02 -1.100000E-03 -2.100000E-01 -1.850000E-02 -2.100000E-01 -1.850000E-02 -1.100000E-01 -1.010000E-02 -1.100000E-01 -1.010000E-02 -9.000000E-02 -5.300000E-03 -9.000000E-02 -5.300000E-03 -2.700000E-01 -4.050000E-02 -2.700000E-01 -4.050000E-02 -3.700000E-01 -6.970000E-02 -3.700000E-01 -6.970000E-02 +8.000000E-02 +2.600000E-03 +8.000000E-02 +2.600000E-03 +1.700000E-01 +1.610000E-02 +1.700000E-01 +1.610000E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -9.000000E-02 -5.100000E-03 -9.000000E-02 -5.100000E-03 -9.000000E-02 -2.700000E-03 -9.000000E-02 -2.700000E-03 -2.100000E-01 -1.170000E-02 -2.100000E-01 -1.170000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-02 +2.100000E-03 +7.000000E-02 +2.100000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.900000E-01 +9.300000E-03 +1.900000E-01 +9.300000E-03 5.000000E-01 -7.140000E-02 +7.540000E-02 5.000000E-01 -7.140000E-02 -1.100000E-01 -8.300000E-03 -1.100000E-01 -8.300000E-03 -2.200000E-01 -3.060000E-02 -2.200000E-01 -3.060000E-02 -3.300000E-01 -5.030000E-02 -3.300000E-01 -5.030000E-02 -6.400000E-01 -1.712000E-01 -6.400000E-01 -1.712000E-01 +7.540000E-02 +1.800000E-01 +1.220000E-02 +1.800000E-01 +1.220000E-02 +2.700000E-01 +3.010000E-02 +2.700000E-01 +3.010000E-02 +5.200000E-01 +7.560000E-02 +5.200000E-01 +7.560000E-02 +1.140000E+00 +3.758000E-01 +1.140000E+00 +3.758000E-01 2.000000E-02 2.000000E-04 2.000000E-02 @@ -1471,1602 +1471,2718 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.200000E-01 -8.000000E-03 -1.200000E-01 -8.000000E-03 -1.200000E-01 -8.000000E-03 -1.200000E-01 -8.000000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 4.000000E-02 1.600000E-03 4.000000E-02 1.600000E-03 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -1.400000E-01 -1.060000E-02 -1.400000E-01 -1.060000E-02 -1.000000E-01 -3.600000E-03 -1.000000E-01 -3.600000E-03 -2.600000E-01 -2.140000E-02 -2.600000E-01 -2.140000E-02 -3.400000E-01 -3.800000E-02 -3.400000E-01 -3.800000E-02 -9.300000E-01 -2.659000E-01 -9.300000E-01 -2.659000E-01 -1.200000E-01 -7.400000E-03 -1.200000E-01 -7.400000E-03 -1.100000E-01 -5.900000E-03 -1.100000E-01 -5.900000E-03 -2.100000E-01 -2.450000E-02 -2.100000E-01 -2.450000E-02 -5.200000E-01 -1.386000E-01 -5.200000E-01 -1.386000E-01 8.000000E-02 -2.200000E-03 +6.400000E-03 8.000000E-02 -2.200000E-03 -2.100000E-01 -1.470000E-02 -2.100000E-01 -1.470000E-02 -1.900000E-01 -1.510000E-02 -1.900000E-01 -1.510000E-02 -7.200000E-01 -1.746000E-01 -7.200000E-01 -1.746000E-01 +6.400000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +6.000000E-02 +2.000000E-03 +6.000000E-02 +2.000000E-03 +5.000000E-02 +1.100000E-03 +5.000000E-02 +1.100000E-03 +1.000000E-01 +4.200000E-03 +1.000000E-01 +4.200000E-03 +1.300000E-01 +4.500000E-03 +1.300000E-01 +4.500000E-03 +2.700000E-01 +1.970000E-02 +2.700000E-01 +1.970000E-02 +3.500000E-01 +3.730000E-02 +3.500000E-01 +3.730000E-02 +9.500000E-01 +2.359000E-01 +9.500000E-01 +2.359000E-01 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 5.000000E-02 1.700000E-03 5.000000E-02 1.700000E-03 +1.200000E-01 +9.000000E-03 +1.200000E-01 +9.000000E-03 +2.400000E-01 +3.060000E-02 +2.400000E-01 +3.060000E-02 +9.000000E-02 +2.300000E-03 +9.000000E-02 +2.300000E-03 +1.400000E-01 +8.600000E-03 +1.400000E-01 +8.600000E-03 +2.200000E-01 +1.620000E-02 +2.200000E-01 +1.620000E-02 +6.500000E-01 +1.527000E-01 +6.500000E-01 +1.527000E-01 6.000000E-02 1.800000E-03 6.000000E-02 1.800000E-03 -1.600000E-01 +7.000000E-02 +1.900000E-03 +7.000000E-02 +1.900000E-03 +2.200000E-01 +1.820000E-02 +2.200000E-01 +1.820000E-02 +5.100000E-01 +1.283000E-01 +5.100000E-01 +1.283000E-01 +1.300000E-01 +5.900000E-03 +1.300000E-01 +5.900000E-03 +1.200000E-01 +5.000000E-03 +1.200000E-01 +5.000000E-03 +3.800000E-01 +4.940000E-02 +3.800000E-01 +4.940000E-02 +8.400000E-01 +2.456000E-01 +8.400000E-01 +2.456000E-01 +4.000000E-01 +3.900000E-02 +4.000000E-01 +3.900000E-02 +3.700000E-01 +3.830000E-02 +3.700000E-01 +3.830000E-02 +9.000000E-01 +2.290000E-01 +9.000000E-01 +2.290000E-01 +1.920000E+00 +9.190000E-01 +1.920000E+00 +9.190000E-01 +1.300000E-01 +6.700000E-03 +1.300000E-01 +6.700000E-03 +1.800000E-01 +9.400000E-03 +1.800000E-01 +9.400000E-03 +4.700000E-01 +6.810000E-02 +4.700000E-01 +6.810000E-02 +9.000000E-01 +2.318000E-01 +9.000000E-01 +2.318000E-01 +4.000000E-01 +5.960000E-02 +4.000000E-01 +5.960000E-02 +5.800000E-01 +9.340000E-02 +5.800000E-01 +9.340000E-02 +1.200000E+00 +3.346000E-01 +1.200000E+00 +3.346000E-01 +2.850000E+00 +1.888300E+00 +2.850000E+00 +1.888300E+00 +1.500000E-01 +7.700000E-03 +1.500000E-01 +7.700000E-03 +1.800000E-01 +1.220000E-02 +1.800000E-01 +1.220000E-02 +2.300000E-01 +1.870000E-02 +2.300000E-01 +1.870000E-02 +1.010000E+00 +4.207000E-01 +1.010000E+00 +4.207000E-01 +2.000000E-01 +1.580000E-02 +2.000000E-01 +1.580000E-02 +1.800000E-01 1.460000E-02 -1.600000E-01 +1.800000E-01 1.460000E-02 -4.600000E-01 -1.258000E-01 -4.600000E-01 -1.258000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 +2.300000E-01 +1.970000E-02 +2.300000E-01 +1.970000E-02 +5.800000E-01 +1.210000E-01 +5.800000E-01 +1.210000E-01 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +1.400000E-01 +1.100000E-02 +1.400000E-01 +1.100000E-02 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +1.100000E-01 +4.900000E-03 +1.100000E-01 +4.900000E-03 +2.600000E-01 +2.300000E-02 +2.600000E-01 +2.300000E-02 +3.600000E-01 +5.100000E-02 +3.600000E-01 +5.100000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +1.500000E-01 +1.070000E-02 +1.500000E-01 +1.070000E-02 1.000000E-02 1.000000E-04 1.000000E-02 1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 6.000000E-02 -1.800000E-03 +3.600000E-03 6.000000E-02 -1.800000E-03 +3.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +1.000000E-01 +5.800000E-03 +1.000000E-01 +5.800000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +1.200000E-01 +6.200000E-03 +1.200000E-01 +6.200000E-03 +1.400000E-01 +6.600000E-03 +1.400000E-01 +6.600000E-03 +2.900000E-01 +3.130000E-02 +2.900000E-01 +3.130000E-02 +5.300000E-01 +1.137000E-01 +5.300000E-01 +1.137000E-01 +5.000000E-02 +1.100000E-03 +5.000000E-02 +1.100000E-03 8.000000E-02 3.400000E-03 8.000000E-02 3.400000E-03 +2.200000E-01 +1.640000E-02 +2.200000E-01 +1.640000E-02 +4.700000E-01 +8.470000E-02 +4.700000E-01 +8.470000E-02 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 1.100000E-01 -5.900000E-03 +1.010000E-02 1.100000E-01 -5.900000E-03 +1.010000E-02 +1.400000E-01 +1.480000E-02 +1.400000E-01 +1.480000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +8.000000E-04 +4.000000E-02 +8.000000E-04 1.000000E-01 -3.000000E-03 +5.800000E-03 1.000000E-01 -3.000000E-03 -3.000000E-01 -2.740000E-02 -3.000000E-01 -2.740000E-02 -9.100000E-01 -2.855000E-01 -9.100000E-01 -2.855000E-01 -1.900000E-01 -1.050000E-02 -1.900000E-01 -1.050000E-02 -2.100000E-01 -1.790000E-02 -2.100000E-01 -1.790000E-02 -4.000000E-01 -5.600000E-02 -4.000000E-01 -5.600000E-02 -1.060000E+00 -3.794000E-01 -1.060000E+00 -3.794000E-01 -2.800000E-01 -4.620000E-02 -2.800000E-01 -4.620000E-02 -4.100000E-01 -4.890000E-02 -4.100000E-01 -4.890000E-02 -1.000000E+00 -3.262000E-01 -1.000000E+00 -3.262000E-01 -2.040000E+00 -1.229000E+00 -2.040000E+00 -1.229000E+00 +5.800000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +1.600000E-01 +2.560000E-02 +1.600000E-01 +2.560000E-02 +2.200000E-01 +3.400000E-02 +2.200000E-01 +3.400000E-02 +1.000000E-01 +6.800000E-03 +1.000000E-01 +6.800000E-03 +8.000000E-02 +3.800000E-03 +8.000000E-02 +3.800000E-03 +1.800000E-01 +1.700000E-02 +1.800000E-01 +1.700000E-02 +4.600000E-01 +1.298000E-01 +4.600000E-01 +1.298000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-01 +8.200000E-03 +1.000000E-01 +8.200000E-03 +2.000000E-01 +2.980000E-02 +2.000000E-01 +2.980000E-02 +3.400000E-01 +5.860000E-02 +3.400000E-01 +5.860000E-02 +3.300000E-01 +4.030000E-02 +3.300000E-01 +4.030000E-02 +2.900000E-01 +2.410000E-02 +2.900000E-01 +2.410000E-02 +7.500000E-01 +1.651000E-01 +7.500000E-01 +1.651000E-01 +1.490000E+00 +7.477000E-01 +1.490000E+00 +7.477000E-01 +2.400000E-01 +1.300000E-02 +2.400000E-01 +1.300000E-02 +2.400000E-01 +1.840000E-02 +2.400000E-01 +1.840000E-02 +4.600000E-01 +4.640000E-02 +4.600000E-01 +4.640000E-02 +1.470000E+00 +4.667000E-01 +1.470000E+00 +4.667000E-01 +1.000000E-01 +5.800000E-03 +1.000000E-01 +5.800000E-03 +2.000000E-01 +1.480000E-02 +2.000000E-01 +1.480000E-02 +2.400000E-01 +1.880000E-02 +2.400000E-01 +1.880000E-02 +5.500000E-01 +9.330000E-02 +5.500000E-01 +9.330000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-01 +4.200000E-03 +1.000000E-01 +4.200000E-03 +3.000000E-02 +3.000000E-04 +3.000000E-02 +3.000000E-04 1.700000E-01 1.250000E-02 +1.700000E-01 +1.250000E-02 +4.100000E-01 +7.090000E-02 +4.100000E-01 +7.090000E-02 +6.000000E-02 +1.400000E-03 +6.000000E-02 +1.400000E-03 +8.000000E-02 +2.400000E-03 +8.000000E-02 +2.400000E-03 +2.000000E-01 +1.660000E-02 +2.000000E-01 +1.660000E-02 +5.400000E-01 +1.066000E-01 +5.400000E-01 +1.066000E-01 +7.000000E-02 +1.500000E-03 +7.000000E-02 +1.500000E-03 +1.000000E-01 +3.000000E-03 +1.000000E-01 +3.000000E-03 +1.900000E-01 +1.110000E-02 +1.900000E-01 +1.110000E-02 +4.600000E-01 +6.020000E-02 +4.600000E-01 +6.020000E-02 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +9.000000E-02 +2.700000E-03 +9.000000E-02 +2.700000E-03 +2.900000E-01 +2.830000E-02 +2.900000E-01 +2.830000E-02 +3.100000E-01 +2.230000E-02 +3.100000E-01 +2.230000E-02 1.800000E-01 +8.600000E-03 +1.800000E-01 +8.600000E-03 +5.000000E-01 +5.740000E-02 +5.000000E-01 +5.740000E-02 +1.090000E+00 +2.509000E-01 +1.090000E+00 +2.509000E-01 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +8.000000E-02 +5.000000E-03 +8.000000E-02 +5.000000E-03 +1.300000E-01 +1.250000E-02 +1.300000E-01 +1.250000E-02 +2.100000E-01 +3.650000E-02 +2.100000E-01 +3.650000E-02 +2.600000E-01 +4.660000E-02 +2.600000E-01 +4.660000E-02 +2.200000E-01 +2.740000E-02 +2.200000E-01 +2.740000E-02 +4.600000E-01 +1.156000E-01 +4.600000E-01 +1.156000E-01 +8.600000E-01 +4.850000E-01 +8.600000E-01 +4.850000E-01 +3.800000E-01 +4.720000E-02 +3.800000E-01 +4.720000E-02 +4.400000E-01 +4.900000E-02 +4.400000E-01 +4.900000E-02 +1.000000E+00 +2.820000E-01 +1.000000E+00 +2.820000E-01 +2.440000E+00 +1.624200E+00 +2.440000E+00 +1.624200E+00 +1.500000E-01 +6.700000E-03 +1.500000E-01 +6.700000E-03 +2.000000E-01 +1.200000E-02 +2.000000E-01 +1.200000E-02 +5.200000E-01 +8.060000E-02 +5.200000E-01 +8.060000E-02 +1.020000E+00 +2.504000E-01 +1.020000E+00 +2.504000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +1.800000E-01 +9.200000E-03 +1.800000E-01 +9.200000E-03 +2.100000E-01 +1.270000E-02 +2.100000E-01 +1.270000E-02 +3.900000E-01 +3.990000E-02 +3.900000E-01 +3.990000E-02 +9.000000E-01 +1.982000E-01 +9.000000E-01 +1.982000E-01 +8.000000E-02 +2.800000E-03 +8.000000E-02 +2.800000E-03 +2.100000E-01 +9.700000E-03 +2.100000E-01 +9.700000E-03 +4.900000E-01 +5.130000E-02 +4.900000E-01 +5.130000E-02 +1.230000E+00 +3.187000E-01 +1.230000E+00 +3.187000E-01 +1.200000E-01 +5.000000E-03 +1.200000E-01 +5.000000E-03 +1.100000E-01 +3.900000E-03 +1.100000E-01 +3.900000E-03 +4.000000E-01 +4.560000E-02 +4.000000E-01 +4.560000E-02 +8.800000E-01 +2.082000E-01 +8.800000E-01 +2.082000E-01 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.200000E-01 +1.040000E-02 +1.200000E-01 +1.040000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.300000E-01 +1.690000E-02 +1.300000E-01 +1.690000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +1.400000E-01 +1.700000E-02 +1.400000E-01 +1.700000E-02 +3.000000E-01 +2.680000E-02 +3.000000E-01 +2.680000E-02 +2.900000E-01 +3.210000E-02 +2.900000E-01 +3.210000E-02 +7.200000E-01 +1.774000E-01 +7.200000E-01 +1.774000E-01 +1.540000E+00 +8.082000E-01 +1.540000E+00 +8.082000E-01 +1.200000E-01 +7.400000E-03 +1.200000E-01 +7.400000E-03 +3.000000E-01 +3.020000E-02 +3.000000E-01 +3.020000E-02 +5.800000E-01 +1.142000E-01 +5.800000E-01 +1.142000E-01 +1.300000E+00 +5.652000E-01 +1.300000E+00 +5.652000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.700000E-01 +2.890000E-02 +1.700000E-01 +2.890000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +1.100000E-01 +1.010000E-02 +1.100000E-01 +1.010000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +1.200000E-01 +8.600000E-03 +1.200000E-01 +8.600000E-03 +1.200000E-01 +6.200000E-03 +1.200000E-01 +6.200000E-03 +1.100000E-01 +5.100000E-03 +1.100000E-01 +5.100000E-03 +2.200000E-01 +1.660000E-02 +2.200000E-01 +1.660000E-02 +4.700000E-01 +7.450000E-02 +4.700000E-01 +7.450000E-02 +1.400000E-01 +5.600000E-03 +1.400000E-01 +5.600000E-03 +2.500000E-01 +1.410000E-02 +2.500000E-01 +1.410000E-02 +4.600000E-01 +4.720000E-02 +4.600000E-01 +4.720000E-02 +1.140000E+00 +2.806000E-01 +1.140000E+00 +2.806000E-01 +2.100000E-01 +2.630000E-02 +2.100000E-01 +2.630000E-02 +2.000000E-01 +2.620000E-02 +2.000000E-01 +2.620000E-02 +4.500000E-01 +1.079000E-01 +4.500000E-01 +1.079000E-01 +9.100000E-01 +3.921000E-01 +9.100000E-01 +3.921000E-01 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +5.000000E-02 +1.700000E-03 +5.000000E-02 +1.700000E-03 +1.100000E-01 +1.210000E-02 +1.100000E-01 +1.210000E-02 +2.800000E-01 +7.840000E-02 +2.800000E-01 +7.840000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.700000E-01 +2.890000E-02 +1.700000E-01 +2.890000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.200000E-01 +1.440000E-02 +1.200000E-01 +1.440000E-02 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +1.300000E-01 +9.700000E-03 +1.300000E-01 +9.700000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +8.000000E-02 +3.200000E-03 +8.000000E-02 +3.200000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +9.000000E-02 +5.300000E-03 +9.000000E-02 +5.300000E-03 +3.700000E-01 +6.890000E-02 +3.700000E-01 +6.890000E-02 +1.800000E-01 +2.280000E-02 +1.800000E-01 +2.280000E-02 +1.900000E-01 +1.330000E-02 +1.900000E-01 +1.330000E-02 +4.700000E-01 +8.870000E-02 +4.700000E-01 +8.870000E-02 +1.060000E+00 +3.900000E-01 +1.060000E+00 +3.900000E-01 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.300000E-01 +7.300000E-03 +1.300000E-01 +7.300000E-03 +1.100000E-01 +5.100000E-03 +1.100000E-01 +5.100000E-03 +1.500000E-01 +9.900000E-03 +1.500000E-01 +9.900000E-03 +4.700000E-01 +8.510000E-02 +4.700000E-01 +8.510000E-02 +3.000000E-02 +3.000000E-04 +3.000000E-02 +3.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +1.300000E-01 +4.900000E-03 +1.300000E-01 +4.900000E-03 +3.000000E-01 +2.780000E-02 +3.000000E-01 +2.780000E-02 +5.000000E-02 +1.100000E-03 +5.000000E-02 +1.100000E-03 +1.100000E-01 +5.900000E-03 +1.100000E-01 +5.900000E-03 +2.700000E-01 +2.910000E-02 +2.700000E-01 +2.910000E-02 +5.400000E-01 +9.140000E-02 +5.400000E-01 +9.140000E-02 +1.100000E-01 +3.900000E-03 +1.100000E-01 +3.900000E-03 +1.400000E-01 +7.800000E-03 +1.400000E-01 +7.800000E-03 +2.300000E-01 +1.650000E-02 +2.300000E-01 +1.650000E-02 +4.800000E-01 +6.820000E-02 +4.800000E-01 +6.820000E-02 +9.000000E-02 +5.300000E-03 +9.000000E-02 +5.300000E-03 +1.500000E-01 +1.730000E-02 +1.500000E-01 +1.730000E-02 +2.200000E-01 +2.440000E-02 +2.200000E-01 +2.440000E-02 +4.600000E-01 +1.220000E-01 +4.600000E-01 +1.220000E-01 +4.000000E-02 +8.000000E-04 +4.000000E-02 +8.000000E-04 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +9.000000E-02 +8.100000E-03 +9.000000E-02 +8.100000E-03 +1.000000E-01 +1.000000E-02 +1.000000E-01 +1.000000E-02 +2.700000E-01 +7.290000E-02 +2.700000E-01 +7.290000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +7.000000E-02 +2.500000E-03 +7.000000E-02 +2.500000E-03 +2.200000E-01 +3.400000E-02 +2.200000E-01 +3.400000E-02 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +1.000000E-01 +5.200000E-03 +1.000000E-01 +5.200000E-03 +2.300000E-01 +2.890000E-02 +2.300000E-01 +2.890000E-02 +5.100000E-01 +1.313000E-01 +5.100000E-01 +1.313000E-01 +1.300000E-01 +9.700000E-03 +1.300000E-01 +9.700000E-03 +1.100000E-01 +6.500000E-03 +1.100000E-01 +6.500000E-03 +2.000000E-01 +2.320000E-02 +2.000000E-01 +2.320000E-02 +5.800000E-01 +2.194000E-01 +5.800000E-01 +2.194000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +1.300000E-01 +1.690000E-02 +1.300000E-01 +1.690000E-02 +2.400000E-01 +5.760000E-02 +2.400000E-01 +5.760000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.400000E-01 +1.080000E-02 +1.400000E-01 +1.080000E-02 +1.100000E-01 +4.500000E-03 +1.100000E-01 +4.500000E-03 +2.600000E-01 +2.920000E-02 +2.600000E-01 +2.920000E-02 +6.200000E-01 +1.470000E-01 +6.200000E-01 +1.470000E-01 +9.000000E-02 +3.500000E-03 +9.000000E-02 +3.500000E-03 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +2.100000E-01 +2.510000E-02 +2.100000E-01 +2.510000E-02 +5.900000E-01 +1.589000E-01 +5.900000E-01 +1.589000E-01 +1.100000E-01 +3.900000E-03 +1.100000E-01 +3.900000E-03 +1.400000E-01 +9.200000E-03 +1.400000E-01 +9.200000E-03 +4.100000E-01 +6.150000E-02 +4.100000E-01 +6.150000E-02 +8.600000E-01 +2.090000E-01 +8.600000E-01 +2.090000E-01 +1.300000E-01 +4.300000E-03 +1.300000E-01 +4.300000E-03 +8.000000E-02 +2.200000E-03 +8.000000E-02 +2.200000E-03 +2.900000E-01 +2.850000E-02 +2.900000E-01 +2.850000E-02 +5.900000E-01 +1.075000E-01 +5.900000E-01 +1.075000E-01 +1.000000E-01 +5.000000E-03 +1.000000E-01 +5.000000E-03 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.100000E-01 +5.300000E-03 +1.100000E-01 +5.300000E-03 +3.300000E-01 +5.090000E-02 +3.300000E-01 +5.090000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.500000E-01 +2.250000E-02 +1.500000E-01 +2.250000E-02 +8.000000E-02 +1.600000E-03 +8.000000E-02 +1.600000E-03 +1.100000E-01 +3.900000E-03 +1.100000E-01 +3.900000E-03 +2.500000E-01 +1.510000E-02 +2.500000E-01 +1.510000E-02 +5.600000E-01 +7.200000E-02 +5.600000E-01 +7.200000E-02 +2.100000E-01 +1.490000E-02 +2.100000E-01 +1.490000E-02 +1.700000E-01 +6.700000E-03 +1.700000E-01 +6.700000E-03 +5.900000E-01 +8.590000E-02 +5.900000E-01 +8.590000E-02 +1.090000E+00 +2.999000E-01 +1.090000E+00 +2.999000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +4.000000E-02 +8.000000E-04 +4.000000E-02 +8.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +6.000000E-04 +4.000000E-02 +6.000000E-04 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +1.500000E-01 +8.900000E-03 +1.500000E-01 +8.900000E-03 +8.000000E-02 +2.200000E-03 +8.000000E-02 +2.200000E-03 +1.100000E-01 +4.500000E-03 +1.100000E-01 +4.500000E-03 +3.000000E-01 +2.440000E-02 +3.000000E-01 +2.440000E-02 +4.600000E-01 +6.580000E-02 +4.600000E-01 +6.580000E-02 +1.400000E-01 +7.400000E-03 +1.400000E-01 +7.400000E-03 +8.000000E-02 +3.400000E-03 +8.000000E-02 +3.400000E-03 +2.200000E-01 +2.220000E-02 +2.200000E-01 +2.220000E-02 +6.500000E-01 +1.385000E-01 +6.500000E-01 +1.385000E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +8.000000E-02 +6.400000E-03 +8.000000E-02 +6.400000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-01 +8.200000E-03 +1.000000E-01 +8.200000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +1.800000E-01 +1.640000E-02 +1.800000E-01 +1.640000E-02 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +6.000000E-02 +1.000000E-03 +6.000000E-02 +1.000000E-03 +1.300000E-01 +6.300000E-03 +1.300000E-01 +6.300000E-03 +2.200000E-01 +2.040000E-02 +2.200000E-01 +2.040000E-02 +9.000000E-02 +2.300000E-03 +9.000000E-02 +2.300000E-03 +1.300000E-01 +5.500000E-03 +1.300000E-01 +5.500000E-03 +2.900000E-01 +2.290000E-02 +2.900000E-01 +2.290000E-02 +7.300000E-01 +1.393000E-01 +7.300000E-01 +1.393000E-01 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.000000E-02 +2.000000E-04 +2.000000E-02 +2.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +1.000000E-01 +6.800000E-03 +1.000000E-01 +6.800000E-03 +1.400000E-01 +5.200000E-03 +1.400000E-01 +5.200000E-03 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +4.800000E-01 +6.740000E-02 +4.800000E-01 +6.740000E-02 +7.200000E-01 +1.454000E-01 +7.200000E-01 +1.454000E-01 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +1.600000E-01 +2.260000E-02 +1.600000E-01 +2.260000E-02 +3.300000E-01 +8.510000E-02 +3.300000E-01 +8.510000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +1.500000E-01 +2.250000E-02 +1.500000E-01 +2.250000E-02 +6.000000E-02 +1.800000E-03 +6.000000E-02 +1.800000E-03 +8.000000E-02 +2.000000E-03 +8.000000E-02 +2.000000E-03 +2.300000E-01 +1.650000E-02 +2.300000E-01 +1.650000E-02 +5.500000E-01 +9.410000E-02 +5.500000E-01 +9.410000E-02 +5.000000E-02 +9.000000E-04 +5.000000E-02 +9.000000E-04 +1.200000E-01 +4.000000E-03 +1.200000E-01 +4.000000E-03 +2.500000E-01 +2.230000E-02 +2.500000E-01 +2.230000E-02 +5.400000E-01 +8.000000E-02 +5.400000E-01 +8.000000E-02 +4.000000E-02 +8.000000E-04 +4.000000E-02 +8.000000E-04 +9.000000E-02 +3.500000E-03 +9.000000E-02 +3.500000E-03 +2.600000E-01 +2.760000E-02 +2.600000E-01 +2.760000E-02 +4.700000E-01 +8.450000E-02 +4.700000E-01 +8.450000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +4.000000E-02 +6.000000E-04 +4.000000E-02 +6.000000E-04 +1.100000E-01 +4.900000E-03 +1.100000E-01 +4.900000E-03 +1.600000E-01 +1.740000E-02 +1.600000E-01 +1.740000E-02 +8.000000E-02 +3.000000E-03 +8.000000E-02 +3.000000E-03 +1.100000E-01 +8.500000E-03 +1.100000E-01 +8.500000E-03 +1.700000E-01 +1.470000E-02 +1.700000E-01 +1.470000E-02 +2.900000E-01 +3.630000E-02 +2.900000E-01 +3.630000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +5.000000E-02 +1.300000E-03 +5.000000E-02 +1.300000E-03 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +5.000000E-02 +2.500000E-03 +5.000000E-02 +2.500000E-03 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +8.000000E-02 +1.800000E-03 +8.000000E-02 +1.800000E-03 +2.200000E-01 +1.100000E-02 +2.200000E-01 +1.100000E-02 +1.700000E-01 +6.700000E-03 +1.700000E-01 +6.700000E-03 +5.500000E-01 +9.350000E-02 +5.500000E-01 +9.350000E-02 +1.100000E-01 +4.300000E-03 +1.100000E-01 +4.300000E-03 +8.000000E-02 +2.600000E-03 +8.000000E-02 +2.600000E-03 +2.500000E-01 +1.770000E-02 +2.500000E-01 +1.770000E-02 +7.500000E-01 +1.659000E-01 +7.500000E-01 +1.659000E-01 +8.000000E-02 +4.000000E-03 +8.000000E-02 +4.000000E-03 +7.000000E-02 +2.100000E-03 +7.000000E-02 +2.100000E-03 +1.200000E-01 +5.600000E-03 +1.200000E-01 +5.600000E-03 +4.700000E-01 +8.530000E-02 +4.700000E-01 +8.530000E-02 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.300000E-01 +1.690000E-02 +1.300000E-01 +1.690000E-02 +1.200000E-01 +1.440000E-02 +1.200000E-01 +1.440000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +3.000000E-02 +9.000000E-04 +3.000000E-02 +9.000000E-04 +4.000000E-02 +1.000000E-03 +4.000000E-02 +1.000000E-03 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-01 +1.130000E-02 +1.500000E-01 +1.130000E-02 +7.000000E-02 +3.700000E-03 +7.000000E-02 +3.700000E-03 +2.200000E-01 +2.600000E-02 +2.200000E-01 +2.600000E-02 +4.000000E-01 +8.080000E-02 +4.000000E-01 +8.080000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.000000E-02 +4.900000E-03 +7.000000E-02 +4.900000E-03 +7.000000E-02 +2.900000E-03 +7.000000E-02 +2.900000E-03 +3.000000E-02 +5.000000E-04 +3.000000E-02 +5.000000E-04 +6.000000E-02 +3.600000E-03 +6.000000E-02 +3.600000E-03 +3.400000E-01 +6.500000E-02 +3.400000E-01 +6.500000E-02 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +1.600000E-01 +2.260000E-02 +1.600000E-01 +2.260000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +1.600000E-03 +4.000000E-02 +1.600000E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-01 +1.170000E-02 +1.500000E-01 +1.170000E-02 +1.000000E-01 +4.200000E-03 +1.000000E-01 +4.200000E-03 +2.500000E-01 +3.250000E-02 +2.500000E-01 +3.250000E-02 +6.000000E-01 +2.054000E-01 +6.000000E-01 +2.054000E-01 +1.700000E-01 +8.300000E-03 +1.700000E-01 +8.300000E-03 +2.200000E-01 1.320000E-02 -2.400000E-01 -2.000000E-02 -2.400000E-01 -2.000000E-02 -4.600000E-01 -8.820000E-02 -4.600000E-01 -8.820000E-02 -1.340000E+00 -7.578000E-01 -1.340000E+00 -7.578000E-01 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.100000E-01 -1.210000E-02 -1.100000E-01 -1.210000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.500000E-01 -1.070000E-02 -1.500000E-01 -1.070000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -1.000000E-01 -5.800000E-03 -1.000000E-01 -5.800000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -9.000000E-02 -5.300000E-03 -9.000000E-02 -5.300000E-03 -1.000000E-01 -5.000000E-03 -1.000000E-01 -5.000000E-03 -2.900000E-01 -3.130000E-02 -2.900000E-01 -3.130000E-02 -5.500000E-01 -1.173000E-01 -5.500000E-01 -1.173000E-01 -4.000000E-02 -6.000000E-04 -4.000000E-02 -6.000000E-04 -6.000000E-02 -2.600000E-03 -6.000000E-02 -2.600000E-03 -2.100000E-01 -1.490000E-02 -2.100000E-01 -1.490000E-02 -4.300000E-01 -7.830000E-02 -4.300000E-01 -7.830000E-02 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -1.900000E-01 -1.810000E-02 -1.900000E-01 -1.810000E-02 -2.500000E-01 -2.330000E-02 -2.500000E-01 -2.330000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -8.000000E-02 -2.400000E-03 -8.000000E-02 -2.400000E-03 -1.300000E-01 -6.700000E-03 -1.300000E-01 -6.700000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.500000E-01 -1.130000E-02 -1.500000E-01 -1.130000E-02 -1.800000E-01 -1.580000E-02 -1.800000E-01 -1.580000E-02 -2.600000E-01 -3.140000E-02 -2.600000E-01 -3.140000E-02 -6.600000E-01 -2.018000E-01 -6.600000E-01 -2.018000E-01 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -7.000000E-02 -2.700000E-03 -7.000000E-02 -2.700000E-03 -1.700000E-01 -1.250000E-02 -1.700000E-01 -1.250000E-02 -3.700000E-01 -5.690000E-02 -3.700000E-01 -5.690000E-02 -6.000000E-02 -1.400000E-03 -6.000000E-02 -1.400000E-03 -1.200000E-01 -4.800000E-03 -1.200000E-01 -4.800000E-03 -1.800000E-01 -9.400000E-03 -1.800000E-01 -9.400000E-03 -3.100000E-01 -2.570000E-02 -3.100000E-01 -2.570000E-02 -3.000000E-01 -2.540000E-02 -3.000000E-01 -2.540000E-02 -3.500000E-01 -5.010000E-02 -3.500000E-01 -5.010000E-02 -6.100000E-01 -1.107000E-01 -6.100000E-01 -1.107000E-01 -1.520000E+00 -5.836000E-01 -1.520000E+00 -5.836000E-01 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.100000E-01 -8.300000E-03 -1.100000E-01 -8.300000E-03 -1.700000E-01 -1.150000E-02 -1.700000E-01 -1.150000E-02 -4.000000E-01 -5.920000E-02 -4.000000E-01 -5.920000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-01 -5.500000E-03 -1.500000E-01 -5.500000E-03 -5.000000E-02 -7.000000E-04 -5.000000E-02 -7.000000E-04 2.200000E-01 -1.420000E-02 -2.200000E-01 -1.420000E-02 -5.900000E-01 -1.033000E-01 -5.900000E-01 -1.033000E-01 -1.900000E-01 -7.900000E-03 -1.900000E-01 -7.900000E-03 -2.800000E-01 -2.320000E-02 -2.800000E-01 -2.320000E-02 -6.600000E-01 -1.226000E-01 -6.600000E-01 -1.226000E-01 -1.300000E+00 -4.144000E-01 -1.300000E+00 -4.144000E-01 -1.100000E-01 -3.500000E-03 -1.100000E-01 -3.500000E-03 -7.000000E-02 -1.700000E-03 -7.000000E-02 -1.700000E-03 -2.100000E-01 -1.890000E-02 -2.100000E-01 -1.890000E-02 -4.400000E-01 -5.180000E-02 -4.400000E-01 -5.180000E-02 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-01 -6.600000E-03 -1.000000E-01 -6.600000E-03 -3.400000E-01 -9.100000E-02 -3.400000E-01 -9.100000E-02 -1.200000E-01 -7.400000E-03 -1.200000E-01 -7.400000E-03 -1.000000E-01 -5.400000E-03 -1.000000E-01 -5.400000E-03 -2.300000E-01 -3.050000E-02 -2.300000E-01 -3.050000E-02 -5.400000E-01 -1.374000E-01 -5.400000E-01 -1.374000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.800000E-01 -2.040000E-02 -2.800000E-01 -2.040000E-02 -2.900000E-01 -2.070000E-02 -2.900000E-01 -2.070000E-02 -8.900000E-01 -1.935000E-01 -8.900000E-01 -1.935000E-01 -1.960000E+00 -1.036600E+00 -1.960000E+00 -1.036600E+00 +1.320000E-02 4.200000E-01 -5.360000E-02 +4.220000E-02 4.200000E-01 -5.360000E-02 -4.400000E-01 -4.940000E-02 -4.400000E-01 -4.940000E-02 -9.300000E-01 -2.219000E-01 -9.300000E-01 -2.219000E-01 -2.010000E+00 -1.042100E+00 -2.010000E+00 -1.042100E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -1.900000E-01 -9.100000E-03 -1.900000E-01 -9.100000E-03 -3.600000E-01 -4.720000E-02 -3.600000E-01 -4.720000E-02 -6.800000E-01 -1.514000E-01 -6.800000E-01 -1.514000E-01 -1.340000E+00 -4.926000E-01 -1.340000E+00 -4.926000E-01 -2.000000E-01 -1.420000E-02 -2.000000E-01 -1.420000E-02 -2.800000E-01 -2.160000E-02 -2.800000E-01 -2.160000E-02 -6.500000E-01 -1.185000E-01 -6.500000E-01 -1.185000E-01 -1.460000E+00 -5.016000E-01 -1.460000E+00 -5.016000E-01 -5.000000E-02 -9.000000E-04 -5.000000E-02 -9.000000E-04 -1.300000E-01 -7.300000E-03 -1.300000E-01 -7.300000E-03 -2.700000E-01 -2.850000E-02 -2.700000E-01 -2.850000E-02 -6.900000E-01 -1.553000E-01 -6.900000E-01 -1.553000E-01 -1.000000E-01 -3.800000E-03 -1.000000E-01 -3.800000E-03 -8.000000E-02 -2.400000E-03 -8.000000E-02 -2.400000E-03 -2.600000E-01 -2.380000E-02 -2.600000E-01 -2.380000E-02 -4.500000E-01 -6.730000E-02 -4.500000E-01 -6.730000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +4.220000E-02 +9.600000E-01 +2.324000E-01 +9.600000E-01 +2.324000E-01 1.000000E-02 1.000000E-04 1.000000E-02 1.000000E-04 -1.300000E-01 -1.690000E-02 -1.300000E-01 -1.690000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.200000E-01 -5.400000E-03 -1.200000E-01 -5.400000E-03 -1.100000E-01 -5.300000E-03 -1.100000E-01 -5.300000E-03 -2.600000E-01 -2.640000E-02 -2.600000E-01 -2.640000E-02 -5.600000E-01 -1.062000E-01 -5.600000E-01 -1.062000E-01 -1.000000E-01 -4.600000E-03 -1.000000E-01 -4.600000E-03 -1.800000E-01 -1.020000E-02 -1.800000E-01 -1.020000E-02 -2.500000E-01 -2.330000E-02 -2.500000E-01 -2.330000E-02 -9.800000E-01 -2.862000E-01 -9.800000E-01 -2.862000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -1.300000E-01 -9.700000E-03 -1.300000E-01 -9.700000E-03 -2.600000E-01 -3.380000E-02 -2.600000E-01 -3.380000E-02 -1.700000E-01 -7.900000E-03 -1.700000E-01 -7.900000E-03 -1.500000E-01 -7.900000E-03 -1.500000E-01 -7.900000E-03 -4.400000E-01 -5.900000E-02 -4.400000E-01 -5.900000E-02 -8.500000E-01 -1.735000E-01 -8.500000E-01 -1.735000E-01 -1.200000E-01 -4.400000E-03 -1.200000E-01 -4.400000E-03 -1.600000E-01 -8.000000E-03 -1.600000E-01 -8.000000E-03 -3.500000E-01 -3.190000E-02 -3.500000E-01 -3.190000E-02 -8.700000E-01 -2.063000E-01 -8.700000E-01 -2.063000E-01 -2.100000E-01 -2.630000E-02 -2.100000E-01 -2.630000E-02 -3.300000E-01 -3.550000E-02 -3.300000E-01 -3.550000E-02 -5.500000E-01 -1.175000E-01 -5.500000E-01 -1.175000E-01 -1.090000E+00 -4.213000E-01 -1.090000E+00 -4.213000E-01 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -1.300000E-01 -1.250000E-02 -1.300000E-01 -1.250000E-02 -3.200000E-01 -8.000000E-02 -3.200000E-01 -8.000000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.700000E-01 -2.890000E-02 -1.700000E-01 -2.890000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.100000E-01 -1.210000E-02 -1.100000E-01 -1.210000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.200000E-01 -4.800000E-03 -1.200000E-01 -4.800000E-03 -8.000000E-02 -5.000000E-03 -8.000000E-02 -5.000000E-03 -1.700000E-01 -1.170000E-02 -1.700000E-01 -1.170000E-02 -5.300000E-01 -9.450000E-02 -5.300000E-01 -9.450000E-02 -1.900000E-01 -2.310000E-02 -1.900000E-01 -2.310000E-02 -1.500000E-01 -1.170000E-02 -1.500000E-01 -1.170000E-02 -4.300000E-01 -8.550000E-02 -4.300000E-01 -8.550000E-02 -8.900000E-01 -3.441000E-01 -8.900000E-01 -3.441000E-01 -9.000000E-02 -3.500000E-03 -9.000000E-02 -3.500000E-03 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -7.000000E-02 -2.500000E-03 -7.000000E-02 -2.500000E-03 -1.400000E-01 -1.300000E-02 -1.400000E-01 -1.300000E-02 -2.300000E-01 -1.370000E-02 -2.300000E-01 -1.370000E-02 -2.100000E-01 -1.190000E-02 -2.100000E-01 -1.190000E-02 -4.400000E-01 -6.200000E-02 -4.400000E-01 -6.200000E-02 -9.800000E-01 -2.580000E-01 -9.800000E-01 -2.580000E-01 -1.300000E-01 -1.030000E-02 -1.300000E-01 -1.030000E-02 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -2.400000E-01 -2.880000E-02 -2.400000E-01 -2.880000E-02 -5.900000E-01 -1.613000E-01 -5.900000E-01 -1.613000E-01 -1.300000E-01 -5.500000E-03 -1.300000E-01 -5.500000E-03 -1.600000E-01 -7.800000E-03 -1.600000E-01 -7.800000E-03 -3.900000E-01 -4.730000E-02 -3.900000E-01 -4.730000E-02 -6.900000E-01 -1.465000E-01 -6.900000E-01 -1.465000E-01 -8.000000E-02 -3.000000E-03 -8.000000E-02 -3.000000E-03 -1.100000E-01 -6.900000E-03 -1.100000E-01 -6.900000E-03 -1.400000E-01 -7.000000E-03 -1.400000E-01 -7.000000E-03 -4.900000E-01 -6.630000E-02 -4.900000E-01 -6.630000E-02 -9.000000E-02 -5.300000E-03 -9.000000E-02 -5.300000E-03 -1.500000E-01 -1.730000E-02 -1.500000E-01 -1.730000E-02 -2.200000E-01 -2.440000E-02 -2.200000E-01 -2.440000E-02 -4.600000E-01 -1.220000E-01 -4.600000E-01 -1.220000E-01 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 4.000000E-02 1.600000E-03 4.000000E-02 @@ -3075,198 +4191,22 @@ tally 3: 6.400000E-03 8.000000E-02 6.400000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -1.000000E-01 -1.000000E-02 -1.000000E-01 -1.000000E-02 -2.700000E-01 -7.290000E-02 -2.700000E-01 -7.290000E-02 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 1.100000E-01 -4.100000E-03 +8.500000E-03 1.100000E-01 -4.100000E-03 -2.400000E-01 -3.440000E-02 -2.400000E-01 -3.440000E-02 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -1.000000E-01 -5.200000E-03 -1.000000E-01 -5.200000E-03 -2.300000E-01 -2.890000E-02 -2.300000E-01 -2.890000E-02 -5.100000E-01 -1.313000E-01 -5.100000E-01 -1.313000E-01 -1.300000E-01 -9.700000E-03 -1.300000E-01 -9.700000E-03 -1.100000E-01 -6.500000E-03 -1.100000E-01 -6.500000E-03 -2.000000E-01 -2.320000E-02 -2.000000E-01 -2.320000E-02 -5.800000E-01 -2.194000E-01 -5.800000E-01 -2.194000E-01 +8.500000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -1.600000E-01 -1.780000E-02 -1.600000E-01 -1.780000E-02 -2.500000E-01 -5.770000E-02 -2.500000E-01 -5.770000E-02 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -3.200000E-01 -1.024000E-01 -3.200000E-01 -1.024000E-01 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-01 -1.000000E-02 -1.000000E-01 -1.000000E-02 -1.800000E-01 -1.160000E-02 -1.800000E-01 -1.160000E-02 -2.400000E-01 -1.700000E-02 -2.400000E-01 -1.700000E-02 -7.000000E-01 -2.108000E-01 -7.000000E-01 -2.108000E-01 -1.580000E+00 -7.900000E-01 -1.580000E+00 -7.900000E-01 -2.000000E-01 -8.400000E-03 -2.000000E-01 -8.400000E-03 -3.000000E-01 -2.160000E-02 -3.000000E-01 -2.160000E-02 -8.100000E-01 -1.547000E-01 -8.100000E-01 -1.547000E-01 -1.390000E+00 -4.307000E-01 -1.390000E+00 -4.307000E-01 -1.000000E-01 -3.000000E-03 -1.000000E-01 -3.000000E-03 -1.400000E-01 -6.000000E-03 -1.400000E-01 -6.000000E-03 -3.400000E-01 -3.180000E-02 -3.400000E-01 -3.180000E-02 -8.900000E-01 -1.627000E-01 -8.900000E-01 -1.627000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -3315,946 +4255,6 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -1.400000E-01 -1.000000E-02 -1.400000E-01 -1.000000E-02 -1.600000E-01 -1.140000E-02 -1.600000E-01 -1.140000E-02 -1.000000E-01 -4.200000E-03 -1.000000E-01 -4.200000E-03 -3.500000E-01 -3.710000E-02 -3.500000E-01 -3.710000E-02 -7.500000E-01 -1.665000E-01 -7.500000E-01 -1.665000E-01 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -9.000000E-02 -6.500000E-03 -9.000000E-02 -6.500000E-03 -2.100000E-01 -1.710000E-02 -2.100000E-01 -1.710000E-02 -3.600000E-01 -5.340000E-02 -3.600000E-01 -5.340000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -4.000000E-02 -6.000000E-04 -4.000000E-02 -6.000000E-04 -2.400000E-01 -1.980000E-02 -2.400000E-01 -1.980000E-02 -4.400000E-01 -6.260000E-02 -4.400000E-01 -6.260000E-02 -8.000000E-02 -2.800000E-03 -8.000000E-02 -2.800000E-03 -7.000000E-02 -1.300000E-03 -7.000000E-02 -1.300000E-03 -3.400000E-01 -2.660000E-02 -3.400000E-01 -2.660000E-02 -6.000000E-01 -8.560000E-02 -6.000000E-01 -8.560000E-02 -1.300000E-01 -7.300000E-03 -1.300000E-01 -7.300000E-03 -8.000000E-02 -3.400000E-03 -8.000000E-02 -3.400000E-03 -2.000000E-01 -2.180000E-02 -2.000000E-01 -2.180000E-02 -5.300000E-01 -1.241000E-01 -5.300000E-01 -1.241000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.100000E-01 -1.210000E-02 -1.100000E-01 -1.210000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -6.000000E-04 -4.000000E-02 -6.000000E-04 -1.100000E-01 -4.300000E-03 -1.100000E-01 -4.300000E-03 -2.200000E-01 -1.660000E-02 -2.200000E-01 -1.660000E-02 -3.700000E-01 -5.770000E-02 -3.700000E-01 -5.770000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-02 -3.400000E-03 -8.000000E-02 -3.400000E-03 -2.000000E-01 -2.420000E-02 -2.000000E-01 -2.420000E-02 -7.000000E-02 -1.900000E-03 -7.000000E-02 -1.900000E-03 -8.000000E-02 -3.000000E-03 -8.000000E-02 -3.000000E-03 -1.700000E-01 -9.500000E-03 -1.700000E-01 -9.500000E-03 -3.900000E-01 -5.270000E-02 -3.900000E-01 -5.270000E-02 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -5.000000E-02 -1.100000E-03 -5.000000E-02 -1.100000E-03 -2.200000E-01 -2.920000E-02 -2.200000E-01 -2.920000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.300000E-01 -6.900000E-03 -1.300000E-01 -6.900000E-03 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -4.300000E-01 -6.570000E-02 -4.300000E-01 -6.570000E-02 -6.800000E-01 -1.570000E-01 -6.800000E-01 -1.570000E-01 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -7.000000E-02 -3.700000E-03 -7.000000E-02 -3.700000E-03 -2.100000E-01 -2.610000E-02 -2.100000E-01 -2.610000E-02 -4.100000E-01 -9.630000E-02 -4.100000E-01 -9.630000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.600000E-01 -2.560000E-02 -1.600000E-01 -2.560000E-02 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -7.000000E-02 -2.100000E-03 -7.000000E-02 -2.100000E-03 -2.100000E-01 -2.250000E-02 -2.100000E-01 -2.250000E-02 -5.000000E-02 -9.000000E-04 -5.000000E-02 -9.000000E-04 -9.000000E-02 -3.500000E-03 -9.000000E-02 -3.500000E-03 -1.900000E-01 -2.050000E-02 -1.900000E-01 -2.050000E-02 -4.200000E-01 -7.100000E-02 -4.200000E-01 -7.100000E-02 -1.600000E-01 -8.200000E-03 -1.600000E-01 -8.200000E-03 -1.700000E-01 -8.700000E-03 -1.700000E-01 -8.700000E-03 -3.900000E-01 -4.150000E-02 -3.900000E-01 -4.150000E-02 -8.500000E-01 -1.881000E-01 -8.500000E-01 -1.881000E-01 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.100000E-01 -1.210000E-02 -1.100000E-01 -1.210000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.000000E-01 -4.200000E-03 -1.000000E-01 -4.200000E-03 -1.400000E-01 -9.400000E-03 -1.400000E-01 -9.400000E-03 -2.000000E-01 -1.620000E-02 -2.000000E-01 -1.620000E-02 -3.700000E-01 -5.070000E-02 -3.700000E-01 -5.070000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-02 -2.500000E-03 -7.000000E-02 -2.500000E-03 -1.100000E-01 -4.900000E-03 -1.100000E-01 -4.900000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -9.000000E-02 -5.300000E-03 -9.000000E-02 -5.300000E-03 -7.000000E-02 -1.900000E-03 -7.000000E-02 -1.900000E-03 -1.500000E-01 -1.370000E-02 -1.500000E-01 -1.370000E-02 -1.500000E-01 -8.300000E-03 -1.500000E-01 -8.300000E-03 -1.700000E-01 -1.250000E-02 -1.700000E-01 -1.250000E-02 -3.000000E-01 -3.220000E-02 -3.000000E-01 -3.220000E-02 -8.200000E-01 -2.246000E-01 -8.200000E-01 -2.246000E-01 -1.500000E-01 -7.700000E-03 -1.500000E-01 -7.700000E-03 -1.000000E-01 -3.400000E-03 -1.000000E-01 -3.400000E-03 -2.100000E-01 -1.850000E-02 -2.100000E-01 -1.850000E-02 -4.500000E-01 -7.370000E-02 -4.500000E-01 -7.370000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-01 -1.130000E-02 -1.500000E-01 -1.130000E-02 -7.000000E-02 -3.700000E-03 -7.000000E-02 -3.700000E-03 -2.200000E-01 -2.600000E-02 -2.200000E-01 -2.600000E-02 -4.000000E-01 -8.080000E-02 -4.000000E-01 -8.080000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -3.400000E-01 -6.500000E-02 -3.400000E-01 -6.500000E-02 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.600000E-01 -2.260000E-02 -1.600000E-01 -2.260000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-02 -4.000000E-03 -8.000000E-02 -4.000000E-03 -8.000000E-02 -3.200000E-03 -8.000000E-02 -3.200000E-03 -1.900000E-01 -1.810000E-02 -1.900000E-01 -1.810000E-02 -3.700000E-01 -6.890000E-02 -3.700000E-01 -6.890000E-02 -2.400000E-01 -1.400000E-02 -2.400000E-01 -1.400000E-02 -3.300000E-01 -2.670000E-02 -3.300000E-01 -2.670000E-02 -6.000000E-01 -9.100000E-02 -6.000000E-01 -9.100000E-02 -1.430000E+00 -4.629000E-01 -1.430000E+00 -4.629000E-01 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.000000E-01 -8.200000E-03 -1.000000E-01 -8.200000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -4435,38 +4435,38 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.100000E-01 -1.210000E-02 -1.100000E-01 -1.210000E-02 -1.000000E-01 -6.800000E-03 -1.000000E-01 -6.800000E-03 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -1.800000E-01 -3.240000E-02 -1.800000E-01 -3.240000E-02 -2.100000E-01 -4.410000E-02 -2.100000E-01 -4.410000E-02 -2.400000E-01 -5.760000E-02 -2.400000E-01 -5.760000E-02 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +2.000000E-02 +4.000000E-04 +1.000000E-02 +1.000000E-04 +1.000000E-02 +1.000000E-04 +1.900000E-01 +3.610000E-02 +1.900000E-01 +3.610000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_polar/geometry.xml b/tests/test_filter_polar/geometry.xml new file mode 100644 index 0000000000..b85dd04df9 --- /dev/null +++ b/tests/test_filter_polar/geometry.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + + + diff --git a/tests/test_filter_polar/materials.xml b/tests/test_filter_polar/materials.xml new file mode 100644 index 0000000000..9c0b74f3f1 --- /dev/null +++ b/tests/test_filter_polar/materials.xml @@ -0,0 +1,272 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_filter_polar/results_true.dat b/tests/test_filter_polar/results_true.dat new file mode 100644 index 0000000000..409d7ed128 --- /dev/null +++ b/tests/test_filter_polar/results_true.dat @@ -0,0 +1,2926 @@ +k-combined: +1.005983E+00 2.248579E-02 +tally 1: +1.910392E+01 +7.630892E+01 +6.069713E+01 +7.418935E+02 +6.770107E+01 +9.184032E+02 +5.337004E+01 +5.705965E+02 +1.984454E+01 +7.925660E+01 +tally 2: +1.921411E+01 +7.459156E+01 +5.766370E+01 +6.673586E+02 +6.859495E+01 +9.423025E+02 +5.508385E+01 +6.074301E+02 +2.066319E+01 +8.572734E+01 +tally 3: +1.910392E+01 +7.630892E+01 +6.069713E+01 +7.418935E+02 +6.770107E+01 +9.184032E+02 +5.337004E+01 +5.705965E+02 +1.984454E+01 +7.925660E+01 +tally 4: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.474302E-01 +2.173566E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.250677E-01 +1.806825E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.379743E+00 +1.311268E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.411476E-01 +1.292788E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.041947E-01 +1.293434E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.858540E-01 +1.488833E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.338682E-01 +3.487437E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.915994E+00 +1.046110E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.383099E+00 +6.158644E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.733692E-01 +4.271368E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.358559E-01 +1.127992E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.715092E-02 +2.223209E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.510162E-02 +9.044318E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.239565E-01 +3.408418E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.837242E-01 +3.095588E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.994150E-01 +2.866219E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.724238E-01 +7.421475E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.433355E-01 +1.157425E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.547867E-01 +1.313519E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.879130E+00 +9.055069E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.368540E-01 +6.270785E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.652111E+00 +1.033642E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.310051E+00 +9.755343E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.097363E+00 +1.364448E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.373035E+00 +1.305514E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.745973E+00 +1.053371E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.139451E+00 +1.572197E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.774043E+00 +3.284606E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.295905E+00 +6.522302E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.221434E+00 +5.018537E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.562734E+00 +8.637801E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.649733E-01 +2.226711E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.288704E+00 +7.109246E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.466278E+00 +1.578589E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.807475E-01 +4.695137E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.126927E-02 +8.330079E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.720195E-01 +8.707551E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.990373E+00 +2.342787E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.189163E+00 +5.672280E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.799118E+00 +9.852508E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.604690E+00 +9.452433E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.751744E+00 +2.548820E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.590271E+00 +1.069990E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.160807E+00 +2.684910E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.968641E+00 +1.977620E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.115995E+00 +3.927279E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.487088E+00 +8.377840E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.815094E-01 +7.655932E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.566015E+00 +8.425867E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.544552E-01 +3.858396E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.145926E-01 +8.654276E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.404772E-01 +5.782929E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.354304E-01 +9.779168E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.473896E-01 +4.381391E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.075755E+00 +1.180059E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.798183E+00 +1.189243E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.205742E-01 +2.287243E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.535623E-01 +4.961922E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.019654E+00 +6.953712E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.843585E+00 +1.633603E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.369353E+00 +1.220652E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.262961E+00 +8.319161E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.391250E+00 +3.942772E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.547550E+00 +6.442982E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.755185E-02 +1.410142E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.166100E-01 +1.359789E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.772549E-01 +3.883777E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.561903E+00 +8.529594E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.673305E+00 +8.100900E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.189537E-01 +2.053395E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.216662E+00 +2.266186E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.018099E-01 +2.801217E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.099694E+00 +1.039958E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.640385E+00 +1.310152E+01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.780649E+00 +3.660598E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.628211E-01 +2.651070E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.962156E-01 +3.850057E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.052562E-01 +2.499929E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.634501E+00 +1.758133E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.767142E+00 +2.999082E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.209998E+00 +1.296913E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.850185E-01 +1.260300E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.631538E-02 +9.276652E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.024256E-01 +9.618585E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.570476E+00 +8.807549E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.207632E+00 +6.365426E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.273172E-01 +1.071365E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.150722E-01 +1.477306E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.365363E-01 +1.545056E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.634484E+00 +1.006786E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.963647E+00 +1.921299E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.855612E+00 +3.738770E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.949577E-01 +6.996292E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.933716E-01 +8.606692E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.047296E-01 +9.286014E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.528920E-01 +6.502654E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.143609E-01 +1.307841E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.259810E-01 +4.281927E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.829227E+00 +2.711068E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.771012E-02 +5.375002E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.504231E-01 +3.192897E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.258896E+00 +4.828866E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.744319E+00 +1.102318E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.315201E+00 +5.202230E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.383778E+00 +1.064894E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.373598E-01 +1.384092E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.752996E-01 +3.072994E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.414144E-01 +1.165638E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.117217E-01 +1.695148E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.020974E-01 +1.807843E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.790545E+00 +1.606987E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.811463E+00 +1.690787E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.624100E-01 +3.163050E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.499073E-01 +2.247220E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.384807E+00 +6.489982E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.600506E+00 +1.075835E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.003754E+00 +1.473659E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.138289E+00 +1.397348E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.361580E+00 +9.669336E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.832439E-01 +8.022708E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.635807E+00 +6.575567E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.431523E+00 +2.763717E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.943625E-02 +2.266446E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.659683E-01 +3.141838E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.404488E+00 +1.657632E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.337272E+00 +6.818393E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.906319E-01 +3.634051E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.968808E-01 +8.813823E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.401085E-02 +7.057823E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.438771E-01 +6.726955E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.135095E-01 +1.453647E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.117081E-01 +2.474125E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.890267E+00 +9.971621E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.217831E-02 +2.722576E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.875279E-01 +7.222991E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.465873E+00 +1.684795E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.582101E-01 +2.308163E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.975907E-01 +1.580784E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.163055E+00 +4.040199E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.387764E+00 +4.357290E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.196106E+00 +5.866078E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.414320E-01 +1.354077E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.331388E+00 +7.999297E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.385501E-01 +1.119957E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.319981E-02 +1.742350E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.395770E-02 +8.828049E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.930196E+00 +1.056890E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.430206E+00 +1.555413E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.266456E+00 +6.181299E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.998920E-01 +3.995682E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.956201E-02 +4.777812E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.595216E-01 +1.454967E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.292285E+00 +8.702623E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.864587E-01 +8.205860E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.004358E+00 +5.599700E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.878242E-01 +3.111548E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.003831E-01 +1.007678E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.390952E-01 +2.937091E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.752746E+00 +1.853071E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.861695E-01 +8.327886E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.125953E-01 +2.392175E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.518722E-01 +1.238140E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.082653E-02 +9.502751E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.871455E-02 +6.195980E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.032079E-01 +9.193502E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 diff --git a/tests/test_filter_polar/settings.xml b/tests/test_filter_polar/settings.xml new file mode 100644 index 0000000000..517637a59f --- /dev/null +++ b/tests/test_filter_polar/settings.xml @@ -0,0 +1,19 @@ + + + + + 10 + 5 + 100 + + + + + + -160 -160 -183 + 160 160 183 + + + + + diff --git a/tests/test_filter_polar/tallies.xml b/tests/test_filter_polar/tallies.xml new file mode 100644 index 0000000000..5e9ed87931 --- /dev/null +++ b/tests/test_filter_polar/tallies.xml @@ -0,0 +1,34 @@ + + + + + rectangular + -182.07 -182.07 + 182.07 182.07 + 17 17 + + + + + flux + + + + + flux + analog + + + + + + flux + + + + + + flux + + + diff --git a/tests/test_filter_polar/test_filter_polar.py b/tests/test_filter_polar/test_filter_polar.py new file mode 100644 index 0000000000..1777db993e --- /dev/null +++ b/tests/test_filter_polar/test_filter_polar.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() From af442677c015fcf48263fde46b402e665585d71d Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 2 Sep 2015 19:50:56 -0700 Subject: [PATCH 036/519] Changed Tally.get_value to Tally.get_values in Python scripts --- scripts/openmc-plot-mesh-tally | 4 ++-- scripts/openmc-statepoint-3d | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index 5c46d927c0..d49c9061d3 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -230,9 +230,9 @@ class MeshPlotter(tk.Frame): meshtuple = (i + 1, axial_level, j + 1) filters, filter_bins = zip(*spec_list + [ (mesh_filter, meshtuple)]) - mean = selectedTally.get_value( + mean = selectedTally.get_values( self.scoreBox.get(), filters, filter_bins) - stdev = selectedTally.get_value( + stdev = selectedTally.get_values( self.scoreBox.get(), filters, filter_bins, value='std_dev') if mbvalue == 'Mean': diff --git a/scripts/openmc-statepoint-3d b/scripts/openmc-statepoint-3d index 30205c7692..e667ad0bbd 100755 --- a/scripts/openmc-statepoint-3d +++ b/scripts/openmc-statepoint-3d @@ -219,7 +219,7 @@ def main(file_, o): for y in range(1,ny+1): for z in range(1,nz+1): filterspec[0][1] = (x,y,z) - val = sp.get_value(tally.id-1, filterspec, sid)[o.valerr] + val = sp.get_values(tally.id-1, filterspec, sid)[o.valerr] if o.vtk: # vtk cells go z, y, x, so we store it now and enter it later i = (z-1)*nx*ny + (y-1)*nx + x-1 From cfd79626bcfa490e02715451a8309e809497e484 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Sep 2015 15:58:33 +0700 Subject: [PATCH 037/519] Fix arguments to Tally.get_values(...) in openmc-plot-mesh-tally --- scripts/openmc-plot-mesh-tally | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index d49c9061d3..d9bca6377c 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -210,7 +210,7 @@ class MeshPlotter(tk.Frame): mesh_filter = f continue index = self.filterBoxes[f.type].current() - spec_list.append((f, index)) + spec_list.append((f.type, (index,))) text = self.basisBox.get() if text == 'xy': @@ -229,11 +229,11 @@ class MeshPlotter(tk.Frame): else: meshtuple = (i + 1, axial_level, j + 1) filters, filter_bins = zip(*spec_list + [ - (mesh_filter, meshtuple)]) + (mesh_filter.type, (meshtuple,))]) mean = selectedTally.get_values( - self.scoreBox.get(), filters, filter_bins) + [self.scoreBox.get()], filters, filter_bins) stdev = selectedTally.get_values( - self.scoreBox.get(), filters, filter_bins, + [self.scoreBox.get()], filters, filter_bins, value='std_dev') if mbvalue == 'Mean': matrix[i, j] = mean From 53edae4c7e8824b4a3a5dbd03f48a01b9dbeb08b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 3 Sep 2015 07:31:33 -0700 Subject: [PATCH 038/519] Updated openmc-plot-mesh-tally to include if-else for 2D vs. 3D meshes --- scripts/openmc-plot-mesh-tally | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index d9bca6377c..f925b413a3 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -133,7 +133,11 @@ class MeshPlotter(tk.Frame): self.mesh = selectedTally.filters_by_name['mesh'].mesh # Get mesh dimensions - self.nx, self.ny, self.nz = self.mesh.dimension + if len(self.mesh.dimension) == 2: + self.nx, self.ny = self.mesh.dimension + self.nz = 1 + else: + self.nx, self.ny, self.nz = self.mesh.dimension # Repopulate comboboxes baesd on current basis selection text = self.basisBox.get() From 4aec0454a8b6f9c68e8737a8b27ecf2b94ef65c6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 3 Sep 2015 07:33:33 -0700 Subject: [PATCH 039/519] Updated docstring for Tally.get_values(...) with correct use of Iterable filter bins --- openmc/tallies.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 6e418a2be4..003acd9435 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -823,10 +823,10 @@ class Tally(object): A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list + filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer for the cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of floats for 'energy' and 'energyout' filters corresponding to the @@ -2099,10 +2099,10 @@ class Tally(object): A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list + filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types - parameter (e.g., [1, (0., 0.625e-6)]; default is []). Each bin in - the list is the integer ID for 'material', 'surface', 'cell', + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer for the cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of floats for 'energy' and 'energyout' filters corresponding to the From c00834dbb6cbaa2e287f6f5645d69f317ef3ba30 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Aug 2015 16:31:29 +0700 Subject: [PATCH 040/519] Make sure Fortran module directory is included. Get rid of verbose option. --- CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fd122a14ca..c4a8e8eced 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,9 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include) +# Make sure Fortran module directory is included when building +include_directories(${CMAKE_BINARY_DIR}/include) + #=============================================================================== # Architecture specific definitions #=============================================================================== @@ -23,13 +26,9 @@ option(openmp "Enable shared-memory parallelism with OpenMP" OFF) option(profile "Compile with profiling flags" OFF) option(debug "Compile with debug flags" OFF) option(optimize "Turn on all compiler optimization flags" OFF) -option(verbose "Create verbose Makefiles" OFF) option(coverage "Compile with coverage analysis flags" OFF) option(mpif08 "Use Fortran 2008 MPI interface" OFF) -if (verbose) - set(CMAKE_VERBOSE_MAKEFILE on) -endif() # Maximum number of nested coordinates levels set(maxcoord 10 CACHE STRING "Maximum number of nested coordinate levels") From ab59b90cfee9a62c61ac06696fa43485b2edc2d9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 29 Aug 2015 16:32:02 +0700 Subject: [PATCH 041/519] Use lists for f90flags and ldflags instead of space-separated strings --- CMakeLists.txt | 115 ++++++++++++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 44 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c4a8e8eced..e4452d3234 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,21 @@ endif() # Set compile/link flags based on which compiler is being used #=============================================================================== -if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") +# Support for Fortran in FindOpenMP was added in CMake 3.1. To support lower +# versions, we manually add the flags. However, at some point in time, the +# manual logic can be removed in favor of the block below + +#if(NOT (CMAKE_VERSION VERSION_LESS 3.1)) +# if(openmp) +# find_package(OpenMP) +# if(OPENMP_FOUND) +# list(APPEND f90flags ${OpenMP_Fortran_FLAGS}) +# list(APPEND ldflags ${OpenMP_Fortran_FLAGS}) +# endif() +# endif() +#endif() + +if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) # Make sure version is sufficient execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) @@ -74,88 +88,90 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") endif() # GNU Fortran compiler options - set(f90flags "-cpp -std=f2008 -fbacktrace") + list(APPEND f90flags -cpp -std=f2008 -fbacktrace) if(debug) - set(f90flags "-g -Wall -pedantic -fbounds-check -ffpe-trap=invalid,overflow,underflow ${f90flags}") - set(ldflags "-g") + list(APPEND f90flags -g -Wall -pedantic -fbounds-check + -ffpe-trap=invalid,overflow,underflow) + list(APPEND ldflags -g) endif() if(profile) - set(f90flags "-pg ${f90flags}") - set(ldflags "-pg ${ldflags}") + list(APPEND f90flags -pg) + list(APPEND ldflags -pg) endif() if(optimize) - set(f90flags "-O3 ${f90flags}") + list(APPEND f90flags -O3) endif() if(openmp) - set(f90flags "-fopenmp ${f90flags}") - set(ldflags "-fopenmp ${ldflags}") + list(APPEND f90flags -fopenmp) + list(APPEND ldflags -fopenmp) endif() if(coverage) - set(f90flags "-coverage ${f90flags}") - set(ldflags "-coverage ${ldflags}") + list(APPEND f90flags -coverage) + list(APPEND ldflags -coverage) endif() -elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") +elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) # Intel Fortran compiler options - set(f90flags "-fpp -std08 -assume byterecl -traceback") + list(APPEND f90flags -fpp -std08 -assume byterecl -traceback) if(debug) - set(f90flags "-g -warn -ftrapuv -fp-stack-check -check all -fpe0 ${f90flags}") - set(ldflags "-g") + list(APPEND f90flags -g -warn -ftrapuv -fp-stack-check + "-check all" -fpe0) + list(APPEND ldflags -g) endif() if(profile) - set(f90flags "-pg ${f90flags}") - set(ldflags "-pg ${ldflags}") + list(APPEND f90flags -pg) + list(APPEND ldflags -pg) endif() if(optimize) - set(f90flags "-O3 ${f90flags}") + list(APPEND f90flags -O3) endif() if(openmp) - set(f90flags "-openmp ${f90flags}") - set(ldflags "-openmp ${ldflags}") + list(APPEND f90flags -openmp) + list(APPEND ldflags -openmp) endif() -elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI") +elseif(CMAKE_Fortran_COMPILER_ID STREQUAL PGI) # PGI Fortran compiler options - set(f90flags "-Mpreprocess -Minform=inform -traceback") + list(APPEND f90flags -Mpreprocess -Minform=inform -traceback) add_definitions(-DNO_F2008) if(debug) - set(f90flags "-g -Mbounds -Mchkptr -Mchkstk ${f90flags}") - set(ldflags "-g") + list(APPEND f90flags -g -Mbounds -Mchkptr -Mchkstk) + list(APPEND ldflags -g) endif() if(profile) - set(f90flags "-pg ${f90flags}") - set(ldflags "-pg ${ldflags}") + list(APPEND f90flags -pg) + list(APPEND ldflags -pg) endif() if(optimize) - set(f90flags "-fast -Mipa ${f90flags}") + list(APPEND f90flags -fast -Mipa) endif() -elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "XL") +elseif(CMAKE_Fortran_COMPILER_ID STREQUAL XL) # IBM XL compiler options - set(f90flags "-O2") + list(APPEND f90flags -O2) add_definitions(-DNO_F2008) if(debug) - set(f90flags "-g -C -qflag=i:i -u") - set(ldflags "-g") + list(APPEND f90flags -g -C -qflag=i:i -u) + list(APPEND ldflags -g) endif() if(profile) - set(f90flags "-p ${f90flags}") - set(ldflags "-p ${ldflags}") + list(APPEND f90flags -p) + list(APPEND ldflags -p) endif() if(optimize) - set(f90flags "-O3 ${f90flags}") + list(APPEND f90flags -O3) endif() if(openmp) - set(f90flags "-qsmp=omp ${f90flags}") - set(ldflags "-qsmp=omp ${ldflags}") + list(APPEND f90flags -qsmp=omp) + list(APPEND ldflags -qsmp=omp) endif() -elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Cray") +elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Cray) # Cray Fortran compiler options - set(f90flags "-e Z -m 0") + list(APPEND f90flags -e Z -m 0) if(debug) - set(f90flags "-g -R abcnsp -O0 ${f90flags}") - set(ldflags "-g") + list(APPEND f90flags -g -R abcnsp -O0) + list(APPEND ldflags -g) endif() endif() @@ -203,10 +219,21 @@ add_subdirectory(src/xml/fox) set(program "openmc") file(GLOB source src/*.F90 src/xml/openmc_fox.F90) add_executable(${program} ${source}) -target_link_libraries(${program} ${libraries} fox_dom) -set_target_properties(${program} PROPERTIES - COMPILE_FLAGS "${f90flags}" - LINK_FLAGS "${ldflags}") + +# target_compile_options was added in CMake 2.8.12 and is the recommended way to +# set compile flags. Note that this sets the COMPILE_OPTIONS property (also +# available only in 2.8.12+) rather than the COMPILE_FLAGS property, which is +# deprecated. The former can handle lists whereas the latter cannot. +if(CMAKE_VERSION VERSION_LESS 4.8.12) + string(REPLACE ";" " " f90flags "${f90flags}") + set_property(TARGET ${program} PROPERTY COMPILE_FLAGS "${f90flags}") +else() + target_compile_options(${program} PUBLIC ${f90flags}) +endif() + +# target_link_libraries treats any arguments starting with - but not -l as +# linker flags. Thus, we can pass both linker flags and libraries together. +target_link_libraries(${program} ${ldflags} ${libraries} fox_dom) #=============================================================================== # Install executable, scripts, manpage, license From e93afed7a08be46e4b95f58f0384d6590750a2a7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 18:56:35 +0400 Subject: [PATCH 042/519] Make HDF5 only binary output option in source and Python API. Still need to update test suite and get rid of output_interface. --- openmc/particle_restart.py | 38 +-- openmc/statepoint.py | 80 +---- src/finalize.F90 | 4 - src/global.F90 | 4 - src/hdf5_interface.F90 | 4 - src/hdf5_summary.F90 | 4 - src/initialize.F90 | 17 +- src/output.F90 | 92 ----- src/output_interface.F90 | 599 +++++---------------------------- src/particle_restart_write.F90 | 4 - src/source.F90 | 4 - src/state_point.F90 | 23 +- src/track_output.F90 | 6 - 13 files changed, 109 insertions(+), 770 deletions(-) diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index d664de1aee..5ae534dbd9 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -40,13 +40,8 @@ class Particle(object): """ def __init__(self, filename): - if filename.endswith('.h5'): - import h5py - self._f = h5py.File(filename, 'r') - self._hdf5 = True - else: - self._f = open(filename, 'rb') - self._hdf5 = False + import h5py + self._f = h5py.File(filename, 'r') # Read all metadata self._read_data() @@ -74,36 +69,17 @@ class Particle(object): self.xyz = self._get_double(3, path='xyz') self.uvw = self._get_double(3, path='uvw') - def _get_data(self, n, typeCode, size): - return list(struct.unpack('={0}{1}'.format(n, typeCode), - self._f.read(n*size))) - def _get_int(self, n=1, path=None): - if self._hdf5: - return [int(v) for v in self._f[path].value] - else: - return [int(v) for v in self._get_data(n, 'i', 4)] + return [int(v) for v in self._f[path].value] def _get_long(self, n=1, path=None): - if self._hdf5: - return [int(v) for v in self._f[path].value] - else: - return [int(v) for v in self._get_data(n, 'q', 8)] + return [int(v) for v in self._f[path].value] def _get_float(self, n=1, path=None): - if self._hdf5: - return [float(v) for v in self._f[path].value] - else: - return [float(v) for v in self._get_data(n, 'f', 4)] + return [float(v) for v in self._f[path].value] def _get_double(self, n=1, path=None): - if self._hdf5: - return [float(v) for v in self._f[path].value] - else: - return [float(v) for v in self._get_data(n, 'd', 8)] + return [float(v) for v in self._f[path].value] def _get_string(self, n=1, path=None): - if self._hdf5: - return str(self._f[path].value) - else: - return str(self._get_data(n, 's', 1)[0]) + return str(self._f[path].value) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 6a4713e91d..673b41e178 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -92,13 +92,8 @@ class StatePoint(object): """ def __init__(self, filename): - if filename.endswith('.h5'): - import h5py - self._f = h5py.File(filename, 'r') - self._hdf5 = True - else: - self._f = open(filename, 'rb') - self._hdf5 = False + import h5py + self._f = h5py.File(filename, 'r') # Set flags for what data has been read self._results = False @@ -171,12 +166,9 @@ class StatePoint(object): raise Exception('Statepoint Revision is not consistent.') # Read OpenMC version - if self._hdf5: - self._version = [self._get_int(path='version_major')[0], - self._get_int(path='version_minor')[0], - self._get_int(path='version_release')[0]] - else: - self._version = self._get_int(3) + self._version = [self._get_int(path='version_major')[0], + self._get_int(path='version_minor')[0], + self._get_int(path='version_release')[0]] # Read date and time self._date_and_time = self._get_string(19, path='date_and_time') @@ -473,13 +465,8 @@ class StatePoint(object): # Read global Tallies n_global_tallies = self._get_int(path='n_global_tallies')[0] - if self._hdf5: - data = self._f['global_tallies'].value - self._global_tallies = np.column_stack((data['sum'], data['sum_sq'])) - - else: - self._global_tallies = np.array(self._get_double(2*n_global_tallies)) - self._global_tallies.shape = (n_global_tallies, 2) + data = self._f['global_tallies'].value + self._global_tallies = np.column_stack((data['sum'], data['sum_sq'])) # Flag indicating if Tallies are present self._tallies_present = self._get_int(path='tallies/tallies_present')[0] @@ -499,15 +486,9 @@ class StatePoint(object): num_tot_bins = tally.num_bins # Extract Tally data from the file - if self._hdf5: - data = self._f['{0}{1}/results'.format(base, tally_key)].value - sum = data['sum'] - sum_sq = data['sum_sq'] - - else: - results = np.array(self._get_double(2*num_tot_bins)) - sum = results[0::2] - sum_sq = results[1::2] + data = self._f['{0}{1}/results'.format(base, tally_key)].value + sum = data['sum'] + sum_sq = data['sum_sq'] # Define a routine to convert 0 to 1 def nonzero(val): @@ -547,8 +528,7 @@ class StatePoint(object): self._source = np.empty(self._n_particles, dtype=SourceSite) # For HDF5 state points, copy entire bank - if self._hdf5: - source_sites = self._f['source_bank'].value + source_sites = self._f['source_bank'].value # Initialize SourceSite object for each particle for i in range(self._n_particles): @@ -556,13 +536,7 @@ class StatePoint(object): site = SourceSite() # Read position, angle, and energy - if self._hdf5: - site._weight, site._xyz, site._uvw, site._E = source_sites[i] - else: - site._weight = self._get_double()[0] - site._xyz = self._get_double(3) - site._uvw = self._get_double(3) - site._E = self._get_double()[0] + site._weight, site._xyz, site._uvw, site._E = source_sites[i] # Store the source site in the NumPy array self._source[i] = site @@ -798,37 +772,19 @@ class StatePoint(object): self._f.read(n*size))) def _get_int(self, n=1, path=None): - if self._hdf5: - return [int(v) for v in self._f[path].value] - else: - return [int(v) for v in self._get_data(n, 'i', 4)] + return [int(v) for v in self._f[path].value] def _get_long(self, n=1, path=None): - if self._hdf5: - return [long(v) for v in self._f[path].value] - else: - return [long(v) for v in self._get_data(n, 'q', 8)] + return [long(v) for v in self._f[path].value] def _get_float(self, n=1, path=None): - if self._hdf5: - return [float(v) for v in self._f[path].value] - else: - return [float(v) for v in self._get_data(n, 'f', 4)] + return [float(v) for v in self._f[path].value] def _get_double(self, n=1, path=None): - if self._hdf5: - return [float(v) for v in self._f[path].value] - else: - return [float(v) for v in self._get_data(n, 'd', 8)] + return [float(v) for v in self._f[path].value] def _get_double_array(self, n=1, path=None): - if self._hdf5: - return self._f[path].value - else: - return self._get_data(n, 'd', 8) + return self._f[path].value def _get_string(self, n=1, path=None): - if self._hdf5: - return str(self._f[path].value) - else: - return str(self._get_data(n, 's', 1)[0]) + return str(self._f[path].value) diff --git a/src/finalize.F90 b/src/finalize.F90 index aa11f47690..b795cdb4f2 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -9,9 +9,7 @@ module finalize use message_passing #endif -#ifdef HDF5 use hdf5_interface, only: h5tclose_f, h5close_f, hdf5_err -#endif implicit none @@ -51,14 +49,12 @@ contains ! Deallocate arrays call free_memory() -#ifdef HDF5 ! Release compound datatypes call h5tclose_f(hdf5_tallyresult_t, hdf5_err) call h5tclose_f(hdf5_bank_t, hdf5_err) ! Close FORTRAN interface. call h5close_f(hdf5_err) -#endif #ifdef MPI ! Free all MPI types diff --git a/src/global.F90 b/src/global.F90 index 564fcda843..ae2f5bb270 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -16,9 +16,7 @@ module global use trigger_header, only: KTrigger use timer_header, only: Timer -#ifdef HDF5 use hdf5_interface, only: HID_T -#endif #ifdef MPIF08 use mpi_f08 #endif @@ -270,12 +268,10 @@ module global ! ============================================================================ ! HDF5 VARIABLES -#ifdef HDF5 integer(HID_T) :: hdf5_output_file ! identifier for output file integer(HID_T) :: hdf5_tallyresult_t ! Compound type for TallyResult integer(HID_T) :: hdf5_bank_t ! Compound type for Bank integer(HID_T) :: hdf5_integer8_t ! type for integer(8) -#endif ! ============================================================================ ! MISCELLANEOUS VARIABLES diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 34b72196ee..e7ba39b646 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1,7 +1,5 @@ module hdf5_interface -#ifdef HDF5 - use hdf5 use h5lt use, intrinsic :: ISO_C_BINDING @@ -1811,6 +1809,4 @@ contains # endif -#endif - end module hdf5_interface diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index 375ab74601..a9dab46f50 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -1,7 +1,5 @@ module hdf5_summary -#ifdef HDF5 - use ace_header, only: Reaction, UrrData, Nuclide use constants use endf, only: reaction_name @@ -875,6 +873,4 @@ contains end subroutine hdf5_write_timing -#endif - end module hdf5_summary diff --git a/src/initialize.F90 b/src/initialize.F90 index b944b6677b..22521b24da 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -15,9 +15,8 @@ module initialize use input_xml, only: read_input_xml, read_cross_sections_xml, & cells_in_univ_dict, read_plots_xml use material_header, only: Material - use output, only: title, header, write_summary, print_version, & - print_usage, write_xs_summary, print_plot, & - write_message + use output, only: title, header, print_version, write_message, & + print_usage, write_xs_summary, print_plot use output_interface use random_lcg, only: initialize_prng use state_point, only: load_state_point @@ -33,10 +32,8 @@ module initialize use omp_lib #endif -#ifdef HDF5 use hdf5_interface use hdf5_summary, only: hdf5_write_summary -#endif implicit none @@ -60,10 +57,8 @@ contains call initialize_mpi() #endif -#ifdef HDF5 ! Initialize HDF5 interface call hdf5_initialize() -#endif ! Read command line arguments call read_command_line() @@ -155,11 +150,7 @@ contains call print_plot() else ! Write summary information -#ifdef HDF5 if (output_summary) call hdf5_write_summary() -#else - if (output_summary) call write_summary() -#endif ! Write cross section information if (output_xs) call write_xs_summary() @@ -275,8 +266,6 @@ contains end subroutine initialize_mpi #endif -#ifdef HDF5 - !=============================================================================== ! HDF5_INITIALIZE !=============================================================================== @@ -319,8 +308,6 @@ contains end subroutine hdf5_initialize -#endif - !=============================================================================== ! READ_COMMAND_LINE reads all parameters from the command line !=============================================================================== diff --git a/src/output.F90 b/src/output.F90 index d1d4ec72aa..2ddbf6499d 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1203,98 +1203,6 @@ contains end subroutine print_sab_table -!=============================================================================== -! WRITE_SUMMARY displays summary information about the problem about to be run -! after reading all input files -!=============================================================================== - - subroutine write_summary() - - integer :: i ! loop index - character(MAX_FILE_LEN) :: path ! path of summary file - type(Material), pointer :: m => null() - type(TallyObject), pointer :: t => null() - - ! Create filename for log file - path = trim(path_output) // "summary.out" - - ! Open log file for writing - open(UNIT=UNIT_SUMMARY, FILE=path, STATUS='replace', ACTION='write') - - call header("OpenMC Monte Carlo Code", unit=UNIT_SUMMARY, level=1) - write(UNIT=UNIT_SUMMARY, FMT=*) & - "Copyright: 2011-2015 Massachusetts Institute of Technology" - write(UNIT=UNIT_SUMMARY, FMT='(1X,A,7X,2(I1,"."),I1)') & - "Version:", VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE -#ifdef GIT_SHA1 - write(UNIT=UNIT_SUMMARY, FMT='(1X,"Git SHA1:",6X,A)') GIT_SHA1 -#endif - write(UNIT=UNIT_SUMMARY, FMT='(1X,"Date/Time:",5X,A)') & - time_stamp() - - ! Write information on number of processors -#ifdef MPI - write(UNIT=UNIT_SUMMARY, FMT='(1X,"MPI Processes:",1X,A)') & - trim(to_str(n_procs)) -#endif - - ! Display problem summary - call header("PROBLEM SUMMARY", unit=UNIT_SUMMARY) - select case(run_mode) - case (MODE_EIGENVALUE) - write(UNIT_SUMMARY,100) 'Problem type:', 'k eigenvalue' - write(UNIT_SUMMARY,101) 'Number of Batches:', n_batches - write(UNIT_SUMMARY,101) 'Number of Inactive Batches:', n_inactive - write(UNIT_SUMMARY,101) 'Generations per Batch:', gen_per_batch - case (MODE_FIXEDSOURCE) - write(UNIT_SUMMARY,100) 'Problem type:', 'fixed source' - end select - write(UNIT_SUMMARY,101) 'Number of Particles:', n_particles - - ! Display geometry summary - call header("GEOMETRY SUMMARY", unit=UNIT_SUMMARY) - write(UNIT_SUMMARY,101) 'Number of Cells:', n_cells - write(UNIT_SUMMARY,101) 'Number of Surfaces:', n_surfaces - write(UNIT_SUMMARY,101) 'Number of Materials:', n_materials - - ! print summary of all geometry - call print_geometry() - - ! print summary of materials - call header("MATERIAL SUMMARY", unit=UNIT_SUMMARY) - do i = 1, n_materials - m => materials(i) - call print_material(m, unit=UNIT_SUMMARY) - end do - - ! print summary of tallies - if (n_tallies > 0) then - call header("TALLY SUMMARY", unit=UNIT_SUMMARY) - do i = 1, n_tallies - t=> tallies(i) - call print_tally(t, unit=UNIT_SUMMARY) - end do - end if - - ! print summary of variance reduction - call header("VARIANCE REDUCTION", unit=UNIT_SUMMARY) - if (survival_biasing) then - write(UNIT_SUMMARY,100) "Survival Biasing:", "on" - else - write(UNIT_SUMMARY,100) "Survival Biasing:", "off" - end if - write(UNIT_SUMMARY,100) "Weight Cutoff:", trim(to_str(weight_cutoff)) - write(UNIT_SUMMARY,100) "Survival weight:", trim(to_str(weight_survive)) - - ! Close summary file - close(UNIT_SUMMARY) - - ! Format descriptor for columns -100 format (1X,A,T35,A) -101 format (1X,A,T35,I11) - - end subroutine write_summary - !=============================================================================== ! WRITE_XS_SUMMARY writes information about each nuclide and S(a,b) table to a ! file called cross_sections.out. This file shows the list of reactions as well diff --git a/src/output_interface.F90 b/src/output_interface.F90 index 05fcd0010b..f56a4b3399 100644 --- a/src/output_interface.F90 +++ b/src/output_interface.F90 @@ -5,12 +5,9 @@ module output_interface use global use tally_header, only: TallyResult -#ifdef HDF5 use hdf5_interface -#else #ifdef MPI use mpiio_interface -#endif #endif implicit none @@ -19,17 +16,8 @@ module output_interface type, public :: BinaryOutput private ! Compilation specific data -#ifdef HDF5 integer(HID_T) :: hdf5_fh integer(HID_T) :: hdf5_grp -#else - integer :: unit_fh -#ifdef MPIF08 - type(MPI_File) :: mpi_fh -#else - integer :: mpi_fh -#endif -#endif logical :: serial ! Serial I/O when using MPI/PHDF5 contains generic, public :: write_data => write_double, & @@ -87,11 +75,9 @@ module output_interface procedure, public :: read_tally_result => read_tally_result procedure, public :: write_source_bank => write_source_bank procedure, public :: read_source_bank => read_source_bank -#ifdef HDF5 procedure, public :: write_attribute_string => write_attribute_string procedure, public :: open_group => open_group procedure, public :: close_group => close_group -#endif end type BinaryOutput contains @@ -113,26 +99,14 @@ contains self % serial = .true. end if -#ifdef HDF5 -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_file_create(filename, self % hdf5_fh) else call hdf5_file_create_parallel(filename, self % hdf5_fh) endif -# else - call hdf5_file_create(filename, self % hdf5_fh) -# endif -#elif MPI - if (self % serial) then - open(NEWUNIT=self % unit_fh, FILE=filename, ACTION="write", & - STATUS='replace', ACCESS='stream') - else - call mpi_create_file(filename, self % mpi_fh) - end if #else - open(NEWUNIT=self % unit_fh, FILE=filename, ACTION="write", & - STATUS='replace', ACCESS='stream') + call hdf5_file_create(filename, self % hdf5_fh) #endif end subroutine file_create @@ -155,38 +129,14 @@ contains self % serial = .true. end if -#ifdef HDF5 -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_file_open(filename, self % hdf5_fh, mode) else call hdf5_file_open_parallel(filename, self % hdf5_fh, mode) endif -# else - call hdf5_file_open(filename, self % hdf5_fh, mode) -# endif -#elif MPI - if (self % serial) then - ! Check for read/write mode to open, default is read only - if (mode == 'w') then - open(NEWUNIT=self % unit_fh, FILE=filename, ACTION='write', & - STATUS='old', ACCESS='stream', POSITION='append') - else - open(NEWUNIT=self % unit_fh, FILE=filename, ACTION='read', & - STATUS='old', ACCESS='stream') - end if - else - call mpi_open_file(filename, self % mpi_fh, mode) - end if #else - ! Check for read/write mode to open, default is read only - if (mode == 'w') then - open(NEWUNIT=self % unit_fh, FILE=filename, ACTION='write', & - STATUS='old', ACCESS='stream', POSITION='append') - else - open(NEWUNIT=self % unit_fh, FILE=filename, ACTION='read', & - STATUS='old', ACCESS='stream') - end if + call hdf5_file_open(filename, self % hdf5_fh, mode) #endif end subroutine file_open @@ -199,21 +149,7 @@ contains class(BinaryOutput) :: self -#ifdef HDF5 -# ifdef MPI call hdf5_file_close(self % hdf5_fh) -# else - call hdf5_file_close(self % hdf5_fh) -# endif -#elif MPI - if (self % serial) then - close(UNIT=self % unit_fh) - else - call mpi_close_file(self % mpi_fh) - end if -#else - close(UNIT=self % unit_fh) -#endif end subroutine file_close @@ -221,7 +157,6 @@ contains ! OPEN_GROUP call hdf5 routine to open a group within binary output context !=============================================================================== -#ifdef HDF5 subroutine open_group(self, group) character(*), intent(in) :: group ! HDF5 group name @@ -230,13 +165,11 @@ contains call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) end subroutine open_group -#endif !=============================================================================== ! CLOSE_GROUP call hdf5 routine to close a group within binary output context !=============================================================================== -#ifdef HDF5 subroutine close_group(self) class(BinaryOutput) :: self @@ -244,7 +177,6 @@ contains call hdf5_close_group(self % hdf5_grp) end subroutine close_group -#endif !=============================================================================== ! WRITE_DOUBLE writes double precision scalar data @@ -277,33 +209,23 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_double(self % hdf5_grp, name_, buffer) else call hdf5_write_double_parallel(self % hdf5_grp, name_, buffer, collect_) end if -# else +#else call hdf5_write_double(self % hdf5_grp, name_, buffer) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer - else - call mpi_write_double(self % mpi_fh, buffer, collect_) - end if -#else - write(self % unit_fh) buffer -#endif end subroutine write_double @@ -338,33 +260,23 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_double(self % hdf5_grp, name_, buffer) else call hdf5_read_double_parallel(self % hdf5_grp, name_, buffer, collect_) end if -# else +#else call hdf5_read_double(self % hdf5_grp, name_, buffer) -# endif +#endif ! Check if HDf5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer - else - call mpi_read_double(self % mpi_fh, buffer, collect_) - end if -#else - read(self % unit_fh) buffer -#endif end subroutine read_double @@ -400,34 +312,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_double_1Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length) - else - call mpi_write_double_1Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length) -#endif end subroutine write_double_1Darray @@ -463,34 +365,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_double_1Darray_parallel(self % hdf5_grp, name_, buffer, & length, collect_) end if -# else +#else call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length) - else - call mpi_read_double_1Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length) -#endif end subroutine read_double_1Darray @@ -526,34 +418,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_double_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length(1),1:length(2)) - else - call mpi_write_double_2Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length(1),1:length(2)) -#endif end subroutine write_double_2Darray @@ -589,34 +471,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_double_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length(1),1:length(2)) - else - call mpi_read_double_2Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length(1),1:length(2)) -#endif end subroutine read_double_2Darray @@ -652,34 +524,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_double_3Darray_parallel(self % hdf5_grp, name_, buffer, & length, collect_) end if -# else +#else call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) - else - call mpi_write_double_3Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) -#endif end subroutine write_double_3Darray @@ -715,34 +577,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_double_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) - else - call mpi_read_double_3Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) -#endif end subroutine read_double_3Darray @@ -779,37 +631,25 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_double_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else ! Write the data in serial call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) - else - call mpi_write_double_4Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) -#endif end subroutine write_double_4Darray @@ -846,36 +686,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_double_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) - else - call mpi_read_double_4Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) -#endif end subroutine read_double_4Darray @@ -910,33 +738,23 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_integer(self % hdf5_grp, name_, buffer) else call hdf5_write_integer_parallel(self % hdf5_grp, name_, buffer, collect_) end if -# else +#else call hdf5_write_integer(self % hdf5_grp, name_, buffer) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer - else - call mpi_write_integer(self % mpi_fh, buffer, collect_) - end if -#else - write(self % unit_fh) buffer -#endif end subroutine write_integer @@ -971,33 +789,23 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_integer(self % hdf5_grp, name_, buffer) else call hdf5_read_integer_parallel(self % hdf5_grp, name_, buffer, collect_) end if -# else +#else call hdf5_read_integer(self % hdf5_grp, name_, buffer) -# endif +#endif ! Check if HDf5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer - else - call mpi_read_integer(self % mpi_fh, buffer, collect_) - end if -#else - read(self % unit_fh) buffer -#endif end subroutine read_integer @@ -1033,34 +841,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_integer_1Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length) - else - call mpi_write_integer_1Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length) -#endif end subroutine write_integer_1Darray @@ -1096,35 +894,25 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_integer_1Darray_parallel(self % hdf5_grp, name_, buffer, & length, collect_) end if -# else +#else ! Read the data in serial call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length) - else - call mpi_read_integer_1Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length) -#endif end subroutine read_integer_1Darray @@ -1160,34 +948,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_integer_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length(1),1:length(2)) - else - call mpi_write_integer_2Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length(1),1:length(2)) -#endif end subroutine write_integer_2Darray @@ -1223,34 +1001,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_integer_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length(1),1:length(2)) - else - call mpi_read_integer_2Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length(1),1:length(2)) -#endif end subroutine read_integer_2Darray @@ -1286,34 +1054,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_integer_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) - else - call mpi_write_integer_3Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) -#endif end subroutine write_integer_3Darray @@ -1349,34 +1107,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_integer_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) - else - call mpi_read_integer_3Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3)) -#endif end subroutine read_integer_3Darray @@ -1413,36 +1161,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_write_integer_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) - else - call mpi_write_integer_4Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - write(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) -#endif end subroutine write_integer_4Darray @@ -1479,36 +1215,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) else call hdf5_read_integer_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & collect_) end if -# else +#else call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) - else - call mpi_read_integer_4Darray(self % mpi_fh, buffer, length, collect_) - end if -#else - read(self % unit_fh) buffer(1:length(1),1:length(2),1:length(3), & - 1:length(4)) -#endif end subroutine read_integer_4Darray @@ -1543,34 +1267,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) else call hdf5_write_long_parallel(self % hdf5_grp, name_, buffer, & hdf5_integer8_t, collect_) end if -# else +#else call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer - else - call mpi_write_long(self % mpi_fh, buffer, collect_) - end if -#else - write(self % unit_fh) buffer -#endif end subroutine write_long @@ -1605,34 +1319,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) else call hdf5_read_long_parallel(self % hdf5_grp, name_, buffer, & hdf5_integer8_t, collect_) end if -# else +#else call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer - else - call mpi_read_long(self % mpi_fh, buffer, collect_) - end if -#else - read(self % unit_fh) buffer -#endif end subroutine read_long @@ -1671,34 +1375,24 @@ contains collect_ = .true. end if -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_write_string(self % hdf5_grp, name_, buffer, n) else call hdf5_write_string_parallel(self % hdf5_grp, name_, buffer, n, collect_) end if -# else +#else ! Write the data call hdf5_write_string(self % hdf5_grp, name_, buffer, n) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - write(self % unit_fh) buffer - else - call mpi_write_string(self % mpi_fh, buffer, n, collect_) - end if -#else - write(self % unit_fh) buffer -#endif end subroutine write_string @@ -1737,34 +1431,23 @@ contains collect_ = .true. end if - -#ifdef HDF5 ! Check if HDF5 group should be created/opened if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) else self % hdf5_grp = self % hdf5_fh endif -# ifdef MPI +#ifdef MPI if (self % serial) then call hdf5_read_string(self % hdf5_grp, name_, buffer, n) else call hdf5_read_string_parallel(self % hdf5_grp, name_, buffer, n, collect_) end if -# else +#else call hdf5_read_string(self % hdf5_grp, name_, buffer, n) -# endif +#endif ! Check if HDF5 group should be closed if (present(group)) call hdf5_close_group(self % hdf5_grp) -#elif MPI - if (self % serial) then - read(self % unit_fh) buffer - else - call mpi_read_string(self % mpi_fh, buffer, n, collect_) - end if -#else - read(self % unit_fh) buffer -#endif end subroutine read_string @@ -1772,7 +1455,6 @@ contains ! WRITE_ATTRIBUTE_STRING !=============================================================================== -#ifdef HDF5 subroutine write_attribute_string(self, var, attr_type, attr_str, group) character(*), intent(in) :: var ! variable name for attr @@ -1795,7 +1477,6 @@ contains if (present(group)) call hdf5_close_group(self % hdf5_grp) end subroutine write_attribute_string -#endif !=============================================================================== ! WRITE_TALLY_RESULT writes an OpenMC TallyResult type @@ -1812,10 +1493,6 @@ contains character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name -#ifndef HDF5 - integer :: j,k ! iteration counters -#endif - ! Set name name_ = trim(name) @@ -1824,8 +1501,6 @@ contains group_ = trim(group) end if -#ifdef HDF5 - ! Open up sub-group if present if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) @@ -1854,18 +1529,6 @@ contains call hdf5_close_group(self % hdf5_grp) end if -#else - - ! Write out tally buffer - do k = 1, n2 - do j = 1, n1 - write(self % unit_fh) buffer(j,k) % sum - write(self % unit_fh) buffer(j,k) % sum_sq - end do - end do - -#endif - end subroutine write_tally_result !=============================================================================== @@ -1883,12 +1546,6 @@ contains character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name -#ifndef HDF5 -# ifndef MPI - integer :: j,k ! iteration counters -# endif -#endif - ! Set name name_ = trim(name) @@ -1897,8 +1554,6 @@ contains group_ = trim(group) end if -#ifdef HDF5 - ! Open up sub-group if present if (present(group)) then call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) @@ -1917,24 +1572,6 @@ contains call h5dclose_f(dset, hdf5_err) if (present(group)) call hdf5_close_group(self % hdf5_grp) -# elif MPI - - ! Write out tally buffer - call MPI_FILE_READ(self % mpi_fh, buffer, n1*n2, MPI_TALLYRESULT, & - MPI_STATUS_IGNORE, mpiio_err) - -#else - - ! Read tally result - do k = 1, n2 - do j = 1, n1 - read(self % unit_fh) buffer(j,k) % sum - read(self % unit_fh) buffer(j,k) % sum_sq - end do - end do - -#endif - end subroutine read_tally_result !=============================================================================== @@ -1946,21 +1583,9 @@ contains class(BinaryOutput) :: self #ifdef MPI -# ifndef HDF5 - integer(MPI_OFFSET_KIND) :: offset ! offset of data - integer :: size_bank ! size of bank to write -#ifdef MPIF08 - type(MPI_Datatype) :: datatype -#else - integer :: datatype -#endif -# endif -# ifdef HDF5 - integer(8) :: offset(1) ! source data offset -# endif + integer(8) :: offset(1) ! source data offset #endif -#ifdef HDF5 #ifdef MPI ! Set size of total dataspace for all procs and rank @@ -2005,7 +1630,7 @@ contains call h5dclose_f(dset, hdf5_err) call h5pclose_f(plist, hdf5_err) -# else +#else ! Set size dims1(1) = work @@ -2028,31 +1653,6 @@ contains call h5dclose_f(dset, hdf5_err) call h5sclose_f(dspace, hdf5_err) -# endif - -#elif MPI - - ! Get current offset for master - if (master) call MPI_FILE_GET_POSITION(self % mpi_fh, offset, mpiio_err) - - ! Determine offset on master process and broadcast to all processors - call MPI_TYPE_MATCH_SIZE(MPI_TYPECLASS_INTEGER, MPI_OFFSET_KIND, & - datatype, mpi_err) - call MPI_BCAST(offset, 1, datatype, 0, MPI_COMM_WORLD, mpi_err) - - ! Set the proper offset for source data on this processor - call MPI_TYPE_SIZE(MPI_BANK, size_bank, mpi_err) - offset = offset + size_bank*work_index(rank) - - ! Write all source sites - call MPI_FILE_WRITE_AT(self % mpi_fh, offset, source_bank(1), int(work), & - MPI_BANK, MPI_STATUS_IGNORE, mpiio_err) - -#else - - ! Write out source sites - write(self % unit_fh) source_bank - #endif end subroutine write_source_bank @@ -2066,17 +1666,10 @@ contains class(BinaryOutput) :: self #ifdef MPI -# ifndef HDF5 - integer(MPI_OFFSET_KIND) :: offset ! offset of data - integer :: size_bank ! size of bank to read -# endif -# ifdef HDF5 - integer(8) :: offset(1) ! offset of data -# endif + integer(8) :: offset(1) ! offset of data #endif -#ifdef HDF5 -# ifdef MPI +#ifdef MPI ! Set size of total dataspace for all procs and rank dims1(1) = n_particles @@ -2114,7 +1707,7 @@ contains call h5dclose_f(dset, hdf5_err) call h5pclose_f(plist, hdf5_err) -# else +#else ! Open dataset call h5dopen_f(self % hdf5_fh, "source_bank", dset, hdf5_err) @@ -2128,36 +1721,6 @@ contains ! Close all ids call h5dclose_f(dset, hdf5_err) -# endif - -#elif MPI - - ! Go to the end of the file to set file pointer - offset = 0 - call MPI_FILE_SEEK(self % mpi_fh, offset, MPI_SEEK_END, & - mpiio_err) - - ! Get current offset (will be at EOF) - call MPI_FILE_GET_POSITION(self % mpi_fh, offset, mpiio_err) - - ! Get the size of the source bank on all procs - call MPI_TYPE_SIZE(MPI_BANK, size_bank, mpi_err) - - ! Calculate offset where the source bank will begin - offset = offset - n_particles*size_bank - - ! Set the proper offset for source data on this processor - offset = offset + size_bank*work_index(rank) - - ! Write all source sites - call MPI_FILE_READ_AT(self % mpi_fh, offset, source_bank(1), int(work), & - MPI_BANK, MPI_STATUS_IGNORE, mpiio_err) - -#else - - ! Write out source sites - read(self % unit_fh) source_bank - #endif end subroutine read_source_bank diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index f138a67403..48b4af661e 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -32,11 +32,7 @@ contains ! Set up file name filename = trim(path_output) // 'particle_' // trim(to_str(current_batch)) & // '_' // trim(to_str(p % id)) -#ifdef HDF5 filename = trim(filename) // '.h5' -#else - filename = trim(filename) // '.binary' -#endif !$omp critical (WriteParticleRestart) ! Create file diff --git a/src/source.F90 b/src/source.F90 index e824829154..4b0de58b5a 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -79,11 +79,7 @@ contains ! Write out initial source if (write_initial_source) then call write_message('Writing out initial source...', 1) -#ifdef HDF5 filename = trim(path_output) // 'initial_source.h5' -#else - filename = trim(path_output) // 'initial_source.binary' -#endif call sp % file_create(filename, serial = .false.) call sp % write_source_bank() call sp % file_close() diff --git a/src/state_point.F90 b/src/state_point.F90 index 6b983231f6..790fd58c57 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -55,11 +55,7 @@ contains & zero_padded(current_batch, count_digits(n_max_batches)) ! Append appropriate extension -#ifdef HDF5 filename = trim(filename) // '.h5' -#else - filename = trim(filename) // '.binary' -#endif ! Write message call write_message("Creating state point " // trim(filename) // "...", 1) @@ -118,10 +114,8 @@ contains ! Write out CMFD info if (cmfd_on) then -#ifdef HDF5 call sp % open_group("cmfd") call sp % close_group() -#endif call sp % write_data(1, "cmfd_on") call sp % write_data(cmfd % indices, "indices", length=4, group="cmfd") call sp % write_data(cmfd % k_cmfd, "k_cmfd", length=current_batch, & @@ -143,10 +137,8 @@ contains end if end if -#ifdef HDF5 call sp % open_group("tallies") call sp % close_group() -#endif ! Write number of meshes call sp % write_data(n_meshes, "n_meshes", group="tallies/meshes") @@ -414,11 +406,7 @@ contains filename = trim(path_output) // 'source.' // & & zero_padded(current_batch, count_digits(n_max_batches)) -#ifdef HDF5 filename = trim(filename) // '.h5' -#else - filename = trim(filename) // '.binary' -#endif ! Write message for new file creation call write_message("Creating source file " // trim(filename) // "...", & @@ -434,12 +422,8 @@ contains ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & - & zero_padded(current_batch, count_digits(n_max_batches)) -#ifdef HDF5 + zero_padded(current_batch, count_digits(n_max_batches)) filename = trim(filename) // '.h5' -#else - filename = trim(filename) // '.binary' -#endif ! Reopen statepoint file in parallel call sp % file_open(filename, 'w', serial = .false.) @@ -456,14 +440,9 @@ contains ! Also check to write source separately in overwritten file if (source_latest) then - ! Set filename filename = trim(path_output) // 'source' -#ifdef HDF5 filename = trim(filename) // '.h5' -#else - filename = trim(filename) // '.binary' -#endif ! Write message for new file creation call write_message("Creating source file " // trim(filename) // "...", 1) diff --git a/src/track_output.F90 b/src/track_output.F90 index 6ab514cdb8..d3716e9b05 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -95,15 +95,9 @@ contains integer, allocatable :: n_coords(:) integer :: n_particle_tracks -#ifdef HDF5 fname = trim(path_output) // 'track_' // trim(to_str(current_batch)) & // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & // '.h5' -#else - fname = trim(path_output) // 'track_' // trim(to_str(current_batch)) & - // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & - // '.binary' -#endif ! Determine total number of particles and number of coordinates for each n_particle_tracks = size(tracks) From d1139cbedcd8624cefae3140d70f606581e21a6a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 21:58:17 +0400 Subject: [PATCH 043/519] Remove non-HDF5 configurations from tests --- CMakeLists.txt | 56 +++++++++-------------------------- tests/run_tests.py | 63 ++++++++++++++-------------------------- tests/testing_harness.py | 16 +++++----- tests/travis.sh | 4 +-- 4 files changed, 44 insertions(+), 95 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e4452d3234..7d4dfde7fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,20 +39,12 @@ add_definitions(-DMAX_COORD=${maxcoord}) #=============================================================================== set(MPI_ENABLED FALSE) -set(HDF5_ENABLED FALSE) -if($ENV{FC} MATCHES "mpi[^/]*$") - message("-- Detected MPI wrapper: $ENV{FC}") - add_definitions(-DMPI) - set(MPI_ENABLED TRUE) -elseif($ENV{FC} MATCHES "h5fc$") +if($ENV{FC} MATCHES "h5fc$") message("-- Detected HDF5 wrapper: $ENV{FC}") - add_definitions(-DHDF5) - set(HDF5_ENABLED TRUE) elseif($ENV{FC} MATCHES "h5pfc$") message("-- Detected parallel HDF5 wrapper: $ENV{FC}") - add_definitions(-DMPI -DHDF5) + add_definitions(-DMPI) set(MPI_ENABLED TRUE) - set(HDF5_ENABLED TRUE) endif() # Check for Fortran 2008 MPI interface @@ -332,38 +324,18 @@ foreach(test ${TESTS}) # If a restart test is encounted, need to run with -r and restart file(s) elseif(${test} MATCHES "restart") - # Set restart file names - if (${HDF5_ENABLED}) - - # Handle restart tests separately - if(${test} MATCHES "test_statepoint_restart") - set(RESTART_FILE statepoint.07.h5) - elseif(${test} MATCHES "test_sourcepoint_restart") - set(RESTART_FILE statepoint.07.h5 source.07.h5) - elseif(${test} MATCHES "test_particle_restart_eigval") - set(RESTART_FILE particle_9_555.h5) - elseif(${test} MATCHES "test_particle_restart_fixed") - set(RESTART_FILE particle_7_928.h5) - else(${test} MATCHES "test_statepoint_restart") - message(FATAL_ERROR "Restart test ${test} not recognized") - endif(${test} MATCHES "test_statepoint_restart") - - else(${HDF5_ENABLED}) - - # Handle restart tests separately - if(${test} MATCHES "test_statepoint_restart") - set(RESTART_FILE statepoint.07.binary) - elseif(${test} MATCHES "test_sourcepoint_restart") - set(RESTART_FILE statepoint.07.binary source.07.binary) - elseif(${test} MATCHES "test_particle_restart_eigval") - set(RESTART_FILE particle_9_555.binary) - elseif(${test} MATCHES "test_particle_restart_fixed") - set(RESTART_FILE particle_7_6144.binary) - else(${test} MATCHES "test_statepoint_restart") - message(FATAL_ERROR "Restart test ${test} not recognized") - endif(${test} MATCHES "test_statepoint_restart") - - endif(${HDF5_ENABLED}) + # Handle restart tests separately + if(${test} MATCHES "test_statepoint_restart") + set(RESTART_FILE statepoint.07.h5) + elseif(${test} MATCHES "test_sourcepoint_restart") + set(RESTART_FILE statepoint.07.h5 source.07.h5) + elseif(${test} MATCHES "test_particle_restart_eigval") + set(RESTART_FILE particle_9_555.h5) + elseif(${test} MATCHES "test_particle_restart_fixed") + set(RESTART_FILE particle_7_928.h5) + else(${test} MATCHES "test_statepoint_restart") + message(FATAL_ERROR "Restart test ${test} not recognized") + endif(${test} MATCHES "test_statepoint_restart") # Perform serial valgrind and coverage test add_test(NAME ${TEST_NAME} diff --git a/tests/run_tests.py b/tests/run_tests.py index 3550ad7cb1..aa2eb14cfd 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -107,13 +107,12 @@ tests = OrderedDict() class Test(object): def __init__(self, name, debug=False, optimize=False, mpi=False, openmp=False, - hdf5=False, valgrind=False, coverage=False): + valgrind=False, coverage=False): self.name = name self.debug = debug self.optimize = optimize self.mpi = mpi self.openmp = openmp - self.hdf5 = hdf5 self.valgrind = valgrind self.coverage = coverage self.success = True @@ -124,15 +123,11 @@ class Test(object): self.cmake = ['cmake', '-H..', '-Bbuild', '-DPYTHON_EXECUTABLE=' + sys.executable] - # Check for MPI/HDF5 - if self.mpi and not self.hdf5: - self.fc = MPI_DIR+'/bin/mpif90' - elif not self.mpi and self.hdf5: - self.fc = HDF5_DIR+'/bin/h5fc' - elif self.mpi and self.hdf5: - self.fc = PHDF5_DIR+'/bin/h5pfc' + # Check for MPI + if self.mpi: + self.fc = PHDF5_DIR + '/bin/h5pfc' else: - self.fc = FC + self.fc = HDF5_DIR + '/bin/h5fc' # Sets the build name that will show up on the CDash def get_build_name(self): @@ -263,41 +258,26 @@ class Test(object): # Simple function to add a test to the global tests dictionary def add_test(name, debug=False, optimize=False, mpi=False, openmp=False,\ - hdf5=False, valgrind=False, coverage=False): - tests.update({name: Test(name, debug, optimize, mpi, openmp, hdf5, + valgrind=False, coverage=False): + tests.update({name: Test(name, debug, optimize, mpi, openmp, valgrind, coverage)}) # List of all tests that may be run. User can add -C to command line to specify # a subset of these configurations -add_test('basic-normal') -add_test('basic-debug', debug=True) -add_test('basic-optimize', optimize=True) -add_test('omp-normal', openmp=True) -add_test('omp-debug', openmp=True, debug=True) -add_test('omp-optimize', openmp=True, optimize=True) -add_test('hdf5-normal', hdf5=True) -add_test('hdf5-debug', hdf5=True, debug=True) -add_test('hdf5-optimize', hdf5=True, optimize=True) -add_test('omp-hdf5-normal', openmp=True, hdf5=True) -add_test('omp-hdf5-debug', openmp=True, hdf5=True, debug=True) -add_test('omp-hdf5-optimize', openmp=True, hdf5=True, optimize=True) -add_test('mpi-normal', mpi=True) -add_test('mpi-debug', mpi=True, debug=True) -add_test('mpi-optimize', mpi=True, optimize=True) -add_test('mpi-omp-normal', mpi=True, openmp=True) -add_test('mpi-omp-debug', mpi=True, openmp=True, debug=True) -add_test('mpi-omp-optimize', mpi=True, openmp=True, optimize=True) -add_test('phdf5-normal', mpi=True, hdf5=True) -add_test('phdf5-debug', mpi=True, hdf5=True, debug=True) -add_test('phdf5-optimize', mpi=True, hdf5=True, optimize=True) -add_test('phdf5-omp-normal', mpi=True, hdf5=True, openmp=True) -add_test('phdf5-omp-debug', mpi=True, hdf5=True, openmp=True, debug=True) -add_test('phdf5-omp-optimize', mpi=True, hdf5=True, openmp=True, optimize=True) -add_test('basic-debug_valgrind', debug=True, valgrind=True) -add_test('hdf5-debug_valgrind', hdf5=True, debug=True, valgrind=True) -add_test('basic-debug_coverage', debug=True, coverage=True) -add_test('hdf5-debug_coverage', debug=True, hdf5=True, coverage=True) -add_test('mpi-debug_coverage', debug=True, mpi=True, coverage=True) +add_test('hdf5-normal') +add_test('hdf5-debug', debug=True) +add_test('hdf5-optimize', optimize=True) +add_test('omp-hdf5-normal', openmp=True) +add_test('omp-hdf5-debug', openmp=True, debug=True) +add_test('omp-hdf5-optimize', openmp=True, optimize=True) +add_test('phdf5-normal', mpi=True) +add_test('phdf5-debug', mpi=True, debug=True) +add_test('phdf5-optimize', mpi=True, optimize=True) +add_test('phdf5-omp-normal', mpi=True, openmp=True) +add_test('phdf5-omp-debug', mpi=True, openmp=True, debug=True) +add_test('phdf5-omp-optimize', mpi=True, openmp=True, optimize=True) +add_test('hdf5-debug_valgrind', debug=True, valgrind=True) +add_test('hdf5-debug_coverage', debug=True, coverage=True) # Check to see if we should just print build configuration information to user if options.list_build_configs: @@ -305,7 +285,6 @@ if options.list_build_configs: print('Configuration Name: {0}'.format(key)) print(' Debug Flags:..........{0}'.format(tests[key].debug)) print(' Optimization Flags:...{0}'.format(tests[key].optimize)) - print(' HDF5 Active:..........{0}'.format(tests[key].hdf5)) print(' MPI Active:...........{0}'.format(tests[key].mpi)) print(' OpenMP Active:........{0}'.format(tests[key].openmp)) print(' Valgrind Test:........{0}'.format(tests[key].valgrind)) diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 9405db845c..2059c46dae 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -82,9 +82,8 @@ class TestHarness(object): statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name)) assert len(statepoint) == 1, 'Either multiple or no statepoint files ' \ 'exist.' - assert statepoint[0].endswith('binary') \ - or statepoint[0].endswith('h5'), \ - 'Statepoint file is not a binary or hdf5 file.' + assert statepoint[0].endswith('h5'), \ + 'Statepoint file is not a HDF5 file.' if self._tallies: assert os.path.exists(os.path.join(os.getcwd(), 'tallies.out')), \ 'Tally output file does not exist.' @@ -155,7 +154,7 @@ class HashedTestHarness(TestHarness): class PlotTestHarness(TestHarness): - """Specialized TestHarness for running OpenMC plotting tests.""" + """Specialized TestHarness for running OpenMC plotting tests.""" def __init__(self, plot_names): self._plot_names = plot_names self._opts = None @@ -199,7 +198,7 @@ class PlotTestHarness(TestHarness): class CMFDTestHarness(TestHarness): - """Specialized TestHarness for running OpenMC CMFD tests.""" + """Specialized TestHarness for running OpenMC CMFD tests.""" def _get_results(self): """Digest info in the statepoint and return as a string.""" # Read the statepoint file. @@ -233,15 +232,14 @@ class CMFDTestHarness(TestHarness): class ParticleRestartTestHarness(TestHarness): - """Specialized TestHarness for running OpenMC particle restart tests.""" + """Specialized TestHarness for running OpenMC particle restart tests.""" def _test_output_created(self): """Make sure the restart file has been created.""" particle = glob.glob(os.path.join(os.getcwd(), self._sp_name)) assert len(particle) == 1, 'Either multiple or no particle restart ' \ 'files exist.' - assert particle[0].endswith('binary') \ - or particle[0].endswith('h5'), \ - 'Particle restart file is not a binary or hdf5 file.' + assert particle[0].endswith('h5'), \ + 'Particle restart file is not a HDF5 file.' def _get_results(self): """Digest info in the statepoint and return as a string.""" diff --git a/tests/travis.sh b/tests/travis.sh index fac8d793a6..af54b4ff67 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -5,7 +5,7 @@ set -ev # Run all debug tests ./check_source.py if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - ./run_tests.py -C "^basic-debug$|^hdf5-debug$|^mpi-omp-debug$|^phdf5-omp-debug$" -j 2 -s + ./run_tests.py -C "^hdf5-debug$|^phdf5-debug$|^phdf5-omp-debug$" -j 2 -s else - ./run_tests.py -C "^basic-debug$" -j 2 + ./run_tests.py -C "^hdf5-debug$" -j 2 fi From 4db5ff01bdccf4219943b656c7092e022f5cf7ca Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Jul 2015 22:43:57 +0400 Subject: [PATCH 044/519] Remove mpiio_interface module --- src/mpiio_interface.F90 | 610 --------------------------------------- src/output_interface.F90 | 3 - 2 files changed, 613 deletions(-) delete mode 100644 src/mpiio_interface.F90 diff --git a/src/mpiio_interface.F90 b/src/mpiio_interface.F90 deleted file mode 100644 index b9652c8ae4..0000000000 --- a/src/mpiio_interface.F90 +++ /dev/null @@ -1,610 +0,0 @@ -module mpiio_interface - -#ifdef MPI -#ifndef HDF5 - use message_passing - - implicit none - -#ifdef MPIF08 -#define FH_TYPE type(MPI_File) -#else -#define FH_TYPE integer -#endif - - integer :: mpiio_err ! MPI error code - - ! Generic HDF5 write procedure interface - interface mpi_write_data - module procedure mpi_write_double - module procedure mpi_write_double_1Darray - module procedure mpi_write_double_2Darray - module procedure mpi_write_double_3Darray - module procedure mpi_write_double_4Darray - module procedure mpi_write_integer - module procedure mpi_write_integer_1Darray - module procedure mpi_write_integer_2Darray - module procedure mpi_write_integer_3Darray - module procedure mpi_write_integer_4Darray - module procedure mpi_write_long - module procedure mpi_write_string - end interface mpi_write_data - - ! Generic HDF5 read procedure interface - interface mpi_read_data - module procedure mpi_read_double - module procedure mpi_read_double_1Darray - module procedure mpi_read_double_2Darray - module procedure mpi_read_double_3Darray - module procedure mpi_read_double_4Darray - module procedure mpi_read_integer - module procedure mpi_read_integer_1Darray - module procedure mpi_read_integer_2Darray - module procedure mpi_read_integer_3Darray - module procedure mpi_read_integer_4Darray - module procedure mpi_read_long - module procedure mpi_read_string - end interface mpi_read_data - -contains - -!=============================================================================== -! MPI_CREATE_FILE creates a file using MPI file I/O -!=============================================================================== - - subroutine mpi_create_file(filename, fh) - - character(*), intent(in) :: filename ! name of file to create - FH_TYPE, intent(inout) :: fh ! file handle - - ! Create the file - call MPI_FILE_OPEN(MPI_COMM_WORLD, filename, MPI_MODE_CREATE + & - MPI_MODE_WRONLY, MPI_INFO_NULL, fh, mpiio_err) - - end subroutine mpi_create_file - -!=============================================================================== -! MPI_OPEN_FILE opens a file using MPI file I/O -!=============================================================================== - - subroutine mpi_open_file(filename, fh, mode) - - character(*), intent(in) :: filename ! name of file to open - character(*), intent(in) :: mode ! open 'r' read, 'w' write - FH_TYPE, intent(inout) :: fh ! file handle - - integer :: open_mode - - ! Determine access mode - open_mode = MPI_MODE_RDONLY - if (mode == 'w') then - open_mode = ior(MPI_MODE_APPEND, MPI_MODE_WRONLY) - end if - - ! Create the file - call MPI_FILE_OPEN(MPI_COMM_WORLD, filename, & - open_mode, MPI_INFO_NULL, fh, mpiio_err) - - end subroutine mpi_open_file - -!=============================================================================== -! MPI_CLOSE_FILE closes a file using MPI file I/O -!=============================================================================== - - subroutine mpi_close_file(fh) - - FH_TYPE, intent(inout) :: fh ! file handle - - call MPI_FILE_CLOSE(fh, mpiio_err) - - end subroutine mpi_close_file - -!=============================================================================== -! MPI_WRITE_INTEGER writes integer scalar data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_integer(fh, buffer, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: buffer ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, 1, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, 1, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_integer - -!=============================================================================== -! MPI_READ_INTEGER reads integer scalar data using MPI file I/O -!=============================================================================== - - subroutine mpi_read_integer(fh, buffer, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(inout) :: buffer ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, 1, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_integer - -!=============================================================================== -! MPI_WRITE_INTEGER_1DARRAY writes integer 1-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_integer_1Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length ! length of array - integer, intent(in) :: buffer(:) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, length, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, length, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_integer_1Darray - -!=============================================================================== -! MPI_READ_INTEGER_1DARRAY reads integer 1-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_integer_1Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length ! length of array - integer, intent(inout) :: buffer(:) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, length, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, length, MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_integer_1Darray - -!=============================================================================== -! MPI_WRITE_INTEGER_2DARRAY writes integer 2-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_integer_2Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(2) ! length of array - integer, intent(in) :: buffer(length(1),length(2)) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_integer_2Darray - -!=============================================================================== -! MPI_READ_INTEGER_2DARRAY reads integer 2-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_integer_2Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(2) ! length of array - integer, intent(inout) :: buffer(length(1),length(2)) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_integer_2Darray - -!=============================================================================== -! MPI_WRITE_INTEGER_3DARRAY writes integer 3-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_integer_3Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(3) ! length of array - integer, intent(in) :: buffer(length(1),length(2),& - length(3)) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_integer_3Darray - -!=============================================================================== -! MPI_READ_INTEGER_3DARRAY reads integer 3-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_integer_3Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(3) ! length of array - integer, intent(inout) :: buffer(length(1),length(2), & - length(3)) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_integer_3Darray - -!=============================================================================== -! MPI_WRITE_INTEGER_4DARRAY writes integer 4-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_integer_4Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(4) ! length of array - integer, intent(in) :: buffer(length(1),length(2),& - length(3),length(4)) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_integer_4Darray - -!=============================================================================== -! MPI_READ_INTEGER_4DARRAY reads integer 4-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_integer_4Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(4) ! length of array - integer, intent(inout) :: buffer(length(1),length(2), & - length(3),length(4)) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, product(length), MPI_INTEGER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_integer_4Darray - -!=============================================================================== -! MPI_WRITE_DOUBLE writes integer scalar data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_double(fh, buffer, collect) - - FH_TYPE, intent(in) :: fh ! file handle - real(8), intent(in) :: buffer ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, 1, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, 1, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_double - -!=============================================================================== -! MPI_READ_DOUBLE reads integer scalar data using MPI file I/O -!=============================================================================== - - subroutine mpi_read_double(fh, buffer, collect) - - FH_TYPE, intent(in) :: fh ! file handle - real(8), intent(inout) :: buffer ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, 1, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_double - -!=============================================================================== -! MPI_WRITE_DOUBLE_1DARRAY writes integer 1-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_double_1Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length ! length of array - real(8), intent(in) :: buffer(:) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, length, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, length, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_double_1Darray - -!=============================================================================== -! MPI_READ_DOUBLE_1DARRAY reads integer 1-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_double_1Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length ! length of array - real(8), intent(inout) :: buffer(:) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, length, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, length, MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_double_1Darray - -!=============================================================================== -! MPI_WRITE_DOUBLE_2DARRAY writes integer 2-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_double_2Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(2) ! length of array - real(8), intent(in) :: buffer(length(1),length(2)) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_double_2Darray - -!=============================================================================== -! MPI_READ_DOUBLE_2DARRAY reads integer 2-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_double_2Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(2) ! length of array - real(8), intent(inout) :: buffer(length(1),length(2)) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_double_2Darray - -!=============================================================================== -! MPI_WRITE_DOUBLE_3DARRAY writes integer 3-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_double_3Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(3) ! length of array - real(8), intent(in) :: buffer(length(1),length(2),& - length(3)) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_double_3Darray - -!=============================================================================== -! MPI_READ_DOUBLE_3DARRAY reads integer 3-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_double_3Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(3) ! length of array - real(8), intent(inout) :: buffer(length(1),length(2), & - length(3)) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_double_3Darray - -!=============================================================================== -! MPI_WRITE_DOUBLE_4DARRAY writes integer 4-D array data using MPI File I/O -!=============================================================================== - - subroutine mpi_write_double_4Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(4) ! length of array - real(8), intent(in) :: buffer(length(1),length(2),& - length(3),length(4)) ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_double_4Darray - -!=============================================================================== -! MPI_READ_DOUBLE_4DARRAY reads integer 4-D array using MPI file I/O -!=============================================================================== - - subroutine mpi_read_double_4Darray(fh, buffer, length, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length(4) ! length of array - real(8), intent(inout) :: buffer(length(1),length(2), & - length(3),length(4)) ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, product(length), MPI_REAL8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_double_4Darray - -!=============================================================================== -! MPI_WRITE_LONG writes long integer scalar data using MPI file I/O -!=============================================================================== - - subroutine mpi_write_long(fh, buffer, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer(8), intent(in) :: buffer ! data to write - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, 1, MPI_INTEGER8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, 1, MPI_INTEGER8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_long - -!=============================================================================== -! MPI_READ_LONG reads long integer scalar data using MPI file I/O -!=============================================================================== - - subroutine mpi_read_long(fh, buffer, collect) - - FH_TYPE, intent(in) :: fh ! file handle - integer(8), intent(inout) :: buffer ! read data to here - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, 1, MPI_INTEGER8, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, 1, MPI_INTEGER8, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_long - -!=============================================================================== -! MPI_WRITE_STRING writes string data using MPI file I/O -!=============================================================================== - - subroutine mpi_write_string(fh, buffer, length, collect) - - character(*), intent(in) :: buffer ! data to write - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length ! length of data - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_WRITE_ALL(fh, buffer, length, MPI_CHARACTER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_WRITE(fh, buffer, length, MPI_CHARACTER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_write_string - -!=============================================================================== -! MPI_READ_STRING reads string data using MPI file I/O -!=============================================================================== - - subroutine mpi_read_string(fh, buffer, length, collect) - - character(*), intent(inout) :: buffer ! read data to here - FH_TYPE, intent(in) :: fh ! file handle - integer, intent(in) :: length ! length of string - logical, intent(in) :: collect ! collective I/O - - if (collect) then - call MPI_FILE_READ_ALL(fh, buffer, length, MPI_CHARACTER, & - MPI_STATUS_IGNORE, mpiio_err) - else - call MPI_FILE_READ(fh, buffer, length, MPI_CHARACTER, & - MPI_STATUS_IGNORE, mpiio_err) - end if - - end subroutine mpi_read_string - -#endif -#endif -end module mpiio_interface diff --git a/src/output_interface.F90 b/src/output_interface.F90 index f56a4b3399..7ced3c0528 100644 --- a/src/output_interface.F90 +++ b/src/output_interface.F90 @@ -6,9 +6,6 @@ module output_interface use tally_header, only: TallyResult use hdf5_interface -#ifdef MPI - use mpiio_interface -#endif implicit none private From 3c1ba76f95617b7d2d7ad5ad56ccee246187d7a3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 31 Aug 2015 11:13:21 +0700 Subject: [PATCH 045/519] Rely on FindHDF5 rather than h5fc and h5pfc scripts The FindHDF5.cmake packaged with CMake is broken in a number of respects. The HL components don't work (debian has a patch in cmake-data). It's also impossible to prefer a parallel installation if both h5fc and h5pfc appear on your PATH. Finally, hdf5_hl is not included in the list of libraries needed for the Fortran_HL component. A local version of FindHDF5 is used here which fixes all these issues. This enables one to compile OpenMC with MPI + serial HDF5 if needed by introducing the PHDF5 preprocessor flag. --- CMakeLists.txt | 48 ++++- cmake/Modules/FindHDF5.cmake | 407 +++++++++++++++++++++++++++++++++++ src/hdf5_interface.F90 | 12 +- src/output_interface.F90 | 60 +++--- tests/run_tests.py | 34 ++- 5 files changed, 508 insertions(+), 53 deletions(-) create mode 100644 cmake/Modules/FindHDF5.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d4dfde7fd..623eb0dcbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,9 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include) +# Set module path +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) + # Make sure Fortran module directory is included when building include_directories(${CMAKE_BINARY_DIR}/include) @@ -35,14 +38,12 @@ set(maxcoord 10 CACHE STRING "Maximum number of nested coordinate levels") add_definitions(-DMAX_COORD=${maxcoord}) #=============================================================================== -# MPI for distributed-memory parallelism / HDF5 for binary output +# MPI for distributed-memory parallelism #=============================================================================== set(MPI_ENABLED FALSE) -if($ENV{FC} MATCHES "h5fc$") - message("-- Detected HDF5 wrapper: $ENV{FC}") -elseif($ENV{FC} MATCHES "h5pfc$") - message("-- Detected parallel HDF5 wrapper: $ENV{FC}") +if($ENV{FC} MATCHES "mpi[^/]*$") + message("-- Detected MPI wrapper: $ENV{FC}") add_definitions(-DMPI) set(MPI_ENABLED TRUE) endif() @@ -53,6 +54,33 @@ if(MPI_ENABLED AND mpif08) add_definitions(-DMPIF08) endif() +#=============================================================================== +# HDF5 for binary output +#=============================================================================== + +# Unfortunately FindHDF5.cmake will always prefer a serial HDF5 installation +# over a parallel installation if both appear on the user's PATH. To get around +# this, we check for the environment variable HDF5_ROOT and if it exists, use it +# to check whether its a parallel version. + +if(DEFINED ENV{HDF5_ROOT} AND EXISTS $ENV{HDF5_ROOT}/bin/h5pcc) + set(HDF5_PREFER_PARALLEL TRUE) +else() + set(HDF5_PREFER_PARALLEL FALSE) +endif() + +find_package(HDF5 COMPONENTS Fortran_HL) +if(NOT HDF5_FOUND) + message(FATAL_ERROR "Could not find HDF5") +endif() +if(HDF5_IS_PARALLEL) + if(NOT MPI_ENABLED) + message(FATAL_ERROR "Parallel HDF5 must be used with MPI.") + endif() + add_definitions(-DPHDF5) + message("-- Using parallel HDF5") +endif() + #=============================================================================== # Set compile/link flags based on which compiler is being used #=============================================================================== @@ -212,6 +240,14 @@ set(program "openmc") file(GLOB source src/*.F90 src/xml/openmc_fox.F90) add_executable(${program} ${source}) +# target_include_directories was added in CMake 2.8.11 and is the recommended +# way to set include directories. For lesser versions, we revert to set_property +if(CMAKE_VERSION VERSION_LESS 2.8.11) + include_directories(${HDF5_INCLUDE_DIRS}) +else() + target_include_directories(${program} PUBLIC ${HDF5_INCLUDE_DIRS}) +endif() + # target_compile_options was added in CMake 2.8.12 and is the recommended way to # set compile flags. Note that this sets the COMPILE_OPTIONS property (also # available only in 2.8.12+) rather than the COMPILE_FLAGS property, which is @@ -225,7 +261,7 @@ endif() # target_link_libraries treats any arguments starting with - but not -l as # linker flags. Thus, we can pass both linker flags and libraries together. -target_link_libraries(${program} ${ldflags} ${libraries} fox_dom) +target_link_libraries(${program} ${ldflags} ${HDF5_LIBRARIES} fox_dom) #=============================================================================== # Install executable, scripts, manpage, license diff --git a/cmake/Modules/FindHDF5.cmake b/cmake/Modules/FindHDF5.cmake new file mode 100644 index 0000000000..1631f01932 --- /dev/null +++ b/cmake/Modules/FindHDF5.cmake @@ -0,0 +1,407 @@ +#.rst: +# FindHDF5 +# -------- +# +# Find HDF5, a library for reading and writing self describing array data. +# +# +# +# This module invokes the HDF5 wrapper compiler that should be installed +# alongside HDF5. Depending upon the HDF5 Configuration, the wrapper +# compiler is called either h5cc or h5pcc. If this succeeds, the module +# will then call the compiler with the -show argument to see what flags +# are used when compiling an HDF5 client application. +# +# The module will optionally accept the COMPONENTS argument. If no +# COMPONENTS are specified, then the find module will default to finding +# only the HDF5 C library. If one or more COMPONENTS are specified, the +# module will attempt to find the language bindings for the specified +# components. The only valid components are C, CXX, Fortran, HL, and +# Fortran_HL. If the COMPONENTS argument is not given, the module will +# attempt to find only the C bindings. +# +# On UNIX systems, this module will read the variable +# HDF5_USE_STATIC_LIBRARIES to determine whether or not to prefer a +# static link to a dynamic link for HDF5 and all of it's dependencies. +# To use this feature, make sure that the HDF5_USE_STATIC_LIBRARIES +# variable is set before the call to find_package. +# +# To provide the module with a hint about where to find your HDF5 +# installation, you can set the environment variable HDF5_ROOT. The +# Find module will then look in this path when searching for HDF5 +# executables, paths, and libraries. +# +# In addition to finding the includes and libraries required to compile +# an HDF5 client application, this module also makes an effort to find +# tools that come with the HDF5 distribution that may be useful for +# regression testing. +# +# This module will define the following variables: +# +# :: +# +# HDF5_INCLUDE_DIRS - Location of the hdf5 includes +# HDF5_INCLUDE_DIR - Location of the hdf5 includes (deprecated) +# HDF5_DEFINITIONS - Required compiler definitions for HDF5 +# HDF5_C_LIBRARIES - Required libraries for the HDF5 C bindings. +# HDF5_CXX_LIBRARIES - Required libraries for the HDF5 C++ bindings +# HDF5_Fortran_LIBRARIES - Required libraries for the HDF5 Fortran bindings +# HDF5_HL_LIBRARIES - Required libraries for the HDF5 high level API +# HDF5_Fortran_HL_LIBRARIES - Required libraries for the high level Fortran +# bindings. +# HDF5_LIBRARIES - Required libraries for all requested bindings +# HDF5_FOUND - true if HDF5 was found on the system +# HDF5_VERSION - HDF5 version in format Major.Minor.Release +# HDF5_LIBRARY_DIRS - the full set of library directories +# HDF5_IS_PARALLEL - Whether or not HDF5 was found with parallel IO support +# HDF5_C_COMPILER_EXECUTABLE - the path to the HDF5 C wrapper compiler +# HDF5_CXX_COMPILER_EXECUTABLE - the path to the HDF5 C++ wrapper compiler +# HDF5_Fortran_COMPILER_EXECUTABLE - the path to the HDF5 Fortran wrapper compiler +# HDF5_DIFF_EXECUTABLE - the path to the HDF5 dataset comparison tool + +#============================================================================= +# Copyright 2015 Axel Huebl, Helmholtz-Zentrum Dresden - Rossendorf +# Copyright 2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# This module is maintained by Will Dicharry . + +include(SelectLibraryConfigurations) +include(FindPackageHandleStandardArgs) + +# List of the valid HDF5 components +set( HDF5_VALID_COMPONENTS + C + CXX + Fortran + HL + Fortran_HL +) + +# Validate the list of find components. +if( NOT HDF5_FIND_COMPONENTS ) + set( HDF5_LANGUAGE_BINDINGS "C" ) +else() + # add the extra specified components, ensuring that they are valid. + foreach( component ${HDF5_FIND_COMPONENTS} ) + list( FIND HDF5_VALID_COMPONENTS ${component} component_location ) + if( ${component_location} EQUAL -1 ) + message( FATAL_ERROR + "\"${component}\" is not a valid HDF5 component." ) + else() + list( APPEND HDF5_LANGUAGE_BINDINGS ${component} ) + endif() + endforeach() +endif() + +if(HDF5_PREFER_PARALLEL) + # try to find the HDF5 wrapper compilers + find_program( HDF5_C_COMPILER_EXECUTABLE + NAMES h5pcc h5cc + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." ) + mark_as_advanced( HDF5_C_COMPILER_EXECUTABLE ) + + find_program( HDF5_CXX_COMPILER_EXECUTABLE + NAMES h5pc++ h5c++ + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 C++ Wrapper compiler. Used only to detect HDF5 compile flags." ) + mark_as_advanced( HDF5_CXX_COMPILER_EXECUTABLE ) + + find_program( HDF5_Fortran_COMPILER_EXECUTABLE + NAMES h5pfc h5fc + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 Fortran Wrapper compiler. Used only to detect HDF5 compile flags." ) + mark_as_advanced( HDF5_Fortran_COMPILER_EXECUTABLE ) +else() + # try to find the HDF5 wrapper compilers + find_program( HDF5_C_COMPILER_EXECUTABLE + NAMES h5cc h5pcc + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." ) + mark_as_advanced( HDF5_C_COMPILER_EXECUTABLE ) + + find_program( HDF5_CXX_COMPILER_EXECUTABLE + NAMES h5c++ h5pc++ + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 C++ Wrapper compiler. Used only to detect HDF5 compile flags." ) + mark_as_advanced( HDF5_CXX_COMPILER_EXECUTABLE ) + + find_program( HDF5_Fortran_COMPILER_EXECUTABLE + NAMES h5fc h5pfc + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 Fortran Wrapper compiler. Used only to detect HDF5 compile flags." ) + mark_as_advanced( HDF5_Fortran_COMPILER_EXECUTABLE ) +endif() + +find_program( HDF5_DIFF_EXECUTABLE + NAMES h5diff + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 file differencing tool." ) +mark_as_advanced( HDF5_DIFF_EXECUTABLE ) + +# Invoke the HDF5 wrapper compiler. The compiler return value is stored to the +# return_value argument, the text output is stored to the output variable. +macro( _HDF5_invoke_compiler language output return_value ) + if( HDF5_${language}_COMPILER_EXECUTABLE ) + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -show + OUTPUT_VARIABLE ${output} + RETURN_VALUE ${return_value} + ) + if( ${${return_value}} EQUAL 0 ) + # do nothing + else() + message( STATUS + "Unable to determine HDF5 ${language} flags from HDF5 wrapper." ) + endif() + endif() +endmacro() + +# Parse a compile line for definitions, includes, library paths, and libraries. +macro( _HDF5_parse_compile_line + compile_line_var + include_paths + definitions + library_paths + libraries ) + + # Match the include paths + string( REGEX MATCHALL "-I([^\" ]+)" include_path_flags + "${${compile_line_var}}" + ) + foreach( IPATH ${include_path_flags} ) + string( REGEX REPLACE "^-I" "" IPATH ${IPATH} ) + string( REPLACE "//" "/" IPATH ${IPATH} ) + list( APPEND ${include_paths} ${IPATH} ) + endforeach() + + # Match the definitions + string( REGEX MATCHALL "-D[^ ]*" definition_flags "${${compile_line_var}}" ) + foreach( DEF ${definition_flags} ) + list( APPEND ${definitions} ${DEF} ) + endforeach() + + # Match the library paths + string( REGEX MATCHALL "-L([^\" ]+|\"[^\"]+\")" library_path_flags + "${${compile_line_var}}" + ) + + foreach( LPATH ${library_path_flags} ) + string( REGEX REPLACE "^-L" "" LPATH ${LPATH} ) + string( REPLACE "//" "/" LPATH ${LPATH} ) + list( APPEND ${library_paths} ${LPATH} ) + endforeach() + + # now search for the library names specified in the compile line (match -l...) + # match only -l's preceded by a space or comma + # this is to exclude directory names like xxx-linux/ + string( REGEX MATCHALL "[, ]-l([^\", ]+)" library_name_flags + "${${compile_line_var}}" ) + # strip the -l from all of the library flags and add to the search list + foreach( LIB ${library_name_flags} ) + string( REGEX REPLACE "^[, ]-l" "" LIB ${LIB} ) + list( APPEND ${libraries} ${LIB} ) + endforeach() +endmacro() + +# Try to find HDF5 using an installed hdf5-config.cmake +if( NOT HDF5_FOUND ) + find_package( HDF5 QUIET NO_MODULE ) + if( HDF5_FOUND ) + set( HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR} ) + set( HDF5_LIBRARIES ) + set( HDF5_C_TARGET hdf5 ) + set( HDF5_CXX_TARGET hdf5_cpp ) + set( HDF5_HL_TARGET hdf5_hl ) + set( HDF5_Fortran_TARGET hdf5_fortran ) + set( HDF5_Fortran_HL_TARGET hdf5_hl_fortran ) + foreach( _component ${HDF5_LANGUAGE_BINDINGS} ) + list( FIND HDF5_VALID_COMPONENTS ${_component} _component_location ) + get_target_property( _comp_location ${HDF5_${_component}_TARGET} LOCATION ) + if( _comp_location ) + set( HDF5_${_component}_LIBRARY ${_comp_location} CACHE PATH + "HDF5 ${_component} library" ) + mark_as_advanced( HDF5_${_component}_LIBRARY ) + list( APPEND HDF5_LIBRARIES ${HDF5_${_component}_LIBRARY} ) + endif() + endforeach() + endif() +endif() + +if( NOT HDF5_FOUND ) + _HDF5_invoke_compiler( C HDF5_C_COMPILE_LINE HDF5_C_RETURN_VALUE ) + _HDF5_invoke_compiler( CXX HDF5_CXX_COMPILE_LINE HDF5_CXX_RETURN_VALUE ) + _HDF5_invoke_compiler( Fortran HDF5_Fortran_COMPILE_LINE HDF5_Fortran_RETURN_VALUE ) + set(HDF5_HL_COMPILE_LINE ${HDF5_C_COMPILE_LINE}) + set(HDF5_Fortran_HL_COMPILE_LINE ${HDF5_Fortran_COMPILE_LINE}) + + # seed the initial lists of libraries to find with items we know we need + set( HDF5_C_LIBRARY_NAMES_INIT hdf5 ) + set( HDF5_HL_LIBRARY_NAMES_INIT hdf5_hl ${HDF5_C_LIBRARY_NAMES_INIT} ) + set( HDF5_CXX_LIBRARY_NAMES_INIT hdf5_cpp ${HDF5_C_LIBRARY_NAMES_INIT} ) + set( HDF5_Fortran_LIBRARY_NAMES_INIT hdf5_fortran + ${HDF5_C_LIBRARY_NAMES_INIT} ) + set( HDF5_Fortran_HL_LIBRARY_NAMES_INIT hdf5hl_fortran hdf5_hl + ${HDF5_Fortran_LIBRARY_NAMES_INIT} ) + + foreach( LANGUAGE ${HDF5_LANGUAGE_BINDINGS} ) + if( HDF5_${LANGUAGE}_COMPILE_LINE ) + _HDF5_parse_compile_line( HDF5_${LANGUAGE}_COMPILE_LINE + HDF5_${LANGUAGE}_INCLUDE_FLAGS + HDF5_${LANGUAGE}_DEFINITIONS + HDF5_${LANGUAGE}_LIBRARY_DIRS + HDF5_${LANGUAGE}_LIBRARY_NAMES + ) + + # take a guess that the includes may be in the 'include' sibling + # directory of a library directory. + foreach( dir ${HDF5_${LANGUAGE}_LIBRARY_DIRS} ) + list( APPEND HDF5_${LANGUAGE}_INCLUDE_FLAGS ${dir}/../include ) + endforeach() + endif() + + # set the definitions for the language bindings. + list( APPEND HDF5_DEFINITIONS ${HDF5_${LANGUAGE}_DEFINITIONS} ) + + # find the HDF5 include directories + if(${LANGUAGE} MATCHES "Fortran") + set(HDF5_INCLUDE_FILENAME hdf5.mod) + else() + set(HDF5_INCLUDE_FILENAME hdf5.h) + endif() + + find_path( HDF5_${LANGUAGE}_INCLUDE_DIR ${HDF5_INCLUDE_FILENAME} + HINTS + ${HDF5_${LANGUAGE}_INCLUDE_FLAGS} + ENV + HDF5_ROOT + PATHS + $ENV{HOME}/.local/include + PATH_SUFFIXES + include + Include + ) + mark_as_advanced( HDF5_${LANGUAGE}_INCLUDE_DIR ) + list( APPEND HDF5_INCLUDE_DIRS ${HDF5_${LANGUAGE}_INCLUDE_DIR} ) + + set( HDF5_${LANGUAGE}_LIBRARY_NAMES + ${HDF5_${LANGUAGE}_LIBRARY_NAMES_INIT} + ${HDF5_${LANGUAGE}_LIBRARY_NAMES} ) + + # find the HDF5 libraries + foreach( LIB ${HDF5_${LANGUAGE}_LIBRARY_NAMES} ) + if( UNIX AND HDF5_USE_STATIC_LIBRARIES ) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See http://www.cmake.org/Bug/view.php?id=1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG lib${LIB}d.a ${LIB}d ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a ${LIB} ) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ) + endif() + find_library( HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_${LANGUAGE}_LIBRARY_DIRS} + ENV HDF5_ROOT + PATH_SUFFIXES lib Lib ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_${LANGUAGE}_LIBRARY_DIRS} + ENV HDF5_ROOT + PATH_SUFFIXES lib Lib ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${LANGUAGE}_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + list( APPEND HDF5_LIBRARY_DIRS ${HDF5_${LANGUAGE}_LIBRARY_DIRS} ) + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_LIBRARIES ${HDF5_${LANGUAGE}_LIBRARIES}) + endforeach() + + # We may have picked up some duplicates in various lists during the above + # process for the language bindings (both the C and C++ bindings depend on + # libz for example). Remove the duplicates. It appears that the default + # CMake behavior is to remove duplicates from the end of a list. However, + # for link lines, this is incorrect since unresolved symbols are searched + # for down the link line. Therefore, we reverse the list, remove the + # duplicates, and then reverse it again to get the duplicates removed from + # the beginning. + macro( _remove_duplicates_from_beginning _list_name ) + list( REVERSE ${_list_name} ) + list( REMOVE_DUPLICATES ${_list_name} ) + list( REVERSE ${_list_name} ) + endmacro() + + if( HDF5_INCLUDE_DIRS ) + _remove_duplicates_from_beginning( HDF5_INCLUDE_DIRS ) + endif() + if( HDF5_LIBRARY_DIRS ) + _remove_duplicates_from_beginning( HDF5_LIBRARY_DIRS ) + endif() + if( HDF5_LIBRARIES ) + _remove_duplicates_from_beginning( HDF5_LIBRARIES ) + endif() + + # If the HDF5 include directory was found, open H5pubconf.h to determine if + # HDF5 was compiled with parallel IO support + set( HDF5_IS_PARALLEL FALSE ) + set( HDF5_VERSION "" ) + foreach( _dir IN LISTS HDF5_INCLUDE_DIRS ) + foreach(_hdr "${_dir}/H5pubconf.h" "${_dir}/H5pubconf-64.h" "${_dir}/H5pubconf-32.h") + if( EXISTS "${_hdr}" ) + file( STRINGS "${_hdr}" + HDF5_HAVE_PARALLEL_DEFINE + REGEX "HAVE_PARALLEL 1" ) + if( HDF5_HAVE_PARALLEL_DEFINE ) + set( HDF5_IS_PARALLEL TRUE ) + endif() + unset(HDF5_HAVE_PARALLEL_DEFINE) + + file( STRINGS "${_hdr}" + HDF5_VERSION_DEFINE + REGEX "^[ \t]*#[ \t]*define[ \t]+H5_VERSION[ \t]+" ) + if( "${HDF5_VERSION_DEFINE}" MATCHES + "H5_VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+).*\"" ) + set( HDF5_VERSION "${CMAKE_MATCH_1}" ) + endif() + unset(HDF5_VERSION_DEFINE) + endif() + endforeach() + endforeach() + set( HDF5_IS_PARALLEL ${HDF5_IS_PARALLEL} CACHE BOOL + "HDF5 library compiled with parallel IO support" ) + mark_as_advanced( HDF5_IS_PARALLEL ) + + # For backwards compatibility we set HDF5_INCLUDE_DIR to the value of + # HDF5_INCLUDE_DIRS + if( HDF5_INCLUDE_DIRS ) + set( HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIRS}" ) + endif() + +endif() + +find_package_handle_standard_args( HDF5 + REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS + VERSION_VAR HDF5_VERSION +) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index e7ba39b646..28ac445ab5 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -4,7 +4,7 @@ module hdf5_interface use h5lt use, intrinsic :: ISO_C_BINDING -#ifdef MPI +#ifdef PHDF5 use message_passing, only: MPI_COMM_WORLD, MPI_INFO_NULL #endif @@ -36,7 +36,7 @@ module hdf5_interface module procedure hdf5_write_integer_4Darray module procedure hdf5_write_long module procedure hdf5_write_string -#ifdef MPI +#ifdef PHDF5 module procedure hdf5_write_double_parallel module procedure hdf5_write_double_1Darray_parallel module procedure hdf5_write_double_2Darray_parallel @@ -66,7 +66,7 @@ module hdf5_interface module procedure hdf5_read_integer_4Darray module procedure hdf5_read_long module procedure hdf5_read_string -#ifdef MPI +#ifdef PHDF5 module procedure hdf5_read_double_parallel module procedure hdf5_read_double_1Darray_parallel module procedure hdf5_read_double_2Darray_parallel @@ -134,7 +134,7 @@ contains end subroutine hdf5_file_close -#ifdef MPI +#ifdef PHDF5 !=============================================================================== ! HDF5_FILE_CREATE_PARALLEL creates HDF5 file with parallel I/O @@ -809,7 +809,7 @@ contains end subroutine hdf5_write_attribute_string -# ifdef MPI +#ifdef PHDF5 !=============================================================================== ! HDF5_WRITE_INTEGER_PARALLEL writes integer scalar data in parallel @@ -1807,6 +1807,6 @@ contains end subroutine hdf5_read_string_parallel -# endif +#endif end module hdf5_interface diff --git a/src/output_interface.F90 b/src/output_interface.F90 index 7ced3c0528..1e08ce4911 100644 --- a/src/output_interface.F90 +++ b/src/output_interface.F90 @@ -96,7 +96,7 @@ contains self % serial = .true. end if -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_file_create(filename, self % hdf5_fh) else @@ -126,7 +126,7 @@ contains self % serial = .true. end if -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_file_open(filename, self % hdf5_fh, mode) else @@ -212,7 +212,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_double(self % hdf5_grp, name_, buffer) else @@ -263,7 +263,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_double(self % hdf5_grp, name_, buffer) else @@ -315,7 +315,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) else @@ -368,7 +368,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) else @@ -421,7 +421,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) else @@ -474,7 +474,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) else @@ -527,7 +527,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) else @@ -580,7 +580,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) else @@ -634,7 +634,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) else @@ -689,7 +689,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) else @@ -741,7 +741,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_integer(self % hdf5_grp, name_, buffer) else @@ -792,7 +792,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_integer(self % hdf5_grp, name_, buffer) else @@ -844,7 +844,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) else @@ -897,7 +897,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) else @@ -951,7 +951,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) else @@ -1004,7 +1004,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) else @@ -1057,7 +1057,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) else @@ -1110,7 +1110,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) else @@ -1164,7 +1164,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) else @@ -1218,7 +1218,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) else @@ -1270,7 +1270,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) else @@ -1322,7 +1322,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) else @@ -1378,7 +1378,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_write_string(self % hdf5_grp, name_, buffer, n) else @@ -1434,7 +1434,7 @@ contains else self % hdf5_grp = self % hdf5_fh endif -#ifdef MPI +#ifdef PHDF5 if (self % serial) then call hdf5_read_string(self % hdf5_grp, name_, buffer, n) else @@ -1579,11 +1579,11 @@ contains class(BinaryOutput) :: self -#ifdef MPI +#ifdef PHDF5 integer(8) :: offset(1) ! source data offset #endif -#ifdef MPI +#ifdef PHDF5 ! Set size of total dataspace for all procs and rank dims1(1) = n_particles @@ -1662,11 +1662,11 @@ contains class(BinaryOutput) :: self -#ifdef MPI +#ifdef PHDF5 integer(8) :: offset(1) ! offset of data #endif -#ifdef MPI +#ifdef PHDF5 ! Set size of total dataspace for all procs and rank dims1(1) = n_particles diff --git a/tests/run_tests.py b/tests/run_tests.py index aa2eb14cfd..d3b79aa3b1 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -107,12 +107,13 @@ tests = OrderedDict() class Test(object): def __init__(self, name, debug=False, optimize=False, mpi=False, openmp=False, - valgrind=False, coverage=False): + phdf5=False, valgrind=False, coverage=False): self.name = name self.debug = debug self.optimize = optimize self.mpi = mpi self.openmp = openmp + self.phdf5 = phdf5 self.valgrind = valgrind self.coverage = coverage self.success = True @@ -125,9 +126,9 @@ class Test(object): # Check for MPI if self.mpi: - self.fc = PHDF5_DIR + '/bin/h5pfc' + self.fc = os.path.join(MPI_DIR, 'bin', 'mpifort') else: - self.fc = HDF5_DIR + '/bin/h5fc' + self.fc = FC # Sets the build name that will show up on the CDash def get_build_name(self): @@ -159,6 +160,10 @@ class Test(object): os.environ['FC'] = self.fc if self.mpi: os.environ['MPI_DIR'] = MPI_DIR + if self.phdf5: + os.environ['HDF5_ROOT'] = PHDF5_DIR + else: + os.environ['HDF5_ROOT'] = HDF5_DIR rc = call(['ctest', '-S', 'ctestscript.run','-V']) if rc != 0: self.success = False @@ -169,6 +174,10 @@ class Test(object): os.environ['FC'] = self.fc if self.mpi: os.environ['MPI_DIR'] = MPI_DIR + if self.phdf5: + os.environ['HDF5_ROOT'] = PHDF5_DIR + else: + os.environ['HDF5_ROOT'] = HDF5_DIR build_opts = self.build_opts.split() self.cmake += build_opts rc = call(self.cmake) @@ -258,8 +267,8 @@ class Test(object): # Simple function to add a test to the global tests dictionary def add_test(name, debug=False, optimize=False, mpi=False, openmp=False,\ - valgrind=False, coverage=False): - tests.update({name: Test(name, debug, optimize, mpi, openmp, + phdf5=False, valgrind=False, coverage=False): + tests.update({name: Test(name, debug, optimize, mpi, openmp, phdf5, valgrind, coverage)}) # List of all tests that may be run. User can add -C to command line to specify @@ -270,12 +279,15 @@ add_test('hdf5-optimize', optimize=True) add_test('omp-hdf5-normal', openmp=True) add_test('omp-hdf5-debug', openmp=True, debug=True) add_test('omp-hdf5-optimize', openmp=True, optimize=True) -add_test('phdf5-normal', mpi=True) -add_test('phdf5-debug', mpi=True, debug=True) -add_test('phdf5-optimize', mpi=True, optimize=True) -add_test('phdf5-omp-normal', mpi=True, openmp=True) -add_test('phdf5-omp-debug', mpi=True, openmp=True, debug=True) -add_test('phdf5-omp-optimize', mpi=True, openmp=True, optimize=True) +add_test('mpi-hdf5-normal', mpi=True) +add_test('mpi-hdf5-debug', mpi=True, debug=True) +add_test('mpi-hdf5-optimize', mpi=True, optimize=True) +add_test('phdf5-normal', mpi=True, phdf5=True) +add_test('phdf5-debug', mpi=True, phdf5=True, debug=True) +add_test('phdf5-optimize', mpi=True, phdf5=True, optimize=True) +add_test('phdf5-omp-normal', mpi=True, phdf5=True, openmp=True) +add_test('phdf5-omp-debug', mpi=True, phdf5=True, openmp=True, debug=True) +add_test('phdf5-omp-optimize', mpi=True, phdf5=True, openmp=True, optimize=True) add_test('hdf5-debug_valgrind', debug=True, valgrind=True) add_test('hdf5-debug_coverage', debug=True, coverage=True) From 3fb6f99ecdca38fb4050179f3f10b03ed26fac35 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Sep 2015 09:54:49 +0700 Subject: [PATCH 046/519] Update FindHDF5 based on Brad King comments --- cmake/Modules/FindHDF5.cmake | 74 ++++++++++++++---------------------- 1 file changed, 29 insertions(+), 45 deletions(-) diff --git a/cmake/Modules/FindHDF5.cmake b/cmake/Modules/FindHDF5.cmake index 1631f01932..08ba0abafd 100644 --- a/cmake/Modules/FindHDF5.cmake +++ b/cmake/Modules/FindHDF5.cmake @@ -103,52 +103,39 @@ else() endforeach() endif() +# Determine whether to search for serial or parallel executable first if(HDF5_PREFER_PARALLEL) - # try to find the HDF5 wrapper compilers - find_program( HDF5_C_COMPILER_EXECUTABLE - NAMES h5pcc h5cc - HINTS ENV HDF5_ROOT - PATH_SUFFIXES bin Bin - DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." ) - mark_as_advanced( HDF5_C_COMPILER_EXECUTABLE ) - - find_program( HDF5_CXX_COMPILER_EXECUTABLE - NAMES h5pc++ h5c++ - HINTS ENV HDF5_ROOT - PATH_SUFFIXES bin Bin - DOC "HDF5 C++ Wrapper compiler. Used only to detect HDF5 compile flags." ) - mark_as_advanced( HDF5_CXX_COMPILER_EXECUTABLE ) - - find_program( HDF5_Fortran_COMPILER_EXECUTABLE - NAMES h5pfc h5fc - HINTS ENV HDF5_ROOT - PATH_SUFFIXES bin Bin - DOC "HDF5 Fortran Wrapper compiler. Used only to detect HDF5 compile flags." ) - mark_as_advanced( HDF5_Fortran_COMPILER_EXECUTABLE ) + set(HDF5_C_COMPILER_NAMES h5pcc h5cc) + set(HDF5_CXX_COMPILER_NAMES h5pc++ h5c++) + set(HDF5_Fortran_COMPILER_NAMES h5pfc h5fc) else() - # try to find the HDF5 wrapper compilers - find_program( HDF5_C_COMPILER_EXECUTABLE - NAMES h5cc h5pcc - HINTS ENV HDF5_ROOT - PATH_SUFFIXES bin Bin - DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." ) - mark_as_advanced( HDF5_C_COMPILER_EXECUTABLE ) - - find_program( HDF5_CXX_COMPILER_EXECUTABLE - NAMES h5c++ h5pc++ - HINTS ENV HDF5_ROOT - PATH_SUFFIXES bin Bin - DOC "HDF5 C++ Wrapper compiler. Used only to detect HDF5 compile flags." ) - mark_as_advanced( HDF5_CXX_COMPILER_EXECUTABLE ) - - find_program( HDF5_Fortran_COMPILER_EXECUTABLE - NAMES h5fc h5pfc - HINTS ENV HDF5_ROOT - PATH_SUFFIXES bin Bin - DOC "HDF5 Fortran Wrapper compiler. Used only to detect HDF5 compile flags." ) - mark_as_advanced( HDF5_Fortran_COMPILER_EXECUTABLE ) + set(HDF5_C_COMPILER_NAMES h5cc h5pcc) + set(HDF5_CXX_COMPILER_NAMES h5c++ h5pc++) + set(HDF5_Fortran_COMPILER_NAMES h5fc h5pfc) endif() +# try to find the HDF5 wrapper compilers +find_program( HDF5_C_COMPILER_EXECUTABLE + NAMES ${HDF5_C_COMPILER_NAMES} + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 Wrapper compiler. Used only to detect HDF5 compile flags." ) +mark_as_advanced( HDF5_C_COMPILER_EXECUTABLE ) + +find_program( HDF5_CXX_COMPILER_EXECUTABLE + NAMES ${HDF5_CXX_COMPILER_NAMES} + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 C++ Wrapper compiler. Used only to detect HDF5 compile flags." ) +mark_as_advanced( HDF5_CXX_COMPILER_EXECUTABLE ) + +find_program( HDF5_Fortran_COMPILER_EXECUTABLE + NAMES ${HDF5_Fortran_COMPILER_NAMES} + HINTS ENV HDF5_ROOT + PATH_SUFFIXES bin Bin + DOC "HDF5 Fortran Wrapper compiler. Used only to detect HDF5 compile flags." ) +mark_as_advanced( HDF5_Fortran_COMPILER_EXECUTABLE ) + find_program( HDF5_DIFF_EXECUTABLE NAMES h5diff HINTS ENV HDF5_ROOT @@ -359,9 +346,6 @@ if( NOT HDF5_FOUND ) if( HDF5_LIBRARY_DIRS ) _remove_duplicates_from_beginning( HDF5_LIBRARY_DIRS ) endif() - if( HDF5_LIBRARIES ) - _remove_duplicates_from_beginning( HDF5_LIBRARIES ) - endif() # If the HDF5 include directory was found, open H5pubconf.h to determine if # HDF5 was compiled with parallel IO support From 779a401448b5d014535f6924861b04f5162ed62a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Sep 2015 16:47:08 +0700 Subject: [PATCH 047/519] Have write_integer, write_double, and write_long use scalar values --- openmc/particle_restart.py | 39 +++----- openmc/statepoint.py | 182 +++++++++++++----------------------- scripts/openmc-track-to-vtk | 2 +- src/hdf5_interface.F90 | 85 ++++++----------- 4 files changed, 108 insertions(+), 200 deletions(-) diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index 5ae534dbd9..846c7d566d 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -48,38 +48,23 @@ class Particle(object): def _read_data(self): # Read filetype - self.filetype = self._get_int(path='filetype')[0] + self.filetype = self._f['filetype'].value # Read statepoint revision - self.revision = self._get_int(path='revision')[0] + self.revision = self._f['revision'].value # Read current batch - self.current_batch = self._get_int(path='current_batch')[0] + self.current_batch = self._f['current_batch'].value # Read run information - self.gen_per_batch = self._get_int(path='gen_per_batch')[0] - self.current_gen = self._get_int(path='current_gen')[0] - self.n_particles = self._get_long(path='n_particles')[0] - self.run_mode = self._get_int(path='run_mode')[0] + self.gen_per_batch = self._f['gen_per_batch'].value + self.current_gen = self._f['current_gen'].value + self.n_particles = self._f['n_particles'].value + self.run_mode = self._f['run_mode'].value # Read particle properties - self.id = self._get_long(path='id')[0] - self.weight = self._get_double(path='weight')[0] - self.energy = self._get_double(path='energy')[0] - self.xyz = self._get_double(3, path='xyz') - self.uvw = self._get_double(3, path='uvw') - - def _get_int(self, n=1, path=None): - return [int(v) for v in self._f[path].value] - - def _get_long(self, n=1, path=None): - return [int(v) for v in self._f[path].value] - - def _get_float(self, n=1, path=None): - return [float(v) for v in self._f[path].value] - - def _get_double(self, n=1, path=None): - return [float(v) for v in self._f[path].value] - - def _get_string(self, n=1, path=None): - return str(self._f[path].value) + self.id = self._f['id'].value + self.weight = self._f['weight'].value + self.energy = self._f['energy'].value + self.xyz = self._f['xyz'].value + self.uvw = self._f['uvw'].value diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 673b41e178..af423b0277 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -1,5 +1,4 @@ import copy -import struct import sys import numpy as np @@ -158,37 +157,37 @@ class StatePoint(object): def _read_metadata(self): # Read filetype - self._filetype = self._get_int(path='filetype')[0] + self._filetype = self._f['filetype'].value # Read statepoint revision - self._revision = self._get_int(path='revision')[0] + self._revision = self._f['revision'].value if self._revision != 13: raise Exception('Statepoint Revision is not consistent.') # Read OpenMC version - self._version = [self._get_int(path='version_major')[0], - self._get_int(path='version_minor')[0], - self._get_int(path='version_release')[0]] + self._version = [self._f['version_major'].value, + self._f['version_minor'].value, + self._f['version_release'].value] # Read date and time - self._date_and_time = self._get_string(19, path='date_and_time') + self._date_and_time = self._f['date_and_time'].value[0] # Read path - self._path = self._get_string(255, path='path').strip() + self._path = self._f['path'].value[0].strip() # Read random number seed - self._seed = self._get_long(path='seed')[0] + self._seed = self._f['seed'].value # Read run information - self._run_mode = self._get_int(path='run_mode')[0] - self._n_particles = self._get_long(path='n_particles')[0] - self._n_batches = self._get_int(path='n_batches')[0] + self._run_mode = self._f['run_mode'].value + self._n_particles = self._f['n_particles'].value + self._n_batches = self._f['n_batches'].value # Read current batch - self._current_batch = self._get_int(path='current_batch')[0] + self._current_batch = self._f['current_batch'].value # Read whether or not the source site distribution is present - self._source_present = self._get_int(path='source_present')[0] + self._source_present = self._f['source_present'].value # Read criticality information if self._run_mode == 2: @@ -198,18 +197,15 @@ class StatePoint(object): # Read criticality information if self._run_mode == 2: - self._n_inactive = self._get_int(path='n_inactive')[0] - self._gen_per_batch = self._get_int(path='gen_per_batch')[0] - self._k_batch = self._get_double( - self._current_batch*self._gen_per_batch, - path='k_generation') - self._entropy = self._get_double( - self._current_batch*self._gen_per_batch, path='entropy') + self._n_inactive = self._f['n_inactive'].value + self._gen_per_batch = self._f['gen_per_batch'].value + self._k_batch = self._f['k_generation'].value + self._entropy = self._f['entropy'].value - self._k_col_abs = self._get_double(path='k_col_abs')[0] - self._k_col_tra = self._get_double(path='k_col_tra')[0] - self._k_abs_tra = self._get_double(path='k_abs_tra')[0] - self._k_combined = self._get_double(2, path='k_combined') + self._k_col_abs = self._f['k_col_abs'].value + self._k_col_tra = self._f['k_col_tra'].value + self._k_abs_tra = self._f['k_abs_tra'].value + self._k_combined = self._f['k_combined'].value # Read CMFD information (if used) self._read_cmfd() @@ -218,25 +214,18 @@ class StatePoint(object): base = 'cmfd' # Read CMFD information - self._cmfd_on = self._get_int(path='cmfd_on')[0] + self._cmfd_on = self._f['cmfd_on'].value if self._cmfd_on == 1: - - self._cmfd_indices = self._get_int(4, path='{0}/indices'.format(base)) - self._k_cmfd = self._get_double(self._current_batch, - path='{0}/k_cmfd'.format(base)) - self._cmfd_src = self._get_double_array(np.product(self._cmfd_indices), - path='{0}/cmfd_src'.format(base)) + self._cmfd_indices = self._f['{0}/indices'.format(base)].value + self._k_cmfd = self._f['{0}/k_cmfd'.format(base)].value + self._cmfd_src = self._f['{0}/cmfd_src'.format(base)].value self._cmfd_src = np.reshape(self._cmfd_src, tuple(self._cmfd_indices), order='F') - self._cmfd_entropy = self._get_double(self._current_batch, - path='{0}/cmfd_entropy'.format(base)) - self._cmfd_balance = self._get_double(self._current_batch, - path='{0}/cmfd_balance'.format(base)) - self._cmfd_dominance = self._get_double(self._current_batch, - path='{0}/cmfd_dominance'.format(base)) - self._cmfd_srccmp = self._get_double(self._current_batch, - path='{0}/cmfd_srccmp'.format(base)) + self._cmfd_entropy = self._f['{0}/cmfd_entropy'.format(base)].value + self._cmfd_balance = self._f['{0}/cmfd_balance'.format(base)].value + self._cmfd_dominance = self._f['{0}/cmfd_dominance'.format(base)].value + self._cmfd_srccmp = self._f['{0}/cmfd_srccmp'.format(base)].value def _read_meshes(self): # Initialize dictionaries for the Meshes @@ -245,18 +234,16 @@ class StatePoint(object): self._meshes = {} # Read the number of Meshes - self._n_meshes = self._get_int(path='tallies/meshes/n_meshes')[0] + self._n_meshes = self._f['tallies/meshes/n_meshes'].value # Read a list of the IDs for each Mesh if self._n_meshes > 0: # OpenMC Mesh IDs (redefined internally from user definitions) - self._mesh_ids = self._get_int(self._n_meshes, - path='tallies/meshes/ids') + self._mesh_ids = self._f['tallies/meshes/ids'].value # User-defined Mesh IDs - self._mesh_keys = self._get_int(self._n_meshes, - path='tallies/meshes/keys') + self._mesh_keys = self._f['tallies/meshes/keys'].value else: self._mesh_keys = [] @@ -269,23 +256,18 @@ class StatePoint(object): for mesh_key in self._mesh_keys: # Read the user-specified Mesh ID and type - mesh_id = self._get_int(path='{0}{1}/id'.format(base, mesh_key))[0] - mesh_type = self._get_int(path='{0}{1}/type'.format(base, mesh_key))[0] + mesh_id = self._f['{0}{1}/id'.format(base, mesh_key)].value + mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value # Get the Mesh dimension - n_dimension = self._get_int( - path='{0}{1}/n_dimension'.format(base, mesh_key))[0] + n_dimension = self._f['{0}{1}/n_dimension'.format(base, mesh_key)].value # Read the mesh dimensions, lower-left coordinates, # upper-right coordinates, and width of each mesh cell - dimension = self._get_int( - n_dimension, path='{0}{1}/dimension'.format(base, mesh_key)) - lower_left = self._get_double( - n_dimension, path='{0}{1}/lower_left'.format(base, mesh_key)) - upper_right = self._get_double( - n_dimension, path='{0}{1}/upper_right'.format(base, mesh_key)) - width = self._get_double( - n_dimension, path='{0}{1}/width'.format(base, mesh_key)) + dimension = self._f['{0}{1}/dimension'.format(base, mesh_key)].value + lower_left = self._f['{0}{1}/lower_left'.format(base, mesh_key)].value + upper_right = self._f['{0}{1}/upper_right'.format(base, mesh_key)].value + width = self._f['{0}{1}/width'.format(base, mesh_key)].value # Create the Mesh and assign properties to it mesh = openmc.Mesh(mesh_id) @@ -308,18 +290,16 @@ class StatePoint(object): self._tallies = {} # Read the number of tallies - self._n_tallies = self._get_int(path='/tallies/n_tallies')[0] + self._n_tallies = self._f['/tallies/n_tallies'].value # Read a list of the IDs for each Tally if self._n_tallies > 0: # OpenMC Tally IDs (redefined internally from user definitions) - self._tally_ids = self._get_int( - self._n_tallies, path='tallies/ids') + self._tally_ids = self._f['tallies/ids'].value # User-defined Tally IDs - self._tally_keys = self._get_int( - self._n_tallies, path='tallies/keys') + self._tally_keys = self._f['tallies/keys'].value else: self._tally_keys = [] @@ -331,12 +311,10 @@ class StatePoint(object): for tally_key in self._tally_keys: # Read integer Tally estimator type code (analog or tracklength) - estimator_type = self._get_int( - path='{0}{1}/estimator'.format(base, tally_key))[0] + estimator_type = self._f['{0}{1}/estimator'.format(base, tally_key)].value # Read the Tally size specifications - n_realizations = self._get_int( - path='{0}{1}/n_realizations'.format(base, tally_key))[0] + n_realizations = self._f['{0}{1}/n_realizations'.format(base, tally_key)].value # Create Tally object and assign basic properties tally = openmc.Tally(tally_key) @@ -344,8 +322,7 @@ class StatePoint(object): tally.num_realizations = n_realizations # Read the number of Filters - n_filters = self._get_int( - path='{0}{1}/n_filters'.format(base, tally_key))[0] + n_filters = self._f['{0}{1}/n_filters'.format(base, tally_key)].value subbase = '{0}{1}/filter '.format(base, tally_key) @@ -353,15 +330,12 @@ class StatePoint(object): for j in range(1, n_filters+1): # Read the integer Filter type code - filter_type = self._get_int( - path='{0}{1}/type'.format(subbase, j))[0] + filter_type = self._f['{0}{1}/type'.format(subbase, j)].value # Read the Filter offset - offset = self._get_int( - path='{0}{1}/offset'.format(subbase, j))[0] + offset = self._f['{0}{1}/offset'.format(subbase, j)].value - n_bins = self._get_int( - path='{0}{1}/n_bins'.format(subbase, j))[0] + n_bins = self._f['{0}{1}/n_bins'.format(subbase, j)].value if n_bins <= 0: msg = 'Unable to create Filter "{0}" for Tally ID="{1}" ' \ @@ -370,16 +344,13 @@ class StatePoint(object): # Read the bin values if FILTER_TYPES[filter_type] in ['energy', 'energyout']: - bins = self._get_double( - n_bins+1, path='{0}{1}/bins'.format(subbase, j)) + bins = self._f['{0}{1}/bins'.format(subbase, j)].value elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: - bins = self._get_int( - path='{0}{1}/bins'.format(subbase, j))[0] + bins = self._f['{0}{1}/bins'.format(subbase, j)].value else: - bins = self._get_int( - n_bins, path='{0}{1}/bins'.format(subbase, j)) + bins = self._f['{0}{1}/bins'.format(subbase, j)].value # Create Filter object filter = openmc.Filter(FILTER_TYPES[filter_type], bins) @@ -387,33 +358,30 @@ class StatePoint(object): filter.num_bins = n_bins if FILTER_TYPES[filter_type] == 'mesh': - key = self._mesh_keys[self._mesh_ids.index(bins)] + key = self._mesh_keys[list(self._mesh_ids).index(bins)] filter.mesh = self._meshes[key] # Add Filter to the Tally tally.add_filter(filter) # Read Nuclide bins - n_nuclides = self._get_int( - path='{0}{1}/n_nuclides'.format(base, tally_key))[0] + n_nuclides = self._f['{0}{1}/n_nuclides'.format(base, tally_key)].value - nuclide_zaids = self._get_int( - n_nuclides, path='{0}{1}/nuclides'.format(base, tally_key)) + nuclide_zaids = self._f['{0}{1}/nuclides'.format(base, tally_key)].value # Add all Nuclides to the Tally for nuclide_zaid in nuclide_zaids: tally.add_nuclide(nuclide_zaid) # Read score bins - n_score_bins = self._get_int( - path='{0}{1}/n_score_bins'.format(base, tally_key))[0] + n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value tally.num_score_bins = n_score_bins - scores = [SCORE_TYPES[j] for j in self._get_int( - n_score_bins, path='{0}{1}/score_bins'.format(base, tally_key))] - n_user_scores = self._get_int( - path='{0}{1}/n_user_score_bins'.format(base, tally_key))[0] + scores = [SCORE_TYPES[j] for j in self._f[ + '{0}{1}/score_bins'.format(base, tally_key)].value] + n_user_scores = self._f['{0}{1}/n_user_score_bins' + .format(base, tally_key)].value # Compute and set the filter strides for i in range(n_filters): @@ -429,8 +397,8 @@ class StatePoint(object): # Extract the moment order string for each score for k in range(len(scores)): - moment = self._get_string(8, - path='{0}order{1}'.format(subbase, k+1)) + moment = str(self._f['{0}order{1}'.format( + subbase, k+1)].value[0]) moment = moment.lstrip('[\'') moment = moment.rstrip('\']') @@ -460,16 +428,16 @@ class StatePoint(object): """ # Number of realizations for global Tallies - self._n_realizations = self._get_int(path='n_realizations')[0] + self._n_realizations = self._f['n_realizations'].value # Read global Tallies - n_global_tallies = self._get_int(path='n_global_tallies')[0] + n_global_tallies = self._f['n_global_tallies'].value data = self._f['global_tallies'].value self._global_tallies = np.column_stack((data['sum'], data['sum_sq'])) # Flag indicating if Tallies are present - self._tallies_present = self._get_int(path='tallies/tallies_present')[0] + self._tallies_present = self._f['tallies/tallies_present'].value base = 'tallies/tally ' @@ -766,25 +734,3 @@ class StatePoint(object): filter.bins = material_ids self._with_summary = True - - def _get_data(self, n, typeCode, size): - return list(struct.unpack('={0}{1}'.format(n, typeCode), - self._f.read(n*size))) - - def _get_int(self, n=1, path=None): - return [int(v) for v in self._f[path].value] - - def _get_long(self, n=1, path=None): - return [long(v) for v in self._f[path].value] - - def _get_float(self, n=1, path=None): - return [float(v) for v in self._f[path].value] - - def _get_double(self, n=1, path=None): - return [float(v) for v in self._f[path].value] - - def _get_double_array(self, n=1, path=None): - return self._f[path].value - - def _get_string(self, n=1, path=None): - return str(self._f[path].value) diff --git a/scripts/openmc-track-to-vtk b/scripts/openmc-track-to-vtk index f44b3871ac..434cd3bb09 100755 --- a/scripts/openmc-track-to-vtk +++ b/scripts/openmc-track-to-vtk @@ -82,7 +82,7 @@ def main(): else: track = h5py.File(fname) - n_particles = track['n_particles'].value[0] + n_particles = track['n_particles'].value n_coords = track['n_coords'] coords = [] for i in range(n_particles): diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 28ac445ab5..b22d0414f1 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -246,14 +246,17 @@ contains integer(HID_T), intent(in) :: group ! name of group character(*), intent(in) :: name ! name of data - integer, intent(in) :: buffer ! data to write + integer, target, intent(in) :: buffer ! data to write - ! Set rank and dimensions - hdf5_rank = 1 - dims1(1) = 1 + ! Create space, dataset, and write + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) + call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) - call h5ltmake_dataset_int_f(group, name, hdf5_rank, dims1, & - (/ buffer /), hdf5_err) + ! Close all + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) end subroutine hdf5_write_integer @@ -265,16 +268,12 @@ contains integer(HID_T), intent(in) :: group ! name of group character(*), intent(in) :: name ! name of data - integer, intent(inout) :: buffer ! read data to here + integer, target, intent(inout) :: buffer ! read data to here - integer :: buffer_copy(1) ! need an array for read - - ! Set up dimensions - dims1(1) = 1 - - ! Read data - call h5ltread_dataset_int_f(group, name, buffer_copy, dims1, hdf5_err) - buffer = buffer_copy(1) + call h5dopen_f(group, name, dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + call h5dclose_f(dset, hdf5_err) end subroutine hdf5_read_integer @@ -450,14 +449,17 @@ contains integer(HID_T), intent(in) :: group ! name of group character(*), intent(in) :: name ! name of data - real(8), intent(in) :: buffer ! data to write + real(8), target, intent(in) :: buffer ! data to write - ! Set rank and dimensions - hdf5_rank = 1 - dims1(1) = 1 + ! Create space, dataset, and write + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) + call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) - call h5ltmake_dataset_double_f(group, name, hdf5_rank, dims1, & - (/ buffer /), hdf5_err) + ! Close all + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) end subroutine hdf5_write_double @@ -469,16 +471,12 @@ contains integer(HID_T), intent(in) :: group ! name of group character(*), intent(in) :: name ! name of data - real(8), intent(inout) :: buffer ! read data to here + real(8), target, intent(inout) :: buffer ! read data to here - real(8) :: buffer_copy(1) ! need an array for read - - ! Set up dimensions - dims1(1) = 1 - - ! Read data - call h5ltread_dataset_double_f(group, name, buffer_copy, dims1, hdf5_err) - buffer = buffer_copy(1) + call h5dopen_f(group, name, dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + call h5dclose_f(dset, hdf5_err) end subroutine hdf5_read_double @@ -657,15 +655,9 @@ contains integer(8), target, intent(in) :: buffer ! data to write integer(HID_T), intent(in) :: long_type ! HDF5 long type - ! Set up rank and dimensions - hdf5_rank = 1 - dims1(1) = 1 - ! Create dataspace and dataset - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) call h5dcreate_f(group, name, long_type, dspace, dset, hdf5_err) - - ! Write eight-byte integer f_ptr = c_loc(buffer) call h5dwrite_f(dset, long_type, f_ptr, hdf5_err) @@ -686,16 +678,9 @@ contains integer(8), target, intent(out) :: buffer ! read data to here integer(HID_T), intent(in) :: long_type ! long integer type - ! Open dataset call h5dopen_f(group, name, dset, hdf5_err) - - ! Get pointer to buffer f_ptr = c_loc(buffer) - - ! Read data from dataset call h5dread_f(dset, long_type, f_ptr, hdf5_err) - - ! Close dataset call h5dclose_f(dset, hdf5_err) end subroutine hdf5_read_long @@ -822,10 +807,6 @@ contains integer,target, intent(in) :: buffer ! data to write logical, intent(in) :: collect ! collect I/O - ! Set rank and dimensions - hdf5_rank = 1 - dims1(1) = 1 - ! Create property list for independent or collective read call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) @@ -837,7 +818,7 @@ contains end if ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) ! Create dataset call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) @@ -1222,10 +1203,6 @@ contains real(8),target, intent(in) :: buffer ! data to write logical, intent(in) :: collect ! collect I/O - ! Set rank and dimensions - hdf5_rank = 1 - dims1(1) = 1 - ! Create property list for independent or collective read call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) @@ -1237,7 +1214,7 @@ contains end if ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) ! Create dataset call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) From dce020b59e59da41b34ebc901631455a66f4207e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Sep 2015 16:51:11 +0700 Subject: [PATCH 048/519] Remove logic for binary file in openmc-track-to-vtk --- scripts/openmc-track-to-vtk | 46 +++++++++---------------------------- 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/scripts/openmc-track-to-vtk b/scripts/openmc-track-to-vtk index 434cd3bb09..c900c4aa50 100755 --- a/scripts/openmc-track-to-vtk +++ b/scripts/openmc-track-to-vtk @@ -18,6 +18,7 @@ Usage information can be obtained by running 'track.py --help': import os import argparse +import h5py import struct import vtk @@ -41,9 +42,8 @@ def main(): # Check input file extensions. for fname in args.input: - if not (fname.endswith('.h5') or fname.endswith('.binary')): - raise ValueError("Input file names must either end with '.h5' or" - "'.binary'.") + if not fname.endswith('.h5'): + raise ValueError("Input file names must an HDF5 file.") # Make sure that the output filename ends with '.pvtp'. if not args.out: @@ -51,44 +51,20 @@ def main(): elif not args.out.endswith('.pvtp'): args.out += '.pvtp' - # Import HDF library if HDF files are present - for fname in args.input: - if fname.endswith('.h5'): - import h5py - break - # Initialize data arrays and offset. points = vtk.vtkPoints() cells = vtk.vtkCellArray() point_offset = 0 for fname in args.input: # Write coordinate values to points array. - if fname.endswith('.binary'): - track = open(fname, 'rb') - - # Determine number of particles and tracks/particle - n_particles = struct.unpack('i', track.read(4))[0] - n_coords = struct.unpack('i'*n_particles, track.read(4*n_particles)) - - coords = [] - for i in range(n_particles): - # Read coordinates for each particle - coords.append([struct.unpack('ddd', track.read(24)) - for j in range(n_coords[i])]) - - # Add coordinates to points data - for triplet in coords[i]: - points.InsertNextPoint(triplet) - - else: - track = h5py.File(fname) - n_particles = track['n_particles'].value - n_coords = track['n_coords'] - coords = [] - for i in range(n_particles): - coords.append(track['coordinates_' + str(i + 1)].value) - for j in range(n_coords[i]): - points.InsertNextPoint(coords[i][j,:]) + track = h5py.File(fname) + n_particles = track['n_particles'].value + n_coords = track['n_coords'] + coords = [] + for i in range(n_particles): + coords.append(track['coordinates_' + str(i + 1)].value) + for j in range(n_coords[i]): + points.InsertNextPoint(coords[i][j,:]) for i in range(n_particles): # Create VTK line and assign points to line. From 205be92897f435a88679c3b6c703cf078a8c0f74 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 2 Sep 2015 09:43:13 +0700 Subject: [PATCH 049/519] Complete rewrite of hdf5_interface with a flat API --- src/bank_header.F90 | 17 +- src/global.F90 | 9 - src/hdf5_interface.F90 | 3389 ++++++++++++++++++++-------------------- src/tally_header.F90 | 9 +- 4 files changed, 1743 insertions(+), 1681 deletions(-) diff --git a/src/bank_header.F90 b/src/bank_header.F90 index 1a91f86f7a..499358120d 100644 --- a/src/bank_header.F90 +++ b/src/bank_header.F90 @@ -1,5 +1,7 @@ module bank_header + use, intrinsic :: ISO_C_BINDING + implicit none !=============================================================================== @@ -8,16 +10,11 @@ module bank_header ! stored with less memory !=============================================================================== - type Bank - ! The 'sequence' attribute is used here to ensure that the data listed - ! appears in the given order. This is important for MPI purposes when bank - ! sites are sent from one processor to another. - sequence - - real(8) :: wgt ! weight of bank site - real(8) :: xyz(3) ! location of bank particle - real(8) :: uvw(3) ! diretional cosines - real(8) :: E ! energy + type, bind(C) :: Bank + real(C_DOUBLE) :: wgt ! weight of bank site + real(C_DOUBLE) :: xyz(3) ! location of bank particle + real(C_DOUBLE) :: uvw(3) ! diretional cosines + real(C_DOUBLE) :: E ! energy end type Bank end module bank_header diff --git a/src/global.F90 b/src/global.F90 index ae2f5bb270..0c5e382129 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -16,7 +16,6 @@ module global use trigger_header, only: KTrigger use timer_header, only: Timer - use hdf5_interface, only: HID_T #ifdef MPIF08 use mpi_f08 #endif @@ -265,14 +264,6 @@ module global real(8) :: weight_cutoff = 0.25_8 real(8) :: weight_survive = ONE - ! ============================================================================ - ! HDF5 VARIABLES - - integer(HID_T) :: hdf5_output_file ! identifier for output file - integer(HID_T) :: hdf5_tallyresult_t ! Compound type for TallyResult - integer(HID_T) :: hdf5_bank_t ! Compound type for Bank - integer(HID_T) :: hdf5_integer8_t ! type for integer(8) - ! ============================================================================ ! MISCELLANEOUS VARIABLES diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index b22d0414f1..041e948ff0 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1,5 +1,15 @@ module hdf5_interface + ! This module provides the high-level procedures which greatly simplify + ! writing/reading different types of data to HDF5 files. In order to get it to + ! work with gfotran 4.6, all the write__ND subroutines had to be split + ! into two procedures, one accepting an assumed-shape array and another one + ! with an explicit-shape array since in gfortran 4.6 C_LOC does not work with + ! an assumed-shape array. When we move to gfortran 4.9+, these procedures can + ! be combined into one simply accepting an assumed-shape array. + + use tally_header, only: TallyResult + use hdf5 use h5lt use, intrinsic :: ISO_C_BINDING @@ -9,1781 +19,1844 @@ module hdf5_interface #endif implicit none + private - integer :: hdf5_err ! HDF5 error code - integer :: hdf5_rank ! rank of data - integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle - integer(HID_T) :: memspace ! data space handle for individual procs - integer(HID_T) :: plist ! property list handle - integer(HSIZE_T) :: dims1(1) ! dims type for 1-D array - integer(HSIZE_T) :: dims2(2) ! dims type for 2-D array - integer(HSIZE_T) :: dims3(3) ! dims type for 3-D array - integer(HSIZE_T) :: dims4(4) ! dims type for 4-D array - type(c_ptr) :: f_ptr ! pointer to data + integer(HID_T), public :: hdf5_tallyresult_t ! Compound type for TallyResult + integer(HID_T), public :: hdf5_bank_t ! Compound type for Bank + integer(HID_T), public :: hdf5_integer8_t ! type for integer(8) - ! Generic HDF5 write procedure interface - interface hdf5_write_data - module procedure hdf5_write_double - module procedure hdf5_write_double_1Darray - module procedure hdf5_write_double_2Darray - module procedure hdf5_write_double_3Darray - module procedure hdf5_write_double_4Darray - module procedure hdf5_write_integer - module procedure hdf5_write_integer_1Darray - module procedure hdf5_write_integer_2Darray - module procedure hdf5_write_integer_3Darray - module procedure hdf5_write_integer_4Darray - module procedure hdf5_write_long - module procedure hdf5_write_string -#ifdef PHDF5 - module procedure hdf5_write_double_parallel - module procedure hdf5_write_double_1Darray_parallel - module procedure hdf5_write_double_2Darray_parallel - module procedure hdf5_write_double_3Darray_parallel - module procedure hdf5_write_double_4Darray_parallel - module procedure hdf5_write_integer_parallel - module procedure hdf5_write_integer_1Darray_parallel - module procedure hdf5_write_integer_2Darray_parallel - module procedure hdf5_write_integer_3Darray_parallel - module procedure hdf5_write_integer_4Darray_parallel - module procedure hdf5_write_long_parallel - module procedure hdf5_write_string_parallel -#endif - end interface hdf5_write_data + interface write_dataset + module procedure write_double + module procedure write_double_1D + module procedure write_double_2D + module procedure write_double_3D + module procedure write_double_4D + module procedure write_integer + module procedure write_integer_1D + module procedure write_integer_2D + module procedure write_integer_3D + module procedure write_integer_4D + module procedure write_long + module procedure write_string + module procedure write_tally_result_1D + module procedure write_tally_result_2D + end interface write_dataset - ! Generic HDF5 read procedure interface - interface hdf5_read_data - module procedure hdf5_read_double - module procedure hdf5_read_double_1Darray - module procedure hdf5_read_double_2Darray - module procedure hdf5_read_double_3Darray - module procedure hdf5_read_double_4Darray - module procedure hdf5_read_integer - module procedure hdf5_read_integer_1Darray - module procedure hdf5_read_integer_2Darray - module procedure hdf5_read_integer_3Darray - module procedure hdf5_read_integer_4Darray - module procedure hdf5_read_long - module procedure hdf5_read_string -#ifdef PHDF5 - module procedure hdf5_read_double_parallel - module procedure hdf5_read_double_1Darray_parallel - module procedure hdf5_read_double_2Darray_parallel - module procedure hdf5_read_double_3Darray_parallel - module procedure hdf5_read_double_4Darray_parallel - module procedure hdf5_read_integer_parallel - module procedure hdf5_read_integer_1Darray_parallel - module procedure hdf5_read_integer_2Darray_parallel - module procedure hdf5_read_integer_3Darray_parallel - module procedure hdf5_read_integer_4Darray_parallel - module procedure hdf5_read_long_parallel - module procedure hdf5_read_string_parallel -#endif - end interface hdf5_read_data + interface read_dataset + module procedure read_double + module procedure read_double_1D + module procedure read_double_2D + module procedure read_double_3D + module procedure read_double_4D + module procedure read_integer + module procedure read_integer_1D + module procedure read_integer_2D + module procedure read_integer_3D + module procedure read_integer_4D + module procedure read_long + module procedure read_string + module procedure read_tally_result_1D + module procedure read_tally_result_2D + end interface read_dataset + + public :: write_dataset + public :: read_dataset + public :: file_create + public :: file_open + public :: file_close + public :: open_group + public :: close_group + public :: write_source_bank + public :: read_source_bank + public :: write_attribute_string contains !=============================================================================== -! HDF5_FILE_CREATE creates HDF5 file +! FILE_CREATE creates HDF5 file !=============================================================================== - subroutine hdf5_file_create(filename, file_id) + function file_create(filename, parallel) result(file_id) + character(*), intent(in) :: filename ! name of file + logical, optional, intent(in) :: parallel ! whether to write in serial + integer(HID_T) :: file_id - character(*), intent(in) :: filename ! name of file - integer(HID_T), intent(inout) :: file_id ! file handle + integer(HID_T) :: plist ! property list handle + integer :: hdf5_err ! HDF5 error code + logical :: parallel_ - ! Create the file - call h5fcreate_f(trim(filename), H5F_ACC_TRUNC_F, file_id, hdf5_err) + ! Check for serial option + if (present(parallel)) then + parallel_ = parallel + else + parallel_ = .false. + end if - end subroutine hdf5_file_create + if (parallel_) then + ! Setup file access property list with parallel I/O access + call h5pcreate_f(H5P_FILE_ACCESS_F, plist, hdf5_err) +#ifdef PHDF5 +#ifdef MPIF08 + call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD%MPI_VAL, & + MPI_INFO_NULL%MPI_VAL, hdf5_err) +#else + call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD, MPI_INFO_NULL, hdf5_err) +#endif +#endif + + ! Create the file collectively + call h5fcreate_f(trim(filename), H5F_ACC_TRUNC_F, file_id, hdf5_err, & + access_prp = plist) + + ! Close the property list + call h5pclose_f(plist, hdf5_err) + else + ! Create the file + call h5fcreate_f(trim(filename), H5F_ACC_TRUNC_F, file_id, hdf5_err) + end if + + end function file_create !=============================================================================== -! HDF5_FILE_OPEN opens HDF5 file +! FILE_OPEN opens HDF5 file !=============================================================================== - subroutine hdf5_file_open(filename, file_id, mode) + function file_open(filename, mode, parallel) result(file_id) + character(*), intent(in) :: filename ! name of file + character(*), intent(in) :: mode ! access mode to file + logical, optional, intent(in) :: parallel ! whether to write in serial + integer(HID_T) :: file_id - character(*), intent(in) :: filename ! name of file - character(*), intent(in) :: mode ! access mode to file - integer(HID_T), intent(inout) :: file_id ! file handle + logical :: parallel_ + integer(HID_T) :: plist ! property list handle + integer :: hdf5_err ! HDF5 error code + integer :: open_mode ! HDF5 open mode - integer :: open_mode ! HDF5 open mode + ! Check for serial option + if (present(parallel)) then + parallel_ = parallel + else + parallel_ = .false. + end if ! Determine access type open_mode = H5F_ACC_RDONLY_F - if (trim(mode) == 'w') then - open_mode = H5F_ACC_RDWR_F - end if - - ! Open file - call h5fopen_f(trim(filename), open_mode, file_id, hdf5_err) - - end subroutine hdf5_file_open - -!=============================================================================== -! HDF5_FILE_CLOSE closes HDF5 file -!=============================================================================== - - subroutine hdf5_file_close(file_id) - - integer(HID_T), intent(inout) :: file_id ! file handle - - ! Close the file - call h5fclose_f(file_id, hdf5_err) - - end subroutine hdf5_file_close + if (trim(mode) == 'w') open_mode = H5F_ACC_RDWR_F + if (parallel_) then + ! Setup file access property list with parallel I/O access + call h5pcreate_f(H5P_FILE_ACCESS_F, plist, hdf5_err) #ifdef PHDF5 - -!=============================================================================== -! HDF5_FILE_CREATE_PARALLEL creates HDF5 file with parallel I/O -!=============================================================================== - - subroutine hdf5_file_create_parallel(filename, file_id) - - character(*), intent(in) :: filename ! name of file - integer(HID_T), intent(inout) :: file_id ! file handle - - ! Setup file access property list with parallel I/O access - call h5pcreate_f(H5P_FILE_ACCESS_F, plist, hdf5_err) #ifdef MPIF08 - call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD%MPI_VAL, & - MPI_INFO_NULL%MPI_VAL, hdf5_err) + call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD%MPI_VAL, & + MPI_INFO_NULL%MPI_VAL, hdf5_err) #else - call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD, MPI_INFO_NULL, hdf5_err) + call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD, MPI_INFO_NULL, hdf5_err) +#endif #endif - ! Create the file collectively - call h5fcreate_f(trim(filename), H5F_ACC_TRUNC_F, file_id, hdf5_err, & + ! Open the file collectively + call h5fopen_f(trim(filename), open_mode, file_id, hdf5_err, & access_prp = plist) - ! Close the property list - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_file_create_parallel - -!=============================================================================== -! HDF5_FILE_OPEN_PARALLEL opens HDF5 file with parallel I/O -!=============================================================================== - - subroutine hdf5_file_open_parallel(filename, file_id, mode) - - character(*), intent(in) :: filename ! name of file - character(*), intent(in) :: mode ! access mode - integer(HID_T), intent(inout) :: file_id ! file handle - - integer :: open_mode ! HDF5 access mode - - ! Setup file access property list with parallel I/O access - call h5pcreate_f(H5P_FILE_ACCESS_F, plist, hdf5_err) -#ifdef MPIF08 - call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD%MPI_VAL, & - MPI_INFO_NULL%MPI_VAL, hdf5_err) -#else - call h5pset_fapl_mpio_f(plist, MPI_COMM_WORLD, MPI_INFO_NULL, hdf5_err) -#endif - - ! Determine access type - open_mode = H5F_ACC_RDONLY_F - if (trim(mode) == 'w') then - open_mode = H5F_ACC_RDWR_F + ! Close the property list + call h5pclose_f(plist, hdf5_err) + else + ! Open file + call h5fopen_f(trim(filename), open_mode, file_id, hdf5_err) end if - ! Create the file collectively - call h5fopen_f(trim(filename), open_mode, file_id, hdf5_err, & - access_prp = plist) - - ! Close the property list - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_file_open_parallel - -#endif + end function file_open !=============================================================================== -! HDF5_OPEN_GROUP creates/opens HDF5 group to temp_group +! FILE_CLOSE closes HDF5 file !=============================================================================== - subroutine hdf5_open_group(hdf5_fh, group, hdf5_grp) + subroutine file_close(file_id) + integer(HID_T), intent(in) :: file_id - character(*), intent(in) :: group ! name of group - integer(HID_T), intent(in) :: hdf5_fh ! file handle of main output file - integer(HID_T), intent(inout) :: hdf5_grp ! handle for group + integer :: hdf5_err - logical :: status ! does the group exist + call h5fclose_f(file_id, hdf5_err) + end subroutine file_close + +!=============================================================================== +! OPEN_GROUP opens an existing HDF5 group +!=============================================================================== + + function open_group(group_id, name) result(newgroup_id) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of group + integer(HID_T) :: newgroup_id + + logical :: exists ! does the group exist + integer :: hdf5_err ! HDF5 error code ! Check if group exists - call h5ltpath_valid_f(hdf5_fh, trim(group), .true., status, hdf5_err) + call h5ltpath_valid_f(group_id, trim(name), .true., exists, hdf5_err) ! Either create or open group - if (status) then - call h5gopen_f(hdf5_fh, trim(group), hdf5_grp, hdf5_err) - else - call h5gcreate_f(hdf5_fh, trim(group), hdf5_grp, hdf5_err) + if (exists) call h5gopen_f(group_id, trim(name), newgroup_id, hdf5_err) + end function open_group + +!=============================================================================== +! CREATE_GROUP creates a new HDF5 group +!=============================================================================== + + function create_group(group_id, name) result(newgroup_id) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of group + integer(HID_T) :: newgroup_id + + integer :: hdf5_err ! HDF5 error code + logical :: exists ! does the group exist + + ! Check if group exists + call h5ltpath_valid_f(group_id, trim(name), .true., exists, hdf5_err) + + ! create group + if (.not. exists) & + call h5gcreate_f(group_id, trim(name), newgroup_id, hdf5_err) + end function create_group + +!=============================================================================== +! CLOSE_GROUP closes HDF5 temp_group +!=============================================================================== + + subroutine close_group(group_id) + integer(HID_T), intent(inout) :: group_id + + integer :: hdf5_err ! HDF5 error code + + call h5gclose_f(group_id, hdf5_err) + end subroutine close_group + +!=============================================================================== +! WRITE_DOUBLE writes double precision scalar data +!=============================================================================== + + subroutine write_double(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + real(8), intent(in), target :: buffer ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up independentive vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F end if - end subroutine hdf5_open_group - -!=============================================================================== -! HDF5_CLOSE_GROUP closes HDF5 temp_group -!=============================================================================== - - subroutine hdf5_close_group(hdf5_grp) - - integer(HID_T), intent(inout) :: hdf5_grp - - ! Close the group - call h5gclose_f(hdf5_grp, hdf5_err) - - end subroutine hdf5_close_group - -!=============================================================================== -! HDF5_WRITE_INTEGER writes integer scalar data -!=============================================================================== - - subroutine hdf5_write_integer(group, name, buffer) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, target, intent(in) :: buffer ! data to write - - ! Create space, dataset, and write - call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) - call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - - end subroutine hdf5_write_integer - -!=============================================================================== -! HDF5_READ_INTEGER reads integer scalar data -!=============================================================================== - - subroutine hdf5_read_integer(group, name, buffer) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, target, intent(inout) :: buffer ! read data to here - - call h5dopen_f(group, name, dset, hdf5_err) - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) - call h5dclose_f(dset, hdf5_err) - - end subroutine hdf5_read_integer - -!=============================================================================== -! HDF5_WRITE_INTEGER_1DARRAY writes integer 1-D array -!=============================================================================== - - subroutine hdf5_write_integer_1Darray(group, name, buffer, len) - - integer, intent(in) :: len ! length of array to write - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(in) :: buffer(:) ! data to write - - ! Set rank and dimensions of data - hdf5_rank = 1 - dims1(1) = len - - ! Write data - call h5ltmake_dataset_int_f(group, name, hdf5_rank, dims1, & - buffer, hdf5_err) - - end subroutine hdf5_write_integer_1Darray - -!=============================================================================== -! HDF5_READ_INTEGER_1DARRAY reads integer 1-D array -!=============================================================================== - - subroutine hdf5_read_integer_1Darray(group, name, buffer, length) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(inout) :: buffer(:) ! read data to here - integer, intent(in) :: length ! length of array - - ! Set dimensions - dims1(1) = length - - ! Read data - call h5ltread_dataset_int_f(group, name, buffer, dims1, hdf5_err) - - end subroutine hdf5_read_integer_1Darray - -!=============================================================================== -! HDF5_WRITE_INTEGER_2DARRAY writes integer 2-D array -!=============================================================================== - - subroutine hdf5_write_integer_2Darray(group, name, buffer, length) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(in) :: buffer(length(1),length(2)) ! data to write - - ! Set rank and dimensions - hdf5_rank = 2 - dims2 = length - - ! Write data - call h5ltmake_dataset_int_f(group, name, hdf5_rank, dims2, & - buffer, hdf5_err) - - end subroutine hdf5_write_integer_2Darray - -!=============================================================================== -! HDF5_READ_INTEGER_2DARRAY reads integer 2-D array -!=============================================================================== - - subroutine hdf5_read_integer_2Darray(group, name, buffer, length) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(inout) :: buffer(length(1),length(2)) ! data to read - - ! Set rank and dimensions - dims2 = length - - ! Write data - call h5ltread_dataset_int_f(group, name, buffer, dims2, hdf5_err) - - end subroutine hdf5_read_integer_2Darray - -!=============================================================================== -! HDF5_WRITE_INTEGER_3DARRAY writes integer 3-D array -!=============================================================================== - - subroutine hdf5_write_integer_3Darray(group, name, buffer, length) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(in) :: buffer(length(1),length(2), & - length(3)) ! data to write - - ! Set rank and dimensions - hdf5_rank = 3 - dims3 = length - - ! Write data - call h5ltmake_dataset_int_f(group, name, hdf5_rank, dims3, & - buffer, hdf5_err) - - end subroutine hdf5_write_integer_3Darray - -!=============================================================================== -! HDF5_READ_INTEGER_3DARRAY reads integer 3-D array -!=============================================================================== - - subroutine hdf5_read_integer_3Darray(group, name, buffer, length) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(inout) :: buffer(length(1),length(2), & - length(3)) ! data to read - - ! Set rank and dimensions - dims3 = length - - ! Write data - call h5ltread_dataset_int_f(group, name, buffer, dims3, hdf5_err) - - end subroutine hdf5_read_integer_3Darray - -!=============================================================================== -! HDF5_WRITE_INTEGER_4DARRAY writes integer 4-D array -!=============================================================================== - - subroutine hdf5_write_integer_4Darray(group, name, buffer, length) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(in) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to write - - ! Set rank and dimensions - hdf5_rank = 4 - dims4 = length - - ! Write data - call h5ltmake_dataset_int_f(group, name, hdf5_rank, dims4, & - buffer, hdf5_err) - - end subroutine hdf5_write_integer_4Darray - -!=============================================================================== -! HDF5_READ_INTEGER_4DARRAY reads integer 4-D array -!=============================================================================== - - subroutine hdf5_read_integer_4Darray(group, name, buffer, length) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, intent(inout) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to read - - ! Set rank and dimensions - dims4 = length - - ! Write data - call h5ltread_dataset_int_f(group, name, buffer, dims4, hdf5_err) - - end subroutine hdf5_read_integer_4Darray - -!=============================================================================== -! HDF5_WRITE_DOUBLE writes integer scalar data -!=============================================================================== - - subroutine hdf5_write_double(group, name, buffer) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), target, intent(in) :: buffer ! data to write - - ! Create space, dataset, and write - call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) - call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - - end subroutine hdf5_write_double - -!=============================================================================== -! HDF5_READ_DOUBLE reads double scalar data -!=============================================================================== - - subroutine hdf5_read_double(group, name, buffer) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), target, intent(inout) :: buffer ! read data to here - - call h5dopen_f(group, name, dset, hdf5_err) - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) - call h5dclose_f(dset, hdf5_err) - - end subroutine hdf5_read_double - -!=============================================================================== -! HDF5_WRITE_DOUBLE_1DARRAY writes double 1-D array -!=============================================================================== - - subroutine hdf5_write_double_1Darray(group, name, buffer, length) - - integer, intent(in) :: length ! length of array to write - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(in) :: buffer(:) ! data to write - - ! Set rank and dimensions of data - hdf5_rank = 1 - dims1(1) = length - - ! Write data - call h5ltmake_dataset_double_f(group, name, hdf5_rank, dims1, & - buffer, hdf5_err) - - end subroutine hdf5_write_double_1Darray - -!=============================================================================== -! HDF5_READ_DOUBLE_1DARRAY reads double 1-D array -!=============================================================================== - - subroutine hdf5_read_double_1Darray(group, name, buffer, length) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(inout) :: buffer(:) ! read data to here - integer, intent(in) :: length ! length of array - - ! Set dimensions - dims1(1) = length - - ! Read data - call h5ltread_dataset_double_f(group, name, buffer, dims1, hdf5_err) - - end subroutine hdf5_read_double_1Darray - -!=============================================================================== -! HDF5_WRITE_DOUBLE_2DARRAY writes double 2-D array -!=============================================================================== - - subroutine hdf5_write_double_2Darray(group, name, buffer, length) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(in) :: buffer(length(1),length(2)) ! data to write - - ! Set rank and dimensions - hdf5_rank = 2 - dims2 = length - - ! Write data - call h5ltmake_dataset_double_f(group, name, hdf5_rank, dims2, & - buffer, hdf5_err) - - end subroutine hdf5_write_double_2Darray - -!=============================================================================== -! HDF5_READ_DOUBLE_2DARRAY reads double 2-D array -!=============================================================================== - - subroutine hdf5_read_double_2Darray(group, name, buffer, length) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(inout) :: buffer(length(1),length(2)) ! data to read - - ! Set rank and dimensions - dims2 = length - - ! Write data - call h5ltread_dataset_double_f(group, name, buffer, dims2, hdf5_err) - - end subroutine hdf5_read_double_2Darray - -!=============================================================================== -! HDF5_WRITE_DOUBLE_3DARRAY writes double 3-D array -!=============================================================================== - - subroutine hdf5_write_double_3Darray(group, name, buffer, length) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(in) :: buffer(length(1),length(2), & - length(3)) ! data to write - - ! Set rank and dimensions - hdf5_rank = 3 - dims3 = length - - ! Write data - call h5ltmake_dataset_double_f(group, name, hdf5_rank, dims3, & - buffer, hdf5_err) - - end subroutine hdf5_write_double_3Darray - -!=============================================================================== -! HDF5_READ_DOUBLE_3DARRAY reads double 3-D array -!=============================================================================== - - subroutine hdf5_read_double_3Darray(group, name, buffer, length) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(inout) :: buffer(length(1),length(2), & - length(3)) ! data to read - - ! Set rank and dimensions - dims3 = length - - ! Write data - call h5ltread_dataset_double_f(group, name, buffer, dims3, hdf5_err) - - end subroutine hdf5_read_double_3Darray - -!=============================================================================== -! HDF5_WRITE_DOUBLE_4DARRAY writes double 4-D array -!=============================================================================== - - subroutine hdf5_write_double_4Darray(group, name, buffer, length) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(in) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to write - - ! Set rank and dimensions - hdf5_rank = 4 - dims4 = length - - ! Write data - call h5ltmake_dataset_double_f(group, name, hdf5_rank, dims4, & - buffer, hdf5_err) - - end subroutine hdf5_write_double_4Darray - -!=============================================================================== -! HDF5_READ_DOUBLE_4DARRAY reads double 4-D array -!=============================================================================== - - subroutine hdf5_read_double_4Darray(group, name, buffer, length) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), intent(inout) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to read - - ! Set rank and dimensions - dims4 = length - - ! Write data - call h5ltread_dataset_double_f(group, name, buffer, dims4, hdf5_err) - - end subroutine hdf5_read_double_4Darray - -!=============================================================================== -! HDF5_WRITE_LONG writes long integer scalar data -!=============================================================================== - - subroutine hdf5_write_long(group, name, buffer, long_type) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer(8), target, intent(in) :: buffer ! data to write - integer(HID_T), intent(in) :: long_type ! HDF5 long type - ! Create dataspace and dataset call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) - call h5dcreate_f(group, name, long_type, dspace, dset, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_DOUBLE, & + dspace, dset, hdf5_err) f_ptr = c_loc(buffer) - call h5dwrite_f(dset, long_type, f_ptr, hdf5_err) - ! Close dataspace and dataset for long integer + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + call h5dclose_f(dset, hdf5_err) call h5sclose_f(dspace, hdf5_err) - - end subroutine hdf5_write_long + end subroutine write_double !=============================================================================== -! HDF5_READ_LONG read long integer scalar data +! READ_DOUBLE reads double precision scalar data !=============================================================================== - subroutine hdf5_read_long(group, name, buffer, long_type) + subroutine read_double(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + real(8), intent(inout), target :: buffer ! read data to here + logical, intent(in), optional :: indep ! independent I/O - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer(8), target, intent(out) :: buffer ! read data to here - integer(HID_T), intent(in) :: long_type ! long integer type + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr - call h5dopen_f(group, name, dset, hdf5_err) + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) f_ptr = c_loc(buffer) - call h5dread_f(dset, long_type, f_ptr, hdf5_err) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + call h5dclose_f(dset, hdf5_err) - - end subroutine hdf5_read_long + end subroutine read_double !=============================================================================== -! HDF5_WRITE_STRING writes string data +! WRITE_DOUBLE_1DARRAY writes double precision 1-D array data !=============================================================================== - subroutine hdf5_write_string(group, name, buffer, length) + subroutine write_double_1D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(:) ! data to write + logical, intent(in), optional :: indep ! independent I/O - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - character(*), intent(in) :: buffer ! data to write - integer, intent(in) :: length + integer(HSIZE_T) :: dims(1) - character(len=length), dimension(1) :: str_tmp + dims(:) = shape(buffer) + if (present(indep)) then + call write_double_1D_explicit(group_id, dims, name, buffer, indep) + else + call write_double_1D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_double_1D -! Fortran 2003 implementation not compatible with IBM compiler Feb 2013 -! type(c_ptr), dimension(1), target :: wdata -! character(len=length, kind=c_char), dimension(1), target :: c_str -! dims1(1) = 1 -! call h5screate_simple_f(1, dims1, dspace, hdf5_err) -! call h5dcreate_f(group, name, H5T_STRING, dspace, dset, hdf5_err) -! c_str(1) = buffer -! wdata(1) = c_loc(c_str(1)) -! f_ptr = c_loc(wdata(1)) + subroutine write_double_1D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(dims(1)) ! data to write + logical, intent(in), optional :: indep ! independent I/O - ! Number of strings to write - dims1(1) = 1 + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_DOUBLE, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_double_1D_explicit + +!=============================================================================== +! READ_DOUBLE_1DARRAY reads double precision 1-D array data +!=============================================================================== + + subroutine read_double_1D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_double_1D_explicit(group_id, dims, name, buffer, indep) + else + call read_double_1D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_double_1D + + subroutine read_double_1D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(dims(1)) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_double_1D_explicit + +!=============================================================================== +! WRITE_DOUBLE_2DARRAY writes double precision 2-D array data +!=============================================================================== + + subroutine write_double_2D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(2) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_double_2D_explicit(group_id, dims, name, buffer, indep) + else + call write_double_2D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_double_2D + + subroutine write_double_2D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(2) + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(dims(1),dims(2)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(2, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_DOUBLE, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_double_2D_explicit + +!=============================================================================== +! READ_DOUBLE_2DARRAY reads double precision 2-D array data +!=============================================================================== + + subroutine read_double_2D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(2) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_double_2D_explicit(group_id, dims, name, buffer, indep) + else + call read_double_2D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_double_2D + + subroutine read_double_2D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(2) + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(dims(1),dims(2)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_double_2D_explicit + +!=============================================================================== +! WRITE_DOUBLE_3DARRAY writes double precision 3-D array data +!=============================================================================== + + subroutine write_double_3D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(3) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_double_3D_explicit(group_id, dims, name, buffer, indep) + else + call write_double_3D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_double_3D + + subroutine write_double_3D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(3) + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(dims(1),dims(2),dims(3)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(3, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_DOUBLE, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_double_3D_explicit + +!=============================================================================== +! READ_DOUBLE_3DARRAY reads double precision 3-D array data +!=============================================================================== + + subroutine read_double_3D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(3) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_double_3D_explicit(group_id, dims, name, buffer, indep) + else + call read_double_3D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_double_3D + + subroutine read_double_3D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(3) + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(dims(1),dims(2),dims(3)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_double_3D_explicit + +!=============================================================================== +! WRITE_DOUBLE_4DARRAY writes double precision 4-D array data +!=============================================================================== + + subroutine write_double_4D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(:,:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(4) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_double_4D_explicit(group_id, dims, name, buffer, indep) + else + call write_double_4D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_double_4D + + subroutine write_double_4D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(4) + character(*), intent(in) :: name ! name of data + real(8), intent(in), target :: buffer(dims(1),dims(2),dims(3),dims(4)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(4, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_DOUBLE, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_double_4D_explicit + +!=============================================================================== +! READ_DOUBLE_4DARRAY reads double precision 4-D array data +!=============================================================================== + + subroutine read_double_4D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(:,:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(4) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_double_4D_explicit(group_id, dims, name, buffer, indep) + else + call read_double_4D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_double_4D + + subroutine read_double_4D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(4) + character(*), intent(in) :: name ! name of data + real(8), intent(inout), target :: buffer(dims(1),dims(2),dims(3),dims(4)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_double_4D_explicit + +!=============================================================================== +! WRITE_INTEGER writes integer precision scalar data +!=============================================================================== + + subroutine write_integer(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + integer, intent(in), target :: buffer ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + ! Create dataspace and dataset + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_INTEGER, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_integer + +!=============================================================================== +! READ_INTEGER reads integer precision scalar data +!=============================================================================== + + subroutine read_integer(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + integer, intent(inout), target :: buffer ! read data to here + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_integer + +!=============================================================================== +! WRITE_INTEGER_1DARRAY writes integer precision 1-D array data +!=============================================================================== + + subroutine write_integer_1D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_integer_1D_explicit(group_id, dims, name, buffer, indep) + else + call write_integer_1D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_integer_1D + + subroutine write_integer_1D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(dims(1)) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_INTEGER, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_integer_1D_explicit + +!=============================================================================== +! READ_INTEGER_1DARRAY reads integer precision 1-D array data +!=============================================================================== + + subroutine read_integer_1D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_integer_1D_explicit(group_id, dims, name, buffer, indep) + else + call read_integer_1D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_integer_1D + + subroutine read_integer_1D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(dims(1)) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_integer_1D_explicit + +!=============================================================================== +! WRITE_INTEGER_2DARRAY writes integer precision 2-D array data +!=============================================================================== + + subroutine write_integer_2D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(2) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_integer_2D_explicit(group_id, dims, name, buffer, indep) + else + call write_integer_2D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_integer_2D + + subroutine write_integer_2D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(2) + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(dims(1),dims(2)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(2, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_INTEGER, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_integer_2D_explicit + +!=============================================================================== +! READ_INTEGER_2DARRAY reads integer precision 2-D array data +!=============================================================================== + + subroutine read_integer_2D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(2) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_integer_2D_explicit(group_id, dims, name, buffer, indep) + else + call read_integer_2D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_integer_2D + + subroutine read_integer_2D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(2) + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(dims(1),dims(2)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_integer_2D_explicit + +!=============================================================================== +! WRITE_INTEGER_3DARRAY writes integer precision 3-D array data +!=============================================================================== + + subroutine write_integer_3D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(3) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_integer_3D_explicit(group_id, dims, name, buffer, indep) + else + call write_integer_3D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_integer_3D + + subroutine write_integer_3D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(3) + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(dims(1),dims(2),dims(3)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(3, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_INTEGER, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_integer_3D_explicit + +!=============================================================================== +! READ_INTEGER_3DARRAY reads integer precision 3-D array data +!=============================================================================== + + subroutine read_integer_3D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(3) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_integer_3D_explicit(group_id, dims, name, buffer, indep) + else + call read_integer_3D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_integer_3D + + subroutine read_integer_3D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(3) + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(dims(1),dims(2),dims(3)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_integer_3D_explicit + +!=============================================================================== +! WRITE_INTEGER_4DARRAY writes integer precision 4-D array data +!=============================================================================== + + subroutine write_integer_4D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(:,:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(4) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_integer_4D_explicit(group_id, dims, name, buffer, indep) + else + call write_integer_4D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_integer_4D + + subroutine write_integer_4D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(4) + character(*), intent(in) :: name ! name of data + integer, intent(in), target :: buffer(dims(1),dims(2),dims(3),dims(4)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5screate_simple_f(4, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_NATIVE_INTEGER, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_integer_4D_explicit + +!=============================================================================== +! READ_INTEGER_4DARRAY reads integer precision 4-D array data +!=============================================================================== + + subroutine read_integer_4D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(:,:,:,:) ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(4) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_integer_4D_explicit(group_id, dims, name, buffer, indep) + else + call read_integer_4D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_integer_4D + + subroutine read_integer_4D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(4) + character(*), intent(in) :: name ! name of data + integer, intent(inout), target :: buffer(dims(1),dims(2),dims(3),dims(4)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_integer_4D_explicit + +!=============================================================================== +! WRITE_LONG writes long integer scalar data +!=============================================================================== + + subroutine write_long(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + integer(8), intent(in), target :: buffer ! data to write + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + ! Create dataspace and dataset + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), hdf5_integer8_t, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_f(dset, hdf5_integer8_t, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_f(dset, hdf5_integer8_t, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_long + +!=============================================================================== +! READ_LONG reads long integer scalar data +!=============================================================================== + + subroutine read_long(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + integer(8), intent(inout), target :: buffer ! read data to here + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, hdf5_integer8_t, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, hdf5_integer8_t, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + end subroutine read_long + +!=============================================================================== +! WRITE_STRING writes string data +!=============================================================================== + + subroutine write_string(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + character(*), intent(in) :: buffer ! read data to here + logical, intent(in), optional :: indep ! independent I/O + + integer :: n + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + integer(HSIZE_T) :: dims1(1) + integer(HSIZE_T) :: dims2(2) + type(c_ptr) :: f_ptr + character(len=len_trim(buffer)), dimension(1) :: str_tmp + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if ! Insert null character at end of string when writing call h5tset_strpad_f(H5T_STRING, H5T_STR_NULLPAD_F, hdf5_err) ! Create the dataspace and dataset + dims1(1) = 1 call h5screate_simple_f(1, dims1, dspace, hdf5_err) - call h5dcreate_f(group, name, H5T_STRING, dspace, dset, hdf5_err) + call h5dcreate_f(group_id, trim(name), H5T_STRING, dspace, dset, hdf5_err) ! Set up dimesnions of string to write - dims2 = (/length, 1/) ! full array of strings to write - dims1(1) = length ! length of string + n = len_trim(buffer) + dims2(:) = [n, 1] ! full array of strings to write + dims1(1) = n ! length of string ! Copy over string buffer to a rank 1 array str_tmp(1) = buffer - ! Write the variable dataset - call h5dwrite_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace) + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dwrite_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & + mem_space_id=dspace, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dwrite_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & + mem_space_id=dspace) + end if - ! Close all call h5dclose_f(dset, hdf5_err) call h5sclose_f(dspace, hdf5_err) - - end subroutine hdf5_write_string + end subroutine write_string !=============================================================================== -! HDF5_READ_STRING reads string data +! READ_STRING reads string data !=============================================================================== - subroutine hdf5_read_string(group, name, buffer, length) + subroutine read_string(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + character(*), intent(inout) :: buffer ! read data to here + logical, intent(in), optional :: indep ! independent I/O - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - character(*), intent(inout) :: buffer ! read data to here - integer, intent(in) :: length ! length of string to read + integer :: n + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + integer(HSIZE_T) :: dims1(1) + integer(HSIZE_T) :: dims2(2) + type(c_ptr) :: f_ptr + character(len=len_trim(buffer)), dimension(1) :: str_tmp - character(len=length), dimension(1) :: str_tmp + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if - ! Fortran 2003 implementation not compatible with IBM Feb 2013 compiler -! type(c_ptr), dimension(1), target :: buf_ptr -! character(len=length, kind=c_char), pointer :: chr_ptr -! f_ptr = c_loc(buf_ptr(1)) -! call h5dread_f(dset, H5T_STRING, f_ptr, hdf5_err, xfer_prp=plist) -! call c_f_pointer(buf_ptr(1), chr_ptr) -! buffer = chr_ptr -! nullify(chr_ptr) + ! Set up dimesnions of string to write + n = len_trim(buffer) + dims2(:) = [n, 1] ! full array of strings to write + dims1(1) = n ! length of string - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Get dataspace to read + call h5dopen_f(group_id, trim(name), dset, hdf5_err) call h5dget_space_f(dset, dspace, hdf5_err) - ! Set dimensions - dims2 = (/length, 1/) - dims1(1) = length - - ! Read in the data - call h5dread_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace, xfer_prp = plist) + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & + mem_space_id=dspace, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & + mem_space_id=dspace) + end if ! Copy over buffer buffer = str_tmp(1) ! Close dataset call h5dclose_f(dset, hdf5_err) - - end subroutine hdf5_read_string + end subroutine read_string !=============================================================================== -! HDF5_WRITE_ATTRIBUTE_STRING writes a string attribute to a variables +! WRITE_ATTRIBUTE_STRING !=============================================================================== - subroutine hdf5_write_attribute_string(group, var, attr_type, attr_str) + subroutine write_attribute_string(group_id, var, attr_type, attr_str) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: var ! variable name for attr + character(*), intent(in) :: attr_type ! attr identifier type + character(*), intent(in) :: attr_str ! string for attr id type - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: var ! name of varaible to set attr - character(*), intent(in) :: attr_type ! the attr type id - character(*), intent(in) :: attr_str ! attribute sting + integer :: hdf5_err - call h5ltset_attribute_string_f(group, var, attr_type, attr_str, hdf5_err) + call h5ltset_attribute_string_f(group_id, var, attr_type, attr_str, hdf5_err) + end subroutine write_attribute_string - end subroutine hdf5_write_attribute_string +!=============================================================================== +! WRITE_TALLY_RESULT writes an OpenMC TallyResult type +!=============================================================================== + + subroutine write_tally_result_1D(group_id, name, buffer) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(in), target :: buffer(:) ! data to write + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + call write_tally_result_1D_explicit(group_id, dims, name, buffer) + end subroutine write_tally_result_1D + + subroutine write_tally_result_1D_explicit(group_id, dims, name, buffer) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(in), target :: buffer(dims(1)) + + integer :: hdf5_err + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), hdf5_tallyresult_t, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dwrite_f(dset, hdf5_tallyresult_t, f_ptr, hdf5_err) + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_tally_result_1D_explicit + + subroutine write_tally_result_2D(group_id, name, buffer) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(in), target :: buffer(:,:) ! data to write + + integer(HSIZE_T) :: dims(2) + + dims(:) = shape(buffer) + call write_tally_result_2D_explicit(group_id, dims, name, buffer) + end subroutine write_tally_result_2D + + subroutine write_tally_result_2D_explicit(group_id, dims, name, buffer) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(2) + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(in), target :: buffer(dims(1),dims(2)) + + integer :: hdf5_err + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + type(c_ptr) :: f_ptr + + call h5screate_simple_f(2, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), hdf5_tallyresult_t, & + dspace, dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dwrite_f(dset, hdf5_tallyresult_t, f_ptr, hdf5_err) + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end subroutine write_tally_result_2D_explicit + +!=============================================================================== +! READ_TALLY_RESULT reads OpenMC TallyResult data +!=============================================================================== + + subroutine read_tally_result_1D(group_id, name, buffer) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(inout), target :: buffer(:) ! read data here + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + call read_tally_result_1D_explicit(group_id, dims, name, buffer) + end subroutine read_tally_result_1D + + subroutine read_tally_result_1D_explicit(group_id, dims, name, buffer) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(inout), target :: buffer(dims(1)) + + integer :: hdf5_err + integer(HID_T) :: dset ! data set handle + type(c_ptr) :: f_ptr + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dread_f(dset, hdf5_tallyresult_t, f_ptr, hdf5_err) + call h5dclose_f(dset, hdf5_err) + end subroutine read_tally_result_1D_explicit + + subroutine read_tally_result_2D(group_id, name, buffer) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(inout), target :: buffer(:,:) + + integer(HSIZE_T) :: dims(2) + + dims(:) = shape(buffer) + call read_tally_result_2D_explicit(group_id, dims, name, buffer) + end subroutine read_tally_result_2D + + subroutine read_tally_result_2D_explicit(group_id, dims, name, buffer) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(2) + character(*), intent(in) :: name ! name of data + type(TallyResult), intent(inout), target :: buffer(dims(1),dims(2)) + + integer :: hdf5_err + integer(HID_T) :: dset ! data set handle + type(c_ptr) :: f_ptr + + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + f_ptr = c_loc(buffer) + call h5dread_f(dset, hdf5_tallyresult_t, f_ptr, hdf5_err) + call h5dclose_f(dset, hdf5_err) + end subroutine read_tally_result_2D_explicit + +!=============================================================================== +! WRITE_SOURCE_BANK writes OpenMC source_bank data +!=============================================================================== + + subroutine write_source_bank(group_id) + use bank_header, only: Bank + use global, only: n_particles, work, source_bank + + integer(HID_T), intent(in) :: group_id + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + integer(HID_T) :: memspace ! memory space handle + integer(HSIZE_T) :: dims(1) + type(c_ptr) :: f_ptr +#ifdef PHDF5 + integer(HSIZE_T) :: offset(1) ! source data offset +#endif #ifdef PHDF5 - -!=============================================================================== -! HDF5_WRITE_INTEGER_PARALLEL writes integer scalar data in parallel -!=============================================================================== - - subroutine hdf5_write_integer_parallel(group, name, buffer, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(in) :: buffer ! data to write - logical, intent(in) :: collect ! collect I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) + ! Set size of total dataspace for all procs and rank + dims(1) = n_particles + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, dspace, dset, hdf5_err) call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - end subroutine hdf5_write_integer_parallel + ! Create another data space but for each proc individually + dims(1) = work + call h5screate_simple_f(rank, dims, memspace, hdf5_err) -!=============================================================================== -! HDF5_READ_INTEGER_PARALLEL reads integer scalar data -!=============================================================================== - - subroutine hdf5_read_integer_parallel(group, name, buffer, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, target, intent(inout) :: buffer ! read data to here - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_integer_parallel - -!=============================================================================== -! HDF5_WRITE_INTEGER_1DARRAY_PARALLEL writes integer 1-D array in parallel -!=============================================================================== - - subroutine hdf5_write_integer_1Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length ! length of array to write - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(in) :: buffer(length) ! data to write - logical, intent(in) :: collect ! collect I/O - - ! Set rank and dimensions of data - hdf5_rank = 1 - dims1(1) = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_integer_1Darray_parallel - -!=============================================================================== -! HDF5_WRITE_INTEGER_1DARRAY_PARALLEL reads integer 1-D array in parallel -!=============================================================================== - - subroutine hdf5_read_integer_1Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length ! length of array - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer, target, intent(inout) :: buffer(length) ! read data to here - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_integer_1Darray_parallel - -!=============================================================================== -! HDF5_WRITE_INTEGER_2DARRAY_PARALLEL writes integer 2-D array in parallel -!=============================================================================== - - subroutine hdf5_write_integer_2Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(in) :: buffer(length(1),length(2)) ! data to write - logical, intent(in) :: collect ! collective I/O - - ! Set rank and dimensions - hdf5_rank = 2 - dims2 = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims2, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_integer_2Darray_parallel - -!=============================================================================== -! HDF5_READ_INTEGER_2DARRAY_PARALLEL reads integer 2-D array in parallel -!=============================================================================== - - subroutine hdf5_read_integer_2Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(inout) :: buffer(length(1),length(2)) ! data to read - logical, intent(in) :: collect ! collect I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_integer_2Darray_parallel - -!=============================================================================== -! HDF5_WRITE_INTEGER_3DARRAY_PARALLEL writes integer 3-D array in parallel -!=============================================================================== - - subroutine hdf5_write_integer_3Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(in) :: buffer(length(1),length(2), & - length(3)) ! data to write - logical, intent(in) :: collect ! collective I/O - - ! Set rank and dimensions - hdf5_rank = 3 - dims3 = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims3, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_integer_3Darray_parallel - -!=============================================================================== -! HDF5_READ_INTEGER_3DARRAY_PARALLEL reads integer 3-D array in parallel -!=============================================================================== - - subroutine hdf5_read_integer_3Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(inout) :: buffer(length(1),length(2), & - length(3)) ! data to read - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_integer_3Darray_parallel - -!=============================================================================== -! HDF5_WRITE_INTEGER_4DARRAY_PARALLEL writes integer 4-D array in parallel -!=============================================================================== - - subroutine hdf5_write_integer_4Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(in) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to write - logical, intent(in) :: collect ! collective I/O - - ! Set rank and dimensions - hdf5_rank = 4 - dims4 = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims4, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_integer_4Darray_parallel - -!=============================================================================== -! HDF5_READ_INTEGER_4DARRAY_PARALLEL reads integer 4-D array in parallel -!=============================================================================== - - subroutine hdf5_read_integer_4Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer,target, intent(inout) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to read - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_integer_4Darray_parallel - -!=============================================================================== -! HDF5_WRITE_DOUBLE_PARALLEL writes double scalar data in parallel -!=============================================================================== - - subroutine hdf5_write_double_parallel(group, name, buffer, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(in) :: buffer ! data to write - logical, intent(in) :: collect ! collect I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_double_parallel - -!=============================================================================== -! HDF5_READ_DOUBLE_PARALLEL reads double scalar data -!=============================================================================== - - subroutine hdf5_read_double_parallel(group, name, buffer, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8), target, intent(inout) :: buffer ! read data to here - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_double_parallel - -!=============================================================================== -! HDF5_WRITE_DOUBLE_1DARRAY_PARALLEL writes double 1-D array in parallel -!=============================================================================== - - subroutine hdf5_write_double_1Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length ! length of array to write - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(in) :: buffer(length) ! data to write - logical, intent(in) :: collect ! collect I/O - - ! Set rank and dimensions of data - hdf5_rank = 1 - dims1(1) = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_double_1Darray_parallel - -!=============================================================================== -! HDF5_WRITE_DOUBLE_1DARRAY_PARALLEL reads double 1-D array in parallel -!=============================================================================== - - subroutine hdf5_read_double_1Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length ! length of array - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(inout) :: buffer(length) ! read data to here - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_double_1Darray_parallel - -!=============================================================================== -! HDF5_WRITE_DOUBLE_2DARRAY_PARALLEL writes double 2-D array in parallel -!=============================================================================== - - subroutine hdf5_write_double_2Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(in) :: buffer(length(1),length(2)) ! data to write - logical, intent(in) :: collect ! collective I/O - - ! Set rank and dimensions - hdf5_rank = 2 - dims2 = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims2, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer(1,1)) - call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_double_2Darray_parallel - -!=============================================================================== -! HDF5_READ_DOUBLE_2DARRAY_PARALLEL reads double 2-D array in parallel -!=============================================================================== - - subroutine hdf5_read_double_2Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(2) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(inout) :: buffer(length(1),length(2)) ! data to read - logical, intent(in) :: collect ! collect I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_double_2Darray_parallel - -!=============================================================================== -! HDF5_WRITE_DOUBLE_3DARRAY_PARALLEL writes double 3-D array in parallel -!=============================================================================== - - subroutine hdf5_write_double_3Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(in) :: buffer(length(1),length(2), & - length(3)) ! data to write - logical, intent(in) :: collect ! collective I/O - - ! Set rank and dimensions - hdf5_rank = 3 - dims3 = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims3, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_double_3Darray_parallel - -!=============================================================================== -! HDF5_READ_DOUBLE_3DARRAY_PARALLEL reads double 3-D array in parallel -!=============================================================================== - - subroutine hdf5_read_double_3Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(3) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(inout) :: buffer(length(1),length(2), & - length(3)) ! data to read - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_double_3Darray_parallel - -!=============================================================================== -! HDF5_WRITE_DOUBLE_4DARRAY_PARALLEL writes double 4-D array in parallel -!=============================================================================== - - subroutine hdf5_write_double_4Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(in) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to write - logical, intent(in) :: collect ! collective I/O - - ! Set rank and dimensions - hdf5_rank = 4 - dims4 = length - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims4, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, H5T_NATIVE_DOUBLE, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_double_4Darray_parallel - -!=============================================================================== -! HDF5_READ_DOUBLE_4DARRAY_PARALLEL reads double 4-D array in parallel -!=============================================================================== - - subroutine hdf5_read_double_4Darray_parallel(group, name, buffer, length, & - collect) - - integer, intent(in) :: length(4) ! length of array dimensions - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - real(8),target, intent(inout) :: buffer(length(1),length(2), & - length(3),length(4)) ! data to read - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_double_4Darray_parallel - -!=============================================================================== -! HDF5_WRITE_LONG_PARALLEL writes long integer scalar data in parallel -!=============================================================================== - - subroutine hdf5_write_long_parallel(group, name, buffer, long_type, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer(8), target, intent(in) :: buffer ! data to write - integer(HID_T), intent(in) :: long_type ! HDF5 long type - logical, intent(in) :: collect ! collective I/O - - ! Set up rank and dimensions - hdf5_rank = 1 - dims1(1) = 1 - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group, name, long_type, dspace, dset, hdf5_err) - - ! Write data - f_ptr = c_loc(buffer) - call h5dwrite_f(dset, long_type, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_long_parallel - -!=============================================================================== -! HDF5_READ_LONG_PARALLEL read long integer scalar data in parallel -!=============================================================================== - - subroutine hdf5_read_long_parallel(group, name, buffer, long_type, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - integer(8), target, intent(out) :: buffer ! read data to here - integer(HID_T), intent(in) :: long_type ! long integer type - logical, intent(in) :: collect ! collective I/O - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Read data - f_ptr = c_loc(buffer) - call h5dread_f(dset, long_type, f_ptr, hdf5_err, xfer_prp=plist) - - ! Close dataset and property list - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_read_long_parallel - -!=============================================================================== -! HDF5_WRITE_STRING_PARALLEL writes string data in parallel -!=============================================================================== - - subroutine hdf5_write_string_parallel(group, name, buffer, length, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - character(*), intent(in) :: buffer ! data to write - integer, intent(in) :: length ! length of string - logical, intent(in) :: collect ! collective I/O - - character(len=length), dimension(1) :: str_tmp - -! Fortran 2003 implementation not compatible with IBM compiler Feb 2013 -! type(c_ptr), dimension(1), target :: wdata -! character(len=length, kind=c_char), dimension(1), target :: c_str -! dims1(1) = 1 -! call h5screate_simple_f(1, dims1, dspace, hdf5_err) -! call h5dcreate_f(group, name, H5T_STRING, dspace, dset, hdf5_err) -! c_str(1) = buffer -! wdata(1) = c_loc(c_str(1)) -! f_ptr = c_loc(wdata(1)) - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Number of strings to write - dims1(1) = 1 - - ! Insert null character at end of string when writing - call h5tset_strpad_f(H5T_STRING, H5T_STR_NULLPAD_F, hdf5_err) - - ! Create the dataspace and dataset - call h5screate_simple_f(1, dims1, dspace, hdf5_err) - call h5dcreate_f(group, name, H5T_STRING, dspace, dset, hdf5_err) - - ! Set up dimesnions of string to write - dims2 = (/length, 1/) ! full array of strings to write - dims1(1) = length ! length of string - - ! Copy over string buffer to a rank 1 array - str_tmp(1) = buffer - - ! Write the variable dataset - call h5dwrite_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace, xfer_prp=plist) - - ! Close all - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - call h5pclose_f(plist, hdf5_err) - - end subroutine hdf5_write_string_parallel - -!=============================================================================== -! HDF5_READ_STRING_PARALLEL reads string data in parallel -!=============================================================================== - - subroutine hdf5_read_string_parallel(group, name, buffer, length, collect) - - integer(HID_T), intent(in) :: group ! name of group - character(*), intent(in) :: name ! name of data - character(*), intent(inout) :: buffer ! read data to here - integer, intent(in) :: length ! length of string - logical, intent(in) :: collect ! collective I/O - - character(len=length), dimension(1) :: str_tmp - - ! Fortran 2003 implementation not compatible with IBM Feb 2013 compiler -! type(c_ptr), dimension(1), target :: buf_ptr -! character(len=length, kind=c_char), pointer :: chr_ptr -! f_ptr = c_loc(buf_ptr(1)) -! call h5dread_f(dset, H5T_STRING, f_ptr, hdf5_err, xfer_prp=plist) -! call c_f_pointer(buf_ptr(1), chr_ptr) -! buffer = chr_ptr -! nullify(chr_ptr) - - ! Create property list for independent or collective read - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - - ! Set independent or collective option - if (collect) then - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - else - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_INDEPENDENT_F, hdf5_err) - end if - - ! Open dataset - call h5dopen_f(group, name, dset, hdf5_err) - - ! Get dataspace to read + ! Get the individual local proc dataspace call h5dget_space_f(dset, dspace, hdf5_err) - ! Set dimensions - dims2 = (/length, 1/) - dims1(1) = length + ! Select hyperslab for this dataspace + offset(1) = work_index(rank) + call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) - ! Read in the data - call h5dread_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace, xfer_prp = plist) + ! Set up the property list for parallel writing + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - ! Copy over buffer - buffer = str_tmp(1) + ! Set up pointer to data + f_ptr = c_loc(source_bank) - ! Close dataset and property list + ! Write data to file in parallel + call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & + file_space_id=dspace, mem_space_id=memspace, & + xfer_prp=plist) + + ! Close all ids + call h5sclose_f(dspace, hdf5_err) + call h5sclose_f(memspace, hdf5_err) call h5dclose_f(dset, hdf5_err) call h5pclose_f(plist, hdf5_err) - end subroutine hdf5_read_string_parallel +#else + + ! Set size + dims(1) = work + + ! Create dataspace + call h5screate_simple_f(1, dims, dspace, hdf5_err) + + ! Create dataset + call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, & + dspace, dset, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Write dataset to file + call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err) + + ! Close all ids + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) #endif + end subroutine write_source_bank + +!=============================================================================== +! READ_SOURCE_BANK reads OpenMC source_bank data +!=============================================================================== + + subroutine read_source_bank(group_id) + use bank_header, only: Bank + use global, only: work, source_bank + + integer(HID_T), intent(in) :: group_id + + integer :: hdf5_err + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data space handle + integer(HID_T) :: memspace ! memory space handle + integer(HSIZE_T) :: dims(1) + type(c_ptr) :: f_ptr +#ifdef PHDF5 + integer(HSIZE_T) :: offset(1) ! offset of data +#endif + +#ifdef PHDF5 + + ! Open the dataset + call h5dopen_f(group_id, "source_bank", dset, hdf5_err) + + ! Create another data space but for each proc individually + dims(1) = work + call h5screate_simple_f(1, dims, memspace, hdf5_err) + + ! Get the individual local proc dataspace + call h5dget_space_f(dset, dspace, hdf5_err) + + ! Select hyperslab for this dataspace + offset(1) = work_index(rank) + call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) + + ! Set up the property list for parallel writing + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Read data from file in parallel + call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & + file_space_id=dspace, mem_space_id=memspace, & + xfer_prp=plist) + + ! Close all ids + call h5sclose_f(dspace, hdf5_err) + call h5sclose_f(memspace, hdf5_err) + call h5dclose_f(dset, hdf5_err) + call h5pclose_f(plist, hdf5_err) + +#else + + ! Open dataset + call h5dopen_f(group_id, "source_bank", dset, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Read dataset from file + call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err) + + ! Close all ids + call h5dclose_f(dset, hdf5_err) + +#endif + + end subroutine read_source_bank + + function using_mpio_device(obj_id) result(mpio) + integer(HID_T), intent(in) :: obj_id + logical :: mpio + + integer :: hdf5_err + integer :: driver + integer(HID_T) :: file_id + integer(HID_T) :: fapl_id + + ! Determine file that this object is part of + call h5iget_file_id_f(obj_id, file_id, hdf5_err) + + ! Get file access property list + call h5fget_access_plist_f(file_id, fapl_id, hdf5_err) + + ! Get low-level driver identifier + call h5pget_driver_f(fapl_id, driver, hdf5_err) + + ! Close file access property list access + call h5pclose_f(fapl_id, hdf5_err) + + ! Close file access -- note that this only decreases the reference count so + ! that the file is not actually closed + call h5fclose_f(file_id, hdf5_err) + + mpio = (driver == H5FD_MPIO_F) + end function using_mpio_device + end module hdf5_interface diff --git a/src/tally_header.F90 b/src/tally_header.F90 index d20c3fea20..ca4e25fd86 100644 --- a/src/tally_header.F90 +++ b/src/tally_header.F90 @@ -2,6 +2,7 @@ module tally_header use constants, only: NONE, N_FILTER_TYPES use trigger_header, only: TriggerObject + use, intrinsic :: ISO_C_BINDING implicit none @@ -39,10 +40,10 @@ module tally_header ! TALLYRESULT provides accumulation of results in a particular tally bin !=============================================================================== - type TallyResult - real(8) :: value = 0. - real(8) :: sum = 0. - real(8) :: sum_sq = 0. + type, bind(C) :: TallyResult + real(C_DOUBLE) :: value = 0. + real(C_DOUBLE) :: sum = 0. + real(C_DOUBLE) :: sum_sq = 0. end type TallyResult !=============================================================================== From 2f18e4b57ec3e2216f85e463e0d795647ffa675e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Sep 2015 09:20:47 +0700 Subject: [PATCH 050/519] Refactored rest of code to use new HDF5_interface API --- src/finalize.F90 | 11 +- src/hdf5_interface.F90 | 222 +--- src/hdf5_summary.F90 | 814 +++++++-------- src/initialize.F90 | 313 +++--- src/output_interface.F90 | 1725 -------------------------------- src/particle_restart.F90 | 53 +- src/particle_restart_write.F90 | 42 +- src/source.F90 | 93 +- src/state_point.F90 | 828 ++++++++------- src/track_output.F90 | 53 +- 10 files changed, 1146 insertions(+), 3008 deletions(-) delete mode 100644 src/output_interface.F90 diff --git a/src/finalize.F90 b/src/finalize.F90 index b795cdb4f2..86100d1950 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -9,7 +9,8 @@ module finalize use message_passing #endif - use hdf5_interface, only: h5tclose_f, h5close_f, hdf5_err + use hdf5_interface, only: hdf5_bank_t, hdf5_tallyresult_t + use hdf5, only: h5tclose_f, h5close_f implicit none @@ -22,8 +23,10 @@ contains subroutine finalize_run() + integer :: hdf5_err + ! Start finalization timer - call time_finalize % start() + call time_finalize%start() if (run_mode /= MODE_PLOTTING .and. run_mode /= MODE_PARTICLE) then ! Calculate statistics for tallies and write to tallies.out @@ -37,8 +40,8 @@ contains end if ! Stop timers and show timing statistics - call time_finalize % stop() - call time_total % stop() + call time_finalize%stop() + call time_total%stop() if (master .and. (run_mode /= MODE_PLOTTING .and. & run_mode /= MODE_PARTICLE)) then call print_runtime() diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 041e948ff0..1684c352b7 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -64,10 +64,9 @@ module hdf5_interface public :: file_create public :: file_open public :: file_close + public :: create_group public :: open_group public :: close_group - public :: write_source_bank - public :: read_source_bank public :: write_attribute_string contains @@ -243,7 +242,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -287,9 +288,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -344,7 +346,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -404,9 +408,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -461,7 +466,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -521,9 +528,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -578,7 +586,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -638,9 +648,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -695,7 +706,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -755,9 +768,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -795,7 +809,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -839,9 +855,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -896,7 +913,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -956,9 +975,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1013,7 +1033,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -1073,9 +1095,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1130,7 +1153,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -1190,9 +1215,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1247,7 +1273,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -1307,9 +1335,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1347,7 +1376,9 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr @@ -1391,9 +1422,10 @@ contains integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1432,12 +1464,13 @@ contains integer :: n integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle integer(HSIZE_T) :: dims1(1) integer(HSIZE_T) :: dims2(2) - type(c_ptr) :: f_ptr character(len=len_trim(buffer)), dimension(1) :: str_tmp ! Set up collective vs. independent I/O @@ -1492,12 +1525,13 @@ contains integer :: n integer :: hdf5_err integer :: data_xfer_mode +#ifdef PHDF5 integer(HID_T) :: plist ! property list +#endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle integer(HSIZE_T) :: dims1(1) integer(HSIZE_T) :: dims2(2) - type(c_ptr) :: f_ptr character(len=len_trim(buffer)), dimension(1) :: str_tmp ! Set up collective vs. independent I/O @@ -1673,164 +1707,6 @@ contains call h5dclose_f(dset, hdf5_err) end subroutine read_tally_result_2D_explicit -!=============================================================================== -! WRITE_SOURCE_BANK writes OpenMC source_bank data -!=============================================================================== - - subroutine write_source_bank(group_id) - use bank_header, only: Bank - use global, only: n_particles, work, source_bank - - integer(HID_T), intent(in) :: group_id - - integer :: hdf5_err - integer :: data_xfer_mode - integer(HID_T) :: plist ! property list - integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data or file space handle - integer(HID_T) :: memspace ! memory space handle - integer(HSIZE_T) :: dims(1) - type(c_ptr) :: f_ptr -#ifdef PHDF5 - integer(HSIZE_T) :: offset(1) ! source data offset -#endif - -#ifdef PHDF5 - ! Set size of total dataspace for all procs and rank - dims(1) = n_particles - call h5screate_simple_f(1, dims, dspace, hdf5_err) - call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, dspace, dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - - ! Create another data space but for each proc individually - dims(1) = work - call h5screate_simple_f(rank, dims, memspace, hdf5_err) - - ! Get the individual local proc dataspace - call h5dget_space_f(dset, dspace, hdf5_err) - - ! Select hyperslab for this dataspace - offset(1) = work_index(rank) - call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) - - ! Set up the property list for parallel writing - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank) - - ! Write data to file in parallel - call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & - file_space_id=dspace, mem_space_id=memspace, & - xfer_prp=plist) - - ! Close all ids - call h5sclose_f(dspace, hdf5_err) - call h5sclose_f(memspace, hdf5_err) - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - -#else - - ! Set size - dims(1) = work - - ! Create dataspace - call h5screate_simple_f(1, dims, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, & - dspace, dset, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank) - - ! Write dataset to file - call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err) - - ! Close all ids - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - -#endif - - end subroutine write_source_bank - -!=============================================================================== -! READ_SOURCE_BANK reads OpenMC source_bank data -!=============================================================================== - - subroutine read_source_bank(group_id) - use bank_header, only: Bank - use global, only: work, source_bank - - integer(HID_T), intent(in) :: group_id - - integer :: hdf5_err - integer :: data_xfer_mode - integer(HID_T) :: plist ! property list - integer(HID_T) :: dset ! data set handle - integer(HID_T) :: dspace ! data space handle - integer(HID_T) :: memspace ! memory space handle - integer(HSIZE_T) :: dims(1) - type(c_ptr) :: f_ptr -#ifdef PHDF5 - integer(HSIZE_T) :: offset(1) ! offset of data -#endif - -#ifdef PHDF5 - - ! Open the dataset - call h5dopen_f(group_id, "source_bank", dset, hdf5_err) - - ! Create another data space but for each proc individually - dims(1) = work - call h5screate_simple_f(1, dims, memspace, hdf5_err) - - ! Get the individual local proc dataspace - call h5dget_space_f(dset, dspace, hdf5_err) - - ! Select hyperslab for this dataspace - offset(1) = work_index(rank) - call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) - - ! Set up the property list for parallel writing - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank) - - ! Read data from file in parallel - call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & - file_space_id=dspace, mem_space_id=memspace, & - xfer_prp=plist) - - ! Close all ids - call h5sclose_f(dspace, hdf5_err) - call h5sclose_f(memspace, hdf5_err) - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - -#else - - ! Open dataset - call h5dopen_f(group_id, "source_bank", dset, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank) - - ! Read dataset from file - call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err) - - ! Close all ids - call h5dclose_f(dset, hdf5_err) - -#endif - - end subroutine read_source_bank - function using_mpio_device(obj_id) result(mpio) integer(HID_T), intent(in) :: obj_id logical :: mpio diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index a9dab46f50..e8f566c434 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -6,16 +6,16 @@ module hdf5_summary use geometry_header, only: Cell, Surface, Universe, Lattice, RectLattice, & &HexLattice use global + use hdf5_interface use material_header, only: Material use mesh_header, only: StructuredMesh - use output_interface use output, only: time_stamp use string, only: to_str use tally_header, only: TallyObject - implicit none + use hdf5 - type(BinaryOutput) :: su + implicit none contains @@ -25,48 +25,48 @@ contains subroutine hdf5_write_summary() - character(MAX_FILE_LEN) :: filename = "summary.h5" + integer(HID_T) :: file_id ! Create a new file using default properties. - call su % file_create(filename) + file_id = file_create("summary.h5") ! Write header information - call hdf5_write_header() + call hdf5_write_header(file_id) ! Write eigenvalue information if (run_mode == MODE_EIGENVALUE) then ! Write number of particles - call su % write_data(n_particles, "n_particles") + call write_dataset(file_id, "n_particles", n_particles) ! Use H5LT interface to write n_batches, n_inactive, and n_active - call su % write_data(n_batches, "n_batches") - call su % write_data(n_inactive, "n_inactive") - call su % write_data(n_active, "n_active") - call su % write_data(gen_per_batch, "gen_per_batch") + call write_dataset(file_id, "n_batches", n_batches) + call write_dataset(file_id, "n_inactive", n_inactive) + call write_dataset(file_id, "n_active", n_active) + call write_dataset(file_id, "gen_per_batch", gen_per_batch) ! Add description of each variable - call su % write_attribute_string("n_particles", & + call write_attribute_string(file_id, "n_particles", & "description", "Number of particles per generation") - call su % write_attribute_string("n_batches", & + call write_attribute_string(file_id, "n_batches", & "description", "Total number of batches") - call su % write_attribute_string("n_inactive", & + call write_attribute_string(file_id, "n_inactive", & "description", "Number of inactive batches") - call su % write_attribute_string("n_active", & + call write_attribute_string(file_id, "n_active", & "description", "Number of active batches") - call su % write_attribute_string("gen_per_batch", & + call write_attribute_string(file_id, "gen_per_batch", & "description", "Number of generations per batch") end if - call hdf5_write_geometry() - call hdf5_write_materials() - call hdf5_write_nuclides() + call hdf5_write_geometry(file_id) + call hdf5_write_materials(file_id) + call hdf5_write_nuclides(file_id) if (n_tallies > 0) then - call hdf5_write_tallies() + call hdf5_write_tallies(file_id) end if ! Terminate access to the file. - call su % file_close() + call file_close(file_id) end subroutine hdf5_write_summary @@ -74,19 +74,20 @@ contains ! HDF5_WRITE_HEADER !=============================================================================== - subroutine hdf5_write_header() + subroutine hdf5_write_header(file_id) + integer(HID_T), intent(in) :: file_id ! Write version information - call su % write_data(VERSION_MAJOR, "version_major") - call su % write_data(VERSION_MINOR, "version_minor") - call su % write_data(VERSION_RELEASE, "version_release") + call write_dataset(file_id, "version_major", VERSION_MAJOR) + call write_dataset(file_id, "version_minor", VERSION_MINOR) + call write_dataset(file_id, "version_release", VERSION_RELEASE) ! Write current date and time - call su % write_data(time_stamp(), "date_and_time") + call write_dataset(file_id, "date_and_time", time_stamp()) ! Write MPI information - call su % write_data(n_procs, "n_procs") - call su % write_attribute_string("n_procs", "description", & + call write_dataset(file_id, "n_procs", n_procs) + call write_attribute_string(file_id, "n_procs", "description", & "Number of MPI processes") end subroutine hdf5_write_header @@ -95,782 +96,659 @@ contains ! HDF5_WRITE_GEOMETRY !=============================================================================== - subroutine hdf5_write_geometry() + subroutine hdf5_write_geometry(file_id) + integer(HID_T), intent(in) :: file_id integer :: i, j, k, m integer, allocatable :: lattice_universes(:,:,:) - type(Cell), pointer :: c => null() - type(Surface), pointer :: s => null() - type(Universe), pointer :: u => null() - class(Lattice), pointer :: lat => null() + integer(HID_T) :: geom_group + integer(HID_T) :: cells_group, cell_group + integer(HID_T) :: surfaces_group, surface_group + integer(HID_T) :: universes_group, univ_group + integer(HID_T) :: lattices_group, lattice_group + type(Cell), pointer :: c + type(Surface), pointer :: s + type(Universe), pointer :: u + class(Lattice), pointer :: lat ! Use H5LT interface to write number of geometry objects - call su % write_data(n_cells, "n_cells", group="geometry") - call su % write_data(n_surfaces, "n_surfaces", group="geometry") - call su % write_data(n_universes, "n_universes", group="geometry") - call su % write_data(n_lattices, "n_lattices", group="geometry") + geom_group = create_group(file_id, "geometry") + call write_dataset(geom_group, "n_cells", n_cells) + call write_dataset(geom_group, "n_surfaces", n_surfaces) + call write_dataset(geom_group, "n_universes", n_universes) + call write_dataset(geom_group, "n_lattices", n_lattices) ! ========================================================================== ! WRITE INFORMATION ON CELLS ! Create a cell group (nothing directly written in this group) then close - call su % open_group("geometry/cells") - call su % close_group() + cells_group = create_group(geom_group, "cells") ! Write information on each cell CELL_LOOP: do i = 1, n_cells c => cells(i) + cell_group = create_group(cells_group, "cell " // trim(to_str(c%id))) ! Write internal OpenMC index for this cell - call su % write_data(i, "index", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "index", i) ! Write name for this cell - call su % write_data(c % name, "name", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "name", c%name) ! Write universe for this cell - call su % write_data(universes(c % universe) % id, "universe", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "universe", universes(c%universe)%id) ! Write information on what fills this cell - select case (c % type) + select case (c%type) case (CELL_NORMAL) - call su % write_data("normal", "fill_type", & - group="geometry/cells/cell " // trim(to_str(c % id))) - if (c % material == MATERIAL_VOID) then - call su % write_data(-1, "material", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "fill_type", "normal") + if (c%material == MATERIAL_VOID) then + call write_dataset(cell_group, "material", -1) else - call su % write_data(materials(c % material) % id, "material", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "material", materials(c%material)%id) end if case (CELL_FILL) - call su % write_data("universe", "fill_type", & - group="geometry/cells/cell " // trim(to_str(c % id))) - call su % write_data(universes(c % fill) % id, "fill", & - group="geometry/cells/cell " // trim(to_str(c % id))) - - call su % write_data(size(c % offset), "maps", & - group="geometry/cells/cell " // trim(to_str(c % id))) - if (size(c % offset) > 0) then - call su % write_data(c % offset, "offset", & - length=size(c % offset), & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "fill_type", "universe") + call write_dataset(cell_group, "fill", universes(c%fill)%id) + call write_dataset(cell_group, "maps", size(c%offset)) + if (size(c%offset) > 0) then + call write_dataset(cell_group, "offset", c%offset) end if - if (allocated(c % translation)) then - call su % write_data(1, "translated", & - group="geometry/cells/cell " // trim(to_str(c % id))) - call su % write_data(c % translation, "translation", length=3, & - group="geometry/cells/cell " // trim(to_str(c % id))) + if (allocated(c%translation)) then + call write_dataset(cell_group, "translated", 1) + call write_dataset(cell_group, "translation", c%translation) else - call su % write_data(0, "translated", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "translated", 0) end if - if (allocated(c % rotation)) then - call su % write_data(1, "rotated", & - group="geometry/cells/cell " // trim(to_str(c % id))) - call su % write_data(c % rotation, "rotation", length=3, & - group="geometry/cells/cell " // trim(to_str(c % id))) + if (allocated(c%rotation)) then + call write_dataset(cell_group, "rotated", 1) + call write_dataset(cell_group, "rotation", c%rotation) else - call su % write_data(0, "rotated", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "rotated", 0) end if case (CELL_LATTICE) - call su % write_data("lattice", "fill_type", & - group="geometry/cells/cell " // trim(to_str(c % id))) - call su % write_data(lattices(c % fill) % obj % id, "lattice", & - group="geometry/cells/cell " // trim(to_str(c % id))) + call write_dataset(cell_group, "fill_type", "lattice") + call write_dataset(cell_group, "lattice", lattices(c%fill)%obj%id) end select ! Write list of bounding surfaces - if (c % n_surfaces > 0) then - call su % write_data(c % surfaces, "surfaces", length= c % n_surfaces, & - group="geometry/cells/cell " // trim(to_str(c % id))) + if (c%n_surfaces > 0) then + call write_dataset(cell_group, "surfaces", c%surfaces) end if + call close_group(cell_group) end do CELL_LOOP + call close_group(cells_group) + ! ========================================================================== ! WRITE INFORMATION ON SURFACES - ! Create surfaces group (nothing directly written here) then close - call su % open_group("geometry/surfaces") - call su % close_group() + ! Create surfaces group + surfaces_group = create_group(file_id, "surfaces") ! Write information on each surface SURFACE_LOOP: do i = 1, n_surfaces s => surfaces(i) + surface_group = create_group(surfaces_group, "surface " // & + trim(to_str(s%id))) ! Write internal OpenMC index for this surface - call su % write_data(i, "index", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "index", i) ! Write name for this surface - call su % write_data(s % name, "name", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "name", s%name) ! Write surface type - select case (s % type) + select case (s%type) case (SURF_PX) - call su % write_data("X Plane", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "X Plane") case (SURF_PY) - call su % write_data("Y Plane", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Y Plane") case (SURF_PZ) - call su % write_data("Z Plane", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Z Plane") case (SURF_PLANE) - call su % write_data("Plane", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Plane") case (SURF_CYL_X) - call su % write_data("X Cylinder", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "X Cylinder") case (SURF_CYL_Y) - call su % write_data("Y Cylinder", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Y Cylinder") case (SURF_CYL_Z) - call su % write_data("Z Cylinder", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Z Cylinder") case (SURF_SPHERE) - call su % write_data("Sphere", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Sphere") case (SURF_CONE_X) - call su % write_data("X Cone", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "X Cone") case (SURF_CONE_Y) - call su % write_data("Y Cone", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Y Cone") case (SURF_CONE_Z) - call su % write_data("Z Cone", "type", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "type", "Z Cone") end select ! Write coefficients for surface - call su % write_data(s % coeffs, "coefficients", length=size(s % coeffs), & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "coefficients", s%coeffs) ! Write positive neighbors - if (allocated(s % neighbor_pos)) then - call su % write_data(s % neighbor_pos, "neighbors_positive", & - length=size(s % neighbor_pos), & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + if (allocated(s%neighbor_pos)) then + call write_dataset(surface_group, "neighbors_positive", s%neighbor_pos) end if ! Write negative neighbors - if (allocated(s % neighbor_neg)) then - call su % write_data(s % neighbor_neg, "neighbors_negative", & - length=size(s % neighbor_neg), & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + if (allocated(s%neighbor_neg)) then + call write_dataset(surface_group, "neighbors_negative", s%neighbor_neg) end if ! Write boundary condition - select case (s % bc) + select case (s%bc) case (BC_TRANSMIT) - call su % write_data("transmission", "boundary_condition", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "boundary_condition", "transmission") case (BC_VACUUM) - call su % write_data("vacuum", "boundary_condition", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "boundary_condition", "vacuum") case (BC_REFLECT) - call su % write_data("reflective", "boundary_condition", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "boundary_condition", "reflective") case (BC_PERIODIC) - call su % write_data("periodic", "boundary_condition", & - group="geometry/surfaces/surface " // trim(to_str(s % id))) + call write_dataset(surface_group, "boundary_condition", "periodic") end select + call close_group(surface_group) end do SURFACE_LOOP + call close_group(surfaces_group) + ! ========================================================================== ! WRITE INFORMATION ON UNIVERSES ! Create universes group (nothing directly written here) then close - call su % open_group("geometry/universes") - call su % close_group() + universes_group = create_group(geom_group, "universes") ! Write information on each universe UNIVERSE_LOOP: do i = 1, n_universes u => universes(i) + univ_group = create_group(universes_group, "universe " // & + trim(to_str(u%id))) ! Write internal OpenMC index for this universe - call su % write_data(i, "index", & - group="geometry/universes/universe " // trim(to_str(u % id))) + call write_dataset(univ_group, "index", i) ! Write list of cells in this universe - if (u % n_cells > 0) then - call su % write_data(u % cells, "cells", length=u % n_cells, & - group="geometry/universes/universe " // trim(to_str(u % id))) - end if + if (u%n_cells > 0) call write_dataset(univ_group, "cells", u%cells) + call close_group(univ_group) end do UNIVERSE_LOOP + call close_group(universes_group) + ! ========================================================================== ! WRITE INFORMATION ON LATTICES ! Create lattices group (nothing directly written here) then close - call su % open_group("geometry/lattices") - call su % close_group() + lattices_group = create_group(geom_group, "lattices") ! Write information on each lattice LATTICE_LOOP: do i = 1, n_lattices - lat => lattices(i) % obj + lat => lattices(i)%obj + lattice_group = create_group(lattices_group, "lattice " // trim(to_str(lat%id))) ! Write internal OpenMC index for this lattice - call su % write_data(i, "index", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "index", i) ! Write name for this lattice - call su % write_data(lat % name, "name", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "name", lat%name) ! Write lattice type select type (lat) type is (RectLattice) ! Write lattice type. - call su % write_data("rectangular", "type", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "type", "rectangular") ! Write lattice dimensions, lower left corner, and pitch - call su % write_data(lat % n_cells, "dimension", length=3, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "dimension", lat%n_cells) + call write_dataset(lattice_group, "lower_left", lat%lower_left) + call write_dataset(lattice_group, "pitch", lat%pitch) - if (lat % is_3d) then - call su % write_data(lat % lower_left, "lower_left", length=3, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - else - call su % write_data(lat % lower_left, "lower_left", length=2, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - end if + call write_dataset(lattice_group, "outer", lat%outer) + call write_dataset(lattice_group, "offset_size", size(lat%offset)) + call write_dataset(lattice_group, "maps", size(lat%offset,1)) - if (lat % is_3d) then - call su % write_data(lat % pitch, "pitch", length=3, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - else - call su % write_data(lat % pitch, "pitch", length=2, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - end if - - call su % write_data(lat % outer, "outer", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - call su % write_data(size(lat % offset), "offset_size", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - call su % write_data(size(lat % offset,1), "maps", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - - if (size(lat % offset) > 0) then - call su % write_data(lat % offset, "offsets", & - length=shape(lat % offset), & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + if (size(lat%offset) > 0) then + call write_dataset(lattice_group, "offsets", lat%offset) end if ! Write lattice universes. - allocate(lattice_universes(lat % n_cells(1), lat % n_cells(2), & - &lat % n_cells(3))) - do j = 1, lat % n_cells(1) - do k = 1, lat % n_cells(2) - do m = 1, lat % n_cells(3) - lattice_universes(j,k,m) = universes(lat % universes(j,k,m)) % id + allocate(lattice_universes(lat%n_cells(1), lat%n_cells(2), & + &lat%n_cells(3))) + do j = 1, lat%n_cells(1) + do k = 1, lat%n_cells(2) + do m = 1, lat%n_cells(3) + lattice_universes(j,k,m) = universes(lat%universes(j,k,m))%id end do end do end do - call su % write_data(lattice_universes, "universes", & - length=lat % n_cells, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "universes", lattice_universes) deallocate(lattice_universes) type is (HexLattice) ! Write lattice type. - call su % write_data("hexagonal", "type", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "type", "hexagonal") ! Write number of lattice cells. - call su % write_data(lat % n_rings, "n_rings", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - call su % write_data(lat % n_axial, "n_axial", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "n_rings", lat%n_rings) + call write_dataset(lattice_group, "n_axial", lat%n_axial) ! Write lattice center, pitch and outer universe. - if (lat % is_3d) then - call su % write_data(lat % center, "center", length=3, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - else - call su % write_data(lat % center, "center", length=2, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - end if + call write_dataset(lattice_group, "center", lat%center) + call write_dataset(lattice_group, "pitch", lat%pitch) - if (lat % is_3d) then - call su % write_data(lat % pitch, "pitch", length=2, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - else - call su % write_data(lat % pitch, "pitch", length=1, & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - end if + call write_dataset(lattice_group, "outer", lat%outer) + call write_dataset(lattice_group, "offset_size", size(lat%offset)) + call write_dataset(lattice_group, "maps", size(lat%offset,1)) - call su % write_data(lat % outer, "outer", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - call su % write_data(size(lat % offset), "offset_size", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - call su % write_data(size(lat % offset,1), "maps", & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) - - if (size(lat % offset) > 0) then - call su % write_data(lat % offset, "offsets", & - length=shape(lat % offset), & - group="geometry/lattices/lattice " // trim(to_str(lat % id))) + if (size(lat%offset) > 0) then + call write_dataset(lattice_group, "offsets", lat%offset) end if ! Write lattice universes. - allocate(lattice_universes(2*lat % n_rings - 1, 2*lat % n_rings - 1, & - &lat % n_axial)) - do m = 1, lat % n_axial - do k = 1, 2*lat % n_rings - 1 - do j = 1, 2*lat % n_rings - 1 - if (j + k < lat % n_rings + 1) then + allocate(lattice_universes(2*lat%n_rings - 1, 2*lat%n_rings - 1, & + &lat%n_axial)) + do m = 1, lat%n_axial + do k = 1, 2*lat%n_rings - 1 + do j = 1, 2*lat%n_rings - 1 + if (j + k < lat%n_rings + 1) then ! This array position is never used; put a -1 to indicate this lattice_universes(j,k,m) = -1 cycle - else if (j + k > 3*lat % n_rings - 1) then + else if (j + k > 3*lat%n_rings - 1) then ! This array position is never used; put a -1 to indicate this lattice_universes(j,k,m) = -1 cycle end if - lattice_universes(j,k,m) = universes(lat % universes(j,k,m)) % id + lattice_universes(j,k,m) = universes(lat%universes(j,k,m))%id end do end do end do - call su % write_data(lattice_universes, "universes", & - &length=(/2*lat % n_rings-1, 2*lat % n_rings-1, lat % n_axial/), & - &group="geometry/lattices/lattice " // trim(to_str(lat % id))) + call write_dataset(lattice_group, "universes", lattice_universes) deallocate(lattice_universes) end select + + call close_group(lattice_group) end do LATTICE_LOOP + call close_group(lattices_group) + call close_group(geom_group) + end subroutine hdf5_write_geometry !=============================================================================== ! HDF5_WRITE_MATERIALS !=============================================================================== - subroutine hdf5_write_materials() + subroutine hdf5_write_materials(file_id) + integer(HID_T), intent(in) :: file_id integer :: i integer :: j integer, allocatable :: zaids(:) - type(Material), pointer :: m => null() + integer(HID_T) :: materials_group + integer(HID_T) :: material_group + integer(HID_T) :: sab_group + type(Material), pointer :: m - ! Use H5LT interface to write number of materials - call su % write_data(n_materials, "n_materials", group="materials") + materials_group = create_group(file_id, "materials") + + ! write number of materials + call write_dataset(file_id, "n_materials", n_materials) ! Write information on each material do i = 1, n_materials m => materials(i) + material_group = create_group(materials_group, "material " // & + trim(to_str(m%id))) ! Write internal OpenMC index for this material - call su % write_data(i, "index", & - group="materials/material " // trim(to_str(m % id))) + call write_dataset(material_group, "index", i) ! Write name for this material - call su % write_data(m % name, "name", & - group="materials/material " // trim(to_str(m % id))) + call write_dataset(material_group, "name", m%name) ! Write atom density with units - call su % write_data(m % density, "atom_density", & - group="materials/material " // trim(to_str(m % id))) - call su % write_attribute_string("atom_density", "units", "atom/b-cm", & - group="materials/material " // trim(to_str(m % id))) + call write_dataset(material_group, "atom_density", m%density) + call write_attribute_string(material_group, "atom_density", "units", & + "atom/b-cm") ! Copy ZAID for each nuclide to temporary array - allocate(zaids(m % n_nuclides)) - do j = 1, m % n_nuclides - zaids(j) = nuclides(m % nuclide(j)) % zaid + allocate(zaids(m%n_nuclides)) + do j = 1, m%n_nuclides + zaids(j) = nuclides(m%nuclide(j))%zaid end do ! Write temporary array to 'nuclides' - call su % write_data(zaids, "nuclides", length=m % n_nuclides, & - group="materials/material " // trim(to_str(m % id))) + call write_dataset(material_group, "nuclides", zaids) ! Deallocate temporary array deallocate(zaids) ! Write atom densities - call su % write_data(m % atom_density, "nuclide_densities", & - length=m % n_nuclides, & - group="materials/material " // trim(to_str(m % id))) + call write_dataset(material_group, "nuclide_densities", m%atom_density) ! Write S(a,b) information if present - call su % write_data(m % n_sab, "n_sab", & - group="materials/material " // trim(to_str(m % id))) + call write_dataset(material_group, "n_sab", m%n_sab) - if (m % n_sab > 0) then - call su % write_data(m % i_sab_nuclides, "i_sab_nuclides", & - length=m % n_sab, & - group="materials/material " // trim(to_str(m % id))) - call su % write_data(m % i_sab_tables, "i_sab_tables", & - length=m % n_sab, & - group="materials/material " // trim(to_str(m % id))) + if (m%n_sab > 0) then + call write_dataset(material_group, "i_sab_nuclides", m%i_sab_nuclides) + call write_dataset(material_group, "i_sab_tables", m%i_sab_tables) - do j = 1, m % n_sab - call su % write_data(m % sab_names(j), to_str(j), & - group="materials/material " // & - trim(to_str(m % id)) // "/sab_tables") + sab_group = create_group(material_group, "sab_tables") + do j = 1, m%n_sab + call write_dataset(sab_group, to_str(j), m%sab_names(j)) end do + call close_group(sab_group) end if + call close_group(material_group) end do + call close_group(materials_group) + end subroutine hdf5_write_materials !=============================================================================== ! HDF5_WRITE_TALLIES !=============================================================================== - subroutine hdf5_write_tallies() + subroutine hdf5_write_tallies(file_id) + integer(HID_T), intent(in) :: file_id integer :: i, j integer, allocatable :: temp_array(:) ! nuclide bin array - type(StructuredMesh), pointer :: m => null() - type(TallyObject), pointer :: t => null() + integer(HID_T) :: tallies_group + integer(HID_T) :: mesh_group + integer(HID_T) :: tally_group + integer(HID_T) :: filter_group + type(StructuredMesh), pointer :: m + type(TallyObject), pointer :: t + + tallies_group = create_group(file_id, "tallies") ! Write total number of meshes - call su % write_data(n_meshes, "n_meshes", group="tallies") + call write_dataset(tallies_group, "n_meshes", n_meshes) ! Write information for meshes MESH_LOOP: do i = 1, n_meshes m => meshes(i) + mesh_group = create_group(tallies_group, "mesh " // trim(to_str(m%id))) ! Write type and number of dimensions - call su % write_data(m % type, "type", & - group="tallies/mesh " // trim(to_str(m % id))) - - call su % write_data(m % n_dimension, "n_dimension", & - group="tallies/mesh " // trim(to_str(m % id))) + call write_dataset(mesh_group, "type", m%type) + call write_dataset(mesh_group, "n_dimension", m%n_dimension) ! Write mesh information - call su % write_data(m % dimension, "dimension", & - length=m % n_dimension, & - group="tallies/mesh " // trim(to_str(m % id))) - call su % write_data(m % lower_left, "lower_left", & - length=m % n_dimension, & - group="tallies/mesh " // trim(to_str(m % id))) - call su % write_data(m % upper_right, "upper_right", & - length=m % n_dimension, & - group="tallies/mesh " // trim(to_str(m % id))) - call su % write_data(m % width, "width", & - length=m % n_dimension, & - group="tallies/mesh " // trim(to_str(m % id))) + call write_dataset(mesh_group, "dimension", m%dimension) + call write_dataset(mesh_group, "lower_left", m%lower_left) + call write_dataset(mesh_group, "upper_right", m%upper_right) + call write_dataset(mesh_group, "width", m%width) + call close_group(mesh_group) end do MESH_LOOP ! Write number of tallies - call su % write_data(n_tallies, "n_tallies", group="tallies") + call write_dataset(tallies_group, "n_tallies", n_tallies) TALLY_METADATA: do i = 1, n_tallies ! Get pointer to tally t => tallies(i) + tally_group = create_group(tallies_group, "tally " // trim(to_str(t%id))) ! Write the name for this tally - call su % write_data(len(t % name), "name_size", & - group="tallies/tally " // trim(to_str(t % id))) - if (len(t % name) > 0) then - call su % write_data(t % name, "name", & - group="tallies/tally " // trim(to_str(t % id))) + call write_dataset(tally_group, "name_size", len(t%name)) + if (len(t%name) > 0) then + call write_dataset(tally_group, "name", t%name) endif ! Write size of each tally - call su % write_data(t % total_score_bins, "total_score_bins", & - group="tallies/tally " // trim(to_str(t % id))) - call su % write_data(t % total_filter_bins, "total_filter_bins", & - group="tallies/tally " // trim(to_str(t % id))) + call write_dataset(tally_group, "total_score_bins", t%total_score_bins) + call write_dataset(tally_group, "total_filter_bins", t%total_filter_bins) ! Write number of filters - call su % write_data(t % n_filters, "n_filters", & - group="tallies/tally " // trim(to_str(t % id))) + call write_dataset(tally_group, "n_filters", t%n_filters) + + FILTER_LOOP: do j = 1, t%n_filters + filter_group = create_group(tally_group, "filter " // trim(to_str(j))) - FILTER_LOOP: do j = 1, t % n_filters ! Write type of filter - call su % write_data(t % filters(j) % type, "type", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type", t%filters(j)%type) ! Write number of bins for this filter - call su % write_data(t % filters(j) % n_bins, "n_bins", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "n_bins", t%filters(j)%n_bins) ! Write filter bins - if (t % filters(j) % type == FILTER_ENERGYIN .or. & - t % filters(j) % type == FILTER_ENERGYOUT) then - call su % write_data(t % filters(j) % real_bins, "bins", & - length=size(t % filters(j) % real_bins), & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + if (t%filters(j)%type == FILTER_ENERGYIN .or. & + t%filters(j)%type == FILTER_ENERGYOUT) then + call write_dataset(filter_group, "bins", t%filters(j)%real_bins) else - call su % write_data(t % filters(j) % int_bins, "bins", & - length=size(t % filters(j) % int_bins), & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "bins", t%filters(j)%int_bins) end if ! Write name of type - select case (t % filters(j) % type) + select case (t%filters(j)%type) case(FILTER_UNIVERSE) - call su % write_data("universe", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "universe") case(FILTER_MATERIAL) - call su % write_data("material", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "material") case(FILTER_CELL) - call su % write_data("cell", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "cell") case(FILTER_CELLBORN) - call su % write_data("cellborn", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "cellborn") case(FILTER_SURFACE) - call su % write_data("surface", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "surface") case(FILTER_MESH) - call su % write_data("mesh", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "mesh") case(FILTER_ENERGYIN) - call su % write_data("energy", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "energy") case(FILTER_ENERGYOUT) - call su % write_data("energyout", "type_name", & - group="tallies/tally " // trim(to_str(t % id)) & - // "/filter " // trim(to_str(j))) + call write_dataset(filter_group, "type_name", "energyout") end select + call close_group(filter_group) end do FILTER_LOOP ! Write number of nuclide bins - call su % write_data(t % n_nuclide_bins, "n_nuclide_bins", & - group="tallies/tally " // trim(to_str(t % id))) + call write_dataset(tally_group, "n_nuclide_bins", t%n_nuclide_bins) ! Create temporary array for nuclide bins - allocate(temp_array(t % n_nuclide_bins)) - NUCLIDE_LOOP: do j = 1, t % n_nuclide_bins - if (t % nuclide_bins(j) > 0) then - temp_array(j) = nuclides(t % nuclide_bins(j)) % zaid + allocate(temp_array(t%n_nuclide_bins)) + NUCLIDE_LOOP: do j = 1, t%n_nuclide_bins + if (t%nuclide_bins(j) > 0) then + temp_array(j) = nuclides(t%nuclide_bins(j))%zaid else - temp_array(j) = t % nuclide_bins(j) + temp_array(j) = t%nuclide_bins(j) end if end do NUCLIDE_LOOP ! Write and deallocate nuclide bins - call su % write_data(temp_array, "nuclide_bins", length=t % n_nuclide_bins, & - group="tallies/tally " // trim(to_str(t % id))) + call write_dataset(tally_group, "nuclide_bins", temp_array) deallocate(temp_array) ! Write number of score bins - call su % write_data(t % n_score_bins, "n_score_bins", & - group="tallies/tally " // trim(to_str(t % id))) - call su % write_data(t % score_bins, "score_bins", length=t % n_score_bins, & - group="tallies/tally " // trim(to_str(t % id))) + call write_dataset(tally_group, "n_score_bins", t%n_score_bins) + call write_dataset(tally_group, "score_bins", t%score_bins) + call close_group(tally_group) end do TALLY_METADATA + call close_group(tallies_group) + end subroutine hdf5_write_tallies !=============================================================================== ! HDF5_WRITE_NUCLIDES !=============================================================================== - subroutine hdf5_write_nuclides() + subroutine hdf5_write_nuclides(file_id) + integer(HID_T), intent(in) :: file_id integer :: i, j integer :: size_total integer :: size_xs integer :: size_angle integer :: size_energy - type(Nuclide), pointer :: nuc => null() - type(Reaction), pointer :: rxn => null() - type(UrrData), pointer :: urr => null() + integer(HID_T) :: nuclides_group, nuclide_group + integer(HID_T) :: reactions_group, rxn_group + type(Nuclide), pointer :: nuc + type(Reaction), pointer :: rxn + type(UrrData), pointer :: urr - ! Use H5LT interface to write number of nuclides - call su % write_data(n_nuclides_total, "n_nuclides", group="nuclides") + nuclides_group = create_group(file_id, "nuclides") + + ! write number of nuclides + call write_dataset(nuclides_group, "n_nuclides", n_nuclides_total) ! Write information on each nuclide NUCLIDE_LOOP: do i = 1, n_nuclides_total nuc => nuclides(i) + nuclide_group = create_group(nuclides_group, nuc%name) ! Write internal OpenMC index for this nuclide - call su % write_data(i, "index", & - group="nuclides/" // trim(nuc % name)) + call write_dataset(nuclide_group, "index", i) ! Determine size of cross-sections - size_xs = (5 + nuc % n_reaction) * nuc % n_grid * 8 + size_xs = (5 + nuc%n_reaction) * nuc%n_grid * 8 size_total = size_xs ! Write some basic attributes - call su % write_data(nuc % zaid, "zaid", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(xs_listings(nuc % listing) % alias, "alias", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(nuc % awr, "awr", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(nuc % kT, "kT", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(nuc % n_grid, "n_grid", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(nuc % n_reaction, "n_reactions", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(nuc % n_fission, "n_fission", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(size_xs, "size_xs", & - group="nuclides/" // trim(nuc % name)) + call write_dataset(nuclide_group, "zaid", nuc%zaid) + call write_dataset(nuclide_group, "alias", xs_listings(nuc%listing)%alias) + call write_dataset(nuclide_group, "awr", nuc%awr) + call write_dataset(nuclide_group, "kT", nuc%kT) + call write_dataset(nuclide_group, "n_grid", nuc%n_grid) + call write_dataset(nuclide_group, "n_reactions", nuc%n_reaction) + call write_dataset(nuclide_group, "n_fission", nuc%n_fission) + call write_dataset(nuclide_group, "size_xs", size_xs) ! ======================================================================= ! WRITE INFORMATION ON EACH REACTION ! Create overall group for reactions and close it - call su % open_group("nuclides/" // trim(nuc % name) // "/reactions") - call su % close_group() + reactions_group = create_group(nuclide_group, "reactions") - RXN_LOOP: do j = 1, nuc % n_reaction + RXN_LOOP: do j = 1, nuc%n_reaction ! Information on each reaction - rxn => nuc % reactions(j) + rxn => nuc%reactions(j) + rxn_group = create_group(reactions_group, trim(reaction_name(rxn%MT))) ! Determine size of angle distribution - if (rxn % has_angle_dist) then - size_angle = rxn % adist % n_energy * 16 + size(rxn % adist % data) * 8 + if (rxn%has_angle_dist) then + size_angle = rxn%adist%n_energy * 16 + size(rxn%adist%data) * 8 else size_angle = 0 end if ! Determine size of energy distribution - if (rxn % has_energy_dist) then - size_energy = size(rxn % edist % data) * 8 + if (rxn%has_energy_dist) then + size_energy = size(rxn%edist%data) * 8 else size_energy = 0 end if ! Write information on reaction - call su % write_data(rxn % Q_value, "Q_value", & - group="nuclides/" // trim(nuc % name) // "/reactions/" // & - trim(reaction_name(rxn % MT))) - call su % write_data(rxn % multiplicity, "multiplicity", & - group="nuclides/" // trim(nuc % name) // "/reactions/" // & - trim(reaction_name(rxn % MT))) - call su % write_data(rxn % threshold, "threshold", & - group="nuclides/" // trim(nuc % name) // "/reactions/" // & - trim(reaction_name(rxn % MT))) - call su % write_data(size_angle, "size_angle", & - group="nuclides/" // trim(nuc % name) // "/reactions/" // & - trim(reaction_name(rxn % MT))) - call su % write_data(size_energy, "size_energy", & - group="nuclides/" // trim(nuc % name) // "/reactions/" // & - trim(reaction_name(rxn % MT))) + call write_dataset(rxn_group, "Q_value", rxn%Q_value) + call write_dataset(rxn_group, "multiplicity", rxn%multiplicity) + call write_dataset(rxn_group, "threshold", rxn%threshold) + call write_dataset(rxn_group, "size_angle", size_angle) + call write_dataset(rxn_group, "size_energy", size_energy) ! Accumulate data size size_total = size_total + size_angle + size_energy + + call close_group(rxn_group) end do RXN_LOOP + call close_group(reactions_group) + ! ======================================================================= ! WRITE INFORMATION ON URR PROBABILITY TABLES - if (nuc % urr_present) then - urr => nuc % urr_data - call su % write_data(urr % n_energy, "urr_n_energy", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(urr % n_prob, "urr_n_prob", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(urr % interp, "urr_interp", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(urr % inelastic_flag, "urr_inelastic", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(urr % absorption_flag, "urr_absorption", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(urr % energy(1), "urr_min_E", & - group="nuclides/" // trim(nuc % name)) - call su % write_data(urr % energy(urr % n_energy), "urr_max_E", & - group="nuclides/" // trim(nuc % name)) + if (nuc%urr_present) then + urr => nuc%urr_data + call write_dataset(nuclide_group, "urr_n_energy", urr%n_energy) + call write_dataset(nuclide_group, "urr_n_prob", urr%n_prob) + call write_dataset(nuclide_group, "urr_interp", urr%interp) + call write_dataset(nuclide_group, "urr_inelastic", urr%inelastic_flag) + call write_dataset(nuclide_group, "urr_absorption", urr%absorption_flag) + call write_dataset(nuclide_group, "urr_min_E", urr%energy(1)) + call write_dataset(nuclide_group, "urr_max_E", urr%energy(urr%n_energy)) end if ! Write total memory used - call su % write_data(size_total, "size_total", & - group="nuclides/" // trim(nuc % name)) + call write_dataset(nuclide_group, "size_total", size_total) + call close_group(nuclide_group) end do NUCLIDE_LOOP + call close_group(nuclides_group) + end subroutine hdf5_write_nuclides !=============================================================================== ! HDF5_WRITE_TIMING !=============================================================================== - subroutine hdf5_write_timing() + subroutine hdf5_write_timing(file_id) + integer(HID_T), intent(in) :: file_id - integer(8) :: total_particles - real(8) :: speed + integer(8) :: total_particles + integer(HID_T) :: time_group + real(8) :: speed + + time_group = create_group(file_id, "timing") ! Write timing data - call su % write_data(time_initialize % elapsed, "time_initialize", & - group="timing") - call su % write_data(time_read_xs % elapsed, "time_read_xs", & - group="timing") - call su % write_data(time_transport % elapsed, "time_transport", & - group="timing") - call su % write_data(time_bank % elapsed, "time_bank", & - group="timing") - call su % write_data(time_bank_sample % elapsed, "time_bank_sample", & - group="timing") - call su % write_data(time_bank_sendrecv % elapsed, "time_bank_sendrecv", & - group="timing") - call su % write_data(time_tallies % elapsed, "time_tallies", & - group="timing") - call su % write_data(time_inactive % elapsed, "time_inactive", & - group="timing") - call su % write_data(time_active % elapsed, "time_active", & - group="timing") - call su % write_data(time_finalize % elapsed, "time_finalize", & - group="timing") - call su % write_data(time_total % elapsed, "time_total", & - group="timing") + call write_dataset(time_group, "time_initialize", time_initialize%elapsed) + call write_dataset(time_group, "time_read_xs", time_read_xs%elapsed) + call write_dataset(time_group, "time_transport", time_transport%elapsed) + call write_dataset(time_group, "time_bank", time_bank%elapsed) + call write_dataset(time_group, "time_bank_sample", time_bank_sample%elapsed) + call write_dataset(time_group, "time_bank_sendrecv", time_bank_sendrecv%elapsed) + call write_dataset(time_group, "time_tallies", time_tallies%elapsed) + call write_dataset(time_group, "time_inactive", time_inactive%elapsed) + call write_dataset(time_group, "time_active", time_active%elapsed) + call write_dataset(time_group, "time_finalize", time_finalize%elapsed) + call write_dataset(time_group, "time_total", time_total%elapsed) ! Add descriptions to timing data - call su % write_attribute_string("time_initialize", "description", & - "Total time elapsed for initialization (s)", group="timing") - call su % write_attribute_string("time_read_xs", "description", & - "Time reading cross-section libraries (s)", group="timing") - call su % write_attribute_string("time_transport", "description", & - "Time in transport only (s)", group="timing") - call su % write_attribute_string("time_bank", "description", & - "Total time synchronizing fission bank (s)", group="timing") - call su % write_attribute_string("time_bank_sample", "description", & - "Time between generations sampling source sites (s)", group="timing") - call su % write_attribute_string("time_bank_sendrecv", "description", & - "Time between generations SEND/RECVing source sites (s)", & - group="timing") - call su % write_attribute_string("time_tallies", "description", & - "Time between batches accumulating tallies (s)", group="timing") - call su % write_attribute_string("time_inactive", "description", & - "Total time in inactive batches (s)", group="timing") - call su % write_attribute_string("time_active", "description", & - "Total time in active batches (s)", group="timing") - call su % write_attribute_string("time_finalize", "description", & - "Total time for finalization (s)", group="timing") - call su % write_attribute_string("time_total", "description", & - "Total time elapsed (s)", group="timing") + call write_attribute_string(time_group, "time_initialize", "description", & + "Total time elapsed for initialization (s)") + call write_attribute_string(time_group, "time_read_xs", "description", & + "Time reading cross-section libraries (s)") + call write_attribute_string(time_group, "time_transport", "description", & + "Time in transport only (s)") + call write_attribute_string(time_group, "time_bank", "description", & + "Total time synchronizing fission bank (s)") + call write_attribute_string(time_group, "time_bank_sample", "description", & + "Time between generations sampling source sites (s)") + call write_attribute_string(time_group, "time_bank_sendrecv", "description", & + "Time between generations SEND/RECVing source sites (s)") + call write_attribute_string(time_group, "time_tallies", "description", & + "Time between batches accumulating tallies (s)") + call write_attribute_string(time_group, "time_inactive", "description", & + "Total time in inactive batches (s)") + call write_attribute_string(time_group, "time_active", "description", & + "Total time in active batches (s)") + call write_attribute_string(time_group, "time_finalize", "description", & + "Total time for finalization (s)") + call write_attribute_string(time_group, "time_total", "description", & + "Total time elapsed (s)") ! Write calculation rate total_particles = n_particles * n_batches * gen_per_batch - speed = real(total_particles) / (time_inactive % elapsed + & - time_active % elapsed) - call su % write_data(speed, "neutrons_per_second", group="timing") + speed = real(total_particles) / (time_inactive%elapsed + & + time_active%elapsed) + call write_dataset(time_group, "neutrons_per_second", speed) + call close_group(time_group) end subroutine hdf5_write_timing end module hdf5_summary diff --git a/src/initialize.F90 b/src/initialize.F90 index 22521b24da..29e5f8921f 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -12,12 +12,14 @@ module initialize use geometry_header, only: Cell, Universe, Lattice, RectLattice, HexLattice,& &BASE_UNIVERSE use global + use hdf5_interface, only: file_open, read_dataset, file_close, hdf5_bank_t,& + hdf5_tallyresult_t, hdf5_integer8_t + use hdf5_summary, only: hdf5_write_summary use input_xml, only: read_input_xml, read_cross_sections_xml, & cells_in_univ_dict, read_plots_xml use material_header, only: Material use output, only: title, header, print_version, write_message, & print_usage, write_xs_summary, print_plot - use output_interface use random_lcg, only: initialize_prng use state_point, only: load_state_point use string, only: to_str, str_to_int, starts_with, ends_with @@ -32,8 +34,7 @@ module initialize use omp_lib #endif - use hdf5_interface - use hdf5_summary, only: hdf5_write_summary + use hdf5 implicit none @@ -49,8 +50,8 @@ contains subroutine initialize_run() ! Start total and initialization timer - call time_total % start() - call time_initialize % start() + call time_total%start() + call time_initialize%start() #ifdef MPI ! Setup MPI @@ -110,9 +111,9 @@ contains call normalize_ao() ! Read ACE-format cross sections - call time_read_xs % start() + call time_read_xs%start() call read_xs() - call time_read_xs % stop() + call time_read_xs%stop() ! Create linked lists for multiple instances of the same nuclide call same_nuclide_list() @@ -122,9 +123,9 @@ contains case (GRID_NUCLIDE) continue case (GRID_MAT_UNION) - call time_unionize % start() + call time_unionize%start() call unionized_grid() - call time_unionize % stop() + call time_unionize%stop() case (GRID_LOGARITHM) call logarithmic_grid() end select @@ -167,7 +168,7 @@ contains end if ! Stop initialization timer - call time_initialize % stop() + call time_initialize%stop() end subroutine initialize_run @@ -220,10 +221,10 @@ contains ! CREATE MPI_BANK TYPE ! Determine displacements for MPI_BANK type - call MPI_GET_ADDRESS(b % wgt, bank_disp(1), mpi_err) - call MPI_GET_ADDRESS(b % xyz, bank_disp(2), mpi_err) - call MPI_GET_ADDRESS(b % uvw, bank_disp(3), mpi_err) - call MPI_GET_ADDRESS(b % E, bank_disp(4), mpi_err) + call MPI_GET_ADDRESS(b%wgt, bank_disp(1), mpi_err) + call MPI_GET_ADDRESS(b%xyz, bank_disp(2), mpi_err) + call MPI_GET_ADDRESS(b%uvw, bank_disp(3), mpi_err) + call MPI_GET_ADDRESS(b%E, bank_disp(4), mpi_err) ! Adjust displacements bank_disp = bank_disp - bank_disp(1) @@ -239,8 +240,8 @@ contains ! CREATE MPI_TALLYRESULT TYPE ! Determine displacements for MPI_BANK type - call MPI_GET_ADDRESS(tr % value, result_base_disp, mpi_err) - call MPI_GET_ADDRESS(tr % sum, result_disp(1), mpi_err) + call MPI_GET_ADDRESS(tr%value, result_base_disp, mpi_err) + call MPI_GET_ADDRESS(tr%sum, result_disp(1), mpi_err) ! Adjust displacements result_disp = result_disp - result_base_disp @@ -274,6 +275,7 @@ contains type(TallyResult), target :: tmp(2) ! temporary TallyResult type(Bank), target :: tmpb(2) ! temporary Bank + integer :: hdf5_err integer(HID_T) :: coordinates_t ! HDF5 type for 3 reals integer(HSIZE_T) :: dims(1) = (/3/) ! size of coordinates @@ -318,8 +320,8 @@ contains integer :: argc ! number of command line arguments integer :: last_flag ! index of last flag integer :: filetype + integer(HID_T) :: file_id character(MAX_WORD_LEN), allocatable :: argv(:) ! command line arguments - type(BinaryOutput) :: sp ! Check number of command line arguments and allocate argv argc = COMMAND_ARGUMENT_COUNT() @@ -356,9 +358,9 @@ contains i = i + 1 ! Check what type of file this is - call sp % file_open(argv(i), 'r', serial = .false.) - call sp % read_data(filetype, 'filetype') - call sp % file_close() + file_id = file_open(argv(i), 'r', parallel=.true.) + call read_dataset(file_id, 'filetype', filetype) + call file_close(file_id) ! Set path and flag for type of run select case (filetype) @@ -379,13 +381,12 @@ contains i = i + 1 ! Check if it has extension we can read - if ((ends_with(argv(i), '.binary') .or. & - ends_with(argv(i), '.h5'))) then + if (ends_with(argv(i), '.h5')) then ! Check file type is a source file - call sp % file_open(argv(i), 'r', serial = .false.) - call sp % read_data(filetype, 'filetype') - call sp % file_close() + file_id = file_open(argv(i), 'r', parallel=.true.) + call read_dataset(file_id, 'filetype', filetype) + call file_close(file_id) if (filetype /= FILETYPE_SOURCE) then call fatal_error("Second file after restart flag must be a & &source file") @@ -494,26 +495,26 @@ contains ! pairs are the id of the universe and the index in the array. In ! cells_in_univ_dict, it's the id of the universe and the number of cells. - pair_list => universe_dict % keys() + pair_list => universe_dict%keys() current => pair_list do while (associated(current)) ! Find index of universe in universes array - i_univ = current % value + i_univ = current%value univ => universes(i_univ) - univ % id = current % key + univ%id = current%key ! Check for lowest level universe - if (univ % id == 0) BASE_UNIVERSE = i_univ + if (univ%id == 0) BASE_UNIVERSE = i_univ ! Find cell count for this universe - n_cells_in_univ = cells_in_univ_dict % get_key(univ % id) + n_cells_in_univ = cells_in_univ_dict%get_key(univ%id) ! Allocate cell list for universe - allocate(univ % cells(n_cells_in_univ)) - univ % n_cells = n_cells_in_univ + allocate(univ%cells(n_cells_in_univ)) + univ%n_cells = n_cells_in_univ ! Move to next universe - next => current % next + next => current%next deallocate(current) current => next end do @@ -528,17 +529,17 @@ contains c => cells(i) ! Get pointer to corresponding universe - i_univ = universe_dict % get_key(c % universe) + i_univ = universe_dict%get_key(c%universe) univ => universes(i_univ) ! Increment the index for the cells array within the Universe object and ! then store the index of the Cell object in that array index_cell_in_univ(i_univ) = index_cell_in_univ(i_univ) + 1 - univ % cells(index_cell_in_univ(i_univ)) = i + univ%cells(index_cell_in_univ(i_univ)) = i end do ! Clear dictionary - call cells_in_univ_dict % clear() + call cells_in_univ_dict%clear() end subroutine prepare_universes @@ -568,15 +569,15 @@ contains ! ADJUST SURFACE LIST FOR EACH CELL c => cells(i) - do j = 1, c % n_surfaces - id = c % surfaces(j) + do j = 1, c%n_surfaces + id = c%surfaces(j) if (id < OP_DIFFERENCE) then - if (surface_dict % has_key(abs(id))) then - i_array = surface_dict % get_key(abs(id)) - c % surfaces(j) = sign(i_array, id) + if (surface_dict%has_key(abs(id))) then + i_array = surface_dict%get_key(abs(id)) + c%surfaces(j) = sign(i_array, id) else call fatal_error("Could not find surface " // trim(to_str(abs(id)))& - &// " specified on cell " // trim(to_str(c % id))) + &// " specified on cell " // trim(to_str(c%id))) end if end if end do @@ -584,40 +585,40 @@ contains ! ======================================================================= ! ADJUST UNIVERSE INDEX FOR EACH CELL - id = c % universe - if (universe_dict % has_key(id)) then - c % universe = universe_dict % get_key(id) + id = c%universe + if (universe_dict%has_key(id)) then + c%universe = universe_dict%get_key(id) else call fatal_error("Could not find universe " // trim(to_str(id)) & - &// " specified on cell " // trim(to_str(c % id))) + &// " specified on cell " // trim(to_str(c%id))) end if ! ======================================================================= ! ADJUST MATERIAL/FILL POINTERS FOR EACH CELL - id = c % material + id = c%material if (id == MATERIAL_VOID) then - c % type = CELL_NORMAL + c%type = CELL_NORMAL elseif (id /= 0) then - if (material_dict % has_key(id)) then - c % type = CELL_NORMAL - c % material = material_dict % get_key(id) + if (material_dict%has_key(id)) then + c%type = CELL_NORMAL + c%material = material_dict%get_key(id) else call fatal_error("Could not find material " // trim(to_str(id)) & - &// " specified on cell " // trim(to_str(c % id))) + &// " specified on cell " // trim(to_str(c%id))) end if else - id = c % fill - if (universe_dict % has_key(id)) then - c % type = CELL_FILL - c % fill = universe_dict % get_key(id) - elseif (lattice_dict % has_key(id)) then - lid = lattice_dict % get_key(id) - c % type = CELL_LATTICE - c % fill = lid + id = c%fill + if (universe_dict%has_key(id)) then + c%type = CELL_FILL + c%fill = universe_dict%get_key(id) + elseif (lattice_dict%has_key(id)) then + lid = lattice_dict%get_key(id) + c%type = CELL_LATTICE + c%fill = lid else call fatal_error("Specified fill " // trim(to_str(id)) // " on cell "& - &// trim(to_str(c % id)) // " is neither a universe nor a & + &// trim(to_str(c%id)) // " is neither a universe nor a & &lattice.") end if end if @@ -627,41 +628,41 @@ contains ! ADJUST UNIVERSE INDICES FOR EACH LATTICE do i = 1, n_lattices - lat => lattices(i) % obj + lat => lattices(i)%obj select type (lat) type is (RectLattice) - do m = 1, lat % n_cells(3) - do k = 1, lat % n_cells(2) - do j = 1, lat % n_cells(1) - id = lat % universes(j,k,m) - if (universe_dict % has_key(id)) then - lat % universes(j,k,m) = universe_dict % get_key(id) + do m = 1, lat%n_cells(3) + do k = 1, lat%n_cells(2) + do j = 1, lat%n_cells(1) + id = lat%universes(j,k,m) + if (universe_dict%has_key(id)) then + lat%universes(j,k,m) = universe_dict%get_key(id) else call fatal_error("Invalid universe number " & &// trim(to_str(id)) // " specified on lattice " & - &// trim(to_str(lat % id))) + &// trim(to_str(lat%id))) end if end do end do end do type is (HexLattice) - do m = 1, lat % n_axial - do k = 1, 2*lat % n_rings - 1 - do j = 1, 2*lat % n_rings - 1 - if (j + k < lat % n_rings + 1) then + do m = 1, lat%n_axial + do k = 1, 2*lat%n_rings - 1 + do j = 1, 2*lat%n_rings - 1 + if (j + k < lat%n_rings + 1) then cycle - else if (j + k > 3*lat % n_rings - 1) then + else if (j + k > 3*lat%n_rings - 1) then cycle end if - id = lat % universes(j, k, m) - if (universe_dict % has_key(id)) then - lat % universes(j, k, m) = universe_dict % get_key(id) + id = lat%universes(j, k, m) + if (universe_dict%has_key(id)) then + lat%universes(j, k, m) = universe_dict%get_key(id) else call fatal_error("Invalid universe number " & &// trim(to_str(id)) // " specified on lattice " & - &// trim(to_str(lat % id))) + &// trim(to_str(lat%id))) end if end do end do @@ -669,13 +670,13 @@ contains end select - if (lat % outer /= NO_OUTER_UNIVERSE) then - if (universe_dict % has_key(lat % outer)) then - lat % outer = universe_dict % get_key(lat % outer) + if (lat%outer /= NO_OUTER_UNIVERSE) then + if (universe_dict%has_key(lat%outer)) then + lat%outer = universe_dict%get_key(lat%outer) else call fatal_error("Invalid universe number " & - &// trim(to_str(lat % outer)) & - &// " specified on lattice " // trim(to_str(lat % id))) + &// trim(to_str(lat%outer)) & + &// " specified on lattice " // trim(to_str(lat%id))) end if end if @@ -687,68 +688,68 @@ contains ! ======================================================================= ! ADJUST INDICES FOR EACH TALLY FILTER - FILTER_LOOP: do j = 1, t % n_filters + FILTER_LOOP: do j = 1, t%n_filters - select case (t % filters(j) % type) + select case (t%filters(j)%type) case (FILTER_DISTRIBCELL) - do k = 1, size(t % filters(j) % int_bins) - id = t % filters(j) % int_bins(k) - if (cell_dict % has_key(id)) then - t % filters(j) % int_bins(k) = cell_dict % get_key(id) + do k = 1, size(t%filters(j)%int_bins) + id = t%filters(j)%int_bins(k) + if (cell_dict%has_key(id)) then + t%filters(j)%int_bins(k) = cell_dict%get_key(id) else call fatal_error("Could not find cell " // trim(to_str(id)) // & - " specified on tally " // trim(to_str(t % id))) + " specified on tally " // trim(to_str(t%id))) end if end do case (FILTER_CELL, FILTER_CELLBORN) - do k = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(k) - if (cell_dict % has_key(id)) then - t % filters(j) % int_bins(k) = cell_dict % get_key(id) + do k = 1, t%filters(j)%n_bins + id = t%filters(j)%int_bins(k) + if (cell_dict%has_key(id)) then + t%filters(j)%int_bins(k) = cell_dict%get_key(id) else call fatal_error("Could not find cell " // trim(to_str(id)) & - &// " specified on tally " // trim(to_str(t % id))) + &// " specified on tally " // trim(to_str(t%id))) end if end do case (FILTER_SURFACE) ! Check if this is a surface filter only for surface currents - if (any(t % score_bins == SCORE_CURRENT)) cycle FILTER_LOOP + if (any(t%score_bins == SCORE_CURRENT)) cycle FILTER_LOOP - do k = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(k) - if (surface_dict % has_key(id)) then - t % filters(j) % int_bins(k) = surface_dict % get_key(id) + do k = 1, t%filters(j)%n_bins + id = t%filters(j)%int_bins(k) + if (surface_dict%has_key(id)) then + t%filters(j)%int_bins(k) = surface_dict%get_key(id) else call fatal_error("Could not find surface " // trim(to_str(id)) & - &// " specified on tally " // trim(to_str(t % id))) + &// " specified on tally " // trim(to_str(t%id))) end if end do case (FILTER_UNIVERSE) - do k = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(k) - if (universe_dict % has_key(id)) then - t % filters(j) % int_bins(k) = universe_dict % get_key(id) + do k = 1, t%filters(j)%n_bins + id = t%filters(j)%int_bins(k) + if (universe_dict%has_key(id)) then + t%filters(j)%int_bins(k) = universe_dict%get_key(id) else call fatal_error("Could not find universe " // trim(to_str(id)) & - &// " specified on tally " // trim(to_str(t % id))) + &// " specified on tally " // trim(to_str(t%id))) end if end do case (FILTER_MATERIAL) - do k = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(k) - if (material_dict % has_key(id)) then - t % filters(j) % int_bins(k) = material_dict % get_key(id) + do k = 1, t%filters(j)%n_bins + id = t%filters(j)%int_bins(k) + if (material_dict%has_key(id)) then + t%filters(j)%int_bins(k) = material_dict%get_key(id) else call fatal_error("Could not find material " // trim(to_str(id)) & - &// " specified on tally " // trim(to_str(t % id))) + &// " specified on tally " // trim(to_str(t%id))) end if end do @@ -786,46 +787,46 @@ contains do i = 1, n_materials mat => materials(i) - percent_in_atom = (mat % atom_density(1) > ZERO) - density_in_atom = (mat % density > ZERO) + percent_in_atom = (mat%atom_density(1) > ZERO) + density_in_atom = (mat%density > ZERO) sum_percent = ZERO - do j = 1, mat % n_nuclides + do j = 1, mat%n_nuclides ! determine atomic weight ratio - index_list = xs_listing_dict % get_key(mat % names(j)) - awr = xs_listings(index_list) % awr + index_list = xs_listing_dict%get_key(mat%names(j)) + awr = xs_listings(index_list)%awr ! if given weight percent, convert all values so that they are divided ! by awr. thus, when a sum is done over the values, it's actually ! sum(w/awr) if (.not. percent_in_atom) then - mat % atom_density(j) = -mat % atom_density(j) / awr + mat%atom_density(j) = -mat%atom_density(j) / awr end if end do ! determine normalized atom percents. if given atom percents, this is ! straightforward. if given weight percents, the value is w/awr and is ! divided by sum(w/awr) - sum_percent = sum(mat % atom_density) - mat % atom_density = mat % atom_density / sum_percent + sum_percent = sum(mat%atom_density) + mat%atom_density = mat%atom_density / sum_percent ! Change density in g/cm^3 to atom/b-cm. Since all values are now in atom ! percent, the sum needs to be re-evaluated as 1/sum(x*awr) if (.not. density_in_atom) then sum_percent = ZERO - do j = 1, mat % n_nuclides - index_list = xs_listing_dict % get_key(mat % names(j)) - awr = xs_listings(index_list) % awr - x = mat % atom_density(j) + do j = 1, mat%n_nuclides + index_list = xs_listing_dict%get_key(mat%names(j)) + awr = xs_listings(index_list)%awr + x = mat%atom_density(j) sum_percent = sum_percent + x*awr end do sum_percent = ONE / sum_percent - mat % density = -mat % density * N_AVOGADRO & + mat%density = -mat%density * N_AVOGADRO & / MASS_NEUTRON * sum_percent end if ! Calculate nuclide atom densities - mat % atom_density = mat % density * mat % atom_density + mat%atom_density = mat%density * mat%atom_density end do end subroutine normalize_ao @@ -942,16 +943,16 @@ contains ! Get pointer to tally tally => tallies(i) - n_filt = tally % n_filters + n_filt = tally%n_filters ! Loop over the filters to determine how many additional filters ! need to be added to this tally - do j = 1, tally % n_filters + do j = 1, tally%n_filters ! Determine type of filter - if (tally % filters(j) % type == FILTER_DISTRIBCELL) then + if (tally%filters(j)%type == FILTER_DISTRIBCELL) then count_all = .true. - if (size(tally % filters(j) % int_bins) > 1) then + if (size(tally%filters(j)%int_bins) > 1) then call fatal_error("A distribcell filter was specified with & &multiple bins. This feature is not supported.") end if @@ -975,12 +976,12 @@ contains tally => tallies(i) ! Initialize the filters - do j = 1, tally % n_filters + do j = 1, tally%n_filters ! Set the number of bins to the number of instances of the cell - if (tally % filters(j) % type == FILTER_DISTRIBCELL) then - c => cells(tally % filters(j) % int_bins(1)) - tally % filters(j) % n_bins = c % instances + if (tally%filters(j)%type == FILTER_DISTRIBCELL) then + c => cells(tally%filters(j)%int_bins(1)) + tally%filters(j)%n_bins = c%instances end if end do @@ -1031,12 +1032,12 @@ contains do i = 1, n_tallies tally => tallies(i) - do j = 1, tally % n_filters - filter => tally % filters(j) + do j = 1, tally%n_filters + filter => tally%filters(j) - if (filter % type == FILTER_DISTRIBCELL) then - if (.not. cell_list % contains(filter % int_bins(1))) then - call cell_list % add(filter % int_bins(1)) + if (filter%type == FILTER_DISTRIBCELL) then + if (.not. cell_list%contains(filter%int_bins(1))) then + call cell_list%add(filter%int_bins(1)) end if end if @@ -1047,8 +1048,8 @@ contains ! to determine the number of offset tables to allocate do i = 1, n_universes univ => universes(i) - do j = 1, univ % n_cells - if (cell_list % contains(univ % cells(j))) then + do j = 1, univ%n_cells + if (cell_list%contains(univ%cells(j))) then n_maps = n_maps + 1 end if end do @@ -1070,29 +1071,29 @@ contains do i = 1, n_universes univ => universes(i) - do j = 1, univ % n_cells + do j = 1, univ%n_cells - if (cell_list % contains(univ % cells(j))) then + if (cell_list%contains(univ%cells(j))) then ! Loop over all tallies do l = 1, n_tallies tally => tallies(l) - do m = 1, tally % n_filters - filter => tally % filters(m) + do m = 1, tally%n_filters + filter => tally%filters(m) ! Loop over only distribcell filters ! If filter points to cell we just found, set offset index - if (filter % type == FILTER_DISTRIBCELL) then - if (filter % int_bins(1) == univ % cells(j)) then - filter % offset = k + if (filter%type == FILTER_DISTRIBCELL) then + if (filter%int_bins(1) == univ%cells(j)) then + filter%offset = k end if end if end do end do - univ_list(k) = univ % id + univ_list(k) = univ%id k = k + 1 end if end do @@ -1100,26 +1101,26 @@ contains ! Allocate the offset tables for lattices do i = 1, n_lattices - lat => lattices(i) % obj + lat => lattices(i)%obj select type(lat) type is (RectLattice) - allocate(lat % offset(n_maps, lat % n_cells(1), lat % n_cells(2), & - lat % n_cells(3))) + allocate(lat%offset(n_maps, lat%n_cells(1), lat%n_cells(2), & + lat%n_cells(3))) type is (HexLattice) - allocate(lat % offset(n_maps, 2 * lat % n_rings - 1, & - 2 * lat % n_rings - 1, lat % n_axial)) + allocate(lat%offset(n_maps, 2 * lat%n_rings - 1, & + 2 * lat%n_rings - 1, lat%n_axial)) end select - lat % offset(:, :, :, :) = 0 + lat%offset(:, :, :, :) = 0 end do ! Allocate offset table for fill cells do i = 1, n_cells - if (cells(i) % material == NONE) then - allocate(cells(i) % offset(n_maps)) + if (cells(i)%material == NONE) then + allocate(cells(i)%offset(n_maps)) end if end do diff --git a/src/output_interface.F90 b/src/output_interface.F90 deleted file mode 100644 index 1e08ce4911..0000000000 --- a/src/output_interface.F90 +++ /dev/null @@ -1,1725 +0,0 @@ -module output_interface - - use constants - use error, only: warning, fatal_error - use global - use tally_header, only: TallyResult - - use hdf5_interface - - implicit none - private - - type, public :: BinaryOutput - private - ! Compilation specific data - integer(HID_T) :: hdf5_fh - integer(HID_T) :: hdf5_grp - logical :: serial ! Serial I/O when using MPI/PHDF5 - contains - generic, public :: write_data => write_double, & - write_double_1Darray, & - write_double_2Darray, & - write_double_3Darray, & - write_double_4Darray, & - write_integer, & - write_integer_1Darray, & - write_integer_2Darray, & - write_integer_3Darray, & - write_integer_4Darray, & - write_long, & - write_string - generic, public :: read_data => read_double, & - read_double_1Darray, & - read_double_2Darray, & - read_double_3Darray, & - read_double_4Darray, & - read_integer, & - read_integer_1Darray, & - read_integer_2Darray, & - read_integer_3Darray, & - read_integer_4Darray, & - read_long, & - read_string - procedure :: write_double => write_double - procedure :: write_double_1Darray => write_double_1Darray - procedure :: write_double_2Darray => write_double_2Darray - procedure :: write_double_3Darray => write_double_3Darray - procedure :: write_double_4Darray => write_double_4Darray - procedure :: write_integer => write_integer - procedure :: write_integer_1Darray => write_integer_1Darray - procedure :: write_integer_2Darray => write_integer_2Darray - procedure :: write_integer_3Darray => write_integer_3Darray - procedure :: write_integer_4Darray => write_integer_4Darray - procedure :: write_long => write_long - procedure :: write_string => write_string - procedure :: read_double => read_double - procedure :: read_double_1Darray => read_double_1Darray - procedure :: read_double_2Darray => read_double_2Darray - procedure :: read_double_3Darray => read_double_3Darray - procedure :: read_double_4Darray => read_double_4Darray - procedure :: read_integer => read_integer - procedure :: read_integer_1Darray => read_integer_1Darray - procedure :: read_integer_2Darray => read_integer_2Darray - procedure :: read_integer_3Darray => read_integer_3Darray - procedure :: read_integer_4Darray => read_integer_4Darray - procedure :: read_long => read_long - procedure :: read_string => read_string - procedure, public :: file_create => file_create - procedure, public :: file_open => file_open - procedure, public :: file_close => file_close - procedure, public :: write_tally_result => write_tally_result - procedure, public :: read_tally_result => read_tally_result - procedure, public :: write_source_bank => write_source_bank - procedure, public :: read_source_bank => read_source_bank - procedure, public :: write_attribute_string => write_attribute_string - procedure, public :: open_group => open_group - procedure, public :: close_group => close_group - end type BinaryOutput - -contains - -!=============================================================================== -! FILE_CREATE creates a new file to write data to -!=============================================================================== - - subroutine file_create(self, filename, serial) - - character(*), intent(in) :: filename ! name of file to be created - logical, optional, intent(in) :: serial ! processor rank to write from - class(BinaryOutput) :: self - - ! Check for serial option - if (present(serial)) then - self % serial = serial - else - self % serial = .true. - end if - -#ifdef PHDF5 - if (self % serial) then - call hdf5_file_create(filename, self % hdf5_fh) - else - call hdf5_file_create_parallel(filename, self % hdf5_fh) - endif -#else - call hdf5_file_create(filename, self % hdf5_fh) -#endif - - end subroutine file_create - -!=============================================================================== -! FILE_OPEN opens an existing file for reading or read/writing -!=============================================================================== - - subroutine file_open(self, filename, mode, serial) - - character(*), intent(in) :: filename ! name of file to be opened - character(*), intent(in) :: mode ! file access mode - logical, optional, intent(in) :: serial ! processor rank to write from - class(BinaryOutput) :: self - - ! Check for serial option - if (present(serial)) then - self % serial = serial - else - self % serial = .true. - end if - -#ifdef PHDF5 - if (self % serial) then - call hdf5_file_open(filename, self % hdf5_fh, mode) - else - call hdf5_file_open_parallel(filename, self % hdf5_fh, mode) - endif -#else - call hdf5_file_open(filename, self % hdf5_fh, mode) -#endif - - end subroutine file_open - -!=============================================================================== -! FILE_CLOSE closes a file -!=============================================================================== - - subroutine file_close(self) - - class(BinaryOutput) :: self - - call hdf5_file_close(self % hdf5_fh) - - end subroutine file_close - -!=============================================================================== -! OPEN_GROUP call hdf5 routine to open a group within binary output context -!=============================================================================== - - subroutine open_group(self, group) - - character(*), intent(in) :: group ! HDF5 group name - class(BinaryOutput) :: self - - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) - - end subroutine open_group - -!=============================================================================== -! CLOSE_GROUP call hdf5 routine to close a group within binary output context -!=============================================================================== - - subroutine close_group(self) - - class(BinaryOutput) :: self - - call hdf5_close_group(self % hdf5_grp) - - end subroutine close_group - -!=============================================================================== -! WRITE_DOUBLE writes double precision scalar data -!=============================================================================== - - subroutine write_double(self, buffer, name, group, collect) - - real(8), intent(in) :: buffer ! data to write - character(*), intent(in) :: name ! name for data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_double(self % hdf5_grp, name_, buffer) - else - call hdf5_write_double_parallel(self % hdf5_grp, name_, buffer, collect_) - end if -#else - call hdf5_write_double(self % hdf5_grp, name_, buffer) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_double - -!=============================================================================== -! READ_DOUBLE reads double precision scalar data -!=============================================================================== - - subroutine read_double(self, buffer, name, group, collect) - - real(8), intent(inout) :: buffer ! read data to here - character(*), intent(in) :: name ! name for data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_double(self % hdf5_grp, name_, buffer) - else - call hdf5_read_double_parallel(self % hdf5_grp, name_, buffer, collect_) - end if -#else - call hdf5_read_double(self % hdf5_grp, name_, buffer) -#endif - ! Check if HDf5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_double - -!=============================================================================== -! WRITE_DOUBLE_1DARRAY writes double precision 1-D array data -!=============================================================================== - - subroutine write_double_1Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length ! length of array to write - real(8), intent(in) :: buffer(:) ! data to write - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_double_1Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_write_double_1Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_double_1Darray - -!=============================================================================== -! READ_DOUBLE_1DARRAY reads double precision 1-D array data -!=============================================================================== - - subroutine read_double_1Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length ! length of array to read - real(8), intent(inout) :: buffer(:) ! read data to here - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_double_1Darray_parallel(self % hdf5_grp, name_, buffer, & - length, collect_) - end if -#else - call hdf5_read_double_1Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_double_1Darray - -!=============================================================================== -! WRITE_DOUBLE_2DARRAY writes double precision 2-D array data -!=============================================================================== - - subroutine write_double_2Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(2) ! dimension of array - real(8), intent(in) :: buffer(length(1),length(2)) ! the data - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_double_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_write_double_2Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_double_2Darray - -!=============================================================================== -! READ_DOUBLE_2DARRAY reads double precision 2-D array data -!=============================================================================== - - subroutine read_double_2Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(2) ! dimension of array - real(8), intent(inout) :: buffer(length(1),length(2)) ! the data - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_double_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_read_double_2Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_double_2Darray - -!=============================================================================== -! WRITE_DOUBLE_3DARRAY writes double precision 3-D array data -!=============================================================================== - - subroutine write_double_3Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(3) ! length of each dimension - real(8), intent(in) :: buffer(length(1),length(2),length(3)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_double_3Darray_parallel(self % hdf5_grp, name_, buffer, & - length, collect_) - end if -#else - call hdf5_write_double_3Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_double_3Darray - -!=============================================================================== -! READ_DOUBLE_3DARRAY reads double precision 3-D array data -!=============================================================================== - - subroutine read_double_3Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(3) ! length of each dimension - real(8), intent(inout) :: buffer(length(1),length(2),length(3)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_double_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_read_double_3Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_double_3Darray - -!=============================================================================== -! WRITE_DOUBLE_4DARRAY writes double precision 4-D array data -!=============================================================================== - - subroutine write_double_4Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(4) ! length of each dimension - real(8), intent(in) :: buffer(length(1),length(2),& - length(3),length(4)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_double_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - ! Write the data in serial - call hdf5_write_double_4Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_double_4Darray - -!=============================================================================== -! READ_DOUBLE_4DARRAY reads double precision 4-D array data -!=============================================================================== - - subroutine read_double_4Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(4) ! length of each dimension - real(8), intent(inout) :: buffer(length(1),length(2),& - length(3),length(4)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_double_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_read_double_4Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_double_4Darray - -!=============================================================================== -! WRITE_INTEGER writes integer precision scalar data -!=============================================================================== - - subroutine write_integer(self, buffer, name, group, collect) - - integer, intent(in) :: buffer ! data to write - character(*), intent(in) :: name ! name for data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_integer(self % hdf5_grp, name_, buffer) - else - call hdf5_write_integer_parallel(self % hdf5_grp, name_, buffer, collect_) - end if -#else - call hdf5_write_integer(self % hdf5_grp, name_, buffer) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_integer - -!=============================================================================== -! READ_INTEGER reads integer precision scalar data -!=============================================================================== - - subroutine read_integer(self, buffer, name, group, collect) - - integer, intent(inout) :: buffer ! read data to here - character(*), intent(in) :: name ! name for data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_integer(self % hdf5_grp, name_, buffer) - else - call hdf5_read_integer_parallel(self % hdf5_grp, name_, buffer, collect_) - end if -#else - call hdf5_read_integer(self % hdf5_grp, name_, buffer) -#endif - ! Check if HDf5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_integer - -!=============================================================================== -! WRITE_INTEGER_1DARRAY writes integer precision 1-D array data -!=============================================================================== - - subroutine write_integer_1Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length ! length of array to write - integer, intent(in) :: buffer(:) ! data to write - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_integer_1Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_write_integer_1Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_integer_1Darray - -!=============================================================================== -! READ_INTEGER_1DARRAY reads integer precision 1-D array data -!=============================================================================== - - subroutine read_integer_1Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length ! length of array to read - integer, intent(inout) :: buffer(:) ! read data to here - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_integer_1Darray_parallel(self % hdf5_grp, name_, buffer, & - length, collect_) - end if -#else - ! Read the data in serial - call hdf5_read_integer_1Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_integer_1Darray - -!=============================================================================== -! WRITE_INTEGER_2DARRAY writes integer precision 2-D array data -!=============================================================================== - - subroutine write_integer_2Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(2) ! dimension of array - integer, intent(in) :: buffer(length(1),length(2)) ! the data - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_integer_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_write_integer_2Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_integer_2Darray - -!=============================================================================== -! READ_INTEGER_2DARRAY reads integer precision 2-D array data -!=============================================================================== - - subroutine read_integer_2Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(2) ! dimension of array - integer, intent(inout) :: buffer(length(1),length(2)) ! the data - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_integer_2Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_read_integer_2Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_integer_2Darray - -!=============================================================================== -! WRITE_INTEGER_3DARRAY writes integer precision 3-D array data -!=============================================================================== - - subroutine write_integer_3Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(3) ! length of each dimension - integer, intent(in) :: buffer(length(1),length(2),length(3)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_integer_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_write_integer_3Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_integer_3Darray - -!=============================================================================== -! READ_INTEGER_3DARRAY reads integer precision 3-D array data -!=============================================================================== - - subroutine read_integer_3Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(3) ! length of each dimension - integer, intent(inout) :: buffer(length(1),length(2),length(3)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_integer_3Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_read_integer_3Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_integer_3Darray - -!=============================================================================== -! WRITE_INTEGER_4DARRAY writes integer precision 4-D array data -!=============================================================================== - - subroutine write_integer_4Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(4) ! length of each dimension - integer, intent(in) :: buffer(length(1),length(2),& - length(3),length(4)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_write_integer_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_write_integer_4Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_integer_4Darray - -!=============================================================================== -! READ_INTEGER_4DARRAY reads integer precision 4-D array data -!=============================================================================== - - subroutine read_integer_4Darray(self, buffer, name, group, length, collect) - - integer, intent(in) :: length(4) ! length of each dimension - integer, intent(inout) :: buffer(length(1),length(2),& - length(3),length(4)) - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) - else - call hdf5_read_integer_4Darray_parallel(self % hdf5_grp, name_, buffer, length, & - collect_) - end if -#else - call hdf5_read_integer_4Darray(self % hdf5_grp, name_, buffer, length) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_integer_4Darray - -!=============================================================================== -! WRITE_LONG writes long integer scalar data -!=============================================================================== - - subroutine write_long(self, buffer, name, group, collect) - - integer(8), intent(in) :: buffer ! data to write - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) - else - call hdf5_write_long_parallel(self % hdf5_grp, name_, buffer, & - hdf5_integer8_t, collect_) - end if -#else - call hdf5_write_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_long - -!=============================================================================== -! READ_LONG reads long integer scalar data -!=============================================================================== - - subroutine read_long(self, buffer, name, group, collect) - - integer(8), intent(inout) :: buffer ! data to write - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - logical :: collect_ - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) - else - call hdf5_read_long_parallel(self % hdf5_grp, name_, buffer, & - hdf5_integer8_t, collect_) - end if -#else - call hdf5_read_long(self % hdf5_grp, name_, buffer, hdf5_integer8_t) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_long - -!=============================================================================== -! WRITE_STRING writes string data -!=============================================================================== - - subroutine write_string(self, buffer, name, group, collect) - - character(*), intent(in) :: buffer ! data to write - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - integer :: n - logical :: collect_ - - ! Get string length - n = len_trim(buffer) - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_write_string(self % hdf5_grp, name_, buffer, n) - else - call hdf5_write_string_parallel(self % hdf5_grp, name_, buffer, n, collect_) - end if -#else - ! Write the data - call hdf5_write_string(self % hdf5_grp, name_, buffer, n) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_string - -!=============================================================================== -! READ_STRING reads string data -!=============================================================================== - - subroutine read_string(self, buffer, name, group, collect) - - character(*), intent(inout) :: buffer ! data to write - character(*), intent(in) :: name ! name of data - character(*), intent(in), optional :: group ! HDF5 group name - logical, intent(in), optional :: collect ! collective I/O - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - integer :: n - logical :: collect_ - - ! Get string length - n = len(buffer) - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Set up collective vs. independent I/O - if (present(collect)) then - collect_ = collect - else - collect_ = .true. - end if - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif -#ifdef PHDF5 - if (self % serial) then - call hdf5_read_string(self % hdf5_grp, name_, buffer, n) - else - call hdf5_read_string_parallel(self % hdf5_grp, name_, buffer, n, collect_) - end if -#else - call hdf5_read_string(self % hdf5_grp, name_, buffer, n) -#endif - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_string - -!=============================================================================== -! WRITE_ATTRIBUTE_STRING -!=============================================================================== - - subroutine write_attribute_string(self, var, attr_type, attr_str, group) - - character(*), intent(in) :: var ! variable name for attr - character(*), intent(in) :: attr_type ! attr identifier type - character(*), intent(in) :: attr_str ! string for attr id type - character(*), intent(in), optional :: group ! HDF5 group name - class(BinaryOutput) :: self - - ! Check if HDF5 group should be created/opened - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - endif - - ! Write the attribute string - call hdf5_write_attribute_string(self % hdf5_grp, var, attr_type, attr_str) - - ! Check if HDF5 group should be closed - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine write_attribute_string - -!=============================================================================== -! WRITE_TALLY_RESULT writes an OpenMC TallyResult type -!=============================================================================== - - subroutine write_tally_result(self, buffer, name, group, n1, n2) - - character(*), intent(in), optional :: group ! HDF5 group name - character(*), intent(in) :: name ! name of data - integer, intent(in) :: n1, n2 ! TallyResult dims - type(TallyResult), intent(in), target :: buffer(n1, n2) ! data to write - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Open up sub-group if present - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - end if - - ! Set overall size of vector to write - dims1(1) = n1*n2 - - ! Create up a dataspace for size - call h5screate_simple_f(1, dims1, dspace, hdf5_err) - - ! Create the dataset - call h5dcreate_f(self % hdf5_grp, name_, hdf5_tallyresult_t, dspace, dset, & - hdf5_err) - - ! Set pointer to first value and write - f_ptr = c_loc(buffer(1,1)) - call h5dwrite_f(dset, hdf5_tallyresult_t, f_ptr, hdf5_err) - - ! Close ids - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - if (present(group)) then - call hdf5_close_group(self % hdf5_grp) - end if - - end subroutine write_tally_result - -!=============================================================================== -! READ_TALLY_RESULT reads OpenMC TallyResult data -!=============================================================================== - - subroutine read_tally_result(self, buffer, name, group, n1, n2) - - character(*), intent(in), optional :: group ! HDF5 group name - character(*), intent(in) :: name ! name of data - integer, intent(in) :: n1, n2 ! TallyResult dims - type(TallyResult), intent(inout), target :: buffer(n1, n2) ! read data here - class(BinaryOutput) :: self - - character(len=MAX_WORD_LEN) :: name_ ! HDF5 dataset name - character(len=MAX_WORD_LEN) :: group_ ! HDF5 group name - - ! Set name - name_ = trim(name) - - ! Set group - if (present(group)) then - group_ = trim(group) - end if - - ! Open up sub-group if present - if (present(group)) then - call hdf5_open_group(self % hdf5_fh, group_, self % hdf5_grp) - else - self % hdf5_grp = self % hdf5_fh - end if - - ! Open the dataset - call h5dopen_f(self % hdf5_grp, name, dset, hdf5_err) - - ! Set pointer to first value and write - f_ptr = c_loc(buffer(1,1)) - call h5dread_f(dset, hdf5_tallyresult_t, f_ptr, hdf5_err) - - ! Close ids - call h5dclose_f(dset, hdf5_err) - if (present(group)) call hdf5_close_group(self % hdf5_grp) - - end subroutine read_tally_result - -!=============================================================================== -! WRITE_SOURCE_BANK writes OpenMC source_bank data -!=============================================================================== - - subroutine write_source_bank(self) - - class(BinaryOutput) :: self - -#ifdef PHDF5 - integer(8) :: offset(1) ! source data offset -#endif - -#ifdef PHDF5 - - ! Set size of total dataspace for all procs and rank - dims1(1) = n_particles - hdf5_rank = 1 - - ! Create that dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) - - ! Create the dataset for that dataspace - call h5dcreate_f(self % hdf5_fh, "source_bank", hdf5_bank_t, dspace, dset, hdf5_err) - - ! Close the dataspace - call h5sclose_f(dspace, hdf5_err) - - ! Create another data space but for each proc individually - dims1(1) = work - call h5screate_simple_f(hdf5_rank, dims1, memspace, hdf5_err) - - ! Get the individual local proc dataspace - call h5dget_space_f(dset, dspace, hdf5_err) - - ! Select hyperslab for this dataspace - offset(1) = work_index(rank) - call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims1, hdf5_err) - - ! Set up the property list for parallel writing - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank(1)) - - ! Write data to file in parallel - call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & - file_space_id = dspace, mem_space_id = memspace, & - xfer_prp = plist) - - ! Close all ids - call h5sclose_f(dspace, hdf5_err) - call h5sclose_f(memspace, hdf5_err) - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - -#else - - ! Set size - dims1(1) = work - hdf5_rank = 1 - - ! Create dataspace - call h5screate_simple_f(hdf5_rank, dims1, dspace, hdf5_err) - - ! Create dataset - call h5dcreate_f(self % hdf5_fh, "source_bank", hdf5_bank_t, & - dspace, dset, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank(1)) - - ! Write dataset to file - call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err) - - ! Close all ids - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) - -#endif - - end subroutine write_source_bank - -!=============================================================================== -! READ_SOURCE_BANK reads OpenMC source_bank data -!=============================================================================== - - subroutine read_source_bank(self) - - class(BinaryOutput) :: self - -#ifdef PHDF5 - integer(8) :: offset(1) ! offset of data -#endif - -#ifdef PHDF5 - - ! Set size of total dataspace for all procs and rank - dims1(1) = n_particles - hdf5_rank = 1 - - ! Open the dataset - call h5dopen_f(self % hdf5_fh, "source_bank", dset, hdf5_err) - - ! Create another data space but for each proc individually - dims1(1) = work - call h5screate_simple_f(hdf5_rank, dims1, memspace, hdf5_err) - - ! Get the individual local proc dataspace - call h5dget_space_f(dset, dspace, hdf5_err) - - ! Select hyperslab for this dataspace - offset(1) = work_index(rank) - call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims1, hdf5_err) - - ! Set up the property list for parallel writing - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank(1)) - - ! Read data from file in parallel - call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & - file_space_id = dspace, mem_space_id = memspace, & - xfer_prp = plist) - - ! Close all ids - call h5sclose_f(dspace, hdf5_err) - call h5sclose_f(memspace, hdf5_err) - call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - -#else - - ! Open dataset - call h5dopen_f(self % hdf5_fh, "source_bank", dset, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank(1)) - - ! Read dataset from file - call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err) - - ! Close all ids - call h5dclose_f(dset, hdf5_err) - -#endif - - end subroutine read_source_bank - -end module output_interface diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index 0ed25fdc80..c8874b0715 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -6,18 +6,18 @@ module particle_restart use constants use geometry_header, only: BASE_UNIVERSE use global + use hdf5_interface, only: file_open, file_close, read_dataset use output, only: write_message, print_particle - use output_interface, only: BinaryOutput use particle_header, only: Particle use random_lcg, only: set_particle_seed use tracking, only: transport + use hdf5, only: HID_T + implicit none private public :: run_particle_restart - type(BinaryOutput) :: pr ! Binary file - contains !=============================================================================== @@ -34,7 +34,7 @@ contains verbosity = 10 ! Initialize the particle to be tracked - call p % initialize() + call p%initialize() ! Read in the restart information call read_particle_restart(p, previous_run_mode) @@ -46,9 +46,9 @@ contains select case (previous_run_mode) case (MODE_EIGENVALUE) particle_seed = ((current_batch - 1)*gen_per_batch + & - current_gen - 1)*n_particles + p % id + current_gen - 1)*n_particles + p%id case (MODE_FIXEDSOURCE) - particle_seed = p % id + particle_seed = p%id end select call set_particle_seed(particle_seed) @@ -66,40 +66,41 @@ contains !=============================================================================== subroutine read_particle_restart(p, previous_run_mode) + type(Particle), intent(inout) :: p + integer, intent(inout) :: previous_run_mode integer :: int_scalar - integer, intent(inout) :: previous_run_mode - type(Particle), intent(inout) :: p + integer(HID_T) :: file_id ! Write meessage call write_message("Loading particle restart file " & &// trim(path_particle_restart) // "...", 1) ! Open file - call pr % file_open(path_particle_restart, 'r') + file_id = file_open(path_particle_restart, 'r') ! Read data from file - call pr % read_data(int_scalar, 'filetype') - call pr % read_data(int_scalar, 'revision') - call pr % read_data(current_batch, 'current_batch') - call pr % read_data(gen_per_batch, 'gen_per_batch') - call pr % read_data(current_gen, 'current_gen') - call pr % read_data(n_particles, 'n_particles') - call pr % read_data(previous_run_mode, 'run_mode') - call pr % read_data(p % id, 'id') - call pr % read_data(p % wgt, 'weight') - call pr % read_data(p % E, 'energy') - call pr % read_data(p % coord(1) % xyz, 'xyz', length=3) - call pr % read_data(p % coord(1) % uvw, 'uvw', length=3) + call read_dataset(file_id, 'filetype', int_scalar) + call read_dataset(file_id, 'revision', int_scalar) + call read_dataset(file_id, 'current_batch', current_batch) + call read_dataset(file_id, 'gen_per_batch', gen_per_batch) + call read_dataset(file_id, 'current_gen', current_gen) + call read_dataset(file_id, 'n_particles', n_particles) + call read_dataset(file_id, 'run_mode', previous_run_mode) + call read_dataset(file_id, 'id', p%id) + call read_dataset(file_id, 'weight', p%wgt) + call read_dataset(file_id, 'energy', p%E) + call read_dataset(file_id, 'xyz', p%coord(1)%xyz) + call read_dataset(file_id, 'uvw', p%coord(1)%uvw) ! Set particle last attributes - p % last_wgt = p % wgt - p % last_xyz = p % coord(1) % xyz - p % last_uvw = p % coord(1) % uvw - p % last_E = p % E + p%last_wgt = p%wgt + p%last_xyz = p%coord(1)%xyz + p%last_uvw = p%coord(1)%uvw + p%last_E = p%E ! Close hdf5 file - call pr % file_close() + call file_close(file_id) end subroutine read_particle_restart diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index 48b4af661e..0c010b64c2 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -2,17 +2,16 @@ module particle_restart_write use bank_header, only: Bank use global - use output_interface, only: BinaryOutput + use hdf5_interface use particle_header, only: Particle use string, only: to_str + use hdf5 + implicit none private public :: write_particle_restart - ! Binary output file - type(BinaryOutput) :: pr - contains !=============================================================================== @@ -20,43 +19,42 @@ contains !=============================================================================== subroutine write_particle_restart(p) - type(Particle), intent(in) :: p + integer(HID_T) :: file_id character(MAX_FILE_LEN) :: filename - type(Bank), pointer :: src => null() + type(Bank), pointer :: src ! Dont write another restart file if in particle restart mode if (run_mode == MODE_PARTICLE) return ! Set up file name filename = trim(path_output) // 'particle_' // trim(to_str(current_batch)) & - // '_' // trim(to_str(p % id)) - filename = trim(filename) // '.h5' + // '_' // trim(to_str(p%id)) // '.h5' !$omp critical (WriteParticleRestart) ! Create file - call pr % file_create(filename) + file_id = file_create(filename) ! Get information about source particle src => source_bank(current_work) ! Write data to file - call pr % write_data(FILETYPE_PARTICLE_RESTART, 'filetype') - call pr % write_data(REVISION_PARTICLE_RESTART, 'revision') - call pr % write_data(current_batch, 'current_batch') - call pr % write_data(gen_per_batch, 'gen_per_batch') - call pr % write_data(current_gen, 'current_gen') - call pr % write_data(n_particles, 'n_particles') - call pr % write_data(run_mode, 'run_mode') - call pr % write_data(p % id, 'id') - call pr % write_data(src % wgt, 'weight') - call pr % write_data(src % E, 'energy') - call pr % write_data(src % xyz, 'xyz', length = 3) - call pr % write_data(src % uvw, 'uvw', length = 3) + call write_dataset(file_id, 'filetype', FILETYPE_PARTICLE_RESTART) + call write_dataset(file_id, 'revision', REVISION_PARTICLE_RESTART) + call write_dataset(file_id, 'current_batch', current_batch) + call write_dataset(file_id, 'gen_per_batch', gen_per_batch) + call write_dataset(file_id, 'current_gen', current_gen) + call write_dataset(file_id, 'n_particles', n_particles) + call write_dataset(file_id, 'run_mode', run_mode) + call write_dataset(file_id, 'id', p%id) + call write_dataset(file_id, 'weight', src%wgt) + call write_dataset(file_id, 'energy', src%E) + call write_dataset(file_id, 'xyz', src%xyz) + call write_dataset(file_id, 'uvw', src%uvw) ! Close file - call pr % file_close() + call file_close(file_id) !$omp end critical (WriteParticleRestart) end subroutine write_particle_restart diff --git a/src/source.F90 b/src/source.F90 index 4b0de58b5a..285332ef8d 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -6,17 +6,20 @@ module source use geometry, only: find_cell use geometry_header, only: BASE_UNIVERSE use global + use hdf5_interface, only: file_create, file_open, file_close, read_dataset use math, only: maxwell_spectrum, watt_spectrum use output, only: write_message - use output_interface, only: BinaryOutput use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_set_stream + use state_point, only: read_source_bank, write_source_bank use string, only: to_str #ifdef MPI use message_passing #endif + use hdf5, only: HID_T + implicit none contains @@ -27,12 +30,12 @@ contains subroutine initialize_source() - character(MAX_FILE_LEN) :: filename integer(8) :: i ! loop index over bank sites integer(8) :: id ! particle id integer(4) :: itmp ! temporary integer - type(Bank), pointer :: src => null() ! source bank site - type(BinaryOutput) :: sp ! statepoint/source binary file + integer(HID_T) :: file_id + character(MAX_FILE_LEN) :: filename + type(Bank), pointer :: src ! source bank site call write_message("Initializing source particles...", 6) @@ -44,10 +47,10 @@ contains &// '...', 6) ! Open the binary file - call sp % file_open(path_source, 'r', serial = .false.) + file_id = file_open(path_source, 'r', parallel=.true.) ! Read the file type - call sp % read_data(itmp, "filetype") + call read_dataset(file_id, "filetype", itmp) ! Check to make sure this is a source file if (itmp /= FILETYPE_SOURCE) then @@ -56,10 +59,10 @@ contains end if ! Read in the source bank - call sp % read_source_bank() + call read_source_bank(file_id) ! Close file - call sp % file_close() + call file_close(file_id) else ! Generation source sites from specified distribution in user input @@ -80,9 +83,9 @@ contains if (write_initial_source) then call write_message('Writing out initial source...', 1) filename = trim(path_output) // 'initial_source.h5' - call sp % file_create(filename, serial = .false.) - call sp % write_source_bank() - call sp % file_close() + file_id = file_create(filename, parallel=.true.) + call write_source_bank(file_id) + call file_close(file_id) end if end subroutine initialize_source @@ -109,28 +112,28 @@ contains integer, save :: num_resamples = 0 ! Number of resamples encountered ! Set weight to one by default - site % wgt = ONE + site%wgt = ONE ! Set the random number generator to the source stream. call prn_set_stream(STREAM_SOURCE) ! Sample position - select case (external_source % type_space) + select case (external_source%type_space) case (SRC_SPACE_BOX) ! Set particle defaults - call p % initialize() + call p%initialize() ! Repeat sampling source location until a good site has been found found = .false. do while (.not.found) ! Coordinates sampled uniformly over a box - p_min = external_source % params_space(1:3) - p_max = external_source % params_space(4:6) + p_min = external_source%params_space(1:3) + p_max = external_source%params_space(4:6) r = (/ (prn(), i = 1,3) /) - site % xyz = p_min + r*(p_max - p_min) + site%xyz = p_min + r*(p_max - p_min) ! Fill p with needed data - p % coord(1) % xyz = site % xyz - p % coord(1) % uvw = [ ONE, ZERO, ZERO ] + p%coord(1)%xyz = site%xyz + p%coord(1)%uvw = [ ONE, ZERO, ZERO ] ! Now search to see if location exists in geometry call find_cell(p, found) @@ -142,24 +145,24 @@ contains end if end if end do - call p % clear() + call p%clear() case (SRC_SPACE_FISSION) ! Repeat sampling source location until a good site has been found found = .false. do while (.not.found) ! Set particle defaults - call p % initialize() + call p%initialize() ! Coordinates sampled uniformly over a box - p_min = external_source % params_space(1:3) - p_max = external_source % params_space(4:6) + p_min = external_source%params_space(1:3) + p_max = external_source%params_space(4:6) r = (/ (prn(), i = 1,3) /) - site % xyz = p_min + r*(p_max - p_min) + site%xyz = p_min + r*(p_max - p_min) ! Fill p with needed data - p % coord(1) % xyz = site % xyz - p % coord(1) % uvw = [ ONE, ZERO, ZERO ] + p%coord(1)%xyz = site%xyz + p%coord(1)%uvw = [ ONE, ZERO, ZERO ] ! Now search to see if location exists in geometry call find_cell(p, found) @@ -171,66 +174,66 @@ contains end if cycle end if - if (p % material == MATERIAL_VOID) then + if (p%material == MATERIAL_VOID) then found = .false. cycle end if - if (.not. materials(p % material) % fissionable) found = .false. + if (.not. materials(p%material)%fissionable) found = .false. end do - call p % clear() + call p%clear() case (SRC_SPACE_POINT) ! Point source - site % xyz = external_source % params_space + site%xyz = external_source%params_space end select ! Sample angle - select case (external_source % type_angle) + select case (external_source%type_angle) case (SRC_ANGLE_ISOTROPIC) ! Sample isotropic distribution phi = TWO*PI*prn() mu = TWO*prn() - ONE - site % uvw(1) = mu - site % uvw(2) = sqrt(ONE - mu*mu) * cos(phi) - site % uvw(3) = sqrt(ONE - mu*mu) * sin(phi) + site%uvw(1) = mu + site%uvw(2) = sqrt(ONE - mu*mu) * cos(phi) + site%uvw(3) = sqrt(ONE - mu*mu) * sin(phi) case (SRC_ANGLE_MONO) ! Monodirectional source - site % uvw = external_source % params_angle + site%uvw = external_source%params_angle case default call fatal_error("No angle distribution specified for external source!") end select ! Sample energy distribution - select case (external_source % type_energy) + select case (external_source%type_energy) case (SRC_ENERGY_MONO) ! Monoenergtic source - site % E = external_source % params_energy(1) - if (site % E >= 20) then + site%E = external_source%params_energy(1) + if (site%E >= 20) then call fatal_error("Source energies above 20 MeV not allowed.") end if case (SRC_ENERGY_MAXWELL) - a = external_source % params_energy(1) + a = external_source%params_energy(1) do ! Sample Maxwellian fission spectrum - site % E = maxwell_spectrum(a) + site%E = maxwell_spectrum(a) ! resample if energy is >= 20 MeV - if (site % E < 20) exit + if (site%E < 20) exit end do case (SRC_ENERGY_WATT) - a = external_source % params_energy(1) - b = external_source % params_energy(2) + a = external_source%params_energy(1) + b = external_source%params_energy(2) do ! Sample Watt fission spectrum - site % E = watt_spectrum(a, b) + site%E = watt_spectrum(a, b) ! resample if energy is >= 20 MeV - if (site % E < 20) exit + if (site%E < 20) exit end do case default diff --git a/src/state_point.F90 b/src/state_point.F90 index 790fd58c57..084289bee0 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -15,9 +15,9 @@ module state_point use constants use error, only: fatal_error, warning use global + use hdf5_interface use output, only: write_message, time_stamp use string, only: to_str, zero_padded, count_digits - use output_interface use tally_header, only: TallyObject use mesh_header, only: StructuredMesh use dict_header, only: ElemKeyValueII, ElemKeyValueCI @@ -26,9 +26,9 @@ module state_point use message_passing #endif - implicit none + use hdf5 - type(BinaryOutput) :: sp ! Statepoint/source output file + implicit none contains @@ -38,23 +38,26 @@ contains subroutine write_state_point() - character(MAX_FILE_LEN) :: filename integer :: i, j, k + integer :: n_order ! loop index for moment orders + integer :: nm_order ! loop index for Ynm moment orders integer, allocatable :: id_array(:) integer, allocatable :: key_array(:) + integer(HID_T) :: file_id + integer(HID_T) :: cmfd_group + integer(HID_T) :: tallies_group, tally_group + integer(HID_T) :: meshes_group, mesh_group + integer(HID_T) :: filter_group, moments_group + character(8) :: moment_name ! name of moment (e.g, P3) + character(MAX_FILE_LEN) :: filename type(StructuredMesh), pointer :: mesh type(TallyObject), pointer :: tally type(ElemKeyValueII), pointer :: current type(ElemKeyValueII), pointer :: next - character(8) :: moment_name ! name of moment (e.g, P3) - integer :: n_order ! loop index for moment orders - integer :: nm_order ! loop index for Ynm moment orders ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & & zero_padded(current_batch, count_digits(n_max_batches)) - - ! Append appropriate extension filename = trim(filename) // '.h5' ! Write message @@ -62,145 +65,126 @@ contains if (master) then ! Create statepoint file - call sp % file_create(filename) + file_id = file_create(filename) ! Write file type - call sp % write_data(FILETYPE_STATEPOINT, "filetype") + call write_dataset(file_id, "filetype", FILETYPE_STATEPOINT) ! Write revision number for state point file - call sp % write_data(REVISION_STATEPOINT, "revision") + call write_dataset(file_id, "revision", REVISION_STATEPOINT) ! Write OpenMC version - call sp % write_data(VERSION_MAJOR, "version_major") - call sp % write_data(VERSION_MINOR, "version_minor") - call sp % write_data(VERSION_RELEASE, "version_release") + call write_dataset(file_id, "version_major", VERSION_MAJOR) + call write_dataset(file_id, "version_minor", VERSION_MINOR) + call write_dataset(file_id, "version_release", VERSION_RELEASE) ! Write current date and time - call sp % write_data(time_stamp(), "date_and_time") + call write_dataset(file_id, "date_and_time", time_stamp()) ! Write path to input - call sp % write_data(path_input, "path") + call write_dataset(file_id, "path", path_input) ! Write out random number seed - call sp % write_data(seed, "seed") + call write_dataset(file_id, "seed", seed) ! Write run information - call sp % write_data(run_mode, "run_mode") - call sp % write_data(n_particles, "n_particles") - call sp % write_data(n_batches, "n_batches") + call write_dataset(file_id, "run_mode", run_mode) + call write_dataset(file_id, "n_particles", n_particles) + call write_dataset(file_id, "n_batches", n_batches) ! Write out current batch number - call sp % write_data(current_batch, "current_batch") + call write_dataset(file_id, "current_batch", current_batch) ! Indicate whether source bank is stored in statepoint if (source_separate) then - call sp % write_data(0, "source_present") + call write_dataset(file_id, "source_present", 0) else - call sp % write_data(1, "source_present") + call write_dataset(file_id, "source_present", 1) end if ! Write out information for eigenvalue run if (run_mode == MODE_EIGENVALUE) then - call sp % write_data(n_inactive, "n_inactive") - call sp % write_data(gen_per_batch, "gen_per_batch") - call sp % write_data(k_generation, "k_generation", & - length=current_batch*gen_per_batch) - call sp % write_data(entropy, "entropy", & - length=current_batch*gen_per_batch) - call sp % write_data(k_col_abs, "k_col_abs") - call sp % write_data(k_col_tra, "k_col_tra") - call sp % write_data(k_abs_tra, "k_abs_tra") - call sp % write_data(k_combined, "k_combined", length=2) + call write_dataset(file_id, "n_inactive", n_inactive) + call write_dataset(file_id, "gen_per_batch", gen_per_batch) + call write_dataset(file_id, "k_generation", k_generation) + call write_dataset(file_id, "entropy", entropy) + call write_dataset(file_id, "k_col_abs", k_col_abs) + call write_dataset(file_id, "k_col_tra", k_col_tra) + call write_dataset(file_id, "k_abs_tra", k_abs_tra) + call write_dataset(file_id, "k_combined", k_combined) ! Write out CMFD info if (cmfd_on) then - call sp % open_group("cmfd") - call sp % close_group() - call sp % write_data(1, "cmfd_on") - call sp % write_data(cmfd % indices, "indices", length=4, group="cmfd") - call sp % write_data(cmfd % k_cmfd, "k_cmfd", length=current_batch, & - group="cmfd") - call sp % write_data(cmfd % cmfd_src, "cmfd_src", & - length=(/cmfd % indices(4), cmfd % indices(1), & - cmfd % indices(2), cmfd % indices(3)/), & - group="cmfd") - call sp % write_data(cmfd % entropy, "cmfd_entropy", & - length=current_batch, group="cmfd") - call sp % write_data(cmfd % balance, "cmfd_balance", & - length=current_batch, group="cmfd") - call sp % write_data(cmfd % dom, "cmfd_dominance", & - length = current_batch, group="cmfd") - call sp % write_data(cmfd % src_cmp, "cmfd_srccmp", & - length = current_batch, group="cmfd") + call write_dataset(file_id, "cmfd_on", 1) + + cmfd_group = create_group(file_id, "cmfd") + call write_dataset(cmfd_group, "indices", cmfd%indices) + call write_dataset(cmfd_group, "k_cmfd", cmfd%k_cmfd) + call write_dataset(cmfd_group, "cmfd_src", cmfd%cmfd_src) + call write_dataset(cmfd_group, "cmfd_entropy", cmfd%entropy) + call write_dataset(cmfd_group, "cmfd_balance", cmfd%balance) + call write_dataset(cmfd_group, "cmfd_dominance", cmfd%dom) + call write_dataset(cmfd_group, "cmfd_srccmp", cmfd%src_cmp) + call close_group(cmfd_group) else - call sp % write_data(0, "cmfd_on") + call write_dataset(file_id, "cmfd_on", 0) end if end if - call sp % open_group("tallies") - call sp % close_group() + tallies_group = create_group(file_id, "tallies") ! Write number of meshes - call sp % write_data(n_meshes, "n_meshes", group="tallies/meshes") + meshes_group = create_group(tallies_group, "meshes") + call write_dataset(meshes_group, "n_meshes", n_meshes) if (n_meshes > 0) then ! Print list of mesh IDs - current => mesh_dict % keys() + current => mesh_dict%keys() allocate(id_array(n_meshes)) allocate(key_array(n_meshes)) i = 1 do while (associated(current)) - key_array(i) = current % key - id_array(i) = current % value + key_array(i) = current%key + id_array(i) = current%value ! Move to next mesh - next => current % next + next => current%next deallocate(current) current => next i = i + 1 end do - call sp % write_data(id_array, "ids", & - group="tallies/meshes", length=n_meshes) - call sp % write_data(key_array, "keys", & - group="tallies/meshes", length=n_meshes) + call write_dataset(meshes_group, "ids", id_array) + call write_dataset(meshes_group, "keys", key_array) deallocate(key_array) ! Write information for meshes MESH_LOOP: do i = 1, n_meshes - mesh => meshes(id_array(i)) + mesh_group = create_group(meshes_group, "mesh " // trim(to_str(mesh%id))) - call sp % write_data(mesh % id, "id", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id))) - call sp % write_data(mesh % type, "type", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id))) - call sp % write_data(mesh % n_dimension, "n_dimension", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id))) - call sp % write_data(mesh % dimension, "dimension", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id)), & - length=mesh % n_dimension) - call sp % write_data(mesh % lower_left, "lower_left", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id)), & - length=mesh % n_dimension) - call sp % write_data(mesh % upper_right, "upper_right", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id)), & - length=mesh % n_dimension) - call sp % write_data(mesh % width, "width", & - group="tallies/meshes/mesh " // trim(to_str(mesh % id)), & - length=mesh % n_dimension) + call write_dataset(mesh_group, "id", mesh%id) + call write_dataset(mesh_group, "type", mesh%type) + call write_dataset(mesh_group, "n_dimension", mesh%n_dimension) + call write_dataset(mesh_group, "dimension", mesh%dimension) + call write_dataset(mesh_group, "lower_left", mesh%lower_left) + call write_dataset(mesh_group, "upper_right", mesh%upper_right) + call write_dataset(mesh_group, "width", mesh%width) + + call close_group(mesh_group) end do MESH_LOOP deallocate(id_array) - end if + call close_group(meshes_group) + ! Write number of tallies - call sp % write_data(n_tallies, "n_tallies", group="tallies") + call write_dataset(tallies_group, "n_tallies", n_tallies) if (n_tallies > 0) then @@ -211,14 +195,12 @@ contains ! Write all tally information except results do i = 1, n_tallies tally => tallies(i) - key_array(i) = tally % id + key_array(i) = tally%id id_array(i) = i end do - call sp % write_data(id_array, "ids", & - group="tallies", length=n_tallies) - call sp % write_data(key_array, "keys", & - group="tallies", length=n_tallies) + call write_dataset(tallies_group, "ids", id_array) + call write_dataset(tallies_group, "keys", key_array) deallocate(key_array) @@ -227,110 +209,92 @@ contains ! Get pointer to tally tally => tallies(i) + tally_group = create_group(tallies_group, "tally " // & + trim(to_str(tally%id))) - call sp % write_data(tally % estimator, "estimator", & - group="tallies/tally " // trim(to_str(tally % id))) - call sp % write_data(tally % n_realizations, "n_realizations", & - group="tallies/tally " // trim(to_str(tally % id))) - call sp % write_data(tally % n_filters, "n_filters", & - group="tallies/tally " // trim(to_str(tally % id))) + call write_dataset(tally_group, "estimator", tally%estimator) + call write_dataset(tally_group, "n_realizations", tally%n_realizations) + call write_dataset(tally_group, "n_filters", tally%n_filters) ! Write filter information - FILTER_LOOP: do j = 1, tally % n_filters + FILTER_LOOP: do j = 1, tally%n_filters + filter_group = create_group(tally_group, "filter " // & + trim(to_str(j))) - call sp % write_data(tally % filters(j) % type, "type", & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/filter " // to_str(j)) - call sp % write_data(tally % filters(j) % offset, "offset", & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/filter " // to_str(j)) - call sp % write_data(tally % filters(j) % n_bins, "n_bins", & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/filter " // to_str(j)) - if (tally % filters(j) % type == FILTER_ENERGYIN .or. & - tally % filters(j) % type == FILTER_ENERGYOUT) then - call sp % write_data(tally % filters(j) % real_bins, "bins", & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/filter " // to_str(j), & - length=size(tally % filters(j) % real_bins)) + call write_dataset(filter_group, "type", tally%filters(j)%type) + call write_dataset(filter_group, "offset", tally%filters(j)%offset) + call write_dataset(filter_group, "n_bins", tally%filters(j)%n_bins) + if (tally%filters(j)%type == FILTER_ENERGYIN .or. & + tally%filters(j)%type == FILTER_ENERGYOUT) then + call write_dataset(filter_group, "bins", & + tally%filters(j)%real_bins) else - call sp % write_data(tally % filters(j) % int_bins, "bins", & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/filter " // to_str(j), & - length=size(tally % filters(j) % int_bins)) + call write_dataset(filter_group, "bins", & + tally%filters(j)%int_bins) end if + call close_group(filter_group) end do FILTER_LOOP - call sp % write_data(tally % n_nuclide_bins, "n_nuclides", & - group="tallies/tally " // trim(to_str(tally % id))) + call write_dataset(tally_group, "n_nuclides", tally%n_nuclide_bins) ! Set up nuclide bin array and then write - allocate(key_array(tally % n_nuclide_bins)) - NUCLIDE_LOOP: do j = 1, tally % n_nuclide_bins - if (tally % nuclide_bins(j) > 0) then - key_array(j) = nuclides(tally % nuclide_bins(j)) % zaid + allocate(key_array(tally%n_nuclide_bins)) + NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins + if (tally%nuclide_bins(j) > 0) then + key_array(j) = nuclides(tally%nuclide_bins(j))%zaid else - key_array(j) = tally % nuclide_bins(j) + key_array(j) = tally%nuclide_bins(j) end if end do NUCLIDE_LOOP - call sp % write_data(key_array, "nuclides", & - group="tallies/tally " // trim(to_str(tally % id)), & - length=tally % n_nuclide_bins) + call write_dataset(tally_group, "nuclides", key_array) deallocate(key_array) - call sp % write_data(tally % n_score_bins, "n_score_bins", & - group="tallies/tally " // trim(to_str(tally % id))) - call sp % write_data(tally % score_bins, "score_bins", & - group="tallies/tally " // trim(to_str(tally % id)), & - length=tally % n_score_bins) - call sp % write_data(tally % n_user_score_bins, "n_user_score_bins", & - group="tallies/tally " // to_str(tally % id)) + call write_dataset(tally_group, "n_score_bins", tally%n_score_bins) + call write_dataset(tally_group, "score_bins", tally%score_bins) + call write_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) ! Write explicit moment order strings for each score bin + moments_group = create_group(tally_group, "moments") k = 1 - MOMENT_LOOP: do j = 1, tally % n_user_score_bins - select case(tally % score_bins(k)) + MOMENT_LOOP: do j = 1, tally%n_user_score_bins + select case(tally%score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - moment_name = 'P' // trim(to_str(tally % moment_order(k))) - call sp % write_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/moments") + moment_name = 'P' // trim(to_str(tally%moment_order(k))) + call write_dataset(moments_group, "order" // trim(to_str(k)), moment_name) k = k + 1 case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) - do n_order = 0, tally % moment_order(k) + do n_order = 0, tally%moment_order(k) moment_name = 'P' // trim(to_str(n_order)) - call sp % write_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/moments") + call write_dataset(moments_group, "order" // trim(to_str(k)), moment_name) k = k + 1 end do case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & SCORE_TOTAL_YN) - do n_order = 0, tally % moment_order(k) + do n_order = 0, tally%moment_order(k) do nm_order = -n_order, n_order moment_name = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) - call sp % write_data(moment_name, "order" // & - trim(to_str(k)), & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/moments") + call write_dataset(moments_group, "order" // & + trim(to_str(k)), moment_name) k = k + 1 end do end do case default moment_name = '' - call sp % write_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(tally % id)) // & - "/moments") + call write_dataset(moments_group, "order" // trim(to_str(k)), & + moment_name) k = k + 1 end select - end do MOMENT_LOOP + call close_group(moments_group) + call close_group(tally_group) end do TALLY_METADATA end if + + call close_group(tallies_group) end if ! Check for the no-tally-reduction method @@ -338,47 +302,41 @@ contains ! If using the no-tally-reduction method, we need to collect tally ! results before writing them to the state point file. - call write_tally_results_nr() + call write_tally_results_nr(file_id) elseif (master) then ! Write number of global realizations - call sp % write_data(n_realizations, "n_realizations") + call write_dataset(file_id, "n_realizations", n_realizations) ! Write global tallies - call sp % write_data(N_GLOBAL_TALLIES, "n_global_tallies") - call sp % write_tally_result(global_tallies, "global_tallies", & - n1=N_GLOBAL_TALLIES, n2=1) + call write_dataset(file_id, "n_global_tallies", N_GLOBAL_TALLIES) + call write_dataset(file_id, "global_tallies", global_tallies) ! Write tallies + tallies_group = open_group(file_id, "tallies") if (tallies_on) then - ! Indicate that tallies are on - call sp % write_data(1, "tallies_present", group="tallies") + call write_dataset(tallies_group, "tallies_present", 1) ! Write all tally results TALLY_RESULTS: do i = 1, n_tallies - ! Set point to current tally tally => tallies(i) ! Write sum and sum_sq for each bin - call sp % write_tally_result(tally % results, "results", & - group="tallies/tally " // trim(to_str(tally % id)), & - n1=size(tally % results, 1), n2=size(tally % results, 2)) - + tally_group = open_group(tallies_group, "tally " // to_str(tally%id)) + call write_dataset(tally_group, "results", tally%results) + call close_group(tally_group) end do TALLY_RESULTS else - ! Indicate tallies are off - call sp % write_data(0, "tallies_present", group="tallies") - + call write_dataset(tallies_group, "tallies_present", 0) end if - ! Close the file for serial writing - call sp % file_close() - + call close_group(tallies_group) + call file_close(file_id) end if if (master .and. n_tallies > 0) then @@ -393,71 +351,64 @@ contains subroutine write_source_point() - type(BinaryOutput) :: sp + integer(HID_T) :: file_id character(MAX_FILE_LEN) :: filename ! Check to write out source for a specified batch - if (sourcepoint_batch % contains(current_batch)) then + if (sourcepoint_batch%contains(current_batch)) then ! Create or open up file if (source_separate) then - ! Set filename filename = trim(path_output) // 'source.' // & & zero_padded(current_batch, count_digits(n_max_batches)) - filename = trim(filename) // '.h5' ! Write message for new file creation call write_message("Creating source file " // trim(filename) // "...", & - &1) + 1) ! Create separate source file - call sp % file_create(filename, serial = .false.) + file_id = file_create(filename, parallel=.true.) ! Write file type - call sp % write_data(FILETYPE_SOURCE, "filetype") - + call write_dataset(file_id, "filetype", FILETYPE_SOURCE) else - ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & zero_padded(current_batch, count_digits(n_max_batches)) filename = trim(filename) // '.h5' ! Reopen statepoint file in parallel - call sp % file_open(filename, 'w', serial = .false.) - + file_id = file_open(filename, 'w', parallel=.true.) end if ! Write out source - call sp % write_source_bank() + call write_source_bank(file_id) ! Close file - call sp % file_close() - + call file_close(file_id) end if ! Also check to write source separately in overwritten file if (source_latest) then ! Set filename - filename = trim(path_output) // 'source' - filename = trim(filename) // '.h5' + filename = trim(path_output) // 'source' // '.h5' ! Write message for new file creation call write_message("Creating source file " // trim(filename) // "...", 1) ! Always create this file because it will be overwritten - call sp % file_create(filename, serial = .false.) + file_id = file_create(filename, parallel=.true.) ! Write file type - call sp % write_data(FILETYPE_SOURCE, "filetype") + call write_dataset(file_id, "filetype", FILETYPE_SOURCE) ! Write out source - call sp % write_source_bank() + call write_source_bank(file_id) ! Close file - call sp % file_close() + call file_close(file_id) end if @@ -467,12 +418,14 @@ contains ! WRITE_TALLY_RESULTS_NR !=============================================================================== - subroutine write_tally_results_nr() + subroutine write_tally_results_nr(file_id) + integer(HID_T), intent(in) :: file_id integer :: i ! loop index integer :: n ! number of filter bins integer :: m ! number of score bins integer :: n_bins ! total number of bins + integer(HID_T) :: tallies_group, tally_group real(8), allocatable :: tally_temp(:,:,:) ! contiguous array of results real(8), target :: global_temp(2,N_GLOBAL_TALLIES) #ifdef MPI @@ -489,16 +442,18 @@ contains if (master) then ! Write number of realizations - call sp % write_data(n_realizations, "n_realizations") + call write_dataset(file_id, "n_realizations", n_realizations) ! Write number of global tallies - call sp % write_data(N_GLOBAL_TALLIES, "n_global_tallies") + call write_dataset(file_id, "n_global_tallies", N_GLOBAL_TALLIES) + + tallies_group = open_group(file_id, "tallies") end if ! Copy global tallies into temporary array for reducing n_bins = 2 * N_GLOBAL_TALLIES - global_temp(1,:) = global_tallies(:) % sum - global_temp(2,:) = global_tallies(:) % sum_sq + global_temp(1,:) = global_tallies(:)%sum + global_temp(2,:) = global_tallies(:)%sum_sq if (master) then ! The MPI_IN_PLACE specifier allows the master to copy values into a @@ -510,19 +465,17 @@ contains ! Transfer values to value on master if (current_batch == n_max_batches .or. satisfy_triggers) then - global_tallies(:) % sum = global_temp(1,:) - global_tallies(:) % sum_sq = global_temp(2,:) + global_tallies(:)%sum = global_temp(1,:) + global_tallies(:)%sum_sq = global_temp(2,:) end if ! Put reduced value in temporary tally result allocate(tallyresult_temp(N_GLOBAL_TALLIES, 1)) - tallyresult_temp(:,1) % sum = global_temp(1,:) - tallyresult_temp(:,1) % sum_sq = global_temp(2,:) - + tallyresult_temp(:,1)%sum = global_temp(1,:) + tallyresult_temp(:,1)%sum_sq = global_temp(2,:) ! Write out global tallies sum and sum_sq - call sp % write_tally_result(tallyresult_temp, "global_tallies", & - n1=N_GLOBAL_TALLIES, n2=1) + call write_dataset(file_id, "global_tallies", tallyresult_temp) ! Deallocate temporary tally result deallocate(tallyresult_temp) @@ -537,17 +490,17 @@ contains if (tallies_on) then ! Indicate that tallies are on if (master) then - call sp % write_data(1, "tallies_present", group="tallies") + call write_dataset(tallies_group, "tallies_present", 1) ! Build list of tally IDs - current => tally_dict % keys() + current => tally_dict%keys() allocate(id_array(n_tallies)) i = 1 do while (associated(current)) - id_array(i) = current % value + id_array(i) = current%value ! Move to next tally - next => current % next + next => current%next deallocate(current) current => next i = i + 1 @@ -561,17 +514,20 @@ contains tally => tallies(i) ! Determine size of tally results array - m = size(tally % results, 1) - n = size(tally % results, 2) + m = size(tally%results, 1) + n = size(tally%results, 2) n_bins = m*n*2 ! Allocate array for storing sums and sums of squares, but ! contiguously in memory for each allocate(tally_temp(2,m,n)) - tally_temp(1,:,:) = tally % results(:,:) % sum - tally_temp(2,:,:) = tally % results(:,:) % sum_sq + tally_temp(1,:,:) = tally%results(:,:)%sum + tally_temp(2,:,:) = tally%results(:,:)%sum_sq if (master) then + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(tally%id))) + ! The MPI_IN_PLACE specifier allows the master to copy values into ! a receive buffer without having a temporary variable #ifdef MPI @@ -582,18 +538,17 @@ contains ! At the end of the simulation, store the results back in the ! regular TallyResults array if (current_batch == n_max_batches .or. satisfy_triggers) then - tally % results(:,:) % sum = tally_temp(1,:,:) - tally % results(:,:) % sum_sq = tally_temp(2,:,:) + tally%results(:,:)%sum = tally_temp(1,:,:) + tally%results(:,:)%sum_sq = tally_temp(2,:,:) end if ! Put in temporary tally result allocate(tallyresult_temp(m,n)) - tallyresult_temp(:,:) % sum = tally_temp(1,:,:) - tallyresult_temp(:,:) % sum_sq = tally_temp(2,:,:) + tallyresult_temp(:,:)%sum = tally_temp(1,:,:) + tallyresult_temp(:,:)%sum_sq = tally_temp(2,:,:) ! Write reduced tally results to file - call sp % write_tally_result(tally % results, "results", & - group="tallies/tally " // trim(to_str(tally % id)), n1=m, n2=n) + call write_dataset(tally_group, "results", tally%results) ! Deallocate temporary tally result deallocate(tallyresult_temp) @@ -607,6 +562,8 @@ contains ! Deallocate temporary copy of tally results deallocate(tally_temp) + + if (master) call close_group(tally_group) end do TALLY_RESULTS deallocate(id_array) @@ -614,10 +571,12 @@ contains else if (master) then ! Indicate that tallies are off - call sp % write_data(0, "tallies_present", group="tallies") + call write_dataset(tallies_group, "tallies_present", 0) end if end if + if (master) call close_group(tallies_group) + end subroutine write_tally_results_nr !=============================================================================== @@ -626,45 +585,49 @@ contains subroutine load_state_point() - character(MAX_FILE_LEN) :: path_temp - character(19) :: current_time integer :: i, j, k - integer :: length(4) integer :: int_array(3) - integer, allocatable :: id_array(:) - integer, allocatable :: key_array(:) integer :: curr_key - integer, allocatable :: temp_array(:) - logical :: source_present - real(8) :: real_array(3) - type(StructuredMesh), pointer :: mesh - type(TallyObject), pointer :: tally integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders + integer, allocatable :: id_array(:) + integer, allocatable :: key_array(:) + integer, allocatable :: temp_array(:) + integer(HID_T) :: file_id + integer(HID_T) :: cmfd_group + integer(HID_T) :: tallies_group, tally_group + integer(HID_T) :: meshes_group, mesh_group + integer(HID_T) :: filter_group, moments_group + real(8) :: real_array(3) + logical :: source_present + character(MAX_FILE_LEN) :: path_temp + character(19) :: current_time character(8) :: moment_name ! name of moment (e.g, P3, Y-1,1) + type(StructuredMesh), pointer :: mesh + type(TallyObject), pointer :: tally ! Write message call write_message("Loading state point " // trim(path_state_point) & - &// "...", 1) + // "...", 1) ! Open file for reading - call sp % file_open(path_state_point, 'r', serial = .false.) + file_id = file_open(path_state_point, 'r', parallel=.true.) ! Read filetype - call sp % read_data(int_array(1), "filetype") + call read_dataset(file_id, "filetype", int_array(1)) ! Read revision number for state point file and make sure it matches with ! current version - call sp % read_data(int_array(1), "revision") + call read_dataset(file_id, "revision", int_array(1)) if (int_array(1) /= REVISION_STATEPOINT) then call fatal_error("State point version does not match current version & &in OpenMC.") end if ! Read OpenMC version - call sp % read_data(int_array(1), "version_major") - call sp % read_data(int_array(2), "version_minor") - call sp % read_data(int_array(3), "version_release") + call read_dataset(file_id, "version_major", int_array(1)) + call read_dataset(file_id, "version_minor", int_array(2)) + call read_dataset(file_id, "version_release", int_array(3)) if (int_array(1) /= VERSION_MAJOR .or. int_array(2) /= VERSION_MINOR & .or. int_array(3) /= VERSION_RELEASE) then if (master) call warning("State point file was created with a different & @@ -672,27 +635,27 @@ contains end if ! Read date and time - call sp % read_data(current_time, "date_and_time") + call read_dataset(file_id, "date_and_time", current_time) ! Read path to input - call sp % read_data(path_temp, "path") + call read_dataset(file_id, "path", path_temp) ! Read and overwrite random number seed - call sp % read_data(seed, "seed") + call read_dataset(file_id, "seed", seed) ! Read and overwrite run information except number of batches - call sp % read_data(run_mode, "run_mode") - call sp % read_data(n_particles, "n_particles") - call sp % read_data(int_array(1), "n_batches") + call read_dataset(file_id, "run_mode", run_mode) + call read_dataset(file_id, "n_particles", n_particles) + call read_dataset(file_id, "n_batches", int_array(1)) ! Take maximum of statepoint n_batches and input n_batches n_batches = max(n_batches, int_array(1)) ! Read batch number to restart at - call sp % read_data(restart_batch, "current_batch") + call read_dataset(file_id, "current_batch", restart_batch) ! Check for source in statepoint if needed - call sp % read_data(int_array(1), "source_present") + call read_dataset(file_id, "source_present", int_array(1)) if (int_array(1) == 1) then source_present = .true. else @@ -706,43 +669,45 @@ contains ! Read information specific to eigenvalue run if (run_mode == MODE_EIGENVALUE) then - call sp % read_data(int_array(1), "n_inactive") - call sp % read_data(gen_per_batch, "gen_per_batch") - call sp % read_data(k_generation, "k_generation", & - length=restart_batch*gen_per_batch) - call sp % read_data(entropy, "entropy", length=restart_batch*gen_per_batch) - call sp % read_data(k_col_abs, "k_col_abs") - call sp % read_data(k_col_tra, "k_col_tra") - call sp % read_data(k_abs_tra, "k_abs_tra") - call sp % read_data(real_array(1:2), "k_combined", length=2) + call read_dataset(file_id, "n_inactive", int_array(1)) + call read_dataset(file_id, "gen_per_batch", gen_per_batch) + call read_dataset(file_id, "k_generation", & + k_generation(1:restart_batch*gen_per_batch)) + call read_dataset(file_id, "entropy", & + entropy(1:restart_batch*gen_per_batch)) + call read_dataset(file_id, "k_col_abs", k_col_abs) + call read_dataset(file_id, "k_col_tra", k_col_tra) + call read_dataset(file_id, "k_abs_tra", k_abs_tra) + call read_dataset(file_id, "k_combined", real_array(1:2)) ! Take maximum of statepoint n_inactive and input n_inactive n_inactive = max(n_inactive, int_array(1)) ! Read in to see if CMFD was on - call sp % read_data(int_array(1), "cmfd_on") + call read_dataset(file_id, "cmfd_on", int_array(1)) ! Read in CMFD info if (int_array(1) == 1) then - call sp % read_data(cmfd % indices, "indices", length=4, group="cmfd") - call sp % read_data(cmfd % k_cmfd, "k_cmfd", length=restart_batch, & - group="cmfd") - length = cmfd % indices([4,1,2,3]) - call sp % read_data(cmfd % cmfd_src, "cmfd_src", & - length=length, group="cmfd") - call sp % read_data(cmfd % entropy, "cmfd_entropy", & - length=restart_batch, group="cmfd") - call sp % read_data(cmfd % balance, "cmfd_balance", & - length=restart_batch, group="cmfd") - call sp % read_data(cmfd % dom, "cmfd_dominance", & - length = restart_batch, group="cmfd") - call sp % read_data(cmfd % src_cmp, "cmfd_srccmp", & - length = restart_batch, group="cmfd") + cmfd_group = open_group(file_id, "cmfd") + call read_dataset(cmfd_group, "indices", cmfd%indices) + call read_dataset(cmfd_group, "k_cmfd", cmfd%k_cmfd(1:restart_batch)) + call read_dataset(cmfd_group, "cmfd_src", cmfd%cmfd_src) + call read_dataset(cmfd_group, "cmfd_entropy", & + cmfd%entropy(1:restart_batch)) + call read_dataset(cmfd_group, "cmfd_balance", & + cmfd%balance(1:restart_batch)) + call read_dataset(cmfd_group, "cmfd_dominance", & + cmfd%dom(1:restart_batch)) + call read_dataset(cmfd_group, "cmfd_srccmp", & + cmfd%src_cmp(1:restart_batch)) + call close_group(cmfd_group) end if end if ! Read number of meshes - call sp % read_data(n_meshes, "n_meshes", group="tallies/meshes") + tallies_group = open_group(file_id, "tallies") + meshes_group = open_group(tallies_group, "meshes") + call read_dataset(meshes_group, "n_meshes", n_meshes) if (n_meshes > 0) then @@ -750,10 +715,8 @@ contains allocate(id_array(n_meshes)) allocate(key_array(n_meshes)) - call sp % read_data(id_array, "ids", & - group="tallies/meshes", length=n_meshes) - call sp % read_data(key_array, "keys", & - group="tallies/meshes", length=n_meshes) + call read_dataset(meshes_group, "ids", id_array) + call read_dataset(meshes_group, "keys", key_array) ! Read and overwrite mesh information MESH_LOOP: do i = 1, n_meshes @@ -761,25 +724,16 @@ contains mesh => meshes(id_array(i)) curr_key = key_array(id_array(i)) - call sp % read_data(mesh % id, "id", & - group="tallies/meshes/mesh " // trim(to_str(curr_key))) - call sp % read_data(mesh % type, "type", & - group="tallies/meshes/mesh " // trim(to_str(curr_key))) - call sp % read_data(mesh % n_dimension, "n_dimension", & - group="tallies/meshes/mesh " // trim(to_str(meshes(i) % id))) - call sp % read_data(mesh % dimension, "dimension", & - group="tallies/meshes/mesh " // trim(to_str(curr_key)), & - length=mesh % n_dimension) - call sp % read_data(mesh % lower_left, "lower_left", & - group="tallies/meshes/mesh " // trim(to_str(curr_key)), & - length=mesh % n_dimension) - call sp % read_data(mesh % upper_right, "upper_right", & - group="tallies/meshes/mesh " // trim(to_str(curr_key)), & - length=mesh % n_dimension) - call sp % read_data(mesh % width, "width", & - group="tallies/meshes/mesh " // trim(to_str(curr_key)), & - length=meshes(i) % n_dimension) - + mesh_group = open_group(meshes_group, "mesh " // & + trim(to_str(curr_key))) + call read_dataset(mesh_group, "id", mesh%id) + call read_dataset(mesh_group, "type", mesh%type) + call read_dataset(mesh_group, "n_dimension", mesh%n_dimension) + call read_dataset(mesh_group, "dimension", mesh%dimension) + call read_dataset(mesh_group, "lower_left", mesh%lower_left) + call read_dataset(mesh_group, "upper_right", mesh%upper_right) + call read_dataset(mesh_group, "width", mesh%width) + call close_group(mesh_group) end do MESH_LOOP deallocate(id_array) @@ -787,15 +741,17 @@ contains end if + call close_group(meshes_group) + ! Read and overwrite number of tallies - call sp % read_data(n_tallies, "n_tallies", group="tallies") + call read_dataset(tallies_group, "n_tallies", n_tallies) ! Read list of tally keys-> IDs allocate(id_array(n_tallies)) allocate(key_array(n_tallies)) - call sp % read_data(id_array, "ids", group="tallies", length=n_tallies) - call sp % read_data(key_array, "keys", group="tallies", length=n_tallies) + call read_dataset(tallies_group, "ids", id_array) + call read_dataset(tallies_group, "keys", key_array) ! Read in tally metadata TALLY_METADATA: do i = 1, n_tallies @@ -803,99 +759,85 @@ contains ! Get pointer to tally tally => tallies(i) curr_key = key_array(id_array(i)) + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(curr_key))) - call sp % read_data(tally % estimator, "estimator", & - group="tallies/tally " // trim(to_str(curr_key))) - call sp % read_data(tally % n_realizations, "n_realizations", & - group="tallies/tally " // trim(to_str(curr_key))) - call sp % read_data(tally % n_filters, "n_filters", & - group="tallies/tally " // trim(to_str(curr_key))) + call read_dataset(tally_group, "estimator", tally%estimator) + call read_dataset(tally_group, "n_realizations", tally%n_realizations) + call read_dataset(tally_group, "n_filters", tally%n_filters) - FILTER_LOOP: do j = 1, tally % n_filters - call sp % read_data(tally % filters(j) % type, "type", & - group="tallies/tally " // trim(to_str(curr_key)) // & - "/filter " // to_str(j)) - call sp % read_data(tally % filters(j) % offset, "offset", & - group="tallies/tally " // trim(to_str(curr_key)) // & - "/filter " // to_str(j)) - call sp % read_data(tally % filters(j) % n_bins, "n_bins", & - group="tallies/tally " // trim(to_str(curr_key)) // & - "/filter " // to_str(j)) - if (tally % filters(j) % type == FILTER_ENERGYIN .or. & - tally % filters(j) % type == FILTER_ENERGYOUT) then - call sp % read_data(tally % filters(j) % real_bins, "bins", & - group="tallies/tally " // trim(to_str(curr_key)) // & - "/filter " // to_str(j), & - length=size(tally % filters(j) % real_bins)) + FILTER_LOOP: do j = 1, tally%n_filters + filter_group = open_group(tally_group, "filter " // trim(to_str(j))) + + call read_dataset(filter_group, "type", tally%filters(j)%type) + call read_dataset(filter_group, "offset", tally%filters(j)%offset) + call read_dataset(filter_group, "n_bins", tally%filters(j)%n_bins) + if (tally%filters(j)%type == FILTER_ENERGYIN .or. & + tally%filters(j)%type == FILTER_ENERGYOUT) then + call read_dataset(filter_group, "bins", tally%filters(j)%real_bins) else - call sp % read_data(tally % filters(j) % int_bins, "bins", & - group="tallies/tally " // trim(to_str(curr_key)) // & - "/filter " // to_str(j), & - length=size(tally % filters(j) % int_bins)) + call read_dataset(filter_group, "bins", tally%filters(j)%int_bins) end if + call close_group(filter_group) end do FILTER_LOOP - call sp % read_data(tally % n_nuclide_bins, "n_nuclides", & - group="tallies/tally " // trim(to_str(curr_key))) + call read_dataset(tally_group, "n_nuclides", tally%n_nuclide_bins) ! Set up nuclide bin array and then read - allocate(temp_array(tally % n_nuclide_bins)) - call sp % read_data(temp_array, "nuclides", & - group="tallies/tally " // trim(to_str(curr_key)), & - length=tally % n_nuclide_bins) + allocate(temp_array(tally%n_nuclide_bins)) + call read_dataset(tally_group, "nuclides", temp_array) - NUCLIDE_LOOP: do j = 1, tally % n_nuclide_bins + NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins if (temp_array(j) > 0) then - tally % nuclide_bins(j) = temp_array(j) + tally%nuclide_bins(j) = temp_array(j) else - tally % nuclide_bins(j) = temp_array(j) + tally%nuclide_bins(j) = temp_array(j) end if end do NUCLIDE_LOOP deallocate(temp_array) ! Write number of score bins, score bins, user score bins - call sp % read_data(tally % n_score_bins, "n_score_bins", & - group="tallies/tally " // trim(to_str(curr_key))) - call sp % read_data(tally % score_bins, "score_bins", & - group="tallies/tally " // trim(to_str(curr_key)), & - length=tally % n_score_bins) - call sp % read_data(tally % n_user_score_bins, "n_user_score_bins", & - group="tallies/tally " // trim(to_str(curr_key))) + call read_dataset(tally_group, "n_score_bins", tally%n_score_bins) + call read_dataset(tally_group, "score_bins", tally%score_bins) + call read_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) ! Read explicit moment order strings for each score bin k = 1 - MOMENT_LOOP: do j = 1, tally % n_user_score_bins - select case(tally % score_bins(k)) + moments_group = open_group(tally_group, "moments") + MOMENT_LOOP: do j = 1, tally%n_user_score_bins + select case(tally%score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - call sp % read_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(curr_key)) // "/moments") + call read_dataset(moments_group, "order" // trim(to_str(k)), & + moment_name) k = k + 1 case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) - do n_order = 0, tally % moment_order(k) - call sp % read_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(curr_key)) // "/moments") + do n_order = 0, tally%moment_order(k) + call read_dataset(moments_group, "order" // trim(to_str(k)), & + moment_name) k = k + 1 end do case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & SCORE_TOTAL_YN) - do n_order = 0, tally % moment_order(k) + do n_order = 0, tally%moment_order(k) do nm_order = -n_order, n_order - call sp % read_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(curr_key)) // & - "/moments") + call read_dataset(moments_group, "order" // trim(to_str(k)), & + moment_name) k = k + 1 end do end do case default - call sp % read_data(moment_name, "order" // trim(to_str(k)), & - group="tallies/tally " // trim(to_str(curr_key)) // "/moments") + call read_dataset(moments_group, "order" // trim(to_str(k)), & + moment_name) k = k + 1 end select end do MOMENT_LOOP + call close_group(moments_group) + call close_group(tally_group) + end do TALLY_METADATA ! Check to make sure source bank is present @@ -908,22 +850,21 @@ contains if (master) then ! Read number of realizations for global tallies - call sp % read_data(n_realizations, "n_realizations", collect=.false.) + call read_dataset(file_id, "n_realizations", n_realizations, indep=.true.) ! Read number of global tallies - call sp % read_data(int_array(1), "n_global_tallies", collect=.false.) + call read_dataset(file_id, "n_global_tallies", int_array(1), indep=.false.) if (int_array(1) /= N_GLOBAL_TALLIES) then call fatal_error("Number of global tallies does not match in state & &point.") end if ! Read global tally data - call sp % read_tally_result(global_tallies, "global_tallies", & - n1=N_GLOBAL_TALLIES, n2=1) + call read_dataset(file_id, "global_tallies", global_tallies) ! Check if tally results are present - call sp % read_data(int_array(1), "tallies_present", & - group="tallies", collect=.false.) + tallies_group = open_group(file_id, "tallies") + call read_dataset(file_id, "tallies_present", int_array(1), indep=.true.) ! Read in sum and sum squared if (int_array(1) == 1) then @@ -934,13 +875,14 @@ contains curr_key = key_array(id_array(i)) ! Read sum and sum_sq for each bin - call sp % read_tally_result(tally % results, "results", & - group="tallies/tally " // trim(to_str(curr_key)), & - n1=size(tally % results, 1), n2=size(tally % results, 2)) - + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(curr_key))) + call read_dataset(tally_group, "results", tally%results) + call close_group(tally_group) end do TALLY_RESULTS - end if + + call close_group(tallies_group) end if deallocate(id_array) @@ -953,30 +895,186 @@ contains if (.not. source_present) then ! Close statepoint file - call sp % file_close() + call file_close(file_id) ! Write message call write_message("Loading source file " // trim(path_source_point) & - &// "...", 1) + // "...", 1) ! Open source file - call sp % file_open(path_source_point, 'r', serial = .false.) + file_id = file_open(path_source_point, 'r', parallel=.true.) ! Read file type - call sp % read_data(int_array(1), "filetype") + call read_dataset(file_id, "filetype", int_array(1)) end if ! Write out source - call sp % read_source_bank() + call read_source_bank(file_id) end if ! Close file - call sp % file_close() + call file_close(file_id) end subroutine load_state_point +!=============================================================================== +! WRITE_SOURCE_BANK writes OpenMC source_bank data +!=============================================================================== + + subroutine write_source_bank(group_id) + use bank_header, only: Bank + + integer(HID_T), intent(in) :: group_id + + integer :: hdf5_err + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + integer(HSIZE_T) :: dims(1) + type(c_ptr) :: f_ptr +#ifdef PHDF5 + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: memspace ! memory space handle + integer(HSIZE_T) :: offset(1) ! source data offset +#endif + +#ifdef PHDF5 + ! Set size of total dataspace for all procs and rank + dims(1) = n_particles + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, dspace, dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + + ! Create another data space but for each proc individually + dims(1) = work + call h5screate_simple_f(1, dims, memspace, hdf5_err) + + ! Get the individual local proc dataspace + call h5dget_space_f(dset, dspace, hdf5_err) + + ! Select hyperslab for this dataspace + offset(1) = work_index(rank) + call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) + + ! Set up the property list for parallel writing + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Write data to file in parallel + call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & + file_space_id=dspace, mem_space_id=memspace, & + xfer_prp=plist) + + ! Close all ids + call h5sclose_f(dspace, hdf5_err) + call h5sclose_f(memspace, hdf5_err) + call h5dclose_f(dset, hdf5_err) + call h5pclose_f(plist, hdf5_err) + +#else + + ! Set size + dims(1) = work + + ! Create dataspace + call h5screate_simple_f(1, dims, dspace, hdf5_err) + + ! Create dataset + call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, & + dspace, dset, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Write dataset to file + call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err) + + ! Close all ids + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + +#endif + + end subroutine write_source_bank + +!=============================================================================== +! READ_SOURCE_BANK reads OpenMC source_bank data +!=============================================================================== + + subroutine read_source_bank(group_id) + use bank_header, only: Bank + + integer(HID_T), intent(in) :: group_id + + integer :: hdf5_err + integer(HID_T) :: dset ! data set handle + type(c_ptr) :: f_ptr +#ifdef PHDF5 + integer :: data_xfer_mode + integer(HID_T) :: plist ! property list + integer(HID_T) :: dspace ! data space handle + integer(HID_T) :: memspace ! memory space handle + integer(HSIZE_T) :: offset(1) ! offset of data + integer(HSIZE_T) :: dims(1) +#endif + +#ifdef PHDF5 + + ! Open the dataset + call h5dopen_f(group_id, "source_bank", dset, hdf5_err) + + ! Create another data space but for each proc individually + dims(1) = work + call h5screate_simple_f(1, dims, memspace, hdf5_err) + + ! Get the individual local proc dataspace + call h5dget_space_f(dset, dspace, hdf5_err) + + ! Select hyperslab for this dataspace + offset(1) = work_index(rank) + call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) + + ! Set up the property list for parallel writing + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Read data from file in parallel + call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & + file_space_id=dspace, mem_space_id=memspace, & + xfer_prp=plist) + + ! Close all ids + call h5sclose_f(dspace, hdf5_err) + call h5sclose_f(memspace, hdf5_err) + call h5dclose_f(dset, hdf5_err) + call h5pclose_f(plist, hdf5_err) + +#else + + ! Open dataset + call h5dopen_f(group_id, "source_bank", dset, hdf5_err) + + ! Set up pointer to data + f_ptr = c_loc(source_bank) + + ! Read dataset from file + call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err) + + ! Close all ids + call h5dclose_f(dset, hdf5_err) + +#endif + + end subroutine read_source_bank + subroutine read_source ! TODO write this routine ! TODO what if n_particles does not match source bank diff --git a/src/track_output.F90 b/src/track_output.F90 index d3716e9b05..d4b2878009 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -6,19 +6,27 @@ module track_output use global - use output_interface, only: BinaryOutput + use hdf5_interface use particle_header, only: Particle use string, only: to_str - implicit none + use hdf5 - type, private :: TrackCoordinates + implicit none + private + + type TrackCoordinates real(8), allocatable :: coords(:,:) end type TrackCoordinates - type(TrackCoordinates), private, allocatable :: tracks(:) + type(TrackCoordinates), allocatable :: tracks(:) !$omp threadprivate(tracks) + public :: initialize_particle_track + public :: write_particle_track + public :: add_particle_track + public :: finalize_particle_track + contains !=============================================================================== @@ -43,19 +51,19 @@ contains ! Add another column to coords i = size(tracks) - if (allocated(tracks(i) % coords)) then - n_tracks = size(tracks(i) % coords, 2) + if (allocated(tracks(i)%coords)) then + n_tracks = size(tracks(i)%coords, 2) allocate(new_coords(3, n_tracks + 1)) - new_coords(:, 1:n_tracks) = tracks(i) % coords - call move_alloc(FROM=new_coords, TO=tracks(i) % coords) + new_coords(:, 1:n_tracks) = tracks(i)%coords + call move_alloc(FROM=new_coords, TO=tracks(i)%coords) else n_tracks = 0 - allocate(tracks(i) % coords(3, 1)) + allocate(tracks(i)%coords(3, 1)) end if ! Write current coordinates into the newest column. n_tracks = n_tracks + 1 - tracks(i) % coords(:, n_tracks) = p % coord(1) % xyz + tracks(i)%coords(:, n_tracks) = p%coord(1)%xyz end subroutine write_particle_track !=============================================================================== @@ -87,35 +95,32 @@ contains subroutine finalize_particle_track(p) type(Particle), intent(in) :: p - integer :: length(2) - character(MAX_FILE_LEN) :: fname - type(BinaryOutput) :: binout - integer :: i - integer, allocatable :: n_coords(:) integer :: n_particle_tracks + integer(HID_T) :: file_id + character(MAX_FILE_LEN) :: fname + integer, allocatable :: n_coords(:) fname = trim(path_output) // 'track_' // trim(to_str(current_batch)) & - // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p % id)) & + // '_' // trim(to_str(current_gen)) // '_' // trim(to_str(p%id)) & // '.h5' ! Determine total number of particles and number of coordinates for each n_particle_tracks = size(tracks) allocate(n_coords(n_particle_tracks)) do i = 1, n_particle_tracks - n_coords(i) = size(tracks(i) % coords, 2) + n_coords(i) = size(tracks(i)%coords, 2) end do !$omp critical (FinalizeParticleTrack) - call binout % file_create(fname) - call binout % write_data(n_particle_tracks, 'n_particles') - call binout % write_data(n_coords, 'n_coords', length=n_particle_tracks) + file_id = file_create(fname) + call write_dataset(file_id, 'n_particles', n_particle_tracks) + call write_dataset(file_id, 'n_coords', n_coords) do i = 1, n_particle_tracks - length(:) = [3, n_coords(i)] - call binout % write_data(tracks(i) % coords, 'coordinates_' // & - trim(to_str(i)), length=length) + call write_dataset(file_id, 'coordinates_' // trim(to_str(i)), & + tracks(i)%coords) end do - call binout % file_close() + call file_close(file_id) !$omp end critical (FinalizeParticleTrack) deallocate(tracks) end subroutine finalize_particle_track From 276dba020f87f2ccd6521030f114eb4b95592803 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Sep 2015 12:22:48 +0700 Subject: [PATCH 051/519] Fixes in source bank writing/reading to enable MPI+HDF5 (without PHDF5) --- src/hdf5_interface.F90 | 18 ++--- src/state_point.F90 | 178 ++++++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 92 deletions(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 1684c352b7..491337e003 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -85,11 +85,10 @@ contains logical :: parallel_ ! Check for serial option - if (present(parallel)) then - parallel_ = parallel - else - parallel_ = .false. - end if + parallel_ = .false. +#ifdef PHDF5 + if (present(parallel)) parallel_ = parallel +#endif if (parallel_) then ! Setup file access property list with parallel I/O access @@ -132,11 +131,10 @@ contains integer :: open_mode ! HDF5 open mode ! Check for serial option - if (present(parallel)) then - parallel_ = parallel - else - parallel_ = .false. - end if + parallel_ = .false. +#ifdef PHDF5 + if (present(parallel)) parallel_ = parallel +#endif ! Determine access type open_mode = H5F_ACC_RDONLY_F diff --git a/src/state_point.F90 b/src/state_point.F90 index 084289bee0..aca6fafb75 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -351,65 +351,60 @@ contains subroutine write_source_point() + logical :: parallel integer(HID_T) :: file_id character(MAX_FILE_LEN) :: filename + ! When using parallel HDF5, the file is written to collectively by all + ! processes. With MPI-only, the file is opened and written by the master + ! (note that the call to write_source_bank is by all processes since slave + ! processes need to send source bank data to the master. +#ifdef PHDF5 + parallel = .true. +#else + parallel = .false. +#endif + ! Check to write out source for a specified batch if (sourcepoint_batch%contains(current_batch)) then - - ! Create or open up file if (source_separate) then - ! Set filename filename = trim(path_output) // 'source.' // & & zero_padded(current_batch, count_digits(n_max_batches)) filename = trim(filename) // '.h5' - - ! Write message for new file creation - call write_message("Creating source file " // trim(filename) // "...", & - 1) + call write_message("Creating source file " // trim(filename) & + // "...", 1) ! Create separate source file - file_id = file_create(filename, parallel=.true.) - - ! Write file type - call write_dataset(file_id, "filetype", FILETYPE_SOURCE) + if (master .or. parallel) then + file_id = file_create(filename, parallel=.true.) + call write_dataset(file_id, "filetype", FILETYPE_SOURCE) + end if else - ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & zero_padded(current_batch, count_digits(n_max_batches)) filename = trim(filename) // '.h5' - ! Reopen statepoint file in parallel - file_id = file_open(filename, 'w', parallel=.true.) + if (master .or. parallel) then + file_id = file_open(filename, 'w', parallel=.true.) + end if end if - ! Write out source call write_source_bank(file_id) - - ! Close file - call file_close(file_id) + if (master .or. parallel) call file_close(file_id) end if ! Also check to write source separately in overwritten file if (source_latest) then - ! Set filename filename = trim(path_output) // 'source' // '.h5' - - ! Write message for new file creation call write_message("Creating source file " // trim(filename) // "...", 1) + if (master .or. parallel) then + file_id = file_create(filename, parallel=.true.) + call write_dataset(file_id, "filetype", FILETYPE_SOURCE) + end if - ! Always create this file because it will be overwritten - file_id = file_create(filename, parallel=.true.) - - ! Write file type - call write_dataset(file_id, "filetype", FILETYPE_SOURCE) - - ! Write out source call write_source_bank(file_id) - ! Close file - call file_close(file_id) - + if (master .or. parallel) call file_close(file_id) end if end subroutine write_source_point @@ -931,13 +926,18 @@ contains integer :: hdf5_err integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle + integer(HID_T) :: memspace ! memory space handle + integer(HSIZE_T) :: offset(1) ! source data offset integer(HSIZE_T) :: dims(1) type(c_ptr) :: f_ptr #ifdef PHDF5 integer :: data_xfer_mode integer(HID_T) :: plist ! property list - integer(HID_T) :: memspace ! memory space handle - integer(HSIZE_T) :: offset(1) ! source data offset +#else + integer :: i +#ifdef MPI + type(Bank), allocatable, target :: temp_source(:) +#endif #endif #ifdef PHDF5 @@ -945,15 +945,11 @@ contains dims(1) = n_particles call h5screate_simple_f(1, dims, dspace, hdf5_err) call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, dspace, dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) ! Create another data space but for each proc individually dims(1) = work call h5screate_simple_f(1, dims, memspace, hdf5_err) - ! Get the individual local proc dataspace - call h5dget_space_f(dset, dspace, hdf5_err) - ! Select hyperslab for this dataspace offset(1) = work_index(rank) call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) @@ -978,25 +974,60 @@ contains #else - ! Set size - dims(1) = work + if (master) then + ! Create dataset big enough to hold all source sites + dims(1) = n_particles + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, & + dspace, dset, hdf5_err) - ! Create dataspace - call h5screate_simple_f(1, dims, dspace, hdf5_err) + ! Save source bank sites since the souce_bank array is overwritten below +#ifdef MPI + allocate(temp_source(work)) + temp_source(:) = source_bank(:) +#endif - ! Create dataset - call h5dcreate_f(group_id, "source_bank", hdf5_bank_t, & - dspace, dset, hdf5_err) + do i = 0, n_procs - 1 + ! Create memory space + dims(1) = work_index(i+1) - work_index(i) + call h5screate_simple_f(1, dims, memspace, hdf5_err) - ! Set up pointer to data - f_ptr = c_loc(source_bank) +#ifdef MPI + ! Receive source sites from other processes + if (i > 0) then + call MPI_RECV(source_bank, int(dims(1)), MPI_BANK, i, i, & + MPI_COMM_WORLD, MPI_STATUS_IGNORE, mpi_err) + end if +#endif - ! Write dataset to file - call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err) + ! Select hyperslab for this dataspace + call h5dget_space_f(dset, dspace, hdf5_err) + offset(1) = work_index(i) + call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) - ! Close all ids - call h5dclose_f(dset, hdf5_err) - call h5sclose_f(dspace, hdf5_err) + ! Set up pointer to data and write data to hyperslab + f_ptr = c_loc(source_bank) + call h5dwrite_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & + file_space_id=dspace, mem_space_id=memspace) + + call h5sclose_f(memspace, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + end do + + ! Close all ids + call h5dclose_f(dset, hdf5_err) + + ! Restore state of source bank +#ifdef MPI + source_bank(:) = temp_source(:) + deallocate(temp_source) +#endif + else +#ifdef MPI + call MPI_SEND(source_bank, int(work), MPI_BANK, 0, rank, & + MPI_COMM_WORLD, mpi_err) +#endif + end if #endif @@ -1013,18 +1044,16 @@ contains integer :: hdf5_err integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data space handle + integer(HID_T) :: memspace ! memory space handle + integer(HSIZE_T) :: dims(1) + integer(HSIZE_T) :: offset(1) ! offset of data type(c_ptr) :: f_ptr #ifdef PHDF5 integer :: data_xfer_mode integer(HID_T) :: plist ! property list - integer(HID_T) :: dspace ! data space handle - integer(HID_T) :: memspace ! memory space handle - integer(HSIZE_T) :: offset(1) ! offset of data - integer(HSIZE_T) :: dims(1) #endif -#ifdef PHDF5 - ! Open the dataset call h5dopen_f(group_id, "source_bank", dset, hdf5_err) @@ -1032,46 +1061,31 @@ contains dims(1) = work call h5screate_simple_f(1, dims, memspace, hdf5_err) - ! Get the individual local proc dataspace + ! Select hyperslab for each process call h5dget_space_f(dset, dspace, hdf5_err) - - ! Select hyperslab for this dataspace offset(1) = work_index(rank) call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims, hdf5_err) - ! Set up the property list for parallel writing - call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) - call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) - ! Set up pointer to data f_ptr = c_loc(source_bank) - ! Read data from file in parallel +#ifdef PHDF5 + ! Read data in parallel + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, H5FD_MPIO_COLLECTIVE_F, hdf5_err) call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & file_space_id=dspace, mem_space_id=memspace, & xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#else + call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err, & + file_space_id=dspace, mem_space_id=memspace) +#endif ! Close all ids call h5sclose_f(dspace, hdf5_err) call h5sclose_f(memspace, hdf5_err) call h5dclose_f(dset, hdf5_err) - call h5pclose_f(plist, hdf5_err) - -#else - - ! Open dataset - call h5dopen_f(group_id, "source_bank", dset, hdf5_err) - - ! Set up pointer to data - f_ptr = c_loc(source_bank) - - ! Read dataset from file - call h5dread_f(dset, hdf5_bank_t, f_ptr, hdf5_err) - - ! Close all ids - call h5dclose_f(dset, hdf5_err) - -#endif end subroutine read_source_bank From 13c4d3ccddce0c991d3c2f989554022e45e62701 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Sep 2015 12:32:26 +0700 Subject: [PATCH 052/519] Write number of particles/batches in summary file for fixed source --- src/hdf5_summary.F90 | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/hdf5_summary.F90 b/src/hdf5_summary.F90 index e8f566c434..3b28e885d6 100644 --- a/src/hdf5_summary.F90 +++ b/src/hdf5_summary.F90 @@ -33,23 +33,22 @@ contains ! Write header information call hdf5_write_header(file_id) - ! Write eigenvalue information + ! Write number of particles + call write_dataset(file_id, "n_particles", n_particles) + call write_dataset(file_id, "n_batches", n_batches) + call write_attribute_string(file_id, "n_particles", & + "description", "Number of particles per generation") + call write_attribute_string(file_id, "n_batches", & + "description", "Total number of batches") + + ! Write eigenvalue information if (run_mode == MODE_EIGENVALUE) then - - ! Write number of particles - call write_dataset(file_id, "n_particles", n_particles) - - ! Use H5LT interface to write n_batches, n_inactive, and n_active - call write_dataset(file_id, "n_batches", n_batches) + ! write number of inactive/active batches and generations/batch call write_dataset(file_id, "n_inactive", n_inactive) call write_dataset(file_id, "n_active", n_active) call write_dataset(file_id, "gen_per_batch", gen_per_batch) ! Add description of each variable - call write_attribute_string(file_id, "n_particles", & - "description", "Number of particles per generation") - call write_attribute_string(file_id, "n_batches", & - "description", "Total number of batches") call write_attribute_string(file_id, "n_inactive", & "description", "Number of inactive batches") call write_attribute_string(file_id, "n_active", & From 6d3199b7ab37ad5664ca3b810f1031d381e41f1f Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Sep 2015 12:34:03 +0700 Subject: [PATCH 053/519] Get rid of unused read_source routine in state_point module --- src/state_point.F90 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/state_point.F90 b/src/state_point.F90 index aca6fafb75..0267ed4ecb 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -1089,8 +1089,4 @@ contains end subroutine read_source_bank - subroutine read_source -! TODO write this routine -! TODO what if n_particles does not match source bank - end subroutine read_source end module state_point From 04aecbcb948acbaeaca6cfc3c68a292db74fdcda Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Sep 2015 12:50:19 +0700 Subject: [PATCH 054/519] Remove remnants of binary files --- tests/cleanup | 4 ++-- .../test_filter_distribcell/test_filter_distribcell.py | 5 ++--- tests/test_output/test_output.py | 4 ++-- tests/test_source_file/test_source_file.py | 10 ++++------ tests/test_sourcepoint_batch/test_sourcepoint_batch.py | 7 +++---- .../test_sourcepoint_interval.py | 7 +++---- .../test_sourcepoint_latest/test_sourcepoint_latest.py | 5 ++--- .../test_statepoint_sourcesep.py | 5 ++--- tests/test_track_output/test_track_output.py | 4 ++-- 9 files changed, 22 insertions(+), 29 deletions(-) diff --git a/tests/cleanup b/tests/cleanup index 7b81d2d9dd..3369c797ee 100755 --- a/tests/cleanup +++ b/tests/cleanup @@ -5,6 +5,6 @@ # folders. This can occur if a previous error # occurred and the test suite was rerun without # deleting left over binary files. This will -# cause an assertion error in some of the +# cause an assertion error in some of the # tests. -find . \( -name "*.binary" -o -name "*.h5" -o -name "*.ppm" \) -exec rm -f {} \; +find . \( -name "*.h5" -o -name "*.ppm" \) -exec rm -f {} \; diff --git a/tests/test_filter_distribcell/test_filter_distribcell.py b/tests/test_filter_distribcell/test_filter_distribcell.py index 492f03daef..8370e40e7f 100644 --- a/tests/test_filter_distribcell/test_filter_distribcell.py +++ b/tests/test_filter_distribcell/test_filter_distribcell.py @@ -67,9 +67,8 @@ class DistribcellTestHarness(TestHarness): statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name)) assert len(statepoint) == 1, 'Either multiple or no statepoint files ' \ 'exist.' - assert statepoint[0].endswith('binary') \ - or statepoint[0].endswith('h5'), \ - 'Statepoint file is not a binary or hdf5 file.' + assert statepoint[0].endswith('h5'), \ + 'Statepoint file is not a HDF5 file.' if tallies_out_present: assert os.path.exists(os.path.join(os.getcwd(), 'tallies.out')), \ 'Tally output file does not exist.' diff --git a/tests/test_output/test_output.py b/tests/test_output/test_output.py index 1f51742ba2..0225d9fed0 100644 --- a/tests/test_output/test_output.py +++ b/tests/test_output/test_output.py @@ -14,8 +14,8 @@ class OutputTestHarness(TestHarness): # Check for the summary. summary = glob.glob(os.path.join(os.getcwd(), 'summary.*')) assert len(summary) == 1, 'Either multiple or no summary file exists.' - assert summary[0].endswith('out') or summary[0].endswith('h5'),\ - 'Summary file is not a binary or hdf5 file.' + assert summary[0].endswith('h5'),\ + 'Summary file is not a HDF5 file.' # Check for the cross sections. assert os.path.exists(os.path.join(os.getcwd(), 'cross_sections.out')),\ diff --git a/tests/test_source_file/test_source_file.py b/tests/test_source_file/test_source_file.py index d9aaa9a0fa..d7ed8b80af 100644 --- a/tests/test_source_file/test_source_file.py +++ b/tests/test_source_file/test_source_file.py @@ -66,15 +66,13 @@ class SourceFileTestHarness(TestHarness): statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name)) assert len(statepoint) == 1, 'Either multiple or no statepoint files ' \ 'exist.' - assert statepoint[0].endswith('binary') \ - or statepoint[0].endswith('h5'), \ - 'Statepoint file is not a binary or hdf5 file.' + assert statepoint[0].endswith('h5'), \ + 'Statepoint file is not a HDF5 file.' source = glob.glob(os.path.join(os.getcwd(), 'source.10.*')) assert len(source) == 1, 'Either multiple or no source files exist.' - assert source[0].endswith('binary') \ - or source[0].endswith('h5'), \ - 'Source file is not a binary or hdf5 file.' + assert source[0].endswith('h5'), \ + 'Source file is not a HDF5 file.' def _run_openmc_restart(self): # Get the name of the source file. diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index 8cafb41084..a902236599 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -9,10 +9,9 @@ class SourcepointTestHarness(TestHarness): def _test_output_created(self): """Make sure statepoint.* files have been created.""" statepoint = glob.glob(os.path.join(os.getcwd(), 'statepoint.*')) - assert len(statepoint) == 5, '5 statepoint files must exist.' - assert statepoint[0].endswith('binary') \ - or statepoint[0].endswith('h5'), \ - 'Statepoint file is not a binary or hdf5 file.' + assert len(statepoint) == 5, '5 statepoint files must exist.' + assert statepoint[0].endswith('h5'), \ + 'Statepoint file is not a HDF5 file.' def _get_results(self): """Digest info in the statepoint and return as a string.""" diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index 8cafb41084..a902236599 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -9,10 +9,9 @@ class SourcepointTestHarness(TestHarness): def _test_output_created(self): """Make sure statepoint.* files have been created.""" statepoint = glob.glob(os.path.join(os.getcwd(), 'statepoint.*')) - assert len(statepoint) == 5, '5 statepoint files must exist.' - assert statepoint[0].endswith('binary') \ - or statepoint[0].endswith('h5'), \ - 'Statepoint file is not a binary or hdf5 file.' + assert len(statepoint) == 5, '5 statepoint files must exist.' + assert statepoint[0].endswith('h5'), \ + 'Statepoint file is not a HDF5 file.' def _get_results(self): """Digest info in the statepoint and return as a string.""" diff --git a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py index 5ae3984626..8c04641b7b 100644 --- a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py +++ b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py @@ -12,9 +12,8 @@ class SourcepointTestHarness(TestHarness): source = glob.glob(os.path.join(os.getcwd(), 'source.*')) assert len(source) == 1, 'Either multiple or no source files ' \ 'exist.' - assert source[0].endswith('binary') \ - or source[0].endswith('h5'), \ - 'Source file is not a binary or hdf5 file.' + assert source[0].endswith('h5'), \ + 'Source file is not a HDF5 file.' if __name__ == '__main__': diff --git a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py index 861a04f189..acbb0180bf 100644 --- a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py +++ b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py @@ -12,9 +12,8 @@ class SourcepointTestHarness(TestHarness): source = glob.glob(os.path.join(os.getcwd(), 'source.*')) assert len(source) == 1, 'Either multiple or no source files ' \ 'exist.' - assert source[0].endswith('binary') \ - or source[0].endswith('h5'), \ - 'Source file is not a binary or hdf5 file.' + assert source[0].endswith('h5'), \ + 'Source file is not a HDF5 file.' if __name__ == '__main__': diff --git a/tests/test_track_output/test_track_output.py b/tests/test_track_output/test_track_output.py index 31d29b7420..1192d1b3a3 100644 --- a/tests/test_track_output/test_track_output.py +++ b/tests/test_track_output/test_track_output.py @@ -16,8 +16,8 @@ class TrackTestHarness(TestHarness): outputs.append(glob.glob(''.join((os.getcwd(), '/track_1_1_2.*')))) for files in outputs: assert len(files) == 1, 'Multiple or no track files detected.' - assert files[0].endswith('binary') or files[0].endswith('h5'),\ - 'Track files are not binary or hdf5 files' + assert files[0].endswith('h5'),\ + 'Track files are not HDF5 files' def _get_results(self): """Digest info in the statepoint and return as a string.""" From 415f4684bc0c90875e5885c1c8ec3ef00f51ce5e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Sep 2015 15:29:05 +0700 Subject: [PATCH 055/519] Add two missing use ISO_C_BINDING statements --- src/initialize.F90 | 2 ++ src/state_point.F90 | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/initialize.F90 b/src/initialize.F90 index 29e5f8921f..68fccf4176 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -36,6 +36,8 @@ module initialize use hdf5 + use, intrinsic :: ISO_C_BINDING, only: c_loc + implicit none contains diff --git a/src/state_point.F90 b/src/state_point.F90 index 0267ed4ecb..7688d5d338 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -28,6 +28,8 @@ module state_point use hdf5 + use, intrinsic :: ISO_C_BINDING, only: c_loc, c_ptr + implicit none contains From 40d99bac13b10069fe884848b3d266d9c0342f06 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Sep 2015 15:34:29 +0700 Subject: [PATCH 056/519] Dont use -Wall with gfortran 4.6 (causes lots of unused variable warnings on Travis from HDF5 common blocks) --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 623eb0dcbe..76c099d52b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,7 +110,10 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) # GNU Fortran compiler options list(APPEND f90flags -cpp -std=f2008 -fbacktrace) if(debug) - list(APPEND f90flags -g -Wall -pedantic -fbounds-check + if(NOT (GCC_VERSION VERSION_LESS 4.7)) + list(APPEND f90flags -Wall) + endif() + list(APPEND f90flags -g -pedantic -fbounds-check -ffpe-trap=invalid,overflow,underflow) list(APPEND ldflags -g) endif() From e57d87ab8fe5c9ab9a13ad9ae70c612450f78b53 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 5 Sep 2015 16:22:22 +0800 Subject: [PATCH 057/519] Respond to @wbinventor comments on pull request #447 --- openmc/statepoint.py | 9 ++-- scripts/openmc-track-to-vtk | 5 --- src/initialize.F90 | 4 +- src/{hdf5_summary.F90 => summary.F90} | 59 ++++++++++++++------------- 4 files changed, 38 insertions(+), 39 deletions(-) rename src/{hdf5_summary.F90 => summary.F90} (96%) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index af423b0277..06ed51c18d 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -199,7 +199,7 @@ class StatePoint(object): self._n_inactive = self._f['n_inactive'].value self._gen_per_batch = self._f['gen_per_batch'].value - self._k_batch = self._f['k_generation'].value + self._k_generation = self._f['k_generation'].value self._entropy = self._f['entropy'].value self._k_col_abs = self._f['k_col_abs'].value @@ -358,7 +358,7 @@ class StatePoint(object): filter.num_bins = n_bins if FILTER_TYPES[filter_type] == 'mesh': - key = self._mesh_keys[list(self._mesh_ids).index(bins)] + key = self._mesh_keys[self._mesh_ids == bins][0] filter.mesh = self._meshes[key] # Add Filter to the Tally @@ -378,8 +378,9 @@ class StatePoint(object): tally.num_score_bins = n_score_bins - scores = [SCORE_TYPES[j] for j in self._f[ - '{0}{1}/score_bins'.format(base, tally_key)].value] + score_bins = self._f['{0}{1}/score_bins'.format( + base, tally_key)].value + scores = [SCORE_TYPES[score] for score in score_bins] n_user_scores = self._f['{0}{1}/n_user_score_bins' .format(base, tally_key)].value diff --git a/scripts/openmc-track-to-vtk b/scripts/openmc-track-to-vtk index c900c4aa50..e22a22dea3 100755 --- a/scripts/openmc-track-to-vtk +++ b/scripts/openmc-track-to-vtk @@ -40,11 +40,6 @@ def main(): # Parse commandline arguments. args = _parse_args() - # Check input file extensions. - for fname in args.input: - if not fname.endswith('.h5'): - raise ValueError("Input file names must an HDF5 file.") - # Make sure that the output filename ends with '.pvtp'. if not args.out: args.out = 'tracks.pvtp' diff --git a/src/initialize.F90 b/src/initialize.F90 index 68fccf4176..bd479032f6 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -14,7 +14,6 @@ module initialize use global use hdf5_interface, only: file_open, read_dataset, file_close, hdf5_bank_t,& hdf5_tallyresult_t, hdf5_integer8_t - use hdf5_summary, only: hdf5_write_summary use input_xml, only: read_input_xml, read_cross_sections_xml, & cells_in_univ_dict, read_plots_xml use material_header, only: Material @@ -23,6 +22,7 @@ module initialize use random_lcg, only: initialize_prng use state_point, only: load_state_point use string, only: to_str, str_to_int, starts_with, ends_with + use summary, only: write_summary use tally_header, only: TallyObject, TallyResult, TallyFilter use tally_initialize, only: configure_tallies @@ -153,7 +153,7 @@ contains call print_plot() else ! Write summary information - if (output_summary) call hdf5_write_summary() + if (output_summary) call write_summary() ! Write cross section information if (output_xs) call write_xs_summary() diff --git a/src/hdf5_summary.F90 b/src/summary.F90 similarity index 96% rename from src/hdf5_summary.F90 rename to src/summary.F90 index 3b28e885d6..cc9a909c88 100644 --- a/src/hdf5_summary.F90 +++ b/src/summary.F90 @@ -1,4 +1,4 @@ -module hdf5_summary +module summary use ace_header, only: Reaction, UrrData, Nuclide use constants @@ -16,14 +16,17 @@ module hdf5_summary use hdf5 implicit none + private + + public :: write_summary contains !=============================================================================== -! HDF5_WRITE_SUMMARY +! WRITE_SUMMARY !=============================================================================== - subroutine hdf5_write_summary() + subroutine write_summary() integer(HID_T) :: file_id @@ -31,7 +34,7 @@ contains file_id = file_create("summary.h5") ! Write header information - call hdf5_write_header(file_id) + call write_header(file_id) ! Write number of particles call write_dataset(file_id, "n_particles", n_particles) @@ -57,23 +60,23 @@ contains "description", "Number of generations per batch") end if - call hdf5_write_geometry(file_id) - call hdf5_write_materials(file_id) - call hdf5_write_nuclides(file_id) + call write_geometry(file_id) + call write_materials(file_id) + call write_nuclides(file_id) if (n_tallies > 0) then - call hdf5_write_tallies(file_id) + call write_tallies(file_id) end if ! Terminate access to the file. call file_close(file_id) - end subroutine hdf5_write_summary + end subroutine write_summary !=============================================================================== -! HDF5_WRITE_HEADER +! WRITE_HEADER !=============================================================================== - subroutine hdf5_write_header(file_id) + subroutine write_header(file_id) integer(HID_T), intent(in) :: file_id ! Write version information @@ -89,13 +92,13 @@ contains call write_attribute_string(file_id, "n_procs", "description", & "Number of MPI processes") - end subroutine hdf5_write_header + end subroutine write_header !=============================================================================== -! HDF5_WRITE_GEOMETRY +! WRITE_GEOMETRY !=============================================================================== - subroutine hdf5_write_geometry(file_id) + subroutine write_geometry(file_id) integer(HID_T), intent(in) :: file_id integer :: i, j, k, m @@ -379,13 +382,13 @@ contains call close_group(lattices_group) call close_group(geom_group) - end subroutine hdf5_write_geometry + end subroutine write_geometry !=============================================================================== -! HDF5_WRITE_MATERIALS +! WRITE_MATERIALS !=============================================================================== - subroutine hdf5_write_materials(file_id) + subroutine write_materials(file_id) integer(HID_T), intent(in) :: file_id integer :: i @@ -452,13 +455,13 @@ contains call close_group(materials_group) - end subroutine hdf5_write_materials + end subroutine write_materials !=============================================================================== -! HDF5_WRITE_TALLIES +! WRITE_TALLIES !=============================================================================== - subroutine hdf5_write_tallies(file_id) + subroutine write_tallies(file_id) integer(HID_T), intent(in) :: file_id integer :: i, j @@ -580,13 +583,13 @@ contains call close_group(tallies_group) - end subroutine hdf5_write_tallies + end subroutine write_tallies !=============================================================================== -! HDF5_WRITE_NUCLIDES +! WRITE_NUCLIDES !=============================================================================== - subroutine hdf5_write_nuclides(file_id) + subroutine write_nuclides(file_id) integer(HID_T), intent(in) :: file_id integer :: i, j @@ -689,13 +692,13 @@ contains call close_group(nuclides_group) - end subroutine hdf5_write_nuclides + end subroutine write_nuclides !=============================================================================== -! HDF5_WRITE_TIMING +! WRITE_TIMING !=============================================================================== - subroutine hdf5_write_timing(file_id) + subroutine write_timing(file_id) integer(HID_T), intent(in) :: file_id integer(8) :: total_particles @@ -748,6 +751,6 @@ contains call write_dataset(time_group, "neutrons_per_second", speed) call close_group(time_group) - end subroutine hdf5_write_timing + end subroutine write_timing -end module hdf5_summary +end module summary From efb3c0488f0d6b08c6b75d517bf06fba6ac34ab1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 6 Sep 2015 18:51:43 -0400 Subject: [PATCH 058/519] Implemented Tally.summation(...) routine --- openmc/mgxs/mgxs.py | 61 +++++++++++++------------- openmc/tallies.py | 103 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 126 insertions(+), 38 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index c01c8438a1..b2019a20aa 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -114,6 +114,7 @@ class MultiGroupXS(object): def __init__(self, domain=None, domain_type=None, energy_groups=None, name=''): + self._name = '' self._xs_type = None self._domain = None @@ -141,7 +142,7 @@ class MultiGroupXS(object): 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 this is the first time we have tried to copy this object, copy it if existing is None: clone = type(self).__new__(type(self)) clone._name = self.name @@ -151,7 +152,7 @@ class MultiGroupXS(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._num_groups = self.num_groups clone._xs_tally = copy.deepcopy(self.xs_tally, memo) - clone._subdomain_offsets = copy.deepcopy(self.subdomain_indices, memo) + clone._subdomain_indices = copy.deepcopy(self.subdomain_indices, memo) clone._offset = copy.deepcopy(self.offset, memo) clone._tallies = dict() @@ -227,15 +228,15 @@ class MultiGroupXS(object): def _find_domain_offset(self): """Finds and stores the offset of the domain tally filter""" - tally = self.tallies[self.tallies.keys()[0]] + tally = self.tallies.values()[0] filter = tally.find_filter(self.domain_type, [self.domain.id]) self._offset = filter.offset - def set_subdomain_index(self, subdomain_id, offset): + def set_subdomain_index(self, subdomain_id, index): """Set the filter bin index for a subdomain of the domain. - This is primary useful when the domain type is 'distribcell', in which - case it can be useful to map each subdomain (a cell instance) to its + This is primarily useful when the domain type is 'distribcell', in + which case one may wish to map each subdomain (a cell instance) to its filter bin in the derived multi-group cross-section tally data array. Parameters @@ -248,10 +249,10 @@ class MultiGroupXS(object): """ cv.check_type('subdomain id', subdomain_id, Integral) - cv.check_type('subdomain offset', offset, Integral) + cv.check_type('subdomain offset', index, Integral) cv.check_greater_than('subdomain id', subdomain_id, 0, True) cv.check_greater_than('subdomain offset', subdomain_id, 0, True) - self._subdomain_indices[subdomain_id] = offset + self._subdomain_indices[subdomain_id] = index @abc.abstractmethod def _create_tallies(self, scores, all_filters, keys, estimator): @@ -274,8 +275,7 @@ class MultiGroupXS(object): """ cv.check_value('scores', scores, openmc.SCORE_TYPES) - # FIXME : Use @smharper's recursive iterable checker - # cv.check_type('filters', all_filters, openmc.Filter) + cv.check_iterable_type('filters', all_filters, openmc.Filter, 1, 2) cv.check_type('keys', keys, Iterable, basestring) cv.check_length('scores', scores, len(keys)) cv.check_value('estimator', estimator, ['analog', 'tracklength']) @@ -299,14 +299,17 @@ class MultiGroupXS(object): This method can be used to extract the indices into the multi-group cross-section tally data array for a subdomain (i.e., cell instance). + See also : get_subdomains + Parameters ---------- subdomains : Iterable of Integral or 'all' Subdomain IDs of interest Returns - indices : NumPy ndarray - Array of subdomain indices indexed in the order of the subdomains + ---------- + indices : ndarray + The subdomain indices indexed in the order of the subdomains Raises ------ @@ -319,8 +322,8 @@ class MultiGroupXS(object): cv.check_type('subdomains', subdomains, Iterable, Integral) if subdomains == 'all': - # FIXME: This isn't correct any more!! - # indices = np.arange(self.xs.shape[1]) + num_subdomains = len(self.subdomain_indices) + indices = np.arange(num_subdomains) else: indices = np.zeros(len(subdomains), dtype=np.int64) @@ -340,7 +343,7 @@ class MultiGroupXS(object): This method can be used to extract the subdomains for the multi-group cross-section from their indices in the tally data array. - See also : get_subdomain_offsets + See also : get_subdomain_indices Parameters ---------- @@ -348,7 +351,8 @@ class MultiGroupXS(object): Subdomain indices of interest Returns - subdomains : NumPy ndarray + ---------- + subdomains : ndarray Array of subdomain IDs indexed in the order of the indices Raises @@ -370,9 +374,9 @@ class MultiGroupXS(object): for i, index in enumerate(indices): if index in values: - subdomains[i] = keys[values.index(indices)] + subdomains[i] = keys[values.index(index)] else: - msg = 'Unable to get subdomain for offset "{0}" since it ' \ + msg = 'Unable to get subdomain for index "{0}" since it ' \ 'is not a valid index'.format(index) raise ValueError(msg) @@ -408,21 +412,20 @@ class MultiGroupXS(object): if self.xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) - if groups != 'all': - cv.check_value('groups', groups, Iterable, Integral) - if subdomains != 'all': - cv.check_value('subdomains', subdomains, Iterable, Integral) filters = [] filter_bins = [] # Construct a collection of the domain filter bins - filters.append(self.domain_type) - filter_bins.append(subdomains) + if subdomains != 'all': + cv.check_value('subdomains', subdomains, Iterable, Integral) + filters.append(self.domain_type) + filter_bins.append(tuple(subdomains)) - # Construct a collection of the energy group filter bins - filters.append('energy') - filter_bins.append(self.energy_groups.get_group_bounds(groups)) + if groups != 'all': + cv.check_value('groups', groups, Iterable, Integral) + filters.append('energy') + filter_bins.append(self.energy_groups.get_group_bounds(groups)) # Query the multi-group cross-section tally for the data xs = self.xs_tally.get_values(filters=filters, @@ -465,9 +468,9 @@ class MultiGroupXS(object): for key, old_tally in avg_xs.tallies.items(): # FIXME: Need to create Tally.mean(...) slice_tally = old_tally.slice(filters=[avg_xs.domain_type], - filter_bins=subdomains) + filter_bins=[tuple(subdomains)]) avg_tally = slice_tally.mean(filters=[avg_xs.domain_type], - filter_bins=subdomains) + filter_bins=[tuple(subdomains)]) avg_xs.tallies[key] = avg_tally avg_xs.compute_xs() diff --git a/openmc/tallies.py b/openmc/tallies.py index 003acd9435..1140e18c88 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -3,6 +3,8 @@ import copy import os import pickle import itertools +import functools +from operator import mul from numbers import Integral, Real from xml.etree import ElementTree as ET import sys @@ -1677,8 +1679,8 @@ class Tally(object): new_tally._derived = True new_tally.with_batch_statistics = True new_tally.name = self.name - new_tally._mean = self._mean + other - new_tally._std_dev = self._std_dev + new_tally._mean = self.mean + other + new_tally._std_dev = self.std_dev new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -1746,8 +1748,8 @@ class Tally(object): new_tally = Tally(name='derived') new_tally._derived = True new_tally.name = self.name - new_tally._mean = self._mean - other - new_tally._std_dev = self._std_dev + new_tally._mean = self.mean - other + new_tally._std_dev = self.std_dev new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -1816,8 +1818,8 @@ class Tally(object): new_tally = Tally(name='derived') new_tally._derived = True new_tally.name = self.name - new_tally._mean = self._mean * other - new_tally._std_dev = self._std_dev * np.abs(other) + new_tally._mean = self.mean * other + new_tally._std_dev = self.std_dev * np.abs(other) new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -1886,8 +1888,8 @@ class Tally(object): new_tally = Tally(name='derived') new_tally._derived = True new_tally.name = self.name - new_tally._mean = self._mean / other - new_tally._std_dev = self._std_dev * np.abs(1. / other) + new_tally._mean = self.mean / other + new_tally._std_dev = self.std_dev * np.abs(1. / other) new_tally.estimator = self.estimator new_tally.with_summary = self.with_summary new_tally.num_realization = self.num_realizations @@ -2085,7 +2087,7 @@ class Tally(object): """Build a sliced tally for the specified filters, scores and nuclides. This method constructs a new tally to encapsulate a subset of the data - represented by this tally. The subset of data to included in the tally + represented by this tally. The subset of data to include in the tally slice is determined by the scores, filters and nuclides specified in the input parameters. @@ -2200,6 +2202,89 @@ class Tally(object): return new_tally + def summation(self, scores=[], filters=[], filter_bins=[], nuclides=[]): + """Build a sliced tally for the specified filters, scores and nuclides. + + This method constructs a new tally to encapsulate a subset of the data + represented by this tally. The subset of data to include in the tally + slice is determined by the scores, filters and nuclides specified in + the input parameters. + + Parameters + ---------- + scores : list + A list of one or more score strings to sum across + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings to sum across + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list of Iterables + A list of the filter bins corresponding to the filter_types + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell Filters. Each 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 a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond of the + filter_types parameter. + + nuclides : list + A list of nuclide name strings to sum across + (e.g., ['U-235', 'U-238']; default is []) + + Returns + ------- + Tally + A new tally which encapsulates the sum of data requested. + + """ + + # If user did not specify any scores, do not sum across scores + if len(scores) == 0: + scores = [[]] + # Sum across any scores specified by the user + else: + scores = [[score] for score in scores] + + # If user did not specify any nuclides, do not sum across nuclides + if len(nuclides) == 0: + nuclides = [[]] + # Sum across any nuclides specified by the user + else: + nuclides = [[nuclide] for nuclide in nuclides] + + # If user did not specify any filter bins, do not sum across filter bins + if len(filters) == 0: + filter_bins = [[]] + filters = [[]] + # Sum across any filter bins specified by the user + else: + filter_bins = list(itertools.product(*filter_bins)) + filter_bins = [list(filter_bin) for filter_bin in filter_bins] + filters = [filters] + + # Initialize Tally sum + tally_sum = 0 + + # Iterate over all Tally slice operands in summation + prod = [scores, filters, filter_bins, nuclides] + for scores, filters, filter_bins, nuclides in itertools.product(*prod): + tally_slice = self.get_slice(scores, filters, filter_bins, nuclides) + + # Remove filters summed across to avoid bulky CrossFilters + for filter in reversed(tally_slice.filters): + if filter.type in filters: + tally_slice.remove_filter(filter) + + # Accumulate this Tally slice into the Tally sum + tally_sum += tally_slice + + return tally_sum + class TalliesFile(object): """Tallies file used for an OpenMC simulation. Corresponds directly to the From 1d9af02f854208cc6c3679d05713dd71852b44fa Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 6 Sep 2015 19:45:12 -0400 Subject: [PATCH 059/519] Fixed num score bins update in Tally.get_slice(...) routine. Need to cleanup filter reset in Tally.summation(...) --- openmc/tallies.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 1140e18c88..d52a10dc7c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1516,7 +1516,6 @@ class Tally(object): new_tally.with_summary = self.with_summary if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - new_tally.num_score_bins = self.num_score_bins * other.num_score_bins # Generate filter "outer products" if self.filters == other.filters: @@ -1530,9 +1529,11 @@ class Tally(object): # Generate score "outer products" if self.scores == other.scores: + new_tally.num_score_bins = self.num_score_bins for self_score in self.scores: new_tally.add_score(self_score) else: + new_tally.num_score_bins = self.num_score_bins * other.num_score_bins all_scores = [self.scores, other.scores] for self_score, other_score in itertools.product(*all_scores): new_score = CrossScore(self_score, other_score, binary_op) @@ -2189,10 +2190,15 @@ class Tally(object): for filter_bin in filter_bins[i]: bin_index = filter.get_bin_index(filter_bin) - bin_indices.append(bin_index) + if filter_type in ['energy', 'energyout']: + bin_indices.append(bin_index) + bin_indices.append(bin_index+1) + else: + bin_indices.append(bin_index) new_bins = filter.bins[bin_indices] filter.bins = new_bins + filter.num_bins = len(filter_bins[i]) # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins @@ -2276,13 +2282,19 @@ class Tally(object): tally_slice = self.get_slice(scores, filters, filter_bins, nuclides) # Remove filters summed across to avoid bulky CrossFilters + removed_filters = [] for filter in reversed(tally_slice.filters): if filter.type in filters: tally_slice.remove_filter(filter) + removed_filters.append(filter) # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice + # FIXME: test if this works for filter + for filter in removed_filters: + tally_sum.add_filter(filter) + return tally_sum From 05b34977a638c43f489ef2383c21fa416bfe8466 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 7 Sep 2015 15:45:20 -0400 Subject: [PATCH 060/519] Refactored pandas dataframe construction into Filter and CrossFilter class abstractions --- openmc/cross.py | 72 +++++++---- openmc/filter.py | 300 ++++++++++++++++++++++++++++++++++++++++++++-- openmc/tallies.py | 245 ++++--------------------------------- 3 files changed, 364 insertions(+), 253 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 735bb4cd26..05ca0f9b6c 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -279,26 +279,6 @@ class CrossFilter(object): def __eq__(self, other): return str(other) == str(self) - def split_filters(self): - - split_filters = [] - - # If left Filter is not a CrossFilter, simply append to list - if isinstance(self.left_filter, Filter): - split_filters.append(self.left_filter) - # Recursively descend CrossFilter tree to collect all Filters - else: - split_filters.extend(self.left_filter.split_filters()) - - # If right Filter is not a CrossFilter, simply append to list - if isinstance(self.right_filter, Filter): - split_filters.append(self.right_filter) - # Recursively descend CrossFilter tree to collect all Filters - else: - split_filters.extend(self.right_filter.split_filters()) - - return split_filters - def get_bin_index(self, filter_bin): """Returns the index in the CrossFilter for some bin. @@ -326,6 +306,58 @@ class CrossFilter(object): filter_index = left_index * self.right_filter.num_bins + right_index return filter_index + def get_pandas_dataframe(self, datasize, summary=None): + """Builds a Pandas DataFrame for the CrossFilter's bins. + + This method constructs a Pandas DataFrame object for the CrossFilter + with columns annotated by filter bin information. This is a helper + method for the Tally.get_pandas_dataframe(...) routine. This method + recursively builds and concatenates the Pandas DataFrames for left + and right filters and crossfilters. + + This capability has been tested for Pandas >=0.13.1. However, it is + recommended to use v0.16 or newer versions of Pandas since this method + uses the Multi-index Pandas feature. + + Parameters + ---------- + data_size : Integral + The total number of bins in the tally corresponding to this filter + + summary : None or Summary + An optional Summary object to be used to construct columns for + distribcell tally filters (default is None). The geometric + information in the Summary object is embedded into a Multi-index + column with a geometric "path" to each distribcell intance. + NOTE: This option requires the OpenCG Python package. + + Returns + ------- + pandas.DataFrame + A Pandas DataFrame with columns of strings that characterize the + crossfilter's bins. Each entry in the DataFrame will include the one + or more binary operations used to construct the crossfilter's bins. + The number of rows in the DataFrame is the same as the total number + of bins in the corresponding tally, with the filter bin + appropriately tiled to map to the corresponding tally bins. + + See also + -------- + Tally.get_pandas_dataframe(), Filter.get_pandas_dataframe() + + """ + + # If left and right filters are identical, do not combine bins + if self.left_filter == self.right_filter: + df = self.left_filter.get_pandas_dataframe(datasize, summary) + # If left and right filters are different, combine their bins + else: + df = '(' + self.left_filter.get_pandas_dataframe(datasize, summary) + df += ' ' + self.binary_op + ' ' + df += self.right_filter.get_pandas_dataframe(datasize, summary) + ')' + + return df + def __repr__(self): string = 'CrossFilter\n' diff --git a/openmc/filter.py b/openmc/filter.py index 5a81906762..c24684039c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -5,9 +5,10 @@ from numbers import Real, Integral import numpy as np from openmc import Mesh +from openmc.summary import Summary from openmc.constants import * -from openmc.checkvalue import check_type, check_iterable_type, \ - check_greater_than +import openmc.checkvalue as cv + class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally @@ -135,9 +136,9 @@ class Filter(object): if self.type in ['cell', 'cellborn', 'surface', 'material', 'universe', 'distribcell']: - check_iterable_type('filter bins', bins, Integral) + cv.check_iterable_type('filter bins', bins, Integral) for edge in bins: - check_greater_than('filter bin', edge, 0, equality=True) + cv.check_greater_than('filter bin', edge, 0, equality=True) elif self._type in ['energy', 'energyout']: for edge in bins: @@ -180,13 +181,13 @@ class Filter(object): # FIXME @num_bins.setter def num_bins(self, num_bins): - check_type('filter num_bins', num_bins, Integral) - check_greater_than('filter num_bins', num_bins, 0, equality=True) + cv.check_type('filter num_bins', num_bins, Integral) + cv.check_greater_than('filter num_bins', num_bins, 0, equality=True) self._num_bins = num_bins @mesh.setter def mesh(self, mesh): - check_type('filter mesh', mesh, Mesh) + cv.check_type('filter mesh', mesh, Mesh) self._mesh = mesh self.type = 'mesh' @@ -194,12 +195,12 @@ class Filter(object): @offset.setter def offset(self, offset): - check_type('filter offset', offset, Integral) + cv.check_type('filter offset', offset, Integral) self._offset = offset @stride.setter def stride(self, stride): - check_type('filter stride', stride, Integral) + cv.check_type('filter stride', stride, Integral) if stride < 0: msg = 'Unable to set stride "{0}" for a "{1}" Filter since it ' \ 'is a negative value'.format(stride, self.type) @@ -334,6 +335,287 @@ class Filter(object): return filter_index + def get_pandas_dataframe(self, data_size, summary=None): + """Builds a Pandas DataFrame for the Filter's bins. + + This method constructs a Pandas DataFrame object for the Filter with + columns annotated by filter bin information. This is a helper method + for the Tally.get_pandas_dataframe(...) routine. + + This capability has been tested for Pandas >=0.13.1. However, it is + recommended to use v0.16 or newer versions of Pandas since this method + uses the Multi-index Pandas feature. + + + Parameters + ---------- + data_size : Integral + The total number of bins in the tally corresponding to this filter + + summary : None or Summary + An optional Summary object to be used to construct columns for + distribcell tally filters (default is None). The geometric + information in the Summary object is embedded into a Multi-index + column with a geometric "path" to each distribcell intance. + NOTE: This option requires the OpenCG Python package. + + Returns + ------- + pandas.DataFrame + A Pandas DataFrame with columns of strings that characterize the + filter's bins. The number of rows in the DataFrame is the same as + the total number of bins in the corresponding tally, with the filter + bin appropriately tiled to map to the corresponding tally bins. + + For 'cell', 'cellborn', 'surface', 'material', and 'universe' + filters, the DataFrame includes a single column with the cell, + surface, material or universe ID corresponding to each filter bin. + + For 'mesh' filters, the DataFrame includes three columns for the + x,y,z mesh cell indices corresponding to each filter bin. + + For 'energy' and 'energyout' filters, the DataFrame include a single + column with each element comprising a string with the lower, upper + energy bounds for each filter bin. + + For 'distribcell' filters, the DataFrame either includes: + 1) a single column with the cell instance IDs (without summary info) + 2) separate columns for the cell IDs, universe IDs, and lattice IDs + and x,y,z cell indices corresponding to each (with summary info) + + Raises + ------ + ImportError + When Pandas cannot is not installed, or summary info is requested + but OpenCG is not installed. + + See also + -------- + Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe() + + """ + + # Attempt to import the pandas package + try: + import pandas as pd + except ImportError: + msg = 'The pandas Python package must be installed on your system' + raise ImportError(msg) + + df = pd.DataFrame() + + # mesh filters + if self.type == 'mesh': + + # Initialize dictionary to build Pandas Multi-index column + filter_dict = {} + + # Append Mesh ID as outermost index of mult-index + mesh_key = 'mesh {0}'.format(self.mesh.id) + + # Find mesh dimensions - use 3D indices for simplicity + if (len(self.mesh.dimension) == 3): + nx, ny, nz = self.mesh.dimension + else: + nx, ny = self.mesh.dimension + nz = 1 + + # Generate multi-index sub-column for x-axis + filter_bins = np.arange(1, nx+1) + repeat_factor = ny * nz * self.stride + filter_bins = np.repeat(filter_bins, repeat_factor) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + filter_dict[(mesh_key, 'x')] = filter_bins + + # Generate multi-index sub-column for y-axis + filter_bins = np.arange(1, ny+1) + repeat_factor = nz * self.stride + filter_bins = np.repeat(filter_bins, repeat_factor) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + filter_dict[(mesh_key, 'y')] = filter_bins + + # Generate multi-index sub-column for z-axis + filter_bins = np.arange(1, nz+1) + repeat_factor = self.stride + filter_bins = np.repeat(filter_bins, repeat_factor) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + filter_dict[(mesh_key, 'z')] = filter_bins + + # Initialize a Pandas DataFrame from the mesh dictionary + df = pd.concat([df, pd.DataFrame(filter_dict)]) + + # distribcell filters + elif self.type == 'distribcell': + level_df = None + + if isinstance(summary, Summary): + # Attempt to import the OpenCG package + try: + import opencg + except ImportError: + msg = 'The OpenCG package must be installed ' \ + 'to use a Summary for distribcell dataframes' + raise ImportError(msg) + + # Create and extract the OpenCG geometry the Summary + summary.make_opencg_geometry() + opencg_geometry = summary.opencg_geometry + openmc_geometry = summary.openmc_geometry + + # Use OpenCG to compute the number of regions + opencg_geometry.initializeCellOffsets() + num_regions = opencg_geometry._num_regions + + # Initialize a dictionary mapping OpenMC distribcell + # offsets to OpenCG LocalCoords linked lists + offsets_to_coords = {} + + # Use OpenCG to compute LocalCoords linked list for + # each region and store in dictionary + for region in range(num_regions): + coords = opencg_geometry.findRegion(region) + path = opencg.get_path(coords) + cell_id = path[-1] + + # If this region is in Cell corresponding to the + # distribcell filter bin, store it in dictionary + if cell_id == self.bins[0]: + offset = openmc_geometry.get_offset(path, self.offset) + offsets_to_coords[offset] = coords + + # Each distribcell offset is a DataFrame bin + # Unravel the paths into DataFrame columns + num_offsets = len(offsets_to_coords) + + # Initialize termination condition for while loop + levels_remain = True + counter = 0 + + # Iterate over each level in the CSG tree hierarchy + while levels_remain: + levels_remain = False + + # Initialize dictionary to build Pandas Multi-index + # column for this level in the CSG tree hierarchy + level_dict = {} + + # Initialize prefix Multi-index keys + counter += 1 + level_key = 'level {0}'.format(counter) + univ_key = (level_key, 'univ', 'id') + cell_key = (level_key, 'cell', 'id') + lat_id_key = (level_key, 'lat', 'id') + lat_x_key = (level_key, 'lat', 'x') + lat_y_key = (level_key, 'lat', 'y') + lat_z_key = (level_key, 'lat', 'z') + + # Allocate NumPy arrays for each CSG level and + # each Multi-index column in the DataFrame + level_dict[univ_key] = np.empty(num_offsets) + level_dict[cell_key] = np.empty(num_offsets) + level_dict[lat_id_key] = np.empty(num_offsets) + level_dict[lat_x_key] = np.empty(num_offsets) + level_dict[lat_y_key] = np.empty(num_offsets) + level_dict[lat_z_key] = np.empty(num_offsets) + + # Initialize Multi-index columns to NaN - this is + # necessary since some distribcell instances may + # have very different LocalCoords linked lists + level_dict[univ_key][:] = np.NAN + level_dict[cell_key][:] = np.NAN + level_dict[lat_id_key][:] = np.NAN + level_dict[lat_x_key][:] = np.NAN + level_dict[lat_y_key][:] = np.NAN + level_dict[lat_z_key][:] = np.NAN + + # Iterate over all regions (distribcell instances) + for offset in range(num_offsets): + coords = offsets_to_coords[offset] + + # If entire LocalCoords has been unraveled into + # Multi-index columns already, continue + if coords is None: + continue + + # Assign entry to Universe Multi-index column + if coords._type == 'universe': + level_dict[univ_key][offset] = coords._universe._id + level_dict[cell_key][offset] = coords._cell._id + + # Assign entry to Lattice Multi-index column + else: + level_dict[lat_id_key][offset] = coords._lattice._id + level_dict[lat_x_key][offset] = coords._lat_x + level_dict[lat_y_key][offset] = coords._lat_y + level_dict[lat_z_key][offset] = coords._lat_z + + # Move to next node in LocalCoords linked list + if coords._next is None: + offsets_to_coords[offset] = None + else: + offsets_to_coords[offset] = coords._next + levels_remain = True + + # Tile the Multi-index columns + for level_key, level_bins in level_dict.items(): + level_bins = np.repeat(level_bins, self.stride) + tile_factor = data_size / len(level_bins) + level_bins = np.tile(level_bins, tile_factor) + level_dict[level_key] = level_bins + + # Initialize a Pandas DataFrame from the level dictionary + if level_df is None: + level_df = pd.DataFrame(level_dict) + else: + level_df = pd.concat([level_df, pd.DataFrame(level_dict)], axis=1) + + # Create DataFrame column for distribcell instances IDs + # NOTE: This is performed regardless of whether the user + # requests Summary geometric information + filter_bins = np.arange(self.num_bins) + filter_bins = np.repeat(filter_bins, self.stride) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + filter_bins = filter_bins + if level_df is None: + df = pd.DataFrame({self.type :filter_bins}) + else: + level_df = level_df.dropna(axis=1, how='all') + level_df = level_df.astype(np.int) + df = pd.concat([level_df, pd.DataFrame({self.type :filter_bins})], axis=1) + + # energy, energyout filters + elif 'energy' in self.type: + bins = self.bins + num_bins = self.num_bins + + # Create strings for + template = '({0:.1e} - {1:.1e})' + filter_bins = [] + for i in range(num_bins): + filter_bins.append(template.format(bins[i], bins[i+1])) + + # Tile the energy bins into a DataFrame column + filter_bins = np.repeat(filter_bins, self.stride) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + filter_bins = filter_bins + df = pd.concat([df, pd.DataFrame({self.type + ' [MeV]' : filter_bins})]) + + # universe, material, surface, cell, and cellborn filters + else: + 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 = filter_bins + df = pd.concat([df, pd.DataFrame({self.type :filter_bins})]) + + df = df.astype(np.str) + return df + def __repr__(self): string = 'Filter\n' string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type) diff --git a/openmc/tallies.py b/openmc/tallies.py index d52a10dc7c..57fa911b21 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1,10 +1,8 @@ -from collections import Iterable +from collections import Iterable, defaultdict import copy import os import pickle import itertools -import functools -from operator import mul from numbers import Integral, Real from xml.etree import ElementTree as ET import sys @@ -976,9 +974,10 @@ class Tally(object): This method constructs a Pandas DataFrame object for the Tally data with columns annotated by filter, nuclide and score bin information. - This capability has been tested for Pandas >=v0.13.1. However, if - possible, it is recommended to use the v0.16 or newer versions of - Pandas since this this method uses the Multi-index Pandas feature. + + This capability has been tested for Pandas >=0.13.1. However, it is + recommended to use v0.16 or newer versions of Pandas since this method + uses the Multi-index Pandas feature. Parameters ---------- @@ -1010,6 +1009,8 @@ class Tally(object): KeyError When this method is called before the Tally is populated with data by the StatePoint.read_results() method. + ImportError + When Pandas can not be found on the caller's system """ @@ -1041,224 +1042,14 @@ class Tally(object): # Find the total length of the tally data array data_size = self.mean.size - # Split CrossFilters into separate filters - split_filters = [] - for filter in self.filters: - if isinstance(filter, CrossFilter): - split_filters.extend(filter.split_filters()) - else: - split_filters.append(filter) - # Build DataFrame columns for filters if user requested them if filters: - for filter in split_filters: + # Append each Filter's DataFRame to the overall DataFrame + for filter in self.filters: + filter_df = filter.get_pandas_dataframe(data_size, summary) - # mesh filters - if filter.type == 'mesh': - - # Initialize dictionary to build Pandas Multi-index column - filter_dict = {} - - # Append Mesh ID as outermost index of mult-index - mesh_id = filter.mesh.id - mesh_key = 'mesh {0}'.format(mesh_id) - - # Find mesh dimensions - use 3D indices for simplicity - if (len(filter.mesh.dimension) == 3): - nx, ny, nz = filter.mesh.dimension - else: - nx, ny = filter.mesh.dimension - nz = 1 - - # Generate multi-index sub-column for x-axis - filter_bins = np.arange(1, nx+1) - repeat_factor = ny * nz * filter.stride - filter_bins = np.repeat(filter_bins, repeat_factor) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - filter_dict[(mesh_key, 'x')] = filter_bins - - # Generate multi-index sub-column for y-axis - filter_bins = np.arange(1, ny+1) - repeat_factor = nz * filter.stride - filter_bins = np.repeat(filter_bins, repeat_factor) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - filter_dict[(mesh_key, 'y')] = filter_bins - - # Generate multi-index sub-column for z-axis - filter_bins = np.arange(1, nz+1) - repeat_factor = filter.stride - filter_bins = np.repeat(filter_bins, repeat_factor) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - filter_dict[(mesh_key, 'z')] = filter_bins - - # Append the multi-index column to the DataFrame - df = pd.concat([df, pd.DataFrame(filter_dict)], axis=1) - - # distribcell filters - elif filter.type == 'distribcell': - if isinstance(summary, Summary): - # Attempt to import the OpenCG package - try: - import opencg - except ImportError: - msg = 'The OpenCG package must be installed ' \ - 'to use a Summary for distribcell dataframes' - raise ImportError(msg) - - # Create and extract the OpenCG geometry the Summary - summary.make_opencg_geometry() - opencg_geometry = summary.opencg_geometry - openmc_geometry = summary.openmc_geometry - - # Use OpenCG to compute the number of regions - opencg_geometry.initializeCellOffsets() - num_regions = opencg_geometry._num_regions - - # Initialize a dictionary mapping OpenMC distribcell - # offsets to OpenCG LocalCoords linked lists - offsets_to_coords = {} - - # Use OpenCG to compute LocalCoords linked list for - # each region and store in dictionary - for region in range(num_regions): - coords = opencg_geometry.findRegion(region) - path = opencg.get_path(coords) - cell_id = path[-1] - - # If this region is in Cell corresponding to the - # distribcell filter bin, store it in dictionary - if cell_id == filter.bins[0]: - offset = openmc_geometry.get_offset(path, - filter.offset) - offsets_to_coords[offset] = coords - - # Each distribcell offset is a DataFrame bin - # Unravel the paths into DataFrame columns - num_offsets = len(offsets_to_coords) - - # Initialize termination condition for while loop - levels_remain = True - counter = 0 - - # Iterate over each level in the CSG tree hierarchy - while levels_remain: - levels_remain = False - - # Initialize dictionary to build Pandas Multi-index - # column for this level in the CSG tree hierarchy - level_dict = {} - - # Initialize prefix Multi-index keys - counter += 1 - level_key = 'level {0}'.format(counter) - univ_key = (level_key, 'univ', 'id') - cell_key = (level_key, 'cell', 'id') - lat_id_key = (level_key, 'lat', 'id') - lat_x_key = (level_key, 'lat', 'x') - lat_y_key = (level_key, 'lat', 'y') - lat_z_key = (level_key, 'lat', 'z') - - # Allocate NumPy arrays for each CSG level and - # each Multi-index column in the DataFrame - level_dict[univ_key] = np.empty(num_offsets) - level_dict[cell_key] = np.empty(num_offsets) - level_dict[lat_id_key] = np.empty(num_offsets) - level_dict[lat_x_key] = np.empty(num_offsets) - level_dict[lat_y_key] = np.empty(num_offsets) - level_dict[lat_z_key] = np.empty(num_offsets) - - # Initialize Multi-index columns to NaN - this is - # necessary since some distribcell instances may - # have very different LocalCoords linked lists - level_dict[univ_key][:] = np.nan - level_dict[cell_key][:] = np.nan - level_dict[lat_id_key][:] = np.nan - level_dict[lat_x_key][:] = np.nan - level_dict[lat_y_key][:] = np.nan - level_dict[lat_z_key][:] = np.nan - - # Iterate over all regions (distribcell instances) - for offset in range(num_offsets): - coords = offsets_to_coords[offset] - - # If entire LocalCoords has been unraveled into - # Multi-index columns already, continue - if coords is None: - continue - - # Assign entry to Universe Multi-index column - if coords._type == 'universe': - univ_id = coords._universe._id - cell_id = coords._cell._id - level_dict[univ_key][offset] = univ_id - level_dict[cell_key][offset] = cell_id - - # Assign entry to Lattice Multi-index column - else: - lat_id = coords._lattice._id - lat_x = coords._lat_x - lat_y = coords._lat_y - lat_z = coords._lat_z - level_dict[lat_id_key][offset] = lat_id - level_dict[lat_x_key][offset] = lat_x - level_dict[lat_y_key][offset] = lat_y - level_dict[lat_z_key][offset] = lat_z - - # Move to next node in LocalCoords linked list - if coords._next is None: - offsets_to_coords[offset] = None - else: - offsets_to_coords[offset] = coords._next - levels_remain = True - - # Tile the Multi-index columns - for level_key, level_bins in level_dict.items(): - level_bins = \ - np.repeat(level_bins, filter.stride) - tile_factor = data_size / len(level_bins) - level_bins = np.tile(level_bins, tile_factor) - level_dict[level_key] = level_bins - - # Append the multi-index column to the DataFrame - df = pd.concat([df, pd.DataFrame(level_dict)], - axis=1) - - # Create DataFrame column for distribcell instances IDs - # NOTE: This is performed regardless of whether the user - # requests Summary geomeric information - filter_bins = np.arange(filter.num_bins) - filter_bins = np.repeat(filter_bins, filter.stride) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - df[filter.type] = filter_bins - - # energy, energyout filters - elif 'energy' in filter.type: - bins = filter.bins - num_bins = filter.num_bins - - # Create strings for - template = '{0:.1e} - {1:.1e}' - filter_bins = [] - for i in range(num_bins): - filter_bins.append(template.format(bins[i], bins[i+1])) - - # Tile the energy bins into a DataFrame column - filter_bins = np.repeat(filter_bins, filter.stride) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - df[filter.type + ' [MeV]'] = filter_bins - - # universe, material, surface, cell, and cellborn filters - else: - filter_bins = np.repeat(filter.bins, filter.stride) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - df[filter.type] = filter_bins + df = pd.concat([df, filter_df], axis=1) # Include DataFrame column for nuclides if user requested it if nuclides: @@ -2278,22 +2069,28 @@ class Tally(object): # Iterate over all Tally slice operands in summation prod = [scores, filters, filter_bins, nuclides] + summed_filters = defaultdict(list) for scores, filters, filter_bins, nuclides in itertools.product(*prod): tally_slice = self.get_slice(scores, filters, filter_bins, nuclides) # Remove filters summed across to avoid bulky CrossFilters - removed_filters = [] for filter in reversed(tally_slice.filters): if filter.type in filters: tally_slice.remove_filter(filter) - removed_filters.append(filter) + summed_filters[filter.type].append(filter) # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice # FIXME: test if this works for filter - for filter in removed_filters: - tally_sum.add_filter(filter) + for filter_type in summed_filters: + filters = summed_filters[filter_type] + for i in range(1, len(filters)): + filters[i] = CrossFilter(filters[i-1], filters[i], '+') + tally_sum.add_filter(filters[-1]) + +# for filter in removed_filters: +# tally_sum.add_filter(filter) return tally_sum From 13b3632c311d90bd141d504cfc7c5068022ad53c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 8 Sep 2015 00:13:23 -0400 Subject: [PATCH 061/519] Fixed Pandas MultiIndex for refactored Filter.get_pandas_dataframe(...) routine --- openmc/cross.py | 8 +++++--- openmc/filter.py | 11 +++++------ openmc/tallies.py | 23 ++++++++++++++++++++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 05ca0f9b6c..51b579553a 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -352,9 +352,11 @@ class CrossFilter(object): df = self.left_filter.get_pandas_dataframe(datasize, summary) # If left and right filters are different, combine their bins else: - df = '(' + self.left_filter.get_pandas_dataframe(datasize, summary) - df += ' ' + self.binary_op + ' ' - df += self.right_filter.get_pandas_dataframe(datasize, summary) + ')' + left_df = self.left_filter.get_pandas_dataframe(datasize, summary) + right_df = self.right_filter.get_pandas_dataframe(datasize, summary) + left_df = left_df.astype(str) + right_df = right_df.astype(str) + df = '(' + left_df + ' ' + self.binary_op + ' ' + right_df + ')' return df diff --git a/openmc/filter.py b/openmc/filter.py index c24684039c..35cbd1dc50 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -566,11 +566,11 @@ class Filter(object): level_bins = np.tile(level_bins, tile_factor) level_dict[level_key] = level_bins - # Initialize a Pandas DataFrame from the level dictionary - if level_df is None: - level_df = pd.DataFrame(level_dict) - else: - level_df = pd.concat([level_df, pd.DataFrame(level_dict)], axis=1) + # Initialize a Pandas DataFrame from the level dictionary + if level_df is None: + level_df = pd.DataFrame(level_dict) + else: + level_df = pd.concat([level_df, pd.DataFrame(level_dict)], axis=1) # Create DataFrame column for distribcell instances IDs # NOTE: This is performed regardless of whether the user @@ -613,7 +613,6 @@ class Filter(object): filter_bins = filter_bins df = pd.concat([df, pd.DataFrame({self.type :filter_bins})]) - df = df.astype(np.str) return df def __repr__(self): diff --git a/openmc/tallies.py b/openmc/tallies.py index 57fa911b21..9d5f4dc008 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1076,8 +1076,29 @@ class Tally(object): df['mean'] = self.mean.ravel() df['std. dev.'] = self.std_dev.ravel() - df.index.name = 'bin' df = df.dropna(axis=1) + + # Expand the columns into Pandas MultiIndices for readability + if pd.__version__ >= '0.16': + columns = copy.deepcopy(df.columns.values) + + # Convert all elements in columns list to tuples + for i, column in enumerate(columns): + if not isinstance(column, tuple): + columns[i] = (column,) + + # Make each tuple the same length + max_len_column = len(max(columns, key=len)) + for i, column in enumerate(columns): + delta_len = max_len_column - len(column) + if delta_len > 0: + new_column = list(column) + new_column.extend(['']*delta_len) + columns[i] = tuple(new_column) + + # Create and set a MultiIndex for the DataFrame's columns + df.columns = pd.MultiIndex.from_tuples(columns) + return df def export_results(self, filename='tally-results', directory='.', From 9ebc5d6793ca24b732e47afd3a14d6f0100de457 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 9 Sep 2015 19:32:26 -0400 Subject: [PATCH 062/519] Major updates to mgxs.py with preliminary testing. Scattering matrices not yet working --- openmc/mgxs/__init__.py | 3 +- openmc/mgxs/groups.py | 25 +- openmc/mgxs/mgxs.py | 623 ++++++++++++++++++++++++++++------------ openmc/statepoint.py | 6 + openmc/summary.py | 2 +- openmc/tallies.py | 18 +- 6 files changed, 472 insertions(+), 205 deletions(-) diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py index 4f5c1ea125..b6f928b091 100644 --- a/openmc/mgxs/__init__.py +++ b/openmc/mgxs/__init__.py @@ -1 +1,2 @@ -from groups import EnergyGroups \ No newline at end of file +from groups import EnergyGroups +from mgxs import * \ No newline at end of file diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index 061f1c61a8..be1ffd1625 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -11,6 +11,7 @@ import openmc.checkvalue as cv if sys.version_info[0] >= 3: basestring = str + class EnergyGroups(object): """An energy groups structure used for multi-group cross-sections. @@ -37,10 +38,10 @@ class EnergyGroups(object): 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 this is the first time we have tried to copy object, create copy if existing is None: clone = type(self).__new__(type(self)) - clone.group_edges = copy.deepcopy(self._group_edges, memo) + clone.group_edges = copy.deepcopy(self.group_edges, memo) memo[id(self)] = clone @@ -60,18 +61,18 @@ class EnergyGroups(object): @group_edges.setter def group_edges(self, edges): - cv.check_type('group edges', edges, Iterable, Integral) - cv.check_length('number of group edges', edges, 2) + cv.check_type('group edges', edges, Iterable, Real) + cv.check_greater_than('number of group edges', len(edges), 1) self._group_edges = np.array(edges) self._num_groups = len(edges)-1 def __eq__(self, other): if not isinstance(other, EnergyGroups): return False - elif self._group_edges != other._group_edges: + elif self.group_edges != other.group_edges: return False - def generate_bin_edges(self, start, stop, num_groups, type='linear'): + def generate_bin_edges(self, start, stop, num_groups, spacing='linear'): """Generate equally or logarithmically-spaced energy group boundaries. Parameters @@ -82,7 +83,7 @@ class EnergyGroups(object): The highest energy in MeV num_groups : Integral The number of energy groups - type : str + spacing : str The spacing between groups ('linear' or 'logarithmic') """ @@ -90,15 +91,15 @@ class EnergyGroups(object): cv.check_type('first edge', start, Real) cv.check_type('last edge', stop, Real) cv.check_type('number of groups', num_groups, Integral) - cv.check_type('type', type, basestring) + cv.check_type('spacing', spacing, basestring) cv.check_greater_than('first edge', start, 0, True) cv.check_greater_than('first edge', stop, start, False) cv.check_greater_than('number of groups', num_groups, 0) - cv.check_value('type', type, ('linear', 'logarithmic')) + cv.check_value('spacing', spacing, ('linear', 'logarithmic')) - if type == 'linear': + if spacing == 'linear': self.group_edges = np.linspace(start, stop, num_groups+1) - elif type == 'logarithmic': + elif spacing == 'logarithmic': self.group_edges = \ np.logspace(np.log10(start), np.log10(stop), num_groups+1) @@ -160,7 +161,7 @@ class EnergyGroups(object): lower = self.group_edges[self.num_groups-group] upper = self.group_edges[self.num_groups-group+1] - return (lower, upper) + return lower, upper def get_group_indices(self, groups='all'): """Returns the array indices for one or more energy groups. diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index b2019a20aa..78c8cbb570 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -5,7 +5,6 @@ import sys import copy import abc import pickle -import subprocess import numpy as np @@ -19,7 +18,7 @@ if sys.version_info[0] >= 3: # Supported cross-section types -XS_TYPES = ['total', +XS_TYPES = ('total', 'transport', 'absorption', 'capture', @@ -29,20 +28,20 @@ XS_TYPES = ['total', 'nu-scatter matrix', 'fission', 'nu-fission', - 'chi'] + 'chi') # Supported domain types -DOMAIN_TYPES = ['cell', +DOMAIN_TYPES = ('cell', 'distribcell', 'universe', 'material', - 'mesh'] + 'mesh') # Supported domain objects -DOMAINS = [openmc.Cell, +DOMAINS = (openmc.Cell, openmc.Universe, openmc.Material, - openmc.Mesh] + openmc.Mesh) # LaTeX Greek symbols for each cross-section type GREEK = dict() @@ -132,11 +131,11 @@ class MultiGroupXS(object): self._offset = None self.name = name - if not domain_type is None: + if domain_type is not None: self.domain_type = domain_type - if not domain is None: + if domain is not None: self.domain = domain - if not energy_groups is None: + if energy_groups is not None: self.energy_groups = energy_groups def __deepcopy__(self, memo): @@ -151,8 +150,9 @@ class MultiGroupXS(object): clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._num_groups = self.num_groups - clone._xs_tally = copy.deepcopy(self.xs_tally, memo) - clone._subdomain_indices = copy.deepcopy(self.subdomain_indices, memo) + clone._xs_tally = copy.deepcopy(self._xs_tally, memo) + clone._subdomain_indices = \ + copy.deepcopy(self.subdomain_indices, memo) clone._offset = copy.deepcopy(self.offset, memo) clone._tallies = dict() @@ -217,14 +217,14 @@ class MultiGroupXS(object): @domain_type.setter def domain_type(self, domain_type): - cv.check_type('domain type', domain_type, DOMAIN_TYPES) + cv.check_value('domain type', domain_type, DOMAIN_TYPES) self._domain_type = domain_type @energy_groups.setter def energy_groups(self, energy_groups): cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) self._energy_groups = energy_groups - self._num_groups = energy_groups._num_groups + self._num_groups = energy_groups.num_groups def _find_domain_offset(self): """Finds and stores the offset of the domain tally filter""" @@ -255,7 +255,7 @@ class MultiGroupXS(object): self._subdomain_indices[subdomain_id] = index @abc.abstractmethod - def _create_tallies(self, scores, all_filters, keys, estimator): + def create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross-section This is a helper method for MultiGroupXS subclasses to create tallies @@ -274,7 +274,7 @@ class MultiGroupXS(object): """ - cv.check_value('scores', scores, openmc.SCORE_TYPES) + cv.check_iterable_type('scores', scores, basestring) cv.check_iterable_type('filters', all_filters, openmc.Filter, 1, 2) cv.check_type('keys', keys, Iterable, basestring) cv.check_length('scores', scores, len(keys)) @@ -383,7 +383,10 @@ class MultiGroupXS(object): return subdomains def get_xs(self, groups='all', subdomains='all', value='mean'): - """ + """Returns an array of multi-group cross-sections. + + This method constructs a 2D NumPy array for the requested multi-group + cross-section data data for one or more energy groups and subdomains. Parameters ---------- @@ -409,7 +412,7 @@ class MultiGroupXS(object): """ - if self.xs_tally is None: + if self._xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) @@ -418,26 +421,30 @@ class MultiGroupXS(object): # Construct a collection of the domain filter bins if subdomains != 'all': - cv.check_value('subdomains', subdomains, Iterable, Integral) + cv.check_iterable_type('subdomains', subdomains, Integral) filters.append(self.domain_type) filter_bins.append(tuple(subdomains)) + # Construct list of energy group bounds tuples for all requested groups if groups != 'all': - cv.check_value('groups', groups, Iterable, Integral) + cv.check_iterable_type('groups', groups, Integral) filters.append('energy') - filter_bins.append(self.energy_groups.get_group_bounds(groups)) + for group in groups: + filter_bins.append(self.energy_groups.get_group_bounds(group)) # Query the multi-group cross-section tally for the data - xs = self.xs_tally.get_values(filters=filters, + xs = self._xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) return xs def get_condensed_xs(self, coarse_groups): - """This routine takes in a collection of 2-tuples of energy groups""" + """ - cv.check_value('coarse groups', coarse_groups, EnergyGroups) + :param coarse_groups: + :return: + """ - # FIXME: this should use the Tally.slice(...) routine + raise NotImplementedError('Energy condensation is not yet implemented') def get_subdomain_avg_xs(self, subdomains='all'): """Construct a subdomain-averaged version of this cross-section. @@ -450,31 +457,46 @@ class MultiGroupXS(object): Returns ------- MultiGroupXS - This MultiGroupXS averaged across subdomains of interest + A new MultiGroupXS averaged across the subdomains of interest + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. """ + if self._xs_tally is None: + msg = 'Unable to get cross-section since it has not been computed' + raise ValueError(msg) + + # Construct a collection of the subdomain filter bins to average across + # FIXME: Make Tally.summation take single rather than nested tuples if subdomains != 'all': - cv.check_value('subdomains', subdomains, Iterable, Integral) + cv.check_iterable_type('subdomains', subdomains, Integral) + subdomain_indices = self.get_subdomain_indices(subdomains) + subdomain_indices = [(index,) for index in subdomain_indices] + # Clone this MultiGroupXS to initialize the condensed version avg_xs = copy.deepcopy(self) + avg_xs.domain_type = 'avg. ' + avg_xs.domain_type + # Reset subdomain indices and offsets for distribcell domains if self.domain_type == 'distribcell': - avg_xs.domain_type = 'cell' avg_xs._subdomain_indices = {} avg_xs._offset = 0 - # Spatially average each tally - for key, old_tally in avg_xs.tallies.items(): - # FIXME: Need to create Tally.mean(...) - slice_tally = old_tally.slice(filters=[avg_xs.domain_type], - filter_bins=[tuple(subdomains)]) - avg_tally = slice_tally.mean(filters=[avg_xs.domain_type], - filter_bins=[tuple(subdomains)]) - avg_xs.tallies[key] = avg_tally - - avg_xs.compute_xs() + # Overwrite tallies with new subdomain-averaged versions + avg_xs._tallies = {} + for tally_type, tally in self.tallies.items(): + tally_sum = tally.summation(filters=[self.domain_type], + filter_bins=subdomain_indices) + tally_sum /= len(subdomains) + avg_xs.tallies[tally_type] = tally_sum + # Compute the condensed single group cross-section + avg_xs.compute_xs() return avg_xs def print_xs(self, subdomains='all'): @@ -485,17 +507,27 @@ class MultiGroupXS(object): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross-sections to include in the report + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + """ + if self._xs_tally is None: + msg = 'Unable to print cross-section since it has not been computed' + raise ValueError(msg) + if subdomains != 'all': - cv.check_value('subdomains', subdomains, Iterable, Integral) + cv.check_iterable_type('subdomains', subdomains, Integral) string = 'Multi-Group XS\n' string += '{0: <16}=\t{1}\n'.format('\tType', self.xs_type) string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - if self.xs_tally is not None: + if self._xs_tally is not None: if subdomains == 'all': subdomains = self.get_subdomain_indices() @@ -503,15 +535,15 @@ class MultiGroupXS(object): for subdomain in subdomains: if self.domain_type == 'distribcell': - string += '{0: <16}=\t{1}\n'.format('\tSubDomain', subdomain) + string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' # Loop over energy groups ranges - for group in range(1,self.num_groups+1): + for group in range(1, self.num_groups+1): bounds = self.energy_groups.get_group_bounds(group) - string += '{0: <12}Group {1} [{2: <10} - ' \ - '{3: <10}MeV]:\t'.format('', group, bounds[0], bounds[1]) + string += template.format('', group, bounds[0], bounds[1]) average = self.get_xs([group], [subdomain], 'mean') rel_err = self.get_xs([group], [subdomain], 'rel_err')*100. string += '{:.2e}+/-{:1.2e}%'.format(average, rel_err) @@ -529,6 +561,7 @@ class MultiGroupXS(object): Filename for the pickled binary file (default is 'mgxs') directory : str Directory for the pickled binary file (default is 'mgxs') + """ cv.check_type('filename', filename, basestring) @@ -548,16 +581,16 @@ class MultiGroupXS(object): xs_results['domain'] = self.domain xs_results['energy_groups'] = self.energy_groups xs_results['tallies'] = self.tallies - xs_results['xs_tally'] = self.xs_tally - xs_results['offset'] = self._offset - xs_results['subdomain_indices'] = self._subdomain_indices + xs_results['xs_tally'] = self._xs_tally + xs_results['offset'] = self.offset + xs_results['subdomain_indices'] = self.subdomain_indices # Pickle the MultiGroupXS results to a binary file filename = directory + '/' + filename + '.pkl' filename = filename.replace(' ', '-') pickle.dump(xs_results, open(filename, 'wb')) - def restore_from_file(self, filename='mgxs', directory='mgxs'): + def unpickle(self, filename='mgxs', directory='mgxs'): """Restore the MultiGroupXS from a pickled binary file. Parameters @@ -566,6 +599,12 @@ class MultiGroupXS(object): Filename for the pickled binary file (default is 'mgxs') directory : str Directory for the pickled binary file (default is 'mgxs') + + Raises + ------ + ValueError + When the requested filename does not exist. + """ cv.check_type('filename', filename, basestring) @@ -589,50 +628,154 @@ class MultiGroupXS(object): self.domain = xs_results['domain'] self.energy_groups = xs_results['energy_groups'] self.tallies = xs_results['tallies'] - self.xs_tally = xs_results['xs_tally'] + self._xs_tally = xs_results['xs_tally'] self._offset = xs_results['offset'] self._subdomain_indices = xs_results['subdomain_indices'] - def export_xs_data(self, subdomains='all', filename='mgxs', - directory='mgxs', format='hdf5', append=True): - """Export the multi-group cross-secttion data to a file. + def load_from_statepoint(self, statepoint): + """Find tallies in an OpenMC StatePoint with the data needed to compute + multi-group cross-sections. - This routine leverages the functionality in the Pandas library to - export DataFrames to CSV, HDF5, LaTeX and PDF files. + This method is needed to compute cross-section data from tallies + in an OpenMC StatePoint object. + + Parameters + ---------- + statepoint : openmc.StatePoint + An OpenMC StatePoint object with tally data + + """ + + cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) + + statepoint.read_results() + + # Create Tallies to search for in StatePoint + if self.tallies is None: + self.create_tallies() + + # Find and store Tallies in StatePoint + for tally_type, tally in self.tallies.items(): + print('getting tally type {}'.format(tally_type)) + print(tally) + sp_tally = statepoint.get_tally(tally.scores, tally.filters, + tally.nuclides, + estimator=tally.estimator) + self.tallies[tally_type] = sp_tally + + def build_hdf5_store(self, filename='mgxs', directory='mgxs', + append=True, key=None): + """ + + :param filename: + :param directory: + :param append: + :param key: + :return: + """ + + # FIXME: + import h5py + raise NotImplementedError('HDF5 storage is not yet implemented') + + def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv'): + """Export the multi-group cross-section data to a file. + + This routine leverages the functionality in the Pandas library to + export the multi-group cross-section data in a variety of output + file formats for storage and/or post-processing. Parameters ---------- - subdomains : Iterable of Integral or 'all' filename : str Filename for the exported file (default is 'mgxs') directory : str Directory for the exported file (default is 'mgxs') - format : {'csv', 'hdf5', 'latex', 'pdf'} + format : {'csv', 'excel', 'pickle', 'latex'} The format for the exported data file - append : bool - If True (default), appends to an existing file if possible + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + """ - if subdomains != 'all': - cv.check_type('submdomains', subdomains, Iterable, Integral) + if self._xs_tally is None: + msg = 'Unable to export cross-section since it has not been computed' + raise ValueError(msg) + cv.check_type('filename', filename, basestring) cv.check_type('directory', directory, basestring) - cv.check_values('format', format, ['hdf5', 'pickle']) - cv.check_type('append', append, bool) + cv.check_values('format', format, ['csv', 'excel', 'pickle', 'latex']) # Make directory if it does not exist if not os.path.exists(directory): os.makedirs(directory) - # FIXME: Use pandas dataframes!! + filename = directory + '/' + filename + filename = filename.replace(' ', '-') + + # Get a Pandas DataFrame for the data + df = self.get_pandas_dataframe() + + # Export the data using Pandas IO API + if format == 'csv': + df.to_csv(filename + '.csv') + elif format == 'excel': + df.to_excel(filename + '.xslx') + elif format == 'pickle': + df.to_pickle(filename + '.pkl') + elif format == 'latex': + # FIXME: Insert greek letters + df.to_latex(filename + '.tex') + + def get_pandas_dataframe(self): + """Build a Pandas DataFrame for the MultiGroupXS data. + + This routine leverages the Tally.get_pandas_dataframe(...) routine, but + renames the columns with terminology appropriate for cross-section data. + + Returns + ------- + pandas.DataFrame + A Pandas DataFrame for the cross-section data. + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + + """ + + if self._xs_tally is None: + msg = 'Unable to get Pandas DataFrame since the ' \ + 'cross-section has not been computed' + raise ValueError(msg) + + # TODO: Reset column labels as cross-sections if needed + df = self._xs_tally.get_pandas_dataframe() + return df + + def from_statepoint(self, sp): + """ + + :return: + """ + + # Get the tallies from a statepoint file + class TotalXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(TotalXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(TotalXS, self).__init__(domain, domain_type, groups, name) self.xs_type = 'total' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'total'] @@ -644,23 +787,27 @@ class TotalXS(MultiGroupXS): energy_filter = openmc.Filter('energy', group_edges) filters = [[energy_filter], [energy_filter]] - # Intialize the Tallies - super(TotalXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(TotalXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['total'] / self.tallies['flux'] + """Computes the multi-group total cross-sections using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['total'] / self.tallies['flux'] class TransportXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(TransportXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(TransportXS, self).__init__(domain, domain_type, groups, name) self.xs_type = 'transport' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created - scores = ['flux', 'total', 'scatter-1'] + scores = ['flux', 'total', 'scatter-P1'] estimator = 'analog' keys = scores @@ -671,20 +818,29 @@ class TransportXS(MultiGroupXS): filters = [[energy_filter], [energy_filter], [energyout_filter]] # Initialize the Tallies - super(TransportXS, self)._create_tallies(scores, filters, keys, estimator) + super(TransportXS, self).create_tallies(scores, filters, keys, estimator) + + def load_from_statepoint(self, statepoint): + super(TransportXS, self).load_from_statepoint(statepoint) + scatter_p1 = self.tallies['scatter-P1'] + self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1']) def compute_xs(self): - self.xs_tally = self.tallies['total'] - self.tallies['scatter-1'] - self.xs_tally /= self.tallies['flux'] + """Computes the multi-group transport cross-sections using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] + self._xs_tally /= self.tallies['flux'] class AbsorptionXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(AbsorptionXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(AbsorptionXS, self).__init__(domain, domain_type, groups, name) self.xs_type = 'absorption' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'absorption'] @@ -696,20 +852,24 @@ class AbsorptionXS(MultiGroupXS): energy_filter = openmc.Filter('energy', group_edges) filters = [[energy_filter], [energy_filter]] - # Intialize the Tallies - super(AbsorptionXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(AbsorptionXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['absorption'] / self.tallies['flux'] + """Computes the multi-group absorption cross-sections using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['absorption'] / self.tallies['flux'] class CaptureXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(CaptureXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(CaptureXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'capture' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'absorption', 'fission'] @@ -721,21 +881,25 @@ class CaptureXS(MultiGroupXS): energy_filter = openmc.Filter('energy', group_edges) filters = [[energy_filter], [energy_filter], [energy_filter]] - # Intialize the Tallies - super(CaptureXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(CaptureXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['absorption'] - self.tallies['fission'] - self.xs_tally /= self.tallies['flux'] + """Computes the multi-group capture cross-sections using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['absorption'] - self.tallies['fission'] + self._xs_tally /= self.tallies['flux'] class FissionXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, energy_groups=None): - super(FissionXS, self).__init__(name, domain, domain_type, energy_groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(FissionXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'fission' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'fission'] @@ -743,24 +907,28 @@ class FissionXS(MultiGroupXS): keys = scores # Create the non-domain specific Filters for the Tallies - group_edges = self._energy_groups._group_edges + group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) filters = [[energy_filter], [energy_filter]] - # Intialize the Tallies - super(FissionXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(FissionXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['fission'] / self.tallies['flux'] + """Computes the multi-group fission cross-sections using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['fission'] / self.tallies['flux'] class NuFissionXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(NuFissionXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(NuFissionXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'nu-fission' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'nu-fission'] @@ -772,20 +940,24 @@ class NuFissionXS(MultiGroupXS): energy_filter = openmc.Filter('energy', group_edges) filters = [[energy_filter], [energy_filter]] - # Intialize the Tallies - super(NuFissionXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(NuFissionXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] + """Computes the multi-group nu-fission cross-sections using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] class ScatterXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, energy_groups=None): - super(ScatterXS, self).__init__(name, domain, domain_type, energy_groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(ScatterXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'scatter' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'scatter'] @@ -798,19 +970,23 @@ class ScatterXS(MultiGroupXS): filters = [[energy_filter], [energy_filter]] # Intialize the Tallies - super(ScatterXS, self)._create_tallies(scores, filters, keys, estimator) + super(ScatterXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['scatter'] / self.tallies['flux'] + """Computes the scattering multi-group cross-sections using + OpenMC tally arithmetic""" + + self._xs_tally = self.tallies['scatter'] / self.tallies['flux'] class NuScatterXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(NuScatterXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(NuScatterXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'nu-scatter' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] @@ -822,68 +998,135 @@ class NuScatterXS(MultiGroupXS): energy_filter = openmc.Filter('energy', group_edges) filters = [[energy_filter], [energy_filter]] - # Intialize the Tallies - super(NuScatterXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(NuScatterXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] + """Computes the nu-scattering multi-group cross-section using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] class ScatterMatrixXS(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(ScatterMatrixXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'scatter matrix' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created - scores = ['flux', 'scatter', 'scatter-1'] + scores = ['flux', 'scatter', 'scatter-P1'] estimator = 'analog' keys = scores # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - energyout_filter = openmc.Filter('energyout', group_edges) - filters = [[energy_filter], [energy_filter, energyout_filter], [energyout_filter]] + energy = openmc.Filter('energy', group_edges) + energyout = openmc.Filter('energyout', group_edges) + filters = [[energy], [energy, energyout], [energyout]] - # Intialize the Tallies - super(ScatterMatrixXS, self)._create_tallies(scores, filters, keys, estimator) + # Initialize the Tallies + super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) + + def load_from_statepoint(self, statepoint): + super(ScatterMatrixXS, self).load_from_statepoint(statepoint) + scatter_p1 = self.tallies['scatter-P1'] + self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1']) def compute_xs(self): - self.xs_tally = self.tallies['scatter'] - self.tallies['scatter-1'] - self.xs_tally /= self.tallies['flux'] + """Computes the multi-group scattering matrix using OpenMC + tally arithmetic""" - def get_condensed_xs(self, coarse_groups): - """This routine takes in a collection of 2-tuples of energy groups""" - - cv.check_value('coarse groups', coarse_groups, EnergyGroups) - - # FIXME: this should use the Tally.slice(...) routine - - # Error checking for the group bounds is done here - new_groups = self.energy_groups.getCondensedGroups(coarse_groups) - num_coarse_groups = new_groups._num_groups + self._xs_tally = self.tallies['scatter'] - self.tallies['scatter-P1'] + self._xs_tally /= self.tallies['flux'] def get_xs(self, in_groups='all', out_groups='all', - subdomains='all', value='mean'): + subdomains='all', value='mean'): + """Returns an array of multi-group cross-sections. - if self.xs_tally is None: + This method constructs a 2D NumPy array for the requested multi-group + cross-section data data for one or more energy groups and subdomains. + + Parameters + ---------- + in_groups : Iterable of Integral or 'all' + Incoming energy groups of interest + out_groups : Iterable of Integral or 'all' + Outgoing energy groups of interest + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev' or 'rel_err' are accepted + + Returns + ------- + xs : ndarray + A NumPy array of the multi-group cross-section indexed in the order + each group and subdomain is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + + """ + + if self._xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) cv.check_value('value', value, ['mean', 'std. dev.', 'rel. err.']) - if in_groups != 'all': - cv.check_value('in groups', in_groups, Iterable, Integral) - if out_groups != 'all': - cv.check_value('out groups', out_groups, Iterable, Integral) - if subdomains != 'all': - cv.check_value('subdomains', subdomains, Iterable, Integral) - # FIXME: Make this use Tally.get_values() + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if subdomains != 'all': + cv.check_iterable_type('subdomains', subdomains, Integral) + filters.append(self.domain_type) + filter_bins.append(tuple(subdomains)) + + # Construct list of energy group bounds tuples for all requested groups + if in_groups != 'all': + cv.check_iterable_type('in_groups', in_groups, Integral) + filters.append('energy') + for in_group in in_groups: + filter_bins.append(self.energy_groups.get_group_bounds(in_group)) + if out_groups != 'all': + cv.check_iterable_type('out_groups', out_groups, Integral) + filters.append('energy') + for out_group in out_groups: + filter_bins.append(self.energy_groups.get_group_bounds(out_group)) + + # Query the multi-group cross-section tally for the data + xs = self._xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + return xs def print_xs(self, subdomains='all'): + """Prints a string representation for the multi-group cross-section. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + The subdomain IDs of the cross-sections to include in the report + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + + """ + + if self._xs_tally is None: + msg = 'Unable to print cross-section since it has not been computed' + raise ValueError(msg) if subdomains != 'all': cv.check_value('subdomains', subdomains, Iterable, Integral) @@ -894,69 +1137,80 @@ class ScatterMatrixXS(MultiGroupXS): string += '{0: <16}{1}{2}\n'.format('\tDomain ID', '=\t', self.domain.id) string += '{0: <16}\n'.format('\tEnergy Groups:') + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' # Loop over energy groups ranges - for group in range(1,self.num_groups+1): + for group in range(1, self.num_groups+1): bounds = self.energy_groups.get_group_bounds(group) - string += '{0: <12}Group {1} [{2: <10} - ' \ - '{3: <10}MeV]\n'.format('', group, bounds[0], bounds[1]) + string += template.format('', group, bounds[0], bounds[1]) if subdomains == 'all': - subdomains = self._subdomain_indices.keys() + subdomains = self.subdomain_indices.keys() + # Loop over all subdomains for subdomain in subdomains: if self.domain_type == 'distribcell': - string += '{0: <16}{1}{2}\n'.format('\tSubDomain', '=\t', subdomain) + string += \ + '{0: <16}{1}{2}\n'.format('\tSubdomain', '=\t', subdomain) string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + template = '{0: <12}Group {1} -> Group {2}:\t\t' - # Loop over energy groups ranges - for in_group in range(1,self.num_groups+1): - for out_group in range(1,self.num_groups+1): - string += '{0: <12}Group {1} -> Group {2}:\t\t'.format('', in_group, out_group) - average = self.get_xs([in_group], [out_group], [subdomain], 'mean') - rel_err = self.get_xs([in_group], [out_group], [subdomain], 'rel. err.') - string += '{:.2e}+/-{:1.2e}%'.format(average[0,0,0], rel_err[0,0,0]) + # Loop over incoming/outgoing energy groups ranges + for in_group in range(1, self.num_groups+1): + for out_group in range(1, self.num_groups+1): + string += template.format('', in_group, out_group) + average = self.get_xs([in_group], [out_group], + [subdomain], 'mean') + rel_err = self.get_xs([in_group], [out_group], + [subdomain], 'rel. err.')*100. + string += '{:.2e}+/-{:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' + print(string) class NuScatterMatrixXS(ScatterMatrixXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(NuScatterMatrixXS, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, name) self.xs_type = 'nu-scatter matrix' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created - scores = ['flux', 'nu-scatter', 'scatter-1'] + scores = ['flux', 'nu-scatter', 'scatter-P1'] estimator = 'analog' keys = scores # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - energyout_filter = openmc.Filter('energyout', group_edges) - filters = [[energy_filter], [energy_filter, energyout_filter], [energyout_filter]] + energy = openmc.Filter('energy', group_edges) + energyout = openmc.Filter('energyout', group_edges) + filters = [[energy], [energy, energyout], [energyout]] # Intialize the Tallies - super(ScatterMatrixXS, self)._create_tallies(scores, filters, keys, estimator) + super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - self.xs_tally = self.tallies['nu-scatter'] - self.tallies['scatter-1'] - self.xs_tally /= self.tallies['flux'] + """Computes the multi-group nu-scattering matrix using OpenMC + tally arithmetic""" + + self._xs_tally = self.tallies['nu-scatter'] - self.tallies['scatter-P1'] + self._xs_tally /= self.tallies['flux'] class Chi(MultiGroupXS): - def __init__(self, name='', domain=None, domain_type=None, groups=None): - super(Chi, self).__init__(name, domain, domain_type, groups) + def __init__(self, domain=None, domain_type=None, groups=None, name=''): + super(Chi, self).__init__(domain, domain_type, groups, name) self._xs_type = 'chi' def create_tallies(self): + """Construct the OpenMC tallies needed to compute this cross-section.""" # Create a list of scores for each Tally to be created scores = ['nu-fission', 'nu-fission'] @@ -964,46 +1218,43 @@ class Chi(MultiGroupXS): keys = ['nu-fission-in', 'nu-fission-out'] # Create the non-domain specific Filters for the Tallies - group_edges = self._energy_groups._group_edges + group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) energyout_filter = openmc.Filter('energyout', group_edges) filters = [[energy_filter], [energyout_filter]] # Intialize the Tallies - super(Chi, self)._create_tallies(scores, filters, keys, estimator) + super(Chi, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): + """Computes chi fission spectrum using OpenMC tally arithmetic""" - # Extract and clean the Tally data - tally_data, zero_indices = super(Chi, self).getAllTallyData() - nu_fission_in = tally_data['nu-fission-in'] - nu_fission_out = tally_data['nu-fission-out'] + nu_fission_in = self.tallies['nu-fission-in'] + nu_fission_out = self.tallies['nu-fission-out'] - # Set any zero reaction rates to -1 - nu_fission_in[0, zero_indices['nu-fission-in']] = -1. + # FIXME: Make filter bins simpler in Tally.summation(...) - # FIXME - uncertainty propagation - self._xs_tally = infermc.error_prop.arithmetic.divide_by_scalar(nu_fission_out, - nu_fission_in.sum(2)[0, :, np.newaxis, ...], - corr, False) + # Construct energy group filter bins to sum across + filter_bins = [] + for group in range(self.num_groups): + group_bounds = self.energy_groups.get_group_bounds(group) + filter_bins.append((group_bounds,)) + energy_bins = [filter_bins] - # Compute the total across all groups per subdomain - norm = self._xs_tally.sum(2)[0, :, np.newaxis, ...] + sum_nu_fission_in = nu_fission_in.summation(filters=['energyout'], + filter_bins=energy_bins) + self._xs_tally = nu_fission_out / sum_nu_fission_in - # Set any zero norms (in non-fissionable domains) to -1 - norm_indices = norm == 0. - norm[norm_indices] = -1. + # Compute the total across all groups per subdomain + if self.domain_type == 'distribcell': + subdomain_indices = self.get_subdomain_indices() + filter_bins = [(i,) for i in subdomain_indices] + else: + filter_bins = [(self.domain,)] - # Normalize chi to 1.0 - # FIXME - uncertainty propagation - self._xs_tally = infermc.error_prop.arithmetic.divide_by_scalar(self._xs_tally, norm, - corr, False) + # Normalize chi to 1.0 + norm = self._xs_tally.summation(filters=[self.domain_type], + filter_bins=filter_bins) + self._xs_tally /= norm - # For any region without flux or reaction rate, convert xs to zero - self._xs_tally[:, norm_indices] = 0. - - # FIXME - uncertainty propagation - this is just a temporary fix - self._xs_tally[1, ...] = 0. - - # Correct -0.0 to +0.0 - self._xs_tally += 0. \ No newline at end of file + # FIXME: Does this need to reset NaNs to zero? \ No newline at end of file diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 6a4713e91d..5d385b5486 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -663,6 +663,8 @@ class StatePoint(object): # Iterate over all tallies to find the appropriate one for tally_id, test_tally in self.tallies.items(): + print(test_tally) + # Determine if Tally has queried name if name and name != test_tally.name: continue @@ -673,6 +675,7 @@ class StatePoint(object): # Determine if Tally has queried estimator if estimator and not estimator == test_tally.estimator: + print('estimator') continue # Determine if Tally has the queried score(s) @@ -686,6 +689,7 @@ class StatePoint(object): break if not contains_scores: + print('scores') continue # Determine if Tally has the queried Filter(s) @@ -699,6 +703,7 @@ class StatePoint(object): break if not contains_filters: + print('filters') continue # Determine if Tally has the queried Nuclide(s) @@ -712,6 +717,7 @@ class StatePoint(object): break if not contains_nuclides: + print('nuclides') continue # If the current Tally met user's request, break loop and return it diff --git a/openmc/summary.py b/openmc/summary.py index 7f9d5387e9..0734e77825 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -264,7 +264,7 @@ class Summary(object): if maps > 0: offset = self._f['geometry/cells'][key]['offset'][...] - cell.set_offset(offset) + cell.offsets = offset translated = self._f['geometry/cells'][key]['translated'][0] if translated: diff --git a/openmc/tallies.py b/openmc/tallies.py index 9d5f4dc008..6165dc6776 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -114,10 +114,10 @@ class Tally(object): clone.estimator = self.estimator clone.num_score_bins = self.num_score_bins clone.num_realizations = self.num_realizations - clone._sum = copy.deepcopy(self.sum, memo) - clone._sum_sq = copy.deepcopy(self.sum_sq, memo) - clone._mean = copy.deepcopy(self.mean, memo) - clone._std_dev = copy.deepcopy(self.std_dev, memo) + clone._sum = copy.deepcopy(self._sum, memo) + clone._sum_sq = copy.deepcopy(self._sum_sq, memo) + clone._mean = copy.deepcopy(self._mean, memo) + clone._std_dev = copy.deepcopy(self._std_dev, memo) clone._with_summary = self.with_summary clone._with_batch_statistics = self.with_batch_statistics clone._derived = self.derived @@ -828,7 +828,7 @@ class Tally(object): parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin in the list is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of + cell instance ID for 'distribcell' Filters. Each 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 a (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of @@ -2128,6 +2128,14 @@ class TalliesFile(object): self._meshes = [] self._tallies_file = ET.Element("tallies") + @property + def tallies(self): + return self._tallies + + @property + def meshes(self): + return self._meshes + def add_tally(self, tally, merge=False): """Add a tally to the file From 5bfab3a48191271941bab2f1c0f75ded651227f2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 11 Sep 2015 00:26:11 -0400 Subject: [PATCH 063/519] Major bug fixes and extensions to tally arithmetic for MGXS generation --- openmc/cross.py | 17 +- openmc/filter.py | 57 ++++- openmc/mesh.py | 31 +-- openmc/mgxs/mgxs.py | 85 +++++-- openmc/statepoint.py | 7 - openmc/tallies.py | 532 ++++++++++++++++++++++++++++++++++--------- 6 files changed, 564 insertions(+), 165 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 51b579553a..cb1e4930b5 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -192,12 +192,13 @@ class CrossFilter(object): left_type = left_filter.type right_type = right_filter.type - self.type = '({0} {1} {2})'.format(left_type, binary_op, right_type) + self._type = '({0} {1} {2})'.format(left_type, binary_op, right_type) self._bins = {} self._bins['left'] = left_filter.bins self._bins['right'] = right_filter.bins self._num_bins = left_filter.num_bins * right_filter.num_bins + self._stride = None self._left_filter = None self._right_filter = None @@ -211,7 +212,7 @@ class CrossFilter(object): self.binary_op = binary_op def __hash__(self): - return hash((self.type, self.bins)) + return hash((self.left_filter, self.right_filter)) def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -224,6 +225,8 @@ class CrossFilter(object): clone._type = self.type clone._bins = self.bins clone._num_bins = self.num_bins + clone._stride = self.stride + memo[id(self)] = clone return clone @@ -258,7 +261,8 @@ class CrossFilter(object): @property def stride(self): - return self.left_filter.stride * self.right_filter.stride + return self._stride +# return self.left_filter.stride * self.right_filter.stride @type.setter def type(self, filter_type): @@ -276,9 +280,16 @@ class CrossFilter(object): def binary_op(self, binary_op): self._binary_op = binary_op + @stride.setter + def stride(self, stride): + self._stride = stride + def __eq__(self, other): return str(other) == str(self) + def __ne__(self, other): + return not self == other + def get_bin_index(self, filter_bin): """Returns the index in the CrossFilter for some bin. diff --git a/openmc/filter.py b/openmc/filter.py index 35cbd1dc50..52c927bed5 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -42,24 +42,23 @@ class Filter(object): self._offset = -1 self._stride = None - def __eq__(self, filter2): - # Check type - if self.type != filter2.type: + def __eq__(self, other): + if not isinstance(other, Filter): return False - - # Check number of bins - elif len(self.bins) != len(filter2.bins): + elif self.type != other.type: return False - - # Check bin edges - elif not np.allclose(self.bins, filter2.bins): + elif len(self.bins) != len(other.bins): + return False + elif not np.allclose(self.bins, other.bins): return False - else: return True + def __ne__(self, other): + return not self == other + def __hash__(self): - return hash((self._type, self._bins)) + return hash((self._type, tuple(self._bins))) def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -121,6 +120,7 @@ class Filter(object): def bins(self, bins): if bins is None: self.num_bins = 0 + return elif self._type is None: msg = 'Unable to set bins for Filter to "{0}" since ' \ 'the Filter type has not yet been set'.format(bins) @@ -321,7 +321,8 @@ class Filter(object): # Filter bins for distribcell are the "IDs" of each unique placement # of the Cell in the Geometry (integers starting at 0) elif self.type == 'distribcell': - filter_index = filter_bin + val = np.where(self.bins == filter_bin)[0][0] + filter_index = val # Use ID for all other Filters (e.g., material, cell, etc.) else: @@ -335,6 +336,38 @@ class Filter(object): return filter_index + def get_bin(self, bin_index): + """ + + :param bin_index: + :return: + """ + + cv.check_type('bin_index', bin_index, Integral) + cv.check_greater_than('bin_index', bin_index, 0, equality=True) + cv.check_less_than('bin_index', bin_index, self.num_bins) + + if self.type == 'mesh': + + if (len(self.mesh.dimension) == 3): + nx, ny, nz = self.mesh.dimension + x = bin_index / (ny * nz) + y = (bin_index - (x * ny * nz)) / nz + z = bin_index - (x * ny * nz) - (y * nz) + bin = (x, y, z) + else: + nx, ny = self.mesh.dimension + x = bin_index / ny + y = bin_index - (x * ny) + bin = (x, y) + + elif self.type in ['energy', 'energyout']: + bin = (self.bins[bin_index], self.bins[bin_index+1]) + else: + bin = (self.bins[bin_index],) + + return bin + def get_pandas_dataframe(self, data_size, summary=None): """Builds a Pandas DataFrame for the Filter's bins. diff --git a/openmc/mesh.py b/openmc/mesh.py index 7e907aaa57..ddf3529c2d 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -4,8 +4,9 @@ from numbers import Real, Integral from xml.etree import ElementTree as ET import sys -from openmc.checkvalue import (check_type, check_length, check_value, - check_greater_than) +import numpy as np + +import openmc.checkvalue as cv if sys.version_info[0] >= 3: basestring = str @@ -142,45 +143,45 @@ class Mesh(object): self._id = AUTO_MESH_ID AUTO_MESH_ID += 1 else: - check_type('mesh ID', mesh_id, Integral) - check_greater_than('mesh ID', mesh_id, 0) + cv.check_type('mesh ID', mesh_id, Integral) + cv.check_greater_than('mesh ID', mesh_id, 0) self._id = mesh_id @name.setter def name(self, name): - check_type('name for mesh ID="{0}"'.format(self._id), name, basestring) + cv.check_type('name for mesh ID="{0}"'.format(self._id), name, basestring) self._name = name @type.setter def type(self, meshtype): - check_type('type for mesh ID="{0}"'.format(self._id), + cv.check_type('type for mesh ID="{0}"'.format(self._id), meshtype, basestring) - check_value('type for mesh ID="{0}"'.format(self._id), + cv.check_value('type for mesh ID="{0}"'.format(self._id), meshtype, ['rectangular', 'hexagonal']) self._type = meshtype @dimension.setter def dimension(self, dimension): - check_type('mesh dimension', dimension, Iterable, Integral) - check_length('mesh dimension', dimension, 2, 3) + cv.check_type('mesh dimension', dimension, Iterable, Integral) + cv.check_length('mesh dimension', dimension, 2, 3) self._dimension = dimension @lower_left.setter def lower_left(self, lower_left): - check_type('mesh lower_left', lower_left, Iterable, Real) - check_length('mesh lower_left', lower_left, 2, 3) + cv.check_type('mesh lower_left', lower_left, Iterable, Real) + cv.check_length('mesh lower_left', lower_left, 2, 3) self._lower_left = lower_left @upper_right.setter def upper_right(self, upper_right): - check_type('mesh upper_right', upper_right, Iterable, Real) - check_length('mesh upper_right', upper_right, 2, 3) + cv.check_type('mesh upper_right', upper_right, Iterable, Real) + cv.check_length('mesh upper_right', upper_right, 2, 3) self._upper_right = upper_right @width.setter def width(self, width): - check_type('mesh width', width, Iterable, Real) - check_length('mesh width', width, 2, 3) + cv.check_type('mesh width', width, Iterable, Real) + cv.check_length('mesh width', width, 2, 3) self._width = width def __repr__(self): diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 78c8cbb570..39eb79160e 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -656,8 +656,6 @@ class MultiGroupXS(object): # Find and store Tallies in StatePoint for tally_type, tally in self.tallies.items(): - print('getting tally type {}'.format(tally_type)) - print(tally) sp_tally = statepoint.get_tally(tally.scores, tally.filters, tally.nuclides, estimator=tally.estimator) @@ -795,6 +793,8 @@ class TotalXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['total'] / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class TransportXS(MultiGroupXS): @@ -831,6 +831,8 @@ class TransportXS(MultiGroupXS): self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] self._xs_tally /= self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class AbsorptionXS(MultiGroupXS): @@ -860,6 +862,8 @@ class AbsorptionXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['absorption'] / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class CaptureXS(MultiGroupXS): @@ -890,6 +894,8 @@ class CaptureXS(MultiGroupXS): self._xs_tally = self.tallies['absorption'] - self.tallies['fission'] self._xs_tally /= self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class FissionXS(MultiGroupXS): @@ -919,6 +925,8 @@ class FissionXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['fission'] / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class NuFissionXS(MultiGroupXS): @@ -948,6 +956,8 @@ class NuFissionXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class ScatterXS(MultiGroupXS): @@ -977,6 +987,8 @@ class ScatterXS(MultiGroupXS): OpenMC tally arithmetic""" self._xs_tally = self.tallies['scatter'] / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class NuScatterXS(MultiGroupXS): @@ -1006,6 +1018,8 @@ class NuScatterXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class ScatterMatrixXS(MultiGroupXS): @@ -1014,34 +1028,45 @@ class ScatterMatrixXS(MultiGroupXS): super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'scatter matrix' - def create_tallies(self): + def create_tallies(self, correct=False): """Construct the OpenMC tallies needed to compute this cross-section.""" - # Create a list of scores for each Tally to be created - scores = ['flux', 'scatter', 'scatter-P1'] - estimator = 'analog' - keys = scores - - # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) energyout = openmc.Filter('energyout', group_edges) - filters = [[energy], [energy, energyout], [energyout]] + + # Create a list of scores for each Tally to be created + if correct: + scores = ['flux', 'scatter', 'scatter-P1'] + filters = [[energy], [energy, energyout], [energyout]] + else: + scores = ['flux', 'scatter'] + filters = [[energy], [energy, energyout]] + + estimator = 'analog' + keys = scores # Initialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def load_from_statepoint(self, statepoint): - super(ScatterMatrixXS, self).load_from_statepoint(statepoint) - scatter_p1 = self.tallies['scatter-P1'] - self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1']) - - def compute_xs(self): + def compute_xs(self, correct=False): """Computes the multi-group scattering matrix using OpenMC tally arithmetic""" - self._xs_tally = self.tallies['scatter'] - self.tallies['scatter-P1'] - self._xs_tally /= self.tallies['flux'] + # FIXME: This should only subtract P1 from the diagonal!!! + if correct: + scatter_p1 = self.tallies['scatter-P1'] + scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) + energy_filter = openmc.Filter(type='energy') + energy_filter.bins = self.energy_groups.group_edges + scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) + rxn_tally = self.tallies['scatter'] - scatter_p1 + else: + rxn_tally = self.tallies['scatter'] + + self._xs_tally = rxn_tally / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) def get_xs(self, in_groups='all', out_groups='all', subdomains='all', value='mean'): @@ -1195,13 +1220,25 @@ class NuScatterMatrixXS(ScatterMatrixXS): # Intialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self): + def compute_xs(self, correct=False): """Computes the multi-group nu-scattering matrix using OpenMC tally arithmetic""" - self._xs_tally = self.tallies['nu-scatter'] - self.tallies['scatter-P1'] - self._xs_tally /= self.tallies['flux'] + # FIXME: This should only subtract P1 from the diagonal!!! + if correct: + scatter_p1 = self.tallies['scatter-P1'] + scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) + energy_filter = openmc.Filter(type='energy') + energy_filter.bins = self.energy_groups.group_edges + energy_filter.num_bins = self.num_groups + scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) + rxn_tally = self.tallies['nu-scatter'] - scatter_p1 + else: + rxn_tally = self.tallies['nu-scatter'] + self._xs_tally = rxn_tally / self.tallies['flux'] + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) class Chi(MultiGroupXS): @@ -1236,12 +1273,12 @@ class Chi(MultiGroupXS): # Construct energy group filter bins to sum across filter_bins = [] - for group in range(self.num_groups): + for group in range(1, self.num_groups+1): group_bounds = self.energy_groups.get_group_bounds(group) filter_bins.append((group_bounds,)) energy_bins = [filter_bins] - sum_nu_fission_in = nu_fission_in.summation(filters=['energyout'], + sum_nu_fission_in = nu_fission_in.summation(filters=['energy'], filter_bins=energy_bins) self._xs_tally = nu_fission_out / sum_nu_fission_in @@ -1256,5 +1293,7 @@ class Chi(MultiGroupXS): norm = self._xs_tally.summation(filters=[self.domain_type], filter_bins=filter_bins) self._xs_tally /= norm + self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) # FIXME: Does this need to reset NaNs to zero? \ No newline at end of file diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 5d385b5486..0730c5c65c 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -517,7 +517,6 @@ class StatePoint(object): new_shape = (nonzero(tally.num_filter_bins), nonzero(tally.num_nuclides), nonzero(tally.num_score_bins)) - sum = np.reshape(sum, new_shape) sum_sq = np.reshape(sum_sq, new_shape) @@ -663,8 +662,6 @@ class StatePoint(object): # Iterate over all tallies to find the appropriate one for tally_id, test_tally in self.tallies.items(): - print(test_tally) - # Determine if Tally has queried name if name and name != test_tally.name: continue @@ -675,7 +672,6 @@ class StatePoint(object): # Determine if Tally has queried estimator if estimator and not estimator == test_tally.estimator: - print('estimator') continue # Determine if Tally has the queried score(s) @@ -689,7 +685,6 @@ class StatePoint(object): break if not contains_scores: - print('scores') continue # Determine if Tally has the queried Filter(s) @@ -703,7 +698,6 @@ class StatePoint(object): break if not contains_filters: - print('filters') continue # Determine if Tally has the queried Nuclide(s) @@ -717,7 +711,6 @@ class StatePoint(object): break if not contains_nuclides: - print('nuclides') continue # If the current Tally met user's request, break loop and return it diff --git a/openmc/tallies.py b/openmc/tallies.py index 6165dc6776..827d98b613 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -12,7 +12,7 @@ import numpy as np from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter from openmc.summary import Summary -from openmc.checkvalue import check_type, check_value, check_greater_than +import openmc.checkvalue as cv from openmc.clean_xml import * @@ -146,36 +146,42 @@ class Tally(object): else: return existing - def __eq__(self, tally2): + def __eq__(self, other): + if not isinstance(other, Tally): + return False + # Check all filters - if len(self.filters) != len(tally2.filters): + if len(self.filters) != len(other.filters): return False for filter in self.filters: - if filter not in tally2.filters: + if filter not in other.filters: return False # Check all nuclides - if len(self.nuclides) != len(tally2.nuclides): + if len(self.nuclides) != len(other.nuclides): return False for nuclide in self.nuclides: - if nuclide not in tally2.nuclides: + if nuclide not in other.nuclides: return False # Check all scores - if len(self.scores) != len(tally2.scores): + if len(self.scores) != len(other.scores): return False for score in self.scores: - if score not in tally2.scores: + if score not in other.scores: return False - if self.estimator != tally2.estimator: + if self.estimator != other.estimator: return False return True + def __ne__(self, other): + return not self == other + def __hash__(self): hashable = [] @@ -229,7 +235,7 @@ class Tally(object): def num_filter_bins(self): num_bins = 1 - for filter in self._filters: + for filter in self.filters: num_bins *= filter.num_bins return num_bins @@ -289,7 +295,7 @@ class Tally(object): @estimator.setter def estimator(self, estimator): - check_value('estimator', estimator, ['analog', 'tracklength']) + cv.check_value('estimator', estimator, ['analog', 'tracklength']) self._estimator = estimator def add_trigger(self, trigger): @@ -316,13 +322,13 @@ class Tally(object): self._id = AUTO_TALLY_ID AUTO_TALLY_ID += 1 else: - check_type('tally ID', tally_id, Integral) - check_greater_than('tally ID', tally_id, 0) + cv.check_type('tally ID', tally_id, Integral) + cv.check_greater_than('tally ID', tally_id, 0) self._id = tally_id @name.setter def name(self, name): - check_type('tally name', name, basestring) + cv.check_type('tally name', name, basestring) self._name = name def add_filter(self, filter): @@ -381,28 +387,28 @@ class Tally(object): @num_realizations.setter def num_realizations(self, num_realizations): - check_type('number of realizations', num_realizations, Integral) - check_greater_than('number of realizations', num_realizations, 0, True) + cv.check_type('number of realizations', num_realizations, Integral) + cv.check_greater_than('number of realizations', num_realizations, 0, True) self._num_realizations = num_realizations @with_summary.setter def with_summary(self, with_summary): - check_type('with_summary', with_summary, bool) + cv.check_type('with_summary', with_summary, bool) self._with_summary = with_summary @with_batch_statistics.setter def with_batch_statistics(self, with_batch_statistics): - check_type('with_batch_statistics', with_batch_statistics, bool) + cv.check_type('with_batch_statistics', with_batch_statistics, bool) self._with_batch_statistics = with_batch_statistics @sum.setter def sum(self, sum): - check_type('sum', sum, Iterable) + cv.check_type('sum', sum, Iterable) self._sum = sum @sum_sq.setter def sum_sq(self, sum_sq): - check_type('sum_sq', sum_sq, Iterable) + cv.check_type('sum_sq', sum_sq, Iterable) self._sum_sq = sum_sq def remove_score(self, score): @@ -805,72 +811,17 @@ class Tally(object): return score_index - def get_values(self, scores=[], filters=[], filter_bins=[], - nuclides=[], value='mean'): - """Returns a tally score value given a list of filters to satisfy. - - This method constructs a 3D NumPy array for the requested Tally data - indexed by filter bin, nuclide bin, and score index. The method will - order the data in the array as specified in the parameter lists - - Parameters - ---------- - scores : list - A list of one or more score strings - (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list - A list of filter type strings - (e.g., ['mesh', 'energy']; default is []) - - filter_bins : list of Iterables - A list of the filter bins corresponding to the filter_types - parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin - in the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell' Filters. Each 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 a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the - filter_types parameter. - - nuclides : list - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - - value : str - A string for the type of value to return - 'mean' (default), - 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted - - Returns - ------- - float or ndarray - A scalar or NumPy array of the Tally data indexed in the order - each filter, nuclide and score is listed in the parameters. - - Raises - ------ - ValueError - When this method is called before the Tally is populated with data - by the StatePoint.read_results() method. ValueError is also thrown - if the input parameters do not correspond to the Tally's attributes, - e.g., if the score(s) do not match those in the Tally. - + def get_filter_indices(self, filters=[], filter_bins=[]): """ - # Ensure that StatePoint.read_results() was called first - if (value == 'mean' and self.mean is None) or \ - (value == 'std_dev' and self.std_dev is None) or \ - (value == 'rel_err' and self.mean is None) or \ - (value == 'sum' and self.sum is None) or \ - (value == 'sum_sq' and self.sum_sq is None): - msg = 'The Tally ID="{0}" has no data to return. Call the ' \ - 'StatePoint.read_results() method before using ' \ - 'Tally.get_values(...)'.format(self.id) - raise ValueError(msg) + :param filters: + :param filter_bins: + :return: + """ + + cv.check_iterable_type('filters', filters, basestring) + cv.check_iterable_type('filter_bins', filter_bins, tuple) - ############################ FILTERS ######################### # Determine the score indices from any of the requested scores if filters: # Initialize empty list of indices for each bin in each Filter @@ -924,7 +875,17 @@ class Tally(object): else: filter_indices = np.arange(self.num_filter_bins) - ############################ NUCLIDES ######################## + return filter_indices + + def get_nuclide_indices(self, nuclides): + """ + + :param nuclides: + :return: + """ + + cv.check_iterable_type('nuclides', nuclides, basestring) + # Determine the score indices from any of the requested scores if nuclides: nuclide_indices = np.zeros(len(nuclides), dtype=np.int) @@ -935,7 +896,17 @@ class Tally(object): else: nuclide_indices = np.arange(self.num_nuclides) - ############################# SCORES ######################### + return nuclide_indices + + def get_score_indices(self, scores): + """ + + :param scores: + :return: + """ + + cv.check_iterable_type('scores', scores, basestring) + # Determine the score indices from any of the requested scores if scores: score_indices = np.zeros(len(scores), dtype=np.int) @@ -946,6 +917,78 @@ class Tally(object): else: score_indices = np.arange(self.num_scores) + return score_indices + + def get_values(self, scores=[], filters=[], filter_bins=[], + nuclides=[], value='mean'): + """Returns a tally score value given a list of filters to satisfy. + + This method constructs a 3D NumPy array for the requested Tally data + indexed by filter bin, nuclide bin, and score index. The method will + order the data in the array as specified in the parameter lists + + Parameters + ---------- + scores : list + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + filters : list + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list of Iterables + A list of the filter bins corresponding to the filter_types + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell' Filters. Each 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 a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond to the + filter_types parameter. + + nuclides : list + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + float or ndarray + A scalar or NumPy array of the Tally data indexed in the order + each filter, nuclide and score is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the Tally is populated with data + by the StatePoint.read_results() method. ValueError is also thrown + if the input parameters do not correspond to the Tally's attributes, + e.g., if the score(s) do not match those in the Tally. + + """ + + # Ensure that StatePoint.read_results() was called first + if (value == 'mean' and self.mean is None) or \ + (value == 'std_dev' and self.std_dev is None) or \ + (value == 'rel_err' and self.mean is None) or \ + (value == 'sum' and self.sum is None) or \ + (value == 'sum_sq' and self.sum_sq is None): + msg = 'The Tally ID="{0}" has no data to return. Call the ' \ + 'StatePoint.read_results() method before using ' \ + 'Tally.get_values(...)'.format(self.id) + raise ValueError(msg) + + # Get filter, nuclide and score indices + filter_indices = self.get_filter_indices(filters, filter_bins) + nuclide_indices = self.get_nuclide_indices(nuclides) + score_indices = self.get_score_indices(scores) + # Construct outer product of all three index types with each other indices = np.ix_(filter_indices, nuclide_indices, score_indices) @@ -1129,7 +1172,7 @@ class Tally(object): """ # Ensure that StatePoint.read_results() was called first - if self._sum is None or self._sum_sq is None: + if self._sum is None or self._sum_sq is None and not self.derived: msg = 'The Tally ID="{0}" has no data to export. Call the ' \ 'StatePoint.read_results() routine before using ' \ 'Tally.export_results(...)'.format(self.id) @@ -1282,11 +1325,25 @@ class Tally(object): 'since it does not contain any results.'.format(other.id) raise ValueError(msg) - new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) - new_tally = Tally(name=new_name) + new_tally = Tally() new_tally.with_batch_statistics = True new_tally._derived = True + if self.name != '' and other.name != '': + new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) + new_tally.name = new_name + + # FIXME: Align filters + self_filters = set(self.filters) + other_filters = set(other.filters) + filter_intersect = self_filters.intersection(other_filters) + + for i, filter in enumerate(filter_intersect): + self_index = self.filters.index(filter) + other_filter = other.filters[self_index] + if other_filter != filter: + other = other.swap_filters(filter, other_filter) + data = self._align_tally_data(other) if binary_op == '+': @@ -1334,10 +1391,69 @@ class Tally(object): for self_filter in self.filters: new_tally.add_filter(self_filter) else: - all_filters = [self.filters, other.filters] - for self_filter, other_filter in itertools.product(*all_filters): - new_filter = CrossFilter(self_filter, other_filter, binary_op) - new_tally.add_filter(new_filter) + + match = 0 + for self_filter, other_filter in zip(self.filters, other.filters): + if self_filter == other_filter: + match += 1 + else: + break + + match_filters = self.filters[:match] + cross_filters = [self.filters[match:], other.filters[match:]] + + ''' + # FIXME: + self_filters = set(self.filters) + other_filters = set(other.filters) + diff1 = list(self_filters.difference(other_filters)) + diff2 = list(other_filters.difference(self_filters)) + symm_diff = list(other_filters.symmetric_difference(self_filters)) + ''' + + # FIXME: This must be the common longest sequence of tallies at the beginning + + for filter in match_filters: + new_tally.add_filter(filter) + + ''' + # + if len(self_filters) == 0: + for filter in self.filters: + new_tally.add_filter(filter) + for filter in self_filters: + new_tally.add_filter(filter) + # + elif len(diff2) == 0: + for filter in other.filters: + new_tally.add_filter(filter) + for filter in diff2: + new_tally.add_filter(filter) + ''' + + if len(self.filters) != match and len(other.filters) == match: + for filter in cross_filters[0]: + new_tally.add_filter(filter) + elif len(other.filters) == match and len(other.filters) != match: + for filter in cross_filters[1]: + new_tally.add_filter(filter) + else: + for self_filter, other_filter in itertools.product(*cross_filters): + new_filter = CrossFilter(self_filter, other_filter, binary_op) + new_tally.add_filter(new_filter) + + # +# else: +# all_filters = list(set([self.filters, other.filters] + ''' + if len(symm_diff) <= 1: + for filter in symm_diff: + new_tally.add_filter(filter) + else: + for self_filter, other_filter in itertools.product(*symm_diff): + new_filter = CrossFilter(self_filter, other_filter, binary_op) + new_tally.add_filter(new_filter) + ''' # Generate score "outer products" if self.scores == other.scores: @@ -1361,8 +1477,95 @@ class Tally(object): new_nuclide = CrossNuclide(self_nuclide, other_nuclide, binary_op) new_tally.add_nuclide(new_nuclide) + # Correct each Filter's stride + stride = new_tally.num_nuclides * new_tally.num_score_bins + for filter in reversed(new_tally.filters): + filter.stride = stride + stride *= filter.num_bins + return new_tally + def swap_filters(self, filter1, filter2): + """ + + :param filter1: + :param filter2: + :return: + """ + + # Check that results have been read + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + cv.check_type('filter1', filter1, Filter) + cv.check_type('filter2', filter2, Filter) + + if filter1 == filter2: + msg = 'Unable to swap a filter with itself' + raise ValueError(msg) + elif filter1 not in self.filters: + msg = 'Unable to swap "{0}" filter1 in Tally ID="{1}" since it ' \ + 'does not contain such a filter'.format(filter1.type, self.id) + raise ValueError(msg) + elif filter2 not in self.filters: + msg = 'Unable to swap "{0}" filter2 in Tally ID="{1}" since it ' \ + 'does not contain such a filter'.format(filter2.type, self.id) + raise ValueError(msg) + + swap_tally = copy.deepcopy(self) + + # Swap the filters in the copied version of this Tally + filter1_index = swap_tally.filters.index(filter1) + filter2_index = swap_tally.filters.index(filter2) + swap_tally.filters[filter1_index] = filter2 + swap_tally.filters[filter2_index] = filter1 + + # Update the strides for each of the filters + stride = swap_tally.num_nuclides * swap_tally.num_score_bins + for filter in reversed(swap_tally.filters): + filter.stride = stride + stride *= filter.num_bins + + filters = [filter1.type, filter2.type] + filter1_bins = np.arange(filter.num_bins) + filter2_bins = np.arange(filter2.num_bins) + + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='sum') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally.sum[indices, :, :] = data + + if self.sum_sq is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='sum_sq') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally.sum_sq[indices, :, :] = data + + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='mean') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally._mean[indices, :, :] = data + + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='std_dev') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally._std_dev[indices, :, :] = data + + return swap_tally + def _align_tally_data(self, other): """Aligns data from two tallies for tally arithmetic. @@ -1396,10 +1599,61 @@ class Tally(object): if self.filters != other.filters: + # FIXME: Note that this makes the assumption that common filters + # are at the beginning of each Tally's list of filters + +# match = 0 +# for i, filter_pair in enumerate(zip(self.filters, other.filters)): +# self_filter, other_filter = filter_pair +# if self_filter == other_filter: +# match += 1 +# else: +# break + +# match_filters = self.filters[:match] +# cross_filters = [self.filters[match:], other.filters[match:]] +# cross_filters.extend(other.filters[match:]) + +# other_tile_factor = 1 +# self_repeat_factor = 1 + + # FIXME: If one or the other tally has not cross filters +# repeat_factor = 1 +# for self_filter, other_filter in itertools.product(*cross_filters): +# repeat_factor *= self_filter.num_bins * other_filter.num_bins + +# other_tile_factor = repeat_factor / other.num_filter_bins +# self_repeat_factor = repeat_factor / self.num_filter_bins + +# other_tile_factor = repeat_factor +# self_repeat_factor = repeat_factor + + # +# for filter in self.filters[match:]: +# other_tile_factor *= filter.num_bins + +# for filter in other.filters[match:]: +# self_repeat_factor *= filter.num_bins + + + # FIXME: + diff1 = list(set(self.filters).difference(set(other.filters))) + diff2 = list(set(other.filters).difference(set(self.filters))) + + # + other_tile_factor = 1 + self_repeat_factor = 1 + + # + for filter in diff1: + other_tile_factor *= filter.num_bins + for filter in diff2: + self_repeat_factor *= filter.num_bins + # Determine the number of paired combinations of filter bins # between the two tallies and repeat arrays along filter axes - self_repeat_factor = other.num_filter_bins - other_tile_factor = self.num_filter_bins +# self_repeat_factor = other.num_filter_bins +# other_tile_factor = self.num_filter_bins # Replicate the data self_mean = np.repeat(self_mean, self_repeat_factor, axis=0) @@ -1923,7 +2177,7 @@ class Tally(object): floats for 'energy' and 'energyout' filters corresponding to the energy boundaries of the bin of interest. The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the + interest. The order of the bins in the list must correspond to the filter_types parameter. nuclides : list @@ -1945,21 +2199,29 @@ class Tally(object): """ # Ensure that StatePoint.read_results() was called first - if self.sum is None: + if not self.derived and self.sum is None: msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ 'since it does not contain any results.'.format(self.id) raise ValueError(msg) new_tally = copy.deepcopy(self) - new_sum = self.get_values(scores, filters, filter_bins, - nuclides, 'sum') - new_sum_sq = self.get_values(scores, filters, filter_bins, - nuclides, 'sum_sq') - new_tally.sum = new_sum - new_tally.sum_sq = new_sum_sq - new_tally._mean = None - new_tally._std_dev = None + if self.sum is not None: + new_sum = self.get_values(scores, filters, filter_bins, + nuclides, 'sum') + new_tally.sum = new_sum + if self.sum_sq is not None: + new_sum_sq = self.get_values(scores, filters, filter_bins, + nuclides, 'sum_sq') + new_tally.sum_sq = new_sum_sq + if self.mean is not None: + new_mean = self.get_values(scores, filters, filter_bins, + nuclides, 'mean') + new_tally._mean = new_mean + if self.std_dev is not None: + new_std_dev = self.get_values(scores, filters, filter_bins, + nuclides, 'std_dev') + new_tally._std_dev = new_std_dev # SCORES if scores: @@ -2047,7 +2309,7 @@ class Tally(object): floats for 'energy' and 'energyout' filters corresponding to the energy boundaries of the bin of interest. The bin is a (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond of the + interest. The order of the bins in the list must correspond to the filter_types parameter. nuclides : list @@ -2115,6 +2377,66 @@ class Tally(object): return tally_sum + def diagonalize_filter(self, new_filter): + """Combines filters, scores and nuclides with another tally. + + This is a helper method for the tally arithmetic methods. The filters, + scores and nuclides from both tallies are enumerated into all possible + combinations and expressed as CrossFilter, CrossScore and + CrossNuclide objects in the new derived tally. + + Parameters + ---------- + other : Tally + The tally on the right hand side of the outer product + binary_op : {'+', '-', '*', '/', '^'} + The binary operation in the outer product + + Returns + ------- + Tally + A new Tally outer that is the outer product with this one. + + """ + + cv.check_type('new_filter', new_filter, Filter) + + if new_filter in self.filters: + msg = 'Unable to diagonalize Tally ID="{0}" which already ' \ + 'contains a "{1}" filter'.format(self.id, new_filter.type) + raise ValueError(msg) + + new_tally = copy.deepcopy(self) + new_tally.add_filter(new_filter) + + num_filter_bins = new_tally.num_filter_bins + num_nuclides = new_tally.num_nuclides + num_score_bins = new_tally.num_score_bins + new_shape = (num_filter_bins, num_nuclides, num_score_bins) + + diag_indices = np.arange(0, new_tally.num_filter_bins, new_filter.num_bins+1) + + if self.sum is not None: + new_tally._sum = np.zeros(new_shape, dtype=np.float64) + new_tally._sum[diag_indices, :, :] = self.sum + if self.sum_sq is not None: + new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) + new_tally._sum_sq[diag_indices, :, :] = self.sum_sq + if self.mean is not None: + new_tally._mean = np.zeros(new_shape, dtype=np.float64) + new_tally._mean[diag_indices, :, :] = self.mean + if self.std_dev is not None: + new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) + new_tally._std_dev[diag_indices, :, :] = self.std_dev + + # Correct each Filter's stride + stride = new_tally.num_nuclides * new_tally.num_score_bins + for filter in reversed(new_tally.filters): + filter.stride = stride + stride *= filter.num_bins + + return new_tally + class TalliesFile(object): """Tallies file used for an OpenMC simulation. Corresponds directly to the From 453b33264a8ea565a63c1c760b8c3fe97b29ddbc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 11 Sep 2015 09:55:48 +0400 Subject: [PATCH 064/519] Fix use of energy filters in openmc-plot-mesh-tally --- scripts/openmc-plot-mesh-tally | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index f925b413a3..1559ea3289 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -33,7 +33,7 @@ class MeshPlotter(tk.Frame): self.labels = {'cell': 'Cell:', 'cellborn': 'Cell born:', 'surface': 'Surface:', 'material': 'Material:', - 'universe': 'Universe:', 'energyin': 'Energy in:', + 'universe': 'Universe:', 'energy': 'Energy in:', 'energyout': 'Energy out:'} self.filterBoxes = {} @@ -180,9 +180,9 @@ class MeshPlotter(tk.Frame): self.filterBoxes[filterType] = combobox # Set combobox items - if filterType in ['energyin', 'energyout']: + if filterType in ['energy', 'energyout']: combobox['values'] = ['{0} to {1}'.format(*f.bins[i:i+2]) - for i in range(f.length)] + for i in range(len(f.bins) - 1)] else: combobox['values'] = [str(i) for i in f.bins] @@ -213,8 +213,13 @@ class MeshPlotter(tk.Frame): if f.type == 'mesh': mesh_filter = f continue - index = self.filterBoxes[f.type].current() - spec_list.append((f.type, (index,))) + elif f.type in ['energy', 'energyout']: + index = self.filterBoxes[f.type].current() + ebin = (f.bins[index], f.bins[index + 1]) + spec_list.append((f.type, (ebin,))) + else: + index = self.filterBoxes[f.type].current() + spec_list.append((f.type, (index,))) text = self.basisBox.get() if text == 'xy': From 517628daf1a17ccb83fe76b0c0b9d1d05c21ea86 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 11 Sep 2015 10:10:56 +0400 Subject: [PATCH 065/519] Respond to @smharper comments on pull request #447 --- src/hdf5_interface.F90 | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 491337e003..f4771d8480 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1,13 +1,16 @@ module hdf5_interface - ! This module provides the high-level procedures which greatly simplify - ! writing/reading different types of data to HDF5 files. In order to get it to - ! work with gfotran 4.6, all the write__ND subroutines had to be split - ! into two procedures, one accepting an assumed-shape array and another one - ! with an explicit-shape array since in gfortran 4.6 C_LOC does not work with - ! an assumed-shape array. When we move to gfortran 4.9+, these procedures can - ! be combined into one simply accepting an assumed-shape array. +!============================================================================== +! HDF5_INTERFACE -- This module provides the high-level procedures which greatly +! simplify writing/reading different types of data to HDF5 files. In order to +! get it to work with gfotran 4.6, all the write__ND subroutines had to be +! split into two procedures, one accepting an assumed-shape array and another +! one with an explicit-shape array since in gfortran 4.6 C_LOC does not work +! with an assumed-shape array. When we move to gfortran 4.9+, these procedures +! can be combined into one simply accepting an assumed-shape array. +!============================================================================== + use error, only: fatal_error use tally_header, only: TallyResult use hdf5 @@ -138,7 +141,7 @@ contains ! Determine access type open_mode = H5F_ACC_RDONLY_F - if (trim(mode) == 'w') open_mode = H5F_ACC_RDWR_F + if (mode == 'w') open_mode = H5F_ACC_RDWR_F if (parallel_) then ! Setup file access property list with parallel I/O access @@ -192,8 +195,12 @@ contains ! Check if group exists call h5ltpath_valid_f(group_id, trim(name), .true., exists, hdf5_err) - ! Either create or open group - if (exists) call h5gopen_f(group_id, trim(name), newgroup_id, hdf5_err) + ! open group if it exists + if (exists) then + call h5gopen_f(group_id, trim(name), newgroup_id, hdf5_err) + else + call fatal_error("The group '" // trim(name) // "' does not exist.") + end if end function open_group !=============================================================================== @@ -212,8 +219,11 @@ contains call h5ltpath_valid_f(group_id, trim(name), .true., exists, hdf5_err) ! create group - if (.not. exists) & - call h5gcreate_f(group_id, trim(name), newgroup_id, hdf5_err) + if (exists) then + call fatal_error("The group '" // trim(name) // "' already exists.") + else + call h5gcreate_f(group_id, trim(name), newgroup_id, hdf5_err) + end if end function create_group !=============================================================================== From a978225ba9fb6847f5f242153027f13a89dc8f00 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 11 Sep 2015 10:11:45 +0400 Subject: [PATCH 066/519] Remove openmc-tally-convergence script --- scripts/openmc-tally-convergence | 375 ------------------------------- 1 file changed, 375 deletions(-) delete mode 100755 scripts/openmc-tally-convergence diff --git a/scripts/openmc-tally-convergence b/scripts/openmc-tally-convergence deleted file mode 100755 index 81f45fd717..0000000000 --- a/scripts/openmc-tally-convergence +++ /dev/null @@ -1,375 +0,0 @@ -#!/usr/bin/env python - -# This program takes OpenMC statepoint binary files and creates a variety of -# outputs from them which should provide the user with an idea of the -# convergence behavior of all the tallies and filters defined by the user in -# tallies.xml. The program can directly plot the value and errors of each -# tally, filter, score combination; it can save these plots to a file; and -# it can also save the data used in these plots to a CSV file for importing in -# to other plotting packages such as Excel, gnuplot, MathGL, or Veusz. - -# To use the program, run this program from the working directory of the openMC -# problem to analyze. - -# The USER OPTIONS block below provides four options for the user to set: -# fileType, printxs, showImg, and savetoCSV. See the options block for more -# information. - -from __future__ import print_function -from math import sqrt, pow -from glob import glob - -import numpy as np -import scipy.stats -import matplotlib.pyplot as plt - -from openmc.statepoint import StatePoint - -##################################### USER OPTIONS - -# Set filetype (the file extension desired, without the period.) -# Options are backend dependent, but most backends support png, pdf, ps, eps -# and svg. Write "none" if no saved files are desired. -fileType = "none" - -# Set if cross-sections or reaction rates are desired printxs = True means X/S -printxs = False - -# Set if the figures should be displayed to screen or not (True means show) -showImg = False - -# Save to CSV for use in more advanced plotting programs like GNUPlot, MathGL -savetoCSV = True - -##################################### END USER OPTIONS - -## Find if tallies.xml exists. -#if glob('./tallies.xml') != None: -# # It exists -# tallyData = talliesXML('tallies.xml') -#else: -# # It does not exist. -# tallyData = None - -# Find all statepoints in this directory. -files = glob('./statepoint.*.binary') -fileNums = [] -begin = 13 -# Arrange the file list in increasing batch order -for i in range(len(files)): - end = files[i].find(".binary") - fileNums.append(int(files[i][begin:end])) -fileNums.sort() -# Re-make filenames -files = [] -for i in range(len(fileNums)): - files.append("./statepoint." + str(fileNums[i]) + ".binary") - -# Initialize arrays as needed -mean = [None for x in range(len(files))] -uncert = [None for x in range(len(files))] -scoreType = [None for x in range(len(files))] -active_batches = [None for x in range(len(files))] - -for i_batch in range(len(files)): - - # Get filename - batch_filename = files[i_batch] - - # Create StatePoint object - sp = StatePoint(batch_filename) - - # Read number of realizations for global tallies - sp.n_realizations = sp._get_int()[0] - - # Read global tallies - n_global_tallies = sp._get_int()[0] - sp.global_tallies = np.array(sp._get_double(2*n_global_tallies)) - sp.global_tallies.shape = (n_global_tallies, 2) - - # Flag indicating if tallies are present - tallies_present = sp._get_int()[0] - - # Check if tallies are present - if not tallies_present: - raise Exception("No tally data in state point!") - - # Increase the dimensionality of our main variables - mean[i_batch] = [None for x in range(len(sp.tallies))] - uncert[i_batch] = [None for x in range(len(sp.tallies))] - scoreType[i_batch] = [None for x in range(len(sp.tallies))] - - # Loop over all tallies - for i_tally, t in enumerate(sp.tallies): - # Calculate t-value for 95% two-sided CI - n = t.n_realizations - t_value = scipy.stats.t.ppf(0.975, n - 1) - - # Store the batch count - active_batches[i_batch] = n - - # Resize the 2nd dimension - mean[i_batch][i_tally] = [None for x in range(t.total_filter_bins)] - uncert[i_batch][i_tally] = [None for x in range(t.total_filter_bins)] - scoreType[i_batch][i_tally] = [None for x in range(t.total_filter_bins)] - - for i_filter in range(t.total_filter_bins): - # Resize the 3rd dimension - mean[i_batch][i_tally][i_filter] = [None for x in range(t.n_nuclides)] - uncert[i_batch][i_tally][i_filter] = [None for x in range(t.n_nuclides)] - scoreType[i_batch][i_tally][i_filter] = [None for x in range(t.n_nuclides)] - print(t.total_filter_bins,t.n_nuclides) - for i_nuclide in range(t.n_nuclides): - mean[i_batch][i_tally][i_filter][i_nuclide] = \ - [None for x in range(t.n_scores)] - uncert[i_batch][i_tally][i_filter][i_nuclide] = \ - [None for x in range(t.n_scores)] - scoreType[i_batch][i_tally][i_filter][i_nuclide] = \ - [None for x in range(t.n_scores)] - for i_score in range(t.n_scores): - scoreType[i_batch][i_tally][i_filter][i_nuclide][i_score] = \ - t.scores[i_score] - s, s2 = sp._get_double(2) - s /= n - mean[i_batch][i_tally][i_filter][i_nuclide][i_score] = s - if s != 0.0: - relative_error = t_value*sqrt((s2/n - s*s)/(n-1))/s - else: - relative_error = 0.0 - uncert[i_batch][i_tally][i_filter][i_nuclide][i_score] = relative_error - -# Reorder the data lists in to a list order more conducive for plotting: -# The indexing should be: [tally][filter][score][batch] -meanPlot = [None for x in range(len(mean[0]))] # Set to the number of tallies -uncertPlot = [None for x in range(len(mean[0]))] # Set to the number of tallies -absUncertPlot = [None for x in range(len(mean[0]))] # Set to number of tallies -filterLabel = [None for x in range(len(mean[0]))] #Set to the number of tallies -fluxLoc = [None for x in range(len(mean[0]))] # Set to the number of tallies -printxs = [False for x in range(len(mean[0]))] # Set to the number of tallies - -# Get and set the correct sizes for the rest of the dimensions -for i_tally in range(len(meanPlot)): - # Set 2nd (score) dimension - meanPlot[i_tally] = [None for x in range(len(mean[0][i_tally]))] - uncertPlot[i_tally] = [None for x in range(len(mean[0][i_tally]))] - absUncertPlot[i_tally] = [None for x in range(len(mean[0][i_tally]))] - filterLabel[i_tally] = [None for x in range(len(mean[0][i_tally]))] - - # Initialize flux location so it will be -1 if not found - fluxLoc[i_tally] = -1 - - for i_filter in range(len(meanPlot[i_tally])): - # Set 3rd (filter) dimension - meanPlot[i_tally][i_filter] = \ - [None for x in range(len(mean[0][i_tally][i_filter]))] - uncertPlot[i_tally][i_filter] = \ - [None for x in range(len(mean[0][i_tally][i_filter]))] - absUncertPlot[i_tally][i_filter] = \ - [None for x in range(len(mean[0][i_tally][i_filter]))] - filterLabel[i_tally][i_filter] = \ - [None for x in range(len(mean[0][i_tally][i_filter]))] - - for i_nuclide in range(len(meanPlot[i_tally][i_filter])): - # Set 4th (nuclide)) dimension - meanPlot[i_tally][i_filter][i_nuclide] = \ - [None for x in range(len(mean[0][i_tally][i_filter][i_nuclide]))] - uncertPlot[i_tally][i_filter][i_nuclide] = \ - [None for x in range(len(mean[0][i_tally][i_filter][i_nuclide]))] - absUncertPlot[i_tally][i_filter][i_nuclide] = \ - [None for x in range(len(mean[0][i_tally][i_filter][i_nuclide]))] - - for i_score in range(len(meanPlot[i_tally][i_filter][i_nuclide])): - # Set 5th (batch) dimension - meanPlot[i_tally][i_filter][i_nuclide][i_score] = \ - [None for x in range(len(mean))] - uncertPlot[i_tally][i_filter][i_nuclide][i_score] = \ - [None for x in range(len(mean))] - absUncertPlot[i_tally][i_filter][i_nuclide][i_score] = \ - [None for x in range(len(mean))] - - # Get filterLabel (this should be moved to its own function) - #??? How to do? - - # Set flux location if found - # all batches and all tallies will have the same score ordering, hence - # the 0's in the 1st, 3rd, and 4th dimensions. - if scoreType[0][i_tally][0][0][i_score] == 'flux': - fluxLoc[i_tally] = i_score - -# Set printxs array according to the printxs input -if printxs: - for i_tally in range(len(fluxLoc)): - if fluxLoc[i_tally] != -1: - printxs[i_tally] = True - -# Now rearrange the data as suitable, and perform xs conversion if necessary -for i_batch in range(len(mean)): - for i_tally in range(len(mean[i_batch])): - for i_filter in range(len(mean[i_batch][i_tally])): - for i_nuclide in range(len(mean[i_batch][i_tally][i_filter])): - for i_score in range(len(mean[i_batch][i_tally][i_filter][i_nuclide])): - if (printxs[i_tally] and \ - ((scoreType[0][i_tally][i_filter][i_nuclide][i_score] != 'flux') and \ - (scoreType[0][i_tally][i_filter][i_nuclide][i_score] != 'current'))): - - # Perform rate to xs conversion - # mean is mean/fluxmean - meanPlot[i_tally][i_filter][i_nuclide][i_score][i_batch] = \ - mean[i_batch][i_tally][i_filter][i_nuclide][i_score] / \ - mean[i_batch][i_tally][i_filter][i_nuclide][fluxLoc[i_tally]] - - # Update the relative uncertainty via error propagation - uncertPlot[i_tally][i_filter][i_nuclide][i_score][i_batch] = \ - sqrt(pow(uncert[i_batch][i_tally][i_filter][i_nuclide][i_score],2) \ - + pow(uncert[i_batch][i_tally][i_filter][i_nuclide][fluxLoc[i_tally]],2)) - else: - - # Do not perform rate to xs conversion - meanPlot[i_tally][i_filter][i_nuclide][i_score][i_batch] = \ - mean[i_batch][i_tally][i_filter][i_nuclide][i_score] - uncertPlot[i_tally][i_filter][i_nuclide][i_score][i_batch] = \ - uncert[i_batch][i_tally][i_filter][i_nuclide][i_score] - - # Both have the same absolute uncertainty calculation - absUncertPlot[i_tally][i_filter][i_nuclide][i_score][i_batch] = \ - uncert[i_batch][i_tally][i_filter][i_nuclide][i_score] * \ - mean[i_batch][i_tally][i_filter][i_nuclide][i_score] - -# Set plotting constants -xLabel = "Batches" -xLabel = xLabel.title() # not necessary for now, but is left in to handle if -# the previous line changes - -# Begin plotting -for i_tally in range(len(meanPlot)): - # Set tally string (placeholder until I put tally labels in statePoint) - tallyStr = "Tally " + str(i_tally + 1) - - for i_filter in range(len(meanPlot[i_tally])): - - # Set filter string - filterStr = "Filter " + str(i_filter + 1) - - for i_nuclide in range(len(meanPlot[i_tally][i_filter])): - - nuclideStr = "Nuclide " + str(i_nuclide + 1) - - for i_score in range(len(meanPlot[i_tally][i_filter][i_nuclide])): - - # Set score string - scoreStr = scoreType[i_batch][i_tally][i_filter][i_nuclide][i_score] - scoreStr = scoreStr.title() - if (printxs[i_tally] and ((scoreStr != 'Flux') and \ - (scoreStr != 'Current'))): - scoreStr = scoreStr + "-XS" - - # set Title - title = "Convergence of " + scoreStr + " in " + tallyStr + " for "\ - + filterStr + " and " + nuclideStr - - # set yLabel - yLabel = scoreStr - yLabel = yLabel.title() - - # Set saving filename - fileName = "tally_" + str(i_tally + 1) + "_" + scoreStr + \ - "_filter_" + str(i_filter+1) + "_nuclide_" + str(i_nuclide+1) \ - + "." + fileType - REfileName = "tally_" + str(i_tally + 1) + "_" + scoreStr + \ - "RE_filter_" + str(i_filter+1) + "_nuclide_" + str(i_nuclide+1) \ - + "." + fileType - - # Plot mean with absolute error bars - plt.errorbar(active_batches, \ - meanPlot[i_tally][i_filter][i_nuclide][i_score][:], \ - absUncertPlot[i_tally][i_filter][i_nuclide][i_score][:],fmt='o-',aa=True) - plt.xlabel(xLabel) - plt.ylabel(yLabel) - plt.title(title) - if (fileType != 'none'): - plt.savefig(fileName) - if showImg: - plt.show() - plt.clf() - - # Plot relative uncertainty - plt.plot(active_batches, \ - uncertPlot[i_tally][i_filter][i_nuclide][i_score][:],'o-',aa=True) - plt.xlabel(xLabel) - plt.ylabel("Relative Error of " + yLabel) - plt.title("Relative Error of " + title) - if (fileType != 'none'): - plt.savefig(REfileName) - if showImg: - plt.show() - plt.clf() - -if savetoCSV: - # This block loops through each tally, and for each tally: - # Creates a new file - # Writes the scores and filters for that tally in csv format. - # The columns will be: batches,then for each filter: all the scores - # The rows, of course, are the data points per batch. - - for i_tally in range(len(meanPlot)): - # Set tally string (placeholder until I put tally labels in statePoint) - tallyStr = "Tally " + str(i_tally + 1) - CSV_filename = "./tally" + str(i_tally+1)+".csv" - # Open the file - f = open(CSV_filename, 'w') - - # Write the header line - - lineText = "Batches" - - for i_filter in range(len(meanPlot[i_tally])): - - # Set filter string - filterStr = "Filter " + str(i_filter + 1) - - for i_nuclide in range(len(meanPlot[i_tally][i_filter])): - - nuclideStr = "Nuclide " + str(i_nuclide + 1) - - for i_score in range(len(meanPlot[i_tally][i_filter][i_nuclide])): - - # Set the title - scoreStr = scoreType[i_batch][i_tally][i_filter][i_nuclide][i_score] - scoreStr = scoreStr.title() - if (printxs[i_tally] and ((scoreStr != 'Flux') and \ - (scoreStr != 'Current'))): - scoreStr = scoreStr + "-XS" - - # set header - headerText = scoreStr + " for " + filterStr + " for " + nuclideStr - - lineText = lineText + "," + headerText + \ - ",Abs Unc of " + headerText + \ - ",Rel Unc of " + headerText - - f.write(lineText + "\n") - - # Write the data lines, each row is a different batch - - for i_batch in range(len(meanPlot[i_tally][0][0][0])): - - lineText = repr(active_batches[i_batch]) - - for i_filter in range(len(meanPlot[i_tally])): - - for i_nuclide in range(len(meanPlot[i_tally][i_filter])): - - for i_score in range(len(meanPlot[i_tally][i_filter][i_nuclide])): - - fieldText = \ - repr(meanPlot[i_tally][i_filter][i_nuclide][i_score][i_batch]) + \ - "," + \ - repr(absUncertPlot[i_tally][i_filter][i_nuclide][i_score][i_batch]) +\ - "," + \ - repr(uncertPlot[i_tally][i_filter][i_nuclide][i_score][i_batch]) - - lineText = lineText + "," + fieldText - - f.write(lineText + "\n") - - From 4994493397e31ff59c4d1fee7d39778cee5569f9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 12 Sep 2015 00:31:50 +0800 Subject: [PATCH 067/519] Add two test configurations to Travis pull request runs --- tests/travis.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/travis.sh b/tests/travis.sh index af54b4ff67..443e951cc9 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -5,7 +5,7 @@ set -ev # Run all debug tests ./check_source.py if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then - ./run_tests.py -C "^hdf5-debug$|^phdf5-debug$|^phdf5-omp-debug$" -j 2 -s + ./run_tests.py -C "^hdf5-debug$|^omp-hdf5-debug|^mpi-hdf5-debug|^phdf5-debug$|^phdf5-omp-debug$" -j 2 -s else ./run_tests.py -C "^hdf5-debug$" -j 2 fi From 0e8eaecf2faa223aa32d1b768bd9d9c025127632 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 11 Sep 2015 16:41:11 -0400 Subject: [PATCH 068/519] Multigroup Chi class is now working and verfied for 2-groups --- openmc/filter.py | 5 +++-- openmc/mgxs/mgxs.py | 11 ++++++++--- openmc/tallies.py | 22 ++++++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 52c927bed5..435d08c448 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -321,8 +321,7 @@ class Filter(object): # Filter bins for distribcell are the "IDs" of each unique placement # of the Cell in the Geometry (integers starting at 0) elif self.type == 'distribcell': - val = np.where(self.bins == filter_bin)[0][0] - filter_index = val + filter_index = filter_bin # Use ID for all other Filters (e.g., material, cell, etc.) else: @@ -363,6 +362,8 @@ class Filter(object): elif self.type in ['energy', 'energyout']: bin = (self.bins[bin_index], self.bins[bin_index+1]) + elif self.type == 'distribcell': + bin = (self.bins[0],) else: bin = (self.bins[bin_index],) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 39eb79160e..d92daa5d6b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1280,14 +1280,19 @@ class Chi(MultiGroupXS): sum_nu_fission_in = nu_fission_in.summation(filters=['energy'], filter_bins=energy_bins) + + # FIXME: CrossFilter for energy + energy messes up tally arithmetic + sum_nu_fission_in.remove_filter(sum_nu_fission_in.filters[-1]) + self._xs_tally = nu_fission_out / sum_nu_fission_in # Compute the total across all groups per subdomain if self.domain_type == 'distribcell': - subdomain_indices = self.get_subdomain_indices() - filter_bins = [(i,) for i in subdomain_indices] + domain_filter = self.tallies['nu-fission-in'].filters[0] + num_subdomains = domain_filter.num_bins + filter_bins = [((i,),) for i in range(num_subdomains)] else: - filter_bins = [(self.domain,)] + filter_bins = [((self.domain,),)] # Normalize chi to 1.0 norm = self._xs_tally.summation(filters=[self.domain_type], diff --git a/openmc/tallies.py b/openmc/tallies.py index 827d98b613..c0fb1615f5 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -852,6 +852,9 @@ class Tally(object): for k in range(filter.num_bins): bins.append((filter.bins[k], filter.bins[k+1])) + elif filter.type == 'distribcell': + bins = np.arange(filter.num_bins) + # Create list of IDs for bins for all other Filter types else: bins = filter.bins @@ -1529,12 +1532,19 @@ class Tally(object): stride *= filter.num_bins filters = [filter1.type, filter2.type] - filter1_bins = np.arange(filter.num_bins) - filter2_bins = np.arange(filter2.num_bins) + if filter1.type == 'distribcell': + filter1_bins = np.arange(filter.num_bins) + else: + filter1_bins = [(filter1.get_bin(i)) for i in range(filter1.num_bins)] + + if filter1.type == 'distribcell': + filter2_bins = np.arange(filter2.num_bins) + else: + filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] if self.sum is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + filter_bins = [(bin1,), (bin2,)] data = self.get_values(filters=filters, filter_bins=filter_bins, value='sum') indices = swap_tally.get_filter_indices(filters, filter_bins) @@ -1542,7 +1552,7 @@ class Tally(object): if self.sum_sq is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + filter_bins = [(bin1,), (bin2,)] data = self.get_values(filters=filters, filter_bins=filter_bins, value='sum_sq') indices = swap_tally.get_filter_indices(filters, filter_bins) @@ -1550,7 +1560,7 @@ class Tally(object): if self.sum is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + filter_bins = [(bin1,), (bin2,)] data = self.get_values(filters=filters, filter_bins=filter_bins, value='mean') indices = swap_tally.get_filter_indices(filters, filter_bins) @@ -1558,7 +1568,7 @@ class Tally(object): if self.sum is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(filter1.get_bin(bin1),), (filter2.get_bin(bin2),)] + filter_bins = [(bin1,), (bin2,)] data = self.get_values(filters=filters, filter_bins=filter_bins, value='std_dev') indices = swap_tally.get_filter_indices(filters, filter_bins) From 6d3d794c3e8e6544e98af6535e069b6c33e851bc Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 11 Sep 2015 16:52:36 -0400 Subject: [PATCH 069/519] Corrected energy normalization for mulit-group chi calculatoin --- openmc/mgxs/mgxs.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d92daa5d6b..b37a5880c6 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1286,17 +1286,13 @@ class Chi(MultiGroupXS): self._xs_tally = nu_fission_out / sum_nu_fission_in - # Compute the total across all groups per subdomain - if self.domain_type == 'distribcell': - domain_filter = self.tallies['nu-fission-in'].filters[0] - num_subdomains = domain_filter.num_bins - filter_bins = [((i,),) for i in range(num_subdomains)] - else: - filter_bins = [((self.domain,),)] - # Normalize chi to 1.0 - norm = self._xs_tally.summation(filters=[self.domain_type], - filter_bins=filter_bins) + norm = self._xs_tally.summation(filters=['energyout'], + filter_bins=energy_bins) + + # FIXME: CrossFilter for energy + energy messes up tally arithmetic + norm.remove_filter(sum_nu_fission_in.filters[-1]) + self._xs_tally /= norm self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) From a569ce786b78d3c92a95129ac3fe5bf3c0f8e61a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 12 Sep 2015 12:24:27 +0700 Subject: [PATCH 070/519] Revise documentation for statepoint format --- docs/source/devguide/statepoint.rst | 229 +++++++++++++--------------- docs/source/quickinstall.rst | 4 +- docs/source/usersguide/install.rst | 64 ++++---- 3 files changed, 146 insertions(+), 151 deletions(-) diff --git a/docs/source/devguide/statepoint.rst b/docs/source/devguide/statepoint.rst index 4a1db94788..7b08620563 100644 --- a/docs/source/devguide/statepoint.rst +++ b/docs/source/devguide/statepoint.rst @@ -6,286 +6,271 @@ State Point Binary File Specifications The current revision of the statepoint binary file is 13. -**integer(4) FILETYPE_STATEPOINT** +**/filetype** (*int*) - Flags whether this file is a statepoint file or a particle restart file. + Flags what type of file this is. A value of -1 indicates a statepoint file, + a value of -2 indicates a particle restart file, and a value of -3 indicates + a source file. -**integer(4) REVISION_STATEPOINT** +**/revision** (*int*) Revision of the binary state point file. Any time a change is made in the format of the state-point file, this integer is incremented. -**integer(4) VERSION_MAJOR** +**/version_major** (*int*) Major version number for OpenMC -**integer(4) VERSION_MINOR** +**/version_minor** (*int*) Minor version number for OpenMC -**integer(4) VERSION_RELEASE** +**/version_release** (*int*) Release version number for OpenMC -**character(19) time_stamp** +**/time_stamp** (*char[19]*) Date and time the state point was written. -**character(255) path** +**/path** (*char[255]*) Absolute path to directory containing input files. -**integer(8) seed** +**/seed** (*int8_t*) Pseudo-random number generator seed. -**integer(4) run_mode** +**/run_mode** (*int*) - run mode used. The modes are described in constants.F90. + Run mode used. A value of 1 indicates a fixed-source run and a value of 2 + indicates an eigenvalue run. -**integer(8) n_particles** +**/n_particles** (*int8_t*) Number of particles used per generation. -**integer(4) current_batch** +**/n_batches** (*int*) + + Number of batches to simulate. + +**/current_batch** (*int*) The number of batches already simulated. if (run_mode == MODE_EIGENVALUE) - **integer(4) n_inactive** + **/n_inactive** (*int*) - Number of inactive batches + Number of inactive batches. - **integer(4) gen_per_batch** + **gen_per_batch** (*int*) - Number of generations per batch for criticality calculations + Number of generations per batch. - *do i = 1, current_batch \* gen_per_batch* + **/k_generation** (*double[]*) - **real(8) k_generation(i)** + k-effective for each generation simulated. - k-effective for the i-th total generation + **/entropy** (*double[]*) - *do i = 1, current_batch \* gen_per_batch* + Shannon entropy for each generation simulated - **real(8) entropy(i)** - - Shannon entropy for the i-th total generation - - **real(8) k_col_abs** + **/k_col_abs** (*double*) Sum of product of collision/absorption estimates of k-effective - **real(8) k_col_tra** + **/k_col_tra** (*double*) Sum of product of collision/track-length estimates of k-effective - **real(8) k_abs_tra** + **/k_abs_tra** (*double*) Sum of product of absorption/track-length estimates of k-effective - **real(8) k_combined(2)** + **/k_combined** (*double[2]*) Mean and standard deviation of a combined estimate of k-effective - **integer(4) cmfd_on** + **/cmfd_on** (*int*) - Flag that cmfd is on + Flag indicating whether CMFD is on (1) or off (0). if (cmfd_on) - **integer(4) cmfd % indices** + **/cmfd/indices** (*int[4]*) Indices for cmfd mesh (i,j,k,g) - **real(8) cmfd % k_cmfd(1:current_batch)** + **/cmfd/k_cmfd** (*double[]*) CMFD eigenvalues - **real(8) cmfd % src(1:G,1:I,1:J,1:K)** + **/cmfd/cmfd_src** (*double[][][][]*) CMFD fission source - **real(8) cmfd % entropy(1:current_batch)** + **/cmfd/cmfd_entropy** (*double[]*) CMFD estimate of Shannon entropy - **real(8) cmfd % balance(1:current_batch)** + **/cmfd/cmfd_balance** (*double[]*) RMS of the residual neutron balance equation on CMFD mesh - **real(8) cmfd % dom(1:current_batch)** + **/cmfd/cmfd_dominance** (*double[]*) CMFD estimate of dominance ratio - **real(8) cmfd % scr_cmp(1:current_batch)** + **/cmfd/cmfd_srccmp** (*double[]*) RMS comparison of difference between OpenMC and CMFD fission source -**integer(4) n_meshes** +**/tallies/n_meshes** (*int*) Number of meshes in tallies.xml file +**/tally/meshes/ids** (*int[]*) + + Internal unique ID of each mesh. + +**/tally/meshes/keys** (*int[]*) + + User-identified unique ID of each mesh + *do i = 1, n_meshes* - **integer(4) meshes(i) % id** + **/tallies/meshes/mesh i/id** (*int*) - Unique ID of mesh. + Unique identifier of the mesh. - **integer(4) meshes(i) % type** + **/tallies/meshes/mesh i/type** (*int*) Type of mesh. - **integer(4) meshes(i) % n_dimension** + **/tallies/meshes/mesh i/n_dimension** (*int*) Number of dimensions for mesh (2 or 3). - **integer(4) meshes(i) % dimension(:)** + **/tallies/meshes/mesh i/dimension** (*int*) Number of mesh cells in each dimension. - **real(8) meshes(i) % lower_left(:)** + **/tallies/meshes/mesh i/lower_left** (*double[]*) Coordinates of lower-left corner of mesh. - **real(8) meshes(i) % upper_right(:)** + **/tallies/meshes/mesh i/upper_right** (*double[]*) Coordinates of upper-right corner of mesh. - **real(8) meshes(i) % width(:)** + **/tallies/meshes/mesh i/width** (*double[]*) Width of each mesh cell in each dimension. -**integer(4) n_tallies** +**/tallies/n_tallies** (*int*) + + Number of user-defined tallies. + +**/tallies/ids** (*int[]*) + + Internal unique ID of each tally. + +**/tallies/keys** (*int[]*) + + User-identified unique ID of each tally. *do i = 1, n_tallies* - **integer(4) tallies(i) % id** + **/tallies/tally i/estimator** (*int*) - Unique ID of tally. + Type of tally estimator: analog (1) or tracklength (2). - **integer(4) tallies(i) % n_realizations** + **/tallies/tally i/n_realizations** (*int*) - Number of realizations for the i-th tally. + Number of realizations. - **integer(4) size(tallies(i) % scores, 1)** + **/tallies/tally i/n_filters** (*int*) - Total number of score bins for the i-th tally - - **integer(4) size(tallies(i) % scores, 2)** - - Total number of filter bins for the i-th tally - - **integer(4) tallies(i) % n_filters** + Number of filters used. *do j = 1, tallies(i) % n_filters* - **integer(4) tallies(i) % filter(j) % type** + **/tallies/tally i/filter j/type** (*int*) Type of tally filter. - **integer(4) tallies(i) % filter(j) % n_bins** + **/tallies/tally i/filter j/offset** (*int*) + + Filter offset (used for distribcell). + + **/tallies/tally i/filter j/n_bins** (*int*) Number of bins for filter. - **integer(4)/real(8) tallies(i) % filter(j) % bins(:)** + **/tallies/tally i/filter j/bins** (*int[]* or *double[]*) Value for each filter bin of this type. - **integer(4) tallies(i) % n_nuclide_bins** + **/tallies/tally i/n_nuclides** (*int*) Number of nuclide bins. If none are specified, this is just one. - *do j = 1, tallies(i) % n_nuclide_bins* + **/tallies/tally i/nuclides** (*int[]*) - **integer(4) tallies(i) % nuclide_bins(j)** + Values of specified nuclide bins (ZAID identifiers) - Values of specified nuclide bins - - **integer(4) tallies(i) % n_score_bins** + **/tallies/tally i/n_score_bins** (*int*) Number of scoring bins. - *do j = 1, tallies(i) % n_score_bins* + **/tallies/tally i/score_bins** (*int*) - **integer(4) tallies(i) % score_bins(j)** + Values of specified scoring bins (e.g. SCORE_FLUX). - Values of specified scoring bins (e.g. SCORE_FLUX). - - **integer(4) tallies(i) % n_score_bins** + **/tallies/tally i/n_user_score_bins** Number of scoring bins without accounting for those added by - the scatter-pn command. + expansions, e.g. scatter-PN. - *do j = 1, tallies(i) % n_user_score_bins* + *do J = 1, total number of moments* - **character(8) tallies(i) % moment_order(j)** + **/tallies/tally i/moments/orderJ** (*char[8]*) Tallying moment order for Legendre and spherical harmonic tally expansions (*e.g.*, 'P2', 'Y1,2', etc.). -**integer(4) source_present** +**/source_present** (*int*) Flag indicated if source bank is present in the file -**integer(4) n_realizations** +**/n_realizations** (*int*) Number of realizations for global tallies. -**integer(4) N_GLOBAL_TALLIES** +**/n_global_tallies** (*int*) - Number of global tally scores + Number of global tally scores. -*do i = 1, N_GLOBAL_TALLIES* +**/global_tallies** (Compound type) - **real(8) global_tallies(i) % sum** + Accumulated sum and sum-of-squares for each global tally. The compound type + has fields named ``sum`` and ``sum_sq``. - Accumulated sum for the i-th global tally - - **real(8) global_tallies(i) % sum_sq** - - Accumulated sum of squares for the i-th global tally - -**integer(4) tallies_on** +**tallies_present** (*int*) Flag indicated if tallies are present in the file. -if (tallies_on > 0) +*do i = 1, n_tallies* - *do i = 1, n_tallies* +**/tallies/tally i/results** (Compound type) - *do k = 1, size(tallies(i) % scores, 2)* - - *do j = 1, size(tallies(i) % scores, 1)* - - **real(8) tallies(i) % scores(j,k) % sum** - - Accumulated sum for the j-th score and k-th filter of the - i-th tally - - **real(8) tallies(i) % scores(j,k) % sum_sq** - - Accumulated sum of squares for the j-th score and k-th - filter of the i-th tally + Accumulated sum and sum-of-squares for each bin of the tally i-th tally if (run_mode == MODE_EIGENVALUE and source_present) - *do i = 1, n_particles* - - **real(8) source_bank(i) % wgt** - - Weight of the i-th source particle - - **real(8) source_bank(i) % xyz(1:3)** - - Coordinates of the i-th source particle. - - **real(8) source_bank(i) % uvw(1:3)** - - Direction of the i-th source particle - - **real(8) source_bank(i) % E** - - Energy of the i-th source particle. + **/source_bank** (Compound type) + Source bank information for each particle. The compound type has fields + ``wgt``, ``xyz``, ``uvw``, and ``E`` which represent the weight, + position, direction, and energy of the source particle, respectively. diff --git a/docs/source/quickinstall.rst b/docs/source/quickinstall.rst index b64dfebda1..31ca71ffc7 100644 --- a/docs/source/quickinstall.rst +++ b/docs/source/quickinstall.rst @@ -35,8 +35,8 @@ Installing from Source on Linux or Mac OS X ------------------------------------------- All OpenMC source code is hosted on GitHub_. If you have git_, the gfortran_ -compiler, and CMake_ installed, you can download and install OpenMC be entering -the following commands in a terminal: +compiler, CMake_, and HDF_ installed, you can download and install OpenMC be +entering the following commands in a terminal: .. code-block:: sh diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index 7d3cda1733..7b8c6e3d49 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -59,6 +59,31 @@ Prerequisites sudo apt-get install cmake + * HDF5_ Library for portable binary output format + + OpenMC uses HDF5 for binary output files. As such, you will need to have + HDF5 installed on your computer. The installed version will need to have + been compiled with the same compiler you intend to compile OpenMC with. If + you are using HDF5 in conjunction with MPI, we recommend that your HDF5 + installation be built with parallel I/O features. An example of + configuring HDF5_ is listed below:: + + FC=/opt/mpich/3.1/bin/mpif90 CC=/opt/mpich/3.1/bin/mpicc \ + ./configure --prefix=/opt/hdf5/1.8.12 --enable-fortran \ + --enable-fortran2003 --enable-parallel + + You may omit ``--enable-parallel`` if you want to compile HDF5_ in serial. + + On Debian derivatives, HDF5 and/or parallel HDF5 can be installed through + the APT package manager: + + .. code-block:: sh + + sudo apt-get install libhdf5-8 libhdf5-dev hdf5-helpers + + Note that the exact package names may vary depending on your particular + distribution and version. + .. admonition:: Optional * An MPI implementation for distributed-memory parallel runs @@ -72,20 +97,6 @@ Prerequisites sudo apt-get install mpich libmpich-dev sudo apt-get install openmpi-bin libopenmpi1.6 libopenmpi-dev - * HDF5_ Library for portable binary output format - - To compile with support for HDF5_ output (highly recommended), you will - need to have HDF5 installed on your computer. The installed version will - need to have been compiled with the same compiler you intend to compile - OpenMC with. HDF5_ must be built with parallel I/O features if you intend - to use HDF5_ with MPI. An example of configuring HDF5_ is listed below:: - - FC=/opt/mpich/3.1/bin/mpif90 CC=/opt/mpich/3.1/bin/mpicc \ - ./configure --prefix=/opt/hdf5/1.8.12 --enable-fortran \ - --enable-fortran2003 --enable-parallel - - You may omit ``--enable-parallel`` if you want to compile HDF5_ in serial. - * git_ version control software for obtaining source code .. _gfortran: http://gcc.gnu.org/wiki/GFortran @@ -194,27 +205,26 @@ command, i.e. FC=mpif90 cmake /path/to/openmc -Compiling with HDF5 -+++++++++++++++++++ - -To compile with MPI, set the :envvar:`FC` environment variable to the path to -the HDF5 Fortran wrapper. For example, in a bash shell: +Selecting HDF5 Installation ++++++++++++++++++++++++++++ +CMakeLists.txt searches for the ``h5fc`` or ``h5pfc`` HDF5 Fortran wrapper on +your PATH environment variable and subsequently uses it to determine library +locations and compile flags. If you have multiple installations of HDF5 or one +that does not appear on your PATH, you can set the HDF5_ROOT environment +variable to the root directory of the HDF5 installation, e.g. .. code-block:: sh - export FC=h5fc + export HDF5_ROOT=/opt/hdf5/1.8.15 cmake /path/to/openmc -As noted above, an environment variable can typically be set for a single -command, i.e. +This will cause CMake to search first in /opt/hdf5/1.8.15/bin for ``h5fc`` / +``h5pfc`` before it searches elsewhere. As noted above, an environment variable +can typically be set for a single command, i.e. .. code-block:: sh - FC=h5fc cmake /path/to/openmc - -To compile with support for both MPI and HDF5, use the parallel HDF5 wrapper -``h5pfc`` instead. Note that this requires that your HDF5 installation be -compiled with ``--enable-parallel``. + HDF5_ROOT=/opt/hdf5/1.8.15 cmake /path/to/openmc Compiling on Linux and Mac OS X ------------------------------- From 85a67ce17b79438f4f788148fce4e6679a471627 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 12 Sep 2015 02:04:21 -0400 Subject: [PATCH 071/519] Added Tally.tile_filter(...) routine for multi-group chi with distribcells --- openmc/mgxs/mgxs.py | 11 ++++++- openmc/tallies.py | 77 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index b37a5880c6..c837bf0859 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1059,6 +1059,7 @@ class ScatterMatrixXS(MultiGroupXS): scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges + energy_filter.num_bins = self.num_groups scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) rxn_tally = self.tallies['scatter'] - scatter_p1 else: @@ -1281,6 +1282,9 @@ class Chi(MultiGroupXS): sum_nu_fission_in = nu_fission_in.summation(filters=['energy'], filter_bins=energy_bins) + # FIXME: Need ability to override energy groups with group numbers + # FIXME: Reverse from fast to thermal with energy groups + # FIXME: CrossFilter for energy + energy messes up tally arithmetic sum_nu_fission_in.remove_filter(sum_nu_fission_in.filters[-1]) @@ -1291,7 +1295,12 @@ class Chi(MultiGroupXS): filter_bins=energy_bins) # FIXME: CrossFilter for energy + energy messes up tally arithmetic - norm.remove_filter(sum_nu_fission_in.filters[-1]) + norm.remove_filter(norm.filters[-1]) + + energy_filter = openmc.Filter(type='energyout') + energy_filter.bins = self.energy_groups.group_edges + energy_filter.num_bins = self.num_groups + norm = norm.tile_filter(energy_filter) self._xs_tally /= norm self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) diff --git a/openmc/tallies.py b/openmc/tallies.py index c0fb1615f5..28a89af91f 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2387,6 +2387,74 @@ class Tally(object): return tally_sum + def tile_filter(self, new_filter): + """Combines filters, scores and nuclides with another tally. + + This is a helper method for the tally arithmetic methods. The filters, + scores and nuclides from both tallies are enumerated into all possible + combinations and expressed as CrossFilter, CrossScore and + CrossNuclide objects in the new derived tally. + + Parameters + ---------- + other : Tally + The tally on the right hand side of the outer product + binary_op : {'+', '-', '*', '/', '^'} + The binary operation in the outer product + + Returns + ------- + Tally + A new Tally outer that is the outer product with this one. + + """ + + cv.check_type('new_filter', new_filter, Filter) + + if new_filter in self.filters: + msg = 'Unable to tile Tally ID="{0}" which already ' \ + 'contains a "{1}" filter'.format(self.id, new_filter.type) + raise ValueError(msg) + + new_tally = copy.deepcopy(self) + new_tally.add_filter(new_filter) + + num_filter_bins = new_tally.num_filter_bins + num_nuclides = new_tally.num_nuclides + num_score_bins = new_tally.num_score_bins + new_shape = (num_filter_bins, num_nuclides, num_score_bins) + + repeat_indices = np.arange(0, new_tally.num_bins, new_filter.num_bins) + repeat_factor = new_filter.num_bins + + if self.sum is not None: + new_tally._sum = np.zeros(new_shape, dtype=np.float64) + if self.sum_sq is not None: + new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) + if self.mean is not None: + new_tally._mean = np.zeros(new_shape, dtype=np.float64) + if self.std_dev is not None: + new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) + + for i in range(repeat_factor): + if self.sum is not None: + new_tally._sum[repeat_indices+i, :, :] = self.sum + if self.sum_sq is not None: + new_tally._sum_sq[repeat_indices+i, :, :] = self.sum_sq + if self.mean is not None: + new_tally._mean[repeat_indices+i, :, :] = self.mean + if self.std_dev is not None: + new_tally._std_dev[repeat_indices+i, :, :] = self.std_dev + + # Correct each Filter's stride + stride = new_tally.num_nuclides * new_tally.num_score_bins + for filter in reversed(new_tally.filters): + filter.stride = stride + stride *= filter.num_bins + + return new_tally + + def diagonalize_filter(self, new_filter): """Combines filters, scores and nuclides with another tally. @@ -2424,7 +2492,14 @@ class Tally(object): num_score_bins = new_tally.num_score_bins new_shape = (num_filter_bins, num_nuclides, num_score_bins) - diag_indices = np.arange(0, new_tally.num_filter_bins, new_filter.num_bins+1) + indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1) + diag_indices = np.zeros(self.num_bins, dtype=np.int) + diag_factor = self.num_bins / new_filter.num_bins + + for i in range(diag_factor): + start = i * new_filter.num_bins + end = (i+1) * new_filter.num_bins + diag_indices[start:end] = indices + (i * new_filter.num_bins**2) if self.sum is not None: new_tally._sum = np.zeros(new_shape, dtype=np.float64) From 17317a7a31e71592b2c57f135e4d179d43662785 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 12 Sep 2015 02:31:25 -0400 Subject: [PATCH 072/519] Now using tally merging and slicing for openmc.mgxs --- openmc/mgxs/mgxs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index c837bf0859..d775232614 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -657,8 +657,9 @@ class MultiGroupXS(object): # Find and store Tallies in StatePoint for tally_type, tally in self.tallies.items(): sp_tally = statepoint.get_tally(tally.scores, tally.filters, - tally.nuclides, - estimator=tally.estimator) + tally.nuclides, + estimator=tally.estimator) + sp_tally = sp_tally.get_slice(scores=tally.scores, nuclides=tally.nuclides) self.tallies[tally_type] = sp_tally def build_hdf5_store(self, filename='mgxs', directory='mgxs', From 7fdfc1ede40f60868cc2982537f14932c95e9c4b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 12 Sep 2015 13:43:57 +0700 Subject: [PATCH 073/519] Add particle restart file format in documentation. --- docs/source/devguide/index.rst | 1 + docs/source/devguide/particle_restart.rst | 59 +++++++++++++++++++++++ docs/source/devguide/statepoint.rst | 10 ++-- 3 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 docs/source/devguide/particle_restart.rst diff --git a/docs/source/devguide/index.rst b/docs/source/devguide/index.rst index 03838363c9..13dfc351fe 100644 --- a/docs/source/devguide/index.rst +++ b/docs/source/devguide/index.rst @@ -17,5 +17,6 @@ as debugging. workflow xml-parsing statepoint + particle_restart voxel docbuild diff --git a/docs/source/devguide/particle_restart.rst b/docs/source/devguide/particle_restart.rst new file mode 100644 index 0000000000..ecee81103d --- /dev/null +++ b/docs/source/devguide/particle_restart.rst @@ -0,0 +1,59 @@ +.. _devguide_particle_restart: + +============================ +Particle Restart File Format +============================ + +The current revision of the particle restart file format is 1. + +**/filetype** (*int*) + + Flags what type of file this is. A value of -1 indicates a statepoint file, + a value of -2 indicates a particle restart file, and a value of -3 indicates + a source file. + +**/revision** (*int*) + + Revision of the binary state point file. Any time a change is made in the + format of the state-point file, this integer is incremented. + +**/current_batch** (*int*) + + The number of batches already simulated. + +**/gen_per_batch** (*int*) + + Number of generations per batch. + +**/current_gen** (*int*) + + The number of generations already simulated. + +**/n_particles** (*int8_t*) + + Number of particles used per generation. + +**/run_mode** (*int*) + + Run mode used. A value of 1 indicates a fixed-source run and a value of 2 + indicates an eigenvalue run. + +**/id** (*int8_t*) + + Unique identifier of the particle. + +**/weight** (*double*) + + Weight of the particle. + +**/energy** (*double*) + + Energy of the particle in MeV. + +**/xyz** (*double[3]*) + + Position of the particle. + +**/uvw** (*double[3]*) + + Direction of the particle. diff --git a/docs/source/devguide/statepoint.rst b/docs/source/devguide/statepoint.rst index 7b08620563..de86c22543 100644 --- a/docs/source/devguide/statepoint.rst +++ b/docs/source/devguide/statepoint.rst @@ -1,10 +1,10 @@ .. _devguide_statepoint: -====================================== -State Point Binary File Specifications -====================================== +======================= +State Point File Format +======================= -The current revision of the statepoint binary file is 13. +The current revision of the statepoint file format is 13. **/filetype** (*int*) @@ -64,7 +64,7 @@ if (run_mode == MODE_EIGENVALUE) Number of inactive batches. - **gen_per_batch** (*int*) + **/gen_per_batch** (*int*) Number of generations per batch. From db6e07917fe5b42afa264081f1c9a9679fad924a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 12 Sep 2015 21:02:13 -0400 Subject: [PATCH 074/519] Cleaned up tally arithmetic cross-product classes __init__, __hash__, __eq__ routines --- openmc/constants.py | 2 +- openmc/cross.py | 127 +++++++++++++++++++++++++++++++------- openmc/filter.py | 147 +++++++++++++++++++++++++++++--------------- openmc/tallies.py | 2 +- 4 files changed, 203 insertions(+), 75 deletions(-) diff --git a/openmc/constants.py b/openmc/constants.py index a6b535e6d1..80f56088b3 100644 --- a/openmc/constants.py +++ b/openmc/constants.py @@ -120,4 +120,4 @@ SCORE_TYPES.update({MT: '(n,p' + str(MT-600) + ')' for MT in range(600,649)}) SCORE_TYPES.update({MT: '(n,d' + str(MT-650) + ')' for MT in range(650,699)}) SCORE_TYPES.update({MT: '(n,t' + str(MT-700) + ')' for MT in range(700,749)}) SCORE_TYPES.update({MT: '(n,3He' + str(MT-750) + ')' for MT in range(750,649)}) -SCORE_TYPES.update({MT: '(n,a' + str(MT-800) + ')' for MT in range(800,849)}) +SCORE_TYPES.update({MT: '(n,a' + str(MT-800) + ')' for MT in range(800,849)}) \ No newline at end of file diff --git a/openmc/cross.py b/openmc/cross.py index cb1e4930b5..035ef43ab4 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -1,4 +1,15 @@ +import sys + from openmc import Filter, Nuclide +from openmc.constants import FILTER_TYPES +import openmc.checkvalue as cv + + +if sys.version_info[0] >= 3: + basestring = str + +# Acceptable tally arithmetic binary operations +TALLY_ARITHMETIC_OPS = ['+', '-', '*', '/', '^'] class CrossScore(object): @@ -40,6 +51,33 @@ class CrossScore(object): if binary_op is not None: self.binary_op = binary_op + def __hash__(self): + return hash(str(self)) + + def __eq__(self, other): + return str(other) == str(self) + + 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 + @property def left_score(self): return self._left_score @@ -54,19 +92,20 @@ class CrossScore(object): @left_score.setter def left_score(self, left_score): + cv.check_type('left_score', left_score, (basestring, CrossScore)) self._left_score = left_score @right_score.setter def right_score(self, right_score): + cv.check_type('right_score', right_score, (basestring, CrossScore)) self._right_score = right_score @binary_op.setter def binary_op(self, binary_op): + cv.check_type('binary_op', binary_op, (basestring, CrossScore)) + cv.check_value('binary_op', binary_op, TALLY_ARITHMETIC_OPS) self._binary_op = binary_op - def __eq__(self, other): - return str(other) == str(self) - def __repr__(self): string = '({0} {1} {2})'.format(self.left_score, self.binary_op, self.right_score) @@ -75,7 +114,7 @@ class CrossScore(object): class CrossNuclide(object): """A special-purpose nuclide used to encapsulate all combinations of two - tally's nuclides as a outer product for tally arithmetic. + tally's nuclides as an outer product for tally arithmetic. Parameters ---------- @@ -112,6 +151,33 @@ class CrossNuclide(object): if binary_op is not None: self.binary_op = binary_op + def __hash__(self): + return hash(str(self)) + + def __eq__(self, other): + return str(other) == str(self) + + 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 + @property def left_nuclide(self): return self._left_nuclide @@ -126,14 +192,18 @@ class CrossNuclide(object): @left_nuclide.setter def left_nuclide(self, left_nuclide): + cv.check_type('left_nuclide', left_nuclide, (Nuclide, CrossNuclide)) self._left_nuclide = left_nuclide @right_nuclide.setter def right_nuclide(self, right_nuclide): + cv.check_type('right_nuclide', right_nuclide, (Nuclide, CrossNuclide)) self._right_nuclide = right_nuclide @binary_op.setter def binary_op(self, binary_op): + cv.check_type('binary_op', binary_op, basestring) + cv.check_value('binary_op', binary_op, TALLY_ARITHMETIC_OPS) self._binary_op = binary_op def __eq__(self, other): @@ -164,7 +234,7 @@ class CrossNuclide(object): class CrossFilter(object): """A special-purpose filter used to encapsulate all combinations of two - tally's filter bins as a outer product for tally arithmetic. + tally's filter bins as an outer product for tally arithmetic. Parameters ---------- @@ -195,25 +265,34 @@ class CrossFilter(object): self._type = '({0} {1} {2})'.format(left_type, binary_op, right_type) self._bins = {} - self._bins['left'] = left_filter.bins - self._bins['right'] = right_filter.bins - self._num_bins = left_filter.num_bins * right_filter.num_bins self._stride = None self._left_filter = None self._right_filter = None self._binary_op = None + self._num_bins = 0 if left_filter is not None: self.left_filter = left_filter + self.bins['left'] = left_filter.bins if right_filter is not None: self.right_filter = right_filter + self.bins['right'] = right_filter.bins if binary_op is not None: self.binary_op = binary_op + if self.left_filter is not None and self.right_filter is not None: + self._num_bins = left_filter.num_bins * right_filter.num_bins + def __hash__(self): return hash((self.left_filter, self.right_filter)) + def __eq__(self, other): + return str(other) == str(self) + + def __ne__(self, other): + return not self == other + def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -222,6 +301,7 @@ class CrossFilter(object): 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._num_bins = self.num_bins @@ -262,34 +342,36 @@ class CrossFilter(object): @property def stride(self): return self._stride -# return self.left_filter.stride * self.right_filter.stride @type.setter def type(self, filter_type): + if filter_type not in FILTER_TYPES.values(): + msg = 'Unable to set Filter type to "{0}" since it is not one ' \ + 'of the supported types'.format(type) + raise ValueError(msg) + self._type = filter_type @left_filter.setter def left_filter(self, left_filter): + cv.check_type('left_filter', left_filter, (Filter, CrossFilter)) self._left_filter = left_filter @right_filter.setter def right_filter(self, right_filter): + cv.check_type('right_filter', right_filter, (Filter, CrossFilter)) self._right_filter = right_filter @binary_op.setter def binary_op(self, binary_op): + cv.check_type('binary_op', binary_op, basestring) + cv.check_value('binary_op', binary_op, TALLY_ARITHMETIC_OPS) self._binary_op = binary_op @stride.setter def stride(self, stride): self._stride = stride - def __eq__(self, other): - return str(other) == str(self) - - def __ne__(self, other): - return not self == other - def get_bin_index(self, filter_bin): """Returns the index in the CrossFilter for some bin. @@ -307,7 +389,7 @@ class CrossFilter(object): Returns ------- - filter_index : int + filter_index : Integral The index in the Tally data array for this filter bin. """ @@ -323,12 +405,12 @@ class CrossFilter(object): This method constructs a Pandas DataFrame object for the CrossFilter with columns annotated by filter bin information. This is a helper method for the Tally.get_pandas_dataframe(...) routine. This method - recursively builds and concatenates the Pandas DataFrames for left + recursively builds and concatenates Pandas DataFrames for the left and right filters and crossfilters. This capability has been tested for Pandas >=0.13.1. However, it is recommended to use v0.16 or newer versions of Pandas since this method - uses the Multi-index Pandas feature. + uses Pandas' Multi-index functionality. Parameters ---------- @@ -339,17 +421,17 @@ class CrossFilter(object): An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric information in the Summary object is embedded into a Multi-index - column with a geometric "path" to each distribcell intance. + column with a geometric "path" to each distribcell instance. NOTE: This option requires the OpenCG Python package. Returns ------- pandas.DataFrame A Pandas DataFrame with columns of strings that characterize the - crossfilter's bins. Each entry in the DataFrame will include the one + crossfilter's bins. Each entry in the DataFrame will include one or more binary operations used to construct the crossfilter's bins. The number of rows in the DataFrame is the same as the total number - of bins in the corresponding tally, with the filter bin + of bins in the corresponding tally, with the filter bins appropriately tiled to map to the corresponding tally bins. See also @@ -361,6 +443,7 @@ class CrossFilter(object): # If left and right filters are identical, do not combine bins if self.left_filter == self.right_filter: df = self.left_filter.get_pandas_dataframe(datasize, summary) + # If left and right filters are different, combine their bins else: left_df = self.left_filter.get_pandas_dataframe(datasize, summary) @@ -382,4 +465,4 @@ class CrossFilter(object): self.right_filter.bins) string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) - return string + return string \ No newline at end of file diff --git a/openmc/filter.py b/openmc/filter.py index 435d08c448..bcbe61eb82 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -1,6 +1,7 @@ from collections import Iterable import copy from numbers import Real, Integral +import sys import numpy as np @@ -10,9 +11,13 @@ from openmc.constants import * import openmc.checkvalue as cv +if sys.version_info[0] >= 3: + basestring = str + + 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. + """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. Parameters ---------- @@ -20,28 +25,42 @@ class Filter(object): The type of the tally filter. Acceptable values are "universe", "material", "cell", "cellborn", "surface", "mesh", "energy", "energyout", and "distribcell". - bins : int or Iterable of int or Iterable of float + bins : Integral or Iterable of Integral or Iterable of Real The bins for the filter. This takes on different meaning for different - filters. + filters. See the OpenMC online documentation for more details. Attributes ---------- type : str The type of the tally filter. - bins : int or Iterable of int or Iterable of float + bins : Integral or Iterable of Integral or Iterable of float The bins for the filter + mesh : Mesh or None + A Mesh object for 'mesh' type filters. + offset : Integral + A value used to index tally bins for 'distribcell' tallies. + stride : Integral + The number of filter, nuclide and score bins within each of this + filter's bins. """ # Initialize Filter class attributes def __init__(self, type=None, bins=None): - self.type = type + + self._type = None self._num_bins = 0 - self.bins = bins + self._bins = None + self._bins = None self._mesh = None self._offset = -1 self._stride = None + if type is not None: + self.type = type + if bins is not None: + self.bins = bins + def __eq__(self, other): if not isinstance(other, Filter): return False @@ -58,7 +77,7 @@ class Filter(object): return not self == other def __hash__(self): - return hash((self._type, tuple(self._bins))) + return hash((self.type, tuple(self.bins))) def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -107,9 +126,7 @@ class Filter(object): @type.setter def type(self, type): - if type is None: - self._type = type - elif type not in FILTER_TYPES.values(): + if type not in FILTER_TYPES.values(): msg = 'Unable to set Filter type to "{0}" since it is not one ' \ 'of the supported types'.format(type) raise ValueError(msg) @@ -118,10 +135,7 @@ class Filter(object): @bins.setter def bins(self, bins): - if bins is None: - self.num_bins = 0 - return - elif self._type is None: + if self.type is None: msg = 'Unable to set bins for Filter to "{0}" since ' \ 'the Filter type has not yet been set'.format(bins) raise ValueError(msg) @@ -140,7 +154,7 @@ class Filter(object): for edge in bins: cv.check_greater_than('filter bin', edge, 0, equality=True) - elif self._type in ['energy', 'energyout']: + elif self.type in ['energy', 'energyout']: for edge in bins: if not isinstance(edge, Real): msg = 'Unable to add bin edge "{0}" to a "{1}" Filter ' \ @@ -161,7 +175,7 @@ class Filter(object): raise ValueError(msg) # mesh filters - elif self._type == 'mesh': + elif self.type == 'mesh': if not len(bins) == 1: msg = 'Unable to add bins "{0}" to a mesh Filter since ' \ 'only a single mesh can be used per tally'.format(bins) @@ -178,7 +192,6 @@ class Filter(object): # If all error checks passed, add bin edges self._bins = np.array(bins) - # FIXME @num_bins.setter def num_bins(self, num_bins): cv.check_type('filter num_bins', num_bins, Integral) @@ -280,20 +293,24 @@ class Filter(object): Parameters ---------- - filter_bin : int or tuple + filter_bin : Integral or tuple The bin is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. The bin is an integer for the 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 a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of + energy boundaries of the bin of interest. The bin is an (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell interest. Returns ------- - filter_index : int + filter_index : Integral The index in the Tally data array for this filter bin. + See also + -------- + Filter.get_bin() + """ try: @@ -318,7 +335,7 @@ class Filter(object): val = np.where(self.bins == filter_bin[0])[0][0] filter_index = val - # Filter bins for distribcell are the "IDs" of each unique placement + # Filter bins for distribcells are "IDs" of each unique placement # of the Cell in the Geometry (integers starting at 0) elif self.type == 'distribcell': filter_index = filter_bin @@ -330,16 +347,42 @@ class Filter(object): except ValueError: msg = 'Unable to get the bin index for Filter since "{0}" ' \ - 'is not one of the bins'.format(filter_bin) + 'is not one of the bins'.format(filter_bin) raise ValueError(msg) return filter_index def get_bin(self, bin_index): - """ + """Returns the filter bin for some filter bin index. + + Parameters + ---------- + bin_index : Integral + The zero-based index into the filter's array of bins. The bin + index for 'material', 'surface', 'cell', 'cellborn', and 'universe' + filters corresponds to the ID in the filter's list of bins. For + 'distribcell' tallies the bin_index necessarily can only be zero + since only one cell can be tracked per tally. The bin index for + 'energy' and 'energyout' filters corresponds to the energy range of + interest in the filter bins of energies. The bin index for 'mesh' + filters is the index into the flattened array of (x,y) or (x,y,z) + mesh cell bins. + + Returns + ------- + bin : 1-, 2-, or 3-tuple of Real + The bin in the Tally data array. The bin for 'material', surface', + 'cell', 'cellborn', 'universe' and 'distribcell' filters is a + 1-tuple of the ID corresponding to the appropriate filter bin. + The bin for 'energy' and 'energyout' filters is a 2-tuple of the + lower and upper energies bounding the energy interval for the filter + bin. The bin for 'mesh' tallies is a 2-tuple or 3-tuple of the x,y + or x,y,z mesh cell indices corresponding to the bin in a 2D/3D mesh. + + See also + -------- + Filter.get_bin_index() - :param bin_index: - :return: """ cv.check_type('bin_index', bin_index, Integral) @@ -353,33 +396,32 @@ class Filter(object): x = bin_index / (ny * nz) y = (bin_index - (x * ny * nz)) / nz z = bin_index - (x * ny * nz) - (y * nz) - bin = (x, y, z) + filter_bin = (x, y, z) else: nx, ny = self.mesh.dimension x = bin_index / ny y = bin_index - (x * ny) - bin = (x, y) + filter_bin = (x, y) elif self.type in ['energy', 'energyout']: - bin = (self.bins[bin_index], self.bins[bin_index+1]) + filter_bin = (self.bins[bin_index], self.bins[bin_index+1]) elif self.type == 'distribcell': - bin = (self.bins[0],) + filter_bin = (self.bins[0],) else: - bin = (self.bins[bin_index],) + filter_bin = (self.bins[bin_index],) - return bin + return filter_bin def get_pandas_dataframe(self, data_size, summary=None): """Builds a Pandas DataFrame for the Filter's bins. - This method constructs a Pandas DataFrame object for the Filter with + This method constructs a Pandas DataFrame object for the filter with columns annotated by filter bin information. This is a helper method for the Tally.get_pandas_dataframe(...) routine. This capability has been tested for Pandas >=0.13.1. However, it is recommended to use v0.16 or newer versions of Pandas since this method - uses the Multi-index Pandas feature. - + uses Pandas' Multi-index functionality. Parameters ---------- @@ -390,7 +432,7 @@ class Filter(object): An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric information in the Summary object is embedded into a Multi-index - column with a geometric "path" to each distribcell intance. + column with a geometric "path" to each distribcell instance. NOTE: This option requires the OpenCG Python package. Returns @@ -405,23 +447,23 @@ class Filter(object): filters, the DataFrame includes a single column with the cell, surface, material or universe ID corresponding to each filter bin. - For 'mesh' filters, the DataFrame includes three columns for the - x,y,z mesh cell indices corresponding to each filter bin. + For 'distribcell' filters, the DataFrame either includes: + 1) a single column with the cell instance IDs (without summary info) + 2) separate columns for the cell IDs, universe IDs, and lattice IDs + and x,y,z cell indices corresponding to each (with summary info). For 'energy' and 'energyout' filters, the DataFrame include a single column with each element comprising a string with the lower, upper energy bounds for each filter bin. - For 'distribcell' filters, the DataFrame either includes: - 1) a single column with the cell instance IDs (without summary info) - 2) separate columns for the cell IDs, universe IDs, and lattice IDs - and x,y,z cell indices corresponding to each (with summary info) + For 'mesh' filters, the DataFrame includes three columns for the + x,y,z mesh cell indices corresponding to each filter bin. Raises ------ ImportError - When Pandas cannot is not installed, or summary info is requested - but OpenCG is not installed. + When Pandas is not installed, or summary info is requested but + OpenCG is not installed. See also -------- @@ -429,13 +471,14 @@ class Filter(object): """ - # Attempt to import the pandas package + # Attempt to import Pandas try: import pandas as pd except ImportError: msg = 'The pandas Python package must be installed on your system' raise ImportError(msg) + # Initialize Pandas DataFrame df = pd.DataFrame() # mesh filters @@ -614,12 +657,14 @@ class Filter(object): tile_factor = data_size / len(filter_bins) filter_bins = np.tile(filter_bins, tile_factor) filter_bins = filter_bins - if level_df is None: - df = pd.DataFrame({self.type :filter_bins}) - else: + df = pd.DataFrame({self.type : filter_bins}) + + # If OpenCG level info DataFrame was created, concatenate + # with DataFrame of distribcell instance IDs + if level_df is not None: level_df = level_df.dropna(axis=1, how='all') level_df = level_df.astype(np.int) - df = pd.concat([level_df, pd.DataFrame({self.type :filter_bins})], axis=1) + df = pd.concat([level_df, df], axis=1) # energy, energyout filters elif 'energy' in self.type: @@ -645,7 +690,7 @@ class Filter(object): tile_factor = data_size / len(filter_bins) filter_bins = np.tile(filter_bins, tile_factor) filter_bins = filter_bins - df = pd.concat([df, pd.DataFrame({self.type :filter_bins})]) + df = pd.concat([df, pd.DataFrame({self.type : filter_bins})]) return df diff --git a/openmc/tallies.py b/openmc/tallies.py index 28a89af91f..9b30568180 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -78,8 +78,8 @@ class Tally(object): mean : ndarray An array containing the sample mean for each bin std_dev : ndarray - An array containing the sample standard deviation for each bin + An array containing the sample standard deviation for each bin """ def __init__(self, tally_id=None, name=''): From d41f0a92e3adfcc10500221ed657f22abd40aeee Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 12 Sep 2015 21:05:10 -0400 Subject: [PATCH 075/519] Fixed bug in bins property decorator for CrossFilter --- openmc/cross.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 035ef43ab4..fa1ce6e630 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -274,10 +274,10 @@ class CrossFilter(object): if left_filter is not None: self.left_filter = left_filter - self.bins['left'] = left_filter.bins + self._bins['left'] = left_filter.bins if right_filter is not None: self.right_filter = right_filter - self.bins['right'] = right_filter.bins + self._bins['right'] = right_filter.bins if binary_op is not None: self.binary_op = binary_op @@ -333,7 +333,7 @@ class CrossFilter(object): @property def bins(self): - return (self._bins['left'], self._bins['right']) + return self._bins['left'], self._bins['right'] @property def num_bins(self): From a886a16b04b6374d519f26750493d6b0b59a147d Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 12 Sep 2015 21:36:19 -0400 Subject: [PATCH 076/519] Improved comments for Python API openmc.mgxs.EnergyGroups class --- openmc/constants.py | 2 +- openmc/mesh.py | 1 + openmc/mgxs/groups.py | 37 +++++++++++++++++++++++++++---------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/openmc/constants.py b/openmc/constants.py index 80f56088b3..a6b535e6d1 100644 --- a/openmc/constants.py +++ b/openmc/constants.py @@ -120,4 +120,4 @@ SCORE_TYPES.update({MT: '(n,p' + str(MT-600) + ')' for MT in range(600,649)}) SCORE_TYPES.update({MT: '(n,d' + str(MT-650) + ')' for MT in range(650,699)}) SCORE_TYPES.update({MT: '(n,t' + str(MT-700) + ')' for MT in range(700,749)}) SCORE_TYPES.update({MT: '(n,3He' + str(MT-750) + ')' for MT in range(750,649)}) -SCORE_TYPES.update({MT: '(n,a' + str(MT-800) + ')' for MT in range(800,849)}) \ No newline at end of file +SCORE_TYPES.update({MT: '(n,a' + str(MT-800) + ')' for MT in range(800,849)}) diff --git a/openmc/mesh.py b/openmc/mesh.py index ddf3529c2d..961b1519fe 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -8,6 +8,7 @@ import numpy as np import openmc.checkvalue as cv + if sys.version_info[0] >= 3: basestring = str diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index be1ffd1625..a989d27e9d 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -17,7 +17,7 @@ class EnergyGroups(object): Parameters ---------- - group_edges : NumPy array + group_edges : ndarray The energy group boundaries [MeV] num_groups : Integral The number of energy groups @@ -31,17 +31,23 @@ class EnergyGroups(object): """ - def __init__(self): + def __init__(self, group_edges=None, num_groups=None): self._group_edges = None self._num_groups = None + if group_edges is not None: + self.group_edges = group_edges + if num_groups is not None: + self.num_groups = num_groups + def __deepcopy__(self, memo): existing = memo.get(id(self)) # If this is the first time we have tried to copy object, create copy if existing is None: clone = type(self).__new__(type(self)) - clone.group_edges = copy.deepcopy(self.group_edges, memo) + clone._group_edges = copy.deepcopy(self.group_edges, memo) + clone._num_groups = self.num_groups memo[id(self)] = clone @@ -71,6 +77,14 @@ class EnergyGroups(object): return False elif self.group_edges != other.group_edges: return False + else: + return True + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self.group_edges)) def generate_bin_edges(self, start, stop, num_groups, spacing='linear'): """Generate equally or logarithmically-spaced energy group boundaries. @@ -126,7 +140,7 @@ class EnergyGroups(object): """ if self.group_edges is None: - msg = 'Unable to get energy group for energy "{0}" eV since ' \ + msg = 'Unable to get energy group for energy "{0}" MeV since ' \ 'the group edges have not yet been set'.format(energy) raise ValueError(msg) @@ -174,7 +188,7 @@ class EnergyGroups(object): Returns ------- - NumPy.ndarray + ndarray The NumPy array indices for each energy group of interest Raises @@ -193,11 +207,11 @@ class EnergyGroups(object): if groups == 'all': indices = np.arange(self.num_groups) else: - indices = np.zeros(len(groups), dtype=np.int64) + indices = np.zeros(len(groups), dtype=np.int) for i, group in enumerate(groups): cv.check_greater_than('group', group, 0) - cv.check_less_than('group', group, self.num_groups, True) + cv.check_less_than('group', group, self.num_groups, equality=True) indices[i] = group - 1 return indices @@ -211,11 +225,13 @@ class EnergyGroups(object): Parameters ---------- - coarse_groups : list + coarse_groups : Iterable of 2-tuple The energy groups of interest - a list of 2-tuples, each directly corresponding to one of the new coarse groups. The values in the 2-tuples are upper/lower energy groups used to construct a new - coarse group. + coarse group. For example, if [(1,2), (2,4)] was used as the coarse + groups, fine groups 1 and 2 would be merged into coarse group 1 + while fine groups 3 and 4 would be merged into coarse group 2. Returns ------- @@ -230,7 +246,7 @@ class EnergyGroups(object): cv.check_type('group edges', coarse_groups, Iterable) for group in coarse_groups: - cv.check_value('group edges', group, Iterable) + cv.check_type('group edges', group, Iterable) cv.check_length('group edges', group, 2) cv.check_greater_than('lower group', group[0], 1, True) cv.check_less_than('lower group', group[0], self.num_groups, True) @@ -257,4 +273,5 @@ class EnergyGroups(object): # Create a new condensed EnergyGroups object condensed_groups = EnergyGroups() condensed_groups.group_edges = group_edges + return condensed_groups \ No newline at end of file From 665b8226e86d88a7b6e485b596f144ece0bfbe7b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 12 Sep 2015 22:16:41 -0400 Subject: [PATCH 077/519] Improvements to docstrings for openmc.mgxs.MultiGroupXS --- openmc/mgxs/mgxs.py | 399 ++++++++++++++++++++++---------------------- 1 file changed, 203 insertions(+), 196 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d775232614..e0ffb64313 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -17,31 +17,18 @@ if sys.version_info[0] >= 3: basestring = str -# Supported cross-section types -XS_TYPES = ('total', - 'transport', - 'absorption', - 'capture', - 'scatter', - 'nu-scatter', - 'scatter matrix', - 'nu-scatter matrix', - 'fission', - 'nu-fission', - 'chi') - # Supported domain types -DOMAIN_TYPES = ('cell', +DOMAIN_TYPES = ['cell', 'distribcell', 'universe', 'material', - 'mesh') + 'mesh'] # Supported domain objects -DOMAINS = (openmc.Cell, +DOMAINS = [openmc.Cell, openmc.Universe, openmc.Material, - openmc.Mesh) + openmc.Mesh] # LaTeX Greek symbols for each cross-section type GREEK = dict() @@ -59,7 +46,7 @@ GREEK['chi'] = '$\\chi$' class MultiGroupXS(object): - """A multi-group cross-section for some energy groups structure within + """A multi-group cross-section for some energy group structure within some spatial domain. This class can be used for both OpenMC input generation and tally data @@ -68,15 +55,15 @@ class MultiGroupXS(object): Parameters ---------- - name : str, optional - Name of the multi-group cross-section. If not specified, the name is - the empty string. domain : Material or Cell or Universe or Mesh The domain for spatial homogenization domain_type : {'material', 'cell', 'distribcell', 'universe' or 'mesh'} The domain type for spatial homogenization energy_groups : EnergyGroups The energy group structure for energy condensation + name : str, optional + Name of the multi-group cross-section. Used as a label to identify + tallies in OpenMC tallies.xml file. Attributes ---------- @@ -93,16 +80,16 @@ class MultiGroupXS(object): num_groups : Integral Number of energy groups tallies : dict - Tallies needed to compute the multi-group cross-section - xs : Tally + OpenMC tallies needed to compute the multi-group cross-section + xs_tally : Tally Derived tally for the multi-group cross-section. This attribute is None unless the multi-group cross-section has been computed. - subdomain_offsets : dict - Integral subdomain IDs (keys) mapped to integral tally data array - offsets (values). When the domain_type is 'distribcell', each subdomain - ID corresponds to an instance of the cell domain. For all other domain - types, there is only one subdomain for the domain and this dictionary - will trivially map zero to zero. + subdomain_indices : dict + Integer subdomain IDs (keys) mapped to integer tally data array + indices (values) for 'distribcell' domain types. Each subdomain ID + corresponds to an instance of the cell domain. For all other domain + types, the domain has only one subdomain and this dictionary will + trivially map zero to zero. offset : Integral The filter offset for the domain filter @@ -124,7 +111,7 @@ class MultiGroupXS(object): self._xs_tally = None # A dictionary used to compute indices into the xs array - # Keys - Domain ID (ie, Material ID, Region ID for districell, etc) + # Keys - Domain ID (ie, maaterial ID, distribcell instance ID, etc) # Values - Offset/stride into xs array # NOTE: This is primarily used for distribcell domain types self._subdomain_indices = dict() @@ -150,7 +137,7 @@ class MultiGroupXS(object): clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._num_groups = self.num_groups - clone._xs_tally = copy.deepcopy(self._xs_tally, memo) + clone._xs_tally = copy.deepcopy(self.xs_tally, memo) clone._subdomain_indices = \ copy.deepcopy(self.subdomain_indices, memo) clone._offset = copy.deepcopy(self.offset, memo) @@ -210,14 +197,14 @@ class MultiGroupXS(object): @domain.setter def domain(self, domain): - cv.check_type('domain', domain, DOMAINS) + cv.check_type('domain', domain, tuple(DOMAINS)) self._domain = domain if self._domain_type in ['material', 'cell', 'universe', 'mesh']: self._subdomain_indices[domain.id] = 0 @domain_type.setter def domain_type(self, domain_type): - cv.check_value('domain type', domain_type, DOMAIN_TYPES) + cv.check_value('domain type', domain_type, tuple(DOMAIN_TYPES)) self._domain_type = domain_type @energy_groups.setter @@ -228,16 +215,17 @@ class MultiGroupXS(object): def _find_domain_offset(self): """Finds and stores the offset of the domain tally filter""" + tally = self.tallies.values()[0] - filter = tally.find_filter(self.domain_type, [self.domain.id]) - self._offset = filter.offset + domain_filter = tally.find_filter(self.domain_type, [self.domain.id]) + self._offset = domain_filter.offset def set_subdomain_index(self, subdomain_id, index): """Set the filter bin index for a subdomain of the domain. - This is primarily useful when the domain type is 'distribcell', in - which case one may wish to map each subdomain (a cell instance) to its - filter bin in the derived multi-group cross-section tally data array. + This is useful when the domain type is 'distribcell', in which case one + may wish to map each subdomain (a cell instance) to its filter bin in + the derived multi-group cross-section tally data array. Parameters ---------- @@ -246,17 +234,120 @@ class MultiGroupXS(object): index : Integral The filter bin index for the subdomain + See also + -------- + MultiGroupXS.get_subdomains(), MultiGroupXS.get_subdomain_indices() + """ cv.check_type('subdomain id', subdomain_id, Integral) - cv.check_type('subdomain offset', index, Integral) - cv.check_greater_than('subdomain id', subdomain_id, 0, True) - cv.check_greater_than('subdomain offset', subdomain_id, 0, True) + cv.check_type('subdomain index', index, Integral) + cv.check_greater_than('subdomain id', subdomain_id, 0, equality=True) + cv.check_greater_than('subdomain index', index, 0, equality=True) self._subdomain_indices[subdomain_id] = index + def get_subdomain_indices(self, subdomains='all'): + """Get the indices for one or more subdomains. + + This method can be used to extract the indices into the multi-group + cross-section tally data array for a subdomain. This is useful when the + domain type is 'distribcell', in which case one may wish to map each + subdomain (a cell instance) to its filter bin index in the derived + multi-group cross-section tally data array. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + Subdomain IDs (distribcell instance IDs) of interest + + Returns + ---------- + indices : ndarray + The subdomain indices indexed in the order of the subdomains + + Raises + ------ + ValueError + When one of the subdomains is not a valid subdomain ID. + + See also + -------- + MultiGroupXS.get_subdomains(), MultiGroupXS.set_subdomain_index() + + """ + + if subdomains != 'all': + cv.check_type('subdomains', subdomains, Iterable, Integral) + + if subdomains == 'all': + num_subdomains = len(self.subdomain_indices) + indices = np.arange(num_subdomains) + else: + indices = np.zeros(len(subdomains), dtype=np.int64) + + for i, subdomain in enumerate(subdomains): + if subdomain in self.subdomain_indices: + indices[i] = self.subdomain_indices[subdomain] + else: + msg = 'Unable to get index for subdomain "{0}" since it ' \ + 'is not a valid subdomain'.format(subdomain) + raise ValueError(msg) + + return indices + + def get_subdomains(self, indices='all'): + """Get the subdomain IDs for one or more indices. + + This method can be used to extract the subdomains for the multi-group + cross-section from their indices in the tally data array. This is useful + when the domain type is 'distribcell', in which case one may wish to map + each subdomain (a cell instance) to its filter bin index in the derived + multi-group cross-section tally data array. + + Parameters + ---------- + indices : Iterable of Integral or 'all' + Subdomain indices of interest + + Returns + ---------- + subdomains : ndarray + Array of subdomain IDs indexed in the order of the indices + + Raises + ------ + ValueError + When one of the indices is not a valid subdomain index. + + See also + -------- + MultiGroupXS.get_subdomain_indices(), MultiGroupXS.set_subdomain_index() + + """ + + if indices != 'all': + cv.check_type('offsets', indices, Iterable, Integral) + + if indices == 'all': + indices = self.get_subdomain_indices() + + subdomains = np.zeros(len(indices), dtype=np.int64) + keys = self.subdomain_indices.keys() + values = self.subdomain_indices.values() + + for i, index in enumerate(indices): + if index in values: + subdomains[i] = keys[values.index(index)] + else: + msg = 'Unable to get subdomain for index "{0}" since it ' \ + 'is not a valid index'.format(index) + raise ValueError(msg) + + return subdomains + @abc.abstractmethod def create_tallies(self, scores, all_filters, keys, estimator): - """Instantiates tallies needed to compute the multi-group cross-section + """Instantiates tallies needed to compute the multi-group cross-section. This is a helper method for MultiGroupXS subclasses to create tallies for input file generation. The tallies are stored in the tallies dict. @@ -293,94 +384,37 @@ class MultiGroupXS(object): for filter in filters: self.tallies[key].add_filter(filter) - def get_subdomain_indices(self, subdomains='all'): - """Get the indices for one or more subdomains. + def load_from_statepoint(self, statepoint): + """Extracts tallies in an OpenMC StatePoint with the data needed to + compute multi-group cross-sections. - This method can be used to extract the indices into the multi-group - cross-section tally data array for a subdomain (i.e., cell instance). - - See also : get_subdomains + This method is needed to compute cross-section data from tallies + in an OpenMC StatePoint object. Parameters ---------- - subdomains : Iterable of Integral or 'all' - Subdomain IDs of interest - - Returns - ---------- - indices : ndarray - The subdomain indices indexed in the order of the subdomains - - Raises - ------ - ValueError - When one of the subdomains is not a valid subdomain ID. + statepoint : openmc.StatePoint + An OpenMC StatePoint object with tally data """ - if subdomains != 'all': - cv.check_type('subdomains', subdomains, Iterable, Integral) + cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) - if subdomains == 'all': - num_subdomains = len(self.subdomain_indices) - indices = np.arange(num_subdomains) - else: - indices = np.zeros(len(subdomains), dtype=np.int64) + # Ensure that tally metadata has been loaded from the statepoint file + statepoint.read_results() - for i, subdomain in enumerate(subdomains): - if subdomain in self.subdomain_indices: - indices[i] = self.subdomain_indices[subdomain] - else: - msg = 'Unable to get index for subdomain "{0}" since it ' \ - 'is not a valid subdomain'.format(subdomain) - raise ValueError(msg) + # Create Tallies to search for in StatePoint + if self.tallies is None: + self.create_tallies() - return indices - - def get_subdomains(self, indices='all'): - """Get the subdomain IDs for one or more indices. - - This method can be used to extract the subdomains for the multi-group - cross-section from their indices in the tally data array. - - See also : get_subdomain_indices - - Parameters - ---------- - indices : Iterable of Integral or 'all' - Subdomain indices of interest - - Returns - ---------- - subdomains : ndarray - Array of subdomain IDs indexed in the order of the indices - - Raises - ------ - ValueError - When one of the indices is not a valid subdomain index. - - """ - - if indices != 'all': - cv.check_type('offsets', indices, Iterable, Integral) - - if indices == 'all': - indices = self.get_subdomain_indices() - - subdomains = np.zeros(len(indices), dtype=np.int64) - keys = self.subdomain_indices.keys() - values = self.subdomain_indices.values() - - for i, index in enumerate(indices): - if index in values: - subdomains[i] = keys[values.index(index)] - else: - msg = 'Unable to get subdomain for index "{0}" since it ' \ - 'is not a valid index'.format(index) - raise ValueError(msg) - - return subdomains + # Find, slice and store Tallies from StatePoint + # The tally slicing is needed if tally merging was used + for tally_type, tally in self.tallies.items(): + sp_tally = statepoint.get_tally(tally.scores, tally.filters, + tally.nuclides, + estimator=tally.estimator) + sp_tally = sp_tally.get_slice(scores=tally.scores, nuclides=tally.nuclides) + self.tallies[tally_type] = sp_tally def get_xs(self, groups='all', subdomains='all', value='mean'): """Returns an array of multi-group cross-sections. @@ -412,7 +446,7 @@ class MultiGroupXS(object): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) @@ -433,15 +467,23 @@ class MultiGroupXS(object): filter_bins.append(self.energy_groups.get_group_bounds(group)) # Query the multi-group cross-section tally for the data - xs = self._xs_tally.get_values(filters=filters, + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) return xs def get_condensed_xs(self, coarse_groups): - """ + """Construct an energy-condensed version of this cross-section. + + Parameters + ---------- + coarse_groups : openmc.mgxs.EnergyGroups + The coarse energy group structure of interest + + Returns + ------- + MultiGroupXS + A new MultiGroupXS condensed to the group structure of interest - :param coarse_groups: - :return: """ raise NotImplementedError('Energy condensation is not yet implemented') @@ -449,6 +491,8 @@ class MultiGroupXS(object): def get_subdomain_avg_xs(self, subdomains='all'): """Construct a subdomain-averaged version of this cross-section. + This is primarily useful for averaging across distribcell instances. + Parameters ---------- subdomains : Iterable of Integral or 'all' @@ -467,7 +511,7 @@ class MultiGroupXS(object): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) @@ -497,6 +541,7 @@ class MultiGroupXS(object): # Compute the condensed single group cross-section avg_xs.compute_xs() + return avg_xs def print_xs(self, subdomains='all'): @@ -515,7 +560,7 @@ class MultiGroupXS(object): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to print cross-section since it has not been computed' raise ValueError(msg) @@ -527,7 +572,7 @@ class MultiGroupXS(object): string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - if self._xs_tally is not None: + if self.xs_tally is not None: if subdomains == 'all': subdomains = self.get_subdomain_indices() @@ -581,7 +626,7 @@ class MultiGroupXS(object): xs_results['domain'] = self.domain xs_results['energy_groups'] = self.energy_groups xs_results['tallies'] = self.tallies - xs_results['xs_tally'] = self._xs_tally + xs_results['xs_tally'] = self.xs_tally xs_results['offset'] = self.offset xs_results['subdomain_indices'] = self.subdomain_indices @@ -632,36 +677,6 @@ class MultiGroupXS(object): self._offset = xs_results['offset'] self._subdomain_indices = xs_results['subdomain_indices'] - def load_from_statepoint(self, statepoint): - """Find tallies in an OpenMC StatePoint with the data needed to compute - multi-group cross-sections. - - This method is needed to compute cross-section data from tallies - in an OpenMC StatePoint object. - - Parameters - ---------- - statepoint : openmc.StatePoint - An OpenMC StatePoint object with tally data - - """ - - cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) - - statepoint.read_results() - - # Create Tallies to search for in StatePoint - if self.tallies is None: - self.create_tallies() - - # Find and store Tallies in StatePoint - for tally_type, tally in self.tallies.items(): - sp_tally = statepoint.get_tally(tally.scores, tally.filters, - tally.nuclides, - estimator=tally.estimator) - sp_tally = sp_tally.get_slice(scores=tally.scores, nuclides=tally.nuclides) - self.tallies[tally_type] = sp_tally - def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True, key=None): """ @@ -701,7 +716,7 @@ class MultiGroupXS(object): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to export cross-section since it has not been computed' raise ValueError(msg) @@ -749,23 +764,15 @@ class MultiGroupXS(object): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to get Pandas DataFrame since the ' \ 'cross-section has not been computed' raise ValueError(msg) # TODO: Reset column labels as cross-sections if needed - df = self._xs_tally.get_pandas_dataframe() + df = self.xs_tally.get_pandas_dataframe() return df - def from_statepoint(self, sp): - """ - - :return: - """ - - # Get the tallies from a statepoint file - class TotalXS(MultiGroupXS): @@ -794,8 +801,8 @@ class TotalXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['total'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class TransportXS(MultiGroupXS): @@ -832,8 +839,8 @@ class TransportXS(MultiGroupXS): self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] self._xs_tally /= self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class AbsorptionXS(MultiGroupXS): @@ -863,8 +870,8 @@ class AbsorptionXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['absorption'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class CaptureXS(MultiGroupXS): @@ -895,8 +902,8 @@ class CaptureXS(MultiGroupXS): self._xs_tally = self.tallies['absorption'] - self.tallies['fission'] self._xs_tally /= self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class FissionXS(MultiGroupXS): @@ -926,8 +933,8 @@ class FissionXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['fission'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class NuFissionXS(MultiGroupXS): @@ -957,8 +964,8 @@ class NuFissionXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class ScatterXS(MultiGroupXS): @@ -988,8 +995,8 @@ class ScatterXS(MultiGroupXS): OpenMC tally arithmetic""" self._xs_tally = self.tallies['scatter'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class NuScatterXS(MultiGroupXS): @@ -1019,8 +1026,8 @@ class NuScatterXS(MultiGroupXS): tally arithmetic""" self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class ScatterMatrixXS(MultiGroupXS): @@ -1067,8 +1074,8 @@ class ScatterMatrixXS(MultiGroupXS): rxn_tally = self.tallies['scatter'] self._xs_tally = rxn_tally / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) def get_xs(self, in_groups='all', out_groups='all', subdomains='all', value='mean'): @@ -1103,7 +1110,7 @@ class ScatterMatrixXS(MultiGroupXS): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) @@ -1131,7 +1138,7 @@ class ScatterMatrixXS(MultiGroupXS): filter_bins.append(self.energy_groups.get_group_bounds(out_group)) # Query the multi-group cross-section tally for the data - xs = self._xs_tally.get_values(filters=filters, + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) return xs @@ -1151,7 +1158,7 @@ class ScatterMatrixXS(MultiGroupXS): """ - if self._xs_tally is None: + if self.xs_tally is None: msg = 'Unable to print cross-section since it has not been computed' raise ValueError(msg) @@ -1239,8 +1246,8 @@ class NuScatterMatrixXS(ScatterMatrixXS): rxn_tally = self.tallies['nu-scatter'] self._xs_tally = rxn_tally / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) class Chi(MultiGroupXS): @@ -1292,7 +1299,7 @@ class Chi(MultiGroupXS): self._xs_tally = nu_fission_out / sum_nu_fission_in # Normalize chi to 1.0 - norm = self._xs_tally.summation(filters=['energyout'], + norm = self.xs_tally.summation(filters=['energyout'], filter_bins=energy_bins) # FIXME: CrossFilter for energy + energy messes up tally arithmetic @@ -1304,7 +1311,7 @@ class Chi(MultiGroupXS): norm = norm.tile_filter(energy_filter) self._xs_tally /= norm - self._xs_tally._mean = np.nan_to_num(self._xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self._xs_tally.std_dev) + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) # FIXME: Does this need to reset NaNs to zero? \ No newline at end of file From ecda3bef5efadcae1634e807e5369b5336955a6d Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 00:31:50 -0400 Subject: [PATCH 078/519] Subdomain-averaged multi-group cross-section calculation now working --- openmc/mgxs/mgxs.py | 49 ++++++++++++++++++++++--------------- openmc/tallies.py | 59 ++++++++++++++++++++++++--------------------- 2 files changed, 62 insertions(+), 46 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e0ffb64313..8a8414624b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -217,7 +217,7 @@ class MultiGroupXS(object): """Finds and stores the offset of the domain tally filter""" tally = self.tallies.values()[0] - domain_filter = tally.find_filter(self.domain_type, [self.domain.id]) + domain_filter = tally.find_filter(self.domain_type) self._offset = domain_filter.offset def set_subdomain_index(self, subdomain_id, index): @@ -280,7 +280,9 @@ class MultiGroupXS(object): cv.check_type('subdomains', subdomains, Iterable, Integral) if subdomains == 'all': - num_subdomains = len(self.subdomain_indices) + tally = self.tallies.values()[0] + domain_filter = tally.find_filter(self.domain_type) + num_subdomains = domain_filter.num_bins indices = np.arange(num_subdomains) else: indices = np.zeros(len(subdomains), dtype=np.int64) @@ -329,19 +331,22 @@ class MultiGroupXS(object): cv.check_type('offsets', indices, Iterable, Integral) if indices == 'all': - indices = self.get_subdomain_indices() + tally = self.tallies.values()[0] + domain_filter = tally.find_filter(self.domain_type) + num_subdomains = domain_filter.num_bins + subdomains = np.arange(num_subdomains) + else: + subdomains = np.zeros(len(indices), dtype=np.int64) + keys = self.subdomain_indices.keys() + values = self.subdomain_indices.values() - subdomains = np.zeros(len(indices), dtype=np.int64) - keys = self.subdomain_indices.keys() - values = self.subdomain_indices.values() - - for i, index in enumerate(indices): - if index in values: - subdomains[i] = keys[values.index(index)] - else: - msg = 'Unable to get subdomain for index "{0}" since it ' \ - 'is not a valid index'.format(index) - raise ValueError(msg) + for i, index in enumerate(indices): + if index in values: + subdomains[i] = keys[values.index(index)] + else: + msg = 'Unable to get subdomain for index "{0}" since it ' \ + 'is not a valid index'.format(index) + raise ValueError(msg) return subdomains @@ -520,11 +525,11 @@ class MultiGroupXS(object): if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) subdomain_indices = self.get_subdomain_indices(subdomains) - subdomain_indices = [(index,) for index in subdomain_indices] +# subdomain_indices = [(index,) for index in subdomain_indices] # Clone this MultiGroupXS to initialize the condensed version avg_xs = copy.deepcopy(self) - avg_xs.domain_type = 'avg. ' + avg_xs.domain_type + avg_xs._domain_type = 'avg. ' + avg_xs.domain_type # Reset subdomain indices and offsets for distribcell domains if self.domain_type == 'distribcell': @@ -534,7 +539,7 @@ class MultiGroupXS(object): # Overwrite tallies with new subdomain-averaged versions avg_xs._tallies = {} for tally_type, tally in self.tallies.items(): - tally_sum = tally.summation(filters=[self.domain_type], + tally_sum = tally.summation(filter=self.domain_type, filter_bins=subdomain_indices) tally_sum /= len(subdomains) avg_xs.tallies[tally_type] = tally_sum @@ -1281,13 +1286,19 @@ class Chi(MultiGroupXS): # FIXME: Make filter bins simpler in Tally.summation(...) # Construct energy group filter bins to sum across + ''' filter_bins = [] for group in range(1, self.num_groups+1): group_bounds = self.energy_groups.get_group_bounds(group) filter_bins.append((group_bounds,)) energy_bins = [filter_bins] + ''' - sum_nu_fission_in = nu_fission_in.summation(filters=['energy'], + energy_bins = [] + for group in range(1, self.num_groups+1): + energy_bins.append(self.energy_groups.get_group_bounds(group)) + + sum_nu_fission_in = nu_fission_in.summation(filter='energy', filter_bins=energy_bins) # FIXME: Need ability to override energy groups with group numbers @@ -1299,7 +1310,7 @@ class Chi(MultiGroupXS): self._xs_tally = nu_fission_out / sum_nu_fission_in # Normalize chi to 1.0 - norm = self.xs_tally.summation(filters=['energyout'], + norm = self.xs_tally.summation(filter='energyout', filter_bins=energy_bins) # FIXME: CrossFilter for energy + energy messes up tally arithmetic diff --git a/openmc/tallies.py b/openmc/tallies.py index 9b30568180..221dc28547 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -9,7 +9,7 @@ import sys import numpy as np -from openmc import Mesh, Filter, Trigger, Nuclide +from openmc import Mesh, Filter, Trigger, Nuclide, FILTER_TYPES from openmc.cross import CrossScore, CrossNuclide, CrossFilter from openmc.summary import Summary import openmc.checkvalue as cv @@ -78,8 +78,8 @@ class Tally(object): mean : ndarray An array containing the sample mean for each bin std_dev : ndarray - An array containing the sample standard deviation for each bin + """ def __init__(self, tally_id=None, name=''): @@ -713,7 +713,7 @@ class Tally(object): filter_type : str The type of Filter (e.g., 'cell', 'energy', etc.) - filter_bin : int, list + filter_bin : int, tuple The bin is an integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. The bin is an integer for the cell instance ID for 'distribcell' Filters. The bin is a 2-tuple of @@ -2277,6 +2277,8 @@ class Tally(object): if filter_type in ['energy', 'energyout']: bin_indices.append(bin_index) bin_indices.append(bin_index+1) + elif filter_type == 'distribcell': + bin_indices.append(0) else: bin_indices.append(bin_index) @@ -2292,13 +2294,13 @@ class Tally(object): return new_tally - def summation(self, scores=[], filters=[], filter_bins=[], nuclides=[]): - """Build a sliced tally for the specified filters, scores and nuclides. + def summation(self, scores=[], filter=None, filter_bins=[], nuclides=[]): + """Build a sliced tally for the specified filter bins, nuclides, scores. This method constructs a new tally to encapsulate a subset of the data represented by this tally. The subset of data to include in the tally - slice is determined by the scores, filters and nuclides specified in - the input parameters. + slice is determined by the scores, filter bins and nuclides specified + in the input parameters. Parameters ---------- @@ -2306,21 +2308,19 @@ class Tally(object): A list of one or more score strings to sum across (e.g., ['absorption', 'nu-fission']; default is []) - filters : list - A list of filter type strings to sum across - (e.g., ['mesh', 'energy']; default is []) + filter : str + A filter type string (e.g., 'cell', 'energy') corresponding to the + filter bins to sum across - filter_bins : list of Iterables - A list of the filter bins corresponding to the filter_types - parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin - in the list is the integer ID for 'material', 'surface', 'cell', - 'cellborn', and 'universe' Filters. Each bin is an integer for the - cell instance ID for 'distribcell Filters. Each 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 a (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. The order of the bins in the list must correspond to the - filter_types parameter. + filter_bins : Iterable of Integral or tuple + A list of the filter bins corresponding to the filters parameter + Each bin in the list is the integer ID for 'material', 'surface', + 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer + for the cell instance ID for 'distribcell Filters. Each bin is a + 2-tuple of floats for 'energy' and 'energyout' filters corresponding + to the energy boundaries of the bin of interest. Each bin is an + (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. nuclides : list A list of nuclide name strings to sum across @@ -2347,15 +2347,20 @@ class Tally(object): else: nuclides = [[nuclide] for nuclide in nuclides] - # If user did not specify any filter bins, do not sum across filter bins - if len(filters) == 0: + # Sum across any filter bins specified by the user + if filter in FILTER_TYPES.values(): + filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] + filters = [[filter]] + # If user did not specify a filter type, do not sum across filter bins + else: filter_bins = [[]] filters = [[]] - # Sum across any filter bins specified by the user + ''' else: - filter_bins = list(itertools.product(*filter_bins)) - filter_bins = [list(filter_bin) for filter_bin in filter_bins] - filters = [filters] +# filter_bins = list(itertools.product(*filter_bins)) + filter_bins = [[filter_bin] for filter_bin in filter_bins] + filters = [[filter]] + ''' # Initialize Tally sum tally_sum = 0 From 1d774235aa3c610a65b07023b389056d1e6471d2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 13 Sep 2015 11:29:18 +0700 Subject: [PATCH 079/519] Add documentation on track file format. --- docs/source/devguide/index.rst | 1 + docs/source/devguide/particle_restart.rst | 8 +++--- docs/source/devguide/statepoint.rst | 8 +++--- docs/source/devguide/track.rst | 32 +++++++++++++++++++++++ src/constants.F90 | 4 ++- src/track_output.F90 | 2 ++ 6 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 docs/source/devguide/track.rst diff --git a/docs/source/devguide/index.rst b/docs/source/devguide/index.rst index 13dfc351fe..3f87ecfad2 100644 --- a/docs/source/devguide/index.rst +++ b/docs/source/devguide/index.rst @@ -18,5 +18,6 @@ as debugging. xml-parsing statepoint particle_restart + track voxel docbuild diff --git a/docs/source/devguide/particle_restart.rst b/docs/source/devguide/particle_restart.rst index ecee81103d..bf69655589 100644 --- a/docs/source/devguide/particle_restart.rst +++ b/docs/source/devguide/particle_restart.rst @@ -9,13 +9,13 @@ The current revision of the particle restart file format is 1. **/filetype** (*int*) Flags what type of file this is. A value of -1 indicates a statepoint file, - a value of -2 indicates a particle restart file, and a value of -3 indicates - a source file. + a value of -2 indicates a particle restart file, a value of -3 indicates a + source file, and a value of -4 indicates a track file. **/revision** (*int*) - Revision of the binary state point file. Any time a change is made in the - format of the state-point file, this integer is incremented. + Revision of the particle restart file format. Any time a change is made in + the format, this integer is incremented. **/current_batch** (*int*) diff --git a/docs/source/devguide/statepoint.rst b/docs/source/devguide/statepoint.rst index de86c22543..82686ff670 100644 --- a/docs/source/devguide/statepoint.rst +++ b/docs/source/devguide/statepoint.rst @@ -9,13 +9,13 @@ The current revision of the statepoint file format is 13. **/filetype** (*int*) Flags what type of file this is. A value of -1 indicates a statepoint file, - a value of -2 indicates a particle restart file, and a value of -3 indicates - a source file. + a value of -2 indicates a particle restart file, a value of -3 indicates a + source file, and a value of -4 indicates a track file. **/revision** (*int*) - Revision of the binary state point file. Any time a change is made in the - format of the state-point file, this integer is incremented. + Revision of the state point file format. Any time a change is made in the + format, this integer is incremented. **/version_major** (*int*) diff --git a/docs/source/devguide/track.rst b/docs/source/devguide/track.rst new file mode 100644 index 0000000000..afa27adfd0 --- /dev/null +++ b/docs/source/devguide/track.rst @@ -0,0 +1,32 @@ +.. _devguide_track: + +================= +Track File Format +================= + +The current revision of the particle track file format is 1. + +**/filetype** (*int*) + + Flags what type of file this is. A value of -1 indicates a statepoint file, + a value of -2 indicates a particle restart file, a value of -3 indicates a + source file, and a value of -4 indicates a track file. + +**/revision** (*int*) + + Revision of the track file format. Any time a change is made in the format, + this integer is incremented. + +**/n_particles** (*int*) + + Number of particles for which tracks are recorded. + +**/n_coords** (*int[]*) + + Number of coordinates for each particle. + +*do i = 1, n_particles* + + **/coordinates_i** (*double[][3]*) + + (x,y,z) coordinates for the *i*-th particle. diff --git a/src/constants.F90 b/src/constants.F90 index 38bedf0224..9a89542afa 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -13,12 +13,14 @@ module constants ! Revision numbers for binary files integer, parameter :: REVISION_STATEPOINT = 13 integer, parameter :: REVISION_PARTICLE_RESTART = 1 + integer, parameter :: REVISION_TRACK = 1 ! Binary file types integer, parameter :: & FILETYPE_STATEPOINT = -1, & FILETYPE_PARTICLE_RESTART = -2, & - FILETYPE_SOURCE = -3 + FILETYPE_SOURCE = -3, & + FILETYPE_TRACK = -4 ! ============================================================================ ! ADJUSTABLE PARAMETERS diff --git a/src/track_output.F90 b/src/track_output.F90 index d4b2878009..f4018cde37 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -114,6 +114,8 @@ contains !$omp critical (FinalizeParticleTrack) file_id = file_create(fname) + call write_dataset(file_id, 'filetype', FILETYPE_TRACK) + call write_dataset(file_id, 'revision', REVISION_TRACK) call write_dataset(file_id, 'n_particles', n_particle_tracks) call write_dataset(file_id, 'n_coords', n_coords) do i = 1, n_particle_tracks From f13c4c7218103e7d7be9902ae8646e3f8ad95156 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 13 Sep 2015 11:36:55 +0700 Subject: [PATCH 080/519] Add source file format in documentation. --- docs/source/devguide/index.rst | 1 + docs/source/devguide/source.rst | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 docs/source/devguide/source.rst diff --git a/docs/source/devguide/index.rst b/docs/source/devguide/index.rst index 3f87ecfad2..02015cfb4b 100644 --- a/docs/source/devguide/index.rst +++ b/docs/source/devguide/index.rst @@ -17,6 +17,7 @@ as debugging. workflow xml-parsing statepoint + source particle_restart track voxel diff --git a/docs/source/devguide/source.rst b/docs/source/devguide/source.rst new file mode 100644 index 0000000000..20457fb116 --- /dev/null +++ b/docs/source/devguide/source.rst @@ -0,0 +1,21 @@ +.. _devguide_source: + +================== +Source File Format +================== + +Normally, source data is stored in a state point file. However, it is possible +to request that the source be written separately, in which case the format used +is that documented here. + +**/filetype** (*int*) + + Flags what type of file this is. A value of -1 indicates a statepoint file, + a value of -2 indicates a particle restart file, a value of -3 indicates a + source file, and a value of -4 indicates a track file. + +**/source_bank** (Compound type) + + Source bank information for each particle. The compound type has fields + ``wgt``, ``xyz``, ``uvw``, and ``E`` which represent the weight, position, + direction, and energy of the source particle, respectively. From c2e8144a5672c4e1a7a1a7ac4f8906356ca071d1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 13 Sep 2015 12:08:00 +0700 Subject: [PATCH 081/519] Move output file formats to user's guide. --- docs/source/devguide/index.rst | 4 ---- docs/source/usersguide/index.rst | 3 ++- docs/source/usersguide/output/index.rst | 14 ++++++++++++++ .../output}/particle_restart.rst | 2 +- .../{devguide => usersguide/output}/source.rst | 2 +- .../{devguide => usersguide/output}/statepoint.rst | 2 +- .../{devguide => usersguide/output}/track.rst | 2 +- docs/source/usersguide/processing.rst | 2 +- 8 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 docs/source/usersguide/output/index.rst rename docs/source/{devguide => usersguide/output}/particle_restart.rst (97%) rename docs/source/{devguide => usersguide/output}/source.rst (96%) rename docs/source/{devguide => usersguide/output}/statepoint.rst (99%) rename docs/source/{devguide => usersguide/output}/track.rst (97%) diff --git a/docs/source/devguide/index.rst b/docs/source/devguide/index.rst index 02015cfb4b..e73d8ba70d 100644 --- a/docs/source/devguide/index.rst +++ b/docs/source/devguide/index.rst @@ -16,9 +16,5 @@ as debugging. styleguide workflow xml-parsing - statepoint - source - particle_restart - track voxel docbuild diff --git a/docs/source/usersguide/index.rst b/docs/source/usersguide/index.rst index 675ed4081a..5a7e7addfa 100644 --- a/docs/source/usersguide/index.rst +++ b/docs/source/usersguide/index.rst @@ -5,7 +5,7 @@ User's Guide ============ Welcome to the OpenMC User's Guide! This tutorial will guide you through the -essential aspects of using OpenMC to perform neutronic simulations. +essential aspects of using OpenMC to perform simulations. .. toctree:: :numbered: @@ -14,5 +14,6 @@ essential aspects of using OpenMC to perform neutronic simulations. beginners install input + output/index processing troubleshoot diff --git a/docs/source/usersguide/output/index.rst b/docs/source/usersguide/output/index.rst new file mode 100644 index 0000000000..1eb85e9d52 --- /dev/null +++ b/docs/source/usersguide/output/index.rst @@ -0,0 +1,14 @@ +.. _usersguide_output: + +=================== +Output File Formats +=================== + +.. toctree:: + :numbered: + :maxdepth: 3 + + statepoint + source + particle_restart + track diff --git a/docs/source/devguide/particle_restart.rst b/docs/source/usersguide/output/particle_restart.rst similarity index 97% rename from docs/source/devguide/particle_restart.rst rename to docs/source/usersguide/output/particle_restart.rst index bf69655589..12ab3237f4 100644 --- a/docs/source/devguide/particle_restart.rst +++ b/docs/source/usersguide/output/particle_restart.rst @@ -1,4 +1,4 @@ -.. _devguide_particle_restart: +.. _usersguide_particle_restart: ============================ Particle Restart File Format diff --git a/docs/source/devguide/source.rst b/docs/source/usersguide/output/source.rst similarity index 96% rename from docs/source/devguide/source.rst rename to docs/source/usersguide/output/source.rst index 20457fb116..cc8e71a675 100644 --- a/docs/source/devguide/source.rst +++ b/docs/source/usersguide/output/source.rst @@ -1,4 +1,4 @@ -.. _devguide_source: +.. _usersguide_source: ================== Source File Format diff --git a/docs/source/devguide/statepoint.rst b/docs/source/usersguide/output/statepoint.rst similarity index 99% rename from docs/source/devguide/statepoint.rst rename to docs/source/usersguide/output/statepoint.rst index 82686ff670..b17bdca024 100644 --- a/docs/source/devguide/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -1,4 +1,4 @@ -.. _devguide_statepoint: +.. _usersguide_statepoint: ======================= State Point File Format diff --git a/docs/source/devguide/track.rst b/docs/source/usersguide/output/track.rst similarity index 97% rename from docs/source/devguide/track.rst rename to docs/source/usersguide/output/track.rst index afa27adfd0..9a85ac7ea2 100644 --- a/docs/source/devguide/track.rst +++ b/docs/source/usersguide/output/track.rst @@ -1,4 +1,4 @@ -.. _devguide_track: +.. _usersguide_track: ================= Track File Format diff --git a/docs/source/usersguide/processing.rst b/docs/source/usersguide/processing.rst index e773cf1563..a6e9875cef 100644 --- a/docs/source/usersguide/processing.rst +++ b/docs/source/usersguide/processing.rst @@ -194,7 +194,7 @@ Data Extraction --------------- A great deal of information is available in statepoint files (See -:ref:`devguide_statepoint`), most of which is easily extracted by the provided +:ref:`usersguide_statepoint`), most of which is easily extracted by the provided utility statepoint.py. This utility provides a Python class to load statepoints and extract data - it is used in many of the provided plotting utilities, and can be used in user-created scripts to carry out manipulations of the data. To From b1f4597e2361baf6c8eac2085b26ad00418e0096 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 13 Sep 2015 12:08:18 +0700 Subject: [PATCH 082/519] unset a few variables in FindHDF5.cmake --- cmake/Modules/FindHDF5.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/Modules/FindHDF5.cmake b/cmake/Modules/FindHDF5.cmake index 08ba0abafd..287e10e5bf 100644 --- a/cmake/Modules/FindHDF5.cmake +++ b/cmake/Modules/FindHDF5.cmake @@ -136,6 +136,10 @@ find_program( HDF5_Fortran_COMPILER_EXECUTABLE DOC "HDF5 Fortran Wrapper compiler. Used only to detect HDF5 compile flags." ) mark_as_advanced( HDF5_Fortran_COMPILER_EXECUTABLE ) +unset(HDF5_C_COMPILER_NAMES) +unset(HDF5_CXX_COMPILER_NAMES) +unset(HDF5_Fortran_COMPILER_NAMES) + find_program( HDF5_DIFF_EXECUTABLE NAMES h5diff HINTS ENV HDF5_ROOT From da6e953319522cd2d5b5b5e8dadb3d9a06cc2cf0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 01:14:38 -0400 Subject: [PATCH 083/519] MultiGroupXS print_xs and get_xs routines now working --- openmc/mgxs/mgxs.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 8a8414624b..56af455e8e 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -461,15 +461,16 @@ class MultiGroupXS(object): # Construct a collection of the domain filter bins if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) - filters.append(self.domain_type) - filter_bins.append(tuple(subdomains)) + for subdomain in subdomains: + filters.append(self.domain_type) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if groups != 'all': cv.check_iterable_type('groups', groups, Integral) - filters.append('energy') for group in groups: - filter_bins.append(self.energy_groups.get_group_bounds(group)) + filters.append('energy') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) # Query the multi-group cross-section tally for the data xs = self.xs_tally.get_values(filters=filters, @@ -521,11 +522,7 @@ class MultiGroupXS(object): raise ValueError(msg) # Construct a collection of the subdomain filter bins to average across - # FIXME: Make Tally.summation take single rather than nested tuples - if subdomains != 'all': - cv.check_iterable_type('subdomains', subdomains, Integral) subdomain_indices = self.get_subdomain_indices(subdomains) -# subdomain_indices = [(index,) for index in subdomain_indices] # Clone this MultiGroupXS to initialize the condensed version avg_xs = copy.deepcopy(self) @@ -596,7 +593,9 @@ class MultiGroupXS(object): string += template.format('', group, bounds[0], bounds[1]) average = self.get_xs([group], [subdomain], 'mean') rel_err = self.get_xs([group], [subdomain], 'rel_err')*100. - string += '{:.2e}+/-{:1.2e}%'.format(average, rel_err) + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] + string += '{0:.2e} +/- {1:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' @@ -1062,13 +1061,13 @@ class ScatterMatrixXS(MultiGroupXS): # Initialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correct=False): + def compute_xs(self, correction='None'): """Computes the multi-group scattering matrix using OpenMC tally arithmetic""" - # FIXME: This should only subtract P1 from the diagonal!!! - if correct: - scatter_p1 = self.tallies['scatter-P1'] + # If using P0 correction subtract scatter-P1 from the diagonal + if correction == 'P0': + scatter_p1 = self.tallies['scatter-1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges @@ -1204,7 +1203,9 @@ class ScatterMatrixXS(MultiGroupXS): [subdomain], 'mean') rel_err = self.get_xs([in_group], [out_group], [subdomain], 'rel. err.')*100. - string += '{:.2e}+/-{:1.2e}%'.format(average, rel_err) + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] + string += '{0:1.2e} +/- {:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' @@ -1234,13 +1235,13 @@ class NuScatterMatrixXS(ScatterMatrixXS): # Intialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correct=False): + def compute_xs(self, correction='None'): """Computes the multi-group nu-scattering matrix using OpenMC tally arithmetic""" - # FIXME: This should only subtract P1 from the diagonal!!! - if correct: - scatter_p1 = self.tallies['scatter-P1'] + # If using P0 correction subtract scatter-P1 from the diagonal + if correction == 'P0': + scatter_p1 = self.tallies['scatter-1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges From 590df6e62d44fef5523b9707d7c8b3c5d157e5da Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 13 Sep 2015 12:20:58 +0700 Subject: [PATCH 084/519] Check that HDF5 groups are closed successfully. --- src/hdf5_interface.F90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index f4771d8480..5e0734648c 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -236,6 +236,9 @@ contains integer :: hdf5_err ! HDF5 error code call h5gclose_f(group_id, hdf5_err) + if (hdf5_err < 0) then + call fatal_error("Unable to close HDF5 group.") + end if end subroutine close_group !=============================================================================== From 925d227d1fd64b552c07eb5972525e3350c28874 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 01:34:54 -0400 Subject: [PATCH 085/519] The print_xs routine for the Python API ScatterMatrixXS class is now working --- openmc/mgxs/mgxs.py | 43 ++++++++++++++++++++++++------------------- openmc/tallies.py | 2 +- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 56af455e8e..cd3302e2ab 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -455,6 +455,8 @@ class MultiGroupXS(object): msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + filters = [] filter_bins = [] @@ -593,8 +595,8 @@ class MultiGroupXS(object): string += template.format('', group, bounds[0], bounds[1]) average = self.get_xs([group], [subdomain], 'mean') rel_err = self.get_xs([group], [subdomain], 'rel_err')*100. - average = average.flatten()[0] - rel_err = rel_err.flatten()[0] + average = np.nan_to_num(average.flatten())[0] + rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{0:.2e} +/- {1:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' @@ -1118,7 +1120,7 @@ class ScatterMatrixXS(MultiGroupXS): msg = 'Unable to get cross-section since it has not been computed' raise ValueError(msg) - cv.check_value('value', value, ['mean', 'std. dev.', 'rel. err.']) + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) filters = [] filter_bins = [] @@ -1126,20 +1128,23 @@ class ScatterMatrixXS(MultiGroupXS): # Construct a collection of the domain filter bins if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) - filters.append(self.domain_type) - filter_bins.append(tuple(subdomains)) + for subdomain in subdomains: + filters.append(self.domain_type) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if in_groups != 'all': - cv.check_iterable_type('in_groups', in_groups, Integral) - filters.append('energy') - for in_group in in_groups: - filter_bins.append(self.energy_groups.get_group_bounds(in_group)) + cv.check_iterable_type('groups', in_groups, Integral) + for group in in_groups: + filters.append('energy') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) + + # Construct list of energy group bounds tuples for all requested groups if out_groups != 'all': - cv.check_iterable_type('out_groups', out_groups, Integral) - filters.append('energy') - for out_group in out_groups: - filter_bins.append(self.energy_groups.get_group_bounds(out_group)) + cv.check_iterable_type('groups', out_groups, Integral) + for group in out_groups: + filters.append('energyout') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) # Query the multi-group cross-section tally for the data xs = self.xs_tally.get_values(filters=filters, @@ -1167,7 +1172,7 @@ class ScatterMatrixXS(MultiGroupXS): raise ValueError(msg) if subdomains != 'all': - cv.check_value('subdomains', subdomains, Iterable, Integral) + cv.check_iterable_type('subdomains', subdomains, Integral) string = 'Multi-Group XS\n' string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.xs_type) @@ -1183,7 +1188,7 @@ class ScatterMatrixXS(MultiGroupXS): string += template.format('', group, bounds[0], bounds[1]) if subdomains == 'all': - subdomains = self.subdomain_indices.keys() + subdomains = self.get_subdomain_indices() # Loop over all subdomains for subdomain in subdomains: @@ -1202,10 +1207,10 @@ class ScatterMatrixXS(MultiGroupXS): average = self.get_xs([in_group], [out_group], [subdomain], 'mean') rel_err = self.get_xs([in_group], [out_group], - [subdomain], 'rel. err.')*100. - average = average.flatten()[0] - rel_err = rel_err.flatten()[0] - string += '{0:1.2e} +/- {:1.2e}%'.format(average, rel_err) + [subdomain], 'rel_err')*100. + average = np.nan_to_num(average.flatten())[0] + rel_err = np.nan_to_num(rel_err.flatten())[0] + string += '{0:1.2e} +/- {1:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' diff --git a/openmc/tallies.py b/openmc/tallies.py index 221dc28547..bccfd2eb59 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1009,7 +1009,7 @@ class Tally(object): else: msg = 'Unable to return results from Tally ID="{0}" since the ' \ 'the requested value "{1}" is not \'mean\', \'std_dev\', ' \ - '\rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) + '\'rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value) raise LookupError(msg) return data From 67312eaf8f5181536ce37bb2346792dcd416de05 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 01:43:30 -0400 Subject: [PATCH 086/519] MultiGroupXS pickle and unpickle routines now working --- openmc/mgxs/mgxs.py | 91 +++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 53 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index cd3302e2ab..cf878e86ac 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -556,26 +556,18 @@ class MultiGroupXS(object): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross-sections to include in the report - Raises - ------ - ValueError - When this method is called before the multi-group cross-section is - computed from tally data. - """ - if self.xs_tally is None: - msg = 'Unable to print cross-section since it has not been computed' - raise ValueError(msg) - if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) + # Build header for string with type and domain info string = 'Multi-Group XS\n' string += '{0: <16}=\t{1}\n'.format('\tType', self.xs_type) string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) + # Append cross-section data if it has been computed if self.xs_tally is not None: if subdomains == 'all': subdomains = self.get_subdomain_indices() @@ -597,7 +589,7 @@ class MultiGroupXS(object): rel_err = self.get_xs([group], [subdomain], 'rel_err')*100. average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] - string += '{0:.2e} +/- {1:1.2e}%'.format(average, rel_err) + string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' @@ -674,11 +666,11 @@ class MultiGroupXS(object): # Store the MultiGroupXS class attributes self.name = xs_results['name'] - self.xs_type = xs_results['xs_type'] + self._xs_type = xs_results['xs_type'] self.domain_type = xs_results['domain_type'] self.domain = xs_results['domain'] self.energy_groups = xs_results['energy_groups'] - self.tallies = xs_results['tallies'] + self._tallies = xs_results['tallies'] self._xs_tally = xs_results['xs_tally'] self._offset = xs_results['offset'] self._subdomain_indices = xs_results['subdomain_indices'] @@ -1159,60 +1151,53 @@ class ScatterMatrixXS(MultiGroupXS): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross-sections to include in the report - Raises - ------ - ValueError - When this method is called before the multi-group cross-section is - computed from tally data. - """ - if self.xs_tally is None: - msg = 'Unable to print cross-section since it has not been computed' - raise ValueError(msg) - if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) + # Build header for string with type and domain info string = 'Multi-Group XS\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.xs_type) - string += '{0: <16}{1}{2}\n'.format('\tDomain Type', '=\t', self.domain_type) - string += '{0: <16}{1}{2}\n'.format('\tDomain ID', '=\t', self.domain.id) + string += '{0: <16}=\t{1}\n'.format('\tType', self.xs_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - string += '{0: <16}\n'.format('\tEnergy Groups:') - template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' + # Append cross-section data if it has been computed + if self.xs_tally is not None: + string += '{0: <16}\n'.format('\tEnergy Groups:') + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' - # Loop over energy groups ranges - for group in range(1, self.num_groups+1): - bounds = self.energy_groups.get_group_bounds(group) - string += template.format('', group, bounds[0], bounds[1]) + # Loop over energy groups ranges + for group in range(1, self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) - if subdomains == 'all': - subdomains = self.get_subdomain_indices() + if subdomains == 'all': + subdomains = self.get_subdomain_indices() - # Loop over all subdomains - for subdomain in subdomains: + # Loop over all subdomains + for subdomain in subdomains: - if self.domain_type == 'distribcell': - string += \ - '{0: <16}{1}{2}\n'.format('\tSubdomain', '=\t', subdomain) + if self.domain_type == 'distribcell': + string += \ + '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) - string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') - template = '{0: <12}Group {1} -> Group {2}:\t\t' + string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + template = '{0: <12}Group {1} -> Group {2}:\t\t' - # Loop over incoming/outgoing energy groups ranges - for in_group in range(1, self.num_groups+1): - for out_group in range(1, self.num_groups+1): - string += template.format('', in_group, out_group) - average = self.get_xs([in_group], [out_group], - [subdomain], 'mean') - rel_err = self.get_xs([in_group], [out_group], - [subdomain], 'rel_err')*100. - average = np.nan_to_num(average.flatten())[0] - rel_err = np.nan_to_num(rel_err.flatten())[0] - string += '{0:1.2e} +/- {1:1.2e}%'.format(average, rel_err) + # Loop over incoming/outgoing energy groups ranges + for in_group in range(1, self.num_groups+1): + for out_group in range(1, self.num_groups+1): + string += template.format('', in_group, out_group) + average = self.get_xs([in_group], [out_group], + [subdomain], 'mean') + rel_err = self.get_xs([in_group], [out_group], + [subdomain], 'rel_err') * 100. + average = np.nan_to_num(average.flatten())[0] + rel_err = np.nan_to_num(rel_err.flatten())[0] + string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err) + string += '\n' string += '\n' - string += '\n' print(string) From 39040c587a5e74a8159b122e1bf2fcd3f750fec0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 09:28:49 -0400 Subject: [PATCH 087/519] Pandas DataFrames for MultiGroupXS now swap energy bounds with group indices if needed --- openmc/mgxs/mgxs.py | 72 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index cf878e86ac..659a24228c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -231,6 +231,7 @@ class MultiGroupXS(object): ---------- subdomain_id : Integral The ID for the subdomain + index : Integral The filter bin index for the subdomain @@ -361,10 +362,13 @@ class MultiGroupXS(object): ---------- scores : Iterable of str Scores for each tally + filters : Iterable of tuple of Filter Tuples of non-spatial domain filters for each tally + keys : Iterable of str Key string used to store each tally in the tallies dictionary + estimator : {'analog' or 'tracklength'} Type of estimator to use for each tally @@ -431,8 +435,10 @@ class MultiGroupXS(object): ---------- groups : Iterable of Integral or 'all' Energy groups of interest + subdomains : Iterable of Integral or 'all' Subdomain IDs of interest + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -602,6 +608,7 @@ class MultiGroupXS(object): ---------- filename : str Filename for the pickled binary file (default is 'mgxs') + directory : str Directory for the pickled binary file (default is 'mgxs') @@ -640,6 +647,7 @@ class MultiGroupXS(object): ---------- filename : str Filename for the pickled binary file (default is 'mgxs') + directory : str Directory for the pickled binary file (default is 'mgxs') @@ -701,8 +709,10 @@ class MultiGroupXS(object): ---------- filename : str Filename for the exported file (default is 'mgxs') + directory : str Directory for the exported file (default is 'mgxs') + format : {'csv', 'excel', 'pickle', 'latex'} The format for the exported data file @@ -720,7 +730,7 @@ class MultiGroupXS(object): cv.check_type('filename', filename, basestring) cv.check_type('directory', directory, basestring) - cv.check_values('format', format, ['csv', 'excel', 'pickle', 'latex']) + cv.check_value('format', format, ['csv', 'excel', 'pickle', 'latex']) # Make directory if it does not exist if not os.path.exists(directory): @@ -730,25 +740,42 @@ class MultiGroupXS(object): filename = filename.replace(' ', '-') # Get a Pandas DataFrame for the data + # FIXME: Column niceties need to be implemented here df = self.get_pandas_dataframe() # Export the data using Pandas IO API if format == 'csv': df.to_csv(filename + '.csv') elif format == 'excel': - df.to_excel(filename + '.xslx') + # FIXME: Overwrite column CrossScores with scores + df.to_excel(filename + '.xls') elif format == 'pickle': df.to_pickle(filename + '.pkl') elif format == 'latex': # FIXME: Insert greek letters + # FIXME: Need to put document header around string df.to_latex(filename + '.tex') - def get_pandas_dataframe(self): + def get_pandas_dataframe(self, groups='indices', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. This routine leverages the Tally.get_pandas_dataframe(...) routine, but renames the columns with terminology appropriate for cross-section data. + Parameters + ---------- + groups : {'indices' or 'bounds'} + When set to 'indices', integer group indices are inserted in the + energy column(s) of the DataFrame. When set to 'bounds', the lower + and upper energy bounds are used. + + summary : None or Summary + An optional Summary object to be used to construct columns for + distribcell tally filters (default is None). The geometric + information in the Summary object is embedded into a Multi-index + column with a geometric "path" to each distribcell intance. + NOTE: This option requires the OpenCG Python package. + Returns ------- pandas.DataFrame @@ -767,8 +794,40 @@ class MultiGroupXS(object): 'cross-section has not been computed' raise ValueError(msg) - # TODO: Reset column labels as cross-sections if needed - df = self.xs_tally.get_pandas_dataframe() + # Get a Pandas DataFrame from the derived xs tally + df = self.xs_tally.get_pandas_dataframe(summary=summary) + + # Remove the score column since it is homogeneous and redundant + if summary: + df = df.drop('score', level=0, axis=1) + else: + df = df.drop('score', axis=1) + + # Use group indices in place of energy bounds ("1" for fastest group) + if groups == 'indices': + + # Rename the column label for energy in the dataframe + columns = [] + if 'energy [MeV]' in df: + df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) + columns.append('group in') + if 'energyout [MeV]' in df: + df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) + columns.append('group out') + + # Loop over all energy groups and override the bounds with indices + template = '({0:.1e} - {1:.1e})' + bins = self.energy_groups.group_edges + for column in columns: + for i in range(self.num_groups): + group = template.format(bins[i], bins[i+1]) + row_indices = df[column] == group + df.loc[row_indices, column] = self.num_groups - i + + # Sort the dataframe by domain type id (e.g., distribcell id) and + # energy groups such that data is from fast to thermal + df.sort([self.domain_type] + columns, inplace=True) + return df @@ -1086,10 +1145,13 @@ class ScatterMatrixXS(MultiGroupXS): ---------- in_groups : Iterable of Integral or 'all' Incoming energy groups of interest + out_groups : Iterable of Integral or 'all' Outgoing energy groups of interest + subdomains : Iterable of Integral or 'all' Subdomain IDs of interest + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted From ad981a6035f7e82a0a7689a828a0f378c632a37b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 09:33:41 -0400 Subject: [PATCH 088/519] Fixed bug in subdomain-averaged multi-group cross-sections --- openmc/mgxs/mgxs.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 659a24228c..6d975502ef 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -534,7 +534,6 @@ class MultiGroupXS(object): # Clone this MultiGroupXS to initialize the condensed version avg_xs = copy.deepcopy(self) - avg_xs._domain_type = 'avg. ' + avg_xs.domain_type # Reset subdomain indices and offsets for distribcell domains if self.domain_type == 'distribcell': @@ -698,7 +697,8 @@ class MultiGroupXS(object): import h5py raise NotImplementedError('HDF5 storage is not yet implemented') - def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv'): + def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv', + groups='indices', summary=None): """Export the multi-group cross-section data to a file. This routine leverages the functionality in the Pandas library to @@ -716,18 +716,20 @@ class MultiGroupXS(object): format : {'csv', 'excel', 'pickle', 'latex'} The format for the exported data file - Raises - ------ - ValueError - When this method is called before the multi-group cross-section is - computed from tally data. + groups : {'indices' or 'bounds'} + When set to 'indices' (default), integer group indices are inserted + in the energy in/out column(s) of the DataFrame. When it is 'bounds' + the lower and upper energy bounds are used. + + summary : None or Summary + An optional Summary object to be used to construct columns for + distribcell tally filters (default is None). The geometric + information in the Summary object is embedded into a Multi-index + column with a geometric "path" to each distribcell intance. + NOTE: This option requires the OpenCG Python package. """ - if self.xs_tally is None: - msg = 'Unable to export cross-section since it has not been computed' - raise ValueError(msg) - cv.check_type('filename', filename, basestring) cv.check_type('directory', directory, basestring) cv.check_value('format', format, ['csv', 'excel', 'pickle', 'latex']) @@ -740,8 +742,7 @@ class MultiGroupXS(object): filename = filename.replace(' ', '-') # Get a Pandas DataFrame for the data - # FIXME: Column niceties need to be implemented here - df = self.get_pandas_dataframe() + df = self.get_pandas_dataframe(groups, summary) # Export the data using Pandas IO API if format == 'csv': @@ -765,9 +766,9 @@ class MultiGroupXS(object): Parameters ---------- groups : {'indices' or 'bounds'} - When set to 'indices', integer group indices are inserted in the - energy column(s) of the DataFrame. When set to 'bounds', the lower - and upper energy bounds are used. + When set to 'indices' (default), integer group indices are inserted + in the energy in/out column(s) of the DataFrame. When it is 'bounds' + the lower and upper energy bounds are used. summary : None or Summary An optional Summary object to be used to construct columns for From e663aa6ec88eb63a2a2726093717f450d3b39d90 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 12:25:31 -0400 Subject: [PATCH 089/519] Fixed mergeable tallies for use with MultiGroupXS subclasses in Python API --- openmc/filter.py | 29 +++++++++++++- openmc/mgxs/mgxs.py | 91 ++++++++++++++++++++++++++++++++++---------- openmc/statepoint.py | 4 +- 3 files changed, 101 insertions(+), 23 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index bcbe61eb82..e7e527531f 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -282,12 +282,39 @@ class Filter(object): merged_filter = copy.deepcopy(self) # Merge unique filter bins - merged_bins = list(set(self.bins + filter.bins)) + merged_bins = list(set(list(self.bins) + list(filter.bins))) merged_filter.bins = merged_bins merged_filter.num_bins = len(merged_bins) return merged_filter + def is_subset(self, other): + """Determine if another filter is a subset of this filter. + + If all of the bins in the other filter are included as bins in this + filter, then it is a subset of this filter. + + Parameters + ---------- + other : Filter + The filter to query as a subset of this filter + + Returns + ------- + boolean + Whether or not the other filter is a subset of this filter + """ + if not isinstance(other, Filter): + return False + elif self.type != other.type: + return False + + for bin in other.bins: + if bin not in self.bins: + return False + + return True + def get_bin_index(self, filter_bin): """Returns the index in the Filter for some bin. diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 6d975502ef..18e87bba10 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -158,6 +158,10 @@ class MultiGroupXS(object): def name(self): return self._name + @property + def xs_type(self): + return self._xs_type + @property def domain(self): return self._domain @@ -280,7 +284,9 @@ class MultiGroupXS(object): if subdomains != 'all': cv.check_type('subdomains', subdomains, Iterable, Integral) - if subdomains == 'all': + if subdomains == 'all' and self.domain_type != 'distribcell': + indices = [0] + elif subdomains == 'all' and self.domain_type == 'distribcell': tally = self.tallies.values()[0] domain_filter = tally.find_filter(self.domain_type) num_subdomains = domain_filter.num_bins @@ -331,7 +337,9 @@ class MultiGroupXS(object): if indices != 'all': cv.check_type('offsets', indices, Iterable, Integral) - if indices == 'all': + if indices == 'all' and self.domain_type != 'distribcell': + subdomains = [self.domain.id] + elif indices == 'all' and self.domain_type == 'distribcell': tally = self.tallies.values()[0] domain_filter = tally.find_filter(self.domain_type) num_subdomains = domain_filter.num_bins @@ -382,6 +390,7 @@ class MultiGroupXS(object): # Create a domain Filter object domain_filter = openmc.Filter(self.domain_type, self.domain.id) + domain_filter.num_bins = 1 for score, key, filters in zip(scores, keys, all_filters): self.tallies[key] = openmc.Tally(name=self.name) @@ -413,8 +422,14 @@ class MultiGroupXS(object): statepoint.read_results() # Create Tallies to search for in StatePoint - if self.tallies is None: - self.create_tallies() + self.create_tallies() + + if self.domain_type == 'distribcell': + filters = [] + filter_bins = [] + else: + filters = [self.domain_type] + filter_bins = [(self.domain.id,)] # Find, slice and store Tallies from StatePoint # The tally slicing is needed if tally merging was used @@ -422,7 +437,8 @@ class MultiGroupXS(object): sp_tally = statepoint.get_tally(tally.scores, tally.filters, tally.nuclides, estimator=tally.estimator) - sp_tally = sp_tally.get_slice(scores=tally.scores, nuclides=tally.nuclides) + sp_tally = sp_tally.get_slice(tally.scores, filters, + filter_bins, tally.nuclides) self.tallies[tally_type] = sp_tally def get_xs(self, groups='all', subdomains='all', value='mean'): @@ -575,7 +591,7 @@ class MultiGroupXS(object): # Append cross-section data if it has been computed if self.xs_tally is not None: if subdomains == 'all': - subdomains = self.get_subdomain_indices() + subdomains = self.get_subdomains() # Loop over all subdomains for subdomain in subdomains: @@ -697,8 +713,7 @@ class MultiGroupXS(object): import h5py raise NotImplementedError('HDF5 storage is not yet implemented') - def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv', - groups='indices', summary=None): + def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv'): """Export the multi-group cross-section data to a file. This routine leverages the functionality in the Pandas library to @@ -742,20 +757,41 @@ class MultiGroupXS(object): filename = filename.replace(' ', '-') # Get a Pandas DataFrame for the data - df = self.get_pandas_dataframe(groups, summary) + df = self.get_pandas_dataframe() + + # Capitalize column label strings + df.columns = map(str.title, df.columns) # Export the data using Pandas IO API if format == 'csv': - df.to_csv(filename + '.csv') + df.to_csv(filename + '.csv', index=False) elif format == 'excel': - # FIXME: Overwrite column CrossScores with scores - df.to_excel(filename + '.xls') + df.to_excel(filename + '.xls', index=False) elif format == 'pickle': df.to_pickle(filename + '.pkl') elif format == 'latex': + if self.domain_type == 'distribcell': + msg = 'Unable to export distribcell multi-group cross-section' \ + 'data to a LaTeX table' + raise NotImplementedError(msg) + # FIXME: Insert greek letters - # FIXME: Need to put document header around string - df.to_latex(filename + '.tex') + + df.to_latex(filename + '.tex', bold_rows=True, + longtable=True, index=False) + + # Surround LaTeX table with code needed to run pdflatex + with open(filename + '.tex','r') as original: + data = original.read() + with open(filename + '.tex','w') as modified: + modified.write( + '\\documentclass[preview, 12pt, border=1mm]{standalone}\n') + modified.write('\\usepackage{caption}\n') + modified.write('\\usepackage{longtable}\n') + modified.write('\\usepackage{booktabs}\n') + modified.write('\\begin{document}\n\n') + modified.write(data) + modified.write('\n\\end{document}') def get_pandas_dataframe(self, groups='indices', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. @@ -799,7 +835,7 @@ class MultiGroupXS(object): df = self.xs_tally.get_pandas_dataframe(summary=summary) # Remove the score column since it is homogeneous and redundant - if summary: + if summary and self.domain_type == 'distribcell': df = df.drop('score', level=0, axis=1) else: df = df.drop('score', axis=1) @@ -836,7 +872,7 @@ class TotalXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(TotalXS, self).__init__(domain, domain_type, groups, name) - self.xs_type = 'total' + self._xs_type = 'total' def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross-section.""" @@ -849,6 +885,7 @@ class TotalXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -867,7 +904,7 @@ class TransportXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(TransportXS, self).__init__(domain, domain_type, groups, name) - self.xs_type = 'transport' + self._xs_type = 'transport' def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross-section.""" @@ -881,6 +918,8 @@ class TransportXS(MultiGroupXS): group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) energyout_filter = openmc.Filter('energyout', group_edges) + energy_filter.num_bins = self.num_groups + energyout_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter], [energyout_filter]] # Initialize the Tallies @@ -905,7 +944,7 @@ class AbsorptionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(AbsorptionXS, self).__init__(domain, domain_type, groups, name) - self.xs_type = 'absorption' + self._xs_type = 'absorption' def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross-section.""" @@ -918,6 +957,7 @@ class AbsorptionXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -949,6 +989,7 @@ class CaptureXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter], [energy_filter]] # Initialize the Tallies @@ -981,6 +1022,7 @@ class FissionXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -1012,6 +1054,7 @@ class NuFissionXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -1043,6 +1086,7 @@ class ScatterXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Intialize the Tallies @@ -1074,6 +1118,7 @@ class NuScatterXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) + energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -1100,6 +1145,8 @@ class ScatterMatrixXS(MultiGroupXS): group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) energyout = openmc.Filter('energyout', group_edges) + energy.num_bins = self.num_groups + energyout.num_bins = self.num_groups # Create a list of scores for each Tally to be created if correct: @@ -1236,7 +1283,7 @@ class ScatterMatrixXS(MultiGroupXS): string += template.format('', group, bounds[0], bounds[1]) if subdomains == 'all': - subdomains = self.get_subdomain_indices() + subdomains = self.get_subdomains() # Loop over all subdomains for subdomain in subdomains: @@ -1269,7 +1316,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, name) - self.xs_type = 'nu-scatter matrix' + self._xs_type = 'nu-scatter matrix' def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross-section.""" @@ -1283,6 +1330,8 @@ class NuScatterMatrixXS(ScatterMatrixXS): group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) energyout = openmc.Filter('energyout', group_edges) + energy.num_bins = self.num_groups + energyout.num_bins = self.num_groups filters = [[energy], [energy, energyout], [energyout]] # Intialize the Tallies @@ -1326,6 +1375,8 @@ class Chi(MultiGroupXS): group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) energyout_filter = openmc.Filter('energyout', group_edges) + energy_filter.num_bins = self.num_groups + energyout_filter.num_bins = self.num_groups filters = [[energy_filter], [energyout_filter]] # Intialize the Tallies diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 0730c5c65c..6e6accf836 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -692,8 +692,8 @@ class StatePoint(object): contains_filters = True # Iterate over the Filters requested by the user - for filter in filters: - if filter not in test_tally.filters: + for filter, test_filter in zip(filters, test_tally.filters): + if not test_filter.is_subset(filter): contains_filters = False break From 442e0d88e9701a6897406006debe7ef7e2ea25a8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 12:42:23 -0400 Subject: [PATCH 090/519] Made Python API Filter.num_bins property decorator look at bins attribute for smarter return --- openmc/filter.py | 11 ++++++++++- openmc/mgxs/mgxs.py | 18 ------------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index e7e527531f..10a245d756 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -35,6 +35,8 @@ class Filter(object): The type of the tally filter. bins : Integral or Iterable of Integral or Iterable of float The bins for the filter + num_bins : Integral + The number of filter bins mesh : Mesh or None A Mesh object for 'mesh' type filters. offset : Integral @@ -110,7 +112,14 @@ class Filter(object): @property def num_bins(self): - return self._num_bins + if self.bins is None: + return 0 + elif self.type in ['energy', 'energyout']: + return len(self.bins)-1 + elif self.type in ['cell', 'cellborn', 'surface', 'universe', 'material']: + return len(self.bins) + else: + return self._num_bins @property def mesh(self): diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 18e87bba10..5abc4fe0a7 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -885,7 +885,6 @@ class TotalXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -918,8 +917,6 @@ class TransportXS(MultiGroupXS): group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) energyout_filter = openmc.Filter('energyout', group_edges) - energy_filter.num_bins = self.num_groups - energyout_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter], [energyout_filter]] # Initialize the Tallies @@ -957,7 +954,6 @@ class AbsorptionXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -989,7 +985,6 @@ class CaptureXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter], [energy_filter]] # Initialize the Tallies @@ -1022,7 +1017,6 @@ class FissionXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -1054,7 +1048,6 @@ class NuFissionXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -1086,7 +1079,6 @@ class ScatterXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Intialize the Tallies @@ -1118,7 +1110,6 @@ class NuScatterXS(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) - energy_filter.num_bins = self.num_groups filters = [[energy_filter], [energy_filter]] # Initialize the Tallies @@ -1145,8 +1136,6 @@ class ScatterMatrixXS(MultiGroupXS): group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) energyout = openmc.Filter('energyout', group_edges) - energy.num_bins = self.num_groups - energyout.num_bins = self.num_groups # Create a list of scores for each Tally to be created if correct: @@ -1172,7 +1161,6 @@ class ScatterMatrixXS(MultiGroupXS): scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges - energy_filter.num_bins = self.num_groups scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) rxn_tally = self.tallies['scatter'] - scatter_p1 else: @@ -1330,8 +1318,6 @@ class NuScatterMatrixXS(ScatterMatrixXS): group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) energyout = openmc.Filter('energyout', group_edges) - energy.num_bins = self.num_groups - energyout.num_bins = self.num_groups filters = [[energy], [energy, energyout], [energyout]] # Intialize the Tallies @@ -1347,7 +1333,6 @@ class NuScatterMatrixXS(ScatterMatrixXS): scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges - energy_filter.num_bins = self.num_groups scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) rxn_tally = self.tallies['nu-scatter'] - scatter_p1 else: @@ -1375,8 +1360,6 @@ class Chi(MultiGroupXS): group_edges = self.energy_groups.group_edges energy_filter = openmc.Filter('energy', group_edges) energyout_filter = openmc.Filter('energyout', group_edges) - energy_filter.num_bins = self.num_groups - energyout_filter.num_bins = self.num_groups filters = [[energy_filter], [energyout_filter]] # Intialize the Tallies @@ -1423,7 +1406,6 @@ class Chi(MultiGroupXS): energy_filter = openmc.Filter(type='energyout') energy_filter.bins = self.energy_groups.group_edges - energy_filter.num_bins = self.num_groups norm = norm.tile_filter(energy_filter) self._xs_tally /= norm From fa86ae2fbba7eedf6bfe94a3874944cc1eb4e4fb Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 12:51:53 -0400 Subject: [PATCH 091/519] Removed references to Greek letters in MultiGroupXS latex generatoin --- openmc/mgxs/mgxs.py | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 5abc4fe0a7..160ce1dcb7 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -30,20 +30,6 @@ DOMAINS = [openmc.Cell, openmc.Material, openmc.Mesh] -# LaTeX Greek symbols for each cross-section type -GREEK = dict() -GREEK['total'] = '$\\Sigma_{t}$' -GREEK['transport'] = '$\\Sigma_{tr}$' -GREEK['absorption'] = '$\\Sigma_{a}$' -GREEK['capture'] = '$\\Sigma_{c}$' -GREEK['scatter'] = '$\\Sigma_{s}$' -GREEK['nu-scatter'] = '$\\nu\\Sigma_{s}$' -GREEK['scatter matrix'] = '$\\Sigma_{s}$' -GREEK['nu-scatter matrix'] = '$\\nu\\Sigma_{s}$' -GREEK['fission'] = '$\\Sigma_{f}$' -GREEK['nu-fission'] = '$\\nu\\Sigma_{f}$' -GREEK['chi'] = '$\\chi$' - class MultiGroupXS(object): """A multi-group cross-section for some energy group structure within @@ -775,8 +761,6 @@ class MultiGroupXS(object): 'data to a LaTeX table' raise NotImplementedError(msg) - # FIXME: Insert greek letters - df.to_latex(filename + '.tex', bold_rows=True, longtable=True, index=False) @@ -793,6 +777,7 @@ class MultiGroupXS(object): modified.write(data) modified.write('\n\\end{document}') + def get_pandas_dataframe(self, groups='indices', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. From 6d2a87fd35afda3a31af89c2104604514680d8be Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 13:04:27 -0400 Subject: [PATCH 092/519] Removed subdomain indices related methods and attributes from MultiGroupXS in Python API --- openmc/mgxs/mgxs.py | 179 +++++--------------------------------------- 1 file changed, 20 insertions(+), 159 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 160ce1dcb7..d655472edb 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -70,12 +70,6 @@ class MultiGroupXS(object): xs_tally : Tally Derived tally for the multi-group cross-section. This attribute is None unless the multi-group cross-section has been computed. - subdomain_indices : dict - Integer subdomain IDs (keys) mapped to integer tally data array - indices (values) for 'distribcell' domain types. Each subdomain ID - corresponds to an instance of the cell domain. For all other domain - types, the domain has only one subdomain and this dictionary will - trivially map zero to zero. offset : Integral The filter offset for the domain filter @@ -95,12 +89,6 @@ class MultiGroupXS(object): self._num_groups = None self._tallies = dict() self._xs_tally = None - - # A dictionary used to compute indices into the xs array - # Keys - Domain ID (ie, maaterial ID, distribcell instance ID, etc) - # Values - Offset/stride into xs array - # NOTE: This is primarily used for distribcell domain types - self._subdomain_indices = dict() self._offset = None self.name = name @@ -124,8 +112,6 @@ class MultiGroupXS(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._num_groups = self.num_groups clone._xs_tally = copy.deepcopy(self.xs_tally, memo) - clone._subdomain_indices = \ - copy.deepcopy(self.subdomain_indices, memo) clone._offset = copy.deepcopy(self.offset, memo) clone._tallies = dict() @@ -177,8 +163,10 @@ class MultiGroupXS(object): return self._offset @property - def subdomain_indices(self): - return self._subdomain_indices + def num_subdomains(self): + tally = self.tallies.values()[0] + domain_filter = tally.find_filter(self.domain_type) + return domain_filter.num_bins @name.setter def name(self, name): @@ -189,8 +177,6 @@ class MultiGroupXS(object): def domain(self, domain): cv.check_type('domain', domain, tuple(DOMAINS)) self._domain = domain - if self._domain_type in ['material', 'cell', 'universe', 'mesh']: - self._subdomain_indices[domain.id] = 0 @domain_type.setter def domain_type(self, domain_type): @@ -210,141 +196,6 @@ class MultiGroupXS(object): domain_filter = tally.find_filter(self.domain_type) self._offset = domain_filter.offset - def set_subdomain_index(self, subdomain_id, index): - """Set the filter bin index for a subdomain of the domain. - - This is useful when the domain type is 'distribcell', in which case one - may wish to map each subdomain (a cell instance) to its filter bin in - the derived multi-group cross-section tally data array. - - Parameters - ---------- - subdomain_id : Integral - The ID for the subdomain - - index : Integral - The filter bin index for the subdomain - - See also - -------- - MultiGroupXS.get_subdomains(), MultiGroupXS.get_subdomain_indices() - - """ - - cv.check_type('subdomain id', subdomain_id, Integral) - cv.check_type('subdomain index', index, Integral) - cv.check_greater_than('subdomain id', subdomain_id, 0, equality=True) - cv.check_greater_than('subdomain index', index, 0, equality=True) - self._subdomain_indices[subdomain_id] = index - - def get_subdomain_indices(self, subdomains='all'): - """Get the indices for one or more subdomains. - - This method can be used to extract the indices into the multi-group - cross-section tally data array for a subdomain. This is useful when the - domain type is 'distribcell', in which case one may wish to map each - subdomain (a cell instance) to its filter bin index in the derived - multi-group cross-section tally data array. - - Parameters - ---------- - subdomains : Iterable of Integral or 'all' - Subdomain IDs (distribcell instance IDs) of interest - - Returns - ---------- - indices : ndarray - The subdomain indices indexed in the order of the subdomains - - Raises - ------ - ValueError - When one of the subdomains is not a valid subdomain ID. - - See also - -------- - MultiGroupXS.get_subdomains(), MultiGroupXS.set_subdomain_index() - - """ - - if subdomains != 'all': - cv.check_type('subdomains', subdomains, Iterable, Integral) - - if subdomains == 'all' and self.domain_type != 'distribcell': - indices = [0] - elif subdomains == 'all' and self.domain_type == 'distribcell': - tally = self.tallies.values()[0] - domain_filter = tally.find_filter(self.domain_type) - num_subdomains = domain_filter.num_bins - indices = np.arange(num_subdomains) - else: - indices = np.zeros(len(subdomains), dtype=np.int64) - - for i, subdomain in enumerate(subdomains): - if subdomain in self.subdomain_indices: - indices[i] = self.subdomain_indices[subdomain] - else: - msg = 'Unable to get index for subdomain "{0}" since it ' \ - 'is not a valid subdomain'.format(subdomain) - raise ValueError(msg) - - return indices - - def get_subdomains(self, indices='all'): - """Get the subdomain IDs for one or more indices. - - This method can be used to extract the subdomains for the multi-group - cross-section from their indices in the tally data array. This is useful - when the domain type is 'distribcell', in which case one may wish to map - each subdomain (a cell instance) to its filter bin index in the derived - multi-group cross-section tally data array. - - Parameters - ---------- - indices : Iterable of Integral or 'all' - Subdomain indices of interest - - Returns - ---------- - subdomains : ndarray - Array of subdomain IDs indexed in the order of the indices - - Raises - ------ - ValueError - When one of the indices is not a valid subdomain index. - - See also - -------- - MultiGroupXS.get_subdomain_indices(), MultiGroupXS.set_subdomain_index() - - """ - - if indices != 'all': - cv.check_type('offsets', indices, Iterable, Integral) - - if indices == 'all' and self.domain_type != 'distribcell': - subdomains = [self.domain.id] - elif indices == 'all' and self.domain_type == 'distribcell': - tally = self.tallies.values()[0] - domain_filter = tally.find_filter(self.domain_type) - num_subdomains = domain_filter.num_bins - subdomains = np.arange(num_subdomains) - else: - subdomains = np.zeros(len(indices), dtype=np.int64) - keys = self.subdomain_indices.keys() - values = self.subdomain_indices.values() - - for i, index in enumerate(indices): - if index in values: - subdomains[i] = keys[values.index(index)] - else: - msg = 'Unable to get subdomain for index "{0}" since it ' \ - 'is not a valid index'.format(index) - raise ValueError(msg) - - return subdomains - @abc.abstractmethod def create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross-section. @@ -532,21 +383,26 @@ class MultiGroupXS(object): raise ValueError(msg) # Construct a collection of the subdomain filter bins to average across - subdomain_indices = self.get_subdomain_indices(subdomains) + if subdomains == 'all': + if self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains) + else: + subdomains = [self.domain.id] + else: + cv.check_iterable_type('subdomains', subdomains, Integral) # Clone this MultiGroupXS to initialize the condensed version avg_xs = copy.deepcopy(self) # Reset subdomain indices and offsets for distribcell domains if self.domain_type == 'distribcell': - avg_xs._subdomain_indices = {} avg_xs._offset = 0 # Overwrite tallies with new subdomain-averaged versions avg_xs._tallies = {} for tally_type, tally in self.tallies.items(): tally_sum = tally.summation(filter=self.domain_type, - filter_bins=subdomain_indices) + filter_bins=subdomains) tally_sum /= len(subdomains) avg_xs.tallies[tally_type] = tally_sum @@ -577,7 +433,10 @@ class MultiGroupXS(object): # Append cross-section data if it has been computed if self.xs_tally is not None: if subdomains == 'all': - subdomains = self.get_subdomains() + if self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + else: + subdomains = [self.domain.id] # Loop over all subdomains for subdomain in subdomains: @@ -682,7 +541,6 @@ class MultiGroupXS(object): self._tallies = xs_results['tallies'] self._xs_tally = xs_results['xs_tally'] self._offset = xs_results['offset'] - self._subdomain_indices = xs_results['subdomain_indices'] def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True, key=None): @@ -1256,7 +1114,10 @@ class ScatterMatrixXS(MultiGroupXS): string += template.format('', group, bounds[0], bounds[1]) if subdomains == 'all': - subdomains = self.get_subdomains() + if self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + else: + subdomains = [self.domain.id] # Loop over all subdomains for subdomain in subdomains: From 2ad9ac99325afcd4021d605dbbb173f7fbba28a4 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 17:14:29 -0400 Subject: [PATCH 093/519] HDF5 stores now working for MultiGroupXS in Python API --- openmc/filter.py | 2 +- openmc/mgxs/mgxs.py | 119 ++++++++++++++++++++++++++++++++++---------- openmc/tallies.py | 4 +- 3 files changed, 95 insertions(+), 30 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 10a245d756..85f1ee5bc5 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -511,7 +511,7 @@ class Filter(object): try: import pandas as pd except ImportError: - msg = 'The pandas Python package must be installed on your system' + msg = 'The Pandas Python package must be installed on your system' raise ImportError(msg) # Initialize Pandas DataFrame diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d655472edb..e2ec268599 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -542,20 +542,99 @@ class MultiGroupXS(object): self._xs_tally = xs_results['xs_tally'] self._offset = xs_results['offset'] - def build_hdf5_store(self, filename='mgxs', directory='mgxs', - append=True, key=None): + def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True): + """Export the multi-group cross-section data into an HDF5 binary file. + + This routine constructs an HDF5 file which stores the multi-group + cross-section data. The data is be stored in a hierarchy of HDF5 groups + from the domain type, domain id, subdomain id (for distribcell domains), + and cross-section type. Two datasets for the mean and standard deviation + are stored for each subddomain entry in the HDF5 file. + + NOTE: This requires the h5py Python package. + + Parameters + ---------- + filename : str + Filename for the HDF5 file (default is 'mgxs') + + directory : str + Directory for the HDF5 file (default is 'mgxs') + + append : boolean + If true, appends to an existing HDF5 file with the same filename + directory (if one exists) + + Raises + ------ + ValueError + When this method is called before the multi-group cross-section is + computed from tally data. + ImportError + When h5py is not installed. + """ - :param filename: - :param directory: - :param append: - :param key: - :return: - """ + if self.xs_tally is None: + msg = 'Unable to get build HDF5 store since the ' \ + 'cross-section has not been computed' + raise ValueError(msg) - # FIXME: - import h5py - raise NotImplementedError('HDF5 storage is not yet implemented') + # Attempt to import h5py + try: + import h5py + except ImportError: + msg = 'The h5py Python package must be installed on your system' + raise ImportError(msg) + + filename = directory + '/' + filename + '.h5' + filename = filename.replace(' ', '-') + + if append: + xs_results = h5py.File(filename, 'a') + else: + xs_results = h5py.File(filename, 'w') + + # Create an HDF5 group within the file for the domain + domain_type_group = xs_results.require_group(self.domain_type) + group_name = '{0} {1}'.format(self.domain_type, self.domain.id) + domain_group = domain_type_group.require_group(group_name) + + if self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + else: + subdomains = [self.domain.id] + + # Determine number of digits to pad subdomain group keys + num_digits = len(str(self.num_subdomains)) + + # Create a separate HDF5 dataset for each subdomain + for i, subdomain in enumerate(subdomains): + + # Create an HDF5 group for the subdomain + if self.domain_type == 'distribcell': + group_name = str(subdomain).zfill(num_digits) + subdomain_group = domain_group.require_group(group_name) + else: + subdomain_group = domain_group + + # Create a separate HDF5 group for the xs type + xs_group = subdomain_group.require_group(self.xs_type) + + # Extract the cross-section for this + average = self.get_xs(subdomains=[subdomain], value='mean') + std_dev = self.get_xs(subdomains=[subdomain], value='std_dev') + average = average.squeeze() + std_dev = std_dev.squeeze() + + # Add MultiGroupXS results data to the HDF5 group + xs_group.require_dataset('average', dtype=np.float64, + shape=average.shape, data=average) + xs_group.require_dataset('std. dev.', dtype=np.float64, + shape=std_dev.shape, data=std_dev) + + # Close the MultiGroup results HDF5 file + xs_results.close() def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv'): """Export the multi-group cross-section data to a file. @@ -1082,6 +1161,7 @@ class ScatterMatrixXS(MultiGroupXS): # Query the multi-group cross-section tally for the data xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) + xs = np.nan_to_num(xs) return xs def print_xs(self, subdomains='all'): @@ -1217,17 +1297,7 @@ class Chi(MultiGroupXS): nu_fission_in = self.tallies['nu-fission-in'] nu_fission_out = self.tallies['nu-fission-out'] - # FIXME: Make filter bins simpler in Tally.summation(...) - # Construct energy group filter bins to sum across - ''' - filter_bins = [] - for group in range(1, self.num_groups+1): - group_bounds = self.energy_groups.get_group_bounds(group) - filter_bins.append((group_bounds,)) - energy_bins = [filter_bins] - ''' - energy_bins = [] for group in range(1, self.num_groups+1): energy_bins.append(self.energy_groups.get_group_bounds(group)) @@ -1235,9 +1305,6 @@ class Chi(MultiGroupXS): sum_nu_fission_in = nu_fission_in.summation(filter='energy', filter_bins=energy_bins) - # FIXME: Need ability to override energy groups with group numbers - # FIXME: Reverse from fast to thermal with energy groups - # FIXME: CrossFilter for energy + energy messes up tally arithmetic sum_nu_fission_in.remove_filter(sum_nu_fission_in.filters[-1]) @@ -1256,6 +1323,4 @@ class Chi(MultiGroupXS): self._xs_tally /= norm self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) - - # FIXME: Does this need to reset NaNs to zero? \ No newline at end of file + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) \ No newline at end of file diff --git a/openmc/tallies.py b/openmc/tallies.py index bccfd2eb59..8e5292d29c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1075,11 +1075,11 @@ class Tally(object): 'Summary info'.format(self.id) raise KeyError(msg) - # Attempt to import the pandas package + # Attempt to import Pandas try: import pandas as pd except ImportError: - msg = 'The pandas Python package must be installed on your system' + msg = 'The Pandas Python package must be installed on your system' raise ImportError(msg) # Initialize a pandas dataframe for the tally data From 4657823ade25e51b97d36ce2463b04ada4a64584 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 17:24:09 -0400 Subject: [PATCH 094/519] Added abstract compute_xs method to MultiGroupXS class in Python API --- openmc/mgxs/mgxs.py | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e2ec268599..f8fd5518d2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -70,13 +70,11 @@ class MultiGroupXS(object): xs_tally : Tally Derived tally for the multi-group cross-section. This attribute is None unless the multi-group cross-section has been computed. - offset : Integral - The filter offset for the domain filter """ # This is an abstract class which cannot be instantiated - metaclass__ = abc.ABCMeta + __metaclass__ = abc.ABCMeta def __init__(self, domain=None, domain_type=None, energy_groups=None, name=''): @@ -89,7 +87,6 @@ class MultiGroupXS(object): self._num_groups = None self._tallies = dict() self._xs_tally = None - self._offset = None self.name = name if domain_type is not None: @@ -112,7 +109,6 @@ class MultiGroupXS(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._num_groups = self.num_groups clone._xs_tally = copy.deepcopy(self.xs_tally, memo) - clone._offset = copy.deepcopy(self.offset, memo) clone._tallies = dict() for tally_type, tally in self.tallies.items(): @@ -158,10 +154,6 @@ class MultiGroupXS(object): def xs_tally(self): return self._xs_tally - @property - def offset(self): - return self._offset - @property def num_subdomains(self): tally = self.tallies.values()[0] @@ -189,13 +181,6 @@ class MultiGroupXS(object): self._energy_groups = energy_groups self._num_groups = energy_groups.num_groups - def _find_domain_offset(self): - """Finds and stores the offset of the domain tally filter""" - - tally = self.tallies.values()[0] - domain_filter = tally.find_filter(self.domain_type) - self._offset = domain_filter.offset - @abc.abstractmethod def create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross-section. @@ -239,6 +224,12 @@ class MultiGroupXS(object): for filter in filters: self.tallies[key].add_filter(filter) + @abc.abstractmethod + def compute_xs(self): + """Computes multi-group cross-sections using OpenMC tally arithmetic.""" + + return + def load_from_statepoint(self, statepoint): """Extracts tallies in an OpenMC StatePoint with the data needed to compute multi-group cross-sections. @@ -814,7 +805,7 @@ class TotalXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group total cross-sections using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['total'] / self.tallies['flux'] self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) @@ -851,7 +842,7 @@ class TransportXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group transport cross-sections using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] self._xs_tally /= self.tallies['flux'] @@ -883,7 +874,7 @@ class AbsorptionXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group absorption cross-sections using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['absorption'] / self.tallies['flux'] self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) @@ -914,7 +905,7 @@ class CaptureXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group capture cross-sections using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['absorption'] - self.tallies['fission'] self._xs_tally /= self.tallies['flux'] @@ -946,7 +937,7 @@ class FissionXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group fission cross-sections using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['fission'] / self.tallies['flux'] self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) @@ -977,7 +968,7 @@ class NuFissionXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group nu-fission cross-sections using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) @@ -1008,7 +999,7 @@ class ScatterXS(MultiGroupXS): def compute_xs(self): """Computes the scattering multi-group cross-sections using - OpenMC tally arithmetic""" + OpenMC tally arithmetic.""" self._xs_tally = self.tallies['scatter'] / self.tallies['flux'] self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) @@ -1039,7 +1030,7 @@ class NuScatterXS(MultiGroupXS): def compute_xs(self): """Computes the nu-scattering multi-group cross-section using OpenMC - tally arithmetic""" + tally arithmetic.""" self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) @@ -1075,7 +1066,7 @@ class ScatterMatrixXS(MultiGroupXS): def compute_xs(self, correction='None'): """Computes the multi-group scattering matrix using OpenMC - tally arithmetic""" + tally arithmetic.""" # If using P0 correction subtract scatter-P1 from the diagonal if correction == 'P0': @@ -1251,7 +1242,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): def compute_xs(self, correction='None'): """Computes the multi-group nu-scattering matrix using OpenMC - tally arithmetic""" + tally arithmetic.""" # If using P0 correction subtract scatter-P1 from the diagonal if correction == 'P0': @@ -1292,7 +1283,7 @@ class Chi(MultiGroupXS): super(Chi, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes chi fission spectrum using OpenMC tally arithmetic""" + """Computes chi fission spectrum using OpenMC tally arithmetic.""" nu_fission_in = self.tallies['nu-fission-in'] nu_fission_out = self.tallies['nu-fission-out'] From ec497c526a371f954ba9bfd7eb7e111ed89527e9 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 17:29:17 -0400 Subject: [PATCH 095/519] Improved docstrings for MultiGroupXS --- openmc/mgxs/mgxs.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index f8fd5518d2..a71da8cf11 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1043,7 +1043,7 @@ class ScatterMatrixXS(MultiGroupXS): super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, name) self._xs_type = 'scatter matrix' - def create_tallies(self, correct=False): + def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross-section.""" group_edges = self.energy_groups.group_edges @@ -1051,12 +1051,8 @@ class ScatterMatrixXS(MultiGroupXS): energyout = openmc.Filter('energyout', group_edges) # Create a list of scores for each Tally to be created - if correct: - scores = ['flux', 'scatter', 'scatter-P1'] - filters = [[energy], [energy, energyout], [energyout]] - else: - scores = ['flux', 'scatter'] - filters = [[energy], [energy, energyout]] + scores = ['flux', 'scatter', 'scatter-P1'] + filters = [[energy], [energy, energyout], [energyout]] estimator = 'analog' keys = scores @@ -1066,7 +1062,15 @@ class ScatterMatrixXS(MultiGroupXS): def compute_xs(self, correction='None'): """Computes the multi-group scattering matrix using OpenMC - tally arithmetic.""" + tally arithmetic. + + Parameters + ---------- + correction : {'P0' or None} + If 'P0', applies the P0 transport correction to the diagonal of the + scattering matrix. + + """ # If using P0 correction subtract scatter-P1 from the diagonal if correction == 'P0': @@ -1242,7 +1246,15 @@ class NuScatterMatrixXS(ScatterMatrixXS): def compute_xs(self, correction='None'): """Computes the multi-group nu-scattering matrix using OpenMC - tally arithmetic.""" + tally arithmetic. + + Parameters + ---------- + correction : {'P0' or None} + If 'P0', applies the P0 transport correction to the diagonal of the + scattering matrix + + """ # If using P0 correction subtract scatter-P1 from the diagonal if correction == 'P0': From e40716a49bb015db33135f8fe56eb633958bf9d7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 13 Sep 2015 20:16:07 -0400 Subject: [PATCH 096/519] Began cleanup of Tally.summation(...) routine in Python API --- openmc/mgxs/mgxs.py | 6 ++--- openmc/tallies.py | 63 +++++++-------------------------------------- 2 files changed, 12 insertions(+), 57 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index a71da8cf11..590392ae8b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -392,7 +392,7 @@ class MultiGroupXS(object): # Overwrite tallies with new subdomain-averaged versions avg_xs._tallies = {} for tally_type, tally in self.tallies.items(): - tally_sum = tally.summation(filter=self.domain_type, + tally_sum = tally.summation(filter_type=self.domain_type, filter_bins=subdomains) tally_sum /= len(subdomains) avg_xs.tallies[tally_type] = tally_sum @@ -1305,7 +1305,7 @@ class Chi(MultiGroupXS): for group in range(1, self.num_groups+1): energy_bins.append(self.energy_groups.get_group_bounds(group)) - sum_nu_fission_in = nu_fission_in.summation(filter='energy', + sum_nu_fission_in = nu_fission_in.summation(filter_type='energy', filter_bins=energy_bins) # FIXME: CrossFilter for energy + energy messes up tally arithmetic @@ -1314,7 +1314,7 @@ class Chi(MultiGroupXS): self._xs_tally = nu_fission_out / sum_nu_fission_in # Normalize chi to 1.0 - norm = self.xs_tally.summation(filter='energyout', + norm = self.xs_tally.summation(filter_type='energyout', filter_bins=energy_bins) # FIXME: CrossFilter for energy + energy messes up tally arithmetic diff --git a/openmc/tallies.py b/openmc/tallies.py index 8e5292d29c..28dc451f51 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1405,35 +1405,11 @@ class Tally(object): match_filters = self.filters[:match] cross_filters = [self.filters[match:], other.filters[match:]] - ''' - # FIXME: - self_filters = set(self.filters) - other_filters = set(other.filters) - diff1 = list(self_filters.difference(other_filters)) - diff2 = list(other_filters.difference(self_filters)) - symm_diff = list(other_filters.symmetric_difference(self_filters)) - ''' - # FIXME: This must be the common longest sequence of tallies at the beginning for filter in match_filters: new_tally.add_filter(filter) - ''' - # - if len(self_filters) == 0: - for filter in self.filters: - new_tally.add_filter(filter) - for filter in self_filters: - new_tally.add_filter(filter) - # - elif len(diff2) == 0: - for filter in other.filters: - new_tally.add_filter(filter) - for filter in diff2: - new_tally.add_filter(filter) - ''' - if len(self.filters) != match and len(other.filters) == match: for filter in cross_filters[0]: new_tally.add_filter(filter) @@ -1445,19 +1421,6 @@ class Tally(object): new_filter = CrossFilter(self_filter, other_filter, binary_op) new_tally.add_filter(new_filter) - # -# else: -# all_filters = list(set([self.filters, other.filters] - ''' - if len(symm_diff) <= 1: - for filter in symm_diff: - new_tally.add_filter(filter) - else: - for self_filter, other_filter in itertools.product(*symm_diff): - new_filter = CrossFilter(self_filter, other_filter, binary_op) - new_tally.add_filter(new_filter) - ''' - # Generate score "outer products" if self.scores == other.scores: new_tally.num_score_bins = self.num_score_bins @@ -2294,7 +2257,8 @@ class Tally(object): return new_tally - def summation(self, scores=[], filter=None, filter_bins=[], nuclides=[]): + def summation(self, scores=[], filter_type=None, + filter_bins=[], nuclides=[]): """Build a sliced tally for the specified filter bins, nuclides, scores. This method constructs a new tally to encapsulate a subset of the data @@ -2308,7 +2272,7 @@ class Tally(object): A list of one or more score strings to sum across (e.g., ['absorption', 'nu-fission']; default is []) - filter : str + filter_type : str A filter type string (e.g., 'cell', 'energy') corresponding to the filter bins to sum across @@ -2348,19 +2312,13 @@ class Tally(object): nuclides = [[nuclide] for nuclide in nuclides] # Sum across any filter bins specified by the user - if filter in FILTER_TYPES.values(): + if filter_type in FILTER_TYPES.values(): filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] - filters = [[filter]] + filters = [[filter_type]] # If user did not specify a filter type, do not sum across filter bins else: filter_bins = [[]] filters = [[]] - ''' - else: -# filter_bins = list(itertools.product(*filter_bins)) - filter_bins = [[filter_bin] for filter_bin in filter_bins] - filters = [[filter]] - ''' # Initialize Tally sum tally_sum = 0 @@ -2372,10 +2330,10 @@ class Tally(object): tally_slice = self.get_slice(scores, filters, filter_bins, nuclides) # Remove filters summed across to avoid bulky CrossFilters - for filter in reversed(tally_slice.filters): - if filter.type in filters: - tally_slice.remove_filter(filter) - summed_filters[filter.type].append(filter) + if filter_type: + filter = tally_slice.find_filter(filter_type) + tally_slice.remove_filter(filter) + summed_filters[filter_type].append(filter) # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice @@ -2387,9 +2345,6 @@ class Tally(object): filters[i] = CrossFilter(filters[i-1], filters[i], '+') tally_sum.add_filter(filters[-1]) -# for filter in removed_filters: -# tally_sum.add_filter(filter) - return tally_sum def tile_filter(self, new_filter): From 13113ca82000fa6ad86b5980424dc9e4d28e5f39 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 14 Sep 2015 10:48:19 +0700 Subject: [PATCH 097/519] Fixes in FindHDF5.cmake for Intel Xeon Phi. Before, -lz -ldl -lm -lrt would be turned into absolute paths. This doesn't work for the Xeon Phi where we need to cross-compile. The Intel compiler automatically adds the libraries with the correct architecture as long as -l arguments are passed as is. --- cmake/Modules/FindHDF5.cmake | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cmake/Modules/FindHDF5.cmake b/cmake/Modules/FindHDF5.cmake index 287e10e5bf..7492ea750a 100644 --- a/cmake/Modules/FindHDF5.cmake +++ b/cmake/Modules/FindHDF5.cmake @@ -292,12 +292,8 @@ if( NOT HDF5_FOUND ) mark_as_advanced( HDF5_${LANGUAGE}_INCLUDE_DIR ) list( APPEND HDF5_INCLUDE_DIRS ${HDF5_${LANGUAGE}_INCLUDE_DIR} ) - set( HDF5_${LANGUAGE}_LIBRARY_NAMES - ${HDF5_${LANGUAGE}_LIBRARY_NAMES_INIT} - ${HDF5_${LANGUAGE}_LIBRARY_NAMES} ) - # find the HDF5 libraries - foreach( LIB ${HDF5_${LANGUAGE}_LIBRARY_NAMES} ) + foreach( LIB ${HDF5_${LANGUAGE}_LIBRARY_NAMES_INIT} ) if( UNIX AND HDF5_USE_STATIC_LIBRARIES ) # According to bug 1643 on the CMake bug tracker, this is the # preferred method for searching for a static library. @@ -325,6 +321,14 @@ if( NOT HDF5_FOUND ) endforeach() list( APPEND HDF5_LIBRARY_DIRS ${HDF5_${LANGUAGE}_LIBRARY_DIRS} ) + # When the wrapper lists a library with -l, e.g. -lz, simply use it as + # is. If find_library is called for these libraries, you end up with + # local libraries that will not be suitable when cross-compiling for the + # Intel Xeon Phi. + foreach(LIBNAME ${HDF5_${LANGUAGE}_LIBRARY_NAMES}) + list(APPEND HDF5_${LANGUAGE}_LIBRARIES "-l${LIBNAME}") + endforeach() + # Append the libraries for this language binding to the list of all # required libraries. list(APPEND HDF5_LIBRARIES ${HDF5_${LANGUAGE}_LIBRARIES}) From 6242b80c106a6db418486bf993a2dc10731b86ae Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 14 Sep 2015 15:32:49 +0700 Subject: [PATCH 098/519] Add installation instructions for the Xeon Phi. --- docs/source/quickinstall.rst | 2 +- docs/source/usersguide/install.rst | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/source/quickinstall.rst b/docs/source/quickinstall.rst index 31ca71ffc7..9ce752be7c 100644 --- a/docs/source/quickinstall.rst +++ b/docs/source/quickinstall.rst @@ -35,7 +35,7 @@ Installing from Source on Linux or Mac OS X ------------------------------------------- All OpenMC source code is hosted on GitHub_. If you have git_, the gfortran_ -compiler, CMake_, and HDF_ installed, you can download and install OpenMC be +compiler, CMake_, and HDF5_ installed, you can download and install OpenMC be entering the following commands in a terminal: .. code-block:: sh diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index 7b8c6e3d49..dcf990bdad 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -318,6 +318,25 @@ This will build an executable named ``openmc``. .. _MinGW: http://www.mingw.org .. _SourceForge: http://sourceforge.net/projects/mingw +Compiling for the Intel Xeon Phi +-------------------------------- + +In order to build OpenMC for the Intel Xeon Phi using the Intel Fortran +compiler, it is necessary to specify that all objects be compiled with the +``-mmic`` flag as follows: + +.. code-block:: sh + + mkdir build && cd build + FC=ifort FFLAGS=-mmic cmake -Dopenmp=on .. + make + +Note that unless an HDF5 build for the Intel Xeon Phi is already on your target +machine, you will need to cross-compile HDF5 for the Xeon Phi. An `example +script`_ to build zlib and HDF5 provides several necessary workarounds. + +.. _example script: https://github.com/paulromano/install-scripts/blob/master/install-hdf5-mic + Testing Build ------------- From f1b4e0ae7f2a806a4381dde286f44bd1765208a8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 14 Sep 2015 16:47:00 +0700 Subject: [PATCH 099/519] Avoid bug with PGI Fortran compiler. Apparently the PGI Fortran compiler (15.7) doesn't like variable names that are the same as module names. --- src/initialize.F90 | 36 ++++++++++++++++++------------------ src/state_point.F90 | 38 +++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/initialize.F90 b/src/initialize.F90 index bd479032f6..48985a718d 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -930,7 +930,7 @@ contains integer :: i, j ! Tally, filter loop counters integer :: n_filt ! Number of filters originally in tally logical :: count_all ! Count all cells - type(TallyObject), pointer :: tally ! Current tally + type(TallyObject), pointer :: t ! Current tally type(Universe), pointer :: univ ! Pointer to universe type(Cell), pointer :: c ! Pointer to cell integer, allocatable :: univ_list(:) ! Target offsets @@ -943,18 +943,18 @@ contains do i = 1, n_tallies ! Get pointer to tally - tally => tallies(i) + t => tallies(i) - n_filt = tally%n_filters + n_filt = t%n_filters ! Loop over the filters to determine how many additional filters ! need to be added to this tally - do j = 1, tally%n_filters + do j = 1, t%n_filters ! Determine type of filter - if (tally%filters(j)%type == FILTER_DISTRIBCELL) then + if (t%filters(j)%type == FILTER_DISTRIBCELL) then count_all = .true. - if (size(tally%filters(j)%int_bins) > 1) then + if (size(t%filters(j)%int_bins) > 1) then call fatal_error("A distribcell filter was specified with & &multiple bins. This feature is not supported.") end if @@ -975,15 +975,15 @@ contains do i = 1, n_tallies ! Get pointer to tally - tally => tallies(i) + t => tallies(i) ! Initialize the filters - do j = 1, tally%n_filters + do j = 1, t%n_filters ! Set the number of bins to the number of instances of the cell - if (tally%filters(j)%type == FILTER_DISTRIBCELL) then - c => cells(tally%filters(j)%int_bins(1)) - tally%filters(j)%n_bins = c%instances + if (t%filters(j)%type == FILTER_DISTRIBCELL) then + c => cells(t%filters(j)%int_bins(1)) + t%filters(j)%n_bins = c%instances end if end do @@ -1024,7 +1024,7 @@ contains type(SetInt) :: cell_list ! distribells to track type(Universe), pointer :: univ ! pointer to universe class(Lattice), pointer :: lat ! pointer to lattice - type(TallyObject), pointer :: tally ! pointer to tally + type(TallyObject), pointer :: t ! pointer to tally type(TallyFilter), pointer :: filter ! pointer to filter ! Begin gathering list of cells in distribcell tallies @@ -1032,10 +1032,10 @@ contains ! Populate list of distribcells to track do i = 1, n_tallies - tally => tallies(i) + t => tallies(i) - do j = 1, tally%n_filters - filter => tally%filters(j) + do j = 1, t%n_filters + filter => t%filters(j) if (filter%type == FILTER_DISTRIBCELL) then if (.not. cell_list%contains(filter%int_bins(1))) then @@ -1079,10 +1079,10 @@ contains ! Loop over all tallies do l = 1, n_tallies - tally => tallies(l) + t => tallies(l) - do m = 1, tally%n_filters - filter => tally%filters(m) + do m = 1, t%n_filters + filter => t%filters(m) ! Loop over only distribcell filters ! If filter points to cell we just found, set offset index diff --git a/src/state_point.F90 b/src/state_point.F90 index 7688d5d338..691d0567ec 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -52,7 +52,7 @@ contains integer(HID_T) :: filter_group, moments_group character(8) :: moment_name ! name of moment (e.g, P3) character(MAX_FILE_LEN) :: filename - type(StructuredMesh), pointer :: mesh + type(StructuredMesh), pointer :: meshp type(TallyObject), pointer :: tally type(ElemKeyValueII), pointer :: current type(ElemKeyValueII), pointer :: next @@ -166,16 +166,16 @@ contains ! Write information for meshes MESH_LOOP: do i = 1, n_meshes - mesh => meshes(id_array(i)) - mesh_group = create_group(meshes_group, "mesh " // trim(to_str(mesh%id))) + meshp => meshes(id_array(i)) + mesh_group = create_group(meshes_group, "mesh " // trim(to_str(meshp%id))) - call write_dataset(mesh_group, "id", mesh%id) - call write_dataset(mesh_group, "type", mesh%type) - call write_dataset(mesh_group, "n_dimension", mesh%n_dimension) - call write_dataset(mesh_group, "dimension", mesh%dimension) - call write_dataset(mesh_group, "lower_left", mesh%lower_left) - call write_dataset(mesh_group, "upper_right", mesh%upper_right) - call write_dataset(mesh_group, "width", mesh%width) + call write_dataset(mesh_group, "id", meshp%id) + call write_dataset(mesh_group, "type", meshp%type) + call write_dataset(mesh_group, "n_dimension", meshp%n_dimension) + call write_dataset(mesh_group, "dimension", meshp%dimension) + call write_dataset(mesh_group, "lower_left", meshp%lower_left) + call write_dataset(mesh_group, "upper_right", meshp%upper_right) + call write_dataset(mesh_group, "width", meshp%width) call close_group(mesh_group) end do MESH_LOOP @@ -600,7 +600,7 @@ contains character(MAX_FILE_LEN) :: path_temp character(19) :: current_time character(8) :: moment_name ! name of moment (e.g, P3, Y-1,1) - type(StructuredMesh), pointer :: mesh + type(StructuredMesh), pointer :: meshp type(TallyObject), pointer :: tally ! Write message @@ -718,18 +718,18 @@ contains ! Read and overwrite mesh information MESH_LOOP: do i = 1, n_meshes - mesh => meshes(id_array(i)) + meshp => meshes(id_array(i)) curr_key = key_array(id_array(i)) mesh_group = open_group(meshes_group, "mesh " // & trim(to_str(curr_key))) - call read_dataset(mesh_group, "id", mesh%id) - call read_dataset(mesh_group, "type", mesh%type) - call read_dataset(mesh_group, "n_dimension", mesh%n_dimension) - call read_dataset(mesh_group, "dimension", mesh%dimension) - call read_dataset(mesh_group, "lower_left", mesh%lower_left) - call read_dataset(mesh_group, "upper_right", mesh%upper_right) - call read_dataset(mesh_group, "width", mesh%width) + call read_dataset(mesh_group, "id", meshp%id) + call read_dataset(mesh_group, "type", meshp%type) + call read_dataset(mesh_group, "n_dimension", meshp%n_dimension) + call read_dataset(mesh_group, "dimension", meshp%dimension) + call read_dataset(mesh_group, "lower_left", meshp%lower_left) + call read_dataset(mesh_group, "upper_right", meshp%upper_right) + call read_dataset(mesh_group, "width", meshp%width) call close_group(mesh_group) end do MESH_LOOP From 63a378bd93fb10f343e21062bad3f4c4cc63d72c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 14 Sep 2015 20:36:51 +0700 Subject: [PATCH 100/519] Make sure -L flags from HDF5 wrapper are passed --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 76c099d52b..36501c9185 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,6 +262,11 @@ else() target_compile_options(${program} PUBLIC ${f90flags}) endif() +# Add HDF5 library directories to link line with -L +foreach(LIBDIR ${HDF5_LIBRARY_DIRS}) + list(APPEND ldflags "-L${LIBDIR}") +endforeach() + # target_link_libraries treats any arguments starting with - but not -l as # linker flags. Thus, we can pass both linker flags and libraries together. target_link_libraries(${program} ${ldflags} ${HDF5_LIBRARIES} fox_dom) From 61ed62b8cf7a560fa5e196341372744f2e47eb3a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 14 Sep 2015 17:47:52 -0400 Subject: [PATCH 101/519] Hotfix for Python summary API resulting from changes made in f8bfa401cb42cd034084cb09e6edf98e3e3749f2 --- openmc/summary.py | 81 ++++++++++++++++++++++++----------------------- src/summary.F90 | 2 +- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 7f9d5387e9..60041ce82e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -31,18 +31,18 @@ class Summary(object): def _read_metadata(self): # Read OpenMC version - self.version = [self._f['version_major'][0], - self._f['version_minor'][0], - self._f['version_release'][0]] + self.version = [self._f['version_major'].value, + self._f['version_minor'].value, + self._f['version_release'].value] # Read date and time self.date_and_time = self._f['date_and_time'][...] - self.n_batches = self._f['n_batches'][0] - self.n_particles = self._f['n_particles'][0] - self.n_active = self._f['n_active'][0] - self.n_inactive = self._f['n_inactive'][0] - self.gen_per_batch = self._f['gen_per_batch'][0] - self.n_procs = self._f['n_procs'][0] + self.n_batches = self._f['n_batches'].value + self.n_particles = self._f['n_particles'].value + self.n_active = self._f['n_active'].value + self.n_inactive = self._f['n_inactive'].value + self.gen_per_batch = self._f['gen_per_batch'].value + self.n_procs = self._f['n_procs'].value def _read_geometry(self): # Read in and initialize the Materials and Geometry @@ -55,7 +55,7 @@ class Summary(object): self._finalize_geometry() def _read_nuclides(self): - self.n_nuclides = self._f['nuclides/n_nuclides'][0] + self.n_nuclides = self._f['nuclides/n_nuclides'] # Initialize dictionary for each Nuclide # Keys - Nuclide ZAIDs @@ -66,9 +66,9 @@ class Summary(object): if key == 'n_nuclides': continue - index = self._f['nuclides'][key]['index'][0] + index = self._f['nuclides'][key]['index'].value alias = self._f['nuclides'][key]['alias'][0] - zaid = self._f['nuclides'][key]['zaid'][0] + zaid = self._f['nuclides'][key]['zaid'].value # Read the Nuclide's name (e.g., 'H-1' or 'U-235') name = alias.split('.')[0] @@ -84,7 +84,7 @@ class Summary(object): self.nuclides[zaid].zaid = zaid def _read_materials(self): - self.n_materials = self._f['materials/n_materials'][0] + self.n_materials = self._f['n_materials'].value # Initialize dictionary for each Material # Keys - Material keys @@ -96,19 +96,20 @@ class Summary(object): continue material_id = int(key.lstrip('material ')) - index = self._f['materials'][key]['index'][0] + index = self._f['materials'][key]['index'].value name = self._f['materials'][key]['name'][0] - density = self._f['materials'][key]['atom_density'][0] + density = self._f['materials'][key]['atom_density'].value nuc_densities = self._f['materials'][key]['nuclide_densities'][...] nuclides = self._f['materials'][key]['nuclides'][...] - n_sab = self._f['materials'][key]['n_sab'][0] + n_sab = self._f['materials'][key]['n_sab'].value sab_names = [] sab_xs = [] # Read the names of the S(a,b) tables for this Material for i in range(1, n_sab+1): - sab_table = self._f['materials'][key]['sab_tables'][str(i)][0] + sab_table = \ + self._f['materials'][key]['sab_tables'][str(i)].value # Read the cross-section identifiers for each S(a,b) table sab_names.append(sab_table.split('.')[0]) @@ -140,7 +141,7 @@ class Summary(object): self.materials[index] = material def _read_surfaces(self): - self.n_surfaces = self._f['geometry/n_surfaces'][0] + self.n_surfaces = self._f['geometry/n_surfaces'].value # Initialize dictionary for each Surface # Keys - Surface keys @@ -152,9 +153,9 @@ class Summary(object): continue surface_id = int(key.lstrip('surface ')) - index = self._f['geometry/surfaces'][key]['index'][0] + index = self._f['geometry/surfaces'][key]['index'].value name = self._f['geometry/surfaces'][key]['name'][0] - surf_type = self._f['geometry/surfaces'][key]['type'][...][0] + surf_type = self._f['geometry/surfaces'][key]['type'][...] bc = self._f['geometry/surfaces'][key]['boundary_condition'][...][0] coeffs = self._f['geometry/surfaces'][key]['coefficients'][...] @@ -220,7 +221,7 @@ class Summary(object): self.surfaces[index] = surface def _read_cells(self): - self.n_cells = self._f['geometry/n_cells'][0] + self.n_cells = self._f['geometry/n_cells'].value # Initialize dictionary for each Cell # Keys - Cell keys @@ -240,16 +241,16 @@ class Summary(object): continue cell_id = int(key.lstrip('cell ')) - index = self._f['geometry/cells'][key]['index'][0] + index = self._f['geometry/cells'][key]['index'].value name = self._f['geometry/cells'][key]['name'][0] fill_type = self._f['geometry/cells'][key]['fill_type'][...][0] if fill_type == 'normal': - fill = self._f['geometry/cells'][key]['material'][0] + fill = self._f['geometry/cells'][key]['material'].value elif fill_type == 'universe': - fill = self._f['geometry/cells'][key]['fill'][0] + fill = self._f['geometry/cells'][key]['fill'].value else: - fill = self._f['geometry/cells'][key]['lattice'][0] + fill = self._f['geometry/cells'][key]['lattice'].value if 'surfaces' in self._f['geometry/cells'][key].keys(): surfaces = self._f['geometry/cells'][key]['surfaces'][...] @@ -264,7 +265,7 @@ class Summary(object): if maps > 0: offset = self._f['geometry/cells'][key]['offset'][...] - cell.set_offset(offset) + cell.offsets = offset translated = self._f['geometry/cells'][key]['translated'][0] if translated: @@ -295,7 +296,7 @@ class Summary(object): self.cells[index] = cell def _read_universes(self): - self.n_universes = self._f['geometry/n_universes'][0] + self.n_universes = self._f['geometry/n_universes'].value # Initialize dictionary for each Universe # Keys - Universe keys @@ -307,7 +308,7 @@ class Summary(object): continue universe_id = int(key.lstrip('universe ')) - index = self._f['geometry/universes'][key]['index'][0] + index = self._f['geometry/universes'][key]['index'].value cells = self._f['geometry/universes'][key]['cells'][...] # Create this Universe @@ -322,7 +323,7 @@ class Summary(object): self.universes[index] = universe def _read_lattices(self): - self.n_lattices = self._f['geometry/n_lattices'][0] + self.n_lattices = self._f['geometry/n_lattices'].value # Initialize lattices for each Lattice # Keys - Lattice keys @@ -334,11 +335,11 @@ class Summary(object): continue lattice_id = int(key.lstrip('lattice ')) - index = self._f['geometry/lattices'][key]['index'][0] - name = self._f['geometry/lattices'][key]['name'][0] + index = self._f['geometry/lattices'][key]['index'].value + name = self._f['geometry/lattices'][key]['name'][...][0] lattice_type = self._f['geometry/lattices'][key]['type'][...][0] - maps = self._f['geometry/lattices'][key]['maps'][0] - offset_size = self._f['geometry/lattices'][key]['offset_size'][0] + maps = self._f['geometry/lattices'][key]['maps'].value + offset_size = self._f['geometry/lattices'][key]['offset_size'].value if offset_size > 0: offsets = self._f['geometry/lattices'][key]['offsets'][...] @@ -348,7 +349,7 @@ class Summary(object): lower_left = \ self._f['geometry/lattices'][key]['lower_left'][...] pitch = self._f['geometry/lattices'][key]['pitch'][...] - outer = self._f['geometry/lattices'][key]['outer'][0] + outer = self._f['geometry/lattices'][key]['outer'].value universe_ids = \ self._f['geometry/lattices'][key]['universes'][...] @@ -521,7 +522,7 @@ class Summary(object): self.n_tallies = 0 return - self.n_tallies = self._f['tallies/n_tallies'][0] + self.n_tallies = self._f['tallies/n_tallies'].value # OpenMC Tally keys all_keys = self._f['tallies/'].keys() @@ -536,9 +537,9 @@ class Summary(object): subbase = '{0}{1}'.format(base, tally_id) # Read Tally name metadata - name_size = self._f['{0}/name_size'.format(subbase)][0] + name_size = self._f['{0}/name_size'.format(subbase)][...] if (name_size > 0): - tally_name = self._f['{0}/name'.format(subbase)][0] + tally_name = self._f['{0}/name'.format(subbase)][...][0] tally_name = tally_name.lstrip('[\'') tally_name = tally_name.rstrip('\']') else: @@ -555,7 +556,7 @@ class Summary(object): tally.num_score_bins = num_score_bins # Read filter metadata - num_filters = self._f['{0}/n_filters'.format(subbase)][0] + num_filters = self._f['{0}/n_filters'.format(subbase)].value # Initialize all Filters for j in range(1, num_filters+1): @@ -563,11 +564,11 @@ class Summary(object): subsubbase = '{0}/filter {1}'.format(subbase, j) # Read filter type (e.g., "cell", "energy", etc.) - filter_type_code = self._f['{0}/type'.format(subsubbase)][0] + filter_type_code = self._f['{0}/type'.format(subsubbase)].value filter_type = openmc.FILTER_TYPES[filter_type_code] # Read the filter bins - num_bins = self._f['{0}/n_bins'.format(subsubbase)][0] + num_bins = self._f['{0}/n_bins'.format(subsubbase)].value bins = self._f['{0}/bins'.format(subsubbase)][...] # Create Filter object diff --git a/src/summary.F90 b/src/summary.F90 index cc9a909c88..0147230a0a 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -191,7 +191,7 @@ contains ! WRITE INFORMATION ON SURFACES ! Create surfaces group - surfaces_group = create_group(file_id, "surfaces") + surfaces_group = create_group(geom_group, "surfaces") ! Write information on each surface SURFACE_LOOP: do i = 1, n_surfaces From ba659b3f0cd1634e54362fc2c672d410ea239d31 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 14 Sep 2015 20:45:21 -0400 Subject: [PATCH 102/519] Fix PyAPI filter for numpy isinstance bug --- openmc/filter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 5a81906762..b9b6df36b5 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -7,7 +7,7 @@ import numpy as np from openmc import Mesh from openmc.constants import * from openmc.checkvalue import check_type, check_iterable_type, \ - check_greater_than + check_greater_than, _isinstance class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally @@ -126,7 +126,7 @@ class Filter(object): raise ValueError(msg) # If the bin edge is a single value, it is a Cell, Material, etc. ID - if not isinstance(bins, Iterable): + if not _isinstance(bins, Iterable): bins = [bins] # If the bins are in a collection, convert it to a list @@ -141,7 +141,7 @@ class Filter(object): elif self._type in ['energy', 'energyout']: for edge in bins: - if not 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) @@ -165,7 +165,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 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) From b9379e3c8667d062ec6511ad07f2525ea0b2f5ef Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 14 Sep 2015 21:05:58 -0400 Subject: [PATCH 103/519] Make test cleanup source file --- .../test_statepoint_sourcesep/test_statepoint_sourcesep.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py index acbb0180bf..157210de6f 100644 --- a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py +++ b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py @@ -15,6 +15,13 @@ class SourcepointTestHarness(TestHarness): assert source[0].endswith('h5'), \ 'Source file is not a HDF5 file.' + def _cleanup(self): + TestHarness._cleanup(self) + output = glob.glob(os.path.join(os.getcwd(), 'source.*')) + for f in output: + if os.path.exists(f): + os.remove(f) + if __name__ == '__main__': harness = SourcepointTestHarness('statepoint.10.*') From fb518a4d7ce663f371723a1d470908ad98b7cd03 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 14 Sep 2015 21:42:25 -0400 Subject: [PATCH 104/519] Make os and glob imports explicit --- tests/test_entropy/test_entropy.py | 3 +++ tests/test_filter_distribcell/test_filter_distribcell.py | 2 ++ tests/test_fixed_source/test_fixed_source.py | 3 +++ tests/test_output/test_output.py | 3 +++ tests/test_source_file/test_source_file.py | 3 +++ tests/test_sourcepoint_batch/test_sourcepoint_batch.py | 3 +++ tests/test_sourcepoint_interval/test_sourcepoint_interval.py | 3 +++ tests/test_sourcepoint_latest/test_sourcepoint_latest.py | 3 +++ tests/test_statepoint_restart/test_statepoint_restart.py | 3 +++ tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py | 3 +++ tests/test_track_output/test_track_output.py | 2 ++ 11 files changed, 31 insertions(+) diff --git a/tests/test_entropy/test_entropy.py b/tests/test_entropy/test_entropy.py index 4657101ad6..9b13fd3dd2 100644 --- a/tests/test_entropy/test_entropy.py +++ b/tests/test_entropy/test_entropy.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_filter_distribcell/test_filter_distribcell.py b/tests/test_filter_distribcell/test_filter_distribcell.py index 8370e40e7f..541d6b6af1 100644 --- a/tests/test_filter_distribcell/test_filter_distribcell.py +++ b/tests/test_filter_distribcell/test_filter_distribcell.py @@ -1,6 +1,8 @@ #!/usr/bin/env python +import glob import hashlib +import os import sys sys.path.insert(0, '..') diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index e96a3ad8fe..1f154a4657 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_output/test_output.py b/tests/test_output/test_output.py index 0225d9fed0..b37b7d07b2 100644 --- a/tests/test_output/test_output.py +++ b/tests/test_output/test_output.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_source_file/test_source_file.py b/tests/test_source_file/test_source_file.py index d7ed8b80af..fae6b2a72f 100644 --- a/tests/test_source_file/test_source_file.py +++ b/tests/test_source_file/test_source_file.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index a902236599..521e3bb4b2 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index a902236599..521e3bb4b2 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py index 8c04641b7b..7d0af89b97 100644 --- a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py +++ b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_statepoint_restart/test_statepoint_restart.py b/tests/test_statepoint_restart/test_statepoint_restart.py index 0420dbddfa..dd42dc8ff5 100644 --- a/tests/test_statepoint_restart/test_statepoint_restart.py +++ b/tests/test_statepoint_restart/test_statepoint_restart.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py index 157210de6f..c7221c90c2 100644 --- a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py +++ b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py @@ -1,6 +1,9 @@ #!/usr/bin/env python +import glob +import os import sys + sys.path.insert(0, '..') from testing_harness import * diff --git a/tests/test_track_output/test_track_output.py b/tests/test_track_output/test_track_output.py index 1192d1b3a3..dc0eb1a69d 100644 --- a/tests/test_track_output/test_track_output.py +++ b/tests/test_track_output/test_track_output.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +import glob +import os import shutil import sys From 3eee7a7301cf394f56e2ceb47e4689c07f6bfd27 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 15 Sep 2015 00:05:55 -0400 Subject: [PATCH 105/519] Hotfix for translations, rotations in Summary Python API --- openmc/summary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 60041ce82e..6fb487414e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -261,20 +261,20 @@ class Summary(object): cell = openmc.Cell(cell_id=cell_id, name=name) if fill_type == 'universe': - maps = self._f['geometry/cells'][key]['maps'][0] + maps = self._f['geometry/cells'][key]['maps'].value if maps > 0: offset = self._f['geometry/cells'][key]['offset'][...] cell.offsets = offset - translated = self._f['geometry/cells'][key]['translated'][0] + translated = self._f['geometry/cells'][key]['translated'].value if translated: translation = \ self._f['geometry/cells'][key]['translation'][...] translation = np.asarray(translation, dtype=np.float64) cell.translation = translation - rotated = self._f['geometry/cells'][key]['rotated'][0] + rotated = self._f['geometry/cells'][key]['rotated'].value if rotated: rotation = \ self._f['geometry/cells'][key]['rotation'][...] From 8b877960a7a583961ff351472216ad3528942522 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 07:10:36 +0700 Subject: [PATCH 106/519] Read/write strings in hdf5_interface as C null-terminated strings. --- openmc/statepoint.py | 10 ++--- openmc/summary.py | 18 ++++---- src/hdf5_interface.F90 | 95 +++++++++++++++++++++++------------------- 3 files changed, 66 insertions(+), 57 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 06ed51c18d..986d624f90 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -170,10 +170,10 @@ class StatePoint(object): self._f['version_release'].value] # Read date and time - self._date_and_time = self._f['date_and_time'].value[0] + self._date_and_time = self._f['date_and_time'].value.decode() # Read path - self._path = self._f['path'].value[0].strip() + self._path = self._f['path'].value.decode() # Read random number seed self._seed = self._f['seed'].value @@ -398,10 +398,8 @@ class StatePoint(object): # Extract the moment order string for each score for k in range(len(scores)): - moment = str(self._f['{0}order{1}'.format( - subbase, k+1)].value[0]) - moment = moment.lstrip('[\'') - moment = moment.rstrip('\']') + moment = self._f['{0}order{1}'.format( + subbase, k+1)].value.decode() # Remove extra whitespace moment.replace(" ", "") diff --git a/openmc/summary.py b/openmc/summary.py index 6fb487414e..088ff29d14 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -67,7 +67,7 @@ class Summary(object): continue index = self._f['nuclides'][key]['index'].value - alias = self._f['nuclides'][key]['alias'][0] + alias = self._f['nuclides'][key]['alias'].value.decode() zaid = self._f['nuclides'][key]['zaid'].value # Read the Nuclide's name (e.g., 'H-1' or 'U-235') @@ -97,7 +97,7 @@ class Summary(object): material_id = int(key.lstrip('material ')) index = self._f['materials'][key]['index'].value - name = self._f['materials'][key]['name'][0] + name = self._f['materials'][key]['name'].value.decode() density = self._f['materials'][key]['atom_density'].value nuc_densities = self._f['materials'][key]['nuclide_densities'][...] nuclides = self._f['materials'][key]['nuclides'][...] @@ -154,9 +154,9 @@ class Summary(object): surface_id = int(key.lstrip('surface ')) index = self._f['geometry/surfaces'][key]['index'].value - name = self._f['geometry/surfaces'][key]['name'][0] - surf_type = self._f['geometry/surfaces'][key]['type'][...] - bc = self._f['geometry/surfaces'][key]['boundary_condition'][...][0] + name = self._f['geometry/surfaces'][key]['name'].value.decode() + surf_type = self._f['geometry/surfaces'][key]['type'].value.decode() + bc = self._f['geometry/surfaces'][key]['boundary_condition'].value.decode() coeffs = self._f['geometry/surfaces'][key]['coefficients'][...] # Create the Surface based on its type @@ -242,8 +242,8 @@ class Summary(object): cell_id = int(key.lstrip('cell ')) index = self._f['geometry/cells'][key]['index'].value - name = self._f['geometry/cells'][key]['name'][0] - fill_type = self._f['geometry/cells'][key]['fill_type'][...][0] + name = self._f['geometry/cells'][key]['name'].value.decode() + fill_type = self._f['geometry/cells'][key]['fill_type'].value.decode() if fill_type == 'normal': fill = self._f['geometry/cells'][key]['material'].value @@ -336,8 +336,8 @@ class Summary(object): lattice_id = int(key.lstrip('lattice ')) index = self._f['geometry/lattices'][key]['index'].value - name = self._f['geometry/lattices'][key]['name'][...][0] - lattice_type = self._f['geometry/lattices'][key]['type'][...][0] + name = self._f['geometry/lattices'][key]['name'].value.decode() + lattice_type = self._f['geometry/lattices'][key]['type'].value.decode() maps = self._f['geometry/lattices'][key]['maps'].value offset_size = self._f['geometry/lattices'][key]['offset_size'].value diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 5e0734648c..aa7e762f34 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1469,10 +1469,9 @@ contains subroutine write_string(group_id, name, buffer, indep) integer(HID_T), intent(in) :: group_id character(*), intent(in) :: name ! name for data - character(*), intent(in) :: buffer ! read data to here + character(*), intent(in), target :: buffer ! read data to here logical, intent(in), optional :: indep ! independent I/O - integer :: n integer :: hdf5_err integer :: data_xfer_mode #ifdef PHDF5 @@ -1480,9 +1479,10 @@ contains #endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle - integer(HSIZE_T) :: dims1(1) - integer(HSIZE_T) :: dims2(2) - character(len=len_trim(buffer)), dimension(1) :: str_tmp + integer(HID_T) :: filetype + integer(HID_T) :: memtype + integer(HSIZE_T) :: n + type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O data_xfer_mode = H5FD_MPIO_COLLECTIVE_F @@ -1490,37 +1490,37 @@ contains if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F end if - ! Insert null character at end of string when writing - call h5tset_strpad_f(H5T_STRING, H5T_STR_NULLPAD_F, hdf5_err) - - ! Create the dataspace and dataset - dims1(1) = 1 - call h5screate_simple_f(1, dims1, dspace, hdf5_err) - call h5dcreate_f(group_id, trim(name), H5T_STRING, dspace, dset, hdf5_err) - - ! Set up dimesnions of string to write + ! Create datatype for HDF5 file based on C char n = len_trim(buffer) - dims2(:) = [n, 1] ! full array of strings to write - dims1(1) = n ! length of string + call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) + call h5tset_size_f(filetype, n + 1, hdf5_err) - ! Copy over string buffer to a rank 1 array - str_tmp(1) = buffer + ! Create datatype in memory based on Fortran character + call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) + if (n > 0) call h5tset_size_f(memtype, n, hdf5_err) + + ! Create dataspace/dataset + call h5screate_f(H5S_SCALAR_F, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), filetype, dspace, dset, hdf5_err) + + ! Get pointer to start of string + f_ptr = c_loc(buffer(1:1)) if (using_mpio_device(group_id)) then #ifdef PHDF5 call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) - call h5dwrite_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace, xfer_prp=plist) + if (n > 0) call h5dwrite_f(dset, memtype, f_ptr, hdf5_err, xfer_prp=plist) call h5pclose_f(plist, hdf5_err) #endif else - call h5dwrite_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace) + if (n > 0) call h5dwrite_f(dset, memtype, f_ptr, hdf5_err) end if call h5dclose_f(dset, hdf5_err) call h5sclose_f(dspace, hdf5_err) + call h5tclose_f(memtype, hdf5_err) + call h5tclose_f(filetype, hdf5_err) end subroutine write_string !=============================================================================== @@ -1529,11 +1529,10 @@ contains subroutine read_string(group_id, name, buffer, indep) integer(HID_T), intent(in) :: group_id - character(*), intent(in) :: name ! name for data - character(*), intent(inout) :: buffer ! read data to here - logical, intent(in), optional :: indep ! independent I/O + character(*), intent(in) :: name ! name for data + character(*), intent(inout), target :: buffer ! read data to here + logical, intent(in), optional :: indep ! independent I/O - integer :: n integer :: hdf5_err integer :: data_xfer_mode #ifdef PHDF5 @@ -1541,9 +1540,11 @@ contains #endif integer(HID_T) :: dset ! data set handle integer(HID_T) :: dspace ! data or file space handle - integer(HSIZE_T) :: dims1(1) - integer(HSIZE_T) :: dims2(2) - character(len=len_trim(buffer)), dimension(1) :: str_tmp + integer(HID_T) :: filetype + integer(HID_T) :: memtype + integer(HSIZE_T) :: size + integer(HSIZE_T) :: n + type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O data_xfer_mode = H5FD_MPIO_COLLECTIVE_F @@ -1551,32 +1552,42 @@ contains if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F end if - ! Set up dimesnions of string to write - n = len_trim(buffer) - dims2(:) = [n, 1] ! full array of strings to write - dims1(1) = n ! length of string - + ! Get dataset and dataspace call h5dopen_f(group_id, trim(name), dset, hdf5_err) call h5dget_space_f(dset, dspace, hdf5_err) + ! Make sure buffer is large enough + call h5dget_type_f(dset, filetype, hdf5_err) + call h5tget_size_f(filetype, size, hdf5_err) + if (size > len(buffer) + 1) then + call fatal_error("Character buffer is not long enough to & + &read HDF5 string.") + end if + + ! Get datatype in memory based on Fortran character + n = len(buffer) + call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) + call h5tset_size_f(memtype, n, hdf5_err) + + ! Get pointer to start of string + f_ptr = c_loc(buffer(1:1)) + if (using_mpio_device(group_id)) then #ifdef PHDF5 call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) - call h5dread_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace, xfer_prp=plist) + call h5dread_f(dset, memtype, f_ptr, hdf5_err, mem_space_id=dspace, & + xfer_prp=plist) call h5pclose_f(plist, hdf5_err) #endif else - call h5dread_vl_f(dset, H5T_STRING, str_tmp, dims2, dims1, hdf5_err, & - mem_space_id=dspace) + call h5dread_f(dset, memtype, f_ptr, hdf5_err, mem_space_id=dspace) end if - ! Copy over buffer - buffer = str_tmp(1) - - ! Close dataset call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + call h5tclose_f(filetype, hdf5_err) + call h5tclose_f(memtype, hdf5_err) end subroutine read_string !=============================================================================== From bc5bdeccc65cff81ae6c27fc25398849bafe852c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 07:36:19 +0700 Subject: [PATCH 107/519] Remove unused procedures in output module related to summary --- src/output.F90 | 688 ------------------------------------------------- 1 file changed, 688 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index 2ddbf6499d..6c7834b9b7 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -315,694 +315,6 @@ contains end subroutine print_particle -!=============================================================================== -! PRINT_REACTION displays the attributes of a reaction -!=============================================================================== - - subroutine print_reaction(rxn) - - type(Reaction), pointer :: rxn - - write(ou,*) 'Reaction ' // reaction_name(rxn % MT) - write(ou,*) ' MT = ' // to_str(rxn % MT) - write(ou,*) ' Q-value = ' // to_str(rxn % Q_value) - write(ou,*) ' Multiplicity = ' // to_str(rxn % multiplicity) - write(ou,*) ' Threshold = ' // to_str(rxn % threshold) - if (rxn % has_energy_dist) then - write(ou,*) ' Energy: Law ' // to_str(rxn % edist % law) - end if - write(ou,*) - - end subroutine print_reaction - -!=============================================================================== -! PRINT_CELL displays the attributes of a cell -!=============================================================================== - - subroutine print_cell(c, unit) - - type(Cell), pointer :: c - integer, optional :: unit ! specified unit to write to - - integer :: index_cell ! index in cells array - integer :: i ! loop index for surfaces - integer :: index_surf ! index in surfaces array - integer :: unit_ ! unit to write to - character(MAX_LINE_LEN) :: string - type(Universe), pointer :: u => null() - class(Lattice), pointer :: l => null() - type(Material), pointer :: m => null() - - ! Set unit to stdout if not already set - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write user-specified id for cell - write(unit_,*) 'Cell ' // to_str(c % id) - - ! Write user-specified name for cell - write(unit_,*) ' Name = ' // c % name - - ! Find index in cells array and write - index_cell = cell_dict % get_key(c % id) - write(unit_,*) ' Array Index = ' // to_str(index_cell) - - ! Write what universe this cell is in - u => universes(c % universe) - write(unit_,*) ' Universe = ' // to_str(u % id) - - ! Write information on fill for cell - select case (c % type) - case (CELL_NORMAL) - write(unit_,*) ' Fill = NONE' - case (CELL_FILL) - u => universes(c % fill) - write(unit_,*) ' Fill = Universe ' // to_str(u % id) - case (CELL_LATTICE) - l => lattices(c % fill) % obj - write(unit_,*) ' Fill = Lattice ' // to_str(l % id) - end select - - ! Write information on material - if (c % material == 0) then - write(unit_,*) ' Material = NONE' - elseif (c % material == MATERIAL_VOID) then - write(unit_,*) ' Material = Void' - else - m => materials(c % material) - write(unit_,*) ' Material = ' // to_str(m % id) - end if - - ! Write surface specification - string = "" - do i = 1, c % n_surfaces - select case (c % surfaces(i)) - case (OP_LEFT_PAREN) - string = trim(string) // ' (' - case (OP_RIGHT_PAREN) - string = trim(string) // ' )' - case (OP_UNION) - string = trim(string) // ' :' - case (OP_DIFFERENCE) - string = trim(string) // ' !' - case default - index_surf = abs(c % surfaces(i)) - string = trim(string) // ' ' // to_str(sign(& - surfaces(index_surf) % id, c % surfaces(i))) - end select - end do - write(unit_,*) ' Surface Specification:' // trim(string) - write(unit_,*) - - end subroutine print_cell - -!=============================================================================== -! PRINT_UNIVERSE displays the attributes of a universe -!=============================================================================== - - subroutine print_universe(univ, unit) - - type(Universe), pointer :: univ - integer, optional :: unit - - integer :: i ! loop index for cells in this universe - integer :: unit_ ! unit to write to - character(MAX_LINE_LEN) :: string - type(Cell), pointer :: c => null() - type(Universe), pointer :: base_u => null() - - ! Set default unit to stdout if not specified - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Get a pointer to the base universe - base_u => universes(BASE_UNIVERSE) - - ! Write user-specified id for this universe - write(unit_,*) 'Universe ' // to_str(univ % id) - - ! If this is the base universe, indicate so - if (associated(univ, base_u)) then - write(unit_,*) ' Base Universe' - end if - - ! Write list of cells in this universe - string = "" - do i = 1, univ % n_cells - c => cells(univ % cells(i)) - string = trim(string) // ' ' // to_str(c % id) - end do - write(unit_,*) ' Cells =' // trim(string) - write(unit_,*) - - end subroutine print_universe - -!=============================================================================== -! PRINT_LATTICE displays the attributes of a lattice -!=============================================================================== - - subroutine print_lattice(lat, unit) - - class(Lattice), pointer :: lat - integer, optional :: unit - - integer :: unit_ ! unit to write to - - ! set default unit if not specified - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write information about lattice - write(unit_,*) 'Lattice ' // to_str(lat % id) - - ! Write user-specified name for lattice - write(unit_,*) ' Name = ' // lat % name - - select type(lat) - type is (RectLattice) - ! Write dimension of lattice. - if (lat % is_3d) then - write(unit_, *) ' Dimension = ' // to_str(lat % n_cells(1)) & - &// ' ' // to_str(lat % n_cells(2)) // ' ' & - &// to_str(lat % n_cells(3)) - else - write(unit_, *) ' Dimension = ' // to_str(lat % n_cells(1)) & - &// ' ' // to_str(lat % n_cells(2)) - end if - - ! Write lower-left coordinates of lattice. - if (lat % is_3d) then - write(unit_, *) ' Lower-left = ' // to_str(lat % lower_left(1)) & - &// ' ' // to_str(lat % lower_left(2)) // ' ' & - &// to_str(lat % lower_left(3)) - else - write(unit_, *) ' Lower-left = ' // to_str(lat % lower_left(1)) & - &// ' ' // to_str(lat % lower_left(2)) - end if - - ! Write lattice pitch along each axis. - if (lat % is_3d) then - write(unit_, *) ' Pitch = ' // to_str(lat % pitch(1)) & - &// ' ' // to_str(lat % pitch(2)) // ' ' & - &// to_str(lat % pitch(3)) - else - write(unit_, *) ' Pitch = ' // to_str(lat % pitch(1)) & - &// ' ' // to_str(lat % pitch(2)) - end if - write(unit_,*) - - type is (HexLattice) - ! Write dimension of lattice. - write(unit_,*) ' N-rings = ' // to_str(lat % n_rings) - if (lat % is_3d) write(unit_,*) ' N-axial = ' // to_str(lat % n_axial) - - ! Write center coordinates of lattice. - if (lat % is_3d) then - write(unit_, *) ' Center = ' // to_str(lat % center(1)) & - &// ' ' // to_str(lat % center(2)) // ' ' & - &// to_str(lat % center(3)) - else - write(unit_, *) ' Center = ' // to_str(lat % center(1)) & - &// ' ' // to_str(lat % center(2)) - end if - - ! Write lattice pitch along each axis. - if (lat % is_3d) then - write(unit_, *) ' Pitch = ' // to_str(lat % pitch(1)) & - &// ' ' // to_str(lat % pitch(2)) - else - write(unit_, *) ' Pitch = ' // to_str(lat % pitch(1)) - end if - write(unit_,*) - end select - - - end subroutine print_lattice - -!=============================================================================== -! PRINT_SURFACE displays the attributes of a surface -!=============================================================================== - - subroutine print_surface(surf, unit) - - type(Surface), pointer :: surf - integer, optional :: unit ! specified unit to write to - - integer :: i ! loop index for coefficients - integer :: unit_ ! unit to write to - character(MAX_LINE_LEN) :: string - type(Cell), pointer :: c => null() - - ! set default unit if not specified - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write user-specified id of surface - write(unit_,*) 'Surface ' // to_str(surf % id) - - ! Write user-specified name for surface - write(unit_,*) ' Name = ' // surf % name - - ! Write type of surface - select case (surf % type) - case (SURF_PX) - string = "X Plane" - case (SURF_PY) - string = "Y Plane" - case (SURF_PZ) - string = "Z Plane" - case (SURF_PLANE) - string = "Plane" - case (SURF_CYL_X) - string = "X Cylinder" - case (SURF_CYL_Y) - string = "Y Cylinder" - case (SURF_CYL_Z) - string = "Z Cylinder" - case (SURF_SPHERE) - string = "Sphere" - case (SURF_CONE_X) - string = "X Cone" - case (SURF_CONE_Y) - string = "Y Cone" - case (SURF_CONE_Z) - string = "Z Cone" - end select - write(unit_,*) ' Type = ' // trim(string) - - ! Write coefficients for this surface - string = "" - do i = 1, size(surf % coeffs) - string = trim(string) // ' ' // to_str(surf % coeffs(i), 4) - end do - write(unit_,*) ' Coefficients = ' // trim(string) - - ! Write neighboring cells on positive side of this surface - string = "" - if (allocated(surf % neighbor_pos)) then - do i = 1, size(surf % neighbor_pos) - c => cells(abs(surf % neighbor_pos(i))) - string = trim(string) // ' ' // to_str(& - sign(c % id, surf % neighbor_pos(i))) - end do - end if - write(unit_,*) ' Positive Neighbors = ' // trim(string) - - ! Write neighboring cells on negative side of this surface - string = "" - if (allocated(surf % neighbor_neg)) then - do i = 1, size(surf % neighbor_neg) - c => cells(abs(surf % neighbor_neg(i))) - string = trim(string) // ' ' // to_str(& - sign(c % id, surf % neighbor_neg(i))) - end do - end if - write(unit_,*) ' Negative Neighbors =' // trim(string) - - ! Write boundary condition for this surface - select case (surf % bc) - case (BC_TRANSMIT) - write(unit_,*) ' Boundary Condition = Transmission' - case (BC_VACUUM) - write(unit_,*) ' Boundary Condition = Vacuum' - case (BC_REFLECT) - write(unit_,*) ' Boundary Condition = Reflective' - case (BC_PERIODIC) - write(unit_,*) ' Boundary Condition = Periodic' - end select - write(unit_,*) - - end subroutine print_surface - -!=============================================================================== -! PRINT_MATERIAL displays the attributes of a material -!=============================================================================== - - subroutine print_material(mat, unit) - - type(Material), pointer :: mat - integer, optional :: unit - - integer :: i ! loop index for nuclides - integer :: unit_ ! unit to write to - real(8) :: density ! density in atom/b-cm - character(MAX_LINE_LEN) :: string - type(Nuclide), pointer :: nuc => null() - - ! set default unit to stdout if not specified - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write identifier for material - write(unit_,*) 'Material ' // to_str(mat % id) - - ! Write user-specified name for material - write(unit_,*) ' Name = ' // mat % name - - ! Write total atom density in atom/b-cm - write(unit_,*) ' Atom Density = ' // trim(to_str(mat % density)) & - // ' atom/b-cm' - - ! Write atom density for each nuclide in material - write(unit_,*) ' Nuclides:' - do i = 1, mat % n_nuclides - nuc => nuclides(mat % nuclide(i)) - density = mat % atom_density(i) - string = ' ' // trim(nuc % name) // ' = ' // & - trim(to_str(density)) // ' atom/b-cm' - write(unit_,*) trim(string) - end do - - ! Write information on S(a,b) table - if (mat % n_sab > 0) then - write(unit_,*) ' S(a,b) tables:' - do i = 1, mat % n_sab - write(unit_,*) ' ' // trim(& - sab_tables(mat % i_sab_tables(i)) % name) - end do - end if - write(unit_,*) - - end subroutine print_material - -!=============================================================================== -! PRINT_TALLY displays the attributes of a tally -!=============================================================================== - - subroutine print_tally(t, unit) - - type(TallyObject), pointer :: t - integer, optional :: unit - - integer :: i ! index for filter or score bins - integer :: j ! index in filters array - integer :: id ! user-specified id - integer :: unit_ ! unit to write to - integer :: n ! moment order to include in name - character(MAX_LINE_LEN) :: string - character(MAX_WORD_LEN) :: pn_string - type(Cell), pointer :: c => null() - type(Surface), pointer :: s => null() - type(Universe), pointer :: u => null() - type(Material), pointer :: m => null() - type(StructuredMesh), pointer :: sm => null() - - ! set default unit to stdout if not specified - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write user-specified id of tally - write(unit_,*) 'Tally ' // to_str(t % id) - - ! Write the type of tally - select case(t % type) - case (TALLY_VOLUME) - write(unit_,*) ' Type: Volume' - case (TALLY_SURFACE_CURRENT) - write(unit_,*) ' Type: Surface Current' - end select - - ! Write the estimator used - select case(t % estimator) - case(ESTIMATOR_ANALOG) - write(unit_,*) ' Estimator: Analog' - case(ESTIMATOR_TRACKLENGTH) - write(unit_,*) ' Estimator: Track-length' - end select - - ! Write any cells bins if present - j = t % find_filter(FILTER_DISTRIBCELL) - if (j > 0) then - string = "" - id = t % filters(j) % int_bins(1) - c => cells(id) - string = trim(string) // ' ' // trim(to_str(c % id)) - write(unit_, *) ' Distribcell Bins:' // trim(string) - end if - - ! Write any cells bins if present - j = t % find_filter(FILTER_CELL) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(i) - c => cells(id) - string = trim(string) // ' ' // trim(to_str(c % id)) - end do - write(unit_, *) ' Cell Bins:' // trim(string) - end if - - ! Write any surface bins if present - j = t % find_filter(FILTER_SURFACE) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(i) - s => surfaces(id) - string = trim(string) // ' ' // trim(to_str(s % id)) - end do - write(unit_, *) ' Surface Bins:' // trim(string) - end if - - ! Write any universe bins if present - j = t % find_filter(FILTER_UNIVERSE) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(i) - u => universes(id) - string = trim(string) // ' ' // trim(to_str(u % id)) - end do - write(unit_, *) ' Universe Bins:' // trim(string) - end if - - ! Write any material bins if present - j = t % find_filter(FILTER_MATERIAL) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(i) - m => materials(id) - string = trim(string) // ' ' // trim(to_str(m % id)) - end do - write(unit_, *) ' Material Bins:' // trim(string) - end if - - ! Write any mesh bins if present - j = t % find_filter(FILTER_MESH) - if (j > 0) then - string = "" - id = t % filters(j) % int_bins(1) - sm => meshes(id) - string = trim(string) // ' ' // trim(to_str(sm % dimension(1))) - do i = 2, sm % n_dimension - string = trim(string) // ' x ' // trim(to_str(sm % dimension(i))) - end do - write(unit_, *) ' Mesh Bins:' // trim(string) - end if - - ! Write any birth region bins if present - j = t % find_filter(FILTER_CELLBORN) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins - id = t % filters(j) % int_bins(i) - c => cells(id) - string = trim(string) // ' ' // trim(to_str(c % id)) - end do - write(unit_, *) ' Birth Region Bins:' // trim(string) - end if - - ! Write any incoming energy bins if present - j = t % find_filter(FILTER_ENERGYIN) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins + 1 - string = trim(string) // ' ' // trim(to_str(& - t % filters(j) % real_bins(i))) - end do - write(unit_,*) ' Incoming Energy Bins:' // trim(string) - end if - - ! Write any outgoing energy bins if present - j = t % find_filter(FILTER_ENERGYOUT) - if (j > 0) then - string = "" - do i = 1, t % filters(j) % n_bins + 1 - string = trim(string) // ' ' // trim(to_str(& - t % filters(j) % real_bins(i))) - end do - write(unit_,*) ' Outgoing Energy Bins:' // trim(string) - end if - - ! Write nuclides bins - write(unit_,fmt='(1X,A)',advance='no') ' Nuclide Bins:' - do i = 1, t % n_nuclide_bins - if (t % nuclide_bins(i) == -1) then - write(unit_,fmt='(A)',advance='no') ' total' - else - write(unit_,fmt='(A)',advance='no') ' ' // trim(adjustl(& - nuclides(t % nuclide_bins(i)) % name)) - end if - if (mod(i,4) == 0 .and. i /= t % n_nuclide_bins) & - write(unit_,'(/18X)',advance='no') - end do - write(unit_,*) - - ! Write score bins - string = "" - j = 0 - do i = 1, t % n_user_score_bins - j = j + 1 - select case (t % score_bins(j)) - case (SCORE_FLUX) - string = trim(string) // ' flux' - case (SCORE_FLUX_YN) - pn_string = ' flux' - string = trim(string) // pn_string - do n = 1, t % moment_order(j) - pn_string = ' flux-y' // trim(to_str(n)) - string = trim(string) // pn_string - end do - j = j + n - 1 - case (SCORE_TOTAL) - string = trim(string) // ' total' - case (SCORE_TOTAL_YN) - pn_string = ' total' - string = trim(string) // pn_string - do n = 1, t % moment_order(j) - pn_string = ' total-y' // trim(to_str(n)) - string = trim(string) // pn_string - end do - j = j + n - 1 - case (SCORE_SCATTER) - string = trim(string) // ' scatter' - case (SCORE_NU_SCATTER) - string = trim(string) // ' nu-scatter' - case (SCORE_SCATTER_N) - pn_string = ' scatter-' // trim(to_str(t % moment_order(j))) - string = trim(string) // pn_string - case (SCORE_SCATTER_PN) - pn_string = ' scatter' - string = trim(string) // pn_string - do n = 1, t % moment_order(j) - pn_string = ' scatter-p' // trim(to_str(n)) - string = trim(string) // pn_string - end do - j = j + n - 1 - case (SCORE_NU_SCATTER_N) - pn_string = ' nu-scatter-' // trim(to_str(t % moment_order(j))) - string = trim(string) // pn_string - case (SCORE_NU_SCATTER_PN) - pn_string = ' nu-scatter' - string = trim(string) // pn_string - do n = 1, t % moment_order(j) - pn_string = ' nu-scatter-p' // trim(to_str(n)) - string = trim(string) // pn_string - end do - j = j + n - 1 - case (SCORE_SCATTER_YN) - pn_string = ' scatter' - string = trim(string) // pn_string - do n = 1, t % moment_order(j) - pn_string = ' scatter-y' // trim(to_str(n)) - string = trim(string) // pn_string - end do - j = j + n - 1 - case (SCORE_NU_SCATTER_YN) - pn_string = ' nu-scatter' - string = trim(string) // pn_string - do n = 1, t % moment_order(j) - pn_string = ' nu-scatter-y' // trim(to_str(n)) - string = trim(string) // pn_string - end do - j = j + n - 1 - case (SCORE_TRANSPORT) - string = trim(string) // ' transport' - case (SCORE_N_1N) - string = trim(string) // ' n1n' - case (SCORE_ABSORPTION) - string = trim(string) // ' absorption' - case (SCORE_FISSION) - string = trim(string) // ' fission' - case (SCORE_NU_FISSION) - string = trim(string) // ' nu-fission' - case (SCORE_KAPPA_FISSION) - string = trim(string) // ' kappa-fission' - case (SCORE_CURRENT) - string = trim(string) // ' current' - case default - string = trim(string) // ' ' // reaction_name(t % score_bins(j)) - end select - end do - write(unit_,*) ' Scores:' // trim(string) - write(unit_,*) - - end subroutine print_tally - -!=============================================================================== -! PRINT_GEOMETRY displays the attributes of all cells, surfaces, universes, -! surfaces, and lattices read in the input files. -!=============================================================================== - - subroutine print_geometry() - - integer :: i ! loop index for various arrays - type(Surface), pointer :: s => null() - type(Cell), pointer :: c => null() - type(Universe), pointer :: u => null() - class(Lattice), pointer :: l => null() - - ! print summary of surfaces - call header("SURFACE SUMMARY", unit=UNIT_SUMMARY) - do i = 1, n_surfaces - s => surfaces(i) - call print_surface(s, unit=UNIT_SUMMARY) - end do - - ! print summary of cells - call header("CELL SUMMARY", unit=UNIT_SUMMARY) - do i = 1, n_cells - c => cells(i) - call print_cell(c, unit=UNIT_SUMMARY) - end do - - ! print summary of universes - call header("UNIVERSE SUMMARY", unit=UNIT_SUMMARY) - do i = 1, n_universes - u => universes(i) - call print_universe(u, unit=UNIT_SUMMARY) - end do - - ! print summary of lattices - if (n_lattices > 0) then - call header("LATTICE SUMMARY", unit=UNIT_SUMMARY) - do i = 1, n_lattices - l => lattices(i) % obj - call print_lattice(l, unit=UNIT_SUMMARY) - end do - end if - - end subroutine print_geometry - !=============================================================================== ! PRINT_NUCLIDE displays information about a continuous-energy neutron ! cross_section table and its reactions and secondary angle/energy distributions From 241fe3860b543ef637630ac6f6d4d8e19e016bae Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 08:31:41 +0700 Subject: [PATCH 108/519] Consistently use NEWUNIT for opening files with Fortran I/O --- src/ace.F90 | 24 ++++++++-------- src/constants.F90 | 8 ------ src/output.F90 | 72 ++++++++++++++++++++++++----------------------- src/plot.F90 | 22 ++++++++------- 4 files changed, 61 insertions(+), 65 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 0dd92ea2c7..cccc570926 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -234,7 +234,7 @@ contains integer :: location ! location of ACE table integer :: entries ! number of entries on each record integer :: length ! length of ACE table - integer :: in = 7 ! file unit + integer :: unit_ace ! file unit integer :: zaids(16) ! list of ZAIDs (only used for S(a,b)) integer :: filetype ! filetype (ASCII or BINARY) real(8) :: kT ! temperature of table @@ -277,14 +277,14 @@ contains ! READ ACE TABLE IN ASCII FORMAT ! Find location of table - open(UNIT=in, FILE=filename, STATUS='old', ACTION='read') - rewind(UNIT=in) + open(NEWUNIT=unit_ace, FILE=filename, STATUS='old', ACTION='read') + rewind(UNIT=unit_ace) do i = 1, location - 1 - read(UNIT=in, FMT=*) + read(UNIT=unit_ace, FMT=*) end do ! Read first line of header - read(UNIT=in, FMT='(A10,2G12.0,1X,A10)') name, awr, kT, date_ + read(UNIT=unit_ace, FMT='(A10,2G12.0,1X,A10)') name, awr, kT, date_ ! Check that correct xs was found -- if cross_sections.xml is broken, the ! location of the table may be wrong @@ -294,7 +294,7 @@ contains end if ! Read more header and NXS and JXS - read(UNIT=in, FMT=100) comment, mat, & + read(UNIT=unit_ace, FMT=100) comment, mat, & (zaids(i), awrs(i), i=1,16), NXS, JXS 100 format(A70,A10/4(I7,F11.0)/4(I7,F11.0)/4(I7,F11.0)/4(I7,F11.0)/& ,8I9/8I9/8I9/8I9/8I9/8I9) @@ -304,21 +304,21 @@ contains allocate(XSS(length)) ! Read XSS array - read(UNIT=in, FMT='(4G20.0)') XSS + read(UNIT=unit_ace, FMT='(4G20.0)') XSS ! Close ACE file - close(UNIT=in) + close(UNIT=unit_ace) elseif (filetype == BINARY) then ! ======================================================================= ! READ ACE TABLE IN BINARY FORMAT ! Open ACE file - open(UNIT=in, FILE=filename, STATUS='old', ACTION='read', & + open(NEWUNIT=unit_ace, FILE=filename, STATUS='old', ACTION='read', & ACCESS='direct', RECL=record_length) ! Read all header information - read(UNIT=in, REC=location) name, awr, kT, date_, & + read(UNIT=unit_ace, REC=location) name, awr, kT, date_, & comment, mat, (zaids(i), awrs(i), i=1,16), NXS, JXS ! determine table length @@ -329,11 +329,11 @@ contains do i = 1, (length + entries - 1)/entries j1 = 1 + (i-1)*entries j2 = min(length, j1 + entries - 1) - read(UNIT=IN, REC=location + i) (XSS(j), j=j1,j2) + read(UNIT=UNIT_ACE, REC=location + i) (XSS(j), j=j1,j2) end do ! Close ACE file - close(UNIT=in) + close(UNIT=unit_ace) end if ! ========================================================================== diff --git a/src/constants.F90 b/src/constants.F90 index 9a89542afa..5eba50f6df 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -394,14 +394,6 @@ module constants MODE_PLOTTING = 3, & ! Plotting mode MODE_PARTICLE = 4 ! Particle restart mode - ! Unit numbers - integer, parameter :: UNIT_SUMMARY = 11 ! unit # for writing summary file - integer, parameter :: UNIT_TALLY = 12 ! unit # for writing tally file - integer, parameter :: UNIT_PLOT = 13 ! unit # for writing plot file - integer, parameter :: UNIT_XS = 14 ! unit # for writing xs summary file - integer, parameter :: UNIT_PARTICLE = 15 ! unit # for writing particle restart - integer, parameter :: UNIT_OUTPUT = 16 ! unit # for writing output - !============================================================================= ! CMFD CONSTANTS diff --git a/src/output.F90 b/src/output.F90 index 6c7834b9b7..73b8e595d2 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -524,7 +524,8 @@ contains subroutine write_xs_summary() - integer :: i ! loop index + integer :: i ! loop index + integer :: unit_xs ! cross_sections.out file unit character(MAX_FILE_LEN) :: path ! path of summary file type(Nuclide), pointer :: nuc => null() type(SAlphaBeta), pointer :: sab => null() @@ -533,17 +534,17 @@ contains path = trim(path_output) // "cross_sections.out" ! Open log file for writing - open(UNIT=UNIT_XS, FILE=path, STATUS='replace', ACTION='write') + open(NEWUNIT=unit_xs, FILE=path, STATUS='replace', ACTION='write') ! Write header - call header("CROSS SECTION TABLES", unit=UNIT_XS) + call header("CROSS SECTION TABLES", unit=unit_xs) NUCLIDE_LOOP: do i = 1, n_nuclides_total ! Get pointer to nuclide nuc => nuclides(i) ! Print information about nuclide - call print_nuclide(nuc, unit=UNIT_XS) + call print_nuclide(nuc, unit=unit_xs) end do NUCLIDE_LOOP SAB_TABLES_LOOP: do i = 1, n_sab_tables @@ -551,11 +552,11 @@ contains sab => sab_tables(i) ! Print information about S(a,b) table - call print_sab_table(sab, unit=UNIT_XS) + call print_sab_table(sab, unit=unit_xs) end do SAB_TABLES_LOOP ! Close cross section summary file - close(UNIT_XS) + close(unit_xs) end subroutine write_xs_summary @@ -936,6 +937,7 @@ contains integer :: i_listing ! index in xs_listings array integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders + integer :: unit_tally ! tallies.out file unit real(8) :: t_value ! t-values for confidence intervals real(8) :: alpha ! significance level for CI character(MAX_FILE_LEN) :: filename ! name of output file @@ -984,7 +986,7 @@ contains filename = trim(path_output) // "tallies.out" ! Open tally file for writing - open(FILE=filename, UNIT=UNIT_TALLY, STATUS='replace', ACTION='write') + open(FILE=filename, NEWUNIT=unit_tally, STATUS='replace', ACTION='write') ! Calculate t-value for confidence intervals if (confidence_intervals) then @@ -1008,16 +1010,16 @@ contains ! Write header block if (t % name == "") then - call header("TALLY " // trim(to_str(t % id)), unit=UNIT_TALLY, & + call header("TALLY " // trim(to_str(t % id)), unit=unit_tally, & level=3) else call header("TALLY " // trim(to_str(t % id)) // ": " & - // trim(t % name), unit=UNIT_TALLY, level=3) + // trim(t % name), unit=unit_tally, level=3) endif ! Handle surface current tallies separately if (t % type == TALLY_SURFACE_CURRENT) then - call write_surface_current(t) + call write_surface_current(t, unit_tally) cycle end if @@ -1060,7 +1062,7 @@ contains ! Print current filter information type = t % filters(j) % type - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A)') repeat(" ", indent), & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), & trim(filter_name(type)), trim(get_label(t, j)) indent = indent + 2 j = j + 1 @@ -1071,7 +1073,7 @@ contains ! Print filter information if (t % n_filters > 0) then type = t % filters(j) % type - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A)') repeat(" ", indent), & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), & trim(filter_name(type)), trim(get_label(t, j)) end if @@ -1092,11 +1094,11 @@ contains ! Write label for nuclide i_nuclide = t % nuclide_bins(n) if (i_nuclide == -1) then - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A)') repeat(" ", indent), & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), & "Total Material" else i_listing = nuclides(i_nuclide) % listing - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A)') repeat(" ", indent), & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), & trim(xs_listings(i_listing) % alias) end if @@ -1109,7 +1111,7 @@ contains case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) score_name = 'P' // trim(to_str(t % moment_order(k))) // " " // & score_names(abs(t % score_bins(k))) - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & to_str(t % results(score_index,filter_index) % sum), & trim(to_str(t % results(score_index,filter_index) % sum_sq)) @@ -1119,7 +1121,7 @@ contains score_index = score_index + 1 score_name = 'P' // trim(to_str(n_order)) // " " //& score_names(abs(t % score_bins(k))) - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & to_str(t % results(score_index,filter_index) % sum), & trim(to_str(t % results(score_index,filter_index) & @@ -1135,7 +1137,7 @@ contains score_name = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) // " " & // score_names(abs(t % score_bins(k))) - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & to_str(t % results(score_index,filter_index) % sum), & trim(to_str(t % results(score_index,filter_index)& @@ -1149,7 +1151,7 @@ contains else score_name = score_names(abs(t % score_bins(k))) end if - write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(1X,2A,1X,A,"+/- ",A)') & repeat(" ", indent), score_name, & to_str(t % results(score_index,filter_index) % sum), & trim(to_str(t % results(score_index,filter_index) % sum_sq)) @@ -1166,7 +1168,7 @@ contains end do TALLY_LOOP - close(UNIT=UNIT_TALLY) + close(UNIT=unit_tally) end subroutine write_tallies @@ -1175,9 +1177,9 @@ contains ! tallies.out file. !=============================================================================== - subroutine write_surface_current(t) - + subroutine write_surface_current(t, unit_tally) type(TallyObject), pointer :: t + integer, intent(in) :: unit_tally integer :: i ! mesh index for x integer :: j ! mesh index for y @@ -1221,7 +1223,7 @@ contains do k = 1, m % dimension(3) ! Write mesh cell index string = string(1:len2+1) // trim(to_str(k)) // ")" - write(UNIT=UNIT_TALLY, FMT='(1X,A)') trim(string) + write(UNIT=unit_tally, FMT='(1X,A)') trim(string) do l = 1, n if (print_ebin) then @@ -1229,7 +1231,7 @@ contains matching_bins(i_filter_ein) = l ! Write incoming energy bin - write(UNIT=UNIT_TALLY, FMT='(3X,A,1X,A)') & + write(UNIT=unit_tally, FMT='(3X,A,1X,A)') & "Incoming Energy", trim(get_label(t, i_filter_ein)) end if @@ -1238,14 +1240,14 @@ contains mesh_indices_to_bin(m, (/ i-1, j, k /) + 1, .true.) matching_bins(i_filter_surf) = IN_RIGHT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Left", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) matching_bins(i_filter_surf) = OUT_RIGHT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Incoming Current from Left", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) @@ -1255,14 +1257,14 @@ contains mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) matching_bins(i_filter_surf) = IN_RIGHT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Incoming Current from Right", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) matching_bins(i_filter_surf) = OUT_RIGHT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Right", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) @@ -1272,14 +1274,14 @@ contains mesh_indices_to_bin(m, (/ i, j-1, k /) + 1, .true.) matching_bins(i_filter_surf) = IN_FRONT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Back", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) matching_bins(i_filter_surf) = OUT_FRONT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Incoming Current from Back", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) @@ -1289,14 +1291,14 @@ contains mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) matching_bins(i_filter_surf) = IN_FRONT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Incoming Current from Front", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) matching_bins(i_filter_surf) = OUT_FRONT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Front", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) @@ -1306,14 +1308,14 @@ contains mesh_indices_to_bin(m, (/ i, j, k-1 /) + 1, .true.) matching_bins(i_filter_surf) = IN_TOP filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Bottom", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) matching_bins(i_filter_surf) = OUT_TOP filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Incoming Current from Bottom", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) @@ -1323,14 +1325,14 @@ contains mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) matching_bins(i_filter_surf) = IN_TOP filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Incoming Current from Top", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) matching_bins(i_filter_surf) = OUT_TOP filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=UNIT_TALLY, FMT='(5X,A,T35,A,"+/- ",A)') & + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Top", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) diff --git a/src/plot.F90 b/src/plot.F90 index e507b6093b..cd4e8642e5 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -305,25 +305,26 @@ contains integer :: i ! loop index for height integer :: j ! loop index for width + integer :: unit_plot ! Open PPM file for writing - open(UNIT=UNIT_PLOT, FILE=pl % path_plot) + open(NEWUNIT=unit_plot, FILE=pl % path_plot) ! Write header - write(UNIT_PLOT, '(A2)') 'P6' - write(UNIT_PLOT, '(I0,'' '',I0)') img%width, img%height - write(UNIT_PLOT, '(A)') '255' + write(unit_plot, '(A2)') 'P6' + write(unit_plot, '(I0,'' '',I0)') img%width, img%height + write(unit_plot, '(A)') '255' ! Write color for each pixel do j = 1, img % height do i = 1, img % width - write(UNIT_PLOT, '(3A1)', advance='no') achar(img%red(i,j)), & + write(unit_plot, '(3A1)', advance='no') achar(img%red(i,j)), & achar(img%green(i,j)), achar(img%blue(i,j)) end do end do ! Close plot file - close(UNIT=UNIT_PLOT) + close(UNIT=unit_plot) end subroutine output_ppm @@ -346,6 +347,7 @@ contains integer :: x, y, z ! voxel location indices integer :: rgb(3) ! colors (red, green, blue) from 0-255 integer :: id ! id of cell or material + integer :: unit_plot ! voxel file unit real(8) :: vox(3) ! x, y, and z voxel widths real(8) :: ll(3) ! lower left starting point for each sweep direction type(Particle) :: p @@ -364,11 +366,11 @@ contains p % coord(1) % universe = BASE_UNIVERSE ! Open binary plot file for writing - open(UNIT=UNIT_PLOT, FILE=pl % path_plot, STATUS='replace', & + open(NEWUNIT=unit_plot, FILE=pl % path_plot, STATUS='replace', & ACCESS='stream') ! write plot header info - write(UNIT_PLOT) pl % pixels, vox, ll + write(unit_plot) pl % pixels, vox, ll ! move to center of voxels ll = ll + vox / TWO @@ -382,7 +384,7 @@ contains call position_rgb(p, pl, rgb, id) ! write to plot file - write(UNIT_PLOT) id + write(unit_plot) id ! advance particle in z direction p % coord(1) % xyz(3) = p % coord(1) % xyz(3) + vox(3) @@ -402,7 +404,7 @@ contains end do - close(UNIT_PLOT) + close(unit_plot) end subroutine create_3d_dump From 53fc6ff9f27c5639980be8aac11ad6ca5d66053f Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 14 Sep 2015 20:36:55 -0400 Subject: [PATCH 109/519] Add collision estimator --- src/constants.F90 | 3 +- src/global.F90 | 5 +- src/input_xml.F90 | 12 +++ src/tally.F90 | 253 ++++++++++++++++++++++++++++++++++------------ src/tracking.F90 | 3 +- 5 files changed, 208 insertions(+), 68 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 9a89542afa..e95f944d7f 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -251,7 +251,8 @@ module constants ! Tally estimator types integer, parameter :: & ESTIMATOR_ANALOG = 1, & - ESTIMATOR_TRACKLENGTH = 2 + ESTIMATOR_TRACKLENGTH = 2, & + ESTIMATOR_COLLISION = 3 ! Event types for tallies integer, parameter :: & diff --git a/src/global.F90 b/src/global.F90 index 0c5e382129..adc8f17dab 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -106,9 +106,11 @@ module global type(SetInt) :: active_analog_tallies type(SetInt) :: active_tracklength_tallies type(SetInt) :: active_current_tallies + type(SetInt) :: active_collision_tallies type(SetInt) :: active_tallies !$omp threadprivate(active_analog_tallies, active_tracklength_tallies, & -!$omp& active_current_tallies, active_tallies) +!$omp& active_current_tallies, active_collision_tallies, & +!$omp& active_tallies) ! Global tallies ! 1) collision estimate of k-eff @@ -487,6 +489,7 @@ contains call active_analog_tallies % clear() call active_tracklength_tallies % clear() call active_current_tallies % clear() + call active_collision_tallies % clear() call active_tallies % clear() ! Deallocate track_identifiers diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5c939a394f..d5a932ff64 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3138,6 +3138,18 @@ contains ! Set estimator to track-length estimator t % estimator = ESTIMATOR_TRACKLENGTH + case ('collision') + ! If the estimator was set to an analog estimator, this means the + ! tally needs post-collision information + if (t % estimator == ESTIMATOR_ANALOG) then + call fatal_error("Cannot use collision estimator for tally " & + &// to_str(t % id)) + end if + + ! Set estimator to collision estimator + t % estimator = ESTIMATOR_COLLISION + write(*, *) t % estimator + case default call fatal_error("Invalid estimator '" // trim(temp_str) & &// "' on tally " // to_str(t % id)) diff --git a/src/tally.F90 b/src/tally.F90 index e78e58f284..9f9ae77657 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -81,8 +81,8 @@ contains case (SCORE_FLUX, SCORE_FLUX_YN) if (t % estimator == ESTIMATOR_ANALOG) then ! All events score to a flux bin. We actually use a collision - ! estimator since there is no way to count 'events' exactly for - ! the flux + ! estimator in place of an analog one since there is no way to count + ! 'events' exactly for the flux if (survival_biasing) then ! We need to account for the fact that some weight was already ! absorbed @@ -92,7 +92,8 @@ contains end if score = score / material_xs % total - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then ! For flux, we need no cross section score = flux end if @@ -111,7 +112,8 @@ contains score = p % last_wgt end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then if (i_nuclide > 0) then score = micro_xs(i_nuclide) % total * atom_density * flux else @@ -129,8 +131,9 @@ contains ! reaction rate score = p % last_wgt - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then - ! Note SCORE_SCATTER_N not available for tracklength. + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then + ! Note SCORE_SCATTER_N not available for tracklength/collision. if (i_nuclide > 0) then score = (micro_xs(i_nuclide) % total & - micro_xs(i_nuclide) % absorption) * atom_density * flux @@ -240,7 +243,8 @@ contains score = p % last_wgt end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then if (i_nuclide > 0) then score = micro_xs(i_nuclide) % absorption * atom_density * flux else @@ -271,7 +275,8 @@ contains / micro_xs(p % event_nuclide) % absorption end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then if (i_nuclide > 0) then score = micro_xs(i_nuclide) % fission * atom_density * flux else @@ -314,7 +319,8 @@ contains score = keff * p % wgt_bank end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then if (i_nuclide > 0) then score = micro_xs(i_nuclide) % nu_fission * atom_density * flux else @@ -347,7 +353,8 @@ contains micro_xs(p % event_nuclide) % absorption end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then if (i_nuclide > 0) then score = micro_xs(i_nuclide) % kappa_fission * atom_density * flux else @@ -368,7 +375,8 @@ contains if (p % event_MT /= score_bin) cycle SCORE_LOOP score = p % last_wgt - else if (t % estimator == ESTIMATOR_TRACKLENGTH) then + else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & + t % estimator == ESTIMATOR_COLLISION) then ! Any other cross section has to be calculated on-the-fly. For ! cross sections that are used often (e.g. n2n, ngamma, etc. for ! depletion), it might make sense to optimize this section or @@ -484,7 +492,8 @@ contains case(SCORE_FLUX_YN, SCORE_TOTAL_YN) score_index = score_index - 1 num_nm = 1 - if (t % estimator == ESTIMATOR_ANALOG) then + if (t % estimator == ESTIMATOR_ANALOG .or. & + t % estimator == ESTIMATOR_COLLISION) then uvw = p % last_uvw else if (t % estimator == ESTIMATOR_TRACKLENGTH) then uvw = p % coord(1) % uvw @@ -536,6 +545,59 @@ contains end do SCORE_LOOP end subroutine score_general +!=============================================================================== +! SCORE_ALL_NUCLIDES tallies individual nuclide reaction rates specifically when +! the user requests all. +!=============================================================================== + + subroutine score_all_nuclides(p, i_tally, flux, filter_index) + + type(Particle), intent(in) :: p + integer, intent(in) :: i_tally + real(8), intent(in) :: flux + integer, intent(in) :: filter_index + + integer :: i ! loop index for nuclides in material + integer :: i_nuclide ! index in nuclides array + real(8) :: atom_density ! atom density of single nuclide in atom/b-cm + type(TallyObject), pointer :: t + type(Material), pointer :: mat + + ! Get pointer to tally + t => tallies(i_tally) + + ! Get pointer to current material. We need this in order to determine what + ! nuclides are in the material + mat => materials(p % material) + + ! ========================================================================== + ! SCORE ALL INDIVIDUAL NUCLIDE REACTION RATES + + NUCLIDE_LOOP: do i = 1, mat % n_nuclides + + ! Determine index in nuclides array and atom density for i-th nuclide in + ! current material + i_nuclide = mat % nuclide(i) + atom_density = mat % atom_density(i) + + ! Determine score for each bin + call score_general(p, t, (i_nuclide-1)*t % n_score_bins, filter_index, & + i_nuclide, atom_density, flux) + + end do NUCLIDE_LOOP + + ! ========================================================================== + ! SCORE TOTAL MATERIAL REACTION RATES + + i_nuclide = -1 + atom_density = ZERO + + ! Determine score for each bin + call score_general(p, t, n_nuclides_total*t % n_score_bins, filter_index, & + i_nuclide, atom_density, flux) + + end subroutine score_all_nuclides + !=============================================================================== ! SCORE_ANALOG_TALLY keeps track of how many events occur in a specified cell, ! energy range, etc. Note that since these are "analog" tallies, they are only @@ -819,59 +881,6 @@ contains end subroutine score_tracklength_tally -!=============================================================================== -! SCORE_ALL_NUCLIDES tallies individual nuclide reaction rates specifically when -! the user requests all. -!=============================================================================== - - subroutine score_all_nuclides(p, i_tally, flux, filter_index) - - type(Particle), intent(in) :: p - integer, intent(in) :: i_tally - real(8), intent(in) :: flux - integer, intent(in) :: filter_index - - integer :: i ! loop index for nuclides in material - integer :: i_nuclide ! index in nuclides array - real(8) :: atom_density ! atom density of single nuclide in atom/b-cm - type(TallyObject), pointer :: t - type(Material), pointer :: mat - - ! Get pointer to tally - t => tallies(i_tally) - - ! Get pointer to current material. We need this in order to determine what - ! nuclides are in the material - mat => materials(p % material) - - ! ========================================================================== - ! SCORE ALL INDIVIDUAL NUCLIDE REACTION RATES - - NUCLIDE_LOOP: do i = 1, mat % n_nuclides - - ! Determine index in nuclides array and atom density for i-th nuclide in - ! current material - i_nuclide = mat % nuclide(i) - atom_density = mat % atom_density(i) - - ! Determine score for each bin - call score_general(p, t, (i_nuclide-1)*t % n_score_bins, filter_index, & - i_nuclide, atom_density, flux) - - end do NUCLIDE_LOOP - - ! ========================================================================== - ! SCORE TOTAL MATERIAL REACTION RATES - - i_nuclide = -1 - atom_density = ZERO - - ! Determine score for each bin - call score_general(p, t, n_nuclides_total*t % n_score_bins, filter_index, & - i_nuclide, atom_density, flux) - - end subroutine score_all_nuclides - !=============================================================================== ! SCORE_TL_ON_MESH calculate fluxes and reaction rates based on the track-length ! estimate of the flux specifically for tallies that have mesh filters. For @@ -1119,6 +1128,118 @@ contains end subroutine score_tl_on_mesh +!=============================================================================== +! SCORE_COLLISION_TALLY calculates fluxes and reaction rates based on the +! 1/Sigma_t estimate of the flux. This is triggered after every collision. It +! is invalid for tallies that require post-collison information because it can +! score reactions that didn't actually occur, and we don't a priori know what +! the outcome will be for reactions that we didn't sample. +!=============================================================================== + + subroutine score_collision_tally(p) + + type(Particle), intent(in) :: p + + integer :: i + integer :: i_tally + integer :: j ! loop index for scoring bins + integer :: k ! loop index for nuclide bins + integer :: filter_index ! single index for single bin + integer :: i_nuclide ! index in nuclides array (from bins) + real(8) :: flux ! collision estimate of flux + real(8) :: atom_density ! atom density of single nuclide + ! in atom/b-cm + logical :: found_bin ! scoring bin found? + type(TallyObject), pointer :: t + type(Material), pointer :: mat + + ! Determine collision estimate of flux + if (survival_biasing) then + ! We need to account for the fact that some weight was already absorbed + flux = (p % last_wgt + p % absorb_wgt) / material_xs % total + else + flux = p % last_wgt / material_xs % total + end if + + ! A loop over all tallies is necessary because we need to simultaneously + ! determine different filter bins for the same tally in order to score to it + + TALLY_LOOP: do i = 1, active_collision_tallies % size() + ! Get index of tally and pointer to tally + i_tally = active_collision_tallies % get_item(i) + t => tallies(i_tally) + + ! ======================================================================= + ! DETERMINE SCORING BIN COMBINATION + + call get_scoring_bins(p, i_tally, found_bin) + if (.not. found_bin) cycle + + ! ======================================================================= + ! CALCULATE RESULTS AND ACCUMULATE TALLY + + ! If we have made it here, we have a scoring combination of bins for this + ! tally -- now we need to determine where in the results array we should + ! be accumulating the tally values + + ! Determine scoring index for this filter combination + filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 + + if (t % all_nuclides) then + if (p % material /= MATERIAL_VOID) then + call score_all_nuclides(p, i_tally, flux, filter_index) + end if + else + + NUCLIDE_BIN_LOOP: do k = 1, t % n_nuclide_bins + ! Get index of nuclide in nuclides array + i_nuclide = t % nuclide_bins(k) + + if (i_nuclide > 0) then + if (p % material /= MATERIAL_VOID) then + ! Get pointer to current material + mat => materials(p % material) + + ! Determine if nuclide is actually in material + NUCLIDE_MAT_LOOP: do j = 1, mat % n_nuclides + ! If index of nuclide matches the j-th nuclide listed in the + ! material, break out of the loop + if (i_nuclide == mat % nuclide(j)) exit + + ! If we've reached the last nuclide in the material, it means + ! the specified nuclide to be tallied is not in this material + if (j == mat % n_nuclides) then + cycle NUCLIDE_BIN_LOOP + end if + end do NUCLIDE_MAT_LOOP + + atom_density = mat % atom_density(j) + else + atom_density = ZERO + end if + end if + + ! Determine score for each bin + call score_general(p, t, (k-1)*t % n_score_bins, filter_index, & + i_nuclide, atom_density, flux) + + end do NUCLIDE_BIN_LOOP + end if + + ! If the user has specified that we can assume all tallies are spatially + ! separate, this implies that once a tally has been scored to, we needn't + ! check the others. This cuts down on overhead when there are many + ! tallies specified + + if (assume_separate) exit TALLY_LOOP + + end do TALLY_LOOP + + ! Reset tally map positioning + position = 0 + + end subroutine score_collision_tally + !=============================================================================== ! GET_SCORING_BINS determines a combination of filter bins that should be scored ! for a tally based on the particle's current attributes. @@ -1873,6 +1994,8 @@ contains call active_analog_tallies % add(i_user_tallies + i) elseif (user_tallies(i) % estimator == ESTIMATOR_TRACKLENGTH) then call active_tracklength_tallies % add(i_user_tallies + i) + elseif (user_tallies(i) % estimator == ESTIMATOR_COLLISION) then + call active_collision_tallies % add(i_user_tallies + i) end if elseif (user_tallies(i) % type == TALLY_SURFACE_CURRENT) then call active_current_tallies % add(i_user_tallies + i) diff --git a/src/tracking.F90 b/src/tracking.F90 index 173babd2f5..81f01b4110 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -13,7 +13,7 @@ module tracking use random_lcg, only: prn use string, only: to_str use tally, only: score_analog_tally, score_tracklength_tally, & - score_surface_current + score_collision_tally, score_surface_current use track_output, only: initialize_particle_track, write_particle_track, & add_particle_track, finalize_particle_track @@ -157,6 +157,7 @@ contains ! has occurred rather than before because we need information on the ! outgoing energy for any tallies with an outgoing energy filter + if (active_collision_tallies % size() > 0) call score_collision_tally(p) if (active_analog_tallies % size() > 0) call score_analog_tally(p) ! Reset banked weight during collision From fe0f94c814fe0f1c9b0c8d9ab4296c8f3996ae7a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 10:28:43 +0700 Subject: [PATCH 110/519] Add procedures to read/write 1D string arrays in hdf5_interface. --- src/hdf5_interface.F90 | 196 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 180 insertions(+), 16 deletions(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index aa7e762f34..656039d197 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -41,6 +41,7 @@ module hdf5_interface module procedure write_integer_4D module procedure write_long module procedure write_string + module procedure write_string_1D module procedure write_tally_result_1D module procedure write_tally_result_2D end interface write_dataset @@ -58,6 +59,7 @@ module hdf5_interface module procedure read_integer_4D module procedure read_long module procedure read_string + module procedure read_string_1D module procedure read_tally_result_1D module procedure read_tally_result_2D end interface read_dataset @@ -329,7 +331,7 @@ contains end subroutine read_double !=============================================================================== -! WRITE_DOUBLE_1DARRAY writes double precision 1-D array data +! WRITE_DOUBLE_1D writes double precision 1-D array data !=============================================================================== subroutine write_double_1D(group_id, name, buffer, indep) @@ -391,7 +393,7 @@ contains end subroutine write_double_1D_explicit !=============================================================================== -! READ_DOUBLE_1DARRAY reads double precision 1-D array data +! READ_DOUBLE_1D reads double precision 1-D array data !=============================================================================== subroutine read_double_1D(group_id, name, buffer, indep) @@ -449,7 +451,7 @@ contains end subroutine read_double_1D_explicit !=============================================================================== -! WRITE_DOUBLE_2DARRAY writes double precision 2-D array data +! WRITE_DOUBLE_2D writes double precision 2-D array data !=============================================================================== subroutine write_double_2D(group_id, name, buffer, indep) @@ -511,7 +513,7 @@ contains end subroutine write_double_2D_explicit !=============================================================================== -! READ_DOUBLE_2DARRAY reads double precision 2-D array data +! READ_DOUBLE_2D reads double precision 2-D array data !=============================================================================== subroutine read_double_2D(group_id, name, buffer, indep) @@ -569,7 +571,7 @@ contains end subroutine read_double_2D_explicit !=============================================================================== -! WRITE_DOUBLE_3DARRAY writes double precision 3-D array data +! WRITE_DOUBLE_3D writes double precision 3-D array data !=============================================================================== subroutine write_double_3D(group_id, name, buffer, indep) @@ -631,7 +633,7 @@ contains end subroutine write_double_3D_explicit !=============================================================================== -! READ_DOUBLE_3DARRAY reads double precision 3-D array data +! READ_DOUBLE_3D reads double precision 3-D array data !=============================================================================== subroutine read_double_3D(group_id, name, buffer, indep) @@ -689,7 +691,7 @@ contains end subroutine read_double_3D_explicit !=============================================================================== -! WRITE_DOUBLE_4DARRAY writes double precision 4-D array data +! WRITE_DOUBLE_4D writes double precision 4-D array data !=============================================================================== subroutine write_double_4D(group_id, name, buffer, indep) @@ -751,7 +753,7 @@ contains end subroutine write_double_4D_explicit !=============================================================================== -! READ_DOUBLE_4DARRAY reads double precision 4-D array data +! READ_DOUBLE_4D reads double precision 4-D array data !=============================================================================== subroutine read_double_4D(group_id, name, buffer, indep) @@ -896,7 +898,7 @@ contains end subroutine read_integer !=============================================================================== -! WRITE_INTEGER_1DARRAY writes integer precision 1-D array data +! WRITE_INTEGER_1D writes integer precision 1-D array data !=============================================================================== subroutine write_integer_1D(group_id, name, buffer, indep) @@ -958,7 +960,7 @@ contains end subroutine write_integer_1D_explicit !=============================================================================== -! READ_INTEGER_1DARRAY reads integer precision 1-D array data +! READ_INTEGER_1D reads integer precision 1-D array data !=============================================================================== subroutine read_integer_1D(group_id, name, buffer, indep) @@ -1016,7 +1018,7 @@ contains end subroutine read_integer_1D_explicit !=============================================================================== -! WRITE_INTEGER_2DARRAY writes integer precision 2-D array data +! WRITE_INTEGER_2D writes integer precision 2-D array data !=============================================================================== subroutine write_integer_2D(group_id, name, buffer, indep) @@ -1078,7 +1080,7 @@ contains end subroutine write_integer_2D_explicit !=============================================================================== -! READ_INTEGER_2DARRAY reads integer precision 2-D array data +! READ_INTEGER_2D reads integer precision 2-D array data !=============================================================================== subroutine read_integer_2D(group_id, name, buffer, indep) @@ -1136,7 +1138,7 @@ contains end subroutine read_integer_2D_explicit !=============================================================================== -! WRITE_INTEGER_3DARRAY writes integer precision 3-D array data +! WRITE_INTEGER_3D writes integer precision 3-D array data !=============================================================================== subroutine write_integer_3D(group_id, name, buffer, indep) @@ -1198,7 +1200,7 @@ contains end subroutine write_integer_3D_explicit !=============================================================================== -! READ_INTEGER_3DARRAY reads integer precision 3-D array data +! READ_INTEGER_3D reads integer precision 3-D array data !=============================================================================== subroutine read_integer_3D(group_id, name, buffer, indep) @@ -1256,7 +1258,7 @@ contains end subroutine read_integer_3D_explicit !=============================================================================== -! WRITE_INTEGER_4DARRAY writes integer precision 4-D array data +! WRITE_INTEGER_4D writes integer precision 4-D array data !=============================================================================== subroutine write_integer_4D(group_id, name, buffer, indep) @@ -1318,7 +1320,7 @@ contains end subroutine write_integer_4D_explicit !=============================================================================== -! READ_INTEGER_4DARRAY reads integer precision 4-D array data +! READ_INTEGER_4D reads integer precision 4-D array data !=============================================================================== subroutine read_integer_4D(group_id, name, buffer, indep) @@ -1590,6 +1592,168 @@ contains call h5tclose_f(memtype, hdf5_err) end subroutine read_string +!=============================================================================== +! WRITE_STRING_1D writes string 1-D array data +!=============================================================================== + + subroutine write_string_1D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name ! name for data + character(*), intent(in), target :: buffer(:) ! read data to here + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + if (present(indep)) then + call write_string_1D_explicit(group_id, dims, name, buffer, indep) + else + call write_string_1D_explicit(group_id, dims, name, buffer) + end if + end subroutine write_string_1D + + subroutine write_string_1D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name + character(*), intent(in), target :: buffer(dims(1)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode +#ifdef PHDF5 + integer(HID_T) :: plist ! property list +#endif + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + integer(HID_T) :: filetype + integer(HID_T) :: memtype + integer(HSIZE_T) :: n + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + ! Create datatype for HDF5 file based on C char + n = maxval(len_trim(buffer)) + call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) + call h5tset_size_f(filetype, n + 1, hdf5_err) + + ! Create datatype in memory based on Fortran character + call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) + call h5tset_size_f(memtype, int(len(buffer(1)), HSIZE_T), hdf5_err) + + ! Create dataspace/dataset + call h5screate_simple_f(1, dims, dspace, hdf5_err) + call h5dcreate_f(group_id, trim(name), filetype, dspace, dset, hdf5_err) + + ! Get pointer to start of string + f_ptr = c_loc(buffer(1)(1:1)) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + if (n > 0) call h5dwrite_f(dset, memtype, f_ptr, hdf5_err, xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + if (n > 0) call h5dwrite_f(dset, memtype, f_ptr, hdf5_err) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + call h5tclose_f(memtype, hdf5_err) + call h5tclose_f(filetype, hdf5_err) + end subroutine write_string_1D_explicit + +!=============================================================================== +! READ_STRING_1D reads string 1-D array data +!=============================================================================== + + subroutine read_string_1D(group_id, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + character(*), intent(in) :: name + character(*), intent(inout), target :: buffer(:) + logical, intent(in), optional :: indep ! independent I/O + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + if (present(indep)) then + call read_string_1D_explicit(group_id, dims, name, buffer, indep) + else + call read_string_1D_explicit(group_id, dims, name, buffer) + end if + end subroutine read_string_1D + + subroutine read_string_1D_explicit(group_id, dims, name, buffer, indep) + integer(HID_T), intent(in) :: group_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name + character(*), intent(inout), target :: buffer(dims(1)) + logical, intent(in), optional :: indep ! independent I/O + + integer :: hdf5_err + integer :: data_xfer_mode +#ifdef PHDF5 + integer(HID_T) :: plist ! property list +#endif + integer(HID_T) :: dset ! data set handle + integer(HID_T) :: dspace ! data or file space handle + integer(HID_T) :: filetype + integer(HID_T) :: memtype + integer(HSIZE_T) :: size + integer(HSIZE_T) :: n + type(c_ptr) :: f_ptr + + ! Set up collective vs. independent I/O + data_xfer_mode = H5FD_MPIO_COLLECTIVE_F + if (present(indep)) then + if (indep) data_xfer_mode = H5FD_MPIO_INDEPENDENT_F + end if + + ! Get dataset and dataspace + call h5dopen_f(group_id, trim(name), dset, hdf5_err) + call h5dget_space_f(dset, dspace, hdf5_err) + + ! Make sure buffer is large enough + call h5dget_type_f(dset, filetype, hdf5_err) + call h5tget_size_f(filetype, size, hdf5_err) + if (size > len(buffer(1)) + 1) then + call fatal_error("Character buffer is not long enough to & + &read HDF5 string array.") + end if + + ! Get datatype in memory based on Fortran character + n = len(buffer(1)) + call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) + call h5tset_size_f(memtype, n, hdf5_err) + + ! Get pointer to start of string + f_ptr = c_loc(buffer(1)(1:1)) + + if (using_mpio_device(group_id)) then +#ifdef PHDF5 + call h5pcreate_f(H5P_DATASET_XFER_F, plist, hdf5_err) + call h5pset_dxpl_mpio_f(plist, data_xfer_mode, hdf5_err) + call h5dread_f(dset, memtype, f_ptr, hdf5_err, mem_space_id=dspace, & + xfer_prp=plist) + call h5pclose_f(plist, hdf5_err) +#endif + else + call h5dread_f(dset, memtype, f_ptr, hdf5_err, mem_space_id=dspace) + end if + + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + call h5tclose_f(filetype, hdf5_err) + call h5tclose_f(memtype, hdf5_err) + end subroutine read_string_1D_explicit + !=============================================================================== ! WRITE_ATTRIBUTE_STRING !=============================================================================== From 4bf34de6f72593a0728428e357b1902f78dfcad8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 11:09:12 +0700 Subject: [PATCH 111/519] Write moment orders as an array of strings in statepoint files --- docs/source/usersguide/output/statepoint.rst | 14 ++-- openmc/statepoint.py | 21 ++---- src/constants.F90 | 2 +- src/state_point.F90 | 69 ++++---------------- 4 files changed, 27 insertions(+), 79 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index b17bdca024..7d07670952 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -29,11 +29,11 @@ The current revision of the statepoint file format is 13. Release version number for OpenMC -**/time_stamp** (*char[19]*) +**/time_stamp** (*char[]*) Date and time the state point was written. -**/path** (*char[255]*) +**/path** (*char[]*) Absolute path to directory containing input files. @@ -228,17 +228,15 @@ if (run_mode == MODE_EIGENVALUE) Values of specified scoring bins (e.g. SCORE_FLUX). - **/tallies/tally i/n_user_score_bins** + **/tallies/tally i/n_user_score_bins** (*int*) Number of scoring bins without accounting for those added by expansions, e.g. scatter-PN. - *do J = 1, total number of moments* + **/tallies/tally i/moment_orders** (*char[][]*) - **/tallies/tally i/moments/orderJ** (*char[8]*) - - Tallying moment order for Legendre and spherical - harmonic tally expansions (*e.g.*, 'P2', 'Y1,2', etc.). + Tallying moment orders for Legendre and spherical harmonic tally + expansions (*e.g.*, 'P2', 'Y1,2', etc.). **/source_present** (*int*) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 986d624f90..c0003ad523 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -161,7 +161,7 @@ class StatePoint(object): # Read statepoint revision self._revision = self._f['revision'].value - if self._revision != 13: + if self._revision != 14: raise Exception('Statepoint Revision is not consistent.') # Read OpenMC version @@ -393,27 +393,18 @@ class StatePoint(object): filter.stride *= tally.filters[j].num_bins # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) - moments = [] - subbase = '{0}{1}/moments/'.format(base, tally_key) - - # Extract the moment order string for each score - for k in range(len(scores)): - moment = self._f['{0}order{1}'.format( - subbase, k+1)].value.decode() - - # Remove extra whitespace - moment.replace(" ", "") - moments.append(moment) + moments = self._f['{0}{1}/moment_orders'.format( + base, tally_key)].value # Add the scores to the Tally for j, score in enumerate(scores): # If this is a scattering moment, insert the scattering order if '-n' in score: - score = score.replace('-n', '-' + str(moments[j])) + score = score.replace('-n', '-' + moments[j].decode()) elif '-pn' in score: - score = score.replace('-pn', '-' + str(moments[j])) + score = score.replace('-pn', '-' + moments[j].decode()) elif '-yn' in score: - score = score.replace('-yn', '-' + str(moments[j])) + score = score.replace('-yn', '-' + moments[j].decode()) tally.add_score(score) diff --git a/src/constants.F90 b/src/constants.F90 index 5eba50f6df..6be1326a87 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -11,7 +11,7 @@ module constants integer, parameter :: VERSION_RELEASE = 0 ! Revision numbers for binary files - integer, parameter :: REVISION_STATEPOINT = 13 + integer, parameter :: REVISION_STATEPOINT = 14 integer, parameter :: REVISION_PARTICLE_RESTART = 1 integer, parameter :: REVISION_TRACK = 1 diff --git a/src/state_point.F90 b/src/state_point.F90 index 691d0567ec..bf43a1e83f 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -49,8 +49,8 @@ contains integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group, tally_group integer(HID_T) :: meshes_group, mesh_group - integer(HID_T) :: filter_group, moments_group - character(8) :: moment_name ! name of moment (e.g, P3) + integer(HID_T) :: filter_group + character(8), allocatable :: moment_names(:) ! names of moments (e.g, P3) character(MAX_FILE_LEN) :: filename type(StructuredMesh), pointer :: meshp type(TallyObject), pointer :: tally @@ -257,40 +257,36 @@ contains call write_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) ! Write explicit moment order strings for each score bin - moments_group = create_group(tally_group, "moments") k = 1 + allocate(moment_names(tally%n_score_bins)) MOMENT_LOOP: do j = 1, tally%n_user_score_bins select case(tally%score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - moment_name = 'P' // trim(to_str(tally%moment_order(k))) - call write_dataset(moments_group, "order" // trim(to_str(k)), moment_name) + moment_names(k) = 'P' // trim(to_str(tally%moment_order(k))) k = k + 1 case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) do n_order = 0, tally%moment_order(k) - moment_name = 'P' // trim(to_str(n_order)) - call write_dataset(moments_group, "order" // trim(to_str(k)), moment_name) + moment_names(k) = 'P' // trim(to_str(n_order)) k = k + 1 end do case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & - SCORE_TOTAL_YN) + SCORE_TOTAL_YN) do n_order = 0, tally%moment_order(k) do nm_order = -n_order, n_order - moment_name = 'Y' // trim(to_str(n_order)) // ',' // & + moment_names(k) = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) - call write_dataset(moments_group, "order" // & - trim(to_str(k)), moment_name) - k = k + 1 + k = k + 1 end do end do case default - moment_name = '' - call write_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) + moment_names(k) = '' k = k + 1 end select end do MOMENT_LOOP - call close_group(moments_group) + call write_dataset(tally_group, "moment_orders", moment_names) + deallocate(moment_names) + call close_group(tally_group) end do TALLY_METADATA @@ -582,11 +578,9 @@ contains subroutine load_state_point() - integer :: i, j, k + integer :: i, j integer :: int_array(3) integer :: curr_key - integer :: n_order ! loop index for moment orders - integer :: nm_order ! loop index for Ynm moment orders integer, allocatable :: id_array(:) integer, allocatable :: key_array(:) integer, allocatable :: temp_array(:) @@ -594,12 +588,11 @@ contains integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group, tally_group integer(HID_T) :: meshes_group, mesh_group - integer(HID_T) :: filter_group, moments_group + integer(HID_T) :: filter_group real(8) :: real_array(3) logical :: source_present character(MAX_FILE_LEN) :: path_temp character(19) :: current_time - character(8) :: moment_name ! name of moment (e.g, P3, Y-1,1) type(StructuredMesh), pointer :: meshp type(TallyObject), pointer :: tally @@ -800,41 +793,7 @@ contains call read_dataset(tally_group, "score_bins", tally%score_bins) call read_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) - ! Read explicit moment order strings for each score bin - k = 1 - moments_group = open_group(tally_group, "moments") - MOMENT_LOOP: do j = 1, tally%n_user_score_bins - select case(tally%score_bins(k)) - case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) - do n_order = 0, tally%moment_order(k) - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - end do - case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & - SCORE_TOTAL_YN) - do n_order = 0, tally%moment_order(k) - do nm_order = -n_order, n_order - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - end do - end do - case default - call read_dataset(moments_group, "order" // trim(to_str(k)), & - moment_name) - k = k + 1 - end select - - end do MOMENT_LOOP - - call close_group(moments_group) call close_group(tally_group) - end do TALLY_METADATA ! Check to make sure source bank is present From 2c4f7f113e8d1a64c5e8493298248c14c63df38c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 14:22:55 +0700 Subject: [PATCH 112/519] Restructured most of openmc.statepoint.StatePoint to read values on demand from properties. --- docs/source/usersguide/output/statepoint.rst | 2 +- openmc/constants.py | 5 + openmc/statepoint.py | 747 ++++++++++-------- tests/test_entropy/test_entropy.py | 2 +- tests/test_fixed_source/test_fixed_source.py | 4 +- .../test_sourcepoint_batch.py | 3 +- .../test_sourcepoint_interval.py | 3 +- tests/testing_harness.py | 14 +- 8 files changed, 419 insertions(+), 361 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index 7d07670952..b2003f26a0 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -29,7 +29,7 @@ The current revision of the statepoint file format is 13. Release version number for OpenMC -**/time_stamp** (*char[]*) +**/date_and_time** (*char[]*) Date and time the state point was written. diff --git a/openmc/constants.py b/openmc/constants.py index a6b535e6d1..b8020f3da4 100644 --- a/openmc/constants.py +++ b/openmc/constants.py @@ -1,5 +1,10 @@ """Dictionaries of integer-to-string mappings from openmc/src/constants.F90""" +RUN_TYPES = {1: 'fixed source', + 2: 'k-eigenvalue', + 3: 'plot', + 4: 'particle restart'} + SURFACE_TYPES = {1: 'x-plane', 2: 'y-plane', 3: 'z-plane', diff --git a/openmc/statepoint.py b/openmc/statepoint.py index c0003ad523..e60b045e4c 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -65,28 +65,71 @@ class StatePoint(object): Attributes ---------- + cmfd_on : bool + Indicate whether CMFD is active + cmfd_balance : ndarray + Residual neutron balance for each batch + cmfd_dominance + Dominance ratio for each batch + cmfd_entropy : ndarray + Shannon entropy of CMFD fission source for each batch + cmfd_indices : ndarray + Number of CMFD mesh cells and energy groups. The first three indices + correspond to the x-, y-, and z- spatial directions and the fourth index + is the number of energy groups. + cmfd_srccmp : ndarray + Root-mean-square difference between OpenMC and CMFD fission source for + each batch + cmfd_src : ndarray + CMFD fission source distribution over all mesh cells and energy groups. + current_batch : int + Number of batches simulated + date_and_time : str + Date and time when simulation began + entropy : ndarray + Shannon entropy of fission source at each batch + gen_per_batch : int + Number of fission generations per batch + global_tallies : ndarray + Global tallies and their uncertainties k_combined : list Combined estimator for k-effective and its uncertainty - n_particles : int - Number of particles per generation + k_col_abs : float + Cross-product of collision and absorption estimates of k-effective + k_col_tra : float + Cross-product of collision and tracklength estimates of k-effective + k_abs_tra : float + Cross-product of absorption and tracklength estimates of k-effective + k_generation : ndarray + Estimate of k-effective for each batch/generation + meshes : dict + Dictionary whose keys are mesh IDs and whose values are Mesh objects n_batches : int Number of batches - current_batch : - Number of batches simulated - results : bool - Indicate whether tally results have been read + n_inactive : int + Number of inactive batches + n_particles : int + Number of particles per generation + n_realizations : int + Number of tally realizations + path : str + Working directory for simulation + run_mode : str + Simulation run mode, e.g. 'k-eigenvalue' + seed : int + Pseudorandom number generator seed source : ndarray of SourceSite Array of source sites - with_summary : bool - Indicate whether statepoint data has been linked against a summary file + source_present : bool + Indicate whether source sites are present tallies : dict Dictionary whose keys are tally IDs and whose values are Tally objects tallies_present : bool Indicate whether user-defined tallies are present - global_tallies : ndarray - Global tallies and their uncertainties - n_realizations : int - Number of tally realizations + version: tuple of int + Version of OpenMC + with_summary : bool + Indicate whether statepoint data has been linked against a summary file """ @@ -94,322 +137,381 @@ class StatePoint(object): import h5py self._f = h5py.File(filename, 'r') + # Ensure filetype and revision are correct + if 'filetype' not in self._f or self._f['filetype'].value != -1: + raise IOError('{} is not a statepoint file.'.format(filename)) + if self._f['revision'].value != 14: + raise IOError('Statepoint revision is not consistent.') + # Set flags for what data has been read - self._results = False - self._source = False + self._meshes_read = False + self._tallies_read = False + self._results_read = False + self._source_read = False self._with_summary = False - # Read all metadata - self._read_metadata() - - # Read information about tally meshes - self._read_meshes() - - # Read tally metadata - self._read_tallies() - def close(self): self._f.close() @property - def k_combined(self): - return self._k_combined + def cmfd_on(self): + return self._f['cmfd_on'].value > 0 @property - def n_particles(self): - return self._n_particles + def cmfd_balance(self): + if self.cmfd_on: + return self._f['cmfd/cmfd_balance'].value + else: + return None @property - def n_batches(self): - return self._n_batches + def cmfd_dominance(self): + if self.cmfd_on: + return self._f['cmfd/cmfd_dominance'].value + else: + return None + + @property + def cmfd_entropy(self): + if self.cmfd_on: + return self._f['cmfd/cmfd_entropy'].value + else: + return None + + @property + def cmfd_indices(self): + if self.cmfd_on: + return self._f['cmfd/indices'].value + else: + return None + + @property + def cmfd_src(self): + if self.cmfd_on: + data = self._f['cmfd/cmfd_src'].value + return np.reshape(data, tuple(self.cmfd_indices), order='F') + else: + return None + + @property + def cmfd_srccmp(self): + if self.cmfd_on: + return self._f['cmfd/cmfd_srccmp'].value + else: + return None @property def current_batch(self): - return self._current_batch + return self._f['current_batch'].value @property - def results(self): - return self._results + def date_and_time(self): + return self._f['date_and_time'].value.decode() + + @property + def entropy(self): + if self.run_mode == 'k-eigenvalue': + return self._f['entropy'].value + else: + return None + + @property + def gen_per_batch(self): + if self.run_mode == 'k-eigenvalue': + return self._f['gen_per_batch'].value + else: + return None + + @property + def global_tallies(self): + data = self._f['global_tallies'].value + return np.column_stack((data['sum'], data['sum_sq'])) + + @property + def k_cmfd(self): + if self.cmfd_on: + return self._f['cmfd/k_cmfd'].value + else: + return None + + @property + def k_generation(self): + if self.run_mode == 'k-eigenvalue': + return self._f['k_generation']/value + else: + return None + + @property + def k_combined(self): + if self.run_mode == 'k-eigenvalue': + return self._f['k_combined'].value + else: + return None + + @property + def k_col_abs(self): + if self.run_mode == 'k-eigenvalue': + return self._f['k_col_abs'].value + else: + return None + + @property + def k_col_tra(self): + if self.run_mode == 'k-eigenvalue': + return self._f['k_col_tra'].value + else: + return None + + @property + def k_abs_tra(self): + if self.run_mode == 'k-eigenvalue': + return self._f['k_abs_tra'].value + else: + return None + + @property + def meshes(self): + if not self._meshes_read: + # Initialize dictionaries for the Meshes + # Keys - Mesh IDs + # Values - Mesh objects + self._meshes = {} + + # Read the number of Meshes + n_meshes = self._f['tallies/meshes/n_meshes'].value + + # Read a list of the IDs for each Mesh + if n_meshes > 0: + # User-defined Mesh IDs + mesh_keys = self._f['tallies/meshes/keys'].value + else: + mesh_keys = [] + + # Build dictionary of Meshes + base = 'tallies/meshes/mesh ' + + # Iterate over all Meshes + for mesh_key in mesh_keys: + # Read the user-specified Mesh ID and type + mesh_id = self._f['{0}{1}/id'.format(base, mesh_key)].value + mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value + + # Read the mesh dimensions, lower-left coordinates, + # upper-right coordinates, and width of each mesh cell + dimension = self._f['{0}{1}/dimension'.format(base, mesh_key)].value + lower_left = self._f['{0}{1}/lower_left'.format(base, mesh_key)].value + upper_right = self._f['{0}{1}/upper_right'.format(base, mesh_key)].value + width = self._f['{0}{1}/width'.format(base, mesh_key)].value + + # Create the Mesh and assign properties to it + mesh = openmc.Mesh(mesh_id) + + mesh.dimension = dimension + mesh.width = width + mesh.lower_left = lower_left + mesh.upper_right = upper_right + + #FIXME: Set the mesh type to 'rectangular' by default + mesh.type = 'rectangular' + + # Add mesh to the global dictionary of all Meshes + self._meshes[mesh_id] = mesh + + return self._meshes + + @property + def n_batches(self): + return self._f['n_batches'].value + + @property + def n_inactive(self): + if self.run_mode == 'k-eigenvalue': + return self._f['n_inactive'].value + else: + return None + + @property + def n_particles(self): + return self._f['n_particles'].value + + @property + def n_realizations(self): + return self._f['n_realizations'].value + + @property + def path(self): + return self._f['path'].value.decode() + + @property + def run_mode(self): + return RUN_TYPES[self._f['run_mode'].value] + + @property + def seed(self): + return self._f['seed'].value @property def source(self): - return self._source + if self.source_present: + if not self._source_read: + # Initialize a NumPy array for the source sites + source_sites = self._f['source_bank'].value + self._source = np.empty_like(source_sites, dtype=SourceSite) + + # Create SourceSite objects for each particle + for i, site in enumerate(source_sites): + s = SourceSite() + s._weight, s._xyz, s._uvw, s._E = site + self._source[i] = s + self._source_read = True + return self._source + else: + return None @property - def with_summary(self): - return self._with_summary + def source_present(self): + return self._f['source_present'] > 0 @property def tallies(self): + if not self._tallies_read: + # Initialize dictionary for tallies + self._tallies = {} + + # Read the number of tallies + n_tallies = self._f['tallies/n_tallies'].value + + # Read a list of the IDs for each Tally + if n_tallies > 0: + # OpenMC Tally IDs (redefined internally from user definitions) + tally_keys = self._f['tallies/keys'].value + else: + tally_keys = [] + + base = 'tallies/tally ' + + # Iterate over all Tallies + for tally_key in tally_keys: + + # Read integer Tally estimator type code (analog or tracklength) + estimator_type = self._f['{0}{1}/estimator'.format(base, tally_key)].value + + # Read the Tally size specifications + n_realizations = self._f['{0}{1}/n_realizations'.format(base, tally_key)].value + + # Create Tally object and assign basic properties + tally = openmc.Tally(tally_key) + tally.estimator = ESTIMATOR_TYPES[estimator_type] + tally.num_realizations = n_realizations + + # Read the number of Filters + n_filters = self._f['{0}{1}/n_filters'.format(base, tally_key)].value + + subbase = '{0}{1}/filter '.format(base, tally_key) + + # Initialize all Filters + for j in range(1, n_filters+1): + + # Read the integer Filter type code + filter_type = self._f['{0}{1}/type'.format(subbase, j)].value + + # Read the Filter offset + offset = self._f['{0}{1}/offset'.format(subbase, j)].value + + n_bins = self._f['{0}{1}/n_bins'.format(subbase, j)].value + + if n_bins <= 0: + msg = 'Unable to create Filter "{0}" for Tally ID="{1}" ' \ + 'since no bins were specified'.format(j, tally_key) + raise ValueError(msg) + + # Read the bin values + if FILTER_TYPES[filter_type] in ['energy', 'energyout']: + bins = self._f['{0}{1}/bins'.format(subbase, j)].value + + elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: + bins = self._f['{0}{1}/bins'.format(subbase, j)].value + + else: + bins = self._f['{0}{1}/bins'.format(subbase, j)].value + + # Create Filter object + filter = openmc.Filter(FILTER_TYPES[filter_type], bins) + filter.offset = offset + filter.num_bins = n_bins + + if FILTER_TYPES[filter_type] == 'mesh': + mesh_ids = self._f['tallies/meshes/ids'].value + mesh_keys = self._f['tallies/meshes/keys'].value + + key = mesh_keys[mesh_ids == bins][0] + filter.mesh = self.meshes[key] + + # Add Filter to the Tally + tally.add_filter(filter) + + # Read Nuclide bins + n_nuclides = self._f['{0}{1}/n_nuclides'.format(base, tally_key)].value + + nuclide_zaids = self._f['{0}{1}/nuclides'.format(base, tally_key)].value + + # Add all Nuclides to the Tally + for nuclide_zaid in nuclide_zaids: + tally.add_nuclide(nuclide_zaid) + + # Read score bins + n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value + + tally.num_score_bins = n_score_bins + + score_bins = self._f['{0}{1}/score_bins'.format( + base, tally_key)].value + scores = [SCORE_TYPES[score] for score in score_bins] + n_user_scores = self._f['{0}{1}/n_user_score_bins' + .format(base, tally_key)].value + + # Compute and set the filter strides + for i in range(n_filters): + filter = tally.filters[i] + filter.stride = n_score_bins * n_nuclides + + for j in range(i+1, n_filters): + filter.stride *= tally.filters[j].num_bins + + # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) + moments = self._f['{0}{1}/moment_orders'.format( + base, tally_key)].value + + # Add the scores to the Tally + for j, score in enumerate(scores): + # If this is a scattering moment, insert the scattering order + if '-n' in score: + score = score.replace('-n', '-' + moments[j].decode()) + elif '-pn' in score: + score = score.replace('-pn', '-' + moments[j].decode()) + elif '-yn' in score: + score = score.replace('-yn', '-' + moments[j].decode()) + + tally.add_score(score) + + # Add Tally to the global dictionary of all Tallies + self._tallies[tally_key] = tally + return self._tallies @property def tallies_present(self): - return self._tallies_present + return self._f['tallies/tallies_present'].value @property - def global_tallies(self): - return self._global_tallies + def version(self): + return (self._f['version_major'].value, + self._f['version_minor'].value, + self._f['version_release'].value) @property - def n_realizations(self): - return self._n_realizations - - def _read_metadata(self): - # Read filetype - self._filetype = self._f['filetype'].value - - # Read statepoint revision - self._revision = self._f['revision'].value - if self._revision != 14: - raise Exception('Statepoint Revision is not consistent.') - - # Read OpenMC version - self._version = [self._f['version_major'].value, - self._f['version_minor'].value, - self._f['version_release'].value] - - # Read date and time - self._date_and_time = self._f['date_and_time'].value.decode() - - # Read path - self._path = self._f['path'].value.decode() - - # Read random number seed - self._seed = self._f['seed'].value - - # Read run information - self._run_mode = self._f['run_mode'].value - self._n_particles = self._f['n_particles'].value - self._n_batches = self._f['n_batches'].value - - # Read current batch - self._current_batch = self._f['current_batch'].value - - # Read whether or not the source site distribution is present - self._source_present = self._f['source_present'].value - - # Read criticality information - if self._run_mode == 2: - self._read_criticality() - - def _read_criticality(self): - # Read criticality information - if self._run_mode == 2: - - self._n_inactive = self._f['n_inactive'].value - self._gen_per_batch = self._f['gen_per_batch'].value - self._k_generation = self._f['k_generation'].value - self._entropy = self._f['entropy'].value - - self._k_col_abs = self._f['k_col_abs'].value - self._k_col_tra = self._f['k_col_tra'].value - self._k_abs_tra = self._f['k_abs_tra'].value - self._k_combined = self._f['k_combined'].value - - # Read CMFD information (if used) - self._read_cmfd() - - def _read_cmfd(self): - base = 'cmfd' - - # Read CMFD information - self._cmfd_on = self._f['cmfd_on'].value - - if self._cmfd_on == 1: - self._cmfd_indices = self._f['{0}/indices'.format(base)].value - self._k_cmfd = self._f['{0}/k_cmfd'.format(base)].value - self._cmfd_src = self._f['{0}/cmfd_src'.format(base)].value - self._cmfd_src = np.reshape(self._cmfd_src, tuple(self._cmfd_indices), - order='F') - self._cmfd_entropy = self._f['{0}/cmfd_entropy'.format(base)].value - self._cmfd_balance = self._f['{0}/cmfd_balance'.format(base)].value - self._cmfd_dominance = self._f['{0}/cmfd_dominance'.format(base)].value - self._cmfd_srccmp = self._f['{0}/cmfd_srccmp'.format(base)].value - - def _read_meshes(self): - # Initialize dictionaries for the Meshes - # Keys - Mesh IDs - # Values - Mesh objects - self._meshes = {} - - # Read the number of Meshes - self._n_meshes = self._f['tallies/meshes/n_meshes'].value - - # Read a list of the IDs for each Mesh - if self._n_meshes > 0: - - # OpenMC Mesh IDs (redefined internally from user definitions) - self._mesh_ids = self._f['tallies/meshes/ids'].value - - # User-defined Mesh IDs - self._mesh_keys = self._f['tallies/meshes/keys'].value - - else: - self._mesh_keys = [] - self._mesh_ids = [] - - # Build dictionary of Meshes - base = 'tallies/meshes/mesh ' - - # Iterate over all Meshes - for mesh_key in self._mesh_keys: - - # Read the user-specified Mesh ID and type - mesh_id = self._f['{0}{1}/id'.format(base, mesh_key)].value - mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value - - # Get the Mesh dimension - n_dimension = self._f['{0}{1}/n_dimension'.format(base, mesh_key)].value - - # Read the mesh dimensions, lower-left coordinates, - # upper-right coordinates, and width of each mesh cell - dimension = self._f['{0}{1}/dimension'.format(base, mesh_key)].value - lower_left = self._f['{0}{1}/lower_left'.format(base, mesh_key)].value - upper_right = self._f['{0}{1}/upper_right'.format(base, mesh_key)].value - width = self._f['{0}{1}/width'.format(base, mesh_key)].value - - # Create the Mesh and assign properties to it - mesh = openmc.Mesh(mesh_id) - - mesh.dimension = dimension - mesh.width = width - mesh.lower_left = lower_left - mesh.upper_right = upper_right - - #FIXME: Set the mesh type to 'rectangular' by default - mesh.type = 'rectangular' - - # Add mesh to the global dictionary of all Meshes - self._meshes[mesh_id] = mesh - - def _read_tallies(self): - # Initialize dictionaries for the Tallies - # Keys - Tally IDs - # Values - Tally objects - self._tallies = {} - - # Read the number of tallies - self._n_tallies = self._f['/tallies/n_tallies'].value - - # Read a list of the IDs for each Tally - if self._n_tallies > 0: - - # OpenMC Tally IDs (redefined internally from user definitions) - self._tally_ids = self._f['tallies/ids'].value - - # User-defined Tally IDs - self._tally_keys = self._f['tallies/keys'].value - - else: - self._tally_keys = [] - self._tally_ids = [] - - base = 'tallies/tally ' - - # Iterate over all Tallies - for tally_key in self._tally_keys: - - # Read integer Tally estimator type code (analog or tracklength) - estimator_type = self._f['{0}{1}/estimator'.format(base, tally_key)].value - - # Read the Tally size specifications - n_realizations = self._f['{0}{1}/n_realizations'.format(base, tally_key)].value - - # Create Tally object and assign basic properties - tally = openmc.Tally(tally_key) - tally.estimator = ESTIMATOR_TYPES[estimator_type] - tally.num_realizations = n_realizations - - # Read the number of Filters - n_filters = self._f['{0}{1}/n_filters'.format(base, tally_key)].value - - subbase = '{0}{1}/filter '.format(base, tally_key) - - # Initialize all Filters - for j in range(1, n_filters+1): - - # Read the integer Filter type code - filter_type = self._f['{0}{1}/type'.format(subbase, j)].value - - # Read the Filter offset - offset = self._f['{0}{1}/offset'.format(subbase, j)].value - - n_bins = self._f['{0}{1}/n_bins'.format(subbase, j)].value - - if n_bins <= 0: - msg = 'Unable to create Filter "{0}" for Tally ID="{1}" ' \ - 'since no bins were specified'.format(j, tally_key) - raise ValueError(msg) - - # Read the bin values - if FILTER_TYPES[filter_type] in ['energy', 'energyout']: - bins = self._f['{0}{1}/bins'.format(subbase, j)].value - - elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: - bins = self._f['{0}{1}/bins'.format(subbase, j)].value - - else: - bins = self._f['{0}{1}/bins'.format(subbase, j)].value - - # Create Filter object - filter = openmc.Filter(FILTER_TYPES[filter_type], bins) - filter.offset = offset - filter.num_bins = n_bins - - if FILTER_TYPES[filter_type] == 'mesh': - key = self._mesh_keys[self._mesh_ids == bins][0] - filter.mesh = self._meshes[key] - - # Add Filter to the Tally - tally.add_filter(filter) - - # Read Nuclide bins - n_nuclides = self._f['{0}{1}/n_nuclides'.format(base, tally_key)].value - - nuclide_zaids = self._f['{0}{1}/nuclides'.format(base, tally_key)].value - - # Add all Nuclides to the Tally - for nuclide_zaid in nuclide_zaids: - tally.add_nuclide(nuclide_zaid) - - # Read score bins - n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value - - tally.num_score_bins = n_score_bins - - score_bins = self._f['{0}{1}/score_bins'.format( - base, tally_key)].value - scores = [SCORE_TYPES[score] for score in score_bins] - n_user_scores = self._f['{0}{1}/n_user_score_bins' - .format(base, tally_key)].value - - # Compute and set the filter strides - for i in range(n_filters): - filter = tally.filters[i] - filter.stride = n_score_bins * n_nuclides - - for j in range(i+1, n_filters): - filter.stride *= tally.filters[j].num_bins - - # Read scattering moment order strings (e.g., P3, Y-1,2, etc.) - moments = self._f['{0}{1}/moment_orders'.format( - base, tally_key)].value - - # Add the scores to the Tally - for j, score in enumerate(scores): - # If this is a scattering moment, insert the scattering order - if '-n' in score: - score = score.replace('-n', '-' + moments[j].decode()) - elif '-pn' in score: - score = score.replace('-pn', '-' + moments[j].decode()) - elif '-yn' in score: - score = score.replace('-yn', '-' + moments[j].decode()) - - tally.add_score(score) - - # Add Tally to the global dictionary of all Tallies - self.tallies[tally_key] = tally + def with_summary(self): + return self._with_summary def read_results(self): """Read tally results and store them in the ``tallies`` attribute. No results @@ -417,28 +519,13 @@ class StatePoint(object): """ - # Number of realizations for global Tallies - self._n_realizations = self._f['n_realizations'].value - - # Read global Tallies - n_global_tallies = self._f['n_global_tallies'].value - - data = self._f['global_tallies'].value - self._global_tallies = np.column_stack((data['sum'], data['sum_sq'])) - - # Flag indicating if Tallies are present - self._tallies_present = self._f['tallies/tallies_present'].value - base = 'tallies/tally ' # Read Tally results - if self._tallies_present: + if self.tallies_present: # Iterate over and extract the results for all Tallies - for tally_key in self._tally_keys: - - # Get this Tally - tally = self._tallies[tally_key] + for tally_key, tally in self.tallies.items(): # Compute the total number of bins for this Tally num_tot_bins = tally.num_bins @@ -465,39 +552,7 @@ class StatePoint(object): tally.sum_sq = sum_sq # Indicate that Tally results have been read - self._results = True - - def read_source(self): - """Read and store source sites from the statepoint file. By default, source - sites are not loaded upon initialization. - - """ - - # Check whether Tally results have been read - if not self._results: - self.read_results() - - # Check if source bank is in statepoint - if not self._source_present: - print('Unable to read source since it is not in statepoint file') - return - - # Initialize a NumPy array for the source sites - self._source = np.empty(self._n_particles, dtype=SourceSite) - - # For HDF5 state points, copy entire bank - source_sites = self._f['source_bank'].value - - # Initialize SourceSite object for each particle - for i in range(self._n_particles): - # Initialize new source site - site = SourceSite() - - # Read position, angle, and energy - site._weight, site._xyz, site._uvw, site._E = source_sites[i] - - # Store the source site in the NumPy array - self._source[i] = site + self._results_read = True def compute_ci(self, confidence=0.95): """Computes confidence intervals for each Tally bin. diff --git a/tests/test_entropy/test_entropy.py b/tests/test_entropy/test_entropy.py index 9b13fd3dd2..cf8503abe4 100644 --- a/tests/test_entropy/test_entropy.py +++ b/tests/test_entropy/test_entropy.py @@ -23,7 +23,7 @@ class EntropyTestHarness(TestHarness): # Write out entropy data. outstr += 'entropy:\n' - results = ['{0:12.6E}'.format(x) for x in sp._entropy] + results = ['{0:12.6E}'.format(x) for x in sp.entropy] outstr += '\n'.join(results) + '\n' return outstr diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index 1f154a4657..32cceaf556 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -32,8 +32,8 @@ class FixedSourceTestHarness(TestHarness): tally_num += 1 outstr += 'leakage:\n' - outstr += '{0:12.6E}'.format(sp._global_tallies[3][0]) + '\n' - outstr += '{0:12.6E}'.format(sp._global_tallies[3][1]) + '\n' + outstr += '{0:12.6E}'.format(sp.global_tallies[3][0]) + '\n' + outstr += '{0:12.6E}'.format(sp.global_tallies[3][1]) + '\n' return outstr diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index 521e3bb4b2..83bb5062c5 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -22,13 +22,12 @@ class SourcepointTestHarness(TestHarness): statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) sp.read_results() - sp.read_source() # Get the eigenvalue information. outstr = TestHarness._get_results(self) # Add the source information. - xyz = sp._source[0]._xyz + xyz = sp.source[0].xyz outstr += ' '.join(['{0:12.6E}'.format(x) for x in xyz]) outstr += "\n" diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index 521e3bb4b2..83bb5062c5 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -22,13 +22,12 @@ class SourcepointTestHarness(TestHarness): statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) sp.read_results() - sp.read_source() # Get the eigenvalue information. outstr = TestHarness._get_results(self) # Add the source information. - xyz = sp._source[0]._xyz + xyz = sp.source[0].xyz outstr += ' '.join(['{0:12.6E}'.format(x) for x in xyz]) outstr += "\n" diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 2059c46dae..05896a2141 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -211,19 +211,19 @@ class CMFDTestHarness(TestHarness): # Write out CMFD data. outstr += 'cmfd indices\n' - outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp._cmfd_indices]) + outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp.cmfd_indices]) outstr += '\nk cmfd\n' - outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp._k_cmfd]) + outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp.k_cmfd]) outstr += '\ncmfd entropy\n' - outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp._cmfd_entropy]) + outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp.cmfd_entropy]) outstr += '\ncmfd balance\n' - outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp._cmfd_balance]) + outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp.cmfd_balance]) outstr += '\ncmfd dominance ratio\n' - outstr += '\n'.join(['{0:10.3E}'.format(x) for x in sp._cmfd_dominance]) + outstr += '\n'.join(['{0:10.3E}'.format(x) for x in sp.cmfd_dominance]) outstr += '\ncmfd openmc source comparison\n' - outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp._cmfd_srccmp]) + outstr += '\n'.join(['{0:12.6E}'.format(x) for x in sp.cmfd_srccmp]) outstr += '\ncmfd source\n' - cmfdsrc = np.reshape(sp._cmfd_src, np.product(sp._cmfd_indices), + cmfdsrc = np.reshape(sp.cmfd_src, np.product(sp.cmfd_indices), order='F') outstr += '\n'.join(['{0:12.6E}'.format(x) for x in cmfdsrc]) outstr += '\n' From aac5eb6f52f007763ccf478fccaf354361136acf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 14:32:41 +0700 Subject: [PATCH 113/519] Restructure openmc.particle_restart to read values on demand --- openmc/particle_restart.py | 66 ++++++++++++------- .../results_true.dat | 2 +- .../results_true.dat | 2 +- tests/testing_harness.py | 2 +- 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index 846c7d566d..b09ca0f41e 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -1,5 +1,7 @@ import struct +from openmc.constants import RUN_TYPES + class Particle(object): """Information used to restart a specific particle that caused a simulation to @@ -12,10 +14,6 @@ class Particle(object): Attributes ---------- - filetype : int - Integer indicating the file type - revision : int - Revision of the particle restart format current_batch : int The batch containing the particle gen_per_batch : int @@ -43,28 +41,48 @@ class Particle(object): import h5py self._f = h5py.File(filename, 'r') - # Read all metadata - self._read_data() + # Ensure filetype and revision are correct + if 'filetype' not in self._f or self._f['filetype'].value != -2: + raise IOError('{} is not a particle restart file.'.format(filename)) + if self._f['revision'].value != 1: + raise IOError('Particle restart file revision is not consistent.') - def _read_data(self): - # Read filetype - self.filetype = self._f['filetype'].value + @property + def current_batch(self): + return self._f['current_batch'].value - # Read statepoint revision - self.revision = self._f['revision'].value + @property + def current_gen(self): + return self._f['current_gen'].value - # Read current batch - self.current_batch = self._f['current_batch'].value + @property + def energy(self): + return self._f['energy'].value - # Read run information - self.gen_per_batch = self._f['gen_per_batch'].value - self.current_gen = self._f['current_gen'].value - self.n_particles = self._f['n_particles'].value - self.run_mode = self._f['run_mode'].value + @property + def gen_per_batch(self): + return self._f['gen_per_batch'].value - # Read particle properties - self.id = self._f['id'].value - self.weight = self._f['weight'].value - self.energy = self._f['energy'].value - self.xyz = self._f['xyz'].value - self.uvw = self._f['uvw'].value + @property + def id(self): + return self._f['id'].value + + @property + def n_particles(self): + return self._f['n_particles'].value + + @property + def run_mode(self): + return RUN_TYPES[self._f['run_mode'].value] + + @property + def uvw(self): + return self._f['uvw'].value + + @property + def weight(self): + return self._f['weight'].value + + @property + def xyz(self): + return self._f['xyz'].value diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index bbc23fb6ef..f343978533 100644 --- a/tests/test_particle_restart_eigval/results_true.dat +++ b/tests/test_particle_restart_eigval/results_true.dat @@ -5,7 +5,7 @@ current gen: particle id: 5.550000E+02 run mode: -2.000000E+00 +k-eigenvalue particle weight: 1.000000E+00 particle energy: diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index 701c3e1333..de42a0c68e 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -5,7 +5,7 @@ current gen: particle id: 9.280000E+02 run mode: -1.000000E+00 +fixed source particle weight: 1.000000E+00 particle energy: diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 05896a2141..20edb49d8b 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -256,7 +256,7 @@ class ParticleRestartTestHarness(TestHarness): outstr += 'particle id:\n' outstr += "{0:12.6E}\n".format(p.id) outstr += 'run mode:\n' - outstr += "{0:12.6E}\n".format(p.run_mode) + outstr += "{0}\n".format(p.run_mode) outstr += 'particle weight:\n' outstr += "{0:12.6E}\n".format(p.weight) outstr += 'particle energy:\n' From 4832f71083c579bbf6e4dadfb1749a6a5f7c9694 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 16 Sep 2015 07:02:12 -0400 Subject: [PATCH 114/519] Angular implementation updated --- docs/source/usersguide/input.rst | 12 +++++------ src/math.F90 | 3 ++- src/search.F90 | 2 -- src/tally.F90 | 37 ++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 7424121989..e94066a5d6 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1282,17 +1282,17 @@ The ```` element accepts the following sub-elements: :azimuthal: A monotonically increasing list of bounding particle azimuthal angles - which represents a portion of the possible values of :math:'\[-\pi,\pi\]'. - For example, spanning all of :math:'\[-\pi,\pi\]' with five equi-width + which represents a portion of the possible values of :math:'\[0,2\pi\]'. + For example, spanning all of :math:'\[0,2\pi\]' with two equi-width bins can be specified as: - ```` + ```` Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:'\[-\pi,\pi\]' should + interpret this to mean the complete range of :math:'\[0,2\pi\]' should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:'\[-\pi,\pi\]' can be instead written as: - ````. + :math:'\[0,2\pi\]' can be instead written as: + ````. :mesh: The ``id`` of a structured mesh to be tallied over. diff --git a/src/math.F90 b/src/math.F90 index 826172fa24..cd6f5567f4 100644 --- a/src/math.F90 +++ b/src/math.F90 @@ -181,7 +181,6 @@ contains if (uvw(1) == ZERO) then phi = ZERO else -! phi = atan(uvw(2) / uvw(1)) phi = atan2(uvw(2), uvw(1)) end if @@ -556,6 +555,8 @@ contains rn = ONE end select + ! rn = rn * sin(phi) + end function calc_rn !=============================================================================== diff --git a/src/search.F90 b/src/search.F90 index a6657b71de..dab7fa67ca 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -34,8 +34,6 @@ contains R = n if (val < array(L) .or. val > array(R)) then -write(*,*) val -write(*,*) array call fatal_error("Value outside of array during binary search") end if diff --git a/src/tally.F90 b/src/tally.F90 index fe9127c30b..28e888a7cd 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -906,6 +906,8 @@ contains logical :: found_bin ! was a scoring bin found? logical :: start_in_mesh ! starting coordinates inside mesh? logical :: end_in_mesh ! ending coordinates inside mesh? + real(8) :: theta + real(8) :: phi type(TallyObject), pointer :: t type(StructuredMesh), pointer :: m type(Material), pointer :: mat @@ -990,6 +992,41 @@ contains matching_bins(i) = binary_search(t % filters(i) % real_bins, & k + 1, p % E) end if + + case (FILTER_POLAR) + ! Get theta value + theta = acos(p % coord(1) % uvw(3)) + + ! determine polar angle bin + k = t % filters(i) % n_bins + + ! check if particle is within polar angle bins + if (theta < t % filters(i) % real_bins(1) .or. & + theta > t % filters(i) % real_bins(k + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find polar angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + k + 1, theta) + end if + + case (FILTER_AZIMUTHAL) + ! make sure the correct direction vector is used + phi = atan2(p % coord(1) % uvw(2), p % coord(1) % uvw(1)) + + ! determine mu bin + k = t % filters(i) % n_bins + + ! check if particle is within azimuthal angle bins + if (phi < t % filters(i) % real_bins(1) .or. & + phi > t % filters(i) % real_bins(k + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find azimuthal angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + k + 1, phi) + end if + end select ! Check if no matching bin was found From 97a7582c447f4fd881b654daeabbf489442254ce Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 16:19:12 +0700 Subject: [PATCH 115/519] Determine Tally.sum, sum_sq, mean, std_dev on demand. No more read_results()! --- openmc/statepoint.py | 47 ++--------- openmc/summary.py | 10 +-- openmc/tallies.py | 79 ++++++++++++------- tests/test_entropy/test_entropy.py | 1 - tests/test_fixed_source/test_fixed_source.py | 11 ++- .../test_sourcepoint_batch.py | 1 - .../test_sourcepoint_interval.py | 1 - tests/testing_harness.py | 12 ++- 8 files changed, 67 insertions(+), 95 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index e60b045e4c..001828414c 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -146,7 +146,6 @@ class StatePoint(object): # Set flags for what data has been read self._meshes_read = False self._tallies_read = False - self._results_read = False self._source_read = False self._with_summary = False @@ -317,6 +316,8 @@ class StatePoint(object): # Add mesh to the global dictionary of all Meshes self._meshes[mesh_id] = mesh + self._meshes_read = True + return self._meshes @property @@ -401,6 +402,7 @@ class StatePoint(object): # Create Tally object and assign basic properties tally = openmc.Tally(tally_key) + tally._statepoint = self tally.estimator = ESTIMATOR_TYPES[estimator_type] tally.num_realizations = n_realizations @@ -497,6 +499,8 @@ class StatePoint(object): # Add Tally to the global dictionary of all Tallies self._tallies[tally_key] = tally + self._tallies_read = True + return self._tallies @property @@ -513,47 +517,6 @@ class StatePoint(object): def with_summary(self): return self._with_summary - def read_results(self): - """Read tally results and store them in the ``tallies`` attribute. No results - are read when the statepoint is instantiated. - - """ - - base = 'tallies/tally ' - - # Read Tally results - if self.tallies_present: - - # Iterate over and extract the results for all Tallies - for tally_key, tally in self.tallies.items(): - - # Compute the total number of bins for this Tally - num_tot_bins = tally.num_bins - - # Extract Tally data from the file - data = self._f['{0}{1}/results'.format(base, tally_key)].value - sum = data['sum'] - sum_sq = data['sum_sq'] - - # Define a routine to convert 0 to 1 - def nonzero(val): - return 1 if not val else val - - # Reshape the results arrays - new_shape = (nonzero(tally.num_filter_bins), - nonzero(tally.num_nuclides), - nonzero(tally.num_score_bins)) - - sum = np.reshape(sum, new_shape) - sum_sq = np.reshape(sum_sq, new_shape) - - # Set the data for this Tally - tally.sum = sum - tally.sum_sq = sum_sq - - # Indicate that Tally results have been read - self._results_read = True - def compute_ci(self, confidence=0.95): """Computes confidence intervals for each Tally bin. diff --git a/openmc/summary.py b/openmc/summary.py index 088ff29d14..8b5e5710a6 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -532,18 +532,11 @@ class Summary(object): # Iterate over all Tallies for tally_key in tally_keys: - tally_id = int(tally_key.strip('tally ')) subbase = '{0}{1}'.format(base, tally_id) # Read Tally name metadata - name_size = self._f['{0}/name_size'.format(subbase)][...] - if (name_size > 0): - tally_name = self._f['{0}/name'.format(subbase)][...][0] - tally_name = tally_name.lstrip('[\'') - tally_name = tally_name.rstrip('\']') - else: - tally_name = '' + tally_name = self._f['{0}/name'.format(subbase)].value.decode() # Create Tally object and assign basic properties tally = openmc.Tally(tally_id, tally_name) @@ -560,7 +553,6 @@ class Summary(object): # Initialize all Filters for j in range(1, num_filters+1): - subsubbase = '{0}/filter {1}'.format(subbase, j) # Read filter type (e.g., "cell", "energy", etc.) diff --git a/openmc/tallies.py b/openmc/tallies.py index 003acd9435..25cc554eef 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -103,6 +103,9 @@ class Tally(object): self._with_batch_statistics = False self._derived = False + self._statepoint = None + self._results_read = False + def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -121,6 +124,8 @@ class Tally(object): clone._with_summary = self.with_summary clone._with_batch_statistics = self.with_batch_statistics clone._derived = self.derived + clone._statepoint = self._statepoint + clone._results_read = self._results_read clone._filters = [] for filter in self.filters: @@ -259,24 +264,66 @@ class Tally(object): @property def sum(self): + if not self._statepoint: + return None + + if not self._results_read: + # Extract Tally data from the file + data = self._statepoint._f['tallies/tally {0}/results'.format( + self.id)].value + sum = data['sum'] + sum_sq = data['sum_sq'] + + # Define a routine to convert 0 to 1 + def nonzero(val): + return 1 if not val else val + + # Reshape the results arrays + new_shape = (nonzero(self.num_filter_bins), + nonzero(self.num_nuclides), + nonzero(self.num_score_bins)) + + sum = np.reshape(sum, new_shape) + sum_sq = np.reshape(sum_sq, new_shape) + + # Set the data for this Tally + self._sum = sum + self._sum_sq = sum_sq + + # Indicate that Tally results have been read + self._results_read = True + return self._sum @property def sum_sq(self): + if not self._statepoint: + return None + + if not self._results_read: + # Force reading of sum and sum_sq + self.sum + return self._sum_sq @property def mean(self): - # Compute the mean if needed if self._mean is None: - self.compute_mean() + if not self._statepoint: + return None + + self._mean = self.sum / self.num_realizations return self._mean @property def std_dev(self): - # Compute the standard deviation if needed if self._std_dev is None: - self.compute_std_dev() + if not self._statepoint: + return None + + n = self.num_realizations + self._std_dev = np.sqrt((self.sum_sq/n - self.mean**2)/(n - 1)) + self.with_batch_statistics = True return self._std_dev @property @@ -456,30 +503,6 @@ class Tally(object): self._nuclides.remove(nuclide) - def compute_mean(self): - """Compute the sample mean for each bin in the tally""" - - # Calculate sample mean - self._mean = self.sum / self.num_realizations - - def compute_std_dev(self, t_value=1.0): - """Compute the sample standard deviation for each bin in the tally - - Parameters - ---------- - t_value : float, optional - Student's t-value applied to the uncertainty. Defaults to 1.0, - meaning the reported value is the sample standard deviation. - - """ - - # Calculate sample standard deviation - self.compute_mean() - self._std_dev = np.sqrt((self.sum_sq / self.num_realizations - - self.mean**2) / (self.num_realizations - 1)) - self._std_dev *= t_value - self.with_batch_statistics = True - def __repr__(self): string = 'Tally\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self.id) diff --git a/tests/test_entropy/test_entropy.py b/tests/test_entropy/test_entropy.py index cf8503abe4..43c17da141 100644 --- a/tests/test_entropy/test_entropy.py +++ b/tests/test_entropy/test_entropy.py @@ -14,7 +14,6 @@ class EntropyTestHarness(TestHarness): # Read the statepoint file. statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) - sp.read_results() # Write out k-combined. outstr = 'k-combined:\n' diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index 32cceaf556..0595ea1dba 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -14,17 +14,16 @@ class FixedSourceTestHarness(TestHarness): # Read the statepoint file. statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) - sp.read_results() # Write out tally data. outstr = '' if self._tallies: tally_num = 1 - for tally_ind in sp._tallies: - tally = sp._tallies[tally_ind] - results = np.zeros((tally._sum.size*2, )) - results[0::2] = tally._sum.ravel() - results[1::2] = tally._sum_sq.ravel() + for tally_ind in sp.tallies: + tally = sp.tallies[tally_ind] + results = np.zeros((tally.sum.size*2, )) + results[0::2] = tally.sum.ravel() + results[1::2] = tally.sum_sq.ravel() results = ['{0:12.6E}'.format(x) for x in results] outstr += 'tally ' + str(tally_num) + ':\n' diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index 83bb5062c5..59a4702e18 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -21,7 +21,6 @@ class SourcepointTestHarness(TestHarness): # Read the statepoint file. statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) - sp.read_results() # Get the eigenvalue information. outstr = TestHarness._get_results(self) diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index 83bb5062c5..59a4702e18 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -21,7 +21,6 @@ class SourcepointTestHarness(TestHarness): # Read the statepoint file. statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) - sp.read_results() # Get the eigenvalue information. outstr = TestHarness._get_results(self) diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 20edb49d8b..3dcbee6674 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -93,7 +93,6 @@ class TestHarness(object): # Read the statepoint file. statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) - sp.read_results() # Write out k-combined. outstr = 'k-combined:\n' @@ -103,11 +102,11 @@ class TestHarness(object): # Write out tally data. if self._tallies: tally_num = 1 - for tally_ind in sp._tallies: - tally = sp._tallies[tally_ind] - results = np.zeros((tally._sum.size*2, )) - results[0::2] = tally._sum.ravel() - results[1::2] = tally._sum_sq.ravel() + for tally_ind in sp.tallies: + tally = sp.tallies[tally_ind] + results = np.zeros((tally.sum.size*2, )) + results[0::2] = tally.sum.ravel() + results[1::2] = tally.sum_sq.ravel() results = ['{0:12.6E}'.format(x) for x in results] outstr += 'tally ' + str(tally_num) + ':\n' @@ -204,7 +203,6 @@ class CMFDTestHarness(TestHarness): # Read the statepoint file. statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] sp = StatePoint(statepoint) - sp.read_results() # Write out the eigenvalue and tallies. outstr = TestHarness._get_results(self) From 9bd1dc0cb906aed33d1424b877c1b36f2a4fcb96 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 16:50:11 +0700 Subject: [PATCH 116/519] Get rid of SourceSite class and just use ndarray with compound datatype --- openmc/statepoint.py | 67 ++----------------- .../test_sourcepoint_batch.py | 2 +- .../test_sourcepoint_interval.py | 2 +- 3 files changed, 7 insertions(+), 64 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 001828414c..fc4fc5ee1f 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -11,53 +11,6 @@ if sys.version > '3': long = int -class SourceSite(object): - """A single source site produced from fission. - - Attributes - ---------- - weight : float - Weight of the particle arising from the site - xyz : list of float - Cartesian coordinates of the site - uvw : list of float - Directional cosines for particles emerging from the site - E : float - Energy of the emerging particle in MeV - - """ - - def __init__(self): - self._weight = None - self._xyz = None - self._uvw = None - self._E = None - - def __repr__(self): - string = 'SourceSite\n' - string += '{0: <16}{1}{2}\n'.format('\tweight', '=\t', self._weight) - string += '{0: <16}{1}{2}\n'.format('\tE', '=\t', self._E) - string += '{0: <16}{1}{2}\n'.format('\t(x,y,z)', '=\t', self._xyz) - string += '{0: <16}{1}{2}\n'.format('\t(u,v,w)', '=\t', self._uvw) - return string - - @property - def weight(self): - return self._weight - - @property - def xyz(self): - return self._xyz - - @property - def uvw(self): - return self._uvw - - @property - def E(self): - return self._E - - class StatePoint(object): """State information on a simulation at a certain point in time (at the end of a given batch). Statepoints can be used to analyze tally results as well as @@ -118,8 +71,10 @@ class StatePoint(object): Simulation run mode, e.g. 'k-eigenvalue' seed : int Pseudorandom number generator seed - source : ndarray of SourceSite - Array of source sites + source : ndarray of compound datatype + Array of source sites. The compound datatype has fields 'wgt', 'xyz', + 'uvw', and 'E' corresponding to the weight, position, direction, and + energy of the source site. source_present : bool Indicate whether source sites are present tallies : dict @@ -146,7 +101,6 @@ class StatePoint(object): # Set flags for what data has been read self._meshes_read = False self._tallies_read = False - self._source_read = False self._with_summary = False def close(self): @@ -354,18 +308,7 @@ class StatePoint(object): @property def source(self): if self.source_present: - if not self._source_read: - # Initialize a NumPy array for the source sites - source_sites = self._f['source_bank'].value - self._source = np.empty_like(source_sites, dtype=SourceSite) - - # Create SourceSite objects for each particle - for i, site in enumerate(source_sites): - s = SourceSite() - s._weight, s._xyz, s._uvw, s._E = site - self._source[i] = s - self._source_read = True - return self._source + return self._f['source_bank'].value else: return None diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index 59a4702e18..a306b9aa78 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -26,7 +26,7 @@ class SourcepointTestHarness(TestHarness): outstr = TestHarness._get_results(self) # Add the source information. - xyz = sp.source[0].xyz + xyz = sp.source[0]['xyz'] outstr += ' '.join(['{0:12.6E}'.format(x) for x in xyz]) outstr += "\n" diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index 59a4702e18..a306b9aa78 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -26,7 +26,7 @@ class SourcepointTestHarness(TestHarness): outstr = TestHarness._get_results(self) # Add the source information. - xyz = sp.source[0].xyz + xyz = sp.source[0]['xyz'] outstr += ' '.join(['{0:12.6E}'.format(x) for x in xyz]) outstr += "\n" From 0b9aa2815b3dbdfa5031f9edf26d5dd3522153bb Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 18:37:12 +0700 Subject: [PATCH 117/519] Update Jupyter notebooks in documentation --- .../examples/pandas-dataframes.ipynb | 669 +++++++++--------- .../pythonapi/examples/tally-arithmetic.ipynb | 276 ++++---- 2 files changed, 472 insertions(+), 473 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 24c5c00a02..384fa76202 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -374,7 +374,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA4LTA4VDA5OjI2\nOjM4KzA3OjAwuRKYlgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOC0wOFQwOToyNjozOCswNzow\nMMhPICoAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEAsWB/wc/iEAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA5LTE2VDE4OjE5OjQ5KzA3OjAwTRYi9AAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOS0xNlQxODoxOTo0OSswNzowMDxLmkgAAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] @@ -562,9 +562,9 @@ "\n", " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.6.2\n", - " Date/Time: 2015-08-11 13:40:43\n", - " MPI Processes: 4\n", + " Version: 0.7.0\n", + " Git SHA1: 36a516ed8125ab8a86d8c9b3aee4bd4bc2db859c\n", + " Date/Time: 2015-09-16 18:22:08\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -590,38 +590,39 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 0.60069 \n", - " 2/1 0.62857 \n", - " 3/1 0.69431 \n", - " 4/1 0.65935 \n", - " 5/1 0.68092 \n", - " 6/1 0.64791 \n", - " 7/1 0.65859 0.65325 +/- 0.00534\n", - " 8/1 0.67381 0.66010 +/- 0.00752\n", - " 9/1 0.74149 0.68045 +/- 0.02103\n", - " 10/1 0.68244 0.68085 +/- 0.01629\n", - " 11/1 0.68068 0.68082 +/- 0.01330\n", - " 12/1 0.70394 0.68412 +/- 0.01172\n", - " 13/1 0.68624 0.68439 +/- 0.01015\n", - " 14/1 0.65667 0.68131 +/- 0.00947\n", - " 15/1 0.70080 0.68326 +/- 0.00869\n", - " 16/1 0.69639 0.68445 +/- 0.00795\n", - " 17/1 0.68786 0.68474 +/- 0.00726\n", - " 18/1 0.63698 0.68106 +/- 0.00762\n", - " 19/1 0.62785 0.67726 +/- 0.00802\n", - " 20/1 0.65759 0.67595 +/- 0.00758\n", - " Triggers unsatisfied, max unc./thresh. is 1.20713 for absorption in tally 10002\n", - " The estimated number of batches is 27\n", + " 1/1 0.59998 \n", + " 2/1 0.65473 \n", + " 3/1 0.67452 \n", + " 4/1 0.66458 \n", + " 5/1 0.70093 \n", + " 6/1 0.70726 \n", + " 7/1 0.65977 0.68351 +/- 0.02375\n", + " 8/1 0.68457 0.68387 +/- 0.01372\n", + " 9/1 0.70024 0.68796 +/- 0.01053\n", + " 10/1 0.64895 0.68016 +/- 0.01128\n", + " 11/1 0.68744 0.68137 +/- 0.00929\n", + " 12/1 0.68037 0.68123 +/- 0.00786\n", + " 13/1 0.64865 0.67715 +/- 0.00793\n", + " 14/1 0.71415 0.68127 +/- 0.00811\n", + " 15/1 0.65717 0.67886 +/- 0.00764\n", + " 16/1 0.71598 0.68223 +/- 0.00769\n", + " 17/1 0.67285 0.68145 +/- 0.00707\n", + " 18/1 0.69329 0.68236 +/- 0.00656\n", + " 19/1 0.65696 0.68055 +/- 0.00634\n", + " 20/1 0.65500 0.67884 +/- 0.00615\n", + " Triggers unsatisfied, max unc./thresh. is 1.21110 for absorption in tally 10002\n", + " The estimated number of batches is 28\n", " Creating state point statepoint.020.h5...\n", - " 21/1 0.68391 0.67645 +/- 0.00711\n", - " 22/1 0.69243 0.67739 +/- 0.00674\n", - " 23/1 0.65491 0.67614 +/- 0.00648\n", - " 24/1 0.64021 0.67425 +/- 0.00641\n", - " 25/1 0.72281 0.67668 +/- 0.00655\n", - " 26/1 0.71261 0.67839 +/- 0.00646\n", - " 27/1 0.69503 0.67914 +/- 0.00621\n", - " Triggers satisfied for batch 27\n", - " Creating state point statepoint.027.h5...\n", + " 21/1 0.67090 0.67835 +/- 0.00577\n", + " 22/1 0.69025 0.67905 +/- 0.00546\n", + " 23/1 0.66113 0.67805 +/- 0.00525\n", + " 24/1 0.67934 0.67812 +/- 0.00496\n", + " 25/1 0.67203 0.67781 +/- 0.00472\n", + " 26/1 0.66928 0.67741 +/- 0.00451\n", + " 27/1 0.70271 0.67856 +/- 0.00445\n", + " 28/1 0.70233 0.67959 +/- 0.00437\n", + " Triggers satisfied for batch 28\n", + " Creating state point statepoint.028.h5...\n", "\n", " ===========================================================================\n", " ======================> SIMULATION FINISHED <======================\n", @@ -630,28 +631,28 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.7300E-01 seconds\n", - " Reading cross sections = 3.0300E-01 seconds\n", - " Total time in simulation = 5.9130E+00 seconds\n", - " Time in transport only = 5.4000E+00 seconds\n", - " Time in inactive batches = 7.7300E-01 seconds\n", - " Time in active batches = 5.1400E+00 seconds\n", - " Time synchronizing fission bank = 4.4600E-01 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 5.5700E-01 seconds\n", + " Reading cross sections = 1.8900E-01 seconds\n", + " Total time in simulation = 1.1416E+01 seconds\n", + " Time in transport only = 1.1395E+01 seconds\n", + " Time in inactive batches = 1.4590E+00 seconds\n", + " Time in active batches = 9.9570E+00 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 9.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 6.8870E+00 seconds\n", - " Calculation Rate (inactive) = 16170.8 neutrons/second\n", - " Calculation Rate (active) = 7295.72 neutrons/second\n", + " Total time elapsed = 1.1985E+01 seconds\n", + " Calculation Rate (inactive) = 8567.51 neutrons/second\n", + " Calculation Rate (active) = 3766.19 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 0.68117 +/- 0.00597\n", - " k-effective (Track-length) = 0.67914 +/- 0.00621\n", - " k-effective (Absorption) = 0.67898 +/- 0.00471\n", - " Combined k-effective = 0.67922 +/- 0.00479\n", - " Leakage Fraction = 0.34264 +/- 0.00301\n", + " k-effective (Collision) = 0.68196 +/- 0.00427\n", + " k-effective (Track-length) = 0.67959 +/- 0.00437\n", + " k-effective (Absorption) = 0.67957 +/- 0.00402\n", + " Combined k-effective = 0.67943 +/- 0.00295\n", + " Leakage Fraction = 0.34370 +/- 0.00201\n", "\n" ] }, @@ -671,7 +672,7 @@ "!rm statepoint.*\n", "\n", "# Run OpenMC with MPI!\n", - "executor.run_simulation(mpi_procs=4)" + "executor.run_simulation()" ] }, { @@ -694,9 +695,7 @@ "statepoints = glob.glob('statepoint.*.h5')\n", "\n", "# Load the last statepoint file\n", - "sp = StatePoint(statepoints[-1])\n", - "sp.read_results()\n", - "sp.compute_stdev()" + "sp = StatePoint(statepoints[-1])" ] }, { @@ -770,13 +769,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.14583021]]\n", + "[[[ 0.15044911]]\n", "\n", - " [[ 0.07846909]]\n", + " [[ 0.09149973]]\n", "\n", - " [[ 0.33705448]]\n", + " [[ 0.27611475]]\n", "\n", - " [[ 0.15150059]]]\n" + " [[ 0.12476673]]]\n" ] } ], @@ -840,7 +839,7 @@ " 0.0e+00 - 6.3e-07\n", " fission\n", " 0.000236\n", - " 0.000034\n", + " 0.000035\n", " \n", " \n", " 1\n", @@ -849,8 +848,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " nu-fission\n", - " 0.000576\n", - " 0.000084\n", + " 0.000574\n", + " 0.000086\n", " \n", " \n", " 2\n", @@ -859,8 +858,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " fission\n", - " 0.000069\n", - " 0.000004\n", + " 0.000072\n", + " 0.000006\n", " \n", " \n", " 3\n", @@ -869,8 +868,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " nu-fission\n", - " 0.000183\n", - " 0.000011\n", + " 0.000190\n", + " 0.000014\n", " \n", " \n", " 4\n", @@ -879,8 +878,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " fission\n", - " 0.000366\n", - " 0.000052\n", + " 0.000451\n", + " 0.000058\n", " \n", " \n", " 5\n", @@ -889,8 +888,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " nu-fission\n", - " 0.000892\n", - " 0.000127\n", + " 0.001100\n", + " 0.000141\n", " \n", " \n", " 6\n", @@ -899,8 +898,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " fission\n", - " 0.000109\n", - " 0.000009\n", + " 0.000095\n", + " 0.000006\n", " \n", " \n", " 7\n", @@ -909,8 +908,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " nu-fission\n", - " 0.000284\n", - " 0.000021\n", + " 0.000250\n", + " 0.000016\n", " \n", " \n", " 8\n", @@ -919,8 +918,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " fission\n", - " 0.000540\n", - " 0.000058\n", + " 0.000575\n", + " 0.000080\n", " \n", " \n", " 9\n", @@ -929,8 +928,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " nu-fission\n", - " 0.001316\n", - " 0.000141\n", + " 0.001401\n", + " 0.000194\n", " \n", " \n", " 10\n", @@ -939,8 +938,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " fission\n", - " 0.000144\n", - " 0.000017\n", + " 0.000134\n", + " 0.000011\n", " \n", " \n", " 11\n", @@ -949,8 +948,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " nu-fission\n", - " 0.000376\n", - " 0.000041\n", + " 0.000353\n", + " 0.000028\n", " \n", " \n", " 12\n", @@ -959,8 +958,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " fission\n", - " 0.000830\n", - " 0.000085\n", + " 0.000655\n", + " 0.000071\n", " \n", " \n", " 13\n", @@ -969,8 +968,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " nu-fission\n", - " 0.002022\n", - " 0.000207\n", + " 0.001596\n", + " 0.000174\n", " \n", " \n", " 14\n", @@ -979,8 +978,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " fission\n", - " 0.000168\n", - " 0.000013\n", + " 0.000149\n", + " 0.000009\n", " \n", " \n", " 15\n", @@ -989,8 +988,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " nu-fission\n", - " 0.000434\n", - " 0.000034\n", + " 0.000391\n", + " 0.000023\n", " \n", " \n", " 16\n", @@ -999,8 +998,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " fission\n", - " 0.000738\n", - " 0.000043\n", + " 0.000781\n", + " 0.000078\n", " \n", " \n", " 17\n", @@ -1009,8 +1008,8 @@ " 1\n", " 0.0e+00 - 6.3e-07\n", " nu-fission\n", - " 0.001799\n", - " 0.000105\n", + " 0.001903\n", + " 0.000191\n", " \n", " \n", " 18\n", @@ -1019,8 +1018,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " fission\n", - " 0.000186\n", - " 0.000010\n", + " 0.000185\n", + " 0.000009\n", " \n", " \n", " 19\n", @@ -1029,8 +1028,8 @@ " 1\n", " 6.3e-07 - 2.0e+01\n", " nu-fission\n", - " 0.000486\n", - " 0.000026\n", + " 0.000484\n", + " 0.000024\n", " \n", " \n", "\n", @@ -1040,26 +1039,26 @@ " mesh 1 energy [MeV] score mean std. dev.\n", " x y z \n", "bin \n", - "0 1 1 1 0.0e+00 - 6.3e-07 fission 0.000236 0.000034\n", - "1 1 1 1 0.0e+00 - 6.3e-07 nu-fission 0.000576 0.000084\n", - "2 1 1 1 6.3e-07 - 2.0e+01 fission 0.000069 0.000004\n", - "3 1 1 1 6.3e-07 - 2.0e+01 nu-fission 0.000183 0.000011\n", - "4 1 2 1 0.0e+00 - 6.3e-07 fission 0.000366 0.000052\n", - "5 1 2 1 0.0e+00 - 6.3e-07 nu-fission 0.000892 0.000127\n", - "6 1 2 1 6.3e-07 - 2.0e+01 fission 0.000109 0.000009\n", - "7 1 2 1 6.3e-07 - 2.0e+01 nu-fission 0.000284 0.000021\n", - "8 1 3 1 0.0e+00 - 6.3e-07 fission 0.000540 0.000058\n", - "9 1 3 1 0.0e+00 - 6.3e-07 nu-fission 0.001316 0.000141\n", - "10 1 3 1 6.3e-07 - 2.0e+01 fission 0.000144 0.000017\n", - "11 1 3 1 6.3e-07 - 2.0e+01 nu-fission 0.000376 0.000041\n", - "12 1 4 1 0.0e+00 - 6.3e-07 fission 0.000830 0.000085\n", - "13 1 4 1 0.0e+00 - 6.3e-07 nu-fission 0.002022 0.000207\n", - "14 1 4 1 6.3e-07 - 2.0e+01 fission 0.000168 0.000013\n", - "15 1 4 1 6.3e-07 - 2.0e+01 nu-fission 0.000434 0.000034\n", - "16 1 5 1 0.0e+00 - 6.3e-07 fission 0.000738 0.000043\n", - "17 1 5 1 0.0e+00 - 6.3e-07 nu-fission 0.001799 0.000105\n", - "18 1 5 1 6.3e-07 - 2.0e+01 fission 0.000186 0.000010\n", - "19 1 5 1 6.3e-07 - 2.0e+01 nu-fission 0.000486 0.000026" + "0 1 1 1 0.0e+00 - 6.3e-07 fission 0.000236 0.000035\n", + "1 1 1 1 0.0e+00 - 6.3e-07 nu-fission 0.000574 0.000086\n", + "2 1 1 1 6.3e-07 - 2.0e+01 fission 0.000072 0.000006\n", + "3 1 1 1 6.3e-07 - 2.0e+01 nu-fission 0.000190 0.000014\n", + "4 1 2 1 0.0e+00 - 6.3e-07 fission 0.000451 0.000058\n", + "5 1 2 1 0.0e+00 - 6.3e-07 nu-fission 0.001100 0.000141\n", + "6 1 2 1 6.3e-07 - 2.0e+01 fission 0.000095 0.000006\n", + "7 1 2 1 6.3e-07 - 2.0e+01 nu-fission 0.000250 0.000016\n", + "8 1 3 1 0.0e+00 - 6.3e-07 fission 0.000575 0.000080\n", + "9 1 3 1 0.0e+00 - 6.3e-07 nu-fission 0.001401 0.000194\n", + "10 1 3 1 6.3e-07 - 2.0e+01 fission 0.000134 0.000011\n", + "11 1 3 1 6.3e-07 - 2.0e+01 nu-fission 0.000353 0.000028\n", + "12 1 4 1 0.0e+00 - 6.3e-07 fission 0.000655 0.000071\n", + "13 1 4 1 0.0e+00 - 6.3e-07 nu-fission 0.001596 0.000174\n", + "14 1 4 1 6.3e-07 - 2.0e+01 fission 0.000149 0.000009\n", + "15 1 4 1 6.3e-07 - 2.0e+01 nu-fission 0.000391 0.000023\n", + "16 1 5 1 0.0e+00 - 6.3e-07 fission 0.000781 0.000078\n", + "17 1 5 1 0.0e+00 - 6.3e-07 nu-fission 0.001903 0.000191\n", + "18 1 5 1 6.3e-07 - 2.0e+01 fission 0.000185 0.000009\n", + "19 1 5 1 6.3e-07 - 2.0e+01 nu-fission 0.000484 0.000024" ] }, "execution_count": 25, @@ -1084,9 +1083,9 @@ "outputs": [ { "data": { - "image/png": "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\nAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1109,7 +1108,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1118,9 +1117,9 @@ }, { "data": { - "image/png": "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\nTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAEZCAYAAAAT73clAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X20XVV57/Hvj7zxEuUtkhASSYCDTdAKViOtWND6EqIl\nelEQRougt+YWI72j2mupjopaUWxrLaXSjAtari0gV4QbbVJAlJamiEYCQpMAAQJJgEMIJGCA5Jzk\nuX+sFdzZWWudPdfZ5+xzdn6fMfbI2XPNZ8+5dk6erJe55lREYGZmrdmn0x0wMxtNnDTNzBI4aZqZ\nJXDSNDNL4KRpZpbASdPMLIGTZpeR9BpJd0t6TtInJF0u6bOD+LwLJf3vdvbRbDSTx2l2F0lXApsj\n4pOd7ku7SVoLfCQiftTpvtjey0ea3edIYGWnO5FK0pgWqgWgoe6LWRUnzS4i6UfAKcBl+el5j6R/\nlPTFfPskST+Q9KykTZL+vSH205LW53GrJb09L79I0rcb6p0m6b/yz/ixpF9r2LZW0icl3SNps6Rr\nJU0o6eu5kpZJ+pqkp4HPSTpK0o8kPS1po6R/knRgXv/bwKuB70t6XtKn8vITJf1n3p+7JZ3c7u/V\nrJGTZheJiLcDtwMfj4hXRsSDZEdnu67BfBJYB0wCDgMuhOw6KPBx4I0R8UrgXcDaXR+76/MlHQtc\nDVyQf8YSsiQ2tqHuB4F3AzOBXwfOrejyHOChvC8Xkx1Ffgk4HJgFTAcuyvft94HHgPdGxCsi4q8k\nHQH8APhCRBwMfAq4XtKkVr8zs1ROmt2p7BR2O1lCmhEROyJiWV6+A5gAHCdpXEQ8FhEPF3zWmcAP\nIuLWiNgB/BWwH/BbDXUujYgnI+JZ4PvA8RX9fDwi/j4idkbESxHxUP7ZfRHxNPA3QNWR4+8BSyLi\nXwEi4ofAcmBeRYzZoDhpdqfmu3u7Et9fAmuAmyU9JOnTABGxBvifZEd1vZKukXR4wedOJTvaI48L\nsiPXIxrqPNnw84vAxIp+rtutk9Lk/JR+vaQtwLeBQyvijwQ+mJ+aPyvpWeAtwJSKGLNBcdLci0TE\nLyPiUxFxNHAa8Me7rl1GxDUR8VayRBTAJQUfsSHfDoAkkZ1CbyhrcqAuNb2/mOyo97URcSDw++z+\nO9pc/zHg2xFxcMPrFRHx1QHaNavNSbM7qehnSe+VdEye7J4jS1A7JB0r6e35TZttwEv5tmb/F3hP\nXncc2TXSl4D/bKEfrZgIbAWey69X/knT9l7g6Ib3/wT8rqR3SRojaV9Jp+SxZkPCSbM7RdPPu94f\nA9wCPE+W6P4+Iv6N7Hrml4GNwBNkN3kubI6PiPvJriP+XV73PcDvRkR/RT/KjjaLtn0eeAOwhex6\n6PVNdb4MfDY/Ff/jiFgPzAf+DHiK7Mjzk/j32oaQB7ebmSXw/8hmZgmcNM3MEjhpmpklcNI0M0sw\nduAqw0+S706ZdUhEDGpSlNR/v4Ntb7iNyKSZKfveTycbidLkUzWamJsess9rt9ZoCN46+fbkmHn8\nS2H5/zl9CedcX/yk4Me3fSO5nQNu3Zkcw7+lhwBwYo2Yx4qLT/8mXP+RkphHarTzk/SQR+5Mj5l5\nVnoMwEXXFJd/h+z51iKnJLbxtsT6Zf6ixXq1J3rtoI6cnkuam8+k8+CuR/nMrHuMa/E1Gg37kWY+\nb+JlwDvIHr/7maTFEbFquPtiZkNjBJ/CDlon9m0OsCYi1gJIupbsqY4Wk+asoerXqHHYrIM73YUR\nYdbkTvdgZHhVpztQYL9Od2AIdSJpHsHus9usB97cevjsNndn9Jk8+5BOd2FEmO25jICRmTRH66l3\nKzqRNFu8s3Z6w8+z+FWyXFZQl5aPU3dT4282HthWoyHoPXB1cswK7i8sX7vsidKY6/rSBx5M+K/k\nkHrfN2QzeqbaVFy8rOpmz1M12nk6PaROM4etrREE3FtSvq6kHKBsUoBdHs1f7ebT8/baQDad2C7T\nyY42mxTcIX/Z2XsW1Tlr/530ENW8ez65xt3zE3ihfNvZryksP2PbrcntHHBrjRFedQeJtPHuOcDZ\nv1Gyoc7d883pIY88lB4zc0Z6DMADd5Rve11J+SmJbbTr7rmPNNtrOdAjaQbwONloiZqDMMxsJPKR\nZhtFRL+khcBNwBjgSt85N+suPtJss4hYCiztRNtmNvScNM3MEnjIUSeULcfVR/F/YwW3kgb0UnrI\n/hPLb85UeTc3pbfFi4XlE+gr3bZiQtXij8VOOuyu5BiOSg8B4M9rxPxRSfkE4ICSbf+rRjv3pYfc\n9e70mJklowEGckZJ+f7Ae0u21X3adbBGbmIZPM9yZGZtN5jHKFt5zFrSpfn2eySd0GqspE9K2inp\nkIayC/P6qyW9a6B96+b/EMysQ+omllYes5Y0DzgmInokvRm4HDhxoFhJ04F30jA0VdJsshE8s8ke\nvPmhpGMjonQWGx9pmlnbDeJI8+XHrCOiD9j1mHWj04CrACLiTuAgSVNaiP0ae164mQ9cExF9+aPd\na/LPKeWkaWZtN7bFV4Gix6ybl2QuqzO1LFbSfGB9RPyi6bOmsvsdkaL2duPTczNru0EMOWr18bSW\nn0mTtB/ZMs/vbDG+sg9OmmbWdoMYctTKY9bNdabldcaVxB4NzADukbSr/s/z66FFn7WhqoM+PTez\nthvENc2XH7OWNJ7sJs3ipjqLgXMAJJ0IbI6I3rLYiLgvIiZHxMyImEmWSN+QxywGPiRpvKSZQA/w\n06p985GmmbVd3cRS9pi1pAX59kURsUTSPElrgK3AeVWxRc00tLdS0nXASrJJoc6PCJ+em9nwGtdq\nZimYu67oMeuIWNT0fmHRx7XyiHZEHNX0/mLg4pb6i5OmmQ2BsYNImiOdk6aZtd24MZ3uwdBx0jSz\ntmv5SHMUGrm79suyiTG2wbaCbWP3T2+jxoQdY8buSA8CFrEgOeYCLi0s72cM2xlfuO0m0meQOPiN\n6VOWH7f64eQYgCfvPTA5ZsqPthRveITyiUMeT26mfD2JCqfXmT675hJPsycUl9+9HmZPK972/Pfr\ntTVY40r62g1GbtI0s9GrizNLF++amXVMF2eWLt41M+uYLs4sXbxrZtYxvntuZpagizNLF++amXWM\n756bmSXo4szSxbtmZh3TxZmli3fNzDrGN4LMzBJ0cWbp4l0zs47p4szSxbtmZh3TxZmli3fNzDrG\nQ446oWzWognF2/at0UT65D5se6l4dqGBTJ2QPu3OeLYXlo9lR+m2/8GiwvIqmzkoOYaT00MADtpa\nMmNRlekl5YdWbFuS3gzpEzDVm7HoqRoxAA+WlG8BXize9OaeNrWRahCZRdJc4Otkt5OuiIhLCupc\nCpwKvACcGxErqmIlfZFsvfQANuUx6yTNAFYBq/OPviMizq/qnxdWM7P2G9Piq4mkMcBlwFxgNnCW\npFlNdeYBx0RED/Ax4PIWYr8aEa+PiOOBG4HPNXzkmog4IX9VJkxw0jSzoTC2xdee5pAlsbUR0Qdc\nC8xvqnMacBVARNwJHCRpSlVsRDzfED8ReLrurjlpmln71U+aRwDrGt6vz8taqTO1KlbSlyQ9BnwY\n+EpDvZmSVki6TdJJA+2ak6aZtV/N03MaltcdgFK7FBGfiYhXA/8I/E1e/DgwPSJOAP4YuFrSK6o+\nx0nTzNqv/pHmBna/vTed7Iixqs60vE4rsQBXA28CiIjtEfFs/vNdwENA5e0zJ00za799W3ztaTnQ\nI2mGpPHAmcDipjqLgXMAJJ0IbI6I3qpYSY2JcD6w6277pPwGEpKOIkuYlQtgjeAhR2Y2atV89jwi\n+iUtBG7KP+XKiFglaUG+fVFELJE0T9IaYCtwXlVs/tFflvQaYAfZ0eQf5uW/DXxBUh+wE1gQEZWD\nEZ00zaz9BpFZImIpsLSpbFHT+4WtxublHyip/z3geyn9c9I0s/br4szSxbtmZh3jqeHMzBJ0cWbp\n4l0zs47p4swygnetbIxrFG9bnjzWFd6XHlJXL5OTY1Yyu7B8PS+xf8m2OhY+cmV6UH+9tnaMrTHK\n7cCdxeX7UT7JRp0JRT5TI6bOhB2basTUdVZi/S+0qV3PcmRmlqCLM0sX75qZdUwXZ5Yu3jUz6xjf\nPTczS9DFmaWLd83MOqaLM0sX75qZdYxPz83MEtRZs2uUcNI0s/br4szSxbtmZh3j03MzswRdnFm6\neNfMrGO6OLN08a6ZWcf49LwDxpZMwLFTsE+NyTmK1Fj5+KWnD67V1OQD706OeYrDCsuf45Wl28rK\nqxwzc01yzAzWJscALOeNyTG/95PrizesAX5SEnRncjPwpRoxddpJmie8QdlX9wgws2TblpptDdYg\n7p5Lmgt8nSz1XhERlxTUuRQ4FXgBODciVlTFSvoi2XrpQTZlyrkRsS7fdiHwEbKlMC6IiJur+ueF\n1cys/Wou4ZsvcnYZMBeYDZwlaVZTnXnAMRHRA3wMuLyF2K9GxOsj4njgRuBzecxssgXYZudx35BU\nmRc7cqQpaS3wHFlm74uIOZ3oh5kNkfqZZQ6wJiLWAki6lmz1yFUNdU4DrgKIiDslHSRpCtnxdmFs\nRDzfED+RX51nzgeuiYg+YG2+WNscys9hOnZ6HsApEfFMh9o3s6FUP7McAaxreL8eeHMLdY4AplbF\nSvoS8PvAi2SJkTzmJ00xR1R1sJOn5226MGlmI87YFl97Kpt9vFly/oiIz0TEq4FvkV33LK1a9Tmd\nSpoB/FDSckl/0KE+mNlQqXlNE9gATG94P53s6K+qzrS8TiuxAFcDb6r4rA2FPct1Kmm+JSJOILv7\n9XFJb+1QP8xsKNQ/0lwO9EiaIWk82U2axU11FgPnAEg6EdgcEb1VsZJ6GuLnAysaPutDksZLmgn0\nAD8daNeGXUQ8kf+5UdINZNcXbt+tUv/pv/pZs0D5mjixDIqWjHm2RkfuqBHzTKtnD7vbOHllckx/\nyU5tWvZArT6U+TG9yTGvYmutth7mseSYfX5eXL5sVXE5AA8lN5PdHkiVPloLnqgRA5R95cs2VsRU\nbQNWPgOrhuLOQs01giKiX9JC4CayY9ErI2KVpAX59kURsUTSvPymzVbgvKrY/KO/LOk1ZDefHwL+\nMI9ZKek6YCXZylfnR0TlP/JhT5qS9gfGRMTzkg4A3gV8fs+elYzN2wnsc/ae5XWGT/5mjZiT6iXN\nVx394+SYqTxeuu3VZ/9WrX4UeRvpCX0GL9ZqazmvTo45e+LPyreVLaBWZ5zgqTVi6ozTLDphbEXF\nENyzy8ZpHprWhP42rX6pQWSWiFgKLG0qW9T0fmGrsXn5Byrauxi4uNX+deJIczJwg6Rd7f/zQINJ\nzWyUGbmPzQzasO9aRDwCHD/c7ZrZMHLSNDNrXfjZczOz1u3o4swycnetv+yGS8DOgm0zaoyVvy09\nhIn1xuS/9ejbB67U5DZOKSzfxKFot6Flv3IYTyW38wtelxwzkecHrlRgR53pb0runvMIpXe8H/zS\ntORmev66xh2aqekh/EONGMieZSlSdYc8/b5bWzhpmpkl2DZhfIs1tw9pP4aCk6aZtd2OMd17UdNJ\n08zartZlmFHCSdPM2q7fSdPMrHU7uji1dO+emVnH+PTczCyBk6aZWYJttDrkaPRx0jSztvM1TTOz\nBD49NzNL4KRpZpbA4zQ7YllJ+QPF2+47Kb2JE9NDeKlGDPDVR/8sOeakI28rLB9LP+NLntl9Hfcm\nt/MAr0mO2b/mzO2za8wSf8vni/9u7736KW45u3g683fe/B/J7WxdmL5k1gHLitZeGUDdKbf/e0n5\nHZSvQrCpZluD1M3XNDu5hK+ZdakdjGnpVUTSXEmrJT0o6dMldS7Nt98j6YSBYiX9paRVef3vSTow\nL58h6UVJK/LXNwbaNydNM2u77Yxv6dVM0hjgMmAuMBs4S9KspjrzgGMiogf4GHB5C7E3A8dFxOvJ\nTlcvbPjINRFxQv46f6B9c9I0s7brZ0xLrwJzyJLY2ojoA64lW3K30WnAVQARcSdwkKQpVbERcUtE\n7LqWcifZ+ua1OGmaWdvtYGxLrwJHAOsa3q/Py1qpM7WFWICPAEsa3s/MT81vkzTgzZHuvVprZh0z\niCFHra6RXWsJBUmfAbZHxNV50ePA9Ih4VtIbgBslHRcRpUsTOGmaWdsNImlugN3WcpnOnivFN9eZ\nltcZVxUr6VxgHvA7u8oiYjv59PERcZekh4Ae4K6yDvr03MzabhDXNJcDPfld7fHAmcDipjqLgXMA\nJJ0IbI6I3qpYSXOBPwHmR8TLAwclTcpvICHpKLKE+XDVvvlI08zabjsTasVFRL+khcBNwBjgyohY\nJWlBvn1RRCyRNE/SGmArcF5VbP7RfweMB26RBHBHfqf8ZODzkvqAncCCiNhc1UcnTTNru8E8RhkR\nS4GlTWWLmt4vbDU2L+8pqX89cH1K/5w0zazt/BilmVmCbn6Msnv3zMw6xrMcdcQrS8r3K962tkYT\nx9eImVQjBuAfxiWH/Mfx7yzecMdGHhhTvG3qmY8nt/MKSoekldrEockxAPvzQnLMQRRflz+UrUxn\nW+G2vjcnN8OY/vTJNza+fWJyzKt6fpkcA2QjCos8Bswq2fbtek0NlpOmmVkCJ00zswTbag45Gg2c\nNM2s7XykaWaWoJuT5oCPUUq6QNLBw9EZM+sOg3iMcsRr5UhzMvAzSXcB3wRuiohWZyIxs71QN4/T\nHPBIMyI+AxxLljDPBR6UdLGko4e4b2Y2Sg1muYuRrqVZjvIZj58EeoEdwMHAdyX95RD2zcxGqW5O\nmgMeQ0v6I7JpmDYBVwCfiog+SfsAD5JNt2Rm9rJtBev/dItWLjwcAvy3iHi0sTAidkr63aHplpmN\nZt18TXPAPYuIz1VsS1/E2sy63mg99W5F9/53YGYd46RpZpZgtI7BbMUITprPlZS/WLytv8bQ0Sdr\nLGi3PD0EgDfWiClbmfl+YEbxpusePTu5mTOOvHrgSk0eKevAAFbUmFpqKk8Ulj/OE9zP4YXbeg+c\nnNzO4yWfVeWsB/9fckxdfb9WXN5/b/m2Wy87Oa2Rv/+3tPolBnNNM1/P5+tkS1ZcERGXFNS5FDgV\neAE4NyJWVMXmI33eS7aI2kPAeRGxJd92IdmyvjuACyLi5qr+eWE1M2u7ukOO8kXOLgPmArOBsyTN\naqozDzgmX8LiY8DlLcTeDBwXEa8HHgAuzGNmky3ANjuP+0Y+MqiUk6aZtd12xrf0KjAHWBMRayOi\nD7gWmN9U5zTgKoCIuBM4SNKUqtiIuCUfbw5wJ786j5sPXBMRfRGxFliTf04pJ00za7tBPHt+BLCu\n4f36vKyVOlNbiIXsVHxJ/vNUdl9XvSzmZSP4mqaZjVaDuKbZ6s2JGjckQNJngO0RUXUhv7IPTppm\n1naDGHK0AZje8H46ux8JFtWZltcZVxUr6VxgHvA7A3zWhqoO+vTczNpuEM+eLwd6JM2QNJ7sJs3i\npjqLyR7tRtKJwOaI6K2Kze+q/wkwPyJeavqsD0kaL2km0AP8tGrffKRpZm1Xd5xmRPRLWgjcRDZs\n6MqIWCVpQb59UUQskTRP0hpgK3BeVWz+0X8HjAdukQRwR0ScHxErJV0HrAT6gfMHmvrSSdPM2m4w\n4zQjYimwtKlsUdP7ha3G5uU9Fe1dDFzcav+cNM2s7UqGE3UFJ00zazs/RmlmlmCvnhrOzCyVZznq\niOdLyl8s3ja2xljXp9NDmFgjBup902UxYyq2rRmX3MwPp70jOeaYMWuSY+qazFOF5Q/yC8bx64Xb\nZpM+1ev9vCY5ZlLPpuSYw+hNjgFYwnsKy+/efzUbDiyeseOCbZfWamuwnDTNzBI4adYg6ZvAe4Cn\nIuJ1edkhwHeAI4G1wBkRsXmo+mBmnbGNCZ3uwpAZyieCvkU21VKjPwVuiYhjgVvz92bWZbp5Ncoh\nS5oRcTvwbFPxy1M65X++b6jaN7PO6eakOdzXNCfnz4hCtoZ6+vTaZjbieZzmEIiIkFTxjOdfNPw8\nHXh1/nPJXdGdzQe1LdiSHsLPa8QAPDpwlT0cWlJ+z7LymK3pzWx74pnkmKf3qXcH+OHqCWQKbSr5\ni9qwbF1hOcCWGu08wfbkmCi5s1/llaVLuVS7m9WF5Y8ue7w05rq+6pnWVq8KVhd/7KB4nGb79Eqa\nEhFPSjocqn7jPlvxMW/bs2ifU9N7c2B6CL9RIwZK1/SpVLZGEMDckrWAatxWm3BKeoKZVHPI0VE1\nhgKVDTkCmH122ZCj9F/tOkOO3lZj3NphLU8Z2axkISDg+LOLt52xrXK5G5qnpZy4786SemlG66l3\nK4Z7arjFwIfznz8M3DjM7ZvZMPA1zRokXQOcDEyStA74c+ArwHWSPko+5Gio2jezztm23RN2JIuI\ns0o2pT9+Ymajyo5+X9M0M2vZjv7ReerdCidNM2s7J82OOKSkfGLxtv4aTRxTI6buQ5914sr2aSPZ\nFeECR56ePn7kBfZPjrl/W/qdZqh3h/odE35YWN5LLxM4unDbSmYnt/M2fpwcs4Ljk2NerPF9V+ln\nbOmkv9+d8IHET7tu8B0C+vvqJ818PZ+vk01Nc0VEXFJQ51LgVOAF4NyIWFEVK+mDwEVkQxDeFBF3\n5eUzgFXw8niuOyLi/Kr+jeCkaWaj1c4d9VKLpDHAZWT3PjYAP5O0uGGtHyTNA46JiB5JbwYuB04c\nIPZe4P3AIva0JiJOaLWPTppm1n71T8/nkCWxtQCSrgXmkx0N7vLy49gRcaekgyRNAWaWxUbE6rys\nbr9e5iV8zaz9Xhrb2mtPRwCNj3qtz8taqTO1hdgiMyWtkHSbpJMGquwjTTNrvzr3GDKtPi41+EPG\nzOPA9Ih4VtIbgBslHRcRZbOgO2ma2RConzQ3kE02sct0siPGqjrT8jrjWojdTURsh2zSgYi4S9JD\nQA9wV1mMT8/NrP36W3ztaTnQI2mGpPHAmWSPXzdaDJwDIOlEYHM+e1orsdBwlCppUn4DCUlHkSXM\nh6t2zUeaZtZ+ffXCIqJf0kLgJrJhQ1dGxCpJC/LtiyJiiaR5ktaQzet1XlUsgKT3A5cCk4B/kbQi\nIk4le9T785L6gJ3AgoFWk3DSNLP221E/NCKWAkubyhY1vV/YamxefgNwQ0H59cD1Kf1z0jSz9qt/\nTXPEc9I0s/Z7qdMdGDpOmmbWfj7SNDNL4KTZCWVr0Gwp2bYpvYkflC3CU6HeKg/w2hoxbywp7y3v\nx6N/W74kQqn0OSdgWt0lG9JdP/bM4g1P7+RnjxZvm3Xkvcnt3F3jizifbyTH3MS7k2MAjuX+wvKN\nbOSRkvVUvktnJuxw0jQzS1FzyNFo4KRpZu03iCFHI52Tppm1n0/PzcwSeMiRmVkCH2mamSVw0jQz\nS+CkaWaWwEOOzMwSeMiRmVkC3z03M0vga5pmZgl8TbMTXiwp316ybb8abdT4mx07rkY7wE9qxEwq\nKd8IrC3ZVudvdEqNmLU1FwO8r0bMviXf+X1jYWPxtlUfekN6OzVOKf9s/d+kB9WYUwXgjtVvL96w\n/EBuP+Ds4m371mtr0AZxTVPSXODrZEtWXBERlxTUuRQ4FXgBODciVlTFSvogcBHZt/+miLir4bMu\nBD6S9/qCiLi5qn9eWM3M2q/mwmr5ImeXAXOB2cBZkmY11ZkHHBMRPcDHgMtbiL0XeD/w702fNZts\nAbbZedw3JFXmRSdNM2u/+qtRzgHWRMTaiOgDrgXmN9U5DbgKICLuBA6SNKUqNiJWR8QDBe3NB66J\niL6IWEs26eKcql1z0jSz9utr8bWnI4B1De/X52Wt1JnaQmyzqey+NvqAMSP4mqaZjVrbake2Ort1\nzYvqg++Dk6aZtV/9IUcbgOkN76ez+5FgUZ1peZ1xLcQO1N60vKyUT8/NrP3qn54vB3okzZA0nuwm\nzeKmOouBcwAknQhsjojeFmNh96PUxcCHJI2XNBPoAX5atWs+0jSz9qs55Cgi+iUtBG4iGzZ0ZUSs\nkrQg374oIpZImidpDbAVOK8qFkDS+4FLyQby/YukFRFxakSslHQdsJLs+Pj8iPDpuZkNs0E8ERQR\nS4GlTWWLmt4vbDU2L78BuKEk5mLg4lb756RpZu3nxyjNzBL4MUozswT1hxyNeE6aZtZ+Pj3vhN6S\n8i0l2+6t0cZh6SH3zajRDnB8jbG4t5WUb6F8JNnqTentPH1oesxr00OA7CG1VB8qKd9c0Y/P1mhn\nbo2YgUYBFqkzaQmUT77RS/n3WretwfLpuZlZAs/cbmaWwKfnZmYJnDTNzBL4mqaZWQIPOTIzS+DT\nczOzBD49NzNL4CFHZmYJfHpuZpbASdPMLIGvaZqZJejiI02vEWRmlmAEH2k+U1K+tWTbczXaqHMO\nUfO/0LsHWn65yIsl5c/DE2WzGZXFVLg7PYSna8QArK0R892S8seAJ0u2vVSjnStqxJTNPFRlYo2Y\nqrbWAS+0ua0OkjQX+DrZOj9XRMQlBXUuBU4l2/NzI2JFVaykQ4DvAEeS/RaeERGbJc0AVgGr84++\nIyLOr+qfjzTNbMSQNAa4jGyivtnAWZJmNdWZBxwTET3Ax4DLW4j9U+CWiDgWuDV/v8uaiDghf1Um\nTBjCpCnpm5J6Jd3bUHaRpPWSVuSvOjMYmtmIV3sN3zlkSWxtRPQB1wLzm+qcBlwFEBF3AgdJmjJA\n7Msx+Z/vq7tnQ3mk+S32nNY1gK81ZPV/HcL2zaxj+lt87eEIsgsOu6zPy1qpM7UidnK+Njpk0zZP\nbqg3Mz+Iu03SSQPt2ZBd04yI2/PrBc1qTGFuZqNL7TFHlWuON2glj6jo8yIiJO0qfxyYHhHPSnoD\ncKOk4yLi+bIP7cQ1zU9IukfSlZIO6kD7ZjbkXmzxtYcNwPSG99PZc1GR5jrT8jpF5bsWhunNT+GR\ndDjwFEBEbI+IZ/Of7wIeAnqq9my4755fDnwh//mLwF8DHy2u+p2Gn1+Vv2D3o+9GdeaiGl8j5sAa\nMQAH14jZXlL+0xoxFbbUWCOo7m9O6f/fFR4rKX96WXlMnbvndfo2rkZMnYEeVW09U/E9DHR3f8tK\n2LKqZoeLCii1AAAE3ElEQVSq1D7SXA705GepjwNnAmc11VkMLASulXQisDkieiVtqohdDHwYuCT/\n80YASZOAZyNih6SjyBLmw1UdHNakGRFP7fpZ0hXA98trn1nxSa8rKHtLjR7tVyNm8sBVCrVzyBHA\nB2rElDhwWnrMlPQQoF4ye3XVtrOLy39Zo506w6hGwpAjgOkl30NqW//Urqtn9YbmRUS/pIXATWTD\nhq6MiFWSFuTbF0XEEknzJK0hG4N4XlVs/tFfAa6T9FHyIUd5+W8DX5DUB+wEFkTE5qo+DmvSlHR4\nRDyRv30/9ZaQNLMRr/5zlBGxFFjaVLao6f3CVmPz8meAdxSUfw/4Xkr/hixpSroGOBmYJGkd8Dng\nFEnHk12cfQRYMFTtm1knde9zlEN597z5OgTAN4eqPTMbSbp3xo4R/BilmY1eNa6tjxJOmmY2BHx6\nPgpsGLjKHurs/poaMQCzBq6yh7L/rddRfg/tFenNrK4xBmZ1nbE2AK9MD1lTMWKhdPRVnXE9vQNX\n2UPlkL7h8/NOd6CZT8/NzBL4SNPMLIGPNM3MEvhI08wsgY80zcwSeMiRmVkCH2mamSXwNU0zswQ+\n0hxBNna6AyPAo53uwAixstMdGCFG4vfgI80RxEnTSXOXoZg8dzQaid+DjzTNzBL4SNPMLEH3DjlS\nRKuLvw2fhpXizGyYRcSg1rxI/fc72PaG24hMmmZmI1UnlvA1Mxu1nDTNzBKMmqQpaa6k1ZIelPTp\nTvenUyStlfQLSSskVS2A3jUkfVNSr6R7G8oOkXSLpAck3SzpoE72cTiUfA8XSVqf/z6skDS3k33c\nG4yKpClpDHAZMBeYDZwlqc5U6N0ggFMi4oSImNPpzgyTb5H93Tf6U+CWiDgWuDV/3+2KvocAvpb/\nPpwQEf/agX7tVUZF0gTmAGsiYm1E9AHXAvM73KdOGlV3GwcrIm4Hnm0qPg24Kv/5KuB9w9qpDij5\nHmAv+33otNGSNI8gWxhnl/V52d4ogB9KWi7pDzrdmQ6aHBG7FvXpBSoWEup6n5B0j6Qr94bLFJ02\nWpKmx0X9ylsi4gTgVODjkt7a6Q51WmTj5vbW35HLgZnA8cATwF93tjvdb7QkzQ3A9Ib308mONvc6\nEfFE/udG4AaySxd7o15JUwAkHQ481eH+dEREPBU54Ar23t+HYTNakuZyoEfSDEnjgTOBxR3u07CT\ntL+kV+Q/HwC8i/K1fLvdYuDD+c8fBm7sYF86Jv8PY5f3s/f+PgybUfHseUT0S1oI3ASMAa6MiJE4\ntctQmwzcIAmyv7t/joibO9uloSfpGuBkYJKkdcCfA18BrpP0UWAtcEbnejg8Cr6HzwGnSDqe7PLE\nI8CCDnZxr+DHKM3MEoyW03MzsxHBSdPMLIGTpplZAidNM7METppmZgmcNM3MEjhpmpklcNI0M0vg\npGltIelN+Uw7EyQdIOk+SbM73S+zdvMTQdY2kr4I7AvsB6yLiEs63CWztnPStLaRNI5scpUXgd8M\n/3JZF/LpubXTJOAAYCLZ0aZZ1/GRprWNpMXA1cBRwOER8YkOd8ms7UbF1HA28kk6B9gWEddK2gf4\nT0mnRMRtHe6aWVv5SNPMLIGvaZqZJXDSNDNL4KRpZpbASdPMLIGTpplZAidNM7METppmZgmcNM3M\nEvx/rHWCrxSlro8AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1166,7 +1165,7 @@ "\tFilters =\t\n", " \t\tcell\t[10000]\n", "\tNuclides =\tU-235 U-238 \n", - "\tScores =\t['scatter-Y0,0', 'scatter-Y1,-1', 'scatter-Y1,0', 'scatter-Y1,1', 'scatter-Y2,-2', 'scatter-Y2,-1', 'scatter-Y2,0', 'scatter-Y2,1', 'scatter-Y2,2']\n", + "\tScores =\t[u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2']\n", "\tEstimator =\tanalog\n", "\n" ] @@ -1217,143 +1216,143 @@ " U-235\n", " scatter-Y0,0\n", " 0.036453\n", - " 0.000941\n", + " 0.001219\n", " \n", " \n", " 1\n", " 10000\n", " U-235\n", " scatter-Y1,-1\n", - " -0.000725\n", - " 0.000261\n", + " 0.000302\n", + " 0.000314\n", " \n", " \n", " 2\n", " 10000\n", " U-235\n", " scatter-Y1,0\n", - " -0.000088\n", - " 0.000408\n", + " -0.000006\n", + " 0.000347\n", " \n", " \n", " 3\n", " 10000\n", " U-235\n", " scatter-Y1,1\n", - " 0.000986\n", - " 0.000412\n", + " 0.000244\n", + " 0.000286\n", " \n", " \n", " 4\n", " 10000\n", " U-235\n", " scatter-Y2,-2\n", - " 0.000098\n", - " 0.000204\n", + " 0.000184\n", + " 0.000211\n", " \n", " \n", " 5\n", " 10000\n", " U-235\n", " scatter-Y2,-1\n", - " -0.000358\n", - " 0.000247\n", + " 0.000067\n", + " 0.000173\n", " \n", " \n", " 6\n", " 10000\n", " U-235\n", " scatter-Y2,0\n", - " 0.000197\n", - " 0.000140\n", + " 0.000353\n", + " 0.000210\n", " \n", " \n", " 7\n", " 10000\n", " U-235\n", " scatter-Y2,1\n", - " -0.000084\n", - " 0.000196\n", + " -0.000266\n", + " 0.000263\n", " \n", " \n", " 8\n", " 10000\n", " U-235\n", " scatter-Y2,2\n", - " 0.000052\n", - " 0.000168\n", + " -0.000246\n", + " 0.000153\n", " \n", " \n", " 9\n", " 10000\n", " U-238\n", " scatter-Y0,0\n", - " 2.325600\n", - " 0.015545\n", + " 2.315893\n", + " 0.008243\n", " \n", " \n", " 10\n", " 10000\n", " U-238\n", " scatter-Y1,-1\n", - " -0.030089\n", - " 0.002460\n", + " -0.022028\n", + " 0.002316\n", " \n", " \n", " 11\n", " 10000\n", " U-238\n", " scatter-Y1,0\n", - " -0.004451\n", - " 0.003663\n", + " -0.003426\n", + " 0.002651\n", " \n", " \n", " 12\n", " 10000\n", " U-238\n", " scatter-Y1,1\n", - " 0.020832\n", - " 0.002831\n", + " 0.026620\n", + " 0.002084\n", " \n", " \n", " 13\n", " 10000\n", " U-238\n", " scatter-Y2,-2\n", - " -0.004149\n", - " 0.001530\n", + " -0.001295\n", + " 0.001627\n", " \n", " \n", " 14\n", " 10000\n", " U-238\n", " scatter-Y2,-1\n", - " 0.000735\n", - " 0.001729\n", + " 0.000759\n", + " 0.001426\n", " \n", " \n", " 15\n", " 10000\n", " U-238\n", " scatter-Y2,0\n", - " 0.003431\n", - " 0.002098\n", + " 0.005513\n", + " 0.001983\n", " \n", " \n", " 16\n", " 10000\n", " U-238\n", " scatter-Y2,1\n", - " 0.000385\n", - " 0.001263\n", + " 0.000431\n", + " 0.001862\n", " \n", " \n", " 17\n", " 10000\n", " U-238\n", " scatter-Y2,2\n", - " 0.000002\n", - " 0.001718\n", + " -0.001962\n", + " 0.001222\n", " \n", " \n", "\n", @@ -1362,24 +1361,24 @@ "text/plain": [ " cell nuclide score mean std. dev.\n", "bin \n", - "0 10000 U-235 scatter-Y0,0 0.036453 0.000941\n", - "1 10000 U-235 scatter-Y1,-1 -0.000725 0.000261\n", - "2 10000 U-235 scatter-Y1,0 -0.000088 0.000408\n", - "3 10000 U-235 scatter-Y1,1 0.000986 0.000412\n", - "4 10000 U-235 scatter-Y2,-2 0.000098 0.000204\n", - "5 10000 U-235 scatter-Y2,-1 -0.000358 0.000247\n", - "6 10000 U-235 scatter-Y2,0 0.000197 0.000140\n", - "7 10000 U-235 scatter-Y2,1 -0.000084 0.000196\n", - "8 10000 U-235 scatter-Y2,2 0.000052 0.000168\n", - "9 10000 U-238 scatter-Y0,0 2.325600 0.015545\n", - "10 10000 U-238 scatter-Y1,-1 -0.030089 0.002460\n", - "11 10000 U-238 scatter-Y1,0 -0.004451 0.003663\n", - "12 10000 U-238 scatter-Y1,1 0.020832 0.002831\n", - "13 10000 U-238 scatter-Y2,-2 -0.004149 0.001530\n", - "14 10000 U-238 scatter-Y2,-1 0.000735 0.001729\n", - "15 10000 U-238 scatter-Y2,0 0.003431 0.002098\n", - "16 10000 U-238 scatter-Y2,1 0.000385 0.001263\n", - "17 10000 U-238 scatter-Y2,2 0.000002 0.001718" + "0 10000 U-235 scatter-Y0,0 0.036453 0.001219\n", + "1 10000 U-235 scatter-Y1,-1 0.000302 0.000314\n", + "2 10000 U-235 scatter-Y1,0 -0.000006 0.000347\n", + "3 10000 U-235 scatter-Y1,1 0.000244 0.000286\n", + "4 10000 U-235 scatter-Y2,-2 0.000184 0.000211\n", + "5 10000 U-235 scatter-Y2,-1 0.000067 0.000173\n", + "6 10000 U-235 scatter-Y2,0 0.000353 0.000210\n", + "7 10000 U-235 scatter-Y2,1 -0.000266 0.000263\n", + "8 10000 U-235 scatter-Y2,2 -0.000246 0.000153\n", + "9 10000 U-238 scatter-Y0,0 2.315893 0.008243\n", + "10 10000 U-238 scatter-Y1,-1 -0.022028 0.002316\n", + "11 10000 U-238 scatter-Y1,0 -0.003426 0.002651\n", + "12 10000 U-238 scatter-Y1,1 0.026620 0.002084\n", + "13 10000 U-238 scatter-Y2,-2 -0.001295 0.001627\n", + "14 10000 U-238 scatter-Y2,-1 0.000759 0.001426\n", + "15 10000 U-238 scatter-Y2,0 0.005513 0.001983\n", + "16 10000 U-238 scatter-Y2,1 0.000431 0.001862\n", + "17 10000 U-238 scatter-Y2,2 -0.001962 0.001222" ] }, "execution_count": 29, @@ -1413,8 +1412,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00171834 0.01554515]\n", - " [ 0.00016768 0.00094081]]]\n" + "[[[ 0.00122163 0.00824348]\n", + " [ 0.00015287 0.00121882]]]\n" ] } ], @@ -1482,25 +1481,25 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.04682759]]\n", + "[[[ 0.0400168 ]]\n", "\n", - " [[ 0.03205271]]\n", + " [[ 0.05233031]]\n", "\n", - " [[ 0.03592433]]\n", + " [[ 0.03819276]]\n", "\n", - " [[ 0.02417979]]\n", + " [[ 0.02900783]]\n", "\n", - " [[ 0.02524314]]\n", + " [[ 0.03176394]]\n", "\n", - " [[ 0.02390359]]\n", + " [[ 0.03046477]]\n", "\n", - " [[ 0.0274475 ]]\n", + " [[ 0.03864163]]\n", "\n", - " [[ 0.02827721]]\n", + " [[ 0.02455132]]\n", "\n", - " [[ 0.0231313 ]]\n", + " [[ 0.02282716]]\n", "\n", - " [[ 0.01898386]]]\n" + " [[ 0.02162945]]]\n" ] } ], @@ -1552,141 +1551,141 @@ " 558\n", " 279\n", " absorption\n", - " 0.000095\n", - " 0.000009\n", + " 0.000085\n", + " 0.000008\n", " \n", " \n", " 559\n", " 279\n", " scatter\n", - " 0.013611\n", - " 0.000544\n", + " 0.013429\n", + " 0.000449\n", " \n", " \n", " 560\n", " 280\n", " absorption\n", - " 0.000096\n", - " 0.000009\n", + " 0.000095\n", + " 0.000014\n", " \n", " \n", " 561\n", " 280\n", " scatter\n", - " 0.013999\n", - " 0.000568\n", + " 0.014770\n", + " 0.000783\n", " \n", " \n", " 562\n", " 281\n", " absorption\n", - " 0.000117\n", - " 0.000015\n", + " 0.000107\n", + " 0.000013\n", " \n", " \n", " 563\n", " 281\n", " scatter\n", - " 0.015951\n", - " 0.000682\n", + " 0.015044\n", + " 0.000605\n", " \n", " \n", " 564\n", " 282\n", " absorption\n", - " 0.000104\n", - " 0.000011\n", + " 0.000110\n", + " 0.000010\n", " \n", " \n", " 565\n", " 282\n", " scatter\n", - " 0.016057\n", - " 0.000574\n", + " 0.016090\n", + " 0.000795\n", " \n", " \n", " 566\n", " 283\n", " absorption\n", - " 0.000117\n", - " 0.000013\n", + " 0.000121\n", + " 0.000012\n", " \n", " \n", " 567\n", " 283\n", " scatter\n", - " 0.015997\n", - " 0.000706\n", + " 0.017010\n", + " 0.000793\n", " \n", " \n", " 568\n", " 284\n", " absorption\n", - " 0.000108\n", + " 0.000110\n", " 0.000007\n", " \n", " \n", " 569\n", " 284\n", " scatter\n", - " 0.016720\n", - " 0.000639\n", + " 0.017010\n", + " 0.000430\n", " \n", " \n", " 570\n", " 285\n", " absorption\n", - " 0.000116\n", - " 0.000008\n", + " 0.000112\n", + " 0.000007\n", " \n", " \n", " 571\n", " 285\n", " scatter\n", - " 0.017764\n", - " 0.000639\n", + " 0.017499\n", + " 0.000615\n", " \n", " \n", " 572\n", " 286\n", " absorption\n", - " 0.000111\n", - " 0.000014\n", + " 0.000127\n", + " 0.000016\n", " \n", " \n", " 573\n", " 286\n", " scatter\n", - " 0.018101\n", - " 0.000766\n", + " 0.017716\n", + " 0.000690\n", " \n", " \n", " 574\n", " 287\n", " absorption\n", - " 0.000115\n", - " 0.000012\n", + " 0.000119\n", + " 0.000013\n", " \n", " \n", " 575\n", " 287\n", " scatter\n", - " 0.018411\n", - " 0.000655\n", + " 0.018041\n", + " 0.000702\n", " \n", " \n", " 576\n", " 288\n", " absorption\n", - " 0.000138\n", - " 0.000014\n", + " 0.000125\n", + " 0.000013\n", " \n", " \n", " 577\n", " 288\n", " scatter\n", - " 0.019154\n", - " 0.000763\n", + " 0.018212\n", + " 0.000715\n", " \n", " \n", "\n", @@ -1695,26 +1694,26 @@ "text/plain": [ " distribcell score mean std. dev.\n", "bin \n", - "558 279 absorption 0.000095 0.000009\n", - "559 279 scatter 0.013611 0.000544\n", - "560 280 absorption 0.000096 0.000009\n", - "561 280 scatter 0.013999 0.000568\n", - "562 281 absorption 0.000117 0.000015\n", - "563 281 scatter 0.015951 0.000682\n", - "564 282 absorption 0.000104 0.000011\n", - "565 282 scatter 0.016057 0.000574\n", - "566 283 absorption 0.000117 0.000013\n", - "567 283 scatter 0.015997 0.000706\n", - "568 284 absorption 0.000108 0.000007\n", - "569 284 scatter 0.016720 0.000639\n", - "570 285 absorption 0.000116 0.000008\n", - "571 285 scatter 0.017764 0.000639\n", - "572 286 absorption 0.000111 0.000014\n", - "573 286 scatter 0.018101 0.000766\n", - "574 287 absorption 0.000115 0.000012\n", - "575 287 scatter 0.018411 0.000655\n", - "576 288 absorption 0.000138 0.000014\n", - "577 288 scatter 0.019154 0.000763" + "558 279 absorption 0.000085 0.000008\n", + "559 279 scatter 0.013429 0.000449\n", + "560 280 absorption 0.000095 0.000014\n", + "561 280 scatter 0.014770 0.000783\n", + "562 281 absorption 0.000107 0.000013\n", + "563 281 scatter 0.015044 0.000605\n", + "564 282 absorption 0.000110 0.000010\n", + "565 282 scatter 0.016090 0.000795\n", + "566 283 absorption 0.000121 0.000012\n", + "567 283 scatter 0.017010 0.000793\n", + "568 284 absorption 0.000110 0.000007\n", + "569 284 scatter 0.017010 0.000430\n", + "570 285 absorption 0.000112 0.000007\n", + "571 285 scatter 0.017499 0.000615\n", + "572 286 absorption 0.000127 0.000016\n", + "573 286 scatter 0.017716 0.000690\n", + "574 287 absorption 0.000119 0.000013\n", + "575 287 scatter 0.018041 0.000702\n", + "576 288 absorption 0.000125 0.000013\n", + "577 288 scatter 0.018212 0.000715" ] }, "execution_count": 33, @@ -1816,8 +1815,8 @@ " 10000\n", " 0\n", " absorption\n", - " 0.000122\n", - " 0.000010\n", + " 0.000136\n", + " 0.000017\n", " \n", " \n", " 1\n", @@ -1831,8 +1830,8 @@ " 10000\n", " 0\n", " scatter\n", - " 0.018596\n", - " 0.000871\n", + " 0.018504\n", + " 0.000740\n", " \n", " \n", " 2\n", @@ -1846,8 +1845,8 @@ " 10000\n", " 1\n", " absorption\n", - " 0.000206\n", - " 0.000014\n", + " 0.000231\n", + " 0.000031\n", " \n", " \n", " 3\n", @@ -1861,8 +1860,8 @@ " 10000\n", " 1\n", " scatter\n", - " 0.029733\n", - " 0.000953\n", + " 0.029149\n", + " 0.001525\n", " \n", " \n", " 4\n", @@ -1876,8 +1875,8 @@ " 10000\n", " 2\n", " absorption\n", - " 0.000280\n", - " 0.000018\n", + " 0.000306\n", + " 0.000032\n", " \n", " \n", " 5\n", @@ -1891,8 +1890,8 @@ " 10000\n", " 2\n", " scatter\n", - " 0.038494\n", - " 0.001383\n", + " 0.039770\n", + " 0.001519\n", " \n", " \n", " 6\n", @@ -1906,8 +1905,8 @@ " 10000\n", " 3\n", " absorption\n", - " 0.000384\n", - " 0.000026\n", + " 0.000339\n", + " 0.000028\n", " \n", " \n", " 7\n", @@ -1921,8 +1920,8 @@ " 10000\n", " 3\n", " scatter\n", - " 0.048839\n", - " 0.001181\n", + " 0.046708\n", + " 0.001355\n", " \n", " \n", " 8\n", @@ -1936,8 +1935,8 @@ " 10000\n", " 4\n", " absorption\n", - " 0.000457\n", - " 0.000023\n", + " 0.000433\n", + " 0.000031\n", " \n", " \n", " 9\n", @@ -1951,8 +1950,8 @@ " 10000\n", " 4\n", " scatter\n", - " 0.058061\n", - " 0.001466\n", + " 0.056359\n", + " 0.001790\n", " \n", " \n", " 10\n", @@ -1966,8 +1965,8 @@ " 10000\n", " 5\n", " absorption\n", - " 0.000494\n", - " 0.000026\n", + " 0.000538\n", + " 0.000028\n", " \n", " \n", " 11\n", @@ -1981,8 +1980,8 @@ " 10000\n", " 5\n", " scatter\n", - " 0.065874\n", - " 0.001575\n", + " 0.064943\n", + " 0.001978\n", " \n", " \n", " 12\n", @@ -1996,8 +1995,8 @@ " 10000\n", " 6\n", " absorption\n", - " 0.000490\n", - " 0.000032\n", + " 0.000588\n", + " 0.000028\n", " \n", " \n", " 13\n", @@ -2011,8 +2010,8 @@ " 10000\n", " 6\n", " scatter\n", - " 0.072420\n", - " 0.001988\n", + " 0.070231\n", + " 0.002714\n", " \n", " \n", " 14\n", @@ -2026,8 +2025,8 @@ " 10000\n", " 7\n", " absorption\n", - " 0.000605\n", - " 0.000042\n", + " 0.000670\n", + " 0.000041\n", " \n", " \n", " 15\n", @@ -2041,8 +2040,8 @@ " 10000\n", " 7\n", " scatter\n", - " 0.078802\n", - " 0.002228\n", + " 0.075852\n", + " 0.001862\n", " \n", " \n", " 16\n", @@ -2056,8 +2055,8 @@ " 10000\n", " 8\n", " absorption\n", - " 0.000627\n", - " 0.000037\n", + " 0.000745\n", + " 0.000039\n", " \n", " \n", " 17\n", @@ -2071,8 +2070,8 @@ " 10000\n", " 8\n", " scatter\n", - " 0.083684\n", - " 0.001936\n", + " 0.086234\n", + " 0.001968\n", " \n", " \n", " 18\n", @@ -2086,8 +2085,8 @@ " 10000\n", " 9\n", " absorption\n", - " 0.000711\n", - " 0.000040\n", + " 0.000731\n", + " 0.000039\n", " \n", " \n", " 19\n", @@ -2101,8 +2100,8 @@ " 10000\n", " 9\n", " scatter\n", - " 0.088989\n", - " 0.001689\n", + " 0.090448\n", + " 0.001956\n", " \n", " \n", "\n", @@ -2138,26 +2137,26 @@ " \n", " \n", "bin \n", - "0 0.000122 0.000010 \n", - "1 0.018596 0.000871 \n", - "2 0.000206 0.000014 \n", - "3 0.029733 0.000953 \n", - "4 0.000280 0.000018 \n", - "5 0.038494 0.001383 \n", - "6 0.000384 0.000026 \n", - "7 0.048839 0.001181 \n", - "8 0.000457 0.000023 \n", - "9 0.058061 0.001466 \n", - "10 0.000494 0.000026 \n", - "11 0.065874 0.001575 \n", - "12 0.000490 0.000032 \n", - "13 0.072420 0.001988 \n", - "14 0.000605 0.000042 \n", - "15 0.078802 0.002228 \n", - "16 0.000627 0.000037 \n", - "17 0.083684 0.001936 \n", - "18 0.000711 0.000040 \n", - "19 0.088989 0.001689 " + "0 0.000136 0.000017 \n", + "1 0.018504 0.000740 \n", + "2 0.000231 0.000031 \n", + "3 0.029149 0.001525 \n", + "4 0.000306 0.000032 \n", + "5 0.039770 0.001519 \n", + "6 0.000339 0.000028 \n", + "7 0.046708 0.001355 \n", + "8 0.000433 0.000031 \n", + "9 0.056359 0.001790 \n", + "10 0.000538 0.000028 \n", + "11 0.064943 0.001978 \n", + "12 0.000588 0.000028 \n", + "13 0.070231 0.002714 \n", + "14 0.000670 0.000041 \n", + "15 0.075852 0.001862 \n", + "16 0.000745 0.000039 \n", + "17 0.086234 0.001968 \n", + "18 0.000731 0.000039 \n", + "19 0.090448 0.001956 " ] }, "execution_count": 34, @@ -2210,38 +2209,38 @@ " \n", " \n", " mean\n", - " 0.000414\n", + " 0.000416\n", " 0.000025\n", " \n", " \n", " std\n", - " 0.000241\n", - " 0.000010\n", + " 0.000238\n", + " 0.000011\n", " \n", " \n", " min\n", - " 0.000013\n", - " 0.000003\n", + " 0.000023\n", + " 0.000004\n", " \n", " \n", " 25%\n", - " 0.000204\n", + " 0.000206\n", " 0.000017\n", " \n", " \n", " 50%\n", - " 0.000387\n", + " 0.000391\n", " 0.000024\n", " \n", " \n", " 75%\n", - " 0.000594\n", + " 0.000626\n", " 0.000031\n", " \n", " \n", " max\n", - " 0.000919\n", - " 0.000060\n", + " 0.000928\n", + " 0.000061\n", " \n", " \n", "\n", @@ -2252,13 +2251,13 @@ " \n", " \n", "count 289.000000 289.000000\n", - "mean 0.000414 0.000025\n", - "std 0.000241 0.000010\n", - "min 0.000013 0.000003\n", - "25% 0.000204 0.000017\n", - "50% 0.000387 0.000024\n", - "75% 0.000594 0.000031\n", - "max 0.000919 0.000060" + "mean 0.000416 0.000025\n", + "std 0.000238 0.000011\n", + "min 0.000023 0.000004\n", + "25% 0.000206 0.000017\n", + "50% 0.000391 0.000024\n", + "75% 0.000626 0.000031\n", + "max 0.000928 0.000061" ] }, "execution_count": 35, @@ -2293,7 +2292,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 0.378626583393\n" + "Mann-Whitney Test p-value: 0.474494586047\n" ] } ], @@ -2331,7 +2330,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 7.18782749267e-43\n" + "Mann-Whitney Test p-value: 1.364780046e-41\n" ] } ], @@ -2377,7 +2376,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2386,9 +2385,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2415,7 +2414,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2424,9 +2423,9 @@ }, { "data": { - "image/png": "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\ngXbt2u1+pgym9cts2bx+2bxuiaJRUkVkp8Lx9rJOnz59oo6QEInasVyWioKIlCtZHzxSNcks2Oo+\nEhGRGBUFERGJUVEQEZEYFQUREYlRURCRjFJQUMD48eNjj0eOHEmTJk344IMPyMnJIS8vj7y8PJo2\nbcqZZ57JuHHjdmhfr1692Hx5eXlcf/31qV6NtKWiICIZxcxiR98MGzaMa6+9ljfffJNWrVoBUFxc\nzJo1a5gyZQonn3wy55xzDsOGDduu/euvv86aNWtit4ceeiiSdUlHKgoiknHcnUcffZSBAwcyZswY\njjnmmB3m2Weffbj++usZNGgQt9xySwQpM5OKgohknCFDhnD77bfzzjvv0KlTp13Oe84557B06VJm\nzJgRm6bzL8qnk9dEpFLsjsScQOW3V+wD2t0ZN24c3bp1o3379rudv3nz5gCsXLky1v7ss8+mRo3/\nfPzdd999XH755RXKka1UFESkUir6YZ4oZsY///lP7rrrLq644goef/zxXc7/ww8/ANCkSZNY+1df\nfZVu3bolPWsmUveRiGSc/Px8xo8fz4cffsg111yzy3lffvll8vPzOfjgg1OULrOpKIhIRmrWrBnj\nx4/nrbfe4sYbb4xN37a/YMmSJTz88MPceeed3HPPPdu11T6F8qn7SEQyVsuWLXnnnXc44YQTWLx4\nMQCNGjXC3alfvz5HH300L774Iqeccsp27c4880xyc3Njj0855RRGjRqV0uzpSkVBRDLK3Llzt3tc\nUFDA/PnzASgsLKxwe9meuo9ERCRGRUFERGJUFEREJEZFQUREYlQUREQkRkVBRERiVBRERCRGRUFE\nRGJUFEQkq7Rv354PPvgg6hgZS0VBROKy7YpnybzFo+zlOAGeeuopfvGLXwAwbdo0TjjhhF0uY968\neeTk5FBSUlK5X0YW0zAXIlIByRxILr6iUJECsjvJGhhv69at242tlEm0pSAiWaWgoIB33nkHgEmT\nJnHUUUfRsGFDmjZtysCBAwFiWxKNGjUiLy+PTz/9FHfn7rvvpqCggPz8fC6++GJWr14dW+7w4cNp\n3bo1e+21V2y+ba8zaNAgzjvvPPr27UvDhg0ZNmwYn332GcceeyyNGzemefPmXHfddWzevDm2vJyc\nHB555BEOPPBAGjRowG233cbs2bM59thjadSoET179txu/lRRURCRjLOrb/iltyJuuOEGBgwYQHFx\n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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2459,7 +2458,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.8" + "version": "2.7.9" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 2b12052046..0ff2e5f587 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -358,7 +358,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMDgtMDZUMTY6NDM6MTMrMDc6MDBtUQj+AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA4LTA2\nVDE2OjQzOjEzKzA3OjAwHAywQgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEAsiA0Bbyc8AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMTZUMTg6MzE6\nMzUrMDc6MDDLyLisAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTE2VDE4OjMxOjM1KzA3OjAw\nupUAEAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -569,7 +569,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Date/Time: 2015-08-15 10:52:49\n", + " Git SHA1: 36a516ed8125ab8a86d8c9b3aee4bd4bc2db859c\n", + " Date/Time: 2015-09-16 18:34:04\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -595,26 +596,26 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.00465 \n", - " 2/1 1.05814 \n", - " 3/1 1.05114 \n", - " 4/1 1.09189 \n", - " 5/1 1.03731 \n", - " 6/1 1.03510 \n", - " 7/1 1.09378 1.06444 +/- 0.02934\n", - " 8/1 1.04522 1.05803 +/- 0.01811\n", - " 9/1 1.06557 1.05992 +/- 0.01294\n", - " 10/1 1.05757 1.05945 +/- 0.01004\n", - " 11/1 1.04858 1.05764 +/- 0.00839\n", - " 12/1 1.01832 1.05202 +/- 0.00905\n", - " 13/1 1.05822 1.05279 +/- 0.00787\n", - " 14/1 1.07684 1.05547 +/- 0.00744\n", - " 15/1 1.00349 1.05027 +/- 0.00844\n", - " 16/1 1.06969 1.05203 +/- 0.00784\n", - " 17/1 1.06377 1.05301 +/- 0.00722\n", - " 18/1 1.02897 1.05116 +/- 0.00690\n", - " 19/1 1.00685 1.04800 +/- 0.00713\n", - " 20/1 1.02644 1.04656 +/- 0.00679\n", + " 1/1 1.00279 \n", + " 2/1 1.03320 \n", + " 3/1 1.04467 \n", + " 4/1 1.09693 \n", + " 5/1 1.05008 \n", + " 6/1 1.08426 \n", + " 7/1 1.05363 1.06894 +/- 0.01531\n", + " 8/1 0.97961 1.03917 +/- 0.03106\n", + " 9/1 1.06444 1.04549 +/- 0.02285\n", + " 10/1 1.08345 1.05308 +/- 0.01926\n", + " 11/1 1.06871 1.05568 +/- 0.01594\n", + " 12/1 1.03183 1.05228 +/- 0.01390\n", + " 13/1 1.04486 1.05135 +/- 0.01207\n", + " 14/1 1.06468 1.05283 +/- 0.01075\n", + " 15/1 1.04185 1.05173 +/- 0.00968\n", + " 16/1 1.01268 1.04818 +/- 0.00944\n", + " 17/1 1.04129 1.04761 +/- 0.00864\n", + " 18/1 1.01127 1.04481 +/- 0.00843\n", + " 19/1 1.03738 1.04428 +/- 0.00782\n", + " 20/1 1.04410 1.04427 +/- 0.00728\n", " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", @@ -624,27 +625,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.4100E-01 seconds\n", - " Reading cross sections = 1.1300E-01 seconds\n", - " Total time in simulation = 1.8418E+01 seconds\n", - " Time in transport only = 1.8403E+01 seconds\n", - " Time in inactive batches = 2.1070E+00 seconds\n", - " Time in active batches = 1.6311E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", + " Total time for initialization = 5.2100E-01 seconds\n", + " Reading cross sections = 1.7200E-01 seconds\n", + " Total time in simulation = 1.5669E+01 seconds\n", + " Time in transport only = 1.5663E+01 seconds\n", + " Time in inactive batches = 2.1160E+00 seconds\n", + " Time in active batches = 1.3553E+01 seconds\n", + " Time synchronizing fission bank = 0.0000E+00 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.8861E+01 seconds\n", - " Calculation Rate (inactive) = 5932.61 neutrons/second\n", - " Calculation Rate (active) = 2299.06 neutrons/second\n", + " Total time elapsed = 1.6203E+01 seconds\n", + " Calculation Rate (inactive) = 5907.37 neutrons/second\n", + " Calculation Rate (active) = 2766.91 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.04599 +/- 0.00622\n", - " k-effective (Track-length) = 1.04656 +/- 0.00679\n", - " k-effective (Absorption) = 1.04614 +/- 0.00461\n", - " Combined k-effective = 1.04651 +/- 0.00368\n", + " k-effective (Collision) = 1.04044 +/- 0.00527\n", + " k-effective (Track-length) = 1.04427 +/- 0.00728\n", + " k-effective (Absorption) = 1.04794 +/- 0.00535\n", + " Combined k-effective = 1.04628 +/- 0.00467\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -692,8 +693,7 @@ "outputs": [], "source": [ "# Load the statepoint file\n", - "sp = StatePoint('statepoint.20.h5')\n", - "sp.read_results()" + "sp = StatePoint('statepoint.20.h5')" ] }, { @@ -759,8 +759,8 @@ " 0\n", " total\n", " (nu-fission / absorption)\n", - " 1.042726\n", - " 0.008661\n", + " 1.046353\n", + " 0.00935\n", " \n", " \n", "\n", @@ -769,7 +769,7 @@ "text/plain": [ " nuclide score mean std. dev.\n", "bin \n", - "0 total (nu-fission / absorption) 1.042726 0.008661" + "0 total (nu-fission / absorption) 1.046353 0.00935" ] }, "execution_count": 26, @@ -827,17 +827,17 @@ " 0\n", " total\n", " absorption\n", - " 0.958874\n", - " 0.007146\n", + " 0.95873\n", + " 0.00774\n", " \n", " \n", "\n", "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total absorption 0.958874 0.007146" + " nuclide score mean std. dev.\n", + "bin \n", + "0 total absorption 0.95873 0.00774" ] }, "execution_count": 27, @@ -893,17 +893,17 @@ " 0\n", " total\n", " nu-fission\n", - " 1.09186\n", - " 0.010424\n", + " 1.091622\n", + " 0.011163\n", " \n", " \n", "\n", "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total nu-fission 1.09186 0.010424" + " nuclide score mean std. dev.\n", + "bin \n", + "0 total nu-fission 1.091622 0.011163" ] }, "execution_count": 28, @@ -966,8 +966,8 @@ " 10000\n", " total\n", " absorption\n", - " 0.802921\n", - " 0.006109\n", + " 0.802012\n", + " 0.006609\n", " \n", " \n", "\n", @@ -976,7 +976,7 @@ "text/plain": [ " energy [MeV] cell nuclide score mean std. dev.\n", "bin \n", - "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802921 0.006109" + "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802012 0.006609" ] }, "execution_count": 29, @@ -1037,8 +1037,8 @@ " 10000\n", " total\n", " (nu-fission / absorption)\n", - " 1.240421\n", - " 0.010978\n", + " 1.246604\n", + " 0.011825\n", " \n", " \n", "\n", @@ -1047,11 +1047,11 @@ "text/plain": [ " energy [MeV] cell nuclide score mean \\\n", "bin \n", - "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.240421 \n", + "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.246604 \n", "\n", " std. dev. \n", "bin \n", - "0 0.010978 " + "0 0.011825 " ] }, "execution_count": 30, @@ -1105,8 +1105,8 @@ " 0\n", " total\n", " (((absorption * nu-fission) * absorption) * (n...\n", - " 1.042726\n", - " 0.017538\n", + " 1.046353\n", + " 0.01894\n", " \n", " \n", "\n", @@ -1115,11 +1115,11 @@ "text/plain": [ " nuclide score mean \\\n", "bin \n", - "0 total (((absorption * nu-fission) * absorption) * (n... 1.042726 \n", + "0 total (((absorption * nu-fission) * absorption) * (n... 1.046353 \n", "\n", " std. dev. \n", "bin \n", - "0 0.017538 " + "0 0.01894 " ] }, "execution_count": 31, @@ -1197,7 +1197,7 @@ " (U-238 / total)\n", " (nu-fission / flux)\n", " 0.000001\n", - " 6.985151e-09\n", + " 6.859257e-09\n", " \n", " \n", " 1\n", @@ -1205,8 +1205,8 @@ " 0.0e+00 - 6.3e-07\n", " (U-238 / total)\n", " (scatter / flux)\n", - " 0.209988\n", - " 2.206753e-03\n", + " 0.209986\n", + " 1.966887e-03\n", " \n", " \n", " 2\n", @@ -1214,8 +1214,8 @@ " 0.0e+00 - 6.3e-07\n", " (U-235 / total)\n", " (nu-fission / flux)\n", - " 0.355276\n", - " 3.741612e-03\n", + " 0.355667\n", + " 3.717881e-03\n", " \n", " \n", " 3\n", @@ -1224,7 +1224,7 @@ " (U-235 / total)\n", " (scatter / flux)\n", " 0.005555\n", - " 5.842517e-05\n", + " 5.218094e-05\n", " \n", " \n", " 4\n", @@ -1232,8 +1232,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-238 / total)\n", " (nu-fission / flux)\n", - " 0.007229\n", - " 5.951357e-05\n", + " 0.007165\n", + " 5.625590e-05\n", " \n", " \n", " 5\n", @@ -1241,8 +1241,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-238 / total)\n", " (scatter / flux)\n", - " 0.227642\n", - " 9.496469e-04\n", + " 0.227653\n", + " 8.544314e-04\n", " \n", " \n", " 6\n", @@ -1250,8 +1250,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-235 / total)\n", " (nu-fission / flux)\n", - " 0.008076\n", - " 5.699123e-05\n", + " 0.008089\n", + " 5.080374e-05\n", " \n", " \n", " 7\n", @@ -1259,8 +1259,8 @@ " 6.3e-07 - 2.0e+01\n", " (U-235 / total)\n", " (scatter / flux)\n", - " 0.003369\n", - " 1.369755e-05\n", + " 0.003370\n", + " 1.361116e-05\n", " \n", " \n", "\n", @@ -1270,24 +1270,24 @@ " cell energy [MeV] nuclide score mean \\\n", "bin \n", "0 10000 0.0e+00 - 6.3e-07 (U-238 / total) (nu-fission / flux) 0.000001 \n", - "1 10000 0.0e+00 - 6.3e-07 (U-238 / total) (scatter / flux) 0.209988 \n", - "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355276 \n", + "1 10000 0.0e+00 - 6.3e-07 (U-238 / total) (scatter / flux) 0.209986 \n", + "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355667 \n", "3 10000 0.0e+00 - 6.3e-07 (U-235 / total) (scatter / flux) 0.005555 \n", - "4 10000 6.3e-07 - 2.0e+01 (U-238 / total) (nu-fission / flux) 0.007229 \n", - "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227642 \n", - "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008076 \n", - "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003369 \n", + "4 10000 6.3e-07 - 2.0e+01 (U-238 / total) (nu-fission / flux) 0.007165 \n", + "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227653 \n", + "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008089 \n", + "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003370 \n", "\n", " std. dev. \n", "bin \n", - "0 6.985151e-09 \n", - "1 2.206753e-03 \n", - "2 3.741612e-03 \n", - "3 5.842517e-05 \n", - "4 5.951357e-05 \n", - "5 9.496469e-04 \n", - "6 5.699123e-05 \n", - "7 1.369755e-05 " + "0 6.859257e-09 \n", + "1 1.966887e-03 \n", + "2 3.717881e-03 \n", + "3 5.218094e-05 \n", + "4 5.625590e-05 \n", + "5 8.544314e-04 \n", + "6 5.080374e-05 \n", + "7 1.361116e-05 " ] }, "execution_count": 33, @@ -1318,11 +1318,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 6.63809296e-07]\n", - " [ 3.55275544e-01]]\n", + "[[[ 6.64174599e-07]\n", + " [ 3.55666541e-01]]\n", "\n", - " [[ 7.22895528e-03]\n", - " [ 8.07565148e-03]]]\n" + " [[ 7.16505734e-03]\n", + " [ 8.08949336e-03]]]\n" ] } ], @@ -1350,9 +1350,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00555505]]\n", + "[[[ 0.00555465]]\n", "\n", - " [[ 0.0033688 ]]]\n" + " [[ 0.00337011]]]\n" ] } ], @@ -1374,8 +1374,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.2276418]\n", - " [ 0.0033688]]]\n" + "[[[ 0.22765348]\n", + " [ 0.00337011]]]\n" ] } ], @@ -1434,7 +1434,7 @@ " U-238\n", " nu-fission\n", " 0.000002\n", - " 1.211808e-08\n", + " 1.284890e-08\n", " \n", " \n", " 1\n", @@ -1442,8 +1442,8 @@ " 0.0e+00 - 6.3e-07\n", " U-235\n", " nu-fission\n", - " 0.870360\n", - " 6.496431e-03\n", + " 0.867982\n", + " 7.022256e-03\n", " \n", " \n", " 2\n", @@ -1451,8 +1451,8 @@ " 6.3e-07 - 2.0e+01\n", " U-238\n", " nu-fission\n", - " 0.083226\n", - " 6.367951e-04\n", + " 0.082801\n", + " 6.087096e-04\n", " \n", " \n", " 3\n", @@ -1460,8 +1460,8 @@ " 6.3e-07 - 2.0e+01\n", " U-235\n", " nu-fission\n", - " 0.092974\n", - " 5.921990e-04\n", + " 0.093484\n", + " 5.275039e-04\n", " \n", " \n", "\n", @@ -1470,10 +1470,10 @@ "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", "bin \n", - "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 1.211808e-08\n", - "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.870360 6.496431e-03\n", - "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.083226 6.367951e-04\n", - "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.092974 5.921990e-04" + "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 1.284890e-08\n", + "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.867982 7.022256e-03\n", + "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.082801 6.087096e-04\n", + "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093484 5.275039e-04" ] }, "execution_count": 37, @@ -1526,8 +1526,8 @@ " 1.0e-08 - 1.1e-07\n", " H-1\n", " scatter\n", - " 4.638428\n", - " 0.034134\n", + " 4.620525\n", + " 0.038249\n", " \n", " \n", " 1\n", @@ -1535,8 +1535,8 @@ " 1.1e-07 - 1.2e-06\n", " H-1\n", " scatter\n", - " 2.050818\n", - " 0.010745\n", + " 2.036841\n", + " 0.013203\n", " \n", " \n", " 2\n", @@ -1544,8 +1544,8 @@ " 1.2e-06 - 1.3e-05\n", " H-1\n", " scatter\n", - " 1.656905\n", - " 0.009480\n", + " 1.659916\n", + " 0.010107\n", " \n", " \n", " 3\n", @@ -1553,8 +1553,8 @@ " 1.3e-05 - 1.4e-04\n", " H-1\n", " scatter\n", - " 1.870808\n", - " 0.011883\n", + " 1.861546\n", + " 0.013328\n", " \n", " \n", " 4\n", @@ -1562,8 +1562,8 @@ " 1.4e-04 - 1.5e-03\n", " H-1\n", " scatter\n", - " 2.045621\n", - " 0.011414\n", + " 2.049664\n", + " 0.008215\n", " \n", " \n", " 5\n", @@ -1571,8 +1571,8 @@ " 1.5e-03 - 1.6e-02\n", " H-1\n", " scatter\n", - " 2.163297\n", - " 0.008725\n", + " 2.162157\n", + " 0.010245\n", " \n", " \n", " 6\n", @@ -1580,8 +1580,8 @@ " 1.6e-02 - 1.7e-01\n", " H-1\n", " scatter\n", - " 2.202045\n", - " 0.013500\n", + " 2.224496\n", + " 0.013796\n", " \n", " \n", " 7\n", @@ -1589,8 +1589,8 @@ " 1.7e-01 - 1.9e+00\n", " H-1\n", " scatter\n", - " 1.996977\n", - " 0.010791\n", + " 1.997585\n", + " 0.009161\n", " \n", " \n", " 8\n", @@ -1598,8 +1598,8 @@ " 1.9e+00 - 2.0e+01\n", " H-1\n", " scatter\n", - " 0.370890\n", - " 0.003597\n", + " 0.373472\n", + " 0.003922\n", " \n", " \n", "\n", @@ -1608,15 +1608,15 @@ "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", "bin \n", - "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.638428 0.034134\n", - "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.050818 0.010745\n", - "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.656905 0.009480\n", - "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.870808 0.011883\n", - "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.045621 0.011414\n", - "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.163297 0.008725\n", - "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.202045 0.013500\n", - "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.996977 0.010791\n", - "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.370890 0.003597" + "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.620525 0.038249\n", + "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.036841 0.013203\n", + "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.659916 0.010107\n", + "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.861546 0.013328\n", + "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.049664 0.008215\n", + "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.162157 0.010245\n", + "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.224496 0.013796\n", + "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.997585 0.009161\n", + "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.373472 0.003922" ] }, "execution_count": 38, @@ -1649,7 +1649,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.8" + "version": "2.7.9" } }, "nbformat": 4, From c99c1f18708ad1bfca9c04299f68eb3e47adb6d3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 16 Sep 2015 18:48:28 +0700 Subject: [PATCH 118/519] Fix bug with source_present --- openmc/statepoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index fc4fc5ee1f..126d6b97e8 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -314,7 +314,7 @@ class StatePoint(object): @property def source_present(self): - return self._f['source_present'] > 0 + return self._f['source_present'].value > 0 @property def tallies(self): From 9ced99197b14e73d0f71909818d3290d0c23a59c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 16 Sep 2015 18:04:44 -0400 Subject: [PATCH 119/519] Add collision estimator to PyAPI --- openmc/constants.py | 3 ++- openmc/statepoint.py | 2 +- openmc/tallies.py | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/openmc/constants.py b/openmc/constants.py index a6b535e6d1..73da05a71a 100644 --- a/openmc/constants.py +++ b/openmc/constants.py @@ -25,7 +25,8 @@ LATTICE_TYPES = {1: 'rectangular', 2: 'hexagonal'} ESTIMATOR_TYPES = {1: 'analog', - 2: 'tracklength'} + 2: 'tracklength', + 3: 'collision'} FILTER_TYPES = {1: 'universe', 2: 'material', diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 06ed51c18d..e2efef6e0e 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -310,7 +310,7 @@ class StatePoint(object): # Iterate over all Tallies for tally_key in self._tally_keys: - # Read integer Tally estimator type code (analog or tracklength) + # Read integer Tally estimator type code (analog, tracklength, or collision) estimator_type = self._f['{0}{1}/estimator'.format(base, tally_key)].value # Read the Tally size specifications diff --git a/openmc/tallies.py b/openmc/tallies.py index 003acd9435..c968e68c9d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -52,7 +52,7 @@ class Tally(object): List of nuclides to score results for scores : list of str List of defined scores, e.g. 'flux', 'fission', etc. - estimator : {'analog', 'tracklength'} + estimator : {'analog', 'tracklength', 'collision'} Type of estimator for the tally triggers : list of openmc.trigger.Trigger List of tally triggers @@ -289,7 +289,8 @@ class Tally(object): @estimator.setter def estimator(self, estimator): - check_value('estimator', estimator, ['analog', 'tracklength']) + check_value('estimator', estimator, + ['analog', 'tracklength', 'collision']) self._estimator = estimator def add_trigger(self, trigger): From 8b67fa7a92115bac589dec698e5b513c02580f37 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 17 Sep 2015 07:12:05 +0700 Subject: [PATCH 120/519] Use structured array for global tallies with mean and std_dev fields --- openmc/statepoint.py | 80 ++++++-------------- tests/test_fixed_source/test_fixed_source.py | 5 +- 2 files changed, 25 insertions(+), 60 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 126d6b97e8..5c71b3f5b3 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -43,8 +43,9 @@ class StatePoint(object): Shannon entropy of fission source at each batch gen_per_batch : int Number of fission generations per batch - global_tallies : ndarray - Global tallies and their uncertainties + global_tallies : ndarray of compound datatype + Global tallies for k-effective estimates and leakage. The compound + datatype has fields 'name', 'sum', 'sum_sq', 'mean', and 'std_dev'. k_combined : list Combined estimator for k-effective and its uncertainty k_col_abs : float @@ -102,6 +103,7 @@ class StatePoint(object): self._meshes_read = False self._tallies_read = False self._with_summary = False + self._global_tallies = None def close(self): self._f.close() @@ -177,8 +179,24 @@ class StatePoint(object): @property def global_tallies(self): - data = self._f['global_tallies'].value - return np.column_stack((data['sum'], data['sum_sq'])) + if self._global_tallies is None: + data = self._f['global_tallies'].value + gt = np.zeros_like(data, dtype=[ + ('name', 'a14'), ('sum', 'f8'), ('sum_sq', 'f8'), + ('mean', 'f8'), ('std_dev', 'f8')]) + gt['name'] = ['k-collision', 'k-absorption', 'k-tracklength', + 'leakage'] + gt['sum'] = data['sum'] + gt['sum_sq'] = data['sum_sq'] + + # Calculate mean and sample standard deviation of mean + n = self.n_realizations + gt['mean'] = gt['sum']/n + gt['std_dev'] = np.sqrt((gt['sum_sq']/n - gt['mean']**2)/(n - 1)) + + self._global_tallies = gt + + return self._global_tallies @property def k_cmfd(self): @@ -460,60 +478,6 @@ class StatePoint(object): def with_summary(self): return self._with_summary - def compute_ci(self, confidence=0.95): - """Computes confidence intervals for each Tally bin. - - This method is equivalent to calling compute_stdev(...) when the - confidence is known as opposed to its corresponding t value. - - Parameters - ---------- - confidence : float, optional - Confidence level. Defaults to 0.95. - - """ - - # Determine significance level and percentile for two-sided CI - alpha = 1 - confidence - percentile = 1 - alpha/2 - - # Calculate t-value - t_value = scipy.stats.t.ppf(percentile, self._n_realizations - 1) - self.compute_stdev(t_value) - - def compute_stdev(self, t_value=1.0): - """Computes the sample mean and the standard deviation of the mean - for each Tally bin. - - Parameters - ---------- - t_value : float, optional - Student's t-value applied to the uncertainty. Defaults to 1.0, - meaning the reported value is the sample standard deviation. - - """ - - # Determine number of realizations - n = self._n_realizations - - # Calculate the standard deviation for each global tally - for i in range(len(self._global_tallies)): - - # Get sum and sum of squares - s, s2 = self._global_tallies[i] - - # Calculate sample mean and replace value - s /= n - self._global_tallies[i, 0] = s - - # Calculate standard deviation - if s != 0.0: - self._global_tallies[i, 1] = t_value * np.sqrt((s2 / n - s**2) / (n-1)) - - # Calculate sample mean and standard deviation for user-defined Tallies - for tally_id, tally in self.tallies.items(): - tally.compute_std_dev(t_value) - def get_tally(self, scores=[], filters=[], nuclides=[], name=None, id=None, estimator=None): """Finds and returns a Tally object with certain properties. diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index 0595ea1dba..c3bd34856d 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -30,9 +30,10 @@ class FixedSourceTestHarness(TestHarness): outstr += '\n'.join(results) + '\n' tally_num += 1 + gt = sp.global_tallies outstr += 'leakage:\n' - outstr += '{0:12.6E}'.format(sp.global_tallies[3][0]) + '\n' - outstr += '{0:12.6E}'.format(sp.global_tallies[3][1]) + '\n' + outstr += '{0:12.6E}'.format(gt[gt['name'] == b'leakage'][0]['sum']) + '\n' + outstr += '{0:12.6E}'.format(gt[gt['name'] == b'leakage'][0]['sum_sq']) + '\n' return outstr From 3274cf3f6dcdccfa5dd55135f699bfeb33cbe03a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 17 Sep 2015 12:47:20 +0700 Subject: [PATCH 121/519] Use HDF5 format for voxel file rather than raw binary --- docs/source/usersguide/output/index.rst | 1 + scripts/openmc-voxel-to-silovtk | 69 +++++++++---------------- src/constants.F90 | 3 +- src/plot.F90 | 54 +++++++++++++++---- 4 files changed, 72 insertions(+), 55 deletions(-) diff --git a/docs/source/usersguide/output/index.rst b/docs/source/usersguide/output/index.rst index 1eb85e9d52..161a8de2dd 100644 --- a/docs/source/usersguide/output/index.rst +++ b/docs/source/usersguide/output/index.rst @@ -12,3 +12,4 @@ Output File Formats source particle_restart track + voxel diff --git a/scripts/openmc-voxel-to-silovtk b/scripts/openmc-voxel-to-silovtk index eb052c75fa..1329b6b6c7 100755 --- a/scripts/openmc-voxel-to-silovtk +++ b/scripts/openmc-voxel-to-silovtk @@ -1,9 +1,11 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python from __future__ import division, print_function import struct import sys +import numpy as np +import h5py def parse_options(): """Process command line arguments""" @@ -22,14 +24,16 @@ def parse_options(): return parsed -def main(file_, o): - print(file_) - fh = open(file_, 'rb') - header = get_header(fh) - meshparms = (header['dimension'] + header['lower_left'] + - header['upper_right']) - nx, ny, nz = meshparms[:3] - ll = header['lower_left'] +def main(filename, o): + # Read data from voxel file + fh = h5py.File(filename, 'r') + dimension = fh['num_voxels'].value + width = fh['voxel_width'].value + lower_left = fh['lower_left'].value + voxel_data = fh['data'].value + + nx, ny, nz = dimension + upper_right = lower_left + width*dimension if o.vtk: try: @@ -40,13 +44,10 @@ def main(file_, o): 'See: http://www.vtk.org/') return - origin = [(l + w*n/2.) for n, l, w in - zip((nx, ny, nz), ll, header['width'])] - grid = vtk.vtkImageData() grid.SetDimensions(nx+1, ny+1, nz+1) - grid.SetOrigin(*ll) - grid.SetSpacing(*header['width']) + grid.SetOrigin(*lower_left) + grid.SetSpacing(*width) data = vtk.vtkDoubleArray() data.SetName("id") @@ -57,8 +58,7 @@ def main(file_, o): for y in range(ny): for z in range(nz): i = z*nx*ny + y*nx + x - id_ = get_int(fh)[0] - data.SetValue(i, id_) + data.SetValue(i, voxel_data[x,y,z]) grid.GetCellData().AddArray(data) writer = vtk.vtkXMLImageDataWriter() @@ -81,44 +81,23 @@ def main(file_, o): if not o.output.endswith(".silo"): o.output += ".silo" silomesh.init_silo(o.output) - silomesh.init_mesh('plot', *meshparms) + meshparams = list(map(int, dimension)) + list(map(float, lower_left)) + \ + list(map(float, upper_right)) + silomesh.init_mesh('plot', *meshparams) silomesh.init_var("id") - for x in range(1, nx+1): + for x in range(nx): sys.stdout.write(" {0}%\r".format(int(x/nx*100))) sys.stdout.flush() - for y in range(1, ny+1): - for z in range(1, nz+1): - id_ = get_int(fh)[0] - silomesh.set_value(float(id_), x, y, z) + for y in range(ny): + for z in range(nz): + silomesh.set_value(float(voxel_data[x,y,z]), + x + 1, y + 1, z + 1) print() silomesh.finalize_var() silomesh.finalize_mesh() silomesh.finalize_silo() -def get_header(file_): - nx, ny, nz = get_int(file_, 3) - wx, wy, wz = get_double(file_, 3) - lx, ly, lz = get_double(file_, 3) - header = {'dimension': [nx, ny, nz], 'width': [wx, wy, wz], - 'lower_left': [lx, ly, lz], - 'upper_right': [lx+wx*nx, ly+wy*ny, lz+wz*nz]} - return header - - -def get_data(file_, n, typeCode, size): - return list(struct.unpack('={0}{1}'.format(n, typeCode), - file_.read(n*size))) - - -def get_int(file_, n=1, path=None): - return get_data(file_, n, 'i', 4) - - -def get_double(file_, n=1, path=None): - return get_data(file_, n, 'd', 8) - - if __name__ == '__main__': (options, args) = parse_options() if args: diff --git a/src/constants.F90 b/src/constants.F90 index 6be1326a87..3d7ca890d0 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -20,7 +20,8 @@ module constants FILETYPE_STATEPOINT = -1, & FILETYPE_PARTICLE_RESTART = -2, & FILETYPE_SOURCE = -3, & - FILETYPE_TRACK = -4 + FILETYPE_TRACK = -4, & + FILETYPE_VOXEL = -5 ! ============================================================================ ! ADJUSTABLE PARAMETERS diff --git a/src/plot.F90 b/src/plot.F90 index cd4e8642e5..e5b265c5cf 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -5,6 +5,7 @@ module plot use geometry, only: find_cell, check_cell_overlap use geometry_header, only: Cell, BASE_UNIVERSE use global + use hdf5_interface use mesh, only: get_mesh_indices use output, only: write_message use particle_header, only: Particle, LocalCoord @@ -14,6 +15,8 @@ module plot use progress_header, only: ProgressBar use string, only: to_str + use hdf5 + implicit none contains @@ -347,11 +350,20 @@ contains integer :: x, y, z ! voxel location indices integer :: rgb(3) ! colors (red, green, blue) from 0-255 integer :: id ! id of cell or material - integer :: unit_plot ! voxel file unit + integer :: hdf5_err + integer, target :: data(pl%pixels(3),pl%pixels(2)) + integer(HID_T) :: file_id + integer(HID_T) :: dspace + integeR(HID_T) :: memspace + integer(HID_T) :: dset + integer(HSIZE_T) :: dims(3) + integer(HSIZE_T) :: dims_slab(3) + integer(HSIZE_T) :: offset(3) real(8) :: vox(3) ! x, y, and z voxel widths real(8) :: ll(3) ! lower left starting point for each sweep direction type(Particle) :: p type(ProgressBar) :: progress + type(c_ptr) :: f_ptr ! compute voxel widths in each direction vox = pl % width/dble(pl % pixels) @@ -366,11 +378,30 @@ contains p % coord(1) % universe = BASE_UNIVERSE ! Open binary plot file for writing - open(NEWUNIT=unit_plot, FILE=pl % path_plot, STATUS='replace', & - ACCESS='stream') + file_id = file_create(pl%path_plot) ! write plot header info - write(unit_plot) pl % pixels, vox, ll + call write_dataset(file_id, "filetype", FILETYPE_VOXEL) + call write_dataset(file_id, "num_voxels", pl%pixels) + call write_dataset(file_id, "voxel_width", vox) + call write_dataset(file_id, "lower_left", ll) + + ! Create dataset for voxel data -- note that the dimensions are reversed + ! since we want the order in the file to be z, y, x + dims(:) = [pl%pixels(3), pl%pixels(2), pl%pixels(1)] + call h5screate_simple_f(3, dims, dspace, hdf5_err) + call h5dcreate_f(file_id, "data", H5T_NATIVE_INTEGER, dspace, dset, hdf5_err) + + ! Create another dataspace for 2D array in memory + dims_slab(1) = pl%pixels(3) + dims_slab(2) = pl%pixels(2) + dims_slab(3) = 1 + call h5screate_simple_f(2, dims_slab(1:2), memspace, hdf5_err) + + ! Initialize offset and get pointer to data + offset(:) = 0 + call h5sselect_hyperslab_f(dspace, H5S_SELECT_SET_F, offset, dims_slab, hdf5_err) + f_ptr = c_loc(data) ! move to center of voxels ll = ll + vox / TWO @@ -379,22 +410,19 @@ contains call progress % set_value(dble(x)/dble(pl % pixels(1))*100) do y = 1, pl % pixels(2) do z = 1, pl % pixels(3) - ! get voxel color call position_rgb(p, pl, rgb, id) ! write to plot file - write(unit_plot) id + data(z,y) = id ! advance particle in z direction p % coord(1) % xyz(3) = p % coord(1) % xyz(3) + vox(3) - end do ! advance particle in y direction p % coord(1) % xyz(2) = p % coord(1) % xyz(2) + vox(2) p % coord(1) % xyz(3) = ll(3) - end do ! advance particle in y direction @@ -402,9 +430,17 @@ contains p % coord(1) % xyz(2) = ll(2) p % coord(1) % xyz(3) = ll(3) + ! Write to HDF5 dataset + offset(3) = x - 1 + call h5soffset_simple_f(dspace, offset, hdf5_err) + call h5dwrite_f(dset, H5T_NATIVE_INTEGER, f_ptr, hdf5_err, & + mem_space_id=memspace, file_space_id=dspace) end do - close(unit_plot) + call h5dclose_f(dset, hdf5_err) + call h5sclose_f(dspace, hdf5_err) + call h5sclose_f(memspace, hdf5_err) + call file_close(file_id) end subroutine create_3d_dump From 3df61825cc8c93656ed1458c34fca14000884e73 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 17 Sep 2015 13:11:40 +0700 Subject: [PATCH 122/519] Make filetype a string in HDF5 files. --- .../usersguide/output/particle_restart.rst | 6 ++--- docs/source/usersguide/output/source.rst | 6 ++--- docs/source/usersguide/output/statepoint.rst | 6 ++--- docs/source/usersguide/output/track.rst | 6 ++--- docs/source/usersguide/output/voxel.rst | 25 +++++++++++++++++++ openmc/particle_restart.py | 3 ++- openmc/statepoint.py | 3 ++- src/constants.F90 | 8 ------ src/initialize.F90 | 8 +++--- src/particle_restart_write.F90 | 2 +- src/plot.F90 | 2 +- src/source.F90 | 6 ++--- src/state_point.F90 | 6 ++--- src/track_output.F90 | 2 +- 14 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 docs/source/usersguide/output/voxel.rst diff --git a/docs/source/usersguide/output/particle_restart.rst b/docs/source/usersguide/output/particle_restart.rst index 12ab3237f4..e0d89a5156 100644 --- a/docs/source/usersguide/output/particle_restart.rst +++ b/docs/source/usersguide/output/particle_restart.rst @@ -6,11 +6,9 @@ Particle Restart File Format The current revision of the particle restart file format is 1. -**/filetype** (*int*) +**/filetype** (*char[]*) - Flags what type of file this is. A value of -1 indicates a statepoint file, - a value of -2 indicates a particle restart file, a value of -3 indicates a - source file, and a value of -4 indicates a track file. + String indicating the type of file. **/revision** (*int*) diff --git a/docs/source/usersguide/output/source.rst b/docs/source/usersguide/output/source.rst index cc8e71a675..2981b0f662 100644 --- a/docs/source/usersguide/output/source.rst +++ b/docs/source/usersguide/output/source.rst @@ -8,11 +8,9 @@ Normally, source data is stored in a state point file. However, it is possible to request that the source be written separately, in which case the format used is that documented here. -**/filetype** (*int*) +**/filetype** (*char[]*) - Flags what type of file this is. A value of -1 indicates a statepoint file, - a value of -2 indicates a particle restart file, a value of -3 indicates a - source file, and a value of -4 indicates a track file. + String indicating the type of file. **/source_bank** (Compound type) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index b2003f26a0..66fcce27f4 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -6,11 +6,9 @@ State Point File Format The current revision of the statepoint file format is 13. -**/filetype** (*int*) +**/filetype** (*char[]*) - Flags what type of file this is. A value of -1 indicates a statepoint file, - a value of -2 indicates a particle restart file, a value of -3 indicates a - source file, and a value of -4 indicates a track file. + String indicating the type of file. **/revision** (*int*) diff --git a/docs/source/usersguide/output/track.rst b/docs/source/usersguide/output/track.rst index 9a85ac7ea2..d3c7a27d83 100644 --- a/docs/source/usersguide/output/track.rst +++ b/docs/source/usersguide/output/track.rst @@ -6,11 +6,9 @@ Track File Format The current revision of the particle track file format is 1. -**/filetype** (*int*) +**/filetype** (*char[]*) - Flags what type of file this is. A value of -1 indicates a statepoint file, - a value of -2 indicates a particle restart file, a value of -3 indicates a - source file, and a value of -4 indicates a track file. + String indicating the type of file. **/revision** (*int*) diff --git a/docs/source/usersguide/output/voxel.rst b/docs/source/usersguide/output/voxel.rst new file mode 100644 index 0000000000..bcdcd8eb10 --- /dev/null +++ b/docs/source/usersguide/output/voxel.rst @@ -0,0 +1,25 @@ +.. _usersguide_voxel: + +================= +Voxel File Format +================= + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/num_voxels** (*int[3]*) + + Number of voxels in the x-, y-, and z- directions. + +**/voxel_width** (*double[3]*) + + Width of a voxel in centimeters. + +**/lower_left** (*double[3]*) + + Cartesian coordinates of the lower-left corner of the plot. + +**/data** (*int[][][]*) + + Data for each voxel that represents a material or cell ID. diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index b09ca0f41e..3ab2945857 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -42,7 +42,8 @@ class Particle(object): self._f = h5py.File(filename, 'r') # Ensure filetype and revision are correct - if 'filetype' not in self._f or self._f['filetype'].value != -2: + if 'filetype' not in self._f or self._f[ + 'filetype'].value.decode() != 'particle restart': raise IOError('{} is not a particle restart file.'.format(filename)) if self._f['revision'].value != 1: raise IOError('Particle restart file revision is not consistent.') diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 5c71b3f5b3..9583563d59 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -94,7 +94,8 @@ class StatePoint(object): self._f = h5py.File(filename, 'r') # Ensure filetype and revision are correct - if 'filetype' not in self._f or self._f['filetype'].value != -1: + if 'filetype' not in self._f or self._f[ + 'filetype'].value.decode() != 'statepoint': raise IOError('{} is not a statepoint file.'.format(filename)) if self._f['revision'].value != 14: raise IOError('Statepoint revision is not consistent.') diff --git a/src/constants.F90 b/src/constants.F90 index 3d7ca890d0..01dd6148af 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -15,14 +15,6 @@ module constants integer, parameter :: REVISION_PARTICLE_RESTART = 1 integer, parameter :: REVISION_TRACK = 1 - ! Binary file types - integer, parameter :: & - FILETYPE_STATEPOINT = -1, & - FILETYPE_PARTICLE_RESTART = -2, & - FILETYPE_SOURCE = -3, & - FILETYPE_TRACK = -4, & - FILETYPE_VOXEL = -5 - ! ============================================================================ ! ADJUSTABLE PARAMETERS diff --git a/src/initialize.F90 b/src/initialize.F90 index 48985a718d..86242c7533 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -321,7 +321,7 @@ contains integer :: i ! loop index integer :: argc ! number of command line arguments integer :: last_flag ! index of last flag - integer :: filetype + character(MAX_WORD_LEN) :: filetype integer(HID_T) :: file_id character(MAX_WORD_LEN), allocatable :: argv(:) ! command line arguments @@ -366,10 +366,10 @@ contains ! Set path and flag for type of run select case (filetype) - case (FILETYPE_STATEPOINT) + case ('statepoint') path_state_point = argv(i) restart_run = .true. - case (FILETYPE_PARTICLE_RESTART) + case ('particle restart') path_particle_restart = argv(i) particle_restart_run = .true. case default @@ -389,7 +389,7 @@ contains file_id = file_open(argv(i), 'r', parallel=.true.) call read_dataset(file_id, 'filetype', filetype) call file_close(file_id) - if (filetype /= FILETYPE_SOURCE) then + if (filetype /= 'source') then call fatal_error("Second file after restart flag must be a & &source file") end if diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index 0c010b64c2..8b19bb879e 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -40,7 +40,7 @@ contains src => source_bank(current_work) ! Write data to file - call write_dataset(file_id, 'filetype', FILETYPE_PARTICLE_RESTART) + call write_dataset(file_id, 'filetype', 'particle restart') call write_dataset(file_id, 'revision', REVISION_PARTICLE_RESTART) call write_dataset(file_id, 'current_batch', current_batch) call write_dataset(file_id, 'gen_per_batch', gen_per_batch) diff --git a/src/plot.F90 b/src/plot.F90 index e5b265c5cf..d8c255c34d 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -381,7 +381,7 @@ contains file_id = file_create(pl%path_plot) ! write plot header info - call write_dataset(file_id, "filetype", FILETYPE_VOXEL) + call write_dataset(file_id, "filetype", 'voxel') call write_dataset(file_id, "num_voxels", pl%pixels) call write_dataset(file_id, "voxel_width", vox) call write_dataset(file_id, "lower_left", ll) diff --git a/src/source.F90 b/src/source.F90 index 285332ef8d..c461749472 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -32,8 +32,8 @@ contains integer(8) :: i ! loop index over bank sites integer(8) :: id ! particle id - integer(4) :: itmp ! temporary integer integer(HID_T) :: file_id + character(MAX_WORD_LEN) :: filetype character(MAX_FILE_LEN) :: filename type(Bank), pointer :: src ! source bank site @@ -50,10 +50,10 @@ contains file_id = file_open(path_source, 'r', parallel=.true.) ! Read the file type - call read_dataset(file_id, "filetype", itmp) + call read_dataset(file_id, "filetype", filetype) ! Check to make sure this is a source file - if (itmp /= FILETYPE_SOURCE) then + if (filetype /= 'source') then call fatal_error("Specified starting source file not a source file & &type.") end if diff --git a/src/state_point.F90 b/src/state_point.F90 index bf43a1e83f..97375c89cf 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -70,7 +70,7 @@ contains file_id = file_create(filename) ! Write file type - call write_dataset(file_id, "filetype", FILETYPE_STATEPOINT) + call write_dataset(file_id, "filetype", 'statepoint') ! Write revision number for state point file call write_dataset(file_id, "revision", REVISION_STATEPOINT) @@ -375,7 +375,7 @@ contains ! Create separate source file if (master .or. parallel) then file_id = file_create(filename, parallel=.true.) - call write_dataset(file_id, "filetype", FILETYPE_SOURCE) + call write_dataset(file_id, "filetype", 'source') end if else filename = trim(path_output) // 'statepoint.' // & @@ -397,7 +397,7 @@ contains call write_message("Creating source file " // trim(filename) // "...", 1) if (master .or. parallel) then file_id = file_create(filename, parallel=.true.) - call write_dataset(file_id, "filetype", FILETYPE_SOURCE) + call write_dataset(file_id, "filetype", 'source') end if call write_source_bank(file_id) diff --git a/src/track_output.F90 b/src/track_output.F90 index f4018cde37..1665ac25ea 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -114,7 +114,7 @@ contains !$omp critical (FinalizeParticleTrack) file_id = file_create(fname) - call write_dataset(file_id, 'filetype', FILETYPE_TRACK) + call write_dataset(file_id, 'filetype', 'track') call write_dataset(file_id, 'revision', REVISION_TRACK) call write_dataset(file_id, 'n_particles', n_particle_tracks) call write_dataset(file_id, 'n_coords', n_coords) From 333ce8034086be92ceb9de55047654d30f426526 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 17 Sep 2015 15:50:47 -0400 Subject: [PATCH 123/519] Add collision estimator to docs --- docs/source/usersguide/input.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 93e8236ec1..34d3f7df43 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1278,14 +1278,16 @@ The ```` element accepts the following sub-elements: *Default*: total :estimator: - The estimator element is used to force the use of either ``analog`` or - ``tracklength`` tally estimation. ''analog'' is generally less efficient - though it can be used with every score type. ''tracklength'' is generally - the most efficient, though its usage is restricted to tallies that do not - score particle information which requires a collision to have occured, such - as a scattering tally which utilizes outgoing energy filters. + The estimator element is used to force the use of either ``analog``, + ``collision``, or ``tracklength`` tally estimation. ``analog`` is generally + the least efficient though it can be used with every score type. + ``tracklength`` is generally the most efficient, but neither ``tracklength`` + nor ``collision`` can be used to score a tally that requires post-collision + information. For example, a scattering tally with outgoing energy filters + cannot be used with ``tracklength`` or ``collision`` because the code will + not know the outgoing energy distribution. - *Default*: ``tracklength`` but will revert to analog if necessary. + *Default*: ``tracklength`` but will revert to ``analog`` if necessary. :scores: A space-separated list of the desired responses to be accumulated. Accepted From 9c3f77fe904dc5b5fd0b995fe298b5e1c85089fb Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 17 Sep 2015 16:20:15 -0400 Subject: [PATCH 124/519] Add collision estimator tests --- tests/test_score_MT/results_true.dat | 66 ++ tests/test_score_MT/tallies.xml | 14 +- tests/test_score_absorption/results_true.dat | 9 + tests/test_score_absorption/tallies.xml | 8 +- tests/test_score_fission/results_true.dat | 9 + tests/test_score_fission/tallies.xml | 8 +- tests/test_score_flux/results_true.dat | 26 + tests/test_score_flux/tallies.xml | 14 +- tests/test_score_flux_yn/results_true.dat | 866 ++++++++++++++++++ tests/test_score_flux_yn/tallies.xml | 12 + .../test_score_kappafission/results_true.dat | 18 + tests/test_score_kappafission/tallies.xml | 14 +- tests/test_score_nufission/results_true.dat | 18 + tests/test_score_nufission/tallies.xml | 14 +- tests/test_score_scatter/results_true.dat | 18 + tests/test_score_scatter/tallies.xml | 14 +- tests/test_score_total/results_true.dat | 18 + tests/test_score_total/tallies.xml | 14 +- tests/test_score_total_yn/results_true.dat | 802 ++++++++++++++++ tests/test_score_total_yn/tallies.xml | 14 + 20 files changed, 1968 insertions(+), 8 deletions(-) diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index 248f6657d0..4b1c1af26c 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -33,3 +33,69 @@ tally 1: 2.080857E-09 6.101318E-02 8.452067E-04 +tally 2: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-01 +2.440000E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +6.000000E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +tally 3: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.724026E-03 +1.684945E-05 +5.724026E-03 +1.684945E-05 +3.250298E-01 +2.370870E-02 +1.083784E+00 +2.568556E-01 +4.449887E-05 +1.980149E-09 +4.449887E-05 +1.980149E-09 +3.526275E-02 +2.863085E-04 +1.417358E-02 +4.375519E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.106469E-05 +8.605176E-10 +6.204277E-02 +8.555398E-04 diff --git a/tests/test_score_MT/tallies.xml b/tests/test_score_MT/tallies.xml index ef7ff8dd82..5e66ae929e 100644 --- a/tests/test_score_MT/tallies.xml +++ b/tests/test_score_MT/tallies.xml @@ -6,4 +6,16 @@ n2n 16 51 102 - \ No newline at end of file + + + n2n 16 51 102 + analog + + + + + n2n 16 51 102 + collision + + + diff --git a/tests/test_score_absorption/results_true.dat b/tests/test_score_absorption/results_true.dat index bacbf26a37..9370a146f5 100644 --- a/tests/test_score_absorption/results_true.dat +++ b/tests/test_score_absorption/results_true.dat @@ -18,3 +18,12 @@ tally 2: 0.000000E+00 4.000000E-01 4.240000E-02 +tally 3: +0.000000E+00 +0.000000E+00 +1.990713E+00 +8.557870E-01 +1.427399E-02 +4.420707E-05 +2.968053E-01 +1.960663E-02 diff --git a/tests/test_score_absorption/tallies.xml b/tests/test_score_absorption/tallies.xml index 8cbcef251c..8b2dc29314 100644 --- a/tests/test_score_absorption/tallies.xml +++ b/tests/test_score_absorption/tallies.xml @@ -12,4 +12,10 @@ absorption - \ No newline at end of file + + + collision + absorption + + + diff --git a/tests/test_score_fission/results_true.dat b/tests/test_score_fission/results_true.dat index 904c0d8895..86b31aaafd 100644 --- a/tests/test_score_fission/results_true.dat +++ b/tests/test_score_fission/results_true.dat @@ -18,3 +18,12 @@ tally 2: 0.000000E+00 9.923196E-01 2.067216E-01 +tally 3: +9.036254E-01 +1.746552E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.912744E-01 +2.192705E-01 diff --git a/tests/test_score_fission/tallies.xml b/tests/test_score_fission/tallies.xml index d56614bdfa..a8b57f9116 100644 --- a/tests/test_score_fission/tallies.xml +++ b/tests/test_score_fission/tallies.xml @@ -12,4 +12,10 @@ fission - \ No newline at end of file + + + collision + fission + + + diff --git a/tests/test_score_flux/results_true.dat b/tests/test_score_flux/results_true.dat index 31e1d92926..31ca238d48 100644 --- a/tests/test_score_flux/results_true.dat +++ b/tests/test_score_flux/results_true.dat @@ -13,3 +13,29 @@ tally 1: 2.880575E+01 5.605671E+01 6.804062E+02 +tally 2: +3.077754E+01 +2.017424E+02 +1.172238E+01 +3.139127E+01 +5.231699E+01 +5.870469E+02 +3.259142E+01 +2.336719E+02 +1.040924E+01 +2.432332E+01 +5.709679E+01 +6.978668E+02 +tally 3: +3.077754E+01 +2.017424E+02 +1.172238E+01 +3.139127E+01 +5.231699E+01 +5.870469E+02 +3.259142E+01 +2.336719E+02 +1.040924E+01 +2.432332E+01 +5.709679E+01 +6.978668E+02 diff --git a/tests/test_score_flux/tallies.xml b/tests/test_score_flux/tallies.xml index 30bef71741..bcde40c75d 100644 --- a/tests/test_score_flux/tallies.xml +++ b/tests/test_score_flux/tallies.xml @@ -6,4 +6,16 @@ flux - \ No newline at end of file + + + flux + analog + + + + + flux + collision + + + diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 2e5df97cf4..937f810ea6 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -446,3 +446,869 @@ tally 2: 1.093913E-01 2.235961E-01 5.449263E-02 +tally 3: +3.077754E+01 +2.017424E+02 +-4.040800E-01 +5.606719E-01 +-5.238239E-01 +4.460714E-01 +1.155164E-01 +1.686786E-01 +-1.972294E-01 +2.912851E-01 +4.908524E-01 +1.374195E-01 +-1.467088E-02 +1.080839E-01 +6.749037E-02 +1.397361E-01 +4.136479E-03 +9.237632E-02 +-3.742305E-01 +9.917374E-02 +5.374208E-01 +2.530961E-01 +2.270996E-01 +9.415721E-02 +-4.568867E-02 +1.277446E-01 +1.581716E-01 +6.217155E-02 +4.667840E-01 +1.143380E-01 +9.684270E-02 +7.302998E-02 +8.366629E-01 +1.797483E-01 +-5.657893E-01 +2.553910E-01 +-2.351441E-02 +4.395513E-02 +7.843306E-01 +1.466478E-01 +4.617856E-02 +1.154681E-02 +1.431343E-01 +3.531062E-02 +4.625825E-01 +6.235642E-02 +-8.837342E-02 +6.231694E-02 +-3.766755E-01 +6.412261E-02 +1.995226E-01 +1.743990E-01 +-2.498625E-02 +8.897536E-02 +-1.039315E-01 +1.868672E-01 +6.712910E-01 +2.084042E-01 +5.805639E-02 +4.049580E-02 +1.603677E-01 +4.280033E-02 +3.909878E-01 +7.726018E-02 +9.878354E-02 +4.630595E-02 +-2.389983E-01 +3.528604E-02 +1.641046E-01 +1.669859E-01 +-2.351986E-02 +1.048794E-02 +1.172238E+01 +3.139127E+01 +-1.057733E+00 +2.820672E-01 +5.708838E-02 +6.224675E-02 +2.492981E-02 +1.827498E-01 +-1.339268E-01 +1.968929E-02 +2.363867E-01 +3.028587E-02 +-2.867841E-01 +2.680318E-02 +-2.352784E-01 +1.895006E-02 +4.365572E-01 +1.883240E-01 +-3.388837E-01 +7.209932E-02 +3.488374E-01 +6.640137E-02 +-3.343893E-01 +4.149634E-02 +-4.575314E-01 +7.461614E-02 +4.436881E-01 +1.325092E-01 +3.394853E-01 +2.987173E-02 +-2.633936E-02 +6.171428E-02 +9.994191E-02 +6.447641E-02 +-1.618840E-01 +3.497845E-02 +-1.290678E-01 +3.735394E-02 +9.852126E-03 +2.963925E-02 +-1.656539E-01 +4.190396E-02 +-2.292763E-01 +7.045480E-02 +-4.616824E-03 +1.926690E-02 +-1.960839E-01 +1.396042E-02 +-2.133526E-02 +5.189823E-02 +2.933136E-01 +5.721356E-02 +-1.084914E-01 +2.448532E-02 +-4.778583E-01 +7.644033E-02 +1.736901E-01 +6.630467E-02 +-5.460801E-02 +1.510381E-02 +1.106093E-01 +1.590306E-02 +1.659501E-01 +5.983218E-02 +1.343781E-02 +2.751294E-02 +2.052693E-01 +3.478581E-02 +-1.006298E-01 +1.815313E-02 +-2.563766E-01 +3.045246E-02 +5.231699E+01 +5.870469E+02 +-6.102587E-01 +5.930968E-01 +1.184182E+00 +1.364433E+00 +-6.362263E-02 +8.852514E-01 +-4.844978E-01 +1.751923E-01 +8.223413E-01 +2.436206E-01 +-9.656506E-01 +3.513566E-01 +2.710494E-01 +7.170772E-01 +4.792482E-01 +2.551569E-01 +-1.266077E-01 +2.824778E-01 +6.389964E-01 +2.501483E-01 +8.915816E-01 +3.557431E-01 +-1.007448E+00 +5.743018E-01 +3.528444E-01 +2.428078E-01 +-5.833000E-01 +3.733648E-01 +-4.660289E-01 +6.567263E-02 +5.856088E-01 +2.336146E-01 +3.836351E-02 +7.665403E-02 +-6.721211E-01 +2.651780E-01 +5.725993E-01 +2.101026E-01 +-2.130594E-01 +1.855350E-02 +2.607168E-01 +1.564288E-01 +-3.399382E-02 +3.067656E-02 +-1.228976E+00 +6.554836E-01 +-2.962235E-01 +1.808511E-01 +5.521675E-01 +1.722073E-01 +-1.658751E-01 +1.994119E-02 +-2.671896E-01 +1.343320E-01 +-2.325282E-01 +4.677656E-02 +-3.380310E-01 +1.703532E-01 +-3.571853E-01 +1.140525E-01 +3.836770E-02 +8.586429E-02 +7.328263E-01 +1.567227E-01 +4.840110E-02 +2.718471E-02 +5.654783E-01 +3.645579E-01 +-3.027585E-01 +1.407867E-01 +3.259142E+01 +2.336719E+02 +3.053294E-01 +2.086257E-01 +-7.563597E-01 +2.816768E-01 +-3.039288E-01 +2.855043E-01 +-2.648323E-01 +1.883784E-01 +2.665933E-01 +1.782353E-01 +1.978960E-01 +1.419567E-01 +1.228712E-01 +1.913946E-01 +-9.152681E-03 +1.324681E-01 +-5.707326E-01 +1.092067E-01 +2.326858E-01 +6.731743E-02 +-5.170241E-01 +1.353439E-01 +-4.064026E-01 +9.715030E-02 +-1.142031E-01 +7.748788E-02 +2.928039E-01 +2.716157E-01 +-1.721186E-01 +1.447738E-01 +6.452116E-01 +1.821975E-01 +-5.697276E-01 +1.047333E-01 +-9.640967E-02 +1.139327E-01 +-4.509832E-01 +2.079493E-01 +-2.134684E-02 +2.907667E-01 +-2.434868E-01 +1.235397E-01 +2.550330E-01 +2.979627E-01 +9.598615E-01 +3.140885E-01 +1.218430E-01 +6.283872E-02 +2.412915E-01 +1.907292E-02 +-2.236667E-01 +4.379414E-02 +2.844474E-01 +2.965692E-02 +1.618860E-01 +8.293785E-03 +-1.265583E-01 +4.515449E-02 +6.356127E-02 +1.358134E-02 +-3.844886E-01 +8.600010E-02 +-1.942739E-01 +7.516022E-02 +1.765511E-01 +3.522611E-02 +-3.433188E-01 +3.456066E-02 +-1.501983E-01 +5.633844E-02 +1.040924E+01 +2.432332E+01 +-4.138270E-01 +1.309129E-01 +-3.151106E-01 +1.286964E-01 +9.213222E-02 +6.189454E-02 +-2.746107E-01 +8.103949E-02 +-9.781742E-02 +3.783736E-02 +-1.178371E-01 +3.242332E-02 +-5.837932E-01 +2.059491E-01 +-7.338223E-03 +8.012203E-02 +5.628994E-02 +2.190669E-02 +8.155585E-02 +1.039007E-01 +6.052048E-02 +4.339463E-02 +-1.157646E-02 +1.839000E-02 +-2.641673E-01 +4.737589E-02 +-8.531135E-02 +5.432766E-02 +6.036555E-01 +1.190329E-01 +-3.149976E-01 +5.735264E-02 +-8.456340E-02 +4.563143E-03 +2.224065E-01 +6.600030E-02 +9.562392E-03 +1.843524E-02 +-2.400599E-01 +3.182217E-02 +-6.534941E-01 +1.180315E-01 +4.371157E-01 +9.076666E-02 +3.257455E-02 +2.936184E-02 +-8.788428E-02 +1.923293E-02 +-2.604776E-01 +3.660313E-02 +-6.315350E-02 +1.503534E-02 +5.609294E-01 +8.783528E-02 +-7.363672E-01 +1.789210E-01 +2.883575E-01 +6.478578E-02 +-3.302954E-02 +1.517946E-02 +-3.234157E-01 +4.418920E-02 +2.846318E-01 +2.712085E-02 +-3.227536E-01 +5.062832E-02 +4.391474E-01 +5.548002E-02 +1.322988E-01 +2.995854E-02 +5.709679E+01 +6.978668E+02 +2.859201E-02 +1.094507E+00 +6.058587E-01 +6.079927E-01 +7.553798E-02 +1.131607E+00 +-5.851206E-01 +1.215663E+00 +8.266012E-02 +9.031287E-01 +-7.088368E-01 +3.984608E-01 +-4.414986E-01 +1.502417E-01 +2.241998E-01 +3.228823E-01 +-7.328574E-01 +2.430448E-01 +-8.070160E-01 +1.767265E-01 +-1.154449E-01 +8.739303E-03 +-3.787161E-01 +4.728756E-01 +-1.743577E-01 +1.091245E-01 +2.878137E-01 +2.724285E-01 +2.128994E-01 +4.440539E-01 +9.495567E-01 +3.622719E-01 +1.422950E-01 +5.309223E-02 +1.323659E-01 +1.911979E-01 +-1.303752E-01 +5.710728E-01 +-4.611294E-02 +4.086632E-02 +5.937879E-01 +1.006156E-01 +-3.558925E-01 +2.998983E-01 +1.175971E+00 +5.323321E-01 +2.426485E-01 +1.497265E-01 +7.805090E-02 +5.060214E-02 +-2.914577E-01 +2.233355E-01 +1.053098E-01 +6.693123E-02 +4.541315E-01 +1.328340E-01 +-6.290732E-02 +8.910616E-02 +7.371592E-01 +1.980732E-01 +5.804701E-01 +1.711949E-01 +-6.642202E-01 +1.131866E-01 +1.779818E-01 +6.530190E-02 +-5.224739E-01 +2.534102E-01 +-1.824905E-01 +2.910309E-02 +tally 4: +3.077754E+01 +2.017424E+02 +-4.040800E-01 +5.606719E-01 +-5.238239E-01 +4.460714E-01 +1.155164E-01 +1.686786E-01 +-1.972294E-01 +2.912851E-01 +4.908524E-01 +1.374195E-01 +-1.467088E-02 +1.080839E-01 +6.749037E-02 +1.397361E-01 +4.136479E-03 +9.237632E-02 +-3.742305E-01 +9.917374E-02 +5.374208E-01 +2.530961E-01 +2.270996E-01 +9.415721E-02 +-4.568867E-02 +1.277446E-01 +1.581716E-01 +6.217155E-02 +4.667840E-01 +1.143380E-01 +9.684270E-02 +7.302998E-02 +8.366629E-01 +1.797483E-01 +-5.657893E-01 +2.553910E-01 +-2.351441E-02 +4.395513E-02 +7.843306E-01 +1.466478E-01 +4.617856E-02 +1.154681E-02 +1.431343E-01 +3.531062E-02 +4.625825E-01 +6.235642E-02 +-8.837342E-02 +6.231694E-02 +-3.766755E-01 +6.412261E-02 +1.995226E-01 +1.743990E-01 +-2.498625E-02 +8.897536E-02 +-1.039315E-01 +1.868672E-01 +6.712910E-01 +2.084042E-01 +5.805639E-02 +4.049580E-02 +1.603677E-01 +4.280033E-02 +3.909878E-01 +7.726018E-02 +9.878354E-02 +4.630595E-02 +-2.389983E-01 +3.528604E-02 +1.641046E-01 +1.669859E-01 +-2.351986E-02 +1.048794E-02 +1.172238E+01 +3.139127E+01 +-1.057733E+00 +2.820672E-01 +5.708838E-02 +6.224675E-02 +2.492981E-02 +1.827498E-01 +-1.339268E-01 +1.968929E-02 +2.363867E-01 +3.028587E-02 +-2.867841E-01 +2.680318E-02 +-2.352784E-01 +1.895006E-02 +4.365572E-01 +1.883240E-01 +-3.388837E-01 +7.209932E-02 +3.488374E-01 +6.640137E-02 +-3.343893E-01 +4.149634E-02 +-4.575314E-01 +7.461614E-02 +4.436881E-01 +1.325092E-01 +3.394853E-01 +2.987173E-02 +-2.633936E-02 +6.171428E-02 +9.994191E-02 +6.447641E-02 +-1.618840E-01 +3.497845E-02 +-1.290678E-01 +3.735394E-02 +9.852126E-03 +2.963925E-02 +-1.656539E-01 +4.190396E-02 +-2.292763E-01 +7.045480E-02 +-4.616824E-03 +1.926690E-02 +-1.960839E-01 +1.396042E-02 +-2.133526E-02 +5.189823E-02 +2.933136E-01 +5.721356E-02 +-1.084914E-01 +2.448532E-02 +-4.778583E-01 +7.644033E-02 +1.736901E-01 +6.630467E-02 +-5.460801E-02 +1.510381E-02 +1.106093E-01 +1.590306E-02 +1.659501E-01 +5.983218E-02 +1.343781E-02 +2.751294E-02 +2.052693E-01 +3.478581E-02 +-1.006298E-01 +1.815313E-02 +-2.563766E-01 +3.045246E-02 +5.231699E+01 +5.870469E+02 +-6.102587E-01 +5.930968E-01 +1.184182E+00 +1.364433E+00 +-6.362263E-02 +8.852514E-01 +-4.844978E-01 +1.751923E-01 +8.223413E-01 +2.436206E-01 +-9.656506E-01 +3.513566E-01 +2.710494E-01 +7.170772E-01 +4.792482E-01 +2.551569E-01 +-1.266077E-01 +2.824778E-01 +6.389964E-01 +2.501483E-01 +8.915816E-01 +3.557431E-01 +-1.007448E+00 +5.743018E-01 +3.528444E-01 +2.428078E-01 +-5.833000E-01 +3.733648E-01 +-4.660289E-01 +6.567263E-02 +5.856088E-01 +2.336146E-01 +3.836351E-02 +7.665403E-02 +-6.721211E-01 +2.651780E-01 +5.725993E-01 +2.101026E-01 +-2.130594E-01 +1.855350E-02 +2.607168E-01 +1.564288E-01 +-3.399382E-02 +3.067656E-02 +-1.228976E+00 +6.554836E-01 +-2.962235E-01 +1.808511E-01 +5.521675E-01 +1.722073E-01 +-1.658751E-01 +1.994119E-02 +-2.671896E-01 +1.343320E-01 +-2.325282E-01 +4.677656E-02 +-3.380310E-01 +1.703532E-01 +-3.571853E-01 +1.140525E-01 +3.836770E-02 +8.586429E-02 +7.328263E-01 +1.567227E-01 +4.840110E-02 +2.718471E-02 +5.654783E-01 +3.645579E-01 +-3.027585E-01 +1.407867E-01 +3.259142E+01 +2.336719E+02 +3.053294E-01 +2.086257E-01 +-7.563597E-01 +2.816768E-01 +-3.039288E-01 +2.855043E-01 +-2.648323E-01 +1.883784E-01 +2.665933E-01 +1.782353E-01 +1.978960E-01 +1.419567E-01 +1.228712E-01 +1.913946E-01 +-9.152681E-03 +1.324681E-01 +-5.707326E-01 +1.092067E-01 +2.326858E-01 +6.731743E-02 +-5.170241E-01 +1.353439E-01 +-4.064026E-01 +9.715030E-02 +-1.142031E-01 +7.748788E-02 +2.928039E-01 +2.716157E-01 +-1.721186E-01 +1.447738E-01 +6.452116E-01 +1.821975E-01 +-5.697276E-01 +1.047333E-01 +-9.640967E-02 +1.139327E-01 +-4.509832E-01 +2.079493E-01 +-2.134684E-02 +2.907667E-01 +-2.434868E-01 +1.235397E-01 +2.550330E-01 +2.979627E-01 +9.598615E-01 +3.140885E-01 +1.218430E-01 +6.283872E-02 +2.412915E-01 +1.907292E-02 +-2.236667E-01 +4.379414E-02 +2.844474E-01 +2.965692E-02 +1.618860E-01 +8.293785E-03 +-1.265583E-01 +4.515449E-02 +6.356127E-02 +1.358134E-02 +-3.844886E-01 +8.600010E-02 +-1.942739E-01 +7.516022E-02 +1.765511E-01 +3.522611E-02 +-3.433188E-01 +3.456066E-02 +-1.501983E-01 +5.633844E-02 +1.040924E+01 +2.432332E+01 +-4.138270E-01 +1.309129E-01 +-3.151106E-01 +1.286964E-01 +9.213222E-02 +6.189454E-02 +-2.746107E-01 +8.103949E-02 +-9.781742E-02 +3.783736E-02 +-1.178371E-01 +3.242332E-02 +-5.837932E-01 +2.059491E-01 +-7.338223E-03 +8.012203E-02 +5.628994E-02 +2.190669E-02 +8.155585E-02 +1.039007E-01 +6.052048E-02 +4.339463E-02 +-1.157646E-02 +1.839000E-02 +-2.641673E-01 +4.737589E-02 +-8.531135E-02 +5.432766E-02 +6.036555E-01 +1.190329E-01 +-3.149976E-01 +5.735264E-02 +-8.456340E-02 +4.563143E-03 +2.224065E-01 +6.600030E-02 +9.562392E-03 +1.843524E-02 +-2.400599E-01 +3.182217E-02 +-6.534941E-01 +1.180315E-01 +4.371157E-01 +9.076666E-02 +3.257455E-02 +2.936184E-02 +-8.788428E-02 +1.923293E-02 +-2.604776E-01 +3.660313E-02 +-6.315350E-02 +1.503534E-02 +5.609294E-01 +8.783528E-02 +-7.363672E-01 +1.789210E-01 +2.883575E-01 +6.478578E-02 +-3.302954E-02 +1.517946E-02 +-3.234157E-01 +4.418920E-02 +2.846318E-01 +2.712085E-02 +-3.227536E-01 +5.062832E-02 +4.391474E-01 +5.548002E-02 +1.322988E-01 +2.995854E-02 +5.709679E+01 +6.978668E+02 +2.859201E-02 +1.094507E+00 +6.058587E-01 +6.079927E-01 +7.553798E-02 +1.131607E+00 +-5.851206E-01 +1.215663E+00 +8.266012E-02 +9.031287E-01 +-7.088368E-01 +3.984608E-01 +-4.414986E-01 +1.502417E-01 +2.241998E-01 +3.228823E-01 +-7.328574E-01 +2.430448E-01 +-8.070160E-01 +1.767265E-01 +-1.154449E-01 +8.739303E-03 +-3.787161E-01 +4.728756E-01 +-1.743577E-01 +1.091245E-01 +2.878137E-01 +2.724285E-01 +2.128994E-01 +4.440539E-01 +9.495567E-01 +3.622719E-01 +1.422950E-01 +5.309223E-02 +1.323659E-01 +1.911979E-01 +-1.303752E-01 +5.710728E-01 +-4.611294E-02 +4.086632E-02 +5.937879E-01 +1.006156E-01 +-3.558925E-01 +2.998983E-01 +1.175971E+00 +5.323321E-01 +2.426485E-01 +1.497265E-01 +7.805090E-02 +5.060214E-02 +-2.914577E-01 +2.233355E-01 +1.053098E-01 +6.693123E-02 +4.541315E-01 +1.328340E-01 +-6.290732E-02 +8.910616E-02 +7.371592E-01 +1.980732E-01 +5.804701E-01 +1.711949E-01 +-6.642202E-01 +1.131866E-01 +1.779818E-01 +6.530190E-02 +-5.224739E-01 +2.534102E-01 +-1.824905E-01 +2.910309E-02 diff --git a/tests/test_score_flux_yn/tallies.xml b/tests/test_score_flux_yn/tallies.xml index 71301d0e7f..e9f08bd4e6 100644 --- a/tests/test_score_flux_yn/tallies.xml +++ b/tests/test_score_flux_yn/tallies.xml @@ -10,5 +10,17 @@ flux-y5 + + + + flux-y5 + analog + + + + + flux-y5 + collision + diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index dadcdd281b..e992b4b682 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -9,3 +9,21 @@ tally 1: 0.000000E+00 2.035912E+02 8.999693E+03 +tally 2: +1.765331E+02 +6.974050E+03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.938441E+02 +7.888708E+03 +tally 3: +1.770125E+02 +6.702714E+03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.942246E+02 +8.416720E+03 diff --git a/tests/test_score_kappafission/tallies.xml b/tests/test_score_kappafission/tallies.xml index 1b63fdeeb2..8fe5d5c842 100644 --- a/tests/test_score_kappafission/tallies.xml +++ b/tests/test_score_kappafission/tallies.xml @@ -6,4 +6,16 @@ kappa-fission - \ No newline at end of file + + + kappa-fission + analog + + + + + kappa-fission + collision + + + diff --git a/tests/test_score_nufission/results_true.dat b/tests/test_score_nufission/results_true.dat index 5d0b44662e..33c4ff9fbc 100644 --- a/tests/test_score_nufission/results_true.dat +++ b/tests/test_score_nufission/results_true.dat @@ -9,3 +9,21 @@ tally 1: 0.000000E+00 2.733038E+00 1.616903E+00 +tally 2: +2.296157E+00 +1.167084E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.679940E+00 +1.498454E+00 +tally 3: +2.381373E+00 +1.213497E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.607077E+00 +1.513932E+00 diff --git a/tests/test_score_nufission/tallies.xml b/tests/test_score_nufission/tallies.xml index d3e6963f3c..2812a00b55 100644 --- a/tests/test_score_nufission/tallies.xml +++ b/tests/test_score_nufission/tallies.xml @@ -6,4 +6,16 @@ nu-fission - \ No newline at end of file + + + nu-fission + analog + + + + + nu-fission + collision + + + diff --git a/tests/test_score_scatter/results_true.dat b/tests/test_score_scatter/results_true.dat index 5f0ae8b1dd..21d7d83c27 100644 --- a/tests/test_score_scatter/results_true.dat +++ b/tests/test_score_scatter/results_true.dat @@ -9,3 +9,21 @@ tally 1: 1.814004E+00 4.059013E+01 3.609499E+02 +tally 2: +0.000000E+00 +0.000000E+00 +1.169000E+01 +2.915330E+01 +3.200000E+00 +2.342600E+00 +4.064000E+01 +3.595168E+02 +tally 3: +0.000000E+00 +0.000000E+00 +1.172929E+01 +2.935812E+01 +3.185726E+00 +2.323517E+00 +4.074319E+01 +3.614902E+02 diff --git a/tests/test_score_scatter/tallies.xml b/tests/test_score_scatter/tallies.xml index a4425c0f24..b6eb73b506 100644 --- a/tests/test_score_scatter/tallies.xml +++ b/tests/test_score_scatter/tallies.xml @@ -6,4 +6,16 @@ scatter - \ No newline at end of file + + + scatter + analog + + + + + scatter + collision + + + diff --git a/tests/test_score_total/results_true.dat b/tests/test_score_total/results_true.dat index f3aa5d89b1..e782fd9d04 100644 --- a/tests/test_score_total/results_true.dat +++ b/tests/test_score_total/results_true.dat @@ -9,3 +9,21 @@ tally 1: 1.831649E+00 4.088282E+01 3.662539E+02 +tally 2: +0.000000E+00 +0.000000E+00 +1.372000E+01 +4.018980E+01 +3.200000E+00 +2.342600E+00 +4.104000E+01 +3.668254E+02 +tally 3: +0.000000E+00 +0.000000E+00 +1.372000E+01 +4.018980E+01 +3.200000E+00 +2.342600E+00 +4.104000E+01 +3.668254E+02 diff --git a/tests/test_score_total/tallies.xml b/tests/test_score_total/tallies.xml index 815b84c145..02286f96c7 100644 --- a/tests/test_score_total/tallies.xml +++ b/tests/test_score_total/tallies.xml @@ -6,4 +6,16 @@ total - \ No newline at end of file + + + total + analog + + + + + total + collision + + + diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index bcfdb9080f..28a4b1627e 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -410,3 +410,805 @@ tally 2: 3.130205E-02 -3.695818E-01 4.703480E-02 +tally 3: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.200000E-01 +1.152000E-01 +-9.800486E-03 +5.637123E-04 +-2.018554E-02 +4.617738E-04 +-6.271657E-03 +8.252833E-04 +-8.231683E-03 +3.035447E-03 +-2.566508E-02 +1.108829E-03 +2.748466E-03 +1.641191E-03 +6.833190E-03 +5.993876E-04 +3.392213E-02 +2.143714E-03 +3.105616E-02 +1.012625E-03 +-5.473567E-02 +1.615531E-03 +-1.435523E-02 +1.095690E-03 +4.579564E-03 +6.451444E-04 +-1.570409E-02 +3.833387E-04 +1.633422E-02 +2.144997E-03 +-7.438775E-03 +6.441846E-04 +5.440025E-04 +1.290719E-04 +-1.687899E-02 +1.606230E-03 +3.315902E-02 +1.061759E-03 +-1.184684E-02 +4.312573E-04 +-4.732586E-02 +1.387994E-03 +-1.563538E-02 +3.316015E-04 +3.681927E-02 +5.403320E-04 +2.928507E-03 +5.761742E-04 +-3.519362E-02 +6.725185E-04 +1.372000E+01 +4.018980E+01 +-2.015212E-01 +1.072884E-01 +-2.606953E-01 +4.894468E-02 +7.537153E-02 +2.216346E-02 +-3.818524E-02 +6.301675E-02 +2.386335E-01 +1.931104E-02 +-1.872805E-02 +1.265896E-02 +3.732943E-02 +2.347696E-02 +-8.857050E-02 +1.636275E-02 +-1.718450E-01 +1.043488E-02 +1.526226E-01 +2.435399E-02 +7.344765E-02 +1.541644E-02 +-9.819186E-03 +1.473467E-02 +-8.215914E-03 +1.463085E-02 +2.197504E-01 +2.244815E-02 +2.521002E-02 +8.206540E-03 +3.677974E-01 +3.982027E-02 +-1.934606E-01 +3.440019E-02 +1.050141E-01 +2.346980E-02 +2.458487E-01 +1.861429E-02 +4.226131E-02 +2.690841E-03 +3.174234E-02 +1.867018E-02 +2.284995E-01 +1.190246E-02 +-7.894573E-03 +3.715471E-03 +-1.593928E-01 +1.391828E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.200000E+00 +2.342600E+00 +-2.991985E-01 +1.868406E-02 +4.460301E-02 +4.132113E-03 +-2.190630E-02 +1.023889E-02 +-3.265764E-02 +2.060374E-03 +3.491521E-02 +4.785957E-04 +-3.623623E-02 +5.929111E-04 +-4.962268E-02 +1.814245E-03 +1.406439E-01 +1.174445E-02 +-9.433277E-02 +5.036897E-03 +9.058176E-02 +3.871598E-03 +-1.409089E-01 +6.665385E-03 +-1.062337E-01 +4.771650E-03 +1.155280E-01 +8.020320E-03 +8.348336E-02 +1.633941E-03 +1.475434E-02 +3.411046E-03 +4.474425E-03 +6.049348E-03 +6.716359E-03 +2.898000E-03 +-3.674047E-02 +2.971797E-03 +-2.368070E-02 +9.474965E-04 +-6.109826E-02 +4.846201E-03 +-5.076118E-02 +8.354393E-03 +-1.763594E-02 +1.017310E-03 +-2.941064E-02 +1.044916E-03 +-5.631429E-03 +3.915186E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.104000E+01 +3.668254E+02 +-7.832373E-01 +3.913941E-01 +2.281642E-01 +2.669856E-01 +-3.731272E-01 +6.152809E-01 +-3.232973E-01 +7.526283E-02 +3.686513E-01 +9.047618E-02 +-6.018185E-01 +9.140623E-02 +3.848843E-01 +3.431711E-01 +3.397425E-03 +8.879103E-02 +-2.471531E-02 +5.561795E-02 +1.373897E-01 +7.288680E-02 +1.816888E-01 +5.419638E-02 +-3.504404E-01 +1.461853E-01 +1.225356E-01 +3.443595E-02 +-3.109887E-01 +5.492397E-02 +-3.542105E-01 +6.530224E-02 +2.104218E-01 +4.093872E-02 +2.661467E-02 +3.058847E-02 +-3.744331E-01 +6.755739E-02 +1.391218E-01 +4.432842E-02 +1.622041E-01 +6.843992E-03 +4.149973E-02 +1.782398E-02 +2.551752E-01 +2.626972E-02 +-4.706697E-01 +9.193926E-02 +-1.287882E-01 +3.489982E-02 +tally 4: +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.652157E-01 +1.242826E-01 +-1.008373E-02 +5.281691E-04 +-1.014715E-02 +2.749212E-04 +-2.506414E-02 +2.613512E-04 +4.320187E-03 +4.316562E-04 +1.439246E-02 +9.138575E-05 +-1.532539E-02 +2.360878E-04 +9.963404E-03 +1.511695E-04 +-6.314554E-03 +2.742799E-05 +7.969329E-03 +1.380329E-04 +-1.298431E-03 +3.287236E-04 +1.441639E-02 +1.409552E-04 +6.516689E-03 +2.511011E-04 +1.294596E-02 +2.249729E-04 +6.983038E-03 +6.334969E-05 +-1.086161E-02 +1.140033E-04 +2.217006E-02 +4.221807E-04 +-6.503276E-03 +2.028281E-04 +2.915180E-02 +3.659182E-04 +-9.080091E-03 +1.503808E-04 +-6.476980E-04 +1.927326E-04 +-1.549603E-02 +3.445843E-04 +2.957508E-02 +1.835035E-04 +6.982790E-03 +1.237342E-04 +-2.653281E-02 +2.606704E-04 +1.372000E+01 +4.018980E+01 +-2.015212E-01 +1.072884E-01 +-2.606953E-01 +4.894468E-02 +7.537153E-02 +2.216346E-02 +-3.818524E-02 +6.301675E-02 +2.386335E-01 +1.931104E-02 +-1.872805E-02 +1.265896E-02 +3.732943E-02 +2.347696E-02 +-8.857050E-02 +1.636275E-02 +-1.718450E-01 +1.043488E-02 +1.526226E-01 +2.435399E-02 +7.344765E-02 +1.541644E-02 +-9.819186E-03 +1.473467E-02 +-8.215914E-03 +1.463085E-02 +2.197504E-01 +2.244815E-02 +2.521002E-02 +8.206540E-03 +3.677974E-01 +3.982027E-02 +-1.934606E-01 +3.440019E-02 +1.050141E-01 +2.346980E-02 +2.458487E-01 +1.861429E-02 +4.226131E-02 +2.690841E-03 +3.174234E-02 +1.867018E-02 +2.284995E-01 +1.190246E-02 +-7.894573E-03 +3.715471E-03 +-1.593928E-01 +1.391828E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.200000E+00 +2.342600E+00 +-2.991985E-01 +1.868406E-02 +4.460301E-02 +4.132113E-03 +-2.190630E-02 +1.023889E-02 +-3.265764E-02 +2.060374E-03 +3.491521E-02 +4.785957E-04 +-3.623623E-02 +5.929111E-04 +-4.962268E-02 +1.814245E-03 +1.406439E-01 +1.174445E-02 +-9.433277E-02 +5.036897E-03 +9.058176E-02 +3.871598E-03 +-1.409089E-01 +6.665385E-03 +-1.062337E-01 +4.771650E-03 +1.155280E-01 +8.020320E-03 +8.348336E-02 +1.633941E-03 +1.475434E-02 +3.411046E-03 +4.474425E-03 +6.049348E-03 +6.716359E-03 +2.898000E-03 +-3.674047E-02 +2.971797E-03 +-2.368070E-02 +9.474965E-04 +-6.109826E-02 +4.846201E-03 +-5.076118E-02 +8.354393E-03 +-1.763594E-02 +1.017310E-03 +-2.941064E-02 +1.044916E-03 +-5.631429E-03 +3.915186E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.104000E+01 +3.668254E+02 +-7.832373E-01 +3.913941E-01 +2.281642E-01 +2.669856E-01 +-3.731272E-01 +6.152809E-01 +-3.232973E-01 +7.526283E-02 +3.686513E-01 +9.047618E-02 +-6.018185E-01 +9.140623E-02 +3.848843E-01 +3.431711E-01 +3.397425E-03 +8.879103E-02 +-2.471531E-02 +5.561795E-02 +1.373897E-01 +7.288680E-02 +1.816888E-01 +5.419638E-02 +-3.504404E-01 +1.461853E-01 +1.225356E-01 +3.443595E-02 +-3.109887E-01 +5.492397E-02 +-3.542105E-01 +6.530224E-02 +2.104218E-01 +4.093872E-02 +2.661467E-02 +3.058847E-02 +-3.744331E-01 +6.755739E-02 +1.391218E-01 +4.432842E-02 +1.622041E-01 +6.843992E-03 +4.149973E-02 +1.782398E-02 +2.551752E-01 +2.626972E-02 +-4.706697E-01 +9.193926E-02 +-1.287882E-01 +3.489982E-02 diff --git a/tests/test_score_total_yn/tallies.xml b/tests/test_score_total_yn/tallies.xml index ca5dcd2dcb..51cb79c395 100644 --- a/tests/test_score_total_yn/tallies.xml +++ b/tests/test_score_total_yn/tallies.xml @@ -11,5 +11,19 @@ total-y4 U-235 total + + + + total-y4 + U-235 total + analog + + + + + total-y4 + U-235 total + collision + From 4ce7a5b615caded1e10d1b49aaf73dbf38d736f1 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Thu, 17 Sep 2015 20:41:33 -0400 Subject: [PATCH 125/519] Explain analog = collision for flux score in docs --- docs/source/usersguide/input.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 34d3f7df43..a80c01d14e 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1298,7 +1298,9 @@ The ```` element accepts the following sub-elements: physical quantities: :flux: - Total flux in particle-cm per source particle. + Total flux in particle-cm per source particle. Note: The ``analog`` + estimator is actually identical to the ``collision`` estimator for the + flux score. :total: Total reaction rate in reactions per source particle. From c57b2c22d906fd657b26830293405d3f94832f44 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 18 Sep 2015 22:05:50 +0700 Subject: [PATCH 126/519] Minor fix in StatePoint.std_dev property and plot-mesh-tally script --- openmc/statepoint.py | 1 - openmc/tallies.py | 5 ++++- scripts/openmc-plot-mesh-tally | 2 -- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 9583563d59..8d6eb67e13 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -2,7 +2,6 @@ import copy import sys import numpy as np -import scipy.stats import openmc from openmc.constants import * diff --git a/openmc/tallies.py b/openmc/tallies.py index 25cc554eef..7452626be1 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -322,7 +322,10 @@ class Tally(object): return None n = self.num_realizations - self._std_dev = np.sqrt((self.sum_sq/n - self.mean**2)/(n - 1)) + nonzero = self.mean > 0 + self._std_dev = np.zeros_like(self.mean) + self._std_dev[nonzero] = np.sqrt((self.sum_sq[nonzero]/n - + self.mean[nonzero]**2)/(n - 1)) self.with_batch_statistics = True return self._std_dev diff --git a/scripts/openmc-plot-mesh-tally b/scripts/openmc-plot-mesh-tally index 1559ea3289..04f1f06c6c 100755 --- a/scripts/openmc-plot-mesh-tally +++ b/scripts/openmc-plot-mesh-tally @@ -273,8 +273,6 @@ class MeshPlotter(tk.Frame): def get_file_data(self, filename): # Create StatePoint object and read in data self.datafile = StatePoint(filename) - self.datafile.read_results() - self.datafile.compute_stdev() # Find which tallies are mesh tallies self.meshTallies = [] From 04caeb99ba04f92cba484884f8223446c2bc9bee Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 18 Sep 2015 17:55:52 -0400 Subject: [PATCH 127/519] Minor fixes for #455 --- src/input_xml.F90 | 7 +++---- src/tally.F90 | 24 ++++++++---------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index d5a932ff64..15a08148d2 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3132,7 +3132,7 @@ contains ! tally needs post-collision information if (t % estimator == ESTIMATOR_ANALOG) then call fatal_error("Cannot use track-length estimator for tally " & - &// to_str(t % id)) + // to_str(t % id)) end if ! Set estimator to track-length estimator @@ -3143,16 +3143,15 @@ contains ! tally needs post-collision information if (t % estimator == ESTIMATOR_ANALOG) then call fatal_error("Cannot use collision estimator for tally " & - &// to_str(t % id)) + // to_str(t % id)) end if ! Set estimator to collision estimator t % estimator = ESTIMATOR_COLLISION - write(*, *) t % estimator case default call fatal_error("Invalid estimator '" // trim(temp_str) & - &// "' on tally " // to_str(t % id)) + // "' on tally " // to_str(t % id)) end select end if diff --git a/src/tally.F90 b/src/tally.F90 index 9f9ae77657..12085b5d27 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -92,8 +92,7 @@ contains end if score = score / material_xs % total - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else ! For flux, we need no cross section score = flux end if @@ -112,8 +111,7 @@ contains score = p % last_wgt end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % total * atom_density * flux else @@ -131,8 +129,7 @@ contains ! reaction rate score = p % last_wgt - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else ! Note SCORE_SCATTER_N not available for tracklength/collision. if (i_nuclide > 0) then score = (micro_xs(i_nuclide) % total & @@ -243,8 +240,7 @@ contains score = p % last_wgt end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % absorption * atom_density * flux else @@ -275,8 +271,7 @@ contains / micro_xs(p % event_nuclide) % absorption end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % fission * atom_density * flux else @@ -319,8 +314,7 @@ contains score = keff * p % wgt_bank end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % nu_fission * atom_density * flux else @@ -353,8 +347,7 @@ contains micro_xs(p % event_nuclide) % absorption end if - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % kappa_fission * atom_density * flux else @@ -375,8 +368,7 @@ contains if (p % event_MT /= score_bin) cycle SCORE_LOOP score = p % last_wgt - else if (t % estimator == ESTIMATOR_TRACKLENGTH .or. & - t % estimator == ESTIMATOR_COLLISION) then + else ! Any other cross section has to be calculated on-the-fly. For ! cross sections that are used often (e.g. n2n, ngamma, etc. for ! depletion), it might make sense to optimize this section or From 42032210fb618724ab912e79217803bf2686adb3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 19 Sep 2015 07:38:33 +0700 Subject: [PATCH 128/519] Added IPython notebook with post-processing examples. Since the notebook shows an example of how to histogram relative errors from a statepoint, we don't really need the openmc-statepoint-histogram utility, so it's been deleted. The user's guide section on post processing has been updated as well. --- docs/source/devguide/index.rst | 1 - docs/source/devguide/voxel.rst | 52 - .../pythonapi/examples/post-processing.ipynb | 1121 +++++++++++++++++ .../pythonapi/examples/post-processing.rst | 13 + docs/source/pythonapi/index.rst | 1 + docs/source/usersguide/output/voxel.rst | 6 +- docs/source/usersguide/processing.rst | 286 +---- scripts/openmc-statepoint-histogram | 43 - setup.py | 2 +- 9 files changed, 1207 insertions(+), 318 deletions(-) delete mode 100644 docs/source/devguide/voxel.rst create mode 100644 docs/source/pythonapi/examples/post-processing.ipynb create mode 100644 docs/source/pythonapi/examples/post-processing.rst delete mode 100755 scripts/openmc-statepoint-histogram diff --git a/docs/source/devguide/index.rst b/docs/source/devguide/index.rst index e73d8ba70d..37b17bc0fa 100644 --- a/docs/source/devguide/index.rst +++ b/docs/source/devguide/index.rst @@ -16,5 +16,4 @@ as debugging. styleguide workflow xml-parsing - voxel docbuild diff --git a/docs/source/devguide/voxel.rst b/docs/source/devguide/voxel.rst deleted file mode 100644 index 98f5cb73b2..0000000000 --- a/docs/source/devguide/voxel.rst +++ /dev/null @@ -1,52 +0,0 @@ -.. _devguide_voxel: - -===================================== -Voxel Plot Binary File Specifications -===================================== - -The current revision of the voxel plot binary file is 1. - -**integer(4) n_voxels_x** - - Number of voxels in the x direction - -**integer(4) n_voxels_y** - - Number of voxels in the y direction - -**integer(4) n_voxels_z** - - Number of voxels in the z direction - -**real(8) width_voxel_x** - - Width of voxels in the x direction - -**real(8) width_voxel_y** - - Width of voxels in the y direction - -**real(8) width_voxel_z** - - Width of voxels in the z direction - -**real(8) lower_left_x** - - Lower left x point of the voxel grid - -**real(8) lower_left_y** - - Lower left y point of the voxel grid - -**real(8) lower_left_z** - - Lower left z point of the voxel grid - -*do x = 1, n_voxels_x* - *do y = 1, n_voxels_y* - *do z = 1, n_voxels_z* - - **integer(4) id** - - Cell or material id number at this voxel center. Set to -1 when - cell not_found. diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb new file mode 100644 index 0000000000..1bd7ee49a6 --- /dev/null +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -0,0 +1,1121 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates some basic post-processing tasks that can be performed with the Python API, such as plotting a 2D mesh tally and plotting neutron source sites from an eigenvalue calculation. The problem we will use is a simple reflected pin-cell." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from IPython.display import Image\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "from openmc.statepoint import StatePoint\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H-1')\n", + "b10 = openmc.Nuclide('B-10')\n", + "o16 = openmc.Nuclide('O-16')\n", + "u235 = openmc.Nuclide('U-235')\n", + "u238 = openmc.Nuclide('U-238')\n", + "zr90 = openmc.Nuclide('Zr-90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create three materials for the fuel, water, and cladding of the fuel pin." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "water.add_nuclide(b10, 8.0042e-6)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our three materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "# Use both reflective and vacuum boundaries to make life interesting\n", + "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "pin_cell_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", + "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "pin_cell_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "pin_cell_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = pin_cell_universe\n", + "\n", + "# Add boundary planes\n", + "root_cell.add_surface(min_x, halfspace=+1)\n", + "root_cell.add_surface(max_x, halfspace=-1)\n", + "root_cell.add_surface(min_y, halfspace=+1)\n", + "root_cell.add_surface(max_y, halfspace=-1)\n", + "root_cell.add_surface(min_z, halfspace=+1)\n", + "root_cell.add_surface(max_z, halfspace=-1)\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "geometry = openmc.Geometry()\n", + "geometry.root_universe = root_universe" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the geometry and materials finished, we now just need to define simulation parameters. In this case, we will use 10 inactive batches and 90 active batches each with 5000 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 100\n", + "inactive = 10\n", + "particles = 5000\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "source_bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('box', source_bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us also create a plot file that we can use to verify that our pin cell geometry was created successfully." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Plot\n", + "plot = openmc.Plot(plot_id=1)\n", + "plot.filename = 'materials-xy'\n", + "plot.origin = [0, 0, 0]\n", + "plot.width = [1.26, 1.26]\n", + "plot.pixels = [250, 250]\n", + "plot.color = 'mat'\n", + "\n", + "# Instantiate a PlotsFile, add Plot, and export to \"plots.xml\"\n", + "plot_file = openmc.PlotsFile()\n", + "plot_file.add_plot(plot)\n", + "plot_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the plots.xml file, we can now generate and view the plot. OpenMC outputs plots in .ppm format, which can be converted into a compressed format like .png with the convert utility." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Run openmc in plotting mode\n", + "executor = openmc.Executor()\n", + "executor.plot_geometry(output=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEwAiCb5uYN4AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMThUMjE6MTc6\nMDErMDc6MDA/DItCAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTE4VDIxOjE3OjAxKzA3OjAw\nTlEz/gAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert OpenMC's funky ppm to png\n", + "!convert materials-xy.ppm materials-xy.png\n", + "\n", + "# Display the materials plot inline\n", + "Image(filename='materials-xy.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see from the plot, we have a nice pin cell with fuel, cladding, and water! Before we run our simulation, we need to tell the code what we want to tally. The following code shows how to create a 2D mesh tally." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "tallies_file.tallies = []" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create mesh which will be used for tally\n", + "mesh = openmc.Mesh()\n", + "mesh.dimension = [100, 100]\n", + "mesh.lower_left = [-0.63, -0.63]\n", + "mesh.upper_right = [0.63, 0.63]\n", + "tallies_file.add_mesh(mesh)\n", + "\n", + "# Create mesh filter for tally\n", + "mesh_filter = openmc.Filter(type='mesh', bins=[1])\n", + "mesh_filter.mesh = mesh\n", + "\n", + "# Create mesh tally to score flux and fission rate\n", + "tally = openmc.Tally(name='flux')\n", + "tally.add_filter(mesh_filter)\n", + "tally.add_score('flux')\n", + "tally.add_score('fission')\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: 3df61825cc8c93656ed1458c34fca14000884e73\n", + " Date/Time: 2015-09-19 07:34:09\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 materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 5010.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.01593 \n", + " 2/1 1.05332 \n", + " 3/1 1.03858 \n", + " 4/1 1.03420 \n", + " 5/1 1.03004 \n", + " 6/1 1.03899 \n", + " 7/1 1.04639 \n", + " 8/1 1.03921 \n", + " 9/1 1.00410 \n", + " 10/1 1.06702 \n", + " 11/1 1.03401 \n", + " 12/1 1.05518 1.04460 +/- 0.01059\n", + " 13/1 1.03358 1.04092 +/- 0.00713\n", + " 14/1 1.00991 1.03317 +/- 0.00925\n", + " 15/1 1.04884 1.03631 +/- 0.00782\n", + " 16/1 1.03449 1.03600 +/- 0.00639\n", + " 17/1 1.04612 1.03745 +/- 0.00559\n", + " 18/1 1.07511 1.04216 +/- 0.00675\n", + " 19/1 1.01774 1.03944 +/- 0.00655\n", + " 20/1 1.04054 1.03955 +/- 0.00586\n", + " 21/1 1.01202 1.03705 +/- 0.00586\n", + " 22/1 1.04460 1.03768 +/- 0.00538\n", + " 23/1 1.04415 1.03818 +/- 0.00498\n", + " 24/1 1.04222 1.03846 +/- 0.00462\n", + " 25/1 1.04045 1.03860 +/- 0.00430\n", + " 26/1 1.04133 1.03877 +/- 0.00403\n", + " 27/1 1.03166 1.03835 +/- 0.00381\n", + " 28/1 1.00701 1.03661 +/- 0.00399\n", + " 29/1 1.04111 1.03685 +/- 0.00378\n", + " 30/1 1.05130 1.03757 +/- 0.00366\n", + " 31/1 1.02685 1.03706 +/- 0.00352\n", + " 32/1 1.03458 1.03695 +/- 0.00335\n", + " 33/1 1.05243 1.03762 +/- 0.00328\n", + " 34/1 1.05717 1.03843 +/- 0.00324\n", + " 35/1 1.07396 1.03985 +/- 0.00342\n", + " 36/1 1.01690 1.03897 +/- 0.00340\n", + " 37/1 1.03340 1.03877 +/- 0.00328\n", + " 38/1 1.04153 1.03886 +/- 0.00316\n", + " 39/1 1.01971 1.03820 +/- 0.00312\n", + " 40/1 1.01491 1.03743 +/- 0.00311\n", + " 41/1 1.02779 1.03712 +/- 0.00303\n", + " 42/1 1.03047 1.03691 +/- 0.00294\n", + " 43/1 1.02305 1.03649 +/- 0.00288\n", + " 44/1 1.07854 1.03773 +/- 0.00305\n", + " 45/1 1.04412 1.03791 +/- 0.00297\n", + " 46/1 1.05139 1.03828 +/- 0.00291\n", + " 47/1 1.05357 1.03870 +/- 0.00286\n", + " 48/1 1.06435 1.03937 +/- 0.00287\n", + " 49/1 1.02632 1.03904 +/- 0.00281\n", + " 50/1 1.05201 1.03936 +/- 0.00276\n", + " 51/1 1.04582 1.03952 +/- 0.00270\n", + " 52/1 1.02056 1.03907 +/- 0.00267\n", + " 53/1 1.06448 1.03966 +/- 0.00267\n", + " 54/1 1.03609 1.03958 +/- 0.00261\n", + " 55/1 1.02701 1.03930 +/- 0.00257\n", + " 56/1 1.04865 1.03950 +/- 0.00252\n", + " 57/1 1.06310 1.04000 +/- 0.00252\n", + " 58/1 1.02975 1.03979 +/- 0.00247\n", + " 59/1 1.03922 1.03978 +/- 0.00242\n", + " 60/1 1.07259 1.04043 +/- 0.00246\n", + " 61/1 1.04555 1.04053 +/- 0.00242\n", + " 62/1 1.01950 1.04013 +/- 0.00240\n", + " 63/1 1.04618 1.04024 +/- 0.00236\n", + " 64/1 1.02489 1.03996 +/- 0.00233\n", + " 65/1 1.06850 1.04048 +/- 0.00235\n", + " 66/1 1.03623 1.04040 +/- 0.00231\n", + " 67/1 0.99892 1.03967 +/- 0.00238\n", + " 68/1 1.05557 1.03995 +/- 0.00236\n", + " 69/1 1.01211 1.03948 +/- 0.00236\n", + " 70/1 1.04679 1.03960 +/- 0.00233\n", + " 71/1 1.03461 1.03952 +/- 0.00229\n", + " 72/1 1.01993 1.03920 +/- 0.00227\n", + " 73/1 1.04742 1.03933 +/- 0.00224\n", + " 74/1 1.05269 1.03954 +/- 0.00222\n", + " 75/1 1.05696 1.03981 +/- 0.00220\n", + " 76/1 1.05904 1.04010 +/- 0.00218\n", + " 77/1 1.05930 1.04039 +/- 0.00217\n", + " 78/1 1.03375 1.04029 +/- 0.00214\n", + " 79/1 1.07044 1.04073 +/- 0.00215\n", + " 80/1 1.04144 1.04074 +/- 0.00212\n", + " 81/1 1.06296 1.04105 +/- 0.00212\n", + " 82/1 1.04630 1.04112 +/- 0.00209\n", + " 83/1 1.03772 1.04108 +/- 0.00206\n", + " 84/1 1.03774 1.04103 +/- 0.00203\n", + " 85/1 1.03984 1.04101 +/- 0.00200\n", + " 86/1 1.03040 1.04087 +/- 0.00198\n", + " 87/1 1.03484 1.04080 +/- 0.00196\n", + " 88/1 1.03820 1.04076 +/- 0.00193\n", + " 89/1 1.04654 1.04084 +/- 0.00191\n", + " 90/1 1.03377 1.04075 +/- 0.00189\n", + " 91/1 1.03370 1.04066 +/- 0.00187\n", + " 92/1 1.04172 1.04067 +/- 0.00184\n", + " 93/1 1.04945 1.04078 +/- 0.00182\n", + " 94/1 1.03360 1.04069 +/- 0.00181\n", + " 95/1 1.06547 1.04099 +/- 0.00181\n", + " 96/1 1.04340 1.04101 +/- 0.00179\n", + " 97/1 1.07502 1.04140 +/- 0.00181\n", + " 98/1 1.05391 1.04155 +/- 0.00179\n", + " 99/1 1.05622 1.04171 +/- 0.00178\n", + " 100/1 1.01519 1.04142 +/- 0.00179\n", + " Creating state point statepoint.100.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 3.6600E-01 seconds\n", + " Reading cross sections = 1.1500E-01 seconds\n", + " Total time in simulation = 8.1308E+01 seconds\n", + " Time in transport only = 8.1157E+01 seconds\n", + " Time in inactive batches = 2.1600E+00 seconds\n", + " Time in active batches = 7.9148E+01 seconds\n", + " Time synchronizing fission bank = 1.6000E-02 seconds\n", + " Sampling source sites = 9.0000E-03 seconds\n", + " SEND/RECV source sites = 7.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-02 seconds\n", + " Total time for finalization = 1.6400E-01 seconds\n", + " Total time elapsed = 8.1856E+01 seconds\n", + " Calculation Rate (inactive) = 23148.1 neutrons/second\n", + " Calculation Rate (active) = 5685.55 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.04100 +/- 0.00169\n", + " k-effective (Track-length) = 1.04142 +/- 0.00179\n", + " k-effective (Absorption) = 1.04380 +/- 0.00147\n", + " Combined k-effective = 1.04287 +/- 0.00130\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run OpenMC!\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Load the statepoint file\n", + "sp = StatePoint('statepoint.100.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we need to get the tally, which can be done with the ``StatePoint.get_tally(...)`` method." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\t-1 \n", + "\tScores =\t['flux', 'fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], + "source": [ + "tally = sp.get_tally(scores=['flux'])\n", + "print(tally)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint file actually stores the sum and sum-of-squares for each tally bin from which the mean and variance can be calculated as described [here](http://mit-crpg.github.io/openmc/methods/tallies.html#variance). The sum and sum-of-squares can be accessed using the ``sum`` and ``sum_sq`` properties:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[ 0.41271426, 0. ]],\n", + "\n", + " [[ 0.40846766, 0. ]],\n", + "\n", + " [[ 0.4112029 , 0. ]],\n", + "\n", + " ..., \n", + " [[ 0.41437289, 0. ]],\n", + "\n", + " [[ 0.41376468, 0. ]],\n", + "\n", + " [[ 0.41312074, 0. ]]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tally.sum" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, the mean and standard deviation of the mean are usually what you are more interested in. The Tally class also has properties ``mean`` and ``std_dev`` which automatically calculate these statistics on-the-fly." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10000, 1, 2)\n" + ] + }, + { + "data": { + "text/plain": [ + "(array([[[ 0.00458571, 0. ]],\n", + " \n", + " [[ 0.00453853, 0. ]],\n", + " \n", + " [[ 0.00456892, 0. ]],\n", + " \n", + " ..., \n", + " [[ 0.00460414, 0. ]],\n", + " \n", + " [[ 0.00459739, 0. ]],\n", + " \n", + " [[ 0.00459023, 0. ]]]),\n", + " array([[[ 2.02702426e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.77108625e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.79568064e-05, 0.00000000e+00]],\n", + " \n", + " ..., \n", + " [[ 1.83114148e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.69970626e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.92143217e-05, 0.00000000e+00]]]))" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(tally.mean.shape)\n", + "(tally.mean, tally.std_dev)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The tally data has three dimensions: one for filter combinations, one for nuclides, and one for scores. We see that there are 10000 filter combinations (corresponding to the 100 x 100 mesh bins), a single nuclide (since none was specified), and two scores. If we only want to look at a single score, we can use the ``get_slice(...)`` method as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\t-1 \n", + "\tScores =\t['flux']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], + "source": [ + "flux = tally.get_slice(scores=['flux'])\n", + "fission = tally.get_slice(scores=['fission'])\n", + "print(flux)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get the bins into a form that we can plot, we can simply change the shape of the array since it is a numpy array." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "flux.std_dev.shape = (100, 100)\n", + "flux.mean.shape = (100, 100)\n", + "fission.std_dev.shape = (100, 100)\n", + "fission.mean.shape = (100, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWwAAAC4CAYAAADHR9Y0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XnQJOdh3/dv3z0993289/3ufR8AFsQNAgQPSKIkymRk\nyVKiVGJJseOyEztOxZFdlbKiUnSVSkokUbZIkabEAyQBECSIa4EFdhfY+3333fe+37nvq7unO3+s\nUuXYKkslaAWwOJ//ZmrmfXqmfvV7e7qfflpwXZe+vr6+vg8/8YPegL6+vr6+v55+Yff19fX9gOgX\ndl9fX98PiH5h9/X19f2A6Bd2X19f3w+IfmH39fX1/YB4X4UtCMJTgiDcFgRhURCEf/a3tVF9fR+k\nfq77PqyEv+k8bEEQJGABeBzYBi4BP+W67vzf3ub19f3d6ue678Ps/exhnwaWXNddc13XAr4EfOpv\nZ7P6+j4w/Vz3fWi9n8IeADb/o8dbf/FcX98Psn6u+z605Pfx3r/yWIogCP3r3vvuKdd1hb/tP/lX\nvaCf676/C39Ztt9PYW8DQ//R4yHu7o38/0jHPk7y5d9Ak9p8THuep9UX+U37l9gV0sTcAjcunsQR\nBEYOLNGVNJqyl5ro5zPyl/C0Onxh+2fxJ8uoeodCIU29E8TtuaSVTarNCKVGAqHngCMQ0Kp8dN9z\n7L2X4Y1f+G1G/+9foat62FmZBAmElotQcPCereKq0LgZRo2YCKKLmdOYemAOr1Jn7g+OEHi0hPdM\nnfxChk7RoFeUYeMvPpQf8AIJIAVYwEvz8IdvgfBniP/jt5GGbZy8SCRVYOrpW0xJd1Acm3l7P03J\noGvrdIsG9XdDNG4E6NY0xh67w/hjd7A7CmlphwPKLR7tvEZL9PCOfIo/3vh5tp0BwpE8jk9kQN3i\nFJeYZIn19gi/8aMX+PXPD/NT+pdwvT3mpRle7jzO7+79MhFvnkHfGo2un63qECUzzOjQCk95XuQp\nvkOVIB10Oq7OnfoMFTcMGmDCyrdjvPpPZ4n/lognomD/c4PgPyly8NlrfJo/41/+2B0yX/l1FswZ\nDso3OSVdYtjeZDq7QqqcY2V8kFvefSwxRdgt46OOJPS4yBluLh1l5a0Zog/u4rpQfD3N0QcvERgv\ns+UMcFC8xaiwhoyN363joY0guOSI82vC//o+4vv+cg2zwE/ei/H/Gr78AY39wzbuBzn2v/pLn30/\nhX0ZmBIEYRTY4e6n+qn/9EWuLiB9W+AXH/8dPL4WrwoPMyavMswGdkdh6e397OYHWFw+gJMUUYa7\nGFNVVoQx0p49Hh96AVNVUEWTZPxF3mh8hPdunGD314foaSrCEQf54y2croJQdNFsE8+hJkLKJvsH\nNnYQ+LG7n1QyTHRfA/O3dewFDUYFxn58EXXEZN45zCntEpnEJms/OcoDqdc56L3Jy/ueYKkwSz6b\nAgNY5O4pqUGgBtwC1gDvCPzzMPxf38TjbxB/YJeG6SOiFhkR12lhkOukmd87TCK6y0njEp/TvsSF\nk2f5dvpp5l44guC4WC2NO1f2kY1nqMyGeVu/jwG2SLOLFO5izckUvp0h8/F1lAmLHTK08bDXy+D2\nLvKy8igBvcKPtJ+jqxkUezF6DZmt8ij5ZorevEQ3qyF4XOyf0mgO+NhmgOf5GBYKiU6OSy/dT85K\nwb67n7XTVODfGgweu8aJ0Luc+e1L3B6coUCUtzmDwi0eFl7FVFUMocmuleE7uU9gL6uEy2X2Z64S\n9eZJuDneMB/EFFXiSo4iMeySjHDdYeboAs4wvH0sjhlRqFsBsrU0lk9jV08zwDYlJ4LrChyX3iMn\nxN9HdN9/rvv6Pgh/48J2XdcWBOEfAt8BJOAP/rIz6ZLuIEgiI9I6bVGnSBRDaCHg0nB9OK6E3VNo\nmjIRT4Ggr4RPrLBTGiLfSROQ63TXNKJOgSPHrxLzZfEoLVp7IfyzNYypBhWCmKpLLwZZJYFgOHj9\nDTik0u76oQzsgRsTsU+p2GWN3qYMIjRzfszBDvJYh0IwgmBY6FMtSpUYy1tT2BkRwXGgzt3C7oKQ\nc1Dv6+CP1zBqLfK5FG3VQAxq6MEWw+PrlNph5IiFo8OWPYhXamJITY54rlK2Q7Q6BgP6JrHAGB6p\nhTDsEAsVGJeXyUeSND0GC+1p6rkQKc8u07F5po3bqKLNtdIparthXJ9ESY8TM3I0LT/YAg3HS0kO\nUXJC7IlJykqIYKSEZDp41BbWkEJBTFB3/HRkjRXGcBHIEUfDpCl5aaS8NG0Pkt9GTVloQybxcZv2\nboBsPUPxUJiSFGaXNHskqRFg2Z6kVI0TNio4isCWnKER9ePzReloAuFGBcoii/l9dHWNYirBpP8O\nsdgVhk5s4a4KVJphlPEO5WIUsdTDCQsUF2OYPR13v0BBiNFt6PSyKo2m/28a3b+VXPf1fRDezx42\nruu+ALzwX3qNcXAIY7aJ6xGxHBXLVbFFk4bgIyum6KY0JKOHOtolNbNFJJZHMh3mFw+TK6eQUz16\nr0qMdFbZP3kTb7TFQHyb7UMK0fs2Cd2Xp5E7TtcjYmZEloRJRpw1Bo4EqP6Mh8Z8GN4BLkEvo9Ab\nUMAwIWyCrVLbDeOpNAjvy7FqjLAtpfH76syvHOB64QTx2DZuRUDYdRGSDkggKj30I3Xi0zska3m6\ngo61piKsO2SOBxiaXmd+7hDDB5ZwdYEb1iFmhAUOqLc4mL7Jc5Vn2eiMsBnJ0JA8qHqX2FSBqfgS\nR/UrVA4EWeuOUqrGYFViLzxAO6rxOfVPSHjKXNVOk8+myatpiLgMh5cROg4M7EPrmFiOwpw0w0J7\nmkIvRihWIKNsk3ByVNIh5tcPUC17afc8zDcPsCaPM64sE3ZLgID3/gqi2MXv1hFTLo4tYcoqWy+M\nke2lyE7HqYl+2q4H1bGoTp/lhcYzlLcTxGJFookCir+N19PDoMmmPshCYT/NjSAsgRh0QZF4WHuF\nsfFlOsMaX//9n2B1dRJlsEP+ZhJBdPE+XsG646FbMahMhugoOtVqmAuXhxFK7ye57z/XcM/28P8a\nPqixf9jG/aDH/s+9r8L+6xg87uNjE18l49nitcajXKrez2fjf0xHV1kRJ+j5ReLBLLNHb1LwR1gr\njdOcD9L4YgCv3CDzLzbIHUqzl03zle3P8gnpazw48Du88D98jKVvNFn9ly20f5TCCQ/QLvnYvTmM\nlrJRZiaxcgbumgzrwCFgDBBd2L0NsgufPcTPHfk9Toy8w5IxQVCqYqHwLidojvmQBh1CnhLXB49Q\n9gbwhpuIUw5OTcSMqmxeG6U4lyZ5eAcj2WRjfpy2foJ1YRRBcjkjXCQgljivnSPXS6A7HfYp80S9\neQy3QUfU2M88E8oq4WiLrldmlxge2nyq+S3OVS+QnY6x4J/ijjiJJciUt0LwXcDH3Sx1BHKXMwiO\nCwf2c7l2hpXqFD6zQeWNENViEPMpFWnKxalI3P6V/RQWZRxtl/pDMZqzYYyxJuLsMlkzw8ruNJHR\nHMcCVzliX+Mbf/5pFrf24QyIdNY9KGmTbSeDaamYbR27pGMGTtOZj+LYErc4wmpvgpLuxzkvY815\nGfvpRbTkJr39Mr0xCZ9cJ+HL42gCt5mlLIUJfyLPyBWV5V+bprcrw7hD45iPyZNLDErb6J4Wd7rT\nFM04dAQis3kK9zq8/0U/jCXywzbuBz32f+6eF3ZczXHSt0CqkydsVfC5dZavTKGEu6Qnd9AmbNqm\nQb0VoHw7RqtroIYsRK2HR24z7FsjMFujkQyg+C1mmnc403ubvdkUuS8Ns3oxjbftwenIOFmZ9nUf\nNTOIxzKw31RhTbz7nQfBCDWIJvIUxx2kXo/M/fMcS11myneHOWEfDXy0LYN8NUVnXketmfARh47s\nQfI4BEMVLEOhJoWw8jqdgoIp9hhOrCDIDqrQovr9AHJWZ3/6Oues84xsrzNS22IzMUgz6GFJmCSX\nTyJ2XApDMQaUbRLKJqlYnj09yQ5xXCCp7HHc9y7rkQEqmp9bzj5uFI9S00McPvcexnQbIelgeRVW\nipOUuhEQoNBJUMgl7h5bvwA0gBjsrg9SzwfYu5mh2zQh0cbK66CpiLaLOaKCBrqng1dqYpkaq9Up\n8r0kLd2LHmky6V1AS7SpiAG6CCiCRVwtsbNm0dpVQbYpzwQpHwghDndxqxLCroxpqahaB0mz0MMt\nRNum1AmxMz8Auos62SExlMXfaiAuuexUh3AEGJJXCERr9FQBC4WgXCUt7rLbGsHvrX7Ahd3X93fv\nnhd2lCLjzhrhap0pfYnjgYu88PlPkRjY42OzX8dz8F2u7x7jKzc+i/Rij3CswPAvLbH6yAya2SGp\n7JEe2kEZtIgpefavzBHNVxjRNwj1jtLr3Uet7EeURaR8D2dVpBvUcZperJcVUIG/D8K6S9gpcnDk\nCreePIrqWJwaex1darLsTvCi9RSOKNFteVja2If9ZQVlo0vwYA5TNFArDoF4nUoxQmshiFsSwQ/u\nkR6mTwWvg+Gv0viyRmCtwaOffJGzq+9wZPUmT628zNJHhnktdo4/5B+wujxNuFhhKzGER2kjyC6V\naPDuPww8mKi0/Dolv589kqy7I9w297G+Mc3YwDLP/MrXCVNGpEcbg695Pk29cATrTQE6QBZ4HsgD\nmgsXHXbLA1AehBhw3AtDYfC4CD0HIetSb/iJh3LsH7xGB52Fyizz2SNwAHzBKsmZLe6zX0dzO7wj\nn8XpCXjUNofD12huVGi93gOzC08poEgQBXwCdkqioMSouT4kxyEqFqhbATbKwwjnZTLRbQ5OXiFJ\nFm2mS3pmm1f++KPYdYUHlDeZE/axwjg6HTLiDgFhkboZJWDX7nV0+/o+dO55YUv06EkSV8MHWJGG\nEZsOiGCKKmUirBJiO5wmemyHo5lruOsi7/3+SRrJAO5klS1xkOLrSQaLW3z2o18km0jwgvo0r914\nhOWtMRAMBLVHbDBLOFZhUxmjth1CeC2ObXhgAoSEiz7awButYQgtPnX8q5S7Yd4oPUw1EEQqu6y9\nOU1vSMaJivQcGf3HG3j1Gnq8w4SwSjBYZV0bxk24RIQstbej2KKEE3BYz03g1gV6FYmjmSv8xOmr\nTLHAanKIef805oSKL1qjSpAGXjz7a+hmnSV9nBHWUDE5zzkqhOii4SAiYdNG5xYHuF45ysbuFO2a\nQUbZ5UHe4BUeoUaAYTZ4yP8Kse0C35vr4cwATe6eJM0DnTbsbcBoFKbiMAK4IAgO4gmTYKJMqFdl\n+8Iwm3tjiG0HR5ZopwyYBjSIqCVOcYnbbx0k20lSO+thxLOOZ6PLpT99gErie0j/u0Xv6xqs1eHL\nXRw1DKsS8nqXWLdAq2hQKKTwDjUZ1Ve5P/Ym008tIqoOeyQxaNHGQ5UA1pxC/uUkLz3/DO4vOfQ+\nCjU3QO2dMMH1Oo889hKB4QrX7nV4+/o+ZO55Ybcx2BEy2LpMiTAdVePQoaskwjkG2GaXNKre5X79\nPEfi19iVBnnl6pP0ZAnB4yIKDqLaw9FFKkKIK8YRvld/lPmbR3DiAt4nO3SaGk5BxPbKuCEB8z0F\nburwqIQ0Y6GmO4hGD8WwCAsloskcrumi1TvkhCSuKKLqXaotL23LgDy4aYFeVKZzx0soVWEydYcO\nKrar0Or4cJcgPFIkHthla3cMy1QJ6mW0SBtSOjkSbBkDNAwfaswiRp5SL0LNDDIdXCAj75AlRa8k\nE+1UcOISutIh7uaZ6K7il5pckY9x0T7Noj1FEwPHK9A1FIpEyZKkQAwLBbuuYhb0uyVdA9XXJfRY\nicZ1P60dCXQZz/EO8okqzbAPzeoQEMskp3fQ4h0sSyG/nKCrelCw6OQN/ME6s8FbbC8PYc5rlN+O\nsbY2QS4eRz9do131Ye562dkcgqiM95N1XFWme8HG3JLgFRlsEUcVae34APDLNQQBPFKblL6Hk5Tw\nCw2O8x51/KwxSokIXVullfWyvjiOd6aGL1DFd6xKsZiiu+dj5NAa3bx2r6Pb1/ehc88Lu0iEG0ww\ny20sFKpGgE996s+YZAkViyV3kgA1Hue7+IQmFxMawqMONCW0bpeks0fqgT16gsRX+DQL7gzLjUm6\nt1TCDxfw3l9l78+HKexmKGQy0AJWbdi0IeygTnXwZ4pUs3EEWyThybHNIG3Vw7nI67QwaCR9aB9v\nszS3j84tD8xBd8tL1+PFXRewH7pBNFnkoHCTdjHA0s0D8CqMPLjOGf+bvFjw00h7yYyss7eW5Js8\niOtKxMiREXZJksNEo2hHqVcCnA28w0H5Jr/JL+GuK6T38kw/cIeAUmGqt8xwPcvL2sN83vc53m6f\noSSHUTN1zLbOqjbM1/gRagSoEOI2s+TWBmluBXC9XwQBfCM1Zn7yBqvfm6Z1bRSSkwTPbOGb2mIr\nN0bIW2A6MsdZ3qZMhKvyUaSHunhkk5BWJffyAAPeTR6bfpHn/+xZlp6bZm8hA4+D+skOqmqyvDFD\nN2/AfvC2TSJTReQpi+LRFObXE/BFYMLFfERlZW6aYc8qk6fmaAh+GvjYdId5tfIE90lv8X/qv8xt\nZtgjRZEY3QEdpoAdaL4YQKuaDP3qLWyvh3Vxgu9c+zj9A9h9P4zueWGLuKwwzh2mqePHRCVLkuX2\nFJcrZ1nLjuHWBW7bhxk5uEQvKHFw+gpbrQFqWS9v/fnD0BBwQ8BZB6IOnlab1ntB6r4QbUXF/mYR\npnwIkwG08SbObQkTCZ7rYtYEarU4VlVjKzHIt7yf4AH9TYx8h5ff+yjCQYteUqTR9pGJ7zJydpXt\n/Rm8ahPRguXYDDdKR6m+FGLkzBKWJYMDHIC1wATCvMB/2/49BqPrVDD4PYKsViZpbQbQAh0GgptY\nQQVFsMgoO/xa+B+zJE/yLT7OANvcGp1lOTbGO637OCe+hsfb5ZXAo1wRj1EWQnzO8yfobodsJ8kL\nL3+SWijM4jNTVBphuoKGYDiEx/JEozmae1l6D2eR/SaWrNBLSJABqtBsGuhCg6ORy5TtIEvVKTRf\nl5BUJdXIsvrVKSreMNYJL+aWzmZwiBeKz7DnpO6etPWD51N1pH02zRfD2OsK9ID90LnlIZ9LI/TA\nLHpAAR4Ftjbhqzugpyhc89DdPIz6YIt2wkNd8BMJ57AFga/zLG10GvgYYpP8sQHKjRhc5O7snge4\nOwe+B5SAJYif2iN/r8Pb1/chc88LG2CLQfzUsZHporHEFGs7E7x59WGi4QJpeYeIW6LgxlHVDgei\n1wn6S2xURtlYnkLUbJRgF9k1USwTty3itgWsrkJPVFFGSvSCKo7posS72AdVmBTBBx6nTdhtUtWC\ntGQPtzuzDJi7sCyx9u0JMsE19EQT01VwbBFBcWDEIaNvEbfyeJQOG+fHuHXrEHZMpKKFEWI27imB\nshKG4gTeUIMBYwsPAcK4KJToodHCwC1LjC+u0xg18MXrTOmL7JHCsFucrV9kSZ/gdf1Brm+cwCfW\n8ap1zu88RN3rJZ7IcVi5jkQPpycyoq2xZo2xvTNMI+vH6QjocgcxUEfTuqC56IkWiFDciNPuGkgh\nG8PfQA5Y6GKb08YFKp0wS91Jsk6Kai+M2rSxGjrWuo61rcMmNGd9rLvD2K7n7onKURCO9nB1sF7R\ncTvC3ROLfjDkJqFamd25QewFBbrADKC4YLugurSaXjorXryHy2iRDqpk0e04bNcHeaHzceSYie5r\nE1SqJKd3MYQWqdAeG4eHac16qMpBnBh4Rpp0uh48mebfRXT7+j5U7nlh9xDJEedJvkOZCOc5x2VO\nkp9PI/37Hgf+52s8c+o5fsz9Kr8r/gJbDHKAm0yrd7jtPcBOcBTPuRrBwyUMsUWukqLcjeKOycgz\nHdQHOngfUWhfk2nddhFsF+GkCx8T4JBBenidE/df4DpH2OoO0qj7+G7+adyrMr1vSsw+vED83C7X\n9cNsXx6hko/gTjscTVzneOA9Dk3e5HuvPcWr1x7nWvwk4kkT6UCb3pSMW1JoVT18ZfhZ3ovsJ0Ge\nDG8zEfwWi4EpNoRhTly+yn/3O/8PF372BNceOsBLPMkEyzzReplDKwv8Ufq/4g3/R3DLInPqfopS\niLmXj3Jk/AonH70MwB2muew5wdSPzqNudPn+5adwVwXYhkbBQ3MmDHEXdy5JsiAj6xarL8/QQ8YY\naDDwwBq2TyImFjjHeWKeAmvaKL9l/yI36kfpNL245yT4CvC/ATOgDJr4olVqgowZkeFxMEMaFFzc\nFjAJpIEKDApbHLbe4IU//xS1chDC3L10/9FheHYIIgIUwClAs+sl2K5yXH+Pb638KKuLEwg7LsKD\nHUamVngg+CZTmXkGU1s8de5FviB8lu/xOOu9YfRDHcJjOXLzg9gZ6V5Ht6/vQ+eeF3aumKT9bpr1\nmTG8vgYj7jpZM4l3X42JX1xiZGIVn1jHRuIUl4hRoEiMY7xHNFHk6uNHyaS2UJoWV5dP0hBDuLoM\nTwoMHNomLu+xkpuia3lxVYn2835cVUQwHfwHigwOrHNYusERrtPQfOyQ4dUrT7LlGcL3qyXWTwyy\n14vSkHwExkoMpdaZCi4w4Nliz05zuX6KyqkwY5k77LjDmA0VcV3AGG3iHSoQSlbRfB0QBBQsIhQ5\nJVxiVphngxGyqTT/8KnfQh7qoNBGo4uAy5ZngOdHnmHBmMKv1Dg+8TamR6GpGKQe3OKM/jYPti7w\nkvYYF8z7WWjuoxvwICdsjh17h73JFJV8hNZOABcQAz2ksS4N2Y/XaTJz7iaS6KB52ySNPVaqkyzu\nHeB3V38ZXerQ8PhYb03SDRnIyR6jQwu0T3jZfGIURsEaVmhUfNirDrRNUFSQHIKDFdI/eptkMIds\n2Oz1Uui5Cka6SernNqFu05Z0/AN1uraBa0sczlxBGevSahto8TZ+vcqWlCE4UiDmMSimY3wi802m\nPAs4iAwJG2SkXQRcbGRwXYJCleZckOaeDwYsqoTudXT7+j507nlhFyoJeqUwi9YU+7nJlLPI5eop\neqqMPttG9tlkuym+33oc0yNTIcx85yCTxjKy10KbahIRC0gVqNcCdFsesAWIgSQ4SDtgbhhYWQ32\nwFrX0QY7eLw1JkcWGA6v4aWFYDokyHNUv8qWNkZlJAD3W8iyhd9tEKJCJFYmSpEwZcKUKZlR5lv7\nGRtdYf/ETb53LUyxHAdHQp/oMBm+w37mqOFHxEGli0YHlS5tNw4uZCNJXrz/44xElhllhTS72Mg0\nFC/zsWmyJLFMGZ/Zwqs2wOfgzEgMmFtErDJtPPQcmVCvhuaa6N4WimFSbfqphkOQcCEr4PfUCCS3\naW6YdIpelCkLOWUi6xbdnE4776OQT/Be1YOqm2BBfSUMY6CNt/CFqrgHQXzGxpts4EQEmlsGSD0I\numA4+LQG0XCB5MAOoXYNn9NgxFim4NlmMBQm85FNOm0FpxRBXrIwiw4CAnq8jap06LkiWrlLsxkg\nq2Ug6OBxWgh1l4y+TVzNscQUEUqEKZMjgYBDWKhgCiqVkkor50Oc6NDOG/c6un19Hzr3vLBrjTDy\nkModbYZJFtnXu42247C0OUq5lkR+2GZJmebK0mm00QaOINLYDGOOq3hCDdbao3i1FobRxpnowasO\n3JDAA+sbE2z6RrFbyt1V9NaBYYhMFQjW1nk4WMZHgyVngu/XHme/MM//Ev1XzDxwi41OhqXqJM8G\nv8EZ4x1sJMJUKBPmG3yKh3iNWebR6HKMKzzsvMK7zfso9uIImosmdjnFJf4eX+BP+XvU8aNiYaLx\njnuGzzs/i+3IiKpDcmALSbSo48eghYlKhh2e4dt8h4/yevUhqm/EeXzqO3zkxPdZYIa64mVemWJM\nWCFp7OF4RFxBYJMhrrpHqe7EaLX9ELTBJ5HRd9inXGb9+TXee+MUN+8/hvCEBUMOwnWZnq2gR1tM\nPH6bqD+PW5K4vHo/piRixKrsCGnawx7kQIvh0BLmrsHipX1wUoGEAwmLVGCHuJajjYeF3EHS3T1+\nefxXWeQ6p2mwwjhVPUinZFD5n+JYBQ1m4a3eQ2C6uLcFhLALcQFSLuGjOey8gvO2wtXIcZYjY2wx\nRJIsXXSWuDuDaJo7XOUodkTGtQR6yHCjf//ovh8+9/6kY8lBUkxKz8V5PfAYq6Mz7MwP0StItEUP\n85X99JoStTeDeAIQHC4zM3yThHcPV4SgVqMsh+m6GrOReQZP7aCOWbwrnyC3m6a17YcGyPu6yA+b\nmKqONS5iXlWpiYG7P6sFGclrs8QEv+X8IjGlwFPiCyxIM9iqzBITpMjyLhO08fARXmNnbpALuQdJ\n7d8h5skRpch/v+83eNV+hIvaaZKePRa6M/x29xdRDYu4nMNHgyxJysIUguiSEHLYlsx2a4DSXgyX\nbQ5O3OJS9izfbT+NO9BjT0th+FrEj92mE1JZdid4yHmNieYqoXaNSLjEeetBvlt5GqcmUOsFKChx\nXMMlHtnFq9VpGAEkuUv9up92WMdVBezrCpNnlkimdjAlnbIbwWfU+Ezwi+yoGd7iHPaWhBy2UF2T\najmKSpdUbIWoWqDcjcO2AAJgiVCW6fgNCp0ElUKMih1ENkwuC6fYooOHSSZZYmdviNu7YewDCrFk\nlviZLNY+hUbPR3PMi1dv4PU08RpNZJ+JLcnEP5JDjXWoVCJsrY3x0uBT+Ds18pfT9BSJts9DPpzA\nlFRSo1s8FHmF28kD/Qtn+n7o3PPCFrYc2HBpLgRYysywmRyhZfnABKcnsbMziGj1UN0OQaFC0tgj\nHdghTg4bmYhaoliP0bENxoLLjM0so42a3M5PE3A9aLZFnQBCxkGeuTvTQNQdGm0/u3YaTe4SF3JE\nPXmWelP8WffH+bT6HxiT10CGhc4sW9YQk/oiN/OHcU2YSd3mSj3NzeohxvRFPGobBZOTQ2+z4ya4\n7u5HFbosFqd5LfcIHx1+kbgvRx0/m7ZKr7EPtyOhqja9kkJlLoohdhATLobb5HLnDNebR9GdOorT\nxSu38Q3WqSt316ZOuDkG7W1Us0fN8VHsxXincwZvo4XYc7BVCdnTxaO2CPor2F2ZTk8jRwLP/hYD\nhS32VtIfokIWAAAgAElEQVSMGascilyhGgmyUJvF6YqkxD12agNk8ynwuSg+E8F1sdoKg9oWpz0X\nqBCkIsbupkMFHAG2JGpqiAYBivNJ5MkOVkxkRRijwAprjDLKGkrXRpIdhh7fIDBQxjPcpJvXsAwJ\nphxOG+8wpG7ilRpYKOT1OKuRUSxHopP3oNVMVs0xzKZGZSWO4WuhxExsSQGfi6Z3yPR2ETJiv7D7\nfujc88J2bil0v+LDfVIkcmiHTHqTxeA+ajdDcFWAeQllxsT/35SYMW7jk+uUiOAi4KVJiArZpUHK\njQDyKZOqHsQuqax/a4rB2XXiDy9wdeU0jRt+lLke45+5SV0MsLYXZ6s1zGzgNg9ynmUmWDXHqVf9\nfC/0BBlphwQ57uT3U7DjrAyPUXkrhpAT+JPP/DShI2VmD96k6InQQaeLxiVOccM+TMUOYWsyrXwA\n54ZOPpwAn4vtyiy1N2msHaW3oZKND+HMiTi/pTL+z24x/sgd6rIfebhDxNlDUUwapo/dRpqd/Cij\nkWUGkltclE5TCkaJBQpsSEOU1BART5aZwdvobpeyE2b5+iyFfArzhEz1cgzJ7mE4KT722HscOXiF\nL93+aRL7coyzwg4Zbt05wp3dffzhR36OvTsDZG8P4P9MCTlj0hVVxECXQ/IVPsef8AU+Sztm3L0d\nrcTduc93oFqJQQXc10R8P98gfiBPTMxjc/fQ0zz7qA0ajCUXeKL3XW7dOsJrX3kM99vQm5JIfjLL\nPxj/AqcTF7ADLi4C3xWf4D35H1OxQgQCNR489TJ7SpJtzzDVczEGU2vEolnKUpi9y4Ns3xrjj0Z/\ngc8N/vG9jm5f34fOvT8kMiTgDouQgEYnwO6tIbrLHrghwDxwSsAuK7Qu+ikciSMkHcKUWbBnqPf8\nbPcGEGI2Hr1JfjVNORzF6Ym0Yx5qkQBSoAsDFmlpg0xrG2+kzqi0SiZ0Ho8WvnvJszPKdm6EcjuO\nI8sIjouJyi5ppgPznHYuEBTL3Jo9xGpigrXaJMaVFsqeReOcj3cHTtENqJSI4kgi48IKw8IGhXiC\n25P72HprhJ32ED1dpF6uEPUX2D85x83WUdppD9P/9RyZQ1sMq+uc650nKFWRdh1uf+0AgRM1YtNl\nVjZmCQpVBpLb7App9qQUAi49JJqCwYC4Ra0XIFcxqG2Haa37MLsKTjEGHgExYWO9q3CzdQSP0GHm\n0C22nCGe3/0kQtwi70tQ1wLMzR2h46jYYwIty4+QdXEkActUcAIyjkck20lSuO6HL5ThqBdpXEQ5\n3cYydXptBYBOwcvu+jCXFZXGboH8wqPU415ahoGhN6kJfiaG7+A91uD13UcphOI0FB8v+x5mw0jh\nkZrcz1sMCxvcxwX25CRemhyUbpJ79Wmoi5w++RYPh79PWC9ynnM4oxJy0MIItpi3993z6Pb1fdjc\n+8IeBmHYQQ126Voajc0M7hsibLkIkoMv1kBQXcw1FXNSo4eERpdFZ4pdO41pq/i1BnLLoriaxO06\niGEbYcqlFgrQsRQI2gTVIgkzi6j3yPS20aVNWkKbHdJcdM+wXh+jXgmCCyFvDa/RIE+c6cAdDnON\nGeEOzEKtE8DMeiksx2gue/Hvr9MOeMkKGXaFNKraZb86R5w8ggdWvONkX0nT2TVgFBDeJC1u89Hp\nb6Os21RCYSafmEcWbMJOmWn3Dk28lOoxmu+FCA8WkQ90KTgpVMsEG3qSyJo1xpo5TtCpElLKDHk2\nmXf3kW8n6Rb9mJaC1jaJrFewHhJQxjsIVxrstdIYdpuTQ2+TzWbYaIzQiihYUYWIVcTcVvCna2Qy\nm0i7AtVqmJISRXcsqlaEa81jlL0RxGKXwO0Gbe8gblhDnjURHAG76WLFVNoFL+1rXrLSAGL+Fjvl\no8i+DrrWRulZLNnTnIxf4v4zb7Ag7sO1wYg3eSn4KDf1GabERYJUCVDjAc5TI4SIQ5gSvRUVp6Vw\n4InrnNXfwk+dJSZpDRoYAw0Ex2V+ffaeR7ev78Pm3he2CHLOJunbxgzLlMQI9u8ZOAkB+ZfbHBi4\ngmzYbNrDHPNfRsVkjv14lDYj8jp110/xUpL6YhgnJuEaEqIHPCM17IZKcydEYLBIbi5N7UqMJz79\nAhvVUd64+Qn0/FmUtMm8aFHPeFCLHbovegn8eJ1opISFynu947Tx8KB8HnAJaiV+Kv27vPK5R7jW\nPcLZ0AU+ln+J5FyBfyL9Gon0DtMDd3iDB1lYOkDuhUHs8/Ldq/4mgTclQlcbHBm6xmh6gyIR8kLs\n7tKpooeXhcfoChr7J27y7L/+GjcCB7noO83guRU2rAyl+qP8tP/f0SiHeWVzGqntcDB1lcmpC1Sl\nIJ5kBzsoszEyxoC7xcfDz3HZewJTUtG5Qzz9OpJrMy3d4UcSX6PWC/BvhX/KaHCdMf8qu6NpxuVl\nDivXSfv3eMN9kOeETxKkxt75JL/9nX/E7M/c4IGnLlM6GuL2WxGKyz5acyEin87BqEtxKIW7J8Iy\nUAVPtEXy8DpBpYosWXQtnZvZY7g+iQPha8RP7TDlzpGS9njFeZiAVeNh7VXe4Qx+ajzonmeodZGu\noDHnm0I85+DaArYikyNBAx8WCgNsE+xVudC6j3rIe8+j29f3YXPPC9vrq5M+s0QvLGA3PTjbKq4r\nggtOSWGvPIDkdWhEA0TVEhG1SJEou1YG25UYUjcYGNpF8AgYoRbzuwdZWxzDUjx3lzetibT+1I+9\noNJsC1zLH0cOWGjpZfCBJnRJC7ukPHs0Bv1U7otyOvo2GbZZZIqm6MVDi9f5CCWiIMB19RCb+jCu\nJJHS94gFc/ipERP3GPatMcYqlzlJKFbEc6LDpjDIrHqHT4w+zxuba9w/PoSFwrXcMZacSZppHVuW\nGBS2OSxcx0KhqXtZHhrDRmKYdVw/pMxdfHYTWbTBcDASdTxWm8nAImd5m5IQoaUYIGoIdRdNMolP\nZDnDO5ioLNPghHqJHhLrjN4tUNlmxFkDAWqin5ieZ4hNUuzRk0UcBOSWRel8lE7RwH5Aoh710VB9\n7BkDtB0DVxdwhyXaphdBcGH8L9bdrgI74FUbxO08uWtpQgMlBjLbnPBfpaF5ueEeZs8eYJ+1yI/w\nHDGjgCyZmH8xa90hxKYwhKF2qBLkMifwZSpElvNc/93j5MNp5IzN+sgIktDDkUAO9xj0bnL7Xoe3\nr+9D5p4XtsfbJD6WI69HsXdV7F0dQqAbHbx7DXL1NIIXjJEmeqSL19Mk0G6w4Sg4ssCAuoM2buId\na5JWtrErMvmdBM09Hw5t2GjT/JofejLMwpX6SWaHbjIytkojWETrmqTaOSSvTXPQwDdYJ9PeYbC9\njesRiIpF6vh4i/sptSPU7QDf1p6hnEsQqDfozug0wh60cIsYu6TZIk4ew2kRT2fxpZtoJ5s8WfgO\n/yL/r/k3o0NMHzjKmjvKS6WnuFY9ilprokW6ELxM2ChjCQpVgrzNWYbZYMJdJtyr4ncaBKjRRkP1\ntxnyrxKgxqHuVU5XLnLDd4i67KeLRr6eQZe76HQ5zHV6SOzQ5nD1Bp2eh4uhM7RFD16nRbBVo6DG\nKKsRpuyLDDo76G6XJXWSghjD7ijsXBlGH2ox8OwaNfxUKlF2K8M4bQmCwGlolgN372AT4e7sERtI\nOxgbTWKtIqWlFH6twfTwAh+NfIdXeIS3rLMUGmk6LYOkmOc+79vk5Bh54qiY2MgsMoWrCezZKd5o\nPESgW8O72+DGS8eYHzyAe1BA9DhYPRVZtUgFN4kKxXsd3b6+D517vx6262Hxj/Yx9rk7uAGFylgc\nZmFkeIXTT7/FXG8fstRjSruD6LG5VT7E9+c+ysjUMkOpNbxCg6uFU9TMECcG3iZ2OMupgQu8s/MA\nzT/fg/N5OHoI9vvuLjgUFIg5RZJs0WCL5Z1pXrn+JMnTW/jSNSS3x+eXfp6wW+LYwYtMiMtMskiA\nGl9c/Psslg5gTULvlg4FkTeHH2BUXyVEhQoh6vhpOgarrVHqUoADnjl+1v+H3J+9iLMuke/GqXKK\nTWGQ6riB8maX9v8RpPOwy+JDs3z92LMMKZsoWMQokCDHRG+FJ2uv4cu2sFoSK7PDtL0eTDQUTAY3\nd0nNlTlx9grjiRUCYo0vH/kMimCRJItED4keGXaYeL1Oo+Zn9EfWqBpBtupDXL52ltHhFc4NvsZP\nlL7OQH0b01FoDPnQPB1Mr4LzlIDu7RCmTJkwgs/GO1ymbQSwGtrdZWu7QI27e9Y2EHIQDpk4ZYhH\nszz69MuEPBW8NJDoIeLgF2vUjCAvSI9xQ5ghLe8wwjqDbN69uQUSbTzskGG5PMWt28cQl1x8UpXp\nf3OThs+Haah4vS12S4OU6gl290YoeWP3Orp9fR8697ywA4EataAXQ24jBPJUx4M0bB/+WJl0fJss\ncTS6jLNMliSba8MU/ziOfl8bz6k2wYNVbI9Ite7n6qsn8U1WMWMqTkWEqh+j3GDmzBWGj+cwYi0u\nKSepOQGa5SnEbhzLK+MOuEx6FkmQvXvCL9QAVyAnJMkTw0TlOodphAx02nTMEFOJO6QjO+xpMRaY\nwaBJlCI9JOY4QLEXIy7kOcR1UvIeRBzyUyGMRotp5hh3lykbEfLRJK1MkKf1F3igep7huRXiYh7X\nC56hNillj7STZaC7g6T1aOo6MTnPANs08BInT9q/Q2kwiKMJBKkwJqzxmP97uAjE/mJh6P9v6iHe\nOkG3xrC4yRoiDcXPVGKB+7W3uM+6QF3zUiZIsFdl2lpGQCDhlvjGyLOoSodp7uClQVZKct13lNzR\nFGrHYiS1zqJ3moI/ihBxcTsyrgEEXFxZpGYHuV47xv3ieYLNKt997mluz0yhnjJhRyAnpuhEdO7n\nTY7zLmEqXOQ0XTSCVDFRqat+umEFq6VhCgpK0KTb0rC7IpYmE/XniekFCk6MJp57Hd2+vzENCAAJ\nwMvdn2MAJndvh5Tl7t02uh/I1v0g+ysLWxCEIeDfcffbd4Hfd133NwVBiABf5u5Np9aAn3Bdt/Kf\nvj8V24MzFcL+El6vQt3w0oslcTrQ2vPiKDKC2MV1Rfa8afL5OPobbXasASxDIbSviOy1ENs95r95\nEM/H6iipDnZIRBsIEJ3tcOj4JU5NXyQqFMn3wlwtnKBYOU6sO4IvUSOd2OAQ14g6JdZ6YwwObFEX\nfawyzirj9JB4nmdgABKRPdRij8OzV5kMLvA2Z9lmgB4iYco0LR8r3Ul6yAyKWxx0b2JbCtlwnG5C\nwbhT4Kx7gaSTY0mcYmdokMCnO/yM9nk+3foK7qvQCXjIjcWw0yIxJ0+wXaPoRLFiIlZAQMEkZWXB\nFpjQlhCTDneS41QJoNPGdiXOtc6jWDa4YHkVttQBdsiwNymRtPIk5BwdR0fXu0zuW+R0/j1S+Tyv\npM+RCu1wuHeDRKPMo+3XOSFfpeCLUJEDjLLGUa6yIQyTk5J0p1Qy7i6f9H6Dr7Z+FNvahy52/l/2\n3jtKsuu+7/y8VDmHrurqrs5peqZnehJmMBgEIpIEg0gFyrYkipJs7lnTWunQkne9x2e19rHX0tHq\nyGtZtLTiUaAoUhRFiqAoEBkYAINJmNzT0zOdQ3V35RxevbB/VBe6MIZWlKGxCFDfc96p1/fde+t1\n9e3v+9X3Fy7Nup161U4lZ6NZV1it9nNj5QDdbNLfWObpP32S4hNufPsy2LdULA6dWGCDh82X2M9l\nyrh5zTxJDTtuSmxUeijhxDZUwjgrUc/YSaT70FYU9KYAgsbByJt0+xLoNRNR91J7Fwv/3a7rH1wI\nIFvAakfxqDisVdyUECsGQtXErEHD8NDEC4QRCCPgxARaeloaSCFTwyIUER2AQ0B3ipRwU2s4UIsW\naNRAU2Fn5D+ghe/Fwm4Cv2ia5mVBEFzAm4IgPAd8BnjONM1fEwThXwH/687xNvR7lpge+0sO2C8x\nywQ3mMRAYvHNEZLfilMZdCI5dK6qR6g/ImGbrrL/SxdYlIeo+m3MyyPkVrvIzQbR12XkiobDUoEo\n9P70OqEnMpzefIA3cg+g2Jtsprspu53gNJAUDT85YiQ4xz3kqiE2U324unI4nSWcVNgmgomAhE4y\nFyPYyPGzoS+wao1zkwl+ij/iIod4lftxUSa3EaK47mfv5GW6rEmW9QEeWn2dqsXO2b4jLHCba4Ib\nXZxlQFjmp7x/yJHpN9nbnEM/C9UvwcV/uo+l6VFkq0p8ZoPqtpvfPvhZFEeDPdxgH9eJb20wvrGI\nMWlwzbOXsxxjkCU0ZF7VH+DDbzzL4PIG6LDwSD+rI31cJ8J3u/azx5ylJtm4t3wONIFvez7IF0//\nHKm5CMKn6wxElpgXR/A4ywyyyCCL/BPpS1xjigscwUmZTbpJa2Fy3+liX/M2P/roUxQ9PgY9S0wK\nN8g5A8yl9vD8H3yQrBCibgwj76shOVVkmgz9+i2umtOk0t0c3/s6exwz9NtXSMkhnuUJ8vg4p9+D\nIYhYUDn74n1sCD24PlSmueTEXqjTF19gs9pHZisM6zK3zXFWhX6qFzyMTMyRfHdr/12t6x9cWCE0\nirj3KL0/fpsTe1/nE7yA/7kSlldUGmfhek1mxbAAThQUZCQ0oFVsuQlUiKEyYtFwngD9IYX8B1x8\nk09weuYgS18Zx7hxDrbm+Qcr/O34GwnbNM0tYGvnvCwIwizQA3wMeHCn2x8CL/MOC7upKux3XyZA\nBi9FAs0chbkAxbN+CudkfCM5zF6TdDNAU5eJWWoMH7tNpWGnajroE1epJPw01uxggSYKjaYVQTao\n2R2kDJnE+ThVhwNh0ET2NBCDGlZnnai8iXVLZWuxF/tEGewmVnsNWdLe0n23iKIhI6PRb1kmLKRo\n2iXWz8YpJrwIj5qIXgObUeeEepZrwgFed/ahWJoYokjWDCA7VAJylS6SVHEwzwiCAMNLS3QbW4z1\nzmJf0BBqIE9DedhNVbIxdXURd7VCPWil27GBu1SmP79BWMzhb+RxOGpoyxKERJKxLgp4gFZ9D8Em\nkA6EeMNyD6pDJkMQKw3sNpMmMqv0UZVcBMwCB9TrzNoPcCl4kLi8QIRtqoKDnOwnmM5gzWrc7o2z\n4eilgos8fqw02M8VcnRRFZ2krQFMRcCuVLFTxUGVstWNZDGplW1QdBHsTZG0hLkpTGA/UMFTzFOv\nNBkILuC15EiZIea1YfJaa7eckuCmS0jioUgsnCAopIlLy7wUf5x80E/YvY3ZJ6K4GqiKharqwFpX\neTT0HIfd57n2Lhb+u13XPxiQweGA6X4mBxYJJVYZXTApVtZIZdeJzm4wUZ0hyCLOxRpyVsOqQ5RW\nCRqJ1uZDEq2nI4DYmhU/4DHAmQFjQUZ02RjnHM3lKpHcDWLqHL6+LbQnRJ69biMhTMHlFahWYYf+\nfxDxt9KwBUEYAA4CZ4GIaZrbO5e2gcg7jSlWfK1tnwgjYBJXV1m/NoR+04Kk6gT2JrE9VKWsOEmv\nxJDK4Avmidq2EDA5xEXSiRirm4MQA8MholVkdENiY6mP5kUb2usKhECwG1gmasi9KlysE5fWKawH\nuP7iXu4NvULvyDpdwSSSpGMgoCGzRRTdlAiZaQ5IV3AKFc5zlKWXhhHOCtw6Mo7qtbDXvMFn6l/i\nGfcmt/39yFITTVNoSFZqYQt9bHHcOMu3zAOs04tqWvjE/HcY1+bQ4gLqugUREeN/ERF6Jby5Egdf\nuk7tmIJ6ED7FV3BtNHAt1rEoKmq/SHnYiuUlEKugxhTOcAwnFY6L56iN21mZ6ON3Qj/DHmbpMlOM\nGTc5YFZBMHmN+3jF8SC9WoJfK//v3JzYz7mxY4TdLX28vQGyK1nFNqfxl/6PsuroJUaCGnbCRpJ7\njTNcHzpMQorybd8HuS0OUcGJgEkfq9j8NWwna1RPmYhZEVt3ndvaKDndT02043Xm8HmyuCmyTi+X\nOchqM07ZcCGJBsPKAn2sMSguEb13CzclBllk+egol6s+5KpOMJDCGq5SUVyk5rvpqW/yMw/8LhPy\nTX7lv3/dv+t1/f6FjChLWD0qVtVEdlpQH57g5MPLjJ+f5ZPfucL6qSaXsiBdahHwTVq7t0Hr5yYt\nIUOmRdzGzqu5cy4CGWCjCcpFEC5q6JQJ8F2O8132A/eJMHDAQu0XPSx/+QnKwjjW+QRN0aRuEVCL\nFgxN5weNvAXT/N40op2vja8A/840zb8QBCFnmqa/43rWNM3AHWPM4UNe/AMOknTh3BMnMBZhZmuK\n/FIAlkQsPQ08A3kCwym2K1E0U8ZryxMW0zjECgYiS98ZJbnQDXtgz/g1As4MVy4dxNLVwG6tkfxm\nlGbRCh4TIaYjjJqIpdcYeSiIXauhlqzUfVaqmpNKxoPiryM7VSxikyYyvVqCD9aexXu5QKni4tID\nB0iUujGqEmM9c7gsFaxmA7+eQzBMdFXCma6TcoTYDEQ4uvkmYSGNGrDwe2/uwXL/IXzk6CkliJpb\nBF0pcpUgec1P2eYiowRw5qrcf+Y06qhMacKBQpPtRoSi6mWEeRSLSkVxslmKkZBjbDu7qOIkSJoR\nFihq3lataDmHiI5Tq7FyapM993upK1ZULLzOCRqanZ+ufolZaYKbyhiD8iJ2sYaEhoMa9bqVXCPI\nujOGKisoaDSwUah5yebCZEshTBm8XWmctgoWpYmByCBL2LUaK5V+br+YpTL5GJZIDaWoIZVMDJuI\nPVDB5S/go4CMhomIYBhUcZA3/FQqHrqlBIdd54ixiUKDMi6+u/xRbm+MYU9XMd0iRkDEiIoIK1dx\nLF0kLq9Sx87cN+cwTVN4V/8A/53rurVZpmenJbxz/I/CGhC/S3NHcUZcjH58lYn5BaJnEix5XNid\nRXLVLSaKJs1Ky33Y+cF3ErK2cy7RImdh59WgReziHWPa0NgldCdgcQk0e0TO59x0ixGGSmU2j/cw\nOzTC7W/FqSZL7HxJuou4m591J1I7Rxs333Ftf08WtiAICvDnwJdM0/yLneZtQRCipmluCYLQDe8s\nKT7y+T1E/9GDfLf5IUTRICImSFX3oV+IU3omgJoCzZbFemyZIX+DcsPFxkqcoHUB0V6k5PTiFey4\nUyK2exrE4y7Euo7AIwwfnKE/tsCLSx8iuxEEH5h7DMwhARYEmvcfwx1K43JVyIl+6qUg+lYQuauK\n373FuDRHDTvTZZ1/tbaBw1UhpWuc/USJdMoGKZHeaANnoI7mFllhmqCeZSS7QPzbSTZ6JW4+EOTY\n6wai1cfCgUFi1l7GfqSPI9UMftFKWLTTI0jMWwPclMeZZYJBCoylbvPIkEhpzMH6eDfbROjCjYDB\nOCV8m0Wa21ZOjUxhcw0RxIuXAiPkmUTjDGNYUDnJq61Ii7zOpbUS+5+MUfC6GSyuMCWUyBkW/kkZ\nZn06sz6NHkSyxKlqTh7Mv0bS6uaye4gDKEjoKEAGL/PlUa5mDmFr+MgJPratfrptm6BVqeft6N3X\n8PrX2A9kjTTGvT9Eo2JBXVUwcxJ0gziaxT+4QY/jJr3SGl0kCZBlnginjAcQCl1YxDSyN87D/Cke\nirzBcZwzH0d/+R7KXwXGaMWBmzDw6dtMHrrCMc4xzwhzwme/53+Hv+t1Dcdp7RD894W/y/f244mK\njH4ggWfGgj9vMB43mM4WGTA2uJWEmgHngUlaRKuwS7adhNx2E7bb2mifGzuvEi3yUTva6jvjHDtt\netlEm9Mpk+cxMc8+GywE3LwZ17lltZDdH6I46ebWyz0Utwwg93f4mXTi7+Pv/H++Y+v3EiUiAF8E\nbpim+Zsdl54CPg386s7rX7zDcK6o0yzVT7BYH8JhqaI4m4RcaTRslBIBuGiS3/ZT6vfy0RNfRyjC\nyrNjzNgPYgREiMGBYxcYj80QELO8UTrBlcpBhP0y0Z5NRq23OD32UGsPwT4T6XgTMy1ivCizMDvO\n2nAfjsECQSWN01NC9GigQw8bPMyL5PERU7cxsiLV+6xYohXutZ7G+YyK40IT7oHN6RBz7mFWGGBF\nGiBrBHFcP013LUH4aAJXpclVZYqn3Y+iSbeZqs/wyeRTCLIJsoAhinQFMiTlLCYCe/XrHPVdQHqs\ngYGTsuriNeUkU8JV7uUcGYJIt02iZ7aI+rYpO5w4qDEsztNrrOPRiwxKSzRFhRIeJHSEiomRFNGK\nMpJi0LWc4yflPwUZTEMgZt2g6YSMHGReGKXQ9PPI+mv0ereouW3ohoRDqOERCgiYrLj66HOtcJtR\nZit7KSV9ZDIRzG2R5qxC9UE7m74Ik/oNFG8dTzhH+qUY5rYEMogug0reQy6jEpZfY9J2o7UZA0ma\nyKjio3T716hj4znzMe4TTtNlppjRp8hbfK3/5OsmOAUEw0S+otHVtU300DYFvDio/q2W/9/1un5f\nQBYQrBIWNUJ8GD7xf8wy+IVT2P/TDNv/pmW7JgE7rUC9Nsm2ibpNtPLOefuw0iJ0aFnNTVp/Tgtg\n22kXdw6tYz6JXd27bW1LO+MMAy5XQf+zm4z+2U2OA9UfmWTxsyf5k5+Z5nbGRLWUMOs66O/fyJLv\nxcK+D/gJ4KogCJd22v434D8CXxME4WfZCX96p8G3nt2D0jhC5SE7E703uZ9Xuc4+kpVuyJhYfq6G\nMKVjxgQc3goBb4bjP/Yqc41xko0oZl1h+Zlh0rkuLHGVrCuIHDBxDGXIBd3c0sapH7fDElibDfq9\nt6lqbtZlYA00LFRtXqwRFYejjM2sk70Z4SZTNCcVHhJexuqq8RcTH6Zo9yBYdPqEFfYdnmPAsY5w\nDW4EJ3ll6D4sqKQIM+8bYf0zcU5cP8OJL5xBOmrCIAiYrew9h4X5WD9uoUhDsLIu9JKyhMjhpY9V\neha38ecqyD064RsFjOwKm09cQ/ZpzDFBAQ/6pIInXOKweoW9K3OUrC5eCZ7k5eTDrM0MEj24jhDR\nyRLgh/gmU4EZ1ka7ORKpEsltIV3TwQvNuEx+wIlztsrYmWUSH6hQ8rlJWyrogwbLSh/Pa49xbfsg\n3emEAooAACAASURBVJYE94dfYh/XqWHnBpMImAxYlwhHUoT1NGlnmBd5nLAvjT3f4Nz1k9RyKWxV\nFWHWBDdYJhqEjyXoDa8RsOR5s3QPFc2F4m7ipIqdOoMssZ+rrKp9fKv6cX7f+RmsRY2F+THSza5W\nsN2nBChB0Jfi8L89y8MHnifOCpc5SA7/Oy23vw3e1bp+P0CZDuD8pb388O9/h6PnX6X+uTTVpQw6\nLemiTZ4ybydTds6FjqNNzCItAm5r2CJvt8bNnb5t56OFt1vonbKJwq6z0mTXStdpiQf6t9fwX3uW\nz9+8xNlH7+drP/Uhyv/3HOqFDLuPk/cXvpcokdd4+7ebTjz6N43PrYaw1gMMS7ME5Qwl3Dip0BXZ\npnLCg/iYijTYRNY1NJuILov0TSyxPtsDG8AWGDWJut1GyeqmXnVgNkVMl0hC6iXnCFIfULDYajhq\nZRy+CpqgIAR1TNXEyEloVQuyruGkjJ06yDIN08oqcSR0/JYs+aCXeYbIEqCBlUBPEY9UQi7qyIJG\nbGmb6Oo2m905FsYGyE95KM54UJ4xwAreYIGx2C3y6+uEFsMsj8UZziwhYtAIyFQFOxVc1LEhVARs\nmSbYQGo0cIoVbNRJEWKLKCoWmiELhk9g7/YtwlqKvOilgoMtMUpSCRMUt7DSREfiauMARcHHVuAs\nV5xxgpUstvAVPNUKuYKPlx33MmG/zZg5j1AyMDWZNGlyXi9bShc1zYYmSqTFILPsIUSaLEHShOhj\nlbi8hkNubW3WlGX8QoZezyo2rc4teS+yIKHYVIQhHWekSGB/hnjfEnud1/HVC1xbn2bN3UfW7SdF\nCBmNMW5hpYGNOr3iBiXcJHI+Vi8MYvYJSD0ayscaNE9ZEBQD+aSK5hOpYaeBlUzj3WnG73Zdv3fh\nAXo4secs3Xs2KNRUpppnGMicZ+n5t8sabStY5+16c5ukxY6jbQ3b7uh35972bQfknfO0HwA6u07L\ndnvnw6KtkZcBYb6EY75EnGVKTYXD9SiesXkSRQ9v3LoHWKeVlvv+wd2v1qeA65ESj8WeI2kN8h0+\nzAlOM3b4Js7DJWqCHSsNfOQp4qGOjQhJ5CvAazLClknkn20QeCxJUXCz/Uac3MUwpcUgpSkfTOmI\nTg3PdB6vM08JJxWbDWFABbuBaUpIkkFISBMhgVVQ6R1fp4adbSI4qBIjwTHzDAvCMLNMkCbEqqUH\npa+Os6/C3ls3ePDUafg65D/oYmMszFX2EyhkMGdBKEKPtsFjkymal2pM2Pt5afQ+RhZX6TLSCEd0\nDEkiSRfXmOKA4wamTYAc6ONQ67aScERZp5cGNiyoJOliSRokEM0SFpKkRQ86AkM9tznac4YwadyU\nsNDgt0q/wEvmo+wzFvhjfgJrV4N//eR/YOTlFTZSPfyu/ll+dP/XGB+ao2srQ3QjQ17w8OLkSYqK\nh0n5BtPRyywxyAx7CZGmgBcToZU6zwIBsjzDE6zZe4jFlxnmNpKpc/WefeiLdazddYSfUQk7Ewy7\nFugWNhlnDp9WwLFRxegSqcdtbNCDkyp7mOU5HqNicfIB5UUMRBYyYyyfH4MgyPtUfP1JiltBikkP\nF4WDZPATMxM4qJIsRu/60n3fQRAQ6EEwn+SfP/kN7nV+jWf+Z9CrsMQuMXYKCm2C1DteOy3dtmQB\nLTJROvrB27XsNgHDrkX+TpJIOwzQ3JnPQktmse+0qTvX2xLNDaD5/Gk+/sZpPvwv4HTgH3H21kcx\nhacwKcL3GFjxXsBdJ2zHwwWEHpU3LQc5yjl+Wfs1vrHxKW5fHqd+xYb9x0uMjN1iLzOtncrx8yZH\nGDtxg5HROep1G+vlOLnTYaYOX8I7WmLZOkzmWgStJMMtATMoUcn6aQpOBM1Ek2TMogVzTqS/f4np\n2AV8tgzdJOhnlbMcw4LKMc7SwwbkBJy3mvyw59scCl4nGfRzlnt4znyMh6SXGelepHJkk2gqTX7Y\nR0rvYn9+Fl8mTakODjfIDh27plI7qLDxwS4WhSHSw110mUn6xOXWBrV46SHBWneM7/oeRsBkwx6j\nbrFxtHGRk7yBLohIpoFYA6WmEde2SbqC3AhOIgBx1hlmnjkmqOBkD7OMum9iqzQZSF8nX5phyd3P\nBY6QnuzC0ajyWft/pSkqPOt6lOneq1iaKilCbNh7kNAYqC7TfzaB6ZU5c+g4t3YcmiPMs4cblA03\nv9P8LAkjRlW047DWWGQQQQBDFGkKCpKs84DvFbZu9XB96xDz8Rq1qItJ9zWmp86zrXTxtPohwnKK\nIXGJQRYJkCG3GOT5Nz6MGRaoOWzYf66AanMQI8GH+Bav7nuEW+VxDKvIanKI9VvDyKc0ivtdd3vp\nvr8gy3DyGMfJ8M/PfQb30+e4CoiNFiHK7JJsJ721CVfeORzsRn5o7FrRbTLV2NW72yTf7BjDTntb\nsLCya723nZUWdh8cnXJMY2esvtOn/X5tmUZswNVvgcc4ze8pn+a/3vdJzon3wqlzoL0/wv/uOmHb\n+uroikRaCGGnxgGucNp4kLTeRbMpEzPWiLGBgYhCk65mmv2VGaRok0afhS2irL4yQD7lp96w0xXY\nRlJ0ymU3+pobVgVkf5OgmMGn50kbIcrbHlgR8IQKuGM5ZGuDctYD8hbDgVbNkiIeAmSxoGIgohsy\nE+XbhJQsL/hPsinGWGKQAZYpu12s9vdy8sRZSmEn9aad7uU5nFqe+pRA44SMPipTE22sxYLoo5OU\ncVENONAR8NFyNroo4yeL3ValarGTtgTYEqI4SnWGZpfxBvNUe2xUTBfuZg1PrUJSDFHAi2iYpNQu\nuoQUfdY1NuhFwMRPjvuk09gklYxZZ8BcRkOkgpNq2IaXHBPCTV5IP8Yr1T2Uo06GPIvIaGiI+PMl\nhjZWiecSrNt7CZClju2t+42xyZZpkjZDZI2Wbhwwc5SE1i7xk8INNtmmy0xh0TTsWgOLrlIwfKya\ncTxylnB0m4zuZ0WbwEKTRK2HQilAvuhj+2qMhXNj+I5lkWJNMExwGviULIe5SHIwRq1pxa+k2DJ7\nSGox1JIFUW3+/y+8f8BbsAzYcUx7iTgzHNo8z2Hhz5mdM0lqbydj2CXTNnm2LeJ2Hxu7EkibgNty\nhUmrRli7r8SuhQ5v17zbc7eJ3GT3gSF3tLUll7bV3da52w8EgxZ5K4CpQWYWguIKh+RVDkl9FGOH\nSX40QOVikcZK/d1+lH/vuOuELTd0yik33u5b1CQ7q3I/T/Z/i/vjL5F5MsCkMssGPTzFx7BT40Tl\nLP9m6Vd5uf8ErweOk8NPw28jJwZ4RX2Ax7RnOei4yPzeYWpJO8KGiL2ryKHuMxwSL7U2Fvj6JKmL\nBvH/soi6V+KvCk+iX7Nz0nmKe4+f5hAXSRDjLMewU6PHt0HmHjehVQO1biFpRrBIKmFSlHBxk3Ea\nTitdx5I4hQpKUUW4YmJ1gvw/CWQecJDv8ZCWQpwXx/HzAEMsMsAyYVLYqDPMAk1king4WJnB3azw\ncuAEe6UZetMJPF+rUD/hYHO4izlznEFtjXF9gbOBQ3gseQ7ql/lC9udJKml+OPxnTHIDEYMI2+xt\n3KIg+viN8AD3u9OcoJV0NGrexkWZGWEvr954iFMrD7H6ZJwfC3yVB3iVCNv0L2wwdnEJ4ZhBpH+b\nI1wgTYg8PvL4sFJnRJrnMek5Xmp+gBx+osIWVRyESfEhnuZ11nCrXfzJ1qcZ6b3F/ftf4Ka4B4RW\nJmk3WwiSgVsqsY/rJLJ9fPXGj2LOCBjLIkLOZHh4DrMqcPE/HoPPNrEMVPEJOfaFLuMlTVDIcLHr\nMHW3hWx/CN28+2re+wWuh4MM/Oogj//sf6Dvldd41jCxmLtk3CbBdtJLk10rtlPuaDsC22PaxCrT\nspRhV+Joj+90/bUtZdh1TrYfu+2+nYHH7Xna7/FOaIcYtu9PBdIGrKgm+1/+fwh85D5e/OIvsfBL\nq6R+f/Nv+KS+/3HXV73FWmcsNMMHlaexUuMNjmOKIqYIomzQwIaKhR5zg6tbh/h6vZ/57hFW6WUj\n0UMmESGXCGFkJOozHi72HmdhoAB9AoNH5nGM1kg4I2CaSIJG2XBS89oxwgJpR5i4ssxH3N9G3mNg\nyCK/z2ew0kDFQpYAT9x8gZCaZ3Wyj0RYJ6cFSMmtCn52akTZIsoWiqARllL4Xy4gPSvgtNaY3zPE\ntaOTuMN56rKVFGF6WSfECq9xHzVsiBgMsEzPxha6JnO914OgmgTSOe5dvkCx10Eh5OE7P/o4SqSJ\ngzIeoYhHK6HXJQqml4viNAW8GD4Tq1jlGlMk6cJEIEGMEesCoe0cgzOr3PN7SVKeIG987B6KNjcG\nIm9yhNqYhX2xyww6F1lkmHXiNLCS7Q+RdQaoReysOPpYYJAJbnK0/iahcg6LRyVr8REjwVHpPDJN\n7uE8s+yhghMNiRx+ckocMaRiWg3qso0aNkrzUZIbveSnV7F7q4xyCxt1NEmmaW9lp+IzEPway7Uh\nJEHH/rkS2qiAIbWKAR2vneekcYaC08m2ECVv9fHxyLdIGl08dbcX73scNh9Mf9ZkwHuJrl/8c8KX\nZpB19a2klrY+rNEiOthNeLHTsqbb1mvbKm5ft/H27MbOZJm2Nt0m2s4wPY1dcu2MHIFWskzbOtc7\n2hXeLtm0522TezuWu9PhKQKmruK5NMPhX/hN+ieHWfnlMJd+R6DxHvZD3nXCjiurHHW/yGEucJtR\nrjFFEws26vjIo2JBxKCJgqYpbEpRFgJ9NFQLatFOo+DCzIiQFtAbFlYtQ8i2Jk7yxLoTBPvSlBoO\nSg0Py40hTEUkGtvEN7LKuHyVMXWWfe5rVO0OtmtRFjZHuKFNUbB5cITKiA0DuaGxZXZjddVRseCk\nQjcJFJoMsoyXAk69QriawZGpI+RFSvudpEYCbA6Guc0gDSyYiIistrRpehlkCd2QCTVzhBsZ9KJE\npJbCUalhr9QZUldYCcfY7I4wd2wUCY1Yc5Op1AxOtYwqyQRyOTbqvaw7vfTa1giKKbbMKDP5feR1\nPzZbg6btBfYJNxAbZbScTNH0smHEWBb6qOLkFmPYonWGmWOSGTIEWWiOkE/5WbEVWZgYwkCijhUD\nkRgJDlSvMrSxzvxWPxlfELNXYEBcRqk30bIWVJeVmsNGSXajUkOWBdyePA6hjI06IdIoDQOhLBJX\n11GMBpoooyNh2sEeKqNWbeiIEAK1YkVqaghuAxZlqgUnq0f6GDJX6TJSVMxh9LICqojfncUmv7s4\n7Pc7PP3Qe0jn4OgWfdeu4fjjs29Zy+36Hu2jbcXeGf3RJkqZtzsP77R423N0EirsatAKLVJtsKtx\nt2WV9mv7vjqv6R19ZFoPgvbcndZ+Z52S9qt1Z7xzNcnQHz9L9BeO4d23j/LDXaxfVMivvKsE2b83\n3HXCPsnrfIrXqWEnj48NejB2NtptYGWay+Tx8ZzwOMOxBSKsc1scQVdkKqKTtGjB3LSARYKHTLAI\naGmZ0reD5O7N43ioQrdtk410H7O5afb3vsn9E6eoTf8lvyj+IZZ8g3V3hAscYTJ5k8+f+y0+W/5d\nnut5GOFRnfykiwweCoqHYZKESRMkQx0bCk16WcNBDauqElguUzzgZOvRMEk5jNNS5QSn+ff8a/L4\nOMhlbjKBm/2ESREiQ0zdZKKwgNZlYjQE7v36BRSXDoNgTkM1ZKeGDT850oTYLMd4+NXXscZVClNO\nHnjzNB+wvUZ51MkznkfIiR6cRoWrc4e5Wj0IMZN4bA13pMTl/X6qP3KQgugjY/eTJkwJNxI6Nup4\nKbKPGTRk3OUKv/PK52jGZYZOzhFlix7WGWCZOKu4S0XEeYOh2VXy8QBP/9QQfcIqa+l+fu21T1Pf\nI9E3tETIlcHDAoPMkBEDdJNglHmGWEQaNwgOZnlEf5E31ON8xfYpLKhIbpWIdY1kKU51xYWwLDHw\n0ALmgsDMr0xj5kSy90W4MHUEu6NOkDTXhCmur+5nNr2XxT0DHPRevNtL9z2N4Sfhoc/V6f78q9hP\nLb1jVLJOK7uw05mosWsNw65s0baKO/XmzgJPbX1ZY1ebljrGdTod2+dtUm5b5m3ru23Rd4b4SR3z\ntiHdMWe7z52avAoI/+8l4g9m+PhvPM5z/8nHuS8ovBdx1wnbpxYIFES+5nqUNxL3kVzrITCZpCq5\nyOYiOMNVakkHm+f78B8v4O3NEiPByu1hymt+zKyC4DMIj2xybPAsgmSSDQa45R5jsHuR/uYyZzMn\nSBW7EXTwkWdEmSdp3eaFyCPM3xoj8UIPkYcTdHvfwDWeR7yqUU87yM5HuRHdR48jwdHyZfJWNwkl\nhp9ca8eUpkGoUKBitzNrneCNyEn6bCtMey5iQaWJTB0vXaSQMNCQGWSJe/grtomwxCDPKY8iuUz2\nFm/gMYusPBxm0T6I4RU5FjpLUM/SU9jmiusgXinHVPk63lMFrPEGgsuk1m1hyxNh1dmHQyqzku/j\nLzc/wYa/m8HuOU66X8diq3Nd2se8JYXuakkV60YPDWxoyOi6RFxcoyI6Oc0J/ORo2mT0SUgTpLGw\nn1V9mIA3xUpwkambs3huVWEB5EEdeUJDFAwMRPCZWKfLnAieZ8R6Gw2JJXWQXPkQE46byKLOQmGY\n1bNDRHs36Rtd5rdzn+PWlQlu3h4n8aFePAN5BuRlSo4gVdWFeVtkMxrHtJsYPwFBJYnSW+dq7QAe\npciY5RZuSoQj2yS9YQSXRkx+7+uRdwNyxELgp3uJOq/j/7Xnka8moKK+RW5tYmtLEu0oi/b1tsbc\ndvi1Ldx2xIdKy3q18XZS7CSSTqdje16DXYsYdq3g9rX2zyK8Vee87fxs1yjpjPWWO651PiDuTJd/\n65tERcVyZYvqr54iMvg4kV8eJfMHCbRkWwx6b+CuE7a1omJfFUkNdbG1GaN4LojTXkaVbKQ2umn2\nyFhyKraESr7qwzRM3GIRqWLgyNcJlTPUhiz0jq7wiPNZ6qKVNX8cW2+ZYC2HVDBRKgYOqlgcdXxi\nHg9F0hg8qz3O61sPUHrTx5OHvkm9x0JxxIEjW6Yvt0J3apumz8KmPUZMS7OuxCng4ggXqGKnZHoR\nVJmGojBnG+FPbD/OlHINt1mgR91ERqMsuThkXCYjBtFlAZUi/awQZYt81Y9qWElZgxSaXsp2J6fH\n72FF6sdJmWHm6M0nCddzFJxevOTx1nNUr2nQMJBqBo0+mVVvjPMcwlsvMpea5KWlx3AeyHGo6xw/\nIfwRc9IY19hHEgELPShmEw8lMjsb3YqmgWUnHeI2I4RIY7U26B5bp7TmIbXUjd21jGazUNS9WFI6\net7CkrMbdcpCdrhVcdFDEdVlYWjiNuPMElQzXEodZrWmkNZGmDKvs93sYiY1xdxrU/ROr5Dt9zGj\nT5NNBzFuCRgnwaZVcUslxIaJKOhIXo3MrTCGT4ABHctoHTNskjS6yBhBVCwEyHLAfxmvUWBV7qVX\nWL/bS/e9B78Xy4iHgX11YmeXsP/B5beRZ2eI3p0ZiW0y7ZRGzL/m6LSsDXbD9tpz3EnYbXRGn3Te\nR9vZ2Bln3fledPSROsa2JRPpjj6d0gjsxnMbG2XU379O7+fGyd8zysXhCJpahPx7R9S+64Qtpg2c\n52o8FH6FjVIfM0vTbAp9mKaAkRLJiBH6Jpc58pMvc0PZw2qzD4+1iG9PhomRGfYYs9yyjmFRGsTF\nNVbox0mVH+HPeWHrCV5K38eDoy9Qc1jJCCE8cp4yLraaUVbPDJHfDiEe0Sn7XSSlMGv2PvqPzTNa\nmOMnU3/KZWWSa/Ikpzz3UxUcRNhklFssMcibyhHmusaZEG8SaSQpLId42fcIxZiHf5v6d0wIcxgO\nkSl1joLVRcIX5leYQOceHuQVfm7jD+huJLFF6iwFejllPcFXpH/MJDMMskQeP36ljICBRWiwyCA1\nA6YqaSJ+Fc9+H2EzibdZoio6+M7WJ1hIjGIWQK9L+BolDmnXcDnLVBQ7JmEqONgjzPJTwh/xFB/n\nPEcZkeeJClu4KFHHRhUHDdHGw7YXcdYavLl9jM+M/S4jsVsA9MbWWege4Knoh9i2R+hRNvggT9NE\nYZU+CniZYS/L2WHWXxvEKH+ZoKfGitjH7cIeZhNTqCsWlruGSJZChEIphA+r1E9aORF5jYri5EL5\nKMUFL4qjgfOf5in/ZgD1WzaoSqQ+FcP+aIXgvhS9yjpRtjAR+Fj1O4hNgd/2/hxe6b3zT/Y/DAcn\nsR+KsO83Ps/g0rm3ane0a3u05QXYjXXWaDn72jU+GuwmpbTlEdglwk4ruC1nqLzd4u7Ux9vk7+zo\n2ybz9n20+7TvoX0fGm+3+Nu6dNtab19Td44au07Szt+hwtsTdcb/+Bm8r+WYe+A3qCibcOrM3/jR\nfr/grhP2t9MfJ3nfCD5bEt9wlns+8jplt4uq6UCvSxw0WkV1565PUhj2EQylOMZZbkljpKUgWdmP\ngEENO8/wBOvpfso1F5WokzWtj2Qjwg1zEp+URREaXKodZFbYQ1GQeXDkBe7rPUXB7mPSfw0/eS4I\nhzHtEDMSxGtrNGSRqmBlTYizV5uhi22uSVOsCXGyQoCq7CBJGEGGWNcaRbubmmBHsBpYsipiAnDW\nIWSQx4mO1NoMgRW8gSx2tYxDrGFVGvSrq/z08h/TwwYuZ5H1rl6y1hDIAlFxCx0Re7jC9s9PoQ7W\niMk1IutpRmrLfFh6Dp+zzPzACOlwiGZAJGpJsCbHOCXezxo9HOZ10sX7mNcnuOKdplvc5CFepiFY\nW3HZOIiyyXhxnnA1QyMoUer2kpP9qEGFmmzHp+cR3QY12caWL8IGPYjolHDjoUicNY5zhh7WuWQr\nsdgzQnPeQWEzSCHiY8g+z0D/Mls/GiXZHcZ0waPW51isDfOGfh8lwUNdsmLulGoTrCZiUEfoNloF\nvKoCmqGglyUkUWNLiNBFlH1c57K8n0rTzUe2vkvQ8y73m3lfwQPs5YHlNR6s/RnW+RnspfJ/I120\nLdjO6A47u9Z2OzyvLS20iRR2HYJyx3nb0XhnzLbCLqHeaZkrHXO0r3cWjmpDZDehpzM1vf2enRmY\nbU28Ldt0SiGd+nebzJV8mYGFG/wLy3/mueRxTnEvcJ3WPpPf37jrhP164yQXwj/MA9LzDPYt8ODA\n81zT9rNlRjEEiZPSy2zeivOtF38EV1eW8a5ZjnKeheooq0aMoDcDAlRw8goPsl3oRStaqITtbAsx\n6ti5oe+h31imW9ok0wxSFR1oYg9Hx8/SI6yzSUuXruBk0Rgi3MzQnd2EJZMeJUHVYWVd6uXB+qv4\n9Bxfc/8YuiARIIONOhI6qqLQE13FjQe7USPn8rJW6IGiSJeeQnQYWHQVl1kmTAofebSgQEFzYNRB\nF0X6qus8vnCKmsPGciTOpdB+ShYXFrlJN5v4jAKKWyP5w12IogWhUYOySPdqkmgmxeD0IrN9Y1zr\n3wdAVyVJNuVjw9qL4ZAYN+fwNpa4qh3gkucQD5ovM8U1LghHMHQJ3ZCpyk4ijSTT5Wuc8RzGHq7Q\nH15AUE3MmoTdaCCZBk3BQgl3S2pCZZsIOiI+o8C0doU+aRWXvcrqQD9rLyaIJRK4gyX22q8T6d/m\nVv8Y84xQwckQC+SrQRpbLla1AXAbiCIoLhVTAn1DIdSfpqlYyahBDK+ElVYcfFKPMFPfS3d+mzed\nBzF0mZ+c/QqFfufdXrrvGTisAgNdFh7LneWxxS9yhZaF2hnhodEib2HnWptEO+OqO2tXt4n9ThJu\nH3Z2rexOh2RnuGBn4kw7wqNNmm0ibpNvZwRIW2Lp1Ns7k2wEdtPTtY65OsMBO0MR259DW7bRAFdp\niyPnvggBkXTfMMvbEtXGnRW6v/9w1wk73LXN1nU7Z3zHiFo2eER5gVdKDzHXnMAm19h2RSjZ3Qjd\nJhaXiixpaMg0Nh0YTQtOV4WmrFDfqbEh2XVqhkJS7KIsuBBkA7u1TlV2UBZcfNL1DVRB4ZSUICf4\nUGgiYrBJNyEjzY81v4Z1y8D+UgPjtwxsn2/Q/ZEU064rRLMpArUsn3R8g5QYooQLGZ1NullmgGUG\nWhX5RJUz1ns4HT9OPWDn07N/wlBmke5Qij5jjShelhhqZXBKIjlHgA2hB5uuYtSWudE3xrWBSaqK\ngwI+ZDT2MsOIukRXIYu+IiPaDcQunUa/RHXWiutP6/Te2iL3YIAbj+kc4iLDt5bp+nKOgb4E21Mh\n/shw86T/KU6arzAjTtJrrBM31liWBzhevYClofF/+f4lkt8At8HvmP+MouZhgjme2HqR8eptFLOJ\nvVSnEnCyGe7m4/wFcdbI4+cqB4ipW3wo8zwpX4RueYsvCD/P02qOB0pPcdWYQEdEwCRGAisNknTx\nDE+woI/TzCksvzgKFjDGBHxTafSUTPnLPj7y2JfhuME3G5+knnTTZU3yuPAsL9ce4uWFh7nw/Ek+\nePIv+Ujw63ieLnLxof3A7bu9fN8TGIos8es//WWk88tcf7pFWu3Mwwa7RNjg7XWpO52Ib6V3s0t+\n7etixzg7u4TZJsI2ubcdmHcmv7QfBu1r7bTytruvTehGR3v7far8t/WyYdfS7qwqKO78jkbHvJ21\nSjpRolXf++h93+DI0Uv8yy/ez8yK76/p/f2Du07YmkWiZ88Kg+55aoKd541HiVi2KbLMarMP3ZQw\nDAGa4Ddz9AmrjHKLKf9lBorL/NDCU8xExrnsO8AGPfR41vDZC/ikDGuBPrat3cSsaziFMh6KiJKB\nnTo+obUDYjSfxJsqc6r7PnCCRVLxVqvYJBVzD6yEe0ko0VYFOLefhk0hL7ay/BJqjLn0Xnqdq0y7\nr3CgMYMmSmgWAUE0qVtt1GQ7F+LTFOsu9qev0aUlGWEeGzXKuNENmYiaQRYMlIKGtKQTkVMUbOtU\n4g7CSoqgkWWwsUZkNYNju0Y5ZKfhs2AICrZzDZKvaVy9ajJZVenp2uCeh86jSyKpUAjlhM5GzwL9\nkAAAIABJREFUoJurwf28ccPBnmaZQfsiTWTsQo2i6KEgeLmtDFPHzkqzH0MRaFgtxPQER7jAPq7j\ncJUxy+DeLqOFBQyPgc2sM5RZxUuBi6FDzNT2YdQlbsj7WK33YpVVHnG+gGKeZl/6Bu7ZAt8Jf5hz\nvqN0OzcoSm5ShPFQJORLUhjz4VXyNEWFcsSFP5rG5awilgUqfXb0sMigvoDFrhMjgSQaoAg0FDsF\nvYuL20dxWqqIJ0SuDU0C373by/f7HtYnYlgPuqgv/TnSauYtcoRd6ePODMO2067TEXln5bxO5x7s\nWqqdlm6nHCJ39G9HfnSWXe10OHbKJHTM35koI3W0dZZo7ezT/n3aD4B29mVnrZL22PY9d6a914Hq\ncgYhaMP6j+NYL7poPLPx133U3xe464RdqbqI920x7b7MphjlFf1BPm59ioCQJWsGsAp1ZE1DKJv0\nauuMcpseNhgILWAKMg/OvkrDrXDbN4KORI9rgQlutgrY+02afpE4K0RI4qWAhE6T1lZXDppEyin6\n1hK86H+IrCNA3XBglBoILhA+BomRKCvWXux6nZzXQ0F0kiZMmhDz2ijP5x7nh/gGB2zX6KluI2oa\nFdHKhq+HimKnLtk5Ez+OnNU4lLiK06gSIoWIQVoLozcVgmqeiJlCrBhIRejeSmKERFKxIHalSq+x\nQbSRQsiY5NNeyvusNHwWhJSA5+UKlStNZhWIawLdjTQuLc8b4nHW4zGIG8wwzsXSNOvP1MnUUuwV\nbzBZnaVmt7FgG2aLKBuSTNVwoOgNFs0hKpKLTylf5V7hDQaNJRKeHko5J/5GgUzQQzMo0WNuIBVN\n6jhQfVZm05PMaeM8G3wUteKgp7mBLVxBti6RN9NEEymyhDljOcE++2UqkoMadj7AS4R8aay+GpYJ\nlQYWKqYTS7NJzJ5g9InbXGcfZVyMiPP4wzkUTWWl0k9FdiI7NYQuuJg7SsLWS+4RL033nYU7f9Ag\nAVai0y66D2vMf1UksNwir06dt7MSXlvOaNehbofrdcZIt63r9nlnFEdnCrhEi/A6k17axNi5wUHn\nvbQfCncm2LSllDuTdzrvoU3YbYu5Lbm0LezOeG062ju/HfAOP6euQbEs0PPrVrKGk+VnHOyWmfr+\nw10n7Oqsk5U/G6H3hzboim7xJH/FR+tPc1sYZtMTJSptU8NNe8PdQf4/8t47SK70uvL8PZP50ntT\nJssXCgWg4IEGGm3RIJvNNlSToiTKBUWtViONQruzmpkYxUzETsyuNJpVhDRrZ2MkraRZylBkkGqK\nzVYbNtsB3TANDxQKVSjv0lZ6/8z+kXioV6WmhloSTczujchAZtZz+fDl+W6ee+755rjGPj5onKBh\ndzK8f44lZwIRnS6S2GmSJ0CSLtaNbuqGE0VssYtbHOYiAb3Ah8IRvkuIWTzEfDkGBtdwOmsojSbd\nG1lsN9VO6fgQhNwbKK0GA8U1Sh4XVZeDMBsEKOB2VBkYWuJQ6yq9pTR2o41wy8Axr8MzkO8OkSfA\nk9pb9NvW0MMiOSnMLXZ3aI7CbUJ6nlQoRLhWwBOuw6dgIdZLKhZht/0GdlrYJJWsx8/63i6KO/2M\n+6aINjZw5tvYC21G90D8i+AYE6kPSrQUGwPCIo27re/7uMYuxy3iwQI/I7QJLRbhssFrBz7B+Z0P\nkaSLZzLfYX/5Oqf7jvHtygvcLu+m2Buk4nDTNmwMZNdwSk2au+y8F3iMtBThhPA+r/WcItbM8iv5\nP+HWtQPMCWP4TpUp1uwE1DLHOcc3u7v530/9OPukqzhsJY4oZ0nLUTREYqQ69rWc4yRv8Uf6LxEU\nCjyjv8o3kl9Al+2c6nmTKBnW6KGOAwFIFnu5MHmCYsRLQ3SgxwS4DblsmL/tfYGh/jv3e+g+4OEB\nxnj+z17hhZdeJbmevkd/mGBsgqRJXTjvPux0aAezaGfNjrcbhG/3vXawCcTbgdVaoDTPby02qmxV\nf5iTi0mpWFepMcPKYZucuLbtdYNN7xLY+svCzPKt0r/G3deeu8/D62n+u3/9e7xU+jT/K58GpnlQ\nfbTvO2Dr8zKlS0Em2Usq0U3Ik4einWKfl8ohD2eaJyi7/CQmFpgt76C26kLsaTHb3EFNd/Fq8FP0\nih1pl8khq7rM7eZOJEljzDZDkA0AajhJCCvU0y4WF4Z5Y+EwhttGIrqGU6kRbBdRjBaVG0AOvN1g\nS7Rx6TWC5wvYxhu4onbsiyqVW1W82TR7RgT6u7M4gs17BJuui6SJc4X93NJ301NJsVe/wX7fNW4Y\n40jVXXxGfYV4K4erWkVI6mhRkULQQ83jQpR0uptpgskNMuEI6VAUp9xA8Op4KNPChtYSEVwaSyd7\n0F0C7vEqrVibedcgF4SjeOgUNxOssEICd6PGYO4afRs6BSPIzcQ4k95x1uhBRSZgFBnTZ9BEg6Sj\nB92QiEkpZFSquptAKYNxvUVmxs3cT/Qx3b8bvSbTcNvpa63Qf2uFXe5JsqEgXfIK0+5dRPUkPcIq\ngsPPgnuAOytjENRpOuys5/rQbCA4Ddo2G2Ehh1uroRYUKrIdwQs+V4EuaZ0EK0yxk41mhNniKIJb\noyT6KYa9NFIObJpK7+AqbbeNRkuhHlCoyc77PXQf6Aj2N9j7wjID56eRLswhsynJs+qVsbw2aQPY\n6k1tDWu2a+Wft3crWhtatqtETADeXoi06qO30xPWwqCZOVvd+qzXtd0karvPiXkOu2V/a+u8VQVj\nAFqzhXZrjr4jt3nihd1c+1ad/NJH3JwHIO6/5VkWmosK0yu7Eft0xEGNV7KfIXA0R+zQCjOtMbze\nMjsP3+TcG8fR1iTGu69T1EKUVR9vNU/yefvXiElpyngJk0Nt2ZhPDbPbd5NdoVtIqKSI0cSOV6iQ\nzcbZWI7y3vJJ3IM1jkdP428ViDUzoEHpNjAPnmGQenUkh9ZxjguLSIJB4HQV5W/KKHMw9jR4HwMm\nwJBA9cmU+71M1cZ5v/QIZ5yPUi6GOc4HfCHwZa6pPThrI/Q1/pCmrKA3RQJTJQpeN/luL3mCDBQ6\n3trMwOT4Hm6HRhhn6h6lU8GDU2piC7aZeXEQQ4Qe1vEIFW6yhz/hS4wzxQGu4KHCjD5GoFBGWX2f\netbFnb5hvjn6HKtSB6xdVGk7ZEq6F7dYZYdvCsGnMsgcCi2KBIiqRVqTBqvfcFF+xMF81whTpQme\ntn+bvtoy2rLI0CN30Po1xtu38buKiJKOgzoBQKuX+Nu5zxBNJAlKGxRyYeouO4KsUZT81CQnNl1F\nLSpUHU5W/b30RpboZZEaTjLEWGn0sZoaohETabtEbLE67ct2nNUG/cfmqO92UDACVFUP7Y+Em/+/\nhEyst87zX5rE01xm9sKmAsRUXHS22spLW4uIJohagXz7Ki9m0c4K2NsbWkxwti7hZXLWZsYLm1m2\ntSPRem1mA4zV+9pUgJj7m3SNwKajoPk5rUuPWXl181ymqkSwHMtswa8bMKmBc98Sz33xNOsXR8kv\nOe9exYMV9x+wfXToh8PgerSM53CRjZUYsXCK48JZWi47DqFBQC8w/9oYbcHGjlPTNPwOFgtD5Ka6\nuZPYSTnqRUXuWH8WQrS+46a4N8zSsX5ENGq4MRA6HiCDDR6ZeIelPcdQnFUkTWPfnVuEl/OQAXeO\nzm+hZeh6PUN7h0T9cyLfjn+K3HqEL839BWOJEoM7wTUOtMFYgNZ+gWRXhOu5fbz0lc9zbWCCxgsK\nekXk+up+Mtko1drLJP0xfs/766SFOIO+BX42+uc0fXbaSPgoochNDDsINrgiHuB9jnKAy6zRzW3G\nO8ZJTBIi3+HitSrd6joNu4Iodro6R5jFQYO3OMmJ6nn2FG7zVl3jXdcJ3go/wVVxH3FS7GSKGBmm\nfSNc8ByiYnNjp0mMNBI6ZbzUZDe+wRLVn3ew9MwQibE0Lzq/gRj7Og5bHU+8RPpUgI2AH3elxqnl\n9+jtXiMbCpEnSJgVjntfInI0y67labw3K/z7nTJL3gQ+W5G2KHOTPVRkL3J3jYhYxE6TQ1yigYP/\nwK9Rw8VD4nn+B/tv8VfKZ3kr+SR3vrULdUqhGVdJqnEMBGoNN8X1CCUpdN+H7oMbXSiT/fT86ldR\nV5cpsQmWJrdrzWIddKgQM7tusZWPtgKzla82QdlhOeZ2/w5r5mrK8UzANoHY6kdiNYqydi+aFItV\n4mfqsM33P8rlz+S0rSoUM7s2vUis2myTbhHp+KeYx64DyrdXsF0RsU2fAvx0tNkPVtx3wHYOVVGl\nNvGH1ogeTuIbzFP0p5BVjdXcABFviqA9T0JdweWvsdboZW5lDCMmMOSaI+bNYdgFlugnSoY4KSRF\nJ9nXQzyQxKXWmSrupqD4ETwaOgJ73TdIBC8SDF5GROeM8QgPuS6hKC38jTLOHsADQgAct5rYagKt\npyQUVwu7v4V+0MBbAsVlI7UzhLtVQzFaLHh6qPsVnFKF3uFllkM9FLR+DAFUt0xNdNFKOVlvJrjg\n7UjbglIeh9FCkjUW2/2cqT/KoLhEX2AZZbBFNeDETZUl+kkTY5EB1uimKAVYtvWzLsQZZBFR1LHr\nbXwU6RKT9xYEvshhElKShH+VdpfYWWBBsROgQD9LjDBLmBzfaT/NpfYhdss38UplDDr3tGs1Rdd6\nmvKYh9tDY1weOsRBLjPUmCRS3iDtiyArTcSoSlxMktfD3HEPEzcyhJs5Zu2DODbmGV5YZGZgB4Oe\neXpbSQ65LuJ2lDAQsKGyQZhlIUHd6aCU8XF99RDZeBf1gINFZx8PcY4e+wrpUIhcK4Lc1jmSOI/m\nlVAjIrrdIJeNUkkGaK46CXZnf8B10//LjcjuJjt2ZtFfS2PUaluyyu2KCnN5LdMxz8ymt/PP1izb\nBFgrfWKCrdkwY2a/23nre23gbKVThG0P2Jqpb28p357Ra5bn5mP7UmTWicSUJW7/1WAtxFoLsjKg\nr9XQimlGns5SLsgsvfV37/2POu47YHt3lajSZPjEbXqHV/BQoRlSuJ3fzXvpk0xIl/FIZRSxiXhc\nJ7Me553rcXYcvMmJxHt8bvQbvMSLXFP3MVKbY0SfxSa1yZ0M0ycuE2gUWU0NUHB7cUllKqIXr1zB\nj8Z+4SqzjPC68DTFfj8NyUGgUkLZ10Rq6mhjIuossAiOgsY+5QYVvwv5x5oYt6FecnJ77zDdzQzh\nSp5p1xgRIcW4Z4rnf/qvabdgsZpAEMHfn2ek9xbXJnWqRS91r5MntHc5VXmb7vUMrajITfsEf1T4\nVcaCN5kIX8UfLuGhzF79Oh+2jlKTnDRtDvJGL/PSMDapjdTUaIs2dtimcatVQnqeEXEWHZFVo5eb\nxh48zgpqH7TG1vHFW/SwRow0vawSJ4WbKo2qi3rVy0HnZWxSpxHmFrvwLtY5fP46U7FhpnzjXOQw\nD+tnGd5YIDqdx7ajhR4En15mQrzJLXk3b/Q9yeeKL9ObX2PSswshBY6bKq24A9Vlw61VOcKHOPQq\nGTGKjEobG4YhUdG9rKwMUjkTxH60iddWIOpcY1ibx5AF/pfoP2ZqYR9hZYNP/fhfYRPbFA0/M+IO\nSvMhatNejLxAV2yd3P0evA9kCAwcXuPo5/OUzrSQa5vt3bC1OcQEVStXbAKY1XfaBHhTaWFqtK00\nhwlqCpsFS2u2a2b2bcvxzOKeKbuzSve2+5VsV4eYxza9rk1w3t4R+dF3aBOct782j2dq1E3fbvvd\n13Vvi6O/cBVjtsTSW/bth/6Rx/cF2IIgSMCHwIphGC8IghAC/goYABaAnzQMo/BR+5biXvTDNlZC\nfRTwI+gGxXwY1ZCJ9aywku6nWA4w1buTZXcfFIDToERauBNVPFQ4wgX0BZkzX36CixvHESMG+WeD\nTAX24paruOJF2ssihctRxKDOtYFDBNjLMDqP8y5P6W/xtY0vMCPtZv1InKfS7xHXUmSeCtDaa8Mm\nton05OiaSSNsCDh7VMQ0NBt2VvQEOW+EHtcao9I0kXoeZ7NFjzdJXE7hs5XJLzip+xwUEz4O+y7w\neGSVFjL71m8Sv5xFfM3AflJn3+Eb/E7kn7Hq6KaG624XYZtcIcIb7z+LNiAwunuan6/9JXPyIN/W\nn2HpvRHqYS/eo2WCch4bbR7lNAottLZEphpl1j2Cy15DE5ZYEo6jIrOT2+QIs0ovAQqc9L3Ji65v\n4JHLnY5FCpzjGK/t+gTvdD/GeHQSF3X26jcYKK8QOFdG/E8G8Uc2MHYaKDGDscoi3UqOhwYv07WY\nxrHe4FT1Pb4pllEesvNjxsv4XyrgOF/hsS9+gD4h8V4kzAoJ9qnXeLL5LjP5XdTxYtvT5uG+03h9\nebJGiK+nf4oWCtVuO3XFQU1zsiAM8VztVfxaiYrHQ7p/lUZIodTwkfMHfihfgB9kbH/80dF6jJxZ\n4cmVJJdKjS2NI9bCnZUCqFm2UdjMuK16bTMbNgFUYRNIraoTa3ZrdfizNuhsNy61bm9OHqYM0ATR\nFpYioOU8ZnONdckxs0hpbWtvW7a1KlrMz2/y+uZk1rY8rE049kKDw//2HVrVCt/iCctdejDi+82w\n/1s6ixN7777+TeANwzB+VxCEf3H39W9+1I7hYJbo3usMu6cp42GZfrxSGVlqIbnbFMthJFmlLdjQ\nvQLh3ixj6i1ivjW8lKnjRKGF3WiSUrspl3x4bGV2SLeJ2DPYbC3WfVGaPgW/R+wAq22GFhlsdNPC\njiGoKFITJ3UCrSI2uU3GE+Hd3ofZ0X2H/vYyogqeWhW1YWfN3oUj3kAtCfROrpPrDzHbM4RT76Jf\nWCEkFbjGPuabI6hlO35fAbu/QUtQSNiXOCVP0q46GEouIVRhta+LgFDEVa0TT6yzIQco4EfH0/EI\nFxMsKf3YbQ2GucMoM4TIsi7GSHoSTMs7eKXxLDvsMxxoXuNI+RJVvwOvWEaUdIaEeSJkuSgkWK8d\nwqnX2Om+TUAo0MBBBTfd9nUi9jRZIUIVN3Wc9LNEyJsHm8RAZpW2Q8IbLVMWPaxno8TPrmHf10Bf\nh9p3wU0Zf7zcIfyyQA56K+u4qhKumkbYkQefgdol4XDViUkpBlmgSACXUEMQddy2Cg5XnTZ2fO48\nfnuequFEk3UabSfZfBfNtoMifq5V9zNoLDEmztAnrDCb2UF7zoaWkiglfjiA/YOM7Y89on7YsxP9\nlo5+YR17czNDhK2Z83alBnDPDMrkd62gu33txe26aBPQTAmdNRu2Zs+m7M7M9K0TiJnFm9dqArjE\nVj7d5MKtmbSV/7aubmOzvDavywzzuZW3NqkSq5zQnCwkQGqo6B+uofUehJN74cOrD5TFyH8WsAVB\nSADPAr8N/Mbdtz8DPHH3+X8C3uZ7DOrdnpscidc5zllusJfXxE+xKzCFitTpXEys4KVMwCiQC3bj\nPVbhpz7/ZfIEEQxYE3pYo4eNSBjxUzrSkkrEluHZkW/ykP8cAjq/zz+lOuymd3iZT/IdjvMBN7iB\nqP0E54RjFMQAewI3OVE7x9M33sKoC3zge4iXeJFfq/4BPZXsvX7YgsfNjb5xwkNZ+pZXeOxrH/Dh\n4YO82fM4V8QD7HNeY5/zGl83PsvV7BGaKQ87Jm5i83UWZPDqFXZWZ/BnqwhrkAmFmXpxhLH5eRpt\nB5c5RJYwVVy0UMgRZs3bg/hwE58tj0cs03YI7BGuEZSzrD7ay/v1E7xR+SR1n5Md5Xl6F1Lc2dGP\nGNSJ21I8z8vESPM+o2QLwzjVBlWnh4PSJVzUuMBRVoVe1o0eivjIEUZC4wXjW+xszRLOl5CuaSzH\nurkeG2fSO8aG4uSx5hreXaC2IPeHEO4Vce8GUdI7FRsZ8IF9WsNzpU77MRCeFWk/62TBl0CS2uzn\nGmW85KUgZ53HUBxVwqRJ1hKU8SLTwia0eSL6LqlSD3+0+o8RMKhLLq7kD1ENuTjqOc/TvI50AVJf\n7YMPQfrUD97Y8IOO7Y87pKEQ9l85TvK3/FxPbRo3meBjZp9mdqyySZfodLY3116s393GzSZlUWIr\nWJuFRlNN0QYqbIKxmUlbPUlMfxHYbC+HzUabBpvqEesCuqZIs8Fm27uZSZvnc9y9hjodHYOdTRdA\nq+rFzNpN8DcnEDNM0Bcs25rrV0p0FCPzu+I4f+kYjd98CeO/JMAG/j3wz+noPcyIG4aRuvs8BcS/\n184HucQnmUNDpGAEWDEStAUbgmDQROE4Z+ljCYfQpCuyQoEgF4UjzFZGaBkKg555CkKApkfh0d3f\npTTkpy44OOM6QYwU+7nKAIs4aBA3UjzWPI1LrHJHHWXxynMsuvrxj2/wE5WX2N+6gREQWO+Lkg97\n6RLXcd2sdT5BAloREbu/xr72dZyXWrgX6sj7dbRhGQmdcW4zwBI92hr/ovz7LNoGWRrsZZdjkpLh\nZUofJ7SYw/jTJvN/C3EP+AfK7E1PMbVvjPRAhCFpjsOti2i6zHVlDytCgoBY4KjjAkPiPIPCAhkp\ngiAY2GgzzBwD9kXGxGlUWSbsTzO3I8EV934UmvwrfpsoaVrYGWSBL4b+HR69iiy2+ICHSRMjRJ4j\njcv41Qpfdn2BDTFIQlslXC2REaJcCh3g8MQVZGcLL+XOQgUH7fj+FQh7QFYg9Eew6u9D1CRG1xYQ\n+/W7o7szMoQhsBkwbRvipn2cO+IIDRyoSGSJMMgio9osr+afp46L3qEFIq4MUdLoCJTwYbgMPpl4\nmT1MIgkq18UJYvYUYbJMM0ZWiHYGVRV2x65z/f/FgP9hju2PO/YFr/DLR17jQ99tYOsCtSbdYXXn\ns7aWm9tbjZWsvhwm0FsnAOuKL9bVYaydjFaJnJm5mtl2m61cOmw67pnHMLlw2fIay3nNazIliea+\n5kRk7bY0OXSTYjGPaeXQrQVI6AC+qaAxP5sT+ET0HU4e/FV+21VkkRgPSvy9gC0IwvNA2jCMy4Ig\nPPlR2xiGYQiC8D0dU175vVkufM2B0DJw7SoSP7DCit6HKsh4pRIprlFotkhWulkyPqBmd3HWm6PU\n2qDZcrCkt5GcKyhiE2+zgmjTkO1tdKqcY5lpNAq8SokYeV3iFbWIIQpc/KBNc/UdWjYnjUslPmxO\nk2xqNJpdVPxOSkqGCi/z2lyWixUvzAqUAm50h0BEy6EstxGLBlq/xJ3VDWaVW2hIbJBhWc/jbiTR\njCkUbBSMDco2D6rtJteuVfgzQ0G/qOJ3gXK7BRdyzD6xSnlngbC+QaBdQtAhJyUpy1Eqso8aGjbW\nqLPBMn24kfBTZpEPCDXzVJp3uOLajyypjBhVpoU0NaFMgAIaMja1RPXdVZLt22g2iQIBLhpRVnHT\nLeSpVtfpaqeZ9FzDLrbw6wv8TbuKKkoU5TRnNT+yqKLLaQp8SC5fppED7RtQ9ygUwn5Smg+pqjGy\n4kCoGki6jjLf5ExSoHleAtkgq1dYZ5mUq0VZctPGjp1byNoyTTVLs/nXqK1+SrrGnH+BgpLDSZ3m\n3fVHZE4zT51GxcnSWplaLMOqv0naiLPynT/Gdut3aOt2Vl/J/kAD/wcf22fpzFYA0buP+xkC6nSK\n2u9eJrlY4yxb/TS225CaGaXJGVtpDGtBzkp9bG9Rh60AfYWtk4Q1a9U/4rmVE7dOEtq2v1vpFWs7\nu/m3K5Zr2l50tEr7zEnGOnGY22A5j6nJNt+zUj7mtUUuzRH73TX0ZB+bxrT3MzJ3H39//Ocy7BPA\nZwRBeJbO5O0TBOHLQEoQhC7DMJKCIHQD39Oc+Gd/IcbYLx7gsYtn8YWmWNpZ5Jdrf0BKjnPcfZZj\nrHFreYI/v/TPoQGengLGI0sMijkaG25uTh5iePg2Tk+VW7P7Ge+6wRNdr/ILwp9yyTjEOT7NKWGK\ns/ox3jdOUBHH8QgV/PIUj/+MgEIBA5FhhtHYwSIDdFFkH2n6WaJOlAZ9tJG5yQQg8ijfJKpnkNAo\ni15iJPAyzjrdDLLAbpzUcDGUW+bA+k0MTaAUkljv2+BPxTjHBp0cs1+GFSBPp3lo7zLaCwJy20Bq\nGkhNQJ1jOmhw1R/lEgfZxRRjTHOBg4TYYIBF4nQzvNJi37yddyZ+hS7fOr+k/ve8Y/NwVjzOJQ4x\nyAKH82c5sniNvmePMxUdJYbAtP4cVeMwKanMWLLNU5W3udM3wXHhAz6tXeGc8hAxLc1Ae4mvKF9A\nkHQOcYk+lgjPFfCcBZZhui/Bqz/5FH4hQIgNjmCgI+IuN9ixuEjttMSpX/EiYuCfLSHmStzeo3Ld\nvYcMEZ7mDYYqy7SrTvSgg5fvHOfa+UOIpy4Q67tFP0uoyMioeCnzqvFprl48SOntMI+eeBvPqQzL\nzRPEfyrFQLLBza8cZPDodTZOPvx9fRXuz9g+Duz9Qc7/Dww73fO3ef4PzrOKwQiblIOpOzYzXg+b\nGmY/m9ro1r0jbQKiCQDy3f1M7rjFViA1gf4pNikQqybb6lVSp1OENGWA5vnM41l12NZjWDsRTVA1\npYjPswnwJmCbk8aG5bPBJuibGTls8unQKUJarWHNiaDOZoF2cNJgdFLjj4mzzKFtZ/g44t985Lt/\nL2AbhvEvgX8JIAjCE8A/Mwzj5wVB+F3gi8D/dPffl77XMaY8O7hp+zG+0ffjnFK+w3PGt/ivnX/I\nafFRrrOXbtZphW0kDs9R113YnQ3cQhUdkWZVwbgD61oC50CVUCJF7kaEV958kVt9+8nPBMmlwpw/\n9Ri57jB5V4Drgf3stE0RVbM8eX0OwWkwN9pPijgVPFTwkCFKjvA9gADIESbBCvF6hu5UjiV/P1cD\nE1ziEEPMc1T9EHepSbBewK1VyMSCeF0l8l0evil+howjTIA8K6yT2pDRroB4EoQRQIDpPWOcN47w\nbuUUP9v6S57W3gARVkiwSD/jTDHIAj5KjDHNKr2c5yEGWcAVqrCmRPC5i8yJQ/wb27/mgHCZLpKI\n6Iwwyw75DnOKTkn2cbO1l8vFIyycH8ZRafP4s6cZujlPbDrDl578Mhd7DvD7nt/goHAZ9awRAAAg\nAElEQVQRQTLIiSEUsQEYFPFxk2dwxFoMPbLIQG0Ru6vGPuE6OUKkifESn6WXVXqda5T6/DRTc9je\nhMnj4yjxFiGlQPdMhoVoncneGBc4ii7Y6RVTJOki3rvGLz5xASGsESZLL6u82niGKm72Oq6T/7/C\n1KZ8GI8JTLX3YL/UpOwMc7T7Ik/43+HXH/uP0KPxxX/4t+CHOrY/vhBg6DBFwc+Vha9R07d+cbc3\nprQ296LOZrZs7fqzZpZWtYiV/rCCmXk8k382OWbYWmC06qpNFYhpi2qlPazNNdvVJWY3pmz5LCaH\nbi1Qbm+i0S3bWhcJNq/XfG4WKs1s3bwPVlvWZWBNkqlER8BzGO58wIMQ/1Adtnl//h3wVUEQ/ivu\nSp++1w5tRSYvhDkvPExR9eGrlwm7c8TlFKd5lAoeBJdGl2sVFRkBA4UmpayfYjKI0RQpp/1obpHe\n7nlyyS5Wzw8wVd7TMbRdASYMekMr7HZNYqfDw/pJ4dfaaLqIj9K9pa0cNKjSMb/PEaaEjzpOknRx\nWLvEzuI0vptVNsbC3A7uZJYRQuRwUmPQWCaQLiFmDeoeO+2AzLotypS0gzvqDoSKwGL9fWYDwPBr\nqA+L1A84Kcp+prt2cEk6xBvSJ3isdJp6y8F6d5w1WzcFAthpUSAABsy3hzq6Y9nXcSZ0VVEdEodz\nl1moDVEznMTCWUQXlKWOuEGzieTdfkTFjWGIiIaBU60TUTMcN86i2kSm7aOMGndYKfcwUxvFCIuk\n7VHa9BIiRxOFZfq5wyiaRyTpiVPEg5sqG4Q63DZQviuoaMgKl/37qNZTOGfL2Po1aIKwYRDUSkT8\nOYJGHrumUhT8NBQXG2IQh7/GiP82IgYOGig0KRp+UsQJkaPa8IDDwPZQk9xiBP0DERo6nqeqJA4s\nMz4+S0v5obem/4PH9scWAniPepFlL2srAs3WVjWEGaYLn3XFc5PLtRoyWbNdM+OFrVTKdl20VYli\n1VCb21jB3QRrqxrFPIYogEkyWUHS8lHvqVfMYqKVJ7fy52ambr1Oq4LEvAfWhzWLNwHfCt7mowTU\nJAFphwNfwk1plvvPinwf8X0DtmEY7wDv3H2+AXzi+9lv2JiD9iVuLh/iVfEznFcf4Sftf05bFnFR\nxUkdA4EQG4TJoSGxTje5m12kV7owEiIUQUzqOHZ3rFipAWZ7ud0Av8bD0ff4fOCrTAk7GWCRpLzG\n5N4THa6cEnUc6IiE2MBAQMCggodpdpCkCw2Zw+0rdKXTSGcNmi4FaYfGcT7ASYMpeRwhpDN0zSBw\nqUJ5p498yEdDdNBFktu1PXw79SJ6RmXXIZD+x/+DWp+dpUAXVzjAitAptg7G7uC/lSeXC/HqzlPU\nnE5EDL7Ji+zkNn36Mn9S+RItu50JT6c11k0Vpd3i565+BduKBpqAcELlW4OfZsE5wBTjOB11ZgMt\nXE47+4XLPBl9k/eee4y64eKQfJG3HnmSqeO7+Efyf+Tx6+/yyOJZzj16iCuhg2SJ8NP8BSnivM8j\neCnRQOFDDpMmiorMHCPs5DbDzPEU32WQBfIEeZNTBJTz+OU1HrlxAc6AsG4g/ppOX3CZx40m47VZ\nbss7eNV7irrgRENglhGOcxYnjQ5n76hiF1rMM0TrF0VcWgFR0alNBWi+7YC3W1RdCrNHhrnun6BP\nWAYu/gOH+w93bH9sIRj0fmaRhDKP8U0dvfV3l9My28/NDNgEWCtXbQ2z2Gc6ZpjZq0l1WP2yzUYY\n2KpGsZ7Hyk+bGbBZ7LvnYSKAXQRBB8PYLEpaFygws3XzV4AJ/A62asCtK86YChKdjnpEoEPFNCzb\nmL9CrL8ubJbPboK3dfLy2jXih5M4Ds1x4ys8EHHfOx3LeHnKfp7LOw6zgylGXTOM2aYIkeNJ3iZG\nBrmpc7J8Grwai0of7/AEy/4R3EKVnsFFGm0HjbaT9cV+qv1u+IwKTglpoo1dquMbKzLgnqNLWOdl\nnqOFHYELvCs9zio9+CgTJY2LGlk9wsXvPoSitzj1idewi208VFFosmhLcDrxMF0/lkTrgS6SyKg4\nqeOiRlnwcW7nUTZCYUohNw4aeKhQwUOXc5UX419lNXSGoYEor0tP4nDVKYkeskSYWJniSPsKh/s/\nZNw2RbBW5IkP3kdXRNpOG8dil5gLDzDjGWHIPUeSbrKtKJ56A9EmkhS7cKtLOLQaCGDkocuf4RHn\nGSQ06jgJC1keql5EKag4Nhr0O5OUfR6MiIhLqhOXkrSRWe7roRgIkHFHCFCgh1UcNBitzvOF0tdJ\nhiIsKX0YiPgo01NM8umlN5nv66cWcJIjTA0XVdz4KWKvtxDmDKSqRmXISfVZJ8aowJIrwYLQj+aw\nkRXD+LQSP5f+Syp2NyuRLkCgjQ0ndQ4LF4mTYoFB7I4lYqQ4IbzPtWMHuSweYtoxTnigSJA8U8I4\n15t7gT++38P3gQgBOCV/h8O2KZqo9zoOTS8M609/a4HPSh2YQLS92GiqMUyJmwmK1kYaqxrExaZN\nqnkMjc3VbKwUQ4WtiwdoQPPuSazNPqYG3MxuTdC3asrNCcZUgMDWFnnd8tz87FZ+3UqHbG/OMbcx\nf4ls6rRVJsRrKLKfmww+CAn2/QfsdaEbVRaIdKWw0WaXcYOx1gw9xho+W5E8QURdoF9dI2MEabbs\nPFw+j+iVWAgOYPSq1CUn+UKElZvDSPEmod0ZgmqJpiKDU2dUuYNbrJKkixZ21mq9VIq7uJN9mCW5\nH6e9zuHGRYJyjprHxXxpmLiRwmeUGC3O0daXsQcapKQ4mVCEg6HLuBoNRqrzFJw+AsUigWqRWsxJ\nqifKfPcQkWYOT3qDUL5ALZckGkzhG6vwtjtJIjTCIgmC5KnjJE+QUOsSO9oz9BtzRJUCDnuD/toS\n9ZaTlm4n3kojVjTKuhfJoxLX0tgaOj61jLCuo68K95a4NqoCRcOHgM4ENxE1nUR9lUIuz47VFI5s\nG2ahazBNxhXiqrEbOy26SJKkCzVkoxjyUcFDr7bOsDZPSu5C1gyc7RYuvYaDOjIqIjpRLcOj9TPU\nNAfz9KMic4MJGoaDfmGJorNNKehGR+T2vhHWn4yTYJkSHqq4WbV3oSITVTMcaV8kJwap4iBHGBUZ\nFZk4KbyUcFLHLjaJk2Kc22RGo9yRRxHXBdyxGh4qNHAw2dxzv4fuAxMCBvuS1zmkTHJR1+4B0vbC\nn5WLtXLMsJUWgK28tVlQFLdtt72N3MxKYevSYdaOQyvQW7loAdCMzYKlOelY/UDM/c1iqGnmZM18\ntzf8mPuZ/5qALWx7WP1JrFy99Zzmtd4DdF1jIL9MdP0GMMiDEPcdsKcZ4y84Sg0XCk1m9DGeKpwm\naCtzJzTEVfZTcXjw2stMieMMZpb4R9f/hGd3vsK73Sf436RfBwRc1BFEg6A7z87wTR41zjArDLMq\n9PKk8DYbhPgrfoqjXGAytZdvz76IevEgWlCiGDZ4fbkbl7+M92AO+6fbDDDLsDTH8MwyvmaZ2kMy\n/7Ptn3CZg4TI8/jG+3RV0pwfOEDPZIrh6UXWno/SjNpxqzUeyZwndjWLcEan+qaE8SgIvyVy1ejF\nTxE/RRw0SNLV6WbsjxMijV8uojia1HsVFid6WHT0kxGiiJLO7pUZfn7tK7w6/hS9+jpHa5epBWxI\nLzUZ+f1pXL+lQg/ol0RuRUeZi/fhpczjrdPsWJ7jm9cbKF10KKMrUOzzsNjVyw1pAi9lPFQ5x3FE\ndLyUkWkTaWzQV0vx1/7PcsO7B90tcFC8jIrMMn0YCGQCYVYOxGnLnXpAF0ne1E9RxM/TwutcGFGZ\n+1wfLd3GV5Uf5zr7+FX+TyJkUWhSxY2TOk65TjbhJ48fMJhkNxmiiOgc4Aoj3GE/V/FRYpl+/oKf\n4TY7WRYGaNtsaJKIgE6QDZzqx121/xGGAb736vjkGoJqmG9tyURhqzTNLPJJbNIlVv2zlVIxaQdr\npgp/lxKxSuhMMDUzZVOzbbUwtWqeTaC0GkJJdJoITV21+RmszTum0sMEbOskZNIn1n3MTHr7Wo5W\nMLaaXZnXjOWemcVQVANlso0r33og+Gv4GADbT5HwXZueIHn6xCWyniBZKcAsg9xggngrwzOVN4l4\nN5A9bZKjEYLFAkebl/m5wT+jLrkQJQG3q8U1+26WxB4W6aeHNQ5zkRFmkQoG5CT6WsuUWyFawT72\nDF/nkHSFA/p15hL9rHnjZAhhc6pE6Mj2HJ4GqiJzS9iFhzJHWx9yrHiJuuRk2jXC6NQiUSmNbbxB\nbDWHM9UmbwswFxjk1q6d2N0tJiI3aA9IzNhHWRB8ZFufYqMe4tOuv8Vlq6Ej4l+vEFvL48g1sIVV\nqn126h4HXeczDNxZQxg3iN3K4r1T4dHjZ0mPRTnXcwTZ1iT6UIrEb6ygD9dBVRG6dXrtK6iGgIGI\nw1ZH8qgIPgOhi3s6p5LhZV2Ks0ovD7U+ZEy/Q8nupyZ2+spSxLljH8EQYEXqRRVEeqR1/BSRUbHR\nZsK4QY+wRtXuIk0MHZFBFjglfIcNwne/vG3cthqr9lEQOvWBb/McbqpIaDRRMAAPFU5IH2CjjUIT\nmTbFtSDLU4N0TaRwxTq/ktbVbnQkDshXiJJhObRE8okeZjdGyZ6J4ju4wZBrllv3e/A+KGFA/aJB\nQzQQ7yKXSUuYwKewCUAmKJkeIMbdbc1uPtP0yar+MAHMpDBMEDTB0pwYrFposzPQ3B82Ac8Ev+0T\ni5VysfLiqmUf0XJM87lJt1i7LM3Pu13xYblt9+6NyV9bJx/z3lmbeKymV6IKxTkoJB8QtOZjAOwo\nWRKsoND5mTsszFF328kQYZZR7uij+NQKO1szOPUKGVeY2YEBvJNx1A0bMU+Wut+JS66zMzBLxaGQ\nIkwLO15KDLJAF0lirQ1C5RLecoVLvnnCIQejA1M83H6P5wuvciM8zqRjnCnGKeHDTpsmdophHwUt\nyGnxUTyU2W1MEWnmuObbQ04KMjHzMspgndxIkMxcF2rVTsOpcKNnN/m4H+dgHddIHeywIA9QE1qo\nRoCVVh8rjgQx0ig0CWRLhCZLMAX5T/nYiPmwCSr+TIXQfBFHtIFtSUW8ZbArMcNyfx9vuE8ywiyt\nvTL2XW1cM2soeRXRbdBTTKG5RDKxKFJbo6koVOJ2lgaC6G4R13CNFV8vWSOK3ygS1jaI6hmGmSVD\nhLLhI9CyUxFdTLtGaCPRzToTXEdCw6dXGNPvsKd5E7vQZNXVg7PYQDJ0XP4qJ+pnyetB0u7OsVJ6\niBRdd/+fk5QNL+t0UxE8tLBTb7iwNdtE3Dl65DU0ZAxEqjUPKyv9VEa8VPCSJ8BV4wBhI8cp3qSf\nJQa9Cyzt6+ftNz7JlfnDHB17n2HP7P0eug9IdGAluyBibRUyM2ETrKx6aRMczW5AE6BM8FK27Ws9\nhgmI1qYYq1+JlVIxM1or+G8HbBP0rf7aVoWHCcjmOT6KZjHPa1IlJl1ibcAxgdvc1gq8djZb1K0G\nUuK211YfFBEQdShlQLt3FGuJ9EcT9x2wg2wQJE8vqwTJEyaLlwpZIswaI6y2e+mSUixEe6hKTmo4\nWaOb14c/xfXkAUoXwvgncgQGsvh7igiSQZQMT/I2cwzxHT7B5/g67bCNeXc/h7PXGXHMsM/bRLLF\nuS2P4VcKtCUZFzWGmeNDjpAlQgk/N0I+5o1h3hJP8hn+hoB9gze7HmNV7MWTqqJlJHJdYS74DvB/\n7/kiGSOKVyixy36LIBuoosxrPU8RIcsQ8+xhhWftSzhDdd4UT3GHUbpI4pTqndGQhkl1nLQtxMOt\ns2SfiLD6aBfDjjmCahmn0cY4Cqn+GDeYuEetNFpOIh+U8KZqEAMpBfIwEAPnepu66mImGqXUfZJG\n3MHOoWnmnYNgwE83v0JDUlhSehgU57HTYkNt8nzudVYd3ZwLHWKARRKssotbvMVJbOoaj1c/QEm3\nqCsK3sEyz954nUbbwfyjg4ysLOFsZLi1axcXZD9LjpN3lRuwy5jiE+obXBIP84r0LBuEKKaDFJYj\nnNnzGMOBGTxUOr7fXR6kJ+t4I0XiJAmTxSE3Ue6W14LkcdNxbbzmP8yN6n5OVx7lROns/R66D0go\nGPiYx06Ercb/pgrDmjmaqglre7q07T2zGcU0c7Jy2NaGGsmyvdmIYuq6nWwaKdXZyhFvB3zYWtw0\noa/BJgCbyg/Y+sugQefXgXmdZiOOGSadI929DlP5YfU8sYKw9TqsUkBzwnKyqRHX6ZiHVrADQTrr\nPDb4Ucb9z7D1DHu168yLQ8wLQ0zeXaD2dnOcK/VDlB1unPUG0WyekFAi4ijSHchxWTmMEq4THM2g\n+w1Kgo+6zclT2nd5svYOO4pz9HrWyLrDDNeXsa2oNDN29CEDydfCK5ZxCA3agkxJ9CKh4aZKhCx2\nWjRRyBDFLrXwUeR5XuZo6RIDlWX8zTrLoQGueA/w/rFZVqPdnGk+zOXpIxQFP8FgnuHYHN2OJIPG\nIkJZQJAMBF+nSGcT2nilMlkipIkxxDwXuw+QG4hw4uI5mpLCutTNu8ZjiIqOt1zBdlFHtOsUn3Jx\no38CzS3wDK8yygyxjRye1Tpro11c3bGXFW+CCf0GRgCK+FGbMk3dwbrcTd42Th0HbcXGSG0BZaPN\nn7e/SNibZsQ+Q5wUQ/VFEvUkirOO7uj8P1XxkCNMnmBn5XppjZZD4nT4CXJSCC8FxISArou0RAlD\nWUESNJqCQg4vYjvGZyvfIjSbx7lSZ0xZ4JzjMaY8e6nFXJTqAVSbDU24CwMGZFsRBo1FftnzxyBr\n91arXzQGcBgNQtIGUTIIGBQIcLT/LCF3jjfKTzPtHrvfQ/cBCT+wiyp+KnT4aBOIzAzapAvg7wKm\n1anO5JbNzFdiK8dsVYRYC5nW82x399tOnZgUg3n+jypetiz7mdehsJUyMcPKd1s7Iq2Oe+Z5rK36\nDss+Jkdt9TzZvlKNtXBpemab3iQqfmA3HSuC/68Ddi7H7mSanD/CDcdersp78VNiQwvTbtiIOdPE\n1DRS1sAh1gk5ijhaSxyJXcLwgjSuskqCJF2U8TKuT/Fk6x30sh23rULLKdHV2sCRbqIuSayPRSk4\nO14+OgJlzceS2k+fbRmvWEZCo58l8gSZZ4heVulniaNcINgs4ynXCVVv87brcZLxOO8eOsEyfdwo\n7iW/FqKme5HaAkZQIuZIc6B9hcB0jbQrws29Y+iIlO464i3RT44wBQJk/DGMXoljgx/icVRRmm0W\nxQFcRg2hCYX5ELa4SqtXZrHaR9jIccxzFkOBYKVEMFPl9f1Pcj58mDuMksWPlwobhFi0D6DpHf+Q\nbkNHQmdeGGJvawp3o84b2jMc1C4wos1gr7YJNspohsxsqJ9VWzcl/KyQoIgfhSbjTOGUasw4h7jq\n3EMZLyPMkhroLNPVwxqqS0ayG1QFN5WmA3fBQ19zlZ3zMyg3mhQiAZKeHlL+bhRbE8mtIUfaYDc6\nX1JNp3QnQLeR4amet3mLx1hgkAxRpvUxnNTpYQ0RHcEwuK3vZF/sGgnvCpfmjlAQf2j2qg94+IAx\nVLz3QMYEXatsDzbBzwqWH1VotAK2tUPR6smxfQKwArZ5XJNKsNIu5nmszTVYjmU9jwn8JuFg7tu2\nPDc/o9XzRKeTRZvHsBZZTaC1Lv9lZudWbtx6L8x7ZU4C2rZji/iAnXS69ExfsB9N3H9K5O0SQSc8\ndeQ0KwMDvBb+JA9xnm5HkpbNjkNu4Ag2eX3fSbpZpy+zysjkEo8p7zHhuYKTOh/wMO/xOGd4hILs\nJ+WNsursoyY5sUtNbD6VwN4i7VEb1wIT3GIXRfIU6GW9lqC54eafRn+Hhkvh2zyHjTZtbJTwkWAF\nN1XSxJgNjiJ4oUdfIWFf5BjnuMEENlrs8Vyn+aidVC6BURPQRAnR0FGqDcSXdKrdbpJ743i4Q5sE\n3+CzzDBKgSBF/Pw3mf/As8brKC80mRCmGFleQHNIXArs5WZoJ7MvjPDIpXMc+9qHfLr4JuKYhv6Q\nyMX+vTR9bnyDc6SdUVzUOMlbvM4nyRAjQpbZxGhH9XHhDC9q30RF5k/kL/GG9yQJ9yqfM/6SEekO\ng9UFopcLlOIe5kf7uSgdYpLdzLCDZb0Pn1CiKSjMM4SbKi5qPK6/ywCLSKLGDSZIEaeNDd0Qaesy\nq/RSTqu0Jgf51sFnMPbBQPcyrwx9gozTz1HpDAPKEmkxyh1GSdlieCjjqDdQ/8DB2+6nuP1PdiAZ\nKgEKJFjBKdUQMWjgQKFJRfPwbvVxig4//c4lEqPzPH3ndb59vwfvAxF2IIyEfQsQm2Bp6odhq7IC\ntmbNLTbB1qCT0ZrZtUlBwGb2CZtgafXmsPLZNsvfrBmwlWIw3fbqbPXCNoHTlOi5LH8zwbtNB5it\nckFr9m+GVScuWv5u0h9m96f53KRgamwCvZVyMfc174P5f7D51x9d3HfANqJQHVLwLlYYkhbYF75O\nmA0QoSx6aKKgyhVscosybha1BKnBOHm3H4Ua3axztHEJSRdZc/YiCTo5KURGult4NMoIhs60e5SL\nyhFObzyO4mgS4mV2cJbL4iHekZ/ib2vPYc+3mczvZqBvDpe/ShkvgUYJh9HmrOMYo+o8I415AloB\nb7tOghTj5VmUVhNR0tjVNUUy1k2l5qdidzPHMLsct4ge38CnF5mYuk2hXsVLmRhpjnOOIn5K+OjW\nU3iVMhsxH7TB1mgRbNSIqlm65ABKqMnGsJ8zxv9D3psGSXZeZ3rP3TLz5r5n1pq1di3dXb1g626g\nQewQSYgEhzstiSNp5LFlS1Z4rLDl8Q9P2PPDEyFb49BoZFsaWZTEkbhpGZIgCLIBEDsavaG6q6q7\n9r0yKyv3Pe/iH1kXdbsIW/RgGuiwT0RGVeW997tfZn35fiff855zzpCqrRAN5HGIbTxCDcduE3lG\nY9Czguru1Flx0STGLie5StXpwU0NjU2qYhcLeyPMz07QHnLg7S2RpNb54JYkpFdNvKN1EuEsE6E5\n9pQwc4xjCJ1vBitaitbiBCFHjrGBWYJ7ZWJCjmw0xPDmChGjwFZPgh1PnLruxi1UOS3e4GOVXSZ+\neJ1Y1x6VlJeL8fu4Pj1F/maE+gNeymkf5fkAoSfz7MUj7LS6yPVFOz0bPRIj0jzHK9c5vXON7yRM\nrsvHuLT7AFulFI09J9tb/URO5VHG24iqjhqr3umle5dYJ4woId6maIADgDqcLg4HMjs7GFseY33/\n78NJKfbaHhbva/dGBW73vC07rO+2xhUARdgHSPN2BYs1lh2ALc7ckgbKdIDcUrdYIGqBswXk9ufe\nbz72hCB7+zTR9rt9k7Pmb113oHw/zMx/+HbHATs7GWH2/i56frBLqJTjDG9SNzu1O3aEJCYCXWwR\nokAZHxtKL6vBAQSHSS/rnZ6E7Tq92hYJZ5qiGWBWm2S3HcfrqOBXSjjbLW5KY3xD/DxrxRFOaZeI\nmxmeqr6AW69xzTfFS9XHaGx7MG5KuFs1EqktpLCOs6XRMDxcc52gp7lLsFLG1W7jcTbpMnc5t/U2\nRlOk6PLSE1kn7w2Qc4V5OfcIZdNPwRnC/fEaodUCyUt7XM3KhAt5TgWv4qBFBS/r9OFwNVmVe9nw\nJhBFg0CjzGBmg0CzxHjhJl3CNm/33MdPhs5wDgO9LOGr1PDIVZRim9qimyOTtwgEC6zqKSbFWbxG\nhbOtN9jydCEqBg5jjU3hHl6vPcjO9R6OeG8S7spjiiJ6U0HPKzS2Hbj9DXoLW4R9GcqKh2UG0QUJ\n3ZRQ2w3WNpJ43HVCqTxqqQmmSN3roSedJmwWKXV7yLn9VPAREIqc9lzmP1W/R+NVF66zddanetmR\nEizPDLHzg14cvU2MtyWkb+uk+lfJuuLMNCfxnm+Q9G7T7dripHiVh+pvcHbrIsu+FGvOFO/u3sPV\ntXvRFhWYgVrIS2Xci4CJHvjoPzwfjnVIAgnjNkXG4aQY8dDvFhBZwUELKA972xbHawGbFcCzvGSL\n/rDTEdiuh9thzK6hZv/estCplW6Ndfi4db1dH23RIBZYK9yumbY2q8PJOtb1h5sEm7brrKCiPUvT\nSlm3bzYH8zFsV320dscB+4Xg47zh/QRTj1+nz7FO0CzwvP40bUHhiHSLNAlWGKRICA8Vdm718OrX\nHuGpL3+P1L0r3GKMV93nuWTewzZJ3sqdQ9wRaW8rfHroW0wNX0NCp0SAmuLmc/3/ll5pg5m2QP+V\nbc6632H1xPe46HqA5dIwpWaEW9+cpJ1ycOYfvcK0ZwLdlGkKLr7m+grfVD7DUfEGfrFMX2uDZyrP\nU3G7mQmN8qb6ACIGvcVNfu3P/4Tuxg6BsSK1czLNmhP3ahXn2xrRoTy9n98ABGLsMsgy7wZP8C3z\nWdaFXvyUGHYs8nDiFQam1xlbXMbhahGZKBI8UqSGm3fdR6k4fSSVbfRxiRtJN/fqVxlfXmSwvMED\n7stIFQPfahn3mTpGj8COlkcxCsSSuxz9B1d4Rvo+T1ZfoOUW8S7UUTZ00v9xFCGm4ww2EZwGwyzx\nJf6KGSaJt/c41prh7ZP3IjnaTIo3CPbsopSajCytUulS2fUFqYoeRrQF2obCgmOEgi/AtXsDzI5M\nMOW8TlJI8yCvkZnsIifFSQ0vUnnbz85qL9NvnUYXRaRugU8O/h0tp8yFyqN0u7eIBrM4TjYZUhd5\nWvgB4pjBnHqMjNYFmxBxZEmx2mnKcLN4p5fuXWINYBeR5nv8r6XMsIor2ZUSlpdpgZyHA5CyA65d\nHgcH9Tfg9qxCexp4ff9hb3QgcNAAAG6XyQGYZifD0QJba+OwxrQ3S7CnQr1fdqNou8aaszXvw/I9\ne5Er+OnMTpkOUNuTeSxu/DDFYv0PPuqAI3wIgH1j9zju/CmGA0u0FZmG7mJ9dwDNIRGPpDvJKzRw\nUyVNnO1AEnGqzWooRU1TMeoS284kWUeYpumg0IhTb3lxR8pcMe5B3W2Q872CLP0DfTUAACAASURB\nVLV5ov4jHnvrZfzhImmxSiYSoeZyMirOc61yGq3uAAmkoTakDKqim4wY2+ezfbiUBn65SEtSaCJT\nF52koxFuuka57pmkW98iY8S54ZhkZHQZd7qKu1YnayTRHG2CwRrVuIqelElVNzFnBDJijOunJmgr\nMiFyNHCyS5RVsZ+604VS0/DmazAEhlOijYKPCnVJpSp58FAh642y5u7lxN40nnYNr6MGSv49wrK7\nkMFwg6vd4lj6Bh6pQSYeYbw9g6dYJXariqYp1PtcOIYaFFU/WSGCgxYZYmSaCU7MX0d0mKz0pTC9\nJj6phJ8SDZeTeq1NvFbECAuE5QLDrWXiwi5VyU1cyFCUDUqBALWAi5rmQi61ePDSm5SFIPoJib29\nCA2PG+MxkVJXAARwV2r44iVcnhpHWrfwiyWKUoB3lNPslHrImWG6/Js0ulTCwh5Bd4FH/S8xuXOD\nm9ERCoHAnV66d4mVgVsYlG9LDLEAzZ5wYvciLarEThsotufthZ4sr/U2KoPbddGW2YHPkv7ZvXts\n97MnqNildVZw0AQcwv7z5gE9Y70m+wZlr6Ft3ct63S7bnOzvgTUXC7hNDnhr+zcVi7u2aCRr3gdz\n7vwP7obmjnccsDcX+knsRAi6i6DAmtFPK++mpUpkI1HiZIiSJcIeiwxR6VPp/eIKq0ofl8qnKSyE\nGInME4lkMb0CdaGB4IGeoVXmtse5uT5BY8LBOfFVzpXfJP5SDnFEJywKrA8cpSJ66TK3cRebSA0T\nJdCi974VIj0ZdkhCSwTTpO5QOSbeYJR5WjhQqeOTS2QjQWYZY8UY4DONv+Ed+R4ue09x45kxvEtl\nXLdWKCl+3K4GRjxL9aib5ikHQ7l1jHcEso44V6dOMibe5CRXGWWel/kYFbw0cKGbUme1DIAeERFM\nk7i+S0N00hYVBMxOvQ1BRvOIaLKA5ANBMkEEIQHhchHWQS7CxOYCg84V9JBB2plgXe+m//o2lSmV\n8lEVp9mkjsouMWQ05hlls9nLQ5cuspro52+OPEOEPca4SUcN7UQTXYgOGW+7Qm9lh25hp1NeVpYZ\nNefZblRx5Nz0yNu4pRpSVefolVmMIyLisMZfvvkLNBIq0q90sjRNXcQoiWSbMY6oc3xCeQ5ZaFPQ\ngkw3jnMxfw5EgYd9P6LLt0lS3WIgtcKp1WsMbS6jBUWmB4/d6aV7l1gJuIlE6T2gOxy0gwNNts7t\n/QntbbXshZjsUj57MwHruBX4s8sELZC3gNTqvm5PG7enx2u2ceH2Akvv6Z6Ffa/cvL2lmDUPe70P\nOyDbNx73/rEat3+DsOZg1Qo39s+xxraA3FLK2NUr9uskysDc/v/io7U7DthsGrQkB/OMssgQ63If\nvaklPGKVEDkEDDbpZpYJ0iTIFuMUFmMEB7N4bxYo/ncym4PdFB+O4PtcDl8sTyBc4kHlVa5U72c9\nnyKpbTPQWifiKPLmL95Hxhtl9vlFHr26TMBToHrcSS3+Z3QH1nhl+DyP+X+MlxJvcJYrt+5Daukc\nmbrBojzMBr2MsIBKHQORCWZ5kNc42bxGYmmPh4JvEOnb4yZj3OiaQAgYVP0q7vUG4k2TkF6kK1OB\nVaidcxKNbvNL4te4YD7G68I5RlhAoU0JP9/k8zjcJv3uLajAWP0WEWeGnmyat9X7eCH4JGtGP+PC\nLJ8QnkN1VqkpDjBE3JUWilOHfmANuAG8BG/cex+FcS/n+QlZI8pCeJQrT58k5t1FEyRe4ElGhXlO\ncYU0CY6Yt3jcvECXc5ua4uoEMfHgpUKEPXaJccV7gitDp/lK+ZucLFxDaoLeLeN0NDiq3WBpusHJ\ntV20ARlnvIkZgYXHBvFT4tnMd1GmNC44HuWychqXo0Gt6KXQivFy+glC+TK/7fgX/CR+luncFK+8\n9QTGlIm3v8SyMMjWZh/F7TBXKg/wsvgU4eAeIdK43gud/X/dmgjkOEKLSWCBA8/ZUjZY9MfhQKBd\nSWIPSFpUinW9ncu2gN7OX9tpA7t22p5paOeSreSWmu18K9hnT5E32A9GmgfJOg7buJaHb/WrtL4N\nmHS8aguQy9yuHLHmbm0Ads9csV1nvXfCoXOseytAGHDTpNM6SuOjtjsO2F2pDdyhXWqyGw0JXZA4\n73mFHjYRMHmF82zRQxMne6UYuekApe+AcMKDJBmI4wL1qIc2XvSbAt2pDQajS8TJMBW4Srid42Zx\nkpau0qtuUBlWcQtV/JQI+gp41AoIGgOuJdouiRhp/PvZg0/xAoueI1QdHuLCNrcYpUCQKFkSpImT\nYY1+QuQZEpZxS02aopNwO8/o1hJuVxU52iKabYApcmtsCPONDYRNk0w0jJJoQUDcrwEtIaHjpMnp\n/FWC+TLfKz/DVvN18AGzUJACbIR68TlqGLKAjzKqUKdAkMucZk3qJybtEjcyDG1t4NA19lJBPHoV\nda0Byy385SJtVSBHmC26WXQOUeryo5htNFNmVUgxxBIh8rRRSLbSDLTW2RjuYTXQh45EkAJ7rSjf\nqH2ZIc8CLrHBoLKK91YFYR7Ig+O4hjRq4Ai18DYNQlYkqwAFI8DGeDemKeErVjnDW/icJRKBLTIk\nyBKnZOTw6lW6m1ukyuso4ftpOF00owqmy6BU89HaGaGwHKVS9IHfYDuYxBcpMiCpqEbtTi/du8Q6\nvmV00CAiwK0VMIzbddEW5QAHAGwBleU9Wl6t5fEeVlLYtdT2VG07iNkpBMsLxRpf2J+p+dOlTO0p\n4PYEG0s9YgKCcBAkFPcnZk/usWvHsY1nryFieeT2RB3r3odT+LHNDQ6yP28LZYsQCENINWD97ig2\ndscBe+LsLGp0GrdUpYGLCHs8bv6YMeYoCz5eN89RIoDTbFDciVB60wX/Zpv80STC027kf1pH0ET0\ntEzlRhi/c47e6AYiBid732E4cot/tfBfUhNcjIRn+RR/x2n9EqZ4E3EyyJ4YoL6v8hxnjvO8wp+0\nf5kqXn5d+QN2B2Ns0Msa/eyQpI4bDZkUq6TMVb5jfJZBfRm/XqEU87Hh6mGz2cvDs2/gitYohVQi\nGxXW1F7e+eRJqj/ao5wRmT8/wJHSMvWml7ccDyAIJilWibDH0d1bjN5a4+trX2V3NE4l5EF5o82t\n4BHeOHo/DncLt1zhft6m31jjinCKPxN+kRB5jnKDh/TXSCwWaMktFqdSxINpYjt7mPUWJyrX2GsH\nmXONkanHKGk+9rwR1owUdUPlpHKFuJDGQZMkO0SaRcymzPWJSW65RiibfsaEWW7UTvBn27/CP+79\nfZ5xfpdna89hTItor8iIWzpqvoXRlmgcV9FDTbTTJoyBsSZSLbvZ1eOshPuRnTpfnPtr+lrrDAYW\n+aH+NJtqCdFj0MU2R3PXMNcFdESc8QZd8VU2d/vY24whbYkYaxKiQ0eequOK1FDdFTRZYkvrvtNL\n9+4xAZz3CDhkgea6iWEceLKHJXJ2wLZoEKuUad12np3+sOut7aBsaSMs7/WwOsVe/0PeB+y6+dMZ\nhHaP3AJ667gMiAKI+0hpmCCYt2cwYruPJVO0eHds59nnb3+N1oZmbUiHqwda75e9nooAmDJ4ByGY\nFDo9w+4Cu+OAPVme4/PzS9xMDXPZfZJNsxdHUycvRphVxvlK7RsMm6v8a+XXqC+q0HLBp3vghhNm\neS88HVL2OP3w2/gjhffqJwcp0HY48A/sMaUs8zQ/IMUqDrFFSfTTEh2kSTDHBFGySOhsmd1MXzlF\n0QzguK9JUkwToEiSHRKkkdE4zjQCJtPtKV7Y/TiNJZVYcZfu+9eJqWlS2irNLifb3gSX5CkeHnoV\nUWoRlbKUBjTSx/t4iUfwOmtEzV1OCNd4kUcomT4eMV+i0a2wHQwzdHyOq56j/J7069wXfoc+aYPx\n+VvErmRpDklwL3wt86ukHXF6opukSQAwJVzDHyriMDSOl+ZoeUTEgAl9IPtBbgMumPqTi5xaeB39\ndzxgKGhVB8VeD7vOCH/Hp/FS4Zj7BlPGdc5cf4cp73XKo25mlXGOV6f5N+u/wnPhx/mh5wkm3TdY\n+2Q/2jmZ3uYmHneDzUAv34l9inT/iyw9WKbtUdiLR8hoceo+J4Ms43FUuTB8nobspKT5eT3zMFWH\nm67oOjXc9PnWqQ3KJNVtxpmjgYvyYhizojAwtcTmW/2YuyLHn76E5GnTlFzkhRBhKcfKnV68d4sJ\nUHpIpeRwY/5tDbHdgbE2HdoBOmoQC2ic3K4IOVxoyeKiLWqiwUECi+Vh2ikEy7t1cKDIsMY16dAc\nmLcH7ayKepY6xF721fKOGxxK2tlXlNjnYFXZq3I7UNtbgVlBTntZWDt9YqW+C/v3tIDbUtu0OVDI\n2HtICrJA46hM7ZgDvsvtu9VHZHe+44zooy4LLDRGWDRGKRKgInooiH4u8Bj3C5dpCwqGIDIYXsBx\nXKd5zMFWo48SfoysguTW8UZKdPes45PLKLRZYBgJnbbk4KhvmkluMNmYIXlzl7rPSVaMou33b1xk\nGHW/IP+22UV2N86OmeSSeS+nuYyIgY5EppnAMETGnDcxBYFlIYwoG2yafSxpwxyTHahyBQGTmeQ4\naUeMBXGEaDCLiwYFAtTCKma3QZe5jarV8VAjZazQEh3UGx4i6QJNyUnSvcOTvT8gK8VoagqK2aZn\naYuulQyGDnnFjyjoOKQm/dIqp7jIKgNMNmbpKe2gCm3kgoHzpRbVI06aLgflKQ+lAYGCHGCVFEag\njTtWISTVGRA38Co1rgmTbJOkjtqpqyI1wWngcZcJtnOYO7AR78Vr1jivv8U7nEBHQJcE6ikn1UEP\nDhokr+6hLLYJtQrsShqNpEIdlYbPgYBOhD38lJAkjXn/KFt0kW3FWcsNUMeFacBU4CoeZ5WcEqSB\nEx9lJpkh4+0i5wpzJDZLfCJDPeZG8bTwyyUMyp1ON+JHHwD6sMxEYDp5DIdLwhQvAvptiTJ2jtle\nLc8ywfawZxLaPUy7wsMyy9t8P8WIneNu0gHa96NQ7LK9w8ksVoMDiwaxANvilA8HMA8nCNmB187V\nC7ZzD3Pv9vnZvfj3C26aosRquI/t7runWcYdB+yL3tM0ByZ5ae9xMpU4UWmPdDTGjiPB3/JprrhP\nIZgQMgucv/8V4kKaAgFe2HyG4kIQfdGF42QJZ6KCIrbpYZMmDr7DZynho5dNvsRfMsAKznKLnu+m\nWR5MkdVi6OYWmiCTIU4ZXyfNGS+GIGKaAnXcCIZJDZVZcZJr1ZPE2rukQqtsy10YisCpxFs0DQcb\nhQHG1FtMMEtEzvLjxMOUDD9SW+OKfApJ0NGQaKqz+DwFPmP8NZ56GwETwZlDFEyaJRfCtEJSyRFO\nFBn0LrEh9dBuOrl34128l6uYm6B9WaQ84KYhOTmX+AlJdrjHfIeCESJQquBbbXZcg1XgNfB8oknz\nrIv0AyE2jkqkSXCFUyz+wjAtHIywwCO8yCDLLDGIgcgo85wwr5HQ04iSzs6xGO6tFpHFIgFvGdVR\nh7DJUeU6oCPoJqpYp26qbJtdeF9v0TW9w6888Gf8YUHFSRQD6b36H02z0163JPjxUaJNimVjkHpZ\npVgKoecVvnT03zLsXGSTHlYYoIqHUW6xdbSLPSIMCsvEPv82OcJ8l2dw0SBOhhJ+/HdBxP7DMhO4\noD9GTuvlDFcR9nPv7GoLi9qwgn3w0/VGLO9WpVPNzqqEZ09Csbhwu67bniRjHDrP3B/HHrSz7mWv\n4WGnWuz1SFp0tNqSefsYVsDQnr2o2663VB1W+rpCRy1iL9xkNzsQW++JpXSxUtOt4wdlZ2WuGVOU\n9McxWeJusDsO2Ot7gxiZ+zjte4eMN8622cWOlGRL66bc8lJ3utAKLjZXBtgYWkEN1QhSwBFtwbvA\nH0LrcTfh81W+NPodVoJ9zKqjPM3z7BFGQ6GFgwJBZJeOdlJiYHWdibfTiI/4yPWHqaMioVPDzQ3h\nKF2n13lIe5nP1b5DYiODYcLRI7N0e7cpGgGm5eO82nqIOWOMc67XGQgtgtfgXsfbdLNFgSC3OMLi\n5VGk1+G/+PT/jCtV5QqnAIltoYvL4mmm/NcJUGRPCjEuzHEjcJTfPv3POSFdZdI1Q0DJ46eEz1mG\nnhbamEDTr3ItNAFKpytMBS9GQyFZyBNeruBo6uClU8RtlM6KG4NSKMC60McNwkjoTDDLIEvUUanQ\nqTW9ygC3GEPEQDIMvLUmXrNBUfbynPxx9IjMkGuZed8IEXMP92iVVW8fpgBzyjgNwYVabDCyuMrS\nPYMs35/iPvcVbr16hBLneZSX8FDF0W6RKOTYdiXY8SUoEUClzoiwwJpjhGI+hH5TYr23Hy0ssk0X\n6/TRRiFClpndKXRdxploMybOcQ+XGGeWIEV8lKmjMssEf3OnF+/dYqbAxt8NEpJ1TrXFn+KELUC0\nVBgNDjxKK4MPbveQrXRsyTaGpau2gN+eFQk/Dbr23D97VuFh/ttSeRz2ZC1wtNMkFqBar8/aGCyz\nvO3DKhj7xmTN267f/r+jUA4n2tiTbRotid3LCdKZQfj/C2Cr7QYT4iynXW+xKffwrjHFptRNUQ/S\nJ2ygI1MWvLREhYwQRy60UVeaNCMKrqEazYsqznYDSW6TE8LcXBtnqT3E2ZHXqIkeFpt9XNbuI+bM\nkHKu0DORJkIO6Z02FcFLDQ8m7Ne/9rNDErEBDq1FMrCDT6jQFmSC5DnueJfVVooXs4/zeuscFcnL\nY44Xccl1dEGgLPpYModYNVNsC0kcYosBcZ3R3CJepUTLVNkolxFrLrLuKDcdI7hoUsJPT2sbAYFb\nySO06g4MXaRIABcNZEmjGlAR+hoIoom8akBbR++WWaqO0G6rnOJdettbeIRax5WoQCESYL27hz7/\nJqYMIOAstYloOXo920yLk6yLfexKMXr1TZzGHhXZR6KdJlXZwL9dpeQNMNt1pFMBUI0w5xqjIngZ\nYJmEc4ctuhEw2BGSRIw9wvkCsek8O8EkpV4vlW43dZdKCT9F/AQbRTz1BqJhUhdcVPASJtdJJ5ck\nEtEt3JUqcTPDQHsFqaaRc4dJk6CQD7G0MkJejdKnrHN0aZax8AJH3POMa/M4im2UZgvBbdL2ffSF\neD40M6H0dpWWWKFbM1nhAFTsqeAWENmDe3Yu1+pKY2mzsY1jBersQbrDqekWqFmAbddyi7axsI1v\nnWuXFdqTc6zf7ZpruB3Q7UBqzcGuDLHXP7E/7Ofa36vDZVmtc+yvzw14dJP2fJPSVu2u4K/hZwRs\nQRCCwB8BR+lM/ZeBeeCvgBSwAnzBNM3C4Wsn1ev8064/oo6beUZRxTqb9OKQWzwmX+gkkYRVAqFd\n8kKA7WvdbP3FANEvbhH8ZJZMupfoYzs0zor8rvAbrF0YRrplMvDry1yXT/CT7GNQFuiLL3Oy7yLh\noT1ig1mWCzkG++JoSLhocIOjFAnQMJ2svDpG2QjR9x+t0je+hkKbNAl62SBULfG/zH6ZrBCjP7xC\nK+SgpPlYbab4XuCTlAUf23qSuJzh46ee4yuTf8nItTV8lytM6Tf5etqkJ2ew7U7wLifYI4KEzucr\nf8sx/QLhSJaJzAK+apW3xk6x54igCxJOuYkYyxGr5LnvW1dJnwxz+ZkTvLN1lhl3FX9Pnmfl7zHY\nXuu8sbuw5u7lGyc/wxfSf013a5sk29y3VaarvIuZgm+6vsAfO76KU2xwf/MKk9o8L3iqnKjc4Jn1\n5xHeNXll+CzPp57qcPhmggvG48TEDJKgs80yGeI4adLARaKdoTe3iTgDU/Mz1FIutv/7CGE5y3Gu\nkyZJV3EPTznDWl+SdWc3Jfzcw2XW6CctJxhNzRLuz3FCv8bHVy9Qznow+k0qeMisdLH1pwN4vlzg\naGya37rwB3hPVqDfRKjQ0ZpngD4IjH/wrLMPsq4/XDNh+RJhbnIGnevcztnCQfDOLl2zQNPydmUO\nuo4b+3/b08rtmmSrvoiVum6ZZjvHuudhLxgOuHJ7HRB79qO9cYHlIZvcvpkYtuvaHMjz7FmT1sZh\nBTEPy/OsDcrK6rS9o7ddawdxg05tvkFdw729CFx6n1f40djP6mH/S+D7pml+ThAEmU5Q+p8CL5im\n+S8EQfivgf9m/3Gbxd07GIhU8ZAnxB4RACZqN3mqcIGnxJeYVo/yE/855naOkcvGMVwi5ZYfQTEw\n4wJ7Swkqog9hVKNaCSA14YeVp9jzRRHUNg5fk6B3r1OelfX3CutL6Lip49brXFqeoiE56RlY49iD\ns/SZ6yTEHdbox0AkxSpJdsAjMDh+ixPCO5xyXOEh5VXWGymcTZ3jxnVW6CfXDvEJ6TkmxFk25R56\n4xkywRiX3SfIrb2Ex11hiCUkdNboZ50+yHYK9v8o9CT1uId7Slc4vjKLFhEoRnxc5xhvuAJ4YzWe\nnHiRoKvCxOYCXwx9nYrXjZ8SiqR1eOtZIAS+SJkjws3OMbOFhxrORpN0K86r7gdoOSXGmWOhMcz3\nxafZUHtoiE6cuQbCpgl+0P0SBiIxdhkQVnhG/C5XhRMUCPEDfg4Bg7Gtee6/fJXAZB6zC/RPQ+Ff\nmTTnWsRmckQqKiHyXOEk0cAeIXcWQxYwESgR4CUeoc9Y58nmj/i91X/CjPs4K30DzCfGGBNucg+X\naeKiLahsyQM09jwshkf55seeZSQyT9iTQ3PL4DTJN8K87b6fa97jwKsfdP3/e6/rD9/amPeYaL/u\nQ/vdAq2ZDqzZs/YsQDzcRssCMMtjbXCQpSjZrrPOOeyZWsksFgVipywsAP1ZatlZXqydKrGeb3I7\nbWFtPthei53+seZrf10WzWMds+ZpfcuwOHXrPEtlY1FI1sZRBcxHBQJfkZD+RwNWP/qEGcv+XsAW\nBCEAnDdN86sApmlqQFEQhE8BH9s/7U+Bl3ifhd10OLhmnmRL72JXjIMIUbJEzT1Uo06QAp5mDaOk\nMNBcJegtsX20m8K2jzpuzFSnG4peEYnq23T3pPEoNXC0aSoOGqITzXQgi21cNFCp4dYaBFoSIV3D\nkEQGWeFN/SH2tBj+Sol4cK/j0QoGDlqIGO8FsbxymacDzxOXd5gQZpmszxFt51HlBj3CJlVUXGID\nj1CljsqSOMhAeJ01qZ/nPU/g9a2z4Nb2AyoOPI0a4/lbeFtlmooDEYOqV6UsukmU98iYUdboY41+\nckoYX7BC8agXzRApmT6O+GYpqT4E02TBMYguy/Rr61SCbkohLxoydacTp+lCQ2bbk6RmeKgXVUZC\nC/hdRXq1dUxJJGuEGd+4SbK8Q8sroXllvMFyp5+mXKWvtUGylqbgC3FZiZAhTpIdQsU8/dc30WUT\ncwjMCTCmoLHuoEKCmqlRwUuOMFlXmF1XmD2iFAnSRsFpNGmbMmXTR04Ps9IcZKeaYLE8yp4jTNKz\nRVNzInp1Iscy1HweSi4fsz2j7IhRZF2npnkgBHtCmNe0hygoH6yWyAdd1x++GWSicX78sU+w98c/\npE36PdCzgPdwYSTLm7XAC9tz1jl2ELQ/sJ1v/bQnqVjesQXuh0ubHqZq7LSEXS1iV3rYxz9c59s+\nlp1Gsa63c9DYzrXMAnQr49Lirq3fLeWMuf/3ek+KyqOnqfyv9UMjfbT2s3jYg8CuIAh/Apyg8/3g\nt4CEaZpW+4U07IuED9ksE2TMJ1ltphiQVjjnep0hlmi5Rb6ufo6rnOJmYZLN9QH+We/vkOzZ4m9O\nPcvF/+Ec6zt++M8Ar0FIzfJw7GXue+oiA8YKLcXBq8JDvNR4lMWVCSqBAGWPjyJB+mqzjJfzDLV9\nxKQMEWmPN0bOslbq462N81wsn+O47xpfGv8a9wkXiZJll04Cjdpu8lv530f0tTEkE/9mA4+3ghot\no0gtvGIVl9zkJeERQuRJijv0+DdZYpBLwj0oygyCs58k22zSw3BuhV9750/RjhsU+318UfrLzjcO\n1c38iI9r4kkWGMZHmRi7JFxpGkcl5jjOFeEUcWEXCY2aoPId96c4MXqDf5j8c9b9XbzrnOR1zhIL\n7tLFNhnBycvDJ4lkCnzq2nPUj8hUB50orjZLwhCl3QBnX76MOlyhdM5FRfDS31hjsnyTnN+LM9/G\nuWqgjOv4gp35mPCeWyS/Q6do2eMQ/TJUpCjPxZ/i+vIqBsdo4qSOyjZdvMsJSvgJmEU+qX+PN4Qz\n/J76m+TG/UhljdxWgvxMAikiIJw3eLNxhkrcy9iXp9kw+/AIRfxikTc4y7XGaXLbCXQRTFFAqznp\nj33gINAHWtcfhU3nT/BfvfMMp0qf5hRpWhx4n1aqtuW9WvpnFx1v2qq3IdCJWR9WhFherp1fPpww\nY/d67Q1+LbPL9yw1ijUne5EqO5VzuMa3Bd52rbidq7arQqy52akOuxqmzgHFYqdRLK7fonwsesf6\n9mEAL+89yg+nf5da/b/lbjLBNP+f2XRBEO4F3gDOmaZ5URCE36OTvv+fm6YZsp2XM00zfOhaU546\ngdDVg9aWiRyNMnnGxEGTciXAVq6HMj6aigvNKTG4soLqqFGc9FJYDtNsulD6W9QbbiLmHo+Ef8xo\nZRFfq8JWKMnb1QeYqx7F6y7Ro67T7dzERCSgFcm8usjgwwkaoosa7o4Hq0WoNz1kajHicobHgj/m\nSHuBgFmk6PBSFbzohoS3XWWuNsGm1kO3c4uG04GuiIwJN6EssleJshAZRHCaRNgjQhYQKZteshcW\nGb4/wYavixwRPM0qR0sz5Lwh6qoLN51vFSo12sjIdRA0A90tokkdJi/KXidVnzBZomy2e9hs99By\nOEgKaY4ZMwxpy+TEIK84H2SIZeJkWH5th/CDR5BaBpPlWVpuhZqq0sSBT6uhNhvUiy5cnjoetYKy\na6AUNQQNtgfjOBtNAttVLgw8zJq/Fw0ZAZPRzBJPXr/AtdhxqlE3g+FlcoTZFLpZVlIsv5whcu8R\njrnfJSWuImJwgcfJEcJHhUeMF1mnj1fEh6maKqYm4WhpdFc3QTbJBULI7UDujQAAIABJREFUZidt\n3y1XWVscoFFUifl2KXqC6KpITNmlPL9BaXqTxp4bxd+gdeEHmKZpj3X97Av/A65r6KbTvgsgtv+4\nw+bzQl839659nY831kjvf1O3uGK43cO1AMpeo8Me7IOfTlO3zC4FtDzhK8Bp27HD6fCWp2tXnVgg\nbleD2PlnO6Vh0SIGt39ruAwc37+XPdvS+mm/j/24vXekNVeFAx7friCxxhaBuACzkZN8N/lzsPgq\n1OPcedvdf1g2975r+2fxsDeADdM0L+7//S3gd4AdQRCSpmnuCILQRScc9FMm/dJvIH3yi8QqnY7p\nppSjoiuky92s50dABsnXwhGus6ioRAMZTnz+Mjtigprpxik2yKfjhOt5hoMVTuWdhNp5ZlJHmN75\nDK29c/SMXeJxz484YW7yE+Eh/O0Sqt6g58tnaYsKDqNFXExCVSC0W+CqO0TAI/Apr8p4TUU1BNY8\nSTRBpoFKlijzO09Rq04g9M3ymPQG9xnvEJfzuLeblDM1vj7yAG2vzABtWkQQMHEaLZYLyzzyrMT1\nRJifNB+miZOgs4ca3Rh48JPngcpbpLRVMv4I46tLpLbWKSlu0r1RSt1+QrhwtlqUW3X+Sj1Drn0a\nZ6WfopYgrxbI+ad5qvJtyqaXN9TPEZCmOSJO4+cler4ywJ4ZwWsMkhDTIMA0xznRvM5Ya560FMOh\nNAi280TnSmg7Cnk9yMbZBP5WhcRKluzEJEpojCZOwuQ4vVvnEzMBshMPko2HuI8fscIAEqPoDLJW\n28b16cd4MrJFSqqwS4wLfIG8PoJmlPHKHgJCN6rxBI1iiKBcZMR3i4fZZD2X4i9Wf5EhdYlEcAdP\nsszu354juzZAJWVC0iTizJDKX6T++MeoKAGMVxT0SZg9/YP/d5+J/4DrGs5wACMfkpVlmFEZ6A/z\nyd4Ws5d2MZo6Dg6a81pgZXmnJgceeHP/HI9tSAtk4QAM7DU47FJAgJ+3/W2BsL2Li+Xx2pUhlt7a\n2jjslIe1eVgd2e08uSVLbANPcruXbG83Zve27cWerAxOa67We9HaP1azPW/RMYpTYvJEHLXay3ev\nR4EknZj0h23/7H2f/XsBe3/hrguCcMQ0zVvAE3Ti9TeArwL/0/7P95XFhuNp1OFVzpmvs/n9AV7/\n8/OYNQEj1Um9xg96VqHxoox5Xmf46C3+E/Ffc0F4jBlhkjYKnmidciXAH27+JgPhBQb6FvBKFbK+\nME1RZlEZ5knzh5w2L1MkQE85zUp+BndzEK+jxP2ti3zD+QU8a3W+9P1vs/xMD/W4kwBFSqqbGY7w\njnAPPWwio3OFU4zE5ngo+hI5Kcxk/SYTzQUqPgf5RICtaBJNkXDQxEGLLbqZ5jjviseJBX6fgWiD\nj/McL+Q/yQLDHEtMkxJWaeFgk15C60X6yttsTyXQNmXkCzqhK1Xan3XAL4CbGv5CDSUrspZKkXBn\n+CTf4w8v/SZZd4TsqSjf8DxLrh3hWuUE3Z4tWg4HbTrlWNeNPv609VV+XfkDTsjXuM4xso4oVVPl\n0d1XyXlDLAWHKBzLsz7RxyLD9DtXqZsqa5Ee1pVOMS4/JU5ylb7IKrNnhuiR1+hhHRdNpphmgFVm\nmWBbNeiOdGFK8A73MsMkNdzoTZF0I8Hz/qdpywrNtpPaYoAeb5qj4zfoY53czRiV/zPETPgEu/ck\nGfnsDM2wo5P6dkRHcGsUL7t57XfuxfwFN/2/sM0/fOb/YFXtZ/bf86PwH2JdfzSmARWWz/fx8udG\n8f7j7yNnDlqlWWDt4iC4Z+eWLVCqc9BV3A6CdhrkcGajPajnokN3NDgI5tm9W7tMr7l/jj1oaHm9\n9jlZhaosALfzzHbv3+7x23ly89B4cJD12eCnvW67jvu2AGhI5c3fOc+1pSH4JxXbaHeH/awqkd8A\n/kIQBAewSEf+JAHfEAThV9mXP73fheW9EK2NCEtdwzSPuQg9u0v++RjaggybwAlIHNlh7IkZZuVJ\n2hUXBYLUUSk3/Ozs9dAXWCXiyLLsGiLmTDMlX0MAqh4vTaeTliyzwgAXuZ8jrQXCSp4Zn4uUkiaq\n5Yg2ikzJ0xhxgcp5J0ZMQBFauKnxE+FhLnOK4n5yh58yRQIMSCvEyRAij0cpsycG2BC7cYhNEnqG\nJxZfou2WaXVL3OAoXio8ykvkxC28kkKBIJKvRd108hYP8FnjW0yVr1Pd8jNWX8TlbeIXSzhdTQQP\nCG2DVttBreEhvpxDzTYR9DJPdb1AxhOhoahEUhmqspOMEWdKfJd75Us8or5IUCrQxMkl7uF64Vma\nbScPBl5jRFhANeu4hAZDGyuczNwg6ClRdbtpCk4uOB4lXt/jTOMdNpUEV+UpNujjgY1LIJssdacY\nMFdoCC6+7fwsAiYpVhhgBQkdGQ2VOpPGEk+0sxgiuIROMwoPVXaUJBXBi08ss0OStiBjeCXSzgRv\n1s8wlz6GIUmc/cwrKK421ZCHhcwEZSPQ+ZRdFyEnoy+LaH0OKMtkb8R46cwj5DYjH3Ttf6B1/dGZ\nyerVLt6qD/DzlR9hUu3U8uD2BBTL07U+4FYnFTjwQuGA87ZL3OxKDfs5dqmcvZiSfTy7d31Yymel\nsYuHjts3CYvzttMZFp9t558Pc9d2jbX1sCgWu8yxaXstFk1kgbYTaJcdvPXnp7hWSMJdWK3mZwJs\n0zSvAfe9z6En/r5rpbqBUBEQdYPIyC7ueJXZsoP2j2XMOQnvRIlYLEPixDZLc6Pk0jHelh/AjAsE\nKHG9eooxzxxh5y7+wCh9rlWOcR0JHdFpgNMkTYISfmaaE9x76wpuX4WaR8WvlAjWizgKOhPNW1Qd\nLmoTLnJqCEXX6G9tsupIcU06iWAadAvbKGg4aeKrVYi191C8TUxFYElJMc8ozlaLrvIOg4V1miis\n0Y2bGiMsMMo8r5BGpJtFhgl4csTYYZcYbqNOb2uTQqGJGYBGyEG8nkXwGRQH/XhvVREdIJUMxBwI\neQFVqHNGf4MFhpmRJkn0btEyJTRT5phxnePiNKZLwDRg3jjCHlEqzTFiWpbHpAsMs4iuS/RIm/RU\ntwkVCxgBgbriZM+I8krjY9zfuMS51lsURS8Vl48laYhnK98j6MjTMBW6K9ssCUNc9p4m1e6IFCVF\nQ9E0BFOgKnvpau3waGGOOc8IFZeKqtTQUAgqBapKp0GwjsSSNIQ7UqElKsxrRyimo/Sq65x7+mWM\nvMRmrZ9SM0i75IBcx0+L7mRRtDbpB5PomkRlycvVkyfRyh88ceaDrOuP0rI3VObXY0gTUYytBu3t\n+nsBPcuDPVz3w04hWLytPfiG7XkrCGcBeJ3bu9HoHNAN1vn2DEi4XYli/W3d097dBQ4A2X7eYVC2\nANk6bj1nJ3ntnvj7JdjAgb7cztG/p07pdmN2xbj1QoyVkpe70e54puNU12WkI0P8qvLHCJhc8Z4k\n94Uw1X6V9gWVsc/ewEyIPD/389Q1N8KOyV/98Jf47c/+c04dv8Js/zjd8jq90gbrwT5kUaOFk9Nc\nwrGvulyjH4U2vnwZxx/pqBMtXIGODliry4hbBonCHoYoYEQFZkaOglMgmK6RjO3i8VaZN0dZYQC3\nUGOIJY6vzjCZu0X9lMSse5x3mWKJQabzp8hku/nK4Nfw+QoUCXCay/gpUsVLHZVlBikQZIQFUqyS\nJYokarwSPsd3Tn6WM+JbnK+/xvjqAmuhHjbu7eZU6QYJ9y6BdIn8uA9zG/wbVUTBpIttvFTYIUlI\nyDPACvfpF6ng5dvyZ/m89i0eNF/nChHqkSPodEDa16qAAfdIl8gORXm+71EeUN5iQR7kcvseZtan\nKHrCSJEm/2D93+F0a1R7PNwYPkK3sMWYeZPISom6uMsDR9/i06XvM2ouUIy4iJQKaLrKfGQEtfY6\n3o0tjitz/Kj7EV6PncFAJE+INgrDLFLCT1AqkAhnEDHQdJmmw0tV9rBqpFi9OEoLhdSjt9j87iCF\ndAR+3uTh6AUiepavr32VyjUfrmaDlLKKNiaRv9OL9661bdpHfez9y1M4/jcT/Y8X3pPWWbI0y8u0\nPuBWFTqJDhgfriFiAZd1rV3JoduOWVRC3TamxUVb4Gp55G46wG6vBmgvbWp1SLSSa+B2j9qiW1oc\nKEOsTcEu/7PuaWmwLeB27z9f4YA2safN28G7BjQ+0UPtH52m/Vur8Kb6/m/9R2x3vmt6K0bSabBJ\nDwYiOTGCO1zFN1Ym13LT7pNx+FsEhT0Es03L76DlF3m59hiO+QaVpIdruVNsGX2YKZGYtEsPm7ip\n08BFCT8+OhX0it4gzz3xJO54hbWlRe5HpOVRmOsbQoloVAQf254kPkcJXZT4fuApFh2DKEKbCWbR\nkFmnjwFWKEZ85I0godkc2a4E73ZP0cTJseoNenYv0NWzzp4jRI5OWrWIgYsGDVRWGGCeUYZZRMs6\neHf2JOXRAHpY5O3aORxujbZL4QfhnwO/SUTJ4j9Txi+WEVwm6m6duuRi50iCVXcvXsoEjBKbuynW\n5D5qETcPiq/RU9vmyeJL1P0qeSPM0M4ax9PfJusNk/VFyUpR2qJCBS9xs5NYZMrQ29zikdorlAJB\neiubnFyY5qr/BBWfyoQ+x+jCIgl5h0CqgLdRwSU3O5JD0iR307jf9bLTn2QrmeC4MM2cKjLTNUpc\nzHBTHuWNxln6HWt0i1v4KTHPKDoij/AiLanjGeuChLO7TV4KkTHj5HdCtPNOTD80FtROa5UdgeIv\nBnDeVyPu3sTlD+DTS4x45tmUe+700r2LTSOzpfLv/uw8T0xnOcbCe/1QrMCalTxjmeVFv1cnY/85\nqx+i3Xu2goT2WiV2L9wuybPGtgDRqj1i7zFplwlaG4pFz9g11PYA6PupVyzu2jpm32zsG5XlMdvL\nwlqv67CM0Po2kgKuv5vihT9/kN2tIrxHNN1ddscBu9b0EDd3uS4cey+5whBE1FgN58k6BEyc7hpJ\n9zraYi+S24X3qQqvvnKe1qIDbyhHNpegqgVwdZdoVFXKbT8boV4W5RG2jB6Ota9TEz1s+5JkPhXD\nS4W9xSKudgbDJXArNYSGwg5J5hnlce3HNHUn31C/QEny46BFt7DVSV3HRRUP6XiMHTlG9M08DdVD\noTtIkh0e5iec5W1uMkwThaBZoNFQ0eoO/K0sUsuJjkQLB3lClKpBFpbHEJIGaqCGXDWoOTzMe0e4\nlLiHhJjmmHSdrvFN4sYu3moNY0cmFwmyMZSkqAeRDB2fUWG3EmdL6cUbKdJsueiq7TBQ3ORF70Pk\n9RChyjSPbb3MjjfBy4mzbLm7KTu8iILBUW2O460ZNl1xglqJce0mt8JDDNVWObK3yP/e+8uIAY2H\nmq9xYu06fmeJYq8bU4W2LKMhUVdUmi0n8oLJTNc4m94kx3mXOSfshOK4xTIZLcZGu5f/i733jpLr\nvq88Py9VzrGrcw5o5EQQICkwSJRIiZIs2ZJpWR5JlsczHs94vD6za8/Zmd2zu7M+9uyxx3LQjCV7\nbCtYsqItUiQhRoAgcmw0Oofqrk7V1ZXjq/fe/tF4wgNkWeORYZOyv+fUQaPx6lXVw+/c9637u/d+\nI8omYTZp0dd5qfYoIWmLQ8o5Mo0oktjEqVTIuCKUSi7Wplto1BVUVSGzGEerStsKpyuwsLOHYpcb\np1BG6xZxCFVsa00aNscPXHs/yrW16OSlT/Uy0DrEnoE5pOQKWn275zU370yQNcHYKoezKjyshhTz\nmLsD/a15HVYX4d00hDUG1eS1zZuHVTFytyHHapyxAr1J81h/d3d2ipV7t1I0huUcVsmhWdKt99Kw\n2xA7W0kuD/LKuR5gkjtnuL956p4D9n3eN/j55jN8Wv55poUBCvho6jKyu0mnY4Ydyjg6ApPaENVP\nObAJKj3/eZ563YOhiRzwnmX3jmuoTYUvax/k86c/yon1Jxh93xU2glFkVeP4ymmueHZxNbqb9/CX\ntLLKSSNFVy5LQfZQCbq5xH5WaKWGg69L7yNdinN66Ti72i8TC66yQDc7GSPOOuvEUZHRXQLGCLT7\nlnmQkxzkPLQJnI3uJ+VqpYU1HmiewjdXwzlVQ1rWaNUaHOAE7+GvuMZukokuAk9mOeZ5nZiyznxL\nD16piCDodMpJioIXieZ2lkljjZBe4C+Hn6RpF+nQlzhaPo8gaSRdrXS1zzIojPMu/Vl2LE0hYVDs\ncdBpW6BpyMx22KmpTaI3Mzy+/DL1HoXV1jivO4+gOaHiUGiICmOuXZxzHOZ18Sh9rXNsRoPoLvBS\npinKGK0Ca7Y45517GO6bIikkuMFOutxJKoN2Cm0+XvU8wArbWSH2/Fc5PH0Zu7POQHiW3YFrdIhJ\nQCDVaGd5todx7y5uJEYpJkO0O5cYbhljfGwPy6c7Uc/JiB9q4HhHAbuvTtkI0Ig6wYCl1W5W/6AN\n3S6hDYuIdp2N59qp7ftHFP7019Z2uMoLHznK6sFh7v93v0FkIYWDOwHY5IkF7gRTk8KwHmtSKLLl\nOLgT6EzFh53bFAncvgGY8kITfEVuDw8wvwFYJ5PDbWC1uhWtjkoTmGuW96fc+nvV8jlMA5D5WeD2\nRqP5OVTLuc2b0WYiynP/6Ze4fi4Iv3mD22TNm6/uOWArcoOa6KCfGXREVmglLURxSRXa5BRuStio\ns0eokusL46XIO4XniPVkqDZd7LZfYkS6iaKryKrKidjjzNt68SmbdLPAsDSJw1uh2z7P2znBKOPU\ncJAlyEVHNy6pTJx1vBTp0RYYbMxy1naQot2LL5SlYPcQL8F7l54hFN+kEZLJ46OJTEnxkIt5KCou\nDFWkNZNGMVSchkpkKke4uEmnuorNpaFGZMo+B97pAm2kaN66tEHbFkfCbyChoTSbPFw9Sd7hISMF\nQRDwNioE1TweirTNruFLlRjtvUmxxYVo07ihDBOpZ0ik0/QE5rHbqrSpKdxjFeqKg5WBGJtEcFQb\n2IoryFMaymSTkJTDEEAJN9iy+7FJdWbp5Sz3YUgCXdICaSNCwJ5Fdwg4qSKiU5Lc1FtkspKPaXGA\nitNNES9eihQlL0vONgpOHxLbQwrs1Nl0uEiFEySUVSRHE4dUxUDAT56ItMnR0Eku5A6xMNaN21+m\n4PYwL3YTj60gjjaZt/VidIp0BpZ4R+A5Tux6J5P+HeglhV3CNfxSlsvyXrTEdkiW91gJW1f9h5L1\nvfVLA8qsXqsSllT6HzCQXLAxfudGItzmjq2KDHMKizld3ApicGfHbeZvWPltq/rDCpB3G3BMoDbf\nsTW8ybqhaKVErJ22VX5nnt88j9XwYn6DsHbg1k1R8/WtFnkNSOyC8H74xuUmq9drbCeJvHnrngN2\nWXQzISVoJYWIhqjr1MpO7M0GXqlMzeXEJVcYESe49PYj+CmyUxyj3menYPjoEJdwUSFmbHBQvYjY\nbvBs6xModpU+ZjkknUP1i7SJS3QxBwiMsZNl7Fxu9jCi3WSPfIUWeY2AVuSpxrNUqw5KihtvW551\nWvCkK3ww+XXyiodpTw8rSoKq4GJR6qTpFJkS+knXYggZkdZamkRzk/q0DXFFx1ZpwjFQRySKbQ5c\nyRLBbJ4VLUHZ60a0awwyyRX2UmwG2F2epCw5adjtiOgMNGcYqU0BAmJKRxjXecBxmk0hyFy9i1OO\nB2irrREvbBJ1p2naxG1jzEaDus3GhNFHQfCRqG3gyDew1XSaGxJVw4k9X8dbrbBDvUnaE2HKNcg5\nDnOAizzAKbxCkTrb70OmiYZERXDR8MroqoCek5hz9yLLGru0MdxSmYagoCGSYAVFU+muJknZbUy2\nJ7BRpo6CjkgVF3bqdCpJDrSdY3WzlenxEeKPzeAIVSjg43DfOQpdPooPOSkWg7Q3V3mSZ1jo7WYt\nEIeUjSPdp0jEl1gnSA0HTr1GcCiHS638Iwfs7ao9t0ptPIv/Yy1oWzWa41t38MxWp6MJaNaQKCut\nYc0bsfLKJgdsZkxb7d/wveB6Nw+tW44zfzbflwm05s3Equgwf291bsKdHDuW31nPLfK9Tse7b0x2\nAXy9IRr9caqfWaa6GOTNXvccsOvYSRMhRRtJukjWOsmcbEHfkpn1DxM/vEw0vs4qCXJhD1nBy2f5\nOAv1bmw00O0iy0I7vfl5Rq7N8c+Lf8xR73m+6X+CMWUnhaafT6b/O6pTZDw4ygqtLNNOrTHDg3/5\nBqPKBPL9KoV4gKrTRV5w8fiJE/Qxx6uPH0WUDFoCayweTpDIbzCwusBKWyvX5V28oh9nsxZGknX6\nlRlqcQV9FdSSwvTRbrwbZbonl6ECSlbFFyvhWmzQ+kyacK7AqccfYmJggL/kKVxUkWwaX4h8EFWS\n0RAQgKAjh81Ww0DAcaSKc3cV0aNjO19n15cn6dq7yunBI/xGx7+lyzZPE4mryl6iT2VoijIrQgtH\nOU3EtcFa1EA/BtmHA1z07WbIPUtXdonIqwVqB12EDm/xCC8RvWWBjbNOilaW6WCdOF6KSLqObV1n\neHGOSOrLnH7oEFJU44H8Wap+hZJjO+N6mgHknM79Vy4wnRUJIFHDgYGw/f+GyA1GmWCYcxxm0jaK\n5NGISmnirGCnTjvLNCQF0aEzJ/fSEES+zvuwO+o8FH0Fj7+C01EiR4BOkuQIkC+FGL+5B235ni/d\nt0gZzK938st//Jt8oPQFHuGzzLBNFZidsQlk9lsPkzYx6QYrIFqdklbO2gRkc1PRzZ1AaJ3NWLYc\nZ+3Yzdcwu3WTLoHbxhlrup71vf91ZR3CYJXomcBsUjsmLWRKCVXAJ8IBBb515n386ZUPMb82xnYy\nwZu77vmqXyfOdG2Q6Ylh1uU4eU+A+oYbbVmmqPtoqDLiqEF0KE3Uu0HGCHG1uZdeYRb3RpULV4+w\nf+cFlEiDlUgLM5VBJitDRPU0veV5vOkKz0y9h3q7TCHgZFIb2h4BJs6Q7/RRyTtpmS+yx3mNLbuf\n6/IorS0bBIwsPcICZVwIis5KMMECveTUIEmhlRAZHNQ4LR1loDjLw4VX8RcKCBvQrMqsjcbZ8jVQ\nRJXw2RzKagNXpoFc09BCdrJBP153nt7SPMPr0wQ8OSSHRgEfFaediuSkhIeb4jBj4ui2RDFo4ApW\nGWaCvsQ88YFNjLhB0e9i1RkjTBodkaLgJZ5Yx0kdJ1WipMkR4ATvoLetSDvLRNQtXJeriNcNbKtN\ngpECRmKJSDSDI1XHtVwjGC2Si4fYCEdxUaGNFG3CMpfce/FEK8SEDXSngF1qItg1QlMlNDHCtZE+\nvFKRdnmFiG8Tp+ylgY0zHGGGPkp4yCOzrLdTqPuZy/SjCnZaB5OMuq5/13izSYSa4KBFWCNti7Be\nTXBq/WESoWUcRo1Uup1VoRWns0I4uolXKhGQC3iDZRZTvfd66b5FyqBcNxhLNgn23oc2rBMaexal\nsH5H52vtME3wtEamWkOXrJuV388YY+W1rZGncCctYrW5m92zFXSsmmrzuVbttPmerZkfZodtjjiz\nboxajTNOy2cxs0rMLPCMJ85f7n6SE6tHGJu1blO+ueueA3aq2E5teRdLF3opO70Y3QI2pY6ETmPF\nRrYYJaanCQ5l6XPO4NJaWax3cch2AWe2wR8983M84DmJvyvP2ZH9/Hnlp5laH+bp6p9wSL2IfU3j\nF+c+RdMJPUyz0OwmLq5jt6mMPTwMMwb3Xb7EgepF5rRuXpKOs7E/hYcSITJkCJPTg3i0Cmf89zEr\n9hEky7v5Fj3iPBW7k7etv85TyW/T2LJRr9hp2iTSepRGTEZTRPq+nSS4mseWb4CiU97rJBltxSsV\naE2v8tDsGZwtVcSATkOwkZYCrNpipGjj2cYTXNAOEbRvoYoKTqo8ybdw7KjiGKkwLXSTEYK4qJI1\ngiiohIUMnSRxUMNBjShpJps7+IvqcVrlFZ4WvsCe1A2UV5uoVxXyu3y48lW6ZlMUPE6UGQ37WY3a\nqAOH3EALS3SQZJAp4uIafxH7cZohhQPdl6janSDrTAe6GHp5nmrdw8WhA7zL+DaD9mkawxLNmxJZ\ngrzCcTaIUsFFCS+baoRMPkp9ykM4tkHrzkWGuUk3i9RwMMkQVZz0MI+XEsm8k6kbO9FHReSmyo3X\n96LZZdoSSzzqfI6Ye4M2VwpjcAJKsHqvF+9bpgrAaU72HWVi/2Geri7QNVdGzpe+x51o1WPfTYGY\nMw7NyTTWTUATzuzc7oCt4VDqXcdZNdd3A7ZVC22ddG7lr61uybtlf+aNps5t56K1e9cs5zC/RZij\n01TA8LtJ9uzgC4f/DelLqzD7xt/2gv+D1T0H7OxfRamNd+P48RI4dBoZFzsPXqHc52FiYieIUEj4\nmKGfUW6wW7yGbhfJiQGEHvgP//p/x9ZS54a6k6/nP8BsepBK0suXmh/hjaFjBEa2sLWX8LprOIUq\nP2P7EzxCiVNsUWKQ51rfwTe9T/EO3/O45RIyGhc5gEyTPmaZZgBfpcT9qa8QjOWZC3Yhon932Os0\ng3TEUkx5u7mu7qKvukBPc5Ep7yBV7NTcDi789CHC9QzDjknKXx8nUCqwszjJROsIY8GdTB0YZJ/9\nMl65yATDCIqOfOuLWmEiRDrdive+Iv2eGdpIkSbKvNCLjyI1YVtrvmh0cr2+k04hyRH7Gc5xmDJu\nBAzclFnV2jFUgRWtjaSzi5HQHMqPNVl4opNPx36WRzOvcL96hrPSAfwHcwQG8rzuOYbkafJBvoKP\nAhvEOMWD7OMyXcvLdF9OkbwvQaY1yCZRvMfKiHqTB+WT9C0vYtQVbnQMsCLqKCRwUsVAvBUt4KJS\n8VLf8GCkJGp2J2lizDDAOnHSRCnhoYd5HuAUfcwS3soxfXGURVcvQlpD/x0DRnQ290c5UX6C+0dP\n0tMxQ4o2jP43V8bDm6IujVOpLXP+334I7UyI0d//6ndVFKZ6wwRwEzRLbHeipnHlbnOLWaayxARa\nkyYxp9aYx1hVKaZszrwRWDt36zFWDbfGnVy1WTp3GmNMQDYHMZjrndqFAAAgAElEQVTqE/Mc8q3P\nZj7XasGf+sg7uH74USr/9TzcfGsNc773KhGXSqR/HbVXRK3aMDZBD4M/usWga5yVzQ40zzb/6abM\nkD5NdyPJmG0HZa+TxEiKm4wwqQ5iKBBvXaVULZOa6mDDFcPdksftL+JUqtibNRLSKi6h8l1Fyqyr\njw1njHYhyR71GrvLN6g5nSTlDs5xGBGdsLRJ0emhs7lEuJJh3RnBJWzPcXtb8zVUReFFx8PINAmr\nXtabUSR7k03aWJbbyPRGcGg1rqk78XgK5D0bBOp5QuIWiq2dZLidtBrGYdSQFA2b0CCiZthRmOSw\ncB6Hv0afOEUHSZxUucR+sgSpCk7clPFSxEENj1hitHaTw/lLPOOPU7D7cFPmKnvYUOLYXVu0q1la\nWEfzGOgJAUelRpeUJBnsICUnuGLfyf3ZMxzJnEeMaVRcTrIE6dSXyBFgixD3b55juDCF111hQwri\n0iuEm1m0iIgh6vQwT9XmYEIcYFweYktcog2ZFtbYIsRKro3i2QAhf5aelkVWulupKC5yyTCFmI8W\nYZ1EbRzVJdEuL9Grz5ERwzRkG7hAtSvY4k1CxzaRuzWcvTX8oTxZIUilPkrJ5iFfCtzrpfvWq0yO\n+lSFmfF2Ii099Hx0N3xnHmFlm5u1WtbN4bzWh9X6bXam1ghVuNPwYjWsCJa/W5UY1gxqq3zPCtom\n9dG86xj43tQ/K2Bbc0Cw/Jv1363fFNQ2L+pj3SzFe5i+6aIxswrZN6fe+vvVPQfs0OEMwz83xqQy\niLYooikSG2Kc/tAkD/pe4o3x49QUG8qtjSpHs0FfKYnXW2BZSjBPLxc5wIrSyuHAGer77KQC7dQv\nOqikPJQ7/GScYWyeGoYHKrjQJZEiBpu0s27EKetuMkIYV7XGI5lTyNEmJbeHrwvv4wN8lX7nNFc6\nd3Bk9RL9G/MU2t0YMrToG/zr+u/yp8pP823pcT7Mn6OIdVJSjDhrzNDH6zyAhkS9aedU9QEedpxk\npsVJV3ORdmGRmm7jhjjKy43jaLrM+5RvUDfs1OsOBtfm8EUKHIq8QZ80CwYsC21c5AANw4Zg6MTE\nDTpYop85dgvXOFy+yP7UdW72D1OzbycOXmUPq84E/tC3OaydZ3/5CvWISLMo0LGS4l9VPs0fDH6S\nP+r9OBkxSP/4Aq0XNtjdco1TnmO8YhynT5vDLjSwG3XCyRxeoUL9sI2C24esaeyujTHuHKIoeomx\nwc34MFMMsmy0U9G38OglPOK2fd62qaJ93k7PQ9fYfegSp7vuZ2GuH3XSieZWGJGneNfmCZZbYqiC\njFCHMWMX445RxN0ajkgZbyRHYF8Ol1ImIm/Szwyns8e4mTlES3iNwsybf0f/H6Ka6w02fn2O1C+4\nWPu1R4ltPIOYq9GsqHeYYczNOj93AqR1Mou1MzU7bquEzuxsq9zO4zbB0Tyn6bq0ju6ybjzCnbI+\nuBPM704QtPLq1s9jvrZ5rHV4rwaoLoXq7hZKv/YIK//FzervL/4truqbp+45YLurJS6dOIJ+VMdQ\nRBRXky5xgT1c4YB4mfeEnmdcGuGrPMV1djEr9vPH9o/RJ00xwDQDTHOTEbYIIWCgIxKLb/CJj34a\nu6dB2hblK5Mfwhkrsd9/md35m8zaekjRym5SOIUqy0I7D+TPsL9wDaFisLM8gSZJ1J22W1NVBOKs\n4zpfQd8QqX3IwZY3SEEM4LGX2CtewkueDpK0zKaRFmD64BDBUJZHeZEaDiqKi4ZnOxb0JeERrss7\n+Wern2MHU2Rbg3zI8SVCxhajwg3+rPHTvMH9CB0G19f2UF318B9b/k/kQI2sK8gqCborS/RVligF\nHHQqizymnmD0/BTtjRWMhEBR8uGjwJN865bao40pruMLblFac+J5sYpkM2iGJIqDDh5pvEzb3Aon\nOh+mM7yE1iOx5QgTJMs+4QpJqZOcEEDUdASfwYYcZdw9gC4JiILGJddeXpKOU8LDPi5xnV1c13Yx\nW+/jQOk5dm5O8hfh93PDGKUZFvmZX/oMy2IX31z6INW4Qkd8kS7fIvPeLq4JOzjacopLjr2cyR3l\n0vxhls52UnE76H5yisxnYmRmWyjsiSDfX2NpoJ1ZuZfNswnqSS9rhxRCic17vXTf0jXzjEBtzcWx\nDxynczCM53e2eVqT1zVzpkvcBgGzs5a509xiDWaydscmyFst7NYNSnNWonU7zwRh81zm65jTcUxa\n5e4IVpN+sRpfzPdc4vaNwOqmtPLq9U/uI7VzF6//qpvUJavf8a1V9xyw29zL+J2LVEWFvKdGJe6l\nJtpoNG24pDJ7/ZcRBI1vGE+yuNFLWXdTCjlJNttI6xFkWxNZaNJGilZWuLG6i3LZw2N9J+iuLJLZ\njHLWeT9+V5YRaZyS5KYkeHBRpZ8Z6tiJCBki4ibKlgqXILwvS7ttlVbHCpogUcZNjHXW/DGkNYPY\ntzIs72+l0O2FDZG+2iJxI4NkU6mXnaw6Y5RFFxIaXoq4qKBvSmQXI9SqYVaEBKpgQ5abhI0Mw0xS\nlDy4KBMmg08oIisqBZubZlFCVyEltSIKDVYrrSyPd5FyrLAZi+Bdy9NVSRHPZ2id3MARqlPdYWdH\n8ybZqh/NKZFgBZkmSWpUHA5yhh/vXI2pwX4WW9pRW0TacyuMlm/QFAz6YgvohoDqUKiyrVapik50\nRJxilVzIR0HykFbChMnQRGZFbmWKQbYIIqGxRgtZPUSy2s1+QyAkZvBRIMQWiltF3NfEky8Q20oz\ns9BLp7zMU+6/4rRxBGwGN8QRXk09zKuFh7kh7iLs2cTlqqAaCg5fDR2ZwqUANNwIq34y0TjatA19\nTaHSrhCK/BNg/02VX4BaTsY90EauRSH2tJfYyavIS+t3TFspc9vGbnbAcCetYaUczE7ZpFCsKgyD\n29nTd1vhrfRI0/Kw0hzmJqZ547hbFmjVdVsHLJh0ign2VnNOpSNG6qE9ZOP9LM1GmXlRoJ7/n7mi\nb46654DdF59m8PgXuCbuIil0suGLs1DqxlWv0O+epdc7i45OSN/ixnQ3ZVzE4kvMZAdY1jtIh6P0\nCPMMM0GvMcf58aNMpUZQIzZaUmniq1l6Dk0R96/TwzxnAgfREenjAjt1O6KhU2KCmk9mOZvA+9Uy\nhk+g0WqjjIcyLhqGjVZSTD40hOLQ+OAv/BX8HKzF4tjHdbzrRSKNPATh1MgRXtz3EDoidexsEtne\n9Jtp48zXHqQj+hq7afBTfJ5QLI1Agz3CFZ7ncZZoJ8Im/fIMXor0CbP0t81SavNwjWF0RNIrcVJf\n7eLq7gon33s/j4+/TNvEKuKyDg6otihUYjLvXnuWycYgX3W+h7ZbpqQsIdaMAJ3aCm1qmhejx3mu\n+zEC5LgvepZD0fMc4Q0C8RJa0IbiarBqJLih72RAnCIqpPGKRZYjLcg0sdFApkkVJ3nDT12wkyfw\n3fxvT7OMVrZRtrloRAT2cxEfeSYY4iUe5r7AWX6K/85vvfDv6Kit81TiOXr2zzNn6+Zl9RGev/xu\n5pRu3A9sMbzzOo28kzPTD9H3/gl8e3OUfsuHcUJEPC8j7hagDoJTgwo0K8oPXnz/yKueg3O/rjPz\nib10f+r9HPvY/4NnZYuqpn6XVlC5rQwxU/PupiFMoNTYpj/M7tdpeZ5pAS9zW7pn5autihFzI9IE\nWlOPbe2QTSrl7g1I83ym8cYEb3PD0cz9tgGypLC5fweXPvUrzP3KApk/WvlhL+k/eN1zwD6zfpSr\nr32AxL4kicAa7UIKl7NC1gjyTPNJRqUbyEITn1Dkf4n/Z7xCkXmhjW/Of4DVRiuVgJuImIGGwKfz\nv4jU12Sk/xrPup8g1dFONJIm7/IjYDDBMEV8uCgjqxp9Z5JEchlUl4y+0yC308+3f+1RNrsjpAKt\nLAqdTNcGyJcCPJN7Hz8R+iIP9pxA/XWDtu5lAo4Mm3t8rNdD1HQHeZuPM96DTDPAA5yinxkqOPFT\nYMfQBN0fXUA7d5o4u/gcH+EXCv+VdtZY87XgEUr49AKt6hqhQoGU3s6VyC5USaKEh0vsp59ZBoLT\nvP/pL1MP2Bm3j5AfDXC4eJEH596AfiglPMwJncwF+5lkiAlGvqu2uI+zPLTcIFTJkX53gGrCRoAc\nhzhPglW2CDHNAN22RTrlJD4xz2OzL/PY/KsUDji5ERrlFY7zPr5BJ0lkmlRw4a2XGSwusNtzgyV7\nK4tCF69VHuLq5l7UWQeXywf4Df0pfGKB3VzlMb6Dig0NmXl3N8GjG7xROMTH9c/itBfIlkLMp/tZ\nibSxx3uVH3d8gW/PvYepyzswXhVYK8QR1nT0KZHRT1zlvsfP8LD9JNelHVy3j1L2ukk9036vl+6P\nTJVeyjD3c00KwU/y6PG9/KvXfptJzWBDvx23akr1TOA1O1yrdd26aWndfDSf07D8u1VlYh5jpUes\nvLhVX22lQaxZJeb7s0bB3p3FbWaMhAUYEAX+20O/yCu+g2z87CylS28tNcj3q3sO2LlcELeusZmN\n0SPPMeSZQFR0As08wVqewEqRLXsQtUtmIDLJQG2GgZUYS1ovl+0GggCbREgTY5oBYp51HPYKuiSy\n6Qth+LYH4dpoUMdOghX85ClSoiEoiOgkjFU2CLERi3Ahtg8zq3mDOFuESAsxlgQns/TRF5om/VgU\nVVMQawat9TUML2huAWEFossZRqQpOjqW8biKqMgoqERcGfoSc5xTltGa+3ij9gAPNd8gJG8hG1Xs\nwjajV8eGIBgIgkGOAAG2aGGNGGns1FGcKkd2naa24SI3FWSr089KXwvpbAj3UBl84EipyLpG2eFm\nxtZPphyljhO7cY5ZOlj1VAl3ruGRi3SzQAurVHCxQWzboFMXUGsKy7524sImfcIsp7gPFYXWW9dP\nQaWOnTJuQrU8/avzdEYWifm7yDkDqIJCCS+6JlE1HKRoY4VW/OQAtqNqK50YNZFIS5oFfw9XSu+i\nW5lBbdhYE9qo2VwYhoS65aCmOmlINrBBKe+DogFRAefuMon7ljlQO0sbi0TFNV61PchC+Z+MM/+j\n1Ziv0lhWyR3vI2Ic5iIfIDBwjoSYJD0FunanwcY00Jhd791JflZFSNPy593DAu62olgB1nqMyTk3\n7nq+NfjJmvFtNfNYbe+GDK2DYDQ7uTR7mEvGYSZWQvDqLDTN28Jbu+45YMerG3z4yOf51PgvE2zm\n6RmY5xL72aHf5Onyl1Be0Hkh8Bjprig3g/3EU6scvXiB5N5O7B1lUkIrpzlKzeagLbrA4nI/W5tR\n/mXPb+O3Z6ni5CDnaWDHQY2HeA0vRdIKjB05xqYW4P7mGyRtHUwzyDw9HOQCbspcZxdhxyYhxxa1\nkIPXhAe4wm52c41VKYGvUuT/OPX/EhlcQ+0Scb6kcXTlAjWXnbmfaKfgciOisEWItuw6x2fOcL7W\nzXKtk/WNNp6NvRPZXeUn9S+yYrSyJrYg2QfJ2MOsG3EagkI/s+xkjMOcZ4xR1khsOx3HF3GdbvDa\nTx2hNmJjYriXLmGRcDLHnvM32V2fQGgV+aPD/4yJ1QATwk7ixiIn2z9IJ0l+UfgUPcwTZhMNievs\nooiXT/KHDKQXyG6EeWHknbT3JlF7RL4hvpdBpvk3/JdbsyfbmGQImSZKWYcFsDV0DBTWHC3YnXUi\noTS1dh/dsws8KOZ4jnfyHO/8bme+mU5gbCi8Z/irNG0SS+42dEnA4a0Qty+zlurk0upBrqX30rtr\ngpaOZUojPoxFGdaBIqwNJrgh7eCyezeHty7hqtb5s+BHWB+I3+ul+6NVahNePM1ZdnBB/1P+5PGP\ncdSd5MXfhnJ1GwSdfG9sqY3bag6rCxHuDIOC26FQVhrk7p+tudSy5VymuM4EcAe3NzurbFuDHNw2\nzZjgLlqeb9hh94/B6dJRfv63P4v22reA06C/+R2M/6N1zwF7JDzOnO0xajGZRWcbJ/S3c728iwWh\nB/wC/Y/NMm4MM50ZYsPbwlhwlPP7DvNG6AjzQhcAdmpESLODm3SEUqzZWvna8k/QGlwiEUoBBmG2\nsBt1/lD7JJvJGMs3TvPvl+bpCy+SdkZZEjpYo4UqDio46WCJf8nv823exRYhHhROkqSDLcI0kZFp\nInh1bh7tJ+QL4LDX6N2dQtshsOX3UQ8p+DdKBFcLLPQ0cfrLVPskJuaGmF+6D+PbItd79hEYyDMw\nMs0Z4QhCFR7YOIc/WCLkyBLJ5mhdWoW6wNTeIdbcCcq4uc4u5kf6ICKwHEnQl55naGket6OMarex\ncCDKDW0nZ10HCMpZhlqm6WSJhjDP6jWd5Wo3U/sHGVVuECDHFWEvPczjocQ6cVYibaQ9cXDouIQK\ngmAQJIeHImDg1kr0NRaI1XOcdR8g6whCAlItLdQDEo8Lz7FKguvlvRiToJVl3FR4nOeZZIgFuvGT\npxZwkZGinKofY49whV92/hYpqY0tQuQJUNCiSF6dluFl3uZ/mUFxCl97ic/aP8FZ9/0wLzOgTBPY\nyvPZsX/Ol3xl1KjEippA84p/47r7p/prSjcwWKbJM/z+C+188+AnKf5eP49/7hsMvPQG89xpT2+y\nDZYVboOn2VHDnYl7Vp21OUvRuvFo/dmqOjFvBlZZoHWz0SwzPtXsqk2A9wjQL8LYo/fztQ+9lxdf\nnmHlYoAmz4Ke4s4e/61f9xywOzxLlCToDs2SqwY5s3SMpXIHZb+XUFuG2f4eNmpx2qor+Iw8mksk\n5WphdqqPhWoPrrYyXd4F2uyp7SnlSh3dBkm9i1zJz4YeR9Q04pV13GqFF0OPUKs58aoTlJsbLGR7\nmF7qpd6u4PRU6WUOEYMmMnHWGdYmUZE5Ip2hu7LAit5G3uWjKjopOTyM9YwwUJohXk5zoXMffimP\n215kwxHDWahjr2sEiwU8RhEtL5LWouQFHzvEMSqam61miAWhmwxh7IZKRougGQIeo0RAz2NXGzTq\nMna1QVjfwiVWyBBmIj5MOeRmYGWGlqU00bUtGu0ymUCAhbYOrrKTiubkneoJ2m3L+MQ854Q8DXWL\nrBoiaXQh600CRg63VEYVFOrYSdIJbqi6HdiooyKTJUgP88RIkyOI1yjiNOqE9QyKoVJ2ukm2tnE5\nuIuy00kvszTqdpoNhbAtTbnqZnkjynD4BptShKV6J/U1J4ZDgKDGfLaXI+JZHvN8hwscZKy5i3Q9\njstXQpHryO4matmOTy5w1P86J+VjTAsDZIsxwo4MjkqDc5NHKSpuhEAT2dtAL/1T+NP/XOWBPK9P\n+LB5e/A+NUy7fQ1nSKW5bwNlfgt5rvTd8VwmNw23O28rYN89tMBqHbdaza0qEWuYlHmDgDs7ZqtR\nxpolYp7LDah9PqrdYRauh7luP8IFz0GKEx4aNzPA2N/hNXvz1L3XYUtlusQbdHqSvLL0GM9efApd\nlmAgRb3VzlerH6BNSPEvwr9Lv7CtnuhnhvNfOcrqYifCT8LuHdeJxdJcZh+T5REqNTe7Oq+QSnXx\n+rWHoWIgLhkIOR317SLHel6lfedZLnUd4+qFA1z89n184sN/wIPDr9LKCuc5yBg7eYXj/GTjS+w2\nrpN1+hhMz6PVZMZ6h1gTW5hkCDt1BlbmCa6V+A97fomj1TN8eP0vmOoeIhMPkQis8a7FF2m7sUn1\npgPJodM/MMUjXS8zJ/YiShoN0UY7yxSdXr7Y9UH6xBmiQprx+A6GozcZak7xsPoKNdXOir2FkzzI\nFfayVknw8ROf48DWZfQWgWyrh9VEjCRdVHGyt3GNp/NfQdI1pux9fMfopWvvLC1Gik05zCvq2/Dr\nBf5v6d/zAu/gRR5lL1c4zFlGWWWVBGskEIBDnMdGgzl68MsF7FIN0QkOoUrB8PJyywO8IryNHAGG\nmGQsv48mNnYfv8jYhRDPXXkPtmM1Gm47Ut5g7sQwxpCO/XCZWtWPLBm4qBAmQ7nm4UL+EL0DM6g1\nB1OLo8xlh5j076C5W8LnyTMUneR8JUzTI6OWZYw68JKIsWhDjSiw762rpX1zlE7jcoatT5zhz+r3\nce7gYX76d5+n7Q9Oo/zOFMtsKz40trlsq1nFLBNQNcDHNvBWua21NtUgpknHlA9aZ0NaM0NM4DZf\nw5pxYuaAcOv9dAHZ93Rx/ece4lM/+wAzzxvUXzmDUbUy2z969QMBWxCEXwU+wvZVuA58jO0b3JfY\nvm4LwE8YhpH7655/ybmPOHtoCjK0aNx38HXeXniJHfZxfJs5VpxtLGg9fHHlZ2gLL+BwVCgbHqb2\nDKG3SuAFVVIolP3MJEdw+yoMBKfpVWbwRCoIGCwu9VGLOvGEi7wt+go2uc61+m5G9TxPdX+dh594\nCWe8jG4IxI11ZEGjIrjYIkRS6aCGnTeE+3hX4AV8jSJfMj5ETF/nJ8UvkiWIHoOCx0mfc4awkkY3\ndB6aP82cv5u1tijFFgeLSoK1rha6Li8Qkm5w3bmTmflhHEaVYHeWrBgktdXO/PUBzkpFOsOL7Ou/\nwLyth7pkZ0SawFcrE63k8HjLHJAv4mmU6ZhephjykDzSxnh4iEvNfVysHERyN1lVkuATGDXGkCWV\nuLDBk43nKBseTsr3E5YySJLGd3gMBZUneYZOkiRYwUuJh3mFHH4K+HmF47io0Elyu1MSAuTxc4GD\nZIQwXqFIAxthMvjJI6sqqmajoPggYlDptfNi+nHqaw7ymQDVipvj+gnul09xIvYOVpQ4f8zHWKWF\nycooatpJ0eujqShosoRWk5laHOZzr36cfK+PjDeCXpC4PHMQh1Cj3u/YRoUcIAnQqf11y+1vVT/s\n2n7LV1PHKOrUWGdhXuQr/1cU79gHCXTo9P3sDLuvX6PrmSmm61DSb8v2ZG5vSFolfKbJxuyIzVwS\n68R1gTu13Hd31KaM0OpSNACvAP0KLL57iOu7d/P8ZwdJvyyR2VBJzm1Sa2jQMCH9R7f+RsAWBKEb\n+CQwYhhGXRCELwEfBkaBE4Zh/IYgCP8r8L/denxPjWsjJFfuAwfYXHWiA6v0pObpURewqzUi3gzX\nm3t4uTDMoO8GiqPGit5GqSWI7FFxhctkcyGqFSdruQSdrnkcRpXquhuHu0pX6xwetULOH8Cu1DgW\nOcmy0M5lLUjMuMmB+AVs8Qbf4TGSRiedLFHGjY0GXSyyIUdJ0co0A9zvPItiU1minV5m2cEN5ugj\nEwhS89nYXb1Om7yMFhQYWJumXreRFNvIBbxsBfzM0Yt/apI461w0DjC32Y+sNvHHs8gOlWw9xNT6\nMI28nfVIgqHOcVTNRr3poOJ24hJqiE0DwxDoZY6d4g2CniyTiQFO9B1nU4ywWO9iSwvhNQrkFD8T\ncj8taoqIsYmNOiPlFaSGQcYI0SavUpftZAmxp3aVkeYEuguaokROD1CvOCnhZ01uZcI2TIu4Rhfb\nll0dkQY2luhgkS6cVPFsVOjQl/DH89hKDdSaTK4tgORX8bVnKa96KdU8lFQvmkPCXasSWdvCI5RZ\nlLqYqg/S9IjUBSdusURTkGg0bVAFQdHIqGFOTz5I1L2B2NQhA4u1boSgjrhLQ4xo6JsS1MDWXvuh\npu79XaztH53aIr8KZ77gAgYI9oeodgUJr+p4nRILHSHs/jTu/DT+NBhZ4w7O2lRzwJ3mFlNuZ3LW\npq7a6lzEcryVOnEBSlBA3yFSW40yI/bhXN9iNrKDS10HOW3fQ/ZqBq5OAf94TFQ/qMMusP1NxCUI\ngsb2dVwBfhV4261j/gR4he+zqDfXY8x+5xB0gbcnhy+R4ULzGEP2mxyNv0ZZdOJtFki7YvRLM8hG\ng5TeDosC7nqJ3oOTzD/bS2Y5Su1xiXmli+VUG8IFmbYdSXbsucaTvZ8hY4RJCW10y/ME2WLRUyKh\nbGAgkiHCNfaQFYJsCHHy+GlnmXfyHM/wJJtEeJQX6Wss4GuW+THv1yiKXq6wDw8lJhim3PDwi8lP\nE/OvUUkoFEadbAoB1omRI4iGxDot5FkjgBMfeRSpwXq1le9sPMF7o19lyD/JpQOHaLxoQ18UaTRt\nDGVm2JW/QWHQQdHlJO/0kxYjOKng9+aRfkzjin0vf9j4JG+3vcAD9lM8YXuWFaEVFxWGmWBnfpKC\n4WfN6CVf1tiVG+cj5S+hu0VKHjfz3jZa0+v4CiWu9u0g7Yiw2Ojmzxc/ypLRgTNQ4eHoCwzZt282\nbsooqLSRYpoBNokwRy/lNwLk6lMceP95xJSOVpApDbpxUmPUfp2ujiTzRg83cjtJFvp4If0uXjtx\nnKrooumREKMa4V1rBEMZ7P4VGrKNXFKGOQFxqAFtAlqfg0N9p3FU63zr5PvR9uoofTXs/jq1Gx7q\np9xQg8C7c2z8cGv/h17bP5q1QH4xyUu/0uD1+h4U99tofPhhnn74GYbO/keOPqOxdlJjljunlMPt\nzrvBNjViUiE2thUe5iaj2ZFbB/uaG4nmuXqBzl0i/L6d3/v8cZ4Rfw3bH76M+sUcta9Vqecu8aNM\nfXy/+hsB2zCMLUEQ/j8gyfb/wfOGYZwQBCFuGMb6rcPWge+rsbKLdRpOO1KwTrngRt1QcMdLVIJ2\nUlIrD/Eae+zXOBV6gEwySkaNUPH58fbmGbBP8YjjBM93vJtlpQt0ncZ1GXUJjKpERXWRbsZ4PvsE\nokPD68sh0yTBCq1iiZIQYJFONEPmsfLLOIw6AWWLTSWMWyrhpUAdO1JD50j+InFxnZzdT0HwkyG0\nHUZ1ayCnRy5yMbqXFvsqktDgsm0/JTxEyKAhMV0b4tnye3E004xQ4V3Cc4jtAhtqC13uRUqim0l1\nABUbyAKirGOjwWKggw1nlEW5nYCYxUOJAj6UZQ1Pqka23Y/fv8XjyvMcEs8jChpLQid+8nRXkuzK\nTBBeyeFu1BhdahDXShguDe9aicWOdiYd/VwVdjLin6THMU9DthFvbhDWssxEh0gIyxh2SEtRznOQ\nLEF2MI6CygYxNERGGGc/l2iMOCjO+PnGZ36cze4w/h2baLaKo/0AACAASURBVJJEPh0iPZ7gWP/r\nrNuiqF6Zlh0pcpMhtsbDMAckQPE2sGt1mgWF/GYYd2sB2d/APlhCq8toqzIkYb6lB9mrorWI6K+K\nyOd04h9fYzOVoH7TDa0QETI/FGD/XaztH81S0VWobEIFaVuk/fI0J+cEJlZGub7YSSmUINczSPSh\nFUY6b2yPm7teRbnWxLgBk3XI6bfchtw5T9KkRMJAlwLuYWjuUcgfcPEG9zG+uIOVVzo5tTiBf2EV\nfgcmxiAnTEOpCRURiuY4gn989YMokT7gl4ButreX/0IQhI9YjzEMwxAE4ftqZzb/7POIsbPIrjpG\ndAdFcR9K2yYb8Rz1UB6Zy4CBbqRYW+ihWAvg9zUJBTcIOuYQz1/GU1rFV7lA8aYfYxmEnI7k1ylW\n88yNl2nknUhSk6BrC1nJERU3WX89y0t0UMWBbjTZUbmGVy8ypTjIK5sYElxG5gIz6A2Z14qrKPYm\naTuclVepC1sYiFRwYquv4VSrzDhrxMQGXqPIRaGER12nvz7DlNPFgpZhvnIGz7UU4/IKXSwis0m0\nqdDamOUN6T4WmkPYK1fxLqk4tDVmv3aOMYeDHAEa1AhRw0eFImOUV5bZXBeo9epseW8iiGvMkaGI\nl0XqtLJCppplektDKriwNRqsTC7wZbefqpyAFYm1WIylsJcFBFqaQdr1Mk45S1xP49IqCEoTWWsh\n2wyybo8xJxpMUWCKGgIGaZo0mcRDiTZSyBjkbvbw0pefwPHIPMreBnXJQfXVm9xcEggOrJN0jlEQ\nC0TFDXwrXpozEao3nBgpEVGtoy8u01Bt5DIxmvE8uiKgVzxo63bYElAKTeY2VcSggS13mcYzNtRS\nk7K0jv7cEo6xBaRFjfXp6g+18H/4tX0GGL/1c/TW4++rlv7+XqoMnDzF9ZMAMi/hgIADoSETLduY\nLbjYIIC74kBWmzR1WDAkNpFwYENERkC8xU9vs9s16gTQaNc1nCroVYViwcllXMyU7aypEoZuh6QD\n/psGzAKf//v7zHfU39e1Tt96/M31gyiRg8BpwzAyAIIgfA24H1gTBKHFMIw1QRAS8P2bHeXhf0HP\nbx5ln3KZhVf7Of2Vt5G/piI/soH/6SRjvBcDgTp2jtZu0qEtE5RzdCiL9Knz7Cissc+xzjdVO19b\nfC8Nh4TDV8LrKmI4BTxKkYe0k8xs7uRGfje1rhN0u17FzYsMP51glj4W6SKoXUJFYULYiyooBIUt\nuhinjyEEAxLNGm6xhF8MkhYOoyNSxs0FDrJ1LUZ4Kccnj/0exzzTtDZXuWEL4p8pEr+Z4T8d+Tjt\nUZmP6i/z4pfg8NPdeAnTgZOWzQ0eHJ/nywP7OBnzktODjNRuMmgsEfHIvCw+SINefpJv4kCiQhs6\nIr56Dy01FzsbEyw5PJzx7vn/2XvzGEnS87zzF0dGZOR9H5VZ99ldfd/dM9PTc5FDcmYokUtRlExp\nvbbl3cVCEryAJViwgV3/syvLNrxeSytLwtqyJVGkKFLi8JrhHJyZnp6+7+q678qsvO8rIiNi/6iR\nvLCt5Rp0W2OxfkAigURWfkDgqSfy+/J934ckGSIU8X9oomvWON82PkGsn2fAXmHmK5fhr32eW8IF\nCnqMoKOC4DCxGWV+N0ypWeFnBn+bSWURp90jIg7wnZ1PcmP3YxyevEnMt4ubOAESWIi48VHHi4KO\nmzweWtS/NYb4G5+mI2r0UhJWUsRe/RK1i5/nyuAXEJIG0VCRp3kbuyeykUty/dtP0h10EHkmyzHl\nFrqtsGxM0lMUGmU/5koUEPF46yQTmxSFMLJkMKGusNqdJr+cpHhB5+TLVzmjXGFWfchrnU/wlaH3\n/v/+NzwGbZ8DDv8w6/+Q/GWtfQCaKvaaRbXs56F6iC2GkFoWQsvGNqBr+zCIIzLF3gbF++HftoAC\nFo+Q2UW16khbYJcFzNsSDbx0ui7smg29JHvfw//sfvmjdq3/l//oqz/IsOeBvy8IgsZeZc3zwDX2\nrvzPAv/7h89f/4s+oB9W0CWFha2DFOcS2PcEjB2FkakNXuKr3OE4ZYIEqVBz+pEwcdFijoMsSdNc\n06oU1SCCYjKVnGPbTlMXfDR7EjE5y7C6QUgqcdp3lSE2WaxM8Wr30xj9Huv2k9iCgJMusqSTrO4S\n3y5iqwJVv5+16ChuoYUg2NxwnGSMVTw0iZMjrWfo6i7e6z9N2rvF6bEbONUuYhe87Q7eYAMjKLM9\nniTrTqCKXRShR7q9w9lyGUkzEXo2/nIDf7VB3fCTlZLYkoDtsGniYonzrDNCEzfLTCBiUrf9lKww\nbkeLlLJDveOnL8l0cXKDU0ywzAt8jw5O1o1RXm98go97v8kh6QGa1WOdBPeMoxSKCT4ZeJVBxwZL\nTFKSQlgOiabgZk0YxUbggPGIiF6m2fMSsGvoi06W7h7k6JO3UJMd6nipECRIlQglujiRJ/tM/PIK\n1ZkIxpgTxdejGOxgpkx6YQlbd2BuxrndOsNs+B5HYnfJPJGm4fMQ07JMs0CmluZmOYQ7XmfEtUZo\n4A62LOB2NYkFMlzVz2IhcUS5i/9jdZaPTrPmnKAaCFAOBukjQeuHPr/8obX9o4kN/S40u+jNveON\nGr5/7z3OD58r/Lu8Gdh795/lwLjAlvaudov/122x/eFjn/8YP+gM+64gCL8L3GDvhP8W8C/Zu2V+\nWRCEv8GHpU9/0WeYkkS9GKSYG6BbdyEINlqkzYB/myP9e/QlB7tCgh4qt83jbJMGCVa2BijWw0iy\nSsCs4RZahFwFiuUo+aqHLgKjY6sMezdQ0Il7dkkJ27x/4yluqKeR2zvEjacZYIex7hodl4twZ4lD\nmQXwwG3xKN+PPslp8wZOu8v78nmSZIlSwEeNif4K/Y4TuyWRCmxzynsFZ62H3nNSswN0LSfb/jTr\njhF2qwm0bpvF0BT+1jUOlLepRX24Oy30qsrD3Vnm2gfYJcEoa1T6YYp6jLvdo1iagFPo8sHuOVze\nNoRg1RrDKXbJikl0l0K6v0OgU+emchJV1HGYfXKSn0I/Sr0ZpKV4aMkeOoabshmmZIRplPyEnBVG\nfOs46SGaJrZhY9oyeaJ00Thp3SQsF/F5agiSRTEfZ/72LMNH1nCFHex2k8haH7ejSYQiS/UpjKjK\n5P+8QlZoo6MQJ8f9UIFOsoLq7NFcC1JaTlAqJ/AfqZI+sonb08BERC30kXULve6k1gwxGNxg1L9C\n3JlDE9uEhDJxcrQVNx00DvAI1/kWdg8aJR81wc9Sf5IRaZ2Au/xDCf8/h7b3+Yvofvj40ane+C/F\nD6zDtm37V4Ff/fdeLrP3jeQHon/PSeegh5kzD6h8JszmyTEmovNshlL8/fo/5PPeLzPqWOMdLlJq\nh9FR0LwdNn+jQfn1HkLkIFJVQFQsOAbdmgZdAQZB+pSFY9jASZe7HONm/RS7X05guhUERSHYrNLs\n+Hlt8SVWD0+wEpmgfPZNbEnkoeMg88IMrzS/xbS1SNEfYVjcwE2LTYaQnRaWKdMtunioHSZcL/A/\nfe9foqcdvHX6SXyOGne2TvCle1+k8kEA11SD7k87eaH3DTYMH9/1PMtp13U2V0b51df/Ho1xjQMz\n9/l5/g9+v/IzvLrzY7RXXIRn87gcDQr/aIAjl+5w6CfvEJQrf555KGIxVltnNrfA7lCCmKNAoNVm\n0eMhqWX4+eSv8e32i9w0T+B1+egqMyhyD9dYnRXnCDYWcXYpriRgU8QVbqOpbSpCgCuO89Tibg6H\nb7KgTtE66iE+sk0lEmCzOMzi/EE+f/jfMhWdp0iEy9cuUtFDnHjhGj3Hv5vd0lcbtJUFHqwfo/09\nD1wGdLgtn2A1PEzhHyfpKypbR/qsbM5gTgp4Pl7hrOsKuqHwJ51Pc871ARFHkUG2+DRfR0fFRYsN\nhpEdBuej7/CoOUupGkMO9nlJ/Aa/9Z+u9/+s2t5nn//SPPZOx+hwnvOj32MitEAj4mUnOkjIX2Rt\nd4y526fIHU2AW2C+cojKVhSHU6d3RKUb89KdCUHKAyvS3u6qCDRBcfcIH8nTElzcun+W5WiN3WKC\n7FqSqcOPiMfylFdv4FfDrBfHKGci7E7GueU8yXZpGFsVaHs0RMVEV2RalkZb0MgRw7QkbhvHacg+\nQs4KidAOYVeBtL1DJFRi2TfGvDJNlAKbK8NkvpfCN1bB9Mms3JgmJh4hFI7zUJohLW2RU2LMOWbR\nxBrZtQG+9eorrBwdRxtpMdhfZ8S/iiL1uHLBg3u0wQAZBoUtbvZP8qh/gLSyTVTN0wxobIspNoUh\n3Gqbu9IhsnoSo6axZE9hqgIpyY1PbJMWtul4NEpCiFo1QPVhiMa9AD69jtQ3CVHGTxVBhA1hmAxJ\n6vgQvDaat0ORMIZLIZgsoTn3tqdNPFSCARp9D7LY5xwfEKWAhya64SNXG6BbdKENtPF/vELUzhOc\nKSGoFqVEko6qIcUNXL4m6aFNRnzLeKQmG+YwVTFAQ/CwrE+x0pgh5sniV6s4MGjgxRAdtEQ3orOP\n2+wgCBbqD1WFvc8+/3Xy2A175MwqF08uE6SCYuv0NYmiEKVV96KsmWQmUzQFHys7M7g2WriDNVS7\nh+PiMOLBBFZU2tusLrB3/OUEZbBH/OMZyrsRNldH8Yt19FUFZb3H6c9+wIHUQ+7//hw19znMnoxd\nhn5OYbU+wXubz+GI6sTiWWZ899jREtRMD6vdcRoOL21L4271GG3BzbiySiyS4YD0iEPGA9TZLiU1\nxLI5TlvUqOSCCA8tPD9Ww/AoFG8muOs4Qit0EqstklWTNH0epFkDU5RZmpvm4ZeOE4/uMHpxkamh\nBSZZAktk8bNTyHofqyQR9RcQWxa1eoBYLI/qabPhSbPeH2KHNBvuQQpEqbZCNCtBOl6ZhJRBpUuC\nXUJCmb4ks8YoK81hqrdj2BURX6xGVQgw0l0jbuToupy0Wy4WajMMxrfwSTVk+nRxEghUOOK/S5AS\nHdNJTk9gjEpIoo4lCpzgFiOsc5/D1Pt+su0UqtkjcLpIfGSHMWONASmD3RNYePowLdWNa7hOKrTB\nKeUaZ7jKDmlsBBLqLoII8+2DXM4/w1H5OuPqIgGqiIZNwKqxqowS0CoMsIObNrqp/gDl7bPPXz0e\nu2FPeea5xU/ipsV58wpP9t/jtnKCnZE1DoVvIwUN2nUNsW9x5MQt4uEMPVHBP1WiHXTSXA9im+Je\nW4MEaGCMOigoYdTxLsdTV/mc849YS4xy5+RRUpFtMqS4jpsgUQTdxi6J5L80gB0C4aBNPLTDQHQL\nj9DiDZ6n1IiSXRoiObSF5DBoPQgyt3GcLWUM70sVkoEsXVmlHtFY7I5zo3qaH/d9Dc9wA+tJicLa\nALZfwB4UaW54WalMUFuMMDy9hTLUJfTFHNU3w4hVi6lfm8M3UcVPDROJIhHaTS+5u2k2FyZ41DnM\n8OeW2SkM0n3kY+XSBN5YAwcGh6X7SFiUCHOUuyTcOZxDPS5L52nIXkxBwksDNy00OrTRyIdjKC82\nUdCx3Cbf9H+S6GKJAxsr/M75z3J19wKORZi9MMeIcxUXbWr4GbNWedZ8E03s8E7tEv/nxmeQ010i\nvhw9QaVAlCAVIhSJOl0og7cJxis0nW6qvSDvrz2NJ1jHGWxRC/kJu4sMhlbxynXi7HKEe4yzyriw\nwoxjng1hmJIZgzZk+wkEDAbZ5r/JfJ3J7jL3xmZoOjxodJlhnuHazuOW7j77fOR47IZtOyBPFIsE\nPqGOT6qzLIzTdLsJuMtEyRPTCiSSOdzROrW8n+WvT2M8paAEewgy2F6Qhw1c0Sa9pobgspFFExMH\nPdGFrOqYeYn6TpC6x8+uEidrabSNFHbIJn1ineLbcToLLoSSTXQkT2I0i5MuC+sHyVWTuL1NUC1s\nWcAbqzFkbzIlLTLoWNubKy2UqCk+sG3CQolNcZBMNAWHbeSAjsffwBeoIeV2mVDuI4REnEqHcj9I\nt+HCMJxYrj61cR8efx0VHRWdIFW0po55U6ZUjFJTAtRe9dF1a/RllTcuf5zN8WFCR4psCMPEjALP\n9t4h5Czgl6t4XE0ETEqEybJDo3GO5c4MqtWj43PjqzUovxvFCKrUw0Hq7wdZck5xJH4ft6OB31tF\nS7aIqAUUdKr4GWKLkFBmXRhlpzXIdf0MPZ+Di9objMortHDTwk2GAQwcuKQWPtc6ZVeYJBnG9RUW\nvQdoqxo9WUWLNxEkA9MSOW9dYZJl8mKcNi6qQgDDUjh+5x6H2484l7xGRo3RwI2Bg4hc4rD0kFC7\nxKJrnIojAIDk+KsxkH6fff5TeOyGXRSjtG03TcHNDekkW2KamhFER8Eh63jNFgeccwyPrPMeT/HO\n2jOs/PY0scQOnidaVH02BEGWDXzHy3RWPVATCIpl8vUB1isTXJfOsrIwycr1KSYGF2n5NEy7QV6P\nEkxWGE0uYhdE6u8FcNw0GHppkwF26KBhrjlwtA1mXniAW2liIaEe7nDx8Dtc4vuMsoqNQAsPFYIE\n1CrH1Vvc4iQ7vjS+iTruZJWob5dBdRP76grP+yuE/BUWjSnWt0ap3Iti+UUIOFgvjeOUukT8RUTJ\nIi1sI/dMwlsl2gE3Zkyi8M0k9ikBnrd57Uuf5Hb5BANH1uih8mnjm/wPjd9iU05Qk71YiEyzQNty\nYRs55qqDvFV5DrMjMzt8B3+uiv0VB1ZKxBwWEe7b5D8eZ+fpOLPaA/LuGLmBKJLQJ0+UTYY4zANa\ngptvSC9zrfUEXUFjdHyB53idEda5yUk6aKwxSgcNq7+E1uqyKo6TlnY4yU1cgTab8iBFIYoS6dHp\naEgNixfc38OpdHhbuMSukdgzbMHBSze/y0nzJuasxavqp7jKGTKk6AclDE0h2q2w4rCpOgJImARd\nFSD7uOW7zz4fKR67YWesJM3+AHE5hy6oLBgz5B8N0JNUxKTOUvkgz2pv8rfSv45Gh/CxPFP/5AEn\nxm/SE538sTqI2ZTQcyrF3SRT048YOb6KpBl0il7Wykleb3ySjseF+axMPhBjWFjjqHiHrPIMFSFI\nVkxy4sVrjJ5dI9XZITW+jY6DBaaJHN3FZdY5ID/6sCmlhp8aBaK8w0Uu88SHEV57haIODNJsUyXI\ncGADTdR57+7TbPlG6Z50MmX3aeHmA86xsDnLVnUY65CJ6mkhdqDz0MNWeYz2kJdSMsxB+SFHE3d5\n5ef+iJycoNiP8Z5wicagGzneQ590ISX6+KlzlLuMq4vcCh1CdXRYYZxv8DICNo2qn3vrCyj2IOFI\njuJqAtG0kEd0pF/qcsx3hxP+WygNnQtrH3D4jx9y/cVjxGM5nub7rAmjCFiMsUqMPNukWGeEvh+G\nWeYTfJt3eIq3uMQIG5QI00UlQJXV7Qkq332RiifIG7EXuSFfoHndTXdIxXO0zkv+P+FU6zYTxTUS\n2hYlKUTQrPDao0/iV2p8YebfILyoky9EGLidQzvQYyyxxgXeJ6PG+XXH36Rlu+lIKhYiWZIkO3n2\nftjYZ58fHR67YeeaCbrbMZyJHn1bplKKUFsMYVgyckPH49+m41dZZ2SvaSWU4/5ZixAllF6f8dAi\nrWE3hseBIThIxbaJK1kWbx2gkfOjtxQyWhq8oIa67EoJXDQxBYm4nMNLA5fQZii1zmBqgwhF6njp\noRKmRDq0RYnwn895jvRKzJUOse4dJuNIUs8GCFEhQgE5b2IKIl2Pk92BGLLDxEOblGebiNuBTA8T\nma3eENfr58hVUjQNDwRMkuEMAaNKp+Kl4g/SUlzsCnHucwSvs8GF8cvsignW9VGSF7KseYZZCY6R\nnR3ECoKBgw4aJSnMqjRCG40iEfzUqBAk146zWezie5TAG6oxHl4g5tpFcFoIQzAQyHAiuBeNNtNc\nIFCsU7ZDKOhM9pa4cfssgs9idHadHiouOswKD2jLLly0iJPj+61n2GyPUOgsUvP4kN0608oCfaVF\n3ytj2CpZI022ZMHrOqEny8RO7pIQdgkoFRwenbIcoi/IpIQMiksnJJY5pd+mNuClK6qIO2D3RWr4\nqeJnWZqkJvlJkkXCRPpw4OZ96TB79YP77POjw2M37Gbdj7SiUPEH6Rku6jthxKyF3LZwtGxOPn+d\ndGyDBxximgVClKnhp4mHpJrhaOwGtYifhu2lJbqJCDnYFHj42jGqRgBHSKcfcewNWBclcu0EbcUJ\n1gOO2TUmhCX81HGgU8NPCzd3OYpMn/P2FeJ2jo6gMS/McJKbdDsa//fqz9FLS8hundKDBIIAMn3M\nGxJ9wUE/LeJ8qoHlkVC6Nj9++MvEXFlq+Fky3czXZlnZmdmrFxeAtki6m2EisED/gsSaMErWGqDb\n1/iAc5iCxN81/hEuuUPPqfL5Q1/iqn2G3+t/kfKBELogU26HuKqcpSIFEAWL2xwnRJmX+QZXOEfe\nSCB0LGrXQmiJDke+cBm3p0m5HkUoyTgUE3ewhZ8axKBsBNmShnCZTVLNHbrfdNMfkejOOskTI0GW\nV/jTvexJVAwcdGsetndHWS9MIA7qJAa2STu28Q5UCT21gL6r0jY8mHkb60Gb5MF1DgTmMJGY88/w\nwHeQmJAnzTZRKc/w5AopfZdYq4zhdCCINrZfQFdUFpjmLZ7BgcEEy0yzQJ+9jk8nHa5op4H/63HL\nd599PlI8dsN+LvwaJ45u4PK0uGsf5cr0BVKxHbqmk7IaYiY6x1Hu4KPOmzxLliQv8w3yxMgwgEqP\n7dwI2W4SOdHDozYIRmuEPpdj1F5E63W5vXiajl9FTvTovOOh53NBKcn1wjlG3KvMeObZIk2cve3/\nB5xj2ZhgvjVDUw8Qlks8HXiDVXGMntvJywe/yvXGWZaq06SObXBJeZvj3GZtcpTL7Se5zxFORq9j\naA4yVopldYwtBuj1VdbWO/QXDiGPdDBzKnZbAgnm3j9K3h0ndjFDWt0mXinw9rUXGJ+4wYWJyzQV\nN1khwSJTLDLFfGOWB+XjtHp+eAQ7DzSkl3sIkzYeV4sEu3hpcI8j7JKkG1YQJw3sM32qjgDXemcZ\nUdZwudokJzaYd07ym/xtNDrQd9Au+9i4kmZ6Yo6j47eI/nQWl6tNjNyHg5+iNPBxzvEBPhoMscmx\n0A3aDpVHroNIfgOno4tLaBOgyrhyh+nYIgv2FMvyJNWf85M9MML9vo1LanPevMKYucbvOX6Kt8VL\nxMmxxiglOcJvuv4Gz66/zUh/ncpBN35PmTFW2WCYk9xkhHVauPDQxETibS4R4ofrdNxnn/8aeeyG\nrTtUdJfCAekhFSnAQ/UgiWCGSjVIvhCjYgXZIcUucW4ZJ9BReM7xBstMsNkZxlXo0TI8uJU2MWGH\ndt1L0wgQGiswIGdwtnpk9BSFQpTuHRWjrWK7BbAUZMFNVQyQtZOs1iYpNuL42m22zBF2lEF0v4Sl\nq1j23qCnBX0apW/wt5TfwVJkdElhOj5H0rGN3pVp11zIfoOgp4RZdeDptxgNLZPNpGkZHgQFnPZl\nhtwPIWAy1z9KoZUAA0qbEbpOBesJizTbJMRdpp2P8Mk1suUBtt8dZtU9ztLQJJWEn3x7gFIjtjf7\npgbGhoLw3T47mxbirMCgc4uYJ0fAV6aLE7erRTy6S3e6SL3rJ9NMQ18k5Crh8PXI21F2+kkGpW1y\nriTZUJqIWSIrJjE6p6hshuh6NNZCk/i0BoJss02aSXGREBXq+JhwLtKSXKzLQ/iUGmllmwF2aFIm\nJubJuAYQTBMx0kd7TmfAv8sQmxSIUhCipIVt1hmhgRcXbTQ6mKLIkjLGlGOJlqKxEJogJ8QpEMVH\njQhFwpSwEYhSpIafbQZpN70/UHv77PNXjcdu2O/0nuZe6SV+If5r6JKCgI0NdHY87H4wxPsvPMFN\n93GKdpRCO0qSLEV/hBZuStUoC7eSjB9eYDZ1h0PCA97a+BhL1UnOHn4Xj9zEdgsMnlpF/x0HtS+P\nwy/aSId1pO0uyeAOqqPHljlEcSvB+to093dOYXcFpMEe6nNNepZAQQrxhvU8hXaEw805Thl36YQ0\nZH+HQzzkA/sc/7r+18m/mSIymSN+JsO9a8eZiixwzv0e67dnyDaG0ZJtno3f4wsnbqPbCr8h/QIF\nO/HnoXWGoFA2QhSsKJFggU8886csMM2Xbv4US790kO6QC+EzJuKlHjhFJPvDGKwYMGFjfUmmFEtQ\n+ukEdxJnmBl+yCd8f4KESVQu0FeXqMVWWa5P0dnys22PUvTESQ5v0OsrOPp9plyLCGGLqtvHQf8d\nylaId9YuYvyqB2tE5t4vtxgYyOCXy5QIE8eHgUKOOCe4hSDbvOW7xIi4zqzwkAmWKVAB4Kp1jqye\noC/IBKYKPCN9j/Nc4bf5m3wgnaMnqdTxEabEQeYIUqGHilPoMjc2xRaDfJNP7U0rpM4oq2RJ/nmY\nQpptFHQELK4Wzj9u6e6zz0eOx27YSXWbscht7jkOodHhCS4zxiqNwYeMutbwROps1od5sHuS3m0V\nvAWUF3Vk0SAczDN+epl8OcGNGxdYUmZx+HocnrzFAXWOLAk2GMZJD3VWh5cBl4DPquFR88xKD7ER\nyFgp5JpJxJ1j6mNz1E0/AVeFo+5bvNF8kaXCNNk7Q4TH8nR9Kr9Q+Gd0NRnR30PGZD07Tmk5Tt9y\nUOmHaHdUuqMO1sxRmltezIM2Z5V3OOW8SW6rzQJHWGaCXRJ7V9gDHIH+gkTjf3RR/mKQtRfHuMcR\nqgSoEMBEwjVTx/+xMuFogbSUIRHKoaPgj9XwpJp8tfuTrPbGQQIhaFD1e7jDMSpmkFbXS61eZULv\n8aznDXzDTe6aR6nIAU5It5gvHWSlOsW7/ks0dS9mX6Pu8aMqPSYGlun+A42qHqXaCPPN4isM91dJ\n+zfIkSBKgSPco42LvBAlJJbwCzUMHMxxkGUUNqtn2L2bJpAqczh9jx+vfgPJabDqHsVJl0mWeJL3\n0Ogwzwxv8gyjrGMiscA0CjoVghjIpMiQJEuMHBGK2XCwSwAAGj9JREFUNPHwh/wEI2wQpMIM87Sd\nAeYft3j32ecjxuM3bDnLYdddmngJU2KUNYbYpOQL0/WpCNhksmma637IgyTYeGiSJAuSQN+l0tz1\nsbsaI7PkJn0+j+9YjVxhgM2NNJv5NMFIE0N1oD3ZpCeqoAtYDZnmkh/ZY6DEdQTVwu+pcmD8ASYy\nYUrM8pA7u2d5tKbSsFSSI9v0NYnXtWcZlVeY4SHCn83jlYEgdHQXnTUnNMHSREyXSGigREAtY/Vs\ndmtJ1MwESlJnJL6K3RPYejBCYKJMcLxA6OouVtXBdnEIIWgSkYrEg3mkjwm0T2lIYZOAq4ZrrQWr\nIMzY+GNVhkPrJJ/fprAZodH2I6p9moKbpcwMzaoH2xYRLAdhocS0Mk9UKZDtx2jZThRBJy3tYMkO\nykIAWeqjCRUqRhBNbuP2tRh9eo2d0iCVbJCMMICbOuMsYuCgSoAt0hgotPCQFLKk2Mb94XCmrYaO\nsX2Qju4iLW4Ql3eRMTA+rOsIUsaBQcUM0Sr56Do0+kEZhR7VbojFxgFoga2CO9lCsGxadQ+72w56\nfjdNn5vrzjOsd8dJWRl8vgpJ986+Ye/zI8djN+w4eY7SwEkXjQ5uWkQpUCVAhgFctOi2nLANpEEZ\n0QkLJY7SQWwJfHX1C3T7GlTq8C9W2CkPkFEvcaX9NPbvtrBf19m6OInvp2oEX85RqkSo7AaorA2R\n/fonSExuM/Zji5CycUodEuwyzCZeGhg44KENG8BTYLsFBM1CG20wLi1yhmsEqVBOhlj2jZN3pNA3\nnHBFgmUYOr/JufPvURJCrLQneK3wcaz5ryLfSPJ3Xvnf2Dw+yPu1p/jSP/kZxv7uEqc/eYXTz1/j\nSw9+hgdzR3jm9Hd5RnuT8GiJP/inP8n17Qvk1waIThW4860hNn5jHH4FDl26w7nBdwmez5PSNpj/\nzmHEvkmv5mRnPow9B4lYhrh3mUGth4vWn99o2rhYYpJTkZuci1zmA85hoGCaEnfrR7CECGnPNh/j\nNfzuGnMDM8Q8u4SVAiIWXhrskOKrfIaT3GKADCNscIBHmEjc5RiF7TrtuSHcz1fxBOqUxBD/MPTL\nnBeu8BTv0sbFNmnu6sf44N5FhgNrfOrU13HSZac2zPz8EViDWDTLgU/eYd0Y5f7aUXpf8cEREGZN\nhHiPXC7Fij7D0OwyR313Hrd099nnI8djN2wvdVREKgQpEcaBwQ4pRCwu2u/wtcrneGAcgzQwD2U9\nxLWjZwgIVTyuOs+PfJu72ZNs9uPQj2F/x4m9Y8K0jPt8H+3lBkbcwmw6qP5eDMPphLAELrBWRCqX\nNRa/E6L1GQXHiT4eWjxklhLhvbit9eG9sfUG5KwUhqwyFlghkxnkDytfRAn1kIIGCTVLK+3GKgdR\nRYNzn3oP53SLOeEALdz0FYmp8AK5ySI7Uyf4p5u/RGvNRbPuYeCXNqgfcXPVPsuSNclia4ZeQ6Fg\nRakSQLJMlluTFI0oPVNlIz/OwbMPeXHoW4SOVOiGFLJmnPXtCbLNQRgSMGsqomQiT7UxsyoNwYvV\nH2DePEBNChCkQlLK4rANCkKU642z9Jt7M0Di3gxD7lU+6f4Wa9YouW6cmJIn4ijScrm51zxOXk6S\n9GUwkKn0QpRrCW7Nn2W+3AZVwHlYJ5rOIdPnQvIyP3b6FoKnz5xwkAwD/ITwFY5wlxgFlpgkYw+w\nKQ8TPFggouRom27e37nI/JtDCF9Z4cAX8wwdzRMW8mz3BunJTswpEe9EDU+6hqq1qDyMYxVktMk2\nhvOxS3effT5yPHbV+6kh4SXDAIVKjG7ZheUXOOB+xHH1FqVehGwpuRfU2oKqHuR2+RTj3kWSaoaZ\n8EM2l0fY0geQL7qx1h2Y8zZoIEZFpKCMKdj0sgr6ioY23UIbbNP3lOmYXcyqSE+SsSoCzU0vq+uT\nPArPkFH3mlpqzRCS1EdVO7TbbtiB6G6OTH2QXH8At7fOuLVEiDwO20AQbGR3n9SxLWpRH2udcYJK\nCUfXgLJIJFBAihm8sfoxeAQ+f4X051ZpSy62jEEWetP4tBYRCmT7SR70D+Fv1di6M4ylCvgDVerd\nIPaYQPLcNoNskSPOuj5MMRej1gpCGKyeA4ep40sXqccie12NtT65dpIqQcLuIi6zg2RZiIpNwQrT\nNP0o6LisNmGhxLC6SbPrYa03Sk32Myhv8ZTwLnIbWpYbwbbZrQ6w2x1AxKbe81MphGlXPIwPLKGn\nZXQUvL42Q8O7+MUaK9Y4VctPStxGEiw2GKaBj3IjTLY+wHBknT4SS6VpMu0UfUskIW8wMbROKNWj\navqRBBPN36F7QOTA4APGgouIWNx3n6DZ9HLWuIHelx63dPfZ5yPHYzfsEBUEUqwwzs3Fs2y8OwHH\n4dmp10ilt9CdAsKSgf2PVPhFqE8GmF84gjrZwxVr46EFj0Du2Hj/mU7nLZXOOwrI0PxDP60lH3YM\nOCLgeFIn8dw2IwOrtOYesj5ewjwtMPS5Git3+6y+PsnWlWHMpySshIRdE7B9AtorLeKf3aaUjdOY\nC3L7+hmsoxKuM00mBuaJq1loihiLLoy6ihHts+kYpNoOUatGOB29TmPLxweXn+JE+7dJ9ueYax2H\nLpiaRBcNRdDR6FDr+Tk8dYeoWOBbzU+xK8VRCzq134swdHGd+Gcz3M+dZF6YoYnKCOu4aWHZAjSF\nvSCPDxOZ3I42Q64t1gZcBM0KE+0HZAuf4FHvKJ6xMt2WhtrXGQ8vMuhbR/X2iFEgJJTw0qCLk5bl\npmF4ece+yBNc5qx4lbPBq2RI8YF1jhsLF8gKSRKnN3GF23SSXla/NsVCf4oCATq4WOACWzzBU7zL\nbf0Yq/0xrrrOkhdirDPCMJt0Nj20HgbpXcqxbEyTXxngyQNvcfin8jQ/6yLlqlCwYrzTe5qIs0gq\nuUkmMMDLzq/zIt+mQog/OKFT6Mb5+fav853uC49buvvs85HjsRv2TU5gMkOeGC3DTbfhhDrcu36M\n7qtO8s8kUEZ19BcUgkeKEIPKdoSNy+PUHCHmpppsp4ewU2AFROwRAanfRxtqYAgqvS0XBIAEWCmR\nhtPDWm+MdnOchhLAut9j60GQzrQD0y1hTTg5ePgeykiXTX2I5o0AOgqlXgTCFs6JJt2cGxsRuyxg\npGQsQURs2NhvCyAK6KMqC187hDEiYR0zWZVGiMULvHj+G2gfrBPs5GAXqIPq6RG18+QWBqjUYpgx\nJzvONPWGn+6bHswBCalv0d92UHwnRltw0zuo0uspZKrD+FINVFePoFzmuenvsqOnWVIm8dBgRFvj\nuHCDd0cNMnfCzP+bAZpmmKGTG/y3wm+x6hqjYXk5L77PjpBiUZhig0GClJn68AfFnqJiiwJ1yccb\nnRe43T7NAe8DDEVmUZzEGBGQLJ2G4cHlaCPHdDgDRX+ERHebn1F/ly8LFj5hglkeIDpMrJ7MrQdn\nscIgxi0WiwcpE0YdbXPB+R6S22JuYpa+TyQhFXhBfIslYZSm4EFT2njEBi6hg9dVxxRFHnGQBxzi\nkXGAnunkffcZHEr3cUt3n30+cjx2w76XP4bVO4ThcODAgA9T67dzQ+ysD6LN1hEDwDGQNR16gAXF\nezGKegw0oA0OVw+wkQd0RKeNI6xjTjpg3ASxgxgUEIZEuqpKs+KjXUyB3w1Zgc7dKARV1Nku3nSd\n0UPLKOkuDVz0aw46NTd9U8ETquFR67QaBt2ehoiJgE2r6MFYVulnZYLJMj53jdyDJIYl4pxsInos\nfKEaI6E12nfruIw21MAR0AnEKowJaxSLA1CVmIov0dVdFEpxjHUnZknG0IE81LJBao0gRG1wC9Sa\nIYpqHC3awaW1GEmtIOs6W50Ug64Nhhxr+KkxEl2h6RC4t5LCvhdiMFwmnc7g99YwZJkDPKKaCVIt\nh1jzTZAI5tC9Ci7apOQdWrKb+xxm0xrikX6YHSOJ2O9T7oRp111YFYH2wwBuuYHm7TA2u4xfK3Gi\nfZsfL/8pN3uzuIV1plhCkKAgxrnWGkByG7isDpneMA23B0+4gSoYeJU66dQGDTwouk7IrNAyD1Ft\nBhEyIv2kA7PfQF3YZtk1yFZkmJWBMTJWCoets+gcJy1tP27p7rPPR47Hbtjbl4fofu48T0bepKe4\nWBOn4FXABHtSoFP17pV0FQVKlxMQAjshQJU989aBPwaxZ+E80kMabtFXVCqvRTEsBU724I/WkM8o\naJMBFK2LvSbtVX6MA0MaRFSIioQGdjh08jaa2vpwJkUX98kaqtXG56zjkRooTh3jzC65bgLDkgmq\nZXa/n2bt7UmMWYUnTn2f05Mf8BV+iq36EPIdkRfPvwaaxftcIMm7yIIGEnierZIaW+eofIfl2AE0\nf5f/PvHP+Xrus7xVeQFzTITb7CXq7AAdwAB2BQiCUVNYdsxQM/3URz20cZOtptlZG2VyaolqMMgf\n81lOcYNDUys8eCWIWXUz97VZ/s7gP+fzo/+WU/6rXOc0b73+PB+8+STGKQfXn7RoHXdzlqtYiPSR\niZHD7WrRUt2sd0ap5MMYay6s74rYNwXsVYGtfpTpZx/yhX/xdc66rzGbeUT87QreYpMIeVR6OOmQ\ncGe5eOINstIAGSlJMFVA0HWaHQ+/V/nZvci16BqHeEDV4eNXfP+ATWOI/FySxr8OUf3pIGJjm94v\nlrk7eZHAxwKM/ncLeL11PHaTmJhHR3nc0t1nn48cj92wxWELBJNHrx2idjmEfL9P8vktHKM9uhGN\nciiGLYP3+SpxMYfgtMn5YhiqQq/mpOvwYNcE+lsOGq8FUc+3sdttzO/OY4cTkAzDcBzTluguqRgJ\nFcsrIo91Cb+whdF2Um5EkBI6gXSJSfcix/p3afbddGSNhLaLizYRocgYq9iCwNvOSwzKm8TtHGGx\nzLWJc+SVGEPRTfzJMplAEvV4C/dSk+6mxrtbz2D1BTadg4j9ASw9CRVQ5B5VIcR3d15i2xrCdEh8\ns/4KbafG1MhDunEnpXaU+mZwL7d7BrgIRIE62NsChqRgR0VEw2b+4SF0U2EkvUzFGaCBG4B788ep\nZsNY6j04LRJwVjgVu8qWnWajlcbUJDa9w3RjGgTBpzVIsIuNwHp3lLu9Y7jdTU50bnO2eoMv+z/D\nzd4Zslt+oid20Q63sKsCpZZGfmiQy1zg5NJtktt5ZKXPoLTF2f73GWxm2VUH6HadPHrvMLUhH+JR\ngwl5iZ1emrneLL2uik+podFhkyGK1SgrG9O0rrnplTT6RxwYQQW8EXo/cYJuLkl/3on9O9A7odI7\nUGY1NM4R+e7jlu4++3zkeOyGLRn30aQLrF6bpPueC7XaJfkr22gXmtTMAM11H6JskRjeJsUOhu6g\n3nQjjvSRWn2cnR7tmAezKiNmoF9xYFoCdraMFNSQh/xIT7tQ4zpypYnhk7CDFnTv4D18hnbGhiUQ\nXCZhR5ET+h2e0t9lx0zxHfGTDDvXiTlyKOhMsEwfmRucIt7MMdjexnaKyG4DdaxD1Jej1XOzvZ3G\nl6zSbTjJbg6z3J5Ea3ZwCV1yc2X85xVS3m0UuUWxE+XBzklsWQAFvl1+iQPxewzFVgCBQiPJbi1F\nsRTBPiMgPGdjdBXsjLhXm+4Fe0vE6KnUNoOoiS6J1BYt3Cj0GGeF97cusZ0fRsj8PtJP6oRCBc7G\n3+P7nUvcNo7h12pUoyHEaRPneAdfoIaLFjX8FMwYxV6UpuIm0inxSv1V1gODVJQwfUXh1LlrBAeL\nNGQPpWaYXkOll9EwtxWoCqAJbK01ebrfY7sywo4/TU5PsLg6g+kSGGSNo9xFo8eifQBDB8HYqxHf\nIUW+m6ReCNB/JCNqFp6X6jgSbTRZx/fXofp+l9odlcy1IVyBFt7hBmvBUab/0ttmCj+Ca/+orfuX\nvfZ/yGM3bGt1Hk1oI8oWRECI2DhcBg76iLaF0LBxKy3SbJEjQb6YpHBzAOuKSNhX4PDPXWXhlVnq\nJT8zz96n4Iuwm4vBp0/hOtzBf3YHv1FnQN4hrBbJOeI0JQ/ziw8or8apfz0AfyBgvuJk4FKRz5x8\nFbfZ4lH7KNerTzA4to0S0bnBKW5xAgcGCjo3b53jTx4OY49Be8NNN69y5VQYe0NA22jz1N9+E9XX\npzIS48XJbzIRWsAhGvyrxXmmhucZ+dwq77susFid3jvesQEV8AnU+366aBziPmcOXKeSDvLHH/sM\nuk9B1XUKvzmAvuwEEUhD8bsxug81Tv+9K4jH+mwyyCwPOcAjDvCIDc8ku0oCu3oX71QRRWrTEl0E\nXBVS9g410U/fI6Mmu4xMLNMOKlzhPA76xLUczzle593uk1TkAELCZFRd5fTQVVKRTX7W+H2irQK3\n/YdIu7aJZYsEvt3CPm9RHAqSuFrk/YUQS/3/lc3GBLZmIUQM1L/WBHWva/VZ601CzjI3Aicp5FJU\nu35WGCdAlWh0F+m8Tn3Kjyr2SEV36MsSE8Iyn3F/jTciz/HumUus3Z9k7MASI6llOrKTDzgL/M7j\nlu//Bz+KJvKjtu5f9tr/IY/dsJ1Wl+J2EqOiEJveZeDEFuVqBGXNi2u4wUB8C6OksHp5mmo0SGNB\nRv9Xu6BFME9JWJqAPQw9SWV3OYU82iPkr5E7NIguO2iuSfQ9Tvq2SqkRp77ipZdR0JdUrKoD8ZSO\nU+6SOLKLPWbyqvtFTts3cKl1zjnf44h2B40WOg4ilHBgsMwEOw/i5L4Xgucd8KALtxs07+lQdSMJ\nKmqjh+roIeVMUge3mFXvE7DqfKtbYDCX4aveHydvxjB2FezL7M0TcQMOqC2H2EqP4D7Roq9t0ldk\nbM1mSFlnsrdM7tIAnaMuOpLGqneK5oAbfVAiPFrAdtmsWKOsZqeomBGWA5NMDCzgLdZ4syTRveZB\nitukJ3cY/n/aO5fYOq46Dn+/+/T1vbEd145fcWLLjfNo6tCoVQOUhpakChVkU6FS1KorxAKJwgJI\nu2eDhACpYsMCQQVRRUEhkRDEfQKtVOI2MUnsxEmTxnb8iONHYju27/X1n8VMRUBZsMjMeOrzSSN5\nzkjzm3P8+X+vz5k7N3WFLnrpZwfl5jRUi9mqSpKpZaq5QScD1CUmSabL1Ns492YuMaIGtpUHqEgW\nOVuzjRsLBa5c3szrv9/HI4+9Ta72FHW7pzi/aQuzhQLtXYMsZRdYziRZakjSnB9lU+pjKu5Z4AY1\nzJcL/OnmU1z6ZyuzbydYnhhlpT3L9KP1PHDfKRpqx1goVFCuSDFPnunUetZxk9zUIt0DB6hpm+Lp\nlsNkl6D56jA1H02xUJcjU7fEb4OW1+FYZQResLMrRSZGmmAG6vaM0/nVPt75636SlNnSPklj0zDj\n0y30vf8Zbw73zHU4OgwHcyxvSDGXKFCqSrOYrORKTwdtlRdYv2Oa683NLF7OsTSUg0YYW97o3Ur3\nOvDhCgxWkFg0Mo/fIvWlZTZlL1FMJniVp6hmknom2Msb7OQ0c+RJU6KVIVIs83e+wI3BPJwqwa4U\nXFmEnmnomYNUPXQU0JKhBUNDRn5xjnomaLYx1i/NcM/VGf7W9EXS+QWYSMAJoAnv9sMSzFkVKx0J\nkjtKlCrSZChSIk0LIzxY1cPEk/Ve8SrVMj7azPxKBYl8kXz1HGUSYOL86Hbmi3lIlnhpw4+49+ZF\nuq+luPVeFYmdCTa2D9ORukiRLFXMUtlwC2H8g8+TpcgWLvAEx0lS5rrq2Jk9Q5kEo9bIzrlzrFuZ\nZyazjo9y7fSMPcyR33wNNq+Q2b9E+tEi/Wxlgjrmu3KUs71syIyz2JBlG/108S9qmOZj2vmg/BCv\n3vwGk2/m4cdTwCA8VMtCqpXNTYPcX9vLCglyqQWGaOUd9tLCCJMzGzh84hm+VfkyB7ceY1d9P5l3\ni9ALdAJbgzbX4Vh9yMyCO7kU3MkdDsDMFHam89oRBndyO9CC7XA4HI67RyLqC3A4HA7H/4cr2A6H\nwxETXMF2OByOmBBYwZZ0QNI5SRck/TDAnFZJb0k6K+mMpO/47bWSuiUNSDouqSbAa0hKOinpWFjZ\nkmokvSapX1KfpIfD6rOkF/3xPi3pd5KyYY531KwVt6Pw2s+JxO04eB1IwZaUBF4GDgA7gGckbQ8i\nC+/pG98zs/uAPcC3/axDQLeZdQJv+PtB8QLQB598n1go2T8H/mxm24Eu4FwYuZLagG8Cu83sfiAJ\nfD2M7NXAGnM7Cq8hArdj47WZ3fUN+Czwl9v2DwGHgsi6Q/YRYB/eL7nBb2sEzgWUtxHv7u/HgGN+\nW6DZQDVw6Q7tgfcZqAXOA+vx7uM/BuwPa7yj3taK21F47Z83Erfj4nVQUyItwNBt+8N+W6D4r5IP\nAO/jDfK4f2gcaAgo9qfA9/Ee3/QJQWe3AxOSfiXpQ0m/lJQPIRczmwJ+AgwCI8CMmXWHkb1KWCtu\nR+E1ROR2XLwOqmCHfnO3pALwB+AFM5v9r4vxXh7v+jVJ+gpwzcxOAnf8AEdA2SlgN/ALM9sNzPM/\n/6oF2OcO4LtAG9AMFCQ9G0b2KuFT73aEXkNEbsfF66AK9lWg9bb9Vrx3IoEgKY0n9CtmdsRvHpfU\n6B9vAq4FEP054KCky8Bh4HFJr4SQPQwMm9kJf/81PMnHQujzg8B7ZjZpZsvAH/GmCcLIXg2sBbej\n8hqiczsWXgdVsHuALZLaJGWAp4GjQQRJEt5j2/rM7Ge3HToKPO///Dze/N9dxcxeMrNWM2vHW6B4\n08yeCzrbzMaAIUmdftM+4CzevFugfcab09sjKeeP/T68hakwslcDn3q3o/Laz47K7Xh4HdTkOPBl\nvEn8i8CLAeY8gjfPdgrv+1tO4q3g1+ItmgwAx4GaIBcDgL3AUfvPAkag2cAuvMdK9eK9G6gOq8/A\nD/D+iE4DvwbSYY93lNtacjtsr/2cSNyOg9fuWSIOh8MRE9wnHR0OhyMmuILtcDgcMcEVbIfD4YgJ\nrmA7HA5HTHAF2+FwOGKCK9gOh8MRE1zBdjgcjpjwb9rN8KSDkLULAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.subplot(121)\n", + "fig.imshow(flux.mean)\n", + "fig2 = plt.subplot(122)\n", + "fig2.imshow(fission.mean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's say we want to look at the distribution of relative errors of our tally bins for flux. First we create a new variable called ``relative_error`` and set it to the ratio of the standard deviation and the mean, being careful not to divide by zero in case some bins were never scored to." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Determine relative error\n", + "relative_error = np.zeros_like(flux.std_dev)\n", + "nonzero = flux.mean > 0\n", + "relative_error[nonzero] = flux.std_dev[nonzero] / flux.mean[nonzero]\n", + "\n", + "# distribution of relative errors\n", + "ret = plt.hist(relative_error[nonzero], bins=50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Source Sites" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Source sites can be accessed from the ``source`` property. As shown below, the source sites are represented as a numpy array with a structured datatype." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n", + " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n", + " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n", + " ...,\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n", + " dtype=[('wgt', '" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEUCAYAAAA8+dFZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGeRJREFUeJzt3X20ZFV55/Hvz8YXUBL6Jo4O0IojELtdOgENsGJmxBdc\npFVQOhFoEpUZBY0dXyaZMK6oMOOsTHSiImHJ4BIVDQ0qEAdHEF9BaR0UQVT6grAcMrysIcRu3yAq\nL8/8UXWhKG7VrXO7zq26t7+ftWp1nX32OfXUprof9tn77JOqQpKkUT1i0gFIkpYXE4ckqREThySp\nEROHJKkRE4ckqREThySpkVYTR5LDk1yf5MYkJ82z/2lJvpHkF0n+rMmxkqTJSFv3cSRZBdwAvBC4\nDfgWcGxVzfbUeTzwZOBlwPaqes+ox0qSJqPNHsdBwE1VdXNV3QOcBxzZW6Gq7qyqq4B7mh4rSZqM\nNhPHXsAtPdu3dsvaPlaS1KI2E8eOXANzHRRJmlK7tHju24A1Pdtr6PQcxnZsEhOMJC1CVWWxx7bZ\n47gK2C/JPkkeBRwNXDSgbv8XGPnYqmr9dfLJJ7d+3EJ1B+1vUt5f1r991FFHTW1bNjl2lHq25/ja\nc9j+UdptlLKlaMsdac+l+Lu+I+3Zv72jWutxVNW9STYBlwKrgLOqajbJid39ZyZ5Ip0ZU78G3J/k\nTcC6qvr5fMe2FetCDj300NaPW6juoP1NyvvLFvu9dsSOfOaox45Sz/YcX3sO2z9KuzUpa9s0/10f\ntG8Sv83WpuMuhSS1nOOfNhs2bOCCCy6YdBgrhu05PrbleCWhpvRSlZaZtWvXTjqEFcX2HB/bcrqY\nOPSAdevWTTqEFcX2HB/bcrqYOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmN\nmDgkSY2YOCRJjZg4JK14MzOQzP+amZl0dMtPmw9ykqSpsH07DFpIO4teI3bnZY9DktSIiUOS1IiJ\nQ5LUiIlDktSIiUPSsuHsqOngrCpJy4azo6aDPQ5JUiMmDklSIyYOSVIjJg5JUiMmDklSIyYOSZqH\nU38HczquJM3Dqb+D2eOQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1\n0mriSHJ4kuuT3JjkpAF1TuvuvzbJAT3lb01yXZLvJdmc5NFtxipJGk1riSPJKuB04HBgHXBskrV9\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create log-spaced energy bins from 1 keV to 100 MeV\n", + "energy_bins = np.logspace(-3,1)\n", + "\n", + "# Calculate pdf for source energies\n", + "probability, bin_edges = np.histogram(sp.source['E'], energy_bins, density=True)\n", + "\n", + "# Make sure integrating the PDF gives us unity\n", + "print(sum(probability*np.diff(energy_bins)))\n", + "\n", + "# Plot source energy PDF\n", + "plt.semilogx(energy_bins[:-1], probability*np.diff(energy_bins), linestyle='steps')\n", + "plt.xlabel('Energy (MeV)')\n", + "plt.ylabel('Probability/MeV')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's also look at the spatial distribution of the sites. To make the plot a little more interesting, we can also include the direction of the particle emitted from the source and color each source by the logarithm of its energy." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 0.5)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", + " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", + " np.log(sp.source['E']), cmap='jet', scale=20.0)\n", + "plt.colorbar()\n", + "plt.xlim((-0.5,0.5))\n", + "plt.ylim((-0.5,0.5))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/post-processing.rst b/docs/source/pythonapi/examples/post-processing.rst new file mode 100644 index 0000000000..b488d15ffb --- /dev/null +++ b/docs/source/pythonapi/examples/post-processing.rst @@ -0,0 +1,13 @@ +.. _notebook_post_processing: + +=============== +Post Processing +=============== + +.. only:: html + + .. notebook:: post-processing.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 8c42f2d7e2..12baf937d1 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -62,6 +62,7 @@ on a given module or class. .. toctree:: :maxdepth: 1 + examples/post-processing examples/pandas-dataframes examples/tally-arithmetic diff --git a/docs/source/usersguide/output/voxel.rst b/docs/source/usersguide/output/voxel.rst index bcdcd8eb10..1da501fb54 100644 --- a/docs/source/usersguide/output/voxel.rst +++ b/docs/source/usersguide/output/voxel.rst @@ -1,8 +1,8 @@ .. _usersguide_voxel: -================= -Voxel File Format -================= +====================== +Voxel Plot File Format +====================== **/filetype** (*char[]*) diff --git a/docs/source/usersguide/processing.rst b/docs/source/usersguide/processing.rst index a6e9875cef..3a6766a2db 100644 --- a/docs/source/usersguide/processing.rst +++ b/docs/source/usersguide/processing.rst @@ -6,31 +6,33 @@ Data Processing and Visualization This section is intended to explain in detail the recommended procedures for carrying out common post-processing tasks with OpenMC. While several utilities -of varying complexity are provided to help automate the process, in many cases -it will be extremely beneficial to do some coding in Python to quickly obtain -results. In these cases, and for many of the provided utilities, it is necessary -for your Python installation to contain: +of varying complexity are provided to help automate the process, the most +powerful capabilities for post-processing derive from use of the :ref:`Python +API `. Both the provided scripts and the Python API rely on a number +third-party Python packages, including: -* [1]_ `Numpy `_ -* [1]_ `Scipy `_ -* [2]_ `h5py `_ -* [3]_ `Matplotlib `_ +* [1]_ `NumPy `_ +* [2]_ `h5py `_ +* [3]_ `pandas `_ +* [3]_ `matplotlib `_ * [3]_ `Silomesh `_ * [3]_ `VTK `_ +* [3]_ `lxml `_ -Most of these are easily obtainable in Ubuntu through the package manager, or -are easily installed with distutils. +Most of these are can easily be installed with `pip `_ +or alternatively obtaining through a package manager. -.. [1] Required for tally data extraction from statepoints with statepoint.py -.. [2] Required only if reading HDF5 statepoint files. -.. [3] Optional for plotting utilities +.. [1] Required for most post-processing tasks +.. [2] Required for reading HDF5 output files +.. [3] Not used directly by the Python API, but are optional dependencies for a + number of scripts. ---------------------- Geometry Visualization ---------------------- Geometry plotting is carried out by creating a plots.xml, specifying plots, and -running OpenMC with the -plot or -p command-line option (See +running OpenMC with the --plot or -p command-line option (See :ref:`usersguide_plotting`). Plotting in 2D @@ -128,27 +130,26 @@ capabilities of 3D voxel plots. Voxel plots are built the same way 2D slice plots are, by determining the cell or material id of a particle at the center of each voxel. In this example, the space covered is the cube between the points (-5,-5,-5) and (5,5,5), with voxel -centers 10/500 = 0.02 cm apart. The binary VOXEL files that are produced do not +centers 10/500 = 0.02 cm apart. The HDF5 voxel files that are produced do not specify any color - instead containing only material or cell ids (material id in this example) - and thus the ``background``, ``col_spec``, and ``mask`` elements are not used. If no cell is found at a voxel center, an id of -1 is stored. -The binary VOXEL files output by OpenMC can not be viewed directly by any -existing viewers. In order to view them, they must be converted into a standard -mesh format that can be viewed in ParaView, Visit, etc. This typically will -compress the size of the file significantly. The provided utility voxel.py -accomplishes this for SILO: +The voxel plot data is written to an HDF5 file. The voxel file can subsequently +be converted into a standard mesh format that can be viewed in ParaView, Visit, +etc. This typically will compress the size of the file significantly. The +provided utility openmc-voxel-to-silovtk accomplishes this for SILO: .. code-block:: sh - /src/utils/voxel.py myplot.voxel -o output.silo + openmc-voxel-to-silovtk myplot.voxel -o output.silo and VTK file formats: .. code-block:: sh - /src/utils/voxel.py myplot.voxel --vtk -o output.vti + openmc-voxel-to-silovtk myplot.voxel --vtk -o output.vti To use this utility you need either @@ -156,11 +157,10 @@ To use this utility you need either or -* `VTK `_ with python bindings - On Ubuntu, these are - easily obtained with ``sudo apt-get install python-vtk`` +* `VTK `_ with python bindings. On debian derivatives, + these are easily obtained with ``sudo apt-get install python-vtk`` -Users can process the binary into any other format if desired by following the -example of voxel.py. For the binary file structure, see :ref:`devguide_voxel`. +For the HDF5 file structure, see :ref:`usersguide_voxel`. Once processed into a standard 3D file format, colors and masks can be defined using the stored id numbers to better explore the geometry. The process for @@ -183,150 +183,38 @@ doing this will depend on the 3D viewer, but should be straightforward. Tally Visualization ------------------- -Tally results are saved in both a text file (tallies.out) as well as a binary +Tally results are saved in both a text file (tallies.out) as well as an HDF5 statepoint file. While the tallies.out file may be fine for simple tallies, in -many cases the user requires more information about the tally or the run, or -has to deal with a large number of result values (e.g. for mesh tallies). In -these cases, extracting data from the statepoint file via Python scripting is -the preferred method of data analysis and visualization. +many cases the user requires more information about the tally or the run, or has +to deal with a large number of result values (e.g. for mesh tallies). In these +cases, extracting data from the statepoint file via the Python API is the +preferred method of data analysis and visualization. Data Extraction --------------- A great deal of information is available in statepoint files (See -:ref:`usersguide_statepoint`), most of which is easily extracted by the provided -utility statepoint.py. This utility provides a Python class to load statepoints -and extract data - it is used in many of the provided plotting utilities, and -can be used in user-created scripts to carry out manipulations of the data. To -read tallies using this utility, make sure statepoint.py is in your PYTHONPATH, -and then import the class, instantiate it, and call read_results: +:ref:`usersguide_statepoint`), all of which is accessible through the Python +API. The ``openmc.statepoint`` module (see :ref:`pythonapi_statepoint`) provides +a class to load statepoints and access data as requested; it is used in many of +the provided plotting utilities, OpenMC's regression test suite, and can be used +in user-created scripts to carry out manipulations of the data. -.. code-block:: python - - from statepoint import StatePoint - sp = StatePoint('statepoint.100.binary') - sp.read_results() - -At this point the user can extract entire scores from tallies into a data -dictionary containing numpy arrays: - -.. code-block:: python - - tallyid = 1 - score = 'flux' - data = sp.extract_results(tallyid, score) - means = data['means'] - print data.keys() - -The results from this function contain all filter bins (all mesh points, all -energy groups, etc.), which can be reshaped with the bin ordering also contained -in the output dictionary. This is the best choice of output for easily -integrating ranges of data. - -Alternatively the user can extract specific values for a single score/filter -combination: - -.. code-block:: python - - tallyid = 1 - score = 'flux' - filters = [('mesh', (1, 1, 5)), ('energyin', 0)] - value, error = sp.get_value(tallyid, filters, score) - -In the future more documentation may become available here for statepoint.py and -the data extraction functions of StatePoint objects. However, for now it is up -to the user to explore the classes in statepoint.py to discover what data is -available in StatePoint objects (we highly recommend interactively exploring -with `IPython `_). Many examples can be found by looking -through the other utilities that use statepoint.py, and a few common -visualization tasks will be described here in the following sections. +An :ref:`example IPython notebook ` demonstrates how +to extract data from a statepoint using the Python API. Plotting in 2D -------------- +The :ref:`IPython notebook example ` also demonstrates +how to plot a mesh tally in two dimensions using the Python API. Note, however, +that there is also a script distributed with OpenMC, ``openmc-plot-mesh-tally``, +that interactive GUI to explore and plot mesh tallies for any scores and filter +bins. + .. image:: ../_images/plotmeshtally.png :height: 200px -For simple viewing of 2D slices of a mesh plot, the utility plot_mesh_tally.py -is provided. This utility provides an interactive GUI to explore and plot -mesh tallies for any scores and filter bins. It requires statepoint.py. - -.. image:: ../_images/fluxplot.png - :height: 200px - -Alternatively, the user can write their own Python script to manipulate the data -appropriately. Consider a run where the first tally contains a 105x105x20 mesh -over a small core, with a flux score and two energyin filter bins. To explicitly -extract the data and create a plot with gnuplot, the following script can be -used. The script operates in several steps for clarity, and is not necessarily -the most efficient way to extract data from large mesh tallies. This creates the -two heatmaps in the previous figure. - -.. code-block:: python - - #!/usr/bin/env python - - import os - - import statepoint - - # load and parse the statepoint file - sp = statepoint.StatePoint('statepoint.300.binary') - sp.read_results() - - tallyid = 0 # This is tally 1 - score = 0 # This corresponds to flux (see tally.scores) - - # get mesh dimensions - meshid = sp.tallies[tallyid].filters['mesh'].bins[0] - for i,m in enumerate(sp.meshes): - if m.id == meshid: - mesh = m - break - nx,ny,nz = mesh.dimension - - # loop through mesh and extract values to python dictionaries - thermal = {} - fast = {} - for x in range(1,nx+1): - for y in range(1,ny+1): - for z in range(1,nz+1): - val,err = sp.get_value(tallyid, - [('mesh',(x,y,z)),('energyin',0)], - score) - thermal[(x,y,z)] = val - val,err = sp.get_value(tallyid, - [('mesh',(x,y,z)),('energyin',1)], - score) - fast[(x,y,z)] = val - - # sum up the axial values and write datafile for gnuplot - with open('meshdata.dat','w') as fh: - for x in range(1,nx+1): - for y in range(1,ny+1): - thermalval = 0. - fastval = 0. - for z in range(1,nz+1): - thermalval += thermal[(x,y,z)] - fastval += fast[(x,y,z)] - fh.write("{} {} {} {}\n".format(x,y,thermalval,fastval)) - - # write gnuplot file - with open('tmp.gnuplot','w') as fh: - fh.write(r"""set terminal png size 1000 400 - set output 'fluxplot.png' - set nokey - set autoscale fix - set multiplot layout 1,2 title "Pin Mesh Flux Tally" - set title "Thermal" - plot 'meshdata.dat' using 1:2:3 with image - set title "Fast" - plot 'meshdata.dat' using 1:2:4 with image - """) - - # make plot - os.system("gnuplot < tmp.gnuplot") - Plotting in 3D -------------- @@ -334,22 +222,23 @@ Plotting in 3D :height: 200px As with 3D plots of the geometry, meshtally data needs to be put into a standard -format for viewing. The utility statepoint_3d.py is provided to accomplish this -for both VTK and SILO. By default statepoint_3d.py processes a statepoint into a -3D file with all mesh tallies and filter/score combinations, +format for viewing. The utility ``openmc-statepoint-3d`` is provided to +accomplish this for both VTK and SILO. By default ``openmc-statepoint-3d`` +processes a statepoint into a 3D file with all mesh tallies and filter/score +combinations, .. code-block:: sh - /src/utils/statepoint_3d.py -o output.silo - /src/utils/statepoint_3d.py --vtk -o output.vtm + openmc-statepoint-3d -o output.silo + openmc-statepoint-3d --vtk -o output.vtm but it also provides several command-line options to selectively process only certain data arrays in order to keep file sizes down. .. code-block:: sh - statepoint_3d.py --tallies 2,4 --scores 4.1,4.3 -o output.silo - statepoint_3d.py --filters 2.energyin.1 --vtk -o output.vtm + openmc-statepoint-3d --tallies 2,4 --scores 4.1,4.3 -o output.silo + openmc-statepoint-3d --filters 2.energyin.1 --vtk -o output.vtm All available options for specifying a subset of tallies, scores, and filters can be listed with the ``--list`` or ``-l`` command line options. @@ -426,13 +315,11 @@ Getting Data into MATLAB ------------------------ There is currently no front-end utility to dump tally data to MATLAB files, but -the process is straightforward. First extract the data using a custom Python -script with statepoint.py, put the data into appropriately-shaped numpy arrays, -and then use the `Scipy MATLAB IO routines +the process is straightforward. First extract the data using the Python API via +``openmc.statepoint`` and then use the `Scipy MATLAB IO routines `_ to save to a MAT -file. Note that the data contained in the output from -``StatePoint.extract_result`` is already in a Numpy array that can be reshaped -and dumped to MATLAB in one step. +file. Note that all arrays that are accessible in a statepoint are already in +NumPy arrays that can be reshaped and dumped to MATLAB in one step. ---------------------------- Particle Track Visualization @@ -463,15 +350,15 @@ particle numbers, respectively. For example, to output the tracks for particles After running OpenMC, the directory should contain a file of the form -"track_(batch #)_(generation #)_(particle #).(binary or h5)" for each particle -tracked. These track files can be converted into VTK poly data files with the -"track.py" utility. The usage of track.py is of the form "track.py [-o OUT] IN" -where OUT is the optional output filename and IN is one or more filenames -describing track files. The default output name is "track.pvtp". A common -usage of track.py is "track.py track*.binary" which will use the data from all -binary track files in the directory to write a "track.pvtp" VTK output file. -The .pvtp file can then be read and plotted by 3d visualization programs such as -ParaView. +"track_(batch #)_(generation #)_(particle #).h5" for each particle tracked. +These track files can be converted into VTK poly data files with the +``openmc-track-to-vtk`` utility. The usage of ``openmc-track-to-vtk`` is of the +form "openmc-track-to-vtk [-o OUT] IN" where OUT is the optional output filename +and IN is one or more filenames describing track files. The default output name +is "track.pvtp". A common usage of track.py is "openmc-track-to-vtk track*.h5" +which will use the data from all binary track files in the directory to write a +"track.pvtp" VTK output file. The .pvtp file can then be read and plotted by 3d +visualization programs such as ParaView. ---------------------- Source Site Processing @@ -480,43 +367,6 @@ Source Site Processing For eigenvalue problems, OpenMC will store information on the fission source sites in the statepoint file by default. For each source site, the weight, position, sampled direction, and sampled energy are stored. To extract this data -from a statepoint file, the statepoint.py Python module can be used. Below is an -example of an interactive ipython session using the statepoint.py Python module: - -.. code-block:: python - - In [1]: import statepoint - - In [2]: sp = statepoint.StatePoint('statepoint.100.h5') - - In [3]: sp.read_source() - - In [4]: len(sp.source) - Out[4]: 1000 - - In [5]: sp.source[0:10] - Out[5]: - [, - , - , - , - , - , - , - , - , - ] - - In [6]: site = sp.source[0] - - In [7]: site.weight - Out[7]: 1.0 - - In [8]: site.xyz - Out[8]: array([ 2.21980946, -8.92686048, 87.93720485]) - - In [9]: site.uvw - Out[9]: array([ 0.06740523, 0.50612814, 0.85982024]) - - In [10]: site.E - Out[10]: 0.93292326356564159 +from a statepoint file, the ``openmc.statepoint`` module can be used. An +:ref:`example IPython notebook ` demontrates how to +analyze and plot source information. diff --git a/scripts/openmc-statepoint-histogram b/scripts/openmc-statepoint-histogram deleted file mode 100755 index 26e8bdae60..0000000000 --- a/scripts/openmc-statepoint-histogram +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python - -from __future__ import print_function -from sys import argv -from math import sqrt - -import numpy as np -import scipy.stats -import matplotlib.pyplot as plt - -from openmc.statepoint import StatePoint - -# Get filename -filename = argv[1] - -# Create StatePoint object -sp = StatePoint(filename) -sp.read_results() -sp.compute_ci() - -# Check if tallies are present -if not sp.tallies_present: - raise Exception("No tally data in state point!") - -# Loop over all tallies -for i, t in sp.tallies.items(): - # Determine relative error and fraction of bins with less than 1% half-width - # of CI - n_bins = t.mean.size - relative_error = t.std_dev[t.mean > 0.] / t.mean[t.mean > 0.] - fraction = float(sum(relative_error < 0.01))/n_bins - - # Display results - print("Tally " + str(i)) - print(" Fraction under 1% = {0}".format(fraction)) - print(" Min relative error = {0}".format(min(relative_error))) - print(" Max relative error = {0}".format(max(relative_error))) - print(" Non-scoring bins = {0}".format( - 1.0 - float(relative_error.size)/n_bins)) - - # Plot histogram - plt.hist(relative_error, 100) - plt.show() diff --git a/setup.py b/setup.py index 655e38e3a4..3273f1db73 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ kwargs = {'name': 'openmc', if have_setuptools: kwargs.update({ # Required dependencies - 'install_requires': ['numpy', 'scipy', 'h5py', 'matplotlib'], + 'install_requires': ['numpy', 'h5py', 'matplotlib'], # Optional dependencies 'extras_require': { From ce46f8b918cb802267d9c529043583c40b197395 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 19 Sep 2015 07:42:36 +0700 Subject: [PATCH 129/519] Fix documentation for openmc-validate-xml --- docs/source/usersguide/input.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 93e8236ec1..346922d1db 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -79,14 +79,13 @@ Message Description [VALID] XML file matches RelaxNG. ======================== =================================== -As an example, if OpenMC is installed in the directory -``/opt/openmc/0.6.2`` and the current working directory is where -OpenMC XML input files are located, they can be validated using -the following command: +As an example, if OpenMC is installed in the directory ``/opt/openmc/`` and the +current working directory is where OpenMC XML input files are located, they can +be validated using the following command: .. code-block:: bash - /opt/openmc/0.6.2/bin/xml_validate + /opt/openmc/bin/openmc-validate-xml -------------------------------------- Settings Specification -- settings.xml From 609c8c28aed946a4ccc9b854efa8addd0e2e4af3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 19 Sep 2015 07:47:03 +0700 Subject: [PATCH 130/519] Updated troubleshooting guide. --- docs/source/usersguide/troubleshoot.rst | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/docs/source/usersguide/troubleshoot.rst b/docs/source/usersguide/troubleshoot.rst index 10ac12184f..c5e4e7c1e1 100644 --- a/docs/source/usersguide/troubleshoot.rst +++ b/docs/source/usersguide/troubleshoot.rst @@ -31,21 +31,6 @@ f951: error: unrecognized command line option "-fbacktrace" You are probably using a version of the gfortran compiler that is too old. Download and install the latest version of gfortran_. - -make[1]: ifort: Command not found -********************************* - -You tried compiling with the Intel Fortran compiler and it was not found on your -:envvar:`PATH`. If you have the Intel compiler installed, make sure the shell -can locate it (this can be tested with :program:`which ifort`). - -make[1]: pgf90: Command not found -********************************* - -You tried compiling with the PGI Fortran compiler and it was not found on your -:envvar:`PATH`. If you have the PGI compiler installed, make sure the shell can -locate it (this can be tested with :program:`which pgf90`). - ------------------------- Problems with Simulations ------------------------- @@ -56,13 +41,13 @@ Segmentation Fault A segmentation fault occurs when the program tries to access a variable in memory that was outside the memory allocated for the program. The best way to debug a segmentation fault is to re-compile OpenMC with debug options turned -on. First go to your ``openmc/src`` directory where OpenMC was compiled and type -the following commands: +on. Create a new build directory and type the following commands: .. code-block:: sh - make distclean - make DEBUG=yes + mkdir build-debug && cd build-debug + cmake -Ddebug=on /path/to/openmc + make Now when you re-run your problem, it should report exactly where the program failed. If after reading the debug output, you are still unsure why the program From cb3d79a1af9f96f1717d6f3b79dd7c53319c0356 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 19 Sep 2015 10:10:19 +0700 Subject: [PATCH 131/519] Added summary file format in documentation. sab_names now array of strings. --- docs/source/usersguide/input.rst | 20 +- docs/source/usersguide/output/index.rst | 1 + docs/source/usersguide/output/summary.rst | 298 ++++++++++++++++++++++ openmc/summary.py | 18 +- src/constants.F90 | 1 + src/summary.F90 | 22 +- 6 files changed, 330 insertions(+), 30 deletions(-) create mode 100644 docs/source/usersguide/output/summary.rst diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 346922d1db..d698006599 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1525,16 +1525,16 @@ sub-elements: *Default*: None - Required entry :type: - Keyword for type of plot to be produced. Currently only "slice" and - "voxel" plots are implemented. The "slice" plot type creates 2D pixel - maps saved in the PPM file format. PPM files can be displayed in most - viewers (e.g. the default Gnome viewer, IrfanView, etc.). The "voxel" - plot type produces a binary datafile containing voxel grid positioning and - the cell or material (specified by the ``color`` tag) at the center of each - voxel. These datafiles can be processed into 3D SILO files using the - ``voxel.py`` utility provided with the OpenMC source, and subsequently - viewed with a 3D viewer such as VISIT or Paraview. See the - :ref:`devguide_voxel` for information about the datafile structure. + Keyword for type of plot to be produced. Currently only "slice" and "voxel" + plots are implemented. The "slice" plot type creates 2D pixel maps saved in + the PPM file format. PPM files can be displayed in most viewers (e.g. the + default Gnome viewer, IrfanView, etc.). The "voxel" plot type produces a + binary datafile containing voxel grid positioning and the cell or material + (specified by the ``color`` tag) at the center of each voxel. These + datafiles can be processed into 3D SILO files using the + ``openmc-voxel-to-silovtk`` utility provided with the OpenMC source, and + subsequently viewed with a 3D viewer such as VISIT or Paraview. See the + :ref:`usersguide_voxel` for information about the datafile structure. .. note:: Since the PPM format is saved without any kind of compression, the resulting file sizes can be quite large. Saving the image in diff --git a/docs/source/usersguide/output/index.rst b/docs/source/usersguide/output/index.rst index 161a8de2dd..31bd1da917 100644 --- a/docs/source/usersguide/output/index.rst +++ b/docs/source/usersguide/output/index.rst @@ -10,6 +10,7 @@ Output File Formats statepoint source + summary particle_restart track voxel diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst new file mode 100644 index 0000000000..f924cb1d68 --- /dev/null +++ b/docs/source/usersguide/output/summary.rst @@ -0,0 +1,298 @@ +.. _usersguide_summary: + +=================== +Summary File Format +=================== + +The current revision of the summary file format is 1. + +**/filetype** (*char[]*) + + String indicating the type of file. + +**/revision** (*int*) + + Revision of the summary file format. Any time a change is made in the + format, this integer is incremented. + +**/version_major** (*int*) + + Major version number for OpenMC + +**/version_minor** (*int*) + + Minor version number for OpenMC + +**/version_release** (*int*) + + Release version number for OpenMC + +**/date_and_time** (*char[]*) + + Date and time the state point was written. + +**/n_procs** (*int*) + + Number of MPI processes used. + +**/n_particles** (*int8_t*) + + Number of particles used per generation. + +**/n_batches** (*int*) + + Number of batches to simulate. + +if (run_mode == MODE_EIGENVALUE) + + **/n_inactive** (*int*) + + Number of inactive batches. + + **/n_active** (*int*) + + Number of active batches. + + **/gen_per_batch** (*int*) + + Number of generations per batch. + +end if + +**/geometry/n_cells** (*int*) + +**/geometry/n_surfaces** (*int*) + +**/geometry/n_universes** (*int*) + +**/geometry/n_lattices** (*int*) + +do i = 1, n_cells + + **/geometry/cells/cell /index** (*int*) + + **/geometry/cells/cell /name** (*char[]*) + + **/geometry/cells/cell /universe** (*int*) + + **/geometry/cells/cell /fill_type** (*int*) + + **/geometry/cells/cell /material** (*int*) + + **/geometry/cells/cell /fill** (*int*) + + **/geometry/cells/cell /maps** (*int*) + + **/geometry/cells/cell /offset** (*int[]*) + + **/geometry/cells/cell /translated** (*int*) + + **/geometry/cells/cell /translation** (*double[]*) + + **/geometry/cells/cell /rotated** (*int*) + + **/geometry/cells/cell /rotation** (*double[]*) + + **/geometry/cells/cell /lattice** (*int*) + + **/geometry/cells/cell /surfaces** (*int[]*) + +end do + +do i = 1, n_surfaces + + **/geometry/surfaces/surface /index** (*int*) + + **/geometry/surfaces/surface /name** (*char[]*) + + **/geometry/surfaces/surface /type** (*char[]*) + + **/geometry/surfaces/surface /coefficients** (*double[]*) + + **/geometry/surfaces/surface /neighbors_positive** (*int[]*) + + **/geometry/surfaces/surface /neighbors_negative** (*int[]*) + + **/geometry/surfaces/surface /boundary_condition** (*char[]*) + +end do + +do i = 1, n_universes + + **/geometry/universes/universe /index** (*int*) + + **/geometry/universes/universe /cells** (*int[]*) + +end do + +do i = 1, n_lattices + + **/geometry/lattices/lattice /index** (*int*) + + **/geometry/lattices/lattice /name** (*char[]*) + + **/geometry/lattices/lattice /type** (*char[]*) + + **/geometry/lattices/lattice /pitch** (*double[]*) + + **/geometry/lattices/lattice /outer** (*int*) + + **/geometry/lattices/lattice /offset_size** (*int[]*) + + **/geometry/lattices/lattice /maps** (*int*) + + **/geometry/lattices/lattice /offsets** (*int[]*) + + **/geometry/lattices/lattice /universes** (*int[]*) + + if (rectangular lattice) + + **/geometry/lattices/lattice /dimension** (*int[]*) + + **/geometry/lattices/lattice /lower_left** (*double[]*) + + elseif (hexagonal lattice) + + **/geometry/lattices/lattice /n_rings** (*int*) + + **/geometry/lattices/lattice /n_axial** (*int*) + + **/geometry/lattices/lattice /center** (*double[]*) + + end if + +end do + +**/n_materials** (*int*) + +do i = 1, n_materials + + **/materials/material /index** (*int*) + + **/materials/material /name** (*char[]*) + + **/materials/material /atom_density** (*double[]*) + + **/materials/material /nuclides** (*int[]*) + + **/materials/material /nuclide_densities** (*double[]*) + + **/materials/material /n_sab** (*int*) + + **/materials/material /i_sab_nuclides** (*int*) + + **/materials/material /i_sab_tables** (*int*) + + **/materials/material /sab_names** (*char[][]*) + +end do + +**/tallies/n_tallies** (*int*) + +**/tallies/n_meshes** (*int*) + +do i = 1, n_meshes + + **/tallies/mesh /index** (*int*) + + **/tallies/mesh /type** (*int*) + + **/tallies/mesh /n_dimension** (*int*) + + **/tallies/mesh /dimension** (*int[]*) + + **/tallies/mesh /lower_left** (*double[]*) + + **/tallies/mesh /upper_right** (*double[]*) + + **/tallies/mesh /width** (*double[]*) + +end do + +do i = 1, n_tallies + + **/tallies/tally /index** (*int*) + + **/tallies/tally /name** (*char[]*) + + **/tallies/tally /total_score_bins** (*int*) + + **/tallies/tally /total_filter_bins** (*int*) + + **/tallies/tally /n_filters** (*int*) + + do j = 1, n_filters + + **/tallies/tally /filter j/type** (*int*) + + **/tallies/tally /filter j/n_bins** (*int*) + + **/tallies/tally /filter j/bins** (*int[]* or *double[]*) + + **/tallies/tally /filter j/type_name** (*char[]*) + + end do + + **/tallies/tally /n_nuclide_bins** (*int*) + + **/tallies/tally /nuclide_bins** (*int[]*) + + **/tallies/tally /n_score_bins** (*int*) + + **/tallies/tally /score_bins** (*int[]*) + +end do + +**/nuclides/n_nuclides** (*int*) + +do i = 1, n_nuclides + + **/nuclides//index** (*int*) + + **/nuclides//zaid** (*int*) + + **/nuclides//alias** (*char[]*) + + **/nuclides//awr** (*double*) + + **/nuclides//kT** (*double*) + + **/nuclides//n_grid** (*int*) + + **/nuclides//n_reactions** (*int*) + + **/nuclides//n_fission** (*int*) + + **/nuclides//size_xs** (*int*) + + do j = 1, n_reactions + + **/nuclides//reactions//Q_value** (*double*) + + **/nuclides//reactions//multiplicity** (*int*) + + **/nuclides//reactions//threshold** (*double*) + + **/nuclides//reactions//size_angle** (*int*) + + **/nuclides//reactions//size_energy** (*int*) + + end do + + **/nuclides//urr_n_energy** (*int*) + + **/nuclides//urr_n_prob** (*int*) + + **/nuclides//urr_interp** (*int*) + + **/nuclides//urr_inelastic** (*int*) + + **/nuclides//urr_absorption** (*int*) + + **/nuclides//urr_min_E** (*double*) + + **/nuclides//urr_max_E** (*double*) + + **/nuclides//size_total** (*int*) + +end do diff --git a/openmc/summary.py b/openmc/summary.py index 8b5e5710a6..aeba2f94b4 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -103,17 +103,15 @@ class Summary(object): nuclides = self._f['materials'][key]['nuclides'][...] n_sab = self._f['materials'][key]['n_sab'].value - sab_names = [] - sab_xs = [] - # Read the names of the S(a,b) tables for this Material - for i in range(1, n_sab+1): - sab_table = \ - self._f['materials'][key]['sab_tables'][str(i)].value - - # Read the cross-section identifiers for each S(a,b) table - sab_names.append(sab_table.split('.')[0]) - sab_xs.append(sab_table.split('.')[1]) + if n_sab > 0: + sab_tables = self._f['materials'][key]['sab_names'].value + sab_names = [] + sab_xs = [] + for sab_table in sab_tables: + name, xs = sab_table.decode().split('.') + sab_names.append(name) + sab_xs.append(xs) # Create the Material material = openmc.Material(material_id=material_id, name=name) diff --git a/src/constants.F90 b/src/constants.F90 index 01dd6148af..9c011a838d 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -14,6 +14,7 @@ module constants integer, parameter :: REVISION_STATEPOINT = 14 integer, parameter :: REVISION_PARTICLE_RESTART = 1 integer, parameter :: REVISION_TRACK = 1 + integer, parameter :: REVISION_SUMMARY = 1 ! ============================================================================ ! ADJUSTABLE PARAMETERS diff --git a/src/summary.F90 b/src/summary.F90 index 0147230a0a..5fcdbf81ce 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -79,6 +79,10 @@ contains subroutine write_header(file_id) integer(HID_T), intent(in) :: file_id + ! Write filetype and revision + call write_dataset(file_id, "filetype", "summary") + call write_dataset(file_id, "revision", REVISION_SUMMARY) + ! Write version information call write_dataset(file_id, "version_major", VERSION_MAJOR) call write_dataset(file_id, "version_minor", VERSION_MINOR) @@ -442,12 +446,7 @@ contains if (m%n_sab > 0) then call write_dataset(material_group, "i_sab_nuclides", m%i_sab_nuclides) call write_dataset(material_group, "i_sab_tables", m%i_sab_tables) - - sab_group = create_group(material_group, "sab_tables") - do j = 1, m%n_sab - call write_dataset(sab_group, to_str(j), m%sab_names(j)) - end do - call close_group(sab_group) + call write_dataset(material_group, "sab_names", m%sab_names) end if call close_group(material_group) @@ -483,6 +482,9 @@ contains m => meshes(i) mesh_group = create_group(tallies_group, "mesh " // trim(to_str(m%id))) + ! Write internal OpenMC index for this mesh + call write_dataset(mesh_group, "index", i) + ! Write type and number of dimensions call write_dataset(mesh_group, "type", m%type) call write_dataset(mesh_group, "n_dimension", m%n_dimension) @@ -504,11 +506,11 @@ contains t => tallies(i) tally_group = create_group(tallies_group, "tally " // trim(to_str(t%id))) + ! Write internal OpenMC index for this tally + call write_dataset(tally_group, "index", i) + ! Write the name for this tally - call write_dataset(tally_group, "name_size", len(t%name)) - if (len(t%name) > 0) then - call write_dataset(tally_group, "name", t%name) - endif + call write_dataset(tally_group, "name", t%name) ! Write size of each tally call write_dataset(tally_group, "total_score_bins", t%total_score_bins) From 40d38df2449509801874a8e2085269042e11659f Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 19 Sep 2015 00:20:27 -0400 Subject: [PATCH 132/519] Assume unspecified surface coeffs = 0 in PyAPI --- openmc/surface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/surface.py b/openmc/surface.py index d5d258fa7a..9502002ffa 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -134,7 +134,7 @@ class Surface(object): element.set("type", self._type) element.set("boundary", self._boundary_type) - element.set("coeffs", ' '.join([str(self._coeffs[key]) + element.set("coeffs", ' '.join([str(self._coeffs.setdefault(key, 0.0)) for key in self._coeff_keys])) return element From 0f1cbdfd1484d1d12d795e8b68e3edb09707824e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 19 Sep 2015 13:44:18 +0700 Subject: [PATCH 133/519] Get rid of unused variable sab_group --- src/summary.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/summary.F90 b/src/summary.F90 index 5fcdbf81ce..68f967a744 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -400,7 +400,6 @@ contains integer, allocatable :: zaids(:) integer(HID_T) :: materials_group integer(HID_T) :: material_group - integer(HID_T) :: sab_group type(Material), pointer :: m materials_group = create_group(file_id, "materials") From 4462db19f3c0c23e40aba02beb26f473935f687b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 08:13:33 +0700 Subject: [PATCH 134/519] Update RELAX NG schema for geometry.xml (outside -> outer) --- src/relaxng/geometry.rnc | 8 ++++---- src/relaxng/geometry.rng | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/relaxng/geometry.rnc b/src/relaxng/geometry.rnc index cebbc5b6a3..82f1f15b32 100644 --- a/src/relaxng/geometry.rnc +++ b/src/relaxng/geometry.rnc @@ -6,7 +6,7 @@ element geometry { (element universe { xsd:int } | attribute universe { xsd:int })? & ( (element fill { xsd:int } | attribute fill { xsd:int }) | - (element material { ( xsd:int | "void" ) } | + (element material { ( xsd:int | "void" ) } | attribute material { ( xsd:int | "void" ) }) ) & (element surfaces { list { xsd:int* } } | attribute surfaces { list { xsd:int* } })? & @@ -18,7 +18,7 @@ element geometry { (element id { xsd:int } | attribute id { xsd:int }) & (element name { xsd:string { maxLength="52" } } | attribute name { xsd:string { maxLength="52" } })? & - (element type { xsd:string { maxLength = "15" } } | + (element type { xsd:string { maxLength = "15" } } | attribute type { xsd:string { maxLength = "15" } }) & (element coeffs { list { xsd:double+ } } | attribute coeffs { list { xsd:double+ } }) & (element boundary { ( "transmit" | "reflective" | "vacuum" ) } | @@ -29,12 +29,12 @@ element geometry { (element id { xsd:int } | attribute id { xsd:int }) & (element name { xsd:string { maxLength="52" } } | attribute name { xsd:string { maxLength="52" } })? & - (element dimension { list { xsd:positiveInteger+ } } | + (element dimension { list { xsd:positiveInteger+ } } | attribute dimension { list { xsd:positiveInteger+ } }) & (element lower_left { list { xsd:double+ } } | attribute lower_left { list { xsd:double+ } }) & (element pitch { list { xsd:double+ } } | attribute pitch { list { xsd:double+ } }) & (element universes { list { xsd:int+ } } | attribute universes { list { xsd:int+ } }) & - (element outside { xsd:int } | attribute outside { xsd:int })? + (element outer { xsd:int } | attribute outer { xsd:int })? }* & element hex_lattice { diff --git a/src/relaxng/geometry.rng b/src/relaxng/geometry.rng index fdbf74cbd5..9bd573b346 100644 --- a/src/relaxng/geometry.rng +++ b/src/relaxng/geometry.rng @@ -282,10 +282,10 @@ - + - + From 9a0acdebc35477cd06ed0329de68bacd6b68f5fb Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 08:39:33 +0700 Subject: [PATCH 135/519] Write constant values as strings in HDF5 formats. This includes things like the run mode, tally estimator, filter type, tally scores, etc. Also do not write nuclides in summary file. --- openmc/constants.py | 129 ----------------- openmc/filter.py | 6 +- openmc/particle_restart.py | 4 +- openmc/statepoint.py | 25 ++-- openmc/summary.py | 93 +++--------- openmc/surface.py | 5 +- src/particle_restart.F90 | 9 +- src/particle_restart_write.F90 | 11 +- src/state_point.F90 | 255 ++++++++++++++------------------- src/summary.F90 | 216 +++++++++------------------- 10 files changed, 232 insertions(+), 521 deletions(-) delete mode 100644 openmc/constants.py diff --git a/openmc/constants.py b/openmc/constants.py deleted file mode 100644 index 797c990919..0000000000 --- a/openmc/constants.py +++ /dev/null @@ -1,129 +0,0 @@ -"""Dictionaries of integer-to-string mappings from openmc/src/constants.F90""" - -RUN_TYPES = {1: 'fixed source', - 2: 'k-eigenvalue', - 3: 'plot', - 4: 'particle restart'} - -SURFACE_TYPES = {1: 'x-plane', - 2: 'y-plane', - 3: 'z-plane', - 4: 'plane', - 5: 'x-cylinder', - 6: 'y-cylinder', - 7: 'z-cylinder', - 8: 'sphere', - 9: 'x-cone', - 10: 'y-cone', - 11: 'z-cone'} - -BC_TYPES = {0: 'transmission', - 1: 'vacuum', - 2: 'reflective', - 3: 'periodic'} - -FILL_TYPES = {1: 'normal', - 2: 'fill', - 3: 'lattice'} - -LATTICE_TYPES = {1: 'rectangular', - 2: 'hexagonal'} - -ESTIMATOR_TYPES = {1: 'analog', - 2: 'tracklength', - 3: 'collision'} - -FILTER_TYPES = {1: 'universe', - 2: 'material', - 3: 'cell', - 4: 'cellborn', - 5: 'surface', - 6: 'mesh', - 7: 'energy', - 8: 'energyout', - 9: 'distribcell'} - -SCORE_TYPES = {-1: 'flux', - -2: 'total', - -3: 'scatter', - -4: 'nu-scatter', - -5: 'scatter-n', - -6: 'scatter-pn', - -7: 'nu-scatter-n', - -8: 'nu-scatter-pn', - -9: 'transport', - -10: 'n1n', - -11: 'absorption', - -12: 'fission', - -13: 'nu-fission', - -14: 'kappa-fission', - -15: 'current', - -16: 'flux-yn', - -17: 'total-yn', - -18: 'scatter-yn', - -19: 'nu-scatter-yn', - -20: 'events', - 1: '(n,total)', - 2: '(n,elastic)', - 4: '(n,level)', - 11: '(n,2nd)', - 16: '(n,2n)', - 17: '(n,3n)', - 18: '(n,fission)', - 19: '(n,f)', - 20: '(n,nf)', - 21: '(n,2nf)', - 22: '(n,na)', - 23: '(n,n3a)', - 24: '(n,2na)', - 25: '(n,3na)', - 28: '(n,np)', - 29: '(n,n2a)', - 30: '(n,2n2a)', - 32: '(n,nd)', - 33: '(n,nt)', - 34: '(n,nHe-3)', - 35: '(n,nd2a)', - 36: '(n,nt2a)', - 37: '(n,4n)', - 38: '(n,3nf)', - 41: '(n,2np)', - 42: '(n,3np)', - 44: '(n,n2p)', - 45: '(n,npa)', - 91: '(n,nc)', - 101: '(n,disappear)', - 102: '(n,gamma)', - 103: '(n,p)', - 104: '(n,d)', - 105: '(n,t)', - 106: '(n,3He)', - 107: '(n,a)', - 108: '(n,2a)', - 109: '(n,3a)', - 111: '(n,2p)', - 112: '(n,pa)', - 113: '(n,t2a)', - 114: '(n,d2a)', - 115: '(n,pd)', - 116: '(n,pt)', - 117: '(n,da)', - 201: '(n,Xn)', - 202: '(n,Xgamma)', - 203: '(n,Xp)', - 204: '(n,Xd)', - 205: '(n,Xt)', - 206: '(n,X3He)', - 207: '(n,Xa)', - 444: '(damage)', - 649: '(n,pc)', - 699: '(n,dc)', - 749: '(n,tc)', - 799: '(n,3Hec)', - 849: '(n,tc)'} -SCORE_TYPES.update({MT: '(n,n' + str(MT-50) + ')' for MT in range(51,91)}) -SCORE_TYPES.update({MT: '(n,p' + str(MT-600) + ')' for MT in range(600,649)}) -SCORE_TYPES.update({MT: '(n,d' + str(MT-650) + ')' for MT in range(650,699)}) -SCORE_TYPES.update({MT: '(n,t' + str(MT-700) + ')' for MT in range(700,749)}) -SCORE_TYPES.update({MT: '(n,3He' + str(MT-750) + ')' for MT in range(750,649)}) -SCORE_TYPES.update({MT: '(n,a' + str(MT-800) + ')' for MT in range(800,849)}) diff --git a/openmc/filter.py b/openmc/filter.py index b9b6df36b5..6dd4bdaff6 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -5,10 +5,12 @@ from numbers import Real, Integral import numpy as np from openmc import Mesh -from openmc.constants import * from openmc.checkvalue import check_type, check_iterable_type, \ check_greater_than, _isinstance +_FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', + 'mesh', 'energy', 'energyout', 'distribcell'] + 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. @@ -109,7 +111,7 @@ class Filter(object): def type(self, type): if type is None: self._type = type - elif type not in FILTER_TYPES.values(): + elif type not in _FILTER_TYPES: msg = 'Unable to set Filter type to "{0}" since it is not one ' \ 'of the supported types'.format(type) raise ValueError(msg) diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index 3ab2945857..ff47ef474f 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -1,7 +1,5 @@ import struct -from openmc.constants import RUN_TYPES - class Particle(object): """Information used to restart a specific particle that caused a simulation to @@ -74,7 +72,7 @@ class Particle(object): @property def run_mode(self): - return RUN_TYPES[self._f['run_mode'].value] + return self._f['run_mode'].value.decode() @property def uvw(self): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index d5f220a9c7..7d5e96b817 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -4,7 +4,6 @@ import sys import numpy as np import openmc -from openmc.constants import * if sys.version > '3': long = int @@ -317,7 +316,7 @@ class StatePoint(object): @property def run_mode(self): - return RUN_TYPES[self._f['run_mode'].value] + return self._f['run_mode'].value.decode() @property def seed(self): @@ -355,16 +354,14 @@ class StatePoint(object): # Iterate over all Tallies for tally_key in tally_keys: - # Read integer Tally estimator type code (analog, tracklength, or collision) - estimator_type = self._f['{0}{1}/estimator'.format(base, tally_key)].value - # Read the Tally size specifications n_realizations = self._f['{0}{1}/n_realizations'.format(base, tally_key)].value # Create Tally object and assign basic properties tally = openmc.Tally(tally_key) tally._statepoint = self - tally.estimator = ESTIMATOR_TYPES[estimator_type] + tally.estimator = self._f['{0}{1}/estimator'.format( + base, tally_key)].value.decode() tally.num_realizations = n_realizations # Read the number of Filters @@ -375,8 +372,8 @@ class StatePoint(object): # Initialize all Filters for j in range(1, n_filters+1): - # Read the integer Filter type code - filter_type = self._f['{0}{1}/type'.format(subbase, j)].value + # Read the Filter type + filter_type = self._f['{0}{1}/type'.format(subbase, j)].value.decode() # Read the Filter offset offset = self._f['{0}{1}/offset'.format(subbase, j)].value @@ -389,21 +386,21 @@ class StatePoint(object): raise ValueError(msg) # Read the bin values - if FILTER_TYPES[filter_type] in ['energy', 'energyout']: + if filter_type in ['energy', 'energyout']: bins = self._f['{0}{1}/bins'.format(subbase, j)].value - elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: + elif filter_type in ['mesh', 'distribcell']: bins = self._f['{0}{1}/bins'.format(subbase, j)].value else: bins = self._f['{0}{1}/bins'.format(subbase, j)].value # Create Filter object - filter = openmc.Filter(FILTER_TYPES[filter_type], bins) + filter = openmc.Filter(filter_type, bins) filter.offset = offset filter.num_bins = n_bins - if FILTER_TYPES[filter_type] == 'mesh': + if filter_type == 'mesh': mesh_ids = self._f['tallies/meshes/ids'].value mesh_keys = self._f['tallies/meshes/keys'].value @@ -427,9 +424,8 @@ class StatePoint(object): tally.num_score_bins = n_score_bins - score_bins = self._f['{0}{1}/score_bins'.format( + scores = self._f['{0}{1}/scores'.format( base, tally_key)].value - scores = [SCORE_TYPES[score] for score in score_bins] n_user_scores = self._f['{0}{1}/n_user_score_bins' .format(base, tally_key)].value @@ -447,6 +443,7 @@ class StatePoint(object): # Add the scores to the Tally for j, score in enumerate(scores): + score = score.decode() # If this is a scattering moment, insert the scattering order if '-n' in score: score = score.replace('-n', '-' + moments[j].decode()) diff --git a/openmc/summary.py b/openmc/summary.py index aeba2f94b4..34c6e102d1 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -46,7 +46,6 @@ class Summary(object): def _read_geometry(self): # Read in and initialize the Materials and Geometry - self._read_nuclides() self._read_materials() self._read_surfaces() self._read_cells() @@ -54,35 +53,6 @@ class Summary(object): self._read_lattices() self._finalize_geometry() - def _read_nuclides(self): - self.n_nuclides = self._f['nuclides/n_nuclides'] - - # Initialize dictionary for each Nuclide - # Keys - Nuclide ZAIDs - # Values - Nuclide objects - self.nuclides = {} - - for key in self._f['nuclides'].keys(): - if key == 'n_nuclides': - continue - - index = self._f['nuclides'][key]['index'].value - alias = self._f['nuclides'][key]['alias'].value.decode() - zaid = self._f['nuclides'][key]['zaid'].value - - # Read the Nuclide's name (e.g., 'H-1' or 'U-235') - name = alias.split('.')[0] - - # Read the Nuclide's cross-section identifier (e.g., '70c') - xs = alias.split('.')[1] - - # Initialize this Nuclide and add to global dictionary of Nuclides - if 'nat' in name: - self.nuclides[zaid] = openmc.Element(name=name, xs=xs) - else: - self.nuclides[zaid] = openmc.Nuclide(name=name, xs=xs) - self.nuclides[zaid].zaid = zaid - def _read_materials(self): self.n_materials = self._f['n_materials'].value @@ -100,18 +70,14 @@ class Summary(object): name = self._f['materials'][key]['name'].value.decode() density = self._f['materials'][key]['atom_density'].value nuc_densities = self._f['materials'][key]['nuclide_densities'][...] - nuclides = self._f['materials'][key]['nuclides'][...] - n_sab = self._f['materials'][key]['n_sab'].value + nuclides = self._f['materials'][key]['nuclides'].value - # Read the names of the S(a,b) tables for this Material - if n_sab > 0: + # Read the names of the S(a,b) tables for this Material and add them + if 'sab_names' in self._f['materials'][key]: sab_tables = self._f['materials'][key]['sab_names'].value - sab_names = [] - sab_xs = [] for sab_table in sab_tables: name, xs = sab_table.decode().split('.') - sab_names.append(name) - sab_xs.append(xs) + material.add_s_alpha_beta(name, xs) # Create the Material material = openmc.Material(material_id=material_id, name=name) @@ -119,22 +85,21 @@ class Summary(object): # Set the Material's density to g/cm3 - this is what is used in OpenMC material.set_density(density=density, units='g/cm3') - # Add all Nuclides to the Material - for i, zaid in enumerate(nuclides): - nuclide = self.get_nuclide_by_zaid(zaid) - density = nuc_densities[i] + # Add all nuclides to the Material + for fullname, density in zip(nuclides, nuc_densities): + fullname = fullname.decode().strip() + name, xs = fullname.split('.') + + if 'nat' in name: + nuclide = openmc.Element(name=name, xs=xs) + else: + nuclide = openmc.Nuclide(name=name, xs=xs) if isinstance(nuclide, openmc.Nuclide): material.add_nuclide(nuclide, percent=density, percent_type='ao') elif isinstance(nuclide, openmc.Element): material.add_element(nuclide, percent=density, percent_type='ao') - # Add S(a,b) table(s?) to the Material - for i in range(n_sab): - name = sab_names[i] - xs = sab_xs[i] - material.add_s_alpha_beta(name, xs) - # Add the Material to the global dictionary of all Materials self.materials[index] = material @@ -540,9 +505,9 @@ class Summary(object): tally = openmc.Tally(tally_id, tally_name) # Read score metadata - score_bins = self._f['{0}/score_bins'.format(subbase)][...] - for score_bin in score_bins: - tally.add_score(openmc.SCORE_TYPES[score_bin]) + scores = self._f['{0}/scores'.format(subbase)].value + for score in scores: + tally.add_score(score.decode()) num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] tally.num_score_bins = num_score_bins @@ -554,8 +519,7 @@ class Summary(object): subsubbase = '{0}/filter {1}'.format(subbase, j) # Read filter type (e.g., "cell", "energy", etc.) - filter_type_code = self._f['{0}/type'.format(subsubbase)].value - filter_type = openmc.FILTER_TYPES[filter_type_code] + filter_type = self._f['{0}/type'.format(subsubbase)].value.decode() # Read the filter bins num_bins = self._f['{0}/n_bins'.format(subsubbase)].value @@ -587,29 +551,6 @@ class Summary(object): if self.opencg_geometry is None: self.opencg_geometry = get_opencg_geometry(self.openmc_geometry) - def get_nuclide_by_zaid(self, zaid): - """Return a Nuclide object given the 'zaid' identifier for the nuclide. - - Parameters - ---------- - zaid : int - 1000*Z + A, where Z is the atomic number of the nuclide and A is the - mass number. For example, the zaid for U-235 is 92235. - - Returns - ------- - nuclide : openmc.nuclide.Nuclide or None - Nuclide matching the specified zaid, or None if no matching object - is found. - - """ - - for index, nuclide in self.nuclides.items(): - if nuclide._zaid == zaid: - return nuclide - - return None - def get_material_by_id(self, material_id): """Return a Material object given the material id diff --git a/openmc/surface.py b/openmc/surface.py index d5d258fa7a..203e7e1e0e 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -4,7 +4,6 @@ from xml.etree import ElementTree as ET import sys from openmc.checkvalue import check_type, check_value, check_greater_than -from openmc.constants import BC_TYPES if sys.version_info[0] >= 3: basestring = str @@ -12,6 +11,8 @@ if sys.version_info[0] >= 3: # A static variable for auto-generated Surface IDs AUTO_SURFACE_ID = 10000 +_BC_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] + def reset_auto_surface_id(): global AUTO_SURFACE_ID @@ -106,7 +107,7 @@ class Surface(object): @boundary_type.setter def boundary_type(self, boundary_type): check_type('boundary type', boundary_type, basestring) - check_value('boundary type', boundary_type, BC_TYPES.values()) + check_value('boundary type', boundary_type, _BC_TYPES) self._boundary_type = boundary_type def __repr__(self): diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index c8874b0715..2e0523d484 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -71,6 +71,7 @@ contains integer :: int_scalar integer(HID_T) :: file_id + character(MAX_WORD_LEN) :: mode ! Write meessage call write_message("Loading particle restart file " & @@ -86,7 +87,13 @@ contains call read_dataset(file_id, 'gen_per_batch', gen_per_batch) call read_dataset(file_id, 'current_gen', current_gen) call read_dataset(file_id, 'n_particles', n_particles) - call read_dataset(file_id, 'run_mode', previous_run_mode) + call read_dataset(file_id, 'run_mode', mode) + select case (mode) + case ('k-eigenvalue') + previous_run_mode = MODE_EIGENVALUE + case ('fixed source') + previous_run_mode = MODE_FIXEDSOURCE + end select call read_dataset(file_id, 'id', p%id) call read_dataset(file_id, 'weight', p%wgt) call read_dataset(file_id, 'energy', p%E) diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index 8b19bb879e..77de7f669a 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -46,7 +46,16 @@ contains call write_dataset(file_id, 'gen_per_batch', gen_per_batch) call write_dataset(file_id, 'current_gen', current_gen) call write_dataset(file_id, 'n_particles', n_particles) - call write_dataset(file_id, 'run_mode', run_mode) + select case(run_mode) + case (MODE_FIXEDSOURCE) + call write_dataset(file_id, 'run_mode', 'fixed source') + case (MODE_EIGENVALUE) + call write_dataset(file_id, 'run_mode', 'k-eigenvalue') + case (MODE_PLOTTING) + call write_dataset(file_id, 'run_mode', 'plot') + case (MODE_PARTICLE) + call write_dataset(file_id, 'run_mode', 'particle restart') + end select call write_dataset(file_id, 'id', p%id) call write_dataset(file_id, 'weight', src%wgt) call write_dataset(file_id, 'energy', src%E) diff --git a/src/state_point.F90 b/src/state_point.F90 index 97375c89cf..60057a2c9b 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -13,6 +13,7 @@ module state_point use constants + use endf, only: reaction_name use error, only: fatal_error, warning use global use hdf5_interface @@ -50,6 +51,7 @@ contains integer(HID_T) :: tallies_group, tally_group integer(HID_T) :: meshes_group, mesh_group integer(HID_T) :: filter_group + character(20), allocatable :: scores(:) character(8), allocatable :: moment_names(:) ! names of moments (e.g, P3) character(MAX_FILE_LEN) :: filename type(StructuredMesh), pointer :: meshp @@ -90,7 +92,16 @@ contains call write_dataset(file_id, "seed", seed) ! Write run information - call write_dataset(file_id, "run_mode", run_mode) + select case(run_mode) + case (MODE_FIXEDSOURCE) + call write_dataset(file_id, "run_mode", "fixed source") + case (MODE_EIGENVALUE) + call write_dataset(file_id, "run_mode", "k-eigenvalue") + case (MODE_PLOTTING) + call write_dataset(file_id, "run_mode", "plot") + case (MODE_PARTICLE) + call write_dataset(file_id, "run_mode", "particle restart") + end select call write_dataset(file_id, "n_particles", n_particles) call write_dataset(file_id, "n_batches", n_batches) @@ -214,7 +225,14 @@ contains tally_group = create_group(tallies_group, "tally " // & trim(to_str(tally%id))) - call write_dataset(tally_group, "estimator", tally%estimator) + select case(tally%estimator) + case (ESTIMATOR_ANALOG) + call write_dataset(tally_group, "estimator", "analog") + case (ESTIMATOR_TRACKLENGTH) + call write_dataset(tally_group, "estimator", "tracklength") + case (ESTIMATOR_COLLISION) + call write_dataset(tally_group, "estimator", "collision") + end select call write_dataset(tally_group, "n_realizations", tally%n_realizations) call write_dataset(tally_group, "n_filters", tally%n_filters) @@ -223,7 +241,28 @@ contains filter_group = create_group(tally_group, "filter " // & trim(to_str(j))) - call write_dataset(filter_group, "type", tally%filters(j)%type) + ! Write name of type + select case (tally%filters(j)%type) + case(FILTER_UNIVERSE) + call write_dataset(filter_group, "type", "universe") + case(FILTER_MATERIAL) + call write_dataset(filter_group, "type", "material") + case(FILTER_CELL) + call write_dataset(filter_group, "type", "cell") + case(FILTER_CELLBORN) + call write_dataset(filter_group, "type", "cellborn") + case(FILTER_SURFACE) + call write_dataset(filter_group, "type", "surface") + case(FILTER_MESH) + call write_dataset(filter_group, "type", "mesh") + case(FILTER_ENERGYIN) + call write_dataset(filter_group, "type", "energy") + case(FILTER_ENERGYOUT) + call write_dataset(filter_group, "type", "energyout") + case(FILTER_DISTRIBCELL) + call write_dataset(filter_group, "type", "distribcell") + end select + call write_dataset(filter_group, "offset", tally%filters(j)%offset) call write_dataset(filter_group, "n_bins", tally%filters(j)%n_bins) if (tally%filters(j)%type == FILTER_ENERGYIN .or. & @@ -253,9 +292,59 @@ contains deallocate(key_array) call write_dataset(tally_group, "n_score_bins", tally%n_score_bins) + allocate(scores(size(tally%score_bins))) + do j = 1, size(tally%score_bins) + select case(tally%score_bins(j)) + case (SCORE_FLUX) + scores(j) = "flux" + case (SCORE_TOTAL) + scores(j) = "total" + case (SCORE_SCATTER) + scores(j) = "scatter" + case (SCORE_NU_SCATTER) + scores(j) = "nu-scatter" + case (SCORE_SCATTER_N) + scores(j) = "scatter-n" + case (SCORE_SCATTER_PN) + scores(j) = "scatter-pn" + case (SCORE_NU_SCATTER_N) + scores(j) = "nu-scatter-n" + case (SCORE_NU_SCATTER_PN) + scores(j) = "nu-scatter-pn" + case (SCORE_TRANSPORT) + scores(j) = "transport" + case (SCORE_N_1N) + scores(j) = "n1n" + case (SCORE_ABSORPTION) + scores(j) = "absorption" + case (SCORE_FISSION) + scores(j) = "fission" + case (SCORE_NU_FISSION) + scores(j) = "nu-fission" + case (SCORE_KAPPA_FISSION) + scores(j) = "kappa-fission" + case (SCORE_CURRENT) + scores(j) = "current" + case (SCORE_FLUX_YN) + scores(j) = "flux-yn" + case (SCORE_TOTAL_YN) + scores(j) = "total-yn" + case (SCORE_SCATTER_YN) + scores(j) = "scatter-yn" + case (SCORE_NU_SCATTER_YN) + scores(j) = "nu-scatter-yn" + case (SCORE_EVENTS) + scores(j) = "events" + case default + scores(j) = reaction_name(tally%score_bins(j)) + end select + end do + call write_dataset(tally_group, "scores", scores) call write_dataset(tally_group, "score_bins", tally%score_bins) call write_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) + deallocate(scores) + ! Write explicit moment order strings for each score bin k = 1 allocate(moment_names(tally%n_score_bins)) @@ -578,22 +667,15 @@ contains subroutine load_state_point() - integer :: i, j - integer :: int_array(3) - integer :: curr_key - integer, allocatable :: id_array(:) - integer, allocatable :: key_array(:) - integer, allocatable :: temp_array(:) + integer :: i + integer :: int_array(3) integer(HID_T) :: file_id integer(HID_T) :: cmfd_group - integer(HID_T) :: tallies_group, tally_group - integer(HID_T) :: meshes_group, mesh_group - integer(HID_T) :: filter_group - real(8) :: real_array(3) - logical :: source_present - character(MAX_FILE_LEN) :: path_temp - character(19) :: current_time - type(StructuredMesh), pointer :: meshp + integer(HID_T) :: tallies_group + integer(HID_T) :: tally_group + real(8) :: real_array(3) + logical :: source_present + character(MAX_WORD_LEN) :: word type(TallyObject), pointer :: tally ! Write message @@ -614,27 +696,17 @@ contains &in OpenMC.") end if - ! Read OpenMC version - call read_dataset(file_id, "version_major", int_array(1)) - call read_dataset(file_id, "version_minor", int_array(2)) - call read_dataset(file_id, "version_release", int_array(3)) - if (int_array(1) /= VERSION_MAJOR .or. int_array(2) /= VERSION_MINOR & - .or. int_array(3) /= VERSION_RELEASE) then - if (master) call warning("State point file was created with a different & - &version of OpenMC.") - end if - - ! Read date and time - call read_dataset(file_id, "date_and_time", current_time) - - ! Read path to input - call read_dataset(file_id, "path", path_temp) - ! Read and overwrite random number seed call read_dataset(file_id, "seed", seed) ! Read and overwrite run information except number of batches - call read_dataset(file_id, "run_mode", run_mode) + call read_dataset(file_id, "run_mode", word) + select case(word) + case ('fixed source') + run_mode = MODE_FIXEDSOURCE + case ('k-eigenvalue') + run_mode = MODE_EIGENVALUE + end select call read_dataset(file_id, "n_particles", n_particles) call read_dataset(file_id, "n_batches", int_array(1)) @@ -694,108 +766,6 @@ contains end if end if - ! Read number of meshes - tallies_group = open_group(file_id, "tallies") - meshes_group = open_group(tallies_group, "meshes") - call read_dataset(meshes_group, "n_meshes", n_meshes) - - if (n_meshes > 0) then - - ! Read list of mesh keys-> IDs - allocate(id_array(n_meshes)) - allocate(key_array(n_meshes)) - - call read_dataset(meshes_group, "ids", id_array) - call read_dataset(meshes_group, "keys", key_array) - - ! Read and overwrite mesh information - MESH_LOOP: do i = 1, n_meshes - - meshp => meshes(id_array(i)) - curr_key = key_array(id_array(i)) - - mesh_group = open_group(meshes_group, "mesh " // & - trim(to_str(curr_key))) - call read_dataset(mesh_group, "id", meshp%id) - call read_dataset(mesh_group, "type", meshp%type) - call read_dataset(mesh_group, "n_dimension", meshp%n_dimension) - call read_dataset(mesh_group, "dimension", meshp%dimension) - call read_dataset(mesh_group, "lower_left", meshp%lower_left) - call read_dataset(mesh_group, "upper_right", meshp%upper_right) - call read_dataset(mesh_group, "width", meshp%width) - call close_group(mesh_group) - end do MESH_LOOP - - deallocate(id_array) - deallocate(key_array) - - end if - - call close_group(meshes_group) - - ! Read and overwrite number of tallies - call read_dataset(tallies_group, "n_tallies", n_tallies) - - ! Read list of tally keys-> IDs - allocate(id_array(n_tallies)) - allocate(key_array(n_tallies)) - - call read_dataset(tallies_group, "ids", id_array) - call read_dataset(tallies_group, "keys", key_array) - - ! Read in tally metadata - TALLY_METADATA: do i = 1, n_tallies - - ! Get pointer to tally - tally => tallies(i) - curr_key = key_array(id_array(i)) - tally_group = open_group(tallies_group, "tally " // & - trim(to_str(curr_key))) - - call read_dataset(tally_group, "estimator", tally%estimator) - call read_dataset(tally_group, "n_realizations", tally%n_realizations) - call read_dataset(tally_group, "n_filters", tally%n_filters) - - FILTER_LOOP: do j = 1, tally%n_filters - filter_group = open_group(tally_group, "filter " // trim(to_str(j))) - - call read_dataset(filter_group, "type", tally%filters(j)%type) - call read_dataset(filter_group, "offset", tally%filters(j)%offset) - call read_dataset(filter_group, "n_bins", tally%filters(j)%n_bins) - if (tally%filters(j)%type == FILTER_ENERGYIN .or. & - tally%filters(j)%type == FILTER_ENERGYOUT) then - call read_dataset(filter_group, "bins", tally%filters(j)%real_bins) - else - call read_dataset(filter_group, "bins", tally%filters(j)%int_bins) - end if - - call close_group(filter_group) - end do FILTER_LOOP - - call read_dataset(tally_group, "n_nuclides", tally%n_nuclide_bins) - - ! Set up nuclide bin array and then read - allocate(temp_array(tally%n_nuclide_bins)) - call read_dataset(tally_group, "nuclides", temp_array) - - NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins - if (temp_array(j) > 0) then - tally%nuclide_bins(j) = temp_array(j) - else - tally%nuclide_bins(j) = temp_array(j) - end if - end do NUCLIDE_LOOP - - deallocate(temp_array) - - ! Write number of score bins, score bins, user score bins - call read_dataset(tally_group, "n_score_bins", tally%n_score_bins) - call read_dataset(tally_group, "score_bins", tally%score_bins) - call read_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) - - call close_group(tally_group) - end do TALLY_METADATA - ! Check to make sure source bank is present if (path_source_point == path_state_point .and. .not. source_present) then call fatal_error("Source bank must be contained in statepoint restart & @@ -808,13 +778,6 @@ contains ! Read number of realizations for global tallies call read_dataset(file_id, "n_realizations", n_realizations, indep=.true.) - ! Read number of global tallies - call read_dataset(file_id, "n_global_tallies", int_array(1), indep=.false.) - if (int_array(1) /= N_GLOBAL_TALLIES) then - call fatal_error("Number of global tallies does not match in state & - &point.") - end if - ! Read global tally data call read_dataset(file_id, "global_tallies", global_tallies) @@ -825,14 +788,12 @@ contains ! Read in sum and sum squared if (int_array(1) == 1) then TALLY_RESULTS: do i = 1, n_tallies - ! Set pointer to tally tally => tallies(i) - curr_key = key_array(id_array(i)) ! Read sum and sum_sq for each bin tally_group = open_group(tallies_group, "tally " // & - trim(to_str(curr_key))) + trim(to_str(tally%id))) call read_dataset(tally_group, "results", tally%results) call close_group(tally_group) end do TALLY_RESULTS @@ -841,8 +802,6 @@ contains call close_group(tallies_group) end if - deallocate(id_array) - deallocate(key_array) ! Read source if in eigenvalue mode if (run_mode == MODE_EIGENVALUE) then diff --git a/src/summary.F90 b/src/summary.F90 index 68f967a744..e9717bc09c 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -62,7 +62,6 @@ contains call write_geometry(file_id) call write_materials(file_id) - call write_nuclides(file_id) if (n_tallies > 0) then call write_tallies(file_id) end if @@ -238,16 +237,6 @@ contains ! Write coefficients for surface call write_dataset(surface_group, "coefficients", s%coeffs) - ! Write positive neighbors - if (allocated(s%neighbor_pos)) then - call write_dataset(surface_group, "neighbors_positive", s%neighbor_pos) - end if - - ! Write negative neighbors - if (allocated(s%neighbor_neg)) then - call write_dataset(surface_group, "neighbors_negative", s%neighbor_neg) - end if - ! Write boundary condition select case (s%bc) case (BC_TRANSMIT) @@ -395,9 +384,10 @@ contains subroutine write_materials(file_id) integer(HID_T), intent(in) :: file_id - integer :: i - integer :: j - integer, allocatable :: zaids(:) + integer :: i + integer :: j + integer :: i_list + character(12), allocatable :: nucnames(:) integer(HID_T) :: materials_group integer(HID_T) :: material_group type(Material), pointer :: m @@ -425,26 +415,22 @@ contains "atom/b-cm") ! Copy ZAID for each nuclide to temporary array - allocate(zaids(m%n_nuclides)) + allocate(nucnames(m%n_nuclides)) do j = 1, m%n_nuclides - zaids(j) = nuclides(m%nuclide(j))%zaid + i_list = nuclides(m%nuclide(j))%listing + nucnames(j) = xs_listings(i_list)%alias end do ! Write temporary array to 'nuclides' - call write_dataset(material_group, "nuclides", zaids) + call write_dataset(material_group, "nuclides", nucnames) ! Deallocate temporary array - deallocate(zaids) + deallocate(nucnames) ! Write atom densities call write_dataset(material_group, "nuclide_densities", m%atom_density) - ! Write S(a,b) information if present - call write_dataset(material_group, "n_sab", m%n_sab) - if (m%n_sab > 0) then - call write_dataset(material_group, "i_sab_nuclides", m%i_sab_nuclides) - call write_dataset(material_group, "i_sab_tables", m%i_sab_tables) call write_dataset(material_group, "sab_names", m%sab_names) end if @@ -462,12 +448,13 @@ contains subroutine write_tallies(file_id) integer(HID_T), intent(in) :: file_id - integer :: i, j + integer :: i, j integer, allocatable :: temp_array(:) ! nuclide bin array integer(HID_T) :: tallies_group integer(HID_T) :: mesh_group integer(HID_T) :: tally_group integer(HID_T) :: filter_group + character(20), allocatable :: scores(:) type(StructuredMesh), pointer :: m type(TallyObject), pointer :: t @@ -486,7 +473,6 @@ contains ! Write type and number of dimensions call write_dataset(mesh_group, "type", m%type) - call write_dataset(mesh_group, "n_dimension", m%n_dimension) ! Write mesh information call write_dataset(mesh_group, "dimension", m%dimension) @@ -521,9 +507,6 @@ contains FILTER_LOOP: do j = 1, t%n_filters filter_group = create_group(tally_group, "filter " // trim(to_str(j))) - ! Write type of filter - call write_dataset(filter_group, "type", t%filters(j)%type) - ! Write number of bins for this filter call write_dataset(filter_group, "n_bins", t%filters(j)%n_bins) @@ -538,21 +521,23 @@ contains ! Write name of type select case (t%filters(j)%type) case(FILTER_UNIVERSE) - call write_dataset(filter_group, "type_name", "universe") + call write_dataset(filter_group, "type", "universe") case(FILTER_MATERIAL) - call write_dataset(filter_group, "type_name", "material") + call write_dataset(filter_group, "type", "material") case(FILTER_CELL) - call write_dataset(filter_group, "type_name", "cell") + call write_dataset(filter_group, "type", "cell") case(FILTER_CELLBORN) - call write_dataset(filter_group, "type_name", "cellborn") + call write_dataset(filter_group, "type", "cellborn") case(FILTER_SURFACE) - call write_dataset(filter_group, "type_name", "surface") + call write_dataset(filter_group, "type", "surface") case(FILTER_MESH) - call write_dataset(filter_group, "type_name", "mesh") + call write_dataset(filter_group, "type", "mesh") case(FILTER_ENERGYIN) - call write_dataset(filter_group, "type_name", "energy") + call write_dataset(filter_group, "type", "energy") case(FILTER_ENERGYOUT) - call write_dataset(filter_group, "type_name", "energyout") + call write_dataset(filter_group, "type", "energyout") + case(FILTER_DISTRIBCELL) + call write_dataset(filter_group, "type", "distribcell") end select call close_group(filter_group) @@ -577,8 +562,58 @@ contains ! Write number of score bins call write_dataset(tally_group, "n_score_bins", t%n_score_bins) + allocate(scores(size(t%score_bins))) + do j = 1, size(t%score_bins) + select case(t%score_bins(j)) + case (SCORE_FLUX) + scores(j) = "flux" + case (SCORE_TOTAL) + scores(j) = "total" + case (SCORE_SCATTER) + scores(j) = "scatter" + case (SCORE_NU_SCATTER) + scores(j) = "nu-scatter" + case (SCORE_SCATTER_N) + scores(j) = "scatter-n" + case (SCORE_SCATTER_PN) + scores(j) = "scatter-pn" + case (SCORE_NU_SCATTER_N) + scores(j) = "nu-scatter-n" + case (SCORE_NU_SCATTER_PN) + scores(j) = "nu-scatter-pn" + case (SCORE_TRANSPORT) + scores(j) = "transport" + case (SCORE_N_1N) + scores(j) = "n1n" + case (SCORE_ABSORPTION) + scores(j) = "absorption" + case (SCORE_FISSION) + scores(j) = "fission" + case (SCORE_NU_FISSION) + scores(j) = "nu-fission" + case (SCORE_KAPPA_FISSION) + scores(j) = "kappa-fission" + case (SCORE_CURRENT) + scores(j) = "current" + case (SCORE_FLUX_YN) + scores(j) = "flux-yn" + case (SCORE_TOTAL_YN) + scores(j) = "total-yn" + case (SCORE_SCATTER_YN) + scores(j) = "scatter-yn" + case (SCORE_NU_SCATTER_YN) + scores(j) = "nu-scatter-yn" + case (SCORE_EVENTS) + scores(j) = "events" + case default + scores(j) = reaction_name(t%score_bins(j)) + end select + end do + call write_dataset(tally_group, "scores", scores) call write_dataset(tally_group, "score_bins", t%score_bins) + deallocate(scores) + call close_group(tally_group) end do TALLY_METADATA @@ -586,115 +621,6 @@ contains end subroutine write_tallies -!=============================================================================== -! WRITE_NUCLIDES -!=============================================================================== - - subroutine write_nuclides(file_id) - integer(HID_T), intent(in) :: file_id - - integer :: i, j - integer :: size_total - integer :: size_xs - integer :: size_angle - integer :: size_energy - integer(HID_T) :: nuclides_group, nuclide_group - integer(HID_T) :: reactions_group, rxn_group - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn - type(UrrData), pointer :: urr - - nuclides_group = create_group(file_id, "nuclides") - - ! write number of nuclides - call write_dataset(nuclides_group, "n_nuclides", n_nuclides_total) - - ! Write information on each nuclide - NUCLIDE_LOOP: do i = 1, n_nuclides_total - nuc => nuclides(i) - nuclide_group = create_group(nuclides_group, nuc%name) - - ! Write internal OpenMC index for this nuclide - call write_dataset(nuclide_group, "index", i) - - ! Determine size of cross-sections - size_xs = (5 + nuc%n_reaction) * nuc%n_grid * 8 - size_total = size_xs - - ! Write some basic attributes - call write_dataset(nuclide_group, "zaid", nuc%zaid) - call write_dataset(nuclide_group, "alias", xs_listings(nuc%listing)%alias) - call write_dataset(nuclide_group, "awr", nuc%awr) - call write_dataset(nuclide_group, "kT", nuc%kT) - call write_dataset(nuclide_group, "n_grid", nuc%n_grid) - call write_dataset(nuclide_group, "n_reactions", nuc%n_reaction) - call write_dataset(nuclide_group, "n_fission", nuc%n_fission) - call write_dataset(nuclide_group, "size_xs", size_xs) - - ! ======================================================================= - ! WRITE INFORMATION ON EACH REACTION - - ! Create overall group for reactions and close it - reactions_group = create_group(nuclide_group, "reactions") - - RXN_LOOP: do j = 1, nuc%n_reaction - ! Information on each reaction - rxn => nuc%reactions(j) - rxn_group = create_group(reactions_group, trim(reaction_name(rxn%MT))) - - ! Determine size of angle distribution - if (rxn%has_angle_dist) then - size_angle = rxn%adist%n_energy * 16 + size(rxn%adist%data) * 8 - else - size_angle = 0 - end if - - ! Determine size of energy distribution - if (rxn%has_energy_dist) then - size_energy = size(rxn%edist%data) * 8 - else - size_energy = 0 - end if - - ! Write information on reaction - call write_dataset(rxn_group, "Q_value", rxn%Q_value) - call write_dataset(rxn_group, "multiplicity", rxn%multiplicity) - call write_dataset(rxn_group, "threshold", rxn%threshold) - call write_dataset(rxn_group, "size_angle", size_angle) - call write_dataset(rxn_group, "size_energy", size_energy) - - ! Accumulate data size - size_total = size_total + size_angle + size_energy - - call close_group(rxn_group) - end do RXN_LOOP - - call close_group(reactions_group) - - ! ======================================================================= - ! WRITE INFORMATION ON URR PROBABILITY TABLES - - if (nuc%urr_present) then - urr => nuc%urr_data - call write_dataset(nuclide_group, "urr_n_energy", urr%n_energy) - call write_dataset(nuclide_group, "urr_n_prob", urr%n_prob) - call write_dataset(nuclide_group, "urr_interp", urr%interp) - call write_dataset(nuclide_group, "urr_inelastic", urr%inelastic_flag) - call write_dataset(nuclide_group, "urr_absorption", urr%absorption_flag) - call write_dataset(nuclide_group, "urr_min_E", urr%energy(1)) - call write_dataset(nuclide_group, "urr_max_E", urr%energy(urr%n_energy)) - end if - - ! Write total memory used - call write_dataset(nuclide_group, "size_total", size_total) - - call close_group(nuclide_group) - end do NUCLIDE_LOOP - - call close_group(nuclides_group) - - end subroutine write_nuclides - !=============================================================================== ! WRITE_TIMING !=============================================================================== From 36a22174872403c7084e27ad37b0aa5609347ea9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 09:03:38 +0700 Subject: [PATCH 136/519] Write cell surface specification with user ids in summary.h5 --- openmc/summary.py | 4 ++-- src/summary.F90 | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 34c6e102d1..f599289af7 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -251,8 +251,8 @@ class Summary(object): for surface_halfspace in surfaces: halfspace = np.sign(surface_halfspace) - surface_id = np.abs(surface_halfspace) - surface = self.surfaces[surface_id] + surface_id = abs(surface_halfspace) + surface = self.get_surface_by_id(surface_id) cell.add_surface(surface, halfspace) # Add the Cell to the global dictionary of all Cells diff --git a/src/summary.F90 b/src/summary.F90 index e9717bc09c..90a4e726fd 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -106,6 +106,7 @@ contains integer :: i, j, k, m integer, allocatable :: lattice_universes(:,:,:) + integer, allocatable :: surface_ids(:) integer(HID_T) :: geom_group integer(HID_T) :: cells_group, cell_group integer(HID_T) :: surfaces_group, surface_group @@ -182,7 +183,13 @@ contains ! Write list of bounding surfaces if (c%n_surfaces > 0) then - call write_dataset(cell_group, "surfaces", c%surfaces) + allocate(surface_ids(c%n_surfaces)) + do j = 1, c%n_surfaces + k = c%surfaces(j) + surface_ids(j) = sign(surfaces(abs(k))%id, k) + end do + call write_dataset(cell_group, "surfaces", surface_ids) + deallocate(surface_ids) end if call close_group(cell_group) From 8753f2305954d2cac7b9efd0fda04e18abaa8bb3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 09:44:31 +0700 Subject: [PATCH 137/519] Change StructuredMesh to RegularMesh. Write type as 'regular'. --- openmc/mesh.py | 4 ++-- openmc/statepoint.py | 7 ++----- src/cmfd_data.F90 | 6 +++--- src/cmfd_execute.F90 | 5 ++--- src/cmfd_input.F90 | 8 ++++---- src/constants.F90 | 2 +- src/eigenvalue.F90 | 4 ++-- src/global.F90 | 8 ++++---- src/input_xml.F90 | 8 ++++---- src/mesh.F90 | 14 +++++++------- src/mesh_header.F90 | 4 ++-- src/output.F90 | 8 ++++---- src/plot.F90 | 3 ++- src/plot_header.F90 | 4 ++-- src/state_point.F90 | 6 +++--- src/summary.F90 | 6 +++--- src/tally.F90 | 8 ++++---- src/trigger.F90 | 3 ++- 18 files changed, 53 insertions(+), 55 deletions(-) diff --git a/openmc/mesh.py b/openmc/mesh.py index 7e907aaa57..fefc6d7074 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -54,7 +54,7 @@ class Mesh(object): # Initialize Mesh class attributes self.id = mesh_id self.name = name - self._type = 'rectangular' + self._type = 'regular' self._dimension = None self._lower_left = None self._upper_right = None @@ -156,7 +156,7 @@ class Mesh(object): check_type('type for mesh ID="{0}"'.format(self._id), meshtype, basestring) check_value('type for mesh ID="{0}"'.format(self._id), - meshtype, ['rectangular', 'hexagonal']) + meshtype, ['regular', 'hexagonal']) self._type = meshtype @dimension.setter diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 7d5e96b817..72c85d27ed 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -264,7 +264,7 @@ class StatePoint(object): for mesh_key in mesh_keys: # Read the user-specified Mesh ID and type mesh_id = self._f['{0}{1}/id'.format(base, mesh_key)].value - mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value + mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value.decode() # Read the mesh dimensions, lower-left coordinates, # upper-right coordinates, and width of each mesh cell @@ -275,14 +275,11 @@ class StatePoint(object): # Create the Mesh and assign properties to it mesh = openmc.Mesh(mesh_id) - mesh.dimension = dimension mesh.width = width mesh.lower_left = lower_left mesh.upper_right = upper_right - - #FIXME: Set the mesh type to 'rectangular' by default - mesh.type = 'rectangular' + mesh.type = mesh_type # Add mesh to the global dictionary of all Meshes self._meshes[mesh_id] = mesh diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index 2b17784196..19fe395728 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -57,7 +57,7 @@ contains use global, only: cmfd, n_cmfd_tallies, cmfd_tallies, meshes,& matching_bins use mesh, only: mesh_indices_to_bin - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use string, only: to_str use tally_header, only: TallyObject @@ -79,8 +79,8 @@ contains integer :: i_filter_eout ! index for outgoing energy filter integer :: i_filter_surf ! index for surface filter real(8) :: flux ! temp variable for flux - type(TallyObject), pointer :: t => null() ! pointer for tally object - type(StructuredMesh), pointer :: m => null() ! pointer for mesh object + type(TallyObject), pointer :: t ! pointer for tally object + type(RegularMesh), pointer :: m ! pointer for mesh object ! Extract spatial and energy indices from object nx = cmfd % indices(1) diff --git a/src/cmfd_execute.F90 b/src/cmfd_execute.F90 index c55d206cbc..4dfe99d770 100644 --- a/src/cmfd_execute.F90 +++ b/src/cmfd_execute.F90 @@ -217,7 +217,7 @@ contains use error, only: warning, fatal_error use global, only: meshes, source_bank, work, n_user_meshes, cmfd, & master - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use mesh, only: count_bank_sites, get_mesh_indices use search, only: binary_search use string, only: to_str @@ -239,8 +239,7 @@ contains integer :: n_groups ! number of energy groups logical :: outside ! any source sites outside mesh logical :: in_mesh ! source site is inside mesh - - type(StructuredMesh), pointer :: m ! point to mesh + type(RegularMesh), pointer :: m ! point to mesh ! Associate pointer m => meshes(n_user_meshes + 1) diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index 2d44d3e9bc..dac74c9c39 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -247,7 +247,7 @@ contains use constants, only: MAX_LINE_LEN use error, only: fatal_error, warning - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use string use tally, only: setup_active_cmfdtallies use tally_header, only: TallyObject, TallyFilter @@ -264,10 +264,10 @@ contains integer :: i_filter_mesh ! index for mesh filter integer :: iarray3(3) ! temp integer array real(8) :: rarray3(3) ! temp double array - type(TallyObject), pointer :: t => null() - type(StructuredMesh), pointer :: m => null() + type(TallyObject), pointer :: t + type(RegularMesh), pointer :: m type(TallyFilter) :: filters(N_FILTER_TYPES) ! temporary filters - type(Node), pointer :: node_mesh => null() + type(Node), pointer :: node_mesh ! Set global variables if they are 0 (this can happen if there is no tally ! file) diff --git a/src/constants.F90 b/src/constants.F90 index 7d71c0f287..962c4a6a2a 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -327,7 +327,7 @@ module constants RELATIVE_ERROR = 2, & STANDARD_DEVIATION = 3 - ! Global tallY parameters + ! Global tally parameters integer, parameter :: N_GLOBAL_TALLIES = 4 integer, parameter :: & K_COLLISION = 1, & diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 33d63b7cc9..403347caa1 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -9,7 +9,7 @@ module eigenvalue use global use math, only: t_percentile use mesh, only: count_bank_sites - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_skip use search, only: binary_search @@ -304,7 +304,7 @@ contains integer :: i, j, k ! index for bank sites integer :: n ! # of boxes in each dimension logical :: sites_outside ! were there sites outside entropy box? - type(StructuredMesh), pointer :: m => null() + type(RegularMesh), pointer :: m ! Get pointer to entropy mesh m => entropy_mesh diff --git a/src/global.F90 b/src/global.F90 index adc8f17dab..398b72e140 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -8,7 +8,7 @@ module global use dict_header, only: DictCharInt, DictIntInt use geometry_header, only: Cell, Universe, Lattice, LatticeContainer, Surface use material_header, only: Material - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use plot_header, only: ObjectPlot use set_header, only: SetInt use source_header, only: ExtSource @@ -90,7 +90,7 @@ module global ! ============================================================================ ! TALLY-RELATED VARIABLES - type(StructuredMesh), allocatable, target :: meshes(:) + type(RegularMesh), allocatable, target :: meshes(:) type(TallyObject), allocatable, target :: tallies(:) integer, allocatable :: matching_bins(:) @@ -203,11 +203,11 @@ module global logical :: entropy_on = .false. real(8), allocatable :: entropy(:) ! shannon entropy at each generation real(8), allocatable :: entropy_p(:,:,:,:) ! % of source sites in each cell - type(StructuredMesh), pointer :: entropy_mesh + type(RegularMesh), pointer :: entropy_mesh ! Uniform fission source weighting logical :: ufs = .false. - type(StructuredMesh), pointer :: ufs_mesh => null() + type(RegularMesh), pointer :: ufs_mesh => null() real(8), allocatable :: source_frac(:,:,:,:) ! Write source at end of simulation diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 15a08148d2..4abc83f6aa 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -8,7 +8,7 @@ module input_xml use geometry_header, only: Cell, Surface, Lattice, RectLattice, HexLattice use global use list_header, only: ListChar, ListReal - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use output, only: write_message use plot_header use random_lcg, only: prn @@ -2091,9 +2091,9 @@ contains character(MAX_WORD_LEN) :: temp_str character(MAX_WORD_LEN), allocatable :: sarray(:) type(DictCharInt) :: trigger_scores - type(ElemKeyValueCI), pointer :: pair_list => null() - type(TallyObject), pointer :: t => null() - type(StructuredMesh), pointer :: m => null() + type(ElemKeyValueCI), pointer :: pair_list + type(TallyObject), pointer :: t + type(RegularMesh), pointer :: m type(TallyFilter), allocatable :: filters(:) ! temporary filters type(Node), pointer :: doc => null() type(Node), pointer :: node_mesh => null() diff --git a/src/mesh.F90 b/src/mesh.F90 index b9d85f4397..3d0235d189 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -20,7 +20,7 @@ contains subroutine get_mesh_bin(m, xyz, bin) - type(StructuredMesh), pointer :: m ! mesh pointer + type(RegularMesh), pointer :: m ! mesh pointer real(8), intent(in) :: xyz(:) ! coordinates integer, intent(out) :: bin ! tally bin @@ -73,7 +73,7 @@ contains subroutine get_mesh_indices(m, xyz, ijk, in_mesh) - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m real(8), intent(in) :: xyz(:) ! coordinates to check integer, intent(out) :: ijk(:) ! indices in mesh logical, intent(out) :: in_mesh ! were given coords in mesh? @@ -98,7 +98,7 @@ contains function mesh_indices_to_bin(m, ijk, surface_current) result(bin) - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m integer, intent(in) :: ijk(:) logical, optional :: surface_current integer :: bin @@ -132,7 +132,7 @@ contains subroutine bin_to_mesh_indices(m, bin, ijk) - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m integer, intent(in) :: bin integer, intent(out) :: ijk(:) @@ -163,7 +163,7 @@ contains subroutine count_bank_sites(m, bank_array, cnt, energies, size_bank, & sites_outside) - type(StructuredMesh), pointer :: m ! mesh to count sites + type(RegularMesh), pointer :: m ! mesh to count sites type(Bank), intent(in) :: bank_array(:) ! fission or source bank real(8), intent(out) :: cnt(:,:,:,:) ! weight of sites in each ! cell and energy group @@ -264,7 +264,7 @@ contains function mesh_intersects_2d(m, xyz0, xyz1) result(intersects) - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m real(8), intent(in) :: xyz0(2) real(8), intent(in) :: xyz1(2) logical :: intersects @@ -330,7 +330,7 @@ contains function mesh_intersects_3d(m, xyz0, xyz1) result(intersects) - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m real(8), intent(in) :: xyz0(3) real(8), intent(in) :: xyz1(3) logical :: intersects diff --git a/src/mesh_header.F90 b/src/mesh_header.F90 index 9aa57df90f..9da06f813e 100644 --- a/src/mesh_header.F90 +++ b/src/mesh_header.F90 @@ -7,7 +7,7 @@ module mesh_header ! congruent squares or cubes !=============================================================================== - type StructuredMesh + type RegularMesh integer :: id ! user-specified id integer :: type ! rectangular, hexagonal integer :: n_dimension ! rank of mesh @@ -16,6 +16,6 @@ module mesh_header real(8), allocatable :: lower_left(:) ! lower-left corner of mesh real(8), allocatable :: upper_right(:) ! upper-right corner of mesh real(8), allocatable :: width(:) ! width of each mesh cell - end type StructuredMesh + end type RegularMesh end module mesh_header diff --git a/src/output.F90 b/src/output.F90 index 73b8e595d2..1a841a777a 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -10,7 +10,7 @@ module output HexLattice, BASE_UNIVERSE use global use math, only: t_percentile - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use mesh, only: mesh_indices_to_bin, bin_to_mesh_indices use particle_header, only: LocalCoord, Particle use plot_header @@ -1194,7 +1194,7 @@ contains integer :: filter_index ! index in results array for filters logical :: print_ebin ! should incoming energy bin be displayed? character(MAX_LINE_LEN) :: string - type(StructuredMesh), pointer :: m => null() + type(RegularMesh), pointer :: m ! Get pointer to mesh i_filter_mesh = t % find_filter(FILTER_MESH) @@ -1361,8 +1361,8 @@ contains integer, allocatable :: ijk(:) ! indices in mesh real(8) :: E0 ! lower bound for energy bin real(8) :: E1 ! upper bound for energy bin - type(StructuredMesh), pointer :: m => null() - type(Universe), pointer :: univ => null() + type(RegularMesh), pointer :: m + type(Universe), pointer :: univ bin = matching_bins(i_filter) diff --git a/src/plot.F90 b/src/plot.F90 index d8c255c34d..a5497bc203 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -7,6 +7,7 @@ module plot use global use hdf5_interface use mesh, only: get_mesh_indices + use mesh_header, only: RegularMesh use output, only: write_message use particle_header, only: Particle, LocalCoord use plot_header @@ -215,7 +216,7 @@ contains real(8) :: xyz_ur_plot(3) ! upper right xyz of plot image real(8) :: xyz_ll(3) ! lower left xyz real(8) :: xyz_ur(3) ! upper right xyz - type(StructuredMesh), pointer :: m => null() + type(RegularMesh), pointer :: m m => pl % meshlines_mesh diff --git a/src/plot_header.F90 b/src/plot_header.F90 index 8dc725d9d4..a6ea9a580d 100644 --- a/src/plot_header.F90 +++ b/src/plot_header.F90 @@ -1,7 +1,7 @@ module plot_header use constants - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh implicit none @@ -28,7 +28,7 @@ module plot_header integer :: pixels(3) ! pixel width/height of plot slice integer :: meshlines_width ! pixel width of meshlines integer :: level ! universe depth to plot the cells of - type(StructuredMesh), pointer :: meshlines_mesh => null() ! mesh to plot + type(RegularMesh), pointer :: meshlines_mesh => null() ! mesh to plot type(ObjectColor) :: meshlines_color ! Color for meshlines type(ObjectColor) :: not_found ! color for positions where no cell found type(ObjectColor), allocatable :: colors(:) ! colors of cells/mats diff --git a/src/state_point.F90 b/src/state_point.F90 index 60057a2c9b..1115647c46 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -20,7 +20,7 @@ module state_point use output, only: write_message, time_stamp use string, only: to_str, zero_padded, count_digits use tally_header, only: TallyObject - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use dict_header, only: ElemKeyValueII, ElemKeyValueCI #ifdef MPI @@ -54,7 +54,7 @@ contains character(20), allocatable :: scores(:) character(8), allocatable :: moment_names(:) ! names of moments (e.g, P3) character(MAX_FILE_LEN) :: filename - type(StructuredMesh), pointer :: meshp + type(RegularMesh), pointer :: meshp type(TallyObject), pointer :: tally type(ElemKeyValueII), pointer :: current type(ElemKeyValueII), pointer :: next @@ -181,7 +181,7 @@ contains mesh_group = create_group(meshes_group, "mesh " // trim(to_str(meshp%id))) call write_dataset(mesh_group, "id", meshp%id) - call write_dataset(mesh_group, "type", meshp%type) + call write_dataset(mesh_group, "type", "regular") call write_dataset(mesh_group, "n_dimension", meshp%n_dimension) call write_dataset(mesh_group, "dimension", meshp%dimension) call write_dataset(mesh_group, "lower_left", meshp%lower_left) diff --git a/src/summary.F90 b/src/summary.F90 index 90a4e726fd..4159a209d7 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -8,7 +8,7 @@ module summary use global use hdf5_interface use material_header, only: Material - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use output, only: time_stamp use string, only: to_str use tally_header, only: TallyObject @@ -462,7 +462,7 @@ contains integer(HID_T) :: tally_group integer(HID_T) :: filter_group character(20), allocatable :: scores(:) - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m type(TallyObject), pointer :: t tallies_group = create_group(file_id, "tallies") @@ -479,7 +479,7 @@ contains call write_dataset(mesh_group, "index", i) ! Write type and number of dimensions - call write_dataset(mesh_group, "type", m%type) + call write_dataset(mesh_group, "type", "regular") ! Write mesh information call write_dataset(mesh_group, "dimension", m%dimension) diff --git a/src/tally.F90 b/src/tally.F90 index 12085b5d27..69615314fe 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -9,7 +9,7 @@ module tally use mesh, only: get_mesh_bin, bin_to_mesh_indices, & get_mesh_indices, mesh_indices_to_bin, & mesh_intersects_2d, mesh_intersects_3d - use mesh_header, only: StructuredMesh + use mesh_header, only: RegularMesh use output, only: header use particle_header, only: LocalCoord, Particle use search, only: binary_search @@ -908,7 +908,7 @@ contains logical :: start_in_mesh ! starting coordinates inside mesh? logical :: end_in_mesh ! ending coordinates inside mesh? type(TallyObject), pointer :: t - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m type(Material), pointer :: mat t => tallies(i_tally) @@ -1249,7 +1249,7 @@ contains integer :: offset ! offset for distribcell real(8) :: E ! particle energy type(TallyObject), pointer :: t - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m found_bin = .true. t => tallies(i_tally) @@ -1402,7 +1402,7 @@ contains logical :: y_same ! same starting/ending y index (j) logical :: z_same ! same starting/ending z index (k) type(TallyObject), pointer :: t - type(StructuredMesh), pointer :: m + type(RegularMesh), pointer :: m TALLY_LOOP: do i = 1, active_current_tallies % size() ! Copy starting and ending location of particle diff --git a/src/trigger.F90 b/src/trigger.F90 index 4a16cd5cab..a74a64be0a 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -9,6 +9,7 @@ module trigger use string, only: to_str use output, only: warning, write_message use mesh, only: mesh_indices_to_bin + use mesh_header, only: RegularMesh use trigger_header, only: TriggerObject use tally, only: TallyObject @@ -315,7 +316,7 @@ contains real(8) :: std_dev = ZERO ! temporary standard deviration of result type(TallyObject), pointer :: t ! surface current tally type(TriggerObject) :: trigger ! surface current tally trigger - type(StructuredMesh), pointer :: m ! surface current mesh + type(RegularMesh), pointer :: m ! surface current mesh ! Get pointer to mesh i_filter_mesh = t % find_filter(FILTER_MESH) From da2bc6b6fe4f5b9491adde2178d64710187d32ea Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 10:10:48 +0700 Subject: [PATCH 138/519] Write tally nuclides as array of strings for HDF5 files --- openmc/statepoint.py | 6 +-- src/state_point.F90 | 89 ++++++++++++++++++++++---------------------- src/summary.F90 | 64 ++++++++++++++++--------------- 3 files changed, 81 insertions(+), 78 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 72c85d27ed..fbe8fecd88 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -410,11 +410,11 @@ class StatePoint(object): # Read Nuclide bins n_nuclides = self._f['{0}{1}/n_nuclides'.format(base, tally_key)].value - nuclide_zaids = self._f['{0}{1}/nuclides'.format(base, tally_key)].value + nuclide_names = self._f['{0}{1}/nuclides'.format(base, tally_key)].value # Add all Nuclides to the Tally - for nuclide_zaid in nuclide_zaids: - tally.add_nuclide(nuclide_zaid) + for name in nuclide_names: + tally.add_nuclide(name.decode()) # Read score bins n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value diff --git a/src/state_point.F90 b/src/state_point.F90 index 1115647c46..18bedcd4fa 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -41,19 +41,19 @@ contains subroutine write_state_point() - integer :: i, j, k - integer :: n_order ! loop index for moment orders - integer :: nm_order ! loop index for Ynm moment orders - integer, allocatable :: id_array(:) - integer, allocatable :: key_array(:) + integer :: i, j, k + integer :: i_list + integer :: n_order ! loop index for moment orders + integer :: nm_order ! loop index for Ynm moment orders + integer, allocatable :: id_array(:) + integer, allocatable :: key_array(:) integer(HID_T) :: file_id integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group, tally_group integer(HID_T) :: meshes_group, mesh_group integer(HID_T) :: filter_group - character(20), allocatable :: scores(:) - character(8), allocatable :: moment_names(:) ! names of moments (e.g, P3) - character(MAX_FILE_LEN) :: filename + character(20), allocatable :: str_array(:) + character(MAX_FILE_LEN) :: filename type(RegularMesh), pointer :: meshp type(TallyObject), pointer :: tally type(ElemKeyValueII), pointer :: current @@ -280,101 +280,102 @@ contains call write_dataset(tally_group, "n_nuclides", tally%n_nuclide_bins) ! Set up nuclide bin array and then write - allocate(key_array(tally%n_nuclide_bins)) + allocate(str_array(tally%n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins if (tally%nuclide_bins(j) > 0) then - key_array(j) = nuclides(tally%nuclide_bins(j))%zaid + i_list = nuclides(tally%nuclide_bins(j))%listing + str_array(j) = xs_listings(i_list)%alias else - key_array(j) = tally%nuclide_bins(j) + str_array(j) = 'total' end if end do NUCLIDE_LOOP - call write_dataset(tally_group, "nuclides", key_array) - deallocate(key_array) + call write_dataset(tally_group, "nuclides", str_array) + deallocate(str_array) call write_dataset(tally_group, "n_score_bins", tally%n_score_bins) - allocate(scores(size(tally%score_bins))) + allocate(str_array(size(tally%score_bins))) do j = 1, size(tally%score_bins) select case(tally%score_bins(j)) case (SCORE_FLUX) - scores(j) = "flux" + str_array(j) = "flux" case (SCORE_TOTAL) - scores(j) = "total" + str_array(j) = "total" case (SCORE_SCATTER) - scores(j) = "scatter" + str_array(j) = "scatter" case (SCORE_NU_SCATTER) - scores(j) = "nu-scatter" + str_array(j) = "nu-scatter" case (SCORE_SCATTER_N) - scores(j) = "scatter-n" + str_array(j) = "scatter-n" case (SCORE_SCATTER_PN) - scores(j) = "scatter-pn" + str_array(j) = "scatter-pn" case (SCORE_NU_SCATTER_N) - scores(j) = "nu-scatter-n" + str_array(j) = "nu-scatter-n" case (SCORE_NU_SCATTER_PN) - scores(j) = "nu-scatter-pn" + str_array(j) = "nu-scatter-pn" case (SCORE_TRANSPORT) - scores(j) = "transport" + str_array(j) = "transport" case (SCORE_N_1N) - scores(j) = "n1n" + str_array(j) = "n1n" case (SCORE_ABSORPTION) - scores(j) = "absorption" + str_array(j) = "absorption" case (SCORE_FISSION) - scores(j) = "fission" + str_array(j) = "fission" case (SCORE_NU_FISSION) - scores(j) = "nu-fission" + str_array(j) = "nu-fission" case (SCORE_KAPPA_FISSION) - scores(j) = "kappa-fission" + str_array(j) = "kappa-fission" case (SCORE_CURRENT) - scores(j) = "current" + str_array(j) = "current" case (SCORE_FLUX_YN) - scores(j) = "flux-yn" + str_array(j) = "flux-yn" case (SCORE_TOTAL_YN) - scores(j) = "total-yn" + str_array(j) = "total-yn" case (SCORE_SCATTER_YN) - scores(j) = "scatter-yn" + str_array(j) = "scatter-yn" case (SCORE_NU_SCATTER_YN) - scores(j) = "nu-scatter-yn" + str_array(j) = "nu-scatter-yn" case (SCORE_EVENTS) - scores(j) = "events" + str_array(j) = "events" case default - scores(j) = reaction_name(tally%score_bins(j)) + str_array(j) = reaction_name(tally%score_bins(j)) end select end do - call write_dataset(tally_group, "scores", scores) + call write_dataset(tally_group, "scores", str_array) call write_dataset(tally_group, "score_bins", tally%score_bins) call write_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) - deallocate(scores) + deallocate(str_array) ! Write explicit moment order strings for each score bin k = 1 - allocate(moment_names(tally%n_score_bins)) + allocate(str_array(tally%n_score_bins)) MOMENT_LOOP: do j = 1, tally%n_user_score_bins select case(tally%score_bins(k)) case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N) - moment_names(k) = 'P' // trim(to_str(tally%moment_order(k))) + str_array(k) = 'P' // trim(to_str(tally%moment_order(k))) k = k + 1 case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN) do n_order = 0, tally%moment_order(k) - moment_names(k) = 'P' // trim(to_str(n_order)) + str_array(k) = 'P' // trim(to_str(n_order)) k = k + 1 end do case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, & SCORE_TOTAL_YN) do n_order = 0, tally%moment_order(k) do nm_order = -n_order, n_order - moment_names(k) = 'Y' // trim(to_str(n_order)) // ',' // & + str_array(k) = 'Y' // trim(to_str(n_order)) // ',' // & trim(to_str(nm_order)) k = k + 1 end do end do case default - moment_names(k) = '' + str_array(k) = '' k = k + 1 end select end do MOMENT_LOOP - call write_dataset(tally_group, "moment_orders", moment_names) - deallocate(moment_names) + call write_dataset(tally_group, "moment_orders", str_array) + deallocate(str_array) call close_group(tally_group) end do TALLY_METADATA diff --git a/src/summary.F90 b/src/summary.F90 index 4159a209d7..aa1ee35093 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -456,12 +456,13 @@ contains integer(HID_T), intent(in) :: file_id integer :: i, j + integer :: i_list integer, allocatable :: temp_array(:) ! nuclide bin array integer(HID_T) :: tallies_group integer(HID_T) :: mesh_group integer(HID_T) :: tally_group integer(HID_T) :: filter_group - character(20), allocatable :: scores(:) + character(20), allocatable :: str_array(:) type(RegularMesh), pointer :: m type(TallyObject), pointer :: t @@ -551,75 +552,76 @@ contains end do FILTER_LOOP ! Write number of nuclide bins - call write_dataset(tally_group, "n_nuclide_bins", t%n_nuclide_bins) + call write_dataset(tally_group, "n_nuclides", t%n_nuclide_bins) ! Create temporary array for nuclide bins - allocate(temp_array(t%n_nuclide_bins)) + allocate(str_array(t%n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, t%n_nuclide_bins if (t%nuclide_bins(j) > 0) then - temp_array(j) = nuclides(t%nuclide_bins(j))%zaid + i_list = nuclides(t%nuclide_bins(j))%listing + str_array(j) = xs_listings(i_list)%alias else - temp_array(j) = t%nuclide_bins(j) + str_array(j) = 'total' end if end do NUCLIDE_LOOP ! Write and deallocate nuclide bins - call write_dataset(tally_group, "nuclide_bins", temp_array) - deallocate(temp_array) + call write_dataset(tally_group, "nuclides", str_array) + deallocate(str_array) ! Write number of score bins call write_dataset(tally_group, "n_score_bins", t%n_score_bins) - allocate(scores(size(t%score_bins))) + allocate(str_array(size(t%score_bins))) do j = 1, size(t%score_bins) select case(t%score_bins(j)) case (SCORE_FLUX) - scores(j) = "flux" + str_array(j) = "flux" case (SCORE_TOTAL) - scores(j) = "total" + str_array(j) = "total" case (SCORE_SCATTER) - scores(j) = "scatter" + str_array(j) = "scatter" case (SCORE_NU_SCATTER) - scores(j) = "nu-scatter" + str_array(j) = "nu-scatter" case (SCORE_SCATTER_N) - scores(j) = "scatter-n" + str_array(j) = "scatter-n" case (SCORE_SCATTER_PN) - scores(j) = "scatter-pn" + str_array(j) = "scatter-pn" case (SCORE_NU_SCATTER_N) - scores(j) = "nu-scatter-n" + str_array(j) = "nu-scatter-n" case (SCORE_NU_SCATTER_PN) - scores(j) = "nu-scatter-pn" + str_array(j) = "nu-scatter-pn" case (SCORE_TRANSPORT) - scores(j) = "transport" + str_array(j) = "transport" case (SCORE_N_1N) - scores(j) = "n1n" + str_array(j) = "n1n" case (SCORE_ABSORPTION) - scores(j) = "absorption" + str_array(j) = "absorption" case (SCORE_FISSION) - scores(j) = "fission" + str_array(j) = "fission" case (SCORE_NU_FISSION) - scores(j) = "nu-fission" + str_array(j) = "nu-fission" case (SCORE_KAPPA_FISSION) - scores(j) = "kappa-fission" + str_array(j) = "kappa-fission" case (SCORE_CURRENT) - scores(j) = "current" + str_array(j) = "current" case (SCORE_FLUX_YN) - scores(j) = "flux-yn" + str_array(j) = "flux-yn" case (SCORE_TOTAL_YN) - scores(j) = "total-yn" + str_array(j) = "total-yn" case (SCORE_SCATTER_YN) - scores(j) = "scatter-yn" + str_array(j) = "scatter-yn" case (SCORE_NU_SCATTER_YN) - scores(j) = "nu-scatter-yn" + str_array(j) = "nu-scatter-yn" case (SCORE_EVENTS) - scores(j) = "events" + str_array(j) = "events" case default - scores(j) = reaction_name(t%score_bins(j)) + str_array(j) = reaction_name(t%score_bins(j)) end select end do - call write_dataset(tally_group, "scores", scores) + call write_dataset(tally_group, "scores", str_array) call write_dataset(tally_group, "score_bins", t%score_bins) - deallocate(scores) + deallocate(str_array) call close_group(tally_group) end do TALLY_METADATA From 843aff3ce75a37f05b7f487918f5d97e2f92caf7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 10:23:20 +0700 Subject: [PATCH 139/519] Don't write mesh%n_dimension in statepoint --- src/state_point.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/state_point.F90 b/src/state_point.F90 index 18bedcd4fa..24d2fac1ba 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -182,7 +182,6 @@ contains call write_dataset(mesh_group, "id", meshp%id) call write_dataset(mesh_group, "type", "regular") - call write_dataset(mesh_group, "n_dimension", meshp%n_dimension) call write_dataset(mesh_group, "dimension", meshp%dimension) call write_dataset(mesh_group, "lower_left", meshp%lower_left) call write_dataset(mesh_group, "upper_right", meshp%upper_right) From b167d70c877c516deca785801b9fa6f53fb0985b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 20 Sep 2015 14:36:25 +0700 Subject: [PATCH 140/519] Allow ENDF reaction names to be used on tallies, e.g. (n,2n), (n,gamma), etc. The only score that needed more work was elastic scattering, so a block in score_general has been added. --- src/input_xml.F90 | 81 ++++++++++++++++++++++++++++++++++++++++++++--- src/tally.F90 | 13 ++++++++ 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 4abc83f6aa..e6e6444593 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2730,7 +2730,7 @@ contains t % moment_order(j : j + n_bins - 1) = n_order j = j + n_bins - 1 - case ('total') + case ('total', '(n,total)') t % score_bins(j) = SCORE_TOTAL if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally total reaction rate with an & @@ -2816,13 +2816,13 @@ contains ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG - case ('n2n') + case ('n2n', '(n,2n)') t % score_bins(j) = N_2N - case ('n3n') + case ('n3n', '(n,3n)') t % score_bins(j) = N_3N - case ('n4n') + case ('n4n', '(n,4n)') t % score_bins(j) = N_4N case ('absorption') @@ -2903,6 +2903,79 @@ contains case ('events') t % score_bins(j) = SCORE_EVENTS + case ('elastic', '(n,elastic)') + t % score_bins(j) = ELASTIC + case ('(n,2nd)') + t % score_bins(j) = N_2ND + case ('(n,na)') + t % score_bins(j) = N_2NA + case ('(n,n3a)') + t % score_bins(j) = N_N3A + case ('(n,2na)') + t % score_bins(j) = N_2NA + case ('(n,3na)') + t % score_bins(j) = N_3NA + case ('(n,np)') + t % score_bins(j) = N_NP + case ('(n,n2a)') + t % score_bins(j) = N_N2A + case ('(n,2n2a)') + t % score_bins(j) = N_2N2A + case ('(n,nd)') + t % score_bins(j) = N_ND + case ('(n,nt)') + t % score_bins(j) = N_NT + case ('(n,nHe-3)') + t % score_bins(j) = N_N3HE + case ('(n,nd2a)') + t % score_bins(j) = N_ND2A + case ('(n,nt2a)') + t % score_bins(j) = N_NT2A + case ('(n,3nf)') + t % score_bins(j) = N_3NF + case ('(n,2np)') + t % score_bins(j) = N_2NP + case ('(n,3np)') + t % score_bins(j) = N_3NP + case ('(n,n2p)') + t % score_bins(j) = N_N2P + case ('(n,npa)') + t % score_bins(j) = N_NPA + case ('(n,n1)') + t % score_bins(j) = N_N1 + case ('(n,nc)') + t % score_bins(j) = N_NC + case ('(n,gamma)') + t % score_bins(j) = N_GAMMA + case ('(n,p)') + t % score_bins(j) = N_P + case ('(n,d)') + t % score_bins(j) = N_D + case ('(n,t)') + t % score_bins(j) = N_T + case ('(n,3He)') + t % score_bins(j) = N_3HE + case ('(n,a)') + t % score_bins(j) = N_A + case ('(n,2a)') + t % score_bins(j) = N_2A + case ('(n,3a)') + t % score_bins(j) = N_3A + case ('(n,2p)') + t % score_bins(j) = N_2P + case ('(n,pa)') + t % score_bins(j) = N_PA + case ('(n,t2a)') + t % score_bins(j) = N_T2A + case ('(n,d2a)') + t % score_bins(j) = N_D2A + case ('(n,pd)') + t % score_bins(j) = N_PD + case ('(n,pt)') + t % score_bins(j) = N_PT + case ('(n,da)') + t % score_bins(j) = N_DA + case default ! Assume that user has specified an MT number MT = int(str_to_int(score_name)) diff --git a/src/tally.F90 b/src/tally.F90 index 69615314fe..33e452a4c7 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -360,6 +360,19 @@ contains ! Simply count number of scoring events score = ONE + case (ELASTIC) + if (t % estimator == ESTIMATOR_ANALOG) then + ! Check if event MT matches + if (p % event_MT /= ELASTIC) cycle SCORE_LOOP + score = p % last_wgt + + else + if (i_nuclide > 0) then + score = micro_xs(i_nuclide) % elastic * atom_density * flux + else + score = material_xs % elastic * flux + end if + end if case default if (t % estimator == ESTIMATOR_ANALOG) then From b0ea5b8ae045fc1f22eda293e31ce0d7e36f5503 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 10:00:51 +0700 Subject: [PATCH 141/519] Fix handling of mesh type --- openmc/mesh.py | 2 +- src/constants.F90 | 4 ++++ src/input_xml.F90 | 8 +++++--- src/relaxng/tallies.rnc | 6 +++--- src/relaxng/tallies.rng | 10 ++-------- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/openmc/mesh.py b/openmc/mesh.py index fefc6d7074..2fe873d2bc 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -156,7 +156,7 @@ class Mesh(object): check_type('type for mesh ID="{0}"'.format(self._id), meshtype, basestring) check_value('type for mesh ID="{0}"'.format(self._id), - meshtype, ['regular', 'hexagonal']) + meshtype, ['regular']) self._type = meshtype @dimension.setter diff --git a/src/constants.F90 b/src/constants.F90 index 962c4a6a2a..53891cdaa6 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -312,6 +312,10 @@ module constants FILTER_ENERGYOUT = 8, & FILTER_DISTRIBCELL = 9 + ! Mesh types + integer, parameter :: & + MESH_REGULAR = 1 + ! Tally surface current directions integer, parameter :: & IN_RIGHT = 1, & diff --git a/src/input_xml.F90 b/src/input_xml.F90 index e6e6444593..3899d43f0e 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2188,9 +2188,11 @@ contains call get_node_value(node_mesh, "type", temp_str) select case (to_lower(temp_str)) case ('rect', 'rectangle', 'rectangular') - m % type = LATTICE_RECT - case ('hex', 'hexagon', 'hexagonal') - m % type = LATTICE_HEX + call warning("Mesh type '" // trim(temp_str) // "' is deprecated. & + &Please use 'regular' instead.") + m % type = MESH_REGULAR + case ('regular') + m % type = MESH_REGULAR case default call fatal_error("Invalid mesh type: " // trim(temp_str)) end select diff --git a/src/relaxng/tallies.rnc b/src/relaxng/tallies.rnc index c2e0860b8e..ee93d273cb 100644 --- a/src/relaxng/tallies.rnc +++ b/src/relaxng/tallies.rnc @@ -1,8 +1,8 @@ element tallies { element mesh { (element id { xsd:int } | attribute id { xsd:int }) & - (element type { ( "rectangular" | "hexagonal" ) } | - attribute type { ( "rectangular" | "hexagonal" ) }) & + (element type { ( "regular" ) } | + attribute type { ( "regular" ) }) & (element dimension { list { xsd:positiveInteger+ } } | attribute dimension { list { xsd:positiveInteger+ } }) & (element lower_left { list { xsd:double+ } } | @@ -32,7 +32,7 @@ element tallies { element nuclides { list { xsd:string { maxLength = "12" }+ } }? & - element scores { + element scores { list { xsd:string { maxLength = "20" }+ } } & element trigger { diff --git a/src/relaxng/tallies.rng b/src/relaxng/tallies.rng index 9ea941feab..76973e8556 100644 --- a/src/relaxng/tallies.rng +++ b/src/relaxng/tallies.rng @@ -14,16 +14,10 @@ - - rectangular - hexagonal - + regular - - rectangular - hexagonal - + regular From 43fdeb41a1dea449c064c30e9de487ff4a154308 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 10:01:26 +0700 Subject: [PATCH 142/519] Make sure std_dev is calculated if mean is negative. Don't set nuclides in link_with_summary. Update pandas-dataframe notebook. --- .../examples/pandas-dataframes.ipynb | 132 +++++++++--------- openmc/statepoint.py | 9 -- openmc/tallies.py | 2 +- 3 files changed, 67 insertions(+), 76 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 384fa76202..565e6c73a4 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -374,7 +374,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEAsWB/wc/iEAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA5LTE2VDE4OjE5OjQ5KzA3OjAwTRYi9AAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOS0xNlQxODoxOTo0OSswNzowMDxLmkgAAAAASUVORK5C\nYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQI2Mgck1R0AAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA5LTIxVDA5OjQ2OjQyKzA3OjAwIbcawwAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOS0yMVQwOTo0Njo0MiswNzowMFDqon8AAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] @@ -429,7 +429,7 @@ "source": [ "# Instantiate a tally Mesh\n", "mesh = openmc.Mesh(mesh_id=1)\n", - "mesh.type = 'rectangular'\n", + "mesh.type = 'regular'\n", "mesh.dimension = [17, 17]\n", "mesh.lower_left = [-10.71, -10.71]\n", "mesh.width = [1.26, 1.26]\n", @@ -563,8 +563,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 36a516ed8125ab8a86d8c9b3aee4bd4bc2db859c\n", - " Date/Time: 2015-09-16 18:22:08\n", + " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", + " Date/Time: 2015-09-21 09:54:51\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -631,20 +631,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.5700E-01 seconds\n", - " Reading cross sections = 1.8900E-01 seconds\n", - " Total time in simulation = 1.1416E+01 seconds\n", - " Time in transport only = 1.1395E+01 seconds\n", - " Time in inactive batches = 1.4590E+00 seconds\n", - " Time in active batches = 9.9570E+00 seconds\n", + " Total time for initialization = 4.0200E-01 seconds\n", + " Reading cross sections = 1.3900E-01 seconds\n", + " Total time in simulation = 1.3557E+01 seconds\n", + " Time in transport only = 1.3542E+01 seconds\n", + " Time in inactive batches = 1.4020E+00 seconds\n", + " Time in active batches = 1.2155E+01 seconds\n", " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.1985E+01 seconds\n", - " Calculation Rate (inactive) = 8567.51 neutrons/second\n", - " Calculation Rate (active) = 3766.19 neutrons/second\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.3972E+01 seconds\n", + " Calculation Rate (inactive) = 8915.83 neutrons/second\n", + " Calculation Rate (active) = 3085.15 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -737,7 +737,7 @@ " \t\tmesh\t[1]\n", " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", "\tNuclides =\ttotal \n", - "\tScores =\t['fission', 'nu-fission']\n", + "\tScores =\t[u'fission', u'nu-fission']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -1085,7 +1085,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1108,7 +1108,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1119,7 +1119,7 @@ "data": { "image/png": "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\nEvx/rHWCrxSlro8AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1164,7 +1164,7 @@ "\tName =\tcell tally\n", "\tFilters =\t\n", " \t\tcell\t[10000]\n", - "\tNuclides =\tU-235 U-238 \n", + "\tNuclides =\tU-235.71c U-238.71c \n", "\tScores =\t[u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2']\n", "\tEstimator =\tanalog\n", "\n" @@ -1213,7 +1213,7 @@ " \n", " 0\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y0,0\n", " 0.036453\n", " 0.001219\n", @@ -1221,7 +1221,7 @@ " \n", " 1\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y1,-1\n", " 0.000302\n", " 0.000314\n", @@ -1229,7 +1229,7 @@ " \n", " 2\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y1,0\n", " -0.000006\n", " 0.000347\n", @@ -1237,7 +1237,7 @@ " \n", " 3\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y1,1\n", " 0.000244\n", " 0.000286\n", @@ -1245,7 +1245,7 @@ " \n", " 4\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y2,-2\n", " 0.000184\n", " 0.000211\n", @@ -1253,7 +1253,7 @@ " \n", " 5\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y2,-1\n", " 0.000067\n", " 0.000173\n", @@ -1261,7 +1261,7 @@ " \n", " 6\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y2,0\n", " 0.000353\n", " 0.000210\n", @@ -1269,7 +1269,7 @@ " \n", " 7\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y2,1\n", " -0.000266\n", " 0.000263\n", @@ -1277,7 +1277,7 @@ " \n", " 8\n", " 10000\n", - " U-235\n", + " U-235.71c\n", " scatter-Y2,2\n", " -0.000246\n", " 0.000153\n", @@ -1285,7 +1285,7 @@ " \n", " 9\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y0,0\n", " 2.315893\n", " 0.008243\n", @@ -1293,7 +1293,7 @@ " \n", " 10\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y1,-1\n", " -0.022028\n", " 0.002316\n", @@ -1301,7 +1301,7 @@ " \n", " 11\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y1,0\n", " -0.003426\n", " 0.002651\n", @@ -1309,7 +1309,7 @@ " \n", " 12\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y1,1\n", " 0.026620\n", " 0.002084\n", @@ -1317,7 +1317,7 @@ " \n", " 13\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y2,-2\n", " -0.001295\n", " 0.001627\n", @@ -1325,7 +1325,7 @@ " \n", " 14\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y2,-1\n", " 0.000759\n", " 0.001426\n", @@ -1333,7 +1333,7 @@ " \n", " 15\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y2,0\n", " 0.005513\n", " 0.001983\n", @@ -1341,7 +1341,7 @@ " \n", " 16\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y2,1\n", " 0.000431\n", " 0.001862\n", @@ -1349,7 +1349,7 @@ " \n", " 17\n", " 10000\n", - " U-238\n", + " U-238.71c\n", " scatter-Y2,2\n", " -0.001962\n", " 0.001222\n", @@ -1359,26 +1359,26 @@ "" ], "text/plain": [ - " cell nuclide score mean std. dev.\n", - "bin \n", - "0 10000 U-235 scatter-Y0,0 0.036453 0.001219\n", - "1 10000 U-235 scatter-Y1,-1 0.000302 0.000314\n", - "2 10000 U-235 scatter-Y1,0 -0.000006 0.000347\n", - "3 10000 U-235 scatter-Y1,1 0.000244 0.000286\n", - "4 10000 U-235 scatter-Y2,-2 0.000184 0.000211\n", - "5 10000 U-235 scatter-Y2,-1 0.000067 0.000173\n", - "6 10000 U-235 scatter-Y2,0 0.000353 0.000210\n", - "7 10000 U-235 scatter-Y2,1 -0.000266 0.000263\n", - "8 10000 U-235 scatter-Y2,2 -0.000246 0.000153\n", - "9 10000 U-238 scatter-Y0,0 2.315893 0.008243\n", - "10 10000 U-238 scatter-Y1,-1 -0.022028 0.002316\n", - "11 10000 U-238 scatter-Y1,0 -0.003426 0.002651\n", - "12 10000 U-238 scatter-Y1,1 0.026620 0.002084\n", - "13 10000 U-238 scatter-Y2,-2 -0.001295 0.001627\n", - "14 10000 U-238 scatter-Y2,-1 0.000759 0.001426\n", - "15 10000 U-238 scatter-Y2,0 0.005513 0.001983\n", - "16 10000 U-238 scatter-Y2,1 0.000431 0.001862\n", - "17 10000 U-238 scatter-Y2,2 -0.001962 0.001222" + " cell nuclide score mean std. dev.\n", + "bin \n", + "0 10000 U-235.71c scatter-Y0,0 0.036453 0.001219\n", + "1 10000 U-235.71c scatter-Y1,-1 0.000302 0.000314\n", + "2 10000 U-235.71c scatter-Y1,0 -0.000006 0.000347\n", + "3 10000 U-235.71c scatter-Y1,1 0.000244 0.000286\n", + "4 10000 U-235.71c scatter-Y2,-2 0.000184 0.000211\n", + "5 10000 U-235.71c scatter-Y2,-1 0.000067 0.000173\n", + "6 10000 U-235.71c scatter-Y2,0 0.000353 0.000210\n", + "7 10000 U-235.71c scatter-Y2,1 -0.000266 0.000263\n", + "8 10000 U-235.71c scatter-Y2,2 -0.000246 0.000153\n", + "9 10000 U-238.71c scatter-Y0,0 2.315893 0.008243\n", + "10 10000 U-238.71c scatter-Y1,-1 -0.022028 0.002316\n", + "11 10000 U-238.71c scatter-Y1,0 -0.003426 0.002651\n", + "12 10000 U-238.71c scatter-Y1,1 0.026620 0.002084\n", + "13 10000 U-238.71c scatter-Y2,-2 -0.001295 0.001627\n", + "14 10000 U-238.71c scatter-Y2,-1 0.000759 0.001426\n", + "15 10000 U-238.71c scatter-Y2,0 0.005513 0.001983\n", + "16 10000 U-238.71c scatter-Y2,1 0.000431 0.001862\n", + "17 10000 U-238.71c scatter-Y2,2 -0.001962 0.001222" ] }, "execution_count": 29, @@ -1421,7 +1421,7 @@ "# Get the standard deviations for two of the spherical harmonic\n", "# scattering reaction rates \n", "data = tally.get_values(scores=['scatter-Y2,2', 'scatter-Y0,0'], \n", - " nuclides=['U-238', 'U-235'], value='std_dev')\n", + " nuclides=['U-238.71c', 'U-235.71c'], value='std_dev')\n", "print(data)" ] }, @@ -1449,7 +1449,7 @@ "\tFilters =\t\n", " \t\tdistribcell\t[10002]\n", "\tNuclides =\ttotal \n", - "\tScores =\t['absorption', 'scatter']\n", + "\tScores =\t[u'absorption', u'scatter']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -2376,7 +2376,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2387,7 +2387,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2414,7 +2414,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2425,7 +2425,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/openmc/statepoint.py b/openmc/statepoint.py index fbe8fecd88..0e4a277f82 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -608,15 +608,6 @@ class StatePoint(object): tally.name = summary.tallies[tally_id].name tally.with_summary = True - nuclide_zaids = copy.deepcopy(tally.nuclides) - - for nuclide_zaid in nuclide_zaids: - tally.remove_nuclide(nuclide_zaid) - if nuclide_zaid == -1: - tally.add_nuclide(openmc.Nuclide('total')) - else: - tally.add_nuclide(summary.nuclides[nuclide_zaid]) - for filter in tally.filters: if filter.type == 'surface': surface_ids = [] diff --git a/openmc/tallies.py b/openmc/tallies.py index cfbe613c28..20a6af3f29 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -322,7 +322,7 @@ class Tally(object): return None n = self.num_realizations - nonzero = self.mean > 0 + nonzero = np.abs(self.mean) > 0 self._std_dev = np.zeros_like(self.mean) self._std_dev[nonzero] = np.sqrt((self.sum_sq[nonzero]/n - self.mean[nonzero]**2)/(n - 1)) From bc36dad0280a0dd6d6d82f9fde3c117cc11d8c5d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 10:24:22 +0700 Subject: [PATCH 143/519] Don't write cross section identifier for tally 'nuclides' dataset --- openmc/statepoint.py | 3 ++- src/state_point.F90 | 9 +++++++-- src/summary.F90 | 9 +++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 0e4a277f82..ca4fc02ab0 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -414,7 +414,8 @@ class StatePoint(object): # Add all Nuclides to the Tally for name in nuclide_names: - tally.add_nuclide(name.decode()) + nuclide = openmc.Nuclide(name.decode().strip()) + tally.add_nuclide(nuclide) # Read score bins n_score_bins = self._f['{0}{1}/n_score_bins'.format(base, tally_key)].value diff --git a/src/state_point.F90 b/src/state_point.F90 index 24d2fac1ba..bfbbadb570 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -42,7 +42,7 @@ contains subroutine write_state_point() integer :: i, j, k - integer :: i_list + integer :: i_list, i_xs integer :: n_order ! loop index for moment orders integer :: nm_order ! loop index for Ynm moment orders integer, allocatable :: id_array(:) @@ -283,7 +283,12 @@ contains NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins if (tally%nuclide_bins(j) > 0) then i_list = nuclides(tally%nuclide_bins(j))%listing - str_array(j) = xs_listings(i_list)%alias + i_xs = index(xs_listings(i_list)%alias, '.') + if (i_xs > 0) then + str_array(j) = xs_listings(i_list)%alias(1:i_xs - 1) + else + str_array(j) = xs_listings(i_list)%alias + end if else str_array(j) = 'total' end if diff --git a/src/summary.F90 b/src/summary.F90 index aa1ee35093..5fcf0c64e9 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -456,7 +456,7 @@ contains integer(HID_T), intent(in) :: file_id integer :: i, j - integer :: i_list + integer :: i_list, i_xs integer, allocatable :: temp_array(:) ! nuclide bin array integer(HID_T) :: tallies_group integer(HID_T) :: mesh_group @@ -559,7 +559,12 @@ contains NUCLIDE_LOOP: do j = 1, t%n_nuclide_bins if (t%nuclide_bins(j) > 0) then i_list = nuclides(t%nuclide_bins(j))%listing - str_array(j) = xs_listings(i_list)%alias + i_xs = index(xs_listings(i_list)%alias, '.') + if (i_xs > 0) then + str_array(j) = xs_listings(i_list)%alias(1:i_xs - 1) + else + str_array(j) = xs_listings(i_list)%alias + end if else str_array(j) = 'total' end if From 75e37efac3d7c0b1ee1880ad89cd180a949bdea1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 10:29:36 +0700 Subject: [PATCH 144/519] Update Jupyter notebooks again. --- .../examples/pandas-dataframes.ipynb | 118 +++++++++--------- .../pythonapi/examples/tally-arithmetic.ipynb | 28 ++--- 2 files changed, 73 insertions(+), 73 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 565e6c73a4..cb63e2ac39 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -374,7 +374,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQI2Mgck1R0AAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA5LTIxVDA5OjQ2OjQyKzA3OjAwIbcawwAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOS0yMVQwOTo0Njo0MiswNzowMFDqon8AAAAASUVORK5C\nYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQMbBgd4EXAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMjFUMTA6MjU6\nMjYrMDc6MDAKj62JAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTIxVDEwOjI1OjI2KzA3OjAw\ne9IVNQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -564,7 +564,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", - " Date/Time: 2015-09-21 09:54:51\n", + " Date/Time: 2015-09-21 10:27:06\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -631,20 +631,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.0200E-01 seconds\n", - " Reading cross sections = 1.3900E-01 seconds\n", - " Total time in simulation = 1.3557E+01 seconds\n", - " Time in transport only = 1.3542E+01 seconds\n", - " Time in inactive batches = 1.4020E+00 seconds\n", - " Time in active batches = 1.2155E+01 seconds\n", + " Total time for initialization = 4.4100E-01 seconds\n", + " Reading cross sections = 1.7900E-01 seconds\n", + " Total time in simulation = 1.2656E+01 seconds\n", + " Time in transport only = 1.2642E+01 seconds\n", + " Time in inactive batches = 2.0300E+00 seconds\n", + " Time in active batches = 1.0626E+01 seconds\n", " Time synchronizing fission bank = 4.0000E-03 seconds\n", " Sampling source sites = 3.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.3972E+01 seconds\n", - " Calculation Rate (inactive) = 8915.83 neutrons/second\n", - " Calculation Rate (active) = 3085.15 neutrons/second\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 1.3110E+01 seconds\n", + " Calculation Rate (inactive) = 6157.64 neutrons/second\n", + " Calculation Rate (active) = 3529.08 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1085,7 +1085,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1108,7 +1108,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1119,7 +1119,7 @@ "data": { "image/png": "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\nEvx/rHWCrxSlro8AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1164,7 +1164,7 @@ "\tName =\tcell tally\n", "\tFilters =\t\n", " \t\tcell\t[10000]\n", - "\tNuclides =\tU-235.71c U-238.71c \n", + "\tNuclides =\tU-235 U-238 \n", "\tScores =\t[u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2']\n", "\tEstimator =\tanalog\n", "\n" @@ -1213,7 +1213,7 @@ " \n", " 0\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y0,0\n", " 0.036453\n", " 0.001219\n", @@ -1221,7 +1221,7 @@ " \n", " 1\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y1,-1\n", " 0.000302\n", " 0.000314\n", @@ -1229,7 +1229,7 @@ " \n", " 2\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y1,0\n", " -0.000006\n", " 0.000347\n", @@ -1237,7 +1237,7 @@ " \n", " 3\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y1,1\n", " 0.000244\n", " 0.000286\n", @@ -1245,7 +1245,7 @@ " \n", " 4\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y2,-2\n", " 0.000184\n", " 0.000211\n", @@ -1253,7 +1253,7 @@ " \n", " 5\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y2,-1\n", " 0.000067\n", " 0.000173\n", @@ -1261,7 +1261,7 @@ " \n", " 6\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y2,0\n", " 0.000353\n", " 0.000210\n", @@ -1269,7 +1269,7 @@ " \n", " 7\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y2,1\n", " -0.000266\n", " 0.000263\n", @@ -1277,7 +1277,7 @@ " \n", " 8\n", " 10000\n", - " U-235.71c\n", + " U-235\n", " scatter-Y2,2\n", " -0.000246\n", " 0.000153\n", @@ -1285,7 +1285,7 @@ " \n", " 9\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y0,0\n", " 2.315893\n", " 0.008243\n", @@ -1293,7 +1293,7 @@ " \n", " 10\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y1,-1\n", " -0.022028\n", " 0.002316\n", @@ -1301,7 +1301,7 @@ " \n", " 11\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y1,0\n", " -0.003426\n", " 0.002651\n", @@ -1309,7 +1309,7 @@ " \n", " 12\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y1,1\n", " 0.026620\n", " 0.002084\n", @@ -1317,7 +1317,7 @@ " \n", " 13\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y2,-2\n", " -0.001295\n", " 0.001627\n", @@ -1325,7 +1325,7 @@ " \n", " 14\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y2,-1\n", " 0.000759\n", " 0.001426\n", @@ -1333,7 +1333,7 @@ " \n", " 15\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y2,0\n", " 0.005513\n", " 0.001983\n", @@ -1341,7 +1341,7 @@ " \n", " 16\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y2,1\n", " 0.000431\n", " 0.001862\n", @@ -1349,7 +1349,7 @@ " \n", " 17\n", " 10000\n", - " U-238.71c\n", + " U-238\n", " scatter-Y2,2\n", " -0.001962\n", " 0.001222\n", @@ -1359,26 +1359,26 @@ "" ], "text/plain": [ - " cell nuclide score mean std. dev.\n", - "bin \n", - "0 10000 U-235.71c scatter-Y0,0 0.036453 0.001219\n", - "1 10000 U-235.71c scatter-Y1,-1 0.000302 0.000314\n", - "2 10000 U-235.71c scatter-Y1,0 -0.000006 0.000347\n", - "3 10000 U-235.71c scatter-Y1,1 0.000244 0.000286\n", - "4 10000 U-235.71c scatter-Y2,-2 0.000184 0.000211\n", - "5 10000 U-235.71c scatter-Y2,-1 0.000067 0.000173\n", - "6 10000 U-235.71c scatter-Y2,0 0.000353 0.000210\n", - "7 10000 U-235.71c scatter-Y2,1 -0.000266 0.000263\n", - "8 10000 U-235.71c scatter-Y2,2 -0.000246 0.000153\n", - "9 10000 U-238.71c scatter-Y0,0 2.315893 0.008243\n", - "10 10000 U-238.71c scatter-Y1,-1 -0.022028 0.002316\n", - "11 10000 U-238.71c scatter-Y1,0 -0.003426 0.002651\n", - "12 10000 U-238.71c scatter-Y1,1 0.026620 0.002084\n", - "13 10000 U-238.71c scatter-Y2,-2 -0.001295 0.001627\n", - "14 10000 U-238.71c scatter-Y2,-1 0.000759 0.001426\n", - "15 10000 U-238.71c scatter-Y2,0 0.005513 0.001983\n", - "16 10000 U-238.71c scatter-Y2,1 0.000431 0.001862\n", - "17 10000 U-238.71c scatter-Y2,2 -0.001962 0.001222" + " cell nuclide score mean std. dev.\n", + "bin \n", + "0 10000 U-235 scatter-Y0,0 0.036453 0.001219\n", + "1 10000 U-235 scatter-Y1,-1 0.000302 0.000314\n", + "2 10000 U-235 scatter-Y1,0 -0.000006 0.000347\n", + "3 10000 U-235 scatter-Y1,1 0.000244 0.000286\n", + "4 10000 U-235 scatter-Y2,-2 0.000184 0.000211\n", + "5 10000 U-235 scatter-Y2,-1 0.000067 0.000173\n", + "6 10000 U-235 scatter-Y2,0 0.000353 0.000210\n", + "7 10000 U-235 scatter-Y2,1 -0.000266 0.000263\n", + "8 10000 U-235 scatter-Y2,2 -0.000246 0.000153\n", + "9 10000 U-238 scatter-Y0,0 2.315893 0.008243\n", + "10 10000 U-238 scatter-Y1,-1 -0.022028 0.002316\n", + "11 10000 U-238 scatter-Y1,0 -0.003426 0.002651\n", + "12 10000 U-238 scatter-Y1,1 0.026620 0.002084\n", + "13 10000 U-238 scatter-Y2,-2 -0.001295 0.001627\n", + "14 10000 U-238 scatter-Y2,-1 0.000759 0.001426\n", + "15 10000 U-238 scatter-Y2,0 0.005513 0.001983\n", + "16 10000 U-238 scatter-Y2,1 0.000431 0.001862\n", + "17 10000 U-238 scatter-Y2,2 -0.001962 0.001222" ] }, "execution_count": 29, @@ -1421,7 +1421,7 @@ "# Get the standard deviations for two of the spherical harmonic\n", "# scattering reaction rates \n", "data = tally.get_values(scores=['scatter-Y2,2', 'scatter-Y0,0'], \n", - " nuclides=['U-238.71c', 'U-235.71c'], value='std_dev')\n", + " nuclides=['U-238', 'U-235'], value='std_dev')\n", "print(data)" ] }, @@ -2376,7 +2376,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2387,7 +2387,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEZCAYAAABvpam5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztvX2cFOWZ7/29hnFcFBQR4xsEDWKcCWiGGMWQSHLiMIgu\nHpn1GFkjGI+aZ5cYdTDAQ+IxKyxrTlBDPKv4EiEJrEkk7o4LzmDy5IzLJDEREdQZjZhofCUCMfGF\nZMS5nj+qeqa6uqq7qrurX2au7+fTn+mqvu+7rqruuX/3fV33i6gqhmEYhhGHmnIbYBiGYVQfJh6G\nYRhGbEw8DMMwjNiYeBiGYRixMfEwDMMwYmPiYRiGYcTGxMMwCkRElojIXeW2wzBKiYmHUZGIyCdF\n5Oci8qaI7BGRLSJyaoFlzheR//KdWyMiNxZSrqquUNXLCykjDBHpE5G3ReQtEXlFRFaJSG3EvDeI\nyPeSsMswTDyMikNEDgH+E/gWcBhwLPB14K/ltCsIERlWgsucrKojgTOBOcAVJbimYWTFxMOoRE4E\nVFV/oA5/UdWHVfXJVAIRuVxEukXkzyLytIg0uucXi8hOz/n/7p6vB24HznBb8X8UkcuBucBX3HP/\n4aY9RkQ2iMgfROS3IvIlz3VvEJH7ReR7IvInYL63hS8ix7m9hUtE5EUReUNE/l9P/uEislZE9rr2\nf0VEXoryUFT1eaALaPCU9y0R+b2I/ElEHhORT7rnZwJLgAvde9vmnj9URO4RkVdF5GURuVFEatzP\nThCRTre394aI3Bf3izOGDiYeRiXyLPC+61KaKSKHeT8UkQuA/wV8XlUPAWYDe9yPdwKfdM9/Hfi+\niBypqj3AF4FfqOpIVT1MVe8C1gE3uefOcyvSB4FtwDHAZ4GrRWSGx4TZwI9U9VA3f9AaP9NwRPCz\nwPUi8mH3/P8CPggcDzQBF4fkT7tl975PAj4F/Mrz2a+AU3B6aOuBH4lInaq2A/8M3OfeW6Obfg3Q\nC0wAGoEZwP90P7sRaFfVUTi9vVU57DKGMCYeRsWhqm8Bn8SpVO8C/iAi/yEiH3CT/E+cCn+rm/55\nVf29+/5+VX3dff9D4DngdDefhFzSe/7jwBhVXaaq+1X1d8DdwOc8aX6uqm3uNf4SUu7XVfWvqroD\n2I5TwQNcAPyzqv5JVV/Bcc2F2ZXicRF5G+gG7lfV76Y+UNV1qvpHVe1T1ZuBA4GUUIm3bBE5Ejgb\nuEZV96nqG8CtnnvrBY4TkWNVtVdVf57DLmMIY+JhVCSq+oyqXqqq44BJOL2AW92PxwLPB+Vz3UXb\nXLfUH928h8e49HjgmFR+t4wlwAc8aV6OUM7rnvfvAiPc98cAXjdVlLIaVXUEcCFwiYiMT30gIgtd\n99ebrq2HAmNCyhkPHAC85rm3O4Aj3M+/giM2vxKRp0Tk0gi2GUOUSKM2DKOcqOqzIrKWgUDxS8AJ\n/nRupXon8N9w3FPq+vpTre8g95D/3O+B36nqiWHmBOSJszT1a8A44Bn3eFzUjKr6IxE5D7gBuFRE\nPgVcB/w3VX0aQET2En6/L+EMOjhcVfsCyt+F+4xFZBrwExHpVNXfRrXRGDpYz8OoOETkwyJyrYgc\n6x6PAy4CfuEmuRtYKCJTxOEEEfkgcDBOhbkbqHFbzpM8Re8CxorIAb5zH/Ic/wp4yw1kDxeRYSIy\nSQaGCQe5mHK5nbz8EFgiIqPc+1tAPPH5F+AiERkLjAT2A7tFpE5ErgcO8aR9HccNJQCq+hqwGbhZ\nREaKSI2ITBCRM8GJJbnlArzp2pUhMoYBJh5GZfIWTpziUdfX/wtgB9AKTlwDWI4TIP4z8GPgMFXt\nBla66V/HEY4tnnJ/CjwNvC4if3DP3QM0uG6cH7st8nOBjwK/Bd7A6c2kKuWwnof6jsP4JxxX1e9w\nKvIf4cQawkgrS1WfAv4/4Fqg3X39BngB2IfTc0rxI/fvHhF5zH1/CVCHEz/Z66Y5yv3sVOCXIvIW\n8B/AVar6QhbbjCGMJLkZlDtc8FZgGHC3qt4UkGYVThDvXWC+qqaGFH4ZJzAqwF2q+q3EDDWMMiEi\n/w/wP1T1M+W2xTDikFjPQ5zJU7cBM3HGpV8kzlh7b5pZwAmqOhHH13q7e34SjnB8HGeUyrkiMiEp\nWw2jVIjIUSIyzXUZfRinB/FAue0yjLgk6bY6Ddipqi+o6nvAfcB5vjSzgbUAqvooMEpEjgLqgUfd\nyWHvA504M2sNo9qpwxnh9GccN9q/A/9aVosMIw+SHG11LJlDEk+PkOYY4ElgmYiMBv4CnEP6xCjD\nqErc+SiTy22HYRRKkuIRNZiSMVJFVZ8RkZtwAorv4Mz2tVEfhmEYFUKS4vEK6WPYx5E5IcqfZqx7\nDlX9DvAdABH5Z9JHkeCeTy7abxiGMYhR1ThDzDNIMubxGDBRnIXi6nBmx7b50rThDB1ERKYCb7oT\nlUgtReGO3z8fZ1hmBqpata85c+aU3Qazv/x2DEX7q9n2wWB/MUis56Gq+0VkAdCBM1T3HlXtEZEr\n3c9Xq+omEZklIjtx3FPe5RDuF5HDgfeAf1DVPydlq2EYhhGPRJcnUdWHgId851b7jheE5D0zQdMM\nwzCMArAZ5mWkvr4+d6IKxuwvL9VsfzXbDtVvfzEw8SgjDQ0NuRNVMGZ/ealm+6vZdqh++4uBiYdh\nGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAMwzBiY+JhGIZhxMbEwzAMw4iNiYdh\nGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAMwzBik6h4iMhMEXlGRJ4TkUUhaVa5\nn28XkUbP+SUi8rSIPCki60XkwCRtNQzDMKKTmHiIyDDgNmAm0ABcJCL1vjSzgBNUdSJwBXC7e/44\n4HJgiqpOxtnG9nNJ2WoYhmHEI8mex2nATlV9QVXfA+4DzvOlmQ2sBVDVR4FRInIk8GecvcsPEpFa\n4CDglQRtNQzDMGKQpHgcC7zkOX7ZPZczjaruBVYCvwdeBd5U1Z8kaKthGIYRg9oEy9aI6STjhMgE\n4GrgOOBPwI9E5O9VdZ0/bUtLS//7+vr6qtoesqurq9wmFITZX16q2f5qth2qz/7u7m56enqKWmaS\n4vEKMM5zPA6nZ5EtzVj33KeBn6vqHgAR+THwCSBDPDZs2FA8i8vA3Llzy21CQZj95aWa7a9m26G6\n7RfJaLPHJkm31WPARBE5TkTqgAuBNl+aNuASABGZiuOe2gU8C0wVkeHi3OVZQHeCthqGYRgxSKzn\noar7RWQB0IEzWuoeVe0RkSvdz1er6iYRmSUiO4F3gEvdz54Qke/iCFAf8DhwZ1K2GoZhGPFI0m2F\nqj4EPOQ7t9p3vCAk7zeAbyRnnWEYhpEvNsPcMAzDiI2Jh2EYhhEbEw/DMAwjNiYehmEYRmxMPAzD\nMIzYmHgYhmEYsTHxMAzDMGJj4mEYhmHExsTDMAzDiI2Jh2EYhhEbE48qoqOjgxkzWpgxo4WOjo5y\nm2MYxhAm0bWtjOLR0dHB+efPY9++mwDYsmUeDzywlubm5jJbZhjGUMTEo0pYufJOVzjmAbBvn3PO\nxMMwjHJgbivDMAwjNtbzqBJaW69gy5Z57NvnHA8fvojW1rXlNcowjCGLiUeV0NzczAMPrGXlSmdP\nrNZWi3cYhlE+EhUPEZkJ3Iqzk+DdqnpTQJpVwNnAu8B8Vd0mIh8G7vMk+xDwNVVdlaS9lU5zc7MJ\nhmEYFUFi4iEiw4DbcPYffwX4tYi0qWqPJ80s4ARVnSgipwO3A1NV9Vmg0U1T4+Z/IClbDcMwjHgk\nGTA/Ddipqi+o6ns4PYnzfGlmA2sBVPVRYJSIHOlLcxbwvKq+lKCthmEYRgySFI9jAW+F/7J7Llea\nsb40nwPWF906wzAMI2+SjHloxHQSlk9E6oC/BRaFZW5pael/X19fT0NDQwwTy0tXV1fktDt27GDj\nxkcAOOecMzn55JOTMisyceyvRMz+8lHNtkP12d/d3U1PT0/uhDFIUjxeAcZ5jsfh9CyypRnrnktx\nNrBVVd8Iu8iGDRsKNLO8zJ07N2eajo4OVq1a0z+7/PnnF1XM7PIo9lcyZn/5qGbbobrtF/G32eOT\npHg8BkwUkeOAV4ELgYt8adqABcB9IjIVeFNVd3k+vwj4twRtrFg6Ojr6h+Xu3r3LZpcbhlFRJCYe\nqrpfRBYAHThDde9R1R4RudL9fLWqbhKRWSKyE3gHuDSVX0QOxgmWX56UjZWKfx2rmpprgCfLa5Rh\nGIaHROd5qOpDwEO+c6t9xwtC8r4DjEnOusrFv45VXx/U1LTS1zcZsNnlhmGUH5thXiWccsokxoxp\nA2x2uWEY5cfEowIJWsdqxQoTDMMwKgcTjwrE1rEyDKPSMfGoUGwdK8MwKhnbz8MwDMOIjYmHYRiG\nERsTD8MwDCM2Jh6GYRhGbEw8DMMwjNiYeBiGYRixMfEYBHR0dDBjRgszZrTQ0dFRbnMMwxgC2DyP\nKsO72m5r6xUAaYsobtkyr2KWazcMY/Bi4lFF+Ffb3bJlHieddIIt124YRskx8agi/Kvt7tsHL754\nY3mNMgxjSGIxjypn/PixDB++CFgLrHWXa78iLY3FRAzDKDbW86giwlbbBUIXUQxydVlMxDCMQklU\nPERkJnArzk6Cd6vqTQFpVuHsVf4uMF9Vt7nnRwF3Ax8BFPiCqv4ySXsrnWyr7YaJQZCry2IihmEU\nSmLiISLDgNtwtpJ9Bfi1iLSpao8nzSzgBFWdKCKnA7cDU92PvwVsUtW/E5Fa4OCkbK0mbLVdwzAq\ngSRjHqcBO1X1BVV9D7gPOM+XZjaOsx5VfRQYJSJHisihwKdU9TvuZ/tV9U8J2jpoaW29ImdMJAyL\nlRiGEUaSbqtjgZc8xy8Dp0dIMxZ4H3hDRO4FTgG2Al9W1XeTM3dwku/GUhYrMQwjG0mKh0ZMJwH5\naoEpwAJV/bWI3AosBq73Z25pael/X19fT0NDQ37WloGurq6SXWv+fOc57dmzh/Xr1+dMv2LFbRmx\nkoULv86ePXv605TS/iQw+8tHNdsO1Wd/d3c3PT09uRPGIEnxeAUY5zkeh9OzyJZmrHtOgJdV9dfu\n+ftxxCODDRs2FMXYcjF37txymxDImjUbeOqp9HNHH310hr2Van9UzP7yUc22Q3XbL+Jvs8cnyZjH\nY8BEETlOROqAC4E2X5o24BIAEZkKvKmqu1T1deAlETnRTXcW8HSCtho+ComVGIYx+ElMPFR1P7AA\n6AC6gR+oao+IXCkiV7ppNgG/FZGdwGrgHzxFfAlYJyLbgZOBf07K1mqmWEFtfzmpWElTUxtNTW0W\n7zAMI41E53mo6kPAQ75zq33HC0Lybgc+npx11U+xgtrZykmVtXz5cubO/UcArr32UpYuXVrEOzEM\no9qwGeZVTLEmAOYqZ/ny5Xz1q98AVgHw1a9eBcDxxx9flPswDKP6sLWtjJzcfPO9OMIxz32tcs8Z\nhjFUMfGoYuIEtYNiI6lzu3fvoq7uukjlGIZhgLmtqpqoEwCDYhpLl36J5cu/3X+uru5qGhvvZcyY\nwzPKufbaS/tdVQ5Xce21X0nuxgzDqHhMPKqcKGtdBcU0br75xrRzvb0wZkwbmzdnzptJBcdvvtnZ\nO+Taa7/C0qVLI002NAxjcGLiMYhJbVm7det2oLDg9tKlS22ElWEY/Zh4DFLSXVWzgZTbaTI1Ndfw\nt387mx/+cFHa3iCtrWvLZK1hGNWGiccgxe+qcrgWOJG+vi/wwx9+n6VLv0RnpzPpP+qCiYZhGGDi\nMcQ4EfgFAPv2TaazMzjGYRiGkQsbqjtI8Q/jram5BpiWkc727DAMIx+s5zFI8Q/jnT691R2aOxlw\nYhzTp38pcAhvZ+fjgCNAlerKSg0GgMq20zAGKyYeg5SgyvXUU09NmxMSNIT3+utb6etbCZR+A6io\ngmAbVRlG+THxGIQsX76c669fSV/fLQB0dn6Oj3zkFHcC4EClnKqovfT1TaTQtbKyESYQcQShWGt6\nGYaRPyYeg4yOjg6uv/4WVzjmAR309taybdulQHql3Np6BVu2zOsfrityNaqXJWpbmECYIBhGdWHi\nMchYufJOt/eQ4k7gmwRVyt64yO7de3jyyffYv38t4MRF6uquo7X1e0W1bUAglrNv3wGce+4l3HDD\nVbmypuEXPZujYhilJ1HxEJGZwK3AMOBuVb0pIM0q4GzgXWC+qm5zz78A/Bl4H3hPVU9L0tbBxTRg\nkfv+1awpUyIyY0YL+/f/H+AoHMF5lY985MSEWv7LAWeJ9/37nSXe5807n+HDo01ajLqml2EYyZHX\nUF0RuStCmmHAbcBMoAG4SETqfWlmASeo6kTgCuB2z8cKfFpVG004MgkbYusM0f0+cDFwByJPU1vb\nSvQVc5uBDcA0du58qahDeAeGD9+Bf4n3Bx/cEmvnwubmZjZv3sDmzRtMOAyjDGTtebgCcJWq3uL7\naHVQeh+nATtV9QW3rPuA84AeT5rZOLUaqvqoiIwSkSNVdVfKhAjXGXLk2vlvoFV+DK2tNwDkbKW3\ntl5BZ+fn6e0FeBK4i7feWsXDDxdvNFPKtnPPvYT9+4M/NyEwjOogq3io6vsiMhe4xXf+sQhlHwu8\n5Dl+GTg9QppjgV04PY+fiMj7wGpVzdnbGSrkCi4HVcK5KuXm5mY+8pET2bbtX4C9OJ3Fo4Dmogav\nm5ubueGGq2yJd8OocqLEPLaIyG3AD4B3UidV9fEc+TSiDWG9i0+q6qsicgTwsIg8o6r/FbFMI292\n4wTYwRGn4geiw5Z4t4l/hlE9RBGPRhwh+Cff+c/kyPcKMM5zPA6nZ5EtzVj3HKr6qvv3DRF5AMcN\nliEeLS0t/e/r6+tpaGjIYVbl0NXVlVe+KVMm0tm50HUxQV3dQqZMuazg/TX++Mc/4x2Z5XADdXU7\nA8vv6upix44dbNz4CADnnHMmJ598cqRrHX/88Xz72wM/qcWLF3PLLffQ2+sIV2fnxVxzzWWRy8uH\nfJ9/pVDN9lez7VB99nd3d9PT05M7YRxUNfSFM0rq2mxpsuStBZ4HjgPqgCeAel+aWcAm9/1U4Jfu\n+4OAke77g4EuYEbANbSaWbduXd5529vbtalpjjY1zdH29vai5G9qmqOwRkHd1xodPXpCaPmLFi3S\n4cOPdPOs0eHDj8zLlrBrNzXNyausqBTy/CuBara/mm1XrX773bozdr3ufUWJeVwE3JyHKO0XkQVA\nhytC96hqj4hc6X6+WlU3icgsEdmJ4xK71M1+FPBjEUmJ0DpV3RzXhsFMIcHlsIB70PyJ9evDA+Ub\nNz4Se2KfuaYMY3CQT8xDcFQrV8wDVX0IeMh3brXveEFAvt8CH41gm5EHYQH3zZs3JDp/ItsoMZv4\nZxjVRZIxD6MKidqj6ejo4O2336amppW+vieByTkr/GyjxGzin2FUFznFQ1U/XQI7jBISpZWfzb3k\n70HU1FzDKac0sGLFQIWfj3vK5nkYRvWQUzxE5Cic9SSOVdWZItIAnKGq9yRunZEIuVr5uVa49fcg\n+vpgzJi2/s/9q/pmi6mYa8owqpMobqs1wL3AUvf4OeCHgIlHFZOtlV/ICreZq/qWLqZiGEbpiCIe\nY1T1ByKyGEBV3xORgMUljKFCth5E5qq+6ZhryjAGB1EWRnxbRA5PHYjIVOBPyZlkxCGJPcj9+5/7\nF1NMub0mTVrdv4ghwIwZLWzduh1nhZn0/dOzL8ZoGEa1EaXn0Qo8CHxIRH4OHAH8XaJWGZGIux1r\n1CB2lJFPzc3N7Nmzh7lz5/rsmA1cBTQBd1BT8xz/9E+t1tswjEFGlNFWW0VkOvBhnDkez6pqb+KW\nGTmJE5uIKzRx3Et+OwBGjvwaBxxQx/jxkzj11FPj3ZhhGBVPpP08VPU9VX1KVZ804ahO0it4R0SC\n9jAvFu+88y57936Nbdsu5fzz50VyqSXhgjMMIxlsG9oqplKGvvrtqKm5hr6+LxB32ZI4PSPDMMqL\niUcVE2dWdpJCk7JjyZIbefHF13nvvRG89Va8MgoZHmwYRukx8ahyosYmCln+I2qg/Zlndvb3HJyg\nOURZtsQwjOojL/EQkW2q2lhsY4xkyWeORVR3UlDQfPToG/nYx34XSagqxQVnGEY08hIPE46hQyHu\npI997BQ2b96Qdi6sF2MLIxpGdWFuqyFGUvtphPUcvNebPn0Ky5d/O7QXM9hnn9teJsZgIlQ8RORt\nwvchV1U9JBmTjKTIZ0RTVHdSUM8BSLveT38afxTWYMFGkxmDjVDxUNURhRYuIjOBW3F2ErxbVW8K\nSLMKOBt4F5ivqts8nw0DHgNeVtW/LdSeoU4+Lqg47iR/z2HGjJaM1XfhjmLcSigdHR0sWbKCF198\nmfHjj2LFiq9VRAVto8mMwUYkt5WIfAo4QVXvFZEjgBGq+rsceYYBtwFnAa8AvxaRNlXt8aSZ5ZY7\nUUROB27H2cs8xZeBbmBknJsy4pHLnVJMd1JNzXP09Tm9krhB8TA7U+d3797Fk08+w/79KwHYu3ch\ns2d/jra2+6ySNowiE2U/jxuAU4ETcZZmrwPWAZ/IkfU0YKeqvuCWcx9wHtDjSTMbZ/U8VPVRERkl\nIkeq6i4RGQvMwtlL5NoY92SEEOSCmj79SzndKfn66oOut3TpNXR2trmfxxsuHGQneF1jdwAr8Y74\n6u39KnPn/iPr1/+fsgqIjSYzBhtReh7n42xFuxVAVV8RkSgurWOBlzzHLwOnR0hzLLALuAW4DrDY\nSpEIckHlcqd0dHQwe/bn6O09CYDOzugt+TCX19KlA2miClOYnc771Pm2gJxj2bv3i5x/fnljDDaa\nzBhsRBGPv6pqn4gAICIHRyw7LNjuR/zHInIu8AdV3SYin45YjhEBvwsq1/pWc+d+nt7ePuCLAPT2\nLmTJkhsjV3ze66XWrgJHKB577DF346iJwLQiBJGvAC72HC8Ergba2Lfv+Fh2J8FgH01mDC2iiMeP\nRGQ1MEpErgC+ANwdId8rwDjP8TicnkW2NGPdcy3AbDcm8jfAISLyXVW9xH+RlpaW/vf19fU0NDRE\nMK0y6OrqKrcJTJkykc7OhfS6y12KXM2oUU2sX7+eO+64g7173wNW4XUF/eY3X2X9+vWx7N+xYwe3\n3HIPvb3fBOBnP/sfvP++oPotN8Ui9u27mIULv86ePXty2llXt5ApUy4DSDtfW9vL6NHL2L37Tfr6\npgPfBhxX1xNPXM3ixYs5+eSTgdzPf8eOHWzc+AgA55xzZn++SiGp308p7rsSfvuFUG32d3d309PT\nkzthHFQ19IXTK/ggMAP4pvtqypbHk7cWeB44DidO8gRQ70szC9jkvp8K/DKgnOnAgyHX0Gpm3bp1\n5TZBVVWXLVumNTWHK0xVaNXhw4/U9vZ2ra39gHtujYK6rzXa2DhdVePZ39Q0x1dOZrkwVZua5oSW\n0d7erk1Nc7SpaY62t7f3n2tsnKYjRhytI0d+UBsbp2t7e7u2t7e795Rpe6qMRYsWZb3W8OFHuvnX\n9D+TSiKJ30+p7rtSfvv5Uu32u3Vnzno82ytKz2OTqk4CNscUpf0isgDowBmqe4+q9ojIle7nq1V1\nk4jMEpGdwDvApWHFxbm2EY/Ozsfp6xsINO/bN9njzpqGsytgiqtYseKHidhRU/Mcra03hH7ud/sM\nBNEvBp4FVrBtG/3xjVNOmcS2bellbN/+lHuvTo/lM5/5TKAraagOrR2q923EJ6t4qKqKyFYROU1V\nfxW3cFV9CHjId26173hBjjI6gc641zYK5+///mzWrr0LuBxnJNMznHXWaRkVSZSgt3+0UV3dM8B1\n/e6mmppr+PznZ7Ny5Z2sXHlnpFFdAxVdG06nOL3CW7FiiSsuA9fwTlLs7bWK0TDyJUrPYypwsYi8\niNM7AEdXKssBbORNtmGkmzd38tpraxg2rIaLLz6PNWvWpOWNOnM6c7TRfcBAwH769NasS5fkg/+a\nu3c3sG3b5MC0fgEcqkNrh+p9G3mQy6+FE7PIeBXqLyvGC4t5FA1/PCGK73vdunUBsYw1WeMWYeRT\nzoCNrQpjcvrp/fdUVzcm670GxVgKJSxuk891kvr9JHHffirpt58P1W4/pYh5qDvJzxjc5FpapBJ9\n396exe7dHwbuZcyYw0PnUPh7IlOmXEZzc3PovW7evKGo9xvUS1u69EtF73EVig0pNqJgq+oaBVEs\nN0e+5QRVdP75JP5lTFLng4YEp9i6dTsdHR1FrUSDgtE333xjxYu0YQRh4mEEks9qurt37wFO6K+g\n41SAcWZg+5d537DhIV588XXGjx9LS0tTYEseyGj1X3XVfObOnZtxr7CQvXvnlX1Wei527NjBmjXO\nfinTp0+hs/NxoPDl3m3peCMShfq9yvnCYh6JsmzZMh09eoKOHj1Bly1blvG51/5C5wcExVyC/O7+\n68BBCqP7j0VGuTGQ9NhJUExl0qQz0sodPXqCO/+kvaD4TbZ79D+jZcuW5fXc2tvbta5ujOc5HOLe\nd2FzM2yeRzSq3X6KEPMouwAUZLyJR2JEDZinKCRwnhnIPkLr6kYFXjvqZEPvcUoAncp1jvtqTROP\nzLLbFU7S2toP9E88LAbFCpgHPW/nvgoTvWINgMhFJf/2o1Dt9hdDPMxtNUSI64oI8s8vWbIiEReG\n/1rO3I87yDcO4F32Ha5i797LgReAu3CWWnHO19enlzfgvnrSTVvH/v3fZNs2mD3781x//ZcLdg0F\nxWgsQG1UJYWqTzlfWM8jEvm4IoJbtqPTWuHFclsFX2tqYOs3l9uqru4IXbZsmTY1zfH0NtRtlYe7\nrbz3MeC+8qZv1ZqawxJ350TF3Fblpdrtx9xWJh5RyKycW3X06AlZ3STO2lCHZa2c/PbnOz/AqQiP\n6L9Wbe3hoW4r/3WWLVumjY3TdPToCRnupfT7LlQ8Mt1jSbhz4rBo0aK051CsuRlxvsdC5qiUYj5J\nUph4mHiUlfKIR7tGmVCnqtrYOM2tNL0t+IGKs1j2O+Ixyr3WVK2rG1WUyjC9Fd3qCuDAfS9atChD\niBw7TlJyrUksAAAcJElEQVQ4OO05iYyuOPEo5u8nn4q8kF7KokWLKn7hyWyYeJh4lJXyuK2it6AH\n8gXnKZb9YUHaYrRM/eLgLc9fgYmM8LjAWhVG6LBhR2hj4/S8R0UlSTHFO597KyS4PmnSGRl5vSse\nl/vZ5sLEw8SjrJTyB5iqRB2XTPR/+NSS50H+/mLZ39g4PcOmCRM+GqtCy0doMiuwTJEcPXpCQddI\nkqTFO6l8qsHiMbCEfmWIczZMPEw8yko5foD5tjKDKs4g+/MZiuq4x7zB3zE6YsTRoS3Txsbp2tg4\nLdY6XEF25BaPVh058oORxaLYPaVcZZRbPIrptnIaJ5mu0UrFxMPEo6yU6wdYrBZ0UMA8n0lwTuWV\nPgcjqIfkbZk6YuNsXBXUc/FXPEG2XXDBBb6RW3+jcJgrIi3qj5Hk6vkU6taKW0ac30+277wQ23NN\nJM1mu9cmpwFRWTGlbJh4mHiUlWr/AfrtD2rBRnGTRRGdoJZpagRVlGuEzTAf2EXxJPUO+XVEJHpl\nVozJdXHLiNPzyyUOpQ6YR2l4mNsqOYohHolOEhSRmcCtODsJ3q2qNwWkWQWcDbwLzFfVbSLyNzgb\nQB2Is4Xtf6jqkiRtNUqPd+Li0qVforOzDRhY1+rUU0+NtBfH+PFHsW/forwWZxzYRbENWMzAXu13\nZKTdunU7M2a05D1BMOk1o8JW7b355ntzLr6Yz0TFYu46GGdtszjYOl0JUqj6hL1wBGMnzv4fB5B7\nD/PT8exhDhzk/q0Ffgl8MuAaRVXjUlPtrZdC3FZxW5qZw25HK0zSurpR/eVlazkHXS81T8Lbiwmb\nFJhrEl6u+4na+i/EbRXUcxFJueGK7xIauF67+/ymamPjtEh5S/HbT7I3U+3/u1Sy2wo4A2j3HC8G\nFvvS3AFc6Dl+BjjSl+Yg4NdAQ8A1ivpAS021/wALCZjn4+ZJjfxyFj8cmFEex83itSPldw/bUCpz\npnr2SjKbgEW930IC5mGrAsAyhUxRL0Zw35kXMyb291GK337Q8yjWcOBq/9+tdPH4O+Auz/HFwLd9\naR4EPuE5/gnwMR3ouTwBvAV8I+QaxX2iJabaf4CF2F+O4aF+UvanKuzGxmn9lYtX+BzxOElhYBa8\nyKj+EV9RKuKweFBY+igiEtTzS+8tpURxjit8U/sD28VqkUcdrBBlpF6xCXrmxRoO7F+ap5KGcEeh\nGOKRZMxDI6aToHyq+j7wURE5FOgQkU+r6v/1Z25pael/X19fT0NDQ37WloGurq7Eyt6xYwcbNz4C\nwDnnnMnJJxd/y/lC7J8yZSKdnQvdRRChrm4hU6Zcxvr167Pme+211wLP5coXhNf++fNb0j7bs2cP\nixcv5pZb7qG395vAN4H/Tcq/rwrbtt0BzObhh68CLgcm09l5Mddcc1nG8/bfb2rPkNmzM9Pv2LHD\nc11Cywx6/uPGHcWLL94BHAOsBV4HuoDXqavbyeWXX8Z9923MiFUsXPj10M2xsv2W3nuvNyO99/sI\nu5e33nor8FrFxP/MRa6mr+8yot53NlLPPsp3VYr/xVx0d3fT09NT3EILVZ+wFzCVdLfVEmCRL80d\nwOc8xxluK/f814CFAeeLJ8VlIMk9qIvRsszVoirU/myzv7PlKdbIoVz2p/v0D89oxXqXQI+yHPpA\nLyb7niFRe1dBPY/Gxulu67q1343knRMTp/xUmYXEcsKu5V2XK8nWelLDgVPPPtezrNRRZFS426oW\neB4nYF5H7oD5VNyAOTAGGOW+Hw48Anw24BpFf6ilJCnxKIZrJ8qPPunlMcJEoFhzFqKLR2oeindO\nyJg0AYi6l0aU7yYf8fDfd03NYdrYOC3y4IHc7rbweE/cWE9j47S0FYG9MZgg12GxKGZFHlU8iulm\nLSYVLR6OfZwNPIsz6mqJe+5K4EpPmtvcz7cDU9xzk4HHXcHZAVwXUn7RH2opqWTxiFJGmP1xK/2w\nCibp9ZZyPf+ByiY1WilVgU5SGOERkujLoUepwJYtW6beCYpwSMYEvPZ2Z4Z86lnG/c5TvRRnNeJg\nkVH1TuBMF6ZC5oIExUkGekvRFu3MFqfKZU+2fP7faNhvNtVzamycnnUF6Cg9k3LESypePJJ+mXgE\nU4wWVr7ika0XEWZTWDA5V4s3qt1hI2yyPf+BSma6TpjQEDBst0VhqtbUHK7z5s2LVQHkctcNVNgD\nM+5zuULiumSi/kacIHymyy5OY8RfQQaPCpuqQcvmh41ICxshF/X5R/mNhu1o6YwySx9hNmFCQ9q2\nAF6Rqq09PC3tQC8ru/AkiYmHiUcohbZo8nVbhYlONjEKb53Gb/FGrQDC7A+zx9k3xGmpT5gwOSOO\nkMoX55k7s9szF5zM9ayC4iaNjdNjNRji9FSijKjKRlBrPn0jq0Pd7zrzOo2N0zPKGrj//GIYcX6j\nQZuSZaZLnxOU/ptrVWfDMme7gdraQ9N+j373Z6lcWiYeJh6Jkk/APB/xCLrWQIs3vAUexe5sLfKw\n5x/We8k3cBz0HLO16KO2jB1hbU/LF1W8osQyotxbru/AiW8ckZH3ggsucO/fu47YSepfIDPlUgsq\ny1lCJvf8myjfb6onkJ94ZE7CHMiXW5CKsfd8XEw8TDzKSrHcVmFMmDA5sDKJQzbRiiMeudbPCrvO\nwNpZUxVa+0c/Be9WmN7DCHZnZVZEcSZKpnBa/9En+MVZADH9uw6+x8wVjVu1tvYD6m8spIt2UCU9\nIu0eamsPj907TfUs/c8jbEdLf88pqBEQXTxaFcZqahM0c1uZeERiMIqHavyAeRhBLcGRI8fFcsVl\nE604bqtcMYWwoH/wpL2p/WISxy0XLB5jIwlq0LOP6o6KK/zpdgaLavBmUJmDJNKfe9D95xeP8T+P\ngWeR3osJ+81ecMEF/WJ61lln5XBbHdL/XmS0u2RMq++zeKslFIqJh4lHYkSp6JO2P9wHHS+4GHYv\nUQLmXjdatuHEQcHPcDdIasb3mH4xqak5PFKLPkiMclWWYbYH2eePMajGH72Xnj5422P/fh51daPc\nfVrS92oJLislwIcpjM9LPDKfa3QRyozZpA+gWLZsWcagCH9DoqbmMB05clzBtueLiYeJRyJEbWkm\nbX+mj7+4wcW49ucSlJRLKlUBBrm6nLWmUvfg7FsSpyfld4NFEdFwH3/mJlxBvZi44pH5XEb1P5PU\nyDfv/vFhcZGgspw9Vw71VdzRWu9ho9yc5+Cfx3NoqJgHN2qyxy3ycYUmiYmHiUciRK0sSrUyalOT\nd3HC4v2jRbU/rOeSO7Ce7pYQGaU1NQdqym2Vr487Zc+kSWdEyp99EEPuAQlxhvUGVc7BQjsmaywn\nbDDFhAkfzUg7fPjRacNkw55Ztu/FH3iHk0IHPQT3KCeod/BClO8g37lMxcDEw8QjEZIUj3yHEOcT\ncM913Sj2Z7tutNbkQO/CCcoOtLDzDXSn7mPRokWR8xQ6iCHX95arrGy/qTg9m7BnHq/3lVn5i3g3\nAsscxebvSdXWetOnXGljQhsEudyecf8fCsXEw8QjEZJyWyUhAIVcN4r92Sq2uIH1uO6f8PtwfP4i\noyPFSVKumSgzqnOdDys/V88w272HzXfJ/gzSK+54QfxMd9HIkeNC1x3LtL1VDzxwjDs6bJL659vk\nelalFoogTDxMPBIjmwsiRVz7C6088yXsuoWKh2q0OEhq9vHIkR/MKCsVHPY+2+xusugjtPIV6zhu\nqqgxqTC3lV8Qo8zYb2+PtsBksK2p5zdaU0vKeOeTBN13tgEA5ZrkVygmHiYeiZOtIhkK4pFPBewd\ngVVbe7CnsvEPzRyVESgOc20NVJhjs7bwo9x3vs8rSrpso+GCXG5BZYTtuZEr7pDr3vw9HBilcFKa\nqylIuNN/A6kh1gNxorB7rqSehh8TDxOPxMlWkZTabZUvhbitUvn9vYsolYLz7PwT2wZiIEEV4PDh\nx2ScmzBhsm9mdbTWbjnEI+rosWyr0gbN6g6KOzjPJPpQ53zjJaoDv4ERI45Wf89jxIijA91+5QqG\nR8HEw8QjcYopHqrla43lGzAPKidqpRAsHtljII47Jf3csGFHBKTL3drNd8fAfN1WcSpI7y6O3jKc\nnkFmzyroWfkXrCzmel5h5Dc3ZmAXx0oREBMPE4/EKabbqtLIx/44FVB7e/YlQNrbgyb9jc1o2Q4b\nljmBrbb2A2lDddvbMzeCSrnB8h1kECdgHrf8oG1cg1YwzrZYZNg8iWyDAArtDcTvlbWrf//4ShAQ\nEw8Tj5IQ9s9YLfaHkY/9UVueKZxKfVroPARndJZ31nmrioxQ71yQCRMaMgSlsXFaaOvdP9Q0CqXo\nEQbFPFKkT35s0Zqaw9OeV/DItuDvItcCloWIadRl1AfsDe95lhMTDxOPslIt9hdT/KLOyo5jW9Ai\nff4Yi1NhpU8uzB43mBNYUQU9C38gOTUjvJhCEjTayruvBRzsE7/MCYu5RrZFWYOsOLYfoePH10fq\nlZVzFnk2qkI8gJnu3uTP+fcw96RZ5X6+HWh0z40DfgY8DTwFXBWQr8iPtLRUS+UbRjXYX2y328Bw\n2XjLxOeyMVdrOFvMJizoHNTqDhKq9HWdgteiymV/tt5VsI2tPpedf1vfqZGeq/+5pLuLoi/Tno2g\n5ztp0hmR8lZq4LzixQMY5m4xexxwQIR9zE/37GN+FPBR9/0Idztbf96iP9RSUg2VbzYKsb9UgfMk\nAv6VUhlkCzoHbS0bHjfwulbijaDKFdcJv3bQ8upzPO+jb3Wby57a2sMDN++KSiHikbKp0obsVoN4\nnAG0e44XA4t9ae4ALvQcPwMcGVDWvwOf9Z0r5vMsOUNVPEpZARdbPFSTqQzyKTMo6Jwtf7h4eCce\nBlXqkzRsRnuuEWVe+7zf+cByIN7rpMpx4jz5Er6acWtGLCUKQb9Xf8ymEgUiG9UgHn8H3OU5vhj4\nti/Ng8AnPMc/AT7mS3Mc8CIwwne+qA+01AxV8SjGkMmoVMNosXzFtBjzbAaG86aWPBmZtue2M3R4\nIEAskr52U1TxSF0/VcFecMEFviB/aifBzAUj41bMwW686Ro06infUWV+4a6U3mhUiiEetSSLRkwn\nYflEZARwP/BlVX3bn7GlpaX/fX19PQ0NDXmYWR66urrKbUJB5Gv/a6+9Fnhu/fr1hZoUyFVXzWfj\nxtUAnHPOfPbs2cP69etj2b9jxw42bnzELeNMTj755KLZt2LFbezbdxMwD4B9+2Dhwq+zZ8+erNf3\n2x/FRv+zOP744zn33DPZtOkHAMyaNZMPfehDbNy4mu7u5+jr+wCOw8CxTTXdtilTJvKzn/2E/fsX\n9l+jtvZapky5PPD7nD/f+X/t6upKs+Www07h8cd/B7zNrFlN/d/Rjh07uOWWe+jt/SYAnZ0Xc801\nl2V9/lOmTKSzcyG9vakzC4EPA+nP+ItfvI5XX30tctkp2/fs2ZP27KN8f+Wmu7ubnp6e4hZaqPpk\newFTSXdbLcEXNMdxW33Oc9zvtsKJk3QAV4eUX0wxLjmV0vLNl2pwW2UjzgzzJO3N1RMLu34+rd8o\nI5ZS+ZyRS5nupSCXVK6AuZ+otufbS80cWpvZOxpw2cUf/OC1v5Q96WJBFbitaoHncdxOdeQOmE9l\nIGAuwHeBW7KUX+RHWlqGqnioVoaPOKr9SVcOuSr+sOtnVmDZK8I4cyVS6Z21uQbcVsXaKjVq5VuM\nZ58SN//kw7D5M3Htr5TGUByKIR41xe3HpKOq+4EFbu+hG/iBqvaIyJUicqWbZhPwWxHZCawG/sHN\nPg0nRvIZEdnmvmYmaa9ROpqbm9m8eQObN2+gubm53OaUlebmZh54YC1NTW00NbXxwANrYz+T3bt3\nAXcBr7qvu9xzA6xceafHvTKPfftu4sUXX84oa/v2p+jo6KC5uZn//M8NNDZ+hNGjb6Sx8V7a2r6X\n07aOjg5mzGhhxowWOjo6Yt1Hiq1btzNjRgvTp09h+PBFwFpgLcOHL6K19YpYZTU3N/P441vYtOnf\n0p7xIYccAXyT1PNw3tfGvodifH9VSaHqU84X1vMoK0PF/nK3LKO4rSZMmJzRip4wYXJaOUGteH+L\nPOq+6HFt9ZOt5e4EzwtfYiUXYb2aKPdQ7b99Kt1tlfTLxKO8DCX7y+1myzZJUFUDZzKPHj0ho4yg\nSjFziZT83XJR3Uz+Z5+6vyS2Gw4j7HlEuYdq/+0XQzySHm1lGIOC5ubmsroicl1//Pix7N2bec5f\nxgMPrGXlyjsBaG0dcK+cf/489u37IvC66xpaW1T7c5G6vxkzWnj44cklu2bQ80gdG9kx8TCMQcCK\nFUuYPfvz/cNT6+quY8WK72WkCxKhbKISl+nTp/DTn15DX59zHFeIWluvYMuWeezbl1/+uAQ9j1Lb\nUK2YeBjGIKC5uZm2tu95BCB7YLujo8OT9oqi9Kw6OjpYvvzb9PV9AbiDmprnWLr0mljlFlPI8qUS\nbKgGTDwMY5AQVQA6OjpcN9VNAGzZMq8oI4TSR3NBX99aOjvbWLo0XjnldhFWig2VjomHYQwx/JX8\nvn3OOassjTiYeBiGURQsVjC0MPEwjCFGUpW8xQqGFiYehjHESLKSt1jB0MHEwzCGINVSyQeNCjMq\nAxMPwzAqkqRGhRnFwcTDMIyKxEaFVTaJrqprGIZhDE6s52EYRkViQ38rGxMPwzAqEhv6W9mYeBiG\nUbFUy6iwoUjiMQ8RmSkiz4jIcyKyKCTNKvfz7SLS6Dn/HRHZJSJPJm2nYRiGEZ1ExUNEhgG3ATOB\nBuAiEan3pZkFnKCqE4ErgNs9H9/r5jUMwzAqiKR7HqcBO1X1BVV9D7gPOM+XZjbOBsWo6qPAKBE5\nyj3+L+CPCdtoGIZhxCRp8TgWeMlz/LJ7Lm4awzAMo4JIOmCuEdNJnvloaWnpf19fX09DQ0PUrGWn\nq6ur3CYUhNlfXqrZ/mq2HarP/u7ubnp6eopaZtLi8QowznM8DqdnkS3NWPdcJDZs2JC3cZXA3Llz\ny21CQZj95aWa7a9m26G67Rfxt9fjk7Tb6jFgoogcJyJ1wIVAmy9NG3AJgIhMBd5U1V0J22UYhmEU\nQKLioar7gQVAB9AN/EBVe0TkShG50k2zCfitiOwEVgP/kMovIv8G/Bw4UUReEpFLk7TXMAzDiEbi\nkwRV9SHgId+51b7jBSF5L0rQNMMwDCNPbGFEwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAM\nwzBiY+JhGIZhxMbEwzAMw4iNiYdhGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAM\nwzBiY+JhGIZhxMbEwzAMw4hNouIhIjNF5BkReU5EFoWkWeV+vl1EGuPkNQzDMMpDYuIhIsOA24CZ\nQANwkYjU+9LMAk5Q1YnAFcDtUfMOBrq7u8ttQkGY/eWlmu2vZtuh+u0vBkn2PE4DdqrqC6r6HnAf\ncJ4vzWxgLYCqPgqMEpGjIuatenp6esptQkGY/eWlmu2vZtuh+u0vBkmKx7HAS57jl91zUdIcEyGv\nYRiGUSaSFA+NmE4StMEwDMNIgNoEy34FGOc5HofTg8iWZqyb5oAIeQEQqW7tMfvLi9lfPqrZdqh+\n+wslSfF4DJgoIscBrwIXAhf50rQBC4D7RGQq8Kaq7hKRPRHyoqpD+9szDMMoE4mJh6ruF5EFQAcw\nDLhHVXtE5Er389WquklEZonITuAd4NJseZOy1TAMw4iHqEYNTRiGYRiGQ8XPMBeR0SLysIj8RkQ2\ni8iokHSBkwpF5H+LSI87CfHHInJoieyu6gmS+dovIuNE5Gci8rSIPCUiV5XW8sKevfvZMBHZJiIP\nlsbiDNsK+e2MEpH73d98t+sOLikF2r/E/e08KSLrReTA0lneb0NW+0XkJBH5hYj8RURa4+QtBfna\nH/t/V1Ur+gV8A/iK+34R8C8BaYYBO4HjcILtTwD17mdNQI37/l+C8idgc6g9njSzgE3u+9OBX0bN\nW+H2HwV81H0/Ani2lPYXYrvn82uBdUBbKZ97MezHmTf1Bfd9LXBotdjv5vktcKB7/ANgXgXafwRw\nKrAMaI2Tt8Ltj/W/W/E9DzwTCd2//z0gTeikQlV9WFX73HSP4ozoSppqnyCZr/1HqurrqvqEe/5t\noAdn3k6pyNt2ABEZi1O53U15hpHnbb/bq/6Uqn7H/Wy/qv6phLZDYc//z8B7wEEiUgschDMis5Tk\ntF9V31DVx1xbY+UtAXnbH/d/txrE40hV3eW+3wUcGZAmyoREgC8Am4prXiDVPkEyX/vThNkdLdeI\nI9qlopBnD3ALcB3QR3ko5NkfD7whIveKyOMicpeIHJSotZnk/fxVdS+wEvg9zijLN1X1JwnaGkTU\nuqTYeYtFUWyI8r9bEeLhxjSeDHjN9qZTpz8VFOHPGfUXkaVAr6quL5LZ2aj2CZL52t+fT0RGAPcD\nX3ZbMaUiX9tFRM4F/qCq2wI+LxWFPPtaYArwr6o6BWcE4+Ii2haFvH/7IjIBuBrH5XIMMEJE/r54\npkWikBFElTD6qGAbov7vJjnPIzKq2hT2mYjsEpGjVPV1ETka+ENAsqwTEkVkPo4r4rPFsTgnJZkg\nmSD52v8KgIgcAGwAvq+q/56gnUEUYnsLMFucBTv/BjhERL6rqpckaK+fQuwX4GVV/bV7/n5KLx6F\n2P9p4OequgdARH4MfAIn/lQqotifRN5iUZANsf53SxnMyTMA9A1gkft+McEB81rgeZwWSx3pAfOZ\nwNPAmBLaHGqPJ403aDiVgaBhzrwVbr8A3wVuKdPvJW/bfWmmAw9Wm/3AI8CJ7vsbgJuqxX7go8BT\nwHD3d7QW+MdKs9+T9gbSA85V8b+bxf5Y/7sl/cfI82GMBn4C/AbYDIxyzx8DbPSkOxtndMBOYInn\n/HPAi8A29/WvJbI7wx7gSuBKT5rb3M+3A1Ny3UuJn3te9gOfxIkXPOF55jOrwXZfGdMpw2irIvx2\nTgF+7Z7/MSUebVUE+7+C09h7Ekc8Dqg0+3FGJb0E/An4I06MZkRY3mqxP+7/rk0SNAzDMGJTEQFz\nwzAMo7ow8TAMwzBiY+JhGIZhxMbEwzAMw4iNiYdhGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4\nGEYOROQ4d3Ode0XkWRFZJyIzRKRLnE3KPi4iB4vId0TkUXdF29mevI+IyFb3dYZ7/tMi8n9F5Efu\nxk3fL+9dGkY8bIa5YeTAXZ76OZy1l7pxl/9Q1ctckbjUPd+tquvE2e3yUZwlrRXoU9W/ishEYL2q\nflxEPg38O9AAvAZ0AdepaldJb84w8qQiVtU1jCrgd6r6NICIPI2z3ho4C/kdh7My7GwRWeiePxBn\nRdPXgdtE5BTgfWCip8xfqeqrbplPuOWYeBhVgYmHYUTjr573fUCv530tsB+Yo6rPeTOJyA3Aa6r6\neREZBvwlpMz3sf9Ho4qwmIdhFIcO4KrUgYg0um8Pwel9AFyCs8e0YVQ9Jh6GEQ1/cFB9728EDhCR\nHSLyFPB197N/Bea5bqkPA2+HlBF0bBgViwXMDcMwjNhYz8MwDMOIjYmHYRiGERsTD8MwDCM2Jh6G\nYRhGbEw8DMMwjNiYeBiGYRixMfEwDMMwYmPiYRiGYcTm/wc+m36HSPvANgAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2414,7 +2414,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2425,7 +2425,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 0ff2e5f587..2f32f3d9a7 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -358,7 +358,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEAsiA0Bbyc8AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMTZUMTg6MzE6\nMzUrMDc6MDDLyLisAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTE2VDE4OjMxOjM1KzA3OjAw\nupUAEAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQMZGiFPL70AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMjFUMTA6MDg6\nNTcrMDc6MDALr51VAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTIxVDEwOjA4OjU3KzA3OjAw\nevIl6QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -569,8 +569,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 36a516ed8125ab8a86d8c9b3aee4bd4bc2db859c\n", - " Date/Time: 2015-09-16 18:34:04\n", + " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", + " Date/Time: 2015-09-21 10:25:26\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -625,20 +625,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.2100E-01 seconds\n", - " Reading cross sections = 1.7200E-01 seconds\n", - " Total time in simulation = 1.5669E+01 seconds\n", - " Time in transport only = 1.5663E+01 seconds\n", - " Time in inactive batches = 2.1160E+00 seconds\n", - " Time in active batches = 1.3553E+01 seconds\n", - " Time synchronizing fission bank = 0.0000E+00 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 9.1800E-01 seconds\n", + " Reading cross sections = 6.5800E-01 seconds\n", + " Total time in simulation = 1.7037E+01 seconds\n", + " Time in transport only = 1.7024E+01 seconds\n", + " Time in inactive batches = 2.8600E+00 seconds\n", + " Time in active batches = 1.4177E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.6203E+01 seconds\n", - " Calculation Rate (inactive) = 5907.37 neutrons/second\n", - " Calculation Rate (active) = 2766.91 neutrons/second\n", + " Total time elapsed = 1.7971E+01 seconds\n", + " Calculation Rate (inactive) = 4370.63 neutrons/second\n", + " Calculation Rate (active) = 2645.13 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", From 1453ec18bd9ada26c7b246d069f48450d19598fa Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 10:48:25 +0700 Subject: [PATCH 145/519] Added short section on DBRC in documentation. Closes #433. --- docs/source/methods/physics.rst | 38 +++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index d0a6a2c992..7eedc4e6ed 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -1027,14 +1027,19 @@ probability distribution function can be found by integrating equation Let us call the normalization factor in the denominator of equation :eq:`target-pdf-1` :math:`C`. -It is normally assumed that :math:`\sigma (v_r)` is constant over the range of + +Contant Cross Section Model +--------------------------- + +It is often assumed that :math:`\sigma (v_r)` is constant over the range of relative velocities of interest. This is a good assumption for almost all cases since the elastic scattering cross section varies slowly with velocity for light nuclei, and for heavy nuclei where large variations can occur due to resonance scattering, the moderating effect is rather small. Nonetheless, this assumption may cause incorrect answers in systems with low-lying resonances that can cause a significant amount of up-scatter that would be ignored by this assumption -(e.g. U-238 in commercial light-water reactors). Nevertheless, with this +(e.g. U-238 in commercial light-water reactors). We will revisit this assumption +later in :ref:`energy_dependent_xs_model`. For now, continuing with the assumption, we write :math:`\sigma (v_r) = \sigma_s` which simplifies :eq:`target-pdf-1` to @@ -1232,6 +1237,35 @@ If is not accepted, then we repeat the process and resample a target speed and cosine until a combination is found that satisfies equation :eq:`freegas-accept-2`. +.. _energy_dependent_xs_model: + +Energy-Dependent Cross Section Model +------------------------------------ + +As was noted earlier, assuming that the elastic scattering cross section is +constant in :eq:`reaction-rate` is not strictly correct, especially when +low-lying resonances are present in the cross sections for heavy nuclides. To +correctly account for energy dependence of the scattering cross section entails +performing another rejection step. The most common method is to sample +:math:`\mu` and :math:`v_T` as in the constant cross section approximation and +then perform a rejection on the ratio of the 0 K elastic scattering cross +section at the relative velocity to the maximum 0 K elastic scattering cross +section over the range of velocities considered: + +.. math:: + :label: dbrc + + p_{dbrc} = \frac{\sigma_s(v_r)}{\sigma_{s,max}} + +where it should be noted that the maximum is taken over the range :math:`[v_n - +4/\beta, 4_n + 4\beta]`. This method is known as Doppler broadening rejection +correction (DBRC) and was first introduced by `Becker et al.`_. OpenMC has an +implementation of DBRC as well as an accelerated sampling method that are +described fully in `Walsh et al.`_ + +.. _Becker et al.: http://dx.doi.org/10.1016/j.anucene.2008.12.001 +.. _Walsh et al.: http://dx.doi.org/10.1016/j.anucene.2014.01.017 + .. _sab_tables: ------------ From 7d7f9463b2e5fc67456f61ef174ec643f6b0cebd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 10:57:19 +0700 Subject: [PATCH 146/519] Fix typo in documentation --- docs/source/methods/physics.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/methods/physics.rst b/docs/source/methods/physics.rst index 7eedc4e6ed..e25057488c 100644 --- a/docs/source/methods/physics.rst +++ b/docs/source/methods/physics.rst @@ -1028,8 +1028,8 @@ Let us call the normalization factor in the denominator of equation :eq:`target-pdf-1` :math:`C`. -Contant Cross Section Model ---------------------------- +Constant Cross Section Model +---------------------------- It is often assumed that :math:`\sigma (v_r)` is constant over the range of relative velocities of interest. This is a good assumption for almost all cases From 397d5fe269eecc2fe9acef5b70f202b3b4ac3c82 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 11:34:03 +0700 Subject: [PATCH 147/519] Update file format documentation. Use score_bins instead of scores. --- docs/source/usersguide/output/statepoint.rst | 42 +++++----- docs/source/usersguide/output/summary.rst | 80 ++------------------ openmc/statepoint.py | 2 +- openmc/summary.py | 2 +- src/state_point.F90 | 3 +- src/summary.F90 | 3 +- 6 files changed, 28 insertions(+), 104 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index 66fcce27f4..42d923351e 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -39,7 +39,7 @@ The current revision of the statepoint file format is 13. Pseudo-random number generator seed. -**/run_mode** (*int*) +**/run_mode** (*char[]*) Run mode used. A value of 1 indicates a fixed-source run and a value of 2 indicates an eigenvalue run. @@ -142,14 +142,10 @@ if (run_mode == MODE_EIGENVALUE) Unique identifier of the mesh. - **/tallies/meshes/mesh i/type** (*int*) + **/tallies/meshes/mesh i/type** (*char[]*) Type of mesh. - **/tallies/meshes/mesh i/n_dimension** (*int*) - - Number of dimensions for mesh (2 or 3). - **/tallies/meshes/mesh i/dimension** (*int*) Number of mesh cells in each dimension. @@ -180,9 +176,9 @@ if (run_mode == MODE_EIGENVALUE) *do i = 1, n_tallies* - **/tallies/tally i/estimator** (*int*) + **/tallies/tally i/estimator** (*char[]*) - Type of tally estimator: analog (1) or tracklength (2). + Type of tally estimator. **/tallies/tally i/n_realizations** (*int*) @@ -194,7 +190,7 @@ if (run_mode == MODE_EIGENVALUE) *do j = 1, tallies(i) % n_filters* - **/tallies/tally i/filter j/type** (*int*) + **/tallies/tally i/filter j/type** (*char[]*) Type of tally filter. @@ -214,28 +210,32 @@ if (run_mode == MODE_EIGENVALUE) Number of nuclide bins. If none are specified, this is just one. - **/tallies/tally i/nuclides** (*int[]*) + **/tallies/tally i/nuclides** (*char[][]*) - Values of specified nuclide bins (ZAID identifiers) + Values of specified nuclide bins. **/tallies/tally i/n_score_bins** (*int*) - Number of scoring bins. + Number of scores. - **/tallies/tally i/score_bins** (*int*) + **/tallies/tally i/score_bins** (*char[][]*) - Values of specified scoring bins (e.g. SCORE_FLUX). + Values of specified scores. - **/tallies/tally i/n_user_score_bins** (*int*) + **/tallies/tally i/n_user_scores** (*int*) - Number of scoring bins without accounting for those added by - expansions, e.g. scatter-PN. + Number of scores without accounting for those added by expansions, + e.g. scatter-PN. **/tallies/tally i/moment_orders** (*char[][]*) Tallying moment orders for Legendre and spherical harmonic tally expansions (*e.g.*, 'P2', 'Y1,2', etc.). + **/tallies/tally i/results** (Compound type) + + Accumulated sum and sum-of-squares for each bin of the i-th tally. + **/source_present** (*int*) Flag indicated if source bank is present in the file @@ -257,13 +257,7 @@ if (run_mode == MODE_EIGENVALUE) Flag indicated if tallies are present in the file. -*do i = 1, n_tallies* - -**/tallies/tally i/results** (Compound type) - - Accumulated sum and sum-of-squares for each bin of the tally i-th tally - -if (run_mode == MODE_EIGENVALUE and source_present) +if (run_mode == 'k-eigenvalue' and source_present > 0) **/source_bank** (Compound type) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index f924cb1d68..78cf9fbd55 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -75,12 +75,10 @@ do i = 1, n_cells **/geometry/cells/cell /universe** (*int*) - **/geometry/cells/cell /fill_type** (*int*) + **/geometry/cells/cell /fill_type** (*char[]*) **/geometry/cells/cell /material** (*int*) - **/geometry/cells/cell /fill** (*int*) - **/geometry/cells/cell /maps** (*int*) **/geometry/cells/cell /offset** (*int[]*) @@ -109,10 +107,6 @@ do i = 1, n_surfaces **/geometry/surfaces/surface /coefficients** (*double[]*) - **/geometry/surfaces/surface /neighbors_positive** (*int[]*) - - **/geometry/surfaces/surface /neighbors_negative** (*int[]*) - **/geometry/surfaces/surface /boundary_condition** (*char[]*) end do @@ -177,12 +171,6 @@ do i = 1, n_materials **/materials/material /nuclide_densities** (*double[]*) - **/materials/material /n_sab** (*int*) - - **/materials/material /i_sab_nuclides** (*int*) - - **/materials/material /i_sab_tables** (*int*) - **/materials/material /sab_names** (*char[][]*) end do @@ -195,9 +183,7 @@ do i = 1, n_meshes **/tallies/mesh /index** (*int*) - **/tallies/mesh /type** (*int*) - - **/tallies/mesh /n_dimension** (*int*) + **/tallies/mesh /type** (*char[]*) **/tallies/mesh /dimension** (*int[]*) @@ -223,7 +209,7 @@ do i = 1, n_tallies do j = 1, n_filters - **/tallies/tally /filter j/type** (*int*) + **/tallies/tally /filter j/type** (*char[]*) **/tallies/tally /filter j/n_bins** (*int*) @@ -233,66 +219,12 @@ do i = 1, n_tallies end do - **/tallies/tally /n_nuclide_bins** (*int*) + **/tallies/tally /n_nuclides** (*int*) - **/tallies/tally /nuclide_bins** (*int[]*) + **/tallies/tally /nuclides** (*char[][]*) **/tallies/tally /n_score_bins** (*int*) - **/tallies/tally /score_bins** (*int[]*) - -end do - -**/nuclides/n_nuclides** (*int*) - -do i = 1, n_nuclides - - **/nuclides//index** (*int*) - - **/nuclides//zaid** (*int*) - - **/nuclides//alias** (*char[]*) - - **/nuclides//awr** (*double*) - - **/nuclides//kT** (*double*) - - **/nuclides//n_grid** (*int*) - - **/nuclides//n_reactions** (*int*) - - **/nuclides//n_fission** (*int*) - - **/nuclides//size_xs** (*int*) - - do j = 1, n_reactions - - **/nuclides//reactions//Q_value** (*double*) - - **/nuclides//reactions//multiplicity** (*int*) - - **/nuclides//reactions//threshold** (*double*) - - **/nuclides//reactions//size_angle** (*int*) - - **/nuclides//reactions//size_energy** (*int*) - - end do - - **/nuclides//urr_n_energy** (*int*) - - **/nuclides//urr_n_prob** (*int*) - - **/nuclides//urr_interp** (*int*) - - **/nuclides//urr_inelastic** (*int*) - - **/nuclides//urr_absorption** (*int*) - - **/nuclides//urr_min_E** (*double*) - - **/nuclides//urr_max_E** (*double*) - - **/nuclides//size_total** (*int*) + **/tallies/tally /score_bins** (*char[][]*) end do diff --git a/openmc/statepoint.py b/openmc/statepoint.py index ca4fc02ab0..f848fe1e76 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -422,7 +422,7 @@ class StatePoint(object): tally.num_score_bins = n_score_bins - scores = self._f['{0}{1}/scores'.format( + scores = self._f['{0}{1}/score_bins'.format( base, tally_key)].value n_user_scores = self._f['{0}{1}/n_user_score_bins' .format(base, tally_key)].value diff --git a/openmc/summary.py b/openmc/summary.py index f599289af7..10470bb8e9 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -505,7 +505,7 @@ class Summary(object): tally = openmc.Tally(tally_id, tally_name) # Read score metadata - scores = self._f['{0}/scores'.format(subbase)].value + scores = self._f['{0}/score_bins'.format(subbase)].value for score in scores: tally.add_score(score.decode()) num_score_bins = self._f['{0}/n_score_bins'.format(subbase)][...] diff --git a/src/state_point.F90 b/src/state_point.F90 index bfbbadb570..700d51b1bb 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -344,8 +344,7 @@ contains str_array(j) = reaction_name(tally%score_bins(j)) end select end do - call write_dataset(tally_group, "scores", str_array) - call write_dataset(tally_group, "score_bins", tally%score_bins) + call write_dataset(tally_group, "score_bins", str_array) call write_dataset(tally_group, "n_user_score_bins", tally%n_user_score_bins) deallocate(str_array) diff --git a/src/summary.F90 b/src/summary.F90 index 5fcf0c64e9..229fda535b 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -623,8 +623,7 @@ contains str_array(j) = reaction_name(t%score_bins(j)) end select end do - call write_dataset(tally_group, "scores", str_array) - call write_dataset(tally_group, "score_bins", t%score_bins) + call write_dataset(tally_group, "score_bins", str_array) deallocate(str_array) From 23427ceccdf906f2bd28e9e3a5761beb9db19cf4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 21 Sep 2015 11:43:29 +0700 Subject: [PATCH 148/519] Get rid of n_nuclides dataset in summary/statepoint --- docs/source/usersguide/output/statepoint.rst | 4 ---- docs/source/usersguide/output/summary.rst | 2 -- openmc/statepoint.py | 4 +--- src/state_point.F90 | 2 -- src/summary.F90 | 3 --- 5 files changed, 1 insertion(+), 14 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index 42d923351e..b9898ea5db 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -206,10 +206,6 @@ if (run_mode == MODE_EIGENVALUE) Value for each filter bin of this type. - **/tallies/tally i/n_nuclides** (*int*) - - Number of nuclide bins. If none are specified, this is just one. - **/tallies/tally i/nuclides** (*char[][]*) Values of specified nuclide bins. diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 78cf9fbd55..453a48d98d 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -219,8 +219,6 @@ do i = 1, n_tallies end do - **/tallies/tally /n_nuclides** (*int*) - **/tallies/tally /nuclides** (*char[][]*) **/tallies/tally /n_score_bins** (*int*) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index f848fe1e76..c1be201262 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -408,8 +408,6 @@ class StatePoint(object): tally.add_filter(filter) # Read Nuclide bins - n_nuclides = self._f['{0}{1}/n_nuclides'.format(base, tally_key)].value - nuclide_names = self._f['{0}{1}/nuclides'.format(base, tally_key)].value # Add all Nuclides to the Tally @@ -430,7 +428,7 @@ class StatePoint(object): # Compute and set the filter strides for i in range(n_filters): filter = tally.filters[i] - filter.stride = n_score_bins * n_nuclides + filter.stride = n_score_bins * len(nuclide_names) for j in range(i+1, n_filters): filter.stride *= tally.filters[j].num_bins diff --git a/src/state_point.F90 b/src/state_point.F90 index 700d51b1bb..fbdbdbeba9 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -276,8 +276,6 @@ contains call close_group(filter_group) end do FILTER_LOOP - call write_dataset(tally_group, "n_nuclides", tally%n_nuclide_bins) - ! Set up nuclide bin array and then write allocate(str_array(tally%n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins diff --git a/src/summary.F90 b/src/summary.F90 index 229fda535b..d01d1b4dae 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -551,9 +551,6 @@ contains call close_group(filter_group) end do FILTER_LOOP - ! Write number of nuclide bins - call write_dataset(tally_group, "n_nuclides", t%n_nuclide_bins) - ! Create temporary array for nuclide bins allocate(str_array(t%n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, t%n_nuclide_bins From 4507139173cbe0f21173e3f4db5cbe0a972b43a5 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 21 Sep 2015 10:08:04 -0400 Subject: [PATCH 149/519] Add PythonAPI functionality to TestHarness --- tests/input_set.py | 609 +++++++++++++++++++++ tests/test_filter_cell/geometry.xml | 181 ------ tests/test_filter_cell/inputs_true.dat | 1 + tests/test_filter_cell/materials.xml | 272 --------- tests/test_filter_cell/results_true.dat | 14 +- tests/test_filter_cell/settings.xml | 19 - tests/test_filter_cell/tallies.xml | 9 - tests/test_filter_cell/test_filter_cell.py | 23 +- tests/testing_harness.py | 85 ++- 9 files changed, 722 insertions(+), 491 deletions(-) create mode 100644 tests/input_set.py delete mode 100644 tests/test_filter_cell/geometry.xml create mode 100644 tests/test_filter_cell/inputs_true.dat delete mode 100644 tests/test_filter_cell/materials.xml delete mode 100644 tests/test_filter_cell/settings.xml delete mode 100644 tests/test_filter_cell/tallies.xml diff --git a/tests/input_set.py b/tests/input_set.py new file mode 100644 index 0000000000..95cf07a142 --- /dev/null +++ b/tests/input_set.py @@ -0,0 +1,609 @@ +import openmc + + +class InputSet(object): + def __init__(self): + self.settings = openmc.SettingsFile() + self.materials = openmc.MaterialsFile() + self.geometry = openmc.GeometryFile() + self.tallies = None + self.plots = None + + def export(self): + self.settings.export_to_xml() + self.materials.export_to_xml() + self.geometry.export_to_xml() + if self.tallies is not None: self.tallies.export_to_xml() + if self.plots is not None: self.plots.export_to_xml() + + def build_default_materials_and_geometry(self): + # Define materials. + fuel = openmc.Material(name='Fuel', material_id=1) + fuel.set_density('g/cm3', 10.062) + fuel.add_nuclide("U-234", 4.9476e-6) + fuel.add_nuclide("U-235", 4.8218e-4) + fuel.add_nuclide("U-236", 9.0402e-5) + fuel.add_nuclide("U-238", 2.1504e-2) + fuel.add_nuclide("Np-237", 7.3733e-6) + fuel.add_nuclide("Pu-238", 1.5148e-6) + fuel.add_nuclide("Pu-239", 1.3955e-4) + fuel.add_nuclide("Pu-240", 3.4405e-5) + fuel.add_nuclide("Pu-241", 2.1439e-5) + fuel.add_nuclide("Pu-242", 3.7422e-6) + fuel.add_nuclide("Am-241", 4.5041e-7) + fuel.add_nuclide("Am-242m", 9.2301e-9) + fuel.add_nuclide("Am-243", 4.7878e-7) + fuel.add_nuclide("Cm-242", 1.0485e-7) + fuel.add_nuclide("Cm-243", 1.4268e-9) + fuel.add_nuclide("Cm-244", 8.8756e-8) + fuel.add_nuclide("Cm-245", 3.5285e-9) + fuel.add_nuclide("Mo-95", 2.6497e-5) + fuel.add_nuclide("Tc-99", 3.2772e-5) + fuel.add_nuclide("Ru-101", 3.0742e-5) + fuel.add_nuclide("Ru-103", 2.3505e-6) + fuel.add_nuclide("Ag-109", 2.0009e-6) + fuel.add_nuclide("Xe-135", 1.0801e-8) + fuel.add_nuclide("Cs-133", 3.4612e-5) + fuel.add_nuclide("Nd-143", 2.6078e-5) + fuel.add_nuclide("Nd-145", 1.9898e-5) + fuel.add_nuclide("Sm-147", 1.6128e-6) + fuel.add_nuclide("Sm-149", 1.1627e-7) + fuel.add_nuclide("Sm-150", 7.1727e-6) + fuel.add_nuclide("Sm-151", 5.4947e-7) + fuel.add_nuclide("Sm-152", 3.0221e-6) + fuel.add_nuclide("Eu-153", 2.6209e-6) + fuel.add_nuclide("Gd-155", 1.5369e-9) + fuel.add_nuclide("O-16", 4.5737e-2) + + clad = openmc.Material(name='Cladding', material_id=2) + clad.set_density('g/cm3', 5.77) + clad.add_nuclide("Zr-90", 0.5145) + clad.add_nuclide("Zr-91", 0.1122) + clad.add_nuclide("Zr-92", 0.1715) + clad.add_nuclide("Zr-94", 0.1738) + clad.add_nuclide("Zr-96", 0.0280) + + cold_water = openmc.Material(name='Cold borated water', material_id=3) + cold_water.set_density('atom/b-cm', 0.07416) + cold_water.add_nuclide("H-1", 2.0) + cold_water.add_nuclide("O-16", 1.0) + cold_water.add_nuclide("B-10", 6.490e-4) + cold_water.add_nuclide("B-11", 2.689e-3) + cold_water.add_s_alpha_beta('HH2O', '71t') + + hot_water = openmc.Material(name='Hot borated water', material_id=4) + hot_water.set_density('atom/b-cm', 0.06614) + hot_water.add_nuclide("H-1", 2.0) + hot_water.add_nuclide("O-16", 1.0) + hot_water.add_nuclide("B-10", 6.490e-4) + hot_water.add_nuclide("B-11", 2.689e-3) + hot_water.add_s_alpha_beta('HH2O', '71t') + + rpv_steel = openmc.Material(name='Reactor pressure vessel steel', + material_id=5) + rpv_steel.set_density('g/cm3', 7.9) + rpv_steel.add_nuclide("Fe-54", 0.05437098, 'wo') + rpv_steel.add_nuclide("Fe-56", 0.88500663, 'wo') + rpv_steel.add_nuclide("Fe-57", 0.0208008, 'wo') + rpv_steel.add_nuclide("Fe-58", 0.00282159, 'wo') + rpv_steel.add_nuclide("Ni-58", 0.0067198, 'wo') + rpv_steel.add_nuclide("Ni-60", 0.0026776, 'wo') + rpv_steel.add_nuclide("Ni-61", 0.0001183, 'wo') + rpv_steel.add_nuclide("Ni-62", 0.0003835, 'wo') + rpv_steel.add_nuclide("Ni-64", 0.0001008, 'wo') + rpv_steel.add_nuclide("Mn-55", 0.01, 'wo') + rpv_steel.add_nuclide("Mo-92", 0.000849, 'wo') + rpv_steel.add_nuclide("Mo-94", 0.0005418, 'wo') + rpv_steel.add_nuclide("Mo-95", 0.0009438, 'wo') + rpv_steel.add_nuclide("Mo-96", 0.0010002, 'wo') + rpv_steel.add_nuclide("Mo-97", 0.0005796, 'wo') + rpv_steel.add_nuclide("Mo-98", 0.0014814, 'wo') + rpv_steel.add_nuclide("Mo-100", 0.0006042, 'wo') + rpv_steel.add_nuclide("Si-28", 0.00367464, 'wo') + rpv_steel.add_nuclide("Si-29", 0.00019336, 'wo') + rpv_steel.add_nuclide("Si-30", 0.000132, 'wo') + rpv_steel.add_nuclide("Cr-50", 0.00010435, 'wo') + rpv_steel.add_nuclide("Cr-52", 0.002092475, 'wo') + rpv_steel.add_nuclide("Cr-53", 0.00024185, 'wo') + rpv_steel.add_nuclide("Cr-54", 6.1325e-05, 'wo') + rpv_steel.add_nuclide("C-Nat", 0.0025, 'wo') + rpv_steel.add_nuclide("Cu-63", 0.0013696, 'wo') + rpv_steel.add_nuclide("Cu-65", 0.0006304, 'wo') + + lower_rad_ref = openmc.Material(name='Lower radial reflector', + material_id=6) + lower_rad_ref.set_density('g/cm3', 4.32) + lower_rad_ref.add_nuclide("H-1", 0.0095661, 'wo') + lower_rad_ref.add_nuclide("O-16", 0.0759107, 'wo') + lower_rad_ref.add_nuclide("B-10", 3.08409e-5, 'wo') + lower_rad_ref.add_nuclide("B-11", 1.40499e-4, 'wo') + lower_rad_ref.add_nuclide("Fe-54", 0.035620772088, 'wo') + lower_rad_ref.add_nuclide("Fe-56", 0.579805982228, 'wo') + lower_rad_ref.add_nuclide("Fe-57", 0.01362750048, 'wo') + lower_rad_ref.add_nuclide("Fe-58", 0.001848545204, 'wo') + lower_rad_ref.add_nuclide("Ni-58", 0.055298376566, 'wo') + lower_rad_ref.add_nuclide("Ni-60", 0.022034425592, 'wo') + lower_rad_ref.add_nuclide("Ni-61", 0.000973510811, 'wo') + lower_rad_ref.add_nuclide("Ni-62", 0.003155886695, 'wo') + lower_rad_ref.add_nuclide("Ni-64", 0.000829500336, 'wo') + lower_rad_ref.add_nuclide("Mn-55", 0.0182870, 'wo') + lower_rad_ref.add_nuclide("Si-28", 0.00839976771, 'wo') + lower_rad_ref.add_nuclide("Si-29", 0.00044199679, 'wo') + lower_rad_ref.add_nuclide("Si-30", 0.0003017355, 'wo') + lower_rad_ref.add_nuclide("Cr-50", 0.007251360806, 'wo') + lower_rad_ref.add_nuclide("Cr-52", 0.145407678031, 'wo') + lower_rad_ref.add_nuclide("Cr-53", 0.016806340306, 'wo') + lower_rad_ref.add_nuclide("Cr-54", 0.004261520857, 'wo') + lower_rad_ref.add_s_alpha_beta('HH2O', '71t') + + upper_rad_ref = openmc.Material(name='Upper radial reflector /' + 'Top plate region', material_id=7) + upper_rad_ref.set_density('g/cm3', 4.28) + upper_rad_ref.add_nuclide("H-1", 0.0086117, 'wo') + upper_rad_ref.add_nuclide("O-16", 0.0683369, 'wo') + upper_rad_ref.add_nuclide("B-10", 2.77638e-5, 'wo') + upper_rad_ref.add_nuclide("B-11", 1.26481e-4, 'wo') + upper_rad_ref.add_nuclide("Fe-54", 0.035953677186, 'wo') + upper_rad_ref.add_nuclide("Fe-56", 0.585224740891, 'wo') + upper_rad_ref.add_nuclide("Fe-57", 0.01375486056, 'wo') + upper_rad_ref.add_nuclide("Fe-58", 0.001865821363, 'wo') + upper_rad_ref.add_nuclide("Ni-58", 0.055815129186, 'wo') + upper_rad_ref.add_nuclide("Ni-60", 0.022240333032, 'wo') + upper_rad_ref.add_nuclide("Ni-61", 0.000982608081, 'wo') + upper_rad_ref.add_nuclide("Ni-62", 0.003185377845, 'wo') + upper_rad_ref.add_nuclide("Ni-64", 0.000837251856, 'wo') + upper_rad_ref.add_nuclide("Mn-55", 0.0184579, 'wo') + upper_rad_ref.add_nuclide("Si-28", 0.00847831314, 'wo') + upper_rad_ref.add_nuclide("Si-29", 0.00044612986, 'wo') + upper_rad_ref.add_nuclide("Si-30", 0.000304557, 'wo') + upper_rad_ref.add_nuclide("Cr-50", 0.00731912987, 'wo') + upper_rad_ref.add_nuclide("Cr-52", 0.146766614995, 'wo') + upper_rad_ref.add_nuclide("Cr-53", 0.01696340737, 'wo') + upper_rad_ref.add_nuclide("Cr-54", 0.004301347765, 'wo') + upper_rad_ref.add_s_alpha_beta('HH2O', '71t') + + bot_plate = openmc.Material(name='Bottom plate region', material_id=8) + bot_plate.set_density('g/cm3', 7.184) + bot_plate.add_nuclide("H-1", 0.0011505, 'wo') + bot_plate.add_nuclide("O-16", 0.0091296, 'wo') + bot_plate.add_nuclide("B-10", 3.70915e-6, 'wo') + bot_plate.add_nuclide("B-11", 1.68974e-5, 'wo') + bot_plate.add_nuclide("Fe-54", 0.03855611055, 'wo') + bot_plate.add_nuclide("Fe-56", 0.627585036425, 'wo') + bot_plate.add_nuclide("Fe-57", 0.014750478, 'wo') + bot_plate.add_nuclide("Fe-58", 0.002000875025, 'wo') + bot_plate.add_nuclide("Ni-58", 0.059855207342, 'wo') + bot_plate.add_nuclide("Ni-60", 0.023850159704, 'wo') + bot_plate.add_nuclide("Ni-61", 0.001053732407, 'wo') + bot_plate.add_nuclide("Ni-62", 0.003415945715, 'wo') + bot_plate.add_nuclide("Ni-64", 0.000897854832, 'wo') + bot_plate.add_nuclide("Mn-55", 0.0197940, 'wo') + bot_plate.add_nuclide("Si-28", 0.00909197802, 'wo') + bot_plate.add_nuclide("Si-29", 0.00047842098, 'wo') + bot_plate.add_nuclide("Si-30", 0.000326601, 'wo') + bot_plate.add_nuclide("Cr-50", 0.007848910646, 'wo') + bot_plate.add_nuclide("Cr-52", 0.157390026871, 'wo') + bot_plate.add_nuclide("Cr-53", 0.018191270146, 'wo') + bot_plate.add_nuclide("Cr-54", 0.004612692337, 'wo') + bot_plate.add_s_alpha_beta('HH2O', '71t') + + bot_nozzle = openmc.Material(name='Bottom nozzle region', material_id=9) + bot_nozzle.set_density('g/cm3', 2.53) + bot_nozzle.add_nuclide("H-1", 0.0245014, 'wo') + bot_nozzle.add_nuclide("O-16", 0.1944274, 'wo') + bot_nozzle.add_nuclide("B-10", 7.89917e-5, 'wo') + bot_nozzle.add_nuclide("B-11", 3.59854e-4, 'wo') + bot_nozzle.add_nuclide("Fe-54", 0.030411411144, 'wo') + bot_nozzle.add_nuclide("Fe-56", 0.495012237964, 'wo') + bot_nozzle.add_nuclide("Fe-57", 0.01163454624, 'wo') + bot_nozzle.add_nuclide("Fe-58", 0.001578204652, 'wo') + bot_nozzle.add_nuclide("Ni-58", 0.047211231662, 'wo') + bot_nozzle.add_nuclide("Ni-60", 0.018811987544, 'wo') + bot_nozzle.add_nuclide("Ni-61", 0.000831139127, 'wo') + bot_nozzle.add_nuclide("Ni-62", 0.002694352115, 'wo') + bot_nozzle.add_nuclide("Ni-64", 0.000708189552, 'wo') + bot_nozzle.add_nuclide("Mn-55", 0.0156126, 'wo') + bot_nozzle.add_nuclide("Si-28", 0.007171335558, 'wo') + bot_nozzle.add_nuclide("Si-29", 0.000377356542, 'wo') + bot_nozzle.add_nuclide("Si-30", 0.0002576079, 'wo') + bot_nozzle.add_nuclide("Cr-50", 0.006190885148, 'wo') + bot_nozzle.add_nuclide("Cr-52", 0.124142524198, 'wo') + bot_nozzle.add_nuclide("Cr-53", 0.014348496148, 'wo') + bot_nozzle.add_nuclide("Cr-54", 0.003638294506, 'wo') + bot_nozzle.add_s_alpha_beta('HH2O', '71t') + + top_nozzle = openmc.Material(name='Top nozzle region', material_id=10) + top_nozzle.set_density('g/cm3', 1.746) + top_nozzle.add_nuclide("H-1", 0.0358870, 'wo') + top_nozzle.add_nuclide("O-16", 0.2847761, 'wo') + top_nozzle.add_nuclide("B-10", 1.15699e-4, 'wo') + top_nozzle.add_nuclide("B-11", 5.27075e-4, 'wo') + top_nozzle.add_nuclide("Fe-54", 0.02644016154, 'wo') + top_nozzle.add_nuclide("Fe-56", 0.43037146399, 'wo') + top_nozzle.add_nuclide("Fe-57", 0.0101152584, 'wo') + top_nozzle.add_nuclide("Fe-58", 0.00137211607, 'wo') + top_nozzle.add_nuclide("Ni-58", 0.04104621835, 'wo') + top_nozzle.add_nuclide("Ni-60", 0.0163554502, 'wo') + top_nozzle.add_nuclide("Ni-61", 0.000722605975, 'wo') + top_nozzle.add_nuclide("Ni-62", 0.002342513875, 'wo') + top_nozzle.add_nuclide("Ni-64", 0.0006157116, 'wo') + top_nozzle.add_nuclide("Mn-55", 0.0135739, 'wo') + top_nozzle.add_nuclide("Si-28", 0.006234853554, 'wo') + top_nozzle.add_nuclide("Si-29", 0.000328078746, 'wo') + top_nozzle.add_nuclide("Si-30", 0.0002239677, 'wo') + top_nozzle.add_nuclide("Cr-50", 0.005382452306, 'wo') + top_nozzle.add_nuclide("Cr-52", 0.107931450781, 'wo') + top_nozzle.add_nuclide("Cr-53", 0.012474806806, 'wo') + top_nozzle.add_nuclide("Cr-54", 0.003163190107, 'wo') + top_nozzle.add_s_alpha_beta('HH2O', '71t') + + top_fa = openmc.Material(name='Top of fuel assemblies', material_id=11) + top_fa.set_density('g/cm3', 3.044) + top_fa.add_nuclide("H-1", 0.0162913, 'wo') + top_fa.add_nuclide("O-16", 0.1292776, 'wo') + top_fa.add_nuclide("B-10", 5.25228e-5, 'wo') + top_fa.add_nuclide("B-11", 2.39272e-4, 'wo') + top_fa.add_nuclide("Zr-90", 0.43313403903, 'wo') + top_fa.add_nuclide("Zr-91", 0.09549277374, 'wo') + top_fa.add_nuclide("Zr-92", 0.14759527104, 'wo') + top_fa.add_nuclide("Zr-94", 0.15280552077, 'wo') + top_fa.add_nuclide("Zr-96", 0.02511169542, 'wo') + top_fa.add_s_alpha_beta('HH2O', '71t') + + bot_fa = openmc.Material(name='Bottom of fuel assemblies', material_id=12) + bot_fa.set_density('g/cm3', 1.762) + bot_fa.add_nuclide("H-1", 0.0292856, 'wo') + bot_fa.add_nuclide("O-16", 0.2323919, 'wo') + bot_fa.add_nuclide("B-10", 9.44159e-5, 'wo') + bot_fa.add_nuclide("B-11", 4.30120e-4, 'wo') + bot_fa.add_nuclide("Zr-90", 0.3741373658, 'wo') + bot_fa.add_nuclide("Zr-91", 0.0824858164, 'wo') + bot_fa.add_nuclide("Zr-92", 0.1274914944, 'wo') + bot_fa.add_nuclide("Zr-94", 0.1319920622, 'wo') + bot_fa.add_nuclide("Zr-96", 0.0216912612, 'wo') + bot_fa.add_s_alpha_beta('HH2O', '71t') + + # Define the materials file. + self.materials.default_xs = '71c' + self.materials.add_materials((fuel, clad, cold_water, hot_water, + rpv_steel, lower_rad_ref, upper_rad_ref, bot_plate, bot_nozzle, + top_nozzle, top_fa, bot_fa)) + + # Define surfaces. + s1 = openmc.ZCylinder(R=0.41, surface_id=1) + s2 = openmc.ZCylinder(R=0.475, surface_id=2) + s3 = openmc.ZCylinder(R=0.56, surface_id=3) + s4 = openmc.ZCylinder(R=0.62, surface_id=4) + s5 = openmc.ZCylinder(R=187.6, surface_id=5) + s6 = openmc.ZCylinder(R=209.0, surface_id=6) + s7 = openmc.ZCylinder(R=229.0, surface_id=7) + s8 = openmc.ZCylinder(R=249.0, surface_id=8) + s8.boundary_type = 'vacuum' + + s31 = openmc.ZPlane(z0=-229.0, surface_id=31) + s31.boundary_type = 'vacuum' + s32 = openmc.ZPlane(z0=-199.0, surface_id=32) + s33 = openmc.ZPlane(z0=-193.0, surface_id=33) + s34 = openmc.ZPlane(z0=-183.0, surface_id=34) + s35 = openmc.ZPlane(z0=0.0, surface_id=35) + s36 = openmc.ZPlane(z0=183.0, surface_id=36) + s37 = openmc.ZPlane(z0=203.0, surface_id=37) + s38 = openmc.ZPlane(z0=215.0, surface_id=38) + s39 = openmc.ZPlane(z0=223.0, surface_id=39) + s39.boundary_type = 'vacuum' + + # Define pin cells. + fuel_cold = openmc.Universe(name='Fuel pin, cladding, cold water', + universe_id=1) + c21 = openmc.Cell(cell_id=21) + c21.add_surface(s1, -1) + c21.fill = fuel + c22 = openmc.Cell(cell_id=22) + c22.add_surface(s1, +1) + c22.add_surface(s2, -1) + c22.fill = clad + c23 = openmc.Cell(cell_id=23) + c23.add_surface(s2, +1) + c23.fill = cold_water + fuel_cold.add_cells((c21, c22, c23)) + + tube_cold = openmc.Universe(name='Instrumentation guide tube, ' + 'cold water', universe_id=2) + c24 = openmc.Cell(cell_id=24) + c24.add_surface(s3, -1) + c24.fill = cold_water + c25 = openmc.Cell(cell_id=25) + c25.add_surface(s3, +1) + c25.add_surface(s4, -1) + c25.fill = clad + c26 = openmc.Cell(cell_id=26) + c26.add_surface(s4, +1) + c26.fill = cold_water + tube_cold.add_cells((c24, c25, c26)) + + fuel_hot = openmc.Universe(name='Fuel pin, cladding, hot water', + universe_id=3) + c27 = openmc.Cell(cell_id=27) + c27.add_surface(s1, -1) + c27.fill = fuel + c28 = openmc.Cell(cell_id=28) + c28.add_surface(s1, +1) + c28.add_surface(s2, -1) + c28.fill = clad + c29 = openmc.Cell(cell_id=29) + c29.add_surface(s2, +1) + c29.fill = hot_water + fuel_hot.add_cells((c27, c28, c29)) + + tube_hot = openmc.Universe(name='Instrumentation guide tube, hot water', + universe_id=4) + c30 = openmc.Cell(cell_id=30) + c30.add_surface(s3, -1) + c30.fill = hot_water + c31 = openmc.Cell(cell_id=31) + c31.add_surface(s3, +1) + c31.add_surface(s4, -1) + c31.fill = clad + c32 = openmc.Cell(cell_id=32) + c32.add_surface(s4, +1) + c32.fill = hot_water + tube_hot.add_cells((c30, c31, c32)) + + # Define fuel lattices. + l100 = openmc.RectLattice(name='Fuel assembly (lower half)', + lattice_id=100) + l100.dimension = (17, 17) + l100.lower_left = (-10.71, -10.71) + l100.pitch = (1.26, 1.26) + l100.universes = [ + [fuel_cold]*17, + [fuel_cold]*17, + [fuel_cold]*5 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*5, + [fuel_cold]*3 + [tube_cold] + [fuel_cold]*9 + [tube_cold] + + [fuel_cold]*3, + [fuel_cold]*17, + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2, + [fuel_cold]*17, + [fuel_cold]*17, + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2, + [fuel_cold]*17, + [fuel_cold]*17, + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2, + [fuel_cold]*17, + [fuel_cold]*3 + [tube_cold] + [fuel_cold]*9 + [tube_cold] + + [fuel_cold]*3, + [fuel_cold]*5 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*5, + [fuel_cold]*17, + [fuel_cold]*17 ] + + l101 = openmc.RectLattice(name='Fuel assembly (upper half)', + lattice_id=101) + l101.dimension = (17, 17) + l101.lower_left = (-10.71, -10.71) + l101.pitch = (1.26, 1.26) + l101.universes = [ + [fuel_hot]*17, + [fuel_hot]*17, + [fuel_hot]*5 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*5, + [fuel_hot]*3 + [tube_hot] + [fuel_hot]*9 + [tube_hot] + + [fuel_hot]*3, + [fuel_hot]*17, + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2, + [fuel_hot]*17, + [fuel_hot]*17, + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2, + [fuel_hot]*17, + [fuel_hot]*17, + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2, + [fuel_hot]*17, + [fuel_hot]*3 + [tube_hot] + [fuel_hot]*9 + [tube_hot] + + [fuel_hot]*3, + [fuel_hot]*5 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*5, + [fuel_hot]*17, + [fuel_hot]*17 ] + + # Define assemblies. + fa_cw = openmc.Universe(name='Water assembly (cold)', + universe_id=5) + c50 = openmc.Cell(cell_id=50) + c50.add_surface(s34, +1) + c50.add_surface(s35, -1) + c50.fill = cold_water + fa_cw.add_cells((c50, )) + + fa_hw = openmc.Universe(name='Water assembly (hot)', + universe_id=7) + c70 = openmc.Cell(cell_id=70) + c70.add_surface(s35, +1) + c70.add_surface(s36, -1) + c70.fill = hot_water + fa_hw.add_cells((c70, )) + + fa_cold = openmc.Universe(name='Fuel assemlby (cold)', universe_id=6) + c60 = openmc.Cell(cell_id=60) + c60.add_surface(s34, +1) + c60.add_surface(s35, -1) + c60.fill = l100 + fa_cold.add_cells((c60, )) + + fa_hot = openmc.Universe(name='Fuel assemlby (hot)', universe_id=8) + c80 = openmc.Cell(cell_id=80) + c80.add_surface(s35, +1) + c80.add_surface(s36, -1) + c80.fill = l101 + fa_hot.add_cells((c80, )) + + # Define core lattices + l200 = openmc.RectLattice(name='Core lattice (lower half)', + lattice_id=200) + l200.dimension = (21, 21) + l200.lower_left = (-224.91, -224.91) + l200.pitch = (21.42, 21.42) + l200.universes = [ + [fa_cw]*21, + [fa_cw]*21, + [fa_cw]*7 + [fa_cold]*7 + [fa_cw]*7, + [fa_cw]*5 + [fa_cold]*11 + [fa_cw]*5, + [fa_cw]*4 + [fa_cold]*13 + [fa_cw]*4, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*4 + [fa_cold]*13 + [fa_cw]*4, + [fa_cw]*5 + [fa_cold]*11 + [fa_cw]*5, + [fa_cw]*7 + [fa_cold]*7 + [fa_cw]*7, + [fa_cw]*21, + [fa_cw]*21] + + l201 = openmc.RectLattice(name='Core lattice (lower half)', + lattice_id=201) + l201.dimension = (21, 21) + l201.lower_left = (-224.91, -224.91) + l201.pitch = (21.42, 21.42) + l201.universes = [ + [fa_hw]*21, + [fa_hw]*21, + [fa_hw]*7 + [fa_hot]*7 + [fa_hw]*7, + [fa_hw]*5 + [fa_hot]*11 + [fa_hw]*5, + [fa_hw]*4 + [fa_hot]*13 + [fa_hw]*4, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*4 + [fa_hot]*13 + [fa_hw]*4, + [fa_hw]*5 + [fa_hot]*11 + [fa_hw]*5, + [fa_hw]*7 + [fa_hot]*7 + [fa_hw]*7, + [fa_hw]*21, + [fa_hw]*21] + + # Define root universe. + root = openmc.Universe(universe_id=0, name='root universe') + c1 = openmc.Cell(cell_id=1) + c1.add_surface(s6, -1) + c1.add_surface(s34, +1) + c1.add_surface(s35, -1) + c1.fill = l200 + + c2 = openmc.Cell(cell_id=2) + c2.add_surface(s6, -1) + c1.add_surface(s35, +1) + c2.add_surface(s36, -1) + c2.fill = l201 + + c3 = openmc.Cell(cell_id=3) + c3.add_surface(s7, -1) + c3.add_surface(s31, +1) + c3.add_surface(s32, -1) + c3.fill = bot_plate + + c4 = openmc.Cell(cell_id=4) + c4.add_surface(s5, -1) + c4.add_surface(s32, +1) + c4.add_surface(s33, -1) + c4.fill = bot_nozzle + + c5 = openmc.Cell(cell_id=5) + c5.add_surface(s5, -1) + c5.add_surface(s33, +1) + c5.add_surface(s34, -1) + c5.fill = bot_fa + + c6 = openmc.Cell(cell_id=6) + c6.add_surface(s5, -1) + c6.add_surface(s36, +1) + c6.add_surface(s37, -1) + c6.fill = top_fa + + c7 = openmc.Cell(cell_id=7) + c7.add_surface(s5, -1) + c7.add_surface(s37, +1) + c7.add_surface(s38, -1) + c7.fill = top_nozzle + + c8 = openmc.Cell(cell_id=8) + c8.add_surface(s7, -1) + c8.add_surface(s38, +1) + c8.add_surface(s39, -1) + c8.fill = upper_rad_ref + + c9 = openmc.Cell(cell_id=9) + c9.add_surface(s6, +1) + c9.add_surface(s7, -1) + c9.add_surface(s32, +1) + c9.add_surface(s38, -1) + c9.fill = bot_nozzle + + c10 = openmc.Cell(cell_id=10) + c10.add_surface(s7, +1) + c10.add_surface(s8, -1) + c10.add_surface(s31, +1) + c10.add_surface(s39, -1) + c10.fill = rpv_steel + + c11 = openmc.Cell(cell_id=11) + c11.add_surface(s5, +1) + c11.add_surface(s6, -1) + c11.add_surface(s32, +1) + c11.add_surface(s34, -1) + c11.fill = lower_rad_ref + + c12 = openmc.Cell(cell_id=12) + c12.add_surface(s5, +1) + c12.add_surface(s6, -1) + c12.add_surface(s36, +1) + c12.add_surface(s38, -1) + c12.fill = upper_rad_ref + + root.add_cells((c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)) + + # Define the geometry file. + geometry = openmc.Geometry() + geometry.root_universe = root + + self.geometry.geometry = geometry + + def build_default_settings(self): + self.settings.batches = 10 + self.settings.inactive = 5 + self.settings.particles = 100 + self.settings.set_source_space('box', (-160, -160, -183, 160, 160, 183)) + + def build_defualt_plots(self): + plot = openmc.Plot() + plot.filename = 'mat' + plot.origin = (125, 125, 0) + plot.width = (250, 250) + plot.pixels = (3000, 3000) + plot.color = 'mat' + + self.plots.add_plot(plot) diff --git a/tests/test_filter_cell/geometry.xml b/tests/test_filter_cell/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_cell/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_cell/inputs_true.dat b/tests/test_filter_cell/inputs_true.dat new file mode 100644 index 0000000000..7455ded398 --- /dev/null +++ b/tests/test_filter_cell/inputs_true.dat @@ -0,0 +1 @@ +55f5e81110db78873ebe2d1411e6f3feb1df98ee14a6489a6b2d9c1164448e48a158b2c0f4efc8ea71d6aabe2e64d029b997d656e5975d2ab549ea365480933b \ No newline at end of file diff --git a/tests/test_filter_cell/materials.xml b/tests/test_filter_cell/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_cell/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_cell/results_true.dat b/tests/test_filter_cell/results_true.dat index f3aa5d89b1..5aebd42967 100644 --- a/tests/test_filter_cell/results_true.dat +++ b/tests/test_filter_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -1.423676E+01 -4.330937E+01 -2.914798E+00 -1.831649E+00 -4.088282E+01 -3.662539E+02 +2.240915E+01 +1.009032E+02 +4.711189E+00 +4.469059E+00 +6.533718E+01 +8.552989E+02 diff --git a/tests/test_filter_cell/settings.xml b/tests/test_filter_cell/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_cell/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_cell/tallies.xml b/tests/test_filter_cell/tallies.xml deleted file mode 100644 index 815b84c145..0000000000 --- a/tests/test_filter_cell/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_cell/test_filter_cell.py b/tests/test_filter_cell/test_filter_cell.py index 1777db993e..f6d6545b79 100644 --- a/tests/test_filter_cell/test_filter_cell.py +++ b/tests/test_filter_cell/test_filter_cell.py @@ -2,9 +2,28 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterCellTestHarness(PyAPITestHarness): + def _build_inputs(self): + cell_filter = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(cell_filter) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterCellTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 2059c46dae..a74e76ed3c 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -11,6 +11,7 @@ import sys import numpy as np +from input_set import InputSet sys.path.insert(0, '../..') from openmc.statepoint import StatePoint from openmc.executor import Executor @@ -124,7 +125,7 @@ class TestHarness(object): def _write_results(self, results_string): """Write the results to an ASCII file.""" - with open('results_test.dat','w') as fh: + with open('results_test.dat', 'w') as fh: fh.write(results_string) def _overwrite_results(self): @@ -132,12 +133,14 @@ class TestHarness(object): shutil.copyfile('results_test.dat', 'results_true.dat') def _compare_results(self): + """Make sure the current results agree with the _true standard.""" compare = filecmp.cmp('results_test.dat', 'results_true.dat') if not compare: os.rename('results_test.dat', 'results_error.dat') assert compare, 'Results do not agree.' def _cleanup(self): + """Delete statepoints, tally, and test files.""" output = glob.glob(os.path.join(os.getcwd(), 'statepoint.*.*')) output.append(os.path.join(os.getcwd(), 'tallies.out')) output.append(os.path.join(os.getcwd(), 'results_test.dat')) @@ -269,3 +272,83 @@ class ParticleRestartTestHarness(TestHarness): p.uvw[2]) return outstr + + +class PyAPITestHarness(TestHarness): + def __init__(self, statepoint_name, tallies_present=False): + TestHarness.__init__(self, statepoint_name, tallies_present) + self._input_set = InputSet() + + def execute_test(self): + """Build input XMLs, run OpenMC, and verify correct results.""" + try: + self._build_inputs() + inputs = self._get_inputs() + self._write_inputs(inputs) + self._compare_inputs() + self._run_openmc() + self._test_output_created() + results = self._get_results() + self._write_results(results) + self._compare_results() + finally: + self._cleanup() + + def update_results(self): + """Update results_true.dat and inputs_true.dat""" + try: + self._build_inputs() + inputs = self._get_inputs() + self._write_inputs(inputs) + self._overwrite_inputs() + self._run_openmc() + self._test_output_created() + results = self._get_results() + self._write_results(results) + self._overwrite_results() + finally: + self._cleanup() + + def _build_inputs(self): + """Write input XML files.""" + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + self._input_set.export() + + def _get_inputs(self): + """Return a hash digest of the input XML files.""" + xmls = glob.glob(os.path.join(os.getcwd(), '*.xml')) + outstr = '\n'.join([open(fin).read() for fin in xmls]) + + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + def _write_inputs(self, input_digest): + """Write the digest of the input XMLs to an ASCII file.""" + with open('inputs_test.dat', 'w') as fh: + fh.write(input_digest) + + def _overwrite_inputs(self): + """Overwrite inputs_true.dat with inputs_test.dat""" + shutil.copyfile('inputs_test.dat', 'inputs_true.dat') + + def _compare_inputs(self): + """Make sure the current inputs agree with the _true standard.""" + compare = filecmp.cmp('inputs_test.dat', 'inputs_true.dat') + if not compare: + os.rename('inputs_test.dat', 'inputs_error.dat') + assert compare, 'Input files are broken.' + + def _cleanup(self): + """Delete XMLs, statepoints, tally, and test files.""" + TestHarness._cleanup(self) + output = [os.path.join(os.getcwd(), 'materials.xml')] + output.append(os.path.join(os.getcwd(), 'geometry.xml')) + output.append(os.path.join(os.getcwd(), 'settings.xml')) + output.append(os.path.join(os.getcwd(), 'inputs_test.dat')) + for f in output: + if os.path.exists(f): + os.remove(f) From 30425070e4e6a2b47f6b6c2c989195c38d4f2b83 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 21 Sep 2015 11:36:22 -0400 Subject: [PATCH 150/519] Move some tests to PythonAPI --- openmc/temp.py | 12 - tests/test_filter_cell/test_filter_cell.py | 4 +- tests/test_filter_cellborn/geometry.xml | 181 ------------ tests/test_filter_cellborn/inputs_true.dat | 1 + tests/test_filter_cellborn/materials.xml | 272 ------------------ tests/test_filter_cellborn/results_true.dat | 6 +- tests/test_filter_cellborn/settings.xml | 19 -- tests/test_filter_cellborn/tallies.xml | 9 - .../test_filter_cellborn.py | 23 +- tests/test_filter_energy/geometry.xml | 181 ------------ tests/test_filter_energy/inputs_true.dat | 1 + tests/test_filter_energy/materials.xml | 272 ------------------ tests/test_filter_energy/results_true.dat | 18 +- tests/test_filter_energy/settings.xml | 19 -- tests/test_filter_energy/tallies.xml | 9 - .../test_filter_energy/test_filter_energy.py | 24 +- tests/test_filter_energyout/geometry.xml | 181 ------------ tests/test_filter_energyout/inputs_true.dat | 1 + tests/test_filter_energyout/materials.xml | 272 ------------------ tests/test_filter_energyout/results_true.dat | 18 +- tests/test_filter_energyout/settings.xml | 19 -- tests/test_filter_energyout/tallies.xml | 9 - .../test_filter_energyout.py | 24 +- tests/test_filter_group_transfer/geometry.xml | 181 ------------ .../inputs_true.dat | 1 + .../test_filter_group_transfer/materials.xml | 272 ------------------ .../results_true.dat | 66 ++--- tests/test_filter_group_transfer/settings.xml | 19 -- tests/test_filter_group_transfer/tallies.xml | 10 - .../test_filter_group_transfer.py | 28 +- tests/test_filter_material/geometry.xml | 181 ------------ tests/test_filter_material/inputs_true.dat | 1 + tests/test_filter_material/materials.xml | 272 ------------------ tests/test_filter_material/results_true.dat | 18 +- tests/test_filter_material/settings.xml | 19 -- tests/test_filter_material/tallies.xml | 9 - .../test_filter_material.py | 23 +- tests/test_filter_universe/geometry.xml | 181 ------------ tests/test_filter_universe/inputs_true.dat | 1 + tests/test_filter_universe/materials.xml | 272 ------------------ tests/test_filter_universe/results_true.dat | 18 +- tests/test_filter_universe/settings.xml | 19 -- tests/test_filter_universe/tallies.xml | 9 - .../test_filter_universe.py | 23 +- tests/test_score_absorption/geometry.xml | 181 ------------ tests/test_score_absorption/inputs_true.dat | 1 + tests/test_score_absorption/materials.xml | 272 ------------------ tests/test_score_absorption/results_true.dat | 38 +-- tests/test_score_absorption/settings.xml | 19 -- tests/test_score_absorption/tallies.xml | 21 -- .../test_score_absorption.py | 26 +- tests/test_score_events/geometry.xml | 181 ------------ tests/test_score_events/inputs_true.dat | 1 + tests/test_score_events/materials.xml | 272 ------------------ tests/test_score_events/results_true.dat | 18 +- tests/test_score_events/settings.xml | 19 -- tests/test_score_events/tallies.xml | 17 -- tests/test_score_events/test_score_events.py | 25 +- tests/test_score_fission/geometry.xml | 181 ------------ tests/test_score_fission/inputs_true.dat | 1 + tests/test_score_fission/materials.xml | 272 ------------------ tests/test_score_fission/results_true.dat | 26 +- tests/test_score_fission/settings.xml | 19 -- tests/test_score_fission/tallies.xml | 21 -- .../test_score_fission/test_score_fission.py | 26 +- tests/testing_harness.py | 6 +- 66 files changed, 332 insertions(+), 4509 deletions(-) delete mode 100644 openmc/temp.py delete mode 100644 tests/test_filter_cellborn/geometry.xml create mode 100644 tests/test_filter_cellborn/inputs_true.dat delete mode 100644 tests/test_filter_cellborn/materials.xml delete mode 100644 tests/test_filter_cellborn/settings.xml delete mode 100644 tests/test_filter_cellborn/tallies.xml delete mode 100644 tests/test_filter_energy/geometry.xml create mode 100644 tests/test_filter_energy/inputs_true.dat delete mode 100644 tests/test_filter_energy/materials.xml delete mode 100644 tests/test_filter_energy/settings.xml delete mode 100644 tests/test_filter_energy/tallies.xml delete mode 100644 tests/test_filter_energyout/geometry.xml create mode 100644 tests/test_filter_energyout/inputs_true.dat delete mode 100644 tests/test_filter_energyout/materials.xml delete mode 100644 tests/test_filter_energyout/settings.xml delete mode 100644 tests/test_filter_energyout/tallies.xml delete mode 100644 tests/test_filter_group_transfer/geometry.xml create mode 100644 tests/test_filter_group_transfer/inputs_true.dat delete mode 100644 tests/test_filter_group_transfer/materials.xml delete mode 100644 tests/test_filter_group_transfer/settings.xml delete mode 100644 tests/test_filter_group_transfer/tallies.xml delete mode 100644 tests/test_filter_material/geometry.xml create mode 100644 tests/test_filter_material/inputs_true.dat delete mode 100644 tests/test_filter_material/materials.xml delete mode 100644 tests/test_filter_material/settings.xml delete mode 100644 tests/test_filter_material/tallies.xml delete mode 100644 tests/test_filter_universe/geometry.xml create mode 100644 tests/test_filter_universe/inputs_true.dat delete mode 100644 tests/test_filter_universe/materials.xml delete mode 100644 tests/test_filter_universe/settings.xml delete mode 100644 tests/test_filter_universe/tallies.xml delete mode 100644 tests/test_score_absorption/geometry.xml create mode 100644 tests/test_score_absorption/inputs_true.dat delete mode 100644 tests/test_score_absorption/materials.xml delete mode 100644 tests/test_score_absorption/settings.xml delete mode 100644 tests/test_score_absorption/tallies.xml delete mode 100644 tests/test_score_events/geometry.xml create mode 100644 tests/test_score_events/inputs_true.dat delete mode 100644 tests/test_score_events/materials.xml delete mode 100644 tests/test_score_events/settings.xml delete mode 100644 tests/test_score_events/tallies.xml delete mode 100644 tests/test_score_fission/geometry.xml create mode 100644 tests/test_score_fission/inputs_true.dat delete mode 100644 tests/test_score_fission/materials.xml delete mode 100644 tests/test_score_fission/settings.xml delete mode 100644 tests/test_score_fission/tallies.xml diff --git a/openmc/temp.py b/openmc/temp.py deleted file mode 100644 index 91f6082996..0000000000 --- a/openmc/temp.py +++ /dev/null @@ -1,12 +0,0 @@ -from checkvalue import * -from checkvalue import _isinstance - -import numpy as np - -zs = np.zeros((2,)) - -print _isinstance(zs[0], Integral) -print _isinstance(zs[0], Real) -print _isinstance(zs[0], (Integral, Real)) - -print check_iterable_type('thing', zs, (Real, Integral)) diff --git a/tests/test_filter_cell/test_filter_cell.py b/tests/test_filter_cell/test_filter_cell.py index f6d6545b79..534a681b49 100644 --- a/tests/test_filter_cell/test_filter_cell.py +++ b/tests/test_filter_cell/test_filter_cell.py @@ -9,9 +9,9 @@ import os class FilterCellTestHarness(PyAPITestHarness): def _build_inputs(self): - cell_filter = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) tally = openmc.Tally(tally_id=1) - tally.add_filter(cell_filter) + tally.add_filter(filt) tally.add_score('total') self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) diff --git a/tests/test_filter_cellborn/geometry.xml b/tests/test_filter_cellborn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_cellborn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_cellborn/inputs_true.dat b/tests/test_filter_cellborn/inputs_true.dat new file mode 100644 index 0000000000..8a234a6223 --- /dev/null +++ b/tests/test_filter_cellborn/inputs_true.dat @@ -0,0 +1 @@ +b9e90c6f594460d23ab84d56ff31897da3f47fdb558356468bb74119df0081f1600953045e4ec68e6048e334cb14abe1566cd72c414d3133c7f4a29d1140bb9e \ No newline at end of file diff --git a/tests/test_filter_cellborn/materials.xml b/tests/test_filter_cellborn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_cellborn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_cellborn/results_true.dat b/tests/test_filter_cellborn/results_true.dat index 36dcf40d06..1aedcc9c63 100644 --- a/tests/test_filter_cellborn/results_true.dat +++ b/tests/test_filter_cellborn/results_true.dat @@ -1,10 +1,10 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -7.007584E+01 -1.050827E+03 +1.073903E+02 +2.311705E+03 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_cellborn/settings.xml b/tests/test_filter_cellborn/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_cellborn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_cellborn/tallies.xml b/tests/test_filter_cellborn/tallies.xml deleted file mode 100644 index b278b07ff8..0000000000 --- a/tests/test_filter_cellborn/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_cellborn/test_filter_cellborn.py b/tests/test_filter_cellborn/test_filter_cellborn.py index 1777db993e..3420311aeb 100644 --- a/tests/test_filter_cellborn/test_filter_cellborn.py +++ b/tests/test_filter_cellborn/test_filter_cellborn.py @@ -2,9 +2,28 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterCellbornTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cellborn', bins=(10, 21, 22, 23)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterCellbornTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_energy/geometry.xml b/tests/test_filter_energy/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_energy/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_energy/inputs_true.dat b/tests/test_filter_energy/inputs_true.dat new file mode 100644 index 0000000000..977dfc0ae0 --- /dev/null +++ b/tests/test_filter_energy/inputs_true.dat @@ -0,0 +1 @@ +f41cd0988306e97da0e720c37ca123b2fab894f0cd60a69b6d47a0d6097d993efbf20c61345c71f3e0561af7968684f8fcd39eb908c9c34fbbe2e835eccc659b \ No newline at end of file diff --git a/tests/test_filter_energy/materials.xml b/tests/test_filter_energy/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_energy/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_energy/results_true.dat b/tests/test_filter_energy/results_true.dat index e3f6cff98d..b25314510c 100644 --- a/tests/test_filter_energy/results_true.dat +++ b/tests/test_filter_energy/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -2.770022E+01 -1.559167E+02 -4.285040E+01 -3.679177E+02 -5.288354E+01 -5.619308E+02 -1.134904E+01 -2.579927E+01 +2.777972E+01 +1.636507E+02 +4.274382E+01 +3.658341E+02 +5.403589E+01 +5.860017E+02 +1.137001E+01 +2.594280E+01 diff --git a/tests/test_filter_energy/settings.xml b/tests/test_filter_energy/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_energy/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_energy/tallies.xml b/tests/test_filter_energy/tallies.xml deleted file mode 100644 index 69ce1d593b..0000000000 --- a/tests/test_filter_energy/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_energy/test_filter_energy.py b/tests/test_filter_energy/test_filter_energy.py index 1777db993e..f16c458faa 100644 --- a/tests/test_filter_energy/test_filter_energy.py +++ b/tests/test_filter_energy/test_filter_energy.py @@ -2,9 +2,29 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterEnergyTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='energy', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterEnergyTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_energyout/geometry.xml b/tests/test_filter_energyout/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_energyout/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_energyout/inputs_true.dat b/tests/test_filter_energyout/inputs_true.dat new file mode 100644 index 0000000000..f31f456eb4 --- /dev/null +++ b/tests/test_filter_energyout/inputs_true.dat @@ -0,0 +1 @@ +52c9c541a82b4f395889450ab4696dffb13ee01427e65e79556080bab88388e91c932b862686a4e449948016e03240bc0692d1fc4386b61f5d0a05310158d232 \ No newline at end of file diff --git a/tests/test_filter_energyout/materials.xml b/tests/test_filter_energyout/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_energyout/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_energyout/results_true.dat b/tests/test_filter_energyout/results_true.dat index 649f4d7259..7c626faa4b 100644 --- a/tests/test_filter_energyout/results_true.dat +++ b/tests/test_filter_energyout/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -2.835000E+01 -1.631463E+02 -4.252000E+01 -3.622146E+02 -5.192000E+01 -5.401444E+02 -7.390000E+00 -1.097710E+01 +2.742000E+01 +1.574582E+02 +4.267000E+01 +3.646435E+02 +5.278000E+01 +5.578420E+02 +7.900000E+00 +1.253260E+01 diff --git a/tests/test_filter_energyout/settings.xml b/tests/test_filter_energyout/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_energyout/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_energyout/tallies.xml b/tests/test_filter_energyout/tallies.xml deleted file mode 100644 index ebec597f13..0000000000 --- a/tests/test_filter_energyout/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - scatter - - - \ No newline at end of file diff --git a/tests/test_filter_energyout/test_filter_energyout.py b/tests/test_filter_energyout/test_filter_energyout.py index 1777db993e..24704c6d70 100644 --- a/tests/test_filter_energyout/test_filter_energyout.py +++ b/tests/test_filter_energyout/test_filter_energyout.py @@ -2,9 +2,29 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterEnergyoutTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='energyout', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('scatter') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterEnergyoutTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_group_transfer/geometry.xml b/tests/test_filter_group_transfer/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_group_transfer/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_group_transfer/inputs_true.dat b/tests/test_filter_group_transfer/inputs_true.dat new file mode 100644 index 0000000000..d19163cafa --- /dev/null +++ b/tests/test_filter_group_transfer/inputs_true.dat @@ -0,0 +1 @@ +25c0be6220072084bed91a172e0e55545b968b60da14f6b36a58493e0fb6b0e96a4b3eb576df1c503b0e18629149d3ee0754de2ffed5ffd82d6e6b7e0f261993 \ No newline at end of file diff --git a/tests/test_filter_group_transfer/materials.xml b/tests/test_filter_group_transfer/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_group_transfer/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_group_transfer/results_true.dat b/tests/test_filter_group_transfer/results_true.dat index f2d5faa991..576c6b9d76 100644 --- a/tests/test_filter_group_transfer/results_true.dat +++ b/tests/test_filter_group_transfer/results_true.dat @@ -1,54 +1,54 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -2.571000E+01 -1.344145E+02 +2.486000E+01 +1.303342E+02 0.000000E+00 0.000000E+00 -2.000000E-02 -2.000000E-04 +5.000000E-02 +1.700000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.909862E-01 -1.660072E-01 +8.967969E-01 +1.846735E-01 0.000000E+00 0.000000E+00 -2.269580E+00 -1.046926E+00 -2.640000E+00 -1.397800E+00 +2.379073E+00 +1.190296E+00 +2.560000E+00 +1.318200E+00 0.000000E+00 0.000000E+00 -3.799000E+01 -2.892451E+02 +3.800000E+01 +2.893420E+02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.267964E-01 -2.170374E-02 +3.734177E-01 +3.189810E-02 0.000000E+00 0.000000E+00 -8.811378E-01 -1.642094E-01 +9.891140E-01 +2.024582E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.510000E+00 -4.068900E+00 +4.620000E+00 +4.269800E+00 0.000000E+00 0.000000E+00 -4.842000E+01 -4.700146E+02 -6.079426E-02 -8.532151E-04 +4.933000E+01 +4.873911E+02 +1.011778E-02 +1.023695E-04 0.000000E+00 0.000000E+00 -1.182446E-01 -3.979568E-03 +5.982886E-02 +1.821968E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -57,11 +57,11 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.500000E+00 -2.455800E+00 -1.158638E-01 -2.993934E-03 -7.390000E+00 -1.097710E+01 -3.126942E-01 -2.185793E-02 +3.450000E+00 +2.383100E+00 +1.413190E-01 +4.286264E-03 +7.900000E+00 +1.253260E+01 +2.891151E-01 +1.897512E-02 diff --git a/tests/test_filter_group_transfer/settings.xml b/tests/test_filter_group_transfer/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_group_transfer/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_group_transfer/tallies.xml b/tests/test_filter_group_transfer/tallies.xml deleted file mode 100644 index 64a6fa5e10..0000000000 --- a/tests/test_filter_group_transfer/tallies.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - scatter nu-fission - - - \ No newline at end of file diff --git a/tests/test_filter_group_transfer/test_filter_group_transfer.py b/tests/test_filter_group_transfer/test_filter_group_transfer.py index 1777db993e..86cd82ac32 100644 --- a/tests/test_filter_group_transfer/test_filter_group_transfer.py +++ b/tests/test_filter_group_transfer/test_filter_group_transfer.py @@ -2,9 +2,33 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterGroupTransferTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='energy', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + filt2 = openmc.Filter(type='energyout', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt1) + tally.add_filter(filt2) + tally.add_score('scatter') + tally.add_score('nu-fission') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterGroupTransferTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_material/geometry.xml b/tests/test_filter_material/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_material/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_material/inputs_true.dat b/tests/test_filter_material/inputs_true.dat new file mode 100644 index 0000000000..83b555b1d5 --- /dev/null +++ b/tests/test_filter_material/inputs_true.dat @@ -0,0 +1 @@ +d9822da9c74042812df6046cc810a7b13b90c7f4e6487c8f904b8e6b6a3655938b7f5bec0866a51fc3bc8b9612368f6f79b4f34283abd73663c58172b25d073e \ No newline at end of file diff --git a/tests/test_filter_material/materials.xml b/tests/test_filter_material/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_material/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_material/results_true.dat b/tests/test_filter_material/results_true.dat index 86e1e943ce..eb9d920358 100644 --- a/tests/test_filter_material/results_true.dat +++ b/tests/test_filter_material/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -2.923791E+01 -1.711686E+02 -6.753642E+00 -9.145065E+00 -4.921142E+01 -5.186991E+02 -4.731999E+01 -4.905260E+02 +2.840222E+01 +1.617027E+02 +6.793657E+00 +9.256930E+00 +7.648212E+01 +1.171747E+03 +2.158747E+01 +9.962972E+01 diff --git a/tests/test_filter_material/settings.xml b/tests/test_filter_material/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_material/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_material/tallies.xml b/tests/test_filter_material/tallies.xml deleted file mode 100644 index 4b8d1ce8f0..0000000000 --- a/tests/test_filter_material/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_material/test_filter_material.py b/tests/test_filter_material/test_filter_material.py index 1777db993e..8d81cddb6b 100644 --- a/tests/test_filter_material/test_filter_material.py +++ b/tests/test_filter_material/test_filter_material.py @@ -2,9 +2,28 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterMaterialTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='material', bins=(1, 2, 3, 4)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterMaterialTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_universe/geometry.xml b/tests/test_filter_universe/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_universe/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_universe/inputs_true.dat b/tests/test_filter_universe/inputs_true.dat new file mode 100644 index 0000000000..e442de057e --- /dev/null +++ b/tests/test_filter_universe/inputs_true.dat @@ -0,0 +1 @@ +a65cbed55e510edcb54362e9bd38a639b36d2bf4ff312f9355c5552e9407bab27730437f3298a90deb6abbdf36810e8e23c87d11d09a55ce5227fa2bfba1f4aa \ No newline at end of file diff --git a/tests/test_filter_universe/materials.xml b/tests/test_filter_universe/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_universe/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_universe/results_true.dat b/tests/test_filter_universe/results_true.dat index 856d97d593..22f863c913 100644 --- a/tests/test_filter_universe/results_true.dat +++ b/tests/test_filter_universe/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -5.803437E+01 -7.324822E+02 -7.168085E+00 -1.101286E+01 -5.815302E+01 -7.373019E+02 -5.778029E+00 -7.558661E+00 +9.245752E+01 +1.713583E+03 +1.150558E+01 +2.689915E+01 +2.299276E+01 +1.068299E+02 +3.009831E+00 +1.837623E+00 diff --git a/tests/test_filter_universe/settings.xml b/tests/test_filter_universe/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_universe/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_universe/tallies.xml b/tests/test_filter_universe/tallies.xml deleted file mode 100644 index bcf16f53a6..0000000000 --- a/tests/test_filter_universe/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_universe/test_filter_universe.py b/tests/test_filter_universe/test_filter_universe.py index 1777db993e..189758f2ee 100644 --- a/tests/test_filter_universe/test_filter_universe.py +++ b/tests/test_filter_universe/test_filter_universe.py @@ -2,9 +2,28 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class FilterUniverseTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='universe', bins=(1, 2, 3, 4)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterUniverseTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_absorption/geometry.xml b/tests/test_score_absorption/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_absorption/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_absorption/inputs_true.dat b/tests/test_score_absorption/inputs_true.dat new file mode 100644 index 0000000000..be73d98b6c --- /dev/null +++ b/tests/test_score_absorption/inputs_true.dat @@ -0,0 +1 @@ +55faff4d2b9eb95d51b31ec618a03a25b1bc82338fe5a043ffcf4ced388265c75cf7d97db94dc50622edc592f093f366de490c94c01ee20a1df1de635f659533 \ No newline at end of file diff --git a/tests/test_score_absorption/materials.xml b/tests/test_score_absorption/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_absorption/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_absorption/results_true.dat b/tests/test_score_absorption/results_true.dat index 9370a146f5..1984cc4e66 100644 --- a/tests/test_score_absorption/results_true.dat +++ b/tests/test_score_absorption/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -2.006479E+00 -8.808050E-01 -1.444838E-02 -4.349668E-05 -2.926865E-01 -1.944083E-02 +3.336094E+00 +2.246259E+00 +3.247758E-02 +2.553866E-04 +4.583764E-01 +4.253734E-02 tally 2: 0.000000E+00 0.000000E+00 -2.030000E+00 -8.879000E-01 -0.000000E+00 -0.000000E+00 -4.000000E-01 -4.240000E-02 +3.380000E+00 +2.293800E+00 +1.000000E-02 +1.000000E-04 +4.400000E-01 +4.360000E-02 tally 3: 0.000000E+00 0.000000E+00 -1.990713E+00 -8.557870E-01 -1.427399E-02 -4.420707E-05 -2.968053E-01 -1.960663E-02 +3.251414E+00 +2.129893E+00 +2.185530E-02 +1.156492E-04 +4.456283E-01 +4.031784E-02 diff --git a/tests/test_score_absorption/settings.xml b/tests/test_score_absorption/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_absorption/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_absorption/tallies.xml b/tests/test_score_absorption/tallies.xml deleted file mode 100644 index 8b2dc29314..0000000000 --- a/tests/test_score_absorption/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - absorption - - - - - analog - absorption - - - - - collision - absorption - - - diff --git a/tests/test_score_absorption/test_score_absorption.py b/tests/test_score_absorption/test_score_absorption.py index 1777db993e..2accb25045 100644 --- a/tests/test_score_absorption/test_score_absorption.py +++ b/tests/test_score_absorption/test_score_absorption.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreAbsorptionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('absorption') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreAbsorptionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_events/geometry.xml b/tests/test_score_events/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_events/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_events/inputs_true.dat b/tests/test_score_events/inputs_true.dat new file mode 100644 index 0000000000..7535b3f66f --- /dev/null +++ b/tests/test_score_events/inputs_true.dat @@ -0,0 +1 @@ +6ad38e2ba1108cbc2a1cb6bfcb5131fd5f7d31c7699c7659daeb42733d75df6cb1ef058277e300d35374d54f0b85a210c0ab0a37dc80a1b234e455d4293af94f \ No newline at end of file diff --git a/tests/test_score_events/materials.xml b/tests/test_score_events/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_events/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_events/results_true.dat b/tests/test_score_events/results_true.dat index 35ae33eb86..e6547cc820 100644 --- a/tests/test_score_events/results_true.dat +++ b/tests/test_score_events/results_true.dat @@ -1,12 +1,12 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -5.328000E+01 -6.082750E+02 -5.594000E+01 -6.836068E+02 +8.539000E+01 +1.463307E+03 +2.312000E+01 +1.070560E+02 tally 2: -1.372000E+01 -4.018980E+01 -1.474000E+01 -4.802520E+01 +2.278000E+01 +1.042404E+02 +6.260000E+00 +7.850600E+00 diff --git a/tests/test_score_events/settings.xml b/tests/test_score_events/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_events/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_events/tallies.xml b/tests/test_score_events/tallies.xml deleted file mode 100644 index ac47f9ec86..0000000000 --- a/tests/test_score_events/tallies.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - events - - - - - - analog - events - - - \ No newline at end of file diff --git a/tests/test_score_events/test_score_events.py b/tests/test_score_events/test_score_events.py index 1777db993e..74d6e100da 100644 --- a/tests/test_score_events/test_score_events.py +++ b/tests/test_score_events/test_score_events.py @@ -2,9 +2,30 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreEventsTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 3)] + [t.add_filter(filt) for t in tallies] + [t.add_score('events') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreEventsTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_fission/geometry.xml b/tests/test_score_fission/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_fission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_fission/inputs_true.dat b/tests/test_score_fission/inputs_true.dat new file mode 100644 index 0000000000..e4f120bc16 --- /dev/null +++ b/tests/test_score_fission/inputs_true.dat @@ -0,0 +1 @@ +43d51743c601d4e347e7a1735398b76213fdf22488749d9496093bd8ccc2ead36c1fadfe7dc27b74d21832b270a0b88d03c6e0ce5fcae066f7a7a32789abb8fd \ No newline at end of file diff --git a/tests/test_score_fission/materials.xml b/tests/test_score_fission/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_fission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_fission/results_true.dat b/tests/test_score_fission/results_true.dat index 86b31aaafd..aecb466dda 100644 --- a/tests/test_score_fission/results_true.dat +++ b/tests/test_score_fission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -9.432574E-01 -1.970463E-01 +1.559747E+00 +4.911504E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.039280E+00 -2.345809E-01 +3.579938E-01 +2.731974E-02 tally 2: -8.953531E-01 -1.798609E-01 +1.526951E+00 +4.824326E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.923196E-01 -2.067216E-01 +3.966177E-01 +3.291468E-02 tally 3: -9.036254E-01 -1.746552E-01 +1.496616E+00 +4.530639E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.912744E-01 -2.192705E-01 +3.919885E-01 +3.104206E-02 diff --git a/tests/test_score_fission/settings.xml b/tests/test_score_fission/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_fission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_fission/tallies.xml b/tests/test_score_fission/tallies.xml deleted file mode 100644 index a8b57f9116..0000000000 --- a/tests/test_score_fission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - fission - - - - - analog - fission - - - - - collision - fission - - - diff --git a/tests/test_score_fission/test_score_fission.py b/tests/test_score_fission/test_score_fission.py index 1777db993e..e9253d11d1 100644 --- a/tests/test_score_fission/test_score_fission.py +++ b/tests/test_score_fission/test_score_fission.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreFissionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/testing_harness.py b/tests/testing_harness.py index a74e76ed3c..d60892692a 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -317,8 +317,10 @@ class PyAPITestHarness(TestHarness): def _get_inputs(self): """Return a hash digest of the input XML files.""" - xmls = glob.glob(os.path.join(os.getcwd(), '*.xml')) - outstr = '\n'.join([open(fin).read() for fin in xmls]) + xmls = ('geometry.xml', 'tallies.xml', 'materials.xml', 'settings.xml') + xmls = [os.path.join(os.getcwd(), fname) for fname in xmls] + outstr = '\n'.join([open(fname).read() for fname in xmls + if os.path.exists(fname)]) sha512 = hashlib.sha512() sha512.update(outstr.encode('utf-8')) From 053c1d31a8e84257c9631637637a3e389d326419 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 21 Sep 2015 21:17:18 -0400 Subject: [PATCH 151/519] Multi-group Chi is now working with bug fixes to StatePoint.get_tally(...) --- openmc/mgxs/mgxs.py | 30 +------------- openmc/statepoint.py | 11 +++++- openmc/tallies.py | 94 +++++++++++++++++++------------------------- 3 files changed, 51 insertions(+), 84 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 590392ae8b..3d473a626e 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1287,9 +1287,8 @@ class Chi(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) energyout_filter = openmc.Filter('energyout', group_edges) - filters = [[energy_filter], [energyout_filter]] + filters = [[], [energyout_filter]] # Intialize the Tallies super(Chi, self).create_tallies(scores, filters, keys, estimator) @@ -1299,31 +1298,6 @@ class Chi(MultiGroupXS): nu_fission_in = self.tallies['nu-fission-in'] nu_fission_out = self.tallies['nu-fission-out'] - - # Construct energy group filter bins to sum across - energy_bins = [] - for group in range(1, self.num_groups+1): - energy_bins.append(self.energy_groups.get_group_bounds(group)) - - sum_nu_fission_in = nu_fission_in.summation(filter_type='energy', - filter_bins=energy_bins) - - # FIXME: CrossFilter for energy + energy messes up tally arithmetic - sum_nu_fission_in.remove_filter(sum_nu_fission_in.filters[-1]) - - self._xs_tally = nu_fission_out / sum_nu_fission_in - - # Normalize chi to 1.0 - norm = self.xs_tally.summation(filter_type='energyout', - filter_bins=energy_bins) - - # FIXME: CrossFilter for energy + energy messes up tally arithmetic - norm.remove_filter(norm.filters[-1]) - - energy_filter = openmc.Filter(type='energyout') - energy_filter.bins = self.energy_groups.group_edges - norm = norm.tile_filter(energy_filter) - - self._xs_tally /= norm + self._xs_tally = nu_fission_out / nu_fission_in self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) \ No newline at end of file diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 22686e8e98..545b53a1ab 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -635,8 +635,15 @@ class StatePoint(object): contains_filters = True # Iterate over the Filters requested by the user - for filter, test_filter in zip(filters, test_tally.filters): - if not test_filter.is_subset(filter): + for filter in filters: + contains_filter = False + + for test_filter in test_tally.filters: + if test_filter.is_subset(filter): + contains_filter = True + break + + if not contains_filter: contains_filters = False break diff --git a/openmc/tallies.py b/openmc/tallies.py index 28dc451f51..a62043132e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1354,26 +1354,22 @@ class Tally(object): new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + data['other']['std. dev.']**2) elif binary_op == '-': - data = self._align_tally_data(other) new_tally._mean = data['self']['mean'] - data['other']['mean'] new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 + data['other']['std. dev.']**2) elif binary_op == '*': - data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] other_rel_err = data['other']['std. dev.'] / data['other']['mean'] new_tally._mean = data['self']['mean'] * data['other']['mean'] new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**2) elif binary_op == '/': - data = self._align_tally_data(other) self_rel_err = data['self']['std. dev.'] / data['self']['mean'] other_rel_err = data['other']['std. dev.'] / data['other']['mean'] new_tally._mean = data['self']['mean'] / data['other']['mean'] new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(self_rel_err**2 + other_rel_err**2) elif binary_op == '^': - data = self._align_tally_data(other) mean_ratio = data['other']['mean'] / data['self']['mean'] first_term = mean_ratio * data['self']['std. dev.'] second_term = \ @@ -1562,7 +1558,6 @@ class Tally(object): A dictionary of dictionaries to "aligned" 'mean' and 'std. dev' NumPy arrays for each tally's data. - """ self_mean = copy.deepcopy(self.mean) @@ -1572,44 +1567,12 @@ class Tally(object): if self.filters != other.filters: - # FIXME: Note that this makes the assumption that common filters - # are at the beginning of each Tally's list of filters - -# match = 0 -# for i, filter_pair in enumerate(zip(self.filters, other.filters)): -# self_filter, other_filter = filter_pair -# if self_filter == other_filter: -# match += 1 -# else: -# break - -# match_filters = self.filters[:match] -# cross_filters = [self.filters[match:], other.filters[match:]] -# cross_filters.extend(other.filters[match:]) - -# other_tile_factor = 1 -# self_repeat_factor = 1 - - # FIXME: If one or the other tally has not cross filters -# repeat_factor = 1 -# for self_filter, other_filter in itertools.product(*cross_filters): -# repeat_factor *= self_filter.num_bins * other_filter.num_bins - -# other_tile_factor = repeat_factor / other.num_filter_bins -# self_repeat_factor = repeat_factor / self.num_filter_bins - -# other_tile_factor = repeat_factor -# self_repeat_factor = repeat_factor - - # -# for filter in self.filters[match:]: -# other_tile_factor *= filter.num_bins - -# for filter in other.filters[match:]: -# self_repeat_factor *= filter.num_bins - + self_shape = list(self.mean.shape) + other_shape = list(other.mean.shape) # FIXME: + # Determine the number of paired combinations of filter bins + # between the two tallies and repeat arrays along filter axes diff1 = list(set(self.filters).difference(set(other.filters))) diff2 = list(set(other.filters).difference(set(self.filters))) @@ -1623,16 +1586,23 @@ class Tally(object): for filter in diff2: self_repeat_factor *= filter.num_bins - # Determine the number of paired combinations of filter bins - # between the two tallies and repeat arrays along filter axes -# self_repeat_factor = other.num_filter_bins -# other_tile_factor = self.num_filter_bins - # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor, axis=0) - other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=0) - other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) + self_shape[0] *= self_repeat_factor + self_mean = np.repeat(self_mean, self_repeat_factor) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor) + + if self_repeat_factor == 1: + other_shape[0] *= other_tile_factor + other_mean = np.repeat(other_mean, other_tile_factor) + other_std_dev = np.repeat(other_std_dev, other_tile_factor) + else: + other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) + other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) + + self_mean.shape = tuple(self_shape) + self_std_dev.shape = tuple(self_shape) + other_mean.shape = tuple(other_shape) + other_std_dev.shape = tuple(other_shape) if self.nuclides != other.nuclides: @@ -1641,12 +1611,20 @@ class Tally(object): self_repeat_factor = other.num_nuclides other_tile_factor = self.num_nuclides + self_shape = list(self.mean.shape) + # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) + self_mean = np.repeat(self_mean, self_repeat_factor) +# self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) +# self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor) other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) + self_shape[1] *= self_repeat_factor + self_mean.shape = tuple(self_shape) + self_std_dev.shape = tuple(self_shape) + if self.scores != other.scores: # Determine the number of paired combinations of score bins @@ -1654,12 +1632,20 @@ class Tally(object): self_repeat_factor = other.num_score_bins other_tile_factor = self.num_score_bins + self_shape = list(self.mean.shape) + # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) + self_mean = np.repeat(self_mean, self_repeat_factor) +# self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor) +# self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) + self_shape[2] *= self_repeat_factor + self_mean.shape = tuple(self_shape) + self_std_dev.shape = tuple(self_shape) + data = {} data['self'] = {} data['other'] = {} From dd5b288b030e7d1c90ee3a32f727a4629a1a27d1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 10:17:30 +0700 Subject: [PATCH 152/519] Remove unused variable temp_array --- src/summary.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/summary.F90 b/src/summary.F90 index d01d1b4dae..d80f357480 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -457,7 +457,6 @@ contains integer :: i, j integer :: i_list, i_xs - integer, allocatable :: temp_array(:) ! nuclide bin array integer(HID_T) :: tallies_group integer(HID_T) :: mesh_group integer(HID_T) :: tally_group From ffea752c5d9de3cb3571b17c0f6a58a03933c7f2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 24 Sep 2015 15:20:51 -0400 Subject: [PATCH 153/519] Fixed bug in openmc.mgxs for appending data to HDF5 files --- openmc/mgxs/mgxs.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 3d473a626e..d7d6af8077 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -578,10 +578,14 @@ class MultiGroupXS(object): msg = 'The h5py Python package must be installed on your system' raise ImportError(msg) + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + filename = directory + '/' + filename + '.h5' filename = filename.replace(' ', '-') - if append: + if append and os.path.isfile(filename): xs_results = h5py.File(filename, 'a') else: xs_results = h5py.File(filename, 'w') From 759f96c9e05f6bcc8ab588b93c1ddbda2edb6e9e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 10:40:50 +0700 Subject: [PATCH 154/519] Complete documentation of summary file format, including suggestions from @wbinventor. --- docs/source/usersguide/input.rst | 3 +- docs/source/usersguide/output/statepoint.rst | 95 +++--- docs/source/usersguide/output/summary.rst | 292 +++++++++++++------ src/summary.F90 | 1 + 4 files changed, 254 insertions(+), 137 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 833cd99b2a..b4d153f184 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1426,8 +1426,7 @@ a separate element with the tag name ````. This element has the following attributes/sub-elements: :type: - The type of structured mesh. Valid options include "rectangular" and - "hexagonal". + The type of structured mesh. The only valid option is "regular". :dimension: The number of mesh cells in each direction. diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index b9898ea5db..02f4fdcf36 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -56,7 +56,7 @@ The current revision of the statepoint file format is 13. The number of batches already simulated. -if (run_mode == MODE_EIGENVALUE) +if run_mode == 'k-eigenvalue': **/n_inactive** (*int*) @@ -136,31 +136,29 @@ if (run_mode == MODE_EIGENVALUE) User-identified unique ID of each mesh -*do i = 1, n_meshes* +**/tallies/meshes/mesh /id** (*int*) - **/tallies/meshes/mesh i/id** (*int*) + Unique identifier of the mesh. - Unique identifier of the mesh. +**/tallies/meshes/mesh /type** (*char[]*) - **/tallies/meshes/mesh i/type** (*char[]*) + Type of mesh. - Type of mesh. +**/tallies/meshes/mesh /dimension** (*int*) - **/tallies/meshes/mesh i/dimension** (*int*) + Number of mesh cells in each dimension. - Number of mesh cells in each dimension. +**/tallies/meshes/mesh /lower_left** (*double[]*) - **/tallies/meshes/mesh i/lower_left** (*double[]*) + Coordinates of lower-left corner of mesh. - Coordinates of lower-left corner of mesh. +**/tallies/meshes/mesh /upper_right** (*double[]*) - **/tallies/meshes/mesh i/upper_right** (*double[]*) + Coordinates of upper-right corner of mesh. - Coordinates of upper-right corner of mesh. +**/tallies/meshes/mesh /width** (*double[]*) - **/tallies/meshes/mesh i/width** (*double[]*) - - Width of each mesh cell in each dimension. + Width of each mesh cell in each dimension. **/tallies/n_tallies** (*int*) @@ -174,63 +172,66 @@ if (run_mode == MODE_EIGENVALUE) User-identified unique ID of each tally. -*do i = 1, n_tallies* +**/tallies/tally /estimator** (*char[]*) - **/tallies/tally i/estimator** (*char[]*) + Type of tally estimator, either 'analog', 'tracklength', or 'collision'. - Type of tally estimator. +**/tallies/tally /n_realizations** (*int*) - **/tallies/tally i/n_realizations** (*int*) + Number of realizations. - Number of realizations. +**/tallies/tally /n_filters** (*int*) - **/tallies/tally i/n_filters** (*int*) + Number of filters used. - Number of filters used. +**/tallies/tally /filter /type** (*char[]*) - *do j = 1, tallies(i) % n_filters* + Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', + 'surface', 'mesh', 'energy', 'energyout', or 'distribcell'. - **/tallies/tally i/filter j/type** (*char[]*) +**/tallies/tally /filter /offset** (*int*) - Type of tally filter. + Filter offset (used for distribcell filter). - **/tallies/tally i/filter j/offset** (*int*) +**/tallies/tally /filter /n_bins** (*int*) - Filter offset (used for distribcell). + Number of bins for the j-th filter. - **/tallies/tally i/filter j/n_bins** (*int*) +**/tallies/tally /filter /bins** (*int[]* or *double[]*) - Number of bins for filter. + Value for each filter bin of this type. - **/tallies/tally i/filter j/bins** (*int[]* or *double[]*) +**/tallies/tally /nuclides** (*char[][]*) - Value for each filter bin of this type. + Array of nuclides to tally. Note that if no nuclide is specified in the user + input, a single 'total' nuclide appears here. - **/tallies/tally i/nuclides** (*char[][]*) +**/tallies/tally /n_score_bins** (*int*) - Values of specified nuclide bins. + 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 i/n_score_bins** (*int*) +**/tallies/tally /score_bins** (*char[][]*) - Number of scores. + Values of specified scores. - **/tallies/tally i/score_bins** (*char[][]*) +**/tallies/tally /n_user_scores** (*int*) - Values of specified scores. + Number of scores without accounting for those added by expansions, + e.g. scatter-PN. - **/tallies/tally i/n_user_scores** (*int*) +**/tallies/tally /moment_orders** (*char[][]*) - Number of scores without accounting for those added by expansions, - e.g. scatter-PN. + Tallying moment orders for Legendre and spherical harmonic tally expansions + (*e.g.*, 'P2', 'Y1,2', etc.). - **/tallies/tally i/moment_orders** (*char[][]*) +**/tallies/tally /results** (Compound type) - Tallying moment orders for Legendre and spherical harmonic tally - expansions (*e.g.*, 'P2', 'Y1,2', etc.). - - **/tallies/tally i/results** (Compound type) - - Accumulated sum and sum-of-squares for each bin of the i-th tally. + Accumulated sum and sum-of-squares for each bin of the i-th tally. This is a + two-dimensional array, the first dimension of which represents combinations + of filter bins and the second dimensions of which represents scoring + bins. Each element of the array has fields 'sum' and 'sum_sq'. **/source_present** (*int*) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 453a48d98d..f7e0269988 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -29,7 +29,7 @@ The current revision of the summary file format is 1. **/date_and_time** (*char[]*) - Date and time the state point was written. + Date and time the summary was written. **/n_procs** (*int*) @@ -43,186 +43,302 @@ The current revision of the summary file format is 1. Number of batches to simulate. -if (run_mode == MODE_EIGENVALUE) +**/n_inactive** (*int*) - **/n_inactive** (*int*) + Number of inactive batches. Only present if /run_mode is set to + 'k-eigenvalue'. - Number of inactive batches. +**/n_active** (*int*) - **/n_active** (*int*) + Number of active batches. Only present if /run_mode is set to + 'k-eigenvalue'. - Number of active batches. +**/gen_per_batch** (*int*) - **/gen_per_batch** (*int*) - - Number of generations per batch. - -end if + Number of generations per batch. Only present if /run_mode is set to + 'k-eigenvalue'. **/geometry/n_cells** (*int*) + Number of cells in the problem. + **/geometry/n_surfaces** (*int*) + Number of surfaces in the problem. + **/geometry/n_universes** (*int*) + Number of unique universes in the problem. + **/geometry/n_lattices** (*int*) -do i = 1, n_cells + Number of lattices in the problem. - **/geometry/cells/cell /index** (*int*) +**/geometry/cells/cell /index** (*int*) - **/geometry/cells/cell /name** (*char[]*) + Index in cells array used internally in OpenMC. - **/geometry/cells/cell /universe** (*int*) +**/geometry/cells/cell /name** (*char[]*) - **/geometry/cells/cell /fill_type** (*char[]*) + Name of the cell. - **/geometry/cells/cell /material** (*int*) +**/geometry/cells/cell /universe** (*int*) - **/geometry/cells/cell /maps** (*int*) + Universe assigned to the cell. If none is specified, the default + universe (0) is assigned. - **/geometry/cells/cell /offset** (*int[]*) +**/geometry/cells/cell /fill_type** (*char[]*) - **/geometry/cells/cell /translated** (*int*) + Type of fill for the cell. Can be 'normal', 'universe', or 'lattice'. - **/geometry/cells/cell /translation** (*double[]*) +**/geometry/cells/cell /material** (*int*) - **/geometry/cells/cell /rotated** (*int*) + Unique ID of the material assigned to the cell. This dataset is present only + if fill_type is set to 'normal'. - **/geometry/cells/cell /rotation** (*double[]*) +**/geometry/cells/cell /maps** (*int*) - **/geometry/cells/cell /lattice** (*int*) + TODO: Add description. - **/geometry/cells/cell /surfaces** (*int[]*) +**/geometry/cells/cell /offset** (*int[]*) -end do + Offset used for distribcell tally filter. This dataset is present only if + fill_type is set to 'universe'. -do i = 1, n_surfaces +**/geometry/cells/cell /translated** (*int*) - **/geometry/surfaces/surface /index** (*int*) + Indicates if a translation is to be applied to the fill universe if one is + present. Note that this dataset assumes values of 0 or 1. This dataset is + present only if fill_type is set to 'universe'. - **/geometry/surfaces/surface /name** (*char[]*) +**/geometry/cells/cell /translation** (*double[3]*) - **/geometry/surfaces/surface /type** (*char[]*) + Translation applied to the fill universe. This dataset is present only if + fill_type is set to 'universe'. - **/geometry/surfaces/surface /coefficients** (*double[]*) +**/geometry/cells/cell /rotated** (*int*) - **/geometry/surfaces/surface /boundary_condition** (*char[]*) + Indicates if a rotation is to be applied to the fill universe if one is + present. Note that this dataset assumes values of 0 or 1. This dataset is + present only if fill_type is set to 'universe'. -end do +**/geometry/cells/cell /rotation** (*double[3]*) -do i = 1, n_universes + Angles in degrees about the x-, y-, and z-axes for which the fill universe + should be rotated. This dataset is present only if fill_type is set to + 'universe'. - **/geometry/universes/universe /index** (*int*) +**/geometry/cells/cell /lattice** (*int*) - **/geometry/universes/universe /cells** (*int[]*) + Unique ID of the lattice which fills the cell. Only present if fill_type is + set to 'lattice'. -end do +**/geometry/cells/cell /surfaces** (*int[]*) -do i = 1, n_lattices + Surface specification for the cell. - **/geometry/lattices/lattice /index** (*int*) +**/geometry/surfaces/surface /index** (*int*) - **/geometry/lattices/lattice /name** (*char[]*) + Index in surfaces array used internally in OpenMC. - **/geometry/lattices/lattice /type** (*char[]*) +**/geometry/surfaces/surface /name** (*char[]*) - **/geometry/lattices/lattice /pitch** (*double[]*) + Name of the surface. - **/geometry/lattices/lattice /outer** (*int*) +**/geometry/surfaces/surface /type** (*char[]*) - **/geometry/lattices/lattice /offset_size** (*int[]*) + Type of the surface. Can be 'X Plane', 'Y Plane', 'Z Plane', 'Plane', 'X + Cylinder', 'Y Cylinder', 'Sphere', 'X Cone', 'Y Cone', or 'Z Cone'. - **/geometry/lattices/lattice /maps** (*int*) +**/geometry/surfaces/surface /coefficients** (*double[]*) - **/geometry/lattices/lattice /offsets** (*int[]*) + Array of coefficients that define the surface. See :ref:`surface_element` + for what coefficients are defined for each surface type. - **/geometry/lattices/lattice /universes** (*int[]*) +**/geometry/surfaces/surface /boundary_condition** (*char[]*) - if (rectangular lattice) + Boundary condition applied to the surface. Can be 'transmission', 'vacuum', + 'reflective', or 'periodic'. - **/geometry/lattices/lattice /dimension** (*int[]*) +**/geometry/universes/universe /index** (*int*) - **/geometry/lattices/lattice /lower_left** (*double[]*) + Index in the universes array used internally in OpenMC. - elseif (hexagonal lattice) +**/geometry/universes/universe /cells** (*int[]*) - **/geometry/lattices/lattice /n_rings** (*int*) + Array of unique IDs of cells that appear in the universe. - **/geometry/lattices/lattice /n_axial** (*int*) +**/geometry/lattices/lattice /index** (*int*) - **/geometry/lattices/lattice /center** (*double[]*) + Index in the lattices array used internally in OpenMC. - end if +**/geometry/lattices/lattice /name** (*char[]*) -end do + Name of the lattice. + +**/geometry/lattices/lattice /type** (*char[]*) + + Type of the lattice, either 'rectangular' or 'hexagonal'. + +**/geometry/lattices/lattice /pitch** (*double[]*) + + Pitch of the lattice. + +**/geometry/lattices/lattice /outer** (*int*) + + Outer universe assigned to lattice cells outside the defined range. + +**/geometry/lattices/lattice /offset_size** (*int[]*) + + TODO: Explain offset_size + +**/geometry/lattices/lattice /maps** (*int*) + + TODO: Explain maps + +**/geometry/lattices/lattice /offsets** (*int[]*) + + Offsets used for distribcell tally filter. + +**/geometry/lattices/lattice /universes** (*int[]*) + + Three-dimensional array of universes assigned to each cell of the lattice. + +**/geometry/lattices/lattice /dimension** (*int[]*) + + The number of lattice cells in each direction. This dataset is present only + when the 'type' dataset is set to 'rectangular'. + +**/geometry/lattices/lattice /lower_left** (*double[]*) + + The coordinates of the lower-left corner of the lattice. This dataset is + present only when the 'type' dataset is set to 'rectangular'. + +**/geometry/lattices/lattice /n_rings** (*int*) + + Number of radial ring positions in the xy-plane. This dataset is present + only when the 'type' dataset is set to 'hexagonal'. + +**/geometry/lattices/lattice /n_axial** (*int*) + + Number of lattice positions along the z-axis. This dataset is present only + when the 'type' dataset is set to 'hexagonal'. + +**/geometry/lattices/lattice /center** (*double[]*) + + Coordinates of the center of the lattice. This dataset is present only when + the 'type' dataset is set to 'hexagonal'. **/n_materials** (*int*) -do i = 1, n_materials + Number of materials in the problem. - **/materials/material /index** (*int*) +**/materials/material /index** (*int*) - **/materials/material /name** (*char[]*) + Index in materials array used internally in OpenMC. - **/materials/material /atom_density** (*double[]*) +**/materials/material /name** (*char[]*) - **/materials/material /nuclides** (*int[]*) + Name of the material. - **/materials/material /nuclide_densities** (*double[]*) +**/materials/material /atom_density** (*double[]*) - **/materials/material /sab_names** (*char[][]*) + Total atom density of the material in atom/b-cm. -end do +**/materials/material /nuclides** (*char[][]*) + + Array of nuclides present in the material, e.g., 'U-235.71c'. + +**/materials/material /nuclide_densities** (*double[]*) + + Atom density of each nuclide. + +**/materials/material /sab_names** (*char[][]*) + + 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*) -do i = 1, n_meshes + Number of meshes in the problem. - **/tallies/mesh /index** (*int*) +**/tallies/mesh /index** (*int*) - **/tallies/mesh /type** (*char[]*) + Index in the meshes array used internally in OpenMC - **/tallies/mesh /dimension** (*int[]*) +**/tallies/mesh /type** (*char[]*) - **/tallies/mesh /lower_left** (*double[]*) + Type of the mesh. The only valid option is currently 'regular'. - **/tallies/mesh /upper_right** (*double[]*) +**/tallies/mesh /dimension** (*int[]*) - **/tallies/mesh /width** (*double[]*) + Number of mesh cells in each direction. -end do +**/tallies/mesh /lower_left** (*double[]*) -do i = 1, n_tallies + Coordinates of the lower-left corner of the mesh. - **/tallies/tally /index** (*int*) +**/tallies/mesh /upper_right** (*double[]*) - **/tallies/tally /name** (*char[]*) + Coordinates of the upper-right corner of the mesh. - **/tallies/tally /total_score_bins** (*int*) +**/tallies/mesh /width** (*double[]*) - **/tallies/tally /total_filter_bins** (*int*) + Width of a single mesh cell in each direction. - **/tallies/tally /n_filters** (*int*) +**/tallies/tally /index** (*int*) - do j = 1, n_filters + Index in tallies array used internally in OpenMC. - **/tallies/tally /filter j/type** (*char[]*) +**/tallies/tally /name** (*char[]*) - **/tallies/tally /filter j/n_bins** (*int*) + Name of the tally. - **/tallies/tally /filter j/bins** (*int[]* or *double[]*) +**/tallies/tally /total_score_bins** (*int*) - **/tallies/tally /filter j/type_name** (*char[]*) + Total number of scoring bins for all nuclides. This is used as the size of + second dimension of the tally results array. - end do +**/tallies/tally /total_filter_bins** (*int*) - **/tallies/tally /nuclides** (*char[][]*) + Total number of filter bins accounting for all filters. This is used as the + size of first dimension of the tally results array. - **/tallies/tally /n_score_bins** (*int*) +**/tallies/tally /n_filters** (*int*) - **/tallies/tally /score_bins** (*char[][]*) + Number of filters applied to the tally. -end do +**/tallies/tally /filter /type** (*char[]*) + + Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', + 'surface', 'mesh', 'energy', 'energyout', or 'distribcell'. + +**/tallies/tally /filter /offset** (*int*) + + Filter offset (used for distribcell filter). + +**/tallies/tally /filter /n_bins** (*int*) + + Number of bins for the j-th filter. + +**/tallies/tally /filter /bins** (*int[]* or *double[]*) + + Value for each filter bin of this type. + +**/tallies/tally /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 /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 /score_bins** (*char[][]*) + + Scoring bins for the tally. diff --git a/src/summary.F90 b/src/summary.F90 index d80f357480..7c6a3a29a5 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -515,6 +515,7 @@ contains filter_group = create_group(tally_group, "filter " // trim(to_str(j))) ! Write number of bins for this filter + call write_dataset(filter_group, "offset", t%filters(j)%offset) call write_dataset(filter_group, "n_bins", t%filters(j)%n_bins) ! Write filter bins From 9bc3b3358c6630f5756fb4eab0648c71bbffd213 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 10:53:36 +0700 Subject: [PATCH 155/519] Got rid of maps, offset_size, translated, and rotated datasets. --- docs/source/usersguide/output/summary.rst | 26 +------------ openmc/summary.py | 20 ++++------ src/summary.F90 | 46 +++++++---------------- 3 files changed, 22 insertions(+), 70 deletions(-) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index f7e0269988..81400c9362 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -96,32 +96,16 @@ The current revision of the summary file format is 1. Unique ID of the material assigned to the cell. This dataset is present only if fill_type is set to 'normal'. -**/geometry/cells/cell /maps** (*int*) - - TODO: Add description. - **/geometry/cells/cell /offset** (*int[]*) - Offset used for distribcell tally filter. This dataset is present only if + Offsets used for distribcell tally filter. This dataset is present only if fill_type is set to 'universe'. -**/geometry/cells/cell /translated** (*int*) - - Indicates if a translation is to be applied to the fill universe if one is - present. Note that this dataset assumes values of 0 or 1. This dataset is - present only if fill_type is set to 'universe'. - **/geometry/cells/cell /translation** (*double[3]*) Translation applied to the fill universe. This dataset is present only if fill_type is set to 'universe'. -**/geometry/cells/cell /rotated** (*int*) - - Indicates if a rotation is to be applied to the fill universe if one is - present. Note that this dataset assumes values of 0 or 1. This dataset is - present only if fill_type is set to 'universe'. - **/geometry/cells/cell /rotation** (*double[3]*) Angles in degrees about the x-, y-, and z-axes for which the fill universe @@ -188,14 +172,6 @@ The current revision of the summary file format is 1. Outer universe assigned to lattice cells outside the defined range. -**/geometry/lattices/lattice /offset_size** (*int[]*) - - TODO: Explain offset_size - -**/geometry/lattices/lattice /maps** (*int*) - - TODO: Explain maps - **/geometry/lattices/lattice /offsets** (*int[]*) Offsets used for distribcell tally filter. diff --git a/openmc/summary.py b/openmc/summary.py index 10470bb8e9..fa9ed6575e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -224,21 +224,17 @@ class Summary(object): cell = openmc.Cell(cell_id=cell_id, name=name) if fill_type == 'universe': - maps = self._f['geometry/cells'][key]['maps'].value - - if maps > 0: + if 'offset' in self._f['geometry/cells'][key]: offset = self._f['geometry/cells'][key]['offset'][...] cell.offsets = offset - translated = self._f['geometry/cells'][key]['translated'].value - if translated: + if 'translation' in self._f['geometry/cells'][key]: translation = \ self._f['geometry/cells'][key]['translation'][...] translation = np.asarray(translation, dtype=np.float64) cell.translation = translation - rotated = self._f['geometry/cells'][key]['rotated'].value - if rotated: + if 'rotation' in self._f['geometry/cells'][key]: rotation = \ self._f['geometry/cells'][key]['rotation'][...] rotation = np.asarray(rotation, dtype=np.int) @@ -301,11 +297,11 @@ class Summary(object): index = self._f['geometry/lattices'][key]['index'].value name = self._f['geometry/lattices'][key]['name'].value.decode() lattice_type = self._f['geometry/lattices'][key]['type'].value.decode() - maps = self._f['geometry/lattices'][key]['maps'].value - offset_size = self._f['geometry/lattices'][key]['offset_size'].value - if offset_size > 0: + if 'offsets' in self._f['geometry/lattices'][key]: offsets = self._f['geometry/lattices'][key]['offsets'][...] + else: + offsets = None if lattice_type == 'rectangular': dimension = self._f['geometry/lattices'][key]['dimension'][...] @@ -346,7 +342,7 @@ class Summary(object): universes = universes[:, ::-1, :] lattice.universes = universes - if offset_size > 0: + if offsets: offsets = np.swapaxes(offsets, 0, 1) offsets = np.swapaxes(offsets, 1, 2) lattice.offsets = offsets @@ -440,7 +436,7 @@ class Summary(object): # Lattice is 2D; extract the only axial level lattice.universes = universes[0] - if offset_size > 0: + if offsets: lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices diff --git a/src/summary.F90 b/src/summary.F90 index 7c6a3a29a5..3d3a47a759 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -157,23 +157,15 @@ contains case (CELL_FILL) call write_dataset(cell_group, "fill_type", "universe") call write_dataset(cell_group, "fill", universes(c%fill)%id) - call write_dataset(cell_group, "maps", size(c%offset)) if (size(c%offset) > 0) then call write_dataset(cell_group, "offset", c%offset) end if if (allocated(c%translation)) then - call write_dataset(cell_group, "translated", 1) call write_dataset(cell_group, "translation", c%translation) - else - call write_dataset(cell_group, "translated", 0) end if - if (allocated(c%rotation)) then - call write_dataset(cell_group, "rotated", 1) call write_dataset(cell_group, "rotation", c%rotation) - else - call write_dataset(cell_group, "rotated", 0) end if case (CELL_LATTICE) @@ -298,10 +290,16 @@ contains ! Write internal OpenMC index for this lattice call write_dataset(lattice_group, "index", i) - ! Write name for this lattice + ! Write name, pitch, and outer universe call write_dataset(lattice_group, "name", lat%name) + call write_dataset(lattice_group, "pitch", lat%pitch) + call write_dataset(lattice_group, "outer", lat%outer) + + ! Write distribcell offsets if present + if (size(lat%offset) > 0) then + call write_dataset(lattice_group, "offsets", lat%offset) + end if - ! Write lattice type select type (lat) type is (RectLattice) ! Write lattice type. @@ -310,15 +308,6 @@ contains ! Write lattice dimensions, lower left corner, and pitch call write_dataset(lattice_group, "dimension", lat%n_cells) call write_dataset(lattice_group, "lower_left", lat%lower_left) - call write_dataset(lattice_group, "pitch", lat%pitch) - - call write_dataset(lattice_group, "outer", lat%outer) - call write_dataset(lattice_group, "offset_size", size(lat%offset)) - call write_dataset(lattice_group, "maps", size(lat%offset,1)) - - if (size(lat%offset) > 0) then - call write_dataset(lattice_group, "offsets", lat%offset) - end if ! Write lattice universes. allocate(lattice_universes(lat%n_cells(1), lat%n_cells(2), & @@ -330,8 +319,6 @@ contains end do end do end do - call write_dataset(lattice_group, "universes", lattice_universes) - deallocate(lattice_universes) type is (HexLattice) ! Write lattice type. @@ -341,17 +328,8 @@ contains call write_dataset(lattice_group, "n_rings", lat%n_rings) call write_dataset(lattice_group, "n_axial", lat%n_axial) - ! Write lattice center, pitch and outer universe. + ! Write lattice center call write_dataset(lattice_group, "center", lat%center) - call write_dataset(lattice_group, "pitch", lat%pitch) - - call write_dataset(lattice_group, "outer", lat%outer) - call write_dataset(lattice_group, "offset_size", size(lat%offset)) - call write_dataset(lattice_group, "maps", size(lat%offset,1)) - - if (size(lat%offset) > 0) then - call write_dataset(lattice_group, "offsets", lat%offset) - end if ! Write lattice universes. allocate(lattice_universes(2*lat%n_rings - 1, 2*lat%n_rings - 1, & @@ -372,10 +350,12 @@ contains end do end do end do - call write_dataset(lattice_group, "universes", lattice_universes) - deallocate(lattice_universes) end select + ! Write lattice universes + call write_dataset(lattice_group, "universes", lattice_universes) + deallocate(lattice_universes) + call close_group(lattice_group) end do LATTICE_LOOP From 81fa63886babd8fec48284fbd801534ca86db2dd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 10:59:58 +0700 Subject: [PATCH 156/519] Get rid of total_score_bins and total_filter_bins datasets in summary. --- docs/source/usersguide/output/summary.rst | 10 ---------- src/summary.F90 | 4 ---- 2 files changed, 14 deletions(-) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 81400c9362..0623693c50 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -273,16 +273,6 @@ The current revision of the summary file format is 1. Name of the tally. -**/tallies/tally /total_score_bins** (*int*) - - Total number of scoring bins for all nuclides. This is used as the size of - second dimension of the tally results array. - -**/tallies/tally /total_filter_bins** (*int*) - - Total number of filter bins accounting for all filters. This is used as the - size of first dimension of the tally results array. - **/tallies/tally /n_filters** (*int*) Number of filters applied to the tally. diff --git a/src/summary.F90 b/src/summary.F90 index 3d3a47a759..cc04599b0e 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -484,10 +484,6 @@ contains ! Write the name for this tally call write_dataset(tally_group, "name", t%name) - ! Write size of each tally - call write_dataset(tally_group, "total_score_bins", t%total_score_bins) - call write_dataset(tally_group, "total_filter_bins", t%total_filter_bins) - ! Write number of filters call write_dataset(tally_group, "n_filters", t%n_filters) From f3f6753820f40c343853eb9bdc2184b0101c0ef9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 14:43:32 +0700 Subject: [PATCH 157/519] Respond to remaining comments from @wbinventor on #454 --- docs/source/usersguide/processing.rst | 17 ++++++++------- examples/python/lattice/nested/build-xml.py | 2 +- examples/python/lattice/simple/build-xml.py | 2 +- examples/python/pincell/build-xml.py | 2 +- examples/xml/lattice/nested/tallies.xml | 2 +- examples/xml/lattice/simple/tallies.xml | 2 +- examples/xml/pincell/tallies.xml | 4 ++-- openmc/particle_restart.py | 5 ++++- openmc/statepoint.py | 23 +++++++-------------- openmc/summary.py | 15 ++++++-------- src/particle_restart_write.F90 | 2 -- src/state_point.F90 | 13 +++++++----- tests/test_cmfd_feed/tallies.xml | 2 +- tests/test_cmfd_nofeed/tallies.xml | 2 +- tests/test_filter_mesh_2d/tallies.xml | 4 ++-- tests/test_filter_mesh_3d/tallies.xml | 4 ++-- tests/test_score_current/tallies.xml | 4 ++-- tests/test_sourcepoint_restart/tallies.xml | 4 ++-- tests/test_statepoint_restart/tallies.xml | 4 ++-- 19 files changed, 53 insertions(+), 60 deletions(-) diff --git a/docs/source/usersguide/processing.rst b/docs/source/usersguide/processing.rst index 3a6766a2db..b18569ec6a 100644 --- a/docs/source/usersguide/processing.rst +++ b/docs/source/usersguide/processing.rst @@ -14,17 +14,18 @@ third-party Python packages, including: * [1]_ `NumPy `_ * [2]_ `h5py `_ * [3]_ `pandas `_ -* [3]_ `matplotlib `_ -* [3]_ `Silomesh `_ -* [3]_ `VTK `_ -* [3]_ `lxml `_ +* [4]_ `matplotlib `_ +* [4]_ `Silomesh `_ +* [4]_ `VTK `_ +* [4]_ `lxml `_ Most of these are can easily be installed with `pip `_ or alternatively obtaining through a package manager. .. [1] Required for most post-processing tasks .. [2] Required for reading HDF5 output files -.. [3] Not used directly by the Python API, but are optional dependencies for a +.. [3] Optional dependency for advanced features in Python API +.. [4] Not used directly by the Python API, but are optional dependencies for a number of scripts. ---------------------- @@ -187,7 +188,7 @@ Tally results are saved in both a text file (tallies.out) as well as an HDF5 statepoint file. While the tallies.out file may be fine for simple tallies, in many cases the user requires more information about the tally or the run, or has to deal with a large number of result values (e.g. for mesh tallies). In these -cases, extracting data from the statepoint file via the Python API is the +cases, extracting data from the statepoint file via the :ref:`pythonapi` is the preferred method of data analysis and visualization. Data Extraction @@ -209,8 +210,8 @@ Plotting in 2D The :ref:`IPython notebook example ` also demonstrates how to plot a mesh tally in two dimensions using the Python API. Note, however, that there is also a script distributed with OpenMC, ``openmc-plot-mesh-tally``, -that interactive GUI to explore and plot mesh tallies for any scores and filter -bins. +that provides an interactive GUI to explore and plot mesh tallies for any scores +and filter bins. .. image:: ../_images/plotmeshtally.png :height: 200px diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index ce67665429..24b5554c0f 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -168,7 +168,7 @@ plot_file.export_to_xml() # Instantiate a tally mesh mesh = openmc.Mesh(mesh_id=1) -mesh.type = 'rectangular' +mesh.type = 'regular' mesh.dimension = [4, 4] mesh.lower_left = [-2, -2] mesh.width = [1, 1] diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index 675c7e08ba..57e1f17292 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -157,7 +157,7 @@ plot_file.export_to_xml() # Instantiate a tally mesh mesh = openmc.Mesh(mesh_id=1) -mesh.type = 'rectangular' +mesh.type = 'regular' mesh.dimension = [4, 4] mesh.lower_left = [-2, -2] mesh.width = [1, 1] diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index 9338aff0e9..fc9663b900 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -189,7 +189,7 @@ settings_file.export_to_xml() # Instantiate a tally mesh mesh = openmc.Mesh(mesh_id=1) -mesh.type = 'rectangular' +mesh.type = 'regular' mesh.dimension = [100, 100, 1] mesh.lower_left = [-0.62992, -0.62992, -1.e50] mesh.upper_right = [0.62992, 0.62992, 1.e50] diff --git a/examples/xml/lattice/nested/tallies.xml b/examples/xml/lattice/nested/tallies.xml index 5730e6b12c..89c0774f15 100644 --- a/examples/xml/lattice/nested/tallies.xml +++ b/examples/xml/lattice/nested/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular 4 4 -2.0 -2.0 1.0 1.0 diff --git a/examples/xml/lattice/simple/tallies.xml b/examples/xml/lattice/simple/tallies.xml index 5730e6b12c..89c0774f15 100644 --- a/examples/xml/lattice/simple/tallies.xml +++ b/examples/xml/lattice/simple/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular 4 4 -2.0 -2.0 1.0 1.0 diff --git a/examples/xml/pincell/tallies.xml b/examples/xml/pincell/tallies.xml index bbfd588360..73242b9136 100644 --- a/examples/xml/pincell/tallies.xml +++ b/examples/xml/pincell/tallies.xml @@ -1,7 +1,7 @@ - + 100 100 1 -0.62992 -0.62992 -1.e50 0.62992 0.62992 1.e50 @@ -13,4 +13,4 @@ flux fission nu-fission - \ No newline at end of file + diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index ff47ef474f..72bf3ac3de 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -44,7 +44,10 @@ class Particle(object): 'filetype'].value.decode() != 'particle restart': raise IOError('{} is not a particle restart file.'.format(filename)) if self._f['revision'].value != 1: - raise IOError('Particle restart file revision is not consistent.') + raise IOError('Particle restart file has a file revision of {} ' + 'which is not consistent with the revision this ' + 'version of OpenMC expects ({}).'.format( + self._f['revision'].value, 1)) @property def current_batch(self): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index c1be201262..cdb82d95e5 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -96,7 +96,10 @@ class StatePoint(object): 'filetype'].value.decode() != 'statepoint': raise IOError('{} is not a statepoint file.'.format(filename)) if self._f['revision'].value != 14: - raise IOError('Statepoint revision is not consistent.') + raise IOError('Statepoint file has a file revision of {} ' + 'which is not consistent with the revision this ' + 'version of OpenMC expects ({}).'.format( + self._f['revision'].value, 14)) # Set flags for what data has been read self._meshes_read = False @@ -207,7 +210,7 @@ class StatePoint(object): @property def k_generation(self): if self.run_mode == 'k-eigenvalue': - return self._f['k_generation']/value + return self._f['k_generation'].value else: return None @@ -355,7 +358,7 @@ class StatePoint(object): n_realizations = self._f['{0}{1}/n_realizations'.format(base, tally_key)].value # Create Tally object and assign basic properties - tally = openmc.Tally(tally_key) + tally = openmc.Tally(tally_id=tally_key) tally._statepoint = self tally.estimator = self._f['{0}{1}/estimator'.format( base, tally_key)].value.decode() @@ -377,20 +380,8 @@ class StatePoint(object): n_bins = self._f['{0}{1}/n_bins'.format(subbase, j)].value - if n_bins <= 0: - msg = 'Unable to create Filter "{0}" for Tally ID="{1}" ' \ - 'since no bins were specified'.format(j, tally_key) - raise ValueError(msg) - # Read the bin values - if filter_type in ['energy', 'energyout']: - bins = self._f['{0}{1}/bins'.format(subbase, j)].value - - elif filter_type in ['mesh', 'distribcell']: - bins = self._f['{0}{1}/bins'.format(subbase, j)].value - - else: - bins = self._f['{0}{1}/bins'.format(subbase, j)].value + bins = self._f['{0}{1}/bins'.format(subbase, j)].value # Create Filter object filter = openmc.Filter(filter_type, bins) diff --git a/openmc/summary.py b/openmc/summary.py index fa9ed6575e..3d7da115f6 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -91,14 +91,11 @@ class Summary(object): name, xs = fullname.split('.') if 'nat' in name: - nuclide = openmc.Element(name=name, xs=xs) + material.add_element(openmc.Element(name=name, xs=xs), + percent=density, percent_type='ao') else: - nuclide = openmc.Nuclide(name=name, xs=xs) - - if isinstance(nuclide, openmc.Nuclide): - material.add_nuclide(nuclide, percent=density, percent_type='ao') - elif isinstance(nuclide, openmc.Element): - material.add_element(nuclide, percent=density, percent_type='ao') + material.add_nuclide(openmc.Nuclide(name=name, xs=xs), + percent=density, percent_type='ao') # Add the Material to the global dictionary of all Materials self.materials[index] = material @@ -342,7 +339,7 @@ class Summary(object): universes = universes[:, ::-1, :] lattice.universes = universes - if offsets: + if offsets is not None: offsets = np.swapaxes(offsets, 0, 1) offsets = np.swapaxes(offsets, 1, 2) lattice.offsets = offsets @@ -436,7 +433,7 @@ class Summary(object): # Lattice is 2D; extract the only axial level lattice.universes = universes[0] - if offsets: + if offsets is not None: lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index 77de7f669a..edd779df09 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -51,8 +51,6 @@ contains call write_dataset(file_id, 'run_mode', 'fixed source') case (MODE_EIGENVALUE) call write_dataset(file_id, 'run_mode', 'k-eigenvalue') - case (MODE_PLOTTING) - call write_dataset(file_id, 'run_mode', 'plot') case (MODE_PARTICLE) call write_dataset(file_id, 'run_mode', 'particle restart') end select diff --git a/src/state_point.F90 b/src/state_point.F90 index fbdbdbeba9..a5c89a8a2f 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -97,10 +97,6 @@ contains call write_dataset(file_id, "run_mode", "fixed source") case (MODE_EIGENVALUE) call write_dataset(file_id, "run_mode", "k-eigenvalue") - case (MODE_PLOTTING) - call write_dataset(file_id, "run_mode", "plot") - case (MODE_PARTICLE) - call write_dataset(file_id, "run_mode", "particle restart") end select call write_dataset(file_id, "n_particles", n_particles) call write_dataset(file_id, "n_batches", n_batches) @@ -181,7 +177,10 @@ contains mesh_group = create_group(meshes_group, "mesh " // trim(to_str(meshp%id))) call write_dataset(mesh_group, "id", meshp%id) - call write_dataset(mesh_group, "type", "regular") + select case (meshp%type) + case (MESH_REGULAR) + call write_dataset(mesh_group, "type", "regular") + end select call write_dataset(mesh_group, "dimension", meshp%dimension) call write_dataset(mesh_group, "lower_left", meshp%lower_left) call write_dataset(mesh_group, "upper_right", meshp%upper_right) @@ -280,7 +279,11 @@ contains allocate(str_array(tally%n_nuclide_bins)) NUCLIDE_LOOP: do j = 1, tally%n_nuclide_bins if (tally%nuclide_bins(j) > 0) then + ! Get index in cross section listings for this nuclide i_list = nuclides(tally%nuclide_bins(j))%listing + + ! Determine position of . in alias string (e.g. "U-235.71c"). If + ! no . is found, just use the entire string. i_xs = index(xs_listings(i_list)%alias, '.') if (i_xs > 0) then str_array(j) = xs_listings(i_list)%alias(1:i_xs - 1) diff --git a/tests/test_cmfd_feed/tallies.xml b/tests/test_cmfd_feed/tallies.xml index b20c0ad613..37edcecc2c 100644 --- a/tests/test_cmfd_feed/tallies.xml +++ b/tests/test_cmfd_feed/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -10 -1 -1 10 1 1 10 1 1 diff --git a/tests/test_cmfd_nofeed/tallies.xml b/tests/test_cmfd_nofeed/tallies.xml index b20c0ad613..37edcecc2c 100644 --- a/tests/test_cmfd_nofeed/tallies.xml +++ b/tests/test_cmfd_nofeed/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -10 -1 -1 10 1 1 10 1 1 diff --git a/tests/test_filter_mesh_2d/tallies.xml b/tests/test_filter_mesh_2d/tallies.xml index e046549de3..de3fa65535 100644 --- a/tests/test_filter_mesh_2d/tallies.xml +++ b/tests/test_filter_mesh_2d/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -182.07 -182.07 182.07 182.07 17 17 @@ -13,4 +13,4 @@ total - \ No newline at end of file + diff --git a/tests/test_filter_mesh_3d/tallies.xml b/tests/test_filter_mesh_3d/tallies.xml index b2be272799..cd7f925e80 100644 --- a/tests/test_filter_mesh_3d/tallies.xml +++ b/tests/test_filter_mesh_3d/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -182.07 -182.07 -183.00 182.07 182.07 183.00 17 17 17 @@ -13,4 +13,4 @@ total - \ No newline at end of file + diff --git a/tests/test_score_current/tallies.xml b/tests/test_score_current/tallies.xml index a740949fae..3f496d43a0 100644 --- a/tests/test_score_current/tallies.xml +++ b/tests/test_score_current/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -182.07 -182.07 -183.00 182.07 182.07 183.00 17 17 17 @@ -19,4 +19,4 @@ current - \ No newline at end of file + diff --git a/tests/test_sourcepoint_restart/tallies.xml b/tests/test_sourcepoint_restart/tallies.xml index 1704f56e1e..67a1b50a94 100644 --- a/tests/test_sourcepoint_restart/tallies.xml +++ b/tests/test_sourcepoint_restart/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular 5 3 4 -10. -5. 0. 10. 4. 9. @@ -20,4 +20,4 @@ fission absorption total flux - \ No newline at end of file + diff --git a/tests/test_statepoint_restart/tallies.xml b/tests/test_statepoint_restart/tallies.xml index 1704f56e1e..67a1b50a94 100644 --- a/tests/test_statepoint_restart/tallies.xml +++ b/tests/test_statepoint_restart/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular 5 3 4 -10. -5. 0. 10. 4. 9. @@ -20,4 +20,4 @@ fission absorption total flux - \ No newline at end of file + From 3d2fe2a0efd2bfce8be672ac00fcf6730e7e4836 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 20:34:39 +0700 Subject: [PATCH 158/519] Few minor fixes for #454. Mesh ID is no longer written for statepoint. --- docs/source/usersguide/output/statepoint.rst | 6 +----- docs/source/usersguide/output/summary.rst | 2 +- openmc/statepoint.py | 7 +++---- src/state_point.F90 | 1 - 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index 02f4fdcf36..d1ebc72312 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -134,11 +134,7 @@ if run_mode == 'k-eigenvalue': **/tally/meshes/keys** (*int[]*) - User-identified unique ID of each mesh - -**/tallies/meshes/mesh /id** (*int*) - - Unique identifier of the mesh. + User-identified unique ID of each mesh. **/tallies/meshes/mesh /type** (*char[]*) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 0623693c50..6bf0cf2ad8 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -243,7 +243,7 @@ The current revision of the summary file format is 1. **/tallies/mesh /index** (*int*) - Index in the meshes array used internally in OpenMC + Index in the meshes array used internally in OpenMC. **/tallies/mesh /type** (*char[]*) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index cdb82d95e5..133bd766c4 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -265,8 +265,7 @@ class StatePoint(object): # Iterate over all Meshes for mesh_key in mesh_keys: - # Read the user-specified Mesh ID and type - mesh_id = self._f['{0}{1}/id'.format(base, mesh_key)].value + # Read the mesh type mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value.decode() # Read the mesh dimensions, lower-left coordinates, @@ -277,7 +276,7 @@ class StatePoint(object): width = self._f['{0}{1}/width'.format(base, mesh_key)].value # Create the Mesh and assign properties to it - mesh = openmc.Mesh(mesh_id) + mesh = openmc.Mesh(mesh_key) mesh.dimension = dimension mesh.width = width mesh.lower_left = lower_left @@ -285,7 +284,7 @@ class StatePoint(object): mesh.type = mesh_type # Add mesh to the global dictionary of all Meshes - self._meshes[mesh_id] = mesh + self._meshes[mesh_key] = mesh self._meshes_read = True diff --git a/src/state_point.F90 b/src/state_point.F90 index a5c89a8a2f..64ba7ef55c 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -176,7 +176,6 @@ contains meshp => meshes(id_array(i)) mesh_group = create_group(meshes_group, "mesh " // trim(to_str(meshp%id))) - call write_dataset(mesh_group, "id", meshp%id) select case (meshp%type) case (MESH_REGULAR) call write_dataset(mesh_group, "type", "regular") From 47abbed14893da8f381163312850e352f6291195 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 20:38:50 +0700 Subject: [PATCH 159/519] Use surface type names consistently in XML input and Python API. --- docs/source/usersguide/output/summary.rst | 4 ++-- openmc/summary.py | 24 +++++++++++------------ src/summary.F90 | 22 ++++++++++----------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 6bf0cf2ad8..9ced8448a3 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -131,8 +131,8 @@ The current revision of the summary file format is 1. **/geometry/surfaces/surface /type** (*char[]*) - Type of the surface. Can be 'X Plane', 'Y Plane', 'Z Plane', 'Plane', 'X - Cylinder', 'Y Cylinder', 'Sphere', 'X Cone', 'Y Cone', or 'Z Cone'. + Type of the surface. Can be 'x-plane', 'y-plane', 'z-plane', 'plane', + 'x-cylinder', 'y-cylinder', 'sphere', 'x-cone', 'y-cone', or 'z-cone'. **/geometry/surfaces/surface /coefficients** (*double[]*) diff --git a/openmc/summary.py b/openmc/summary.py index 3d7da115f6..2ae7464846 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -120,61 +120,61 @@ class Summary(object): coeffs = self._f['geometry/surfaces'][key]['coefficients'][...] # Create the Surface based on its type - if surf_type == 'X Plane': + if surf_type == 'x-plane': x0 = coeffs[0] surface = openmc.XPlane(surface_id, bc, x0, name) - elif surf_type == 'Y Plane': + elif surf_type == 'y-plane': y0 = coeffs[0] surface = openmc.YPlane(surface_id, bc, y0, name) - elif surf_type == 'Z Plane': + elif surf_type == 'z-plane': z0 = coeffs[0] surface = openmc.ZPlane(surface_id, bc, z0, name) - elif surf_type == 'Plane': + elif surf_type == 'plane': A = coeffs[0] B = coeffs[1] C = coeffs[2] D = coeffs[3] surface = openmc.Plane(surface_id, bc, A, B, C, D, name) - elif surf_type == 'X Cylinder': + elif surf_type == 'x-cylinder': y0 = coeffs[0] z0 = coeffs[1] R = coeffs[2] surface = openmc.XCylinder(surface_id, bc, y0, z0, R, name) - elif surf_type == 'Y Cylinder': + elif surf_type == 'y-cylinder': x0 = coeffs[0] z0 = coeffs[1] R = coeffs[2] surface = openmc.YCylinder(surface_id, bc, x0, z0, R, name) - elif surf_type == 'Z Cylinder': + elif surf_type == 'z-cylinder': x0 = coeffs[0] y0 = coeffs[1] R = coeffs[2] surface = openmc.ZCylinder(surface_id, bc, x0, y0, R, name) - elif surf_type == 'Sphere': + elif surf_type == 'sphere': x0 = coeffs[0] y0 = coeffs[1] z0 = coeffs[2] R = coeffs[3] surface = openmc.Sphere(surface_id, bc, x0, y0, z0, R, name) - elif surf_type in ['X Cone', 'Y Cone', 'Z Cone']: + elif surf_type in ['x-cone', 'y-cone', 'z-cone']: x0 = coeffs[0] y0 = coeffs[1] z0 = coeffs[2] R2 = coeffs[3] - if surf_type == 'X Cone': + if surf_type == 'x-cone': surface = openmc.XCone(surface_id, bc, x0, y0, z0, R2, name) - if surf_type == 'Y Cone': + if surf_type == 'y-cone': surface = openmc.YCone(surface_id, bc, x0, y0, z0, R2, name) - if surf_type == 'Z Cone': + if surf_type == 'z-cone': surface = openmc.ZCone(surface_id, bc, x0, y0, z0, R2, name) # Add Surface to global dictionary of all Surfaces diff --git a/src/summary.F90 b/src/summary.F90 index cc04599b0e..b93bf120c6 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -210,27 +210,27 @@ contains ! Write surface type select case (s%type) case (SURF_PX) - call write_dataset(surface_group, "type", "X Plane") + call write_dataset(surface_group, "type", "x-plane") case (SURF_PY) - call write_dataset(surface_group, "type", "Y Plane") + call write_dataset(surface_group, "type", "y-plane") case (SURF_PZ) - call write_dataset(surface_group, "type", "Z Plane") + call write_dataset(surface_group, "type", "z-plane") case (SURF_PLANE) - call write_dataset(surface_group, "type", "Plane") + call write_dataset(surface_group, "type", "plane") case (SURF_CYL_X) - call write_dataset(surface_group, "type", "X Cylinder") + call write_dataset(surface_group, "type", "x-cylinder") case (SURF_CYL_Y) - call write_dataset(surface_group, "type", "Y Cylinder") + call write_dataset(surface_group, "type", "y-cylinder") case (SURF_CYL_Z) - call write_dataset(surface_group, "type", "Z Cylinder") + call write_dataset(surface_group, "type", "z-cylinder") case (SURF_SPHERE) - call write_dataset(surface_group, "type", "Sphere") + call write_dataset(surface_group, "type", "sphere") case (SURF_CONE_X) - call write_dataset(surface_group, "type", "X Cone") + call write_dataset(surface_group, "type", "x-cone") case (SURF_CONE_Y) - call write_dataset(surface_group, "type", "Y Cone") + call write_dataset(surface_group, "type", "y-cone") case (SURF_CONE_Z) - call write_dataset(surface_group, "type", "Z Cone") + call write_dataset(surface_group, "type", "z-cone") end select ! Write coefficients for surface From 5bf2644394d67d507a256d13761aacbffcfd27ad Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 4 Aug 2014 22:52:32 -0400 Subject: [PATCH 160/519] Started writing OO surface derived types. --- src/surface.F90 | 1073 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1073 insertions(+) create mode 100644 src/surface.F90 diff --git a/src/surface.F90 b/src/surface.F90 new file mode 100644 index 0000000000..abf71a450a --- /dev/null +++ b/src/surface.F90 @@ -0,0 +1,1073 @@ +module surface_header + + use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT + + implicit none + + type, abstract :: Surface + integer :: id ! Unique ID + integer, allocatable :: & + neighbor_pos(:), & ! List of cells on positive side + neighbor_neg(:) ! List of cells on negative side + integer :: bc ! Boundary condition + contains + procedure(iEvaluate), deferred :: evaluate + procedure(iDistance), deferred :: distance + procedure(iReflect), deferred :: reflect + end type Surface + + type, extends(Surface) :: SurfaceXPlane + ! x = x0 + real(8) :: x0 + contains + procedure :: evaluate => x_plane_evaluate + procedure :: reflect => x_plane_reflect + procedure :: distance => x_plane_distance + end type SurfaceXPlane + + type, extends(Surface) :: SurfaceYPlane + ! y = y0 + real(8) :: y0 + contains + procedure :: evaluate => y_plane_evaluate + procedure :: reflect => y_plane_reflect + procedure :: distance => y_plane_distance + end type SurfaceYPlane + + type, extends(Surface) :: SurfaceZPlane + ! z = z0 + real(8) :: z0 + contains + procedure :: evaluate => z_plane_evaluate + procedure :: reflect => z_plane_reflect + procedure :: distance => z_plane_distance + end type SurfaceZPlane + + type, extends(Surface) :: SurfacePlane + ! Ax + By + Cz = D + real(8) :: A + real(8) :: B + real(8) :: C + real(8) :: D + contains + procedure :: evaluate => plane_evaluate + procedure :: reflect => plane_reflect + procedure :: distance => plane_distance + end type SurfacePlane + + type, extends(Surface) :: SurfaceXCylinder + ! (y - y0)^2 + (z - z0)^2 = R^2 + real(8) :: y0 + real(8) :: z0 + real(8) :: r + contains + procedure :: evaluate => x_cylinder_evaluate + procedure :: reflect => x_cylinder_reflect + procedure :: distance => x_cylinder_distance + end type SurfaceXCylinder + + type, extends(Surface) :: SurfaceYCylinder + ! (x - x0)^2 + (z - z0)^2 = R^2 + real(8) :: x0 + real(8) :: z0 + real(8) :: r + contains + procedure :: evaluate => y_cylinder_evaluate + procedure :: reflect => y_cylinder_reflect + procedure :: distance => y_cylinder_distance + end type SurfaceYCylinder + + type, extends(Surface) :: SurfaceZCylinder + ! (x - x0)^2 + (y - y0)^2 = R^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: r + contains + procedure :: evaluate => z_cylinder_evaluate + procedure :: reflect => z_cylinder_reflect + procedure :: distance => z_cylinder_distance + end type SurfaceZCylinder + + type, extends(Surface) :: SurfaceSphere + ! (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = R^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r + contains + procedure :: evaluate => sphere_evaluate + procedure :: reflect => sphere_reflect + procedure :: distance => sphere_distance + end type SurfaceSphere + + type, extends(Surface) :: SurfaceXCone + ! (y - y0)^2 + (z - z0)^2 = R^2*(x - x0)^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r2 + contains + procedure :: evaluate => x_cone_evaluate + procedure :: reflect => x_cone_reflect + procedure :: distance => x_cone_distance + end type SurfaceXCone + + type, extends(Surface) :: SurfaceYCone + ! (x - x0)^2 + (z - z0)^2 = R^2*(y - y0)^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r2 + contains + procedure :: evaluate => y_cone_evaluate + procedure :: reflect => y_cone_reflect + procedure :: distance => y_cone_distance + end type SurfaceYCone + + type, extends(Surface) :: SurfaceZCone + ! (x - x0)^2 + (y - y0)^2 = R^2*(z - z0)^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r2 + contains + procedure :: evaluate => z_cone_evaluate + procedure :: reflect => z_cone_reflect + procedure :: distance => z_cone_distance + end type SurfaceZCone + + abstract interface + pure function iEvaluate(this, xyz) result(f) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + end function iEvaluate + + pure function iDistance(this, xyz, uvw) result(d) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + end function iDistance + + subroutine iReflect(this, xyz, uvw) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + end subroutine iReflect + end interface + +contains + +!=============================================================================== +! X_PLANE_EVALUATE +!=============================================================================== + + pure function x_plane_evaluate(this, xyz) result(f) + + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = xyz(1) - this%x0 + + end function x_plane_evaluate + +!=============================================================================== +! X_PLANE_DISTANCE +!=============================================================================== + + pure function x_plane_distance(this, xyz, uvw) result(d) + + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + if (uvw(1) == ZERO) then + d = INFINITY + else + d = (this%x0 - xyz(1))/uvw(1) + if (d < ZERO) d = INFINITY + end if + + end function x_plane_distance + +!=============================================================================== +! X_PLANE_REFLECT +!=============================================================================== + + subroutine x_plane_reflect(this, xyz, uvw) + + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + uvw(1) = -uvw(1) + + end subroutine x_plane_reflect + +!=============================================================================== +! Y_PLANE_EVALUATE +!=============================================================================== + + pure function y_plane_evaluate(this, xyz) result(f) + + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = xyz(2) - this%y0 + + end function y_plane_evaluate + +!=============================================================================== +! Y_PLANE_DISTANCE +!=============================================================================== + + pure function y_plane_distance(this, xyz, uvw) result(d) + + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + if (uvw(2) == ZERO) then + d = INFINITY + else + d = (this%y0 - xyz(2))/uvw(2) + if (d < ZERO) d = INFINITY + end if + + end function y_plane_distance + +!=============================================================================== +! Y_PLANE_REFLECT +!=============================================================================== + + subroutine y_plane_reflect(this, xyz, uvw) + + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + uvw(2) = -uvw(2) + + end subroutine y_plane_reflect + +!=============================================================================== +! Z_PLANE_EVALUATE +!=============================================================================== + + pure function z_plane_evaluate(this, xyz) result(f) + + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = xyz(3) - this%z0 + + end function z_plane_evaluate + +!=============================================================================== +! Z_PLANE_DISTANCE +!=============================================================================== + + pure function z_plane_distance(this, xyz, uvw) result(d) + + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + if (uvw(3) == ZERO) then + d = INFINITY + else + d = (this%z0 - xyz(3))/uvw(3) + if (d < ZERO) d = INFINITY + end if + + end function z_plane_distance + +!=============================================================================== +! Z_PLANE_REFLECT +!=============================================================================== + + subroutine z_plane_reflect(this, xyz, uvw) + + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + uvw(3) = -uvw(3) + + end subroutine z_plane_reflect + +!=============================================================================== +! PLANE_EVALUATE +!=============================================================================== + + pure function plane_evaluate(this, xyz) result(f) + + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D + + end function plane_evaluate + +!=============================================================================== +! PLANE_DISTANCE +!=============================================================================== + + pure function plane_distance(this, xyz, uvw) result(d) + + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: tmp + + tmp = this%A*uvw(1) + this%B*uvw(2) + this%C*uvw(3) + if (tmp == ZERO) then + d = INFINITY + else + d = -(this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D)/tmp + if (d < ZERO) d = INFINITY + end if + + end function plane_distance + +!=============================================================================== +! PLANE_REFLECT +!=============================================================================== + + subroutine plane_reflect(this, xyz, uvw) + + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: n(3) + + ! Construct normal vector + n(:) = [this%A, this%B, this%C] + + ! Reflect direction according to normal + uvw = uvw - TWO*dot_product(n, uvw)/dot_product(n, n) * n + + end subroutine plane_reflect + +!=============================================================================== +! X_CYLINDER_EVALUATE +!=============================================================================== + + pure function x_cylinder_evaluate(this, xyz) result(f) + + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: y, z + + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = y*y + z*z - this%r*this%r + + end function x_cylinder_evaluate + +!=============================================================================== +! X_CYLINDER_DISTANCE +!=============================================================================== + + pure function x_cylinder_distance(this, xyz, uvw) result(d) + + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: y, z, k, a, c, quad + + a = ONE - uvw(1)*uvw(1) ! v^2 + w^2 + if (a == ZERO) then + d = INFINITY + else + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + k = y*uvw(2) + z*uvw(3) + c = y*y + z*z - this%r*this%r + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cylinder + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the cylinder, thus one distance is positive/negative + ! and the other is zero. The sign of k determines if we are facing in or + ! out + + if (k >= ZERO) then + d = INFINITY + else + d = (-k + sqrt(quad))/a + end if + + elseif (c < ZERO) then + ! particle is inside the cylinder, thus one distance must be negative + ! and one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = (-k + sqrt(quad))/a + + else + ! particle is outside the cylinder, thus both distances are either + ! positive or negative. If positive, the smaller distance is the one + ! with positive sign on sqrt(quad) + + d = (-k - sqrt(quad))/a + if (d < ZERO) d = INFINITY + + end if + end if + + + end function x_cylinder_distance + +!=============================================================================== +! X_CYLINDER_REFLECT +!=============================================================================== + + subroutine x_cylinder_reflect(this, xyz, uvw) + + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: y, z, r, dot_prod + + ! Find y-y0, z-z0 and dot product of direction and surface normal + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + dot_prod = uvw(2)*y + uvw(3)*z + + ! Reflect direction according to normal + uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) + uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) + + + end subroutine x_cylinder_reflect + +!=============================================================================== +! Y_CYLINDER_EVALUATE +!=============================================================================== + + pure function y_cylinder_evaluate(this, xyz) result(f) + + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, z + + x = xyz(1) - this%x0 + z = xyz(3) - this%z0 + f = x*x + z*z - this%r*this%r + + end function y_cylinder_evaluate + +!=============================================================================== +! Y_CYLINDER_DISTANCE +!=============================================================================== + + pure function y_cylinder_distance(this, xyz, uvw) result(d) + + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: x, z, k, a, c, quad + + a = ONE - uvw(2)*uvw(2) ! u^2 + w^2 + if (a == ZERO) then + d = INFINITY + else + x = xyz(1) - this%x0 + z = xyz(3) - this%z0 + k = x*uvw(1) + z*uvw(3) + c = x*x + z*z - this%r*this%r + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cylinder + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the cylinder, thus one distance is positive/negative + ! and the other is zero. The sign of k determines if we are facing in or + ! out + + if (k >= ZERO) then + d = INFINITY + else + d = (-k + sqrt(quad))/a + end if + + elseif (c < ZERO) then + ! particle is inside the cylinder, thus one distance must be negative + ! and one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = (-k + sqrt(quad))/a + + else + ! particle is outside the cylinder, thus both distances are either + ! positive or negative. If positive, the smaller distance is the one + ! with positive sign on sqrt(quad) + + d = (-k - sqrt(quad))/a + if (d < ZERO) d = INFINITY + + end if + end if + + + end function y_cylinder_distance + +!=============================================================================== +! Y_CYLINDER_REFLECT +!=============================================================================== + + subroutine y_cylinder_reflect(this, xyz, uvw) + + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: x, z, r, dot_prod + + ! Find x-x0, z-z0 and dot product of direction and surface normal + x = xyz(1) - this%x0 + z = xyz(3) - this%z0 + dot_prod = uvw(1)*x + uvw(3)*z + + ! Reflect direction according to normal + uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) + uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) + + + end subroutine y_cylinder_reflect + +!=============================================================================== +! Z_CYLINDER_EVALUATE +!=============================================================================== + + pure function z_cylinder_evaluate(this, xyz) result(f) + + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + f = x*x + y*y - this%r*this%r + + end function z_cylinder_evaluate + +!=============================================================================== +! Z_CYLINDER_DISTANCE +!=============================================================================== + + pure function z_cylinder_distance(this, xyz, uvw) result(d) + + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: x, y, k, a, c, quad + + a = ONE - uvw(3)*uvw(3) ! u^2 + v^2 + if (a == ZERO) then + d = INFINITY + else + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + k = x*uvw(1) + y*uvw(2) + c = x*x + y*y - this%r*this%r + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cylinder + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the cylinder, thus one distance is positive/negative + ! and the other is zero. The sign of k determines if we are facing in or + ! out + + if (k >= ZERO) then + d = INFINITY + else + d = (-k + sqrt(quad))/a + end if + + elseif (c < ZERO) then + ! particle is inside the cylinder, thus one distance must be negative + ! and one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = (-k + sqrt(quad))/a + + else + ! particle is outside the cylinder, thus both distances are either + ! positive or negative. If positive, the smaller distance is the one + ! with positive sign on sqrt(quad) + + d = (-k - sqrt(quad))/a + if (d < ZERO) d = INFINITY + + end if + end if + + + end function z_cylinder_distance + +!=============================================================================== +! Z_CYLINDER_REFLECT +!=============================================================================== + + subroutine z_cylinder_reflect(this, xyz, uvw) + + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: x, y, r, dot_prod + + ! Find x-x0, y-y0 and dot product of direction and surface normal + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + dot_prod = uvw(1)*x + uvw(2)*y + + ! Reflect direction according to normal + uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) + uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) + + end subroutine z_cylinder_reflect + +!=============================================================================== +! SPHERE_EVALUATE +!=============================================================================== + + pure function sphere_evaluate(this, xyz) result(f) + + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = x*x + y*y + z*z - this%r*this%r + + end function sphere_evaluate + +!=============================================================================== +! SPHERE_DISTANCE +!=============================================================================== + + pure function sphere_distance(this, xyz, uvw) result(d) + + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: x, y, z, k, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + k = x*uvw(1) + y*uvw(2) + z*uvw(3) + c = x*x + y*y + z*z - this%r*this%r + quad = k*k - c + + if (quad < ZERO) then + ! no intersection with sphere + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the sphere, thus one distance is positive/negative and + ! the other is zero. The sign of k determines if we are facing in or out + + if (k >= ZERO) then + d = INFINITY + else + d = -k + sqrt(quad) + end if + + elseif (c < ZERO) then + ! particle is inside the sphere, thus one distance must be negative and + ! one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = -k + sqrt(quad) + + else + ! particle is outside the sphere, thus both distances are either positive + ! or negative. If positive, the smaller distance is the one with positive + ! sign on sqrt(quad) + + d = -k - sqrt(quad) + if (d < ZERO) d = INFINITY + + end if + + end function sphere_distance + +!=============================================================================== +! SPHERE_REFLECT +!=============================================================================== + + subroutine sphere_reflect(this, xyz, uvw) + + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: n(3) + + ! Determine surface surface normal + n(:) = xyz - [this%x0, this%y0, this%z0] + + ! Reflect direction according to normal + uvw = uvw - TWO*dot_product(uvw, n)/(this%r*this%r) * n + + end subroutine sphere_reflect + +!=============================================================================== +! X_CONE_EVALUATE +!=============================================================================== + + pure function x_cone_evaluate(this, xyz) result(f) + + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = y*y + z*z - this%r2*x*x + + end function x_cone_evaluate + +!=============================================================================== +! X_CONE_DISTANCE +!=============================================================================== + + pure function x_cone_distance(this, xyz, uvw) result(d) + + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: x, y, z, k, a, b, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + a = uvw(2)*uvw(2) + uvw(3)*uvw(3) - this%r2*uvw(1)*uvw(1) + k = y*uvw(2) + z*uvw(3) - this%r2*x*uvw(1) + c = y*y + z*z - this%r2*x*x + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + + end function x_cone_distance + +!=============================================================================== +! X_CONE_REFLECT +!=============================================================================== + + subroutine x_cone_reflect(this, xyz, uvw) + + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: x, y, z, r, dot_prod + + ! Find x-x0, y-y0, z-z0 and dot product of direction and surface normal + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + r = this%r2 + dot_prod = (uvw(2)*y + uvw(3)*z - r*uvw(1)*x)/((r + ONE)*r*x*x) + + ! Reflect direction according to normal + uvw(1) = uvw(1) + TWO*dot_prod*r*x + uvw(2) = uvw(2) - TWO*dot_prod*y + uvw(3) = uvw(3) - TWO*dot_prod*z + + end subroutine x_cone_reflect + +!=============================================================================== +! Y_CONE_EVALUATE +!=============================================================================== + + pure function y_cone_evaluate(this, xyz) result(f) + + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = x*x + z*z - this%r2*y*y + + end function y_cone_evaluate + +!=============================================================================== +! Y_CONE_DISTANCE +!=============================================================================== + + pure function y_cone_distance(this, xyz, uvw) result(d) + + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: x, y, z, k, a, b, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + a = uvw(1)*uvw(1) + uvw(3)*uvw(3) - this%r2*uvw(2)*uvw(2) + k = x*uvw(1) + z*uvw(3) - this%r2*y*uvw(2) + c = x*x + z*z - this%r2*y*y + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + + end function y_cone_distance + +!=============================================================================== +! Y_CONE_REFLECT +!=============================================================================== + + subroutine y_cone_reflect(this, xyz, uvw) + + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: x, y, z, r, dot_prod + + ! Find x-x0, y-y0, z-z0 and dot product of direction and surface normal + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + r = this%r2 + dot_prod = (uvw(1)*x + uvw(3)*z - r*uvw(2)*y)/((r + ONE)*r*y*y) + + ! Reflect direction according to normal + uvw(1) = uvw(1) - TWO*dot_prod*x + uvw(2) = uvw(2) + TWO*dot_prod*r*y + uvw(3) = uvw(3) - TWO*dot_prod*z + + end subroutine y_cone_reflect + +!=============================================================================== +! Z_CONE_EVALUATE +!=============================================================================== + + pure function z_cone_evaluate(this, xyz) result(f) + + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = x*x + y*y - this%r2*z*z + + end function z_cone_evaluate + +!=============================================================================== +! Z_CONE_DISTANCE +!=============================================================================== + + pure function z_cone_distance(this, xyz, uvw) result(d) + + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d + + real(8) :: x, y, z, k, a, b, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + a = uvw(1)*uvw(1) + uvw(2)*uvw(2) - this%r2*uvw(3)*uvw(3) + k = x*uvw(1) + y*uvw(2) - this%r2*z*uvw(3) + c = x*x + y*y - this%r2*z*z + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + + end function z_cone_distance + +!=============================================================================== +! Z_CONE_REFLECT +!=============================================================================== + + subroutine z_cone_reflect(this, xyz, uvw) + + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: x, y, z, r, dot_prod + + ! Find x-x0, y-y0, z-z0 and dot product of direction and surface normal + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + r = this%r2 + dot_prod = (uvw(1)*x + uvw(2)*y - r*uvw(3)*z)/((r + ONE)*r*z*z) + + ! Reflect direction according to normal + uvw(1) = uvw(1) - TWO*dot_prod*x + uvw(2) = uvw(2) - TWO*dot_prod*y + uvw(3) = uvw(3) + TWO*dot_prod*r*z + + end subroutine z_cone_reflect + +end module surface_header From e143915ea311a303317b49a61b6774bb6a422cd6 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 22 Sep 2015 18:17:33 +0700 Subject: [PATCH 161/519] Added surface normal functions. --- src/surface.F90 | 450 ++++++++++++++++++++++-------------------------- 1 file changed, 206 insertions(+), 244 deletions(-) diff --git a/src/surface.F90 b/src/surface.F90 index abf71a450a..1ebf822d39 100644 --- a/src/surface.F90 +++ b/src/surface.F90 @@ -5,15 +5,16 @@ module surface_header implicit none type, abstract :: Surface - integer :: id ! Unique ID - integer, allocatable :: & - neighbor_pos(:), & ! List of cells on positive side - neighbor_neg(:) ! List of cells on negative side - integer :: bc ! Boundary condition - contains - procedure(iEvaluate), deferred :: evaluate - procedure(iDistance), deferred :: distance - procedure(iReflect), deferred :: reflect + integer :: id ! Unique ID + integer, allocatable :: & + neighbor_pos(:), & ! List of cells on positive side + neighbor_neg(:) ! List of cells on negative side + integer :: bc ! Boundary condition + contains + procedure(iEvaluate), deferred :: evaluate + procedure(iDistance), deferred :: distance + procedure(iReflect), deferred :: reflect + procedure(iNormal), deferred :: normal end type Surface type, extends(Surface) :: SurfaceXPlane @@ -23,6 +24,7 @@ module surface_header procedure :: evaluate => x_plane_evaluate procedure :: reflect => x_plane_reflect procedure :: distance => x_plane_distance + procedure :: normal => x_plane_normal end type SurfaceXPlane type, extends(Surface) :: SurfaceYPlane @@ -32,6 +34,7 @@ module surface_header procedure :: evaluate => y_plane_evaluate procedure :: reflect => y_plane_reflect procedure :: distance => y_plane_distance + procedure :: normal => y_plane_normal end type SurfaceYPlane type, extends(Surface) :: SurfaceZPlane @@ -41,6 +44,7 @@ module surface_header procedure :: evaluate => z_plane_evaluate procedure :: reflect => z_plane_reflect procedure :: distance => z_plane_distance + procedure :: normal => z_plane_normal end type SurfaceZPlane type, extends(Surface) :: SurfacePlane @@ -53,6 +57,7 @@ module surface_header procedure :: evaluate => plane_evaluate procedure :: reflect => plane_reflect procedure :: distance => plane_distance + procedure :: normal => plane_normal end type SurfacePlane type, extends(Surface) :: SurfaceXCylinder @@ -64,6 +69,7 @@ module surface_header procedure :: evaluate => x_cylinder_evaluate procedure :: reflect => x_cylinder_reflect procedure :: distance => x_cylinder_distance + procedure :: normal => x_cylinder_normal end type SurfaceXCylinder type, extends(Surface) :: SurfaceYCylinder @@ -75,6 +81,7 @@ module surface_header procedure :: evaluate => y_cylinder_evaluate procedure :: reflect => y_cylinder_reflect procedure :: distance => y_cylinder_distance + procedure :: normal => y_cylinder_normal end type SurfaceYCylinder type, extends(Surface) :: SurfaceZCylinder @@ -86,6 +93,7 @@ module surface_header procedure :: evaluate => z_cylinder_evaluate procedure :: reflect => z_cylinder_reflect procedure :: distance => z_cylinder_distance + procedure :: normal => z_cylinder_normal end type SurfaceZCylinder type, extends(Surface) :: SurfaceSphere @@ -98,6 +106,7 @@ module surface_header procedure :: evaluate => sphere_evaluate procedure :: reflect => sphere_reflect procedure :: distance => sphere_distance + procedure :: normal => sphere_normal end type SurfaceSphere type, extends(Surface) :: SurfaceXCone @@ -110,6 +119,7 @@ module surface_header procedure :: evaluate => x_cone_evaluate procedure :: reflect => x_cone_reflect procedure :: distance => x_cone_distance + procedure :: normal => x_cone_normal end type SurfaceXCone type, extends(Surface) :: SurfaceYCone @@ -122,6 +132,7 @@ module surface_header procedure :: evaluate => y_cone_evaluate procedure :: reflect => y_cone_reflect procedure :: distance => y_cone_distance + procedure :: normal => y_cone_normal end type SurfaceYCone type, extends(Surface) :: SurfaceZCone @@ -134,6 +145,7 @@ module surface_header procedure :: evaluate => z_cone_evaluate procedure :: reflect => z_cone_reflect procedure :: distance => z_cone_distance + procedure :: normal => z_cone_normal end type SurfaceZCone abstract interface @@ -158,34 +170,34 @@ module surface_header real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) end subroutine iReflect + + pure function iNormal(this, xyz) result(uvw) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + end function iNormal end interface contains !=============================================================================== -! X_PLANE_EVALUATE +! SurfaceXPlane Implementation !=============================================================================== pure function x_plane_evaluate(this, xyz) result(f) - class(SurfaceXPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f f = xyz(1) - this%x0 - end function x_plane_evaluate -!=============================================================================== -! X_PLANE_DISTANCE -!=============================================================================== - pure function x_plane_distance(this, xyz, uvw) result(d) - class(SurfaceXPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d if (uvw(1) == ZERO) then d = INFINITY @@ -193,47 +205,41 @@ contains d = (this%x0 - xyz(1))/uvw(1) if (d < ZERO) d = INFINITY end if - end function x_plane_distance -!=============================================================================== -! X_PLANE_REFLECT -!=============================================================================== - subroutine x_plane_reflect(this, xyz, uvw) - - class(SurfaceXPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) uvw(1) = -uvw(1) - end subroutine x_plane_reflect + pure function x_plane_normal(this, xyz) result(uvw) + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [1, 0, 0] + end function x_plane_normal + !=============================================================================== -! Y_PLANE_EVALUATE +! SurfaceYPlane Implementation !=============================================================================== pure function y_plane_evaluate(this, xyz) result(f) - class(SurfaceYPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f f = xyz(2) - this%y0 - end function y_plane_evaluate -!=============================================================================== -! Y_PLANE_DISTANCE -!=============================================================================== - pure function y_plane_distance(this, xyz, uvw) result(d) - class(SurfaceYPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d if (uvw(2) == ZERO) then d = INFINITY @@ -241,25 +247,26 @@ contains d = (this%y0 - xyz(2))/uvw(2) if (d < ZERO) d = INFINITY end if - end function y_plane_distance -!=============================================================================== -! Y_PLANE_REFLECT -!=============================================================================== - subroutine y_plane_reflect(this, xyz, uvw) - class(SurfaceYPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) uvw(2) = -uvw(2) - end subroutine y_plane_reflect + pure function y_plane_normal(this, xyz) result(uvw) + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [0, 1, 0] + end function y_plane_normal + !=============================================================================== -! Z_PLANE_EVALUATE +! SurfaceZPlane Implementation !=============================================================================== pure function z_plane_evaluate(this, xyz) result(f) @@ -272,16 +279,11 @@ contains end function z_plane_evaluate -!=============================================================================== -! Z_PLANE_DISTANCE -!=============================================================================== - pure function z_plane_distance(this, xyz, uvw) result(d) - class(SurfaceZPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d if (uvw(3) == ZERO) then d = INFINITY @@ -289,47 +291,41 @@ contains d = (this%z0 - xyz(3))/uvw(3) if (d < ZERO) d = INFINITY end if - end function z_plane_distance -!=============================================================================== -! Z_PLANE_REFLECT -!=============================================================================== - subroutine z_plane_reflect(this, xyz, uvw) - - class(SurfaceZPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) uvw(3) = -uvw(3) - end subroutine z_plane_reflect + pure function z_plane_normal(this, xyz) result(uvw) + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [0, 0, 1] + end function z_plane_normal + !=============================================================================== -! PLANE_EVALUATE +! SurfacePlane Implementation !=============================================================================== pure function plane_evaluate(this, xyz) result(f) - class(SurfacePlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D - end function plane_evaluate -!=============================================================================== -! PLANE_DISTANCE -!=============================================================================== - pure function plane_distance(this, xyz, uvw) result(d) - class(SurfacePlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d real(8) :: tmp @@ -340,15 +336,9 @@ contains d = -(this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D)/tmp if (d < ZERO) d = INFINITY end if - end function plane_distance -!=============================================================================== -! PLANE_REFLECT -!=============================================================================== - subroutine plane_reflect(this, xyz, uvw) - class(SurfacePlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) @@ -360,33 +350,33 @@ contains ! Reflect direction according to normal uvw = uvw - TWO*dot_product(n, uvw)/dot_product(n, n) * n - end subroutine plane_reflect + pure function plane_normal(this, xyz) result(uvw) + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [this%A, this%B, this%C] + end function plane_normal + !=============================================================================== -! X_CYLINDER_EVALUATE +! SurfaceXCylinder Implementation !=============================================================================== pure function x_cylinder_evaluate(this, xyz) result(f) - class(SurfaceXCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: y, z y = xyz(2) - this%y0 z = xyz(3) - this%z0 f = y*y + z*z - this%r*this%r - end function x_cylinder_evaluate -!=============================================================================== -! X_CYLINDER_DISTANCE -!=============================================================================== - pure function x_cylinder_distance(this, xyz, uvw) result(d) - class(SurfaceXCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) @@ -437,16 +427,9 @@ contains end if end if - - end function x_cylinder_distance -!=============================================================================== -! X_CYLINDER_REFLECT -!=============================================================================== - subroutine x_cylinder_reflect(this, xyz, uvw) - class(SurfaceXCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) @@ -461,38 +444,39 @@ contains ! Reflect direction according to normal uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) - - end subroutine x_cylinder_reflect + pure function x_cylinder_normal(this, xyz) result(uvw) + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = ZERO + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = TWO*(xyz(3) - this%z0) + end function x_cylinder_normal + !=============================================================================== -! Y_CYLINDER_EVALUATE +! SurfaceYCylinder Implementation !=============================================================================== pure function y_cylinder_evaluate(this, xyz) result(f) - class(SurfaceYCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: x, z x = xyz(1) - this%x0 z = xyz(3) - this%z0 f = x*x + z*z - this%r*this%r - end function y_cylinder_evaluate -!=============================================================================== -! Y_CYLINDER_DISTANCE -!=============================================================================== - pure function y_cylinder_distance(this, xyz, uvw) result(d) - class(SurfaceYCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d real(8) :: x, z, k, a, c, quad @@ -539,19 +523,12 @@ contains end if end if - - end function y_cylinder_distance -!=============================================================================== -! Y_CYLINDER_REFLECT -!=============================================================================== - subroutine y_cylinder_reflect(this, xyz, uvw) - - class(SurfaceYCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) real(8) :: x, z, r, dot_prod @@ -563,34 +540,35 @@ contains ! Reflect direction according to normal uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) - - end subroutine y_cylinder_reflect + pure function y_cylinder_normal(this, xyz) result(uvw) + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = ZERO + uvw(3) = TWO*(xyz(3) - this%z0) + end function y_cylinder_normal + !=============================================================================== -! Z_CYLINDER_EVALUATE +! SurfaceZCylinder Implementation !=============================================================================== pure function z_cylinder_evaluate(this, xyz) result(f) - class(SurfaceZCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: x, y x = xyz(1) - this%x0 y = xyz(2) - this%y0 f = x*x + y*y - this%r*this%r - end function z_cylinder_evaluate -!=============================================================================== -! Z_CYLINDER_DISTANCE -!=============================================================================== - pure function z_cylinder_distance(this, xyz, uvw) result(d) - class(SurfaceZCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) @@ -641,19 +619,12 @@ contains end if end if - - end function z_cylinder_distance -!=============================================================================== -! Z_CYLINDER_REFLECT -!=============================================================================== - subroutine z_cylinder_reflect(this, xyz, uvw) - - class(SurfaceZCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) real(8) :: x, y, r, dot_prod @@ -665,18 +636,26 @@ contains ! Reflect direction according to normal uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) - end subroutine z_cylinder_reflect + pure function z_cylinder_normal(this, xyz) result(uvw) + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = ZERO + end function z_cylinder_normal + !=============================================================================== -! SPHERE_EVALUATE +! SphereImplementation !=============================================================================== pure function sphere_evaluate(this, xyz) result(f) - class(SurfaceSphere), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: x, y, z @@ -684,19 +663,13 @@ contains y = xyz(2) - this%y0 z = xyz(3) - this%z0 f = x*x + y*y + z*z - this%r*this%r - end function sphere_evaluate -!=============================================================================== -! SPHERE_DISTANCE -!=============================================================================== - pure function sphere_distance(this, xyz, uvw) result(d) - class(SurfaceSphere), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d real(8) :: x, y, z, k, c, quad @@ -738,15 +711,9 @@ contains if (d < ZERO) d = INFINITY end if - end function sphere_distance -!=============================================================================== -! SPHERE_REFLECT -!=============================================================================== - subroutine sphere_reflect(this, xyz, uvw) - class(SurfaceSphere), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) @@ -758,18 +725,24 @@ contains ! Reflect direction according to normal uvw = uvw - TWO*dot_product(uvw, n)/(this%r*this%r) * n - end subroutine sphere_reflect + pure function sphere_normal(this, xyz) result(uvw) + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = TWO*(xyz - [this%x0, this%y0, this%z0]) + end function sphere_normal + !=============================================================================== -! X_CONE_EVALUATE +! SurfaceXCone Implementation !=============================================================================== pure function x_cone_evaluate(this, xyz) result(f) - class(SurfaceXCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: x, y, z @@ -777,19 +750,13 @@ contains y = xyz(2) - this%y0 z = xyz(3) - this%z0 f = y*y + z*z - this%r2*x*x - end function x_cone_evaluate -!=============================================================================== -! X_CONE_DISTANCE -!=============================================================================== - pure function x_cone_distance(this, xyz, uvw) result(d) - class(SurfaceXCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d real(8) :: x, y, z, k, a, b, c, quad @@ -835,15 +802,9 @@ contains ! If the distance was negative, set boundary distance to infinity if (d <= ZERO) d = INFINITY - end function x_cone_distance -!=============================================================================== -! X_CONE_REFLECT -!=============================================================================== - subroutine x_cone_reflect(this, xyz, uvw) - class(SurfaceXCone), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) @@ -861,18 +822,26 @@ contains uvw(1) = uvw(1) + TWO*dot_prod*r*x uvw(2) = uvw(2) - TWO*dot_prod*y uvw(3) = uvw(3) - TWO*dot_prod*z - end subroutine x_cone_reflect + pure function x_cone_normal(this, xyz) result(uvw) + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = -TWO*this%r2*(xyz(1) - this%x0) + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = TWO*(xyz(3) - this%z0) + end function x_cone_normal + !=============================================================================== -! Y_CONE_EVALUATE +! SurfaceYCone Implementation !=============================================================================== pure function y_cone_evaluate(this, xyz) result(f) - class(SurfaceYCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: x, y, z @@ -880,19 +849,13 @@ contains y = xyz(2) - this%y0 z = xyz(3) - this%z0 f = x*x + z*z - this%r2*y*y - end function y_cone_evaluate -!=============================================================================== -! Y_CONE_DISTANCE -!=============================================================================== - pure function y_cone_distance(this, xyz, uvw) result(d) - class(SurfaceYCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d real(8) :: x, y, z, k, a, b, c, quad @@ -938,18 +901,12 @@ contains ! If the distance was negative, set boundary distance to infinity if (d <= ZERO) d = INFINITY - end function y_cone_distance -!=============================================================================== -! Y_CONE_REFLECT -!=============================================================================== - subroutine y_cone_reflect(this, xyz, uvw) - - class(SurfaceYCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) real(8) :: x, y, z, r, dot_prod @@ -964,18 +921,26 @@ contains uvw(1) = uvw(1) - TWO*dot_prod*x uvw(2) = uvw(2) + TWO*dot_prod*r*y uvw(3) = uvw(3) - TWO*dot_prod*z - end subroutine y_cone_reflect + pure function y_cone_normal(this, xyz) result(uvw) + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = -TWO*this%r2*(xyz(2) - this%y0) + uvw(3) = TWO*(xyz(3) - this%z0) + end function y_cone_normal + !=============================================================================== -! Z_CONE_EVALUATE +! SurfaceZConeImplementation !=============================================================================== pure function z_cone_evaluate(this, xyz) result(f) - class(SurfaceZCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f real(8) :: x, y, z @@ -983,19 +948,13 @@ contains y = xyz(2) - this%y0 z = xyz(3) - this%z0 f = x*x + y*y - this%r2*z*z - end function z_cone_evaluate -!=============================================================================== -! Z_CONE_DISTANCE -!=============================================================================== - pure function z_cone_distance(this, xyz, uvw) result(d) - class(SurfaceZCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + real(8) :: d real(8) :: x, y, z, k, a, b, c, quad @@ -1041,18 +1000,12 @@ contains ! If the distance was negative, set boundary distance to infinity if (d <= ZERO) d = INFINITY - end function z_cone_distance -!=============================================================================== -! Z_CONE_REFLECT -!=============================================================================== - subroutine z_cone_reflect(this, xyz, uvw) - - class(SurfaceZCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) real(8) :: x, y, z, r, dot_prod @@ -1067,7 +1020,16 @@ contains uvw(1) = uvw(1) - TWO*dot_prod*x uvw(2) = uvw(2) - TWO*dot_prod*y uvw(3) = uvw(3) + TWO*dot_prod*r*z - end subroutine z_cone_reflect + pure function z_cone_normal(this, xyz) result(uvw) + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = -TWO*this%r2*(xyz(3) - this%z0) + end function z_cone_normal + end module surface_header From 257d44584f11f5b21c81d441fcca25a07a021cd1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 22 Sep 2015 18:38:04 +0700 Subject: [PATCH 162/519] Moved surface.F90 to surface_header.F90 --- src/{surface.F90 => surface_header.F90} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{surface.F90 => surface_header.F90} (100%) diff --git a/src/surface.F90 b/src/surface_header.F90 similarity index 100% rename from src/surface.F90 rename to src/surface_header.F90 From 2dead7437a7c16da8b429a855995602973925960 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 22 Sep 2015 19:35:13 +0700 Subject: [PATCH 163/519] Add new procedures in geometry module using polymorphic surfaces --- src/geometry.F90 | 484 ++++++++++++++++++++++++++++++++++++++++- src/global.F90 | 2 + src/input_xml.F90 | 80 ++++++- src/surface_header.F90 | 52 +++-- 4 files changed, 583 insertions(+), 35 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 39d95817ba..7696a82054 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -8,6 +8,7 @@ module geometry use output, only: write_message use particle_header, only: LocalCoord, Particle use particle_restart_write, only: write_particle_restart + use surface_header use string, only: to_str use tally, only: score_surface_current @@ -21,10 +22,9 @@ contains !=============================================================================== function simple_cell_contains(c, p) result(in_cell) - - type(Cell), pointer :: c + type(Cell), intent(in) :: c type(Particle), intent(inout) :: p - logical :: in_cell + logical :: in_cell integer :: i ! index of surfaces in cell integer :: i_surface ! index in surfaces array (with sign) @@ -62,10 +62,8 @@ contains ! If we've reached here, then the sense matched on every surface or there ! are no surfaces. in_cell = .true. - end function simple_cell_contains - !=============================================================================== ! CHECK_CELL_OVERLAP checks for overlapping cells at the current particle's ! position using simple_cell_contains and the LocalCoord's built up by find_cell @@ -554,6 +552,163 @@ contains end subroutine cross_surface + subroutine cross_surface_new(p, last_cell) + type(Particle), intent(inout) :: p + integer, intent(in) :: last_cell ! last cell particle was in + + real(8) :: u ! x-component of direction + real(8) :: v ! y-component of direction + real(8) :: w ! z-component of direction + real(8) :: norm ! "norm" of surface normal + integer :: i_surface ! index in surfaces + logical :: found ! particle found in universe? + class(Surface2), pointer :: surf + + i_surface = abs(p % surface) + surf => surfaces_c(i_surface)%obj + if (verbosity >= 10 .or. trace) then + call write_message(" Crossing surface " // trim(to_str(surf % id))) + end if + + if (surf % bc == BC_VACUUM .and. (run_mode /= MODE_PLOTTING)) then + ! ======================================================================= + ! PARTICLE LEAKS OUT OF PROBLEM + + ! Kill particle + p % alive = .false. + + ! Score any surface current tallies -- note that the particle is moved + ! forward slightly so that if the mesh boundary is on the surface, it is + ! still processed + + if (active_current_tallies % size() > 0) then + ! TODO: Find a better solution to score surface currents than + ! physically moving the particle forward slightly + + p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw + call score_surface_current(p) + end if + + ! Score to global leakage tally + if (tallies_on) then + global_tally_leakage = global_tally_leakage + p % wgt + end if + + ! Display message + if (verbosity >= 10 .or. trace) then + call write_message(" Leaked out of surface " & + &// trim(to_str(surf % id))) + end if + return + + elseif (surf % bc == BC_REFLECT .and. (run_mode /= MODE_PLOTTING)) then + ! ======================================================================= + ! PARTICLE REFLECTS FROM SURFACE + + ! Do not handle reflective boundary conditions on lower universes + if (p % n_coord /= 1) then + call handle_lost_particle(p, "Cannot reflect particle " & + &// trim(to_str(p % id)) // " off surface in a lower universe.") + return + end if + + ! Score surface currents since reflection causes the direction of the + ! particle to change -- artificially move the particle slightly back in + ! case the surface crossing in coincident with a mesh boundary + + if (active_current_tallies % size() > 0) then + p % coord(1) % xyz = p % coord(1) % xyz - TINY_BIT * p % coord(1) % uvw + call score_surface_current(p) + p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw + end if + + ! Reflect particle off surface + call surf%reflect(p%coord(1)%xyz, p%coord(1)%uvw) + + ! Make sure new particle direction is normalized + u = p%coord(1)%uvw(1) + v = p%coord(1)%uvw(2) + w = p%coord(1)%uvw(3) + norm = sqrt(u*u + v*v + w*w) + p%coord(1)%uvw(:) = [u, v, w] / norm + + ! Reassign particle's cell and surface + p % coord(1) % cell = last_cell + p % surface = -p % surface + + ! If a reflective surface is coincident with a lattice or universe + ! boundary, it is necessary to redetermine the particle's coordinates in + ! the lower universes. + + p % n_coord = 1 + call find_cell(p, found) + if (.not. found) then + call handle_lost_particle(p, "Couldn't find particle after reflecting& + & from surface.") + return + end if + + ! Set previous coordinate going slightly past surface crossing + p % last_xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw + + ! Diagnostic message + if (verbosity >= 10 .or. trace) then + call write_message(" Reflected from surface " & + &// trim(to_str(surf%id))) + end if + return + end if + + ! ========================================================================== + ! SEARCH NEIGHBOR LISTS FOR NEXT CELL + + if (p % surface > 0 .and. allocated(surf%neighbor_pos)) then + ! If coming from negative side of surface, search all the neighboring + ! cells on the positive side + + call find_cell(p, found, surf%neighbor_pos) + if (found) return + + elseif (p % surface < 0 .and. allocated(surf%neighbor_neg)) then + ! If coming from positive side of surface, search all the neighboring + ! cells on the negative side + + call find_cell(p, found, surf%neighbor_neg) + if (found) return + + end if + + ! ========================================================================== + ! COULDN'T FIND PARTICLE IN NEIGHBORING CELLS, SEARCH ALL CELLS + + ! Remove lower coordinate levels and assignment of surface + p % surface = NONE + p % n_coord = 1 + call find_cell(p, found) + + if (run_mode /= MODE_PLOTTING .and. (.not. found)) then + ! If a cell is still not found, there are two possible causes: 1) there is + ! a void in the model, and 2) the particle hit a surface at a tangent. If + ! the particle is really traveling tangent to a surface, if we move it + ! forward a tiny bit it should fix the problem. + + p % n_coord = 1 + p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw + call find_cell(p, found) + + ! Couldn't find next cell anywhere! This probably means there is an actual + ! undefined region in the geometry. + + if (.not. found) then + call handle_lost_particle(p, "After particle " // trim(to_str(p % id)) & + // " crossed surface " // trim(to_str(surf%id)) & + // " it could not be located in any cell and it did not leak.") + return + end if + end if + + end subroutine cross_surface_new + !=============================================================================== ! CROSS_LATTICE moves a particle into a new lattice element !=============================================================================== @@ -1329,6 +1484,293 @@ contains end subroutine distance_to_boundary + subroutine distance_to_boundary_new(p, dist, surface_crossed, lattice_translation, & + next_level) + type(Particle), intent(inout) :: p + real(8), intent(out) :: dist + integer, intent(out) :: surface_crossed + integer, intent(out) :: lattice_translation(3) + integer, intent(out) :: next_level + + integer :: i ! index for surface in cell + integer :: j + integer :: index_surf ! index in surfaces array (with sign) + integer :: i_xyz(3) ! lattice indices + integer :: level_surf_cross ! surface crossed on current level + integer :: level_lat_trans(3) ! lattice translation on current level + real(8) :: x,y,z ! particle coordinates + real(8) :: xyz_t(3) ! local particle coordinates + real(8) :: beta, gama ! skewed particle coordiantes + real(8) :: u,v,w ! particle directions + real(8) :: beta_dir ! skewed particle direction + real(8) :: gama_dir ! skewed particle direction + real(8) :: edge ! distance to oncoming edge + real(8) :: d ! evaluated distance + real(8) :: d_lat ! distance to lattice boundary + real(8) :: d_surf ! distance to surface + real(8) :: x0,y0,z0 ! coefficients for surface + type(Cell), pointer :: cl + class(Surface2), pointer :: surf + class(Lattice), pointer :: lat + + ! inialize distance to infinity (huge) + dist = INFINITY + d_lat = INFINITY + d_surf = INFINITY + lattice_translation(:) = [0, 0, 0] + + next_level = 0 + + ! Loop over each universe level + LEVEL_LOOP: do j = 1, p % n_coord + + ! get pointer to cell on this level + cl => cells(p % coord(j) % cell) + + ! copy directional cosines + u = p % coord(j) % uvw(1) + v = p % coord(j) % uvw(2) + w = p % coord(j) % uvw(3) + + ! ======================================================================= + ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL + + SURFACE_LOOP: do i = 1, cl % n_surfaces + ! check for operators + index_surf = abs(index_surf) + if (index_surf >= OP_DIFFERENCE) cycle + + ! Calculate distance to surface + surf => surfaces_c(index_surf)%obj + d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw) + + ! Check is calculated distance is new minimum + if (d < d_surf) then + if (abs(d - d_surf)/d_surf >= FP_PRECISION) then + d_surf = d + level_surf_cross = -cl % surfaces(i) + end if + end if + end do SURFACE_LOOP + + ! ======================================================================= + ! FIND MINIMUM DISTANCE TO LATTICE SURFACES + + LAT_COORD: if (p % coord(j) % lattice /= NONE) then + lat => lattices(p % coord(j) % lattice) % obj + + LAT_TYPE: select type(lat) + + type is (RectLattice) + ! copy local coordinates + x = p % coord(j) % xyz(1) + y = p % coord(j) % xyz(2) + z = p % coord(j) % xyz(3) + + ! determine oncoming edge + x0 = sign(lat % pitch(1) * HALF, u) + y0 = sign(lat % pitch(2) * HALF, v) + + ! left and right sides + if (abs(x - x0) < FP_PRECISION) then + d = INFINITY + elseif (u == ZERO) then + d = INFINITY + else + d = (x0 - x)/u + end if + + d_lat = d + if (u > 0) then + level_lat_trans(:) = [1, 0, 0] + else + level_lat_trans(:) = [-1, 0, 0] + end if + + ! front and back sides + if (abs(y - y0) < FP_PRECISION) then + d = INFINITY + elseif (v == ZERO) then + d = INFINITY + else + d = (y0 - y)/v + end if + + if (d < d_lat) then + d_lat = d + if (v > 0) then + level_lat_trans(:) = [0, 1, 0] + else + level_lat_trans(:) = [0, -1, 0] + end if + end if + + if (lat % is_3d) then + z0 = sign(lat % pitch(3) * HALF, w) + + ! top and bottom sides + if (abs(z - z0) < FP_PRECISION) then + d = INFINITY + elseif (w == ZERO) then + d = INFINITY + else + d = (z0 - z)/w + end if + + if (d < d_lat) then + d_lat = d + if (w > 0) then + level_lat_trans(:) = [0, 0, 1] + else + level_lat_trans(:) = [0, 0, -1] + end if + end if + end if + + type is (HexLattice) LAT_TYPE + ! Copy local coordinates. + z = p % coord(j) % xyz(3) + i_xyz(1) = p % coord(j) % lattice_x + i_xyz(2) = p % coord(j) % lattice_y + i_xyz(3) = p % coord(j) % lattice_z + + ! Compute velocities along the hexagonal axes. + beta_dir = u*sqrt(THREE)/TWO + v/TWO + gama_dir = u*sqrt(THREE)/TWO - v/TWO + + ! Note that hexagonal lattice distance calculations are performed + ! using the particle's coordinates relative to the neighbor lattice + ! cells, not relative to the particle's current cell. This is done + ! because there is significant disagreement between neighboring cells + ! on where the lattice boundary is due to the worse finite precision + ! of hex lattices. + + ! Upper right and lower left sides. + edge = -sign(lat % pitch(1)/TWO, beta_dir) ! Oncoming edge + if (beta_dir > ZERO) then + xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[1, 0, 0]) + else + xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[-1, 0, 0]) + end if + beta = xyz_t(1)*sqrt(THREE)/TWO + xyz_t(2)/TWO + if (abs(beta - edge) < FP_PRECISION) then + d = INFINITY + else if (beta_dir == ZERO) then + d = INFINITY + else + d = (edge - beta)/beta_dir + end if + + d_lat = d + if (beta_dir > 0) then + level_lat_trans(:) = [1, 0, 0] + else + level_lat_trans(:) = [-1, 0, 0] + end if + + ! Lower right and upper left sides. + edge = -sign(lat % pitch(1)/TWO, gama_dir) ! Oncoming edge + if (gama_dir > ZERO) then + xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[1, -1, 0]) + else + xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[-1, 1, 0]) + end if + gama = xyz_t(1)*sqrt(THREE)/TWO - xyz_t(2)/TWO + if (abs(gama - edge) < FP_PRECISION) then + d = INFINITY + else if (gama_dir == ZERO) then + d = INFINITY + else + d = (edge - gama)/gama_dir + end if + + if (d < d_lat) then + d_lat = d + if (gama_dir > 0) then + level_lat_trans(:) = [1, -1, 0] + else + level_lat_trans(:) = [-1, 1, 0] + end if + end if + + ! Upper and lower sides. + edge = -sign(lat % pitch(1)/TWO, v) ! Oncoming edge + if (v > ZERO) then + xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[0, 1, 0]) + else + xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[0, -1, 0]) + end if + if (abs(xyz_t(2) - edge) < FP_PRECISION) then + d = INFINITY + else if (v == ZERO) then + d = INFINITY + else + d = (edge - xyz_t(2))/v + end if + + if (d < d_lat) then + d_lat = d + if (v > 0) then + level_lat_trans(:) = [0, 1, 0] + else + level_lat_trans(:) = [0, -1, 0] + end if + end if + + ! Top and bottom sides. + if (lat % is_3d) then + z0 = sign(lat % pitch(2) * HALF, w) + + if (abs(z - z0) < FP_PRECISION) then + d = INFINITY + elseif (w == ZERO) then + d = INFINITY + else + d = (z0 - z)/w + end if + + if (d < d_lat) then + d_lat = d + if (w > 0) then + level_lat_trans(:) = [0, 0, 1] + else + level_lat_trans(:) = [0, 0, -1] + end if + end if + end if + end select LAT_TYPE + + if (d_lat < ZERO) then + call handle_lost_particle(p, "Particle " // trim(to_str(p % id)) & + //" had a negative distance to a lattice boundary. d = " & + //trim(to_str(d_lat))) + end if + end if LAT_COORD + + ! If the boundary on this lattice level is coincident with a boundary on + ! a higher level then we need to make sure that the higher level boundary + ! is selected. This logic must include consideration of floating point + ! precision. + if (d_surf < d_lat) then + if ((dist - d_surf)/dist >= FP_REL_PRECISION) then + dist = d_surf + surface_crossed = level_surf_cross + lattice_translation(:) = [0, 0, 0] + next_level = j + end if + else + if ((dist - d_lat)/dist >= FP_REL_PRECISION) then + dist = d_lat + surface_crossed = None + lattice_translation(:) = level_lat_trans + next_level = j + end if + end if + + end do LEVEL_LOOP + + end subroutine distance_to_boundary_new + !=============================================================================== ! SENSE determines whether a point is on the 'positive' or 'negative' side of a ! surface. This routine is crucial for determining what cell a particular point @@ -1456,6 +1898,34 @@ contains end function sense + recursive function sense_new(p, surf) result(s) + type(Particle), intent(inout) :: p + class(Surface2), intent(in) :: surf ! surface + logical :: s ! sense of particle + + integer :: j + real(8) :: func ! surface function evaluated at point + + j = p%n_coord + + ! Evaluate the surface equation at the particle's coordinates to determine + ! which side the particle is on + func = surf%evaluate(p%coord(j)%xyz) + + ! Check which side of surface the point is on + if (abs(func) < FP_COINCIDENT) then + ! Particle may be coincident with this surface. Artifically move the + ! particle forward a tiny bit. + p%coord(j)%xyz = p%coord(j)%xyz + TINY_BIT * p%coord(j)%uvw + s = sense_new(p, surf) + elseif (func > 0) then + s = .true. + else + s = .false. + end if + + end function sense_new + !=============================================================================== ! NEIGHBOR_LISTS builds a list of neighboring cells to each surface to speed up ! searches when a cell boundary is crossed. @@ -1501,9 +1971,11 @@ contains surf => surfaces(i) if (count_positive(i) > 0) then allocate(surf%neighbor_pos(count_positive(i))) + allocate(surfaces_c(i)%obj%neighbor_pos(count_positive(i))) end if if (count_negative(i) > 0) then allocate(surf%neighbor_neg(count_negative(i))) + allocate(surfaces_c(i)%obj%neighbor_neg(count_negative(i))) end if end do @@ -1524,9 +1996,11 @@ contains if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 surf%neighbor_pos(count_positive(i_surface)) = i + surfaces_c(i_surface)%obj%neighbor_pos(count_positive(i_surface)) = i else count_negative(i_surface) = count_negative(i_surface) + 1 surf%neighbor_neg(count_negative(i_surface)) = i + surfaces_c(i_surface)%obj%neighbor_neg(count_negative(i_surface)) = i end if end do end do diff --git a/src/global.F90 b/src/global.F90 index 398b72e140..246fa3f3ae 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -11,6 +11,7 @@ module global use mesh_header, only: RegularMesh use plot_header, only: ObjectPlot use set_header, only: SetInt + use surface_header, only: SurfaceContainer use source_header, only: ExtSource use tally_header, only: TallyObject, TallyMap, TallyResult use trigger_header, only: KTrigger @@ -31,6 +32,7 @@ module global type(Universe), allocatable, target :: universes(:) type(LatticeContainer), allocatable, target :: lattices(:) type(Surface), allocatable, target :: surfaces(:) + type(SurfaceContainer), allocatable, target :: surfaces_c(:) type(Material), allocatable, target :: materials(:) type(ObjectPlot), allocatable, target :: plots(:) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3899d43f0e..57769d33ac 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -12,6 +12,7 @@ module input_xml use output, only: write_message use plot_header use random_lcg, only: prn + use surface_header use string, only: to_lower, to_str, str_to_int, str_to_real, & starts_with, ends_with use tally_header, only: TallyObject, TallyFilter @@ -987,13 +988,14 @@ contains integer :: coeffs_reqd integer, allocatable :: temp_int_array(:) real(8) :: phi, theta, psi + real(8), allocatable :: coeffs(:) logical :: file_exists logical :: boundary_exists character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word - type(Cell), pointer :: c => null() - type(Surface), pointer :: s => null() - class(Lattice), pointer :: lat => null() + type(Cell), pointer :: c + type(Surface), pointer :: s + class(Lattice), pointer :: lat type(Node), pointer :: doc => null() type(Node), pointer :: node_cell => null() type(Node), pointer :: node_surf => null() @@ -1220,6 +1222,7 @@ contains ! Allocate cells array allocate(surfaces(n_surfaces)) + allocate(surfaces_c(n_surfaces)) do i = 1, n_surfaces s => surfaces(i) @@ -1253,39 +1256,51 @@ contains case ('x-plane') s % type = SURF_PX coeffs_reqd = 1 + allocate(SurfaceXPlane :: surfaces_c(i)%obj) case ('y-plane') s % type = SURF_PY coeffs_reqd = 1 + allocate(SurfaceYPlane :: surfaces_c(i)%obj) case ('z-plane') s % type = SURF_PZ coeffs_reqd = 1 + allocate(SurfaceZPlane :: surfaces_c(i)%obj) case ('plane') s % type = SURF_PLANE coeffs_reqd = 4 + allocate(SurfacePlane :: surfaces_c(i)%obj) case ('x-cylinder') s % type = SURF_CYL_X coeffs_reqd = 3 + allocate(SurfaceXCylinder :: surfaces_c(i)%obj) case ('y-cylinder') s % type = SURF_CYL_Y coeffs_reqd = 3 + allocate(SurfaceYCylinder :: surfaces_c(i)%obj) case ('z-cylinder') s % type = SURF_CYL_Z coeffs_reqd = 3 + allocate(SurfaceZCylinder :: surfaces_c(i)%obj) case ('sphere') s % type = SURF_SPHERE coeffs_reqd = 4 + allocate(SurfaceSphere :: surfaces_c(i)%obj) case ('x-cone') s % type = SURF_CONE_X coeffs_reqd = 4 + allocate(SurfaceXCone :: surfaces_c(i)%obj) case ('y-cone') s % type = SURF_CONE_Y coeffs_reqd = 4 + allocate(SurfaceYCone :: surfaces_c(i)%obj) case ('z-cone') s % type = SURF_CONE_Z coeffs_reqd = 4 + allocate(SurfaceZCone :: surfaces_c(i)%obj) case default call fatal_error("Invalid surface type: " // trim(word)) end select + surfaces_c(i)%obj%id = s%id ! Check to make sure that the proper number of coefficients ! have been specified for the given type of surface. Then copy @@ -1298,11 +1313,62 @@ contains elseif (n > coeffs_reqd) then call fatal_error("Too many coefficients specified for surface: " & &// trim(to_str(s % id))) - else - allocate(s % coeffs(n)) - call get_node_array(node_surf, "coeffs", s % coeffs) end if + allocate(coeffs(n)) + allocate(s%coeffs(n)) + call get_node_array(node_surf, "coeffs", coeffs) + s%coeffs(:) = coeffs(:) + + select type(sp => surfaces_c(i)%obj) + type is (SurfaceXPlane) + sp%x0 = coeffs(1) + type is (SurfaceYPlane) + sp%y0 = coeffs(1) + type is (SurfaceZPlane) + sp%z0 = coeffs(1) + type is (SurfacePlane) + sp%A = coeffs(1) + sp%B = coeffs(2) + sp%C = coeffs(3) + sp%D = coeffs(4) + type is (SurfaceXCylinder) + sp%y0 = coeffs(1) + sp%z0 = coeffs(2) + sp%r = coeffs(3) + type is (SurfaceYCylinder) + sp%x0 = coeffs(1) + sp%z0 = coeffs(2) + sp%r = coeffs(3) + type is (SurfaceZCylinder) + sp%x0 = coeffs(1) + sp%y0 = coeffs(2) + sp%r = coeffs(3) + type is (SurfaceSphere) + sp%x0 = coeffs(1) + sp%y0 = coeffs(2) + sp%z0 = coeffs(3) + sp%r = coeffs(4) + type is (SurfaceXCone) + sp%x0 = coeffs(1) + sp%y0 = coeffs(2) + sp%z0 = coeffs(3) + sp%r2 = coeffs(4) + type is (SurfaceYCone) + sp%x0 = coeffs(1) + sp%y0 = coeffs(2) + sp%z0 = coeffs(3) + sp%r2 = coeffs(4) + type is (SurfaceZCone) + sp%x0 = coeffs(1) + sp%y0 = coeffs(2) + sp%z0 = coeffs(3) + sp%r2 = coeffs(4) + end select + + ! No longer need coefficients + deallocate(coeffs) + ! Boundary conditions word = '' if (check_for_node(node_surf, "boundary")) & @@ -1321,6 +1387,8 @@ contains &"' specified on surface " // trim(to_str(s % id))) end select + surfaces_c(i)%obj%bc = s%bc + ! Add surface to dictionary call surface_dict % add_key(s % id, i) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 1ebf822d39..442c670f58 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -4,7 +4,7 @@ module surface_header implicit none - type, abstract :: Surface + type, abstract :: Surface2 integer :: id ! Unique ID integer, allocatable :: & neighbor_pos(:), & ! List of cells on positive side @@ -15,9 +15,13 @@ module surface_header procedure(iDistance), deferred :: distance procedure(iReflect), deferred :: reflect procedure(iNormal), deferred :: normal - end type Surface + end type Surface2 - type, extends(Surface) :: SurfaceXPlane + type :: SurfaceContainer + class(Surface2), allocatable :: obj + end type SurfaceContainer + + type, extends(Surface2) :: SurfaceXPlane ! x = x0 real(8) :: x0 contains @@ -27,7 +31,7 @@ module surface_header procedure :: normal => x_plane_normal end type SurfaceXPlane - type, extends(Surface) :: SurfaceYPlane + type, extends(Surface2) :: SurfaceYPlane ! y = y0 real(8) :: y0 contains @@ -37,7 +41,7 @@ module surface_header procedure :: normal => y_plane_normal end type SurfaceYPlane - type, extends(Surface) :: SurfaceZPlane + type, extends(Surface2) :: SurfaceZPlane ! z = z0 real(8) :: z0 contains @@ -47,7 +51,7 @@ module surface_header procedure :: normal => z_plane_normal end type SurfaceZPlane - type, extends(Surface) :: SurfacePlane + type, extends(Surface2) :: SurfacePlane ! Ax + By + Cz = D real(8) :: A real(8) :: B @@ -60,7 +64,7 @@ module surface_header procedure :: normal => plane_normal end type SurfacePlane - type, extends(Surface) :: SurfaceXCylinder + type, extends(Surface2) :: SurfaceXCylinder ! (y - y0)^2 + (z - z0)^2 = R^2 real(8) :: y0 real(8) :: z0 @@ -72,7 +76,7 @@ module surface_header procedure :: normal => x_cylinder_normal end type SurfaceXCylinder - type, extends(Surface) :: SurfaceYCylinder + type, extends(Surface2) :: SurfaceYCylinder ! (x - x0)^2 + (z - z0)^2 = R^2 real(8) :: x0 real(8) :: z0 @@ -84,7 +88,7 @@ module surface_header procedure :: normal => y_cylinder_normal end type SurfaceYCylinder - type, extends(Surface) :: SurfaceZCylinder + type, extends(Surface2) :: SurfaceZCylinder ! (x - x0)^2 + (y - y0)^2 = R^2 real(8) :: x0 real(8) :: y0 @@ -96,7 +100,7 @@ module surface_header procedure :: normal => z_cylinder_normal end type SurfaceZCylinder - type, extends(Surface) :: SurfaceSphere + type, extends(Surface2) :: SurfaceSphere ! (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = R^2 real(8) :: x0 real(8) :: y0 @@ -109,7 +113,7 @@ module surface_header procedure :: normal => sphere_normal end type SurfaceSphere - type, extends(Surface) :: SurfaceXCone + type, extends(Surface2) :: SurfaceXCone ! (y - y0)^2 + (z - z0)^2 = R^2*(x - x0)^2 real(8) :: x0 real(8) :: y0 @@ -122,7 +126,7 @@ module surface_header procedure :: normal => x_cone_normal end type SurfaceXCone - type, extends(Surface) :: SurfaceYCone + type, extends(Surface2) :: SurfaceYCone ! (x - x0)^2 + (z - z0)^2 = R^2*(y - y0)^2 real(8) :: x0 real(8) :: y0 @@ -135,7 +139,7 @@ module surface_header procedure :: normal => y_cone_normal end type SurfaceYCone - type, extends(Surface) :: SurfaceZCone + type, extends(Surface2) :: SurfaceZCone ! (x - x0)^2 + (y - y0)^2 = R^2*(z - z0)^2 real(8) :: x0 real(8) :: y0 @@ -150,30 +154,30 @@ module surface_header abstract interface pure function iEvaluate(this, xyz) result(f) - import Surface - class(Surface), intent(in) :: this + import Surface2 + class(Surface2), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: f end function iEvaluate pure function iDistance(this, xyz, uvw) result(d) - import Surface - class(Surface), intent(in) :: this + import Surface2 + class(Surface2), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) real(8) :: d end function iDistance subroutine iReflect(this, xyz, uvw) - import Surface - class(Surface), intent(in) :: this + import Surface2 + class(Surface2), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) end subroutine iReflect pure function iNormal(this, xyz) result(uvw) - import Surface - class(Surface), intent(in) :: this + import Surface2 + class(Surface2), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: uvw(3) end function iNormal @@ -434,7 +438,7 @@ contains real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) - real(8) :: y, z, r, dot_prod + real(8) :: y, z, dot_prod ! Find y-y0, z-z0 and dot product of direction and surface normal y = xyz(2) - this%y0 @@ -530,7 +534,7 @@ contains real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) - real(8) :: x, z, r, dot_prod + real(8) :: x, z, dot_prod ! Find x-x0, z-z0 and dot product of direction and surface normal x = xyz(1) - this%x0 @@ -626,7 +630,7 @@ contains real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) - real(8) :: x, y, r, dot_prod + real(8) :: x, y, dot_prod ! Find x-x0, y-y0 and dot product of direction and surface normal x = xyz(1) - this%x0 From e3843c473827ce6ff9896c3290dbf9a4c10221eb Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 22 Sep 2015 22:53:20 +0700 Subject: [PATCH 164/519] Fix a few consistency issues. Move to new versions of sense/cross_surface --- src/geometry.F90 | 6 ++---- src/surface_header.F90 | 40 +++++++++++++++++++++++++++------------- src/tracking.F90 | 4 ++-- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 7696a82054..9b4ca0dde0 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -30,7 +30,6 @@ contains integer :: i_surface ! index in surfaces array (with sign) logical :: specified_sense ! specified sense of surface in list logical :: actual_sense ! sense of particle wrt surface - type(Surface), pointer :: s SURFACE_LOOP: do i = 1, c % n_surfaces ! Lookup surface @@ -48,8 +47,7 @@ contains ! Determine the specified sense of the surface in the cell and the actual ! sense of the particle with respect to the surface - s => surfaces(abs(i_surface)) - actual_sense = sense(p, s) + actual_sense = sense_new(p, surfaces_c(abs(i_surface))%obj) specified_sense = (c % surfaces(i) > 0) ! Compare sense of point to specified sense @@ -1537,7 +1535,7 @@ contains SURFACE_LOOP: do i = 1, cl % n_surfaces ! check for operators - index_surf = abs(index_surf) + index_surf = abs(cl%surfaces(i)) if (index_surf >= OP_DIFFERENCE) cycle ! Calculate distance to surface diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 442c670f58..ff7454352b 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -203,10 +203,13 @@ contains real(8), intent(in) :: uvw(3) real(8) :: d - if (uvw(1) == ZERO) then + real(8) :: f + + f = this%x0 - xyz(1) + if (abs(f) < FP_COINCIDENT .or. uvw(1) == ZERO) then d = INFINITY else - d = (this%x0 - xyz(1))/uvw(1) + d = f/uvw(1) if (d < ZERO) d = INFINITY end if end function x_plane_distance @@ -245,10 +248,13 @@ contains real(8), intent(in) :: uvw(3) real(8) :: d - if (uvw(2) == ZERO) then + real(8) :: f + + f = this%y0 - xyz(2) + if (abs(f) < FP_COINCIDENT .or. uvw(2) == ZERO) then d = INFINITY else - d = (this%y0 - xyz(2))/uvw(2) + d = f/uvw(2) if (d < ZERO) d = INFINITY end if end function y_plane_distance @@ -289,10 +295,13 @@ contains real(8), intent(in) :: uvw(3) real(8) :: d - if (uvw(3) == ZERO) then + real(8) :: f + + f = this%z0 - xyz(3) + if (abs(f) < FP_COINCIDENT .or. uvw(3) == ZERO) then d = INFINITY else - d = (this%z0 - xyz(3))/uvw(3) + d = f/uvw(3) if (d < ZERO) d = INFINITY end if end function z_plane_distance @@ -331,13 +340,15 @@ contains real(8), intent(in) :: uvw(3) real(8) :: d + real(8) :: f real(8) :: tmp + f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D tmp = this%A*uvw(1) + this%B*uvw(2) + this%C*uvw(3) - if (tmp == ZERO) then + if (abs(f) < FP_COINCIDENT .or. tmp == ZERO) then d = INFINITY else - d = -(this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D)/tmp + d = -f/tmp if (d < ZERO) d = INFINITY end if end function plane_distance @@ -722,13 +733,16 @@ contains real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) - real(8) :: n(3) + real(8) :: x, y, z, dot_prod - ! Determine surface surface normal - n(:) = xyz - [this%x0, this%y0, this%z0] + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + dot_prod = uvw(1)*x + uvw(2)*y + uvw(3)*z - ! Reflect direction according to normal - uvw = uvw - TWO*dot_product(uvw, n)/(this%r*this%r) * n + uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) + uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) + uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) end subroutine sphere_reflect pure function sphere_normal(this, xyz) result(uvw) diff --git a/src/tracking.F90 b/src/tracking.F90 index 81f01b4110..b2faa8d22a 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -3,7 +3,7 @@ module tracking use constants, only: MODE_EIGENVALUE use cross_section, only: calculate_xs use error, only: fatal_error, warning - use geometry, only: find_cell, distance_to_boundary, cross_surface, & + use geometry, only: find_cell, distance_to_boundary, cross_surface_new, & cross_lattice, check_cell_overlap use geometry_header, only: Universe, BASE_UNIVERSE use global @@ -129,7 +129,7 @@ contains else ! Particle crosses surface p % surface = surface_crossed - call cross_surface(p, last_cell) + call cross_surface_new(p, last_cell) p % event = EVENT_SURFACE end if else From 1e99f09187447b8dbfd8dead0b8c20f6137d5229 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 08:18:20 +0700 Subject: [PATCH 165/519] Add 'coincident' argument to distance routines. When a particle is advanced to a surface, due to limited precision it may appear as though the particle's position is not exactly coincident (as tested by the sense of the particle with respect to the surface). Thus, the only sure way of making sure that distance() returns the correct value is to pass it an argument indicating whether the particle is coincident with the surface. --- src/geometry.F90 | 9 ++++- src/surface_header.F90 | 86 ++++++++++++++++++++++++------------------ src/tracking.F90 | 4 +- 3 files changed, 58 insertions(+), 41 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 9b4ca0dde0..e4df72fb0f 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -1507,6 +1507,7 @@ contains real(8) :: d_lat ! distance to lattice boundary real(8) :: d_surf ! distance to surface real(8) :: x0,y0,z0 ! coefficients for surface + logical :: coincident ! is particle on surface? type(Cell), pointer :: cl class(Surface2), pointer :: surf class(Lattice), pointer :: lat @@ -1535,12 +1536,16 @@ contains SURFACE_LOOP: do i = 1, cl % n_surfaces ! check for operators - index_surf = abs(cl%surfaces(i)) + index_surf = cl%surfaces(i) + coincident = (index_surf == p % surface) + + ! check for operators + index_surf = abs(index_surf) if (index_surf >= OP_DIFFERENCE) cycle ! Calculate distance to surface surf => surfaces_c(index_surf)%obj - d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw) + d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw, coincident) ! Check is calculated distance is new minimum if (d < d_surf) then diff --git a/src/surface_header.F90 b/src/surface_header.F90 index ff7454352b..c4a1a921f1 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -156,23 +156,24 @@ module surface_header pure function iEvaluate(this, xyz) result(f) import Surface2 class(Surface2), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f + real(8), intent(in) :: xyz(3) + real(8) :: f end function iEvaluate - pure function iDistance(this, xyz, uvw) result(d) + pure function iDistance(this, xyz, uvw, coincident) result(d) import Surface2 class(Surface2), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d end function iDistance subroutine iReflect(this, xyz, uvw) import Surface2 - class(Surface2), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) + class(Surface2), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) end subroutine iReflect pure function iNormal(this, xyz) result(uvw) @@ -197,16 +198,17 @@ contains f = xyz(1) - this%x0 end function x_plane_evaluate - pure function x_plane_distance(this, xyz, uvw) result(d) + pure function x_plane_distance(this, xyz, uvw, coincident) result(d) class(SurfaceXPlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: f f = this%x0 - xyz(1) - if (abs(f) < FP_COINCIDENT .or. uvw(1) == ZERO) then + if (coincident .or. abs(f) < FP_COINCIDENT .or. uvw(1) == ZERO) then d = INFINITY else d = f/uvw(1) @@ -242,16 +244,17 @@ contains f = xyz(2) - this%y0 end function y_plane_evaluate - pure function y_plane_distance(this, xyz, uvw) result(d) + pure function y_plane_distance(this, xyz, uvw, coincident) result(d) class(SurfaceYPlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: f f = this%y0 - xyz(2) - if (abs(f) < FP_COINCIDENT .or. uvw(2) == ZERO) then + if (coincident .or. abs(f) < FP_COINCIDENT .or. uvw(2) == ZERO) then d = INFINITY else d = f/uvw(2) @@ -289,16 +292,17 @@ contains end function z_plane_evaluate - pure function z_plane_distance(this, xyz, uvw) result(d) + pure function z_plane_distance(this, xyz, uvw, coincident) result(d) class(SurfaceZPlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: f f = this%z0 - xyz(3) - if (abs(f) < FP_COINCIDENT .or. uvw(3) == ZERO) then + if (coincident .or. abs(f) < FP_COINCIDENT .or. uvw(3) == ZERO) then d = INFINITY else d = f/uvw(3) @@ -334,10 +338,11 @@ contains f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D end function plane_evaluate - pure function plane_distance(this, xyz, uvw) result(d) + pure function plane_distance(this, xyz, uvw, coincident) result(d) class(SurfacePlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: f @@ -345,7 +350,7 @@ contains f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D tmp = this%A*uvw(1) + this%B*uvw(2) + this%C*uvw(3) - if (abs(f) < FP_COINCIDENT .or. tmp == ZERO) then + if (coincident .or. abs(f) < FP_COINCIDENT .or. tmp == ZERO) then d = INFINITY else d = -f/tmp @@ -391,11 +396,12 @@ contains f = y*y + z*z - this%r*this%r end function x_cylinder_evaluate - pure function x_cylinder_distance(this, xyz, uvw) result(d) + pure function x_cylinder_distance(this, xyz, uvw, coincident) result(d) class(SurfaceXCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d real(8) :: y, z, k, a, c, quad @@ -414,7 +420,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the cylinder, thus one distance is positive/negative ! and the other is zero. The sign of k determines if we are facing in or ! out @@ -487,10 +493,11 @@ contains f = x*x + z*z - this%r*this%r end function y_cylinder_evaluate - pure function y_cylinder_distance(this, xyz, uvw) result(d) + pure function y_cylinder_distance(this, xyz, uvw, coincident) result(d) class(SurfaceYCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: x, z, k, a, c, quad @@ -510,7 +517,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the cylinder, thus one distance is positive/negative ! and the other is zero. The sign of k determines if we are facing in or ! out @@ -583,11 +590,12 @@ contains f = x*x + y*y - this%r*this%r end function z_cylinder_evaluate - pure function z_cylinder_distance(this, xyz, uvw) result(d) + pure function z_cylinder_distance(this, xyz, uvw, coincident) result(d) class(SurfaceZCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - real(8) :: d + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d real(8) :: x, y, k, a, c, quad @@ -606,7 +614,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the cylinder, thus one distance is positive/negative ! and the other is zero. The sign of k determines if we are facing in or ! out @@ -680,10 +688,11 @@ contains f = x*x + y*y + z*z - this%r*this%r end function sphere_evaluate - pure function sphere_distance(this, xyz, uvw) result(d) + pure function sphere_distance(this, xyz, uvw, coincident) result(d) class(SurfaceSphere), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: x, y, z, k, c, quad @@ -700,7 +709,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the sphere, thus one distance is positive/negative and ! the other is zero. The sign of k determines if we are facing in or out @@ -770,10 +779,11 @@ contains f = y*y + z*z - this%r2*x*x end function x_cone_evaluate - pure function x_cone_distance(this, xyz, uvw) result(d) + pure function x_cone_distance(this, xyz, uvw, coincident) result(d) class(SurfaceXCone), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: x, y, z, k, a, b, c, quad @@ -791,7 +801,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the cone, thus one distance is positive/negative and the ! other is zero. The sign of k determines which distance is zero and which ! is not. @@ -869,10 +879,11 @@ contains f = x*x + z*z - this%r2*y*y end function y_cone_evaluate - pure function y_cone_distance(this, xyz, uvw) result(d) + pure function y_cone_distance(this, xyz, uvw, coincident) result(d) class(SurfaceYCone), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: x, y, z, k, a, b, c, quad @@ -890,7 +901,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the cone, thus one distance is positive/negative and the ! other is zero. The sign of k determines which distance is zero and which ! is not. @@ -968,10 +979,11 @@ contains f = x*x + y*y - this%r2*z*z end function z_cone_evaluate - pure function z_cone_distance(this, xyz, uvw) result(d) + pure function z_cone_distance(this, xyz, uvw, coincident) result(d) class(SurfaceZCone), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident real(8) :: d real(8) :: x, y, z, k, a, b, c, quad @@ -989,7 +1001,7 @@ contains d = INFINITY - elseif (abs(c) < FP_COINCIDENT) then + elseif (coincident .or. abs(c) < FP_COINCIDENT) then ! particle is on the cone, thus one distance is positive/negative and the ! other is zero. The sign of k determines which distance is zero and which ! is not. diff --git a/src/tracking.F90 b/src/tracking.F90 index b2faa8d22a..3669a61e85 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -3,7 +3,7 @@ module tracking use constants, only: MODE_EIGENVALUE use cross_section, only: calculate_xs use error, only: fatal_error, warning - use geometry, only: find_cell, distance_to_boundary, cross_surface_new, & + use geometry, only: find_cell, distance_to_boundary_new, cross_surface_new, & cross_lattice, check_cell_overlap use geometry_header, only: Universe, BASE_UNIVERSE use global @@ -86,7 +86,7 @@ contains if (p % material /= p % last_material) call calculate_xs(p) ! Find the distance to the nearest boundary - call distance_to_boundary(p, d_boundary, surface_crossed, & + call distance_to_boundary_new(p, d_boundary, surface_crossed, & lattice_translation, next_level) ! Sample a distance to collision From 8d765d76bd8897048525fa7d8ace4bfe5176f95a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 08:24:15 +0700 Subject: [PATCH 166/519] Remove old geometry routines --- src/geometry.F90 | 1111 +--------------------------------------------- src/tracking.F90 | 6 +- 2 files changed, 8 insertions(+), 1109 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index e4df72fb0f..c9f4927f29 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -47,7 +47,7 @@ contains ! Determine the specified sense of the surface in the cell and the actual ! sense of the particle with respect to the surface - actual_sense = sense_new(p, surfaces_c(abs(i_surface))%obj) + actual_sense = sense(p, surfaces_c(abs(i_surface))%obj) specified_sense = (c % surfaces(i) > 0) ! Compare sense of point to specified sense @@ -269,288 +269,6 @@ contains !=============================================================================== subroutine cross_surface(p, last_cell) - - type(Particle), intent(inout) :: p - integer, intent(in) :: last_cell ! last cell particle was in - - real(8) :: x ! x-x0 for sphere - real(8) :: y ! y-y0 for sphere - real(8) :: z ! z-z0 for sphere - real(8) :: R ! radius of sphere - real(8) :: u ! x-component of direction - real(8) :: v ! y-component of direction - real(8) :: w ! z-component of direction - real(8) :: n1 ! x-component of surface normal - real(8) :: n2 ! y-component of surface normal - real(8) :: n3 ! z-component of surface normal - real(8) :: dot_prod ! dot product of direction and normal - real(8) :: norm ! "norm" of surface normal - integer :: i_surface ! index in surfaces - logical :: found ! particle found in universe? - type(Surface), pointer :: surf - - i_surface = abs(p % surface) - surf => surfaces(i_surface) - if (verbosity >= 10 .or. trace) then - call write_message(" Crossing surface " // trim(to_str(surf % id))) - end if - - if (surf % bc == BC_VACUUM .and. (run_mode /= MODE_PLOTTING)) then - ! ======================================================================= - ! PARTICLE LEAKS OUT OF PROBLEM - - ! Kill particle - p % alive = .false. - - ! Score any surface current tallies -- note that the particle is moved - ! forward slightly so that if the mesh boundary is on the surface, it is - ! still processed - - if (active_current_tallies % size() > 0) then - ! TODO: Find a better solution to score surface currents than - ! physically moving the particle forward slightly - - p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw - call score_surface_current(p) - end if - - ! Score to global leakage tally - if (tallies_on) then - global_tally_leakage = global_tally_leakage + p % wgt - end if - - ! Display message - if (verbosity >= 10 .or. trace) then - call write_message(" Leaked out of surface " & - &// trim(to_str(surf % id))) - end if - return - - elseif (surf % bc == BC_REFLECT .and. (run_mode /= MODE_PLOTTING)) then - ! ======================================================================= - ! PARTICLE REFLECTS FROM SURFACE - - ! Do not handle reflective boundary conditions on lower universes - if (p % n_coord /= 1) then - call handle_lost_particle(p, "Cannot reflect particle " & - &// trim(to_str(p % id)) // " off surface in a lower universe.") - return - end if - - ! Score surface currents since reflection causes the direction of the - ! particle to change -- artificially move the particle slightly back in - ! case the surface crossing in coincident with a mesh boundary - - if (active_current_tallies % size() > 0) then - p % coord(1) % xyz = p % coord(1) % xyz - TINY_BIT * p % coord(1) % uvw - call score_surface_current(p) - p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw - end if - - ! Copy particle's direction cosines - u = p % coord(1) % uvw(1) - v = p % coord(1) % uvw(2) - w = p % coord(1) % uvw(3) - - select case (surf%type) - case (SURF_PX) - u = -u - - case (SURF_PY) - v = -v - - case (SURF_PZ) - w = -w - - case (SURF_PLANE) - ! Find surface coefficients and norm of vector normal to surface - n1 = surf % coeffs(1) - n2 = surf % coeffs(2) - n3 = surf % coeffs(3) - norm = n1*n1 + n2*n2 + n3*n3 - dot_prod = u*n1 + v*n2 + w*n3 - - ! Reflect direction according to normal - u = u - 2*dot_prod*n1/norm - v = v - 2*dot_prod*n2/norm - w = w - 2*dot_prod*n3/norm - - case (SURF_CYL_X) - ! Find y-y0, z-z0 and dot product of direction and surface normal - y = p % coord(1) % xyz(2) - surf % coeffs(1) - z = p % coord(1) % xyz(3) - surf % coeffs(2) - R = surf % coeffs(3) - dot_prod = v*y + w*z - - ! Reflect direction according to normal - v = v - 2*dot_prod*y/(R*R) - w = w - 2*dot_prod*z/(R*R) - - case (SURF_CYL_Y) - ! Find x-x0, z-z0 and dot product of direction and surface normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - z = p % coord(1) % xyz(3) - surf % coeffs(2) - R = surf % coeffs(3) - dot_prod = u*x + w*z - - ! Reflect direction according to normal - u = u - 2*dot_prod*x/(R*R) - w = w - 2*dot_prod*z/(R*R) - - case (SURF_CYL_Z) - ! Find x-x0, y-y0 and dot product of direction and surface normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - R = surf % coeffs(3) - dot_prod = u*x + v*y - - ! Reflect direction according to normal - u = u - 2*dot_prod*x/(R*R) - v = v - 2*dot_prod*y/(R*R) - - case (SURF_SPHERE) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = u*x + v*y + w*z - - ! Reflect direction according to normal - u = u - 2*dot_prod*x/(R*R) - v = v - 2*dot_prod*y/(R*R) - w = w - 2*dot_prod*z/(R*R) - - case (SURF_CONE_X) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = (v*y + w*z - R*u*x)/((R + ONE)*R*x*x) - - ! Reflect direction according to normal - u = u + 2*dot_prod*R*x - v = v - 2*dot_prod*y - w = w - 2*dot_prod*z - - case (SURF_CONE_Y) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = (u*x + w*z - R*v*y)/((R + ONE)*R*y*y) - - ! Reflect direction according to normal - u = u - 2*dot_prod*x - v = v + 2*dot_prod*R*y - w = w - 2*dot_prod*z - - case (SURF_CONE_Z) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = (u*x + v*y - R*w*z)/((R + ONE)*R*z*z) - - ! Reflect direction according to normal - u = u - 2*dot_prod*x - v = v - 2*dot_prod*y - w = w + 2*dot_prod*R*z - - case default - call fatal_error("Reflection not supported for surface " & - &// trim(to_str(surf % id))) - end select - - ! Set new particle direction - norm = sqrt(u*u + v*v + w*w) - p % coord(1) % uvw = [u, v, w] / norm - - ! Reassign particle's cell and surface - p % coord(1) % cell = last_cell - p % surface = -p % surface - - ! If a reflective surface is coincident with a lattice or universe - ! boundary, it is necessary to redetermine the particle's coordinates in - ! the lower universes. - - p % n_coord = 1 - call find_cell(p, found) - if (.not. found) then - call handle_lost_particle(p, "Couldn't find particle after reflecting& - & from surface.") - return - end if - - ! Set previous coordinate going slightly past surface crossing - p % last_xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw - - ! Diagnostic message - if (verbosity >= 10 .or. trace) then - call write_message(" Reflected from surface " & - &// trim(to_str(surf%id))) - end if - return - end if - - ! ========================================================================== - ! SEARCH NEIGHBOR LISTS FOR NEXT CELL - - if (p % surface > 0 .and. allocated(surf % neighbor_pos)) then - ! If coming from negative side of surface, search all the neighboring - ! cells on the positive side - - call find_cell(p, found, surf % neighbor_pos) - if (found) return - - elseif (p % surface < 0 .and. allocated(surf % neighbor_neg)) then - ! If coming from positive side of surface, search all the neighboring - ! cells on the negative side - - call find_cell(p, found, surf % neighbor_neg) - if (found) return - - end if - - ! ========================================================================== - ! COULDN'T FIND PARTICLE IN NEIGHBORING CELLS, SEARCH ALL CELLS - - ! Remove lower coordinate levels and assignment of surface - p % surface = NONE - p % n_coord = 1 - call find_cell(p, found) - - if (run_mode /= MODE_PLOTTING .and. (.not. found)) then - ! If a cell is still not found, there are two possible causes: 1) there is - ! a void in the model, and 2) the particle hit a surface at a tangent. If - ! the particle is really traveling tangent to a surface, if we move it - ! forward a tiny bit it should fix the problem. - - p % n_coord = 1 - p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw - call find_cell(p, found) - - ! Couldn't find next cell anywhere! This probably means there is an actual - ! undefined region in the geometry. - - if (.not. found) then - call handle_lost_particle(p, "After particle " // trim(to_str(p % id)) & - &// " crossed surface " // trim(to_str(surfaces(i_surface) % id)) & - &// " it could not be located in any cell and it did not leak.") - return - end if - end if - - end subroutine cross_surface - - subroutine cross_surface_new(p, last_cell) type(Particle), intent(inout) :: p integer, intent(in) :: last_cell ! last cell particle was in @@ -705,7 +423,7 @@ contains end if end if - end subroutine cross_surface_new + end subroutine cross_surface !=============================================================================== ! CROSS_LATTICE moves a particle into a new lattice element @@ -786,704 +504,6 @@ contains subroutine distance_to_boundary(p, dist, surface_crossed, lattice_translation, & next_level) - - type(Particle), intent(inout) :: p - real(8), intent(out) :: dist - integer, intent(out) :: surface_crossed - integer, intent(out) :: lattice_translation(3) - integer, intent(out) :: next_level - - integer :: i ! index for surface in cell - integer :: j - integer :: index_surf ! index in surfaces array (with sign) - integer :: i_xyz(3) ! lattice indices - integer :: level_surf_cross ! surface crossed on current level - integer :: level_lat_trans(3) ! lattice translation on current level - real(8) :: x,y,z ! particle coordinates - real(8) :: xyz_t(3) ! local particle coordinates - real(8) :: beta, gama ! skewed particle coordiantes - real(8) :: u,v,w ! particle directions - real(8) :: beta_dir ! skewed particle direction - real(8) :: gama_dir ! skewed particle direction - real(8) :: edge ! distance to oncoming edge - real(8) :: d ! evaluated distance - real(8) :: d_lat ! distance to lattice boundary - real(8) :: d_surf ! distance to surface - real(8) :: x0,y0,z0 ! coefficients for surface - real(8) :: r ! radius for quadratic surfaces - real(8) :: tmp ! dot product of surface normal with direction - real(8) :: a,b,c,k ! quadratic equation coefficients - real(8) :: quad ! discriminant of quadratic equation - logical :: on_surface ! is particle on surface? - type(Cell), pointer :: cl - type(Surface), pointer :: surf - class(Lattice), pointer :: lat - - ! inialize distance to infinity (huge) - dist = INFINITY - d_lat = INFINITY - d_surf = INFINITY - lattice_translation(:) = [0, 0, 0] - - next_level = 0 - - ! Loop over each universe level - LEVEL_LOOP: do j = 1, p % n_coord - - ! get pointer to cell on this level - cl => cells(p % coord(j) % cell) - - ! copy directional cosines - u = p % coord(j) % uvw(1) - v = p % coord(j) % uvw(2) - w = p % coord(j) % uvw(3) - - ! ======================================================================= - ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL - - SURFACE_LOOP: do i = 1, cl % n_surfaces - - ! copy local coordinates of particle - x = p % coord(j) % xyz(1) - y = p % coord(j) % xyz(2) - z = p % coord(j) % xyz(3) - - ! check for coincident surface -- note that we can't skip the - ! calculation in general because a particle could be on one side of a - ! cylinder and still have a positive distance to the other - - index_surf = cl % surfaces(i) - if (index_surf == p % surface) then - on_surface = .true. - else - on_surface = .false. - end if - - ! check for operators - index_surf = abs(index_surf) - if (index_surf >= OP_DIFFERENCE) cycle - - ! get pointer to surface - surf => surfaces(index_surf) - - ! TODO: Can probably combines a lot of the cases to reduce repetition - ! since the algorithm is the same for (x-plane, y-plane, z-plane), - ! (x-cylinder, y-cylinder, z-cylinder), etc. - - select case (surf % type) - case (SURF_PX) - if (on_surface .or. u == ZERO) then - d = INFINITY - else - x0 = surf % coeffs(1) - d = (x0 - x)/u - if (d < ZERO) d = INFINITY - end if - - case (SURF_PY) - if (on_surface .or. v == ZERO) then - d = INFINITY - else - y0 = surf % coeffs(1) - d = (y0 - y)/v - if (d < ZERO) d = INFINITY - end if - - case (SURF_PZ) - if (on_surface .or. w == ZERO) then - d = INFINITY - else - z0 = surf % coeffs(1) - d = (z0 - z)/w - if (d < ZERO) d = INFINITY - end if - - case (SURF_PLANE) - A = surf % coeffs(1) - B = surf % coeffs(2) - C = surf % coeffs(3) - D = surf % coeffs(4) - - tmp = A*u + B*v + C*w - if (on_surface .or. tmp == ZERO) then - d = INFINITY - else - d = -(A*x + B*y + C*z - D)/tmp - if (d < ZERO) d = INFINITY - end if - - case (SURF_CYL_X) - a = ONE - u*u ! v^2 + w^2 - if (a == ZERO) then - d = INFINITY - else - y0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - - y = y - y0 - z = z - z0 - k = y*v + z*w - c = y*y + z*z - r*r - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cylinder - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cylinder, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = (-k + sqrt(quad))/a - end if - - elseif (c < ZERO) then - ! particle is inside the cylinder, thus one distance must be - ! negative and one must be positive. The positive distance - ! will be the one with negative sign on sqrt(quad) - - d = (-k + sqrt(quad))/a - - else - ! particle is outside the cylinder, thus both distances are - ! either positive or negative. If positive, the smaller - ! distance is the one with positive sign on sqrt(quad) - - d = (-k - sqrt(quad))/a - if (d < ZERO) d = INFINITY - - end if - end if - - case (SURF_CYL_Y) - a = ONE - v*v ! u^2 + w^2 - if (a == ZERO) then - d = INFINITY - else - x0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - - x = x - x0 - z = z - z0 - k = x*u + z*w - c = x*x + z*z - r*r - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cylinder - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cylinder, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = (-k + sqrt(quad))/a - end if - - elseif (c < ZERO) then - ! particle is inside the cylinder, thus one distance must be - ! negative and one must be positive. The positive distance - ! will be the one with negative sign on sqrt(quad) - - d = (-k + sqrt(quad))/a - - else - ! particle is outside the cylinder, thus both distances are - ! either positive or negative. If positive, the smaller - ! distance is the one with positive sign on sqrt(quad) - - d = (-k - sqrt(quad))/a - if (d < ZERO) d = INFINITY - - end if - end if - - case (SURF_CYL_Z) - a = ONE - w*w ! u^2 + v^2 - if (a == ZERO) then - d = INFINITY - else - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - r = surf % coeffs(3) - - x = x - x0 - y = y - y0 - k = x*u + y*v - c = x*x + y*y - r*r - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cylinder - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cylinder, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = (-k + sqrt(quad))/a - end if - - elseif (c < ZERO) then - ! particle is inside the cylinder, thus one distance must be - ! negative and one must be positive. The positive distance - ! will be the one with negative sign on sqrt(quad) - - d = (-k + sqrt(quad))/a - - else - ! particle is outside the cylinder, thus both distances are - ! either positive or negative. If positive, the smaller - ! distance is the one with positive sign on sqrt(quad) - - d = (-k - sqrt(quad))/a - if (d <= ZERO) d = INFINITY - - end if - end if - - case (SURF_SPHERE) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - k = x*u + y*v + z*w - c = x*x + y*y + z*z - r*r - quad = k*k - c - - if (quad < ZERO) then - ! no intersection with sphere - - d = INFINITY - - elseif (on_surface) then - ! particle is on the sphere, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = -k + sqrt(quad) - end if - - elseif (c < ZERO) then - ! particle is inside the sphere, thus one distance must be - ! negative and one must be positive. The positive distance will - ! be the one with negative sign on sqrt(quad) - - d = -k + sqrt(quad) - - else - ! particle is outside the sphere, thus both distances are either - ! positive or negative. If positive, the smaller distance is the - ! one with positive sign on sqrt(quad) - - d = -k - sqrt(quad) - if (d < ZERO) d = INFINITY - - end if - - case (SURF_CONE_X) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - a = v*v + w*w - r*u*u - k = y*v + z*w - r*x*u - c = y*y + z*z - r*x*x - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cone - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cone, thus one distance is positive/negative - ! and the other is zero. The sign of k determines which distance is - ! zero and which is not. - - if (k >= ZERO) then - d = (-k - sqrt(quad))/a - else - d = (-k + sqrt(quad))/a - end if - - else - ! calculate both solutions to the quadratic - quad = sqrt(quad) - d = (-k - quad)/a - b = (-k + quad)/a - - ! determine the smallest positive solution - if (d < ZERO) then - if (b > ZERO) then - d = b - end if - else - if (b > ZERO) d = min(d, b) - end if - end if - - ! If the distance was negative, set boundary distance to infinity - if (d <= ZERO) d = INFINITY - - case (SURF_CONE_Y) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - a = u*u + w*w - r*v*v - k = x*u + z*w - r*y*v - c = x*x + z*z - r*y*y - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cone - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cone, thus one distance is positive/negative - ! and the other is zero. The sign of k determines which distance is - ! zero and which is not. - - if (k >= ZERO) then - d = (-k - sqrt(quad))/a - else - d = (-k + sqrt(quad))/a - end if - - else - ! calculate both solutions to the quadratic - quad = sqrt(quad) - d = (-k - quad)/a - b = (-k + quad)/a - - ! determine the smallest positive solution - if (d < ZERO) then - if (b > ZERO) then - d = b - end if - else - if (b > ZERO) d = min(d, b) - end if - end if - - ! If the distance was negative, set boundary distance to infinity - if (d <= ZERO) d = INFINITY - - case (SURF_CONE_Z) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - a = u*u + v*v - r*w*w - k = x*u + y*v - r*z*w - c = x*x + y*y - r*z*z - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cone - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cone, thus one distance is positive/negative - ! and the other is zero. The sign of k determines which distance is - ! zero and which is not. - - if (k >= ZERO) then - d = (-k - sqrt(quad))/a - else - d = (-k + sqrt(quad))/a - end if - - else - ! calculate both solutions to the quadratic - quad = sqrt(quad) - d = (-k - quad)/a - b = (-k + quad)/a - - ! determine the smallest positive solution - if (d < ZERO) then - if (b > ZERO) then - d = b - end if - else - if (b > ZERO) d = min(d, b) - end if - end if - - ! If the distance was negative, set boundary distance to infinity - if (d <= ZERO) d = INFINITY - - end select - - ! Check is calculated distance is new minimum - if (d < d_surf) then - if (abs(d - d_surf)/d_surf >= FP_PRECISION) then - d_surf = d - level_surf_cross = -cl % surfaces(i) - end if - end if - - end do SURFACE_LOOP - - ! ======================================================================= - ! FIND MINIMUM DISTANCE TO LATTICE SURFACES - - LAT_COORD: if (p % coord(j) % lattice /= NONE) then - lat => lattices(p % coord(j) % lattice) % obj - - LAT_TYPE: select type(lat) - - type is (RectLattice) - ! copy local coordinates - x = p % coord(j) % xyz(1) - y = p % coord(j) % xyz(2) - z = p % coord(j) % xyz(3) - - ! determine oncoming edge - x0 = sign(lat % pitch(1) * HALF, u) - y0 = sign(lat % pitch(2) * HALF, v) - - ! left and right sides - if (abs(x - x0) < FP_PRECISION) then - d = INFINITY - elseif (u == ZERO) then - d = INFINITY - else - d = (x0 - x)/u - end if - - d_lat = d - if (u > 0) then - level_lat_trans(:) = [1, 0, 0] - else - level_lat_trans(:) = [-1, 0, 0] - end if - - ! front and back sides - if (abs(y - y0) < FP_PRECISION) then - d = INFINITY - elseif (v == ZERO) then - d = INFINITY - else - d = (y0 - y)/v - end if - - if (d < d_lat) then - d_lat = d - if (v > 0) then - level_lat_trans(:) = [0, 1, 0] - else - level_lat_trans(:) = [0, -1, 0] - end if - end if - - if (lat % is_3d) then - z0 = sign(lat % pitch(3) * HALF, w) - - ! top and bottom sides - if (abs(z - z0) < FP_PRECISION) then - d = INFINITY - elseif (w == ZERO) then - d = INFINITY - else - d = (z0 - z)/w - end if - - if (d < d_lat) then - d_lat = d - if (w > 0) then - level_lat_trans(:) = [0, 0, 1] - else - level_lat_trans(:) = [0, 0, -1] - end if - end if - end if - - type is (HexLattice) LAT_TYPE - ! Copy local coordinates. - z = p % coord(j) % xyz(3) - i_xyz(1) = p % coord(j) % lattice_x - i_xyz(2) = p % coord(j) % lattice_y - i_xyz(3) = p % coord(j) % lattice_z - - ! Compute velocities along the hexagonal axes. - beta_dir = u*sqrt(THREE)/TWO + v/TWO - gama_dir = u*sqrt(THREE)/TWO - v/TWO - - ! Note that hexagonal lattice distance calculations are performed - ! using the particle's coordinates relative to the neighbor lattice - ! cells, not relative to the particle's current cell. This is done - ! because there is significant disagreement between neighboring cells - ! on where the lattice boundary is due to the worse finite precision - ! of hex lattices. - - ! Upper right and lower left sides. - edge = -sign(lat % pitch(1)/TWO, beta_dir) ! Oncoming edge - if (beta_dir > ZERO) then - xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[1, 0, 0]) - else - xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[-1, 0, 0]) - end if - beta = xyz_t(1)*sqrt(THREE)/TWO + xyz_t(2)/TWO - if (abs(beta - edge) < FP_PRECISION) then - d = INFINITY - else if (beta_dir == ZERO) then - d = INFINITY - else - d = (edge - beta)/beta_dir - end if - - d_lat = d - if (beta_dir > 0) then - level_lat_trans(:) = [1, 0, 0] - else - level_lat_trans(:) = [-1, 0, 0] - end if - - ! Lower right and upper left sides. - edge = -sign(lat % pitch(1)/TWO, gama_dir) ! Oncoming edge - if (gama_dir > ZERO) then - xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[1, -1, 0]) - else - xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[-1, 1, 0]) - end if - gama = xyz_t(1)*sqrt(THREE)/TWO - xyz_t(2)/TWO - if (abs(gama - edge) < FP_PRECISION) then - d = INFINITY - else if (gama_dir == ZERO) then - d = INFINITY - else - d = (edge - gama)/gama_dir - end if - - if (d < d_lat) then - d_lat = d - if (gama_dir > 0) then - level_lat_trans(:) = [1, -1, 0] - else - level_lat_trans(:) = [-1, 1, 0] - end if - end if - - ! Upper and lower sides. - edge = -sign(lat % pitch(1)/TWO, v) ! Oncoming edge - if (v > ZERO) then - xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[0, 1, 0]) - else - xyz_t = lat % get_local_xyz(p % coord(j - 1) % xyz, i_xyz+[0, -1, 0]) - end if - if (abs(xyz_t(2) - edge) < FP_PRECISION) then - d = INFINITY - else if (v == ZERO) then - d = INFINITY - else - d = (edge - xyz_t(2))/v - end if - - if (d < d_lat) then - d_lat = d - if (v > 0) then - level_lat_trans(:) = [0, 1, 0] - else - level_lat_trans(:) = [0, -1, 0] - end if - end if - - ! Top and bottom sides. - if (lat % is_3d) then - z0 = sign(lat % pitch(2) * HALF, w) - - if (abs(z - z0) < FP_PRECISION) then - d = INFINITY - elseif (w == ZERO) then - d = INFINITY - else - d = (z0 - z)/w - end if - - if (d < d_lat) then - d_lat = d - if (w > 0) then - level_lat_trans(:) = [0, 0, 1] - else - level_lat_trans(:) = [0, 0, -1] - end if - end if - end if - end select LAT_TYPE - - if (d_lat < ZERO) then - call handle_lost_particle(p, "Particle " // trim(to_str(p % id)) & - //" had a negative distance to a lattice boundary. d = " & - //trim(to_str(d_lat))) - end if - end if LAT_COORD - - ! If the boundary on this lattice level is coincident with a boundary on - ! a higher level then we need to make sure that the higher level boundary - ! is selected. This logic must include consideration of floating point - ! precision. - if (d_surf < d_lat) then - if ((dist - d_surf)/dist >= FP_REL_PRECISION) then - dist = d_surf - surface_crossed = level_surf_cross - lattice_translation(:) = [0, 0, 0] - next_level = j - end if - else - if ((dist - d_lat)/dist >= FP_REL_PRECISION) then - dist = d_lat - surface_crossed = None - lattice_translation(:) = level_lat_trans - next_level = j - end if - end if - - end do LEVEL_LOOP - - end subroutine distance_to_boundary - - subroutine distance_to_boundary_new(p, dist, surface_crossed, lattice_translation, & - next_level) type(Particle), intent(inout) :: p real(8), intent(out) :: dist integer, intent(out) :: surface_crossed @@ -1772,7 +792,7 @@ contains end do LEVEL_LOOP - end subroutine distance_to_boundary_new + end subroutine distance_to_boundary !=============================================================================== ! SENSE determines whether a point is on the 'positive' or 'negative' side of a @@ -1781,127 +801,6 @@ contains !=============================================================================== recursive function sense(p, surf) result(s) - - type(Particle), intent(inout) :: p - type(Surface), pointer :: surf ! surface - logical :: s ! sense of particle - - integer :: j - real(8) :: x,y,z ! coordinates of particle - real(8) :: func ! surface function evaluated at point - real(8) :: A ! coefficient on x for plane - real(8) :: B ! coefficient on y for plane - real(8) :: C ! coefficient on z for plane - real(8) :: D ! coefficient for plane - real(8) :: x0,y0,z0 ! coefficients for quadratic surfaces / box - real(8) :: r ! radius for quadratic surfaces - - j = p % n_coord - x = p % coord(j) % xyz(1) - y = p % coord(j) % xyz(2) - z = p % coord(j) % xyz(3) - - select case (surf % type) - case (SURF_PX) - x0 = surf % coeffs(1) - func = x - x0 - - case (SURF_PY) - y0 = surf % coeffs(1) - func = y - y0 - - case (SURF_PZ) - z0 = surf % coeffs(1) - func = z - z0 - - case (SURF_PLANE) - A = surf % coeffs(1) - B = surf % coeffs(2) - C = surf % coeffs(3) - D = surf % coeffs(4) - func = A*x + B*y + C*z - D - - case (SURF_CYL_X) - y0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - y = y - y0 - z = z - z0 - func = y*y + z*z - r*r - - case (SURF_CYL_Y) - x0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - x = x - x0 - z = z - z0 - func = x*x + z*z - r*r - - case (SURF_CYL_Z) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - r = surf % coeffs(3) - x = x - x0 - y = y - y0 - func = x*x + y*y - r*r - - case (SURF_SPHERE) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = x*x + y*y + z*z - r*r - - case (SURF_CONE_X) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = y*y + z*z - r*x*x - - case (SURF_CONE_Y) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = x*x + z*z - r*y*y - - case (SURF_CONE_Z) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = x*x + y*y - r*z*z - - end select - - ! Check which side of surface the point is on - if (abs(func) < FP_COINCIDENT) then - ! Particle may be coincident with this surface. Artifically move the - ! particle forward a tiny bit. - p % coord(j) % xyz = p % coord(j) % xyz + TINY_BIT * p % coord(j) % uvw - s = sense(p, surf) - elseif (func > 0) then - s = .true. - else - s = .false. - end if - - end function sense - - recursive function sense_new(p, surf) result(s) type(Particle), intent(inout) :: p class(Surface2), intent(in) :: surf ! surface logical :: s ! sense of particle @@ -1920,14 +819,14 @@ contains ! Particle may be coincident with this surface. Artifically move the ! particle forward a tiny bit. p%coord(j)%xyz = p%coord(j)%xyz + TINY_BIT * p%coord(j)%uvw - s = sense_new(p, surf) + s = sense(p, surf) elseif (func > 0) then s = .true. else s = .false. end if - end function sense_new + end function sense !=============================================================================== ! NEIGHBOR_LISTS builds a list of neighboring cells to each surface to speed up diff --git a/src/tracking.F90 b/src/tracking.F90 index 3669a61e85..81f01b4110 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -3,7 +3,7 @@ module tracking use constants, only: MODE_EIGENVALUE use cross_section, only: calculate_xs use error, only: fatal_error, warning - use geometry, only: find_cell, distance_to_boundary_new, cross_surface_new, & + use geometry, only: find_cell, distance_to_boundary, cross_surface, & cross_lattice, check_cell_overlap use geometry_header, only: Universe, BASE_UNIVERSE use global @@ -86,7 +86,7 @@ contains if (p % material /= p % last_material) call calculate_xs(p) ! Find the distance to the nearest boundary - call distance_to_boundary_new(p, d_boundary, surface_crossed, & + call distance_to_boundary(p, d_boundary, surface_crossed, & lattice_translation, next_level) ! Sample a distance to collision @@ -129,7 +129,7 @@ contains else ! Particle crosses surface p % surface = surface_crossed - call cross_surface_new(p, last_cell) + call cross_surface(p, last_cell) p % event = EVENT_SURFACE end if else From 7a8d32c2e9042ec2b4b420477345d9891ec7ce97 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 08:48:07 +0700 Subject: [PATCH 167/519] Remove Surface type and old surfaces array --- src/geometry.F90 | 11 +---- src/geometry_header.F90 | 16 ------- src/global.F90 | 5 +-- src/input_xml.F90 | 73 ++++++++++++-------------------- src/output.F90 | 14 +++---- src/summary.F90 | 92 ++++++++++++++++++++++++++++------------- src/surface_header.F90 | 6 +++ 7 files changed, 105 insertions(+), 112 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index c9f4927f29..944ca6a8d2 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -2,7 +2,7 @@ module geometry use constants use error, only: fatal_error, warning - use geometry_header, only: Cell, Surface, Universe, Lattice, & + use geometry_header, only: Cell, Universe, Lattice, & &RectLattice, HexLattice use global use output, only: write_message @@ -841,8 +841,7 @@ contains integer, allocatable :: count_positive(:) ! # of cells on positive side integer, allocatable :: count_negative(:) ! # of cells on negative side logical :: positive ! positive side specified in surface list - type(Cell), pointer :: c - type(Surface), pointer :: surf + type(Cell), pointer :: c call write_message("Building neighboring cells lists for each surface...", & &4) @@ -870,13 +869,10 @@ contains ! allocate neighbor lists for each surface do i = 1, n_surfaces - surf => surfaces(i) if (count_positive(i) > 0) then - allocate(surf%neighbor_pos(count_positive(i))) allocate(surfaces_c(i)%obj%neighbor_pos(count_positive(i))) end if if (count_negative(i) > 0) then - allocate(surf%neighbor_neg(count_negative(i))) allocate(surfaces_c(i)%obj%neighbor_neg(count_negative(i))) end if end do @@ -894,14 +890,11 @@ contains positive = (i_surface > 0) i_surface = abs(i_surface) - surf => surfaces(i_surface) if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 - surf%neighbor_pos(count_positive(i_surface)) = i surfaces_c(i_surface)%obj%neighbor_pos(count_positive(i_surface)) = i else count_negative(i_surface) = count_negative(i_surface) + 1 - surf%neighbor_neg(count_negative(i_surface)) = i surfaces_c(i_surface)%obj%neighbor_neg(count_negative(i_surface)) = i end if end do diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 93e5dd1fdb..13d806e8cf 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -113,22 +113,6 @@ module geometry_header class(Lattice), allocatable :: obj end type LatticeContainer -!=============================================================================== -! SURFACE type defines a first- or second-order surface that can be used to -! construct closed volumes (cells) -!=============================================================================== - - type Surface - integer :: id ! Unique ID - character(len=52) :: name = "" ! User-defined name - integer :: type ! Type of surface - real(8), allocatable :: coeffs(:) ! Definition of surface - integer, allocatable :: & - neighbor_pos(:), & ! List of cells on positive side - neighbor_neg(:) ! List of cells on negative side - integer :: bc ! Boundary condition - end type Surface - !=============================================================================== ! CELL defines a closed volume by its bounding surfaces !=============================================================================== diff --git a/src/global.F90 b/src/global.F90 index 246fa3f3ae..44e470005b 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -6,7 +6,7 @@ module global use cmfd_header use constants use dict_header, only: DictCharInt, DictIntInt - use geometry_header, only: Cell, Universe, Lattice, LatticeContainer, Surface + use geometry_header, only: Cell, Universe, Lattice, LatticeContainer use material_header, only: Material use mesh_header, only: RegularMesh use plot_header, only: ObjectPlot @@ -31,7 +31,6 @@ module global type(Cell), allocatable, target :: cells(:) type(Universe), allocatable, target :: universes(:) type(LatticeContainer), allocatable, target :: lattices(:) - type(Surface), allocatable, target :: surfaces(:) type(SurfaceContainer), allocatable, target :: surfaces_c(:) type(Material), allocatable, target :: materials(:) type(ObjectPlot), allocatable, target :: plots(:) @@ -420,7 +419,7 @@ contains if (allocated(cells)) deallocate(cells) if (allocated(universes)) deallocate(universes) if (allocated(lattices)) deallocate(lattices) - if (allocated(surfaces)) deallocate(surfaces) + if (allocated(surfaces_c)) deallocate(surfaces_c) if (allocated(materials)) deallocate(materials) if (allocated(plots)) deallocate(plots) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 57769d33ac..ed9ae67c7b 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5,7 +5,7 @@ module input_xml use dict_header, only: DictIntInt, ElemKeyValueCI use energy_grid, only: grid_method, n_log_bins use error, only: fatal_error, warning - use geometry_header, only: Cell, Surface, Lattice, RectLattice, HexLattice + use geometry_header, only: Cell, Lattice, RectLattice, HexLattice use global use list_header, only: ListChar, ListReal use mesh_header, only: RegularMesh @@ -994,7 +994,6 @@ contains character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word type(Cell), pointer :: c - type(Surface), pointer :: s class(Lattice), pointer :: lat type(Node), pointer :: doc => null() type(Node), pointer :: node_cell => null() @@ -1221,86 +1220,71 @@ contains end if ! Allocate cells array - allocate(surfaces(n_surfaces)) allocate(surfaces_c(n_surfaces)) do i = 1, n_surfaces - s => surfaces(i) - ! Get pointer to i-th surface node call get_list_item(node_surf_list, i, node_surf) - ! Copy data into cells - if (check_for_node(node_surf, "id")) then - call get_node_value(node_surf, "id", s % id) - else - call fatal_error("Must specify id of surface in geometry XML file.") - end if - - ! Check to make sure 'id' hasn't been used - if (surface_dict % has_key(s % id)) then - call fatal_error("Two or more surfaces use the same unique ID: " & - &// to_str(s % id)) - end if - - ! Copy surface name - if (check_for_node(node_surf, "name")) then - call get_node_value(node_surf, "name", s % name) - end if - ! Copy and interpret surface type word = '' if (check_for_node(node_surf, "type")) & call get_node_value(node_surf, "type", word) select case(to_lower(word)) case ('x-plane') - s % type = SURF_PX coeffs_reqd = 1 allocate(SurfaceXPlane :: surfaces_c(i)%obj) case ('y-plane') - s % type = SURF_PY coeffs_reqd = 1 allocate(SurfaceYPlane :: surfaces_c(i)%obj) case ('z-plane') - s % type = SURF_PZ coeffs_reqd = 1 allocate(SurfaceZPlane :: surfaces_c(i)%obj) case ('plane') - s % type = SURF_PLANE coeffs_reqd = 4 allocate(SurfacePlane :: surfaces_c(i)%obj) case ('x-cylinder') - s % type = SURF_CYL_X coeffs_reqd = 3 allocate(SurfaceXCylinder :: surfaces_c(i)%obj) case ('y-cylinder') - s % type = SURF_CYL_Y coeffs_reqd = 3 allocate(SurfaceYCylinder :: surfaces_c(i)%obj) case ('z-cylinder') - s % type = SURF_CYL_Z coeffs_reqd = 3 allocate(SurfaceZCylinder :: surfaces_c(i)%obj) case ('sphere') - s % type = SURF_SPHERE coeffs_reqd = 4 allocate(SurfaceSphere :: surfaces_c(i)%obj) case ('x-cone') - s % type = SURF_CONE_X coeffs_reqd = 4 allocate(SurfaceXCone :: surfaces_c(i)%obj) case ('y-cone') - s % type = SURF_CONE_Y coeffs_reqd = 4 allocate(SurfaceYCone :: surfaces_c(i)%obj) case ('z-cone') - s % type = SURF_CONE_Z coeffs_reqd = 4 allocate(SurfaceZCone :: surfaces_c(i)%obj) case default call fatal_error("Invalid surface type: " // trim(word)) end select - surfaces_c(i)%obj%id = s%id + + ! Copy data into cells + if (check_for_node(node_surf, "id")) then + call get_node_value(node_surf, "id", surfaces_c(i)%obj%id) + else + call fatal_error("Must specify id of surface in geometry XML file.") + end if + + ! Check to make sure 'id' hasn't been used + if (surface_dict % has_key(surfaces_c(i)%obj%id)) then + call fatal_error("Two or more surfaces use the same unique ID: " & + &// to_str(surfaces_c(i)%obj%id)) + end if + + ! Copy surface name + if (check_for_node(node_surf, "name")) then + call get_node_value(node_surf, "name", surfaces_c(i)%obj%name) + end if ! Check to make sure that the proper number of coefficients ! have been specified for the given type of surface. Then copy @@ -1309,16 +1293,14 @@ contains n = get_arraysize_double(node_surf, "coeffs") if (n < coeffs_reqd) then call fatal_error("Not enough coefficients specified for surface: " & - &// trim(to_str(s % id))) + &// trim(to_str(surfaces_c(i)%obj%id))) elseif (n > coeffs_reqd) then call fatal_error("Too many coefficients specified for surface: " & - &// trim(to_str(s % id))) + &// trim(to_str(surfaces_c(i)%obj%id))) end if allocate(coeffs(n)) - allocate(s%coeffs(n)) call get_node_array(node_surf, "coeffs", coeffs) - s%coeffs(:) = coeffs(:) select type(sp => surfaces_c(i)%obj) type is (SurfaceXPlane) @@ -1375,23 +1357,20 @@ contains call get_node_value(node_surf, "boundary", word) select case (to_lower(word)) case ('transmission', 'transmit', '') - s % bc = BC_TRANSMIT + surfaces_c(i)%obj%bc = BC_TRANSMIT case ('vacuum') - s % bc = BC_VACUUM + surfaces_c(i)%obj%bc = BC_VACUUM boundary_exists = .true. case ('reflective', 'reflect', 'reflecting') - s % bc = BC_REFLECT + surfaces_c(i)%obj%bc = BC_REFLECT boundary_exists = .true. case default call fatal_error("Unknown boundary condition '" // trim(word) // & - &"' specified on surface " // trim(to_str(s % id))) + &"' specified on surface " // trim(to_str(surfaces_c(i)%obj%id))) end select - surfaces_c(i)%obj%bc = s%bc - ! Add surface to dictionary - call surface_dict % add_key(s % id, i) - + call surface_dict % add_key(surfaces_c(i)%obj%id, i) end do ! Check to make sure a boundary condition was applied to at least one diff --git a/src/output.F90 b/src/output.F90 index 1a841a777a..5e1d7120b0 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -6,7 +6,7 @@ module output use constants use endf, only: reaction_name use error, only: fatal_error, warning - use geometry_header, only: Cell, Universe, Surface, Lattice, RectLattice, & + use geometry_header, only: Cell, Universe, Lattice, RectLattice, & HexLattice, BASE_UNIVERSE use global use math, only: t_percentile @@ -254,10 +254,9 @@ contains type(Particle), intent(in) :: p integer :: i ! index for coordinate levels - type(Cell), pointer :: c => null() - type(Surface), pointer :: s => null() - type(Universe), pointer :: u => null() - class(Lattice), pointer :: l => null() + type(Cell), pointer :: c + type(Universe), pointer :: u + class(Lattice), pointer :: l ! display type of particle select case (p % type) @@ -304,8 +303,7 @@ contains ! Print surface if (p % surface /= NONE) then - s => surfaces(abs(p % surface)) - write(ou,*) ' Surface = ' // to_str(sign(s % id, p % surface)) + write(ou,*) ' Surface = ' // to_str(sign(surfaces_c(i)%obj%id, p % surface)) end if ! Display weight, energy, grid index, and interpolation factor @@ -1385,7 +1383,7 @@ contains univ, bin-1, offset, label) case (FILTER_SURFACE) i = t % filters(i_filter) % int_bins(bin) - label = to_str(surfaces(i) % id) + label = to_str(surfaces_c(i)%obj%id) case (FILTER_MESH) m => meshes(t % filters(i_filter) % int_bins(1)) allocate(ijk(m % n_dimension)) diff --git a/src/summary.F90 b/src/summary.F90 index b93bf120c6..ad5a3c8b95 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -3,13 +3,14 @@ module summary use ace_header, only: Reaction, UrrData, Nuclide use constants use endf, only: reaction_name - use geometry_header, only: Cell, Surface, Universe, Lattice, RectLattice, & + use geometry_header, only: Cell, Universe, Lattice, RectLattice, & &HexLattice use global use hdf5_interface use material_header, only: Material use mesh_header, only: RegularMesh use output, only: time_stamp + use surface_header use string, only: to_str use tally_header, only: TallyObject @@ -112,8 +113,9 @@ contains integer(HID_T) :: surfaces_group, surface_group integer(HID_T) :: universes_group, univ_group integer(HID_T) :: lattices_group, lattice_group + real(8), allocatable :: coeffs(:) type(Cell), pointer :: c - type(Surface), pointer :: s + class(Surface2), pointer :: s type(Universe), pointer :: u class(Lattice), pointer :: lat @@ -178,7 +180,7 @@ contains allocate(surface_ids(c%n_surfaces)) do j = 1, c%n_surfaces k = c%surfaces(j) - surface_ids(j) = sign(surfaces(abs(k))%id, k) + surface_ids(j) = sign(surfaces_c(abs(k))%obj%id, k) end do call write_dataset(cell_group, "surfaces", surface_ids) deallocate(surface_ids) @@ -197,7 +199,7 @@ contains ! Write information on each surface SURFACE_LOOP: do i = 1, n_surfaces - s => surfaces(i) + s => surfaces_c(i)%obj surface_group = create_group(surfaces_group, "surface " // & trim(to_str(s%id))) @@ -208,33 +210,65 @@ contains call write_dataset(surface_group, "name", s%name) ! Write surface type - select case (s%type) - case (SURF_PX) + select type (s) + type is (SurfaceXPlane) call write_dataset(surface_group, "type", "x-plane") - case (SURF_PY) - call write_dataset(surface_group, "type", "y-plane") - case (SURF_PZ) - call write_dataset(surface_group, "type", "z-plane") - case (SURF_PLANE) - call write_dataset(surface_group, "type", "plane") - case (SURF_CYL_X) - call write_dataset(surface_group, "type", "x-cylinder") - case (SURF_CYL_Y) - call write_dataset(surface_group, "type", "y-cylinder") - case (SURF_CYL_Z) - call write_dataset(surface_group, "type", "z-cylinder") - case (SURF_SPHERE) - call write_dataset(surface_group, "type", "sphere") - case (SURF_CONE_X) - call write_dataset(surface_group, "type", "x-cone") - case (SURF_CONE_Y) - call write_dataset(surface_group, "type", "y-cone") - case (SURF_CONE_Z) - call write_dataset(surface_group, "type", "z-cone") - end select + allocate(coeffs(1)) + coeffs(1) = s%x0 - ! Write coefficients for surface - call write_dataset(surface_group, "coefficients", s%coeffs) + type is (SurfaceYPlane) + call write_dataset(surface_group, "type", "y-plane") + allocate(coeffs(1)) + coeffs(1) = s%y0 + + type is (SurfaceZPlane) + call write_dataset(surface_group, "type", "z-plane") + allocate(coeffs(1)) + coeffs(1) = s%z0 + + type is (SurfacePlane) + call write_dataset(surface_group, "type", "plane") + allocate(coeffs(4)) + coeffs(:) = [s%A, s%B, s%C, s%D] + + type is (SurfaceXCylinder) + call write_dataset(surface_group, "type", "x-cylinder") + allocate(coeffs(3)) + coeffs(:) = [s%y0, s%z0, s%r] + + type is (SurfaceYCylinder) + call write_dataset(surface_group, "type", "y-cylinder") + allocate(coeffs(3)) + coeffs(:) = [s%x0, s%z0, s%r] + + type is (SurfaceZCylinder) + call write_dataset(surface_group, "type", "z-cylinder") + allocate(coeffs(3)) + coeffs(:) = [s%x0, s%y0, s%r] + + type is (SurfaceSphere) + call write_dataset(surface_group, "type", "sphere") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r] + + type is (SurfaceXCone) + call write_dataset(surface_group, "type", "x-cone") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + + type is (SurfaceYCone) + call write_dataset(surface_group, "type", "y-cone") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + + type is (SurfaceZCone) + call write_dataset(surface_group, "type", "z-cone") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + + end select + call write_dataset(surface_group, "coefficients", coeffs) + deallocate(coeffs) ! Write boundary condition select case (s%bc) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index c4a1a921f1..2f02278d9f 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -4,12 +4,18 @@ module surface_header implicit none +!=============================================================================== +! SURFACE type defines a first- or second-order surface that can be used to +! construct closed volumes (cells) +!=============================================================================== + type, abstract :: Surface2 integer :: id ! Unique ID integer, allocatable :: & neighbor_pos(:), & ! List of cells on positive side neighbor_neg(:) ! List of cells on negative side integer :: bc ! Boundary condition + character(len=52) :: name = "" ! User-defined name contains procedure(iEvaluate), deferred :: evaluate procedure(iDistance), deferred :: distance From 01c934be918680ffaa4f447099a6e09913c451b1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 09:21:08 +0700 Subject: [PATCH 168/519] Renamed Surface2 and surfaces_c to Surface and surfaces --- src/geometry.F90 | 20 +++---- src/global.F90 | 14 ++--- src/input_xml.F90 | 115 +++++++++++++++++++++-------------------- src/output.F90 | 4 +- src/summary.F90 | 6 +-- src/surface_header.F90 | 44 ++++++++-------- 6 files changed, 103 insertions(+), 100 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 944ca6a8d2..8639ede581 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -47,7 +47,7 @@ contains ! Determine the specified sense of the surface in the cell and the actual ! sense of the particle with respect to the surface - actual_sense = sense(p, surfaces_c(abs(i_surface))%obj) + actual_sense = sense(p, surfaces(abs(i_surface))%obj) specified_sense = (c % surfaces(i) > 0) ! Compare sense of point to specified sense @@ -278,10 +278,10 @@ contains real(8) :: norm ! "norm" of surface normal integer :: i_surface ! index in surfaces logical :: found ! particle found in universe? - class(Surface2), pointer :: surf + class(Surface), pointer :: surf i_surface = abs(p % surface) - surf => surfaces_c(i_surface)%obj + surf => surfaces(i_surface)%obj if (verbosity >= 10 .or. trace) then call write_message(" Crossing surface " // trim(to_str(surf % id))) end if @@ -529,7 +529,7 @@ contains real(8) :: x0,y0,z0 ! coefficients for surface logical :: coincident ! is particle on surface? type(Cell), pointer :: cl - class(Surface2), pointer :: surf + class(Surface), pointer :: surf class(Lattice), pointer :: lat ! inialize distance to infinity (huge) @@ -564,7 +564,7 @@ contains if (index_surf >= OP_DIFFERENCE) cycle ! Calculate distance to surface - surf => surfaces_c(index_surf)%obj + surf => surfaces(index_surf)%obj d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw, coincident) ! Check is calculated distance is new minimum @@ -802,7 +802,7 @@ contains recursive function sense(p, surf) result(s) type(Particle), intent(inout) :: p - class(Surface2), intent(in) :: surf ! surface + class(Surface), intent(in) :: surf ! surface logical :: s ! sense of particle integer :: j @@ -870,10 +870,10 @@ contains ! allocate neighbor lists for each surface do i = 1, n_surfaces if (count_positive(i) > 0) then - allocate(surfaces_c(i)%obj%neighbor_pos(count_positive(i))) + allocate(surfaces(i)%obj%neighbor_pos(count_positive(i))) end if if (count_negative(i) > 0) then - allocate(surfaces_c(i)%obj%neighbor_neg(count_negative(i))) + allocate(surfaces(i)%obj%neighbor_neg(count_negative(i))) end if end do @@ -892,10 +892,10 @@ contains if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 - surfaces_c(i_surface)%obj%neighbor_pos(count_positive(i_surface)) = i + surfaces(i_surface)%obj%neighbor_pos(count_positive(i_surface)) = i else count_negative(i_surface) = count_negative(i_surface) + 1 - surfaces_c(i_surface)%obj%neighbor_neg(count_negative(i_surface)) = i + surfaces(i_surface)%obj%neighbor_neg(count_negative(i_surface)) = i end if end do end do diff --git a/src/global.F90 b/src/global.F90 index 44e470005b..87d7278296 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -28,12 +28,12 @@ module global ! GEOMETRY-RELATED VARIABLES ! Main arrays - type(Cell), allocatable, target :: cells(:) - type(Universe), allocatable, target :: universes(:) - type(LatticeContainer), allocatable, target :: lattices(:) - type(SurfaceContainer), allocatable, target :: surfaces_c(:) - type(Material), allocatable, target :: materials(:) - type(ObjectPlot), allocatable, target :: plots(:) + type(Cell), allocatable, target :: cells(:) + type(Universe), allocatable, target :: universes(:) + type(LatticeContainer), allocatable, target :: lattices(:) + type(SurfaceContainer), allocatable, target :: surfaces(:) + type(Material), allocatable, target :: materials(:) + type(ObjectPlot), allocatable, target :: plots(:) ! Size of main arrays integer :: n_cells ! # of cells @@ -419,7 +419,7 @@ contains if (allocated(cells)) deallocate(cells) if (allocated(universes)) deallocate(universes) if (allocated(lattices)) deallocate(lattices) - if (allocated(surfaces_c)) deallocate(surfaces_c) + if (allocated(surfaces)) deallocate(surfaces) if (allocated(materials)) deallocate(materials) if (allocated(plots)) deallocate(plots) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index ed9ae67c7b..308bdc66b0 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -994,6 +994,7 @@ contains character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word type(Cell), pointer :: c + class(Surface), pointer :: s class(Lattice), pointer :: lat type(Node), pointer :: doc => null() type(Node), pointer :: node_cell => null() @@ -1220,7 +1221,7 @@ contains end if ! Allocate cells array - allocate(surfaces_c(n_surfaces)) + allocate(surfaces(n_surfaces)) do i = 1, n_surfaces ! Get pointer to i-th surface node @@ -1233,57 +1234,59 @@ contains select case(to_lower(word)) case ('x-plane') coeffs_reqd = 1 - allocate(SurfaceXPlane :: surfaces_c(i)%obj) + allocate(SurfaceXPlane :: surfaces(i)%obj) case ('y-plane') coeffs_reqd = 1 - allocate(SurfaceYPlane :: surfaces_c(i)%obj) + allocate(SurfaceYPlane :: surfaces(i)%obj) case ('z-plane') coeffs_reqd = 1 - allocate(SurfaceZPlane :: surfaces_c(i)%obj) + allocate(SurfaceZPlane :: surfaces(i)%obj) case ('plane') coeffs_reqd = 4 - allocate(SurfacePlane :: surfaces_c(i)%obj) + allocate(SurfacePlane :: surfaces(i)%obj) case ('x-cylinder') coeffs_reqd = 3 - allocate(SurfaceXCylinder :: surfaces_c(i)%obj) + allocate(SurfaceXCylinder :: surfaces(i)%obj) case ('y-cylinder') coeffs_reqd = 3 - allocate(SurfaceYCylinder :: surfaces_c(i)%obj) + allocate(SurfaceYCylinder :: surfaces(i)%obj) case ('z-cylinder') coeffs_reqd = 3 - allocate(SurfaceZCylinder :: surfaces_c(i)%obj) + allocate(SurfaceZCylinder :: surfaces(i)%obj) case ('sphere') coeffs_reqd = 4 - allocate(SurfaceSphere :: surfaces_c(i)%obj) + allocate(SurfaceSphere :: surfaces(i)%obj) case ('x-cone') coeffs_reqd = 4 - allocate(SurfaceXCone :: surfaces_c(i)%obj) + allocate(SurfaceXCone :: surfaces(i)%obj) case ('y-cone') coeffs_reqd = 4 - allocate(SurfaceYCone :: surfaces_c(i)%obj) + allocate(SurfaceYCone :: surfaces(i)%obj) case ('z-cone') coeffs_reqd = 4 - allocate(SurfaceZCone :: surfaces_c(i)%obj) + allocate(SurfaceZCone :: surfaces(i)%obj) case default call fatal_error("Invalid surface type: " // trim(word)) end select + s => surfaces(i)%obj + ! Copy data into cells if (check_for_node(node_surf, "id")) then - call get_node_value(node_surf, "id", surfaces_c(i)%obj%id) + call get_node_value(node_surf, "id", s%id) else call fatal_error("Must specify id of surface in geometry XML file.") end if ! Check to make sure 'id' hasn't been used - if (surface_dict % has_key(surfaces_c(i)%obj%id)) then + if (surface_dict % has_key(s%id)) then call fatal_error("Two or more surfaces use the same unique ID: " & - &// to_str(surfaces_c(i)%obj%id)) + &// to_str(s%id)) end if ! Copy surface name if (check_for_node(node_surf, "name")) then - call get_node_value(node_surf, "name", surfaces_c(i)%obj%name) + call get_node_value(node_surf, "name", s%name) end if ! Check to make sure that the proper number of coefficients @@ -1293,59 +1296,59 @@ contains n = get_arraysize_double(node_surf, "coeffs") if (n < coeffs_reqd) then call fatal_error("Not enough coefficients specified for surface: " & - &// trim(to_str(surfaces_c(i)%obj%id))) + &// trim(to_str(s%id))) elseif (n > coeffs_reqd) then call fatal_error("Too many coefficients specified for surface: " & - &// trim(to_str(surfaces_c(i)%obj%id))) + &// trim(to_str(s%id))) end if allocate(coeffs(n)) call get_node_array(node_surf, "coeffs", coeffs) - select type(sp => surfaces_c(i)%obj) + select type(s) type is (SurfaceXPlane) - sp%x0 = coeffs(1) + s%x0 = coeffs(1) type is (SurfaceYPlane) - sp%y0 = coeffs(1) + s%y0 = coeffs(1) type is (SurfaceZPlane) - sp%z0 = coeffs(1) + s%z0 = coeffs(1) type is (SurfacePlane) - sp%A = coeffs(1) - sp%B = coeffs(2) - sp%C = coeffs(3) - sp%D = coeffs(4) + s%A = coeffs(1) + s%B = coeffs(2) + s%C = coeffs(3) + s%D = coeffs(4) type is (SurfaceXCylinder) - sp%y0 = coeffs(1) - sp%z0 = coeffs(2) - sp%r = coeffs(3) + s%y0 = coeffs(1) + s%z0 = coeffs(2) + s%r = coeffs(3) type is (SurfaceYCylinder) - sp%x0 = coeffs(1) - sp%z0 = coeffs(2) - sp%r = coeffs(3) + s%x0 = coeffs(1) + s%z0 = coeffs(2) + s%r = coeffs(3) type is (SurfaceZCylinder) - sp%x0 = coeffs(1) - sp%y0 = coeffs(2) - sp%r = coeffs(3) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%r = coeffs(3) type is (SurfaceSphere) - sp%x0 = coeffs(1) - sp%y0 = coeffs(2) - sp%z0 = coeffs(3) - sp%r = coeffs(4) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r = coeffs(4) type is (SurfaceXCone) - sp%x0 = coeffs(1) - sp%y0 = coeffs(2) - sp%z0 = coeffs(3) - sp%r2 = coeffs(4) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r2 = coeffs(4) type is (SurfaceYCone) - sp%x0 = coeffs(1) - sp%y0 = coeffs(2) - sp%z0 = coeffs(3) - sp%r2 = coeffs(4) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r2 = coeffs(4) type is (SurfaceZCone) - sp%x0 = coeffs(1) - sp%y0 = coeffs(2) - sp%z0 = coeffs(3) - sp%r2 = coeffs(4) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r2 = coeffs(4) end select ! No longer need coefficients @@ -1357,20 +1360,20 @@ contains call get_node_value(node_surf, "boundary", word) select case (to_lower(word)) case ('transmission', 'transmit', '') - surfaces_c(i)%obj%bc = BC_TRANSMIT + s%bc = BC_TRANSMIT case ('vacuum') - surfaces_c(i)%obj%bc = BC_VACUUM + s%bc = BC_VACUUM boundary_exists = .true. case ('reflective', 'reflect', 'reflecting') - surfaces_c(i)%obj%bc = BC_REFLECT + s%bc = BC_REFLECT boundary_exists = .true. case default call fatal_error("Unknown boundary condition '" // trim(word) // & - &"' specified on surface " // trim(to_str(surfaces_c(i)%obj%id))) + &"' specified on surface " // trim(to_str(s%id))) end select ! Add surface to dictionary - call surface_dict % add_key(surfaces_c(i)%obj%id, i) + call surface_dict % add_key(s%id, i) end do ! Check to make sure a boundary condition was applied to at least one diff --git a/src/output.F90 b/src/output.F90 index 5e1d7120b0..c88f3bd79e 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -303,7 +303,7 @@ contains ! Print surface if (p % surface /= NONE) then - write(ou,*) ' Surface = ' // to_str(sign(surfaces_c(i)%obj%id, p % surface)) + write(ou,*) ' Surface = ' // to_str(sign(surfaces(i)%obj%id, p % surface)) end if ! Display weight, energy, grid index, and interpolation factor @@ -1383,7 +1383,7 @@ contains univ, bin-1, offset, label) case (FILTER_SURFACE) i = t % filters(i_filter) % int_bins(bin) - label = to_str(surfaces_c(i)%obj%id) + label = to_str(surfaces(i)%obj%id) case (FILTER_MESH) m => meshes(t % filters(i_filter) % int_bins(1)) allocate(ijk(m % n_dimension)) diff --git a/src/summary.F90 b/src/summary.F90 index ad5a3c8b95..587f00b6b7 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -115,7 +115,7 @@ contains integer(HID_T) :: lattices_group, lattice_group real(8), allocatable :: coeffs(:) type(Cell), pointer :: c - class(Surface2), pointer :: s + class(Surface), pointer :: s type(Universe), pointer :: u class(Lattice), pointer :: lat @@ -180,7 +180,7 @@ contains allocate(surface_ids(c%n_surfaces)) do j = 1, c%n_surfaces k = c%surfaces(j) - surface_ids(j) = sign(surfaces_c(abs(k))%obj%id, k) + surface_ids(j) = sign(surfaces(abs(k))%obj%id, k) end do call write_dataset(cell_group, "surfaces", surface_ids) deallocate(surface_ids) @@ -199,7 +199,7 @@ contains ! Write information on each surface SURFACE_LOOP: do i = 1, n_surfaces - s => surfaces_c(i)%obj + s => surfaces(i)%obj surface_group = create_group(surfaces_group, "surface " // & trim(to_str(s%id))) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 2f02278d9f..43b6c58322 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -9,7 +9,7 @@ module surface_header ! construct closed volumes (cells) !=============================================================================== - type, abstract :: Surface2 + type, abstract :: Surface integer :: id ! Unique ID integer, allocatable :: & neighbor_pos(:), & ! List of cells on positive side @@ -21,13 +21,13 @@ module surface_header procedure(iDistance), deferred :: distance procedure(iReflect), deferred :: reflect procedure(iNormal), deferred :: normal - end type Surface2 + end type Surface type :: SurfaceContainer - class(Surface2), allocatable :: obj + class(Surface), allocatable :: obj end type SurfaceContainer - type, extends(Surface2) :: SurfaceXPlane + type, extends(Surface) :: SurfaceXPlane ! x = x0 real(8) :: x0 contains @@ -37,7 +37,7 @@ module surface_header procedure :: normal => x_plane_normal end type SurfaceXPlane - type, extends(Surface2) :: SurfaceYPlane + type, extends(Surface) :: SurfaceYPlane ! y = y0 real(8) :: y0 contains @@ -47,7 +47,7 @@ module surface_header procedure :: normal => y_plane_normal end type SurfaceYPlane - type, extends(Surface2) :: SurfaceZPlane + type, extends(Surface) :: SurfaceZPlane ! z = z0 real(8) :: z0 contains @@ -57,7 +57,7 @@ module surface_header procedure :: normal => z_plane_normal end type SurfaceZPlane - type, extends(Surface2) :: SurfacePlane + type, extends(Surface) :: SurfacePlane ! Ax + By + Cz = D real(8) :: A real(8) :: B @@ -70,7 +70,7 @@ module surface_header procedure :: normal => plane_normal end type SurfacePlane - type, extends(Surface2) :: SurfaceXCylinder + type, extends(Surface) :: SurfaceXCylinder ! (y - y0)^2 + (z - z0)^2 = R^2 real(8) :: y0 real(8) :: z0 @@ -82,7 +82,7 @@ module surface_header procedure :: normal => x_cylinder_normal end type SurfaceXCylinder - type, extends(Surface2) :: SurfaceYCylinder + type, extends(Surface) :: SurfaceYCylinder ! (x - x0)^2 + (z - z0)^2 = R^2 real(8) :: x0 real(8) :: z0 @@ -94,7 +94,7 @@ module surface_header procedure :: normal => y_cylinder_normal end type SurfaceYCylinder - type, extends(Surface2) :: SurfaceZCylinder + type, extends(Surface) :: SurfaceZCylinder ! (x - x0)^2 + (y - y0)^2 = R^2 real(8) :: x0 real(8) :: y0 @@ -106,7 +106,7 @@ module surface_header procedure :: normal => z_cylinder_normal end type SurfaceZCylinder - type, extends(Surface2) :: SurfaceSphere + type, extends(Surface) :: SurfaceSphere ! (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = R^2 real(8) :: x0 real(8) :: y0 @@ -119,7 +119,7 @@ module surface_header procedure :: normal => sphere_normal end type SurfaceSphere - type, extends(Surface2) :: SurfaceXCone + type, extends(Surface) :: SurfaceXCone ! (y - y0)^2 + (z - z0)^2 = R^2*(x - x0)^2 real(8) :: x0 real(8) :: y0 @@ -132,7 +132,7 @@ module surface_header procedure :: normal => x_cone_normal end type SurfaceXCone - type, extends(Surface2) :: SurfaceYCone + type, extends(Surface) :: SurfaceYCone ! (x - x0)^2 + (z - z0)^2 = R^2*(y - y0)^2 real(8) :: x0 real(8) :: y0 @@ -145,7 +145,7 @@ module surface_header procedure :: normal => y_cone_normal end type SurfaceYCone - type, extends(Surface2) :: SurfaceZCone + type, extends(Surface) :: SurfaceZCone ! (x - x0)^2 + (y - y0)^2 = R^2*(z - z0)^2 real(8) :: x0 real(8) :: y0 @@ -160,15 +160,15 @@ module surface_header abstract interface pure function iEvaluate(this, xyz) result(f) - import Surface2 - class(Surface2), intent(in) :: this + import Surface + class(Surface), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: f end function iEvaluate pure function iDistance(this, xyz, uvw, coincident) result(d) - import Surface2 - class(Surface2), intent(in) :: this + import Surface + class(Surface), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) logical, intent(in) :: coincident @@ -176,15 +176,15 @@ module surface_header end function iDistance subroutine iReflect(this, xyz, uvw) - import Surface2 - class(Surface2), intent(in) :: this + import Surface + class(Surface), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) end subroutine iReflect pure function iNormal(this, xyz) result(uvw) - import Surface2 - class(Surface2), intent(in) :: this + import Surface + class(Surface), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: uvw(3) end function iNormal From bdf929c5214ccd3eaedec55c3dd0b21da86e08e9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 09:35:06 +0700 Subject: [PATCH 169/519] Make sense() a bound procedure of type(Surface) --- src/geometry.F90 | 38 +++----------------------------------- src/surface_header.F90 | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 8639ede581..62afc3fb3b 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -30,6 +30,7 @@ contains integer :: i_surface ! index in surfaces array (with sign) logical :: specified_sense ! specified sense of surface in list logical :: actual_sense ! sense of particle wrt surface + class(Surface), pointer :: s SURFACE_LOOP: do i = 1, c % n_surfaces ! Lookup surface @@ -47,7 +48,8 @@ contains ! Determine the specified sense of the surface in the cell and the actual ! sense of the particle with respect to the surface - actual_sense = sense(p, surfaces(abs(i_surface))%obj) + s => surfaces(abs(i_surface))%obj + actual_sense = s%sense(p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) specified_sense = (c % surfaces(i) > 0) ! Compare sense of point to specified sense @@ -794,40 +796,6 @@ contains end subroutine distance_to_boundary -!=============================================================================== -! SENSE determines whether a point is on the 'positive' or 'negative' side of a -! surface. This routine is crucial for determining what cell a particular point -! is in. -!=============================================================================== - - recursive function sense(p, surf) result(s) - type(Particle), intent(inout) :: p - class(Surface), intent(in) :: surf ! surface - logical :: s ! sense of particle - - integer :: j - real(8) :: func ! surface function evaluated at point - - j = p%n_coord - - ! Evaluate the surface equation at the particle's coordinates to determine - ! which side the particle is on - func = surf%evaluate(p%coord(j)%xyz) - - ! Check which side of surface the point is on - if (abs(func) < FP_COINCIDENT) then - ! Particle may be coincident with this surface. Artifically move the - ! particle forward a tiny bit. - p%coord(j)%xyz = p%coord(j)%xyz + TINY_BIT * p%coord(j)%uvw - s = sense(p, surf) - elseif (func > 0) then - s = .true. - else - s = .false. - end if - - end function sense - !=============================================================================== ! NEIGHBOR_LISTS builds a list of neighboring cells to each surface to speed up ! searches when a cell boundary is crossed. diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 43b6c58322..9ba0e0d01a 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -1,6 +1,6 @@ module surface_header - use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT + use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT, TINY_BIT implicit none @@ -17,6 +17,7 @@ module surface_header integer :: bc ! Boundary condition character(len=52) :: name = "" ! User-defined name contains + procedure :: sense procedure(iEvaluate), deferred :: evaluate procedure(iDistance), deferred :: distance procedure(iReflect), deferred :: reflect @@ -192,6 +193,38 @@ module surface_header contains +!=============================================================================== +! SENSE determines whether a point is on the 'positive' or 'negative' side of a +! surface. This routine is crucial for determining what cell a particular point +! is in. +!=============================================================================== + + recursive function sense(this, xyz, uvw) result(s) + class(Surface), intent(in) :: this ! surface + real(8), intent(inout) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical :: s ! sense of particle + + real(8) :: f ! surface function evaluated at point + + ! Evaluate the surface equation at the particle's coordinates to determine + ! which side the particle is on + f = this%evaluate(xyz) + + ! Check which side of surface the point is on + if (abs(f) < FP_COINCIDENT) then + ! Particle may be coincident with this surface. Artifically move the + ! particle forward a tiny bit. + xyz(:) = xyz + TINY_BIT * uvw + s = this%sense(xyz, uvw) + elseif (f > 0) then + s = .true. + else + s = .false. + end if + + end function sense + !=============================================================================== ! SurfaceXPlane Implementation !=============================================================================== From cde3d7a00ad894aefe5e82f1e3a3c11da75c55b9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 24 Sep 2015 21:26:22 +0700 Subject: [PATCH 170/519] Make reflect(...) a bound procedure of Surface directly. This obviates the need to have an implementation of reflect(...) for each surface. As long as the surface has a defined normal vector, it can be used to reflect a particle off the surface. --- src/surface_header.F90 | 213 ++---------------- tests/test_reflective_sphere/results_true.dat | 2 +- 2 files changed, 26 insertions(+), 189 deletions(-) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 9ba0e0d01a..402e028ea1 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -18,9 +18,9 @@ module surface_header character(len=52) :: name = "" ! User-defined name contains procedure :: sense + procedure :: reflect procedure(iEvaluate), deferred :: evaluate procedure(iDistance), deferred :: distance - procedure(iReflect), deferred :: reflect procedure(iNormal), deferred :: normal end type Surface @@ -33,7 +33,6 @@ module surface_header real(8) :: x0 contains procedure :: evaluate => x_plane_evaluate - procedure :: reflect => x_plane_reflect procedure :: distance => x_plane_distance procedure :: normal => x_plane_normal end type SurfaceXPlane @@ -43,7 +42,6 @@ module surface_header real(8) :: y0 contains procedure :: evaluate => y_plane_evaluate - procedure :: reflect => y_plane_reflect procedure :: distance => y_plane_distance procedure :: normal => y_plane_normal end type SurfaceYPlane @@ -53,7 +51,6 @@ module surface_header real(8) :: z0 contains procedure :: evaluate => z_plane_evaluate - procedure :: reflect => z_plane_reflect procedure :: distance => z_plane_distance procedure :: normal => z_plane_normal end type SurfaceZPlane @@ -66,7 +63,6 @@ module surface_header real(8) :: D contains procedure :: evaluate => plane_evaluate - procedure :: reflect => plane_reflect procedure :: distance => plane_distance procedure :: normal => plane_normal end type SurfacePlane @@ -78,7 +74,6 @@ module surface_header real(8) :: r contains procedure :: evaluate => x_cylinder_evaluate - procedure :: reflect => x_cylinder_reflect procedure :: distance => x_cylinder_distance procedure :: normal => x_cylinder_normal end type SurfaceXCylinder @@ -90,7 +85,6 @@ module surface_header real(8) :: r contains procedure :: evaluate => y_cylinder_evaluate - procedure :: reflect => y_cylinder_reflect procedure :: distance => y_cylinder_distance procedure :: normal => y_cylinder_normal end type SurfaceYCylinder @@ -102,7 +96,6 @@ module surface_header real(8) :: r contains procedure :: evaluate => z_cylinder_evaluate - procedure :: reflect => z_cylinder_reflect procedure :: distance => z_cylinder_distance procedure :: normal => z_cylinder_normal end type SurfaceZCylinder @@ -115,7 +108,6 @@ module surface_header real(8) :: r contains procedure :: evaluate => sphere_evaluate - procedure :: reflect => sphere_reflect procedure :: distance => sphere_distance procedure :: normal => sphere_normal end type SurfaceSphere @@ -128,7 +120,6 @@ module surface_header real(8) :: r2 contains procedure :: evaluate => x_cone_evaluate - procedure :: reflect => x_cone_reflect procedure :: distance => x_cone_distance procedure :: normal => x_cone_normal end type SurfaceXCone @@ -141,7 +132,6 @@ module surface_header real(8) :: r2 contains procedure :: evaluate => y_cone_evaluate - procedure :: reflect => y_cone_reflect procedure :: distance => y_cone_distance procedure :: normal => y_cone_normal end type SurfaceYCone @@ -154,7 +144,6 @@ module surface_header real(8) :: r2 contains procedure :: evaluate => z_cone_evaluate - procedure :: reflect => z_cone_reflect procedure :: distance => z_cone_distance procedure :: normal => z_cone_normal end type SurfaceZCone @@ -176,13 +165,6 @@ module surface_header real(8) :: d end function iDistance - subroutine iReflect(this, xyz, uvw) - import Surface - class(Surface), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - end subroutine iReflect - pure function iNormal(this, xyz) result(uvw) import Surface class(Surface), intent(in) :: this @@ -225,6 +207,27 @@ contains end function sense + subroutine reflect(this, xyz, uvw) + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: projection + real(8) :: magnitude + real(8) :: n(3) + + ! Construct normal vector + n(:) = this%normal(xyz) + + ! Determine projection of direction onto normal and squared magnitude of + ! normal + projection = n(1)*uvw(1) + n(2)*uvw(2) + n(3)*uvw(3) + magnitude = n(1)*n(1) + n(2)*n(2) + n(3)*n(3) + + ! Reflect direction according to normal + uvw(:) = uvw - TWO*projection/magnitude * n + end subroutine reflect + !=============================================================================== ! SurfaceXPlane Implementation !=============================================================================== @@ -255,20 +258,12 @@ contains end if end function x_plane_distance - subroutine x_plane_reflect(this, xyz, uvw) - class(SurfaceXPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - uvw(1) = -uvw(1) - end subroutine x_plane_reflect - pure function x_plane_normal(this, xyz) result(uvw) class(SurfaceXPlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: uvw(3) - uvw(:) = [1, 0, 0] + uvw(:) = [ONE, ZERO, ZERO] end function x_plane_normal !=============================================================================== @@ -301,20 +296,12 @@ contains end if end function y_plane_distance - subroutine y_plane_reflect(this, xyz, uvw) - class(SurfaceYPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - uvw(2) = -uvw(2) - end subroutine y_plane_reflect - pure function y_plane_normal(this, xyz) result(uvw) class(SurfaceYPlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: uvw(3) - uvw(:) = [0, 1, 0] + uvw(:) = [ZERO, ONE, ZERO] end function y_plane_normal !=============================================================================== @@ -349,20 +336,12 @@ contains end if end function z_plane_distance - subroutine z_plane_reflect(this, xyz, uvw) - class(SurfaceZPlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - uvw(3) = -uvw(3) - end subroutine z_plane_reflect - pure function z_plane_normal(this, xyz) result(uvw) class(SurfaceZPlane), intent(in) :: this real(8), intent(in) :: xyz(3) real(8) :: uvw(3) - uvw(:) = [0, 0, 1] + uvw(:) = [ZERO, ZERO, ONE] end function z_plane_normal !=============================================================================== @@ -397,20 +376,6 @@ contains end if end function plane_distance - subroutine plane_reflect(this, xyz, uvw) - class(SurfacePlane), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: n(3) - - ! Construct normal vector - n(:) = [this%A, this%B, this%C] - - ! Reflect direction according to normal - uvw = uvw - TWO*dot_product(n, uvw)/dot_product(n, n) * n - end subroutine plane_reflect - pure function plane_normal(this, xyz) result(uvw) class(SurfacePlane), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -489,23 +454,6 @@ contains end if end function x_cylinder_distance - subroutine x_cylinder_reflect(this, xyz, uvw) - class(SurfaceXCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: y, z, dot_prod - - ! Find y-y0, z-z0 and dot product of direction and surface normal - y = xyz(2) - this%y0 - z = xyz(3) - this%z0 - dot_prod = uvw(2)*y + uvw(3)*z - - ! Reflect direction according to normal - uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) - uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) - end subroutine x_cylinder_reflect - pure function x_cylinder_normal(this, xyz) result(uvw) class(SurfaceXCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -586,23 +534,6 @@ contains end if end function y_cylinder_distance - subroutine y_cylinder_reflect(this, xyz, uvw) - class(SurfaceYCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: x, z, dot_prod - - ! Find x-x0, z-z0 and dot product of direction and surface normal - x = xyz(1) - this%x0 - z = xyz(3) - this%z0 - dot_prod = uvw(1)*x + uvw(3)*z - - ! Reflect direction according to normal - uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) - uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) - end subroutine y_cylinder_reflect - pure function y_cylinder_normal(this, xyz) result(uvw) class(SurfaceYCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -683,23 +614,6 @@ contains end if end function z_cylinder_distance - subroutine z_cylinder_reflect(this, xyz, uvw) - class(SurfaceZCylinder), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: x, y, dot_prod - - ! Find x-x0, y-y0 and dot product of direction and surface normal - x = xyz(1) - this%x0 - y = xyz(2) - this%y0 - dot_prod = uvw(1)*x + uvw(2)*y - - ! Reflect direction according to normal - uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) - uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) - end subroutine z_cylinder_reflect - pure function z_cylinder_normal(this, xyz) result(uvw) class(SurfaceZCylinder), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -776,23 +690,6 @@ contains end if end function sphere_distance - subroutine sphere_reflect(this, xyz, uvw) - class(SurfaceSphere), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: x, y, z, dot_prod - - x = xyz(1) - this%x0 - y = xyz(2) - this%y0 - z = xyz(3) - this%z0 - dot_prod = uvw(1)*x + uvw(2)*y + uvw(3)*z - - uvw(1) = uvw(1) - TWO*dot_prod*x/(this%r*this%r) - uvw(2) = uvw(2) - TWO*dot_prod*y/(this%r*this%r) - uvw(3) = uvw(3) - TWO*dot_prod*z/(this%r*this%r) - end subroutine sphere_reflect - pure function sphere_normal(this, xyz) result(uvw) class(SurfaceSphere), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -871,26 +768,6 @@ contains if (d <= ZERO) d = INFINITY end function x_cone_distance - subroutine x_cone_reflect(this, xyz, uvw) - class(SurfaceXCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: x, y, z, r, dot_prod - - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface normal - x = xyz(1) - this%x0 - y = xyz(2) - this%y0 - z = xyz(3) - this%z0 - r = this%r2 - dot_prod = (uvw(2)*y + uvw(3)*z - r*uvw(1)*x)/((r + ONE)*r*x*x) - - ! Reflect direction according to normal - uvw(1) = uvw(1) + TWO*dot_prod*r*x - uvw(2) = uvw(2) - TWO*dot_prod*y - uvw(3) = uvw(3) - TWO*dot_prod*z - end subroutine x_cone_reflect - pure function x_cone_normal(this, xyz) result(uvw) class(SurfaceXCone), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -971,26 +848,6 @@ contains if (d <= ZERO) d = INFINITY end function y_cone_distance - subroutine y_cone_reflect(this, xyz, uvw) - class(SurfaceYCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: x, y, z, r, dot_prod - - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface normal - x = xyz(1) - this%x0 - y = xyz(2) - this%y0 - z = xyz(3) - this%z0 - r = this%r2 - dot_prod = (uvw(1)*x + uvw(3)*z - r*uvw(2)*y)/((r + ONE)*r*y*y) - - ! Reflect direction according to normal - uvw(1) = uvw(1) - TWO*dot_prod*x - uvw(2) = uvw(2) + TWO*dot_prod*r*y - uvw(3) = uvw(3) - TWO*dot_prod*z - end subroutine y_cone_reflect - pure function y_cone_normal(this, xyz) result(uvw) class(SurfaceYCone), intent(in) :: this real(8), intent(in) :: xyz(3) @@ -1071,26 +928,6 @@ contains if (d <= ZERO) d = INFINITY end function z_cone_distance - subroutine z_cone_reflect(this, xyz, uvw) - class(SurfaceZCone), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(inout) :: uvw(3) - - real(8) :: x, y, z, r, dot_prod - - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface normal - x = xyz(1) - this%x0 - y = xyz(2) - this%y0 - z = xyz(3) - this%z0 - r = this%r2 - dot_prod = (uvw(1)*x + uvw(2)*y - r*uvw(3)*z)/((r + ONE)*r*z*z) - - ! Reflect direction according to normal - uvw(1) = uvw(1) - TWO*dot_prod*x - uvw(2) = uvw(2) - TWO*dot_prod*y - uvw(3) = uvw(3) + TWO*dot_prod*r*z - end subroutine z_cone_reflect - pure function z_cone_normal(this, xyz) result(uvw) class(SurfaceZCone), intent(in) :: this real(8), intent(in) :: xyz(3) diff --git a/tests/test_reflective_sphere/results_true.dat b/tests/test_reflective_sphere/results_true.dat index f25a72dc95..91dd20fba8 100644 --- a/tests/test_reflective_sphere/results_true.dat +++ b/tests/test_reflective_sphere/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.271012E+00 3.466350E-03 +2.271012E+00 3.466351E-03 From dce591b037e8bd48dc2df907fad729595143d1a5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 12:56:13 +0700 Subject: [PATCH 171/519] Improve check for coincidence in sense(). The previous solution was to move the particle forward artificially and then call sense() recursively. A better way is to look at the projection of the particle's direction on the surface normal from which the sign determines which side the particle will be on when it moves forward. This enables us to make sense() a pure non-recursive function. --- src/surface_header.F90 | 22 ++++++++++------------ tests/test_plot_basis/results_true.dat | 2 +- tests/test_plot_mask/results_true.dat | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 402e028ea1..8941fed725 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -1,6 +1,6 @@ module surface_header - use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT, TINY_BIT + use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT implicit none @@ -178,12 +178,13 @@ contains !=============================================================================== ! SENSE determines whether a point is on the 'positive' or 'negative' side of a ! surface. This routine is crucial for determining what cell a particular point -! is in. +! is in. The positive side is indicated by a returned value of .true. and the +! negative side is indicated by a returned value of .false. !=============================================================================== - recursive function sense(this, xyz, uvw) result(s) + pure function sense(this, xyz, uvw) result(s) class(Surface), intent(in) :: this ! surface - real(8), intent(inout) :: xyz(3) + real(8), intent(in) :: xyz(3) real(8), intent(in) :: uvw(3) logical :: s ! sense of particle @@ -195,16 +196,13 @@ contains ! Check which side of surface the point is on if (abs(f) < FP_COINCIDENT) then - ! Particle may be coincident with this surface. Artifically move the - ! particle forward a tiny bit. - xyz(:) = xyz + TINY_BIT * uvw - s = this%sense(xyz, uvw) - elseif (f > 0) then - s = .true. + ! Particle may be coincident with this surface. To determine the sense, we + ! look at the direction of the particle relative to the surface normal (by + ! default in the positive direction) via their dot product. + s = (dot_product(uvw, this%normal(xyz)) > ZERO) else - s = .false. + s = (f > ZERO) end if - end function sense subroutine reflect(this, xyz, uvw) diff --git a/tests/test_plot_basis/results_true.dat b/tests/test_plot_basis/results_true.dat index ae588fd4f3..b1d5dc8534 100644 --- a/tests/test_plot_basis/results_true.dat +++ b/tests/test_plot_basis/results_true.dat @@ -1 +1 @@ -6a2400a95ea5baee432dd04a85252818d682004dc80b225b99c4bbc7cfd20d8523bd8e5df8a272df288cb2f300e5eee55f7ffa7b4d28ea64f92b78839ab0e86b \ No newline at end of file +368e0135c136d5c8a2dabb4c8085279dc7ac0bd81b2ec905bdf11ecb5fe99803868631cdff0b3ddec941323bcc661747d4c16edfd4f8d38582155bd6fd7e82e8 \ No newline at end of file diff --git a/tests/test_plot_mask/results_true.dat b/tests/test_plot_mask/results_true.dat index 1076324545..a1e323203d 100644 --- a/tests/test_plot_mask/results_true.dat +++ b/tests/test_plot_mask/results_true.dat @@ -1 +1 @@ -d888a734d6e69c5ca92457dc865c4defd8a1d8a1d4a01e0c8e7c528dde25d96df1283da37889dac0857329051958be2f2b491f2fd2bc22c8424a60ec6cda04bd \ No newline at end of file +a7cb65bf40c84c0540d45ff292c398f9ae51b3d9396e88b9b4e5cdf05e8730f409bddb53aec6d396058194c6293c5bd3ef39efd0b0f30f2423f696193c85176c \ No newline at end of file From 6e58fe8a0de23dca0dcdad4d75b552b7928b3d89 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 13:07:54 +0700 Subject: [PATCH 172/519] Added stl_vector module that mimics C++ std::vector --- src/stl_vector.F90 | 319 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 src/stl_vector.F90 diff --git a/src/stl_vector.F90 b/src/stl_vector.F90 new file mode 100644 index 0000000000..f5c11ff37f --- /dev/null +++ b/src/stl_vector.F90 @@ -0,0 +1,319 @@ +module stl_vector + + ! This module provides derived types that are meant to mimic the + ! std::vector type in C++ + + implicit none + private + + real(8), parameter :: GROWTH_FACTOR = 1.5 + + type, public :: VectorInt + integer, private :: size_ = 0 + integer, private :: capacity_ = 0 + integer, allocatable :: data(:) + contains + procedure :: capacity => capacity_int + procedure :: clear => clear_int + generic :: initialize => & + initialize_fill_int + procedure, private :: initialize_fill_int + procedure :: pop_back => pop_back_int + procedure :: push_back => push_back_int + procedure :: reserve => reserve_int + procedure :: resize => resize_int + procedure :: shrink_to_fit => shrink_to_fit_int + procedure :: size => size_int + end type VectorInt + + type, public :: VectorReal + integer, private :: size_ = 0 + integer, private :: capacity_ = 0 + real(8), allocatable :: data(:) + contains + procedure :: capacity => capacity_real + procedure :: clear => clear_real + generic :: initialize => & + initialize_fill_real + procedure, private :: initialize_fill_real + procedure :: pop_back => pop_back_real + procedure :: push_back => push_back_real + procedure :: reserve => reserve_real + procedure :: resize => resize_real + procedure :: shrink_to_fit => shrink_to_fit_real + procedure :: size => size_real + end type VectorReal + +contains + +!=============================================================================== +! Implementation of VectorInt +!=============================================================================== + + pure function capacity_int(this) result(capacity) + class(VectorInt), intent(in) :: this + integer :: capacity + + capacity = this%capacity_ + end function capacity_int + + subroutine clear_int(this) + class(VectorInt), intent(inout) :: this + + ! Since integer is trivially destructible, we only need to set size to zero + ! and can leave capacity as is + this%size_ = 0 + end subroutine clear_int + + subroutine initialize_fill_int(this, n, val) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: n + integer, optional, intent(in) :: val + + integer :: val_ + + ! If no value given, fill the vector with zeros + if (present(val)) then + val_ = val + else + val_ = 0 + end if + + if (allocated(this%data)) deallocate(this%data) + + allocate(this%data(n), SOURCE=val_) + this%size_ = n + this%capacity_ = n + end subroutine initialize_fill_int + + subroutine pop_back_int(this) + class(VectorInt), intent(inout) :: this + if (this%size_ > 0) this%size_ = this%size_ - 1 + end subroutine pop_back_int + + subroutine push_back_int(this, val) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: val + + integer :: capacity + integer, allocatable :: data(:) + + if (this%capacity_ == this%size_) then + ! Create new data array that is GROWTH_FACTOR larger. Note that + if (this%capacity_ == 0) then + capacity = 8 + else + capacity = int(GROWTH_FACTOR*this%capacity_) + end if + allocate(data(capacity)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = capacity + end if + + ! Increase size of vector by one and set new element + this%size_ = this%size_ + 1 + this%data(this%size_) = val + end subroutine push_back_int + + subroutine reserve_int(this, n) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: n + + integer, allocatable :: data(:) + + if (n > this%capacity_) then + allocate(data(n)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data(1:this%size_) + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = n + end if + end subroutine reserve_int + + subroutine resize_int(this, n, val) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: n + integer, intent(in), optional :: val + + if (n < this%size_) then + this%size_ = n + elseif (n > this%size_) then + ! If requested size is greater than capacity, first reserve that many + ! elements + if (n > this%capacity_) call this%reserve(n) + + ! Fill added elements with specified value and increase size + if (present(val)) this%data(this%size_ + 1 : n) = val + this%size_ = n + end if + + end subroutine resize_int + + subroutine shrink_to_fit_int(this) + class(VectorInt), intent(inout) :: this + + integer, allocatable :: data(:) + + if (this%capacity_ > this%size_) then + if (this%size_ > 0) then + allocate(data(this%size_)) + data(:) = this%data(1:this%size_) + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = this%size_ + else + if (allocated(this%data)) deallocate(this%data) + end if + end if + end subroutine shrink_to_fit_int + + pure function size_int(this) result(size) + class(VectorInt), intent(in) :: this + integer :: size + + size = this%size_ + end function size_int + +!=============================================================================== +! Implementation of VectorReal +!=============================================================================== + + pure function capacity_real(this) result(capacity) + class(VectorReal), intent(in) :: this + integer :: capacity + + capacity = this%capacity_ + end function capacity_real + + subroutine clear_real(this) + class(VectorReal), intent(inout) :: this + + ! Since integer is trivially destructible, we only need to set size to zero + ! and can leave capacity as is + this%size_ = 0 + end subroutine clear_real + + subroutine initialize_fill_real(this, n, val) + class(VectorReal), intent(inout) :: this + integer, intent(in) :: n + real(8), optional, intent(in) :: val + + real(8) :: val_ + + ! If no value given, fill the vector with zeros + if (present(val)) then + val_ = val + else + val_ = 0 + end if + + if (allocated(this%data)) deallocate(this%data) + + allocate(this%data(n), SOURCE=val_) + this%size_ = n + this%capacity_ = n + end subroutine initialize_fill_real + + subroutine pop_back_real(this) + class(VectorReal), intent(inout) :: this + if (this%size_ > 0) this%size_ = this%size_ - 1 + end subroutine pop_back_real + + subroutine push_back_real(this, val) + class(VectorReal), intent(inout) :: this + real(8), intent(in) :: val + + integer :: capacity + real(8), allocatable :: data(:) + + if (this%capacity_ == this%size_) then + ! Create new data array that is GROWTH_FACTOR larger. Note that + if (this%capacity_ == 0) then + capacity = 8 + else + capacity = int(GROWTH_FACTOR*this%capacity_) + end if + allocate(data(capacity)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = capacity + end if + + ! Increase size of vector by one and set new element + this%size_ = this%size_ + 1 + this%data(this%size_) = val + end subroutine push_back_real + + subroutine reserve_real(this, n) + class(VectorReal), intent(inout) :: this + integer, intent(in) :: n + + real(8), allocatable :: data(:) + + if (n > this%capacity_) then + allocate(data(n)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data(1:this%size_) + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = n + end if + end subroutine reserve_real + + subroutine resize_real(this, n, val) + class(VectorReal), intent(inout) :: this + integer, intent(in) :: n + real(8), intent(in), optional :: val + + if (n < this%size_) then + this%size_ = n + elseif (n > this%size_) then + ! If requested size is greater than capacity, first reserve that many + ! elements + if (n > this%capacity_) call this%reserve(n) + + ! Fill added elements with specified value and increase size + if (present(val)) this%data(this%size_ + 1 : n) = val + this%size_ = n + end if + + end subroutine resize_real + + subroutine shrink_to_fit_real(this) + class(VectorReal), intent(inout) :: this + + real(8), allocatable :: data(:) + + if (this%capacity_ > this%size_) then + if (this%size_ > 0) then + allocate(data(this%size_)) + data(:) = this%data(1:this%size_) + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = this%size_ + else + if (allocated(this%data)) deallocate(this%data) + end if + end if + end subroutine shrink_to_fit_real + + pure function size_real(this) result(size) + class(VectorReal), intent(in) :: this + integer :: size + + size = this%size_ + end function size_real + +end module stl_vector From da0d13e18c4b6829034d58e2da280455aa9c8463 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Sep 2015 13:12:31 +0700 Subject: [PATCH 173/519] Update constants for surface half-space operators --- src/constants.F90 | 9 +++++---- src/geometry.F90 | 2 +- src/initialize.F90 | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 53891cdaa6..6e14a47ea3 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -87,10 +87,11 @@ module constants ! Logical operators for cell definitions integer, parameter :: & - OP_LEFT_PAREN = huge(0), & ! Left parentheses - OP_RIGHT_PAREN = huge(0) - 1, & ! Right parentheses - OP_UNION = huge(0) - 2, & ! Union operator - OP_DIFFERENCE = huge(0) - 3 ! Difference operator + OP_LEFT_PAREN = huge(0), & ! Left parentheses + OP_RIGHT_PAREN = huge(0) - 1, & ! Right parentheses + OP_COMPLEMENT = huge(0) - 2, & ! Complement operator (~) + OP_INTERSECTION = huge(0) - 3, & ! Intersection operator + OP_UNION = huge(0) - 4 ! Union operator (^) ! Cell types integer, parameter :: & diff --git a/src/geometry.F90 b/src/geometry.F90 index 62afc3fb3b..2cde01e023 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -563,7 +563,7 @@ contains ! check for operators index_surf = abs(index_surf) - if (index_surf >= OP_DIFFERENCE) cycle + if (index_surf >= OP_UNION) cycle ! Calculate distance to surface surf => surfaces(index_surf)%obj diff --git a/src/initialize.F90 b/src/initialize.F90 index 86242c7533..3671a40af7 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -573,7 +573,7 @@ contains c => cells(i) do j = 1, c%n_surfaces id = c%surfaces(j) - if (id < OP_DIFFERENCE) then + if (id < OP_UNION) then if (surface_dict%has_key(abs(id))) then i_array = surface_dict%get_key(abs(id)) c%surfaces(j) = sign(i_array, id) From acf2e51272db99028630dca1bf1a3fcd64e6d209 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 24 Sep 2015 13:55:11 +0700 Subject: [PATCH 174/519] Partial support for cells defined with union and complement operators. The Python API still has no concept of operators. The Summary class has a hack to at least be able to read a summary file for now, basically skipping any operators that are present. --- openmc/summary.py | 17 +++--- src/geometry.F90 | 109 +++++++++++++++++++++--------------- src/geometry_header.F90 | 11 ++-- src/initialize.F90 | 10 +++- src/input_xml.F90 | 116 ++++++++++++++++++++++++++++++++++++--- src/relaxng/geometry.rnc | 2 +- src/relaxng/geometry.rng | 12 +--- src/string.F90 | 110 ++++++++++++++++++++++--------------- src/summary.F90 | 31 +++++++---- 9 files changed, 286 insertions(+), 132 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 2ae7464846..c2c02da18a 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -213,7 +213,7 @@ class Summary(object): fill = self._f['geometry/cells'][key]['lattice'].value if 'surfaces' in self._f['geometry/cells'][key].keys(): - surfaces = self._f['geometry/cells'][key]['surfaces'][...] + surfaces = self._f['geometry/cells'][key]['surfaces'].value.decode() else: surfaces = [] @@ -241,12 +241,15 @@ class Summary(object): self._cell_fills[index] = (fill_type, fill) # Iterate over all Surfaces and add them to the Cell - for surface_halfspace in surfaces: - - halfspace = np.sign(surface_halfspace) - surface_id = abs(surface_halfspace) - surface = self.get_surface_by_id(surface_id) - cell.add_surface(surface, halfspace) + for token in surfaces.split(): + try: + surface_halfspace = int(token) + halfspace = np.sign(surface_halfspace) + surface_id = abs(surface_halfspace) + surface = self.get_surface_by_id(surface_id) + cell.add_surface(surface, halfspace) + except ValueError: + pass # Add the Cell to the global dictionary of all Cells self.cells[index] = cell diff --git a/src/geometry.F90 b/src/geometry.F90 index 2cde01e023..9e40155e52 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -17,56 +17,77 @@ module geometry contains !=============================================================================== -! SIMPLE_CELL_CONTAINS determines whether a given the current coordinates of the -! particle are inside a cell defined as the intersection of a series of surfaces +! CELL_CONTAINS determines if a cell contains the particle at a given +! location. The bounds of the cell are detemined by a logical expression +! involving surface half-spaces. At initialization, the expression was converted +! to RPN notation. In cell_contains, we evaluate the RPN expression using a +! stack, similar to how a RPN calculator would work. !=============================================================================== - function simple_cell_contains(c, p) result(in_cell) + pure function cell_contains(c, p) result(in_cell) type(Cell), intent(in) :: c - type(Particle), intent(inout) :: p + type(Particle), intent(in) :: p logical :: in_cell - integer :: i ! index of surfaces in cell - integer :: i_surface ! index in surfaces array (with sign) - logical :: specified_sense ! specified sense of surface in list + integer :: i + integer :: token + logical :: b1, b2 + integer :: i_stack logical :: actual_sense ! sense of particle wrt surface - class(Surface), pointer :: s + logical :: stack(size(c%rpn)) - SURFACE_LOOP: do i = 1, c % n_surfaces - ! Lookup surface - i_surface = c % surfaces(i) - - ! Check if the particle is currently on the specified surface - if (i_surface == p % surface) then - ! Particle is heading into the cell - cycle - elseif (i_surface == -p % surface) then - ! Particle is heading out of the cell - in_cell = .false. - return + i_stack = 0 + do i = 1, size(c%rpn) + token = c%rpn(i) + if (token < OP_UNION) then + ! If the token is not an operator, evaluate the sense of particle with + ! respect to the surface and see if the token matches the sense. If the + ! particle's surface attribute is set and matches the token, that + ! overrides the determination based on sense(). + i_stack = i_stack + 1 + if (token == p%surface) then + stack(i_stack) = .true. + elseif (-token == p%surface) then + stack(i_stack) = .false. + else + actual_sense = surfaces(abs(token))%obj%sense(& + p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) + stack(i_stack) = (actual_sense .eqv. (token > 0)) + end if + else + ! If the token is a binary operator (intersection/union), apply it to + ! the last two items on the stack. If the token is a unary operator + ! (complement), apply it to the last item on the stack. + b1 = stack(i_stack) + select case (token) + case (OP_UNION) + b2 = stack(i_stack - 1) + stack(i_stack - 1) = b1 .or. b2 + i_stack = i_stack - 1 + case (OP_INTERSECTION) + b2 = stack(i_stack - 1) + stack(i_stack - 1) = b1 .and. b2 + i_stack = i_stack - 1 + case (OP_COMPLEMENT) + stack(i_stack) = .not. b1 + end select end if + end do - ! Determine the specified sense of the surface in the cell and the actual - ! sense of the particle with respect to the surface - s => surfaces(abs(i_surface))%obj - actual_sense = s%sense(p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) - specified_sense = (c % surfaces(i) > 0) - - ! Compare sense of point to specified sense - if (actual_sense .neqv. specified_sense) then - in_cell = .false. - return - end if - end do SURFACE_LOOP - - ! If we've reached here, then the sense matched on every surface or there - ! are no surfaces. - in_cell = .true. - end function simple_cell_contains + if (i_stack == 1) then + ! The one remaining logical on the stack indicates whether the particle is + ! in the cell. + in_cell = stack(i_stack) + else + ! This case occurs if there is no surface specification since i_stack will + ! still be zero. + in_cell = .true. + end if + end function cell_contains !=============================================================================== ! CHECK_CELL_OVERLAP checks for overlapping cells at the current particle's -! position using simple_cell_contains and the LocalCoord's built up by find_cell +! position using cell_contains and the LocalCoord's built up by find_cell !=============================================================================== subroutine check_cell_overlap(p) @@ -93,7 +114,7 @@ contains index_cell = univ % cells(i) c => cells(index_cell) - if (simple_cell_contains(c, p)) then + if (cell_contains(c, p)) then ! the particle should only be contained in one cell per level if (index_cell /= p % coord(j) % cell) then call fatal_error("Overlapping cells detected: " & @@ -162,7 +183,7 @@ contains c => cells(index_cell) ! Move on to the next cell if the particle is not inside this cell - if (.not. simple_cell_contains(c, p)) cycle + if (.not. cell_contains(c, p)) cycle ! Set cell on this level p % coord(j) % cell = index_cell @@ -556,7 +577,7 @@ contains ! ======================================================================= ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL - SURFACE_LOOP: do i = 1, cl % n_surfaces + SURFACE_LOOP: do i = 1, size(cl%surfaces) ! check for operators index_surf = cl%surfaces(i) coincident = (index_surf == p % surface) @@ -823,10 +844,11 @@ contains c => cells(i) ! loop over each surface specification - do j = 1, c % n_surfaces + do j = 1, size(c%surfaces) i_surface = c % surfaces(j) positive = (i_surface > 0) i_surface = abs(i_surface) + if (i_surface >= OP_UNION) cycle if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 else @@ -853,10 +875,11 @@ contains c => cells(i) ! loop over each surface specification - do j = 1, c % n_surfaces + do j = 1, size(c%surfaces) i_surface = c % surfaces(j) positive = (i_surface > 0) i_surface = abs(i_surface) + if (i_surface >= OP_UNION) cycle if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 13d806e8cf..c8c99783f3 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -128,14 +128,13 @@ module geometry_header ! the geom integer :: material ! Material within cell (0 for ! universe) - integer :: n_surfaces ! Number of surfaces within integer, allocatable :: offset (:) ! Distribcell offset for tally ! counter - integer, allocatable :: & - & surfaces(:) ! List of surfaces bounding cell - ! -- note that parentheses, union, - ! etc operators will be listed here - ! too + integer, allocatable :: surfaces(:) ! List of surfaces bounding cell -- + ! note that parentheses, union, etc + ! operators will be listed here too + integer, allocatable :: rpn(:) ! Reverse Polish notation for surface + ! expression ! Rotation matrix and translation vector real(8), allocatable :: translation(:) diff --git a/src/initialize.F90 b/src/initialize.F90 index 3671a40af7..d46fd8d48a 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -571,7 +571,7 @@ contains ! ADJUST SURFACE LIST FOR EACH CELL c => cells(i) - do j = 1, c%n_surfaces + do j = 1, size(c%surfaces) id = c%surfaces(j) if (id < OP_UNION) then if (surface_dict%has_key(abs(id))) then @@ -584,6 +584,14 @@ contains end if end do + do j = 1, size(c%rpn) + id = c%rpn(j) + if (id < OP_UNION) then + i_array = surface_dict%get_key(abs(id)) + c%rpn(j) = sign(i_array, id) + end if + end do + ! ======================================================================= ! ADJUST UNIVERSE INDEX FOR EACH CELL diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 308bdc66b0..156d33ce46 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -13,8 +13,9 @@ module input_xml use plot_header use random_lcg, only: prn use surface_header + use stl_vector, only: VectorInt use string, only: to_lower, to_str, str_to_int, str_to_real, & - starts_with, ends_with + starts_with, ends_with, tokenize use tally_header, only: TallyObject, TallyFilter use tally_initialize, only: add_tallies use xml_interface @@ -993,6 +994,7 @@ contains logical :: boundary_exists character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word + character(MAX_LINE_LEN) :: surface_spec type(Cell), pointer :: c class(Surface), pointer :: s class(Lattice), pointer :: lat @@ -1004,6 +1006,8 @@ contains type(NodeList), pointer :: node_surf_list => null() type(NodeList), pointer :: node_rlat_list => null() type(NodeList), pointer :: node_hlat_list => null() + type(VectorInt) :: tokens + type(VectorInt) :: rpn ! Display output message call write_message("Reading geometry XML file...", 5) @@ -1116,16 +1120,26 @@ contains ! Allocate array for surfaces and copy if (check_for_node(node_cell, "surfaces")) then - n = get_arraysize_integer(node_cell, "surfaces") - else - n = 0 - end if - c % n_surfaces = n + call get_node_value(node_cell, "surfaces", surface_spec) + if (len_trim(surface_spec) > 0) then + ! Create surfaces array from string + call tokenize(surface_spec, tokens) - if (n > 0) then - allocate(c % surfaces(n)) - call get_node_array(node_cell, "surfaces", c % surfaces) + ! Use shunting-yard algorithm to determine RPN for surface algorithm + call generate_rpn(tokens, rpn) + + ! Copy surface spec and RPN form to cell arrays + allocate(c % surfaces(tokens%size())) + allocate(c % rpn(rpn%size())) + c % surfaces(:) = tokens%data(1:tokens%size()) + c % rpn(:) = rpn%data(1:rpn%size()) + + call tokens%clear() + call rpn%clear() + end if end if + if (.not. allocated(c%surfaces)) allocate(c%surfaces(0)) + if (.not. allocated(c%rpn)) allocate(c%rpn(0)) ! Rotation matrix if (check_for_node(node_cell, "rotation")) then @@ -4766,4 +4780,88 @@ contains end subroutine expand_natural_element +!=============================================================================== +! GENERATE_RPN implements the shunting-yard algorithm to generate a Reverse +! polish notation (RPN) expression for the surface specification of a cell given +! the infix notation. +!=============================================================================== + + subroutine generate_rpn(tokens, output) + type(VectorInt), intent(in) :: tokens ! infix notation + type(VectorInt), intent(inout) :: output ! RPN notation + + integer :: i + integer :: token + integer :: op + type(VectorInt) :: stack + + do i = 1, tokens%size() + token = tokens%data(i) + + if (token < OP_UNION) then + ! If token is not an operator, add it to output + call output%push_back(token) + + elseif (token < OP_RIGHT_PAREN) then + ! Regular operators union, intersection, complement + do while (stack%size() > 0) + op = stack%data(stack%size()) + + if (op < OP_RIGHT_PAREN .and. & + ((token == OP_COMPLEMENT .and. token < op) .or. & + (token /= OP_COMPLEMENT .and. token <= op))) then + ! While there is an operator, op, on top of the stack, if the token + ! is left-associative and its precedence is less than or equal to + ! that of op or if the token is right-associative and its precedence + ! is less than that of op, move op to the output queue and push the + ! token on to the stack. Note that only complement is + ! right-associative. + call output%push_back(op) + call stack%pop_back() + else + exit + end if + end do + + call stack%push_back(token) + + elseif (token == OP_LEFT_PAREN) then + ! If the token is a left parenthesis, push it onto the stack + call stack%push_back(token) + + else + ! If the token is a right parenthesis, move operators from the stack to + ! the output queue until reaching the left parenthesis. + do + ! If we run out of operators without finding a left parenthesis, it + ! means there are mismatched parentheses. + if (stack%size() == 0) then + call fatal_error('Mimatched parentheses in surface specification') + end if + + op = stack%data(stack%size()) + if (op == OP_LEFT_PAREN) exit + call output%push_back(op) + call stack%pop_back() + end do + + ! Pop the left parenthesis. + call stack%pop_back() + end if + end do + + ! While there are operators on the stack, move them to the output queue + do while (stack%size() > 0) + op = stack%data(stack%size()) + + ! If the operator is a parenthesis, it is mismatched + if (op >= OP_RIGHT_PAREN) then + call fatal_error('Mimatched parentheses in surface specification') + end if + + call output%push_back(op) + call stack%pop_back() + end do + end subroutine generate_rpn + end module input_xml diff --git a/src/relaxng/geometry.rnc b/src/relaxng/geometry.rnc index 82f1f15b32..07a02af9ea 100644 --- a/src/relaxng/geometry.rnc +++ b/src/relaxng/geometry.rnc @@ -9,7 +9,7 @@ element geometry { (element material { ( xsd:int | "void" ) } | attribute material { ( xsd:int | "void" ) }) ) & - (element surfaces { list { xsd:int* } } | attribute surfaces { list { xsd:int* } })? & + (element surfaces { xsd:string } | attribute surfaces { xsd:string })? & (element rotation { list { xsd:double+ } } | attribute rotation { list { xsd:double+ } })? & (element translation { list { xsd:double+ } } | attribute translation { list { xsd:double+ } })? }* diff --git a/src/relaxng/geometry.rng b/src/relaxng/geometry.rng index 9bd573b346..6a68aa721e 100644 --- a/src/relaxng/geometry.rng +++ b/src/relaxng/geometry.rng @@ -63,18 +63,10 @@ - - - - - + - - - - - + diff --git a/src/string.F90 b/src/string.F90 index 5f57bb3855..2d690dded5 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -1,8 +1,10 @@ module string - use constants, only: MAX_WORDS, MAX_LINE_LEN, ERROR_INT, ERROR_REAL + use constants, only: MAX_WORDS, MAX_LINE_LEN, ERROR_INT, ERROR_REAL, & + OP_LEFT_PAREN, OP_RIGHT_PAREN, OP_COMPLEMENT, OP_INTERSECTION, OP_UNION use error, only: fatal_error, warning use global, only: master + use stl_vector, only: VectorInt implicit none @@ -63,63 +65,81 @@ contains end subroutine split_string !=============================================================================== -! SPLIT_STRING_WL takes a string that includes logical expressions for a list of -! bounding surfaces in a cell and splits it into separate words. The characters -! (, ), :, and # count as separate words since they represent operators. -! -! Arguments: -! string = input line -! words = array of words -! n = number of words +! TOKENIZE takes a string that includes logical expressions for a list of +! bounding surfaces in a cell and splits it into separate tokens. The characters +! (, ), ^, and ~ count as separate tokens since they represent operators. !=============================================================================== - subroutine split_string_wl(string, words, n) + subroutine tokenize(string, tokens) + character(*), intent(in) :: string + type(VectorInt), intent(inout) :: tokens - character(*), intent(in) :: string - character(*), intent(out) :: words(MAX_WORDS) - integer, intent(out) :: n + integer :: i ! current index + integer :: i_start ! starting index of word + character(len=len_trim(string)) :: string_ - character(1) :: chr ! current character - integer :: i ! current index - integer :: i_start ! starting index of word - integer :: i_end ! ending index of word + ! Remove leading blanks + string_ = adjustl(string) i_start = 0 - i_end = 0 - n = 0 - do i = 1, len_trim(string) - chr = string(i:i) - + i = 1 + do while (i <= len_trim(string_)) ! Check for special characters - if (index('():#', chr) > 0) then + if (index('()^~ ', string_(i:i)) > 0) then + ! If the special character appears immediately after a non-operator, + ! create a token with the surface half-space if (i_start > 0) then - i_end = i - 1 - n = n + 1 - words(n) = string(i_start:i_end) + call tokens%push_back(int(str_to_int(& + string_(i_start:i - 1)), 4)) end if - n = n + 1 - words(n) = chr + + select case (string_(i:i)) + case ('(') + call tokens%push_back(OP_LEFT_PAREN) + case (')') + call tokens%push_back(OP_RIGHT_PAREN) + case ('^') + call tokens%push_back(OP_UNION) + case ('~') + call tokens%push_back(OP_COMPLEMENT) + case (' ') + ! Find next non-space character + do while (string_(i+1:i+1) == ' ') + i = i + 1 + end do + + ! If previous token is not an operator and next token is not a left + ! parenthese or union operator, that implies that the whitespace is to + ! be interpreted as an intersection operator + if (i_start > 0) then + if (index(')^', string_(i+1:i+1)) == 0) then + call tokens%push_back(OP_INTERSECTION) + end if + end if + end select + i_start = 0 - i_end = 0 - cycle + else + ! Check for invalid characters + if (index('-0123456789', string_(i:i)) == 0) then + call fatal_error("Invalid character '" // string_(i:i) // "' in & + &surface specification.") + end if + + ! If we haven't yet reached the start of a word, start a new word + if (i_start == 0) i_start = i end if - if ((i_start == 0) .and. (chr /= ' ')) then - i_start = i - end if - if (i_start > 0) then - if (chr == ' ') i_end = i - 1 - if (i == len_trim(string)) i_end = i - if (i_end > 0) then - n = n + 1 - words(n) = string(i_start:i_end) - ! reset indices - i_start = 0 - i_end = 0 - end if - end if + i = i + 1 end do - end subroutine split_string_wl + + ! If we've reached the end and we're still in a word, create a token from it + ! and add it to the list + if (i_start > 0) then + call tokens%push_back(int(str_to_int(& + string_(i_start:len_trim(string_))), 4)) + end if + end subroutine tokenize !=============================================================================== ! CONCATENATE takes an array of words and concatenates them together in one diff --git a/src/summary.F90 b/src/summary.F90 index 587f00b6b7..49fe802305 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -107,13 +107,13 @@ contains integer :: i, j, k, m integer, allocatable :: lattice_universes(:,:,:) - integer, allocatable :: surface_ids(:) integer(HID_T) :: geom_group integer(HID_T) :: cells_group, cell_group integer(HID_T) :: surfaces_group, surface_group integer(HID_T) :: universes_group, univ_group integer(HID_T) :: lattices_group, lattice_group real(8), allocatable :: coeffs(:) + character(MAX_LINE_LEN) :: surface_spec type(Cell), pointer :: c class(Surface), pointer :: s type(Universe), pointer :: u @@ -176,15 +176,26 @@ contains end select ! Write list of bounding surfaces - if (c%n_surfaces > 0) then - allocate(surface_ids(c%n_surfaces)) - do j = 1, c%n_surfaces - k = c%surfaces(j) - surface_ids(j) = sign(surfaces(abs(k))%obj%id, k) - end do - call write_dataset(cell_group, "surfaces", surface_ids) - deallocate(surface_ids) - end if + surface_spec = "" + do j = 1, size(c%surfaces) + k = c%surfaces(j) + if (k < OP_UNION) then + surface_spec = trim(surface_spec) // " " // to_str(& + sign(surfaces(abs(k))%obj%id, k)) + else + select case(k) + case (OP_LEFT_PAREN) + surface_spec = trim(surface_spec) // " (" + case (OP_RIGHT_PAREN) + surface_spec = trim(surface_spec) // " (" + case (OP_COMPLEMENT) + surface_spec = trim(surface_spec) // " ~" + case (OP_UNION) + surface_spec = trim(surface_spec) // " ^" + end select + end if + end do + call write_dataset(cell_group, "surfaces", adjustl(surface_spec)) call close_group(cell_group) end do CELL_LOOP From 1cfff776a5791085c5d5173b2a31a94ccb792156 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 20:28:08 +0700 Subject: [PATCH 175/519] Started adding changes in Python API for complex cells. --- openmc/region.py | 105 ++++++++++++++++++++++++++++++++++++++++++++++ openmc/surface.py | 79 +++++++++++++++++++++++++++++++--- 2 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 openmc/region.py diff --git a/openmc/region.py b/openmc/region.py new file mode 100644 index 0000000000..5dd8c6eb41 --- /dev/null +++ b/openmc/region.py @@ -0,0 +1,105 @@ +from abc import ABCMeta, abstractmethod +from collections import Iterable + +from openmc.checkvalue import check_type + + +class Region(object): + __metaclass__ = ABCMeta + + @abstractmethod + def __str__(self): + return '' + + +class Intersection(Region): + """Intersection of two or more regions. + + Parameters + ---------- + *nodes + Regions to take the intersection of + + Attributes + ---------- + nodes : tuple of Region + Regions to take the intersection of + + """ + + def __init__(self, *nodes): + self.nodes = nodes + + @property + def nodes(self): + return self._nodes + + @nodes.setter + def nodes(self, nodes): + check_type('nodes', nodes, Iterable, Region) + self._nodes = nodes + + def __str__(self): + return '(' + ' '.join(map(str, self.nodes)) + ')' + + +class Union(Region): + """Union of two or more regions. + + Parameters + ---------- + *nodes + Regions to take the union of + + Attributes + ---------- + nodes : tuple of Region + Regions to take the union of + + """ + + def __init__(self, *nodes): + self.nodes = nodes + + @property + def nodes(self): + return self._nodes + + @nodes.setter + def nodes(self, nodes): + check_type('nodes', nodes, Iterable, Region) + self._nodes = nodes + + def __str__(self): + return '(' + ' ^ '.join(map(str, self.nodes)) + ')' + + +class Complement(Region): + """Complement of a region. + + Parameters + ---------- + node : Region + Region to take the complement of + + Attributes + ---------- + node : Region + Regions to take the complement of + + """ + + def __init__(self, node): + self.node = node + + @property + def node(self): + return self._node + + @node.setter + def node(self, node): + check_type('node', node, Region) + self._node = node + + def __str__(self): + return '~' + str(self.node) diff --git a/openmc/surface.py b/openmc/surface.py index 653754d303..0be62fbf5a 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -4,6 +4,7 @@ from xml.etree import ElementTree as ET import sys from openmc.checkvalue import check_type, check_value, check_greater_than +from openmc.region import Region if sys.version_info[0] >= 3: basestring = str @@ -38,17 +39,23 @@ class Surface(object): Attributes ---------- - id : int - Unique identifier for the surface - name : str - Name of the surface - type : str - Type of the surface, e.g. 'x-plane' boundary_type : {'transmission, 'vacuum', 'reflective', 'periodic'} Boundary condition that defines the behavior for particles hitting the surface. coeffs : dict Dictionary of surface coefficients + id : int + Unique identifier for the surface + name : str + Name of the surface + negative : Halfspace + Negative half-space of the surface, i.e., if :math:`f(x,y,z) = 0` is the + equation for the sufrace, the region for which :math:`f(x,y,z) < 0`. + positive : Halfspace + Positive half-space of the surface, i.e., if :math:`f(x,y,z) = 0` is the + equation for the sufrace, the region for which :math:`f(x,y,z) > 0`. + type : str + Type of the surface, e.g. 'x-plane' """ @@ -88,6 +95,14 @@ class Surface(object): def coeffs(self): return self._coeffs + @property + def negative(self): + return Halfspace(self, '-') + + @property + def positive(self): + return Halfspace(self, '+') + @id.setter def id(self, surface_id): if surface_id is None: @@ -937,3 +952,55 @@ class ZCone(Cone): R2, name=name) self._type = 'z-cone' + + +class Halfspace(Region): + """A positive or negative half-space region. + + A half-space is either of the two parts into which a two-dimension surface + divides the three-dimensional Euclidean space. If the equation of the + surface is :math:`f(x,y,z) = 0`, the region for which :math:`f(x,y,z) < 0` + is referred to as the negative half-space and the region for which + :math:`f(x,y,z) > 0` is referred to as the positive half-space. + + Parameters + ---------- + surface : Surface + Surface which divides Euclidean space. + side : {'+', '-'} + Indicates whether the positive or negative half-space is used. + + Attributes + ---------- + surface : Surface + Surface which divides Euclidean space. + side : {'+', '-'} + Indicates whether the positive or negative half-space is used. + + """ + + def __init__(self, surface, side): + self.surface = surface + self.side = side + + @property + def surface(self): + return self._surface + + @surface.setter + def surface(self, surface): + check_type('surface', surface, Surface) + self._surface = surface + + @property + def side(self): + return self._side + + @side.setter + def side(self, side): + check_value('side', side, ('+', '-')) + self._side = side + + def __str__(self): + return '-' + str(self.surface.id) if self.side == '-' \ + else str(self.surface.id) From 7681995ef190be2957a3d367a2823e7f8a26edb7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 25 Sep 2015 21:43:31 +0700 Subject: [PATCH 176/519] Add region attribute to Cell and use it in lieu of surfaces --- openmc/region.py | 4 +- openmc/universe.py | 100 +++++++++++++++++++++------------------------ 2 files changed, 48 insertions(+), 56 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index 5dd8c6eb41..d75b349803 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -28,7 +28,7 @@ class Intersection(Region): """ def __init__(self, *nodes): - self.nodes = nodes + self.nodes = list(nodes) @property def nodes(self): @@ -59,7 +59,7 @@ class Union(Region): """ def __init__(self, *nodes): - self.nodes = nodes + self.nodes = list(nodes) @property def nodes(self): diff --git a/openmc/universe.py b/openmc/universe.py index bab10f5df7..79cb90fd00 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -8,6 +8,8 @@ import numpy as np import openmc import openmc.checkvalue as cv +from openmc.surface import Halfspace +from openmc.region import Region, Intersection, Complement if sys.version_info[0] >= 3: basestring = str @@ -45,10 +47,8 @@ class Cell(object): Name of the cell fill : Material or Universe or Lattice or 'void' Indicates what the region of space is filled with - surfaces : dict - Dictionary whose keys are surface IDs and values are 2-tuples of a - Surface object and an integer identify whether the positive or negative - half-space is to be used + region : openmc.region.Region + Region of space that is assigned to the cell. rotation : ndarray 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 @@ -67,7 +67,7 @@ class Cell(object): self.name = name self._fill = None self._type = None - self._surfaces = {} + self._region = None self._rotation = None self._translation = None self._offsets = None @@ -89,8 +89,8 @@ class Cell(object): return self._fill @property - def surfaces(self): - return self._surfaces + def region(self): + return self._region @property def rotation(self): @@ -163,6 +163,11 @@ class Cell(object): cv.check_type('cell offsets', offsets, Iterable) self._offsets = offsets + @region.setter + def region(self, region): + cv.check_type('cell region', region, Region) + self._region = region + def add_surface(self, surface, halfspace): """Add a half-space to the list of half-spaces whose intersection defines the cell. @@ -186,28 +191,17 @@ class Cell(object): '"{2}" since it is not +/-1'.format(surface, self._id, halfspace) raise ValueError(msg) - # If the Cell does not already contain the Surface, add it - if surface._id not in self._surfaces: - self._surfaces[surface._id] = (surface, halfspace) - - def remove_surface(self, surface): - """Remove the half-space associated with a particular surface. - - Parameters - ---------- - surface : openmc.surface.Surface - Surface to remove from definition - - """ - - if not isinstance(surface, openmc.Surface): - msg = 'Unable to remove Surface "{0}" from Cell ID="{1}" since it is ' \ - 'not a Surface object'.format(surface, self._id) - raise ValueError(msg) - - # If the Cell contains the Surface, delete it - if surface._id in self._surfaces: - del self._surfaces[surface._id] + # If no region has been assigned, simply use the half-space. Otherwise, + # take the intersection of the current region and the half-space + # specified + region = surface.positive if halfspace == 1 else surface.negative + if self.region is None: + self.region = region + else: + if isinstance(self.region, Intersection): + self.region.nodes.append(region) + else: + self.region = Intersection(self.region, region) def get_offset(self, path, filter_offset): # Get the current element and remove it from the list @@ -301,13 +295,7 @@ class Cell(object): else: string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill) - string += '{0: <16}{1}\n'.format('\tSurfaces', '=\t') - - for surface_id in self._surfaces: - halfspace = self._surfaces[surface_id][1] - string += '{0} '.format(halfspace * surface_id) - - string = string.rstrip(' ') + '\n' + string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region) string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t', self._rotation) @@ -338,26 +326,30 @@ class Cell(object): element.set("fill", str(self._fill)) self._fill.create_xml_subelement(xml_element) - if self._surfaces is not None: - surfaces = '' + if self.region is not None: + # Set the surfaces attribute with the region specification + element.set("surfaces", str(self.region)) - for surface_id in self._surfaces: - # Determine if XML element already includes this Surface - path = './surface[@id=\'{0}\']'.format(surface_id) - test = xml_element.find(path) + # Only surfaces that appear in a region are added to the geometry + # file, so the appropriate check is performed here. First we create + # a function which is called recursively to navigate through the CSG + # tree. When it reaches a leaf (a Halfspace), it creates a + # element for the corresponding surface if none has been created + # thus far. + def create_surface_elements(node, element): + if isinstance(node, Halfspace): + path = './surface[@id=\'{0}\']'.format(node.surface.id) + if xml_element.find(path) is None: + surface_subelement = node.surface.create_xml_subelement() + xml_element.append(surface_subelement) + elif isinstance(node, Complement): + create_surface_elements(node.node, element) + else: + for subnode in node.nodes: + create_surface_elements(subnode, element) - # If the element does not contain the Surface subelement - if test is None: - # Create the XML subelement for this Surface - surface = self._surfaces[surface_id][0] - surface_subelement = surface.create_xml_subelement() - xml_element.append(surface_subelement) - - # Append the halfspace and Surface ID - halfspace = self._surfaces[surface_id][1] - surfaces += '{0} '.format(halfspace * surface_id) - - element.set("surfaces", surfaces.rstrip(' ')) + # Call the recursive function from the top node + create_surface_elements(self.region, xml_element) if self._translation is not None: element.set("translation", ' '.join(map(str, self._translation))) From 671b5c7a821f8e4e785849992c202c73430177e7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 26 Sep 2015 09:36:39 +0700 Subject: [PATCH 177/519] Rename surfaces attribute of to region. --- openmc/summary.py | 8 +++---- src/geometry.F90 | 16 +++++++------- src/geometry_header.F90 | 7 +++--- src/initialize.F90 | 8 +++---- src/input_xml.F90 | 48 +++++++++++++++++++++++----------------- src/relaxng/geometry.rnc | 2 +- src/relaxng/geometry.rng | 4 ++-- src/summary.F90 | 20 ++++++++--------- 8 files changed, 60 insertions(+), 53 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index c2c02da18a..3522e707d4 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -212,10 +212,10 @@ class Summary(object): else: fill = self._f['geometry/cells'][key]['lattice'].value - if 'surfaces' in self._f['geometry/cells'][key].keys(): - surfaces = self._f['geometry/cells'][key]['surfaces'].value.decode() + if 'region' in self._f['geometry/cells'][key].keys(): + region = self._f['geometry/cells'][key]['region'].value.decode() else: - surfaces = [] + region = [] # Create this Cell cell = openmc.Cell(cell_id=cell_id, name=name) @@ -241,7 +241,7 @@ class Summary(object): self._cell_fills[index] = (fill_type, fill) # Iterate over all Surfaces and add them to the Cell - for token in surfaces.split(): + for token in region.split(): try: surface_halfspace = int(token) halfspace = np.sign(surface_halfspace) diff --git a/src/geometry.F90 b/src/geometry.F90 index 9e40155e52..a7a36a5351 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -577,9 +577,9 @@ contains ! ======================================================================= ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL - SURFACE_LOOP: do i = 1, size(cl%surfaces) + SURFACE_LOOP: do i = 1, size(cl%region) ! check for operators - index_surf = cl%surfaces(i) + index_surf = cl%region(i) coincident = (index_surf == p % surface) ! check for operators @@ -594,7 +594,7 @@ contains if (d < d_surf) then if (abs(d - d_surf)/d_surf >= FP_PRECISION) then d_surf = d - level_surf_cross = -cl % surfaces(i) + level_surf_cross = -cl % region(i) end if end if end do SURFACE_LOOP @@ -843,9 +843,9 @@ contains do i = 1, n_cells c => cells(i) - ! loop over each surface specification - do j = 1, size(c%surfaces) - i_surface = c % surfaces(j) + ! loop over each region specification + do j = 1, size(c%region) + i_surface = c % region(j) positive = (i_surface > 0) i_surface = abs(i_surface) if (i_surface >= OP_UNION) cycle @@ -875,8 +875,8 @@ contains c => cells(i) ! loop over each surface specification - do j = 1, size(c%surfaces) - i_surface = c % surfaces(j) + do j = 1, size(c%region) + i_surface = c % region(j) positive = (i_surface > 0) i_surface = abs(i_surface) if (i_surface >= OP_UNION) cycle diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index c8c99783f3..c9889a5c82 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -130,10 +130,9 @@ module geometry_header ! universe) integer, allocatable :: offset (:) ! Distribcell offset for tally ! counter - integer, allocatable :: surfaces(:) ! List of surfaces bounding cell -- - ! note that parentheses, union, etc - ! operators will be listed here too - integer, allocatable :: rpn(:) ! Reverse Polish notation for surface + integer, allocatable :: region(:) ! Definition of spatial region as + ! Boolean expression of half-spaces + integer, allocatable :: rpn(:) ! Reverse Polish notation for region ! expression ! Rotation matrix and translation vector diff --git a/src/initialize.F90 b/src/initialize.F90 index d46fd8d48a..16a6a17b03 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -568,15 +568,15 @@ contains do i = 1, n_cells ! ======================================================================= - ! ADJUST SURFACE LIST FOR EACH CELL + ! ADJUST REGION SPECIFICATION FOR EACH CELL c => cells(i) - do j = 1, size(c%surfaces) - id = c%surfaces(j) + do j = 1, size(c%region) + id = c%region(j) if (id < OP_UNION) then if (surface_dict%has_key(abs(id))) then i_array = surface_dict%get_key(abs(id)) - c%surfaces(j) = sign(i_array, id) + c%region(j) = sign(i_array, id) else call fatal_error("Could not find surface " // trim(to_str(abs(id)))& &// " specified on cell " // trim(to_str(c%id))) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 156d33ce46..f074898f23 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -994,7 +994,7 @@ contains logical :: boundary_exists character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word - character(MAX_LINE_LEN) :: surface_spec + character(MAX_LINE_LEN) :: region_spec type(Cell), pointer :: c class(Surface), pointer :: s class(Lattice), pointer :: lat @@ -1118,27 +1118,35 @@ contains call fatal_error("Cannot specify material and fill simultaneously") end if - ! Allocate array for surfaces and copy + ! Check for region specification (also under deprecated name surfaces) + region_spec = '' if (check_for_node(node_cell, "surfaces")) then - call get_node_value(node_cell, "surfaces", surface_spec) - if (len_trim(surface_spec) > 0) then - ! Create surfaces array from string - call tokenize(surface_spec, tokens) - - ! Use shunting-yard algorithm to determine RPN for surface algorithm - call generate_rpn(tokens, rpn) - - ! Copy surface spec and RPN form to cell arrays - allocate(c % surfaces(tokens%size())) - allocate(c % rpn(rpn%size())) - c % surfaces(:) = tokens%data(1:tokens%size()) - c % rpn(:) = rpn%data(1:rpn%size()) - - call tokens%clear() - call rpn%clear() - end if + call warning("The use of 'surfaces' is deprecated and will be & + &disallowed in a future release. Use 'region' instead. The & + &openmc-update-inputs utility can be used to automatically & + &update geometry.xml files.") + call get_node_value(node_cell, "surfaces", region_spec) + elseif (check_for_node(node_cell, "region")) then + call get_node_value(node_cell, "region", region_spec) end if - if (.not. allocated(c%surfaces)) allocate(c%surfaces(0)) + + if (len_trim(region_spec) > 0) then + ! Create surfaces array from string + call tokenize(region_spec, tokens) + + ! Use shunting-yard algorithm to determine RPN for surface algorithm + call generate_rpn(tokens, rpn) + + ! Copy surface spec and RPN form to cell arrays + allocate(c % region(tokens%size())) + allocate(c % rpn(rpn%size())) + c % region(:) = tokens%data(1:tokens%size()) + c % rpn(:) = rpn%data(1:rpn%size()) + + call tokens%clear() + call rpn%clear() + end if + if (.not. allocated(c%region)) allocate(c%region(0)) if (.not. allocated(c%rpn)) allocate(c%rpn(0)) ! Rotation matrix diff --git a/src/relaxng/geometry.rnc b/src/relaxng/geometry.rnc index 07a02af9ea..2a8d07b8c0 100644 --- a/src/relaxng/geometry.rnc +++ b/src/relaxng/geometry.rnc @@ -9,7 +9,7 @@ element geometry { (element material { ( xsd:int | "void" ) } | attribute material { ( xsd:int | "void" ) }) ) & - (element surfaces { xsd:string } | attribute surfaces { xsd:string })? & + (element region { xsd:string } | attribute region { xsd:string })? & (element rotation { list { xsd:double+ } } | attribute rotation { list { xsd:double+ } })? & (element translation { list { xsd:double+ } } | attribute translation { list { xsd:double+ } })? }* diff --git a/src/relaxng/geometry.rng b/src/relaxng/geometry.rng index 6a68aa721e..fcb310d0b3 100644 --- a/src/relaxng/geometry.rng +++ b/src/relaxng/geometry.rng @@ -62,10 +62,10 @@ - + - + diff --git a/src/summary.F90 b/src/summary.F90 index 49fe802305..1edb645432 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -113,7 +113,7 @@ contains integer(HID_T) :: universes_group, univ_group integer(HID_T) :: lattices_group, lattice_group real(8), allocatable :: coeffs(:) - character(MAX_LINE_LEN) :: surface_spec + character(MAX_LINE_LEN) :: region_spec type(Cell), pointer :: c class(Surface), pointer :: s type(Universe), pointer :: u @@ -176,26 +176,26 @@ contains end select ! Write list of bounding surfaces - surface_spec = "" - do j = 1, size(c%surfaces) - k = c%surfaces(j) + region_spec = "" + do j = 1, size(c%region) + k = c%region(j) if (k < OP_UNION) then - surface_spec = trim(surface_spec) // " " // to_str(& + region_spec = trim(region_spec) // " " // to_str(& sign(surfaces(abs(k))%obj%id, k)) else select case(k) case (OP_LEFT_PAREN) - surface_spec = trim(surface_spec) // " (" + region_spec = trim(region_spec) // " (" case (OP_RIGHT_PAREN) - surface_spec = trim(surface_spec) // " (" + region_spec = trim(region_spec) // " )" case (OP_COMPLEMENT) - surface_spec = trim(surface_spec) // " ~" + region_spec = trim(region_spec) // " ~" case (OP_UNION) - surface_spec = trim(surface_spec) // " ^" + region_spec = trim(region_spec) // " ^" end select end if end do - call write_dataset(cell_group, "surfaces", adjustl(surface_spec)) + call write_dataset(cell_group, "region", adjustl(region_spec)) call close_group(cell_group) end do CELL_LOOP From dc118afd2dd3ade4e8dae9b1c461aa1506dda78b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 26 Sep 2015 19:52:07 +0700 Subject: [PATCH 178/519] Add Region.from_expression method --- openmc/region.py | 126 ++++++++++++++++++++++++++++++++++++++++++++++ openmc/summary.py | 15 ++---- 2 files changed, 131 insertions(+), 10 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index d75b349803..e39d38b040 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -11,6 +11,132 @@ class Region(object): def __str__(self): return '' + @classmethod + def from_expression(cls, expression, surfaces): + """Generate a region given an infix expression. + + Parameters + ---------- + expression : str + Boolean expression relating surface half-spaces. The possible + operators are union '^', intersection ' ', and complement '~'. For + example, '(1 -2) ^ 3 ~(4 -5)'. + surfaces : dict + Dictionary whose keys are suface IDs that appear in the Boolean + expression and whose values are Surface objects. + + """ + + # Convert the string expression into a list of tokens, i.e., operators + # and surface half-spaces, representing the expression in infix + # notation. + i = 0 + i_start = -1 + tokens = [] + while i < len(expression): + if expression[i] in '()^~ ': + # If special character appears immediately after a non-operator, + # create a token with the apporpriate half-space + if i_start >= 0: + j = int(expression[i_start:i]) + if j < 0: + tokens.append(surfaces[abs(j)].negative) + else: + tokens.append(surfaces[abs(j)].positive) + + if expression[i] in '()^~': + # For everything other than intersection, add the operator + # to the list of tokens + tokens.append(expression[i]) + else: + # For spaces, we need to check the context further. If it + # doesn't appear before a right parentheses or union, it is + # interpreted to be as an intersection operator + while expression[i+1] == ' ': + i += 1 + + if i_start >= 0 and expression[i+1] not in ')^': + tokens.append(' ') + + i_start = -1 + else: + # Check for invalid characters + if expression[i] not in '-0123456789': + raise SyntaxError('Invalid character in expression') + + # If we haven't yet reached the start of a word, start one + if i_start < 0: + i_start = i + i += 1 + + # If we've reached the end and we're still in a word, create a + # half-space token and add it to the list + if i_start >= 0: + j = int(expression[i_start:]) + if j < 0: + tokens.append(surfaces[abs(j)].negative) + else: + tokens.append(surfaces[abs(j)].positive) + + # This function is used below to apply an operator to operands on the + # output queue during the shunting yard algorithm. + def apply_operator(output, operator): + r2 = output.pop() + if operator == ' ': + r1 = output.pop() + output.append(Intersection(r1, r2)) + elif operator == '^': + r1 = output.pop() + output.append(Union(r1, r2)) + elif operator == '~': + output.append(Complement(r2)) + + + # The following is an implementation of the shunting yard algorithm to + # generate an abstract syntax tree for the region expression. + output = [] + stack = [] + precedence = {'^': 1, ' ': 2, '~': 3} + associativity = {'^': 'left', ' ': 'left', '~': 'right'} + for token in tokens: + if token in (' ', '^', '~'): + # Normal operators + while stack: + op = stack[-1] + if (op not in ('(', ')') and + ((associativity[token] == 'right' and + precedence[token] < precedence[op]) or + (associativity[token] == 'left' and + precedence[token] <= precedence[op]))): + apply_operator(output, stack.pop()) + else: + break + stack.append(token) + elif token == '(': + # Left parentheses + stack.append(token) + elif token == ')': + # Right parentheses + while stack[-1] != '(': + apply_operator(output, stack.pop()) + if len(stack) == 0: + raise SyntaxError('Mismatched parentheses in ' + 'region specification.') + stack.pop() + else: + # Surface halfspaces + output.append(token) + while stack: + if stack[-1] in '()': + raise SyntaxError('Mismatched parentheses in region ' + 'specification.') + apply_operator(output, stack.pop()) + + # Since we are generating an abstract syntax tree rather than a reverse + # Polish notation expression, the output queue should have a single item + # at the end + return output[0] + class Intersection(Region): """Intersection of two or more regions. diff --git a/openmc/summary.py b/openmc/summary.py index 3522e707d4..7a7a9457c7 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -1,6 +1,7 @@ import numpy as np import openmc +from openmc.region import Region class Summary(object): @@ -240,16 +241,10 @@ class Summary(object): # Store Cell fill information for after Universe/Lattice creation self._cell_fills[index] = (fill_type, fill) - # Iterate over all Surfaces and add them to the Cell - for token in region.split(): - try: - surface_halfspace = int(token) - halfspace = np.sign(surface_halfspace) - surface_id = abs(surface_halfspace) - surface = self.get_surface_by_id(surface_id) - cell.add_surface(surface, halfspace) - except ValueError: - pass + # Generate Region object given infix expression + if region: + cell.region = Region.from_expression( + region, {s.id: s for s in self.surfaces.values()}) # Add the Cell to the global dictionary of all Cells self.cells[index] = cell From 0a5c198f1bda566b44a3011227d966de4a838ee8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 10:53:26 -0400 Subject: [PATCH 179/519] More changes to be up to date with upstream --- openmc/statepoint.py | 3 ++- src/summary.F90 | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 06ed51c18d..81c276aa91 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -343,7 +343,8 @@ class StatePoint(object): raise ValueError(msg) # Read the bin values - if FILTER_TYPES[filter_type] in ['energy', 'energyout']: + if FILTER_TYPES[filter_type] in ['energy', 'energyout', + 'mu', 'polar', 'azimuthal']: bins = self._f['{0}{1}/bins'.format(subbase, j)].value elif FILTER_TYPES[filter_type] in ['mesh', 'distribcell']: diff --git a/src/summary.F90 b/src/summary.F90 index 0147230a0a..2672803a74 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -528,7 +528,10 @@ contains ! Write filter bins if (t%filters(j)%type == FILTER_ENERGYIN .or. & - t%filters(j)%type == FILTER_ENERGYOUT) then + t%filters(j)%type == FILTER_ENERGYOUT .or. & + t%filters(j)%type == FILTER_MU .or. & + t%filters(j)%type == FILTER_POLAR .or. & + t%filters(j)%type == FILTER_AZIMUTHAL) then call write_dataset(filter_group, "bins", t%filters(j)%real_bins) else call write_dataset(filter_group, "bins", t%filters(j)%int_bins) @@ -552,6 +555,12 @@ contains call write_dataset(filter_group, "type_name", "energy") case(FILTER_ENERGYOUT) call write_dataset(filter_group, "type_name", "energyout") + case(FILTER_MU) + call write_dataset(filter_group, "type_name", "mu") + case(FILTER_POLAR) + call write_dataset(filter_group, "type_name", "polar") + case(FILTER_AZIMUTHAL) + call write_dataset(filter_group, "type_name", "azimuthal") end select call close_group(filter_group) From 4bf7fe5104b34af559fbd465ae0ef51c176462c1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 12:18:03 -0400 Subject: [PATCH 180/519] Fixed issue in Filter.is_subset(...) routine for energy filter types --- openmc/filter.py | 2 ++ openmc/mgxs/mgxs.py | 15 +++++++++------ openmc/statepoint.py | 11 +++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index fdeebaf8ae..5c97fb9e35 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -322,6 +322,8 @@ class Filter(object): return False elif self.type != other.type: return False + elif self.type in ['energy', 'energyout']: + return np.all(self.bins == other.bins) for bin in other.bins: if bin not in self.bins: diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 332eb7190a..98248dc871 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -840,6 +840,7 @@ class TransportXS(MultiGroupXS): super(TransportXS, self).load_from_statepoint(statepoint) scatter_p1 = self.tallies['scatter-P1'] self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1']) + self.tallies['scatter-P1'].filters[-1].type = 'energy' def compute_xs(self): """Computes the multi-group transport cross-sections using OpenMC @@ -1061,7 +1062,7 @@ class ScatterMatrixXS(MultiGroupXS): # Initialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correction='None'): + def compute_xs(self, correction='P0'): """Computes the multi-group scattering matrix using OpenMC tally arithmetic. @@ -1075,7 +1076,7 @@ class ScatterMatrixXS(MultiGroupXS): # If using P0 correction subtract scatter-P1 from the diagonal if correction == 'P0': - scatter_p1 = self.tallies['scatter-1'] + scatter_p1 = self.tallies['scatter-P1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges @@ -1245,7 +1246,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): # Intialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correction='None'): + def compute_xs(self, correction='P0'): """Computes the multi-group nu-scattering matrix using OpenMC tally arithmetic. @@ -1259,7 +1260,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): # If using P0 correction subtract scatter-P1 from the diagonal if correction == 'P0': - scatter_p1 = self.tallies['scatter-1'] + scatter_p1 = self.tallies['scatter-P1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') energy_filter.bins = self.energy_groups.group_edges @@ -1288,8 +1289,9 @@ class Chi(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges - energyout_filter = openmc.Filter('energyout', group_edges) - filters = [[], [energyout_filter]] + energyout_filter1 = openmc.Filter('energyout', group_edges) + energyout_filter2 = openmc.Filter('energyout', [group_edges[0], group_edges[-1]]) + filters = [[energyout_filter2], [energyout_filter1]] # Intialize the Tallies super(Chi, self).create_tallies(scores, filters, keys, estimator) @@ -1299,6 +1301,7 @@ class Chi(MultiGroupXS): nu_fission_in = self.tallies['nu-fission-in'] nu_fission_out = self.tallies['nu-fission-out'] + nu_fission_in.remove_filter(nu_fission_in.filters[-1]) self._xs_tally = nu_fission_out / nu_fission_in self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 34ed09ad42..f90e429cc0 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -466,7 +466,7 @@ class StatePoint(object): """Finds and returns a Tally object with certain properties. This routine searches the list of Tallies and returns the first Tally - found it finds which satisfies all of the input parameters. + found which satisfies all of the input parameters. NOTE: The input parameters do not need to match the complete Tally specification and may only represent a subset of the Tally's properties. @@ -534,15 +534,14 @@ class StatePoint(object): # Iterate over the Filters requested by the user for filter in filters: - contains_filter = False + contains_filters = False for test_filter in test_tally.filters: - if test_filter.is_subset(filter): - contains_filter = True + if filter.is_subset(test_filter): + contains_filters = True break - if not contains_filter: - contains_filters = False + if not contains_filters: break if not contains_filters: From da95a4403a544c4f8a38a5d96839ace7432ee99f Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 13:28:31 -0400 Subject: [PATCH 181/519] Fixes for nu_scatter tallies --- src/ace_header.F90 | 6 ++-- src/tally.F90 | 80 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 209b752bf8..467887c193 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -1,8 +1,8 @@ module ace_header - use constants, only: MAX_FILE_LEN, ZERO - use endf_header, only: Tab1 - use list_header, only: ListInt + use constants, only: MAX_FILE_LEN, ZERO + use endf_header, only: Tab1 + use list_header, only: ListInt implicit none diff --git a/src/tally.F90 b/src/tally.F90 index 33e452a4c7..6eb68a15af 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -5,6 +5,7 @@ module tally use error, only: fatal_error use geometry_header use global + use interpolation use math, only: t_percentile, calc_pn, calc_rn use mesh, only: get_mesh_bin, bin_to_mesh_indices, & get_mesh_indices, mesh_indices_to_bin, & @@ -61,6 +62,7 @@ contains real(8) :: uvw(3) ! particle direction type(Material), pointer :: mat type(Reaction), pointer :: rxn + real(8) :: multiplicity i = 0 SCORE_LOOP: do q = 1, t % n_user_score_bins @@ -170,10 +172,28 @@ contains ! Only analog estimators are available. ! Skip any event where the particle didn't scatter if (p % event /= EVENT_SCATTER) cycle SCORE_LOOP - ! For scattering production, we need to use the post-collision - ! weight as the estimate for the number of neutrons exiting a - ! reaction with neutrons in the exit channel - score = p % wgt + ! For scattering production, we need to use the pre-collision + ! weight times the multiplicity as the estimate for the number of + ! neutrons exiting a reaction with neutrons in the exit channel + + do m = 1, nuclides(i_nuclide) % n_reaction + ! Check if this is the desired MT + if (p % event_MT == nuclides(i_nuclide) % reactions(m) % MT) then + ! Found the reaction, set our pointer and move on with life + rxn => nuclides(i_nuclide) % reactions(m) + exit + end if + end do + + ! Get multiplicity + if (rxn % multiplicity_with_E) then + multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + else + multiplicity = real(rxn % multiplicity,8) + end if + + ! Apply multiplicity to the last weight + score = p % last_wgt * multiplicity case (SCORE_NU_SCATTER_PN) @@ -183,10 +203,28 @@ contains i = i + t % moment_order(i) cycle SCORE_LOOP end if - ! For scattering production, we need to use the post-collision - ! weight as the estimate for the number of neutrons exiting a - ! reaction with neutrons in the exit channel - score = p % wgt + ! For scattering production, we need to use the pre-collision + ! weight times the multiplicity as the estimate for the number of + ! neutrons exiting a reaction with neutrons in the exit channel + + do m = 1, nuclides(i_nuclide) % n_reaction + ! Check if this is the desired MT + if (p % event_MT == nuclides(i_nuclide) % reactions(m) % MT) then + ! Found the reaction, set our pointer and move on with life + rxn => nuclides(i_nuclide) % reactions(m) + exit + end if + end do + + ! Get multiplicity + if (rxn % multiplicity_with_E) then + multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + else + multiplicity = real(rxn % multiplicity,8) + end if + + ! Apply multiplicity to the last weight + score = p % last_wgt * multiplicity case (SCORE_NU_SCATTER_YN) @@ -196,10 +234,28 @@ contains i = i + (t % moment_order(i) + 1)**2 - 1 cycle SCORE_LOOP end if - ! For scattering production, we need to use the post-collision - ! weight as the estimate for the number of neutrons exiting a - ! reaction with neutrons in the exit channel - score = p % wgt + ! For scattering production, we need to use the pre-collision + ! weight times the multiplicity as the estimate for the number of + ! neutrons exiting a reaction with neutrons in the exit channel + + do m = 1, nuclides(i_nuclide) % n_reaction + ! Check if this is the desired MT + if (p % event_MT == nuclides(i_nuclide) % reactions(m) % MT) then + ! Found the reaction, set our pointer and move on with life + rxn => nuclides(i_nuclide) % reactions(m) + exit + end if + end do + + ! Get multiplicity + if (rxn % multiplicity_with_E) then + multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + else + multiplicity = real(rxn % multiplicity,8) + end if + + ! Apply multiplicity to the last weight + score = p % last_wgt * multiplicity case (SCORE_TRANSPORT) From 8ebaf9cb2447a2bdc797f107ecf11591c5e26b82 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 14:02:53 -0400 Subject: [PATCH 182/519] The Python APIs multi-group cross-section condensation is now working except for transfer matrice --- openmc/mgxs/mgxs.py | 59 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 98248dc871..eadcbda885 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -341,7 +341,59 @@ class MultiGroupXS(object): """ - raise NotImplementedError('Energy condensation is not yet implemented') + if self.xs_tally is None: + msg = 'Unable to get a condensed coarse group cross-section ' \ + 'since the fine group cross-section has not been computed' + raise ValueError(msg) + + cv.check_type('coarse_groups', coarse_groups, EnergyGroups) + cv.check_less_than('coarse groups', coarse_groups.num_groups, self.num_groups) + cv.check_value('upper coarse energy', coarse_groups.group_edges[-1], + [self.energy_groups.group_edges[-1]]) + cv.check_value('lower coarse energy', coarse_groups.group_edges[0], + [self.energy_groups.group_edges[0]]) + + # Clone this MultiGroupXS to initialize the condensed version + condensed_xs = copy.deepcopy(self) + condensed_xs.energy_groups = coarse_groups + + # Build indices to sum up over + energy_indices = [] + for group in range(coarse_groups.num_groups, 0, -1): + low, high = coarse_groups.get_group_bounds(group) + low_index = np.where(self.energy_groups.group_edges == low)[0][0] + energy_indices.append(low_index) + + # FIXME: This won't work for scattering matrices + # Overwrite tallies with new energy-condensed versions + # NOTE: This assumes that the tallies were loaded such with a single + # domain filter and energy filter in that order + for tally_type, tally in condensed_xs.tallies.items(): + + try: + # Find the tally's energy filter and update to coarse groups + energy_filter = tally.find_filter('energy') + energy_filter.bins = coarse_groups.group_edges + + # Make the condensed tally derived and ull out sum, sum_sq + tally._derived = True + tally._sum = None + tally._sum_sq = None + + # Sum up mean, std. dev fine groups within each coarse group + tally._mean = np.add.reduceat(tally.mean, energy_indices) + tally._std_dev = tally.std_dev**2 + tally._std_dev = np.add.reduceat(tally.std_dev, energy_indices) + tally._std_dev = np.sqrt(tally.std_dev) + + # If the tally had no energy filter, then pass + except ValueError: + pass + + # Compute the energy condensed multi-group cross-section + condensed_xs.compute_xs() + + return condensed_xs def get_subdomain_avg_xs(self, subdomains='all'): """Construct a subdomain-averaged version of this cross-section. @@ -367,7 +419,8 @@ class MultiGroupXS(object): """ if self.xs_tally is None: - msg = 'Unable to get cross-section since it has not been computed' + msg = 'Unable to get subdomain-averaged cross-section since the ' \ + 'subdomain-distributed cross-section has not been computed' raise ValueError(msg) # Construct a collection of the subdomain filter bins to average across @@ -394,7 +447,7 @@ class MultiGroupXS(object): tally_sum /= len(subdomains) avg_xs.tallies[tally_type] = tally_sum - # Compute the condensed single group cross-section + # Compute the subdomain-averaged multi-group cross-section avg_xs.compute_xs() return avg_xs From 5658cb0e665aa5b8070c1d2d208977abf9083c63 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 14:06:45 -0400 Subject: [PATCH 183/519] All tested and results updates --- src/tally.F90 | 96 +++-- tests/test_cmfd_feed/results_true.dat | 500 ++++++++++++------------ tests/test_cmfd_nofeed/results_true.dat | 216 +++++----- tests/test_many_scores/results_true.dat | 56 +-- 4 files changed, 440 insertions(+), 428 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 6eb68a15af..2b805b27df 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -175,21 +175,25 @@ contains ! For scattering production, we need to use the pre-collision ! weight times the multiplicity as the estimate for the number of ! neutrons exiting a reaction with neutrons in the exit channel - - do m = 1, nuclides(i_nuclide) % n_reaction - ! Check if this is the desired MT - if (p % event_MT == nuclides(i_nuclide) % reactions(m) % MT) then - ! Found the reaction, set our pointer and move on with life - rxn => nuclides(i_nuclide) % reactions(m) - exit - end if - end do - - ! Get multiplicity - if (rxn % multiplicity_with_E) then - multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & + (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then + multiplicity = ONE else - multiplicity = real(rxn % multiplicity,8) + do m = 1, nuclides(p % event_nuclide) % n_reaction + ! Check if this is the desired MT + if (p % event_MT == nuclides(p % event_nuclide) % reactions(m) % MT) then + ! Found the reaction, set our pointer and move on with life + rxn => nuclides(p % event_nuclide) % reactions(m) + exit + end if + end do + + ! Get multiplicity + if (rxn % multiplicity_with_E) then + multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + else + multiplicity = real(rxn % multiplicity,8) + end if end if ! Apply multiplicity to the last weight @@ -206,21 +210,25 @@ contains ! For scattering production, we need to use the pre-collision ! weight times the multiplicity as the estimate for the number of ! neutrons exiting a reaction with neutrons in the exit channel - - do m = 1, nuclides(i_nuclide) % n_reaction - ! Check if this is the desired MT - if (p % event_MT == nuclides(i_nuclide) % reactions(m) % MT) then - ! Found the reaction, set our pointer and move on with life - rxn => nuclides(i_nuclide) % reactions(m) - exit - end if - end do - - ! Get multiplicity - if (rxn % multiplicity_with_E) then - multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & + (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then + multiplicity = ONE else - multiplicity = real(rxn % multiplicity,8) + do m = 1, nuclides(p % event_nuclide) % n_reaction + ! Check if this is the desired MT + if (p % event_MT == nuclides(p % event_nuclide) % reactions(m) % MT) then + ! Found the reaction, set our pointer and move on with life + rxn => nuclides(p % event_nuclide) % reactions(m) + exit + end if + end do + + ! Get multiplicity + if (rxn % multiplicity_with_E) then + multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + else + multiplicity = real(rxn % multiplicity,8) + end if end if ! Apply multiplicity to the last weight @@ -237,21 +245,25 @@ contains ! For scattering production, we need to use the pre-collision ! weight times the multiplicity as the estimate for the number of ! neutrons exiting a reaction with neutrons in the exit channel - - do m = 1, nuclides(i_nuclide) % n_reaction - ! Check if this is the desired MT - if (p % event_MT == nuclides(i_nuclide) % reactions(m) % MT) then - ! Found the reaction, set our pointer and move on with life - rxn => nuclides(i_nuclide) % reactions(m) - exit - end if - end do - - ! Get multiplicity - if (rxn % multiplicity_with_E) then - multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & + (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then + multiplicity = ONE else - multiplicity = real(rxn % multiplicity,8) + do m = 1, nuclides(p % event_nuclide) % n_reaction + ! Check if this is the desired MT + if (p % event_MT == nuclides(p % event_nuclide) % reactions(m) % MT) then + ! Found the reaction, set our pointer and move on with life + rxn => nuclides(p % event_nuclide) % reactions(m) + exit + end if + end do + + ! Get multiplicity + if (rxn % multiplicity_with_E) then + multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + else + multiplicity = real(rxn % multiplicity,8) + end if end if ! Apply multiplicity to the last weight diff --git a/tests/test_cmfd_feed/results_true.dat b/tests/test_cmfd_feed/results_true.dat index 26380d403f..9c109db6ab 100644 --- a/tests/test_cmfd_feed/results_true.dat +++ b/tests/test_cmfd_feed/results_true.dat @@ -1,128 +1,128 @@ k-combined: -1.172666E+00 8.502438E-03 +1.168349E+00 1.145333E-02 tally 1: -1.170812E+01 -1.376785E+01 -2.179886E+01 -4.765478E+01 -2.945614E+01 -8.709999E+01 -3.527293E+01 -1.245879E+02 -3.829349E+01 -1.470691E+02 -3.709040E+01 -1.379455E+02 -3.380335E+01 -1.145311E+02 -2.801351E+01 -7.871047E+01 -2.029625E+01 -4.131602E+01 -1.084302E+01 -1.180329E+01 +1.167844E+01 +1.366808E+01 +2.141846E+01 +4.598143E+01 +2.928738E+01 +8.615095E+01 +3.513015E+01 +1.241914E+02 +3.715164E+01 +1.384553E+02 +3.639309E+01 +1.327919E+02 +3.370872E+01 +1.138391E+02 +2.875251E+01 +8.292323E+01 +2.117740E+01 +4.512961E+01 +1.130554E+01 +1.289872E+01 tally 2: -2.270565E+01 -2.599927E+01 -1.590852E+01 -1.276260E+01 -2.252857E+00 -2.614120E-01 -4.313167E+01 -9.326539E+01 -3.044479E+01 -4.648169E+01 -4.023051E+00 -8.172006E-01 -5.859113E+01 -1.725665E+02 -4.171599E+01 -8.755981E+01 -5.512216E+00 -1.531207E+00 -6.892516E+01 -2.383198E+02 -4.904413E+01 -1.207096E+02 -6.542718E+00 -2.155749E+00 -7.421495E+01 -2.764539E+02 -5.288881E+01 -1.405388E+02 -6.811354E+00 -2.358827E+00 -7.278191E+01 -2.661597E+02 -5.169924E+01 -1.343999E+02 -6.516967E+00 -2.148745E+00 -6.655238E+01 -2.222812E+02 -4.729758E+01 -1.123214E+02 -6.102046E+00 -1.890147E+00 -5.708495E+01 -1.636585E+02 -4.068603E+01 -8.317681E+01 -5.394757E+00 -1.465413E+00 -4.136562E+01 -8.598520E+01 -2.958591E+01 -4.402226E+01 -3.765802E+00 -7.200302E-01 -2.275517E+01 -2.614738E+01 -1.589295E+01 -1.276624E+01 -2.232715E+00 -2.558645E-01 +2.339531E+01 +2.755922E+01 +1.646762E+01 +1.365289E+01 +2.146174E+00 +2.369613E-01 +4.309769E+01 +9.312913E+01 +3.054873E+01 +4.681242E+01 +4.076365E+00 +8.462370E-01 +5.840647E+01 +1.715260E+02 +4.161366E+01 +8.713062E+01 +5.382541E+00 +1.473814E+00 +6.927641E+01 +2.411359E+02 +4.943841E+01 +1.228850E+02 +6.282202E+00 +1.990021E+00 +7.308593E+01 +2.678848E+02 +5.202069E+01 +1.357621E+02 +6.826145E+00 +2.353974E+00 +7.117026E+01 +2.543546E+02 +5.068896E+01 +1.290261E+02 +6.342979E+00 +2.033850E+00 +6.615720E+01 +2.193712E+02 +4.725156E+01 +1.119514E+02 +6.024815E+00 +1.833752E+00 +5.738164E+01 +1.651944E+02 +4.081217E+01 +8.360122E+01 +5.326191E+00 +1.435896E+00 +4.208669E+01 +8.911740E+01 +2.994944E+01 +4.517409E+01 +3.905846E+00 +7.855247E-01 +2.273578E+01 +2.615080E+01 +1.603853E+01 +1.303560E+01 +2.160924E+00 +2.473278E-01 tally 3: -1.529144E+01 -1.179942E+01 -1.023883E+00 -5.386625E-02 -2.936854E+01 -4.326483E+01 -1.881629E+00 -1.788063E-01 -4.015056E+01 -8.114284E+01 -2.594958E+00 -3.407980E-01 -4.720593E+01 -1.118311E+02 -3.161769E+00 -5.053887E-01 -5.095790E+01 -1.304930E+02 -3.308202E+00 -5.528151E-01 -4.979520E+01 -1.246892E+02 -3.163884E+00 -5.062497E-01 -4.554330E+01 -1.041770E+02 -3.019145E+00 -4.618487E-01 -3.921119E+01 -7.727273E+01 -2.472070E+00 -3.099171E-01 -2.843166E+01 -4.067093E+01 -1.823607E+00 -1.688171E-01 -1.530477E+01 -1.184246E+01 -1.047996E+00 -5.549017E-02 +1.584939E+01 +1.265206E+01 +1.096930E+00 +6.173135E-02 +2.940258E+01 +4.337818E+01 +1.932931E+00 +1.884749E-01 +4.008186E+01 +8.086427E+01 +2.512704E+00 +3.189987E-01 +4.759648E+01 +1.139252E+02 +3.041630E+00 +4.683237E-01 +5.006181E+01 +1.257467E+02 +3.137042E+00 +4.981005E-01 +4.883211E+01 +1.197646E+02 +3.130686E+00 +4.987337E-01 +4.550029E+01 +1.038199E+02 +2.853740E+00 +4.127265E-01 +3.937822E+01 +7.785807E+01 +2.488983E+00 +3.156421E-01 +2.884912E+01 +4.192640E+01 +1.855316E+00 +1.745109E-01 +1.543635E+01 +1.208459E+01 +1.025635E+00 +5.351565E-02 tally 4: 0.000000E+00 0.000000E+00 @@ -160,8 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.111592E+00 -4.883699E-01 +3.119914E+00 +4.908283E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -208,10 +208,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.536088E+00 -1.540676E+00 -2.727975E+00 -3.757452E-01 +5.567786E+00 +1.556825E+00 +2.766088E+00 +3.864023E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -256,10 +256,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.518115E+00 -2.840502E+00 -5.271874E+00 -1.398895E+00 +7.491891E+00 +2.819491E+00 +5.235154E+00 +1.377898E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -304,10 +304,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.764240E+00 -3.855378E+00 -7.176540E+00 -2.591613E+00 +8.810357E+00 +3.898704E+00 +7.233068E+00 +2.630659E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -352,10 +352,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.381092E+00 -4.414024E+00 -8.597689E+00 -3.710217E+00 +9.374583E+00 +4.414420E+00 +8.565683E+00 +3.687428E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -400,10 +400,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.158655E+00 -4.215178E+00 -9.188880E+00 -4.244766E+00 +9.001252E+00 +4.073267E+00 +8.974821E+00 +4.050120E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -448,10 +448,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.362511E+00 -3.509173E+00 -9.159213E+00 -4.209143E+00 +8.236452E+00 +3.401934E+00 +9.042286E+00 +4.102906E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -496,10 +496,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.029505E+00 -2.479106E+00 -8.613258E+00 -3.719199E+00 +7.028546E+00 +2.482380E+00 +8.577643E+00 +3.691947E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -544,10 +544,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.119892E+00 -1.320586E+00 -7.401001E+00 -2.749355E+00 +5.159585E+00 +1.342512E+00 +7.389236E+00 +2.745028E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -592,10 +592,10 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.765680E+00 -3.903229E-01 -5.461998E+00 -1.501206E+00 +2.762685E+00 +3.914181E-01 +5.471849E+00 +1.509910E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -642,8 +642,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.044921E+00 -4.656739E-01 +3.038522E+00 +4.643520E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -662,114 +662,114 @@ k cmfd 0.000000E+00 0.000000E+00 0.000000E+00 -1.177990E+00 -1.160010E+00 -1.155990E+00 -1.160167E+00 -1.162166E+00 -1.161566E+00 -1.164454E+00 -1.166269E+00 -1.168529E+00 -1.168622E+00 -1.170296E+00 -1.168644E+00 -1.172975E+00 -1.176543E+00 -1.173389E+00 -1.178422E+00 +1.180802E+00 +1.162698E+00 +1.162794E+00 +1.159752E+00 +1.152596E+00 +1.151652E+00 +1.148131E+00 +1.151875E+00 +1.151434E+00 +1.158833E+00 +1.160751E+00 +1.155305E+00 +1.155356E+00 +1.158866E+00 +1.161574E+00 +1.154691E+00 cmfd entropy 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.214145E+00 -3.225292E+00 -3.229509E+00 -3.228530E+00 -3.224203E+00 -3.225547E+00 -3.224720E+00 -3.224546E+00 -3.224527E+00 -3.223579E+00 -3.224380E+00 -3.223483E+00 -3.222819E+00 -3.223067E+00 -3.224007E+00 -3.220616E+00 +3.214195E+00 +3.225164E+00 +3.227316E+00 +3.225663E+00 +3.226390E+00 +3.225832E+00 +3.226707E+00 +3.227866E+00 +3.229948E+00 +3.229269E+00 +3.230044E+00 +3.231568E+00 +3.234694E+00 +3.234771E+00 +3.234915E+00 +3.235876E+00 cmfd balance 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.801684E-03 -2.802571E-03 -1.828029E-03 -2.220542E-03 -1.709900E-03 -2.008246E-03 -2.578373E-03 -2.000076E-03 -1.645365E-03 -1.462882E-03 -1.208273E-03 -1.146126E-03 -1.214196E-03 -1.082376E-03 -8.967163E-04 -1.154433E-03 +4.742525E-03 +2.646417E-03 +1.981783E-03 +1.856593E-03 +1.797685E-03 +2.122587E-03 +1.200823E-03 +2.177249E-03 +1.442840E-03 +1.477754E-03 +1.236325E-03 +1.048988E-03 +8.395164E-04 +7.380254E-04 +7.742837E-04 +8.235911E-04 cmfd dominance ratio 0.000E+00 0.000E+00 0.000E+00 0.000E+00 - 5.472E-01 - 5.521E-01 - 5.445E-01 - 5.527E-01 + 5.467E-01 + 5.518E-01 + 5.535E-01 + 5.500E-01 + 5.481E-01 + 5.478E-01 + 5.467E-01 + 5.465E-01 + 5.493E-01 5.488E-01 - 5.078E-01 - 5.474E-01 - 5.475E-01 - 5.473E-01 - 5.469E-01 - 5.461E-01 - 5.455E-01 - 5.454E-01 - 5.459E-01 - 5.460E-01 - 5.432E-01 + 5.491E-01 + 5.503E-01 + 5.529E-01 + 5.531E-01 + 5.534E-01 + 5.552E-01 cmfd openmc source comparison 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.186654E-03 -6.033650E-03 -3.920380E-03 -4.218939E-03 -4.591972E-03 -4.042772E-03 -4.100500E-03 -3.664495E-03 -3.266803E-03 -3.164213E-03 -3.310474E-03 -3.165822E-03 -3.849586E-03 -2.718170E-03 -2.431480E-03 -3.322902E-03 +9.168094E-03 +5.978693E-03 +4.369223E-03 +4.546309E-03 +4.222522E-03 +4.221686E-03 +4.604208E-03 +3.950286E-03 +2.939283E-03 +3.667020E-03 +2.592899E-03 +2.272158E-03 +1.229170E-03 +1.114150E-03 +1.060490E-03 +1.714222E-03 cmfd source -4.296288E-02 -7.964357E-02 -1.107722E-01 -1.359821E-01 -1.425321E-01 -1.356719E-01 -1.285829E-01 -1.040603E-01 -7.630230E-02 -4.348975E-02 +4.724285E-02 +8.305825E-02 +1.081058E-01 +1.314542E-01 +1.357299E-01 +1.359417E-01 +1.240918E-01 +1.087580E-01 +8.111239E-02 +4.450518E-02 diff --git a/tests/test_cmfd_nofeed/results_true.dat b/tests/test_cmfd_nofeed/results_true.dat index e70287bf77..308dd7d827 100644 --- a/tests/test_cmfd_nofeed/results_true.dat +++ b/tests/test_cmfd_nofeed/results_true.dat @@ -83,44 +83,44 @@ tally 2: 2.336090E+00 2.851840E-01 tally 3: -1.523800E+01 -1.170551E+01 +1.524100E+01 +1.171023E+01 1.071050E+00 5.839198E-02 -2.862100E+01 -4.111143E+01 +2.862800E+01 +4.113148E+01 1.892774E+00 1.812712E-01 -3.804200E+01 -7.314552E+01 +3.804600E+01 +7.316097E+01 2.423654E+00 2.968521E-01 -4.433500E+01 -9.878201E+01 +4.434600E+01 +9.882906E+01 2.823929E+00 4.033633E-01 -4.954300E+01 -1.229796E+02 +4.955300E+01 +1.230293E+02 3.226029E+00 5.265680E-01 -4.999000E+01 -1.256279E+02 +4.999400E+01 +1.256474E+02 3.232464E+00 5.286388E-01 -4.723500E+01 -1.120638E+02 +4.724300E+01 +1.121029E+02 3.015553E+00 4.606928E-01 -4.050800E+01 -8.237529E+01 +4.051300E+01 +8.239672E+01 2.592073E+00 3.412174E-01 -2.911800E+01 -4.263022E+01 +2.912700E+01 +4.265700E+01 1.875109E+00 1.785438E-01 -1.592800E+01 -1.279461E+01 +1.593500E+01 +1.280638E+01 1.038638E+00 5.538157E-02 tally 4: @@ -662,114 +662,114 @@ k cmfd 0.000000E+00 0.000000E+00 0.000000E+00 -1.177990E+00 -1.160491E+00 -1.145875E+00 -1.148719E+00 -1.140676E+00 -1.141509E+00 -1.143597E+00 -1.141954E+00 -1.150311E+00 -1.155088E+00 -1.155464E+00 -1.152786E+00 -1.156950E+00 -1.159040E+00 -1.160571E+00 -1.161251E+00 +1.180802E+00 +1.163440E+00 +1.148572E+00 +1.151423E+00 +1.143374E+00 +1.144091E+00 +1.146212E+00 +1.144900E+00 +1.153511E+00 +1.158766E+00 +1.159179E+00 +1.156627E+00 +1.160647E+00 +1.162860E+00 +1.164312E+00 +1.164928E+00 cmfd entropy 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.214145E+00 -3.222082E+00 -3.225870E+00 -3.230292E+00 -3.228784E+00 -3.228863E+00 -3.228331E+00 -3.230222E+00 -3.231212E+00 -3.230979E+00 -3.229831E+00 -3.229258E+00 -3.228559E+00 -3.227915E+00 -3.227427E+00 -3.229561E+00 +3.214195E+00 +3.222259E+00 +3.225989E+00 +3.230436E+00 +3.228875E+00 +3.229003E+00 +3.228502E+00 +3.230397E+00 +3.231417E+00 +3.231192E+00 +3.229995E+00 +3.229396E+00 +3.228730E+00 +3.228091E+00 +3.227600E+00 +3.229723E+00 cmfd balance 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.801684E-03 -3.228380E-03 -2.568997E-03 -2.195796E-03 -2.248884E-03 -3.405416E-03 -2.332198E-03 -2.576061E-03 -2.326651E-03 -2.324425E-03 -2.205364E-03 -2.112702E-03 -1.864656E-03 -1.804877E-03 -1.557106E-03 -1.312058E-03 +4.742525E-03 +3.110598E-03 +2.490108E-03 +2.114137E-03 +2.190200E-03 +3.281877E-03 +2.219193E-03 +2.458372E-03 +2.200863E-03 +2.181858E-03 +2.064212E-03 +1.961178E-03 +1.713250E-03 +1.665361E-03 +1.436016E-03 +1.193462E-03 cmfd dominance ratio 0.000E+00 0.000E+00 0.000E+00 0.000E+00 - 5.472E-01 - 5.510E-01 - 5.519E-01 - 5.535E-01 - 5.535E-01 + 5.467E-01 5.505E-01 - 5.488E-01 - 5.505E-01 - 5.510E-01 - 5.513E-01 - 5.510E-01 + 5.514E-01 + 5.531E-01 + 5.529E-01 + 5.501E-01 + 5.484E-01 + 5.500E-01 + 5.506E-01 5.508E-01 - 5.487E-01 - 5.489E-01 - 5.481E-01 - 5.499E-01 + 5.504E-01 + 5.500E-01 + 5.480E-01 + 5.482E-01 + 5.475E-01 + 5.493E-01 cmfd openmc source comparison 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.186654E-03 -5.964812E-03 -4.465905E-03 -4.119425E-03 -4.973577E-03 -4.092492E-03 -4.063342E-03 -2.804589E-03 -3.632667E-03 -5.005042E-03 -3.428575E-03 -3.007070E-03 -3.091465E-03 -3.030625E-03 -2.751739E-03 -1.762364E-03 +9.168094E-03 +5.976241E-03 +4.426550E-03 +4.107499E-03 +4.957716E-03 +4.026213E-03 +3.986000E-03 +2.702714E-03 +3.619345E-03 +4.909616E-03 +3.355042E-03 +2.945724E-03 +3.010811E-03 +2.965662E-03 +2.673073E-03 +1.669634E-03 cmfd source -4.538792E-02 -8.103354E-02 -1.045198E-01 -1.221411E-01 -1.398214E-01 -1.401011E-01 -1.305055E-01 -1.120110E-01 -8.032924E-02 -4.414939E-02 +4.539734E-02 +8.104913E-02 +1.045143E-01 +1.221516E-01 +1.398002E-01 +1.400323E-01 +1.304628E-01 +1.120006E-01 +8.038230E-02 +4.420934E-02 diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index ab1c43254f..bb151ae0e8 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -7,16 +7,8 @@ tally 1: 3.427342E+01 8.628000E+00 2.481430E+01 -8.628000E+00 -2.481430E+01 -5.102293E-01 -8.710841E-02 -8.628000E+00 -2.481430E+01 -9.329009E-01 -2.902534E-01 -5.102293E-01 -8.710841E-02 +8.632000E+00 +2.483728E+01 5.102293E-01 8.710841E-02 8.628000E+00 @@ -25,6 +17,14 @@ tally 1: 2.902534E-01 5.102293E-01 8.710841E-02 +5.087118E-01 +8.657086E-02 +8.632000E+00 +2.483728E+01 +9.328366E-01 +2.902108E-01 +5.087118E-01 +8.657086E-02 9.212024E+00 2.829472E+01 8.628000E+00 @@ -89,23 +89,23 @@ tally 1: 1.459209E-04 4.629047E-02 7.823267E-04 -8.628000E+00 -2.481430E+01 --4.712248E-02 -1.140942E-03 --6.431930E-02 -4.290580E-03 --9.251642E-02 -8.134201E-03 -1.020119E-04 -1.154184E-04 --2.994164E-02 -3.079076E-04 -2.128844E-02 -2.046549E-04 -1.637972E-02 -1.459209E-04 -4.629047E-02 -7.823267E-04 +8.632000E+00 +2.483728E+01 +-4.651997E-02 +1.133839E-03 +-6.416955E-02 +4.279418E-03 +-9.280565E-02 +8.095106E-03 +-2.078094E-04 +1.151292E-04 +-3.005568E-02 +3.104764E-04 +2.199519E-02 +2.179172E-04 +1.660645E-02 +1.451345E-04 +4.607553E-02 +7.673412E-04 1.014000E+01 3.427342E+01 From 9ab1501a0f3c5520103c154c1b2a37a01bd2873e Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 14:14:59 -0400 Subject: [PATCH 184/519] Fixed output error from merge --- src/output.F90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/output.F90 b/src/output.F90 index 70ccbd538f..80e65be102 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1400,7 +1400,8 @@ contains label = "Index (" // trim(to_str(ijk(1))) // ", " // & trim(to_str(ijk(2))) // ", " // trim(to_str(ijk(3))) // ")" end if - case (FILTER_ENERGYIN, FILTER_ENERGYOUT) + case (FILTER_ENERGYIN, FILTER_ENERGYOUT, FILTER_MU, FILTER_POLAR, & + FILTER_AZIMUTHAL) E0 = t % filters(i_filter) % real_bins(bin) E1 = t % filters(i_filter) % real_bins(bin + 1) label = "[" // trim(to_str(E0)) // ", " // trim(to_str(E1)) // ")" From a3b87ad37224dbf11de6e3e1a75c67121b09fe3e Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 14:16:04 -0400 Subject: [PATCH 185/519] Fixed source code standard issues that travis called me out on --- src/tally.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 2b805b27df..0b13dbeba4 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -176,7 +176,7 @@ contains ! weight times the multiplicity as the estimate for the number of ! neutrons exiting a reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & - (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then + (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then multiplicity = ONE else do m = 1, nuclides(p % event_nuclide) % n_reaction @@ -211,7 +211,7 @@ contains ! weight times the multiplicity as the estimate for the number of ! neutrons exiting a reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & - (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then + (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then multiplicity = ONE else do m = 1, nuclides(p % event_nuclide) % n_reaction @@ -246,7 +246,7 @@ contains ! weight times the multiplicity as the estimate for the number of ! neutrons exiting a reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & - (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then + (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then multiplicity = ONE else do m = 1, nuclides(p % event_nuclide) % n_reaction From 378d4fc0904ff15aba206e7c7ffb7462a744fe55 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 14:36:23 -0400 Subject: [PATCH 186/519] Some remaining updats to make from merge... --- openmc/filter.py | 3 ++- openmc/tallies.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/openmc/filter.py b/openmc/filter.py index 6dd4bdaff6..b99fb121b4 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -9,7 +9,8 @@ from openmc.checkvalue import check_type, check_iterable_type, \ check_greater_than, _isinstance _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', - 'mesh', 'energy', 'energyout', 'distribcell'] + 'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal', + 'distribcell'] class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally diff --git a/openmc/tallies.py b/openmc/tallies.py index 20a6af3f29..2d2b248b38 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1278,6 +1278,23 @@ class Tally(object): filter_bins = np.tile(filter_bins, tile_factor) df[filter.type + ' [MeV]'] = filter_bins + # mu, polar, and azimuthal + elif filter.type in ['mu', 'polar', 'azimuthal']: + bins = filter.bins + num_bins = filter.num_bins + + # Create strings for + template = '{0:1.2f} - {1:1.2f}' + filter_bins = [] + for i in range(num_bins): + filter_bins.append(template.format(bins[i], bins[i+1])) + + # Tile the mu bins into a DataFrame column + filter_bins = np.repeat(filter_bins, filter.stride) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + df[filter.type] = filter_bins + # universe, material, surface, cell, and cellborn filters else: filter_bins = np.repeat(filter.bins, filter.stride) From e30c609b81a062ed60fa93281e16200daad79d29 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 14:42:19 -0400 Subject: [PATCH 187/519] Undoing commit i made to incorrect branch --- openmc/filter.py | 3 +-- openmc/tallies.py | 17 ----------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index b99fb121b4..6dd4bdaff6 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -9,8 +9,7 @@ from openmc.checkvalue import check_type, check_iterable_type, \ check_greater_than, _isinstance _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', - 'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal', - 'distribcell'] + 'mesh', 'energy', 'energyout', 'distribcell'] class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally diff --git a/openmc/tallies.py b/openmc/tallies.py index 2d2b248b38..20a6af3f29 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1278,23 +1278,6 @@ class Tally(object): filter_bins = np.tile(filter_bins, tile_factor) df[filter.type + ' [MeV]'] = filter_bins - # mu, polar, and azimuthal - elif filter.type in ['mu', 'polar', 'azimuthal']: - bins = filter.bins - num_bins = filter.num_bins - - # Create strings for - template = '{0:1.2f} - {1:1.2f}' - filter_bins = [] - for i in range(num_bins): - filter_bins.append(template.format(bins[i], bins[i+1])) - - # Tile the mu bins into a DataFrame column - filter_bins = np.repeat(filter_bins, filter.stride) - tile_factor = data_size / len(filter_bins) - filter_bins = np.tile(filter_bins, tile_factor) - df[filter.type] = filter_bins - # universe, material, surface, cell, and cellborn filters else: filter_bins = np.repeat(filter.bins, filter.stride) From 4ce47f814e7f93302f44822d41beb714e05127a5 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 26 Sep 2015 14:43:56 -0400 Subject: [PATCH 188/519] Applying changes to be consistent wit hmerge --- openmc/tallies.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 7e733cec37..17abb5b194 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -923,8 +923,7 @@ class Tally(object): bins = list(itertools.product(*xyz)) # Create list of 2-tuples for energy boundary bins - elif filter.type in ['energy', 'energyout', 'mu', 'polar', - 'azimuthal']: + elif filter.type in ['energy', 'energyout']: bins = [] for k in range(filter.num_bins): bins.append((filter.bins[k], filter.bins[k+1])) @@ -1279,6 +1278,7 @@ class Tally(object): filter_bins = np.tile(filter_bins, tile_factor) df[filter.type + ' [MeV]'] = filter_bins + # mu, polar, and azimuthal elif filter.type in ['mu', 'polar', 'azimuthal']: bins = filter.bins num_bins = filter.num_bins From d0a85cd0825938417f3b42c3160e0c3fdc6c1bbe Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 16:06:42 -0400 Subject: [PATCH 189/519] Python API group condensation now working for multi-group scattering matrices --- openmc/filter.py | 2 +- openmc/mgxs/mgxs.py | 63 ++++++++++++++++++++++++--------------------- openmc/tallies.py | 46 +++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 30 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 5c97fb9e35..f740247242 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -118,7 +118,7 @@ class Filter(object): if self.bins is None: return 0 elif self.type in ['energy', 'energyout']: - return len(self.bins)-1 + return len(self.bins) - 1 elif self.type in ['cell', 'cellborn', 'surface', 'universe', 'material']: return len(self.bins) else: diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index eadcbda885..a0e52ab5f2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -364,35 +364,40 @@ class MultiGroupXS(object): low_index = np.where(self.energy_groups.group_edges == low)[0][0] energy_indices.append(low_index) - # FIXME: This won't work for scattering matrices - # Overwrite tallies with new energy-condensed versions - # NOTE: This assumes that the tallies were loaded such with a single - # domain filter and energy filter in that order + fine_edges = self.energy_groups.group_edges + + # Condense each of the tallies to the coarse group structure for tally_type, tally in condensed_xs.tallies.items(): - try: - # Find the tally's energy filter and update to coarse groups - energy_filter = tally.find_filter('energy') - energy_filter.bins = coarse_groups.group_edges + # Make condensed tally derived and null out sum, sum_sq + tally._derived = True + tally._sum = None + tally._sum_sq = None - # Make the condensed tally derived and ull out sum, sum_sq - tally._derived = True - tally._sum = None - tally._sum_sq = None + # Get tally data arrays reshaped with one dimension per filter + mean = tally.get_reshaped_data(value='mean') + std_dev = tally.get_reshaped_data(value='std_dev') - # Sum up mean, std. dev fine groups within each coarse group - tally._mean = np.add.reduceat(tally.mean, energy_indices) - tally._std_dev = tally.std_dev**2 - tally._std_dev = np.add.reduceat(tally.std_dev, energy_indices) - tally._std_dev = np.sqrt(tally.std_dev) + # Sum across all applicable fine energy group filters + for i, filter in enumerate(tally.filters): + if 'energy' in filter.type and all(filter.bins == fine_edges): + filter.bins = coarse_groups.group_edges + mean = np.add.reduceat(mean, energy_indices, axis=i) + std_dev = np.add.reduceat(std_dev**2, energy_indices, axis=i) + std_dev = np.sqrt(std_dev) - # If the tally had no energy filter, then pass - except ValueError: - pass + # Reshape condensed data arrays with one dimension for all filters + new_shape = \ + (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) + mean = np.reshape(mean, new_shape) + std_dev = np.reshape(std_dev, new_shape) + + # Override tally's data with the new condensed data + tally._mean = mean + tally._std_dev = std_dev # Compute the energy condensed multi-group cross-section condensed_xs.compute_xs() - return condensed_xs def get_subdomain_avg_xs(self, subdomains='all'): @@ -432,7 +437,7 @@ class MultiGroupXS(object): else: cv.check_iterable_type('subdomains', subdomains, Integral) - # Clone this MultiGroupXS to initialize the condensed version + # Clone this MultiGroupXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) # Reset subdomain indices and offsets for distribcell domains @@ -1115,7 +1120,7 @@ class ScatterMatrixXS(MultiGroupXS): # Initialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correction='P0'): + def compute_xs(self, correction=None): """Computes the multi-group scattering matrix using OpenMC tally arithmetic. @@ -1146,8 +1151,8 @@ class ScatterMatrixXS(MultiGroupXS): subdomains='all', value='mean'): """Returns an array of multi-group cross-sections. - This method constructs a 2D NumPy array for the requested multi-group - cross-section data data for one or more energy groups and subdomains. + This method constructs a 2D NumPy array for the requested scattering + matrix data data for one or more energy groups and subdomains. Parameters ---------- @@ -1299,7 +1304,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): # Intialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correction='P0'): + def compute_xs(self, correction=None): """Computes the multi-group nu-scattering matrix using OpenMC tally arithmetic. @@ -1342,9 +1347,9 @@ class Chi(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges - energyout_filter1 = openmc.Filter('energyout', group_edges) - energyout_filter2 = openmc.Filter('energyout', [group_edges[0], group_edges[-1]]) - filters = [[energyout_filter2], [energyout_filter1]] + fine_energyout = openmc.Filter('energyout', group_edges) + coarse_energyout = openmc.Filter('energyout', [group_edges[0], group_edges[-1]]) + filters = [[coarse_energyout], [fine_energyout]] # Intialize the Tallies super(Chi, self).create_tallies(scores, filters, keys, estimator) diff --git a/openmc/tallies.py b/openmc/tallies.py index 3a2f776792..785fdb9ddc 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1174,6 +1174,52 @@ class Tally(object): return df + def get_reshaped_data(self, value='mean'): + """Returns an array of tally data with one dimension per filter. + + The tally data in OpenMC is stored as a 3D array with the dimensions + corresponding to filters, nuclides and scores. As a result, tally data + can be opaque for a user to directly index (i.e., without use of the + Tally.get_values(...) routine) since one must know how to properly use + the number of bins and strides for each filter to index into the first + (filter) dimension. + + This builds and returns a reshaped version of the tally data array with + unique dimensions corresponding to each tally filter. For example, + suppose this tally has arrays of data with shape (8,5,5) corresponding + to two filters (2 and 4 bins, respectively), five nuclides and five + scores. This routine will return a version of the data array with the + with a new shape of (2,4,5,5) such that the first two dimensions now + correspond directly to the two filters with two and four bins. + + Parameters + --------- + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted + + Returns + ------- + float or ndarray + A scalar or NumPy array of the Tally data indexed in the order + each filter, nuclide and score is listed in the parameters. + + """ + + # Get the 3D array of data in filters, nuclides and scores + data = self.get_values(value=value) + + # Build a new array shape with one dimension per filter + new_shape = () + for filter in self.filters: + new_shape += (filter.num_bins, ) + new_shape += (self.num_nuclides,) + new_shape += (self.num_score_bins,) + + # Reshape the data with one dimension for each filter + data = np.reshape(data, new_shape) + return data + def export_results(self, filename='tally-results', directory='.', format='hdf5', append=True): """Exports tallly results to an HDF5 or Python pickle binary file. From 02c30fd5de7f4c26f5e97a6f2103a4736af9a226 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 17:12:03 -0400 Subject: [PATCH 190/519] Removed Tally.summation(...) routine in place of explicit tally summations in openmc.mgxs module for subdomain averaging --- openmc/filter.py | 5 ++- openmc/mgxs/mgxs.py | 53 +++++++++++++++++++++----- openmc/tallies.py | 90 --------------------------------------------- 3 files changed, 47 insertions(+), 101 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index f740247242..b8865a1846 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -318,6 +318,7 @@ class Filter(object): boolean Whether or not the other filter is a subset of this filter """ + if not isinstance(other, Filter): return False elif self.type != other.type: @@ -325,8 +326,8 @@ class Filter(object): elif self.type in ['energy', 'energyout']: return np.all(self.bins == other.bins) - for bin in other.bins: - if bin not in self.bins: + for bin in self.bins: + if bin not in other.bins: return False return True diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index a0e52ab5f2..fc763592f6 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -403,7 +403,9 @@ class MultiGroupXS(object): def get_subdomain_avg_xs(self, subdomains='all'): """Construct a subdomain-averaged version of this cross-section. - This is primarily useful for averaging across distribcell instances. + This is primarily useful for averaging across distribcell instances or + mesh cells. This routine performs spatial homogenization to compute the + scalar flux-weighted average cross-section across the subdomains. Parameters ---------- @@ -440,17 +442,49 @@ class MultiGroupXS(object): # Clone this MultiGroupXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) - # Reset subdomain indices and offsets for distribcell domains + # If domain is distribcell, make subdomain-averaged a 'cell' domain if self.domain_type == 'distribcell': + avg_xs.domain_type = 'cell' avg_xs._offset = 0 + # TODO: Implement this for mesh tallies + elif self.domain_type == 'mesh': + raise NotImplementedError('Average mesh xs are not yet implemented') - # Overwrite tallies with new subdomain-averaged versions - avg_xs._tallies = {} - for tally_type, tally in self.tallies.items(): - tally_sum = tally.summation(filter_type=self.domain_type, - filter_bins=subdomains) - tally_sum /= len(subdomains) - avg_xs.tallies[tally_type] = tally_sum + # Average each of the tallies across subdomains + for tally_type, tally in avg_xs.tallies.items(): + + # Make condensed tally derived and null out sum, sum_sq + tally._derived = True + tally._sum = None + tally._sum_sq = None + + # Get tally data arrays reshaped with one dimension per filter + mean = tally.get_reshaped_data(value='mean') + std_dev = tally.get_reshaped_data(value='std_dev') + + # Get the mean of the mean, std. dev. across requested subdomains + mean = np.mean(mean[subdomains, ...], axis=0) + std_dev = np.mean(std_dev[subdomains, ...]**2, axis=0) + std_dev = np.sqrt(std_dev) + + # If domain is distribcell, make subdomain-averaged a 'cell' domain + domain_filter = tally.find_filter(self._domain_type) + if domain_filter.type == 'distribcell': + domain_filter.type = 'cell' + domain_filter.num_bins = 1 + # TODO: Implement this for mesh tallies + elif domain_filter.type == 'mesh': + raise NotImplementedError('Average mesh xs are not yet implemented') + + # Reshape averaged data arrays with one dimension for all filters + new_shape = \ + (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,) + mean = np.reshape(mean, new_shape) + std_dev = np.reshape(std_dev, new_shape) + + # Override tally's data with the new condensed data + tally._mean = mean + tally._std_dev = std_dev # Compute the subdomain-averaged multi-group cross-section avg_xs.compute_xs() @@ -733,6 +767,7 @@ class MultiGroupXS(object): df = self.get_pandas_dataframe() # Capitalize column label strings + df.columns = df.columns.astype(str) df.columns = map(str.title, df.columns) # Export the data using Pandas IO API diff --git a/openmc/tallies.py b/openmc/tallies.py index 785fdb9ddc..a5b55d810e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2316,96 +2316,6 @@ class Tally(object): return new_tally - def summation(self, scores=[], filter_type=None, - filter_bins=[], nuclides=[]): - """Build a sliced tally for the specified filter bins, nuclides, scores. - - This method constructs a new tally to encapsulate a subset of the data - represented by this tally. The subset of data to include in the tally - slice is determined by the scores, filter bins and nuclides specified - in the input parameters. - - Parameters - ---------- - scores : list - A list of one or more score strings to sum across - (e.g., ['absorption', 'nu-fission']; default is []) - - filter_type : str - A filter type string (e.g., 'cell', 'energy') corresponding to the - filter bins to sum across - - filter_bins : Iterable of Integral or tuple - A list of the filter bins corresponding to the filters parameter - Each bin in the list is the integer ID for 'material', 'surface', - 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer - for the cell instance ID for 'distribcell Filters. Each bin is a - 2-tuple of floats for 'energy' and 'energyout' filters corresponding - to the energy boundaries of the bin of interest. Each bin is an - (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of - interest. - - nuclides : list - A list of nuclide name strings to sum across - (e.g., ['U-235', 'U-238']; default is []) - - Returns - ------- - Tally - A new tally which encapsulates the sum of data requested. - - """ - - # If user did not specify any scores, do not sum across scores - if len(scores) == 0: - scores = [[]] - # Sum across any scores specified by the user - else: - scores = [[score] for score in scores] - - # If user did not specify any nuclides, do not sum across nuclides - if len(nuclides) == 0: - nuclides = [[]] - # Sum across any nuclides specified by the user - else: - nuclides = [[nuclide] for nuclide in nuclides] - - # Sum across any filter bins specified by the user - if filter_type in FILTER_TYPES.values(): - filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] - filters = [[filter_type]] - # If user did not specify a filter type, do not sum across filter bins - else: - filter_bins = [[]] - filters = [[]] - - # Initialize Tally sum - tally_sum = 0 - - # Iterate over all Tally slice operands in summation - prod = [scores, filters, filter_bins, nuclides] - summed_filters = defaultdict(list) - for scores, filters, filter_bins, nuclides in itertools.product(*prod): - tally_slice = self.get_slice(scores, filters, filter_bins, nuclides) - - # Remove filters summed across to avoid bulky CrossFilters - if filter_type: - filter = tally_slice.find_filter(filter_type) - tally_slice.remove_filter(filter) - summed_filters[filter_type].append(filter) - - # Accumulate this Tally slice into the Tally sum - tally_sum += tally_slice - - # FIXME: test if this works for filter - for filter_type in summed_filters: - filters = summed_filters[filter_type] - for i in range(1, len(filters)): - filters[i] = CrossFilter(filters[i-1], filters[i], '+') - tally_sum.add_filter(filters[-1]) - - return tally_sum - def tile_filter(self, new_filter): """Combines filters, scores and nuclides with another tally. From a8ccd78ab63d349e689ec4a8427a4997e8ccd88b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 17:32:10 -0400 Subject: [PATCH 191/519] Removed stubs for mesh domains in Python API openmc.mgxs module --- openmc/mgxs/mgxs.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index fc763592f6..3c41a4d28a 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -21,14 +21,12 @@ if sys.version_info[0] >= 3: DOMAIN_TYPES = ['cell', 'distribcell', 'universe', - 'material', - 'mesh'] + 'material'] # Supported domain objects DOMAINS = [openmc.Cell, openmc.Universe, - openmc.Material, - openmc.Mesh] + openmc.Material] class MultiGroupXS(object): @@ -41,9 +39,9 @@ class MultiGroupXS(object): Parameters ---------- - domain : Material or Cell or Universe or Mesh + domain : Material or Cell or Universe The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe' or 'mesh'} + domain_type : {'material', 'cell', 'distribcell', 'universe'} The domain type for spatial homogenization energy_groups : EnergyGroups The energy group structure for energy condensation @@ -57,9 +55,9 @@ class MultiGroupXS(object): Name of the multi-group cross-section xs_type : str Cross-section type (e.g., 'total', 'nu-fission', etc.) - domain : Material or Cell or Universe or Mesh + domain : Material or Cell or Universe Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe' or 'mesh'} + domain_type : {'material', 'cell', 'distribcell', 'universe'} Domain type for spatial homogenization energy_groups : EnergyGroups Energy group structure for energy condensation @@ -403,8 +401,8 @@ class MultiGroupXS(object): def get_subdomain_avg_xs(self, subdomains='all'): """Construct a subdomain-averaged version of this cross-section. - This is primarily useful for averaging across distribcell instances or - mesh cells. This routine performs spatial homogenization to compute the + This is primarily useful for averaging across distribcell instances. + This routine performs spatial homogenization to compute the scalar flux-weighted average cross-section across the subdomains. Parameters @@ -446,9 +444,6 @@ class MultiGroupXS(object): if self.domain_type == 'distribcell': avg_xs.domain_type = 'cell' avg_xs._offset = 0 - # TODO: Implement this for mesh tallies - elif self.domain_type == 'mesh': - raise NotImplementedError('Average mesh xs are not yet implemented') # Average each of the tallies across subdomains for tally_type, tally in avg_xs.tallies.items(): @@ -472,9 +467,6 @@ class MultiGroupXS(object): if domain_filter.type == 'distribcell': domain_filter.type = 'cell' domain_filter.num_bins = 1 - # TODO: Implement this for mesh tallies - elif domain_filter.type == 'mesh': - raise NotImplementedError('Average mesh xs are not yet implemented') # Reshape averaged data arrays with one dimension for all filters new_shape = \ From 4f86e8819ad2e9b5d8c38851a690518be333d7d1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 17:41:30 -0400 Subject: [PATCH 192/519] Renamed MultiGroupXS xs_type attribute to rxn_type to allow xs_type to be used for macro vs. micro --- openmc/mgxs/mgxs.py | 190 ++++++++++++++++++++++---------------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 3c41a4d28a..25807227dc 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -30,12 +30,12 @@ DOMAINS = [openmc.Cell, class MultiGroupXS(object): - """A multi-group cross-section for some energy group structure within + """A multi-group cross section for some energy group structure within some spatial domain. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated - multi-group cross-sections for deterministic neutronics calculations. + multi-group cross sections for deterministic neutronics calculations. Parameters ---------- @@ -46,15 +46,15 @@ class MultiGroupXS(object): energy_groups : EnergyGroups The energy group structure for energy condensation name : str, optional - Name of the multi-group cross-section. Used as a label to identify + Name of the multi-group cross section. Used as a label to identify tallies in OpenMC tallies.xml file. Attributes ---------- name : str, optional - Name of the multi-group cross-section - xs_type : str - Cross-section type (e.g., 'total', 'nu-fission', etc.) + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) domain : Material or Cell or Universe Domain for spatial homogenization domain_type : {'material', 'cell', 'distribcell', 'universe'} @@ -64,10 +64,10 @@ class MultiGroupXS(object): num_groups : Integral Number of energy groups tallies : dict - OpenMC tallies needed to compute the multi-group cross-section + OpenMC tallies needed to compute the multi-group cross section xs_tally : Tally - Derived tally for the multi-group cross-section. This attribute - is None unless the multi-group cross-section has been computed. + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. """ @@ -78,7 +78,7 @@ class MultiGroupXS(object): energy_groups=None, name=''): self._name = '' - self._xs_type = None + self._rxn_type = None self._domain = None self._domain_type = None self._energy_groups = None @@ -101,7 +101,7 @@ class MultiGroupXS(object): if existing is None: clone = type(self).__new__(type(self)) clone._name = self.name - clone._xs_type = self.xs_type + clone._rxn_type = self.rxn_type clone._domain = self.domain clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) @@ -125,8 +125,8 @@ class MultiGroupXS(object): return self._name @property - def xs_type(self): - return self._xs_type + def rxn_type(self): + return self._rxn_type @property def domain(self): @@ -181,7 +181,7 @@ class MultiGroupXS(object): @abc.abstractmethod def create_tallies(self, scores, all_filters, keys, estimator): - """Instantiates tallies needed to compute the multi-group cross-section. + """Instantiates tallies needed to compute the multi-group cross section. This is a helper method for MultiGroupXS subclasses to create tallies for input file generation. The tallies are stored in the tallies dict. @@ -224,15 +224,15 @@ class MultiGroupXS(object): @abc.abstractmethod def compute_xs(self): - """Computes multi-group cross-sections using OpenMC tally arithmetic.""" + """Computes multi-group cross sections using OpenMC tally arithmetic.""" return def load_from_statepoint(self, statepoint): """Extracts tallies in an OpenMC StatePoint with the data needed to - compute multi-group cross-sections. + compute multi-group cross sections. - This method is needed to compute cross-section data from tallies + This method is needed to compute cross section data from tallies in an OpenMC StatePoint object. Parameters @@ -265,10 +265,10 @@ class MultiGroupXS(object): self.tallies[tally_type] = sp_tally def get_xs(self, groups='all', subdomains='all', value='mean'): - """Returns an array of multi-group cross-sections. + """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested multi-group - cross-section data data for one or more energy groups and subdomains. + cross section data data for one or more energy groups and subdomains. Parameters ---------- @@ -285,19 +285,19 @@ class MultiGroupXS(object): Returns ------- xs : ndarray - A NumPy array of the multi-group cross-section indexed in the order + A NumPy array of the multi-group cross section indexed in the order each group and subdomain is listed in the parameters. Raises ------ ValueError - When this method is called before the multi-group cross-section is + When this method is called before the multi-group cross section is computed from tally data. """ if self.xs_tally is None: - msg = 'Unable to get cross-section since it has not been computed' + msg = 'Unable to get cross section since it has not been computed' raise ValueError(msg) cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) @@ -319,13 +319,13 @@ class MultiGroupXS(object): filters.append('energy') filter_bins.append((self.energy_groups.get_group_bounds(group),)) - # Query the multi-group cross-section tally for the data + # Query the multi-group cross section tally for the data xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) return xs def get_condensed_xs(self, coarse_groups): - """Construct an energy-condensed version of this cross-section. + """Construct an energy-condensed version of this cross section. Parameters ---------- @@ -340,8 +340,8 @@ class MultiGroupXS(object): """ if self.xs_tally is None: - msg = 'Unable to get a condensed coarse group cross-section ' \ - 'since the fine group cross-section has not been computed' + msg = 'Unable to get a condensed coarse group cross section ' \ + 'since the fine group cross section has not been computed' raise ValueError(msg) cv.check_type('coarse_groups', coarse_groups, EnergyGroups) @@ -394,16 +394,16 @@ class MultiGroupXS(object): tally._mean = mean tally._std_dev = std_dev - # Compute the energy condensed multi-group cross-section + # Compute the energy condensed multi-group cross section condensed_xs.compute_xs() return condensed_xs def get_subdomain_avg_xs(self, subdomains='all'): - """Construct a subdomain-averaged version of this cross-section. + """Construct a subdomain-averaged version of this cross section. This is primarily useful for averaging across distribcell instances. This routine performs spatial homogenization to compute the - scalar flux-weighted average cross-section across the subdomains. + scalar flux-weighted average cross section across the subdomains. Parameters ---------- @@ -418,14 +418,14 @@ class MultiGroupXS(object): Raises ------ ValueError - When this method is called before the multi-group cross-section is + When this method is called before the multi-group cross section is computed from tally data. """ if self.xs_tally is None: - msg = 'Unable to get subdomain-averaged cross-section since the ' \ - 'subdomain-distributed cross-section has not been computed' + msg = 'Unable to get subdomain-averaged cross section since the ' \ + 'subdomain-distributed cross section has not been computed' raise ValueError(msg) # Construct a collection of the subdomain filter bins to average across @@ -478,18 +478,18 @@ class MultiGroupXS(object): tally._mean = mean tally._std_dev = std_dev - # Compute the subdomain-averaged multi-group cross-section + # Compute the subdomain-averaged multi-group cross section avg_xs.compute_xs() return avg_xs def print_xs(self, subdomains='all'): - """Prints a string representation for the multi-group cross-section. + """Prints a string representation for the multi-group cross section. Parameters ---------- subdomains : Iterable of Integral or 'all' - The subdomain IDs of the cross-sections to include in the report + The subdomain IDs of the cross sections to include in the report """ @@ -498,11 +498,11 @@ class MultiGroupXS(object): # Build header for string with type and domain info string = 'Multi-Group XS\n' - string += '{0: <16}=\t{1}\n'.format('\tType', self.xs_type) + string += '{0: <16}=\t{1}\n'.format('\tType', self.rxn_type) string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - # Append cross-section data if it has been computed + # Append cross section data if it has been computed if self.xs_tally is not None: if subdomains == 'all': if self.domain_type == 'distribcell': @@ -516,7 +516,7 @@ class MultiGroupXS(object): if self.domain_type == 'distribcell': string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) - string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' # Loop over energy groups ranges @@ -558,7 +558,7 @@ class MultiGroupXS(object): # Store all of this MultiGroupXS' class attributes in the dictionary xs_results['name'] = self.name - xs_results['xs_type'] = self.xs_type + xs_results['rxn_type'] = self.rxn_type xs_results['domain_type'] = self.domain_type xs_results['domain'] = self.domain xs_results['energy_groups'] = self.energy_groups @@ -606,7 +606,7 @@ class MultiGroupXS(object): # Store the MultiGroupXS class attributes self.name = xs_results['name'] - self._xs_type = xs_results['xs_type'] + self._rxn_type = xs_results['rxn_type'] self.domain_type = xs_results['domain_type'] self.domain = xs_results['domain'] self.energy_groups = xs_results['energy_groups'] @@ -615,12 +615,12 @@ class MultiGroupXS(object): self._offset = xs_results['offset'] def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True): - """Export the multi-group cross-section data into an HDF5 binary file. + """Export the multi-group cross section data into an HDF5 binary file. This routine constructs an HDF5 file which stores the multi-group - cross-section data. The data is be stored in a hierarchy of HDF5 groups + cross section data. The data is be stored in a hierarchy of HDF5 groups from the domain type, domain id, subdomain id (for distribcell domains), - and cross-section type. Two datasets for the mean and standard deviation + and cross section type. Two datasets for the mean and standard deviation are stored for each subddomain entry in the HDF5 file. NOTE: This requires the h5py Python package. @@ -640,7 +640,7 @@ class MultiGroupXS(object): Raises ------ ValueError - When this method is called before the multi-group cross-section is + When this method is called before the multi-group cross section is computed from tally data. ImportError When h5py is not installed. @@ -649,7 +649,7 @@ class MultiGroupXS(object): if self.xs_tally is None: msg = 'Unable to get build HDF5 store since the ' \ - 'cross-section has not been computed' + 'cross section has not been computed' raise ValueError(msg) # Attempt to import h5py @@ -694,10 +694,10 @@ class MultiGroupXS(object): else: subdomain_group = domain_group - # Create a separate HDF5 group for the xs type - xs_group = subdomain_group.require_group(self.xs_type) + # Create a separate HDF5 group for the rxn type + xs_group = subdomain_group.require_group(self.rxn_type) - # Extract the cross-section for this + # Extract the cross section for this average = self.get_xs(subdomains=[subdomain], value='mean') std_dev = self.get_xs(subdomains=[subdomain], value='std_dev') average = average.squeeze() @@ -713,10 +713,10 @@ class MultiGroupXS(object): xs_results.close() def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv'): - """Export the multi-group cross-section data to a file. + """Export the multi-group cross section data to a file. This routine leverages the functionality in the Pandas library to - export the multi-group cross-section data in a variety of output + export the multi-group cross section data in a variety of output file formats for storage and/or post-processing. Parameters @@ -771,7 +771,7 @@ class MultiGroupXS(object): df.to_pickle(filename + '.pkl') elif format == 'latex': if self.domain_type == 'distribcell': - msg = 'Unable to export distribcell multi-group cross-section' \ + msg = 'Unable to export distribcell multi-group cross section' \ 'data to a LaTeX table' raise NotImplementedError(msg) @@ -796,7 +796,7 @@ class MultiGroupXS(object): """Build a Pandas DataFrame for the MultiGroupXS data. This routine leverages the Tally.get_pandas_dataframe(...) routine, but - renames the columns with terminology appropriate for cross-section data. + renames the columns with terminology appropriate for cross section data. Parameters ---------- @@ -815,19 +815,19 @@ class MultiGroupXS(object): Returns ------- pandas.DataFrame - A Pandas DataFrame for the cross-section data. + A Pandas DataFrame for the cross section data. Raises ------ ValueError - When this method is called before the multi-group cross-section is + When this method is called before the multi-group cross section is computed from tally data. """ if self.xs_tally is None: msg = 'Unable to get Pandas DataFrame since the ' \ - 'cross-section has not been computed' + 'cross section has not been computed' raise ValueError(msg) # Get a Pandas DataFrame from the derived xs tally @@ -871,10 +871,10 @@ class TotalXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(TotalXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'total' + self._rxn_type = 'total' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'total'] @@ -890,7 +890,7 @@ class TotalXS(MultiGroupXS): super(TotalXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the multi-group total cross-sections using OpenMC + """Computes the multi-group total cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['total'] / self.tallies['flux'] @@ -902,10 +902,10 @@ class TransportXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(TransportXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'transport' + self._rxn_type = 'transport' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'total', 'scatter-P1'] @@ -928,7 +928,7 @@ class TransportXS(MultiGroupXS): self.tallies['scatter-P1'].filters[-1].type = 'energy' def compute_xs(self): - """Computes the multi-group transport cross-sections using OpenMC + """Computes the multi-group transport cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] @@ -941,10 +941,10 @@ class AbsorptionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(AbsorptionXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'absorption' + self._rxn_type = 'absorption' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'absorption'] @@ -960,7 +960,7 @@ class AbsorptionXS(MultiGroupXS): super(AbsorptionXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the multi-group absorption cross-sections using OpenMC + """Computes the multi-group absorption cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['absorption'] / self.tallies['flux'] @@ -972,10 +972,10 @@ class CaptureXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(CaptureXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'capture' + self._rxn_type = 'capture' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'absorption', 'fission'] @@ -991,7 +991,7 @@ class CaptureXS(MultiGroupXS): super(CaptureXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the multi-group capture cross-sections using OpenMC + """Computes the multi-group capture cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['absorption'] - self.tallies['fission'] @@ -1004,10 +1004,10 @@ class FissionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(FissionXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'fission' + self._rxn_type = 'fission' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'fission'] @@ -1023,7 +1023,7 @@ class FissionXS(MultiGroupXS): super(FissionXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the multi-group fission cross-sections using OpenMC + """Computes the multi-group fission cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['fission'] / self.tallies['flux'] @@ -1035,10 +1035,10 @@ class NuFissionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(NuFissionXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'nu-fission' + self._rxn_type = 'nu-fission' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'nu-fission'] @@ -1054,7 +1054,7 @@ class NuFissionXS(MultiGroupXS): super(NuFissionXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the multi-group nu-fission cross-sections using OpenMC + """Computes the multi-group nu-fission cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] @@ -1066,10 +1066,10 @@ class ScatterXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(ScatterXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'scatter' + self._rxn_type = 'scatter' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'scatter'] @@ -1085,7 +1085,7 @@ class ScatterXS(MultiGroupXS): super(ScatterXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the scattering multi-group cross-sections using + """Computes the scattering multi-group cross sections using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['scatter'] / self.tallies['flux'] @@ -1097,10 +1097,10 @@ class NuScatterXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(NuScatterXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'nu-scatter' + self._rxn_type = 'nu-scatter' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] @@ -1116,7 +1116,7 @@ class NuScatterXS(MultiGroupXS): super(NuScatterXS, self).create_tallies(scores, filters, keys, estimator) def compute_xs(self): - """Computes the nu-scattering multi-group cross-section using OpenMC + """Computes the nu-scattering multi-group cross section using OpenMC tally arithmetic.""" self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] @@ -1128,10 +1128,10 @@ class ScatterMatrixXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'scatter matrix' + self._rxn_type = 'scatter matrix' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) @@ -1176,7 +1176,7 @@ class ScatterMatrixXS(MultiGroupXS): def get_xs(self, in_groups='all', out_groups='all', subdomains='all', value='mean'): - """Returns an array of multi-group cross-sections. + """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested scattering matrix data data for one or more energy groups and subdomains. @@ -1199,19 +1199,19 @@ class ScatterMatrixXS(MultiGroupXS): Returns ------- xs : ndarray - A NumPy array of the multi-group cross-section indexed in the order + A NumPy array of the multi-group cross section indexed in the order each group and subdomain is listed in the parameters. Raises ------ ValueError - When this method is called before the multi-group cross-section is + When this method is called before the multi-group cross section is computed from tally data. """ if self.xs_tally is None: - msg = 'Unable to get cross-section since it has not been computed' + msg = 'Unable to get cross section since it has not been computed' raise ValueError(msg) cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) @@ -1240,19 +1240,19 @@ class ScatterMatrixXS(MultiGroupXS): filters.append('energyout') filter_bins.append((self.energy_groups.get_group_bounds(group),)) - # Query the multi-group cross-section tally for the data + # Query the multi-group cross section tally for the data xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) xs = np.nan_to_num(xs) return xs def print_xs(self, subdomains='all'): - """Prints a string representation for the multi-group cross-section. + """Prints a string representation for the multi-group cross section. Parameters ---------- subdomains : Iterable of Integral or 'all' - The subdomain IDs of the cross-sections to include in the report + The subdomain IDs of the cross sections to include in the report """ @@ -1261,11 +1261,11 @@ class ScatterMatrixXS(MultiGroupXS): # Build header for string with type and domain info string = 'Multi-Group XS\n' - string += '{0: <16}=\t{1}\n'.format('\tType', self.xs_type) + string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type) string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - # Append cross-section data if it has been computed + # Append cross section data if it has been computed if self.xs_tally is not None: string += '{0: <16}\n'.format('\tEnergy Groups:') template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' @@ -1288,7 +1288,7 @@ class ScatterMatrixXS(MultiGroupXS): string += \ '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) - string += '{0: <16}\n'.format('\tCross-Sections [cm^-1]:') + string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') template = '{0: <12}Group {1} -> Group {2}:\t\t' # Loop over incoming/outgoing energy groups ranges @@ -1312,10 +1312,10 @@ class NuScatterMatrixXS(ScatterMatrixXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'nu-scatter matrix' + self._rxn_type = 'nu-scatter matrix' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter', 'scatter-P1'] @@ -1362,10 +1362,10 @@ class Chi(MultiGroupXS): def __init__(self, domain=None, domain_type=None, groups=None, name=''): super(Chi, self).__init__(domain, domain_type, groups, name) - self._xs_type = 'chi' + self._rxn_type = 'chi' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross-section.""" + """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created scores = ['nu-fission', 'nu-fission'] From ddb249049cffd9a78c17c88b81dd2c27f43a22a6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 26 Sep 2015 19:32:15 -0400 Subject: [PATCH 193/519] Removed MultiGroupXS.pickle/unpickle routines, added initial implementatoin for micro multi-group cross-sectoins --- openmc/mgxs/mgxs.py | 433 ++++++++++++++++++++++++++------------------ 1 file changed, 260 insertions(+), 173 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 25807227dc..d079445f04 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -4,7 +4,6 @@ import os import sys import copy import abc -import pickle import numpy as np @@ -75,10 +74,11 @@ class MultiGroupXS(object): __metaclass__ = abc.ABCMeta def __init__(self, domain=None, domain_type=None, - energy_groups=None, name=''): + xs_type=None, energy_groups=None, name=''): self._name = '' self._rxn_type = None + self._xs_type = None self._domain = None self._domain_type = None self._energy_groups = None @@ -87,6 +87,8 @@ class MultiGroupXS(object): self._xs_tally = None self.name = name + if xs_type is not None: + self.xs_type = xs_type if domain_type is not None: self.domain_type = domain_type if domain is not None: @@ -102,6 +104,7 @@ class MultiGroupXS(object): clone = type(self).__new__(type(self)) clone._name = self.name clone._rxn_type = self.rxn_type + clone._xs_type = self.xs_type clone._domain = self.domain clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) @@ -128,6 +131,10 @@ class MultiGroupXS(object): def rxn_type(self): return self._rxn_type + @property + def xs_type(self): + return self._xs_type + @property def domain(self): return self._domain @@ -163,6 +170,11 @@ class MultiGroupXS(object): cv.check_type('name', name, basestring) self._name = name + @xs_type.setter + def xs_type(self, xs_type): + cv.check_value('xs_type', xs_type, ('macro', 'micro')) + self._xs_type = xs_type + @domain.setter def domain(self, domain): cv.check_type('domain', domain, tuple(DOMAINS)) @@ -218,10 +230,16 @@ class MultiGroupXS(object): self.tallies[key].estimator = estimator self.tallies[key].add_filter(domain_filter) - # Add all non-domain specific Filters (i.e., 'energy') to the Tally + # Add all non-domain specific Filters (e.g., 'energy') to the Tally for filter in filters: self.tallies[key].add_filter(filter) + # If this is a microscopic cross-section, add all nuclides to tally + if self.xs_type == 'micro' and score != 'flux': + all_nuclides = self.domain.get_all_nuclides() + for nuclide in all_nuclides: + self.tallies[key].add_nuclide(nuclide) + @abc.abstractmethod def compute_xs(self): """Computes multi-group cross sections using OpenMC tally arithmetic.""" @@ -264,7 +282,8 @@ class MultiGroupXS(object): filter_bins, tally.nuclides) self.tallies[tally_type] = sp_tally - def get_xs(self, groups='all', subdomains='all', value='mean'): + def get_xs(self, groups='all', subdomains='all', + nuclides='all', xs_type='macro', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested multi-group @@ -278,6 +297,13 @@ class MultiGroupXS(object): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest + nuclides : Iterable of str or 'all' + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is 'all') + + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -286,7 +312,7 @@ class MultiGroupXS(object): ------- xs : ndarray A NumPy array of the multi-group cross section indexed in the order - each group and subdomain is listed in the parameters. + each group, subdomain and nuclide is listed in the parameters. Raises ------ @@ -319,9 +345,15 @@ class MultiGroupXS(object): filters.append('energy') filter_bins.append((self.energy_groups.get_group_bounds(group),)) + # Construct list of nuclides for all requested nuclides + if nuclides != 'all' and nuclides != ['total']: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = [] + # Query the multi-group cross section tally for the data - xs = self.xs_tally.get_values(filters=filters, - filter_bins=filter_bins, value=value) + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=nuclides, value=value) return xs def get_condensed_xs(self, coarse_groups): @@ -439,11 +471,7 @@ class MultiGroupXS(object): # Clone this MultiGroupXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) - - # If domain is distribcell, make subdomain-averaged a 'cell' domain - if self.domain_type == 'distribcell': - avg_xs.domain_type = 'cell' - avg_xs._offset = 0 + avg_xs.domain_type = 'cell' # Average each of the tallies across subdomains for tally_type, tally in avg_xs.tallies.items(): @@ -483,7 +511,7 @@ class MultiGroupXS(object): return avg_xs - def print_xs(self, subdomains='all'): + def print_xs(self, subdomains='all', nuclides='all'): """Prints a string representation for the multi-group cross section. Parameters @@ -491,129 +519,73 @@ class MultiGroupXS(object): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report + nuclides : Iterable of str or 'all' + The nuclides of the cross-sections to include in the report + """ if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) + if nuclides != 'all': + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + if self.xs_type == 'micro': + nuclides = self.domain.get_all_nuclides() + else: + nuclides = ['total'] # Build header for string with type and domain info string = 'Multi-Group XS\n' - string += '{0: <16}=\t{1}\n'.format('\tType', self.rxn_type) + string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type) string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - # Append cross section data if it has been computed - if self.xs_tally is not None: - if subdomains == 'all': - if self.domain_type == 'distribcell': - subdomains = np.arange(self.num_subdomains, dtype=np.int) + # If cross section data has not been computed, only print string header + if self.xs_tally is None: + print(string) + return + + if subdomains == 'all': + if self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + else: + subdomains = [self.domain.id] + + # Loop over all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) + + # Loop over all Nuclides + for nuclide in nuclides: + + # Build header for cross section type based on the nuclide + if nuclide == 'total': + string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') else: - subdomains = [self.domain.id] + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + string += '{0: <16}\n'.format('\tCross Sections [barns]:') - # Loop over all subdomains - for subdomain in subdomains: - - if self.domain_type == 'distribcell': - string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) - - string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' # Loop over energy groups ranges for group in range(1, self.num_groups+1): bounds = self.energy_groups.get_group_bounds(group) string += template.format('', group, bounds[0], bounds[1]) - average = self.get_xs([group], [subdomain], 'mean') - rel_err = self.get_xs([group], [subdomain], 'rel_err')*100. + average = self.get_xs([group], [subdomain], + [nuclide], 'mean') + rel_err = self.get_xs([group], [subdomain], + [nuclide], 'rel_err') * 100. average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' + string += '\n' print(string) - def pickle(self, filename='mgxs', directory='mgxs'): - """Store the MultiGroupXS as a pickled binary file. - - Parameters - ---------- - filename : str - Filename for the pickled binary file (default is 'mgxs') - - directory : str - Directory for the pickled binary file (default is 'mgxs') - - """ - - cv.check_type('filename', filename, basestring) - cv.check_type('directory', directory, basestring) - - # Make directory if it does not exist - if not os.path.exists(directory): - os.makedirs(directory) - - # Create an empty dictionary to store the data - xs_results = dict() - - # Store all of this MultiGroupXS' class attributes in the dictionary - xs_results['name'] = self.name - xs_results['rxn_type'] = self.rxn_type - xs_results['domain_type'] = self.domain_type - xs_results['domain'] = self.domain - xs_results['energy_groups'] = self.energy_groups - xs_results['tallies'] = self.tallies - xs_results['xs_tally'] = self.xs_tally - xs_results['offset'] = self.offset - xs_results['subdomain_indices'] = self.subdomain_indices - - # Pickle the MultiGroupXS results to a binary file - filename = directory + '/' + filename + '.pkl' - filename = filename.replace(' ', '-') - pickle.dump(xs_results, open(filename, 'wb')) - - def unpickle(self, filename='mgxs', directory='mgxs'): - """Restore the MultiGroupXS from a pickled binary file. - - Parameters - ---------- - filename : str - Filename for the pickled binary file (default is 'mgxs') - - directory : str - Directory for the pickled binary file (default is 'mgxs') - - Raises - ------ - ValueError - When the requested filename does not exist. - - """ - - cv.check_type('filename', filename, basestring) - cv.check_type('directory', directory, basestring) - - filename = directory + '/' + filename + '.pkl' - filename = filename.replace(' ', '-') - - # Check that the file exists - if not os.path.exists(filename): - msg = 'Unable to import from filename="{0}"'.format(filename) - raise ValueError(msg) - - # Load the pickle file into a dictionary - xs_results = pickle.load(open(filename, 'rb')) - - # Store the MultiGroupXS class attributes - self.name = xs_results['name'] - self._rxn_type = xs_results['rxn_type'] - self.domain_type = xs_results['domain_type'] - self.domain = xs_results['domain'] - self.energy_groups = xs_results['energy_groups'] - self._tallies = xs_results['tallies'] - self._xs_tally = xs_results['xs_tally'] - self._offset = xs_results['offset'] - def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True): """Export the multi-group cross section data into an HDF5 binary file. @@ -671,6 +643,14 @@ class MultiGroupXS(object): else: xs_results = h5py.File(filename, 'w') + if self.xs_type == 'micro': + nuclides = self.domain.get_all_nuclides() + densities = [] + for nuclide in nuclides: + densities.append(nuclides[nuclide][1]) + else: + nuclides = ['total'] + # Create an HDF5 group within the file for the domain domain_type_group = xs_results.require_group(self.domain_type) group_name = '{0} {1}'.format(self.domain_type, self.domain.id) @@ -684,7 +664,7 @@ class MultiGroupXS(object): # Determine number of digits to pad subdomain group keys num_digits = len(str(self.num_subdomains)) - # Create a separate HDF5 dataset for each subdomain + # Create a separate HDF5 group for each subdomain for i, subdomain in enumerate(subdomains): # Create an HDF5 group for the subdomain @@ -695,19 +675,31 @@ class MultiGroupXS(object): subdomain_group = domain_group # Create a separate HDF5 group for the rxn type - xs_group = subdomain_group.require_group(self.rxn_type) + rxn_group = subdomain_group.require_group(self.rxn_type) - # Extract the cross section for this - average = self.get_xs(subdomains=[subdomain], value='mean') - std_dev = self.get_xs(subdomains=[subdomain], value='std_dev') - average = average.squeeze() - std_dev = std_dev.squeeze() + # Create a separate HDF5 group for each nuclide + for j, nuclide in enumerate(nuclides): - # Add MultiGroupXS results data to the HDF5 group - xs_group.require_dataset('average', dtype=np.float64, - shape=average.shape, data=average) - xs_group.require_dataset('std. dev.', dtype=np.float64, - shape=std_dev.shape, data=std_dev) + if nuclide != 'total': + nuclide_group = rxn_group.require_group(nuclide) + nuclide_group.require_dataset('density', dtype=np.float64, + data=[densities[j]], shape=(1,)) + else: + nuclide_group = rxn_group + + # Extract the cross section for this subdomain and nuclide + average = self.get_xs(subdomains=[subdomain], + nuclides=[nuclide], value='mean') + std_dev = self.get_xs(subdomains=[subdomain], + nuclides=[nuclide], value='std_dev') + average = average.squeeze() + std_dev = std_dev.squeeze() + + # Add MultiGroupXS results data to the HDF5 group + nuclide_group.require_dataset('average', dtype=np.float64, + shape=average.shape, data=average) + nuclide_group.require_dataset('std. dev.', dtype=np.float64, + shape=std_dev.shape, data=std_dev) # Close the MultiGroup results HDF5 file xs_results.close() @@ -791,7 +783,6 @@ class MultiGroupXS(object): modified.write(data) modified.write('\n\\end{document}') - def get_pandas_dataframe(self, groups='indices', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. @@ -869,8 +860,9 @@ class MultiGroupXS(object): class TotalXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(TotalXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(TotalXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'total' def create_tallies(self): @@ -900,8 +892,9 @@ class TotalXS(MultiGroupXS): class TransportXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(TransportXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(TransportXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'transport' def create_tallies(self): @@ -939,8 +932,9 @@ class TransportXS(MultiGroupXS): class AbsorptionXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(AbsorptionXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(AbsorptionXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'absorption' def create_tallies(self): @@ -970,8 +964,9 @@ class AbsorptionXS(MultiGroupXS): class CaptureXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(CaptureXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(CaptureXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'capture' def create_tallies(self): @@ -1002,8 +997,9 @@ class CaptureXS(MultiGroupXS): class FissionXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(FissionXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(FissionXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'fission' def create_tallies(self): @@ -1033,8 +1029,9 @@ class FissionXS(MultiGroupXS): class NuFissionXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(NuFissionXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(NuFissionXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'nu-fission' def create_tallies(self): @@ -1064,8 +1061,9 @@ class NuFissionXS(MultiGroupXS): class ScatterXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(ScatterXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(ScatterXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'scatter' def create_tallies(self): @@ -1095,8 +1093,9 @@ class ScatterXS(MultiGroupXS): class NuScatterXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(NuScatterXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(NuScatterXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'nu-scatter' def create_tallies(self): @@ -1126,8 +1125,9 @@ class NuScatterXS(MultiGroupXS): class ScatterMatrixXS(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(ScatterMatrixXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'scatter matrix' def create_tallies(self): @@ -1175,7 +1175,7 @@ class ScatterMatrixXS(MultiGroupXS): self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) def get_xs(self, in_groups='all', out_groups='all', - subdomains='all', value='mean'): + subdomains='all', nuclides='all', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested scattering @@ -1192,6 +1192,10 @@ class ScatterMatrixXS(MultiGroupXS): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest + nuclides : Iterable of str or 'all' + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is 'all') + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -1240,13 +1244,19 @@ class ScatterMatrixXS(MultiGroupXS): filters.append('energyout') filter_bins.append((self.energy_groups.get_group_bounds(group),)) + # Construct list of nuclides for all requested nuclides + if nuclides != 'all' and nuclides != ['total']: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = [] + # Query the multi-group cross section tally for the data - xs = self.xs_tally.get_values(filters=filters, - filter_bins=filter_bins, value=value) + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=nuclides, value=value) xs = np.nan_to_num(xs) return xs - def print_xs(self, subdomains='all'): + def print_xs(self, subdomains='all', nuclides='all'): """Prints a string representation for the multi-group cross section. Parameters @@ -1254,10 +1264,20 @@ class ScatterMatrixXS(MultiGroupXS): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report + nuclides : Iterable of str or 'all' + The nuclides of the cross-sections to include in the report + """ if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) + if nuclides != 'all': + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + if self.xs_type == 'micro': + nuclides = self.domain.get_all_nuclides() + else: + nuclides = ['total'] # Build header for string with type and domain info string = 'Multi-Group XS\n' @@ -1265,53 +1285,70 @@ class ScatterMatrixXS(MultiGroupXS): string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - # Append cross section data if it has been computed - if self.xs_tally is not None: - string += '{0: <16}\n'.format('\tEnergy Groups:') - template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' + # If cross section data has not been computed, only print string header + if self.xs_tally is None: + print(string) + return - # Loop over energy groups ranges - for group in range(1, self.num_groups+1): - bounds = self.energy_groups.get_group_bounds(group) - string += template.format('', group, bounds[0], bounds[1]) + string += '{0: <16}\n'.format('\tEnergy Groups:') + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' - if subdomains == 'all': - if self.domain_type == 'distribcell': - subdomains = np.arange(self.num_subdomains, dtype=np.int) + # Loop over energy groups ranges + for group in range(1, self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) + + if subdomains == 'all': + if self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + else: + subdomains = [self.domain.id] + + # Loop over all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += \ + '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) + + # Loop over all Nuclides + for nuclide in nuclides: + + # Build header for cross section type based on the nuclide + if nuclide == 'total': + string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') else: - subdomains = [self.domain.id] + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + string += '{0: <16}\n'.format('\tCross Sections [barns]:') - # Loop over all subdomains - for subdomain in subdomains: - - if self.domain_type == 'distribcell': - string += \ - '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) - - string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') template = '{0: <12}Group {1} -> Group {2}:\t\t' # Loop over incoming/outgoing energy groups ranges for in_group in range(1, self.num_groups+1): for out_group in range(1, self.num_groups+1): string += template.format('', in_group, out_group) - average = self.get_xs([in_group], [out_group], - [subdomain], 'mean') - rel_err = self.get_xs([in_group], [out_group], - [subdomain], 'rel_err') * 100. + average = \ + self.get_xs([in_group], [out_group], + [subdomain], [nuclide], 'mean') + rel_err = \ + self.get_xs([in_group], [out_group], + [subdomain], [nuclide], 'rel_err') * 100 average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' + string += '\n' + string += '\n' print(string) class NuScatterMatrixXS(ScatterMatrixXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(NuScatterMatrixXS, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'nu-scatter matrix' def create_tallies(self): @@ -1360,10 +1397,13 @@ class NuScatterMatrixXS(ScatterMatrixXS): class Chi(MultiGroupXS): - def __init__(self, domain=None, domain_type=None, groups=None, name=''): - super(Chi, self).__init__(domain, domain_type, groups, name) + def __init__(self, domain=None, domain_type=None, + xs_type=None, groups=None, name=''): + super(Chi, self).__init__(domain, domain_type, xs_type, groups, name) self._rxn_type = 'chi' + # FIXME: Make this work for micros!!! + def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross section.""" @@ -1390,3 +1430,50 @@ class Chi(MultiGroupXS): self._xs_tally = nu_fission_out / nu_fission_in self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + + def get_xs(self, groups='all', subdomains='all', + nuclides='all', xs_type='macro', value='mean'): + """Returns an array of multi-group cross sections. + + This method constructs a 2D NumPy array for the requested multi-group + cross section data data for one or more energy groups and subdomains. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest + + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest + + nuclides : Iterable of str or 'all' + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is 'all') + + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + + value : str + A string for the type of value to return - 'mean' (default), + 'std_dev' or 'rel_err' are accepted + + Returns + ------- + xs : ndarray + A NumPy array of the multi-group cross section indexed in the order + each group, subdomain and nuclide is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-group cross section is + computed from tally data. + + """ + + if self.xs_type == 'micro' and xs_type == 'macro': + raise NotImplementedError('Unable to compute macro Chi from micros') + + xs = super(Chi, self).get_xs(groups, subdomains, + nuclides, xs_type, value) + return xs From fe16bb4b10a6fcf5847b67a457e4f72413cef7cb Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 27 Sep 2015 00:29:46 -0400 Subject: [PATCH 194/519] Fixed tiling/repeating for tally arithmetic needed for micro xs in Python API --- openmc/element.py | 22 +++++++------- openmc/mgxs/mgxs.py | 70 ++++++++++++++++++++++++--------------------- openmc/nuclide.py | 25 +++++++--------- openmc/tallies.py | 16 ++++------- 4 files changed, 66 insertions(+), 67 deletions(-) diff --git a/openmc/element.py b/openmc/element.py index 2f81b9f308..a99d471271 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -38,18 +38,18 @@ class Element(object): if xs is not None: self.xs = xs - def __eq__(self, element2): - # Check type - if not isinstance(element2, Element): - return False - - # Check name and xs - if self._name != element2._name: - return False - elif self._xs != element2._xs: - return False - else: + def __eq__(self, other): + if isinstance(other, Element): + if self._name != other._name: + return False + elif self._xs != other._xs: + return False + else: + return True + elif isinstance(other, basestring) and other == self.name: return True + else: + return False def __hash__(self): return hash((self._name, self._xs)) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d079445f04..91e1635fe9 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -74,7 +74,7 @@ class MultiGroupXS(object): __metaclass__ = abc.ABCMeta def __init__(self, domain=None, domain_type=None, - xs_type=None, energy_groups=None, name=''): + energy_groups=None, xs_type='macro', name=''): self._name = '' self._rxn_type = None @@ -87,8 +87,7 @@ class MultiGroupXS(object): self._xs_tally = None self.name = name - if xs_type is not None: - self.xs_type = xs_type + self.xs_type = xs_type if domain_type is not None: self.domain_type = domain_type if domain is not None: @@ -322,6 +321,8 @@ class MultiGroupXS(object): """ + # TODO: Multiply by densities + if self.xs_tally is None: msg = 'Unable to get cross section since it has not been computed' raise ValueError(msg) @@ -688,10 +689,10 @@ class MultiGroupXS(object): nuclide_group = rxn_group # Extract the cross section for this subdomain and nuclide - average = self.get_xs(subdomains=[subdomain], - nuclides=[nuclide], value='mean') - std_dev = self.get_xs(subdomains=[subdomain], - nuclides=[nuclide], value='std_dev') + average = self.get_xs(subdomains=[subdomain], nuclides=[nuclide], + xs_type=self.xs_type, value='mean') + std_dev = self.get_xs(subdomains=[subdomain], nuclides=[nuclide], + xs_type=self.xs_type, value='std_dev') average = average.squeeze() std_dev = std_dev.squeeze() @@ -861,8 +862,8 @@ class MultiGroupXS(object): class TotalXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(TotalXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(TotalXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'total' def create_tallies(self): @@ -893,8 +894,8 @@ class TotalXS(MultiGroupXS): class TransportXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(TransportXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(TransportXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'transport' def create_tallies(self): @@ -933,8 +934,8 @@ class TransportXS(MultiGroupXS): class AbsorptionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(AbsorptionXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(AbsorptionXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'absorption' def create_tallies(self): @@ -965,8 +966,8 @@ class AbsorptionXS(MultiGroupXS): class CaptureXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(CaptureXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(CaptureXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'capture' def create_tallies(self): @@ -998,8 +999,8 @@ class CaptureXS(MultiGroupXS): class FissionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(FissionXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(FissionXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'fission' def create_tallies(self): @@ -1030,8 +1031,8 @@ class FissionXS(MultiGroupXS): class NuFissionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(NuFissionXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(NuFissionXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'nu-fission' def create_tallies(self): @@ -1062,8 +1063,8 @@ class NuFissionXS(MultiGroupXS): class ScatterXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(ScatterXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(ScatterXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'scatter' def create_tallies(self): @@ -1094,8 +1095,8 @@ class ScatterXS(MultiGroupXS): class NuScatterXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(NuScatterXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(NuScatterXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'nu-scatter' def create_tallies(self): @@ -1126,8 +1127,8 @@ class NuScatterXS(MultiGroupXS): class ScatterMatrixXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(ScatterMatrixXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'scatter matrix' def create_tallies(self): @@ -1174,8 +1175,8 @@ class ScatterMatrixXS(MultiGroupXS): self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) - def get_xs(self, in_groups='all', out_groups='all', - subdomains='all', nuclides='all', value='mean'): + def get_xs(self, in_groups='all', out_groups='all', subdomains='all', + nuclides='all', xs_type='macro', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested scattering @@ -1196,6 +1197,9 @@ class ScatterMatrixXS(MultiGroupXS): A list of nuclide name strings (e.g., ['U-235', 'U-238']; default is 'all') + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -1214,6 +1218,8 @@ class ScatterMatrixXS(MultiGroupXS): """ + # TODO: Deal with xs_type and micros + if self.xs_tally is None: msg = 'Unable to get cross section since it has not been computed' raise ValueError(msg) @@ -1332,7 +1338,7 @@ class ScatterMatrixXS(MultiGroupXS): [subdomain], [nuclide], 'mean') rel_err = \ self.get_xs([in_group], [out_group], - [subdomain], [nuclide], 'rel_err') * 100 + [subdomain], [nuclide],'rel_err') * 100 average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err) @@ -1347,8 +1353,8 @@ class ScatterMatrixXS(MultiGroupXS): class NuScatterMatrixXS(ScatterMatrixXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(NuScatterMatrixXS, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'nu-scatter matrix' def create_tallies(self): @@ -1398,8 +1404,8 @@ class NuScatterMatrixXS(ScatterMatrixXS): class Chi(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - xs_type=None, groups=None, name=''): - super(Chi, self).__init__(domain, domain_type, xs_type, groups, name) + groups=None, xs_type='macro', name=''): + super(Chi, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'chi' # FIXME: Make this work for micros!!! diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 7e7cd5af35..a616edac94 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -41,21 +41,18 @@ class Nuclide(object): if xs is not None: self.xs = xs - def __eq__(self, nuclide2): - # Check type - if not isinstance(nuclide2, Nuclide): - return False - - # Check name - elif self._name != nuclide2._name: - return False - - # Check xs - elif self._xs != nuclide2._xs: - return False - - else: + def __eq__(self, other): + if isinstance(other, Nuclide): + if self._name != other._name: + return False + elif self._xs != other._xs: + return False + else: + return True + elif isinstance(other, basestring) and other == self.name: return True + else: + return False def __hash__(self): return hash((self._name, self._xs)) diff --git a/openmc/tallies.py b/openmc/tallies.py index a5b55d810e..9b753fe497 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1666,8 +1666,8 @@ class Tally(object): if self_repeat_factor == 1: other_shape[0] *= other_tile_factor - other_mean = np.repeat(other_mean, other_tile_factor) - other_std_dev = np.repeat(other_std_dev, other_tile_factor) + other_mean = np.repeat(other_mean, other_tile_factor, axis=0) + other_std_dev = np.repeat(other_std_dev, other_tile_factor, axis=0) else: other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) @@ -1687,11 +1687,9 @@ class Tally(object): self_shape = list(self.mean.shape) # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor) -# self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) + self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) -# self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) self_shape[1] *= self_repeat_factor @@ -1708,11 +1706,9 @@ class Tally(object): self_shape = list(self.mean.shape) # Replicate the data - self_mean = np.repeat(self_mean, self_repeat_factor) -# self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) + self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) - self_std_dev = np.repeat(self_std_dev, self_repeat_factor) -# self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) + self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) self_shape[2] *= self_repeat_factor From bb155e2128ca74d5ef3d3818257f4f3fe4a4ba87 Mon Sep 17 00:00:00 2001 From: Kelly Rowland Date: Sat, 26 Sep 2015 22:02:07 -0700 Subject: [PATCH 195/519] fix Shannon Entropy PDF link --- docs/source/methods/eigenvalue.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/methods/eigenvalue.rst b/docs/source/methods/eigenvalue.rst index fe99ba22ec..41bf865492 100644 --- a/docs/source/methods/eigenvalue.rst +++ b/docs/source/methods/eigenvalue.rst @@ -142,7 +142,7 @@ than unity. By ensuring that the expected number of fission sites in each mesh cell is constant, the collision density across all cells, and hence the variance of tallies, is more uniform than it would be otherwise. -.. _Shannon entropy: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-06-3737_entropy.pdf +.. _Shannon entropy: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-06-3737.pdf .. [Lieberoth] J. Lieberoth, "A Monte Carlo Technique to Solve the Static Eigenvalue Problem of the Boltzmann Transport Equation," *Nukleonik*, **11**, From 697e3c557bf9e2809666a29122b4feb74628cedc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 27 Sep 2015 16:08:02 +0700 Subject: [PATCH 196/519] Join intersection/union of multiple half-spaces when possible. --- openmc/region.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index e39d38b040..025babba89 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -84,14 +84,27 @@ class Region(object): r2 = output.pop() if operator == ' ': r1 = output.pop() - output.append(Intersection(r1, r2)) + if isinstance(r1, Intersection) and hasattr(r2, 'surface'): + r1.nodes.append(r2) + output.append(r1) + elif isinstance(r2, Intersection) and hasattr(r1, 'surface'): + r2.nodes.insert(0, r1) + output.append(r2) + else: + output.append(Intersection(r1, r2)) elif operator == '^': r1 = output.pop() - output.append(Union(r1, r2)) + if isinstance(r1, Union) and hasattr(r2, 'surface'): + r1.nodes.append(r2) + output.append(r1) + elif isinstance(r2, Union) and hasattr(r1, 'surface'): + r2.nodes.insert(0, r1) + output.append(r2) + else: + output.append(Union(r1, r2)) elif operator == '~': output.append(Complement(r2)) - # The following is an implementation of the shunting yard algorithm to # generate an abstract syntax tree for the region expression. output = [] From 643f9aaccb74fe0adb73f136c9f3d816e049452c Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 27 Sep 2015 12:54:11 -0400 Subject: [PATCH 197/519] Took advantage of p % wgt already incorporating the multiplicity if the multiplicity is provided as a function of E by just using p % wgt for nu_scatter tallies instead of p % last_wgt * multiplicity --- src/tally.F90 | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 0b13dbeba4..7034b6d83c 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -62,7 +62,6 @@ contains real(8) :: uvw(3) ! particle direction type(Material), pointer :: mat type(Reaction), pointer :: rxn - real(8) :: multiplicity i = 0 SCORE_LOOP: do q = 1, t % n_user_score_bins @@ -177,7 +176,9 @@ contains ! neutrons exiting a reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then - multiplicity = ONE + ! Don't waste time on very common reactions we know have multiplicities + ! of one. + score = p % last_wgt else do m = 1, nuclides(p % event_nuclide) % n_reaction ! Check if this is the desired MT @@ -188,17 +189,17 @@ contains end if end do - ! Get multiplicity + ! Get multiplicity and apply to score if (rxn % multiplicity_with_E) then - multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + ! Then the multiplicity was already incorporated in to p % wgt + ! per the scattering routine, + score = p % wgt else - multiplicity = real(rxn % multiplicity,8) + ! Grab the multiplicity from the rxn + score = p % last_wgt * real(rxn % multiplicity,8) end if end if - ! Apply multiplicity to the last weight - score = p % last_wgt * multiplicity - case (SCORE_NU_SCATTER_PN) ! Only analog estimators are available. @@ -212,7 +213,9 @@ contains ! neutrons exiting a reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then - multiplicity = ONE + ! Don't waste time on very common reactions we know have multiplicities + ! of one. + score = p % last_wgt else do m = 1, nuclides(p % event_nuclide) % n_reaction ! Check if this is the desired MT @@ -223,17 +226,17 @@ contains end if end do - ! Get multiplicity + ! Get multiplicity and apply to score if (rxn % multiplicity_with_E) then - multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + ! Then the multiplicity was already incorporated in to p % wgt + ! per the scattering routine, + score = p % wgt else - multiplicity = real(rxn % multiplicity,8) + ! Grab the multiplicity from the rxn + score = p % last_wgt * real(rxn % multiplicity,8) end if end if - ! Apply multiplicity to the last weight - score = p % last_wgt * multiplicity - case (SCORE_NU_SCATTER_YN) ! Only analog estimators are available. @@ -247,7 +250,9 @@ contains ! neutrons exiting a reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then - multiplicity = ONE + ! Don't waste time on very common reactions we know have multiplicities + ! of one. + score = p % last_wgt else do m = 1, nuclides(p % event_nuclide) % n_reaction ! Check if this is the desired MT @@ -258,17 +263,17 @@ contains end if end do - ! Get multiplicity + ! Get multiplicity and apply to score if (rxn % multiplicity_with_E) then - multiplicity = interpolate_tab1(rxn % multiplicity_E, p % last_E) + ! Then the multiplicity was already incorporated in to p % wgt + ! per the scattering routine, + score = p % wgt else - multiplicity = real(rxn % multiplicity,8) + ! Grab the multiplicity from the rxn + score = p % last_wgt * real(rxn % multiplicity,8) end if end if - ! Apply multiplicity to the last weight - score = p % last_wgt * multiplicity - case (SCORE_TRANSPORT) ! Only analog estimators are available. From 0374a07c6f76e7f6b5476a4e9336b6bc66edb6ff Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 27 Sep 2015 16:05:07 -0400 Subject: [PATCH 198/519] Added nuclide and number density getter routines to Python API MultiGroupXS class --- openmc/cross.py | 4 +- openmc/filter.py | 1 - openmc/mgxs/mgxs.py | 198 ++++++++++++++++++++++++++++++++++---------- openmc/tallies.py | 5 +- 4 files changed, 158 insertions(+), 50 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index fa1ce6e630..e2281142c3 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -1,7 +1,7 @@ import sys from openmc import Filter, Nuclide -from openmc.constants import FILTER_TYPES +from openmc.filter import _FILTER_TYPES import openmc.checkvalue as cv @@ -345,7 +345,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.values(): msg = 'Unable to set Filter type to "{0}" since it is not one ' \ 'of the supported types'.format(type) raise ValueError(msg) diff --git a/openmc/filter.py b/openmc/filter.py index b8865a1846..2f09d93f29 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -7,7 +7,6 @@ import numpy as np from openmc import Mesh from openmc.summary import Summary -from openmc.constants import * import openmc.checkvalue as cv diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 91e1635fe9..f4c569e164 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -190,6 +190,96 @@ class MultiGroupXS(object): self._energy_groups = energy_groups self._num_groups = energy_groups.num_groups + def get_all_nuclides(self): + """Get all nuclides in the cross section's spatial domain. + + Returns + ------- + nuclides : list of str + A list of the string names for each nuclide in the problem domain + (e.g., ['U-235', 'U-238', 'O-16']) + + Raises + ------ + ValueError + When this method is called before the spatial domain has been set. + + """ + + if self.domain is None: + raise ValueError('Unable to get all nuclides without a domain') + + nuclides = self.domain.get_all_nuclides() + return nuclides.keys() + + def get_nuclide_density(self, nuclide): + """Get the atomic number density for a nuclide in the cross section's + spatial domain. + + nuclide : str + A nuclide name string (e.g., 'U-235') + + Returns + ------- + density : Real + The atomic number density for the nuclide of interest + + Raises + ------ + ValueError + When the density is requested for a nuclide which is not found in + the spatial domain. + + """ + + cv.check_type('nuclide', nuclide, basestring) + + # Get list of all nuclides in the spatial domain + nuclides = self.domain.get_all_nuclides() + + if nuclide not in nuclides: + msg = 'Unable to get density for nuclide "{0}" which is not in ' \ + '{1} "{2}"'.format(nuclide, self.domain_type, self.domain.id) + ValueError(msg) + + density = nuclides[nuclide][1] + return density + + def get_nuclide_densities(self, nuclides='all'): + """Get all atomic number densities in the cross section's spatial domain. + + nuclides : Iterable of str or 'all' + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is 'all') + + Returns + ------- + densities : ndarray of float + The atomic number densities corresponding to each of the nuclides + in the problem domain + + Raises + ------ + ValueError + When this method is called before the spatial domain has been set. + + """ + + if self.domain is None: + raise ValueError('Unable to get nuclide densities without a domain') + + # If the user requested the densities for all nuclides, get a list of + # all of the nuclide name strings + if nuclides == 'all': + nuclides =self.domain.get_all_nuclides() + + # Loop over each nuclide and find and store its atomic number density + densities = np.zeros(len(nuclides), dtype=np.float) + for i, nuclide in enumerate(nuclides): + densities[i] = self.get_nuclide_density(nuclide) + + return densities + @abc.abstractmethod def create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross section. @@ -243,7 +333,15 @@ class MultiGroupXS(object): def compute_xs(self): """Computes multi-group cross sections using OpenMC tally arithmetic.""" - return + # If a microscopic cross-section, replace CrossNuclides with originals + if self.xs_type == 'micro': + self.xs_tally._nuclides = [] + nuclides = self.domain.get_all_nuclides() + for nuclide in nuclides: + self.xs_tally.add_nuclide(nuclide) + + self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) + self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) def load_from_statepoint(self, statepoint): """Extracts tallies in an OpenMC StatePoint with the data needed to @@ -321,8 +419,6 @@ class MultiGroupXS(object): """ - # TODO: Multiply by densities - if self.xs_tally is None: msg = 'Unable to get cross section since it has not been computed' raise ValueError(msg) @@ -355,6 +451,13 @@ class MultiGroupXS(object): # Query the multi-group cross section tally for the data xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, nuclides=nuclides, value=value) + + # If user requested microscopic cross sections from an object with + # microscopic cross sections, divide by atom number densities + if self.xs_type == 'micro' and xs_type == 'micro': + densities = self.get_nuclide_densities(nuclides) + if value == 'mean' or value == 'std_dev': + xs /= densities[np.newaxis, :, np.newaxis] return xs def get_condensed_xs(self, coarse_groups): @@ -512,7 +615,7 @@ class MultiGroupXS(object): return avg_xs - def print_xs(self, subdomains='all', nuclides='all'): + def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): """Prints a string representation for the multi-group cross section. Parameters @@ -523,6 +626,9 @@ class MultiGroupXS(object): nuclides : Iterable of str or 'all' The nuclides of the cross-sections to include in the report + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + """ if subdomains != 'all': @@ -561,11 +667,14 @@ class MultiGroupXS(object): # Loop over all Nuclides for nuclide in nuclides: - # Build header for cross section type based on the nuclide - if nuclide == 'total': + # Build header for nuclide type + if xs_type != 'total': + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + + # Build header for cross section type + if xs_type == 'macro': string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') else: - string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) string += '{0: <16}\n'.format('\tCross Sections [barns]:') template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' @@ -575,9 +684,9 @@ class MultiGroupXS(object): bounds = self.energy_groups.get_group_bounds(group) string += template.format('', group, bounds[0], bounds[1]) average = self.get_xs([group], [subdomain], - [nuclide], 'mean') + [nuclide], xs_type, 'mean') rel_err = self.get_xs([group], [subdomain], - [nuclide], 'rel_err') * 100. + [nuclide], xs_type, 'rel_err') * 100 average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) @@ -646,9 +755,9 @@ class MultiGroupXS(object): if self.xs_type == 'micro': nuclides = self.domain.get_all_nuclides() - densities = [] - for nuclide in nuclides: - densities.append(nuclides[nuclide][1]) + densities = np.zeros(len(nuclides), dtype=np.float) + for i, nuclide in enumerate(nuclides): + densities[i] = nuclides[nuclide][1] else: nuclides = ['total'] @@ -887,8 +996,7 @@ class TotalXS(MultiGroupXS): tally arithmetic.""" self._xs_tally = self.tallies['total'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(TotalXS, self).compute_xs() class TransportXS(MultiGroupXS): @@ -927,8 +1035,7 @@ class TransportXS(MultiGroupXS): self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] self._xs_tally /= self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(TotalXS, self).compute_xs() class AbsorptionXS(MultiGroupXS): @@ -959,8 +1066,7 @@ class AbsorptionXS(MultiGroupXS): tally arithmetic.""" self._xs_tally = self.tallies['absorption'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(AbsorptionXS, self).compute_xs() class CaptureXS(MultiGroupXS): @@ -992,8 +1098,7 @@ class CaptureXS(MultiGroupXS): self._xs_tally = self.tallies['absorption'] - self.tallies['fission'] self._xs_tally /= self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(CaptureXS, self).compute_xs() class FissionXS(MultiGroupXS): @@ -1024,8 +1129,7 @@ class FissionXS(MultiGroupXS): tally arithmetic.""" self._xs_tally = self.tallies['fission'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(FissionXS, self).compute_xs() class NuFissionXS(MultiGroupXS): @@ -1056,8 +1160,7 @@ class NuFissionXS(MultiGroupXS): tally arithmetic.""" self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(NuFissionXS, self).compute_xs() class ScatterXS(MultiGroupXS): @@ -1088,8 +1191,7 @@ class ScatterXS(MultiGroupXS): OpenMC tally arithmetic.""" self._xs_tally = self.tallies['scatter'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(ScatterXS, self).compute_xs() class NuScatterXS(MultiGroupXS): @@ -1120,8 +1222,7 @@ class NuScatterXS(MultiGroupXS): tally arithmetic.""" self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(NuScatterXS, self).compute_xs() class ScatterMatrixXS(MultiGroupXS): @@ -1172,8 +1273,7 @@ class ScatterMatrixXS(MultiGroupXS): rxn_tally = self.tallies['scatter'] self._xs_tally = rxn_tally / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(ScatterMatrixXS, self).compute_xs() def get_xs(self, in_groups='all', out_groups='all', subdomains='all', nuclides='all', xs_type='macro', value='mean'): @@ -1218,8 +1318,6 @@ class ScatterMatrixXS(MultiGroupXS): """ - # TODO: Deal with xs_type and micros - if self.xs_tally is None: msg = 'Unable to get cross section since it has not been computed' raise ValueError(msg) @@ -1260,9 +1358,17 @@ class ScatterMatrixXS(MultiGroupXS): xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, nuclides=nuclides, value=value) xs = np.nan_to_num(xs) + + # If user requested microscopic cross sections from an object with + # microscopic cross sections, divide by atom number densities + if self.xs_type == 'micro' and xs_type == 'micro': + densities = self.get_nuclide_densities(nuclides) + if value == 'mean' or value == 'std_dev': + xs /= densities[np.newaxis, :, np.newaxis] + return xs - def print_xs(self, subdomains='all', nuclides='all'): + def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): """Prints a string representation for the multi-group cross section. Parameters @@ -1273,6 +1379,9 @@ class ScatterMatrixXS(MultiGroupXS): nuclides : Iterable of str or 'all' The nuclides of the cross-sections to include in the report + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + """ if subdomains != 'all': @@ -1320,11 +1429,14 @@ class ScatterMatrixXS(MultiGroupXS): # Loop over all Nuclides for nuclide in nuclides: - # Build header for cross section type based on the nuclide - if nuclide == 'total': + # Build header for nuclide type + if xs_type != 'total': + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + + # Build header for cross section type + if xs_type == 'macro': string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') else: - string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) string += '{0: <16}\n'.format('\tCross Sections [barns]:') template = '{0: <12}Group {1} -> Group {2}:\t\t' @@ -1334,11 +1446,11 @@ class ScatterMatrixXS(MultiGroupXS): for out_group in range(1, self.num_groups+1): string += template.format('', in_group, out_group) average = \ - self.get_xs([in_group], [out_group], - [subdomain], [nuclide], 'mean') + self.get_xs([in_group], [out_group], [subdomain], + [nuclide], xs_type, 'mean') rel_err = \ - self.get_xs([in_group], [out_group], - [subdomain], [nuclide],'rel_err') * 100 + self.get_xs([in_group], [out_group], [subdomain], + [nuclide], xs_type, 'rel_err') * 100 average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err) @@ -1398,8 +1510,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): rxn_tally = self.tallies['nu-scatter'] self._xs_tally = rxn_tally / self.tallies['flux'] - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(ScatterMatrixXS, self).compute_xs() class Chi(MultiGroupXS): @@ -1434,8 +1545,7 @@ class Chi(MultiGroupXS): nu_fission_out = self.tallies['nu-fission-out'] nu_fission_in.remove_filter(nu_fission_in.filters[-1]) self._xs_tally = nu_fission_out / nu_fission_in - self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) - self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) + super(Chi, self).compute_xs() def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', value='mean'): diff --git a/openmc/tallies.py b/openmc/tallies.py index 9b753fe497..6429d8529e 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1,4 +1,4 @@ -from collections import Iterable, defaultdict +from collections import Iterable import copy import os import pickle @@ -9,9 +9,8 @@ import sys import numpy as np -from openmc import Mesh, Filter, Trigger, Nuclide, FILTER_TYPES +from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter -from openmc.summary import Summary import openmc.checkvalue as cv from openmc.clean_xml import * From 6e9dc5b09f2b53e517a0402a913be653b0ec0c8f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 27 Sep 2015 17:14:29 -0400 Subject: [PATCH 199/519] Python API MultiGroupXS.load_from_statepoint(...) routine now resets domain type to get isotopic number densities from OpenMC --- openmc/mgxs/mgxs.py | 27 +++++++++++++++++++++++++++ openmc/statepoint.py | 17 ++++++++++++----- openmc/summary.py | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index f4c569e164..f5e37680d8 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -359,6 +359,25 @@ class MultiGroupXS(object): cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) + if not statepoint.with_summary: + msg = 'Unable to load data from a statepoint which has not been ' \ + 'linked with a summary file' + raise ValueError(msg) + + # Override the domain object that loaded from an OpenMC summary file + # NOTE: This is necessary for micro cross-sections which require + # the isotopic number densities as computed by OpenMC + if self.domain_type == 'cell': + self.domain = statepoint.summary.get_cell_by_id(self.domain.id) + elif self.domain_type == 'universe': + self.domain = statepoint.summary.get_universe_by_id(self.domain.id) + elif self.domain_type == 'material': + self.domain = statepoint.summary.get_material_by_id(self.domain.id) + else: + msg = 'Unable to load data from a statepoint for domain type {} ' \ + 'which is not yet supported'.format(self.domain_type) + raise ValueError(msg) + # Create Tallies to search for in StatePoint self.create_tallies() @@ -424,6 +443,7 @@ class MultiGroupXS(object): raise ValueError(msg) cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) filters = [] filter_bins = [] @@ -631,6 +651,8 @@ class MultiGroupXS(object): """ + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) if nuclides != 'all': @@ -1323,6 +1345,7 @@ class ScatterMatrixXS(MultiGroupXS): raise ValueError(msg) cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) filters = [] filter_bins = [] @@ -1384,6 +1407,8 @@ class ScatterMatrixXS(MultiGroupXS): """ + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) if nuclides != 'all': @@ -1587,6 +1612,8 @@ class Chi(MultiGroupXS): """ + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + if self.xs_type == 'micro' and xs_type == 'macro': raise NotImplementedError('Unable to compute macro Chi from micros') diff --git a/openmc/statepoint.py b/openmc/statepoint.py index f90e429cc0..f58994b8c7 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -82,8 +82,8 @@ class StatePoint(object): Indicate whether user-defined tallies are present version: tuple of int Version of OpenMC - with_summary : bool - Indicate whether statepoint data has been linked against a summary file + summary : None or openmc.summary.Summary + A summary object if the statepoint has been linked with a summary file """ @@ -104,7 +104,7 @@ class StatePoint(object): # Set flags for what data has been read self._meshes_read = False self._tallies_read = False - self._with_summary = False + self._summary = False self._global_tallies = None def close(self): @@ -457,9 +457,16 @@ class StatePoint(object): self._f['version_minor'].value, self._f['version_release'].value) + @property + def summary(self): + return self._summary + @property def with_summary(self): - return self._with_summary + if self.summary is None: + return False + else: + return True def get_tally(self, scores=[], filters=[], nuclides=[], name=None, id=None, estimator=None): @@ -628,4 +635,4 @@ class StatePoint(object): material_ids.append(summary.materials[bin].id) filter.bins = material_ids - self._with_summary = True + self._summary = summary diff --git a/openmc/summary.py b/openmc/summary.py index 2ae7464846..35aa703f55 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -83,7 +83,7 @@ class Summary(object): material = openmc.Material(material_id=material_id, name=name) # Set the Material's density to g/cm3 - this is what is used in OpenMC - material.set_density(density=density, units='g/cm3') + material.set_density(density=density, units='atom/b-cm') # Add all nuclides to the Material for fullname, density in zip(nuclides, nuc_densities): From 8f19a3fdc3a2021090cad02cc644cc82d2882be7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 27 Sep 2015 20:51:06 -0400 Subject: [PATCH 200/519] Added back in Tally.summation routine and fixed issues with Chi getter in Python API --- openmc/mgxs/mgxs.py | 84 +++++++++++++++++++++++++++++++++-------- openmc/tallies.py | 92 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 159 insertions(+), 17 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index f5e37680d8..4f0de50494 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -367,7 +367,7 @@ class MultiGroupXS(object): # Override the domain object that loaded from an OpenMC summary file # NOTE: This is necessary for micro cross-sections which require # the isotopic number densities as computed by OpenMC - if self.domain_type == 'cell': + if self.domain_type == 'cell' or self.domain_type == 'distribcell': self.domain = statepoint.summary.get_cell_by_id(self.domain.id) elif self.domain_type == 'universe': self.domain = statepoint.summary.get_universe_by_id(self.domain.id) @@ -478,6 +478,7 @@ class MultiGroupXS(object): densities = self.get_nuclide_densities(nuclides) if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + return xs def get_condensed_xs(self, coarse_groups): @@ -1544,8 +1545,6 @@ class Chi(MultiGroupXS): super(Chi, self).__init__(domain, domain_type, groups, xs_type, name) self._rxn_type = 'chi' - # FIXME: Make this work for micros!!! - def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross section.""" @@ -1556,9 +1555,9 @@ class Chi(MultiGroupXS): # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges - fine_energyout = openmc.Filter('energyout', group_edges) - coarse_energyout = openmc.Filter('energyout', [group_edges[0], group_edges[-1]]) - filters = [[coarse_energyout], [fine_energyout]] + energyout = openmc.Filter('energyout', group_edges) + energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) + filters = [[energyin], [energyout]] # Intialize the Tallies super(Chi, self).create_tallies(scores, filters, keys, estimator) @@ -1566,9 +1565,14 @@ class Chi(MultiGroupXS): def compute_xs(self): """Computes chi fission spectrum using OpenMC tally arithmetic.""" + # Retrieve the fission production tallies nu_fission_in = self.tallies['nu-fission-in'] nu_fission_out = self.tallies['nu-fission-out'] + + # Remove the coarse energy filter to keep it out of tally arithmetic nu_fission_in.remove_filter(nu_fission_in.filters[-1]) + + # Compute chi self._xs_tally = nu_fission_out / nu_fission_in super(Chi, self).compute_xs() @@ -1587,12 +1591,15 @@ class Chi(MultiGroupXS): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest - nuclides : Iterable of str or 'all' - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is 'all') + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' will return the cross-section for all nuclides + in the spatial domain. The special string 'sum' will return the sum + across all nuclides weighted by the isotope-specific fission source. xs_type: {'macro' or 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns + This parameter is not relevant for chi but is included here to + mirror the parent MultiGroupXS.get_xs(...) class method value : str A string for the type of value to return - 'mean' (default), @@ -1612,11 +1619,56 @@ class Chi(MultiGroupXS): """ - cv.check_value('xs_type', xs_type, ['macro', 'micro']) + if self.xs_tally is None: + msg = 'Unable to get cross section since it has not been computed' + raise ValueError(msg) - if self.xs_type == 'micro' and xs_type == 'macro': - raise NotImplementedError('Unable to compute macro Chi from micros') + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) - xs = super(Chi, self).get_xs(groups, subdomains, - nuclides, xs_type, value) - return xs + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if subdomains != 'all': + cv.check_iterable_type('subdomains', subdomains, Integral) + for subdomain in subdomains: + filters.append(self.domain_type) + filter_bins.append((subdomain,)) + + # Construct list of energy group bounds tuples for all requested groups + if groups != 'all': + cv.check_iterable_type('groups', groups, Integral) + for group in groups: + filters.append('energyout') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) + + # Construct list of nuclides for all requested nuclides + if nuclides != 'all' and nuclides != ['total']: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = [] + + # Special case for the "macroscopic-from-microscopic" chi + # This is needed since chi is fission source rather than flux-weighted + if nuclides == 'sum' and self.xs_type == 'micro': + + # Retrieve the fission production tallies + nu_fission_in = self.tallies['nu-fission-in'] + nu_fission_out = self.tallies['nu-fission-out'] + + # Sum out all nuclides + nuclides = self.get_all_nuclides() + nu_fission_in = nu_fission_in.summation(nuclides=nuclides) + nu_fission_out = nu_fission_out.summation(nuclides=nuclides) + + # Compute chi and store it as the xs_tally attribute so we can use + # the generic get_xs routine + xs_tally = nu_fission_out / nu_fission_in + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + else: + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=nuclides, value=value) + + return xs \ No newline at end of file diff --git a/openmc/tallies.py b/openmc/tallies.py index 6429d8529e..b4501133aa 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1,4 +1,4 @@ -from collections import Iterable +from collections import Iterable, defaultdict import copy import os import pickle @@ -11,6 +11,7 @@ import numpy as np from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter +from openmc.filter import _FILTER_TYPES import openmc.checkvalue as cv from openmc.clean_xml import * @@ -2311,6 +2312,95 @@ class Tally(object): return new_tally + def summation(self, scores=[], filter_type=None, + filter_bins=[], nuclides=[]): + """Build a sliced tally for the specified filter bins, nuclides, scores. + + This method constructs a new tally to encapsulate a subset of the data + represented by this tally. The subset of data to include in the tally + slice is determined by the scores, filter bins and nuclides specified + in the input parameters. + + Parameters + ---------- + scores : list + A list of one or more score strings to sum across + (e.g., ['absorption', 'nu-fission']; default is []) + + filter_type : str + A filter type string (e.g., 'cell', 'energy') corresponding to the + filter bins to sum across + + filter_bins : Iterable of Integral or tuple + A list of the filter bins corresponding to the filters parameter + Each bin in the list is the integer ID for 'material', 'surface', + 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer + for the cell instance ID for 'distribcell Filters. Each bin is a + 2-tuple of floats for 'energy' and 'energyout' filters corresponding + to the energy boundaries of the bin of interest. Each bin is an + (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. + + nuclides : list + A list of nuclide name strings to sum across + (e.g., ['U-235', 'U-238']; default is []) + + Returns + ------- + Tally + A new tally which encapsulates the sum of data requested. + """ + + # If user did not specify any scores, do not sum across scores + if len(scores) == 0: + scores = [[]] + # Sum across any scores specified by the user + else: + scores = [[score] for score in scores] + + # If user did not specify any nuclides, do not sum across nuclides + if len(nuclides) == 0: + nuclides = [[]] + # Sum across any nuclides specified by the user + else: + nuclides = [[nuclide] for nuclide in nuclides] + + # Sum across any filter bins specified by the user + if filter_type in _FILTER_TYPES: + filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] + filters = [[filter_type]] + # If user did not specify a filter type, do not sum across filter bins + else: + filter_bins = [[]] + filters = [[]] + + # Initialize Tally sum + tally_sum = 0 + + # Iterate over all Tally slice operands in summation + prod = [scores, filters, filter_bins, nuclides] + summed_filters = defaultdict(list) + for scores, filters, filter_bins, nuclides in itertools.product(*prod): + tally_slice = self.get_slice(scores, filters, filter_bins, nuclides) + + # Remove filters summed across to avoid bulky CrossFilters + if filter_type: + filter = tally_slice.find_filter(filter_type) + tally_slice.remove_filter(filter) + summed_filters[filter_type].append(filter) + + # Accumulate this Tally slice into the Tally sum + tally_sum += tally_slice + + # FIXME: test if this works for filter + for filter_type in summed_filters: + filters = summed_filters[filter_type] + for i in range(1, len(filters)): + filters[i] = CrossFilter(filters[i-1], filters[i], '+') + tally_sum.add_filter(filters[-1]) + + return tally_sum + def tile_filter(self, new_filter): """Combines filters, scores and nuclides with another tally. From b92198ebc66c08aa24f2359a1003b7c6fbe4cfa7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 11:57:27 +0700 Subject: [PATCH 201/519] Update user's guide documentation with description of region --- docs/source/usersguide/input.rst | 40 +++++++++++++++++++++----------- src/geometry.F90 | 4 ++-- src/input_xml.F90 | 8 +++---- src/string.F90 | 2 +- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index b4d153f184..fbc74de4af 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -720,9 +720,8 @@ Geometry Specification -- geometry.xml The geometry in OpenMC is described using `constructive solid geometry`_ (CSG), also sometimes referred to as combinatorial geometry. CSG allows a user to create complex objects using Boolean operators on a set of simpler surfaces. In -the geometry model, each unique closed volume in defined by its bounding -surfaces. In OpenMC, most `quadratic surfaces`_ can be modeled and used as -bounding surfaces. +the geometry model, each unique volume is defined by its bounding surfaces. In +OpenMC, most `quadratic surfaces`_ can be modeled and used as bounding surfaces. Every geometry.xml must have an XML declaration at the beginning of the file and a root element named geometry. Within the root element the user can define any @@ -745,7 +744,7 @@ number of cells, surfaces, and lattices. Let us look at the following example: 1 0 1 - -1 + -1 @@ -763,7 +762,7 @@ could be written as: - + @@ -787,7 +786,8 @@ Each ```` element can have the following attributes or sub-elements: :type: The type of the surfaces. This can be "x-plane", "y-plane", "z-plane", - "plane", "x-cylinder", "y-cylinder", "z-cylinder", or "sphere". + "plane", "x-cylinder", "y-cylinder", "z-cylinder", "sphere", "x-cone", + "y-cone", or "z-cone". *Default*: None @@ -891,15 +891,29 @@ Each ```` element can have the following attributes or sub-elements: *Default*: None - :surfaces: - A list of the ``ids`` for surfaces that bound this cell, e.g. if the cell - is on the negative side of surface 3 and the positive side of surface 5, the - bounding surfaces would be given as "-3 5". + :region: + A Boolean expression of half-spaces that defines the spatial region which + the cell occupies. Each half-space is identified by the unique ID of the + surface prefixed by `-` or `+` to indicate that it is the negative or + positive half-space, respectively. The `+` sign for a positive half-space + can be omitted. Valid Boolean operators are parentheses, union `^`, + complement `~`, and intersection. Intersection is implicit and indicated by + the presence of whitespace. The order of operator precedence is parentheses, + complement, intersection, and then union. - .. note:: The surface attribute/element can be omitted to make a cell fill - its entire universe. + As an example, the following code gives a cell that is the union of the + negative half-space of surface 3 and the complement of the intersection of + the positive half-space of surface 5 and the negative half-space of surface + 2: - *Default*: No surfaces + .. code-block:: xml + + + + .. note:: The ``region`` attribute/element can be omitted to make a cell + fill its entire universe. + + *Default*: A region filling all space. :rotation: If the cell is filled with a universe, this element specifies the angles in diff --git a/src/geometry.F90 b/src/geometry.F90 index a7a36a5351..2039703421 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -79,7 +79,7 @@ contains ! in the cell. in_cell = stack(i_stack) else - ! This case occurs if there is no surface specification since i_stack will + ! This case occurs if there is no region specification since i_stack will ! still be zero. in_cell = .true. end if @@ -874,7 +874,7 @@ contains do i = 1, n_cells c => cells(i) - ! loop over each surface specification + ! loop through the region specification do j = 1, size(c%region) i_surface = c % region(j) positive = (i_surface > 0) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index f074898f23..50a76afe1b 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1137,7 +1137,7 @@ contains ! Use shunting-yard algorithm to determine RPN for surface algorithm call generate_rpn(tokens, rpn) - ! Copy surface spec and RPN form to cell arrays + ! Copy region spec and RPN form to cell arrays allocate(c % region(tokens%size())) allocate(c % rpn(rpn%size())) c % region(:) = tokens%data(1:tokens%size()) @@ -4790,7 +4790,7 @@ contains !=============================================================================== ! GENERATE_RPN implements the shunting-yard algorithm to generate a Reverse -! polish notation (RPN) expression for the surface specification of a cell given +! Polish notation (RPN) expression for the region specification of a cell given ! the infix notation. !=============================================================================== @@ -4844,7 +4844,7 @@ contains ! If we run out of operators without finding a left parenthesis, it ! means there are mismatched parentheses. if (stack%size() == 0) then - call fatal_error('Mimatched parentheses in surface specification') + call fatal_error('Mimatched parentheses in region specification') end if op = stack%data(stack%size()) @@ -4864,7 +4864,7 @@ contains ! If the operator is a parenthesis, it is mismatched if (op >= OP_RIGHT_PAREN) then - call fatal_error('Mimatched parentheses in surface specification') + call fatal_error('Mimatched parentheses in region specification') end if call output%push_back(op) diff --git a/src/string.F90 b/src/string.F90 index 2d690dded5..213627892b 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -123,7 +123,7 @@ contains ! Check for invalid characters if (index('-0123456789', string_(i:i)) == 0) then call fatal_error("Invalid character '" // string_(i:i) // "' in & - &surface specification.") + ®ion specification.") end if ! If we haven't yet reached the start of a word, start a new word From c237f700adcd8436b5db01a4bb84f3e72f34f9f0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 14:02:20 +0700 Subject: [PATCH 202/519] Fix bug in tokenize algorithm The algorithm was failing to add intersections after right parentheses when appropriate. --- openmc/region.py | 13 +++++++++---- src/string.F90 | 8 ++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index 025babba89..a89658c03f 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -27,6 +27,9 @@ class Region(object): """ + # Strip leading and trailing whitespace + expression = expression.strip() + # Convert the string expression into a list of tokens, i.e., operators # and surface half-spaces, representing the expression in infix # notation. @@ -49,13 +52,15 @@ class Region(object): # to the list of tokens tokens.append(expression[i]) else: - # For spaces, we need to check the context further. If it - # doesn't appear before a right parentheses or union, it is - # interpreted to be as an intersection operator + # Find next non-space character while expression[i+1] == ' ': i += 1 - if i_start >= 0 and expression[i+1] not in ')^': + # If previous token is a halfspace or right parenthesis and next token + # is not a left parenthese or union operator, that implies that the + # whitespace is to be interpreted as an intersection operator + if (i_start >= 0 or tokens[-1] == ')') and \ + expression[i+1] not in ')^': tokens.append(' ') i_start = -1 diff --git a/src/string.F90 b/src/string.F90 index 213627892b..b505aa869b 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -108,10 +108,10 @@ contains i = i + 1 end do - ! If previous token is not an operator and next token is not a left - ! parenthese or union operator, that implies that the whitespace is to - ! be interpreted as an intersection operator - if (i_start > 0) then + ! If previous token is a halfspace or right parenthesis and next token + ! is not a left parenthese or union operator, that implies that the + ! whitespace is to be interpreted as an intersection operator + if (i_start > 0 .or. tokens%data(tokens%size()) == OP_RIGHT_PAREN) then if (index(')^', string_(i+1:i+1)) == 0) then call tokens%push_back(OP_INTERSECTION) end if From 98d745d9ced8bb124288a049797553361e67eb6b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 14:07:38 +0700 Subject: [PATCH 203/519] Add test with complex cells --- tests/test_complex_cell/geometry.xml | 24 ++++++++++++++++++++ tests/test_complex_cell/materials.xml | 23 +++++++++++++++++++ tests/test_complex_cell/results_true.dat | 11 +++++++++ tests/test_complex_cell/settings.xml | 16 +++++++++++++ tests/test_complex_cell/tallies.xml | 7 ++++++ tests/test_complex_cell/test_complex_cell.py | 10 ++++++++ 6 files changed, 91 insertions(+) create mode 100644 tests/test_complex_cell/geometry.xml create mode 100644 tests/test_complex_cell/materials.xml create mode 100644 tests/test_complex_cell/results_true.dat create mode 100644 tests/test_complex_cell/settings.xml create mode 100644 tests/test_complex_cell/tallies.xml create mode 100755 tests/test_complex_cell/test_complex_cell.py diff --git a/tests/test_complex_cell/geometry.xml b/tests/test_complex_cell/geometry.xml new file mode 100644 index 0000000000..1609dad104 --- /dev/null +++ b/tests/test_complex_cell/geometry.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_complex_cell/materials.xml b/tests/test_complex_cell/materials.xml new file mode 100644 index 0000000000..60ec996735 --- /dev/null +++ b/tests/test_complex_cell/materials.xml @@ -0,0 +1,23 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_complex_cell/results_true.dat b/tests/test_complex_cell/results_true.dat new file mode 100644 index 0000000000..56e7e409f0 --- /dev/null +++ b/tests/test_complex_cell/results_true.dat @@ -0,0 +1,11 @@ +k-combined: +2.651570E-01 2.116381E-03 +tally 1: +2.639097E+00 +1.394398E+00 +2.743740E+00 +1.506124E+00 +1.041248E+00 +2.177204E-01 +1.087210E-01 +2.365126E-03 diff --git a/tests/test_complex_cell/settings.xml b/tests/test_complex_cell/settings.xml new file mode 100644 index 0000000000..a6fd5da19e --- /dev/null +++ b/tests/test_complex_cell/settings.xml @@ -0,0 +1,16 @@ + + + + + 10 + 5 + 1000 + + + + + -4 -4 -4 4 4 4 + + + + diff --git a/tests/test_complex_cell/tallies.xml b/tests/test_complex_cell/tallies.xml new file mode 100644 index 0000000000..d1a7d387ee --- /dev/null +++ b/tests/test_complex_cell/tallies.xml @@ -0,0 +1,7 @@ + + + + + total + + diff --git a/tests/test_complex_cell/test_complex_cell.py b/tests/test_complex_cell/test_complex_cell.py new file mode 100755 index 0000000000..1777db993e --- /dev/null +++ b/tests/test_complex_cell/test_complex_cell.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() From 975771fbfe656df0cad72264fd777ec0c4487b0d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 14:48:29 +0700 Subject: [PATCH 204/519] Combine multiple intersections/unions when parsing region expressions --- openmc/region.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openmc/region.py b/openmc/region.py index a89658c03f..c54d8d3abc 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -95,6 +95,9 @@ class Region(object): elif isinstance(r2, Intersection) and hasattr(r1, 'surface'): r2.nodes.insert(0, r1) output.append(r2) + elif isinstance(r1, Intersection) and isinstance(r2, Intersection): + r1.nodes += r2.nodes + output.append(r1) else: output.append(Intersection(r1, r2)) elif operator == '^': @@ -105,6 +108,9 @@ class Region(object): elif isinstance(r2, Union) and hasattr(r1, 'surface'): r2.nodes.insert(0, r1) output.append(r2) + elif isinstance(r1, Union) and isinstance(r2, Union): + r1.nodes += r2.nodes + output.append(r1) else: output.append(Union(r1, r2)) elif operator == '~': From 6beee729cb28285bad294d292062a513216e0306 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 15:55:02 +0700 Subject: [PATCH 205/519] Update summary file format changing surfaces -> region --- docs/source/usersguide/output/summary.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 9ced8448a3..d37b2172fa 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -117,9 +117,9 @@ The current revision of the summary file format is 1. Unique ID of the lattice which fills the cell. Only present if fill_type is set to 'lattice'. -**/geometry/cells/cell /surfaces** (*int[]*) +**/geometry/cells/cell /region** (*char[]*) - Surface specification for the cell. + Region specification for the cell. **/geometry/surfaces/surface /index** (*int*) From d719129a5618c21dd04bd059fcf1859c03556ab8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Mon, 28 Sep 2015 04:59:29 -0400 Subject: [PATCH 206/519] Removed explicit casting of multiplicity to real in tally.f90, removed tally module dependence on interpolation, and updated nuscatter tests to better capture nu-scattering --- src/tally.F90 | 7 +- tests/test_score_nuscatter/results_true.dat | 14 ++-- tests/test_score_nuscatter/settings.xml | 2 +- tests/test_score_nuscatter_n/results_true.dat | 62 ++++++++-------- tests/test_score_nuscatter_n/settings.xml | 2 +- .../test_score_nuscatter_pn/results_true.dat | 42 +++++------ tests/test_score_nuscatter_pn/settings.xml | 2 +- .../test_score_nuscatter_yn/results_true.dat | 70 +++++++++---------- tests/test_score_nuscatter_yn/settings.xml | 2 +- 9 files changed, 101 insertions(+), 102 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 7034b6d83c..d8ecf4db51 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -5,7 +5,6 @@ module tally use error, only: fatal_error use geometry_header use global - use interpolation use math, only: t_percentile, calc_pn, calc_rn use mesh, only: get_mesh_bin, bin_to_mesh_indices, & get_mesh_indices, mesh_indices_to_bin, & @@ -196,7 +195,7 @@ contains score = p % wgt else ! Grab the multiplicity from the rxn - score = p % last_wgt * real(rxn % multiplicity,8) + score = p % last_wgt * rxn % multiplicity end if end if @@ -233,7 +232,7 @@ contains score = p % wgt else ! Grab the multiplicity from the rxn - score = p % last_wgt * real(rxn % multiplicity,8) + score = p % last_wgt * rxn % multiplicity end if end if @@ -270,7 +269,7 @@ contains score = p % wgt else ! Grab the multiplicity from the rxn - score = p % last_wgt * real(rxn % multiplicity,8) + score = p % last_wgt * rxn % multiplicity end if end if diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index df695d8a87..66e0c0a031 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.870214E-01 2.095925E-02 tally 1: 0.000000E+00 0.000000E+00 -1.169000E+01 -2.915330E+01 -3.200000E+00 -2.342600E+00 -4.064000E+01 -3.595168E+02 +3.353000E+01 +1.133379E+02 +8.150000E+00 +6.793700E+00 +1.098500E+02 +1.221333E+03 diff --git a/tests/test_score_nuscatter/settings.xml b/tests/test_score_nuscatter/settings.xml index 517637a59f..ce632aae31 100644 --- a/tests/test_score_nuscatter/settings.xml +++ b/tests/test_score_nuscatter/settings.xml @@ -3,7 +3,7 @@ 10 - 5 + 0 100 diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index b46a1e184d..5dbc7f8abf 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.005983E+00 2.248579E-02 +9.870214E-01 2.095925E-02 tally 1: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 -3.200000E+00 -2.342600E+00 -3.809941E-01 -2.965326E-02 -4.319242E-01 -3.738822E-02 -9.261909E-02 -6.711328E-03 --6.052442E-02 -7.087230E-03 -4.064000E+01 -3.595168E+02 -2.096700E+01 -9.516606E+01 -7.560566E+00 -1.248694E+01 -2.093348E-01 -4.278510E-02 --1.449929E+00 -4.356371E-01 +3.353000E+01 +1.133379E+02 +3.491100E+00 +1.265776E+00 +1.948509E+00 +4.761101E-01 +9.177045E-01 +1.251750E-01 +5.654249E-01 +5.567043E-02 +8.150000E+00 +6.793700E+00 +1.223263E+00 +1.678053E-01 +7.833173E-01 +8.407682E-02 +1.350170E-01 +7.393546E-03 +2.164837E-01 +1.367122E-02 +1.098500E+02 +1.221333E+03 +5.598624E+01 +3.183267E+02 +2.048716E+01 +4.301097E+01 +1.399456E+00 +4.458904E-01 +-2.183180E+00 +6.628474E-01 diff --git a/tests/test_score_nuscatter_n/settings.xml b/tests/test_score_nuscatter_n/settings.xml index 517637a59f..ce632aae31 100644 --- a/tests/test_score_nuscatter_n/settings.xml +++ b/tests/test_score_nuscatter_n/settings.xml @@ -3,7 +3,7 @@ 10 - 5 + 0 100 diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 3c34895d90..41bc17f8b8 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.005983E+00 2.248579E-02 +9.870214E-01 2.095925E-02 tally 1: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 +3.353000E+01 +1.133379E+02 +3.491100E+00 +1.265776E+00 +1.948509E+00 +4.761101E-01 +9.177045E-01 +1.251750E-01 +5.654249E-01 +5.567043E-02 tally 2: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 +3.353000E+01 +1.133379E+02 +3.491100E+00 +1.265776E+00 +1.948509E+00 +4.761101E-01 +9.177045E-01 +1.251750E-01 +5.654249E-01 +5.567043E-02 diff --git a/tests/test_score_nuscatter_pn/settings.xml b/tests/test_score_nuscatter_pn/settings.xml index 517637a59f..ce632aae31 100644 --- a/tests/test_score_nuscatter_pn/settings.xml +++ b/tests/test_score_nuscatter_pn/settings.xml @@ -3,7 +3,7 @@ 10 - 5 + 0 100 diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index 1e8e143ef4..cdf051ee75 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -1.005983E+00 2.248579E-02 +9.870214E-01 2.095925E-02 tally 1: -1.169000E+01 -2.915330E+01 +3.353000E+01 +1.133379E+02 tally 2: -1.169000E+01 -2.915330E+01 --2.198379E-01 -2.828670E-02 --1.317276E-01 -9.568596E-03 -8.309792E-02 -1.155410E-02 --2.288506E-02 -3.710542E-03 --2.720674E-02 -1.789163E-03 --1.323964E-02 -1.819112E-04 -8.941597E-02 -4.265616E-03 -1.516805E-01 -1.332526E-02 --1.832782E-02 -6.611171E-03 -1.311371E-02 -2.840648E-03 -3.728365E-02 -2.866806E-03 --5.100587E-02 -2.957146E-03 -3.388028E-02 -2.481570E-03 --7.766921E-02 -3.129377E-03 -1.666131E-02 -3.828290E-03 +3.353000E+01 +1.133379E+02 +4.293226E-01 +6.259462E-02 +-2.011041E-02 +5.388144E-02 +3.900136E-01 +5.873137E-02 +6.150213E-02 +9.043796E-03 +5.518583E-02 +1.739087E-02 +-2.047987E-01 +1.993679E-02 +6.710345E-02 +1.652573E-02 +-3.619254E-02 +1.598186E-02 +3.551558E-02 +9.077346E-03 +1.044669E-01 +2.082961E-03 +-3.782063E-02 +1.681459E-02 +1.752386E-01 +1.411429E-02 +-3.289649E-02 +9.534958E-03 +5.252770E-02 +7.518445E-03 +2.688056E-02 +3.397824E-03 diff --git a/tests/test_score_nuscatter_yn/settings.xml b/tests/test_score_nuscatter_yn/settings.xml index 517637a59f..ce632aae31 100644 --- a/tests/test_score_nuscatter_yn/settings.xml +++ b/tests/test_score_nuscatter_yn/settings.xml @@ -3,7 +3,7 @@ 10 - 5 + 0 100 From f093429cedfc765d22ecf562e8417519470f42fd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 16:53:27 +0700 Subject: [PATCH 207/519] Update example Python inputs, fix exporting to XML for --- examples/python/basic/build-xml.py | 11 ++++---- .../python/lattice/hexagonal/build-xml.py | 15 ++++++----- examples/python/lattice/nested/build-xml.py | 25 ++++++++----------- examples/python/lattice/simple/build-xml.py | 22 ++++++++-------- examples/python/pincell/build-xml.py | 17 +++++-------- examples/python/reflective/build-xml.py | 13 ++++------ openmc/universe.py | 4 +-- 7 files changed, 46 insertions(+), 61 deletions(-) diff --git a/examples/python/basic/build-xml.py b/examples/python/basic/build-xml.py index fb850f3add..865740e13b 100644 --- a/examples/python/basic/build-xml.py +++ b/examples/python/basic/build-xml.py @@ -1,5 +1,5 @@ import openmc - +from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -55,11 +55,10 @@ cell3 = openmc.Cell(cell_id=101, name='cell 3') cell4 = openmc.Cell(cell_id=2, name='cell 4') # Register Surfaces with Cells -cell1.add_surface(surface=surf2, halfspace=-1) -cell2.add_surface(surface=surf1, halfspace=-1) -cell3.add_surface(surface=surf1, halfspace=+1) -cell4.add_surface(surface=surf2, halfspace=+1) -cell4.add_surface(surface=surf3, halfspace=-1) +cell1.region = surf2.negative +cell2.region = surf1.negative +cell3.region = surf1.positive +cell4.region = Intersection(surf2.positive, surf3.negative) # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/lattice/hexagonal/build-xml.py b/examples/python/lattice/hexagonal/build-xml.py index 5cf8eed062..b042e830ad 100644 --- a/examples/python/lattice/hexagonal/build-xml.py +++ b/examples/python/lattice/hexagonal/build-xml.py @@ -1,4 +1,5 @@ import openmc +from openmc.region import Intersection ############################################################################### @@ -68,14 +69,12 @@ cell5 = openmc.Cell(cell_id=600, name='cell 5') cell6 = openmc.Cell(cell_id=601, name='cell 6') # Register Surfaces with Cells -cell1.add_surface(left, halfspace=+1) -cell1.add_surface(right, halfspace=-1) -cell1.add_surface(bottom, halfspace=+1) -cell1.add_surface(top, halfspace=-1) -cell2.add_surface(fuel_surf, halfspace=-1) -cell3.add_surface(fuel_surf, halfspace=+1) -cell5.add_surface(fuel_surf, halfspace=-1) -cell6.add_surface(fuel_surf, halfspace=+1) +cell1.region = Intersection(left.positive, right.negative, + bottom.positive, top.negative) +cell2.region = fuel_surf.negative +cell3.region = fuel_surf.positive +cell5.region = fuel_surf.negative +cell6.region = fuel_surf.positive # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index 24b5554c0f..f4bc7d1ac9 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -1,4 +1,5 @@ import openmc +from openmc.region import Intersection ############################################################################### @@ -67,20 +68,16 @@ cell7 = openmc.Cell(cell_id=301, name='cell 7') cell8 = openmc.Cell(cell_id=302, name='cell 8') # Register Surfaces with Cells -cell1.add_surface(left, halfspace=+1) -cell1.add_surface(right, halfspace=-1) -cell1.add_surface(bottom, halfspace=+1) -cell1.add_surface(top, halfspace=-1) -cell2.add_surface(left, halfspace=+1) -cell2.add_surface(right, halfspace=-1) -cell2.add_surface(bottom, halfspace=+1) -cell2.add_surface(top, halfspace=-1) -cell3.add_surface(fuel1, halfspace=-1) -cell4.add_surface(fuel1, halfspace=+1) -cell5.add_surface(fuel2, halfspace=-1) -cell6.add_surface(fuel2, halfspace=+1) -cell7.add_surface(fuel3, halfspace=-1) -cell8.add_surface(fuel3, halfspace=+1) +cell1.region = Intersection(left.positive, right.negative, + bottom.positive, top.negative) +cell2.region = Intersection(left.positive, right.negative, + bottom.positive, top.negative) +cell3.region = fuel1.negative +cell4.region = fuel1.positive +cell5.region = fuel2.negative +cell6.region = fuel2.positive +cell7.region = fuel3.negative +cell8.region = fuel3.positive # Register Materials with Cells cell3.fill = fuel diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index 57e1f17292..155cfa1cbf 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -1,5 +1,5 @@ import openmc - +from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -65,17 +65,15 @@ cell5 = openmc.Cell(cell_id=202, name='cell 5') cell6 = openmc.Cell(cell_id=301, name='cell 6') cell7 = openmc.Cell(cell_id=302, name='cell 7') -# Register Surfaces with Cells -cell1.add_surface(left, halfspace=+1) -cell1.add_surface(right, halfspace=-1) -cell1.add_surface(bottom, halfspace=+1) -cell1.add_surface(top, halfspace=-1) -cell2.add_surface(fuel1, halfspace=-1) -cell3.add_surface(fuel1, halfspace=+1) -cell4.add_surface(fuel2, halfspace=-1) -cell5.add_surface(fuel2, halfspace=+1) -cell6.add_surface(fuel3, halfspace=-1) -cell7.add_surface(fuel3, halfspace=+1) +# Register Regions with Cells +cell1.region = Intersection(left.positive, right.negative, + bottom.positive, top.negative) +cell2.region = fuel1.negative +cell3.region = fuel1.positive +cell4.region = fuel2.negative +cell5.region = fuel2.positive +cell6.region = fuel3.negative +cell7.region = fuel3.positive # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index fc9663b900..d37024db3e 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -1,5 +1,5 @@ import openmc - +from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -133,16 +133,11 @@ clad = openmc.Cell(cell_id=3, name='cell 3') water = openmc.Cell(cell_id=4, name='cell 4') # Register Surfaces with Cells -fuel.add_surface(fuel_or, halfspace=-1) -gap.add_surface(fuel_or, halfspace=+1) -gap.add_surface(clad_ir, halfspace=-1) -clad.add_surface(clad_ir, halfspace=+1) -clad.add_surface(clad_or, halfspace=-1) -water.add_surface(clad_or, halfspace=+1) -water.add_surface(left, halfspace=+1) -water.add_surface(right, halfspace=-1) -water.add_surface(bottom, halfspace=+1) -water.add_surface(top, halfspace=-1) +fuel.region = fuel_or.negative +gap.region = Intersection(fuel_or.positive, clad_ir.negative) +clad.region = Intersection(clad_ir.positive, clad_or.negative) +water.region = Intersection(clad_or.positive, left.positive, right.negative, + bottom.positive, top.negative) # Register Materials with Cells fuel.fill = uo2 diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 9a182903e1..5a3e861e60 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -1,5 +1,5 @@ import openmc - +from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -52,13 +52,10 @@ surf6.boundary_type = 'reflective' # Instantiate Cell cell = openmc.Cell(cell_id=1, name='cell 1') -# Register Surfaces with Cell -cell.add_surface(surface=surf1, halfspace=+1) -cell.add_surface(surface=surf2, halfspace=-1) -cell.add_surface(surface=surf3, halfspace=+1) -cell.add_surface(surface=surf4, halfspace=-1) -cell.add_surface(surface=surf5, halfspace=+1) -cell.add_surface(surface=surf6, halfspace=-1) +# Register Region with Cell +cell.region = Intersection(surf1.positive, surf2.negative, + surf3.positive, surf4.negative, + surf5.positive, surf6.negative) # Register Material with Cell cell.fill = fuel diff --git a/openmc/universe.py b/openmc/universe.py index 79cb90fd00..e9a693bc43 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -327,8 +327,8 @@ class Cell(object): self._fill.create_xml_subelement(xml_element) if self.region is not None: - # Set the surfaces attribute with the region specification - element.set("surfaces", str(self.region)) + # Set the region attribute with the region specification + element.set("region", str(self.region)) # Only surfaces that appear in a region are added to the geometry # file, so the appropriate check is performed here. First we create From adfa0288ce22a01c1cfe3220cb4713638357ff68 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 16:54:48 +0700 Subject: [PATCH 208/519] Update all geometry.xml files to use 'region' --- examples/xml/basic/geometry.xml | 6 +- examples/xml/lattice/nested/geometry.xml | 16 ++-- examples/xml/lattice/simple/geometry.xml | 14 ++-- examples/xml/pincell/geometry.xml | 8 +- tests/test_basic/geometry.xml | 2 +- tests/test_confidence_intervals/geometry.xml | 2 +- tests/test_density_atombcm/geometry.xml | 2 +- tests/test_density_atomcm3/geometry.xml | 2 +- tests/test_density_kgm3/geometry.xml | 2 +- tests/test_density_sum/geometry.xml | 2 +- .../test_eigenvalue_genperbatch/geometry.xml | 2 +- .../test_eigenvalue_no_inactive/geometry.xml | 2 +- tests/test_energy_grid/geometry.xml | 2 +- tests/test_entropy/geometry.xml | 2 +- tests/test_filter_cell/geometry.xml | 56 ++++++------- tests/test_filter_cellborn/geometry.xml | 56 ++++++------- .../case-1/geometry.xml | 6 +- .../case-2/geometry.xml | 18 ++--- .../case-3/geometry.xml | 56 ++++++------- .../case-4/geometry.xml | 8 +- tests/test_filter_energy/geometry.xml | 56 ++++++------- tests/test_filter_energyout/geometry.xml | 56 ++++++------- tests/test_filter_group_transfer/geometry.xml | 56 ++++++------- tests/test_filter_material/geometry.xml | 56 ++++++------- tests/test_filter_mesh_2d/geometry.xml | 56 ++++++------- tests/test_filter_mesh_3d/geometry.xml | 56 ++++++------- tests/test_filter_universe/geometry.xml | 56 ++++++------- tests/test_fixed_source/geometry.xml | 2 +- tests/test_infinite_cell/geometry.xml | 4 +- tests/test_lattice/geometry.xml | 72 ++++++++--------- tests/test_lattice_hex/geometry.xml | 28 +++---- tests/test_lattice_mixed/geometry.xml | 28 +++---- tests/test_lattice_multiple/geometry.xml | 56 ++++++------- tests/test_many_scores/geometry.xml | 56 ++++++------- tests/test_natural_element/geometry.xml | 66 +++++++-------- tests/test_output/geometry.xml | 2 +- .../test_particle_restart_eigval/geometry.xml | 2 +- .../test_particle_restart_fixed/geometry.xml | 2 +- tests/test_plot_background/geometry.xml | 2 +- tests/test_plot_basis/geometry.xml | 6 +- tests/test_plot_colspec/geometry.xml | 2 +- tests/test_plot_mask/geometry.xml | 6 +- tests/test_ptables_off/geometry.xml | 2 +- tests/test_reflective_cone/geometry.xml | 2 +- tests/test_reflective_cylinder/geometry.xml | 2 +- tests/test_reflective_plane/geometry.xml | 2 +- tests/test_reflective_sphere/geometry.xml | 2 +- tests/test_resonance_scattering/geometry.xml | 2 +- tests/test_rotation/geometry.xml | 4 +- tests/test_salphabeta/geometry.xml | 6 +- tests/test_salphabeta_multiple/geometry.xml | 66 +++++++-------- tests/test_score_MT/geometry.xml | 56 ++++++------- tests/test_score_absorption/geometry.xml | 56 ++++++------- tests/test_score_current/geometry.xml | 56 ++++++------- tests/test_score_events/geometry.xml | 56 ++++++------- tests/test_score_fission/geometry.xml | 56 ++++++------- tests/test_score_flux/geometry.xml | 56 ++++++------- tests/test_score_flux_yn/geometry.xml | 56 ++++++------- tests/test_score_kappafission/geometry.xml | 56 ++++++------- tests/test_score_nufission/geometry.xml | 56 ++++++------- tests/test_score_nuscatter/geometry.xml | 56 ++++++------- tests/test_score_nuscatter_n/geometry.xml | 56 ++++++------- tests/test_score_nuscatter_pn/geometry.xml | 56 ++++++------- tests/test_score_nuscatter_yn/geometry.xml | 56 ++++++------- tests/test_score_scatter/geometry.xml | 56 ++++++------- tests/test_score_scatter_n/geometry.xml | 56 ++++++------- tests/test_score_scatter_pn/geometry.xml | 56 ++++++------- tests/test_score_scatter_yn/geometry.xml | 56 ++++++------- tests/test_score_total/geometry.xml | 56 ++++++------- tests/test_score_total_yn/geometry.xml | 56 ++++++------- tests/test_seed/geometry.xml | 2 +- tests/test_source_angle_mono/geometry.xml | 2 +- tests/test_source_energy_maxwell/geometry.xml | 2 +- tests/test_source_energy_mono/geometry.xml | 2 +- tests/test_source_file/geometry.xml | 2 +- tests/test_source_point/geometry.xml | 2 +- tests/test_sourcepoint_batch/geometry.xml | 2 +- tests/test_sourcepoint_interval/geometry.xml | 2 +- tests/test_sourcepoint_latest/geometry.xml | 2 +- tests/test_sourcepoint_restart/geometry.xml | 2 +- tests/test_statepoint_batch/geometry.xml | 2 +- tests/test_statepoint_interval/geometry.xml | 2 +- tests/test_statepoint_restart/geometry.xml | 2 +- tests/test_statepoint_sourcesep/geometry.xml | 2 +- tests/test_survival_biasing/geometry.xml | 2 +- tests/test_tally_assumesep/geometry.xml | 56 ++++++------- tests/test_tally_nuclides/geometry.xml | 4 +- tests/test_trace/geometry.xml | 2 +- tests/test_track_output/geometry.xml | 80 +++++++++---------- tests/test_translation/geometry.xml | 4 +- .../test_trigger_batch_interval/geometry.xml | 4 +- .../geometry.xml | 4 +- tests/test_trigger_no_status/geometry.xml | 4 +- tests/test_trigger_tallies/geometry.xml | 4 +- tests/test_uniform_fs/geometry.xml | 2 +- tests/test_union_energy_grids/geometry.xml | 2 +- tests/test_universe/geometry.xml | 4 +- tests/test_void/geometry.xml | 30 +++---- 98 files changed, 1186 insertions(+), 1186 deletions(-) diff --git a/examples/xml/basic/geometry.xml b/examples/xml/basic/geometry.xml index e9483306c0..b7de2c1346 100644 --- a/examples/xml/basic/geometry.xml +++ b/examples/xml/basic/geometry.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/examples/xml/lattice/nested/geometry.xml b/examples/xml/lattice/nested/geometry.xml index 9df9b9e931..324f71cb36 100644 --- a/examples/xml/lattice/nested/geometry.xml +++ b/examples/xml/lattice/nested/geometry.xml @@ -1,14 +1,14 @@ - - - - - - - - + + + + + + + + diff --git a/examples/xml/lattice/simple/geometry.xml b/examples/xml/lattice/simple/geometry.xml index c1f8d78644..bda7246c79 100644 --- a/examples/xml/lattice/simple/geometry.xml +++ b/examples/xml/lattice/simple/geometry.xml @@ -1,13 +1,13 @@ - - - - - - - + + + + + + + 4 4 diff --git a/examples/xml/pincell/geometry.xml b/examples/xml/pincell/geometry.xml index 53cb2f15dc..f67f9e74c2 100644 --- a/examples/xml/pincell/geometry.xml +++ b/examples/xml/pincell/geometry.xml @@ -19,9 +19,9 @@ - - - - + + + + diff --git a/tests/test_basic/geometry.xml b/tests/test_basic/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_basic/geometry.xml +++ b/tests/test_basic/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_confidence_intervals/geometry.xml b/tests/test_confidence_intervals/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_confidence_intervals/geometry.xml +++ b/tests/test_confidence_intervals/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_atombcm/geometry.xml b/tests/test_density_atombcm/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_density_atombcm/geometry.xml +++ b/tests/test_density_atombcm/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_atomcm3/geometry.xml b/tests/test_density_atomcm3/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_density_atomcm3/geometry.xml +++ b/tests/test_density_atomcm3/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_kgm3/geometry.xml b/tests/test_density_kgm3/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_density_kgm3/geometry.xml +++ b/tests/test_density_kgm3/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_sum/geometry.xml b/tests/test_density_sum/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_density_sum/geometry.xml +++ b/tests/test_density_sum/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_eigenvalue_genperbatch/geometry.xml b/tests/test_eigenvalue_genperbatch/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_eigenvalue_genperbatch/geometry.xml +++ b/tests/test_eigenvalue_genperbatch/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_eigenvalue_no_inactive/geometry.xml b/tests/test_eigenvalue_no_inactive/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_eigenvalue_no_inactive/geometry.xml +++ b/tests/test_eigenvalue_no_inactive/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_energy_grid/geometry.xml b/tests/test_energy_grid/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_energy_grid/geometry.xml +++ b/tests/test_energy_grid/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_entropy/geometry.xml b/tests/test_entropy/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_entropy/geometry.xml +++ b/tests/test_entropy/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_filter_cell/geometry.xml b/tests/test_filter_cell/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_cell/geometry.xml +++ b/tests/test_filter_cell/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_cellborn/geometry.xml b/tests/test_filter_cellborn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_cellborn/geometry.xml +++ b/tests/test_filter_cellborn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_distribcell/case-1/geometry.xml b/tests/test_filter_distribcell/case-1/geometry.xml index 507559615e..34e636e9fc 100644 --- a/tests/test_filter_distribcell/case-1/geometry.xml +++ b/tests/test_filter_distribcell/case-1/geometry.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/tests/test_filter_distribcell/case-2/geometry.xml b/tests/test_filter_distribcell/case-2/geometry.xml index b6797d65d0..e3aeedd645 100644 --- a/tests/test_filter_distribcell/case-2/geometry.xml +++ b/tests/test_filter_distribcell/case-2/geometry.xml @@ -1,15 +1,15 @@ - - - - - - - - - + + + + + + + + + 2 2 diff --git a/tests/test_filter_distribcell/case-3/geometry.xml b/tests/test_filter_distribcell/case-3/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_distribcell/case-3/geometry.xml +++ b/tests/test_filter_distribcell/case-3/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_distribcell/case-4/geometry.xml b/tests/test_filter_distribcell/case-4/geometry.xml index 4c2a7fd5e4..c835218bc0 100644 --- a/tests/test_filter_distribcell/case-4/geometry.xml +++ b/tests/test_filter_distribcell/case-4/geometry.xml @@ -1,9 +1,9 @@ - - - - + + + + 1.0 3 diff --git a/tests/test_filter_energy/geometry.xml b/tests/test_filter_energy/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_energy/geometry.xml +++ b/tests/test_filter_energy/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_energyout/geometry.xml b/tests/test_filter_energyout/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_energyout/geometry.xml +++ b/tests/test_filter_energyout/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_group_transfer/geometry.xml b/tests/test_filter_group_transfer/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_group_transfer/geometry.xml +++ b/tests/test_filter_group_transfer/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_material/geometry.xml b/tests/test_filter_material/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_material/geometry.xml +++ b/tests/test_filter_material/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_mesh_2d/geometry.xml b/tests/test_filter_mesh_2d/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_mesh_2d/geometry.xml +++ b/tests/test_filter_mesh_2d/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_mesh_3d/geometry.xml b/tests/test_filter_mesh_3d/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_mesh_3d/geometry.xml +++ b/tests/test_filter_mesh_3d/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_universe/geometry.xml b/tests/test_filter_universe/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_filter_universe/geometry.xml +++ b/tests/test_filter_universe/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_fixed_source/geometry.xml b/tests/test_fixed_source/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_fixed_source/geometry.xml +++ b/tests/test_fixed_source/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_infinite_cell/geometry.xml b/tests/test_infinite_cell/geometry.xml index e3f63354c6..90bd2233be 100644 --- a/tests/test_infinite_cell/geometry.xml +++ b/tests/test_infinite_cell/geometry.xml @@ -1,7 +1,7 @@ - + @@ -13,5 +13,5 @@ - + diff --git a/tests/test_lattice/geometry.xml b/tests/test_lattice/geometry.xml index 89af5f1968..809cd6fbb1 100644 --- a/tests/test_lattice/geometry.xml +++ b/tests/test_lattice/geometry.xml @@ -40,11 +40,11 @@ - - - - - + + + + + @@ -85,38 +85,38 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/tests/test_lattice_hex/geometry.xml b/tests/test_lattice_hex/geometry.xml index 8b5915dcdb..cfe39849cb 100644 --- a/tests/test_lattice_hex/geometry.xml +++ b/tests/test_lattice_hex/geometry.xml @@ -14,29 +14,29 @@ - - - - - - - + + + + + + + - - - + + + - - - + + + @@ -194,6 +194,6 @@ + region="-1001 -1002 -1003 -1004 -1005 -1006 1007 -1008"/> diff --git a/tests/test_lattice_mixed/geometry.xml b/tests/test_lattice_mixed/geometry.xml index 524e4d9289..41aa05d411 100644 --- a/tests/test_lattice_mixed/geometry.xml +++ b/tests/test_lattice_mixed/geometry.xml @@ -15,29 +15,29 @@ - - - - - - - + + + + + + + - - - + + + - - - + + + @@ -151,6 +151,6 @@ + region="-1001 -1002 -1003 -1004 -1005 -1006 1007 -1008"/> diff --git a/tests/test_lattice_multiple/geometry.xml b/tests/test_lattice_multiple/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_lattice_multiple/geometry.xml +++ b/tests/test_lattice_multiple/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_many_scores/geometry.xml b/tests/test_many_scores/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_many_scores/geometry.xml +++ b/tests/test_many_scores/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_natural_element/geometry.xml b/tests/test_natural_element/geometry.xml index 2d427d8cb3..b6b4bd817b 100644 --- a/tests/test_natural_element/geometry.xml +++ b/tests/test_natural_element/geometry.xml @@ -45,50 +45,50 @@ - - + + - - + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - + + + diff --git a/tests/test_output/geometry.xml b/tests/test_output/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_output/geometry.xml +++ b/tests/test_output/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_particle_restart_eigval/geometry.xml b/tests/test_particle_restart_eigval/geometry.xml index 52fea4df64..c86e016c6e 100644 --- a/tests/test_particle_restart_eigval/geometry.xml +++ b/tests/test_particle_restart_eigval/geometry.xml @@ -4,6 +4,6 @@ - + diff --git a/tests/test_particle_restart_fixed/geometry.xml b/tests/test_particle_restart_fixed/geometry.xml index 52fea4df64..c86e016c6e 100644 --- a/tests/test_particle_restart_fixed/geometry.xml +++ b/tests/test_particle_restart_fixed/geometry.xml @@ -4,6 +4,6 @@ - + diff --git a/tests/test_plot_background/geometry.xml b/tests/test_plot_background/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_plot_background/geometry.xml +++ b/tests/test_plot_background/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_plot_basis/geometry.xml b/tests/test_plot_basis/geometry.xml index ac00ebaf51..83619d9f78 100644 --- a/tests/test_plot_basis/geometry.xml +++ b/tests/test_plot_basis/geometry.xml @@ -6,8 +6,8 @@ - - - + + + diff --git a/tests/test_plot_colspec/geometry.xml b/tests/test_plot_colspec/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_plot_colspec/geometry.xml +++ b/tests/test_plot_colspec/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_plot_mask/geometry.xml b/tests/test_plot_mask/geometry.xml index ac00ebaf51..83619d9f78 100644 --- a/tests/test_plot_mask/geometry.xml +++ b/tests/test_plot_mask/geometry.xml @@ -6,8 +6,8 @@ - - - + + + diff --git a/tests/test_ptables_off/geometry.xml b/tests/test_ptables_off/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_ptables_off/geometry.xml +++ b/tests/test_ptables_off/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_reflective_cone/geometry.xml b/tests/test_reflective_cone/geometry.xml index 5453e16155..f5499fbb61 100644 --- a/tests/test_reflective_cone/geometry.xml +++ b/tests/test_reflective_cone/geometry.xml @@ -2,6 +2,6 @@ - + diff --git a/tests/test_reflective_cylinder/geometry.xml b/tests/test_reflective_cylinder/geometry.xml index ce1082f3d6..e6aed65daf 100644 --- a/tests/test_reflective_cylinder/geometry.xml +++ b/tests/test_reflective_cylinder/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_reflective_plane/geometry.xml b/tests/test_reflective_plane/geometry.xml index 4544414365..0dc5c29ab5 100644 --- a/tests/test_reflective_plane/geometry.xml +++ b/tests/test_reflective_plane/geometry.xml @@ -8,6 +8,6 @@ - + diff --git a/tests/test_reflective_sphere/geometry.xml b/tests/test_reflective_sphere/geometry.xml index 5f36d2396f..0dc98eba69 100644 --- a/tests/test_reflective_sphere/geometry.xml +++ b/tests/test_reflective_sphere/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_resonance_scattering/geometry.xml b/tests/test_resonance_scattering/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_resonance_scattering/geometry.xml +++ b/tests/test_resonance_scattering/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_rotation/geometry.xml b/tests/test_rotation/geometry.xml index 7306dabdef..2226178771 100644 --- a/tests/test_rotation/geometry.xml +++ b/tests/test_rotation/geometry.xml @@ -5,7 +5,7 @@ - - + + diff --git a/tests/test_salphabeta/geometry.xml b/tests/test_salphabeta/geometry.xml index ef05988425..f9caa6c883 100644 --- a/tests/test_salphabeta/geometry.xml +++ b/tests/test_salphabeta/geometry.xml @@ -6,8 +6,8 @@ - - - + + + diff --git a/tests/test_salphabeta_multiple/geometry.xml b/tests/test_salphabeta_multiple/geometry.xml index 63f69f7438..13eb601660 100644 --- a/tests/test_salphabeta_multiple/geometry.xml +++ b/tests/test_salphabeta_multiple/geometry.xml @@ -45,52 +45,52 @@ - + - + - - + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - + + + diff --git a/tests/test_score_MT/geometry.xml b/tests/test_score_MT/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_MT/geometry.xml +++ b/tests/test_score_MT/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_absorption/geometry.xml b/tests/test_score_absorption/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_absorption/geometry.xml +++ b/tests/test_score_absorption/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_current/geometry.xml b/tests/test_score_current/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_current/geometry.xml +++ b/tests/test_score_current/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_events/geometry.xml b/tests/test_score_events/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_events/geometry.xml +++ b/tests/test_score_events/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_fission/geometry.xml b/tests/test_score_fission/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_fission/geometry.xml +++ b/tests/test_score_fission/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_flux/geometry.xml b/tests/test_score_flux/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_flux/geometry.xml +++ b/tests/test_score_flux/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_flux_yn/geometry.xml b/tests/test_score_flux_yn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_flux_yn/geometry.xml +++ b/tests/test_score_flux_yn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_kappafission/geometry.xml b/tests/test_score_kappafission/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_kappafission/geometry.xml +++ b/tests/test_score_kappafission/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_nufission/geometry.xml b/tests/test_score_nufission/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_nufission/geometry.xml +++ b/tests/test_score_nufission/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_nuscatter/geometry.xml b/tests/test_score_nuscatter/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_nuscatter/geometry.xml +++ b/tests/test_score_nuscatter/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_nuscatter_n/geometry.xml b/tests/test_score_nuscatter_n/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_nuscatter_n/geometry.xml +++ b/tests/test_score_nuscatter_n/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_nuscatter_pn/geometry.xml b/tests/test_score_nuscatter_pn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_nuscatter_pn/geometry.xml +++ b/tests/test_score_nuscatter_pn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_nuscatter_yn/geometry.xml b/tests/test_score_nuscatter_yn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_nuscatter_yn/geometry.xml +++ b/tests/test_score_nuscatter_yn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_scatter/geometry.xml b/tests/test_score_scatter/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_scatter/geometry.xml +++ b/tests/test_score_scatter/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_scatter_n/geometry.xml b/tests/test_score_scatter_n/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_scatter_n/geometry.xml +++ b/tests/test_score_scatter_n/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_scatter_pn/geometry.xml b/tests/test_score_scatter_pn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_scatter_pn/geometry.xml +++ b/tests/test_score_scatter_pn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_scatter_yn/geometry.xml b/tests/test_score_scatter_yn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_scatter_yn/geometry.xml +++ b/tests/test_score_scatter_yn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_total/geometry.xml b/tests/test_score_total/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_total/geometry.xml +++ b/tests/test_score_total/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_total_yn/geometry.xml b/tests/test_score_total_yn/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_score_total_yn/geometry.xml +++ b/tests/test_score_total_yn/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_seed/geometry.xml b/tests/test_seed/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_seed/geometry.xml +++ b/tests/test_seed/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_angle_mono/geometry.xml b/tests/test_source_angle_mono/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_source_angle_mono/geometry.xml +++ b/tests/test_source_angle_mono/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_energy_maxwell/geometry.xml b/tests/test_source_energy_maxwell/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_source_energy_maxwell/geometry.xml +++ b/tests/test_source_energy_maxwell/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_energy_mono/geometry.xml b/tests/test_source_energy_mono/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_source_energy_mono/geometry.xml +++ b/tests/test_source_energy_mono/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_file/geometry.xml b/tests/test_source_file/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_source_file/geometry.xml +++ b/tests/test_source_file/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_point/geometry.xml b/tests/test_source_point/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_source_point/geometry.xml +++ b/tests/test_source_point/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_batch/geometry.xml b/tests/test_sourcepoint_batch/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_sourcepoint_batch/geometry.xml +++ b/tests/test_sourcepoint_batch/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_interval/geometry.xml b/tests/test_sourcepoint_interval/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_sourcepoint_interval/geometry.xml +++ b/tests/test_sourcepoint_interval/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_latest/geometry.xml b/tests/test_sourcepoint_latest/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_sourcepoint_latest/geometry.xml +++ b/tests/test_sourcepoint_latest/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_restart/geometry.xml b/tests/test_sourcepoint_restart/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_sourcepoint_restart/geometry.xml +++ b/tests/test_sourcepoint_restart/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_batch/geometry.xml b/tests/test_statepoint_batch/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_statepoint_batch/geometry.xml +++ b/tests/test_statepoint_batch/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_interval/geometry.xml b/tests/test_statepoint_interval/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_statepoint_interval/geometry.xml +++ b/tests/test_statepoint_interval/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_restart/geometry.xml b/tests/test_statepoint_restart/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_statepoint_restart/geometry.xml +++ b/tests/test_statepoint_restart/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_sourcesep/geometry.xml b/tests/test_statepoint_sourcesep/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_statepoint_sourcesep/geometry.xml +++ b/tests/test_statepoint_sourcesep/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_survival_biasing/geometry.xml b/tests/test_survival_biasing/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_survival_biasing/geometry.xml +++ b/tests/test_survival_biasing/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_tally_assumesep/geometry.xml b/tests/test_tally_assumesep/geometry.xml index b85dd04df9..f6f067aadd 100644 --- a/tests/test_tally_assumesep/geometry.xml +++ b/tests/test_tally_assumesep/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_tally_nuclides/geometry.xml b/tests/test_tally_nuclides/geometry.xml index 65954a7853..7c3aefe888 100644 --- a/tests/test_tally_nuclides/geometry.xml +++ b/tests/test_tally_nuclides/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trace/geometry.xml b/tests/test_trace/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_trace/geometry.xml +++ b/tests/test_trace/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_track_output/geometry.xml b/tests/test_track_output/geometry.xml index 3b5a493115..5b16fe26cd 100644 --- a/tests/test_track_output/geometry.xml +++ b/tests/test_track_output/geometry.xml @@ -15,22 +15,22 @@ - - + + - - - + + + - - + + - + @@ -56,7 +56,7 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - + @@ -80,10 +80,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -107,10 +107,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -136,7 +136,7 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - + @@ -160,10 +160,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -187,10 +187,10 @@ 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 - - - - + + + + @@ -214,10 +214,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -242,10 +242,10 @@ 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 - - - - + + + + @@ -269,10 +269,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -299,7 +299,7 @@ - - + + diff --git a/tests/test_translation/geometry.xml b/tests/test_translation/geometry.xml index 1390691dcf..e2cdf23916 100644 --- a/tests/test_translation/geometry.xml +++ b/tests/test_translation/geometry.xml @@ -5,7 +5,7 @@ - - + + diff --git a/tests/test_trigger_batch_interval/geometry.xml b/tests/test_trigger_batch_interval/geometry.xml index 65954a7853..7c3aefe888 100644 --- a/tests/test_trigger_batch_interval/geometry.xml +++ b/tests/test_trigger_batch_interval/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_no_batch_interval/geometry.xml b/tests/test_trigger_no_batch_interval/geometry.xml index 65954a7853..7c3aefe888 100644 --- a/tests/test_trigger_no_batch_interval/geometry.xml +++ b/tests/test_trigger_no_batch_interval/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_no_status/geometry.xml b/tests/test_trigger_no_status/geometry.xml index 65954a7853..7c3aefe888 100644 --- a/tests/test_trigger_no_status/geometry.xml +++ b/tests/test_trigger_no_status/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_tallies/geometry.xml b/tests/test_trigger_tallies/geometry.xml index 65954a7853..7c3aefe888 100644 --- a/tests/test_trigger_tallies/geometry.xml +++ b/tests/test_trigger_tallies/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_uniform_fs/geometry.xml b/tests/test_uniform_fs/geometry.xml index b9b880d08a..90cf354614 100644 --- a/tests/test_uniform_fs/geometry.xml +++ b/tests/test_uniform_fs/geometry.xml @@ -8,6 +8,6 @@ - + diff --git a/tests/test_union_energy_grids/geometry.xml b/tests/test_union_energy_grids/geometry.xml index 612e46132e..bc56030e18 100644 --- a/tests/test_union_energy_grids/geometry.xml +++ b/tests/test_union_energy_grids/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_universe/geometry.xml b/tests/test_universe/geometry.xml index a0b8b2f4fc..03f507bec0 100644 --- a/tests/test_universe/geometry.xml +++ b/tests/test_universe/geometry.xml @@ -5,7 +5,7 @@ - - + + diff --git a/tests/test_void/geometry.xml b/tests/test_void/geometry.xml index 99b78586a5..48a72c7c31 100644 --- a/tests/test_void/geometry.xml +++ b/tests/test_void/geometry.xml @@ -21,20 +21,20 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + From 463991ce86760b479c6a6443f4ebed21d67d3683 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 17:01:33 +0700 Subject: [PATCH 209/519] Update Jupyter notebooks in documentation --- .../pythonapi/examples/pandas-dataframes.ipynb | 18 ++++++++---------- .../pythonapi/examples/post-processing.ipynb | 18 ++++++++---------- .../pythonapi/examples/tally-arithmetic.ipynb | 18 ++++++++---------- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index cb63e2ac39..357f10620f 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -26,6 +26,7 @@ "import openmc\n", "from openmc.statepoint import StatePoint\n", "from openmc.summary import Summary\n", + "from openmc.region import Intersection\n", "\n", "%matplotlib inline" ] @@ -172,20 +173,20 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = fuel_outer_radius.negative\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = Intersection(fuel_outer_radius.positive,\n", + " clad_outer_radius.negative)\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator_cell.region = clad_outer_radius.positive\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -232,12 +233,9 @@ "root_cell.fill = assembly\n", "\n", "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "root_cell.add_surface(min_z, halfspace=+1)\n", - "root_cell.add_surface(max_z, halfspace=-1)\n", + "root_cell.region = Intersection(min_x.positive, max_x.negative,\n", + " min_y.positive, max_y.negative,\n", + " min_z.positive, max_z.negative)\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 1bd7ee49a6..e83c5bb8a1 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -21,6 +21,7 @@ "\n", "import openmc\n", "from openmc.statepoint import StatePoint\n", + "from openmc.region import Intersection\n", "\n", "%matplotlib inline" ] @@ -167,20 +168,20 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = fuel_outer_radius.negative\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = Intersection(fuel_outer_radius.positive,\n", + " clad_outer_radius.negative)\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator.region = clad_outer_radius.positive\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -204,12 +205,9 @@ "root_cell.fill = pin_cell_universe\n", "\n", "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "root_cell.add_surface(min_z, halfspace=+1)\n", - "root_cell.add_surface(max_z, halfspace=-1)\n", + "root_cell.region = Intersection(min_x.positive, max_x.negative,\n", + " min_y.positive, max_y.negative,\n", + " min_z.positive, max_z.negative)\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 2f32f3d9a7..b5ba328a05 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -36,6 +36,7 @@ "import openmc\n", "from openmc.statepoint import StatePoint\n", "from openmc.summary import Summary\n", + "from openmc.region import Intersection\n", "\n", "%matplotlib inline" ] @@ -182,20 +183,20 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = fuel_outer_radius.negative\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = Intersection(fuel_outer_radius.positive,\n", + " clad_outer_radius.negative)\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator_cell.region = clad_outer_radius.positive\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -219,12 +220,9 @@ "root_cell.fill = pin_cell_universe\n", "\n", "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "root_cell.add_surface(min_z, halfspace=+1)\n", - "root_cell.add_surface(max_z, halfspace=-1)\n", + "root_cell.region = Intersection(min_x.positive, max_x.negative,\n", + " min_y.positive, max_y.negative,\n", + " min_z.positive, max_z.negative)\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", From 6c6676cc14861abb84b732ac607d59df9c60b80e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 19:01:10 +0700 Subject: [PATCH 210/519] Have openmc-update-inputs change 'surfaces' to 'region' --- examples/xml/basic/geometry.xml | 4 ++-- examples/xml/reflective/geometry.xml | 8 ++++---- scripts/openmc-update-inputs | 27 ++++++++++++++++++--------- tests/test_cmfd_feed/geometry.xml | 4 ++-- tests/test_cmfd_nofeed/geometry.xml | 4 ++-- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/examples/xml/basic/geometry.xml b/examples/xml/basic/geometry.xml index b7de2c1346..b30884f8ca 100644 --- a/examples/xml/basic/geometry.xml +++ b/examples/xml/basic/geometry.xml @@ -5,11 +5,11 @@ - + - + diff --git a/examples/xml/reflective/geometry.xml b/examples/xml/reflective/geometry.xml index 664ef0705f..51cdf1ecb0 100644 --- a/examples/xml/reflective/geometry.xml +++ b/examples/xml/reflective/geometry.xml @@ -5,15 +5,15 @@ 0 1 - 1 -2 3 -4 5 -6 + 1 -2 3 -4 5 -6 - + - + - + diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index f2e5308d02..1ff70d0505 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -1,14 +1,15 @@ #!/usr/bin/env python """Update OpenMC's input XML files to the latest format. -Usage information can be obtained by running 'update_inputs.py --help': +Usage information can be obtained by running 'openmc-update-inputs --help': -usage: update_lattices.py [-h] IN [IN ...] +usage: openmc-update-inputs [-h] IN [IN ...] -Update lattices in geometry.xml files to the latest format. This will remove -'outside' attributes/elements and replace them with 'outer' attributes. Note -that this script will not delete the given files; it will append '.original' -to the given files and write new ones. +Update geometry.xml files to the latest format. This will remove 'outside' +attributes/elements from lattices and replace them with 'outer' attributes. For +'cell' elements, any 'surfaces' attributes/elements will be renamed +'region'. Note that this script will not delete the given files; it will append +'.original' to the given files and write new ones. positional arguments: IN Input geometry.xml file(s). @@ -173,9 +174,6 @@ def update_geometry(geometry_root): root = geometry_root was_updated = False - # Ignore files that do not contain lattices. - if all([child.tag != 'lattice' for child in root]): return False - # Get a set of already-used universe and cell ids. uids = get_universe_ids(root) cids = get_cell_ids(root) @@ -233,6 +231,17 @@ def update_geometry(geometry_root): del lat.attrib['width'] was_updated = True + # Change 'surfaces' to 'region' in cell definitions + for cell in root.iter('cell'): + elem = cell.find('surfaces') + if elem is not None: + elem.tag = 'region' + was_updated = True + if 'surfaces' in cell.attrib: + cell.attrib['region'] = cell.attrib['surfaces'] + del cell.attrib['surfaces'] + was_updated = True + return was_updated diff --git a/tests/test_cmfd_feed/geometry.xml b/tests/test_cmfd_feed/geometry.xml index 57c4aa2285..73ea679c4c 100644 --- a/tests/test_cmfd_feed/geometry.xml +++ b/tests/test_cmfd_feed/geometry.xml @@ -4,7 +4,7 @@ 0 - -1 2 -3 4 -5 6 + -1 2 -3 4 -5 6 1 @@ -39,5 +39,5 @@ -1 reflective - + diff --git a/tests/test_cmfd_nofeed/geometry.xml b/tests/test_cmfd_nofeed/geometry.xml index 57c4aa2285..73ea679c4c 100644 --- a/tests/test_cmfd_nofeed/geometry.xml +++ b/tests/test_cmfd_nofeed/geometry.xml @@ -4,7 +4,7 @@ 0 - -1 2 -3 4 -5 6 + -1 2 -3 4 -5 6 1 @@ -39,5 +39,5 @@ -1 reflective - + From 25e67baa3222222693e11283838b2d01ebbbc733 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 28 Sep 2015 15:26:01 -0400 Subject: [PATCH 211/519] Made Python API MultiGroupXS object xs_type attribute by_nuclide; nuclides paramter can now be all, sum or a list of nuclides --- openmc/mgxs/mgxs.py | 500 +++++++++++++++++++++++++++----------------- 1 file changed, 309 insertions(+), 191 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 4f0de50494..7123223e09 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -44,6 +44,8 @@ class MultiGroupXS(object): The domain type for spatial homogenization energy_groups : EnergyGroups The energy group structure for energy condensation + by_nuclide : bool + If true, computes multi-group cross sections for each nuclide in domain name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC tallies.xml file. @@ -54,6 +56,8 @@ class MultiGroupXS(object): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes multi-group cross sections for each nuclide in domain domain : Material or Cell or Universe Domain for spatial homogenization domain_type : {'material', 'cell', 'distribcell', 'universe'} @@ -74,11 +78,11 @@ class MultiGroupXS(object): __metaclass__ = abc.ABCMeta def __init__(self, domain=None, domain_type=None, - energy_groups=None, xs_type='macro', name=''): + energy_groups=None, by_nuclide=False, name=''): self._name = '' self._rxn_type = None - self._xs_type = None + self._by_nuclide = None self._domain = None self._domain_type = None self._energy_groups = None @@ -87,7 +91,7 @@ class MultiGroupXS(object): self._xs_tally = None self.name = name - self.xs_type = xs_type + self.by_nuclide = by_nuclide if domain_type is not None: self.domain_type = domain_type if domain is not None: @@ -103,7 +107,7 @@ class MultiGroupXS(object): clone = type(self).__new__(type(self)) clone._name = self.name clone._rxn_type = self.rxn_type - clone._xs_type = self.xs_type + clone._by_nuclide = self.by_nuclide clone._domain = self.domain clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) @@ -131,8 +135,8 @@ class MultiGroupXS(object): return self._rxn_type @property - def xs_type(self): - return self._xs_type + def by_nuclide(self): + return self._by_nuclide @property def domain(self): @@ -169,10 +173,10 @@ class MultiGroupXS(object): cv.check_type('name', name, basestring) self._name = name - @xs_type.setter - def xs_type(self, xs_type): - cv.check_value('xs_type', xs_type, ('macro', 'micro')) - self._xs_type = xs_type + @by_nuclide.setter + def by_nuclide(self, by_nuclide): + cv.check_type('by_nuclide', by_nuclide, bool) + self._by_nuclide = by_nuclide @domain.setter def domain(self, domain): @@ -213,16 +217,18 @@ class MultiGroupXS(object): return nuclides.keys() def get_nuclide_density(self, nuclide): - """Get the atomic number density for a nuclide in the cross section's - spatial domain. + """Get the atomic number density in units of atoms/b-cm for a nuclide + in the cross section's spatial domain. + Paramters + --------- nuclide : str A nuclide name string (e.g., 'U-235') Returns ------- density : Real - The atomic number density for the nuclide of interest + The atomic number density (atom/b-cm) for the nuclide of interest Raises ------ @@ -246,17 +252,22 @@ class MultiGroupXS(object): return density def get_nuclide_densities(self, nuclides='all'): - """Get all atomic number densities in the cross section's spatial domain. + """Get an array of atomic number densities in units of atom/b-cm for all + nuclides in the cross section's spatial domain. - nuclides : Iterable of str or 'all' - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is 'all') + Paramters + --------- + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' will return the atom densities for all nuclides + in the spatial domain. The special string 'sum' will return the atom + density summed across all nuclides in the spatial domain. Returns ------- densities : ndarray of float - The atomic number densities corresponding to each of the nuclides - in the problem domain + An array of the atomic number densities (atom/b-cm) for each of the + nuclides in the problem domain Raises ------ @@ -268,15 +279,21 @@ class MultiGroupXS(object): if self.domain is None: raise ValueError('Unable to get nuclide densities without a domain') - # If the user requested the densities for all nuclides, get a list of - # all of the nuclide name strings if nuclides == 'all': - nuclides =self.domain.get_all_nuclides() + nuclides = self.domain.get_all_nuclides() - # Loop over each nuclide and find and store its atomic number density - densities = np.zeros(len(nuclides), dtype=np.float) - for i, nuclide in enumerate(nuclides): - densities[i] = self.get_nuclide_density(nuclide) + # Sum the atomic number densities for all nuclides + elif nuclides == 'sum': + nuclides = self.get_all_nuclides() + densities = np.zeros(1, dtype=np.float) + for i, nuclide in enumerate(nuclides): + densities[0] += self.get_nuclide_density(nuclide) + + # Store each nuclide's atomic number density in an array + else: + densities = np.zeros(len(nuclides), dtype=np.float) + for i, nuclide in enumerate(nuclides): + densities[i] = self.get_nuclide_density(nuclide) return densities @@ -323,23 +340,25 @@ class MultiGroupXS(object): for filter in filters: self.tallies[key].add_filter(filter) - # If this is a microscopic cross-section, add all nuclides to tally - if self.xs_type == 'micro' and score != 'flux': + # If this is a by nuclide cross-section, add all nuclides to Tally + if self.by_nuclide and score != 'flux': all_nuclides = self.domain.get_all_nuclides() for nuclide in all_nuclides: self.tallies[key].add_nuclide(nuclide) @abc.abstractmethod def compute_xs(self): - """Computes multi-group cross sections using OpenMC tally arithmetic.""" + """Performs generic cleanup after a subclass' uses tally arithmetic to + compute a multi-group cross section as a derived tally.""" - # If a microscopic cross-section, replace CrossNuclides with originals - if self.xs_type == 'micro': + # If computing xs for each nuclide, replace CrossNuclides with originals + if self.by_nuclide: self.xs_tally._nuclides = [] nuclides = self.domain.get_all_nuclides() for nuclide in nuclides: - self.xs_tally.add_nuclide(nuclide) + self.xs_tally.add_nuclide(openmc.Nuclide(nuclide)) + # Remove NaNs which may have resulted from divide-by-zero operations self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean) self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev) @@ -350,6 +369,8 @@ class MultiGroupXS(object): This method is needed to compute cross section data from tallies in an OpenMC StatePoint object. + NOTE: The statepoint must first be linked with an OpenMC Summary object. + Parameters ---------- statepoint : openmc.StatePoint @@ -413,9 +434,11 @@ class MultiGroupXS(object): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest - nuclides : Iterable of str or 'all' - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is 'all') + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' (default) will return the cross sections for + all nuclides in the spatial domain. The special string 'sum' will + return the cross section summed over all nuclides. xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns @@ -462,20 +485,32 @@ class MultiGroupXS(object): filters.append('energy') filter_bins.append((self.energy_groups.get_group_bounds(group),)) - # Construct list of nuclides for all requested nuclides - if nuclides != 'all' and nuclides != ['total']: - cv.check_iterable_type('nuclides', nuclides, basestring) + # Construct a collection of the nuclides to retrieve from the xs tally + # NOTE: We must not override the "nuclides" parameter since it is used + # to retrieve atomic number densities for micro xs + if self.by_nuclide: + if nuclides == 'all' or nuclides == 'sum': + query_nuclides = self.get_all_nuclides() + else: + query_nuclides = nuclides else: - nuclides = [] + query_nuclides = ['total'] - # Query the multi-group cross section tally for the data - xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, - nuclides=nuclides, value=value) + # Use tally summation if user requested the sum for all nuclides + if nuclides == 'sum' or nuclides == ['sum']: + xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + else: + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=query_nuclides, value=value) - # If user requested microscopic cross sections from an object with - # microscopic cross sections, divide by atom number densities - if self.xs_type == 'micro' and xs_type == 'micro': - densities = self.get_nuclide_densities(nuclides) + # Divide by atom number densities for microscopic cross sections + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] @@ -559,8 +594,8 @@ class MultiGroupXS(object): """Construct a subdomain-averaged version of this cross section. This is primarily useful for averaging across distribcell instances. - This routine performs spatial homogenization to compute the - scalar flux-weighted average cross section across the subdomains. + This routine performs spatial homogenization to compute the scalar + flux-weighted average cross section across the subdomains. Parameters ---------- @@ -586,13 +621,12 @@ class MultiGroupXS(object): raise ValueError(msg) # Construct a collection of the subdomain filter bins to average across - if subdomains == 'all': - if self.domain_type == 'distribcell': - subdomains = np.arange(self.num_subdomains) - else: - subdomains = [self.domain.id] - else: + if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains) + else: + subdomains = [self.domain.id] # Clone this MultiGroupXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) @@ -644,25 +678,38 @@ class MultiGroupXS(object): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report - nuclides : Iterable of str or 'all' - The nuclides of the cross-sections to include in the report + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' (default) will report the cross sections + for all nuclides in the spatial domain. The special string 'sum' + will report the cross sections summed over all nuclides. xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns """ - cv.check_value('xs_type', xs_type, ['macro', 'micro']) - + # Construct a collection of the subdomains to report if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) - if nuclides != 'all': - cv.check_iterable_type('nuclides', nuclides, basestring) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) else: - if self.xs_type == 'micro': - nuclides = self.domain.get_all_nuclides() + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_all_nuclides() + if nuclides == 'sum': + nuclides = ['sum'] else: - nuclides = ['total'] + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = ['sum'] + + cv.check_value('xs_type', xs_type, ['macro', 'micro']) # Build header for string with type and domain info string = 'Multi-Group XS\n' @@ -675,12 +722,6 @@ class MultiGroupXS(object): print(string) return - if subdomains == 'all': - if self.domain_type == 'distribcell': - subdomains = np.arange(self.num_subdomains, dtype=np.int) - else: - subdomains = [self.domain.id] - # Loop over all subdomains for subdomain in subdomains: @@ -691,7 +732,7 @@ class MultiGroupXS(object): for nuclide in nuclides: # Build header for nuclide type - if xs_type != 'total': + if nuclide != 'sum': string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) # Build header for cross section type @@ -719,7 +760,8 @@ class MultiGroupXS(object): print(string) - def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True): + def build_hdf5_store(self, filename='mgxs', directory='mgxs', + xs_type='macro', append=True): """Export the multi-group cross section data into an HDF5 binary file. This routine constructs an HDF5 file which stores the multi-group @@ -738,6 +780,9 @@ class MultiGroupXS(object): directory : str Directory for the HDF5 file (default is 'mgxs') + xs_type: {'macro' or 'micro'} + Store the macro or micro cross section in units of cm^-1 or barns + append : boolean If true, appends to an existing HDF5 file with the same filename directory (if one exists) @@ -776,13 +821,15 @@ class MultiGroupXS(object): else: xs_results = h5py.File(filename, 'w') - if self.xs_type == 'micro': + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + if self.by_nuclide: nuclides = self.domain.get_all_nuclides() densities = np.zeros(len(nuclides), dtype=np.float) for i, nuclide in enumerate(nuclides): densities[i] = nuclides[nuclide][1] else: - nuclides = ['total'] + nuclides = ['sum'] # Create an HDF5 group within the file for the domain domain_type_group = xs_results.require_group(self.domain_type) @@ -813,7 +860,7 @@ class MultiGroupXS(object): # Create a separate HDF5 group for each nuclide for j, nuclide in enumerate(nuclides): - if nuclide != 'total': + if nuclide != 'sum': nuclide_group = rxn_group.require_group(nuclide) nuclide_group.require_dataset('density', dtype=np.float64, data=[densities[j]], shape=(1,)) @@ -822,9 +869,9 @@ class MultiGroupXS(object): # Extract the cross section for this subdomain and nuclide average = self.get_xs(subdomains=[subdomain], nuclides=[nuclide], - xs_type=self.xs_type, value='mean') + xs_type=xs_type, value='mean') std_dev = self.get_xs(subdomains=[subdomain], nuclides=[nuclide], - xs_type=self.xs_type, value='std_dev') + xs_type=xs_type, value='std_dev') average = average.squeeze() std_dev = std_dev.squeeze() @@ -837,7 +884,8 @@ class MultiGroupXS(object): # Close the MultiGroup results HDF5 file xs_results.close() - def export_xs_data(self, filename='mgxs', directory='mgxs', format='csv'): + def export_xs_data(self, filename='mgxs', directory='mgxs', + format='csv', groups='all', xs_type='macro'): """Export the multi-group cross section data to a file. This routine leverages the functionality in the Pandas library to @@ -855,23 +903,18 @@ class MultiGroupXS(object): format : {'csv', 'excel', 'pickle', 'latex'} The format for the exported data file - groups : {'indices' or 'bounds'} - When set to 'indices' (default), integer group indices are inserted - in the energy in/out column(s) of the DataFrame. When it is 'bounds' - the lower and upper energy bounds are used. + groups : Iterable of Integral or 'all' + Energy groups of interest - summary : None or Summary - An optional Summary object to be used to construct columns for - distribcell tally filters (default is None). The geometric - information in the Summary object is embedded into a Multi-index - column with a geometric "path" to each distribcell intance. - NOTE: This option requires the OpenCG Python package. + xs_type: {'macro' or 'micro'} + Store the macro or micro cross section in units of cm^-1 or barns """ cv.check_type('filename', filename, basestring) cv.check_type('directory', directory, basestring) cv.check_value('format', format, ['csv', 'excel', 'pickle', 'latex']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) # Make directory if it does not exist if not os.path.exists(directory): @@ -881,7 +924,7 @@ class MultiGroupXS(object): filename = filename.replace(' ', '-') # Get a Pandas DataFrame for the data - df = self.get_pandas_dataframe() + df = self.get_pandas_dataframe(groups=groups, xs_type=xs_type) # Capitalize column label strings df.columns = df.columns.astype(str) @@ -916,7 +959,8 @@ class MultiGroupXS(object): modified.write(data) modified.write('\n\\end{document}') - def get_pandas_dataframe(self, groups='indices', summary=None): + def get_pandas_dataframe(self, groups='all', nuclides='all', + xs_type='macro', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. This routine leverages the Tally.get_pandas_dataframe(...) routine, but @@ -924,15 +968,23 @@ class MultiGroupXS(object): Parameters ---------- - groups : {'indices' or 'bounds'} - When set to 'indices' (default), integer group indices are inserted - in the energy in/out column(s) of the DataFrame. When it is 'bounds' - the lower and upper energy bounds are used. + groups : Iterable of Integral or 'all' + Energy groups of interest + + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the dataframe. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' (default) will include the cross sections + for all nuclides in the spatial domain. The special string 'sum' + will include the cross sections summed over all nuclides. + + xs_type: {'macro' or 'micro'} + Return macro or micro cross section in units of cm^-1 or barns summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric - information in the Summary object is embedded into a Multi-index + information in the Summary object is embedded into a multi-index column with a geometric "path" to each distribcell intance. NOTE: This option requires the OpenCG Python package. @@ -954,6 +1006,12 @@ class MultiGroupXS(object): 'cross section has not been computed' raise ValueError(msg) + if groups != 'all': + cv.check_iterable_type('groups', groups, Integral) + if nuclides != 'all' and nuclides != 'sum': + cv.check_iterable_type('nuclides', nuclides, basestring) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + # Get a Pandas DataFrame from the derived xs tally df = self.xs_tally.get_pandas_dataframe(summary=summary) @@ -963,30 +1021,51 @@ class MultiGroupXS(object): else: df = df.drop('score', axis=1) - # Use group indices in place of energy bounds ("1" for fastest group) - if groups == 'indices': + # Rename energy(out) columns + columns = [] + if 'energy [MeV]' in df: + df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) + columns.append('group in') + if 'energyout [MeV]' in df: + df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) + columns.append('group out') - # Rename the column label for energy in the dataframe - columns = [] - if 'energy [MeV]' in df: - df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) - columns.append('group in') - if 'energyout [MeV]' in df: - df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) - columns.append('group out') + # Loop over all energy groups and override the bounds with indices + template = '({0:.1e} - {1:.1e})' + bins = self.energy_groups.group_edges + for column in columns: + for i in range(self.num_groups): + group = template.format(bins[i], bins[i+1]) + row_indices = df[column] == group + df.loc[row_indices, column] = self.num_groups - i - # Loop over all energy groups and override the bounds with indices - template = '({0:.1e} - {1:.1e})' - bins = self.energy_groups.group_edges - for column in columns: - for i in range(self.num_groups): - group = template.format(bins[i], bins[i+1]) - row_indices = df[column] == group - df.loc[row_indices, column] = self.num_groups - i + # Select out those groups the user requested + if groups != 'all': + if 'group in' in df: + df = df[df['group in'].isin(groups)] + if 'group out' in df: + df = df[df['group out'].isin(groups)] - # Sort the dataframe by domain type id (e.g., distribcell id) and - # energy groups such that data is from fast to thermal - df.sort([self.domain_type] + columns, inplace=True) + # Sum up cross sections across nuclides if requested + if self.by_nuclide and nuclides == 'sum': + non_nuclide_cols = list(df.columns[df.columns != 'nuclide']) + df = df.groupby(non_nuclide_cols, as_index=False)['nuclide'].sum() + # If the user requested specific nuclides, remove others from dataframe + elif nuclides != 'all' and nuclides != 'sum': + df = df[df.nuclide.isin(nuclides)] + + # If user requested micro cross sections, divide out the atom densities + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') + df['mean'] /= densities + df['std. dev.'] /= densities + + # Sort the dataframe by domain type id (e.g., distribcell id) and + # energy groups such that data is from fast to thermal + df.sort([self.domain_type] + columns, inplace=True) return df @@ -994,8 +1073,8 @@ class MultiGroupXS(object): class TotalXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(TotalXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(TotalXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'total' def create_tallies(self): @@ -1025,8 +1104,8 @@ class TotalXS(MultiGroupXS): class TransportXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(TransportXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(TransportXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'transport' def create_tallies(self): @@ -1064,8 +1143,8 @@ class TransportXS(MultiGroupXS): class AbsorptionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(AbsorptionXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(AbsorptionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'absorption' def create_tallies(self): @@ -1095,8 +1174,8 @@ class AbsorptionXS(MultiGroupXS): class CaptureXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(CaptureXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(CaptureXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'capture' def create_tallies(self): @@ -1127,8 +1206,8 @@ class CaptureXS(MultiGroupXS): class FissionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(FissionXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(FissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'fission' def create_tallies(self): @@ -1158,8 +1237,8 @@ class FissionXS(MultiGroupXS): class NuFissionXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(NuFissionXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(NuFissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'nu-fission' def create_tallies(self): @@ -1189,8 +1268,8 @@ class NuFissionXS(MultiGroupXS): class ScatterXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(ScatterXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(ScatterXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'scatter' def create_tallies(self): @@ -1220,8 +1299,8 @@ class ScatterXS(MultiGroupXS): class NuScatterXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(NuScatterXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(NuScatterXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'nu-scatter' def create_tallies(self): @@ -1251,8 +1330,8 @@ class NuScatterXS(MultiGroupXS): class ScatterMatrixXS(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'scatter matrix' def create_tallies(self): @@ -1316,9 +1395,11 @@ class ScatterMatrixXS(MultiGroupXS): subdomains : Iterable of Integral or 'all' Subdomain IDs of interest - nuclides : Iterable of str or 'all' - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is 'all') + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' (default) will return the cross sections for + all nuclides in the spatial domain. The special string 'sum' will + return the cross section summed over all nuclides. xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns @@ -1372,21 +1453,34 @@ class ScatterMatrixXS(MultiGroupXS): filters.append('energyout') filter_bins.append((self.energy_groups.get_group_bounds(group),)) - # Construct list of nuclides for all requested nuclides - if nuclides != 'all' and nuclides != ['total']: - cv.check_iterable_type('nuclides', nuclides, basestring) + # Construct a collection of the nuclides to retrieve from the xs tally + # NOTE: We must not override the "nuclides" parameter since it is used + # to retrieve atomic number densities for micro xs + if self.by_nuclide: + if nuclides == 'all' or nuclides == 'sum': + query_nuclides = self.get_all_nuclides() + else: + query_nuclides = nuclides else: - nuclides = [] + query_nuclides = ['total'] + + # Use tally summation if user requested the sum for all nuclides + if nuclides == 'sum' or nuclides == ['sum']: + xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + else: + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=query_nuclides, value=value) - # Query the multi-group cross section tally for the data - xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, - nuclides=nuclides, value=value) xs = np.nan_to_num(xs) - # If user requested microscopic cross sections from an object with - # microscopic cross sections, divide by atom number densities - if self.xs_type == 'micro' and xs_type == 'micro': - densities = self.get_nuclide_densities(nuclides) + # Divide by atom number densities for microscopic cross sections + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] @@ -1400,25 +1494,38 @@ class ScatterMatrixXS(MultiGroupXS): subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report - nuclides : Iterable of str or 'all' - The nuclides of the cross-sections to include in the report + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' (default) will report the cross sections + for all nuclides in the spatial domain. The special string 'sum' + will report the cross sections summed over all nuclides. xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns """ - cv.check_value('xs_type', xs_type, ['macro', 'micro']) - + # Construct a collection of the subdomains to report if subdomains != 'all': cv.check_iterable_type('subdomains', subdomains, Integral) - if nuclides != 'all': - cv.check_iterable_type('nuclides', nuclides, basestring) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) else: - if self.xs_type == 'micro': - nuclides = self.domain.get_all_nuclides() + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_all_nuclides() + if nuclides == 'sum': + nuclides = ['sum'] else: - nuclides = ['total'] + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = ['sum'] + + cv.check_value('xs_type', xs_type, ['macro', 'micro']) # Build header for string with type and domain info string = 'Multi-Group XS\n' @@ -1456,7 +1563,7 @@ class ScatterMatrixXS(MultiGroupXS): for nuclide in nuclides: # Build header for nuclide type - if xs_type != 'total': + if xs_type != 'sum': string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) # Build header for cross section type @@ -1491,8 +1598,8 @@ class ScatterMatrixXS(MultiGroupXS): class NuScatterMatrixXS(ScatterMatrixXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'nu-scatter matrix' def create_tallies(self): @@ -1541,8 +1648,8 @@ class NuScatterMatrixXS(ScatterMatrixXS): class Chi(MultiGroupXS): def __init__(self, domain=None, domain_type=None, - groups=None, xs_type='macro', name=''): - super(Chi, self).__init__(domain, domain_type, groups, xs_type, name) + groups=None, by_nuclide=False, name=''): + super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'chi' def create_tallies(self): @@ -1593,9 +1700,9 @@ class Chi(MultiGroupXS): nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The - special string 'all' will return the cross-section for all nuclides - in the spatial domain. The special string 'sum' will return the sum - across all nuclides weighted by the isotope-specific fission source. + special string 'all' (default) will return the cross sections for + all nuclides in the spatial domain. The special string 'sum' will + return the cross section summed over all nuclides. xs_type: {'macro' or 'micro'} This parameter is not relevant for chi but is included here to @@ -1624,6 +1731,7 @@ class Chi(MultiGroupXS): raise ValueError(msg) cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) filters = [] filter_bins = [] @@ -1642,33 +1750,43 @@ class Chi(MultiGroupXS): filters.append('energyout') filter_bins.append((self.energy_groups.get_group_bounds(group),)) - # Construct list of nuclides for all requested nuclides - if nuclides != 'all' and nuclides != ['total']: - cv.check_iterable_type('nuclides', nuclides, basestring) + # If chi was computed for each nuclide in the domain + if self.by_nuclide: + + # Get the sum as the fission source weighted average chi for all + # nuclides in the domain + if nuclides == 'sum': + + # Retrieve the fission production tallies + nu_fission_in = self.tallies['nu-fission-in'] + nu_fission_out = self.tallies['nu-fission-out'] + + # Sum out all nuclides + nuclides = self.get_all_nuclides() + nu_fission_in = nu_fission_in.summation(nuclides=nuclides) + nu_fission_out = nu_fission_out.summation(nuclides=nuclides) + + # Compute chi and store it as the xs_tally attribute so we can use + # the generic get_xs routine + xs_tally = nu_fission_out / nu_fission_in + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Get chi for all nuclides in the domain + elif nuclides == 'all': + nuclides = self.get_all_nuclides() + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # Get chi for user-specified nuclides in the domain + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # If chi was computed as an average of nuclides in the domain else: - nuclides = [] - - # Special case for the "macroscopic-from-microscopic" chi - # This is needed since chi is fission source rather than flux-weighted - if nuclides == 'sum' and self.xs_type == 'micro': - - # Retrieve the fission production tallies - nu_fission_in = self.tallies['nu-fission-in'] - nu_fission_out = self.tallies['nu-fission-out'] - - # Sum out all nuclides - nuclides = self.get_all_nuclides() - nu_fission_in = nu_fission_in.summation(nuclides=nuclides) - nu_fission_out = nu_fission_out.summation(nuclides=nuclides) - - # Compute chi and store it as the xs_tally attribute so we can use - # the generic get_xs routine - xs_tally = nu_fission_out / nu_fission_in - xs = xs_tally.get_values(filters=filters, - filter_bins=filter_bins, value=value) - - else: - xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, - nuclides=nuclides, value=value) + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) return xs \ No newline at end of file From 9377823ddc54a1a8cfe8694623ea561631988985 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 28 Sep 2015 21:16:52 -0400 Subject: [PATCH 212/519] Added StatePoint and Summary to Python API __init__.py --- openmc/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openmc/__init__.py b/openmc/__init__.py index d966a155a4..397d9f3e27 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -12,6 +12,8 @@ from openmc.trigger import * from openmc.tallies import * from openmc.cmfd import * from openmc.executor import * +from openmc.statepoint import * +from openmc.summary import * try: from openmc.opencg_compatible import * From 4451b71f365dda82f77f598a3b263d274ab4d4b7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 28 Sep 2015 21:23:06 -0400 Subject: [PATCH 213/519] Made Python API MultiGroupXS.get_condensed_xs(...) routine permit same number of energy groups --- openmc/mgxs/mgxs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7123223e09..9b685d37c1 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -537,7 +537,8 @@ class MultiGroupXS(object): raise ValueError(msg) cv.check_type('coarse_groups', coarse_groups, EnergyGroups) - cv.check_less_than('coarse groups', coarse_groups.num_groups, self.num_groups) + cv.check_less_than('coarse groups', coarse_groups.num_groups, + self.num_groups, equality=True) cv.check_value('upper coarse energy', coarse_groups.group_edges[-1], [self.energy_groups.group_edges[-1]]) cv.check_value('lower coarse energy', coarse_groups.group_edges[0], From e37d63498676d0fc3219dbe4bd6c73573dbb256b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 29 Sep 2015 15:07:39 +0700 Subject: [PATCH 214/519] Fix OpenCG compatibility module to work with simple cells --- openmc/opencg_compatible.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 65e980c003..9439a6eaf4 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -9,6 +9,8 @@ except ImportError: raise ImportError(msg) import openmc +from openmc.region import Intersection +from openmc.surface import Halfspace # A dictionary of all OpenMC Materials created @@ -480,12 +482,24 @@ def get_opencg_cell(openmc_cell): if openmc_cell._translation is not None: opencg_cell.setTranslation(openmc_cell._translation) - surfaces = openmc_cell._surfaces - - for surface_id in surfaces: - surface = surfaces[surface_id][0] - halfspace = surfaces[surface_id][1] + # Add surfaces to OpenCG cell from OpenMC cell region. Right now this only + # works if the region is a single half-space or an intersection of + # half-spaces, i.e., no complex cells. + region = openmc_cell.region + if isinstance(region, Halfspace): + surface = region.surface + halfspace = -1 if region.side == '-' else 1 opencg_cell.addSurface(get_opencg_surface(surface), halfspace) + elif isinstance(region, Intersection): + for node in region.nodes: + if not isinstance(node, Halfspace): + raise NotImplementedError("Complex cells not yet supported " + "in OpenCG.") + surface = node.surface + halfspace = -1 if node.side == '-' else 1 + opencg_cell.addSurface(get_opencg_surface(surface), halfspace) + else: + raise NotImplementedError("Complex cells not yet supported in OpenCG.") # Add the OpenMC Cell to the global collection of all OpenMC Cells OPENMC_CELLS[cell_id] = openmc_cell From 817494798ef844f5c83cbac5b8ad85183ededad8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 29 Sep 2015 15:37:31 +0700 Subject: [PATCH 215/519] Add better description in stl_vector module --- src/stl_vector.F90 | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/stl_vector.F90 b/src/stl_vector.F90 index f5c11ff37f..8038628fb6 100644 --- a/src/stl_vector.F90 +++ b/src/stl_vector.F90 @@ -1,7 +1,39 @@ module stl_vector ! This module provides derived types that are meant to mimic the - ! std::vector type in C++ + ! std::vector type in C++. The vector type has numerous advantages over + ! simple arrays and linked lists in that storage can grow and shrink + ! dynamically, yet it is still contiguous in memory. Vectors can be filled + ! element-by-element with automatic memory allocation in amortized constant + ! time. In the implementation here, we grow the vector by a factor of 1.5 each + ! time the capacity is exceed. + ! + ! The member functions which have been implemented here are: + ! + ! capacity -- Returns the size of the storage space currently allocated for + ! the vector + ! + ! clear -- Remove all elements from the vector, leaving it with a size of + ! 0. Note that this doesn't imply that storage is deallocated. + ! + ! initialize -- Set the storage size of the vector and optionally fill it with + ! a particular value. + ! + ! pop_back -- Remove the last element of the vector, reducing the size by one. + ! + ! push_back -- Add a new element at the end of the vector. This increases the + ! size of the vector by one. Note that the underlying storage is + ! reallocated only if the size exceeds the capacity. + ! + ! reserve -- Requests that the capacity of the vector be a certain size. + ! + ! resize -- Resize the vector so it contains n elements. If n is larger than + ! the current size, an optional fill value can be used to set the + ! extra elements. + ! + ! shrink_to_fit -- Request that the capacity be reduced to fit the size. + ! + ! size -- Returns the number of elements in the vector. implicit none private @@ -195,8 +227,8 @@ contains subroutine clear_real(this) class(VectorReal), intent(inout) :: this - ! Since integer is trivially destructible, we only need to set size to zero - ! and can leave capacity as is + ! Since real is trivially destructible, we only need to set size to zero and + ! can leave capacity as is this%size_ = 0 end subroutine clear_real From e70a5af63e66eb611dad57271643b3d3c37a300e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 29 Sep 2015 15:39:54 +0700 Subject: [PATCH 216/519] Make Region.from_expression a @staticmethod rather than @classmethod --- openmc/region.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index c54d8d3abc..f1926cdc2a 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -11,8 +11,8 @@ class Region(object): def __str__(self): return '' - @classmethod - def from_expression(cls, expression, surfaces): + @staticmethod + def from_expression(expression, surfaces): """Generate a region given an infix expression. Parameters From d05b2a0f769e031a0763921073aa3a1afeda0445 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 29 Sep 2015 15:56:36 +0700 Subject: [PATCH 217/519] Make reflect() pure and add a comment describing it --- src/surface_header.F90 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 8941fed725..18ad030a2e 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -205,7 +205,14 @@ contains end if end function sense - subroutine reflect(this, xyz, uvw) +!=============================================================================== +! REFLECT determines the direction a particle will travel if it is specularly +! reflected from the surface at a given position and direction. The position is +! needed because the reflection is performed using the surface normal, which +! depends on the position for second-order surfaces. +!=============================================================================== + + pure subroutine reflect(this, xyz, uvw) class(Surface), intent(in) :: this real(8), intent(in) :: xyz(3) real(8), intent(inout) :: uvw(3) From bece870f8514f4c853e52c524a0bc2615544959e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 29 Sep 2015 17:18:12 +0700 Subject: [PATCH 218/519] Split cell_contains into simple_cell_contains and complex_cell_contains. The simple_cell_contains function is optimized to take advantage of the fact that short circuit evaluation can be used. --- src/geometry.F90 | 58 ++++++++++++++++++++++++++++++++++++++--- src/geometry_header.F90 | 1 + src/input_xml.F90 | 7 +++++ 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 2039703421..aec506df60 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -20,8 +20,14 @@ contains ! CELL_CONTAINS determines if a cell contains the particle at a given ! location. The bounds of the cell are detemined by a logical expression ! involving surface half-spaces. At initialization, the expression was converted -! to RPN notation. In cell_contains, we evaluate the RPN expression using a -! stack, similar to how a RPN calculator would work. +! to RPN notation. +! +! The function is split into two cases, one for simple cells (those involving +! only the intersection of half-spaces) and one for complex cells. Simple cells +! can be evaluated with short circuit evaluation, i.e., as soon as we know that +! one half-space is not satisfied, we can exit. This provides a performance +! benefit for the common case. In complex_cell_contains, we evaluate the RPN +! expression using a stack, similar to how a RPN calculator would work. !=============================================================================== pure function cell_contains(c, p) result(in_cell) @@ -29,6 +35,52 @@ contains type(Particle), intent(in) :: p logical :: in_cell + if (c%simple) then + in_cell = simple_cell_contains(c, p) + else + in_cell = complex_cell_contains(c, p) + end if + end function cell_contains + + pure function simple_cell_contains(c, p) result(in_cell) + type(Cell), intent(in) :: c + type(Particle), intent(in) :: p + logical :: in_cell + + integer :: i + integer :: token + logical :: actual_sense ! sense of particle wrt surface + + in_cell = .true. + do i = 1, size(c%rpn) + token = c%rpn(i) + if (token < OP_UNION) then + ! If the token is not an operator, evaluate the sense of particle with + ! respect to the surface and see if the token matches the sense. If the + ! particle's surface attribute is set and matches the token, that + ! overrides the determination based on sense(). + if (token == p%surface) then + cycle + elseif (-token == p%surface) then + in_cell = .false. + exit + else + actual_sense = surfaces(abs(token))%obj%sense(& + p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) + if (actual_sense .neqv. (token > 0)) then + in_cell = .false. + exit + end if + end if + end if + end do + end function simple_cell_contains + + pure function complex_cell_contains(c, p) result(in_cell) + type(Cell), intent(in) :: c + type(Particle), intent(in) :: p + logical :: in_cell + integer :: i integer :: token logical :: b1, b2 @@ -83,7 +135,7 @@ contains ! still be zero. in_cell = .true. end if - end function cell_contains + end function complex_cell_contains !=============================================================================== ! CHECK_CELL_OVERLAP checks for overlapping cells at the current particle's diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index c9889a5c82..20e437cac7 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -134,6 +134,7 @@ module geometry_header ! Boolean expression of half-spaces integer, allocatable :: rpn(:) ! Reverse Polish notation for region ! expression + logical :: simple ! Is the region simple (intersections only) ! Rotation matrix and translation vector real(8), allocatable :: translation(:) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 50a76afe1b..8a77eaf354 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1149,6 +1149,13 @@ contains if (.not. allocated(c%region)) allocate(c%region(0)) if (.not. allocated(c%rpn)) allocate(c%rpn(0)) + ! Check if this is a simple cell + if (any(c%rpn == OP_COMPLEMENT) .or. any(c%rpn == OP_UNION)) then + c%simple = .false. + else + c%simple = .true. + end if + ! Rotation matrix if (check_for_node(node_cell, "rotation")) then ! Rotations can only be applied to cells that are being filled with From c58c5639de0c0ec6e92ee25e1138706fd168041f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 29 Sep 2015 09:22:51 -0400 Subject: [PATCH 219/519] Python API Executor now waits until process has finished before returning from run_simulation(...) routine even if output=False --- openmc/executor.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/openmc/executor.py b/openmc/executor.py index 54c8a64c1a..58cb912465 100644 --- a/openmc/executor.py +++ b/openmc/executor.py @@ -30,14 +30,16 @@ class Executor(object): stdout=subprocess.PIPE) # Capture and re-print OpenMC output in real-time - while (True and output): - line = p.stdout.readline() - print(line, end='') - + while True: # If OpenMC is finished, break loop + line = p.stdout.readline() if not line and p.poll() != None: break + # If user requested output, print to screen + if output: + print(line, end='') + # Return the returncode (integer, zero if no problems encountered) return p.returncode From 19076823f117fe2a06065df91631880e74cec3dc Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 29 Sep 2015 14:47:55 -0400 Subject: [PATCH 220/519] fixed indentation errors in several files --- src/ace.F90 | 4 ++-- src/constants.F90 | 2 +- src/input_xml.F90 | 2 +- src/physics.F90 | 4 ++-- src/tally.F90 | 26 +++++++++++++------------- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 4db7cade97..b45c9f53e2 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -646,8 +646,8 @@ contains ! of delayed groups if (NPCR > MAX_DELAYED_GROUPS) then call fatal_error("Encountered nuclide with " // trim(to_str(NPCR)) & - &// " delayed groups while the maximum number of delayed groups" & - &// " set in constants.F90 is " // trim(to_str(MAX_DELAYED_GROUPS))) + &// " delayed groups while the maximum number of delayed groups " & + &// "set in constants.F90 is " // trim(to_str(MAX_DELAYED_GROUPS))) end if nuc % n_precursor = NPCR diff --git a/src/constants.F90 b/src/constants.F90 index d00b94b343..897576bf19 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -313,7 +313,7 @@ module constants FILTER_ENERGYOUT = 8, & FILTER_DISTRIBCELL = 9, & FILTER_DELAYGROUP = 10 - + ! Mesh types integer, parameter :: & MESH_REGULAR = 1 diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3ad934da18..fb2bde1a50 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2798,7 +2798,7 @@ contains if (t % find_filter(FILTER_DELAYGROUP) > 0) then call fatal_error("Cannot tally nu scatter with a & - &delaygroup energy filter.") + &delaygroup energy filter.") end if t % score_bins(j) = SCORE_NU_SCATTER diff --git a/src/physics.F90 b/src/physics.F90 index fbac1d4dd5..d3aae92002 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1259,8 +1259,8 @@ contains ! ==================================================================== ! PROMPT NEUTRON SAMPLED - ! set the delayed group for the particle born from fission to 0 - p % delayed_group = 0 + ! set the delayed group for the particle born from fission to 0 + p % delayed_group = 0 ! sample from prompt neutron energy distribution law = rxn % edist % law diff --git a/src/tally.F90 b/src/tally.F90 index f36c10ecd9..9b89f87243 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -393,7 +393,7 @@ contains ! to get the proper score. score = keff * p % wgt_bank end if - + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % nu_fission * atom_density * flux @@ -422,25 +422,25 @@ contains ! nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then if (t % find_filter(FILTER_DELAYGROUP) > 0) then - + !$omp critical lc = 1 do d = 1, nuclides(p % event_nuclide) % n_precursor - + ! determine number of interpolation regions and energies NR = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 1)) NE = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) - + ! determine delayed neutron precursor yield for group d yield = interpolate_tab1(nuclides(p % event_nuclide) % nu_d_precursor_data( & lc+1:lc+2+2*NR+2*NE), p % E) - + ! advance pointer lc = lc + 2 + 2*NR + 2*NE + 1 - + score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) % & delay_nu_fission / micro_xs(p % event_nuclide) % absorption - + t % results(score_index, d) % value = & t % results(score_index, d) % value + score end do @@ -448,10 +448,10 @@ contains else score = p % absorb_wgt * micro_xs(p % event_nuclide) % & delay_nu_fission / micro_xs(p % event_nuclide) % absorption - + t % results(score_index, 1) % value = & t % results(score_index, 1) % value + score - end if + end if else score = ZERO end if @@ -477,7 +477,7 @@ contains !$omp end critical cycle SCORE_LOOP end if - + else if (i_nuclide > 0) then score = micro_xs(i_nuclide) % nu_fission * atom_density * flux @@ -485,7 +485,7 @@ contains score = material_xs % nu_fission * flux end if end if - + case (SCORE_KAPPA_FISSION) if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing) then @@ -986,7 +986,7 @@ contains ! check if outgoing energy is within specified range on filter if (E_out < t % filters(i) % real_bins(1) .or. & - E_out > t % filters(i) % real_bins(n)) cycle + E_out > t % filters(i) % real_bins(n)) cycle ! change outgoing energy bin matching_bins(i) = binary_search(t % filters(i) % real_bins, n, E_out) @@ -997,7 +997,7 @@ contains ! Add score to tally !$omp atomic t % results(i_score, i_filter) % value = & - t % results(i_score, i_filter) % value + score + t % results(i_score, i_filter) % value + score end if end do From 409360dd75aa25131a87a20570ea51de6f0cd282 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 29 Sep 2015 15:04:05 -0400 Subject: [PATCH 221/519] fixed line continuation errors in tally.F90 --- src/tally.F90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 9b89f87243..b2066319b9 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -433,24 +433,24 @@ contains ! determine delayed neutron precursor yield for group d yield = interpolate_tab1(nuclides(p % event_nuclide) % nu_d_precursor_data( & - lc+1:lc+2+2*NR+2*NE), p % E) + lc+1:lc+2+2*NR+2*NE), p % E) ! advance pointer lc = lc + 2 + 2*NR + 2*NE + 1 score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) % & - delay_nu_fission / micro_xs(p % event_nuclide) % absorption + delay_nu_fission / micro_xs(p % event_nuclide) % absorption t % results(score_index, d) % value = & - t % results(score_index, d) % value + score + t % results(score_index, d) % value + score end do !$omp end critical else score = p % absorb_wgt * micro_xs(p % event_nuclide) % & - delay_nu_fission / micro_xs(p % event_nuclide) % absorption + delay_nu_fission / micro_xs(p % event_nuclide) % absorption t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score + t % results(score_index, 1) % value + score end if else score = ZERO @@ -468,10 +468,10 @@ contains if (t % find_filter(FILTER_DELAYGROUP) > 0) then t % results(score_index, d) % value = & - t % results(score_index, d) % value + score + t % results(score_index, d) % value + score else t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score + t % results(score_index, 1) % value + score end if end do !$omp end critical From 731ee261e1305966b351788c061ccca65e4ce055 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 29 Sep 2015 17:34:05 -0400 Subject: [PATCH 222/519] MultiGroupXS.get_xs(...) routine now includes an order_groups parameter with increasing/decreasing options --- openmc/mgxs/mgxs.py | 149 +++++++++++++++++++++++++++++++------------- 1 file changed, 104 insertions(+), 45 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 9b685d37c1..ea8fa2f18e 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -178,6 +178,20 @@ class MultiGroupXS(object): cv.check_type('by_nuclide', by_nuclide, bool) self._by_nuclide = by_nuclide + @property + def num_nuclides(self): + if self.by_nuclide: + return len(self.get_all_nuclides()) + else: + return 1 + + @property + def nuclides(self): + if self.by_nuclide: + return self.get_all_nuclides() + else: + return 'sum' + @domain.setter def domain(self, domain): cv.check_type('domain', domain, tuple(DOMAINS)) @@ -279,11 +293,8 @@ class MultiGroupXS(object): if self.domain is None: raise ValueError('Unable to get nuclide densities without a domain') - if nuclides == 'all': - nuclides = self.domain.get_all_nuclides() - # Sum the atomic number densities for all nuclides - elif nuclides == 'sum': + if nuclides == 'sum': nuclides = self.get_all_nuclides() densities = np.zeros(1, dtype=np.float) for i, nuclide in enumerate(nuclides): @@ -321,9 +332,9 @@ class MultiGroupXS(object): """ cv.check_iterable_type('scores', scores, basestring) + cv.check_length('scores', scores, len(keys)) cv.check_iterable_type('filters', all_filters, openmc.Filter, 1, 2) cv.check_type('keys', keys, Iterable, basestring) - cv.check_length('scores', scores, len(keys)) cv.check_value('estimator', estimator, ['analog', 'tracklength']) # Create a domain Filter object @@ -419,8 +430,8 @@ class MultiGroupXS(object): filter_bins, tally.nuclides) self.tallies[tally_type] = sp_tally - def get_xs(self, groups='all', subdomains='all', - nuclides='all', xs_type='macro', value='mean'): + def get_xs(self, groups='all', subdomains='all', nuclides='all', + xs_type='macro', order_groups='increasing', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested multi-group @@ -443,6 +454,10 @@ class MultiGroupXS(object): xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing (default) + or decreasing energy groups (decreasing or increasing energies) + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -514,6 +529,25 @@ class MultiGroupXS(object): if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + num_subdomains = xs.shape[0] / num_groups + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, :] + + # Reshape array to original axes (filters, nuclides, scores) + new_shape = (num_subdomains * num_groups,) + xs.shape[2:] + xs = np.reshape(xs, new_shape) + return xs def get_condensed_xs(self, coarse_groups): @@ -748,10 +782,10 @@ class MultiGroupXS(object): for group in range(1, self.num_groups+1): bounds = self.energy_groups.get_group_bounds(group) string += template.format('', group, bounds[0], bounds[1]) - average = self.get_xs([group], [subdomain], - [nuclide], xs_type, 'mean') - rel_err = self.get_xs([group], [subdomain], - [nuclide], xs_type, 'rel_err') * 100 + average = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='mean') + rel_err = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='rel_err')*100 average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) @@ -1138,7 +1172,7 @@ class TransportXS(MultiGroupXS): self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] self._xs_tally /= self.tallies['flux'] - super(TotalXS, self).compute_xs() + super(TransportXS, self).compute_xs() class AbsorptionXS(MultiGroupXS): @@ -1352,7 +1386,7 @@ class ScatterMatrixXS(MultiGroupXS): # Initialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correction=None): + def compute_xs(self, correction='P0'): """Computes the multi-group scattering matrix using OpenMC tally arithmetic. @@ -1379,7 +1413,8 @@ class ScatterMatrixXS(MultiGroupXS): super(ScatterMatrixXS, self).compute_xs() def get_xs(self, in_groups='all', out_groups='all', subdomains='all', - nuclides='all', xs_type='macro', value='mean'): + nuclides='all', order_groups='increasing', + xs_type='macro', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested scattering @@ -1405,6 +1440,9 @@ class ScatterMatrixXS(MultiGroupXS): xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -1485,6 +1523,31 @@ class ScatterMatrixXS(MultiGroupXS): if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + # Reshape tally data array with separate axes for domain and energy + if in_groups == 'all': + num_in_groups = self.num_groups + else: + num_in_groups = len(in_groups) + if out_groups == 'all': + num_out_groups = self.num_groups + else: + num_out_groups = len(out_groups) + num_subdomains = xs.shape[0] / (num_in_groups * num_out_groups) + new_shape = (num_subdomains, num_in_groups, num_out_groups) + new_shape += xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, ::-1, :] + + # Reshape array to original axes (filters, nuclides, scores) + new_shape = (num_subdomains * num_in_groups * num_out_groups,) + new_shape += xs.shape[3:] + xs = np.reshape(xs, new_shape) + return xs def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): @@ -1581,10 +1644,10 @@ class ScatterMatrixXS(MultiGroupXS): string += template.format('', in_group, out_group) average = \ self.get_xs([in_group], [out_group], [subdomain], - [nuclide], xs_type, 'mean') + [nuclide], xs_type=xs_type, value='mean') rel_err = \ self.get_xs([in_group], [out_group], [subdomain], - [nuclide], xs_type, 'rel_err') * 100 + [nuclide], xs_type=xs_type, value='rel_err') * 100 average = np.nan_to_num(average.flatten())[0] rel_err = np.nan_to_num(rel_err.flatten())[0] string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err) @@ -1607,7 +1670,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): """Construct the OpenMC tallies needed to compute this cross section.""" # Create a list of scores for each Tally to be created - scores = ['flux', 'nu-scatter', 'scatter-P1'] + scores = ['flux', 'scatter', 'scatter-P1'] estimator = 'analog' keys = scores @@ -1620,32 +1683,6 @@ class NuScatterMatrixXS(ScatterMatrixXS): # Intialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) - def compute_xs(self, correction=None): - """Computes the multi-group nu-scattering matrix using OpenMC - tally arithmetic. - - Parameters - ---------- - correction : {'P0' or None} - If 'P0', applies the P0 transport correction to the diagonal of the - scattering matrix - - """ - - # If using P0 correction subtract scatter-P1 from the diagonal - if correction == 'P0': - scatter_p1 = self.tallies['scatter-P1'] - scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) - energy_filter = openmc.Filter(type='energy') - energy_filter.bins = self.energy_groups.group_edges - scatter_p1 = scatter_p1.diagonalize_filter(energy_filter) - rxn_tally = self.tallies['nu-scatter'] - scatter_p1 - else: - rxn_tally = self.tallies['nu-scatter'] - - self._xs_tally = rxn_tally / self.tallies['flux'] - super(ScatterMatrixXS, self).compute_xs() - class Chi(MultiGroupXS): def __init__(self, domain=None, domain_type=None, @@ -1684,8 +1721,8 @@ class Chi(MultiGroupXS): self._xs_tally = nu_fission_out / nu_fission_in super(Chi, self).compute_xs() - def get_xs(self, groups='all', subdomains='all', - nuclides='all', xs_type='macro', value='mean'): + def get_xs(self, groups='all', subdomains='all', nuclides='all', + order_groups='increasing', xs_type='macro', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested multi-group @@ -1705,6 +1742,9 @@ class Chi(MultiGroupXS): all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. + xs_type: {'macro' or 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns + xs_type: {'macro' or 'micro'} This parameter is not relevant for chi but is included here to mirror the parent MultiGroupXS.get_xs(...) class method @@ -1790,4 +1830,23 @@ class Chi(MultiGroupXS): xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + num_subdomains = xs.shape[0] / num_groups + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, :] + + # Reshape array to original axes (filters, nuclides, scores) + new_shape = (num_subdomains * num_groups,) + new_shape[2:] + xs = np.reshape(xs, new_shape) + return xs \ No newline at end of file From d075e10fbbd61ee2cd71dd51c2ed7661d14bd5ad Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 13:09:30 -0400 Subject: [PATCH 223/519] Fixed bug in Tally.diagonalize_filter(...) routine for multiple nuclides, scores --- openmc/filter.py | 4 ++-- openmc/tallies.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 2f09d93f29..5dbf83fdd5 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -55,7 +55,6 @@ class Filter(object): self._type = None self._num_bins = 0 self._bins = None - self._bins = None self._mesh = None self._offset = -1 self._stride = None @@ -314,8 +313,9 @@ class Filter(object): Returns ------- - boolean + bool Whether or not the other filter is a subset of this filter + """ if not isinstance(other, Filter): diff --git a/openmc/tallies.py b/openmc/tallies.py index b4501133aa..cc6d5fbf59 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2517,16 +2517,16 @@ class Tally(object): if self.sum is not None: new_tally._sum = np.zeros(new_shape, dtype=np.float64) - new_tally._sum[diag_indices, :, :] = self.sum + new_tally._sum[indices, :self.num_nuclides, :self.num_scores] = self.sum if self.sum_sq is not None: new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) - new_tally._sum_sq[diag_indices, :, :] = self.sum_sq + new_tally._sum_sq[indices, :self.num_nuclides, :self.num_scores] = self.sum_sq if self.mean is not None: new_tally._mean = np.zeros(new_shape, dtype=np.float64) - new_tally._mean[diag_indices, :, :] = self.mean + new_tally._mean[indices, :self.num_nuclides, :self.num_scores] = self.mean if self.std_dev is not None: new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) - new_tally._std_dev[diag_indices, :, :] = self.std_dev + new_tally._std_dev[indices, :self.num_nuclides, :self.num_scores] = self.std_dev # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins From b548e3dcc10f43f3fd7a407284d3811c8a6dced0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 14:33:17 -0400 Subject: [PATCH 224/519] Removed unnecessary code from Tally.filter_diagonalize(...) --- openmc/tallies.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index cc6d5fbf59..87af32c428 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2507,13 +2507,6 @@ class Tally(object): new_shape = (num_filter_bins, num_nuclides, num_score_bins) indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1) - diag_indices = np.zeros(self.num_bins, dtype=np.int) - diag_factor = self.num_bins / new_filter.num_bins - - for i in range(diag_factor): - start = i * new_filter.num_bins - end = (i+1) * new_filter.num_bins - diag_indices[start:end] = indices + (i * new_filter.num_bins**2) if self.sum is not None: new_tally._sum = np.zeros(new_shape, dtype=np.float64) From 006358daccbdbd9afe245d15db158e8fcd5d7a00 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 18:16:58 -0400 Subject: [PATCH 225/519] Fixed bug in nuclide number densities for micro xs Pandas DataFrames --- openmc/mgxs/mgxs.py | 102 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 89 insertions(+), 13 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index ea8fa2f18e..b39510418c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -297,9 +297,16 @@ class MultiGroupXS(object): if nuclides == 'sum': nuclides = self.get_all_nuclides() densities = np.zeros(1, dtype=np.float) - for i, nuclide in enumerate(nuclides): + for nuclide in nuclides: densities[0] += self.get_nuclide_density(nuclide) + # Sum the atomic number densities for all nuclides + elif nuclides == 'all': + nuclides = self.get_all_nuclides() + densities = np.zeros(self.num_nuclides, dtype=np.float) + for i, nuclide in enumerate(nuclides): + densities[i] += self.get_nuclide_density(nuclide) + # Store each nuclide's atomic number density in an array else: densities = np.zeros(len(nuclides), dtype=np.float) @@ -1048,7 +1055,24 @@ class MultiGroupXS(object): cv.check_value('xs_type', xs_type, ['macro', 'micro']) # Get a Pandas DataFrame from the derived xs tally - df = self.xs_tally.get_pandas_dataframe(summary=summary) + if self.by_nuclide and nuclides == 'sum': + + # Use tally summation to sum across all nuclides + query_nuclides = self.get_all_nuclides() + xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + df = xs_tally.get_pandas_dataframe(summary=summary) + + # Remove nuclide column since it is homogeneous and redundant + df.drop('nuclide', axis=1, inplace=True) + + # If the user requested a specific set of nuclides + elif self.by_nuclide and nuclides != 'all': + xs_tally = self.xs_tally.get_slice(nuclides=nuclides) + df = xs_tally.get_pandas_dataframe(summary=summary) + + # If the user requested all nuclides, keep nuclide column in dataframe + else: + df = self.xs_tally.get_pandas_dataframe(summary=summary) # Remove the score column since it is homogeneous and redundant if summary and self.domain_type == 'distribcell': @@ -1081,22 +1105,15 @@ class MultiGroupXS(object): if 'group out' in df: df = df[df['group out'].isin(groups)] - # Sum up cross sections across nuclides if requested - if self.by_nuclide and nuclides == 'sum': - non_nuclide_cols = list(df.columns[df.columns != 'nuclide']) - df = df.groupby(non_nuclide_cols, as_index=False)['nuclide'].sum() - # If the user requested specific nuclides, remove others from dataframe - elif nuclides != 'all' and nuclides != 'sum': - df = df[df.nuclide.isin(nuclides)] - # If user requested micro cross sections, divide out the atom densities if xs_type == 'micro': if self.by_nuclide: densities = self.get_nuclide_densities(nuclides) else: densities = self.get_nuclide_densities('sum') - df['mean'] /= densities - df['std. dev.'] /= densities + tile_factor = df.shape[0] / len(densities) + df['mean'] /= np.tile(densities, tile_factor) + df['std. dev.'] /= np.tile(densities, tile_factor) # Sort the dataframe by domain type id (e.g., distribcell id) and # energy groups such that data is from fast to thermal @@ -1849,4 +1866,63 @@ class Chi(MultiGroupXS): new_shape = (num_subdomains * num_groups,) + new_shape[2:] xs = np.reshape(xs, new_shape) - return xs \ No newline at end of file + return xs + + def get_pandas_dataframe(self, groups='all', nuclides='all', + xs_type='macro', summary=None): + """Build a Pandas DataFrame for the MultiGroupXS data. + + This routine leverages the Tally.get_pandas_dataframe(...) routine, but + renames the columns with terminology appropriate for cross section data. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest + + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the dataframe. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' (default) will include the cross sections + for all nuclides in the spatial domain. The special string 'sum' + will include the cross sections summed over all nuclides. + + xs_type: {'macro' or 'micro'} + Return macro or micro cross section in units of cm^-1 or barns + + summary : None or Summary + An optional Summary object to be used to construct columns for + distribcell tally filters (default is None). The geometric + information in the Summary object is embedded into a multi-index + column with a geometric "path" to each distribcell intance. + NOTE: This option requires the OpenCG Python package. + + Returns + ------- + pandas.DataFrame + A Pandas DataFrame for the cross section data. + + Raises + ------ + ValueError + When this method is called before the multi-group cross section is + computed from tally data. + + """ + + # Build the dataframe using the parent class routine + df = super(Chi, self).get_pandas_dataframe(groups, nuclides, + xs_type, summary) + + # If user requested micro cross sections, multiply by the atom + # densities to cancel out division made by the parent class routine + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') + tile_factor = df.shape[0] / len(densities) + df['mean'] *= np.tile(densities, tile_factor) + df['std. dev.'] *= np.tile(densities, tile_factor) + + return df \ No newline at end of file From b979a19f73a95cca6ad2d56356cf39b08ad69c06 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 18:19:21 -0400 Subject: [PATCH 226/519] Fixed bug in subdomain avg multi-group xs for single subdomains --- openmc/mgxs/mgxs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index b39510418c..14810fc323 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -668,7 +668,7 @@ class MultiGroupXS(object): elif self.domain_type == 'distribcell': subdomains = np.arange(self.num_subdomains) else: - subdomains = [self.domain.id] + subdomains = [0] # Clone this MultiGroupXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) From 464105a362a262f2e0c1bd9844dcdc6b6c9d1787 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 18:39:13 -0400 Subject: [PATCH 227/519] Fixed issues with MultiGroupXS extraction summed across nuclides --- openmc/mgxs/mgxs.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 14810fc323..c9847fa48f 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -511,7 +511,7 @@ class MultiGroupXS(object): # NOTE: We must not override the "nuclides" parameter since it is used # to retrieve atomic number densities for micro xs if self.by_nuclide: - if nuclides == 'all' or nuclides == 'sum': + if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: query_nuclides = self.get_all_nuclides() else: query_nuclides = nuclides @@ -1513,7 +1513,7 @@ class ScatterMatrixXS(MultiGroupXS): # NOTE: We must not override the "nuclides" parameter since it is used # to retrieve atomic number densities for micro xs if self.by_nuclide: - if nuclides == 'all' or nuclides == 'sum': + if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: query_nuclides = self.get_all_nuclides() else: query_nuclides = nuclides @@ -1813,7 +1813,7 @@ class Chi(MultiGroupXS): # Get the sum as the fission source weighted average chi for all # nuclides in the domain - if nuclides == 'sum': + if nuclides == 'sum' or nuclides == ['sum']: # Retrieve the fission production tallies nu_fission_in = self.tallies['nu-fission-in'] @@ -1850,6 +1850,7 @@ class Chi(MultiGroupXS): # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': + # Reshape tally data array with separate axes for domain and energy if groups == 'all': num_groups = self.num_groups From a342a6c20ad5d7cdc8ce037ce90cf98bacce0fd1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 23:06:36 -0400 Subject: [PATCH 228/519] Now add total nuclide to MultiGroupXS objects if by_nuclide=False --- openmc/mgxs/mgxs.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index c9847fa48f..e02a39849a 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -363,6 +363,8 @@ class MultiGroupXS(object): all_nuclides = self.domain.get_all_nuclides() for nuclide in all_nuclides: self.tallies[key].add_nuclide(nuclide) + else: + self.tallies[key].add_nuclide('total') @abc.abstractmethod def compute_xs(self): From c1802875620b21ec5c37ddf7c865e7a175481bb8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 30 Sep 2015 23:14:08 -0400 Subject: [PATCH 229/519] Fixed bug in Python API Chi.get_xs(...) when summed across nuclides --- openmc/mgxs/mgxs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e02a39849a..07e47e0cf6 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1869,6 +1869,7 @@ class Chi(MultiGroupXS): new_shape = (num_subdomains * num_groups,) + new_shape[2:] xs = np.reshape(xs, new_shape) + xs = np.nan_to_num(xs) return xs def get_pandas_dataframe(self, groups='all', nuclides='all', From 42ea3ab706b5f8a6c27ac37268d180dc7e5dc5af Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 1 Oct 2015 07:42:19 -0400 Subject: [PATCH 230/519] changed delay to delayed to be consistent in describing delayed neutrons --- src/ace.F90 | 25 ++++++------ src/ace_header.F90 | 52 ++++++++++++------------- src/constants.F90 | 62 +++++++++++++++--------------- src/cross_section.F90 | 32 ++++++++-------- src/global.F90 | 6 +-- src/initialize.F90 | 12 +++--- src/input_xml.F90 | 84 ++++++++++++++++++++--------------------- src/output.F90 | 62 +++++++++++++++--------------- src/particle_header.F90 | 6 +-- src/physics.F90 | 26 ++++++------- src/tally.F90 | 28 ++++++++------ src/tracking.F90 | 2 +- 12 files changed, 200 insertions(+), 197 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index b45c9f53e2..c5ed22665a 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -375,10 +375,7 @@ contains if (nuc % fissionable .and. .not. data_0K) then call generate_nu_fission(nuc) - end if - - if (nuc % fissionable .and. .not. data_0K) then - call generate_delay_nu_fission(nuc) + call generate_delayed_nu_fission(nuc) end if case (ACE_THERMAL) @@ -465,7 +462,7 @@ contains allocate(nuc % fission(NE)) allocate(nuc % nu_fission(NE)) allocate(nuc % absorption(NE)) - allocate(nuc % delay_nu_fission(NE)) + allocate(nuc % delayed_nu_fission(NE)) ! initialize cross sections nuc % total = ZERO @@ -473,7 +470,7 @@ contains nuc % fission = ZERO nuc % nu_fission = ZERO nuc % absorption = ZERO - nuc % delay_nu_fission = ZERO + nuc % delayed_nu_fission = ZERO ! Read data from XSS -- only the energy grid, elastic scattering and heating ! cross section values are actually read from here. The total and absorption @@ -1407,26 +1404,26 @@ contains ! function does not need to be called during cross section lookups. !=============================================================================== - subroutine generate_delay_nu_fission(nuc) + subroutine generate_delayed_nu_fission(nuc) type(Nuclide), pointer :: nuc - integer :: i ! index on nuclide energy grid - real(8) :: E ! energy - real(8) :: nu_delay ! # of neutrons per fission + integer :: i ! index on nuclide energy grid + real(8) :: E ! energy + real(8) :: nu_d ! # of neutrons per fission do i = 1, nuc % n_grid ! determine energy E = nuc % energy(i) ! determine total nu at given energy - nu_delay = nu_delayed(nuc, E) + nu_d = nu_delayed(nuc, E) - ! determine delay-nu-fission microscopic cross section - nuc % delay_nu_fission(i) = nu_delay * nuc % fission(i) + ! determine delayed-nu-fission microscopic cross section + nuc % delayed_nu_fission(i) = nu_d * nuc % fission(i) end do - end subroutine generate_delay_nu_fission + end subroutine generate_delayed_nu_fission !=============================================================================== ! READ_THERMAL_DATA reads elastic and inelastic cross sections and corresponding diff --git a/src/ace_header.F90 b/src/ace_header.F90 index cc2ee8cc33..13681985de 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -107,13 +107,13 @@ module ace_header real(8), allocatable :: energy(:) ! energy values corresponding to xs ! Microscopic cross sections - real(8), allocatable :: total(:) ! total cross section - real(8), allocatable :: elastic(:) ! elastic scattering - real(8), allocatable :: fission(:) ! fission - real(8), allocatable :: nu_fission(:) ! neutron production - real(8), allocatable :: absorption(:) ! absorption (MT > 100) - real(8), allocatable :: heating(:) ! heating - real(8), allocatable :: delay_nu_fission(:) ! delayed neutron production + real(8), allocatable :: total(:) ! total cross section + real(8), allocatable :: elastic(:) ! elastic scattering + real(8), allocatable :: fission(:) ! fission + real(8), allocatable :: nu_fission(:) ! neutron production + real(8), allocatable :: absorption(:) ! absorption (MT > 100) + real(8), allocatable :: heating(:) ! heating + real(8), allocatable :: delayed_nu_fission(:) ! delayed neutron production ! Resonance scattering info logical :: resonant = .false. ! resonant scatterer? @@ -257,17 +257,17 @@ module ace_header !=============================================================================== type NuclideMicroXS - integer :: index_grid ! index on nuclide energy grid - integer :: index_temp ! temperature index for nuclide - real(8) :: last_E = ZERO ! last evaluated energy - real(8) :: interp_factor ! interpolation factor on nuc. energy grid - real(8) :: total ! microscropic total xs - real(8) :: elastic ! microscopic elastic scattering xs - real(8) :: absorption ! microscopic absorption xs - real(8) :: fission ! microscopic fission xs - real(8) :: nu_fission ! microscopic production xs - real(8) :: kappa_fission ! microscopic energy-released from fission - real(8) :: delay_nu_fission ! microscopic delayed production xs + integer :: index_grid ! index on nuclide energy grid + integer :: index_temp ! temperature index for nuclide + real(8) :: last_E = ZERO ! last evaluated energy + real(8) :: interp_factor ! interpolation factor on nuc. energy grid + real(8) :: total ! microscropic total xs + real(8) :: elastic ! microscopic elastic scattering xs + real(8) :: absorption ! microscopic absorption xs + real(8) :: fission ! microscopic fission xs + real(8) :: nu_fission ! microscopic production xs + real(8) :: kappa_fission ! microscopic energy-released from fission + real(8) :: delayed_nu_fission ! microscopic delayed production xs ! Information for S(a,b) use integer :: index_sab ! index in sab_tables (zero means no table) @@ -285,13 +285,13 @@ module ace_header !=============================================================================== type MaterialMacroXS - real(8) :: total ! macroscopic total xs - real(8) :: elastic ! macroscopic elastic scattering xs - real(8) :: absorption ! macroscopic absorption xs - real(8) :: fission ! macroscopic fission xs - real(8) :: nu_fission ! macroscopic production xs - real(8) :: kappa_fission ! macroscopic energy-released from fission - real(8) :: delay_nu_fission ! macroscopic delayed production xs + real(8) :: total ! macroscopic total xs + real(8) :: elastic ! macroscopic elastic scattering xs + real(8) :: absorption ! macroscopic absorption xs + real(8) :: fission ! macroscopic fission xs + real(8) :: nu_fission ! macroscopic production xs + real(8) :: kappa_fission ! macroscopic energy-released from fission + real(8) :: delayed_nu_fission ! macroscopic delayed production xs end type MaterialMacroXS contains @@ -378,7 +378,7 @@ module ace_header if (allocated(this % energy)) & deallocate(this % energy, this % total, this % elastic, & & this % fission, this % nu_fission, this % absorption, & - this % delay_nu_fission) + this % delayed_nu_fission) if (allocated(this % energy_0K)) & deallocate(this % energy_0K) diff --git a/src/constants.F90 b/src/constants.F90 index 897576bf19..0f9bd691d3 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -258,27 +258,27 @@ module constants ! Tally score type integer, parameter :: N_SCORE_TYPES = 21 integer, parameter :: & - SCORE_FLUX = -1, & ! flux - SCORE_TOTAL = -2, & ! total reaction rate - SCORE_SCATTER = -3, & ! scattering rate - SCORE_NU_SCATTER = -4, & ! scattering production rate - SCORE_SCATTER_N = -5, & ! arbitrary scattering moment - SCORE_SCATTER_PN = -6, & ! system for scoring 0th through nth moment - SCORE_NU_SCATTER_N = -7, & ! arbitrary nu-scattering moment - SCORE_NU_SCATTER_PN = -8, & ! system for scoring 0th through nth nu-scatter moment - SCORE_TRANSPORT = -9, & ! transport reaction rate - SCORE_N_1N = -10, & ! (n,1n) rate - SCORE_ABSORPTION = -11, & ! absorption rate - SCORE_FISSION = -12, & ! fission rate - SCORE_NU_FISSION = -13, & ! neutron production rate - SCORE_KAPPA_FISSION = -14, & ! fission energy production rate - SCORE_CURRENT = -15, & ! partial current - SCORE_FLUX_YN = -16, & ! angular moment of flux - SCORE_TOTAL_YN = -17, & ! angular moment of total reaction rate - SCORE_SCATTER_YN = -18, & ! angular flux-weighted scattering moment (0:N) - SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N) - SCORE_EVENTS = -20, & ! number of events - SCORE_DELAY_NU_FISSION = -21 ! delayed neutron production rate + SCORE_FLUX = -1, & ! flux + SCORE_TOTAL = -2, & ! total reaction rate + SCORE_SCATTER = -3, & ! scattering rate + SCORE_NU_SCATTER = -4, & ! scattering production rate + SCORE_SCATTER_N = -5, & ! arbitrary scattering moment + SCORE_SCATTER_PN = -6, & ! system for scoring 0th through nth moment + SCORE_NU_SCATTER_N = -7, & ! arbitrary nu-scattering moment + SCORE_NU_SCATTER_PN = -8, & ! system for scoring 0th through nth nu-scatter moment + SCORE_TRANSPORT = -9, & ! transport reaction rate + SCORE_N_1N = -10, & ! (n,1n) rate + SCORE_ABSORPTION = -11, & ! absorption rate + SCORE_FISSION = -12, & ! fission rate + SCORE_NU_FISSION = -13, & ! neutron production rate + SCORE_KAPPA_FISSION = -14, & ! fission energy production rate + SCORE_CURRENT = -15, & ! partial current + SCORE_FLUX_YN = -16, & ! angular moment of flux + SCORE_TOTAL_YN = -17, & ! angular moment of total reaction rate + SCORE_SCATTER_YN = -18, & ! angular flux-weighted scattering moment (0:N) + SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N) + SCORE_EVENTS = -20, & ! number of events + SCORE_DELAYED_NU_FISSION = -21 ! delayed neutron production rate ! Maximum scattering order supported integer, parameter :: MAX_ANG_ORDER = 10 @@ -303,16 +303,16 @@ module constants ! Tally filter and map types integer, parameter :: N_FILTER_TYPES = 10 integer, parameter :: & - FILTER_UNIVERSE = 1, & - FILTER_MATERIAL = 2, & - FILTER_CELL = 3, & - FILTER_CELLBORN = 4, & - FILTER_SURFACE = 5, & - FILTER_MESH = 6, & - FILTER_ENERGYIN = 7, & - FILTER_ENERGYOUT = 8, & - FILTER_DISTRIBCELL = 9, & - FILTER_DELAYGROUP = 10 + FILTER_UNIVERSE = 1, & + FILTER_MATERIAL = 2, & + FILTER_CELL = 3, & + FILTER_CELLBORN = 4, & + FILTER_SURFACE = 5, & + FILTER_MESH = 6, & + FILTER_ENERGYIN = 7, & + FILTER_ENERGYOUT = 8, & + FILTER_DISTRIBCELL = 9, & + FILTER_DELAYEDGROUP = 10 ! Mesh types integer, parameter :: & diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 67b3dfada8..e64362f03d 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -38,13 +38,13 @@ contains type(Material), pointer :: mat ! current material ! Set all material macroscopic cross sections to zero - material_xs % total = ZERO - material_xs % elastic = ZERO - material_xs % absorption = ZERO - material_xs % fission = ZERO - material_xs % nu_fission = ZERO - material_xs % kappa_fission = ZERO - material_xs % delay_nu_fission = ZERO + material_xs % total = ZERO + material_xs % elastic = ZERO + material_xs % absorption = ZERO + material_xs % fission = ZERO + material_xs % nu_fission = ZERO + material_xs % kappa_fission = ZERO + material_xs % delayed_nu_fission = ZERO ! Exit subroutine if material is void if (p % material == MATERIAL_VOID) return @@ -130,9 +130,10 @@ contains material_xs % kappa_fission = material_xs % kappa_fission + & atom_density * micro_xs(i_nuclide) % kappa_fission - ! Add contributions to material macroscopic delay-nu-fission cross section - material_xs % delay_nu_fission = material_xs % delay_nu_fission + & - atom_density * micro_xs(i_nuclide) % delay_nu_fission + ! Add contributions to material macroscopic delayed-nu-fission cross + ! section + material_xs % delayed_nu_fission = material_xs % delayed_nu_fission + & + atom_density * micro_xs(i_nuclide) % delayed_nu_fission end do end subroutine calculate_xs @@ -221,7 +222,7 @@ contains micro_xs(i_nuclide) % fission = ZERO micro_xs(i_nuclide) % nu_fission = ZERO micro_xs(i_nuclide) % kappa_fission = ZERO - micro_xs(i_nuclide) % delay_nu_fission = ZERO + micro_xs(i_nuclide) % delayed_nu_fission = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * nuc % total(i_grid) & @@ -252,8 +253,9 @@ contains micro_xs(i_nuclide) % fission ! Calculate microscopic nuclide delayed nu-fission cross section - micro_xs(i_nuclide) % delay_nu_fission = (ONE - f) * nuc % delay_nu_fission( & - i_grid) + f * nuc % delay_nu_fission(i_grid+1) + micro_xs(i_nuclide) % delayed_nu_fission = (ONE - f) * & + nuc % delayed_nu_fission(i_grid) + f * & + nuc % delayed_nu_fission(i_grid+1) end if @@ -520,11 +522,11 @@ contains micro_xs(i_nuclide) % fission = fission micro_xs(i_nuclide) % total = elastic + inelastic + capture + fission - ! Determine nu-fission and delay nu-fission cross section + ! Determine nu-fission and delayed nu-fission cross section if (nuc % fissionable) then micro_xs(i_nuclide) % nu_fission = nu_total(nuc, E) * & micro_xs(i_nuclide) % fission - micro_xs(i_nuclide) % delay_nu_fission = nu_delayed(nuc, E) * & + micro_xs(i_nuclide) % delayed_nu_fission = nu_delayed(nuc, E) * & micro_xs(i_nuclide) % fission end if diff --git a/src/global.F90 b/src/global.F90 index f2da51a130..398b72e140 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -69,9 +69,9 @@ module global type(NuclideMicroXS), allocatable :: micro_xs(:) ! Cache for each nuclide type(MaterialMacroXS) :: material_xs ! Cache for current material - integer :: n_nuclides_total ! Number of nuclide cross section tables - integer :: n_sab_tables ! Number of S(a,b) thermal scattering tables - integer :: n_listings ! Number of listings in cross_sections.xml + integer :: n_nuclides_total ! Number of nuclide cross section tables + integer :: n_sab_tables ! Number of S(a,b) thermal scattering tables + integer :: n_listings ! Number of listings in cross_sections.xml ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict diff --git a/src/initialize.F90 b/src/initialize.F90 index 4d119c2df7..e0d391c0cf 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -183,22 +183,22 @@ contains subroutine initialize_mpi() - integer :: bank_blocks(5) ! Count for each datatype + integer :: bank_blocks(5) ! Count for each datatype #ifdef MPIF08 type(MPI_Datatype) :: bank_types(5) type(MPI_Datatype) :: result_types(1) type(MPI_Datatype) :: temp_type #else - integer :: bank_types(5) ! Datatypes + integer :: bank_types(5) ! Datatypes integer :: result_types(1) ! Datatypes - integer :: temp_type ! temporary derived type + integer :: temp_type ! temporary derived type #endif - integer(MPI_ADDRESS_KIND) :: bank_disp(5) ! Displacements + integer(MPI_ADDRESS_KIND) :: bank_disp(5) ! Displacements integer :: result_blocks(1) ! Count for each datatype integer(MPI_ADDRESS_KIND) :: result_disp(1) ! Displacements integer(MPI_ADDRESS_KIND) :: result_base_disp ! Base displacement - integer(MPI_ADDRESS_KIND) :: lower_bound ! Lower bound for TallyResult - integer(MPI_ADDRESS_KIND) :: extent ! Extent for TallyResult + integer(MPI_ADDRESS_KIND) :: lower_bound ! Lower bound for TallyResult + integer(MPI_ADDRESS_KIND) :: extent ! Extent for TallyResult type(Bank) :: b type(TallyResult) :: tr diff --git a/src/input_xml.F90 b/src/input_xml.F90 index fb2bde1a50..4e037ae1dc 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2490,9 +2490,9 @@ contains ! Set to analog estimator t % estimator = ESTIMATOR_ANALOG - case ('delaygroup') + case ('delayedgroup') ! Set type of filter - t % filters(j) % type = FILTER_DELAYGROUP + t % filters(j) % type = FILTER_DELAYEDGROUP ! Set number of bins t % filters(j) % n_bins = MAX_DELAYED_GROUPS @@ -2732,9 +2732,9 @@ contains &filter.") end if - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally flux with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if case ('flux-yn') @@ -2749,9 +2749,9 @@ contains &filter.") end if - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally flux with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j : j + n_bins - 1) = SCORE_FLUX_YN @@ -2765,9 +2765,9 @@ contains &outgoing energy filter.") end if - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally total reaction rate with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if case ('total-yn') @@ -2776,9 +2776,9 @@ contains &outgoing energy filter.") end if - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally total reaction rate with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j : j + n_bins - 1) = SCORE_TOTAL_YN @@ -2787,18 +2787,18 @@ contains case ('scatter') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally scatter with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_SCATTER case ('nu-scatter') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally nu scatter with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_NU_SCATTER @@ -2807,9 +2807,9 @@ contains t % estimator = ESTIMATOR_ANALOG case ('scatter-n') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally scatter n with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if if (n_order == 0) then @@ -2823,9 +2823,9 @@ contains case ('nu-scatter-n') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally nu scatter n with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if ! Set tally estimator to analog @@ -2839,9 +2839,9 @@ contains case ('scatter-pn') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally scatter pn with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % estimator = ESTIMATOR_ANALOG @@ -2852,9 +2852,9 @@ contains case ('nu-scatter-pn') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally nu scatter pn with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % estimator = ESTIMATOR_ANALOG @@ -2865,9 +2865,9 @@ contains case ('scatter-yn') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally scatter yn with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % estimator = ESTIMATOR_ANALOG @@ -2878,9 +2878,9 @@ contains case ('nu-scatter-yn') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally nu scatter yn with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % estimator = ESTIMATOR_ANALOG @@ -2891,9 +2891,9 @@ contains case('transport') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally transport reaction rate with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_TRANSPORT @@ -2905,9 +2905,9 @@ contains &please remove") case ('n1n') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally n1n with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_N_1N @@ -2925,9 +2925,9 @@ contains case ('absorption') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally absorption rate with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_ABSORPTION @@ -2937,9 +2937,9 @@ contains end if case ('fission') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally fission rate with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_FISSION @@ -2949,9 +2949,9 @@ contains end if case ('nu-fission') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally nu fission rate with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_NU_FISSION @@ -2959,26 +2959,26 @@ contains ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG end if - case ('delay-nu-fission') + case ('delayed-nu-fission') - t % score_bins(j) = SCORE_DELAY_NU_FISSION + t % score_bins(j) = SCORE_DELAYED_NU_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG end if case ('kappa-fission') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally kappa fission with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_KAPPA_FISSION case ('current') - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally current with a & - &delaygroup energy filter.") + &delayedgroup energy filter.") end if t % score_bins(j) = SCORE_CURRENT diff --git a/src/output.F90 b/src/output.F90 index e50c10dc6e..d4b546a84f 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -952,38 +952,38 @@ contains if (n_tallies == 0) return ! Initialize names for tally filter types - filter_name(FILTER_UNIVERSE) = "Universe" - filter_name(FILTER_MATERIAL) = "Material" - filter_name(FILTER_DISTRIBCELL) = "Distributed Cell" - filter_name(FILTER_CELL) = "Cell" - filter_name(FILTER_CELLBORN) = "Birth Cell" - filter_name(FILTER_SURFACE) = "Surface" - filter_name(FILTER_MESH) = "Mesh" - filter_name(FILTER_ENERGYIN) = "Incoming Energy" - filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" - filter_name(FILTER_DELAYGROUP) = "Delay Group" + filter_name(FILTER_UNIVERSE) = "Universe" + filter_name(FILTER_MATERIAL) = "Material" + filter_name(FILTER_DISTRIBCELL) = "Distributed Cell" + filter_name(FILTER_CELL) = "Cell" + filter_name(FILTER_CELLBORN) = "Birth Cell" + filter_name(FILTER_SURFACE) = "Surface" + filter_name(FILTER_MESH) = "Mesh" + filter_name(FILTER_ENERGYIN) = "Incoming Energy" + filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" + filter_name(FILTER_DELAYEDGROUP) = "Delayed Group" ! Initialize names for scores - score_names(abs(SCORE_FLUX)) = "Flux" - score_names(abs(SCORE_TOTAL)) = "Total Reaction Rate" - score_names(abs(SCORE_SCATTER)) = "Scattering Rate" - score_names(abs(SCORE_NU_SCATTER)) = "Scattering Production Rate" - score_names(abs(SCORE_TRANSPORT)) = "Transport Rate" - score_names(abs(SCORE_N_1N)) = "(n,1n) Rate" - score_names(abs(SCORE_ABSORPTION)) = "Absorption Rate" - score_names(abs(SCORE_FISSION)) = "Fission Rate" - score_names(abs(SCORE_NU_FISSION)) = "Nu-Fission Rate" - score_names(abs(SCORE_KAPPA_FISSION)) = "Kappa-Fission Rate" - score_names(abs(SCORE_EVENTS)) = "Events" - score_names(abs(SCORE_FLUX_YN)) = "Flux Moment" - score_names(abs(SCORE_TOTAL_YN)) = "Total Reaction Rate Moment" - score_names(abs(SCORE_SCATTER_N)) = "Scattering Rate Moment" - score_names(abs(SCORE_SCATTER_PN)) = "Scattering Rate Moment" - score_names(abs(SCORE_SCATTER_YN)) = "Scattering Rate Moment" - score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment" - score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment" - score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" - score_names(abs(SCORE_DELAY_NU_FISSION)) = "Delay-Nu-fission Rate" + score_names(abs(SCORE_FLUX)) = "Flux" + score_names(abs(SCORE_TOTAL)) = "Total Reaction Rate" + score_names(abs(SCORE_SCATTER)) = "Scattering Rate" + score_names(abs(SCORE_NU_SCATTER)) = "Scattering Production Rate" + score_names(abs(SCORE_TRANSPORT)) = "Transport Rate" + score_names(abs(SCORE_N_1N)) = "(n,1n) Rate" + score_names(abs(SCORE_ABSORPTION)) = "Absorption Rate" + score_names(abs(SCORE_FISSION)) = "Fission Rate" + score_names(abs(SCORE_NU_FISSION)) = "Nu-Fission Rate" + score_names(abs(SCORE_KAPPA_FISSION)) = "Kappa-Fission Rate" + score_names(abs(SCORE_EVENTS)) = "Events" + score_names(abs(SCORE_FLUX_YN)) = "Flux Moment" + score_names(abs(SCORE_TOTAL_YN)) = "Total Reaction Rate Moment" + score_names(abs(SCORE_SCATTER_N)) = "Scattering Rate Moment" + score_names(abs(SCORE_SCATTER_PN)) = "Scattering Rate Moment" + score_names(abs(SCORE_SCATTER_YN)) = "Scattering Rate Moment" + score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" + score_names(abs(SCORE_DELAYED_NU_FISSION)) = "Delayed-Nu-fission Rate" ! Create filename for tally output filename = trim(path_output) // "tallies.out" @@ -1404,7 +1404,7 @@ contains E0 = t % filters(i_filter) % real_bins(bin) E1 = t % filters(i_filter) % real_bins(bin + 1) label = "[" // trim(to_str(E0)) // ", " // trim(to_str(E1)) // ")" - case (FILTER_DELAYGROUP) + case (FILTER_DELAYEDGROUP) i = t % filters(i_filter) % int_bins(bin) label = to_str(i) end select diff --git a/src/particle_header.F90 b/src/particle_header.F90 index a729fdac1b..4770317579 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -70,8 +70,8 @@ module particle_header ! Post-collision physical data integer :: n_bank ! number of fission sites banked real(8) :: wgt_bank ! weight of fission sites banked - integer :: n_delay_bank(MAX_DELAYED_GROUPS) ! number of delayed fission - ! sites banked + integer :: n_delayed_bank(MAX_DELAYED_GROUPS) ! number of delayed fission + ! sites banked ! Indices for various arrays integer :: surface ! index for surface particle is on @@ -130,7 +130,7 @@ contains this % delayed_group = 0 do d = 1, MAX_DELAYED_GROUPS - this % n_delay_bank(d) = 0 + this % n_delayed_bank(d) = 0 end do ! Set up base level coordinates diff --git a/src/physics.F90 b/src/physics.F90 index d3aae92002..da46be8518 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1051,16 +1051,16 @@ contains integer, intent(in) :: i_nuclide integer, intent(in) :: i_reaction - integer :: d ! delayed group index - integer :: nu_delay(MAX_DELAYED_GROUPS) ! number of delayed neutrons born - integer :: i ! loop index - integer :: nu ! actual number of neutrons produced - integer :: ijk(3) ! indices in ufs mesh - real(8) :: nu_t ! total nu - real(8) :: mu ! fission neutron angular cosine - real(8) :: phi ! fission neutron azimuthal angle - real(8) :: weight ! weight adjustment for ufs method - logical :: in_mesh ! source site in ufs mesh? + integer :: d ! delayed group index + integer :: nu_delayed(MAX_DELAYED_GROUPS) ! number of delayed neutrons born + integer :: i ! loop index + integer :: nu ! actual number of neutrons produced + integer :: ijk(3) ! indices in ufs mesh + real(8) :: nu_t ! total nu + real(8) :: mu ! fission neutron angular cosine + real(8) :: phi ! fission neutron azimuthal angle + real(8) :: weight ! weight adjustment for ufs method + logical :: in_mesh ! source site in ufs mesh? type(Nuclide), pointer :: nuc type(Reaction), pointer :: rxn @@ -1114,7 +1114,7 @@ contains ! Initialize counter of delayed neutrons encountered for each delayed group ! to zero. do d = 1, MAX_DELAYED_GROUPS - nu_delay(d) = 0 + nu_delayed(d) = 0 end do p % fission = .true. ! Fission neutrons will be banked @@ -1146,7 +1146,7 @@ contains ! Increment the number of neutrons born delayed if (p % delayed_group > 0) then - nu_delay(p % delayed_group) = nu_delay(p % delayed_group) + 1 + nu_delayed(p % delayed_group) = nu_delayed(p % delayed_group) + 1 end if end do @@ -1157,7 +1157,7 @@ contains p % n_bank = nu p % wgt_bank = nu/weight do d = 1, MAX_DELAYED_GROUPS - p % n_delay_bank(d) = nu_delay(d) + p % n_delayed_bank(d) = nu_delayed(d) end do end subroutine create_fission_sites diff --git a/src/tally.F90 b/src/tally.F90 index b2066319b9..d1dc95f305 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -403,7 +403,7 @@ contains end if - case (SCORE_DELAY_NU_FISSION) + case (SCORE_DELAYED_NU_FISSION) if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing .or. p % fission) then if (t % find_filter(FILTER_ENERGYOUT) > 0) then @@ -421,25 +421,28 @@ contains ! calculate fraction of absorptions that would have resulted in ! nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then !$omp critical lc = 1 do d = 1, nuclides(p % event_nuclide) % n_precursor ! determine number of interpolation regions and energies - NR = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 1)) - NE = int(nuclides(p % event_nuclide) % nu_d_precursor_data(lc + 2 + 2*NR)) + NR = int(nuclides(p % event_nuclide) & + % nu_d_precursor_data(lc + 1)) + NE = int(nuclides(p % event_nuclide) & + % nu_d_precursor_data(lc + 2 + 2*NR)) ! determine delayed neutron precursor yield for group d - yield = interpolate_tab1(nuclides(p % event_nuclide) % nu_d_precursor_data( & - lc+1:lc+2+2*NR+2*NE), p % E) + yield = interpolate_tab1(nuclides(p % event_nuclide) & + % nu_d_precursor_data(lc+1:lc+2+2*NR+2*NE), p % E) ! advance pointer lc = lc + 2 + 2*NR + 2*NE + 1 - score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) % & - delay_nu_fission / micro_xs(p % event_nuclide) % absorption + score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & + % delayed_nu_fission / micro_xs(p % event_nuclide) & + % absorption t % results(score_index, d) % value = & t % results(score_index, d) % value + score @@ -447,7 +450,8 @@ contains !$omp end critical else score = p % absorb_wgt * micro_xs(p % event_nuclide) % & - delay_nu_fission / micro_xs(p % event_nuclide) % absorption + delayed_nu_fission / micro_xs(p % event_nuclide) % & + absorption t % results(score_index, 1) % value = & t % results(score_index, 1) % value + score @@ -464,9 +468,9 @@ contains ! its contribution to the fission bank to the score. !$omp critical do d = 1, nuclides(p % event_nuclide) % n_precursor - score = keff * p % wgt_bank / p % n_bank * p % n_delay_bank(d) + score = keff * p % wgt_bank / p % n_bank * p % n_delayed_bank(d) - if (t % find_filter(FILTER_DELAYGROUP) > 0) then + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then t % results(score_index, d) % value = & t % results(score_index, d) % value + score else @@ -1605,7 +1609,7 @@ contains n + 1, p % E) end if - case (FILTER_DELAYGROUP) + case (FILTER_DELAYEDGROUP) if (survival_biasing .and. t % find_filter(FILTER_ENERGYOUT) <= 0) then matching_bins(i) = 1 diff --git a/src/tracking.F90 b/src/tracking.F90 index cc43307ea0..e49b554cee 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -167,7 +167,7 @@ contains p % wgt_bank = ZERO do d = 1, MAX_DELAYED_GROUPS - p % n_delay_bank = 0 + p % n_delayed_bank = 0 end do ! Reset fission logical From 63dfe0b632e56503f02e40ce7ded30daf83a6f6b Mon Sep 17 00:00:00 2001 From: Colin Josey Date: Thu, 1 Oct 2015 12:20:25 -0400 Subject: [PATCH 231/519] Moved logarithm index out of loop --- src/cross_section.F90 | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index b937b03a15..4d8fb2f0fb 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -33,6 +33,7 @@ contains integer :: i_nuclide ! index into nuclides array integer :: i_sab ! index into sab_tables array integer :: j ! index in mat % i_sab_nuclides + integer :: u ! index into logarithmic mapping array real(8) :: atom_density ! atom density of a nuclide logical :: check_sab ! should we check for S(a,b) table? type(Material), pointer :: mat ! current material @@ -50,9 +51,13 @@ contains mat => materials(p % material) - ! Find energy index on global or material unionized grid - if (grid_method == GRID_MAT_UNION) & - call find_energy_index(p % E, p % material) + ! Find energy index on energy grid + u = 0 + if (grid_method == GRID_MAT_UNION) then + call find_energy_index(p % E, p % material) + else if (grid_method == GRID_LOGARITHM) then + u = int(log(p % E/1.0e-11_8)/log_spacing) + end if ! Determine if this material has S(a,b) tables check_sab = (mat % n_sab > 0) @@ -94,9 +99,9 @@ contains ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i) + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, u) else if (i_sab /= micro_xs(i_nuclide) % last_index_sab) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i) + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, u) end if ! ======================================================================== @@ -137,16 +142,16 @@ contains ! given index in the nuclides array at the energy of the given particle !=============================================================================== - subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_mat, i_nuc_mat) + subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_mat, i_nuc_mat, u) integer, intent(in) :: i_nuclide ! index into nuclides array integer, intent(in) :: i_sab ! index into sab_tables array integer, intent(in) :: i_mat ! index into materials array integer, intent(in) :: i_nuc_mat ! index into nuclides array for a material + integer, intent(in) :: u ! index into logarithmic mapping array integer :: i_grid ! index on nuclide energy grid integer :: i_low ! lower logarithmic mapping index integer :: i_high ! upper logarithmic mapping index - integer :: u ! index into logarithmic mapping array real(8), intent(in) :: E ! energy real(8) :: f ! interp factor on nuclide energy grid type(Nuclide), pointer :: nuc @@ -173,7 +178,6 @@ contains else ! Determine bounding indices based on which equal log-spaced interval ! the energy is in - u = int(log(E/1.0e-11_8)/log_spacing) i_low = nuc % grid_index(u) i_high = nuc % grid_index(u + 1) + 1 From 68b654b4031abbe4cf45fe290c5c718e94693ed4 Mon Sep 17 00:00:00 2001 From: Colin Josey Date: Thu, 1 Oct 2015 13:27:11 -0400 Subject: [PATCH 232/519] Removed L/R checking in binary search --- src/search.F90 | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/search.F90 b/src/search.F90 index dab7fa67ca..db099946ee 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -39,16 +39,6 @@ contains n_iteration = 0 do while (R - L > 1) - - ! Check boundaries - if (val > array(L) .and. val < array(L+1)) then - array_index = L - return - elseif (val > array(R-1) .and. val < array(R)) then - array_index = R - 1 - return - end if - ! Find values at midpoint array_index = L + (R - L)/2 testval = array(array_index) @@ -91,16 +81,6 @@ contains n_iteration = 0 do while (R - L > 1) - - ! Check boundaries - if (val > array(L) .and. val < array(L+1)) then - array_index = L - return - elseif (val > array(R-1) .and. val < array(R)) then - array_index = R - 1 - return - end if - ! Find values at midpoint array_index = L + (R - L)/2 testval = array(array_index) @@ -143,16 +123,6 @@ contains n_iteration = 0 do while (R - L > 1) - - ! Check boundaries - if (val > array(L) .and. val < array(L+1)) then - array_index = L - return - elseif (val > array(R-1) .and. val < array(R)) then - array_index = R - 1 - return - end if - ! Find values at midpoint array_index = L + (R - L)/2 testval = array(array_index) From 42ca8df692ba005dc7fee6030f9fae14fea1ac4c Mon Sep 17 00:00:00 2001 From: Colin Josey Date: Thu, 1 Oct 2015 14:01:52 -0400 Subject: [PATCH 233/519] Removed redundancy in binary search --- src/search.F90 | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/search.F90 b/src/search.F90 index db099946ee..ea11498663 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -41,10 +41,9 @@ contains do while (R - L > 1) ! Find values at midpoint array_index = L + (R - L)/2 - testval = array(array_index) - if (val >= testval) then + if (val >= array(array_index)) then L = array_index - elseif (val < testval) then + else R = array_index end if @@ -83,10 +82,9 @@ contains do while (R - L > 1) ! Find values at midpoint array_index = L + (R - L)/2 - testval = array(array_index) - if (val >= testval) then + if (val >= array(array_index)) then L = array_index - elseif (val < testval) then + else R = array_index end if @@ -125,10 +123,9 @@ contains do while (R - L > 1) ! Find values at midpoint array_index = L + (R - L)/2 - testval = array(array_index) - if (val >= testval) then + if (val >= array(array_index)) then L = array_index - elseif (val < testval) then + else R = array_index end if From 7ab36529c0294146919793acead7d2ab0da84c53 Mon Sep 17 00:00:00 2001 From: Colin Josey Date: Thu, 1 Oct 2015 14:02:37 -0400 Subject: [PATCH 234/519] Removed spurious variable --- src/search.F90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/search.F90 b/src/search.F90 index ea11498663..d38dfb986e 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -28,7 +28,6 @@ contains integer :: L integer :: R integer :: n_iteration - real(8) :: testval L = 1 R = n @@ -69,7 +68,6 @@ contains integer :: L integer :: R integer :: n_iteration - real(8) :: testval L = 1 R = n @@ -110,7 +108,6 @@ contains integer :: L integer :: R integer :: n_iteration - real(8) :: testval L = 1 R = n From 65cbcfadb715ce3355944257732ebdfcd6be6333 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 1 Oct 2015 18:26:25 -0400 Subject: [PATCH 235/519] Further refinements to Tally.diagonalize_filter(...) to allow for distribcell filters --- openmc/mgxs/mgxs.py | 7 +++++-- openmc/tallies.py | 15 +++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 07e47e0cf6..bc9167dfd1 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -614,7 +614,7 @@ class MultiGroupXS(object): # Sum across all applicable fine energy group filters for i, filter in enumerate(tally.filters): - if 'energy' in filter.type and all(filter.bins == fine_edges): + if 'energy' in filter.type and np.all(filter.bins == fine_edges): filter.bins = coarse_groups.group_edges mean = np.add.reduceat(mean, energy_indices, axis=i) std_dev = np.add.reduceat(std_dev**2, energy_indices, axis=i) @@ -1734,9 +1734,12 @@ class Chi(MultiGroupXS): nu_fission_out = self.tallies['nu-fission-out'] # Remove the coarse energy filter to keep it out of tally arithmetic - nu_fission_in.remove_filter(nu_fission_in.filters[-1]) + energy_filter = nu_fission_in.find_filter('energy') + nu_fission_in.remove_filter(energy_filter) # Compute chi + nu_fission_in.add_filter(energy_filter) + self._xs_tally = nu_fission_out / nu_fission_in super(Chi, self).compute_xs() diff --git a/openmc/tallies.py b/openmc/tallies.py index 87af32c428..d15be79833 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2506,20 +2506,27 @@ class Tally(object): num_score_bins = new_tally.num_score_bins new_shape = (num_filter_bins, num_nuclides, num_score_bins) + diag_factor = self.num_filter_bins / new_filter.num_bins indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1) + diag_indices = np.zeros(self.num_filter_bins, dtype=np.int) + + for i in range(diag_factor): + start = i * new_filter.num_bins + end = (i+1) * new_filter.num_bins + diag_indices[start:end] = indices + (i * new_filter.num_bins**2) if self.sum is not None: new_tally._sum = np.zeros(new_shape, dtype=np.float64) - new_tally._sum[indices, :self.num_nuclides, :self.num_scores] = self.sum + new_tally._sum[diag_indices, :self.num_nuclides, :self.num_scores] = self.sum if self.sum_sq is not None: new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) - new_tally._sum_sq[indices, :self.num_nuclides, :self.num_scores] = self.sum_sq + new_tally._sum_sq[diag_indices, :self.num_nuclides, :self.num_scores] = self.sum_sq if self.mean is not None: new_tally._mean = np.zeros(new_shape, dtype=np.float64) - new_tally._mean[indices, :self.num_nuclides, :self.num_scores] = self.mean + new_tally._mean[diag_indices, :self.num_nuclides, :self.num_scores] = self.mean if self.std_dev is not None: new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) - new_tally._std_dev[indices, :self.num_nuclides, :self.num_scores] = self.std_dev + new_tally._std_dev[diag_indices, :self.num_nuclides, :self.num_scores] = self.std_dev # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins From df44be36325fa0a120272cf086880253858566be Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Oct 2015 11:33:04 +0700 Subject: [PATCH 236/519] Fix bug in XPlane.x0 --- openmc/surface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/surface.py b/openmc/surface.py index 0be62fbf5a..98ec903c7c 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -287,7 +287,7 @@ class XPlane(Plane): @property def x0(self): - return self.coeff['x0'] + return self._coeffs['x0'] @x0.setter def x0(self, x0): From 8414295b4670b1fdae03879c4427ca674412d2ce Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Oct 2015 11:33:24 +0700 Subject: [PATCH 237/519] Expand check on combining parentheses --- openmc/region.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index f1926cdc2a..26da5355dd 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -83,16 +83,19 @@ class Region(object): else: tokens.append(surfaces[abs(j)].positive) - # This function is used below to apply an operator to operands on the + # The functions below are used to apply an operator to operands on the # output queue during the shunting yard algorithm. + def can_be_combined(region): + return isinstance(region, Complement) or hasattr(region, 'surface') + def apply_operator(output, operator): r2 = output.pop() if operator == ' ': r1 = output.pop() - if isinstance(r1, Intersection) and hasattr(r2, 'surface'): + if isinstance(r1, Intersection) and can_be_combined(r2): r1.nodes.append(r2) output.append(r1) - elif isinstance(r2, Intersection) and hasattr(r1, 'surface'): + elif isinstance(r2, Intersection) and can_be_combined(r1): r2.nodes.insert(0, r1) output.append(r2) elif isinstance(r1, Intersection) and isinstance(r2, Intersection): @@ -102,10 +105,10 @@ class Region(object): output.append(Intersection(r1, r2)) elif operator == '^': r1 = output.pop() - if isinstance(r1, Union) and hasattr(r2, 'surface'): + if isinstance(r1, Union) and can_be_combined(r2): r1.nodes.append(r2) output.append(r1) - elif isinstance(r2, Union) and hasattr(r1, 'surface'): + elif isinstance(r2, Union) and can_be_combined(r1): r2.nodes.insert(0, r1) output.append(r2) elif isinstance(r1, Union) and isinstance(r2, Union): From 78d14133dbd7cb24c42b99256d36a67c4cd0b15e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 2 Oct 2015 01:25:41 -0400 Subject: [PATCH 238/519] Updated OpenCG compatiblity module to reflect move to PEP8 use of underscores in place of camelCase --- openmc/material.py | 9 +- openmc/mesh.py | 8 +- openmc/opencg_compatible.py | 182 ++++++++++++++++++------------------ openmc/surface.py | 7 +- openmc/tallies.py | 7 +- openmc/universe.py | 21 +++-- 6 files changed, 128 insertions(+), 106 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index e495357b54..4f60abc676 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -132,9 +132,12 @@ class Material(object): @name.setter def name(self, name): - check_type('name for Material ID="{0}"'.format(self._id), - name, basestring) - self._name = name + if name is not None: + check_type('name for Material ID="{0}"'.format(self._id), + name, basestring) + self._name = name + else: + self._name = None def set_density(self, units, density=NO_DENSITY): """Set the density of the material diff --git a/openmc/mesh.py b/openmc/mesh.py index 2fe873d2bc..af13d984df 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -148,8 +148,12 @@ class Mesh(object): @name.setter def name(self, name): - check_type('name for mesh ID="{0}"'.format(self._id), name, basestring) - self._name = name + if name is not None: + check_type('name for mesh ID="{0}"'.format(self._id), + name, basestring) + self._name = name + else: + self._name = None @type.setter def type(self, meshtype): diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 65e980c003..682ef0ecac 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -83,14 +83,14 @@ def get_opencg_material(openmc_material): raise ValueError(msg) global OPENCG_MATERIALS - material_id = openmc_material._id + material_id = openmc_material.id # If this Material was already created, use it if material_id in OPENCG_MATERIALS: return OPENCG_MATERIALS[material_id] # Create an OpenCG Material to represent this OpenMC Material - name = openmc_material._name + name = openmc_material.name opencg_material = opencg.Material(material_id=material_id, name=name) # Add the OpenMC Material to the global collection of all OpenMC Materials @@ -123,14 +123,14 @@ def get_openmc_material(opencg_material): raise ValueError(msg) global OPENMC_MATERIALS - material_id = opencg_material._id + material_id = opencg_material.id # If this Material was already created, use it if material_id in OPENMC_MATERIALS: return OPENMC_MATERIALS[material_id] # Create an OpenMC Material to represent this OpenCG Material - name = opencg_material._name + name = opencg_material.name openmc_material = openmc.Material(material_id=material_id, name=name) # Add the OpenMC Material to the global collection of all OpenMC Materials @@ -168,8 +168,8 @@ def is_opencg_surface_compatible(opencg_surface): 'since "{0}" is not a Surface'.format(opencg_surface) raise ValueError(msg) - if opencg_surface._type in ['x-squareprism', - 'y-squareprism', 'z-squareprism']: + if opencg_surface.type in ['x-squareprism', + 'y-squareprism', 'z-squareprism']: return False else: return True @@ -196,59 +196,59 @@ def get_opencg_surface(openmc_surface): raise ValueError(msg) global OPENCG_SURFACES - surface_id = openmc_surface._id + surface_id = openmc_surface.id # If this Material was already created, use it if surface_id in OPENCG_SURFACES: return OPENCG_SURFACES[surface_id] # Create an OpenCG Surface to represent this OpenMC Surface - name = openmc_surface._name + name = openmc_surface.name # Correct for OpenMC's syntax for Surfaces dividing Cells - boundary = openmc_surface._boundary_type + boundary = openmc_surface.boundary_type if boundary == 'transmission': boundary = 'interface' opencg_surface = None - if openmc_surface._type == 'plane': - A = openmc_surface._coeffs['A'] - B = openmc_surface._coeffs['B'] - C = openmc_surface._coeffs['C'] - D = openmc_surface._coeffs['D'] + if openmc_surface.type == 'plane': + A = openmc_surface.coeffs['A'] + B = openmc_surface.coeffs['B'] + C = openmc_surface.coeffs['C'] + D = openmc_surface.coeffs['D'] opencg_surface = opencg.Plane(surface_id, name, boundary, A, B, C, D) - elif openmc_surface._type == 'x-plane': - x0 = openmc_surface._coeffs['x0'] + elif openmc_surface.type == 'x-plane': + x0 = openmc_surface.coeffs['x0'] opencg_surface = opencg.XPlane(surface_id, name, boundary, x0) - elif openmc_surface._type == 'y-plane': - y0 = openmc_surface._coeffs['y0'] + elif openmc_surface.type == 'y-plane': + y0 = openmc_surface.coeffs['y0'] opencg_surface = opencg.YPlane(surface_id, name, boundary, y0) - elif openmc_surface._type == 'z-plane': - z0 = openmc_surface._coeffs['z0'] + elif openmc_surface.type == 'z-plane': + z0 = openmc_surface.coeffs['z0'] opencg_surface = opencg.ZPlane(surface_id, name, boundary, z0) - elif openmc_surface._type == 'x-cylinder': - y0 = openmc_surface._coeffs['y0'] - z0 = openmc_surface._coeffs['z0'] - R = openmc_surface._coeffs['R'] + elif openmc_surface.type == 'x-cylinder': + y0 = openmc_surface.coeffs['y0'] + z0 = openmc_surface.coeffs['z0'] + R = openmc_surface.coeffs['R'] opencg_surface = opencg.XCylinder(surface_id, name, boundary, y0, z0, R) - elif openmc_surface._type == 'y-cylinder': - x0 = openmc_surface._coeffs['x0'] - z0 = openmc_surface._coeffs['z0'] - R = openmc_surface._coeffs['R'] + elif openmc_surface.type == 'y-cylinder': + x0 = openmc_surface.coeffs['x0'] + z0 = openmc_surface.coeffs['z0'] + R = openmc_surface.coeffs['R'] opencg_surface = opencg.YCylinder(surface_id, name, boundary, x0, z0, R) - elif openmc_surface._type == 'z-cylinder': - x0 = openmc_surface._coeffs['x0'] - y0 = openmc_surface._coeffs['y0'] - R = openmc_surface._coeffs['R'] + elif openmc_surface.type == 'z-cylinder': + x0 = openmc_surface.coeffs['x0'] + y0 = openmc_surface.coeffs['y0'] + R = openmc_surface.coeffs['R'] opencg_surface = opencg.ZCylinder(surface_id, name, boundary, x0, y0, R) @@ -282,52 +282,52 @@ def get_openmc_surface(opencg_surface): raise ValueError(msg) global openmc_surface - surface_id = opencg_surface._id + surface_id = opencg_surface.id # If this Surface was already created, use it if surface_id in OPENMC_SURFACES: return OPENMC_SURFACES[surface_id] # Create an OpenMC Surface to represent this OpenCG Surface - name = opencg_surface._name + name = opencg_surface.name # Correct for OpenMC's syntax for Surfaces dividing Cells - boundary = opencg_surface._boundary_type + boundary = opencg_surface.boundary_type if boundary == 'interface': boundary = 'transmission' - if opencg_surface._type == 'plane': + if opencg_surface.type == 'plane': A = opencg_surface._coeffs['A'] B = opencg_surface._coeffs['B'] C = opencg_surface._coeffs['C'] D = opencg_surface._coeffs['D'] openmc_surface = openmc.Plane(surface_id, boundary, A, B, C, D, name) - elif opencg_surface._type == 'x-plane': + elif opencg_surface.type == 'x-plane': x0 = opencg_surface._coeffs['x0'] openmc_surface = openmc.XPlane(surface_id, boundary, x0, name) - elif opencg_surface._type == 'y-plane': + elif opencg_surface.type == 'y-plane': y0 = opencg_surface._coeffs['y0'] openmc_surface = openmc.YPlane(surface_id, boundary, y0, name) - elif opencg_surface._type == 'z-plane': + elif opencg_surface.type == 'z-plane': z0 = opencg_surface._coeffs['z0'] openmc_surface = openmc.ZPlane(surface_id, boundary, z0, name) - elif opencg_surface._type == 'x-cylinder': + elif opencg_surface.type == 'x-cylinder': y0 = opencg_surface._coeffs['y0'] z0 = opencg_surface._coeffs['z0'] R = opencg_surface._coeffs['R'] openmc_surface = openmc.XCylinder(surface_id, boundary, y0, z0, R, name) - elif opencg_surface._type == 'y-cylinder': + elif opencg_surface.type == 'y-cylinder': x0 = opencg_surface._coeffs['x0'] z0 = opencg_surface._coeffs['z0'] R = opencg_surface._coeffs['R'] openmc_surface = openmc.YCylinder(surface_id, boundary, x0, z0, R, name) - elif opencg_surface._type == 'z-cylinder': + elif opencg_surface.type == 'z-cylinder': x0 = opencg_surface._coeffs['x0'] y0 = opencg_surface._coeffs['y0'] R = opencg_surface._coeffs['R'] @@ -336,7 +336,7 @@ def get_openmc_surface(opencg_surface): else: msg = 'Unable to create an OpenMC Surface from an OpenCG ' \ 'Surface of type "{0}" since it is not a compatible ' \ - 'Surface type in OpenMC'.format(opencg_surface._type) + 'Surface type in OpenMC'.format(opencg_surface.type) raise ValueError(msg) # Add the OpenMC Surface to the global collection of all OpenMC Surfaces @@ -373,17 +373,17 @@ def get_compatible_opencg_surfaces(opencg_surface): raise ValueError(msg) global OPENMC_SURFACES - surface_id = opencg_surface._id + surface_id = opencg_surface.id # If this Surface was already created, use it if surface_id in OPENMC_SURFACES: return OPENMC_SURFACES[surface_id] # Create an OpenMC Surface to represent this OpenCG Surface - name = opencg_surface._name - boundary = opencg_surface._boundary_type + name = opencg_surface.name + boundary = opencg_surface.boundary_type - if opencg_surface._type == 'x-squareprism': + if opencg_surface.type == 'x-squareprism': y0 = opencg_surface._coeffs['y0'] z0 = opencg_surface._coeffs['z0'] R = opencg_surface._coeffs['R'] @@ -395,7 +395,7 @@ def get_compatible_opencg_surfaces(opencg_surface): top = opencg.ZPlane(name=name, boundary=boundary, z0=z0+R) surfaces = [left, right, bottom, top] - elif opencg_surface._type == 'y-squareprism': + elif opencg_surface.type == 'y-squareprism': x0 = opencg_surface._coeffs['x0'] z0 = opencg_surface._coeffs['z0'] R = opencg_surface._coeffs['R'] @@ -407,7 +407,7 @@ def get_compatible_opencg_surfaces(opencg_surface): top = opencg.ZPlane(name=name, boundary=boundary, z0=z0+R) surfaces = [left, right, bottom, top] - elif opencg_surface._type == 'z-squareprism': + elif opencg_surface.type == 'z-squareprism': x0 = opencg_surface._coeffs['x0'] y0 = opencg_surface._coeffs['y0'] R = opencg_surface._coeffs['R'] @@ -422,7 +422,7 @@ def get_compatible_opencg_surfaces(opencg_surface): else: msg = 'Unable to create a compatible OpenMC Surface an OpenCG ' \ 'Surface of type "{0}" since it already a compatible ' \ - 'Surface type in OpenMC'.format(opencg_surface._type) + 'Surface type in OpenMC'.format(opencg_surface.type) raise ValueError(msg) # Add the OpenMC Surface(s) to the global collection of all OpenMC Surfaces @@ -455,32 +455,32 @@ def get_opencg_cell(openmc_cell): raise ValueError(msg) global OPENCG_CELLS - cell_id = openmc_cell._id + cell_id = openmc_cell.id # If this Cell was already created, use it if cell_id in OPENCG_CELLS: return OPENCG_CELLS[cell_id] # Create an OpenCG Cell to represent this OpenMC Cell - name = openmc_cell._name + name = openmc_cell.name opencg_cell = opencg.Cell(cell_id, name) - fill = openmc_cell._fill + fill = openmc_cell.fill - if (openmc_cell._type == 'normal'): + if (openmc_cell.type == 'normal'): opencg_cell.setFill(get_opencg_material(fill)) - elif (openmc_cell._type == 'fill'): + elif (openmc_cell.type == 'fill'): opencg_cell.setFill(get_opencg_universe(fill)) else: opencg_cell.setFill(get_opencg_lattice(fill)) - if openmc_cell._rotation is not None: - opencg_cell.setRotation(openmc_cell._rotation) + if openmc_cell.rotation is not None: + opencg_cell.setRotation(openmc_cell.rotation) - if openmc_cell._translation is not None: - opencg_cell.setTranslation(openmc_cell._translation) + if openmc_cell.translation is not None: + opencg_cell.setTranslation(openmc_cell.translation) - surfaces = openmc_cell._surfaces + surfaces = openmc_cell.surfaces for surface_id in surfaces: surface = surfaces[surface_id][0] @@ -536,8 +536,8 @@ def get_compatible_opencg_cells(opencg_cell, opencg_surface, halfspace): compatible_cells = [] # SquarePrism Surfaces - if opencg_surface._type in ['x-squareprism', 'y-squareprism', - 'z-squareprism']: + if opencg_surface.type in ['x-squareprism', 'y-squareprism', + 'z-squareprism']: # Get the compatible Surfaces (XPlanes and YPlanes) compatible_surfaces = get_compatible_opencg_surfaces(opencg_surface) @@ -690,31 +690,31 @@ def get_openmc_cell(opencg_cell): raise ValueError(msg) global OPENMC_CELLS - cell_id = opencg_cell._id + cell_id = opencg_cell.id # If this Cell was already created, use it if cell_id in OPENMC_CELLS: return OPENMC_CELLS[cell_id] # Create an OpenCG Cell to represent this OpenMC Cell - name = opencg_cell._name + name = opencg_cell.name openmc_cell = openmc.Cell(cell_id, name) - fill = opencg_cell._fill + fill = opencg_cell.fill - if (opencg_cell._type == 'universe'): + if (opencg_cell.type == 'universe'): openmc_cell.fill = get_openmc_universe(fill) - elif (opencg_cell._type == 'lattice'): + elif (opencg_cell.type == 'lattice'): openmc_cell.fill = get_openmc_lattice(fill) else: openmc_cell.fill = get_openmc_material(fill) - if opencg_cell._rotation: - rotation = np.asarray(opencg_cell._rotation, dtype=np.int) + if opencg_cell.rotation: + rotation = np.asarray(opencg_cell.rotation, dtype=np.int) openmc_cell.rotation = rotation - if opencg_cell._translation: - translation = np.asarray(opencg_cell._translation, dtype=np.float64) + if opencg_cell.translation: + translation = np.asarray(opencg_cell.translation, dtype=np.float64) openmc_cell.setTranslation(translation) surfaces = opencg_cell._surfaces @@ -754,18 +754,18 @@ def get_opencg_universe(openmc_universe): raise ValueError(msg) global OPENCG_UNIVERSES - universe_id = openmc_universe._id + universe_id = openmc_universe.id # If this Universe was already created, use it if universe_id in OPENCG_UNIVERSES: return OPENCG_UNIVERSES[universe_id] # Create an OpenCG Universe to represent this OpenMC Universe - name = openmc_universe._name + name = openmc_universe.name opencg_universe = opencg.Universe(universe_id, name) # Convert all OpenMC Cells in this Universe to OpenCG Cells - openmc_cells = openmc_universe._cells + openmc_cells = openmc_universe.cells for cell_id, openmc_cell in openmc_cells.items(): opencg_cell = get_opencg_cell(openmc_cell) @@ -801,7 +801,7 @@ def get_openmc_universe(opencg_universe): raise ValueError(msg) global OPENMC_UNIVERSES - universe_id = opencg_universe._id + universe_id = opencg_universe.id # If this Universe was already created, use it if universe_id in OPENMC_UNIVERSES: @@ -811,7 +811,7 @@ def get_openmc_universe(opencg_universe): make_opencg_cells_compatible(opencg_universe) # Create an OpenMC Universe to represent this OpenCSg Universe - name = opencg_universe._name + name = opencg_universe.name openmc_universe = openmc.Universe(universe_id, name) # Convert all OpenCG Cells in this Universe to OpenMC Cells @@ -851,7 +851,7 @@ def get_opencg_lattice(openmc_lattice): raise ValueError(msg) global OPENCG_LATTICES - lattice_id = openmc_lattice._id + lattice_id = openmc_lattice.id # If this Lattice was already created, use it if lattice_id in OPENCG_LATTICES: @@ -888,7 +888,7 @@ def get_opencg_lattice(openmc_lattice): for z in range(dimension[2]): for y in range(dimension[1]): for x in range(dimension[0]): - universe_id = universes[x][dimension[1]-y-1][z]._id + universe_id = universes[x][dimension[1]-y-1][z].id universe_array[z][y][x] = unique_universes[universe_id] opencg_lattice = opencg.Lattice(lattice_id, name) @@ -931,23 +931,23 @@ def get_openmc_lattice(opencg_lattice): raise ValueError(msg) global OPENMC_LATTICES - lattice_id = opencg_lattice._id + lattice_id = opencg_lattice.id # If this Lattice was already created, use it if lattice_id in OPENMC_LATTICES: return OPENMC_LATTICES[lattice_id] - dimension = opencg_lattice._dimension - width = opencg_lattice._width - offset = opencg_lattice._offset - universes = opencg_lattice._universes + dimension = opencg_lattice.dimension + width = opencg_lattice.width + offset = opencg_lattice.offset + universes = opencg_lattice.universes # Initialize an empty array for the OpenMC nested Universes in this Lattice universe_array = np.ndarray(tuple(np.array(dimension)), dtype=openmc.Universe) # Create OpenMC Universes for each unique nested Universe in this Lattice - unique_universes = opencg_lattice.getUniqueUniverses() + unique_universes = opencg_lattice.get_unique_universes() for universe_id, universe in unique_universes.items(): unique_universes[universe_id] = get_openmc_universe(universe) @@ -956,7 +956,7 @@ def get_openmc_lattice(opencg_lattice): for z in range(dimension[2]): for y in range(dimension[1]): for x in range(dimension[0]): - universe_id = universes[z][y][x]._id + universe_id = universes[z][y][x].id universe_array[x][y][z] = unique_universes[universe_id] # Reverse y-dimension in array to match ordering in OpenCG @@ -1011,7 +1011,7 @@ def get_opencg_geometry(openmc_geometry): OPENMC_LATTICES.clear() OPENCG_LATTICES.clear() - openmc_root_universe = openmc_geometry._root_universe + openmc_root_universe = openmc_geometry.root_universe opencg_root_universe = get_opencg_universe(openmc_root_universe) opencg_geometry = opencg.Geometry() @@ -1043,11 +1043,11 @@ def get_openmc_geometry(opencg_geometry): # Deep copy the goemetry since it may be modified to make all Surfaces # compatible with OpenMC's specifications - opencg_geometry.assignAutoIds() + opencg_geometry.assign_auto_ids() opencg_geometry = copy.deepcopy(opencg_geometry) # Update Cell bounding boxes in Geometry - opencg_geometry.updateBoundingBoxes() + opencg_geometry.update_bounding_boxes() # Clear dictionaries and auto-generated ID OPENMC_SURFACES.clear() @@ -1060,14 +1060,14 @@ def get_openmc_geometry(opencg_geometry): OPENCG_LATTICES.clear() # Make the entire geometry "compatible" before assigning auto IDs - universes = opencg_geometry.getAllUniverses() + universes = opencg_geometry.get_all_universes() for universe_id, universe in universes.items(): if not isinstance(universe, opencg.Lattice): make_opencg_cells_compatible(universe) - opencg_geometry.assignAutoIds() + opencg_geometry.assign_auto_ids() - opencg_root_universe = opencg_geometry._root_universe + opencg_root_universe = opencg_geometry.root_universe openmc_root_universe = get_openmc_universe(opencg_root_universe) openmc_geometry = openmc.Geometry() diff --git a/openmc/surface.py b/openmc/surface.py index 653754d303..164bbd09bf 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -101,8 +101,11 @@ class Surface(object): @name.setter def name(self, name): - check_type('surface name', name, basestring) - self._name = name + if name is not None: + check_type('surface name', name, basestring) + self._name = name + else: + self._name = None @boundary_type.setter def boundary_type(self, boundary_type): diff --git a/openmc/tallies.py b/openmc/tallies.py index 20a6af3f29..a1206f012a 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -373,8 +373,11 @@ class Tally(object): @name.setter def name(self, name): - check_type('tally name', name, basestring) - self._name = name + if name is not None: + check_type('tally name', name, basestring) + self._name = name + else: + self._name = None def add_filter(self, filter): """Add a filter to the tally diff --git a/openmc/universe.py b/openmc/universe.py index bab10f5df7..9516192802 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -117,8 +117,11 @@ class Cell(object): @name.setter def name(self, name): - cv.check_type('cell name', name, basestring) - self._name = name + if name is not None: + cv.check_type('cell name', name, basestring) + self._name = name + else: + self._name = None @fill.setter def fill(self, fill): @@ -438,8 +441,11 @@ class Universe(object): @name.setter def name(self, name): - cv.check_type('universe name', name, basestring) - self._name = name + if name is not None: + cv.check_type('universe name', name, basestring) + self._name = name + else: + self._name = None def add_cell(self, cell): """Add a cell to the universe. @@ -677,8 +683,11 @@ class Lattice(object): @name.setter def name(self, name): - cv.check_type('lattice name', name, basestring) - self._name = name + if name is not None: + cv.check_type('lattice name', name, basestring) + self._name = name + else: + self._name = None @outer.setter def outer(self, outer): From 52fe3f5b76b0ce36141d442c8bc50fe87a31f592 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Oct 2015 14:00:12 +0700 Subject: [PATCH 239/519] Respond to @smharper comments on #463 --- openmc/region.py | 3 ++- src/geometry.F90 | 46 +++++++++++++++++++++++----------------------- src/initialize.F90 | 5 +++++ src/summary.F90 | 24 +++++++++++------------- 4 files changed, 41 insertions(+), 37 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index 26da5355dd..cb745b7f8c 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -67,7 +67,8 @@ class Region(object): else: # Check for invalid characters if expression[i] not in '-0123456789': - raise SyntaxError('Invalid character in expression') + raise SyntaxError("Invalid character '{}' in expression" + .format(expression[i])) # If we haven't yet reached the start of a word, start one if i_start < 0: diff --git a/src/geometry.F90 b/src/geometry.F90 index aec506df60..e1e1b1f44e 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -83,7 +83,6 @@ contains integer :: i integer :: token - logical :: b1, b2 integer :: i_stack logical :: actual_sense ! sense of particle wrt surface logical :: stack(size(c%rpn)) @@ -91,7 +90,20 @@ contains i_stack = 0 do i = 1, size(c%rpn) token = c%rpn(i) - if (token < OP_UNION) then + + ! If the token is a binary operator (intersection/union), apply it to + ! the last two items on the stack. If the token is a unary operator + ! (complement), apply it to the last item on the stack. + select case (token) + case (OP_UNION) + stack(i_stack - 1) = stack(i_stack - 1) .or. stack(i_stack) + i_stack = i_stack - 1 + case (OP_INTERSECTION) + stack(i_stack - 1) = stack(i_stack - 1) .and. stack(i_stack) + i_stack = i_stack - 1 + case (OP_COMPLEMENT) + stack(i_stack) = .not. stack(i_stack) + case default ! If the token is not an operator, evaluate the sense of particle with ! respect to the surface and see if the token matches the sense. If the ! particle's surface attribute is set and matches the token, that @@ -106,24 +118,7 @@ contains p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) stack(i_stack) = (actual_sense .eqv. (token > 0)) end if - else - ! If the token is a binary operator (intersection/union), apply it to - ! the last two items on the stack. If the token is a unary operator - ! (complement), apply it to the last item on the stack. - b1 = stack(i_stack) - select case (token) - case (OP_UNION) - b2 = stack(i_stack - 1) - stack(i_stack - 1) = b1 .or. b2 - i_stack = i_stack - 1 - case (OP_INTERSECTION) - b2 = stack(i_stack - 1) - stack(i_stack - 1) = b1 .and. b2 - i_stack = i_stack - 1 - case (OP_COMPLEMENT) - stack(i_stack) = .not. b1 - end select - end if + end select end do if (i_stack == 1) then @@ -630,11 +625,11 @@ contains ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL SURFACE_LOOP: do i = 1, size(cl%region) - ! check for operators index_surf = cl%region(i) coincident = (index_surf == p % surface) - ! check for operators + ! ignore this token if it corresponds to an operator rather than a + ! region. index_surf = abs(index_surf) if (index_surf >= OP_UNION) cycle @@ -642,7 +637,7 @@ contains surf => surfaces(index_surf)%obj d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw, coincident) - ! Check is calculated distance is new minimum + ! Check if calculated distance is new minimum if (d < d_surf) then if (abs(d - d_surf)/d_surf >= FP_PRECISION) then d_surf = d @@ -899,8 +894,11 @@ contains do j = 1, size(c%region) i_surface = c % region(j) positive = (i_surface > 0) + + ! Skip any tokens that correspond to operators rather than regions i_surface = abs(i_surface) if (i_surface >= OP_UNION) cycle + if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 else @@ -930,6 +928,8 @@ contains do j = 1, size(c%region) i_surface = c % region(j) positive = (i_surface > 0) + + ! Skip any tokens that correspond to operators rather than regions i_surface = abs(i_surface) if (i_surface >= OP_UNION) cycle diff --git a/src/initialize.F90 b/src/initialize.F90 index 16a6a17b03..ca92595c2a 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -573,6 +573,9 @@ contains c => cells(i) do j = 1, size(c%region) id = c%region(j) + ! Make sure that only regions are checked. Since OP_UNION is the + ! operator with the lowest integer value, anything below it must denote + ! a half-space if (id < OP_UNION) then if (surface_dict%has_key(abs(id))) then i_array = surface_dict%get_key(abs(id)) @@ -584,8 +587,10 @@ contains end if end do + ! Also adjust the indices in the reverse Polish notation do j = 1, size(c%rpn) id = c%rpn(j) + ! Again, make sure that only regions are checked if (id < OP_UNION) then i_array = surface_dict%get_key(abs(id)) c%rpn(j) = sign(i_array, id) diff --git a/src/summary.F90 b/src/summary.F90 index 1edb645432..ab69f35ccb 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -179,21 +179,19 @@ contains region_spec = "" do j = 1, size(c%region) k = c%region(j) - if (k < OP_UNION) then + select case(k) + case (OP_LEFT_PAREN) + region_spec = trim(region_spec) // " (" + case (OP_RIGHT_PAREN) + region_spec = trim(region_spec) // " )" + case (OP_COMPLEMENT) + region_spec = trim(region_spec) // " ~" + case (OP_UNION) + region_spec = trim(region_spec) // " ^" + case default region_spec = trim(region_spec) // " " // to_str(& sign(surfaces(abs(k))%obj%id, k)) - else - select case(k) - case (OP_LEFT_PAREN) - region_spec = trim(region_spec) // " (" - case (OP_RIGHT_PAREN) - region_spec = trim(region_spec) // " )" - case (OP_COMPLEMENT) - region_spec = trim(region_spec) // " ~" - case (OP_UNION) - region_spec = trim(region_spec) // " ^" - end select - end if + end select end do call write_dataset(cell_group, "region", adjustl(region_spec)) From f0da87cde034704ab1a08d31bde7bb60eafa9a11 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Oct 2015 22:05:19 +0700 Subject: [PATCH 240/519] Fix writing of region specification in summary file. --- src/summary.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/summary.F90 b/src/summary.F90 index ab69f35ccb..56c31452b4 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -186,6 +186,7 @@ contains region_spec = trim(region_spec) // " )" case (OP_COMPLEMENT) region_spec = trim(region_spec) // " ~" + case (OP_INTERSECTION) case (OP_UNION) region_spec = trim(region_spec) // " ^" case default From a491dde24853022514631ced51c1db053679319b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 2 Oct 2015 17:01:52 -0400 Subject: [PATCH 241/519] Updated OpenCG compatibility module to use OpenCG property getters for surfaces, cells and coeffs --- openmc/opencg_compatible.py | 58 ++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 682ef0ecac..b41a621b40 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -297,40 +297,40 @@ def get_openmc_surface(opencg_surface): boundary = 'transmission' if opencg_surface.type == 'plane': - A = opencg_surface._coeffs['A'] - B = opencg_surface._coeffs['B'] - C = opencg_surface._coeffs['C'] - D = opencg_surface._coeffs['D'] + A = opencg_surface.coeffs['A'] + B = opencg_surface.coeffs['B'] + C = opencg_surface.coeffs['C'] + D = opencg_surface.coeffs['D'] openmc_surface = openmc.Plane(surface_id, boundary, A, B, C, D, name) elif opencg_surface.type == 'x-plane': - x0 = opencg_surface._coeffs['x0'] + x0 = opencg_surface.coeffs['x0'] openmc_surface = openmc.XPlane(surface_id, boundary, x0, name) elif opencg_surface.type == 'y-plane': - y0 = opencg_surface._coeffs['y0'] + y0 = opencg_surface.coeffs['y0'] openmc_surface = openmc.YPlane(surface_id, boundary, y0, name) elif opencg_surface.type == 'z-plane': - z0 = opencg_surface._coeffs['z0'] + z0 = opencg_surface.coeffs['z0'] openmc_surface = openmc.ZPlane(surface_id, boundary, z0, name) elif opencg_surface.type == 'x-cylinder': - y0 = opencg_surface._coeffs['y0'] - z0 = opencg_surface._coeffs['z0'] - R = opencg_surface._coeffs['R'] + y0 = opencg_surface.coeffs['y0'] + z0 = opencg_surface.coeffs['z0'] + R = opencg_surface.coeffs['R'] openmc_surface = openmc.XCylinder(surface_id, boundary, y0, z0, R, name) elif opencg_surface.type == 'y-cylinder': - x0 = opencg_surface._coeffs['x0'] - z0 = opencg_surface._coeffs['z0'] - R = opencg_surface._coeffs['R'] + x0 = opencg_surface.coeffs['x0'] + z0 = opencg_surface.coeffs['z0'] + R = opencg_surface.coeffs['R'] openmc_surface = openmc.YCylinder(surface_id, boundary, x0, z0, R, name) elif opencg_surface.type == 'z-cylinder': - x0 = opencg_surface._coeffs['x0'] - y0 = opencg_surface._coeffs['y0'] - R = opencg_surface._coeffs['R'] + x0 = opencg_surface.coeffs['x0'] + y0 = opencg_surface.coeffs['y0'] + R = opencg_surface.coeffs['R'] openmc_surface = openmc.ZCylinder(surface_id, boundary, x0, y0, R, name) else: @@ -384,9 +384,9 @@ def get_compatible_opencg_surfaces(opencg_surface): boundary = opencg_surface.boundary_type if opencg_surface.type == 'x-squareprism': - y0 = opencg_surface._coeffs['y0'] - z0 = opencg_surface._coeffs['z0'] - R = opencg_surface._coeffs['R'] + y0 = opencg_surface.coeffs['y0'] + z0 = opencg_surface.coeffs['z0'] + R = opencg_surface.coeffs['R'] # Create a list of the four planes we need left = opencg.YPlane(name=name, boundary=boundary, y0=y0-R) @@ -396,9 +396,9 @@ def get_compatible_opencg_surfaces(opencg_surface): surfaces = [left, right, bottom, top] elif opencg_surface.type == 'y-squareprism': - x0 = opencg_surface._coeffs['x0'] - z0 = opencg_surface._coeffs['z0'] - R = opencg_surface._coeffs['R'] + x0 = opencg_surface.coeffs['x0'] + z0 = opencg_surface.coeffs['z0'] + R = opencg_surface.coeffs['R'] # Create a list of the four planes we need left = opencg.XPlane(name=name, boundary=boundary, x0=x0-R) @@ -408,9 +408,9 @@ def get_compatible_opencg_surfaces(opencg_surface): surfaces = [left, right, bottom, top] elif opencg_surface.type == 'z-squareprism': - x0 = opencg_surface._coeffs['x0'] - y0 = opencg_surface._coeffs['y0'] - R = opencg_surface._coeffs['R'] + x0 = opencg_surface.coeffs['x0'] + y0 = opencg_surface.coeffs['y0'] + R = opencg_surface.coeffs['R'] # Create a list of the four planes we need left = opencg.XPlane(name=name, boundary=boundary, x0=x0-R) @@ -631,12 +631,12 @@ def make_opencg_cells_compatible(opencg_universe): raise ValueError(msg) # Check all OpenCG Cells in this Universe for compatibility with OpenMC - opencg_cells = opencg_universe._cells + opencg_cells = opencg_universe.cells for cell_id, opencg_cell in opencg_cells.items(): # Check each of the OpenCG Surfaces for OpenMC compatibility - surfaces = opencg_cell._surfaces + surfaces = opencg_cell.surfaces for surface_id in surfaces: surface = surfaces[surface_id][0] @@ -717,7 +717,7 @@ def get_openmc_cell(opencg_cell): translation = np.asarray(opencg_cell.translation, dtype=np.float64) openmc_cell.setTranslation(translation) - surfaces = opencg_cell._surfaces + surfaces = opencg_cell.surfaces for surface_id in surfaces: surface = surfaces[surface_id][0] @@ -815,7 +815,7 @@ def get_openmc_universe(opencg_universe): openmc_universe = openmc.Universe(universe_id, name) # Convert all OpenCG Cells in this Universe to OpenMC Cells - opencg_cells = opencg_universe._cells + opencg_cells = opencg_universe.cells for cell_id, opencg_cell in opencg_cells.items(): openmc_cell = get_openmc_cell(opencg_cell) From e0c2aace2e73367536fa03e153b67a2d038cd2b3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 2 Oct 2015 17:35:58 -0400 Subject: [PATCH 242/519] Removed debug print statement from OpenCG compatibility module --- openmc/opencg_compatible.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 9448ff29ac..000801ca2a 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -467,8 +467,6 @@ def get_opencg_cell(openmc_cell): fill = openmc_cell.fill - print(openmc_cell.fill_type) - if (openmc_cell.fill_type == 'material'): opencg_cell.fill = get_opencg_material(fill) elif (openmc_cell.fill_type == 'universe'): @@ -717,7 +715,7 @@ def get_openmc_cell(opencg_cell): if opencg_cell.translation: translation = np.asarray(opencg_cell.translation, dtype=np.float64) - openmc_cell.setTranslation(translation) + openmc_cell.translation = translation surfaces = opencg_cell.surfaces @@ -894,14 +892,14 @@ def get_opencg_lattice(openmc_lattice): universe_array[z][y][x] = unique_universes[universe_id] opencg_lattice = opencg.Lattice(lattice_id, name) - opencg_lattice.setDimension(dimension) - opencg_lattice.setWidth(pitch) - opencg_lattice.setUniverses(universe_array) + opencg_lattice.dimension = dimension + opencg_lattice.width = pitch + opencg_lattice.universes = universe_array offset = np.array(lower_left, dtype=np.float64) - \ ((np.array(pitch, dtype=np.float64) * np.array(dimension, dtype=np.float64))) / -2.0 - opencg_lattice.setOffset(offset) + opencg_lattice.offset = offset # Add the OpenMC Lattice to the global collection of all OpenMC Lattices OPENMC_LATTICES[lattice_id] = openmc_lattice From 147f2a162e7369f5559740f397a48a225e2cdf2a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 2 Oct 2015 17:43:33 -0400 Subject: [PATCH 243/519] Updates to OpenCG compatibility module to reflect move to PEP8 compliance --- openmc/opencg_compatible.py | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index b41a621b40..000801ca2a 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -467,25 +467,25 @@ def get_opencg_cell(openmc_cell): fill = openmc_cell.fill - if (openmc_cell.type == 'normal'): - opencg_cell.setFill(get_opencg_material(fill)) - elif (openmc_cell.type == 'fill'): - opencg_cell.setFill(get_opencg_universe(fill)) + if (openmc_cell.fill_type == 'material'): + opencg_cell.fill = get_opencg_material(fill) + elif (openmc_cell.fill_type == 'universe'): + opencg_cell.fill = get_opencg_universe(fill) else: - opencg_cell.setFill(get_opencg_lattice(fill)) + opencg_cell.fill = get_opencg_lattice(fill) if openmc_cell.rotation is not None: - opencg_cell.setRotation(openmc_cell.rotation) + opencg_cell.rotation = openmc_cell.rotation if openmc_cell.translation is not None: - opencg_cell.setTranslation(openmc_cell.translation) + opencg_cell.translation = openmc_cell.translation surfaces = openmc_cell.surfaces for surface_id in surfaces: surface = surfaces[surface_id][0] halfspace = surfaces[surface_id][1] - opencg_cell.addSurface(get_opencg_surface(surface), halfspace) + opencg_cell.add_surface(get_opencg_surface(surface), halfspace) # Add the OpenMC Cell to the global collection of all OpenMC Cells OPENMC_CELLS[cell_id] = openmc_cell @@ -546,10 +546,10 @@ def get_compatible_opencg_cells(opencg_cell, opencg_surface, halfspace): # If Cell is inside SquarePrism, add "inside" of Surface halfspaces if halfspace == -1: - opencg_cell.addSurface(compatible_surfaces[0], +1) - opencg_cell.addSurface(compatible_surfaces[1], -1) - opencg_cell.addSurface(compatible_surfaces[2], +1) - opencg_cell.addSurface(compatible_surfaces[3], -1) + opencg_cell.add_surface(compatible_surfaces[0], +1) + opencg_cell.add_surface(compatible_surfaces[1], -1) + opencg_cell.add_surface(compatible_surfaces[2], +1) + opencg_cell.add_surface(compatible_surfaces[3], -1) compatible_cells.append(opencg_cell) # If Cell is outside SquarePrism, add "outside" of Surface halfspaces @@ -659,7 +659,7 @@ def make_opencg_cells_compatible(opencg_universe): opencg_universe.removeCell(opencg_cell) # Add the compatible OpenCG Cells to the Universe - opencg_universe.addCells(cells) + opencg_universe.add_cells(cells) # Make recursive call to look at the updated state of the # OpenCG Universe and return @@ -715,7 +715,7 @@ def get_openmc_cell(opencg_cell): if opencg_cell.translation: translation = np.asarray(opencg_cell.translation, dtype=np.float64) - openmc_cell.setTranslation(translation) + openmc_cell.translation = translation surfaces = opencg_cell.surfaces @@ -769,7 +769,7 @@ def get_opencg_universe(openmc_universe): for cell_id, openmc_cell in openmc_cells.items(): opencg_cell = get_opencg_cell(openmc_cell) - opencg_universe.addCell(opencg_cell) + opencg_universe.add_cell(opencg_cell) # Add the OpenMC Universe to the global collection of all OpenMC Universes OPENMC_UNIVERSES[universe_id] = openmc_universe @@ -892,14 +892,14 @@ def get_opencg_lattice(openmc_lattice): universe_array[z][y][x] = unique_universes[universe_id] opencg_lattice = opencg.Lattice(lattice_id, name) - opencg_lattice.setDimension(dimension) - opencg_lattice.setWidth(pitch) - opencg_lattice.setUniverses(universe_array) + opencg_lattice.dimension = dimension + opencg_lattice.width = pitch + opencg_lattice.universes = universe_array offset = np.array(lower_left, dtype=np.float64) - \ ((np.array(pitch, dtype=np.float64) * np.array(dimension, dtype=np.float64))) / -2.0 - opencg_lattice.setOffset(offset) + opencg_lattice.offset = offset # Add the OpenMC Lattice to the global collection of all OpenMC Lattices OPENMC_LATTICES[lattice_id] = openmc_lattice @@ -1015,8 +1015,8 @@ def get_opencg_geometry(openmc_geometry): opencg_root_universe = get_opencg_universe(openmc_root_universe) opencg_geometry = opencg.Geometry() - opencg_geometry.setRootUniverse(opencg_root_universe) - opencg_geometry.initializeCellOffsets() + opencg_geometry.root_universe = opencg_root_universe + opencg_geometry.initialize_cell_offsets() return opencg_geometry From 3d5840214df82cbea2fdc3f80215d82f587b73ad Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 2 Oct 2015 17:54:36 -0400 Subject: [PATCH 244/519] Move more tests to PythonAPI --- tests/test_score_MT/geometry.xml | 181 -- tests/test_score_MT/inputs_true.dat | 1 + tests/test_score_MT/materials.xml | 272 -- tests/test_score_MT/results_true.dat | 98 +- tests/test_score_MT/settings.xml | 19 - tests/test_score_MT/tallies.xml | 21 - tests/test_score_MT/test_score_MT.py | 29 +- tests/test_score_flux/geometry.xml | 181 -- tests/test_score_flux/inputs_true.dat | 1 + tests/test_score_flux/materials.xml | 272 -- tests/test_score_flux/results_true.dat | 74 +- tests/test_score_flux/settings.xml | 19 - tests/test_score_flux/tallies.xml | 21 - tests/test_score_flux/test_score_flux.py | 26 +- tests/test_score_flux_yn/geometry.xml | 181 -- tests/test_score_flux_yn/inputs_true.dat | 1 + tests/test_score_flux_yn/materials.xml | 272 -- tests/test_score_flux_yn/results_true.dat | 2607 ++++++++--------- tests/test_score_flux_yn/settings.xml | 19 - tests/test_score_flux_yn/tallies.xml | 26 - .../test_score_flux_yn/test_score_flux_yn.py | 26 +- tests/test_score_kappafission/geometry.xml | 181 -- tests/test_score_kappafission/inputs_true.dat | 1 + tests/test_score_kappafission/materials.xml | 272 -- .../test_score_kappafission/results_true.dat | 26 +- tests/test_score_kappafission/settings.xml | 19 - tests/test_score_kappafission/tallies.xml | 21 - .../test_score_kappafission.py | 26 +- tests/test_score_nufission/geometry.xml | 181 -- tests/test_score_nufission/inputs_true.dat | 1 + tests/test_score_nufission/materials.xml | 272 -- tests/test_score_nufission/results_true.dat | 26 +- tests/test_score_nufission/settings.xml | 19 - tests/test_score_nufission/tallies.xml | 21 - .../test_score_nufission.py | 26 +- tests/test_score_nuscatter/geometry.xml | 181 -- tests/test_score_nuscatter/inputs_true.dat | 1 + tests/test_score_nuscatter/materials.xml | 272 -- tests/test_score_nuscatter/results_true.dat | 14 +- tests/test_score_nuscatter/settings.xml | 19 - tests/test_score_nuscatter/tallies.xml | 9 - .../test_score_nuscatter.py | 23 +- tests/test_score_nuscatter_n/geometry.xml | 181 -- tests/test_score_nuscatter_n/inputs_true.dat | 1 + tests/test_score_nuscatter_n/materials.xml | 272 -- tests/test_score_nuscatter_n/results_true.dat | 62 +- tests/test_score_nuscatter_n/settings.xml | 19 - tests/test_score_nuscatter_n/tallies.xml | 9 - .../test_score_nuscatter_n.py | 27 +- tests/test_score_nuscatter_pn/geometry.xml | 181 -- tests/test_score_nuscatter_pn/inputs_true.dat | 1 + tests/test_score_nuscatter_pn/materials.xml | 272 -- .../test_score_nuscatter_pn/results_true.dat | 42 +- tests/test_score_nuscatter_pn/settings.xml | 19 - tests/test_score_nuscatter_pn/tallies.xml | 14 - .../test_score_nuscatter_pn.py | 31 +- tests/test_score_nuscatter_yn/geometry.xml | 181 -- tests/test_score_nuscatter_yn/inputs_true.dat | 1 + tests/test_score_nuscatter_yn/materials.xml | 272 -- .../test_score_nuscatter_yn/results_true.dat | 70 +- tests/test_score_nuscatter_yn/settings.xml | 19 - tests/test_score_nuscatter_yn/tallies.xml | 14 - .../test_score_nuscatter_yn.py | 27 +- tests/test_score_scatter/geometry.xml | 181 -- tests/test_score_scatter/inputs_true.dat | 1 + tests/test_score_scatter/materials.xml | 272 -- tests/test_score_scatter/results_true.dat | 38 +- tests/test_score_scatter/settings.xml | 19 - tests/test_score_scatter/tallies.xml | 21 - .../test_score_scatter/test_score_scatter.py | 26 +- tests/test_score_scatter_n/geometry.xml | 181 -- tests/test_score_scatter_n/inputs_true.dat | 1 + tests/test_score_scatter_n/materials.xml | 272 -- tests/test_score_scatter_n/results_true.dat | 62 +- tests/test_score_scatter_n/settings.xml | 19 - tests/test_score_scatter_n/tallies.xml | 9 - .../test_score_scatter_n.py | 27 +- tests/test_score_scatter_pn/geometry.xml | 181 -- tests/test_score_scatter_pn/inputs_true.dat | 1 + tests/test_score_scatter_pn/materials.xml | 272 -- tests/test_score_scatter_pn/results_true.dat | 42 +- tests/test_score_scatter_pn/settings.xml | 19 - tests/test_score_scatter_pn/tallies.xml | 14 - .../test_score_scatter_pn.py | 32 +- tests/test_score_scatter_yn/geometry.xml | 181 -- tests/test_score_scatter_yn/inputs_true.dat | 1 + tests/test_score_scatter_yn/materials.xml | 272 -- tests/test_score_scatter_yn/results_true.dat | 106 +- tests/test_score_scatter_yn/settings.xml | 19 - tests/test_score_scatter_yn/tallies.xml | 15 - .../test_score_scatter_yn.py | 28 +- tests/test_score_total/geometry.xml | 181 -- tests/test_score_total/inputs_true.dat | 1 + tests/test_score_total/materials.xml | 272 -- tests/test_score_total/results_true.dat | 38 +- tests/test_score_total/settings.xml | 19 - tests/test_score_total/tallies.xml | 21 - tests/test_score_total/test_score_total.py | 26 +- tests/test_score_total_yn/geometry.xml | 181 -- tests/test_score_total_yn/inputs_true.dat | 1 + tests/test_score_total_yn/materials.xml | 272 -- tests/test_score_total_yn/results_true.dat | 1607 +++++----- tests/test_score_total_yn/settings.xml | 19 - tests/test_score_total_yn/tallies.xml | 29 - .../test_score_total_yn.py | 28 +- 105 files changed, 2838 insertions(+), 9842 deletions(-) delete mode 100644 tests/test_score_MT/geometry.xml create mode 100644 tests/test_score_MT/inputs_true.dat delete mode 100644 tests/test_score_MT/materials.xml delete mode 100644 tests/test_score_MT/settings.xml delete mode 100644 tests/test_score_MT/tallies.xml delete mode 100644 tests/test_score_flux/geometry.xml create mode 100644 tests/test_score_flux/inputs_true.dat delete mode 100644 tests/test_score_flux/materials.xml delete mode 100644 tests/test_score_flux/settings.xml delete mode 100644 tests/test_score_flux/tallies.xml delete mode 100644 tests/test_score_flux_yn/geometry.xml create mode 100644 tests/test_score_flux_yn/inputs_true.dat delete mode 100644 tests/test_score_flux_yn/materials.xml delete mode 100644 tests/test_score_flux_yn/settings.xml delete mode 100644 tests/test_score_flux_yn/tallies.xml delete mode 100644 tests/test_score_kappafission/geometry.xml create mode 100644 tests/test_score_kappafission/inputs_true.dat delete mode 100644 tests/test_score_kappafission/materials.xml delete mode 100644 tests/test_score_kappafission/settings.xml delete mode 100644 tests/test_score_kappafission/tallies.xml delete mode 100644 tests/test_score_nufission/geometry.xml create mode 100644 tests/test_score_nufission/inputs_true.dat delete mode 100644 tests/test_score_nufission/materials.xml delete mode 100644 tests/test_score_nufission/settings.xml delete mode 100644 tests/test_score_nufission/tallies.xml delete mode 100644 tests/test_score_nuscatter/geometry.xml create mode 100644 tests/test_score_nuscatter/inputs_true.dat delete mode 100644 tests/test_score_nuscatter/materials.xml delete mode 100644 tests/test_score_nuscatter/settings.xml delete mode 100644 tests/test_score_nuscatter/tallies.xml delete mode 100644 tests/test_score_nuscatter_n/geometry.xml create mode 100644 tests/test_score_nuscatter_n/inputs_true.dat delete mode 100644 tests/test_score_nuscatter_n/materials.xml delete mode 100644 tests/test_score_nuscatter_n/settings.xml delete mode 100644 tests/test_score_nuscatter_n/tallies.xml delete mode 100644 tests/test_score_nuscatter_pn/geometry.xml create mode 100644 tests/test_score_nuscatter_pn/inputs_true.dat delete mode 100644 tests/test_score_nuscatter_pn/materials.xml delete mode 100644 tests/test_score_nuscatter_pn/settings.xml delete mode 100644 tests/test_score_nuscatter_pn/tallies.xml delete mode 100644 tests/test_score_nuscatter_yn/geometry.xml create mode 100644 tests/test_score_nuscatter_yn/inputs_true.dat delete mode 100644 tests/test_score_nuscatter_yn/materials.xml delete mode 100644 tests/test_score_nuscatter_yn/settings.xml delete mode 100644 tests/test_score_nuscatter_yn/tallies.xml delete mode 100644 tests/test_score_scatter/geometry.xml create mode 100644 tests/test_score_scatter/inputs_true.dat delete mode 100644 tests/test_score_scatter/materials.xml delete mode 100644 tests/test_score_scatter/settings.xml delete mode 100644 tests/test_score_scatter/tallies.xml delete mode 100644 tests/test_score_scatter_n/geometry.xml create mode 100644 tests/test_score_scatter_n/inputs_true.dat delete mode 100644 tests/test_score_scatter_n/materials.xml delete mode 100644 tests/test_score_scatter_n/settings.xml delete mode 100644 tests/test_score_scatter_n/tallies.xml delete mode 100644 tests/test_score_scatter_pn/geometry.xml create mode 100644 tests/test_score_scatter_pn/inputs_true.dat delete mode 100644 tests/test_score_scatter_pn/materials.xml delete mode 100644 tests/test_score_scatter_pn/settings.xml delete mode 100644 tests/test_score_scatter_pn/tallies.xml delete mode 100644 tests/test_score_scatter_yn/geometry.xml create mode 100644 tests/test_score_scatter_yn/inputs_true.dat delete mode 100644 tests/test_score_scatter_yn/materials.xml delete mode 100644 tests/test_score_scatter_yn/settings.xml delete mode 100644 tests/test_score_scatter_yn/tallies.xml delete mode 100644 tests/test_score_total/geometry.xml create mode 100644 tests/test_score_total/inputs_true.dat delete mode 100644 tests/test_score_total/materials.xml delete mode 100644 tests/test_score_total/settings.xml delete mode 100644 tests/test_score_total/tallies.xml delete mode 100644 tests/test_score_total_yn/geometry.xml create mode 100644 tests/test_score_total_yn/inputs_true.dat delete mode 100644 tests/test_score_total_yn/materials.xml delete mode 100644 tests/test_score_total_yn/settings.xml delete mode 100644 tests/test_score_total_yn/tallies.xml diff --git a/tests/test_score_MT/geometry.xml b/tests/test_score_MT/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_MT/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_MT/inputs_true.dat b/tests/test_score_MT/inputs_true.dat new file mode 100644 index 0000000000..b78dd8061f --- /dev/null +++ b/tests/test_score_MT/inputs_true.dat @@ -0,0 +1 @@ +5bf02c7821f3a428d780a95fcffc5873d3ff025f77e511a8bc4d35551bfa8ff1bf95b3d177971fe55f6b58133f303fe7003054125f396bd56c1924a852ff4681 \ No newline at end of file diff --git a/tests/test_score_MT/materials.xml b/tests/test_score_MT/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_MT/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index 4b1c1af26c..dc3dce006a 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -9,30 +9,30 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.261679E-03 -2.310296E-05 -6.261679E-03 -2.310296E-05 -3.434524E-01 -2.482946E-02 -1.059004E+00 -2.432555E-01 -3.828838E-04 -9.365499E-08 -3.828838E-04 -9.365499E-08 -3.226036E-02 -2.229037E-04 -1.450446E-02 -4.382852E-05 -8.650696E-08 -7.483455E-15 -8.650696E-08 -7.483455E-15 -7.312640E-05 -2.080857E-09 -6.101318E-02 -8.452067E-04 +4.549173E-03 +1.042847E-05 +4.549173E-03 +1.042847E-05 +5.349258E-01 +5.819756E-02 +1.771520E+00 +6.368768E-01 +2.840231E-04 +7.989175E-08 +2.840231E-04 +7.989175E-08 +4.456152E-02 +4.011605E-04 +3.237732E-02 +2.535641E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.260440E-05 +2.080213E-09 +9.514028E-02 +1.832676E-03 tally 2: 0.000000E+00 0.000000E+00 @@ -46,16 +46,16 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -3.000000E-01 -2.440000E-02 +5.700000E-01 +6.530000E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.000000E-02 -6.000000E-04 +5.000000E-02 +1.100000E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -75,27 +75,27 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -5.724026E-03 -1.684945E-05 -5.724026E-03 -1.684945E-05 -3.250298E-01 -2.370870E-02 -1.083784E+00 -2.568556E-01 -4.449887E-05 -1.980149E-09 -4.449887E-05 -1.980149E-09 -3.526275E-02 -2.863085E-04 -1.417358E-02 -4.375519E-05 +7.477762E-03 +3.606695E-05 +7.477762E-03 +3.606695E-05 +5.749995E-01 +6.679702E-02 +1.748150E+00 +6.191138E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -5.106469E-05 -8.605176E-10 -6.204277E-02 -8.555398E-04 +4.201948E-02 +3.812116E-04 +2.128743E-02 +1.104373E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.503792E-04 +7.112750E-09 +9.209675E-02 +1.724470E-03 diff --git a/tests/test_score_MT/settings.xml b/tests/test_score_MT/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_MT/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_MT/tallies.xml b/tests/test_score_MT/tallies.xml deleted file mode 100644 index 5e66ae929e..0000000000 --- a/tests/test_score_MT/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - n2n 16 51 102 - - - - - n2n 16 51 102 - analog - - - - - n2n 16 51 102 - collision - - - diff --git a/tests/test_score_MT/test_score_MT.py b/tests/test_score_MT/test_score_MT.py index 1777db993e..d1a9b99cd8 100644 --- a/tests/test_score_MT/test_score_MT.py +++ b/tests/test_score_MT/test_score_MT.py @@ -2,9 +2,34 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreMTTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('n2n') for t in tallies] + [t.add_score('16') for t in tallies] + [t.add_score('51') for t in tallies] + [t.add_score('102') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreMTTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_flux/geometry.xml b/tests/test_score_flux/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_flux/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_flux/inputs_true.dat b/tests/test_score_flux/inputs_true.dat new file mode 100644 index 0000000000..d56fdcb9a7 --- /dev/null +++ b/tests/test_score_flux/inputs_true.dat @@ -0,0 +1 @@ +6f1f560fb5830abea765a6ee6a2d5762f6107398e7ec6adf136d718846ca9b73b00f3e1b73a3433cf812532def4cd614e251d7c40b0d4e0e38f47c4a44d08b8b \ No newline at end of file diff --git a/tests/test_score_flux/materials.xml b/tests/test_score_flux/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_flux/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_flux/results_true.dat b/tests/test_score_flux/results_true.dat index 31ca238d48..575b8ff178 100644 --- a/tests/test_score_flux/results_true.dat +++ b/tests/test_score_flux/results_true.dat @@ -1,41 +1,41 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -3.224218E+01 -2.217821E+02 -1.079687E+01 -2.494701E+01 -5.252579E+01 -5.951604E+02 -3.325822E+01 -2.414028E+02 -1.145800E+01 -2.880575E+01 -5.605671E+01 -6.804062E+02 +5.010477E+01 +5.039958E+02 +1.732466E+01 +6.033456E+01 +8.428445E+01 +1.425022E+03 +1.357577E+01 +3.704803E+01 +4.758922E+00 +4.591527E+00 +2.297418E+01 +1.067445E+02 tally 2: -3.077754E+01 -2.017424E+02 -1.172238E+01 -3.139127E+01 -5.231699E+01 -5.870469E+02 -3.259142E+01 -2.336719E+02 -1.040924E+01 -2.432332E+01 -5.709679E+01 -6.978668E+02 +5.188799E+01 +5.402176E+02 +1.593914E+01 +5.169154E+01 +8.557014E+01 +1.465192E+03 +1.427596E+01 +4.078276E+01 +4.943558E+00 +5.054633E+00 +2.194332E+01 +9.737940E+01 tally 3: -3.077754E+01 -2.017424E+02 -1.172238E+01 -3.139127E+01 -5.231699E+01 -5.870469E+02 -3.259142E+01 -2.336719E+02 -1.040924E+01 -2.432332E+01 -5.709679E+01 -6.978668E+02 +5.188799E+01 +5.402176E+02 +1.593914E+01 +5.169154E+01 +8.557014E+01 +1.465192E+03 +1.427596E+01 +4.078276E+01 +4.943558E+00 +5.054633E+00 +2.194332E+01 +9.737940E+01 diff --git a/tests/test_score_flux/settings.xml b/tests/test_score_flux/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_flux/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_flux/tallies.xml b/tests/test_score_flux/tallies.xml deleted file mode 100644 index bcde40c75d..0000000000 --- a/tests/test_score_flux/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - flux - - - - - flux - analog - - - - - flux - collision - - - diff --git a/tests/test_score_flux/test_score_flux.py b/tests/test_score_flux/test_score_flux.py index 1777db993e..94a034758d 100644 --- a/tests/test_score_flux/test_score_flux.py +++ b/tests/test_score_flux/test_score_flux.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreFluxTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27, 28, 29)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('flux') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreFluxTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_flux_yn/geometry.xml b/tests/test_score_flux_yn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_flux_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_flux_yn/inputs_true.dat b/tests/test_score_flux_yn/inputs_true.dat new file mode 100644 index 0000000000..b4d82f71eb --- /dev/null +++ b/tests/test_score_flux_yn/inputs_true.dat @@ -0,0 +1 @@ +7436214ee6931cdc4e8cf00a35f67c60280187fd6989a2ba3e8d51215e585cfc5cae41d5bab63176e306bcaf16e425f0b36bb8241a063f35ef36df2410bdf86a \ No newline at end of file diff --git a/tests/test_score_flux_yn/materials.xml b/tests/test_score_flux_yn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_flux_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 937f810ea6..78ee844771 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -1,1314 +1,1301 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -3.224218E+01 -2.217821E+02 -1.079687E+01 -2.494701E+01 -5.252579E+01 -5.951604E+02 -3.325822E+01 -2.414028E+02 -1.145800E+01 -2.880575E+01 -5.605671E+01 -6.804062E+02 +5.010477E+01 +5.039958E+02 +2.176053E-01 +4.865261E-01 +-1.086984E+00 +1.047217E+00 +-4.795412E-01 +1.558959E-01 +-5.701504E-01 +1.292349E-01 +-5.368919E-01 +9.576579E-02 +-9.479107E-01 +2.504916E-01 +1.224897E-01 +4.670746E-01 +8.535124E-01 +5.228963E-01 +-1.992643E-01 +7.139374E-02 +-5.251275E-01 +1.407419E-01 +4.161764E-01 +8.583663E-02 +1.900003E-01 +6.274903E-02 +1.756301E-01 +6.672692E-02 +8.899097E-01 +2.932284E-01 +1.829964E-01 +1.780842E-01 +3.128622E-02 +1.040374E-01 +-2.048946E-01 +7.820016E-02 +-1.770632E-01 +4.339147E-02 +3.158973E-02 +1.032146E-01 +-2.632637E-01 +1.069343E-01 +4.191749E-01 +7.076456E-02 +-2.010288E-01 +3.814062E-02 +1.087619E-01 +2.328146E-02 +-2.966642E-01 +7.687789E-02 +2.042266E-01 +3.305349E-02 +-2.931179E-01 +6.178212E-02 +-5.521659E-01 +1.525784E-01 +-1.344386E-01 +1.983161E-01 +-1.636737E-01 +1.164849E-01 +5.187003E-01 +1.397304E-01 +2.399050E-01 +2.860510E-01 +2.967924E-01 +1.035081E-01 +-7.005240E-02 +2.007454E-02 +3.237492E-02 +2.506195E-02 +-6.959898E-02 +7.999033E-02 +1.732466E+01 +6.033456E+01 +3.107535E-02 +4.649239E-02 +-3.970747E-01 +9.427351E-02 +-1.123739E-01 +1.390365E-02 +-2.898450E-02 +3.902114E-03 +-2.631777E-01 +1.693614E-02 +-3.010145E-01 +2.549605E-02 +3.897172E-02 +3.337532E-02 +2.061855E-01 +5.566838E-02 +-6.067592E-02 +1.537371E-02 +-1.412859E-01 +1.026936E-02 +2.971338E-01 +2.017773E-02 +2.229947E-01 +2.097948E-02 +-6.075875E-03 +1.442041E-02 +2.389356E-01 +2.418354E-02 +4.914702E-02 +1.401262E-02 +-8.942816E-02 +1.285068E-02 +-1.041318E-01 +8.815681E-03 +-8.589408E-02 +4.120018E-03 +-7.343529E-02 +1.344074E-02 +4.450570E-02 +9.667309E-03 +1.602555E-01 +1.139203E-02 +1.567487E-02 +6.127441E-03 +5.173147E-02 +7.550481E-03 +-1.719948E-01 +7.484666E-03 +7.675999E-02 +5.875577E-03 +-5.024191E-02 +1.070000E-02 +-1.702066E-01 +1.443420E-02 +-3.419759E-02 +2.637248E-02 +4.600843E-02 +1.078680E-02 +2.458398E-01 +2.682601E-02 +-3.085412E-02 +2.243953E-02 +1.178334E-01 +8.380493E-03 +-8.449310E-02 +2.905176E-03 +-1.512034E-02 +3.692235E-03 +7.089635E-03 +4.536425E-03 +8.428445E+01 +1.425022E+03 +-1.362036E-01 +4.955117E-01 +-2.368550E+00 +1.691161E+00 +-7.107734E-01 +8.353526E-01 +-6.040498E-01 +1.849927E-01 +-7.580790E-01 +2.328322E-01 +-2.827702E-01 +4.902552E-01 +2.263047E-01 +4.920612E-01 +1.086735E+00 +1.264217E+00 +-2.674729E-01 +1.812824E-01 +-9.480041E-01 +3.494658E-01 +1.131279E+00 +4.394262E-01 +6.028149E-01 +7.611055E-01 +-4.226627E-01 +9.934511E-02 +4.674984E-01 +4.988034E-01 +4.404050E-01 +2.451286E-01 +9.924713E-02 +2.916276E-01 +-5.691463E-01 +1.499514E-01 +3.042408E-02 +1.223962E-01 +9.963351E-03 +1.056905E-01 +7.166813E-01 +1.498011E-01 +3.740392E-01 +2.456929E-01 +-9.657707E-02 +1.698541E-01 +2.079664E-01 +1.965244E-01 +-1.119856E+00 +3.770763E-01 +2.039849E-01 +8.304410E-02 +-4.199012E-01 +2.410734E-01 +-6.791470E-01 +2.497291E-01 +2.416848E-01 +5.299837E-01 +8.546582E-02 +4.898367E-02 +4.674386E-01 +2.280610E-01 +3.594172E-01 +5.739204E-01 +4.972395E-01 +2.816960E-01 +-4.736196E-01 +7.973237E-02 +-1.484500E-01 +8.763644E-02 +1.318617E-02 +1.581561E-01 +1.357577E+01 +3.704803E+01 +3.384888E-03 +1.080209E-01 +2.872142E-01 +1.224352E-01 +2.863822E-01 +1.491797E-01 +-1.972755E-01 +3.885966E-02 +2.015479E-02 +3.471051E-02 +2.173233E-01 +6.336006E-02 +-2.432345E-01 +9.646809E-02 +3.387966E-02 +3.753576E-02 +1.185678E-01 +1.112748E-02 +-7.895500E-02 +3.265370E-02 +-2.546256E-01 +5.142289E-02 +-4.647286E-02 +1.740042E-02 +-2.660905E-01 +4.717290E-02 +-1.510244E-01 +2.742362E-02 +1.058091E-01 +2.185823E-02 +2.153774E-01 +1.729585E-02 +-4.988894E-02 +2.207988E-02 +-4.352527E-02 +1.760359E-02 +1.436143E-02 +2.593599E-02 +-2.352747E-01 +1.960774E-02 +-2.822795E-01 +3.249990E-02 +-7.774355E-02 +9.008554E-03 +1.239406E-01 +2.331185E-02 +-2.880954E-01 +4.411740E-02 +-2.049660E-02 +2.503723E-02 +3.213790E-02 +3.867984E-02 +1.371693E-01 +4.194468E-02 +2.551557E-02 +4.767256E-02 +-1.191569E-01 +3.416422E-02 +-3.330294E-01 +3.474803E-02 +-1.842925E-01 +4.126454E-02 +-1.224990E-02 +1.230302E-02 +1.544261E-01 +8.671624E-03 +-2.122959E-01 +6.350218E-02 +-2.914181E-01 +3.809905E-02 +4.758922E+00 +4.591527E+00 +-6.067377E-02 +6.804346E-03 +1.316435E-01 +1.476493E-02 +1.867152E-01 +1.538802E-02 +-7.179389E-02 +3.473818E-03 +4.986417E-02 +4.841351E-03 +6.776718E-02 +8.811355E-03 +-4.792045E-02 +9.184441E-03 +-8.434738E-03 +3.853397E-03 +2.548586E-02 +7.203200E-04 +7.527437E-03 +2.037011E-03 +-2.163081E-02 +4.158974E-03 +-8.760026E-02 +5.772134E-03 +-7.520795E-02 +4.970576E-03 +-3.964671E-02 +1.497841E-03 +7.221753E-02 +5.863209E-03 +4.932819E-02 +2.532767E-03 +-9.734545E-03 +1.795577E-03 +-7.011235E-02 +2.210883E-03 +2.399198E-02 +4.136626E-03 +-3.191172E-04 +1.877929E-03 +-9.710977E-02 +5.285483E-03 +-4.824457E-02 +3.483504E-03 +7.075225E-02 +3.161643E-03 +-8.040602E-02 +5.499063E-03 +-1.607824E-02 +4.903695E-03 +3.492398E-02 +5.092265E-03 +-1.006502E-02 +3.910353E-03 +1.573863E-02 +6.305496E-03 +-3.123873E-02 +3.823757E-03 +-7.909433E-02 +1.715877E-03 +-7.160670E-02 +1.015353E-02 +-4.496969E-02 +1.852488E-03 +6.430477E-02 +1.306442E-03 +-3.397473E-02 +9.427230E-03 +-1.245838E-01 +4.976908E-03 +2.297418E+01 +1.067445E+02 +3.798346E-02 +3.290807E-01 +4.774316E-01 +1.652719E-01 +4.484246E-01 +1.838690E-01 +-2.684741E-01 +1.314460E-01 +1.697264E-01 +1.010791E-01 +5.566969E-01 +1.619332E-01 +-1.922269E-01 +1.622489E-01 +-2.094814E-01 +6.127647E-02 +3.104826E-02 +6.793969E-02 +4.360087E-02 +4.949024E-02 +-2.391312E-01 +9.061066E-02 +-2.985719E-01 +5.766047E-02 +-4.703235E-01 +1.110755E-01 +-2.651010E-01 +7.292117E-02 +1.640899E-01 +7.843023E-02 +4.369130E-01 +7.815370E-02 +2.842619E-02 +3.428084E-02 +-2.196648E-01 +4.603142E-02 +-1.710839E-01 +1.096328E-01 +-1.574989E-02 +2.927805E-02 +-1.811474E-01 +8.048153E-02 +-2.781610E-01 +1.252087E-01 +5.703734E-02 +4.910322E-02 +-3.299004E-01 +1.018308E-01 +-1.639460E-01 +1.231675E-01 +1.411391E-01 +8.293452E-02 +2.675276E-02 +7.910978E-02 +-4.464321E-02 +1.158543E-01 +-1.929947E-01 +9.887250E-02 +-5.501938E-01 +9.398742E-02 +-4.386734E-01 +1.054327E-01 +-1.583625E-01 +9.952385E-03 +1.449942E-01 +7.975730E-03 +-1.797342E-01 +1.517262E-01 +-5.629679E-01 +8.574197E-02 tally 2: -3.224218E+01 -2.217821E+02 --4.524803E-01 -1.326110E-01 --2.725152E-01 -4.845463E-01 --4.030063E-01 -1.825349E-01 --2.145346E-01 -7.197305E-02 -2.488985E-01 -4.295894E-02 --6.797085E-01 -2.125889E-01 -1.698034E-01 -3.750580E-02 --6.596628E-02 -6.507545E-02 -4.519597E-02 -1.432412E-02 -6.227959E-01 -1.066624E-01 -2.328135E-01 -8.583522E-02 --8.899482E-01 -1.982834E-01 -3.269468E-01 -5.392549E-02 -1.684792E-01 -1.461138E-01 --2.026161E-01 -1.992812E-01 -2.599678E-01 -7.704699E-02 --3.329837E-01 -8.761827E-02 --5.287177E-01 -9.089410E-02 -3.666982E-01 -4.451200E-02 -2.096594E-01 -4.539545E-02 -2.091762E-01 -4.861771E-02 -1.476292E-01 -2.837569E-02 --4.091772E-01 -1.141307E-01 --1.652694E-01 -5.552090E-02 -8.207679E-02 -1.659512E-02 --1.203575E-01 -6.408952E-02 --8.219791E-03 -9.915873E-02 --3.768675E-02 -8.535079E-02 -1.305167E-01 -1.917693E-02 -1.823050E-01 -1.945159E-02 -2.999655E-01 -4.587948E-02 -3.687435E-01 -1.382795E-01 -1.220376E-01 -6.297901E-02 -3.899923E-01 -5.894393E-02 --1.878957E-02 -1.159448E-01 -1.079687E+01 -2.494701E+01 --1.067271E-01 -9.075462E-03 --2.571244E-02 -4.402172E-02 --3.646387E-02 -2.948533E-02 --1.043828E-01 -1.600528E-02 -4.361032E-02 -3.875958E-03 --3.096545E-01 -3.184604E-02 -8.723730E-02 -4.599654E-03 -6.541966E-03 -9.605866E-03 -5.837907E-02 -3.026784E-03 -1.523399E-01 -7.846764E-03 -2.778305E-02 -8.106935E-03 --2.895648E-01 -1.983532E-02 -4.866247E-02 -1.048055E-02 -2.600097E-02 -1.465465E-02 --6.958338E-02 -3.287519E-02 -1.690742E-01 -1.204714E-02 --1.127534E-01 -7.881362E-03 --1.662306E-01 -9.412057E-03 -1.674047E-01 -6.690449E-03 --4.370664E-02 -5.828314E-03 -9.323095E-02 -4.400433E-03 -1.353164E-02 -1.389416E-03 --1.062009E-01 -1.297730E-02 --5.331064E-02 -5.321055E-03 -7.698466E-02 -3.247975E-03 --2.095250E-02 -4.788058E-03 --8.861817E-03 -7.657174E-03 -1.769365E-02 -1.144058E-03 -1.788678E-02 -2.746804E-03 -4.403056E-03 -6.918351E-04 -1.059091E-01 -1.394217E-02 -1.442934E-01 -1.318500E-02 -2.199047E-02 -5.838245E-03 -8.175546E-02 -3.242012E-03 -7.359786E-03 -1.673277E-02 -5.252579E+01 -5.951604E+02 --8.293789E-01 -2.900775E-01 -6.285324E-01 -1.487344E+00 --4.765860E-01 -8.058451E-01 --3.101266E-01 -1.597231E-01 -3.333449E-01 -1.162003E-01 --1.314742E+00 -4.565068E-01 -4.726655E-01 -1.161194E-01 -2.824987E-01 -8.732802E-02 -1.025468E-01 -4.935830E-02 -4.216767E-01 -1.225700E-01 --4.022783E-02 -1.178843E-01 --7.967853E-01 -2.698001E-01 -3.741686E-01 -2.849501E-01 -3.377745E-01 -3.722806E-01 -9.234355E-02 -4.498496E-01 -8.019475E-01 -3.404218E-01 --3.086622E-01 -1.857604E-01 --8.474654E-01 -1.733363E-01 -8.124627E-01 -1.415201E-01 --3.075481E-01 -3.345921E-02 -7.126178E-01 -2.478330E-01 -2.983972E-01 -2.913106E-02 --6.759256E-01 -4.245338E-01 --3.491214E-01 -1.017784E-01 -1.637602E-01 -7.414687E-02 --3.344942E-01 -1.165491E-01 --6.038784E-02 -1.791698E-01 -2.645086E-01 -8.129446E-02 --2.738265E-01 -6.616303E-02 -1.135151E-02 -4.140154E-02 -4.679883E-01 -1.914750E-01 -2.876984E-01 -1.355086E-01 --2.741613E-01 -1.060457E-01 -5.972204E-01 -2.144153E-01 --9.215131E-02 -4.815135E-01 -3.325822E+01 -2.414028E+02 --3.072951E-02 -3.385901E-01 -9.729550E-01 -3.745599E-01 --5.237870E-01 -3.101477E-01 --5.994810E-01 -1.696123E-01 --3.402784E-01 -1.910685E-01 --3.779571E-01 -2.598004E-01 --4.804007E-01 -1.417261E-01 --5.444032E-01 -1.756801E-01 --9.921809E-02 -6.889191E-02 --3.768065E-01 -8.931168E-02 -5.814513E-02 -1.660714E-02 --1.263664E-01 -2.650287E-01 -1.951860E-01 -2.090892E-01 -3.576168E-01 -2.511782E-01 --9.547988E-02 -7.900044E-03 -5.460746E-01 -1.319868E-01 --1.577655E-01 -8.575762E-02 -2.938792E-02 -7.941653E-02 --7.505627E-01 -2.530444E-01 --2.399786E-01 -1.105633E-01 -2.035740E-01 -2.442135E-02 -1.190368E-01 -8.652216E-02 -5.753449E-01 -9.353813E-02 -4.911025E-01 -6.795258E-02 --2.967023E-03 -7.063512E-03 --2.158307E-01 -4.680921E-02 --1.811238E-01 -7.008450E-02 -1.809785E-01 -3.414843E-02 --1.380825E-01 -3.469381E-02 -3.722241E-01 -3.956589E-02 -2.064516E-01 -2.676312E-02 --3.889056E-01 -6.737109E-02 -1.625815E-01 -1.356347E-02 --5.278455E-01 -1.297993E-01 --1.269304E-02 -1.253029E-02 -1.145800E+01 -2.880575E+01 -6.201234E-02 -4.410457E-02 -2.694694E-01 -6.262339E-02 --1.173739E-01 -4.727885E-02 --1.785056E-01 -1.745391E-02 --4.744392E-02 -2.117667E-02 -3.998416E-02 -6.058339E-02 --1.927536E-01 -1.710512E-02 --1.800560E-01 -2.420071E-02 --1.136912E-01 -1.049357E-02 --1.104415E-01 -1.181394E-02 -3.486245E-02 -3.673104E-03 --8.343502E-02 -2.270299E-02 --3.064437E-02 -1.197968E-02 -1.912081E-01 -2.808487E-02 -2.601014E-02 -1.311244E-03 -1.295023E-01 -1.108983E-02 --1.158397E-01 -1.033182E-02 -8.316701E-02 -2.061897E-02 --1.136796E-01 -3.133021E-02 --1.722931E-02 -2.168654E-02 -1.464014E-01 -8.570818E-03 -5.859338E-02 -6.076029E-03 -1.776223E-01 -1.345571E-02 -1.582455E-01 -9.719314E-03 -9.088118E-03 -1.681557E-03 --6.298727E-02 -5.287397E-03 -5.793395E-03 -6.397495E-03 --1.835123E-02 -4.506573E-03 --7.558061E-02 -4.462082E-03 -3.136371E-02 -3.181332E-03 --2.787527E-02 -1.765822E-03 --9.878307E-02 -3.381183E-03 -1.279690E-01 -4.386067E-03 --1.043523E-01 -5.381331E-03 -1.000162E-02 -6.707280E-04 -5.605671E+01 -6.804062E+02 -1.431465E-01 -1.700768E+00 -2.010680E+00 -2.307036E+00 --5.276592E-01 -1.006050E+00 --9.123132E-01 -4.824313E-01 --3.276490E-01 -5.842232E-01 -6.749445E-02 -6.049661E-01 --1.317515E+00 -4.738014E-01 --9.470910E-01 -4.937085E-01 --3.338536E-01 -2.196164E-01 --3.032729E-01 -1.241029E-01 --3.285269E-01 -5.276607E-02 --4.107012E-01 -6.402858E-01 -3.357626E-01 -2.672801E-01 -1.000507E+00 -5.263322E-01 --1.834202E-01 -9.495434E-02 -8.133484E-01 -3.011488E-01 --4.083516E-01 -2.428630E-01 -4.032934E-01 -1.825835E-01 --8.291267E-01 -6.773284E-01 --2.401557E-01 -2.280331E-01 -4.325658E-01 -1.163540E-01 -6.671759E-02 -2.181769E-01 -6.984462E-01 -1.716985E-01 -7.108347E-01 -1.386394E-01 -1.709795E-01 -5.320122E-02 --2.354809E-01 -7.105363E-02 -1.600239E-01 -9.179874E-02 -2.802111E-02 -6.149546E-02 --4.005049E-01 -2.195356E-01 -7.914623E-01 -2.273026E-01 -3.392453E-01 -1.101813E-01 --7.821576E-01 -1.637944E-01 -4.736782E-01 -1.531480E-01 --5.253391E-01 -1.093913E-01 -2.235961E-01 -5.449263E-02 +5.188799E+01 +5.402176E+02 +-5.713505E-01 +4.615729E-01 +-3.761827E-01 +5.750500E-01 +8.374325E-01 +1.862938E-01 +-3.954940E-01 +2.347775E-01 +-6.290233E-01 +1.864254E-01 +-6.656201E-01 +2.124518E-01 +4.729571E-01 +6.739065E-01 +4.921338E-01 +1.907183E-01 +-3.988992E-01 +3.761412E-01 +-1.125861E-01 +3.659299E-01 +-1.283461E-01 +5.045920E-02 +1.101261E-02 +1.391469E-01 +4.286921E-01 +2.097120E-01 +5.360702E-01 +1.809190E-01 +8.470757E-01 +2.461922E-01 +-4.140592E-01 +2.702824E-01 +-2.269391E-02 +5.000308E-03 +-1.585595E-01 +3.527370E-02 +-9.890128E-02 +1.067921E-01 +3.153468E-02 +1.483763E-01 +6.967922E-02 +7.789031E-02 +2.040956E-01 +4.637270E-02 +-2.345641E-01 +3.574654E-01 +-1.500187E-01 +1.514334E-01 +-3.019192E-01 +1.334819E-01 +1.796739E-01 +7.106788E-02 +-2.120506E-01 +1.144496E-01 +-6.891611E-02 +7.257229E-02 +-2.306514E-01 +7.048631E-02 +7.800814E-01 +2.467831E-01 +2.790547E-02 +5.494857E-02 +-1.896182E-01 +5.971620E-02 +1.644354E-02 +1.059859E-01 +-7.792754E-02 +2.085845E-02 +-1.114682E-01 +1.227128E-01 +1.593914E+01 +5.169154E+01 +1.039804E+00 +5.028617E-01 +-7.912437E-01 +5.548318E-01 +2.575930E-01 +1.148260E-01 +-6.331302E-01 +2.556615E-01 +-1.712129E-01 +7.877790E-02 +-5.816921E-01 +1.456126E-01 +2.272958E-01 +8.788738E-02 +3.822477E-01 +6.244032E-02 +-2.999416E-01 +8.461810E-02 +-2.623060E-02 +1.458472E-02 +1.300437E-01 +4.478019E-02 +-4.767351E-02 +7.362462E-02 +7.928962E-02 +4.510319E-02 +3.500548E-03 +4.881244E-02 +-2.067837E-01 +8.186594E-02 +-3.825304E-01 +1.082951E-01 +-3.558676E-01 +5.708469E-02 +4.048126E-01 +9.076309E-02 +4.553585E-02 +2.926622E-02 +-1.294373E-01 +1.870238E-02 +-3.195745E-01 +5.918983E-02 +-5.541420E-02 +6.185102E-02 +2.517910E-01 +1.252247E-01 +-6.864842E-02 +8.483359E-02 +-3.087092E-02 +1.682640E-02 +-6.457777E-02 +2.980731E-02 +-3.360246E-01 +3.729711E-02 +-2.091466E-01 +1.119332E-01 +-4.226988E-01 +5.973848E-02 +-5.390062E-02 +1.424816E-01 +-2.955041E-02 +7.118983E-03 +3.100944E-01 +5.584902E-02 +-4.266659E-01 +4.397359E-02 +-3.155083E-01 +7.428242E-02 +5.282933E-02 +2.010740E-02 +8.557014E+01 +1.465192E+03 +-3.913589E-01 +5.368834E-01 +-2.113693E+00 +2.169443E+00 +2.298156E-01 +6.330809E-01 +1.449786E-01 +2.666314E-01 +-2.958820E-01 +2.750937E-01 +1.054389E+00 +5.351584E-01 +4.775640E-02 +2.044779E-01 +4.186858E-01 +8.940845E-01 +-6.035852E-02 +3.754000E-01 +-1.597608E+00 +5.815293E-01 +5.200807E-01 +3.829815E-01 +9.437855E-01 +7.241779E-01 +-5.232235E-01 +1.966074E-01 +2.872008E-01 +1.241395E+00 +-1.039246E+00 +6.158088E-01 +3.058638E-01 +1.593114E-01 +-5.132144E-01 +4.577375E-01 +6.727602E-01 +4.119990E-01 +3.280880E-01 +4.971028E-01 +7.837744E-01 +2.444483E-01 +7.686392E-01 +3.456688E-01 +-5.035943E-01 +1.631734E-01 +4.145045E-01 +3.177084E-01 +-1.924638E-01 +3.336696E-01 +-1.484767E-01 +9.030824E-02 +-2.393846E-01 +6.598721E-02 +-5.318081E-01 +2.895430E-01 +1.518564E-01 +3.818155E-01 +5.795851E-01 +9.003270E-02 +3.580512E-01 +8.821756E-02 +5.366649E-01 +2.497151E-01 +-3.347132E-01 +1.352062E-01 +4.567995E-01 +1.561741E-01 +-2.279100E-01 +2.122433E-01 +4.461881E-01 +2.325205E-01 +1.427596E+01 +4.078276E+01 +5.217165E-02 +2.453888E-02 +1.584690E-01 +3.106540E-01 +4.560315E-01 +4.277362E-01 +-1.990373E-02 +5.277850E-02 +1.125203E-02 +6.443927E-02 +3.308696E-01 +1.037411E-01 +-2.750414E-01 +3.814328E-02 +-2.758789E-01 +1.449907E-01 +-3.474494E-02 +1.886069E-02 +-3.638818E-03 +1.651468E-01 +-2.060159E-02 +3.031181E-02 +3.225892E-01 +7.944048E-02 +-3.922626E-01 +5.950804E-02 +-7.374795E-01 +1.624566E-01 +-1.467806E-02 +1.234636E-01 +8.061252E-02 +4.356030E-02 +-1.065107E-01 +1.431995E-02 +-2.455689E-01 +4.182386E-02 +-3.425697E-01 +1.088413E-01 +-9.867791E-03 +4.864904E-02 +-2.403769E-01 +2.231699E-02 +1.795461E-01 +2.969251E-02 +-1.516375E-01 +2.951230E-02 +-3.101470E-01 +7.377660E-02 +1.996325E-01 +1.846547E-02 +9.153483E-02 +2.867924E-02 +2.545349E-01 +4.621843E-02 +1.776575E-01 +1.075483E-01 +-2.561501E-01 +4.947817E-02 +-1.558585E-01 +1.467725E-02 +-1.530184E-01 +5.532615E-02 +-1.802320E-01 +1.603564E-02 +3.331892E-01 +3.315195E-02 +-1.878592E-01 +3.588542E-02 +-3.843863E-01 +1.011661E-01 +4.943558E+00 +5.054633E+00 +3.508923E-01 +5.360844E-02 +2.595623E-01 +3.819756E-02 +-2.524359E-01 +4.825078E-02 +-3.376117E-01 +4.115606E-02 +8.885054E-02 +3.685958E-02 +1.168333E-01 +5.916818E-02 +-1.993698E-01 +5.632369E-02 +3.988948E-01 +4.366034E-02 +1.021403E-01 +4.690526E-03 +-1.508432E-01 +2.173064E-02 +-2.407920E-01 +2.510560E-02 +-1.703993E-01 +2.599072E-02 +8.752998E-02 +3.657089E-02 +-1.269869E-02 +2.565400E-02 +2.026727E-01 +1.804748E-02 +-4.913307E-03 +4.059747E-02 +-2.554771E-02 +7.959679E-03 +-1.549008E-02 +3.658041E-02 +-9.294647E-02 +2.754890E-03 +2.566876E-02 +4.951779E-03 +-1.016212E-02 +2.777381E-02 +3.601396E-01 +3.828736E-02 +-8.923373E-03 +3.126410E-03 +8.722969E-02 +1.182345E-02 +-2.332024E-02 +5.685275E-03 +2.101415E-01 +1.224880E-02 +-9.619916E-03 +9.042453E-03 +-2.480871E-01 +2.222042E-02 +9.764734E-02 +4.847970E-03 +-1.623487E-01 +1.814336E-02 +5.091875E-02 +1.290604E-02 +7.192058E-02 +1.343350E-02 +-1.316640E-01 +3.514269E-02 +-9.198972E-02 +1.244138E-02 +-1.225056E-01 +3.035718E-02 +2.194332E+01 +9.737940E+01 +-3.052407E-01 +4.072957E-01 +3.531168E-02 +2.019382E-01 +8.793928E-01 +4.041664E-01 +-4.072462E-01 +6.027190E-02 +-8.907772E-02 +1.952922E-01 +9.519375E-02 +9.821752E-02 +3.205302E-01 +2.075134E-01 +1.124955E-01 +6.446089E-02 +-3.366117E-01 +8.184450E-02 +-3.676127E-02 +3.861064E-02 +2.001007E-01 +6.507942E-02 +-1.155787E-01 +4.761238E-02 +-2.779628E-01 +3.425225E-02 +1.099627E-01 +5.462866E-02 +-2.654341E-01 +1.868127E-02 +2.246854E-01 +3.157231E-02 +-1.422513E-01 +5.939434E-02 +-8.583155E-02 +5.668810E-02 +6.967936E-02 +1.924265E-02 +-2.246405E-03 +1.576409E-02 +7.321307E-02 +2.061990E-02 +-4.949248E-01 +1.278374E-01 +4.468760E-02 +3.814622E-02 +-9.398135E-02 +1.772831E-02 +-2.757022E-01 +1.349555E-01 +1.715161E-02 +5.040025E-02 +-1.682974E-01 +7.558363E-02 +-4.700401E-02 +2.700354E-02 +1.109855E-01 +2.666559E-02 +2.136115E-01 +7.786593E-02 +-2.089667E-01 +1.489893E-02 +-6.959959E-02 +7.545487E-02 +-3.296680E-02 +1.604995E-02 +-1.587440E-01 +5.482886E-02 +-3.203027E-01 +3.421361E-02 tally 3: -3.077754E+01 -2.017424E+02 --4.040800E-01 -5.606719E-01 --5.238239E-01 -4.460714E-01 -1.155164E-01 -1.686786E-01 --1.972294E-01 -2.912851E-01 -4.908524E-01 -1.374195E-01 --1.467088E-02 -1.080839E-01 -6.749037E-02 -1.397361E-01 -4.136479E-03 -9.237632E-02 --3.742305E-01 -9.917374E-02 -5.374208E-01 -2.530961E-01 -2.270996E-01 -9.415721E-02 --4.568867E-02 -1.277446E-01 -1.581716E-01 -6.217155E-02 -4.667840E-01 -1.143380E-01 -9.684270E-02 -7.302998E-02 -8.366629E-01 -1.797483E-01 --5.657893E-01 -2.553910E-01 --2.351441E-02 -4.395513E-02 -7.843306E-01 -1.466478E-01 -4.617856E-02 -1.154681E-02 -1.431343E-01 -3.531062E-02 -4.625825E-01 -6.235642E-02 --8.837342E-02 -6.231694E-02 --3.766755E-01 -6.412261E-02 -1.995226E-01 -1.743990E-01 --2.498625E-02 -8.897536E-02 --1.039315E-01 -1.868672E-01 -6.712910E-01 -2.084042E-01 -5.805639E-02 -4.049580E-02 -1.603677E-01 -4.280033E-02 -3.909878E-01 -7.726018E-02 -9.878354E-02 -4.630595E-02 --2.389983E-01 -3.528604E-02 -1.641046E-01 -1.669859E-01 --2.351986E-02 -1.048794E-02 -1.172238E+01 -3.139127E+01 --1.057733E+00 -2.820672E-01 -5.708838E-02 -6.224675E-02 -2.492981E-02 -1.827498E-01 --1.339268E-01 -1.968929E-02 -2.363867E-01 -3.028587E-02 --2.867841E-01 -2.680318E-02 --2.352784E-01 -1.895006E-02 -4.365572E-01 -1.883240E-01 --3.388837E-01 -7.209932E-02 -3.488374E-01 -6.640137E-02 --3.343893E-01 -4.149634E-02 --4.575314E-01 -7.461614E-02 -4.436881E-01 -1.325092E-01 -3.394853E-01 -2.987173E-02 --2.633936E-02 -6.171428E-02 -9.994191E-02 -6.447641E-02 --1.618840E-01 -3.497845E-02 --1.290678E-01 -3.735394E-02 -9.852126E-03 -2.963925E-02 --1.656539E-01 -4.190396E-02 --2.292763E-01 -7.045480E-02 --4.616824E-03 -1.926690E-02 --1.960839E-01 -1.396042E-02 --2.133526E-02 -5.189823E-02 -2.933136E-01 -5.721356E-02 --1.084914E-01 -2.448532E-02 --4.778583E-01 -7.644033E-02 -1.736901E-01 -6.630467E-02 --5.460801E-02 -1.510381E-02 -1.106093E-01 -1.590306E-02 -1.659501E-01 -5.983218E-02 -1.343781E-02 -2.751294E-02 -2.052693E-01 -3.478581E-02 --1.006298E-01 -1.815313E-02 --2.563766E-01 -3.045246E-02 -5.231699E+01 -5.870469E+02 --6.102587E-01 -5.930968E-01 -1.184182E+00 -1.364433E+00 --6.362263E-02 -8.852514E-01 --4.844978E-01 -1.751923E-01 -8.223413E-01 -2.436206E-01 --9.656506E-01 -3.513566E-01 -2.710494E-01 -7.170772E-01 -4.792482E-01 -2.551569E-01 --1.266077E-01 -2.824778E-01 -6.389964E-01 -2.501483E-01 -8.915816E-01 -3.557431E-01 --1.007448E+00 -5.743018E-01 -3.528444E-01 -2.428078E-01 --5.833000E-01 -3.733648E-01 --4.660289E-01 -6.567263E-02 -5.856088E-01 -2.336146E-01 -3.836351E-02 -7.665403E-02 --6.721211E-01 -2.651780E-01 -5.725993E-01 -2.101026E-01 --2.130594E-01 -1.855350E-02 -2.607168E-01 -1.564288E-01 --3.399382E-02 -3.067656E-02 --1.228976E+00 -6.554836E-01 --2.962235E-01 -1.808511E-01 -5.521675E-01 -1.722073E-01 --1.658751E-01 -1.994119E-02 --2.671896E-01 -1.343320E-01 --2.325282E-01 -4.677656E-02 --3.380310E-01 -1.703532E-01 --3.571853E-01 -1.140525E-01 -3.836770E-02 -8.586429E-02 -7.328263E-01 -1.567227E-01 -4.840110E-02 -2.718471E-02 -5.654783E-01 -3.645579E-01 --3.027585E-01 -1.407867E-01 -3.259142E+01 -2.336719E+02 -3.053294E-01 -2.086257E-01 --7.563597E-01 -2.816768E-01 --3.039288E-01 -2.855043E-01 --2.648323E-01 -1.883784E-01 -2.665933E-01 -1.782353E-01 -1.978960E-01 -1.419567E-01 -1.228712E-01 -1.913946E-01 --9.152681E-03 -1.324681E-01 --5.707326E-01 -1.092067E-01 -2.326858E-01 -6.731743E-02 --5.170241E-01 -1.353439E-01 --4.064026E-01 -9.715030E-02 --1.142031E-01 -7.748788E-02 -2.928039E-01 -2.716157E-01 --1.721186E-01 -1.447738E-01 -6.452116E-01 -1.821975E-01 --5.697276E-01 -1.047333E-01 --9.640967E-02 -1.139327E-01 --4.509832E-01 -2.079493E-01 --2.134684E-02 -2.907667E-01 --2.434868E-01 -1.235397E-01 -2.550330E-01 -2.979627E-01 -9.598615E-01 -3.140885E-01 -1.218430E-01 -6.283872E-02 -2.412915E-01 -1.907292E-02 --2.236667E-01 -4.379414E-02 -2.844474E-01 -2.965692E-02 -1.618860E-01 -8.293785E-03 --1.265583E-01 -4.515449E-02 -6.356127E-02 -1.358134E-02 --3.844886E-01 -8.600010E-02 --1.942739E-01 -7.516022E-02 -1.765511E-01 -3.522611E-02 --3.433188E-01 -3.456066E-02 --1.501983E-01 -5.633844E-02 -1.040924E+01 -2.432332E+01 --4.138270E-01 -1.309129E-01 --3.151106E-01 -1.286964E-01 -9.213222E-02 -6.189454E-02 --2.746107E-01 -8.103949E-02 --9.781742E-02 -3.783736E-02 --1.178371E-01 -3.242332E-02 --5.837932E-01 -2.059491E-01 --7.338223E-03 -8.012203E-02 -5.628994E-02 -2.190669E-02 -8.155585E-02 -1.039007E-01 -6.052048E-02 -4.339463E-02 --1.157646E-02 -1.839000E-02 --2.641673E-01 -4.737589E-02 --8.531135E-02 -5.432766E-02 -6.036555E-01 -1.190329E-01 --3.149976E-01 -5.735264E-02 --8.456340E-02 -4.563143E-03 -2.224065E-01 -6.600030E-02 -9.562392E-03 -1.843524E-02 --2.400599E-01 -3.182217E-02 --6.534941E-01 -1.180315E-01 -4.371157E-01 -9.076666E-02 -3.257455E-02 -2.936184E-02 --8.788428E-02 -1.923293E-02 --2.604776E-01 -3.660313E-02 --6.315350E-02 -1.503534E-02 -5.609294E-01 -8.783528E-02 --7.363672E-01 -1.789210E-01 -2.883575E-01 -6.478578E-02 --3.302954E-02 -1.517946E-02 --3.234157E-01 -4.418920E-02 -2.846318E-01 -2.712085E-02 --3.227536E-01 -5.062832E-02 -4.391474E-01 -5.548002E-02 -1.322988E-01 -2.995854E-02 -5.709679E+01 -6.978668E+02 -2.859201E-02 -1.094507E+00 -6.058587E-01 -6.079927E-01 -7.553798E-02 -1.131607E+00 --5.851206E-01 -1.215663E+00 -8.266012E-02 -9.031287E-01 --7.088368E-01 -3.984608E-01 --4.414986E-01 -1.502417E-01 -2.241998E-01 -3.228823E-01 --7.328574E-01 -2.430448E-01 --8.070160E-01 -1.767265E-01 --1.154449E-01 -8.739303E-03 --3.787161E-01 -4.728756E-01 --1.743577E-01 -1.091245E-01 -2.878137E-01 -2.724285E-01 -2.128994E-01 -4.440539E-01 -9.495567E-01 -3.622719E-01 -1.422950E-01 -5.309223E-02 -1.323659E-01 -1.911979E-01 --1.303752E-01 -5.710728E-01 --4.611294E-02 -4.086632E-02 -5.937879E-01 -1.006156E-01 --3.558925E-01 -2.998983E-01 -1.175971E+00 -5.323321E-01 -2.426485E-01 -1.497265E-01 -7.805090E-02 -5.060214E-02 --2.914577E-01 -2.233355E-01 -1.053098E-01 -6.693123E-02 -4.541315E-01 -1.328340E-01 --6.290732E-02 -8.910616E-02 -7.371592E-01 -1.980732E-01 -5.804701E-01 -1.711949E-01 --6.642202E-01 -1.131866E-01 -1.779818E-01 -6.530190E-02 --5.224739E-01 -2.534102E-01 --1.824905E-01 -2.910309E-02 -tally 4: -3.077754E+01 -2.017424E+02 --4.040800E-01 -5.606719E-01 --5.238239E-01 -4.460714E-01 -1.155164E-01 -1.686786E-01 --1.972294E-01 -2.912851E-01 -4.908524E-01 -1.374195E-01 --1.467088E-02 -1.080839E-01 -6.749037E-02 -1.397361E-01 -4.136479E-03 -9.237632E-02 --3.742305E-01 -9.917374E-02 -5.374208E-01 -2.530961E-01 -2.270996E-01 -9.415721E-02 --4.568867E-02 -1.277446E-01 -1.581716E-01 -6.217155E-02 -4.667840E-01 -1.143380E-01 -9.684270E-02 -7.302998E-02 -8.366629E-01 -1.797483E-01 --5.657893E-01 -2.553910E-01 --2.351441E-02 -4.395513E-02 -7.843306E-01 -1.466478E-01 -4.617856E-02 -1.154681E-02 -1.431343E-01 -3.531062E-02 -4.625825E-01 -6.235642E-02 --8.837342E-02 -6.231694E-02 --3.766755E-01 -6.412261E-02 -1.995226E-01 -1.743990E-01 --2.498625E-02 -8.897536E-02 --1.039315E-01 -1.868672E-01 -6.712910E-01 -2.084042E-01 -5.805639E-02 -4.049580E-02 -1.603677E-01 -4.280033E-02 -3.909878E-01 -7.726018E-02 -9.878354E-02 -4.630595E-02 --2.389983E-01 -3.528604E-02 -1.641046E-01 -1.669859E-01 --2.351986E-02 -1.048794E-02 -1.172238E+01 -3.139127E+01 --1.057733E+00 -2.820672E-01 -5.708838E-02 -6.224675E-02 -2.492981E-02 -1.827498E-01 --1.339268E-01 -1.968929E-02 -2.363867E-01 -3.028587E-02 --2.867841E-01 -2.680318E-02 --2.352784E-01 -1.895006E-02 -4.365572E-01 -1.883240E-01 --3.388837E-01 -7.209932E-02 -3.488374E-01 -6.640137E-02 --3.343893E-01 -4.149634E-02 --4.575314E-01 -7.461614E-02 -4.436881E-01 -1.325092E-01 -3.394853E-01 -2.987173E-02 --2.633936E-02 -6.171428E-02 -9.994191E-02 -6.447641E-02 --1.618840E-01 -3.497845E-02 --1.290678E-01 -3.735394E-02 -9.852126E-03 -2.963925E-02 --1.656539E-01 -4.190396E-02 --2.292763E-01 -7.045480E-02 --4.616824E-03 -1.926690E-02 --1.960839E-01 -1.396042E-02 --2.133526E-02 -5.189823E-02 -2.933136E-01 -5.721356E-02 --1.084914E-01 -2.448532E-02 --4.778583E-01 -7.644033E-02 -1.736901E-01 -6.630467E-02 --5.460801E-02 -1.510381E-02 -1.106093E-01 -1.590306E-02 -1.659501E-01 -5.983218E-02 -1.343781E-02 -2.751294E-02 -2.052693E-01 -3.478581E-02 --1.006298E-01 -1.815313E-02 --2.563766E-01 -3.045246E-02 -5.231699E+01 -5.870469E+02 --6.102587E-01 -5.930968E-01 -1.184182E+00 -1.364433E+00 --6.362263E-02 -8.852514E-01 --4.844978E-01 -1.751923E-01 -8.223413E-01 -2.436206E-01 --9.656506E-01 -3.513566E-01 -2.710494E-01 -7.170772E-01 -4.792482E-01 -2.551569E-01 --1.266077E-01 -2.824778E-01 -6.389964E-01 -2.501483E-01 -8.915816E-01 -3.557431E-01 --1.007448E+00 -5.743018E-01 -3.528444E-01 -2.428078E-01 --5.833000E-01 -3.733648E-01 --4.660289E-01 -6.567263E-02 -5.856088E-01 -2.336146E-01 -3.836351E-02 -7.665403E-02 --6.721211E-01 -2.651780E-01 -5.725993E-01 -2.101026E-01 --2.130594E-01 -1.855350E-02 -2.607168E-01 -1.564288E-01 --3.399382E-02 -3.067656E-02 --1.228976E+00 -6.554836E-01 --2.962235E-01 -1.808511E-01 -5.521675E-01 -1.722073E-01 --1.658751E-01 -1.994119E-02 --2.671896E-01 -1.343320E-01 --2.325282E-01 -4.677656E-02 --3.380310E-01 -1.703532E-01 --3.571853E-01 -1.140525E-01 -3.836770E-02 -8.586429E-02 -7.328263E-01 -1.567227E-01 -4.840110E-02 -2.718471E-02 -5.654783E-01 -3.645579E-01 --3.027585E-01 -1.407867E-01 -3.259142E+01 -2.336719E+02 -3.053294E-01 -2.086257E-01 --7.563597E-01 -2.816768E-01 --3.039288E-01 -2.855043E-01 --2.648323E-01 -1.883784E-01 -2.665933E-01 -1.782353E-01 -1.978960E-01 -1.419567E-01 -1.228712E-01 -1.913946E-01 --9.152681E-03 -1.324681E-01 --5.707326E-01 -1.092067E-01 -2.326858E-01 -6.731743E-02 --5.170241E-01 -1.353439E-01 --4.064026E-01 -9.715030E-02 --1.142031E-01 -7.748788E-02 -2.928039E-01 -2.716157E-01 --1.721186E-01 -1.447738E-01 -6.452116E-01 -1.821975E-01 --5.697276E-01 -1.047333E-01 --9.640967E-02 -1.139327E-01 --4.509832E-01 -2.079493E-01 --2.134684E-02 -2.907667E-01 --2.434868E-01 -1.235397E-01 -2.550330E-01 -2.979627E-01 -9.598615E-01 -3.140885E-01 -1.218430E-01 -6.283872E-02 -2.412915E-01 -1.907292E-02 --2.236667E-01 -4.379414E-02 -2.844474E-01 -2.965692E-02 -1.618860E-01 -8.293785E-03 --1.265583E-01 -4.515449E-02 -6.356127E-02 -1.358134E-02 --3.844886E-01 -8.600010E-02 --1.942739E-01 -7.516022E-02 -1.765511E-01 -3.522611E-02 --3.433188E-01 -3.456066E-02 --1.501983E-01 -5.633844E-02 -1.040924E+01 -2.432332E+01 --4.138270E-01 -1.309129E-01 --3.151106E-01 -1.286964E-01 -9.213222E-02 -6.189454E-02 --2.746107E-01 -8.103949E-02 --9.781742E-02 -3.783736E-02 --1.178371E-01 -3.242332E-02 --5.837932E-01 -2.059491E-01 --7.338223E-03 -8.012203E-02 -5.628994E-02 -2.190669E-02 -8.155585E-02 -1.039007E-01 -6.052048E-02 -4.339463E-02 --1.157646E-02 -1.839000E-02 --2.641673E-01 -4.737589E-02 --8.531135E-02 -5.432766E-02 -6.036555E-01 -1.190329E-01 --3.149976E-01 -5.735264E-02 --8.456340E-02 -4.563143E-03 -2.224065E-01 -6.600030E-02 -9.562392E-03 -1.843524E-02 --2.400599E-01 -3.182217E-02 --6.534941E-01 -1.180315E-01 -4.371157E-01 -9.076666E-02 -3.257455E-02 -2.936184E-02 --8.788428E-02 -1.923293E-02 --2.604776E-01 -3.660313E-02 --6.315350E-02 -1.503534E-02 -5.609294E-01 -8.783528E-02 --7.363672E-01 -1.789210E-01 -2.883575E-01 -6.478578E-02 --3.302954E-02 -1.517946E-02 --3.234157E-01 -4.418920E-02 -2.846318E-01 -2.712085E-02 --3.227536E-01 -5.062832E-02 -4.391474E-01 -5.548002E-02 -1.322988E-01 -2.995854E-02 -5.709679E+01 -6.978668E+02 -2.859201E-02 -1.094507E+00 -6.058587E-01 -6.079927E-01 -7.553798E-02 -1.131607E+00 --5.851206E-01 -1.215663E+00 -8.266012E-02 -9.031287E-01 --7.088368E-01 -3.984608E-01 --4.414986E-01 -1.502417E-01 -2.241998E-01 -3.228823E-01 --7.328574E-01 -2.430448E-01 --8.070160E-01 -1.767265E-01 --1.154449E-01 -8.739303E-03 --3.787161E-01 -4.728756E-01 --1.743577E-01 -1.091245E-01 -2.878137E-01 -2.724285E-01 -2.128994E-01 -4.440539E-01 -9.495567E-01 -3.622719E-01 -1.422950E-01 -5.309223E-02 -1.323659E-01 -1.911979E-01 --1.303752E-01 -5.710728E-01 --4.611294E-02 -4.086632E-02 -5.937879E-01 -1.006156E-01 --3.558925E-01 -2.998983E-01 -1.175971E+00 -5.323321E-01 -2.426485E-01 -1.497265E-01 -7.805090E-02 -5.060214E-02 --2.914577E-01 -2.233355E-01 -1.053098E-01 -6.693123E-02 -4.541315E-01 -1.328340E-01 --6.290732E-02 -8.910616E-02 -7.371592E-01 -1.980732E-01 -5.804701E-01 -1.711949E-01 --6.642202E-01 -1.131866E-01 -1.779818E-01 -6.530190E-02 --5.224739E-01 -2.534102E-01 --1.824905E-01 -2.910309E-02 +5.188799E+01 +5.402176E+02 +-5.713505E-01 +4.615729E-01 +-3.761827E-01 +5.750500E-01 +8.374325E-01 +1.862938E-01 +-3.954940E-01 +2.347775E-01 +-6.290233E-01 +1.864254E-01 +-6.656201E-01 +2.124518E-01 +4.729571E-01 +6.739065E-01 +4.921338E-01 +1.907183E-01 +-3.988992E-01 +3.761412E-01 +-1.125861E-01 +3.659299E-01 +-1.283461E-01 +5.045920E-02 +1.101261E-02 +1.391469E-01 +4.286921E-01 +2.097120E-01 +5.360702E-01 +1.809190E-01 +8.470757E-01 +2.461922E-01 +-4.140592E-01 +2.702824E-01 +-2.269391E-02 +5.000308E-03 +-1.585595E-01 +3.527370E-02 +-9.890128E-02 +1.067921E-01 +3.153468E-02 +1.483763E-01 +6.967922E-02 +7.789031E-02 +2.040956E-01 +4.637270E-02 +-2.345641E-01 +3.574654E-01 +-1.500187E-01 +1.514334E-01 +-3.019192E-01 +1.334819E-01 +1.796739E-01 +7.106788E-02 +-2.120506E-01 +1.144496E-01 +-6.891611E-02 +7.257229E-02 +-2.306514E-01 +7.048631E-02 +7.800814E-01 +2.467831E-01 +2.790547E-02 +5.494857E-02 +-1.896182E-01 +5.971620E-02 +1.644354E-02 +1.059859E-01 +-7.792754E-02 +2.085845E-02 +-1.114682E-01 +1.227128E-01 +1.593914E+01 +5.169154E+01 +1.039804E+00 +5.028617E-01 +-7.912437E-01 +5.548318E-01 +2.575930E-01 +1.148260E-01 +-6.331302E-01 +2.556615E-01 +-1.712129E-01 +7.877790E-02 +-5.816921E-01 +1.456126E-01 +2.272958E-01 +8.788738E-02 +3.822477E-01 +6.244032E-02 +-2.999416E-01 +8.461810E-02 +-2.623060E-02 +1.458472E-02 +1.300437E-01 +4.478019E-02 +-4.767351E-02 +7.362462E-02 +7.928962E-02 +4.510319E-02 +3.500548E-03 +4.881244E-02 +-2.067837E-01 +8.186594E-02 +-3.825304E-01 +1.082951E-01 +-3.558676E-01 +5.708469E-02 +4.048126E-01 +9.076309E-02 +4.553585E-02 +2.926622E-02 +-1.294373E-01 +1.870238E-02 +-3.195745E-01 +5.918983E-02 +-5.541420E-02 +6.185102E-02 +2.517910E-01 +1.252247E-01 +-6.864842E-02 +8.483359E-02 +-3.087092E-02 +1.682640E-02 +-6.457777E-02 +2.980731E-02 +-3.360246E-01 +3.729711E-02 +-2.091466E-01 +1.119332E-01 +-4.226988E-01 +5.973848E-02 +-5.390062E-02 +1.424816E-01 +-2.955041E-02 +7.118983E-03 +3.100944E-01 +5.584902E-02 +-4.266659E-01 +4.397359E-02 +-3.155083E-01 +7.428242E-02 +5.282933E-02 +2.010740E-02 +8.557014E+01 +1.465192E+03 +-3.913589E-01 +5.368834E-01 +-2.113693E+00 +2.169443E+00 +2.298156E-01 +6.330809E-01 +1.449786E-01 +2.666314E-01 +-2.958820E-01 +2.750937E-01 +1.054389E+00 +5.351584E-01 +4.775640E-02 +2.044779E-01 +4.186858E-01 +8.940845E-01 +-6.035852E-02 +3.754000E-01 +-1.597608E+00 +5.815293E-01 +5.200807E-01 +3.829815E-01 +9.437855E-01 +7.241779E-01 +-5.232235E-01 +1.966074E-01 +2.872008E-01 +1.241395E+00 +-1.039246E+00 +6.158088E-01 +3.058638E-01 +1.593114E-01 +-5.132144E-01 +4.577375E-01 +6.727602E-01 +4.119990E-01 +3.280880E-01 +4.971028E-01 +7.837744E-01 +2.444483E-01 +7.686392E-01 +3.456688E-01 +-5.035943E-01 +1.631734E-01 +4.145045E-01 +3.177084E-01 +-1.924638E-01 +3.336696E-01 +-1.484767E-01 +9.030824E-02 +-2.393846E-01 +6.598721E-02 +-5.318081E-01 +2.895430E-01 +1.518564E-01 +3.818155E-01 +5.795851E-01 +9.003270E-02 +3.580512E-01 +8.821756E-02 +5.366649E-01 +2.497151E-01 +-3.347132E-01 +1.352062E-01 +4.567995E-01 +1.561741E-01 +-2.279100E-01 +2.122433E-01 +4.461881E-01 +2.325205E-01 +1.427596E+01 +4.078276E+01 +5.217165E-02 +2.453888E-02 +1.584690E-01 +3.106540E-01 +4.560315E-01 +4.277362E-01 +-1.990373E-02 +5.277850E-02 +1.125203E-02 +6.443927E-02 +3.308696E-01 +1.037411E-01 +-2.750414E-01 +3.814328E-02 +-2.758789E-01 +1.449907E-01 +-3.474494E-02 +1.886069E-02 +-3.638818E-03 +1.651468E-01 +-2.060159E-02 +3.031181E-02 +3.225892E-01 +7.944048E-02 +-3.922626E-01 +5.950804E-02 +-7.374795E-01 +1.624566E-01 +-1.467806E-02 +1.234636E-01 +8.061252E-02 +4.356030E-02 +-1.065107E-01 +1.431995E-02 +-2.455689E-01 +4.182386E-02 +-3.425697E-01 +1.088413E-01 +-9.867791E-03 +4.864904E-02 +-2.403769E-01 +2.231699E-02 +1.795461E-01 +2.969251E-02 +-1.516375E-01 +2.951230E-02 +-3.101470E-01 +7.377660E-02 +1.996325E-01 +1.846547E-02 +9.153483E-02 +2.867924E-02 +2.545349E-01 +4.621843E-02 +1.776575E-01 +1.075483E-01 +-2.561501E-01 +4.947817E-02 +-1.558585E-01 +1.467725E-02 +-1.530184E-01 +5.532615E-02 +-1.802320E-01 +1.603564E-02 +3.331892E-01 +3.315195E-02 +-1.878592E-01 +3.588542E-02 +-3.843863E-01 +1.011661E-01 +4.943558E+00 +5.054633E+00 +3.508923E-01 +5.360844E-02 +2.595623E-01 +3.819756E-02 +-2.524359E-01 +4.825078E-02 +-3.376117E-01 +4.115606E-02 +8.885054E-02 +3.685958E-02 +1.168333E-01 +5.916818E-02 +-1.993698E-01 +5.632369E-02 +3.988948E-01 +4.366034E-02 +1.021403E-01 +4.690526E-03 +-1.508432E-01 +2.173064E-02 +-2.407920E-01 +2.510560E-02 +-1.703993E-01 +2.599072E-02 +8.752998E-02 +3.657089E-02 +-1.269869E-02 +2.565400E-02 +2.026727E-01 +1.804748E-02 +-4.913307E-03 +4.059747E-02 +-2.554771E-02 +7.959679E-03 +-1.549008E-02 +3.658041E-02 +-9.294647E-02 +2.754890E-03 +2.566876E-02 +4.951779E-03 +-1.016212E-02 +2.777381E-02 +3.601396E-01 +3.828736E-02 +-8.923373E-03 +3.126410E-03 +8.722969E-02 +1.182345E-02 +-2.332024E-02 +5.685275E-03 +2.101415E-01 +1.224880E-02 +-9.619916E-03 +9.042453E-03 +-2.480871E-01 +2.222042E-02 +9.764734E-02 +4.847970E-03 +-1.623487E-01 +1.814336E-02 +5.091875E-02 +1.290604E-02 +7.192058E-02 +1.343350E-02 +-1.316640E-01 +3.514269E-02 +-9.198972E-02 +1.244138E-02 +-1.225056E-01 +3.035718E-02 +2.194332E+01 +9.737940E+01 +-3.052407E-01 +4.072957E-01 +3.531168E-02 +2.019382E-01 +8.793928E-01 +4.041664E-01 +-4.072462E-01 +6.027190E-02 +-8.907772E-02 +1.952922E-01 +9.519375E-02 +9.821752E-02 +3.205302E-01 +2.075134E-01 +1.124955E-01 +6.446089E-02 +-3.366117E-01 +8.184450E-02 +-3.676127E-02 +3.861064E-02 +2.001007E-01 +6.507942E-02 +-1.155787E-01 +4.761238E-02 +-2.779628E-01 +3.425225E-02 +1.099627E-01 +5.462866E-02 +-2.654341E-01 +1.868127E-02 +2.246854E-01 +3.157231E-02 +-1.422513E-01 +5.939434E-02 +-8.583155E-02 +5.668810E-02 +6.967936E-02 +1.924265E-02 +-2.246405E-03 +1.576409E-02 +7.321307E-02 +2.061990E-02 +-4.949248E-01 +1.278374E-01 +4.468760E-02 +3.814622E-02 +-9.398135E-02 +1.772831E-02 +-2.757022E-01 +1.349555E-01 +1.715161E-02 +5.040025E-02 +-1.682974E-01 +7.558363E-02 +-4.700401E-02 +2.700354E-02 +1.109855E-01 +2.666559E-02 +2.136115E-01 +7.786593E-02 +-2.089667E-01 +1.489893E-02 +-6.959959E-02 +7.545487E-02 +-3.296680E-02 +1.604995E-02 +-1.587440E-01 +5.482886E-02 +-3.203027E-01 +3.421361E-02 diff --git a/tests/test_score_flux_yn/settings.xml b/tests/test_score_flux_yn/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_flux_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_flux_yn/tallies.xml b/tests/test_score_flux_yn/tallies.xml deleted file mode 100644 index e9f08bd4e6..0000000000 --- a/tests/test_score_flux_yn/tallies.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - flux - - - - - flux-y5 - - - - - flux-y5 - analog - - - - - flux-y5 - collision - - - diff --git a/tests/test_score_flux_yn/test_score_flux_yn.py b/tests/test_score_flux_yn/test_score_flux_yn.py index 1777db993e..0122768040 100755 --- a/tests/test_score_flux_yn/test_score_flux_yn.py +++ b/tests/test_score_flux_yn/test_score_flux_yn.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreFluxYnTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27, 28, 29)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('flux-y5') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreFluxYnTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_kappafission/geometry.xml b/tests/test_score_kappafission/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_kappafission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_kappafission/inputs_true.dat b/tests/test_score_kappafission/inputs_true.dat new file mode 100644 index 0000000000..67b1e38750 --- /dev/null +++ b/tests/test_score_kappafission/inputs_true.dat @@ -0,0 +1 @@ +46d1dbf99a14e08eddf34721d2380bf7969b8d299c48a64cfae22dfde29e3b8eab227d663f3ecb234dac2712b5971af2735fd69301b7614c7adae6c3da795e51 \ No newline at end of file diff --git a/tests/test_score_kappafission/materials.xml b/tests/test_score_kappafission/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_kappafission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index e992b4b682..23c12eed20 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -1.848110E+02 -7.563211E+03 +3.057169E+02 +1.886844E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.035912E+02 -8.999693E+03 +7.017044E+01 +1.049216E+03 tally 2: -1.765331E+02 -6.974050E+03 +2.992056E+02 +1.852593E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.938441E+02 -7.888708E+03 +7.782271E+01 +1.267469E+03 tally 3: -1.770125E+02 -6.702714E+03 +2.933944E+02 +1.740955E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.942246E+02 -8.416720E+03 +7.679811E+01 +1.191597E+03 diff --git a/tests/test_score_kappafission/settings.xml b/tests/test_score_kappafission/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_kappafission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_kappafission/tallies.xml b/tests/test_score_kappafission/tallies.xml deleted file mode 100644 index 8fe5d5c842..0000000000 --- a/tests/test_score_kappafission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - kappa-fission - - - - - kappa-fission - analog - - - - - kappa-fission - collision - - - diff --git a/tests/test_score_kappafission/test_score_kappafission.py b/tests/test_score_kappafission/test_score_kappafission.py index 1777db993e..fe43309400 100644 --- a/tests/test_score_kappafission/test_score_kappafission.py +++ b/tests/test_score_kappafission/test_score_kappafission.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreKappaFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('kappa-fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreKappaFissionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nufission/geometry.xml b/tests/test_score_nufission/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_nufission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nufission/inputs_true.dat b/tests/test_score_nufission/inputs_true.dat new file mode 100644 index 0000000000..dbf21a50b3 --- /dev/null +++ b/tests/test_score_nufission/inputs_true.dat @@ -0,0 +1 @@ +8500d149868598a30fc818a34fe0465cf926b79632a8a7a1f96799cc955f30544b2cec131878bbded295179a2fc103657c2ecdb8c28ea10b84b7f6f0091fac7a \ No newline at end of file diff --git a/tests/test_score_nufission/materials.xml b/tests/test_score_nufission/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_nufission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nufission/results_true.dat b/tests/test_score_nufission/results_true.dat index 33c4ff9fbc..046c5b289e 100644 --- a/tests/test_score_nufission/results_true.dat +++ b/tests/test_score_nufission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -2.486342E+00 -1.368793E+00 +4.110726E+00 +3.411205E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.733038E+00 -1.616903E+00 +9.429333E-01 +1.889683E-01 tally 2: -2.296157E+00 -1.167084E+00 +4.104411E+00 +3.453290E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.679940E+00 -1.498454E+00 +1.034371E+00 +2.220105E-01 tally 3: -2.381373E+00 -1.213497E+00 +3.947006E+00 +3.149452E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.607077E+00 -1.513932E+00 +1.031768E+00 +2.152452E-01 diff --git a/tests/test_score_nufission/settings.xml b/tests/test_score_nufission/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_nufission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nufission/tallies.xml b/tests/test_score_nufission/tallies.xml deleted file mode 100644 index 2812a00b55..0000000000 --- a/tests/test_score_nufission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - nu-fission - - - - - nu-fission - analog - - - - - nu-fission - collision - - - diff --git a/tests/test_score_nufission/test_score_nufission.py b/tests/test_score_nufission/test_score_nufission.py index 1777db993e..2c0bbd2f19 100644 --- a/tests/test_score_nufission/test_score_nufission.py +++ b/tests/test_score_nufission/test_score_nufission.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreNuFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('nu-fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuFissionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter/geometry.xml b/tests/test_score_nuscatter/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_nuscatter/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter/inputs_true.dat b/tests/test_score_nuscatter/inputs_true.dat new file mode 100644 index 0000000000..889941afce --- /dev/null +++ b/tests/test_score_nuscatter/inputs_true.dat @@ -0,0 +1 @@ +41644968ea3a500af029e799ceef40c270d26944e0e7426afe1b8b2e15743b79c8b2989ecaaa0dac958046a89a49dab9d592cc7a4e059cd1f917b62219a8ed31 \ No newline at end of file diff --git a/tests/test_score_nuscatter/materials.xml b/tests/test_score_nuscatter/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_nuscatter/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index 66e0c0a031..675509932e 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.870214E-01 2.095925E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -3.353000E+01 -1.133379E+02 -8.150000E+00 -6.793700E+00 -1.098500E+02 -1.221333E+03 +1.940000E+01 +7.561780E+01 +4.340000E+00 +3.813000E+00 +6.440000E+01 +8.302674E+02 diff --git a/tests/test_score_nuscatter/settings.xml b/tests/test_score_nuscatter/settings.xml deleted file mode 100644 index ce632aae31..0000000000 --- a/tests/test_score_nuscatter/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter/tallies.xml b/tests/test_score_nuscatter/tallies.xml deleted file mode 100644 index 08f8fa32cc..0000000000 --- a/tests/test_score_nuscatter/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - nu-scatter - - - \ No newline at end of file diff --git a/tests/test_score_nuscatter/test_score_nuscatter.py b/tests/test_score_nuscatter/test_score_nuscatter.py index 1777db993e..81fca1e68b 100644 --- a/tests/test_score_nuscatter/test_score_nuscatter.py +++ b/tests/test_score_nuscatter/test_score_nuscatter.py @@ -2,9 +2,28 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreNuScatterTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + t = openmc.Tally(tally_id=1) + t.add_filter(filt) + t.add_score('nu-scatter') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter_n/geometry.xml b/tests/test_score_nuscatter_n/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_nuscatter_n/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter_n/inputs_true.dat b/tests/test_score_nuscatter_n/inputs_true.dat new file mode 100644 index 0000000000..228c224001 --- /dev/null +++ b/tests/test_score_nuscatter_n/inputs_true.dat @@ -0,0 +1 @@ +c8072b4ce735db4cc196a688f2d253e5683d5ef7b7a254ceab4d689d3902bb4fd7223ad824d002f3abf7e0fe7fbd80ab6c0273c8972df1ec26ff69cbd26c13ee \ No newline at end of file diff --git a/tests/test_score_nuscatter_n/materials.xml b/tests/test_score_nuscatter_n/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_nuscatter_n/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index 5dbc7f8abf..cdcbcfb524 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -9.870214E-01 2.095925E-02 +9.935192E-01 5.457292E-02 tally 1: -3.353000E+01 -1.133379E+02 -3.491100E+00 -1.265776E+00 -1.948509E+00 -4.761101E-01 -9.177045E-01 -1.251750E-01 -5.654249E-01 -5.567043E-02 -8.150000E+00 -6.793700E+00 -1.223263E+00 -1.678053E-01 -7.833173E-01 -8.407682E-02 -1.350170E-01 -7.393546E-03 -2.164837E-01 -1.367122E-02 -1.098500E+02 -1.221333E+03 -5.598624E+01 -3.183267E+02 -2.048716E+01 -4.301097E+01 -1.399456E+00 -4.458904E-01 --2.183180E+00 -6.628474E-01 +1.940000E+01 +7.561780E+01 +2.629221E+00 +1.399188E+00 +1.567944E+00 +5.124385E-01 +6.926532E-01 +1.577035E-01 +6.111349E-01 +1.006724E-01 +4.340000E+00 +3.813000E+00 +6.633546E-01 +9.836364E-02 +3.707954E-01 +3.694050E-02 +-4.267991E-02 +1.870638E-03 +5.239484E-02 +1.032955E-02 +6.440000E+01 +8.302674E+02 +3.312945E+01 +2.197504E+02 +1.239256E+01 +3.104303E+01 +7.813162E-01 +2.790254E-01 +-1.320978E+00 +4.696586E-01 diff --git a/tests/test_score_nuscatter_n/settings.xml b/tests/test_score_nuscatter_n/settings.xml deleted file mode 100644 index ce632aae31..0000000000 --- a/tests/test_score_nuscatter_n/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter_n/tallies.xml b/tests/test_score_nuscatter_n/tallies.xml deleted file mode 100644 index 90e28227b6..0000000000 --- a/tests/test_score_nuscatter_n/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - - diff --git a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py index 1777db993e..05e00e8132 100644 --- a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py +++ b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py @@ -2,9 +2,32 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreNuScatterNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23)) + t = openmc.Tally(tally_id=1) + t.add_filter(filt) + t.add_score('nu-scatter') + t.add_score('nu-scatter-1') + t.add_score('nu-scatter-2') + t.add_score('nu-scatter-3') + t.add_score('nu-scatter-4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter_pn/geometry.xml b/tests/test_score_nuscatter_pn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_nuscatter_pn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter_pn/inputs_true.dat b/tests/test_score_nuscatter_pn/inputs_true.dat new file mode 100644 index 0000000000..f04187297d --- /dev/null +++ b/tests/test_score_nuscatter_pn/inputs_true.dat @@ -0,0 +1 @@ +dbe91c112a02bf9c1098c2ba93c737bfd048f356d00dab280a245c572821d345a9d4c2cfa766f8b83c42362d9b8dbbb3d5ce240b6e749541aac3cae567b715c4 \ No newline at end of file diff --git a/tests/test_score_nuscatter_pn/materials.xml b/tests/test_score_nuscatter_pn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_nuscatter_pn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 41bc17f8b8..81d1d1ad73 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -9.870214E-01 2.095925E-02 +9.935192E-01 5.457292E-02 tally 1: -3.353000E+01 -1.133379E+02 -3.491100E+00 -1.265776E+00 -1.948509E+00 -4.761101E-01 -9.177045E-01 -1.251750E-01 -5.654249E-01 -5.567043E-02 +1.940000E+01 +7.561780E+01 +2.629221E+00 +1.399188E+00 +1.567944E+00 +5.124385E-01 +6.926532E-01 +1.577035E-01 +6.111349E-01 +1.006724E-01 tally 2: -3.353000E+01 -1.133379E+02 -3.491100E+00 -1.265776E+00 -1.948509E+00 -4.761101E-01 -9.177045E-01 -1.251750E-01 -5.654249E-01 -5.567043E-02 +1.940000E+01 +7.561780E+01 +2.629221E+00 +1.399188E+00 +1.567944E+00 +5.124385E-01 +6.926532E-01 +1.577035E-01 +6.111349E-01 +1.006724E-01 diff --git a/tests/test_score_nuscatter_pn/settings.xml b/tests/test_score_nuscatter_pn/settings.xml deleted file mode 100644 index ce632aae31..0000000000 --- a/tests/test_score_nuscatter_pn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter_pn/tallies.xml b/tests/test_score_nuscatter_pn/tallies.xml deleted file mode 100644 index dfad48dda2..0000000000 --- a/tests/test_score_nuscatter_pn/tallies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - nu-scatter-0 nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - - - - nu-scatter-p4 - - - diff --git a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py index 1777db993e..009bccd159 100644 --- a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py +++ b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py @@ -2,9 +2,36 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreNuScatterPNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('nu-scatter-0') + t1.add_score('nu-scatter-1') + t1.add_score('nu-scatter-2') + t1.add_score('nu-scatter-3') + t1.add_score('nu-scatter-4') + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('nu-scatter-p4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterPNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter_yn/geometry.xml b/tests/test_score_nuscatter_yn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_nuscatter_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter_yn/inputs_true.dat b/tests/test_score_nuscatter_yn/inputs_true.dat new file mode 100644 index 0000000000..2a0fde3095 --- /dev/null +++ b/tests/test_score_nuscatter_yn/inputs_true.dat @@ -0,0 +1 @@ +31e4d35c4845eaa7d3ec4b021f820a4526b0d8a43fdd69288c1c94551a895c05bbd10cfe72b54dafc9abe31ed56ef06a6fb3de77088e4c2da25b547fc06ac74d \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/materials.xml b/tests/test_score_nuscatter_yn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_nuscatter_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index cdf051ee75..fde6f07ec4 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -9.870214E-01 2.095925E-02 +9.935192E-01 5.457292E-02 tally 1: -3.353000E+01 -1.133379E+02 +1.940000E+01 +7.561780E+01 tally 2: -3.353000E+01 -1.133379E+02 -4.293226E-01 -6.259462E-02 --2.011041E-02 -5.388144E-02 -3.900136E-01 -5.873137E-02 -6.150213E-02 -9.043796E-03 -5.518583E-02 -1.739087E-02 --2.047987E-01 -1.993679E-02 -6.710345E-02 -1.652573E-02 --3.619254E-02 -1.598186E-02 -3.551558E-02 -9.077346E-03 -1.044669E-01 -2.082961E-03 --3.782063E-02 -1.681459E-02 -1.752386E-01 -1.411429E-02 --3.289649E-02 -9.534958E-03 -5.252770E-02 -7.518445E-03 -2.688056E-02 -3.397824E-03 +1.940000E+01 +7.561780E+01 +-8.464573E-02 +1.823218E-02 +-1.116469E-01 +3.380141E-02 +-2.130479E-03 +1.022241E-02 +-4.896859E-02 +1.074348E-02 +-1.482536E-01 +1.114316E-02 +-6.827566E-02 +4.248457E-03 +1.494503E-01 +2.605186E-02 +2.010847E-01 +1.699034E-02 +4.535125E-02 +2.658493E-03 +-4.135950E-02 +4.170544E-03 +1.277006E-01 +6.276355E-03 +4.192667E-02 +4.955945E-03 +-9.607170E-02 +3.280003E-03 +1.533637E-01 +7.107300E-03 +3.570929E-02 +4.795032E-03 diff --git a/tests/test_score_nuscatter_yn/settings.xml b/tests/test_score_nuscatter_yn/settings.xml deleted file mode 100644 index ce632aae31..0000000000 --- a/tests/test_score_nuscatter_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter_yn/tallies.xml b/tests/test_score_nuscatter_yn/tallies.xml deleted file mode 100644 index b80b37dc8c..0000000000 --- a/tests/test_score_nuscatter_yn/tallies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - nu-scatter-0 - - - - - nu-scatter-y3 - - - diff --git a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py index 1777db993e..d1fa3e029f 100644 --- a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py +++ b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py @@ -2,9 +2,32 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreNuScatterYNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('nu-scatter-0') + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('nu-scatter-y3') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterYNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter/geometry.xml b/tests/test_score_scatter/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_scatter/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter/inputs_true.dat b/tests/test_score_scatter/inputs_true.dat new file mode 100644 index 0000000000..c5f1c1f17a --- /dev/null +++ b/tests/test_score_scatter/inputs_true.dat @@ -0,0 +1 @@ +c07fa98f19d66732be7bd394b30b6e2d18d54a9fec2ae729e9d00adb55d9c00533bacb2d3fe4eee7f41e6e0b6841e82ff313bc593bf3b7932bd8d026dc81a58d \ No newline at end of file diff --git a/tests/test_score_scatter/materials.xml b/tests/test_score_scatter/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_scatter/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter/results_true.dat b/tests/test_score_scatter/results_true.dat index 21d7d83c27..50782e4167 100644 --- a/tests/test_score_scatter/results_true.dat +++ b/tests/test_score_scatter/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -1.223028E+01 -3.185078E+01 -2.900350E+00 -1.814004E+00 -4.059013E+01 -3.609499E+02 +1.907306E+01 +7.310892E+01 +4.678711E+00 +4.406892E+00 +6.487881E+01 +8.433246E+02 tally 2: 0.000000E+00 0.000000E+00 -1.169000E+01 -2.915330E+01 -3.200000E+00 -2.342600E+00 -4.064000E+01 -3.595168E+02 +1.940000E+01 +7.561780E+01 +4.340000E+00 +3.813000E+00 +6.440000E+01 +8.302674E+02 tally 3: 0.000000E+00 0.000000E+00 -1.172929E+01 -2.935812E+01 -3.185726E+00 -2.323517E+00 -4.074319E+01 -3.614902E+02 +1.952859E+01 +7.659866E+01 +4.328145E+00 +3.794232E+00 +6.439437E+01 +8.300759E+02 diff --git a/tests/test_score_scatter/settings.xml b/tests/test_score_scatter/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_scatter/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter/tallies.xml b/tests/test_score_scatter/tallies.xml deleted file mode 100644 index b6eb73b506..0000000000 --- a/tests/test_score_scatter/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - scatter - - - - - scatter - analog - - - - - scatter - collision - - - diff --git a/tests/test_score_scatter/test_score_scatter.py b/tests/test_score_scatter/test_score_scatter.py index 1777db993e..76ff39e01f 100644 --- a/tests/test_score_scatter/test_score_scatter.py +++ b/tests/test_score_scatter/test_score_scatter.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreScatterTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('scatter') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter_n/geometry.xml b/tests/test_score_scatter_n/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_scatter_n/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter_n/inputs_true.dat b/tests/test_score_scatter_n/inputs_true.dat new file mode 100644 index 0000000000..37dc7074f0 --- /dev/null +++ b/tests/test_score_scatter_n/inputs_true.dat @@ -0,0 +1 @@ +5a6ec0557a68deb5334e0689575531328bad6964f48409ef70343266e88a5c691099486813c69c3c4c0e6154e23342d228f924606b664ae7c4cdd24818626797 \ No newline at end of file diff --git a/tests/test_score_scatter_n/materials.xml b/tests/test_score_scatter_n/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_scatter_n/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter_n/results_true.dat b/tests/test_score_scatter_n/results_true.dat index b46a1e184d..cdcbcfb524 100644 --- a/tests/test_score_scatter_n/results_true.dat +++ b/tests/test_score_scatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 -3.200000E+00 -2.342600E+00 -3.809941E-01 -2.965326E-02 -4.319242E-01 -3.738822E-02 -9.261909E-02 -6.711328E-03 --6.052442E-02 -7.087230E-03 -4.064000E+01 -3.595168E+02 -2.096700E+01 -9.516606E+01 -7.560566E+00 -1.248694E+01 -2.093348E-01 -4.278510E-02 --1.449929E+00 -4.356371E-01 +1.940000E+01 +7.561780E+01 +2.629221E+00 +1.399188E+00 +1.567944E+00 +5.124385E-01 +6.926532E-01 +1.577035E-01 +6.111349E-01 +1.006724E-01 +4.340000E+00 +3.813000E+00 +6.633546E-01 +9.836364E-02 +3.707954E-01 +3.694050E-02 +-4.267991E-02 +1.870638E-03 +5.239484E-02 +1.032955E-02 +6.440000E+01 +8.302674E+02 +3.312945E+01 +2.197504E+02 +1.239256E+01 +3.104303E+01 +7.813162E-01 +2.790254E-01 +-1.320978E+00 +4.696586E-01 diff --git a/tests/test_score_scatter_n/settings.xml b/tests/test_score_scatter_n/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_scatter_n/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter_n/tallies.xml b/tests/test_score_scatter_n/tallies.xml deleted file mode 100644 index 0164dea358..0000000000 --- a/tests/test_score_scatter_n/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - scatter scatter-1 scatter-2 scatter-3 scatter-4 - - - \ No newline at end of file diff --git a/tests/test_score_scatter_n/test_score_scatter_n.py b/tests/test_score_scatter_n/test_score_scatter_n.py index 1777db993e..304cd6cb77 100644 --- a/tests/test_score_scatter_n/test_score_scatter_n.py +++ b/tests/test_score_scatter_n/test_score_scatter_n.py @@ -2,9 +2,32 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreScatterNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23)) + t = openmc.Tally(tally_id=1) + t.add_filter(filt) + t.add_score('scatter') + t.add_score('scatter-1') + t.add_score('scatter-2') + t.add_score('scatter-3') + t.add_score('scatter-4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter_pn/geometry.xml b/tests/test_score_scatter_pn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_scatter_pn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter_pn/inputs_true.dat b/tests/test_score_scatter_pn/inputs_true.dat new file mode 100644 index 0000000000..06dab53407 --- /dev/null +++ b/tests/test_score_scatter_pn/inputs_true.dat @@ -0,0 +1 @@ +112ae1a84c81f58885583b463f576bf1d9b5f5cbb0f5dfb36147ab30be2ef0d7506cfee053b54c26baad1b233d5d97cd1698c2af909682275e0b8fd79dd8f43c \ No newline at end of file diff --git a/tests/test_score_scatter_pn/materials.xml b/tests/test_score_scatter_pn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_scatter_pn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter_pn/results_true.dat b/tests/test_score_scatter_pn/results_true.dat index 3c34895d90..81d1d1ad73 100644 --- a/tests/test_score_scatter_pn/results_true.dat +++ b/tests/test_score_scatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 +1.940000E+01 +7.561780E+01 +2.629221E+00 +1.399188E+00 +1.567944E+00 +5.124385E-01 +6.926532E-01 +1.577035E-01 +6.111349E-01 +1.006724E-01 tally 2: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 +1.940000E+01 +7.561780E+01 +2.629221E+00 +1.399188E+00 +1.567944E+00 +5.124385E-01 +6.926532E-01 +1.577035E-01 +6.111349E-01 +1.006724E-01 diff --git a/tests/test_score_scatter_pn/settings.xml b/tests/test_score_scatter_pn/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_scatter_pn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter_pn/tallies.xml b/tests/test_score_scatter_pn/tallies.xml deleted file mode 100644 index 61a7854d68..0000000000 --- a/tests/test_score_scatter_pn/tallies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - scatter-0 scatter-1 scatter-2 scatter-3 scatter-4 - - - - - scatter-p4 - - - \ No newline at end of file diff --git a/tests/test_score_scatter_pn/test_score_scatter_pn.py b/tests/test_score_scatter_pn/test_score_scatter_pn.py index 1777db993e..79a4502c9c 100644 --- a/tests/test_score_scatter_pn/test_score_scatter_pn.py +++ b/tests/test_score_scatter_pn/test_score_scatter_pn.py @@ -2,9 +2,37 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreScatterPNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('scatter-0') + t1.add_score('scatter-1') + t1.add_score('scatter-2') + t1.add_score('scatter-3') + t1.add_score('scatter-4') + t1.estimator = 'analog' + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('scatter-p4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterPNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter_yn/geometry.xml b/tests/test_score_scatter_yn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_scatter_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter_yn/inputs_true.dat b/tests/test_score_scatter_yn/inputs_true.dat new file mode 100644 index 0000000000..c7c1c822af --- /dev/null +++ b/tests/test_score_scatter_yn/inputs_true.dat @@ -0,0 +1 @@ +ad59269de656ab6ea87cf55f1ecb8cd60f4bb652b881bc9f3f705fd17714fee4cdbb105b99d9b50e5d39375f89d37437888d432f53457cd5d61e1956b81e2097 \ No newline at end of file diff --git a/tests/test_score_scatter_yn/materials.xml b/tests/test_score_scatter_yn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_scatter_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 9df7ea42a7..3e22703ad7 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -1,56 +1,56 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: -1.169000E+01 -2.915330E+01 +1.940000E+01 +7.561780E+01 tally 2: -1.169000E+01 -2.915330E+01 --2.198379E-01 -2.828670E-02 --1.317276E-01 -9.568596E-03 -8.309792E-02 -1.155410E-02 --2.288506E-02 -3.710542E-03 --2.720674E-02 -1.789163E-03 --1.323964E-02 -1.819112E-04 -8.941597E-02 -4.265616E-03 -1.516805E-01 -1.332526E-02 --1.832782E-02 -6.611171E-03 -1.311371E-02 -2.840648E-03 -3.728365E-02 -2.866806E-03 --5.100587E-02 -2.957146E-03 -3.388028E-02 -2.481570E-03 --7.766921E-02 -3.129377E-03 -1.666131E-02 -3.828290E-03 -8.102553E-02 -2.118169E-03 -6.303084E-03 -7.156173E-04 --2.083478E-03 -2.683340E-03 -6.794806E-03 -3.912783E-04 -1.005390E-01 -2.920205E-03 --5.332517E-02 -2.205372E-03 --1.584725E-02 -8.984498E-04 -3.486904E-02 -6.448722E-04 --2.420912E-02 -6.352276E-04 +1.940000E+01 +7.561780E+01 +-8.464573E-02 +1.823218E-02 +-1.116469E-01 +3.380141E-02 +-2.130479E-03 +1.022241E-02 +-4.896859E-02 +1.074348E-02 +-1.482536E-01 +1.114316E-02 +-6.827566E-02 +4.248457E-03 +1.494503E-01 +2.605186E-02 +2.010847E-01 +1.699034E-02 +4.535125E-02 +2.658493E-03 +-4.135950E-02 +4.170544E-03 +1.277006E-01 +6.276355E-03 +4.192667E-02 +4.955945E-03 +-9.607170E-02 +3.280003E-03 +1.533637E-01 +7.107300E-03 +3.570929E-02 +4.795032E-03 +-1.183812E-01 +3.369458E-03 +-1.555883E-02 +9.917545E-04 +-9.288972E-02 +2.083169E-03 +-1.698033E-02 +1.027209E-03 +7.433184E-03 +5.046022E-04 +9.078711E-02 +2.020877E-03 +-7.502769E-02 +2.431965E-03 +-3.565718E-02 +5.978599E-03 +-7.076433E-02 +2.138810E-03 diff --git a/tests/test_score_scatter_yn/settings.xml b/tests/test_score_scatter_yn/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_scatter_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter_yn/tallies.xml b/tests/test_score_scatter_yn/tallies.xml deleted file mode 100644 index 3c46c13d40..0000000000 --- a/tests/test_score_scatter_yn/tallies.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - scatter-0 - analog - - - - - scatter-y4 - - - diff --git a/tests/test_score_scatter_yn/test_score_scatter_yn.py b/tests/test_score_scatter_yn/test_score_scatter_yn.py index 1777db993e..f99fc5923f 100644 --- a/tests/test_score_scatter_yn/test_score_scatter_yn.py +++ b/tests/test_score_scatter_yn/test_score_scatter_yn.py @@ -2,9 +2,33 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreScatterYNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('scatter-0') + t1.estimator = 'analog' + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('scatter-y4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterYNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_total/geometry.xml b/tests/test_score_total/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_total/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_total/inputs_true.dat b/tests/test_score_total/inputs_true.dat new file mode 100644 index 0000000000..114ec33e14 --- /dev/null +++ b/tests/test_score_total/inputs_true.dat @@ -0,0 +1 @@ +1ba17d4cef859221f314a0e7576a762260effe8f1977c9c6c74a80007d80b92d8d0fffadf39dde5e054809f3bf63529930428f79c6c4008d53e8be7644cd538a \ No newline at end of file diff --git a/tests/test_score_total/materials.xml b/tests/test_score_total/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_total/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_total/results_true.dat b/tests/test_score_total/results_true.dat index e782fd9d04..a51e32b159 100644 --- a/tests/test_score_total/results_true.dat +++ b/tests/test_score_total/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -1.423676E+01 -4.330937E+01 -2.914798E+00 -1.831649E+00 -4.088282E+01 -3.662539E+02 +2.240915E+01 +1.009032E+02 +4.711189E+00 +4.469059E+00 +6.533718E+01 +8.552989E+02 tally 2: 0.000000E+00 0.000000E+00 -1.372000E+01 -4.018980E+01 -3.200000E+00 -2.342600E+00 -4.104000E+01 -3.668254E+02 +2.278000E+01 +1.042404E+02 +4.350000E+00 +3.833900E+00 +6.484000E+01 +8.416314E+02 tally 3: 0.000000E+00 0.000000E+00 -1.372000E+01 -4.018980E+01 -3.200000E+00 -2.342600E+00 -4.104000E+01 -3.668254E+02 +2.278000E+01 +1.042404E+02 +4.350000E+00 +3.833900E+00 +6.484000E+01 +8.416314E+02 diff --git a/tests/test_score_total/settings.xml b/tests/test_score_total/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_total/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_total/tallies.xml b/tests/test_score_total/tallies.xml deleted file mode 100644 index 02286f96c7..0000000000 --- a/tests/test_score_total/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - total - - - - - total - analog - - - - - total - collision - - - diff --git a/tests/test_score_total/test_score_total.py b/tests/test_score_total/test_score_total.py index 1777db993e..702a8141c1 100644 --- a/tests/test_score_total/test_score_total.py +++ b/tests/test_score_total/test_score_total.py @@ -2,9 +2,31 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreTotalTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('total') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreTotalTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_total_yn/geometry.xml b/tests/test_score_total_yn/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_total_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_total_yn/inputs_true.dat b/tests/test_score_total_yn/inputs_true.dat new file mode 100644 index 0000000000..471cadfb20 --- /dev/null +++ b/tests/test_score_total_yn/inputs_true.dat @@ -0,0 +1 @@ +8967621db0c045e1c12b181eb825b0528bf1f8ef03d5d5e036e14f5151d4bcec36c56b1ec2faba66254d09a29795f9ed44599762e7dfd506fff8bf4d27de8328 \ No newline at end of file diff --git a/tests/test_score_total_yn/materials.xml b/tests/test_score_total_yn/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_total_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index 28a4b1627e..5d7a1498de 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -1,14 +1,406 @@ k-combined: -1.005983E+00 2.248579E-02 +9.935192E-01 5.457292E-02 tally 1: 0.000000E+00 0.000000E+00 -1.423676E+01 -4.330937E+01 -2.914798E+00 -1.831649E+00 -4.088282E+01 -3.662539E+02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.265629E+00 +3.233643E-01 +5.626298E-02 +1.292090E-03 +2.035173E-02 +6.296227E-04 +1.928563E-02 +8.190514E-04 +-2.468301E-02 +2.354849E-04 +9.148092E-03 +2.225568E-04 +-5.879447E-02 +8.590977E-04 +-1.445300E-02 +1.531576E-04 +6.018866E-02 +8.591329E-04 +1.403996E-02 +4.821838E-04 +9.815924E-03 +5.880801E-04 +-9.749601E-03 +4.650507E-04 +-8.702902E-03 +6.682813E-05 +1.953899E-02 +2.762602E-04 +2.823080E-02 +3.090601E-04 +-2.932935E-03 +1.767294E-05 +6.394250E-03 +1.447695E-04 +-1.504208E-03 +4.671038E-05 +-1.575220E-02 +1.620546E-04 +-2.910381E-03 +2.389274E-04 +-3.020227E-02 +5.422131E-04 +-8.190946E-03 +3.025911E-04 +2.246625E-02 +3.354891E-04 +-2.002110E-02 +2.075929E-04 +-1.962614E-02 +3.166447E-04 +2.240915E+01 +1.009032E+02 +1.856657E-01 +9.493183E-02 +-1.690914E-01 +1.047180E-01 +-1.866343E-01 +5.134677E-02 +-2.029558E-01 +1.341115E-02 +-1.379135E-01 +2.187965E-02 +-5.257769E-01 +7.022699E-02 +-6.848163E-02 +8.861152E-02 +3.794798E-01 +6.518809E-02 +-1.093894E-01 +2.155411E-02 +-1.520483E-01 +2.978741E-02 +1.718356E-01 +2.986391E-02 +8.273807E-02 +1.139398E-02 +1.312033E-01 +1.195907E-02 +3.286682E-01 +4.246009E-02 +8.878513E-02 +3.773227E-02 +-2.541223E-02 +1.841611E-02 +-1.249772E-02 +7.518231E-03 +-1.468495E-01 +1.193263E-02 +2.206397E-02 +3.376086E-02 +-1.990498E-01 +2.246024E-02 +1.181081E-01 +2.651049E-02 +-8.952636E-03 +9.032436E-03 +5.183546E-02 +1.061147E-02 +-1.047213E-01 +9.680702E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.711189E+00 +4.469059E+00 +1.149862E-03 +4.006261E-03 +-5.485896E-02 +5.881771E-03 +-6.936896E-02 +1.501967E-03 +1.033506E-02 +4.261122E-04 +-1.042957E-01 +2.255383E-03 +-7.082011E-02 +2.495972E-03 +1.099802E-02 +2.333908E-03 +5.635534E-02 +4.286572E-03 +-2.310646E-02 +1.542196E-03 +-2.259159E-02 +5.408191E-04 +9.307209E-02 +1.773060E-03 +6.296915E-02 +2.394743E-03 +-8.108703E-03 +9.384558E-04 +7.125823E-02 +2.782853E-03 +7.168104E-03 +1.083383E-03 +-2.498842E-02 +5.768656E-04 +-2.297890E-02 +8.711670E-04 +-1.775752E-02 +2.271706E-04 +-1.794820E-02 +8.018486E-04 +1.963115E-02 +7.104338E-04 +5.288264E-02 +6.415302E-04 +5.895017E-03 +3.571409E-04 +2.190858E-02 +5.489095E-04 +-3.829208E-02 +5.977452E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.533718E+01 +8.552989E+02 +4.658976E-02 +2.719315E-01 +-5.661220E-01 +5.439751E-01 +-3.051142E-01 +4.890036E-01 +-1.640760E-01 +2.200294E-02 +-2.675559E-01 +1.660319E-01 +2.007804E-01 +3.303623E-01 +2.670686E-02 +2.330239E-02 +3.111327E-01 +2.876993E-01 +-6.871786E-02 +1.625684E-01 +-5.849816E-01 +2.074413E-01 +3.674709E-01 +9.029605E-02 +3.420122E-01 +3.147918E-01 +1.580259E-01 +4.184964E-02 +1.509855E-01 +1.718636E-01 +4.008602E-01 +1.315982E-01 +1.253163E-01 +7.030618E-02 +1.826521E-02 +4.452932E-02 +-9.755491E-02 +1.276313E-01 +5.434521E-02 +3.809202E-02 +7.041533E-01 +1.522383E-01 +1.434910E-01 +1.112940E-01 +1.947700E-01 +9.469651E-02 +-7.044463E-02 +3.058029E-02 +-6.586398E-01 +1.337469E-01 tally 2: 0.000000E+00 0.000000E+00 @@ -110,106 +502,106 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -7.812543E-01 -1.349265E-01 --7.005988E-03 -2.198486E-04 -3.237937E-02 -7.569491E-04 --3.865436E-04 -4.048167E-04 --1.003877E-02 -3.195619E-04 -3.738815E-03 -3.506174E-04 --2.549288E-02 -3.086810E-04 -1.693002E-02 -1.255885E-04 -3.059341E-03 -1.971678E-04 -9.247344E-03 -2.402855E-04 -6.618469E-04 -1.639025E-04 -1.992953E-02 -1.365376E-04 -3.262256E-03 -1.341040E-05 -2.864166E-03 -4.394787E-05 -1.494351E-03 -1.001007E-04 --1.091424E-02 -1.221030E-04 -9.875992E-03 -1.141979E-04 -1.263647E-02 -2.400023E-04 --2.944398E-03 -1.246417E-04 -1.970051E-03 -1.600160E-04 -6.148931E-03 -4.774182E-05 -1.107728E-02 -1.095420E-04 -1.382599E-02 -1.537793E-04 --1.296297E-02 -1.392028E-04 --1.479385E-02 -1.650074E-04 -1.423676E+01 -4.330937E+01 --2.802155E-01 -3.016146E-02 --8.009314E-02 -4.251899E-02 --7.383773E-02 -1.547362E-02 --1.274422E-01 -2.290306E-02 -1.370426E-01 -1.002935E-02 --2.607280E-01 -3.414307E-02 -1.497421E-02 -2.944540E-03 --2.866477E-02 -9.113662E-03 --3.949118E-02 -4.437767E-03 -2.283116E-01 -1.792907E-02 -1.334103E-01 -1.587762E-02 --3.139096E-01 -2.330713E-02 -1.025884E-03 -5.754195E-03 -1.099489E-01 -1.861634E-02 --7.863729E-02 -2.276108E-02 -1.219111E-01 -1.363203E-02 --1.261893E-01 -1.937908E-02 --1.995428E-01 -1.383344E-02 -8.803472E-02 -3.742219E-03 -1.501143E-01 -1.288322E-02 -4.522115E-02 -8.283014E-03 -1.113588E-01 -8.523967E-03 --1.820582E-01 -1.648932E-02 --1.121108E-01 -1.059879E-02 +1.270000E+00 +3.313000E-01 +6.672369E-03 +5.154703E-03 +2.741231E-02 +3.707114E-03 +6.785459E-02 +1.525452E-03 +-7.226258E-02 +3.119519E-03 +-1.458773E-02 +5.829469E-03 +9.286573E-02 +4.614384E-03 +-8.836014E-02 +3.693860E-03 +7.682597E-02 +3.692450E-03 +5.624405E-04 +1.894653E-03 +-2.446734E-02 +2.962636E-04 +-2.865534E-02 +8.238323E-04 +1.746333E-02 +1.350727E-03 +6.812468E-02 +2.154847E-03 +2.170333E-02 +8.368218E-04 +-3.464644E-02 +6.341450E-04 +1.586865E-03 +2.086260E-04 +1.122866E-02 +1.828956E-03 +5.147244E-02 +2.116013E-03 +-5.140617E-03 +2.011918E-03 +3.662973E-02 +1.511591E-03 +-3.826498E-04 +1.254739E-03 +9.466189E-02 +2.206340E-03 +-1.695030E-02 +2.963888E-04 +-4.620345E-02 +1.330607E-03 +2.278000E+01 +1.042404E+02 +-2.705944E-01 +4.019819E-02 +8.910115E-02 +7.598548E-02 +4.240148E-01 +6.249778E-02 +-1.711683E-01 +3.365297E-02 +-1.320939E-01 +4.677615E-02 +-3.833055E-01 +3.838770E-02 +1.938748E-01 +8.311489E-02 +1.859290E-01 +1.653719E-02 +-2.875551E-01 +7.432886E-02 +1.513934E-02 +7.854478E-02 +1.932642E-02 +1.428749E-02 +4.617741E-02 +1.844961E-02 +1.063807E-01 +3.103047E-02 +1.309557E-01 +1.198530E-02 +2.797364E-01 +2.403350E-02 +-1.332777E-01 +2.277289E-02 +9.430025E-02 +5.826855E-03 +-1.012356E-01 +1.537804E-02 +-8.178736E-02 +4.470169E-02 +-1.197123E-01 +2.596045E-02 +3.984096E-02 +1.209844E-02 +1.148842E-01 +6.772712E-03 +-1.705431E-02 +3.920009E-02 +-2.694201E-02 +2.653514E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -260,56 +652,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -2.914798E+00 -1.831649E+00 --3.213884E-02 -1.391026E-03 --1.124311E-02 -2.059984E-03 --1.372399E-02 -2.990198E-03 --6.931800E-03 -1.073303E-03 --5.448993E-03 -3.542504E-04 --7.264172E-02 -1.742045E-03 -1.526380E-02 -5.962297E-04 -1.576474E-02 -5.335071E-04 -2.028206E-02 -2.915489E-04 -4.014298E-02 -4.285950E-04 -8.228146E-03 -6.388002E-04 --8.183952E-02 -2.031634E-03 -1.014523E-02 -1.159653E-03 -9.321030E-03 -7.480844E-04 --3.156017E-02 -2.064357E-03 -3.606483E-02 -4.060244E-04 --3.866234E-02 -1.046100E-03 --5.723297E-02 -1.042437E-03 -2.894838E-02 -2.922848E-04 --1.529225E-03 -2.472179E-04 -9.484410E-03 -4.172637E-04 --4.442548E-04 -2.518508E-04 --3.065480E-02 -3.571846E-04 --6.519117E-03 -1.779322E-04 +4.350000E+00 +3.833900E+00 +2.792800E-01 +3.102658E-02 +-2.343095E-01 +3.826449E-02 +3.428573E-02 +6.437027E-03 +-1.025176E-01 +1.798807E-02 +-4.106130E-02 +3.786695E-03 +-1.470480E-01 +8.519720E-03 +1.989035E-02 +5.067928E-03 +8.094404E-02 +3.412899E-03 +-5.616421E-02 +2.709728E-03 +2.421213E-02 +3.683849E-03 +4.794858E-02 +4.392540E-03 +-1.637085E-02 +5.339723E-03 +-2.046073E-02 +5.231271E-03 +1.554627E-02 +4.457612E-03 +-3.441131E-02 +7.049061E-03 +-1.139075E-01 +7.627867E-03 +-8.358967E-02 +4.023855E-03 +1.221815E-01 +5.628324E-03 +-2.061337E-02 +1.926605E-03 +-1.583607E-02 +1.093902E-03 +-7.623859E-02 +5.519074E-03 +-1.115748E-02 +3.984642E-03 +7.665232E-02 +1.111550E-02 +-2.673980E-02 +7.957502E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -360,56 +752,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -4.088282E+01 -3.662539E+02 --9.859591E-01 -2.743013E-01 -2.392244E-01 -3.795971E-01 --3.389717E-01 -7.054539E-01 --1.673679E-01 -1.081377E-01 -2.918680E-01 -7.161035E-02 --5.627453E-01 -9.124299E-02 -7.185542E-01 -2.062140E-01 -8.533956E-02 -3.649126E-02 -7.630639E-02 -1.623523E-02 -3.785290E-02 -4.181389E-02 -1.388919E-01 -1.307834E-01 --2.682812E-01 -6.653584E-02 -7.151084E-02 -3.466772E-02 -6.941393E-02 -2.821800E-02 -2.392050E-02 -1.132504E-01 -3.749985E-01 -8.337209E-02 --2.998887E-01 -6.767226E-02 --3.629285E-01 -7.246083E-02 -3.989685E-01 -4.378581E-02 -1.330115E-01 -2.634398E-02 -2.649739E-01 -4.300042E-02 -5.793351E-01 -7.399884E-02 --2.236528E-01 -3.130205E-02 --3.695818E-01 -4.703480E-02 +6.484000E+01 +8.416314E+02 +-3.758929E-01 +3.104729E-01 +-7.263839E-01 +7.809822E-01 +4.648018E-03 +2.834459E-01 +-1.055002E-01 +3.040070E-02 +7.118727E-02 +7.977682E-02 +7.664673E-01 +1.821315E-01 +2.087917E-01 +4.041777E-02 +2.761598E-01 +3.014608E-01 +2.119970E-01 +2.965940E-02 +-8.139971E-01 +1.653848E-01 +1.280103E-01 +4.989381E-02 +6.090725E-01 +2.822967E-01 +2.502533E-02 +1.011286E-02 +-3.776030E-01 +2.846556E-01 +-1.484779E-01 +1.060501E-01 +3.365875E-01 +2.827604E-02 +-8.437307E-02 +9.086937E-02 +2.827425E-01 +6.353956E-02 +1.139952E-01 +1.067588E-01 +6.809505E-01 +1.329962E-01 +1.408254E-01 +3.003253E-02 +-1.222838E-01 +5.353793E-02 +-2.274047E-02 +3.333572E-02 +-1.026245E-01 +5.889851E-02 tally 3: 0.000000E+00 0.000000E+00 @@ -511,106 +903,106 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -7.200000E-01 -1.152000E-01 --9.800486E-03 -5.637123E-04 --2.018554E-02 -4.617738E-04 --6.271657E-03 -8.252833E-04 --8.231683E-03 -3.035447E-03 --2.566508E-02 -1.108829E-03 -2.748466E-03 -1.641191E-03 -6.833190E-03 -5.993876E-04 -3.392213E-02 -2.143714E-03 -3.105616E-02 -1.012625E-03 --5.473567E-02 -1.615531E-03 --1.435523E-02 -1.095690E-03 -4.579564E-03 -6.451444E-04 --1.570409E-02 -3.833387E-04 -1.633422E-02 -2.144997E-03 --7.438775E-03 -6.441846E-04 -5.440025E-04 -1.290719E-04 --1.687899E-02 -1.606230E-03 -3.315902E-02 -1.061759E-03 --1.184684E-02 -4.312573E-04 --4.732586E-02 -1.387994E-03 --1.563538E-02 -3.316015E-04 -3.681927E-02 -5.403320E-04 -2.928507E-03 -5.761742E-04 --3.519362E-02 -6.725185E-04 -1.372000E+01 -4.018980E+01 --2.015212E-01 -1.072884E-01 --2.606953E-01 -4.894468E-02 -7.537153E-02 -2.216346E-02 --3.818524E-02 -6.301675E-02 -2.386335E-01 -1.931104E-02 --1.872805E-02 -1.265896E-02 -3.732943E-02 -2.347696E-02 --8.857050E-02 -1.636275E-02 --1.718450E-01 -1.043488E-02 -1.526226E-01 -2.435399E-02 -7.344765E-02 -1.541644E-02 --9.819186E-03 -1.473467E-02 --8.215914E-03 -1.463085E-02 -2.197504E-01 -2.244815E-02 -2.521002E-02 -8.206540E-03 -3.677974E-01 -3.982027E-02 --1.934606E-01 -3.440019E-02 -1.050141E-01 -2.346980E-02 -2.458487E-01 -1.861429E-02 -4.226131E-02 -2.690841E-03 -3.174234E-02 -1.867018E-02 -2.284995E-01 -1.190246E-02 --7.894573E-03 -3.715471E-03 --1.593928E-01 -1.391828E-02 +1.220551E+00 +3.029523E-01 +1.939259E-02 +4.050014E-04 +3.502926E-03 +8.473601E-04 +4.575201E-02 +2.544994E-03 +-1.560898E-02 +2.801847E-04 +-8.658638E-03 +8.241229E-04 +-4.445033E-02 +1.063052E-03 +7.845580E-03 +2.558127E-04 +2.549169E-02 +8.288961E-04 +-9.797138E-03 +2.713506E-04 +8.620131E-03 +8.537125E-04 +-4.992993E-03 +2.206385E-04 +2.780887E-02 +3.020884E-04 +-2.040716E-02 +1.760440E-04 +2.351435E-02 +2.067041E-04 +7.044751E-03 +7.297774E-05 +7.233581E-03 +1.258072E-04 +5.582777E-03 +9.135959E-05 +3.887969E-03 +4.965340E-04 +-2.396743E-02 +7.407861E-04 +-7.371142E-03 +1.109942E-04 +-1.089834E-02 +2.188565E-04 +2.790414E-02 +2.398608E-04 +-1.464849E-02 +1.014603E-04 +-1.981204E-02 +2.919798E-04 +2.278000E+01 +1.042404E+02 +-2.705944E-01 +4.019819E-02 +8.910115E-02 +7.598548E-02 +4.240148E-01 +6.249778E-02 +-1.711683E-01 +3.365297E-02 +-1.320939E-01 +4.677615E-02 +-3.833055E-01 +3.838770E-02 +1.938748E-01 +8.311489E-02 +1.859290E-01 +1.653719E-02 +-2.875551E-01 +7.432886E-02 +1.513934E-02 +7.854478E-02 +1.932642E-02 +1.428749E-02 +4.617741E-02 +1.844961E-02 +1.063807E-01 +3.103047E-02 +1.309557E-01 +1.198530E-02 +2.797364E-01 +2.403350E-02 +-1.332777E-01 +2.277289E-02 +9.430025E-02 +5.826855E-03 +-1.012356E-01 +1.537804E-02 +-8.178736E-02 +4.470169E-02 +-1.197123E-01 +2.596045E-02 +3.984096E-02 +1.209844E-02 +1.148842E-01 +6.772712E-03 +-1.705431E-02 +3.920009E-02 +-2.694201E-02 +2.653514E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -661,56 +1053,56 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -3.200000E+00 -2.342600E+00 --2.991985E-01 -1.868406E-02 -4.460301E-02 -4.132113E-03 --2.190630E-02 -1.023889E-02 --3.265764E-02 -2.060374E-03 -3.491521E-02 -4.785957E-04 --3.623623E-02 -5.929111E-04 --4.962268E-02 -1.814245E-03 -1.406439E-01 -1.174445E-02 --9.433277E-02 -5.036897E-03 -9.058176E-02 -3.871598E-03 --1.409089E-01 -6.665385E-03 --1.062337E-01 -4.771650E-03 -1.155280E-01 -8.020320E-03 -8.348336E-02 -1.633941E-03 -1.475434E-02 -3.411046E-03 -4.474425E-03 -6.049348E-03 -6.716359E-03 -2.898000E-03 --3.674047E-02 -2.971797E-03 --2.368070E-02 -9.474965E-04 --6.109826E-02 -4.846201E-03 --5.076118E-02 -8.354393E-03 --1.763594E-02 -1.017310E-03 --2.941064E-02 -1.044916E-03 --5.631429E-03 -3.915186E-03 +4.350000E+00 +3.833900E+00 +2.792800E-01 +3.102658E-02 +-2.343095E-01 +3.826449E-02 +3.428573E-02 +6.437027E-03 +-1.025176E-01 +1.798807E-02 +-4.106130E-02 +3.786695E-03 +-1.470480E-01 +8.519720E-03 +1.989035E-02 +5.067928E-03 +8.094404E-02 +3.412899E-03 +-5.616421E-02 +2.709728E-03 +2.421213E-02 +3.683849E-03 +4.794858E-02 +4.392540E-03 +-1.637085E-02 +5.339723E-03 +-2.046073E-02 +5.231271E-03 +1.554627E-02 +4.457612E-03 +-3.441131E-02 +7.049061E-03 +-1.139075E-01 +7.627867E-03 +-8.358967E-02 +4.023855E-03 +1.221815E-01 +5.628324E-03 +-2.061337E-02 +1.926605E-03 +-1.583607E-02 +1.093902E-03 +-7.623859E-02 +5.519074E-03 +-1.115748E-02 +3.984642E-03 +7.665232E-02 +1.111550E-02 +-2.673980E-02 +7.957502E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -761,454 +1153,53 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -4.104000E+01 -3.668254E+02 --7.832373E-01 -3.913941E-01 -2.281642E-01 -2.669856E-01 --3.731272E-01 -6.152809E-01 --3.232973E-01 -7.526283E-02 -3.686513E-01 -9.047618E-02 --6.018185E-01 -9.140623E-02 -3.848843E-01 -3.431711E-01 -3.397425E-03 -8.879103E-02 --2.471531E-02 -5.561795E-02 -1.373897E-01 -7.288680E-02 -1.816888E-01 -5.419638E-02 --3.504404E-01 -1.461853E-01 -1.225356E-01 -3.443595E-02 --3.109887E-01 -5.492397E-02 --3.542105E-01 -6.530224E-02 -2.104218E-01 -4.093872E-02 -2.661467E-02 -3.058847E-02 --3.744331E-01 -6.755739E-02 -1.391218E-01 -4.432842E-02 -1.622041E-01 -6.843992E-03 -4.149973E-02 -1.782398E-02 -2.551752E-01 -2.626972E-02 --4.706697E-01 -9.193926E-02 --1.287882E-01 -3.489982E-02 -tally 4: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.652157E-01 -1.242826E-01 --1.008373E-02 -5.281691E-04 --1.014715E-02 -2.749212E-04 --2.506414E-02 -2.613512E-04 -4.320187E-03 -4.316562E-04 -1.439246E-02 -9.138575E-05 --1.532539E-02 -2.360878E-04 -9.963404E-03 -1.511695E-04 --6.314554E-03 -2.742799E-05 -7.969329E-03 -1.380329E-04 --1.298431E-03 -3.287236E-04 -1.441639E-02 -1.409552E-04 -6.516689E-03 -2.511011E-04 -1.294596E-02 -2.249729E-04 -6.983038E-03 -6.334969E-05 --1.086161E-02 -1.140033E-04 -2.217006E-02 -4.221807E-04 --6.503276E-03 -2.028281E-04 -2.915180E-02 -3.659182E-04 --9.080091E-03 -1.503808E-04 --6.476980E-04 -1.927326E-04 --1.549603E-02 -3.445843E-04 -2.957508E-02 -1.835035E-04 -6.982790E-03 -1.237342E-04 --2.653281E-02 -2.606704E-04 -1.372000E+01 -4.018980E+01 --2.015212E-01 -1.072884E-01 --2.606953E-01 -4.894468E-02 -7.537153E-02 -2.216346E-02 --3.818524E-02 -6.301675E-02 -2.386335E-01 -1.931104E-02 --1.872805E-02 -1.265896E-02 -3.732943E-02 -2.347696E-02 --8.857050E-02 -1.636275E-02 --1.718450E-01 -1.043488E-02 -1.526226E-01 -2.435399E-02 -7.344765E-02 -1.541644E-02 --9.819186E-03 -1.473467E-02 --8.215914E-03 -1.463085E-02 -2.197504E-01 -2.244815E-02 -2.521002E-02 -8.206540E-03 -3.677974E-01 -3.982027E-02 --1.934606E-01 -3.440019E-02 -1.050141E-01 -2.346980E-02 -2.458487E-01 -1.861429E-02 -4.226131E-02 -2.690841E-03 -3.174234E-02 -1.867018E-02 -2.284995E-01 -1.190246E-02 --7.894573E-03 -3.715471E-03 --1.593928E-01 -1.391828E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.200000E+00 -2.342600E+00 --2.991985E-01 -1.868406E-02 -4.460301E-02 -4.132113E-03 --2.190630E-02 -1.023889E-02 --3.265764E-02 -2.060374E-03 -3.491521E-02 -4.785957E-04 --3.623623E-02 -5.929111E-04 --4.962268E-02 -1.814245E-03 -1.406439E-01 -1.174445E-02 --9.433277E-02 -5.036897E-03 -9.058176E-02 -3.871598E-03 --1.409089E-01 -6.665385E-03 --1.062337E-01 -4.771650E-03 -1.155280E-01 -8.020320E-03 -8.348336E-02 -1.633941E-03 -1.475434E-02 -3.411046E-03 -4.474425E-03 -6.049348E-03 -6.716359E-03 -2.898000E-03 --3.674047E-02 -2.971797E-03 --2.368070E-02 -9.474965E-04 --6.109826E-02 -4.846201E-03 --5.076118E-02 -8.354393E-03 --1.763594E-02 -1.017310E-03 --2.941064E-02 -1.044916E-03 --5.631429E-03 -3.915186E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.104000E+01 -3.668254E+02 --7.832373E-01 -3.913941E-01 -2.281642E-01 -2.669856E-01 --3.731272E-01 -6.152809E-01 --3.232973E-01 -7.526283E-02 -3.686513E-01 -9.047618E-02 --6.018185E-01 -9.140623E-02 -3.848843E-01 -3.431711E-01 -3.397425E-03 -8.879103E-02 --2.471531E-02 -5.561795E-02 -1.373897E-01 -7.288680E-02 -1.816888E-01 -5.419638E-02 --3.504404E-01 -1.461853E-01 -1.225356E-01 -3.443595E-02 --3.109887E-01 -5.492397E-02 --3.542105E-01 -6.530224E-02 -2.104218E-01 -4.093872E-02 -2.661467E-02 -3.058847E-02 --3.744331E-01 -6.755739E-02 -1.391218E-01 -4.432842E-02 -1.622041E-01 -6.843992E-03 -4.149973E-02 -1.782398E-02 -2.551752E-01 -2.626972E-02 --4.706697E-01 -9.193926E-02 --1.287882E-01 -3.489982E-02 +6.484000E+01 +8.416314E+02 +-3.758929E-01 +3.104729E-01 +-7.263839E-01 +7.809822E-01 +4.648018E-03 +2.834459E-01 +-1.055002E-01 +3.040070E-02 +7.118727E-02 +7.977682E-02 +7.664673E-01 +1.821315E-01 +2.087917E-01 +4.041777E-02 +2.761598E-01 +3.014608E-01 +2.119970E-01 +2.965940E-02 +-8.139971E-01 +1.653848E-01 +1.280103E-01 +4.989381E-02 +6.090725E-01 +2.822967E-01 +2.502533E-02 +1.011286E-02 +-3.776030E-01 +2.846556E-01 +-1.484779E-01 +1.060501E-01 +3.365875E-01 +2.827604E-02 +-8.437307E-02 +9.086937E-02 +2.827425E-01 +6.353956E-02 +1.139952E-01 +1.067588E-01 +6.809505E-01 +1.329962E-01 +1.408254E-01 +3.003253E-02 +-1.222838E-01 +5.353793E-02 +-2.274047E-02 +3.333572E-02 +-1.026245E-01 +5.889851E-02 diff --git a/tests/test_score_total_yn/settings.xml b/tests/test_score_total_yn/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_total_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_total_yn/tallies.xml b/tests/test_score_total_yn/tallies.xml deleted file mode 100644 index 51cb79c395..0000000000 --- a/tests/test_score_total_yn/tallies.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - total - - - - - total-y4 - U-235 total - - - - - total-y4 - U-235 total - analog - - - - - total-y4 - U-235 total - collision - - - diff --git a/tests/test_score_total_yn/test_score_total_yn.py b/tests/test_score_total_yn/test_score_total_yn.py index 1777db993e..07cac86d2a 100644 --- a/tests/test_score_total_yn/test_score_total_yn.py +++ b/tests/test_score_total_yn/test_score_total_yn.py @@ -2,9 +2,33 @@ import sys sys.path.insert(0, '..') -from testing_harness import TestHarness +from testing_harness import TestHarness, PyAPITestHarness +import openmc +import os + + +class ScoreTotalYNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('total-y4') for t in tallies] + [t.add_nuclide('U-235') for t in tallies] + [t.add_nuclide('total') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + PyAPITestHarness._build_inputs(self) + + def _cleanup(self): + PyAPITestHarness._cleanup(self) + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreTotalYNTestHarness('statepoint.10.*', True) harness.main() From 3e0c960648053eb8ab4ff202ba4a6bf59ca46306 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 2 Oct 2015 18:12:35 -0400 Subject: [PATCH 245/519] Fixed multi-group chi calculation --- openmc/mgxs/mgxs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index bc9167dfd1..fd696ff722 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1738,9 +1738,11 @@ class Chi(MultiGroupXS): nu_fission_in.remove_filter(energy_filter) # Compute chi + self._xs_tally = nu_fission_out / nu_fission_in + + # Add the coarse energy filter back to the nu-fission tally nu_fission_in.add_filter(energy_filter) - self._xs_tally = nu_fission_out / nu_fission_in super(Chi, self).compute_xs() def get_xs(self, groups='all', subdomains='all', nuclides='all', From 27548d6232b988eb0780000c5a2562a3707ca8c6 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 2 Oct 2015 22:25:07 -0400 Subject: [PATCH 246/519] Allow mpif90 in run_tests.py --- tests/run_tests.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/run_tests.py b/tests/run_tests.py index d3b79aa3b1..70ea4c3dc9 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -126,7 +126,12 @@ class Test(object): # Check for MPI if self.mpi: - self.fc = os.path.join(MPI_DIR, 'bin', 'mpifort') + if os.path.exists(os.path.join(MPI_DIR, 'bin', 'mpifort')): + self.fc = os.path.join(MPI_DIR, 'bin', 'mpifort') + elif os.path.exists(os.path.join(MPI_DIR, 'bin', 'mpif90')): + self.fc = os.path.join(MPI_DIR, 'bin', 'mpif90') + else: + raise RuntimeError('Cannot find an MPI Fortran compiler') else: self.fc = FC From 71dfde8d12942170a9a8d91796ab40a6e9becaaf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 3 Oct 2015 09:26:50 +0700 Subject: [PATCH 247/519] Adopt shorthand notation for half-spaces and regions in Python API Surfaces now have __neg__ and __pos__ operators, and regions have __and__, __or__, and __invert__. This makes the syntax for complex regions much less bulky. --- docs/source/usersguide/input.rst | 4 ++-- openmc/region.py | 29 ++++++++++++++++++---------- openmc/surface.py | 20 ++++++------------- src/string.F90 | 8 ++++---- tests/test_complex_cell/geometry.xml | 2 +- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index fbc74de4af..91751596ae 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -896,7 +896,7 @@ Each ```` element can have the following attributes or sub-elements: the cell occupies. Each half-space is identified by the unique ID of the surface prefixed by `-` or `+` to indicate that it is the negative or positive half-space, respectively. The `+` sign for a positive half-space - can be omitted. Valid Boolean operators are parentheses, union `^`, + can be omitted. Valid Boolean operators are parentheses, union `|`, complement `~`, and intersection. Intersection is implicit and indicated by the presence of whitespace. The order of operator precedence is parentheses, complement, intersection, and then union. @@ -908,7 +908,7 @@ Each ```` element can have the following attributes or sub-elements: .. code-block:: xml - + .. note:: The ``region`` attribute/element can be omitted to make a cell fill its entire universe. diff --git a/openmc/region.py b/openmc/region.py index cb745b7f8c..c4e1e2143b 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -7,6 +7,15 @@ from openmc.checkvalue import check_type class Region(object): __metaclass__ = ABCMeta + def __and__(self, other): + return Intersection(self, other) + + def __or__(self, other): + return Union(self, other) + + def __invert__(self): + return Complement(self) + @abstractmethod def __str__(self): return '' @@ -19,8 +28,8 @@ class Region(object): ---------- expression : str Boolean expression relating surface half-spaces. The possible - operators are union '^', intersection ' ', and complement '~'. For - example, '(1 -2) ^ 3 ~(4 -5)'. + operators are union '|', intersection ' ', and complement '~'. For + example, '(1 -2) | 3 ~(4 -5)'. surfaces : dict Dictionary whose keys are suface IDs that appear in the Boolean expression and whose values are Surface objects. @@ -37,7 +46,7 @@ class Region(object): i_start = -1 tokens = [] while i < len(expression): - if expression[i] in '()^~ ': + if expression[i] in '()|~ ': # If special character appears immediately after a non-operator, # create a token with the apporpriate half-space if i_start >= 0: @@ -47,7 +56,7 @@ class Region(object): else: tokens.append(surfaces[abs(j)].positive) - if expression[i] in '()^~': + if expression[i] in '()|~': # For everything other than intersection, add the operator # to the list of tokens tokens.append(expression[i]) @@ -60,7 +69,7 @@ class Region(object): # is not a left parenthese or union operator, that implies that the # whitespace is to be interpreted as an intersection operator if (i_start >= 0 or tokens[-1] == ')') and \ - expression[i+1] not in ')^': + expression[i+1] not in ')|': tokens.append(' ') i_start = -1 @@ -104,7 +113,7 @@ class Region(object): output.append(r1) else: output.append(Intersection(r1, r2)) - elif operator == '^': + elif operator == '|': r1 = output.pop() if isinstance(r1, Union) and can_be_combined(r2): r1.nodes.append(r2) @@ -124,10 +133,10 @@ class Region(object): # generate an abstract syntax tree for the region expression. output = [] stack = [] - precedence = {'^': 1, ' ': 2, '~': 3} - associativity = {'^': 'left', ' ': 'left', '~': 'right'} + precedence = {'|': 1, ' ': 2, '~': 3} + associativity = {'|': 'left', ' ': 'left', '~': 'right'} for token in tokens: - if token in (' ', '^', '~'): + if token in (' ', '|', '~'): # Normal operators while stack: op = stack[-1] @@ -225,7 +234,7 @@ class Union(Region): self._nodes = nodes def __str__(self): - return '(' + ' ^ '.join(map(str, self.nodes)) + ')' + return '(' + ' | '.join(map(str, self.nodes)) + ')' class Complement(Region): diff --git a/openmc/surface.py b/openmc/surface.py index 98ec903c7c..a5763d9cf2 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -48,12 +48,6 @@ class Surface(object): Unique identifier for the surface name : str Name of the surface - negative : Halfspace - Negative half-space of the surface, i.e., if :math:`f(x,y,z) = 0` is the - equation for the sufrace, the region for which :math:`f(x,y,z) < 0`. - positive : Halfspace - Positive half-space of the surface, i.e., if :math:`f(x,y,z) = 0` is the - equation for the sufrace, the region for which :math:`f(x,y,z) > 0`. type : str Type of the surface, e.g. 'x-plane' @@ -75,6 +69,12 @@ class Surface(object): # proper order self._coeff_keys = [] + def __neg__(self): + return Halfspace(self, '-') + + def __pos__(self): + return Halfspace(self, '+') + @property def id(self): return self._id @@ -95,14 +95,6 @@ class Surface(object): def coeffs(self): return self._coeffs - @property - def negative(self): - return Halfspace(self, '-') - - @property - def positive(self): - return Halfspace(self, '+') - @id.setter def id(self, surface_id): if surface_id is None: diff --git a/src/string.F90 b/src/string.F90 index b505aa869b..91a255a361 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -67,7 +67,7 @@ contains !=============================================================================== ! TOKENIZE takes a string that includes logical expressions for a list of ! bounding surfaces in a cell and splits it into separate tokens. The characters -! (, ), ^, and ~ count as separate tokens since they represent operators. +! (, ), |, and ~ count as separate tokens since they represent operators. !=============================================================================== subroutine tokenize(string, tokens) @@ -85,7 +85,7 @@ contains i = 1 do while (i <= len_trim(string_)) ! Check for special characters - if (index('()^~ ', string_(i:i)) > 0) then + if (index('()|~ ', string_(i:i)) > 0) then ! If the special character appears immediately after a non-operator, ! create a token with the surface half-space if (i_start > 0) then @@ -98,7 +98,7 @@ contains call tokens%push_back(OP_LEFT_PAREN) case (')') call tokens%push_back(OP_RIGHT_PAREN) - case ('^') + case ('|') call tokens%push_back(OP_UNION) case ('~') call tokens%push_back(OP_COMPLEMENT) @@ -112,7 +112,7 @@ contains ! is not a left parenthese or union operator, that implies that the ! whitespace is to be interpreted as an intersection operator if (i_start > 0 .or. tokens%data(tokens%size()) == OP_RIGHT_PAREN) then - if (index(')^', string_(i+1:i+1)) == 0) then + if (index(')|', string_(i+1:i+1)) == 0) then call tokens%push_back(OP_INTERSECTION) end if end if diff --git a/tests/test_complex_cell/geometry.xml b/tests/test_complex_cell/geometry.xml index 1609dad104..18e304fe0e 100644 --- a/tests/test_complex_cell/geometry.xml +++ b/tests/test_complex_cell/geometry.xml @@ -18,7 +18,7 @@ - + From b9024f2d8ef0558049a51b873798f59fde6d083b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 3 Oct 2015 09:55:58 +0700 Subject: [PATCH 248/519] Update example inputs and Jupyter notebooks --- .../examples/pandas-dataframes.ipynb | 55 ++++++++-------- .../pythonapi/examples/post-processing.ipynb | 66 +++++++++---------- .../pythonapi/examples/tally-arithmetic.ipynb | 43 ++++++------ examples/python/basic/build-xml.py | 11 ++-- .../python/lattice/hexagonal/build-xml.py | 14 ++-- examples/python/lattice/nested/build-xml.py | 21 +++--- examples/python/lattice/simple/build-xml.py | 18 +++-- examples/python/pincell/build-xml.py | 12 ++-- examples/python/reflective/build-xml.py | 7 +- openmc/region.py | 8 +-- openmc/universe.py | 2 +- 11 files changed, 117 insertions(+), 140 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 357f10620f..15b778662a 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -26,7 +26,6 @@ "import openmc\n", "from openmc.statepoint import StatePoint\n", "from openmc.summary import Summary\n", - "from openmc.region import Intersection\n", "\n", "%matplotlib inline" ] @@ -173,20 +172,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.region = fuel_outer_radius.negative\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.region = Intersection(fuel_outer_radius.positive,\n", - " clad_outer_radius.negative)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.region = clad_outer_radius.positive\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -233,9 +231,7 @@ "root_cell.fill = assembly\n", "\n", "# Add boundary planes\n", - "root_cell.region = Intersection(min_x.positive, max_x.negative,\n", - " min_y.positive, max_y.negative,\n", - " min_z.positive, max_z.negative)\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", @@ -372,7 +368,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQMbBgd4EXAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMjFUMTA6MjU6\nMjYrMDc6MDAKj62JAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTIxVDEwOjI1OjI2KzA3OjAw\ne9IVNQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KAwIzOzFd628AAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDA5OjUxOjEzKzA3OjAwBMrIlQAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwOTo1MToxMyswNzowMHWXcCkAAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] @@ -561,8 +557,9 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", - " Date/Time: 2015-09-21 10:27:06\n", + " Git SHA1: 71dfde8d12942170a9a8d91796ab40a6e9becaaf\n", + " Date/Time: 2015-10-03 09:52:00\n", + " OpenMP Threads: 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -629,20 +626,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.4100E-01 seconds\n", - " Reading cross sections = 1.7900E-01 seconds\n", - " Total time in simulation = 1.2656E+01 seconds\n", - " Time in transport only = 1.2642E+01 seconds\n", - " Time in inactive batches = 2.0300E+00 seconds\n", - " Time in active batches = 1.0626E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Total time for initialization = 3.9200E-01 seconds\n", + " Reading cross sections = 1.3900E-01 seconds\n", + " Total time in simulation = 3.8950E+00 seconds\n", + " Time in transport only = 3.7970E+00 seconds\n", + " Time in inactive batches = 5.0500E-01 seconds\n", + " Time in active batches = 3.3900E+00 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.3110E+01 seconds\n", - " Calculation Rate (inactive) = 6157.64 neutrons/second\n", - " Calculation Rate (active) = 3529.08 neutrons/second\n", + " Total time elapsed = 4.2970E+00 seconds\n", + " Calculation Rate (inactive) = 24752.5 neutrons/second\n", + " Calculation Rate (active) = 11061.9 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1083,7 +1080,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1106,7 +1103,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1117,7 +1114,7 @@ "data": { "image/png": "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\nEvx/rHWCrxSlro8AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2374,7 +2371,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2385,7 +2382,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2412,7 +2409,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2423,7 +2420,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index e83c5bb8a1..1d4e578283 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -21,7 +21,6 @@ "\n", "import openmc\n", "from openmc.statepoint import StatePoint\n", - "from openmc.region import Intersection\n", "\n", "%matplotlib inline" ] @@ -168,20 +167,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.region = fuel_outer_radius.negative\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.region = Intersection(fuel_outer_radius.positive,\n", - " clad_outer_radius.negative)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator.region = clad_outer_radius.positive\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -205,9 +203,7 @@ "root_cell.fill = pin_cell_universe\n", "\n", "# Add boundary planes\n", - "root_cell.region = Intersection(min_x.positive, max_x.negative,\n", - " min_y.positive, max_y.negative,\n", - " min_z.positive, max_z.negative)\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", @@ -340,7 +336,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEwAiCb5uYN4AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMThUMjE6MTc6\nMDErMDc6MDA/DItCAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTE4VDIxOjE3OjAxKzA3OjAw\nTlEz/gAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KAwIrNs33D4sAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTAtMDNUMDk6NDE6\nNDYrMDc6MDDfnDaWAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAzVDA5OjQxOjQ2KzA3OjAw\nrsGOKgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -452,8 +448,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 3df61825cc8c93656ed1458c34fca14000884e73\n", - " Date/Time: 2015-09-19 07:34:09\n", + " Git SHA1: 71dfde8d12942170a9a8d91796ab40a6e9becaaf\n", + " Date/Time: 2015-10-03 09:43:54\n", " OpenMP Threads: 4\n", "\n", " ===========================================================================\n", @@ -589,20 +585,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6600E-01 seconds\n", - " Reading cross sections = 1.1500E-01 seconds\n", - " Total time in simulation = 8.1308E+01 seconds\n", - " Time in transport only = 8.1157E+01 seconds\n", - " Time in inactive batches = 2.1600E+00 seconds\n", - " Time in active batches = 7.9148E+01 seconds\n", - " Time synchronizing fission bank = 1.6000E-02 seconds\n", - " Sampling source sites = 9.0000E-03 seconds\n", - " SEND/RECV source sites = 7.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-02 seconds\n", - " Total time for finalization = 1.6400E-01 seconds\n", - " Total time elapsed = 8.1856E+01 seconds\n", - " Calculation Rate (inactive) = 23148.1 neutrons/second\n", - " Calculation Rate (active) = 5685.55 neutrons/second\n", + " Total time for initialization = 4.3100E-01 seconds\n", + " Reading cross sections = 1.3800E-01 seconds\n", + " Total time in simulation = 1.1654E+02 seconds\n", + " Time in transport only = 1.1510E+02 seconds\n", + " Time in inactive batches = 3.7070E+00 seconds\n", + " Time in active batches = 1.1283E+02 seconds\n", + " Time synchronizing fission bank = 1.0000E-02 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 6.0000E-03 seconds\n", + " Total time for finalization = 2.7600E-01 seconds\n", + " Total time elapsed = 1.1727E+02 seconds\n", + " Calculation Rate (inactive) = 13488.0 neutrons/second\n", + " Calculation Rate (active) = 3988.19 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -680,8 +676,8 @@ "\tName =\t\n", "\tFilters =\t\n", " \t\tmesh\t[10000]\n", - "\tNuclides =\t-1 \n", - "\tScores =\t['flux', 'fission']\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux', u'fission']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -815,8 +811,8 @@ "\tName =\t\n", "\tFilters =\t\n", " \t\tmesh\t[10000]\n", - "\tNuclides =\t-1 \n", - "\tScores =\t['flux']\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -859,7 +855,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -870,7 +866,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -902,7 +898,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1016,7 +1012,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 28, @@ -1027,7 +1023,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEUCAYAAAA8+dFZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGeRJREFUeJzt3X20ZFV55/Hvz8YXUBL6Jo4O0IojELtdOgENsGJmxBdc\npFVQOhFoEpUZBY0dXyaZMK6oMOOsTHSiImHJ4BIVDQ0qEAdHEF9BaR0UQVT6grAcMrysIcRu3yAq\nL8/8UXWhKG7VrXO7zq26t7+ftWp1nX32OfXUprof9tn77JOqQpKkUT1i0gFIkpYXE4ckqREThySp\nEROHJKkRE4ckqREThySpkVYTR5LDk1yf5MYkJ82z/2lJvpHkF0n+rMmxkqTJSFv3cSRZBdwAvBC4\nDfgWcGxVzfbUeTzwZOBlwPaqes+ox0qSJqPNHsdBwE1VdXNV3QOcBxzZW6Gq7qyqq4B7mh4rSZqM\nNhPHXsAtPdu3dsvaPlaS1KI2E8eOXANzHRRJmlK7tHju24A1Pdtr6PQcxnZsEhOMJC1CVWWxx7bZ\n47gK2C/JPkkeBRwNXDSgbv8XGPnYqmr9dfLJJ7d+3EJ1B+1vUt5f1r991FFHTW1bNjl2lHq25/ja\nc9j+UdptlLKlaMsdac+l+Lu+I+3Zv72jWutxVNW9STYBlwKrgLOqajbJid39ZyZ5Ip0ZU78G3J/k\nTcC6qvr5fMe2FetCDj300NaPW6juoP1NyvvLFvu9dsSOfOaox45Sz/YcX3sO2z9KuzUpa9s0/10f\ntG8Sv83WpuMuhSS1nOOfNhs2bOCCCy6YdBgrhu05PrbleCWhpvRSlZaZtWvXTjqEFcX2HB/bcrqY\nOPSAdevWTTqEFcX2HB/bcrqYOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmN\nmDgkSY2YOCRJjZg4JK14MzOQzP+amZl0dMtPmw9ykqSpsH07DFpIO4teI3bnZY9DktSIiUOS1IiJ\nQ5LUiIlDktSIiUPSsuHsqOngrCpJy4azo6aDPQ5JUiMmDklSIyYOSVIjJg5JUiMmDklSIyYOSZqH\nU38HczquJM3Dqb+D2eOQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1\n0mriSHJ4kuuT3JjkpAF1TuvuvzbJAT3lb01yXZLvJdmc5NFtxipJGk1riSPJKuB04HBgHXBskrV9\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1078,7 +1074,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index b5ba328a05..7b850a2ebb 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -36,7 +36,6 @@ "import openmc\n", "from openmc.statepoint import StatePoint\n", "from openmc.summary import Summary\n", - "from openmc.region import Intersection\n", "\n", "%matplotlib inline" ] @@ -183,20 +182,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.region = fuel_outer_radius.negative\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.region = Intersection(fuel_outer_radius.positive,\n", - " clad_outer_radius.negative)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.region = clad_outer_radius.positive\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -220,9 +218,7 @@ "root_cell.fill = pin_cell_universe\n", "\n", "# Add boundary planes\n", - "root_cell.region = Intersection(min_x.positive, max_x.negative,\n", - " min_y.positive, max_y.negative,\n", - " min_z.positive, max_z.negative)\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", @@ -356,7 +352,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQMZGiFPL70AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMjFUMTA6MDg6\nNTcrMDc6MDALr51VAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTIxVDEwOjA4OjU3KzA3OjAw\nevIl6QAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KAwI1HbUKyRQAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDA5OjUxOjU5KzA3OjAwJPCZIQAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwOTo1MTo1OSswNzowMFWtIZ0AAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] @@ -567,8 +563,9 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", - " Date/Time: 2015-09-21 10:25:26\n", + " Git SHA1: 71dfde8d12942170a9a8d91796ab40a6e9becaaf\n", + " Date/Time: 2015-10-03 09:53:29\n", + " OpenMP Threads: 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -623,20 +620,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.1800E-01 seconds\n", - " Reading cross sections = 6.5800E-01 seconds\n", - " Total time in simulation = 1.7037E+01 seconds\n", - " Time in transport only = 1.7024E+01 seconds\n", - " Time in inactive batches = 2.8600E+00 seconds\n", - " Time in active batches = 1.4177E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", + " Total time for initialization = 3.7200E-01 seconds\n", + " Reading cross sections = 1.2400E-01 seconds\n", + " Total time in simulation = 4.7110E+00 seconds\n", + " Time in transport only = 4.6510E+00 seconds\n", + " Time in inactive batches = 6.1900E-01 seconds\n", + " Time in active batches = 4.0920E+00 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.7971E+01 seconds\n", - " Calculation Rate (inactive) = 4370.63 neutrons/second\n", - " Calculation Rate (active) = 2645.13 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 5.0950E+00 seconds\n", + " Calculation Rate (inactive) = 20193.9 neutrons/second\n", + " Calculation Rate (active) = 9164.22 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", diff --git a/examples/python/basic/build-xml.py b/examples/python/basic/build-xml.py index 865740e13b..488603d33f 100644 --- a/examples/python/basic/build-xml.py +++ b/examples/python/basic/build-xml.py @@ -1,5 +1,4 @@ import openmc -from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -54,11 +53,11 @@ cell2 = openmc.Cell(cell_id=100, name='cell 2') cell3 = openmc.Cell(cell_id=101, name='cell 3') cell4 = openmc.Cell(cell_id=2, name='cell 4') -# Register Surfaces with Cells -cell1.region = surf2.negative -cell2.region = surf1.negative -cell3.region = surf1.positive -cell4.region = Intersection(surf2.positive, surf3.negative) +# Use surface half-spaces to define regions +cell1.region = -surf2 +cell2.region = -surf1 +cell3.region = +surf1 +cell4.region = +surf2 & -surf3 # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/lattice/hexagonal/build-xml.py b/examples/python/lattice/hexagonal/build-xml.py index b042e830ad..5fa0f9b1b9 100644 --- a/examples/python/lattice/hexagonal/build-xml.py +++ b/examples/python/lattice/hexagonal/build-xml.py @@ -1,5 +1,4 @@ import openmc -from openmc.region import Intersection ############################################################################### @@ -68,13 +67,12 @@ cell4 = openmc.Cell(cell_id=500, name='cell 4') cell5 = openmc.Cell(cell_id=600, name='cell 5') cell6 = openmc.Cell(cell_id=601, name='cell 6') -# Register Surfaces with Cells -cell1.region = Intersection(left.positive, right.negative, - bottom.positive, top.negative) -cell2.region = fuel_surf.negative -cell3.region = fuel_surf.positive -cell5.region = fuel_surf.negative -cell6.region = fuel_surf.positive +# Use surface half-spaces to define regions +cell1.region = +left & -right & +bottom & -top +cell2.region = -fuel_surf +cell3.region = +fuel_surf +cell5.region = -fuel_surf +cell6.region = +fuel_surf # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index f4bc7d1ac9..501b3ee4b4 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -1,5 +1,4 @@ import openmc -from openmc.region import Intersection ############################################################################### @@ -67,17 +66,15 @@ cell6 = openmc.Cell(cell_id=202, name='cell 6') cell7 = openmc.Cell(cell_id=301, name='cell 7') cell8 = openmc.Cell(cell_id=302, name='cell 8') -# Register Surfaces with Cells -cell1.region = Intersection(left.positive, right.negative, - bottom.positive, top.negative) -cell2.region = Intersection(left.positive, right.negative, - bottom.positive, top.negative) -cell3.region = fuel1.negative -cell4.region = fuel1.positive -cell5.region = fuel2.negative -cell6.region = fuel2.positive -cell7.region = fuel3.negative -cell8.region = fuel3.positive +# Use surface half-space to define regions +cell1.region = +left & -right & +bottom & -top +cell2.region = +left & -right & +bottom & -top +cell3.region = -fuel1 +cell4.region = +fuel1 +cell5.region = -fuel2 +cell6.region = +fuel2 +cell7.region = -fuel3 +cell8.region = +fuel3 # Register Materials with Cells cell3.fill = fuel diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index 155cfa1cbf..00fbea22a4 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -1,5 +1,4 @@ import openmc -from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -65,15 +64,14 @@ cell5 = openmc.Cell(cell_id=202, name='cell 5') cell6 = openmc.Cell(cell_id=301, name='cell 6') cell7 = openmc.Cell(cell_id=302, name='cell 7') -# Register Regions with Cells -cell1.region = Intersection(left.positive, right.negative, - bottom.positive, top.negative) -cell2.region = fuel1.negative -cell3.region = fuel1.positive -cell4.region = fuel2.negative -cell5.region = fuel2.positive -cell6.region = fuel3.negative -cell7.region = fuel3.positive +# Use surface half-spaces to define regions +cell1.region = +left & -right & +bottom & -top +cell2.region = -fuel1 +cell3.region = +fuel1 +cell4.region = -fuel2 +cell5.region = +fuel2 +cell6.region = -fuel3 +cell7.region = +fuel3 # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index d37024db3e..b3bb932dc8 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -1,5 +1,4 @@ import openmc -from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -132,12 +131,11 @@ gap = openmc.Cell(cell_id=2, name='cell 2') clad = openmc.Cell(cell_id=3, name='cell 3') water = openmc.Cell(cell_id=4, name='cell 4') -# Register Surfaces with Cells -fuel.region = fuel_or.negative -gap.region = Intersection(fuel_or.positive, clad_ir.negative) -clad.region = Intersection(clad_ir.positive, clad_or.negative) -water.region = Intersection(clad_or.positive, left.positive, right.negative, - bottom.positive, top.negative) +# Use surface half-spaces to define regions +fuel.region = -fuel_or +gap.region = +fuel_or & -clad_ir +clad.region = +clad_ir & -clad_or +water.region = +clad_or & +left & -right & +bottom & -top # Register Materials with Cells fuel.fill = uo2 diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 5a3e861e60..9eab4aec32 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -1,5 +1,4 @@ import openmc -from openmc.region import Intersection ############################################################################### # Simulation Input File Parameters @@ -52,10 +51,8 @@ surf6.boundary_type = 'reflective' # Instantiate Cell cell = openmc.Cell(cell_id=1, name='cell 1') -# Register Region with Cell -cell.region = Intersection(surf1.positive, surf2.negative, - surf3.positive, surf4.negative, - surf5.positive, surf6.negative) +# Use surface half-spaces to define region +cell.region = +surf1 & -surf2 & +surf3 & -surf4 & +surf5 & -surf6 # Register Material with Cell cell.fill = fuel diff --git a/openmc/region.py b/openmc/region.py index c4e1e2143b..24a21c3970 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -52,9 +52,9 @@ class Region(object): if i_start >= 0: j = int(expression[i_start:i]) if j < 0: - tokens.append(surfaces[abs(j)].negative) + tokens.append(-surfaces[abs(j)]) else: - tokens.append(surfaces[abs(j)].positive) + tokens.append(+surfaces[abs(j)]) if expression[i] in '()|~': # For everything other than intersection, add the operator @@ -89,9 +89,9 @@ class Region(object): if i_start >= 0: j = int(expression[i_start:]) if j < 0: - tokens.append(surfaces[abs(j)].negative) + tokens.append(-surfaces[abs(j)]) else: - tokens.append(surfaces[abs(j)].positive) + tokens.append(+surfaces[abs(j)]) # The functions below are used to apply an operator to operands on the # output queue during the shunting yard algorithm. diff --git a/openmc/universe.py b/openmc/universe.py index e9a693bc43..c03e1305c6 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -194,7 +194,7 @@ class Cell(object): # If no region has been assigned, simply use the half-space. Otherwise, # take the intersection of the current region and the half-space # specified - region = surface.positive if halfspace == 1 else surface.negative + region = +surface if halfspace == 1 else -surface if self.region is None: self.region = region else: From 81ed29cc3825cf7fae1bcecfa4f11b8dd860b3de Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 3 Oct 2015 10:01:00 +0700 Subject: [PATCH 249/519] Add deprecation warning for Cell.add_surface() --- openmc/universe.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openmc/universe.py b/openmc/universe.py index c03e1305c6..d7988c8d90 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -3,6 +3,7 @@ from collections import OrderedDict, Iterable from numbers import Real, Integral from xml.etree import ElementTree as ET import sys +import warnings import numpy as np @@ -181,6 +182,12 @@ class Cell(object): """ + warnings.simplefilter('always', DeprecationWarning) + warnings.warn("Cell.add_surface(...) has been deprecated and may be " + "removed in a future version. The region for a Cell " + "should be defined using the region property directly.", + DeprecationWarning) + if not isinstance(surface, openmc.Surface): msg = 'Unable to add Surface "{0}" to Cell ID="{1}" since it is ' \ 'not a Surface object'.format(surface, self._id) From d14750149a42bd41013587847c040c179f371412 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 2 Oct 2015 23:19:00 -0400 Subject: [PATCH 250/519] Fix Python paths in tests --- .gitignore | 3 ++- tests/test_basic/test_basic.py | 4 +++- tests/test_cmfd_feed/test_cmfd_feed.py | 4 +++- tests/test_cmfd_nofeed/test_cmfd_nofeed.py | 4 +++- .../test_confidence_intervals.py | 4 +++- tests/test_density_atombcm/test_density_atombcm.py | 4 +++- tests/test_density_atomcm3/test_density_atomcm3.py | 4 +++- tests/test_density_kgm3/test_density_kgm3.py | 4 +++- tests/test_density_sum/test_density_sum.py | 4 +++- .../test_eigenvalue_genperbatch.py | 4 +++- .../test_eigenvalue_no_inactive.py | 4 +++- tests/test_energy_grid/test_energy_grid.py | 4 +++- tests/test_entropy/test_entropy.py | 7 ++++--- tests/test_filter_cell/test_filter_cell.py | 5 +++-- tests/test_filter_cellborn/test_filter_cellborn.py | 5 +++-- tests/test_filter_distribcell/test_filter_distribcell.py | 4 ++-- tests/test_filter_energy/test_filter_energy.py | 5 +++-- tests/test_filter_energyout/test_filter_energyout.py | 5 +++-- .../test_filter_group_transfer.py | 5 +++-- tests/test_filter_material/test_filter_material.py | 5 +++-- tests/test_filter_mesh_2d/test_filter_mesh_2d.py | 4 +++- tests/test_filter_mesh_3d/test_filter_mesh_3d.py | 4 +++- tests/test_filter_universe/test_filter_universe.py | 5 +++-- tests/test_fixed_source/test_fixed_source.py | 8 +++++--- tests/test_infinite_cell/test_infinite_cell.py | 4 +++- tests/test_lattice/test_lattice.py | 4 +++- tests/test_lattice_hex/test_lattice_hex.py | 4 +++- tests/test_lattice_mixed/test_lattice_mixed.py | 4 +++- tests/test_lattice_multiple/test_lattice_multiple.py | 4 +++- tests/test_many_scores/test_many_scores.py | 4 +++- tests/test_natural_element/test_natural_element.py | 4 +++- tests/test_output/test_output.py | 6 +++--- .../test_particle_restart_eigval.py | 4 +++- .../test_particle_restart_fixed.py | 4 +++- tests/test_plot_background/test_plot_background.py | 4 +++- tests/test_plot_basis/test_plot_basis.py | 4 +++- tests/test_plot_colspec/test_plot_colspec.py | 4 +++- tests/test_plot_mask/test_plot_mask.py | 4 +++- tests/test_ptables_off/test_ptables_off.py | 4 +++- tests/test_reflective_cone/test_reflective_cone.py | 4 +++- .../test_reflective_cylinder/test_reflective_cylinder.py | 4 +++- tests/test_reflective_plane/test_reflective_plane.py | 4 +++- tests/test_reflective_sphere/test_reflective_sphere.py | 4 +++- .../test_resonance_scattering.py | 4 +++- tests/test_rotation/test_rotation.py | 4 +++- tests/test_salphabeta/test_salphabeta.py | 4 +++- .../test_salphabeta_multiple/test_salphabeta_multiple.py | 4 +++- tests/test_score_MT/test_score_MT.py | 5 +++-- tests/test_score_absorption/test_score_absorption.py | 5 +++-- tests/test_score_current/test_score_current.py | 4 +++- tests/test_score_events/test_score_events.py | 5 +++-- tests/test_score_fission/test_score_fission.py | 5 +++-- tests/test_score_flux/test_score_flux.py | 5 +++-- tests/test_score_flux_yn/test_score_flux_yn.py | 5 +++-- tests/test_score_kappafission/test_score_kappafission.py | 5 +++-- tests/test_score_nufission/test_score_nufission.py | 5 +++-- tests/test_score_nuscatter/test_score_nuscatter.py | 5 +++-- tests/test_score_nuscatter_n/test_score_nuscatter_n.py | 5 +++-- tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py | 5 +++-- tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py | 5 +++-- tests/test_score_scatter/test_score_scatter.py | 5 +++-- tests/test_score_scatter_n/test_score_scatter_n.py | 5 +++-- tests/test_score_scatter_pn/test_score_scatter_pn.py | 5 +++-- tests/test_score_scatter_yn/test_score_scatter_yn.py | 5 +++-- tests/test_score_total/test_score_total.py | 5 +++-- tests/test_score_total_yn/test_score_total_yn.py | 5 +++-- tests/test_seed/test_seed.py | 4 +++- tests/test_source_angle_mono/test_source_angle_mono.py | 4 +++- .../test_source_energy_maxwell.py | 4 +++- tests/test_source_energy_mono/test_source_energy_mono.py | 4 +++- tests/test_source_file/test_source_file.py | 4 ++-- tests/test_source_point/test_source_point.py | 4 +++- tests/test_sourcepoint_batch/test_sourcepoint_batch.py | 7 ++++--- .../test_sourcepoint_interval.py | 7 ++++--- tests/test_sourcepoint_latest/test_sourcepoint_latest.py | 7 +++---- .../test_sourcepoint_restart/test_sourcepoint_restart.py | 4 +++- tests/test_statepoint_batch/test_statepoint_batch.py | 7 +++++-- .../test_statepoint_interval/test_statepoint_interval.py | 6 ++++-- tests/test_statepoint_restart/test_statepoint_restart.py | 8 +++++--- .../test_statepoint_sourcesep.py | 6 +++--- tests/test_survival_biasing/test_survival_biasing.py | 4 +++- tests/test_tally_assumesep/test_tally_assumesep.py | 4 +++- tests/test_tally_nuclides/test_tally_nuclides.py | 4 +++- tests/test_trace/test_trace.py | 4 +++- tests/test_track_output/test_track_output.py | 6 +++--- tests/test_translation/test_translation.py | 4 +++- .../test_trigger_batch_interval.py | 4 +++- .../test_trigger_no_batch_interval.py | 4 +++- tests/test_trigger_no_status/test_trigger_no_status.py | 4 +++- tests/test_trigger_tallies/test_trigger_tallies.py | 4 +++- tests/test_uniform_fs/test_uniform_fs.py | 4 +++- tests/test_union_energy_grids/test_union_energy_grids.py | 4 +++- tests/test_universe/test_universe.py | 4 +++- tests/test_void/test_void.py | 4 +++- 94 files changed, 289 insertions(+), 142 deletions(-) diff --git a/.gitignore b/.gitignore index 5634632fa4..1998a6c5b8 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ src/xml-fortran/xmlreader # Test results error file results_error.dat +inputs_error.dat # Test build files tests/build/ @@ -62,4 +63,4 @@ data/nndc .idea/* # IPython notebook checkpoints -.ipynb_checkpoints \ No newline at end of file +.ipynb_checkpoints diff --git a/tests/test_basic/test_basic.py b/tests/test_basic/test_basic.py index 6633e59111..835bf91c7b 100755 --- a/tests/test_basic/test_basic.py +++ b/tests/test_basic/test_basic.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_cmfd_feed/test_cmfd_feed.py b/tests/test_cmfd_feed/test_cmfd_feed.py index a3d2f30310..af1f0542d4 100644 --- a/tests/test_cmfd_feed/test_cmfd_feed.py +++ b/tests/test_cmfd_feed/test_cmfd_feed.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import CMFDTestHarness diff --git a/tests/test_cmfd_nofeed/test_cmfd_nofeed.py b/tests/test_cmfd_nofeed/test_cmfd_nofeed.py index a3d2f30310..af1f0542d4 100644 --- a/tests/test_cmfd_nofeed/test_cmfd_nofeed.py +++ b/tests/test_cmfd_nofeed/test_cmfd_nofeed.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import CMFDTestHarness diff --git a/tests/test_confidence_intervals/test_confidence_intervals.py b/tests/test_confidence_intervals/test_confidence_intervals.py index 1777db993e..67227ca324 100755 --- a/tests/test_confidence_intervals/test_confidence_intervals.py +++ b/tests/test_confidence_intervals/test_confidence_intervals.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_atombcm/test_density_atombcm.py b/tests/test_density_atombcm/test_density_atombcm.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_density_atombcm/test_density_atombcm.py +++ b/tests/test_density_atombcm/test_density_atombcm.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_atomcm3/test_density_atomcm3.py b/tests/test_density_atomcm3/test_density_atomcm3.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_density_atomcm3/test_density_atomcm3.py +++ b/tests/test_density_atomcm3/test_density_atomcm3.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_kgm3/test_density_kgm3.py b/tests/test_density_kgm3/test_density_kgm3.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_density_kgm3/test_density_kgm3.py +++ b/tests/test_density_kgm3/test_density_kgm3.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_sum/test_density_sum.py b/tests/test_density_sum/test_density_sum.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_density_sum/test_density_sum.py +++ b/tests/test_density_sum/test_density_sum.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py b/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py index 22752c1894..3b0d22b9ea 100644 --- a/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py +++ b/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py b/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py +++ b/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_energy_grid/test_energy_grid.py b/tests/test_energy_grid/test_energy_grid.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_energy_grid/test_energy_grid.py +++ b/tests/test_energy_grid/test_energy_grid.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_entropy/test_entropy.py b/tests/test_entropy/test_entropy.py index 43c17da141..1af8945e34 100644 --- a/tests/test_entropy/test_entropy.py +++ b/tests/test_entropy/test_entropy.py @@ -3,9 +3,10 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class EntropyTestHarness(TestHarness): diff --git a/tests/test_filter_cell/test_filter_cell.py b/tests/test_filter_cell/test_filter_cell.py index 534a681b49..767007d7ab 100644 --- a/tests/test_filter_cell/test_filter_cell.py +++ b/tests/test_filter_cell/test_filter_cell.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterCellTestHarness(PyAPITestHarness): diff --git a/tests/test_filter_cellborn/test_filter_cellborn.py b/tests/test_filter_cellborn/test_filter_cellborn.py index 3420311aeb..14b50137eb 100644 --- a/tests/test_filter_cellborn/test_filter_cellborn.py +++ b/tests/test_filter_cellborn/test_filter_cellborn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterCellbornTestHarness(PyAPITestHarness): diff --git a/tests/test_filter_distribcell/test_filter_distribcell.py b/tests/test_filter_distribcell/test_filter_distribcell.py index 541d6b6af1..a0ed938ba3 100644 --- a/tests/test_filter_distribcell/test_filter_distribcell.py +++ b/tests/test_filter_distribcell/test_filter_distribcell.py @@ -4,8 +4,8 @@ import glob import hashlib import os import sys - -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import * diff --git a/tests/test_filter_energy/test_filter_energy.py b/tests/test_filter_energy/test_filter_energy.py index f16c458faa..55e7e55c65 100644 --- a/tests/test_filter_energy/test_filter_energy.py +++ b/tests/test_filter_energy/test_filter_energy.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterEnergyTestHarness(PyAPITestHarness): diff --git a/tests/test_filter_energyout/test_filter_energyout.py b/tests/test_filter_energyout/test_filter_energyout.py index 24704c6d70..d1fda4e0da 100644 --- a/tests/test_filter_energyout/test_filter_energyout.py +++ b/tests/test_filter_energyout/test_filter_energyout.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterEnergyoutTestHarness(PyAPITestHarness): diff --git a/tests/test_filter_group_transfer/test_filter_group_transfer.py b/tests/test_filter_group_transfer/test_filter_group_transfer.py index 86cd82ac32..fcffc45d11 100644 --- a/tests/test_filter_group_transfer/test_filter_group_transfer.py +++ b/tests/test_filter_group_transfer/test_filter_group_transfer.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterGroupTransferTestHarness(PyAPITestHarness): diff --git a/tests/test_filter_material/test_filter_material.py b/tests/test_filter_material/test_filter_material.py index 8d81cddb6b..8d66e822eb 100644 --- a/tests/test_filter_material/test_filter_material.py +++ b/tests/test_filter_material/test_filter_material.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterMaterialTestHarness(PyAPITestHarness): diff --git a/tests/test_filter_mesh_2d/test_filter_mesh_2d.py b/tests/test_filter_mesh_2d/test_filter_mesh_2d.py index 1777db993e..67227ca324 100644 --- a/tests/test_filter_mesh_2d/test_filter_mesh_2d.py +++ b/tests/test_filter_mesh_2d/test_filter_mesh_2d.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_filter_mesh_3d/test_filter_mesh_3d.py b/tests/test_filter_mesh_3d/test_filter_mesh_3d.py index 1777db993e..67227ca324 100644 --- a/tests/test_filter_mesh_3d/test_filter_mesh_3d.py +++ b/tests/test_filter_mesh_3d/test_filter_mesh_3d.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_filter_universe/test_filter_universe.py b/tests/test_filter_universe/test_filter_universe.py index 189758f2ee..1bd62d0b27 100644 --- a/tests/test_filter_universe/test_filter_universe.py +++ b/tests/test_filter_universe/test_filter_universe.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class FilterUniverseTestHarness(PyAPITestHarness): diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index c3bd34856d..2a41345f6a 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -3,9 +3,11 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +import numpy as np +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class FixedSourceTestHarness(TestHarness): diff --git a/tests/test_infinite_cell/test_infinite_cell.py b/tests/test_infinite_cell/test_infinite_cell.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_infinite_cell/test_infinite_cell.py +++ b/tests/test_infinite_cell/test_infinite_cell.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice/test_lattice.py b/tests/test_lattice/test_lattice.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_lattice/test_lattice.py +++ b/tests/test_lattice/test_lattice.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice_hex/test_lattice_hex.py b/tests/test_lattice_hex/test_lattice_hex.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_lattice_hex/test_lattice_hex.py +++ b/tests/test_lattice_hex/test_lattice_hex.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice_mixed/test_lattice_mixed.py b/tests/test_lattice_mixed/test_lattice_mixed.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_lattice_mixed/test_lattice_mixed.py +++ b/tests/test_lattice_mixed/test_lattice_mixed.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice_multiple/test_lattice_multiple.py b/tests/test_lattice_multiple/test_lattice_multiple.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_lattice_multiple/test_lattice_multiple.py +++ b/tests/test_lattice_multiple/test_lattice_multiple.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_many_scores/test_many_scores.py b/tests/test_many_scores/test_many_scores.py index 66bfe3dfa7..4518fc3637 100644 --- a/tests/test_many_scores/test_many_scores.py +++ b/tests/test_many_scores/test_many_scores.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_natural_element/test_natural_element.py b/tests/test_natural_element/test_natural_element.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_natural_element/test_natural_element.py +++ b/tests/test_natural_element/test_natural_element.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_output/test_output.py b/tests/test_output/test_output.py index b37b7d07b2..007d3952de 100644 --- a/tests/test_output/test_output.py +++ b/tests/test_output/test_output.py @@ -3,9 +3,9 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness class OutputTestHarness(TestHarness): diff --git a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py index a9f4563d0a..38441f1529 100644 --- a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py +++ b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import ParticleRestartTestHarness diff --git a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py index 385a429407..dd74fa4f5b 100644 --- a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py +++ b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import ParticleRestartTestHarness diff --git a/tests/test_plot_background/test_plot_background.py b/tests/test_plot_background/test_plot_background.py index 49cdacb05c..b769f2d3dc 100644 --- a/tests/test_plot_background/test_plot_background.py +++ b/tests/test_plot_background/test_plot_background.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_basis/test_plot_basis.py b/tests/test_plot_basis/test_plot_basis.py index 85e30557d2..34b7486247 100644 --- a/tests/test_plot_basis/test_plot_basis.py +++ b/tests/test_plot_basis/test_plot_basis.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_colspec/test_plot_colspec.py b/tests/test_plot_colspec/test_plot_colspec.py index 49cdacb05c..b769f2d3dc 100644 --- a/tests/test_plot_colspec/test_plot_colspec.py +++ b/tests/test_plot_colspec/test_plot_colspec.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_mask/test_plot_mask.py b/tests/test_plot_mask/test_plot_mask.py index 85e30557d2..34b7486247 100644 --- a/tests/test_plot_mask/test_plot_mask.py +++ b/tests/test_plot_mask/test_plot_mask.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_ptables_off/test_ptables_off.py b/tests/test_ptables_off/test_ptables_off.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_ptables_off/test_ptables_off.py +++ b/tests/test_ptables_off/test_ptables_off.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_cone/test_reflective_cone.py b/tests/test_reflective_cone/test_reflective_cone.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_reflective_cone/test_reflective_cone.py +++ b/tests/test_reflective_cone/test_reflective_cone.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_cylinder/test_reflective_cylinder.py b/tests/test_reflective_cylinder/test_reflective_cylinder.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_reflective_cylinder/test_reflective_cylinder.py +++ b/tests/test_reflective_cylinder/test_reflective_cylinder.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_plane/test_reflective_plane.py b/tests/test_reflective_plane/test_reflective_plane.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_reflective_plane/test_reflective_plane.py +++ b/tests/test_reflective_plane/test_reflective_plane.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_sphere/test_reflective_sphere.py b/tests/test_reflective_sphere/test_reflective_sphere.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_reflective_sphere/test_reflective_sphere.py +++ b/tests/test_reflective_sphere/test_reflective_sphere.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_resonance_scattering/test_resonance_scattering.py b/tests/test_resonance_scattering/test_resonance_scattering.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_resonance_scattering/test_resonance_scattering.py +++ b/tests/test_resonance_scattering/test_resonance_scattering.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_rotation/test_rotation.py b/tests/test_rotation/test_rotation.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_rotation/test_rotation.py +++ b/tests/test_rotation/test_rotation.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_salphabeta/test_salphabeta.py b/tests/test_salphabeta/test_salphabeta.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_salphabeta/test_salphabeta.py +++ b/tests/test_salphabeta/test_salphabeta.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_salphabeta_multiple/test_salphabeta_multiple.py b/tests/test_salphabeta_multiple/test_salphabeta_multiple.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_salphabeta_multiple/test_salphabeta_multiple.py +++ b/tests/test_salphabeta_multiple/test_salphabeta_multiple.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_score_MT/test_score_MT.py b/tests/test_score_MT/test_score_MT.py index d1a9b99cd8..a944771f3b 100644 --- a/tests/test_score_MT/test_score_MT.py +++ b/tests/test_score_MT/test_score_MT.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreMTTestHarness(PyAPITestHarness): diff --git a/tests/test_score_absorption/test_score_absorption.py b/tests/test_score_absorption/test_score_absorption.py index 2accb25045..7547b1e4ed 100644 --- a/tests/test_score_absorption/test_score_absorption.py +++ b/tests/test_score_absorption/test_score_absorption.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreAbsorptionTestHarness(PyAPITestHarness): diff --git a/tests/test_score_current/test_score_current.py b/tests/test_score_current/test_score_current.py index 64f640b96c..87a3226b0b 100644 --- a/tests/test_score_current/test_score_current.py +++ b/tests/test_score_current/test_score_current.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import HashedTestHarness diff --git a/tests/test_score_events/test_score_events.py b/tests/test_score_events/test_score_events.py index 74d6e100da..5d861f4509 100644 --- a/tests/test_score_events/test_score_events.py +++ b/tests/test_score_events/test_score_events.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreEventsTestHarness(PyAPITestHarness): diff --git a/tests/test_score_fission/test_score_fission.py b/tests/test_score_fission/test_score_fission.py index e9253d11d1..4dc76fc0c0 100644 --- a/tests/test_score_fission/test_score_fission.py +++ b/tests/test_score_fission/test_score_fission.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreFissionTestHarness(PyAPITestHarness): diff --git a/tests/test_score_flux/test_score_flux.py b/tests/test_score_flux/test_score_flux.py index 94a034758d..f5f7351727 100644 --- a/tests/test_score_flux/test_score_flux.py +++ b/tests/test_score_flux/test_score_flux.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreFluxTestHarness(PyAPITestHarness): diff --git a/tests/test_score_flux_yn/test_score_flux_yn.py b/tests/test_score_flux_yn/test_score_flux_yn.py index 0122768040..08279dea79 100755 --- a/tests/test_score_flux_yn/test_score_flux_yn.py +++ b/tests/test_score_flux_yn/test_score_flux_yn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreFluxYnTestHarness(PyAPITestHarness): diff --git a/tests/test_score_kappafission/test_score_kappafission.py b/tests/test_score_kappafission/test_score_kappafission.py index fe43309400..c9fc1bfe04 100644 --- a/tests/test_score_kappafission/test_score_kappafission.py +++ b/tests/test_score_kappafission/test_score_kappafission.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreKappaFissionTestHarness(PyAPITestHarness): diff --git a/tests/test_score_nufission/test_score_nufission.py b/tests/test_score_nufission/test_score_nufission.py index 2c0bbd2f19..800200725f 100644 --- a/tests/test_score_nufission/test_score_nufission.py +++ b/tests/test_score_nufission/test_score_nufission.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreNuFissionTestHarness(PyAPITestHarness): diff --git a/tests/test_score_nuscatter/test_score_nuscatter.py b/tests/test_score_nuscatter/test_score_nuscatter.py index 81fca1e68b..e94ab61f15 100644 --- a/tests/test_score_nuscatter/test_score_nuscatter.py +++ b/tests/test_score_nuscatter/test_score_nuscatter.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreNuScatterTestHarness(PyAPITestHarness): diff --git a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py index 05e00e8132..5b0a755567 100644 --- a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py +++ b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreNuScatterNTestHarness(PyAPITestHarness): diff --git a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py index 009bccd159..a69679873f 100644 --- a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py +++ b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreNuScatterPNTestHarness(PyAPITestHarness): diff --git a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py index d1fa3e029f..0b2005bdcb 100644 --- a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py +++ b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreNuScatterYNTestHarness(PyAPITestHarness): diff --git a/tests/test_score_scatter/test_score_scatter.py b/tests/test_score_scatter/test_score_scatter.py index 76ff39e01f..b6396ff3ef 100644 --- a/tests/test_score_scatter/test_score_scatter.py +++ b/tests/test_score_scatter/test_score_scatter.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreScatterTestHarness(PyAPITestHarness): diff --git a/tests/test_score_scatter_n/test_score_scatter_n.py b/tests/test_score_scatter_n/test_score_scatter_n.py index 304cd6cb77..341b687c5f 100644 --- a/tests/test_score_scatter_n/test_score_scatter_n.py +++ b/tests/test_score_scatter_n/test_score_scatter_n.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreScatterNTestHarness(PyAPITestHarness): diff --git a/tests/test_score_scatter_pn/test_score_scatter_pn.py b/tests/test_score_scatter_pn/test_score_scatter_pn.py index 79a4502c9c..6fb304ac53 100644 --- a/tests/test_score_scatter_pn/test_score_scatter_pn.py +++ b/tests/test_score_scatter_pn/test_score_scatter_pn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreScatterPNTestHarness(PyAPITestHarness): diff --git a/tests/test_score_scatter_yn/test_score_scatter_yn.py b/tests/test_score_scatter_yn/test_score_scatter_yn.py index f99fc5923f..7d572b2abb 100644 --- a/tests/test_score_scatter_yn/test_score_scatter_yn.py +++ b/tests/test_score_scatter_yn/test_score_scatter_yn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreScatterYNTestHarness(PyAPITestHarness): diff --git a/tests/test_score_total/test_score_total.py b/tests/test_score_total/test_score_total.py index 702a8141c1..c5e4294155 100644 --- a/tests/test_score_total/test_score_total.py +++ b/tests/test_score_total/test_score_total.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreTotalTestHarness(PyAPITestHarness): diff --git a/tests/test_score_total_yn/test_score_total_yn.py b/tests/test_score_total_yn/test_score_total_yn.py index 07cac86d2a..456e1f93b2 100644 --- a/tests/test_score_total_yn/test_score_total_yn.py +++ b/tests/test_score_total_yn/test_score_total_yn.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc -import os class ScoreTotalYNTestHarness(PyAPITestHarness): diff --git a/tests/test_seed/test_seed.py b/tests/test_seed/test_seed.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_seed/test_seed.py +++ b/tests/test_seed/test_seed.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_angle_mono/test_source_angle_mono.py b/tests/test_source_angle_mono/test_source_angle_mono.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_source_angle_mono/test_source_angle_mono.py +++ b/tests/test_source_angle_mono/test_source_angle_mono.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_energy_maxwell/test_source_energy_maxwell.py b/tests/test_source_energy_maxwell/test_source_energy_maxwell.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_source_energy_maxwell/test_source_energy_maxwell.py +++ b/tests/test_source_energy_maxwell/test_source_energy_maxwell.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_energy_mono/test_source_energy_mono.py b/tests/test_source_energy_mono/test_source_energy_mono.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_source_energy_mono/test_source_energy_mono.py +++ b/tests/test_source_energy_mono/test_source_energy_mono.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_file/test_source_file.py b/tests/test_source_file/test_source_file.py index fae6b2a72f..5420d71e82 100644 --- a/tests/test_source_file/test_source_file.py +++ b/tests/test_source_file/test_source_file.py @@ -3,8 +3,8 @@ import glob import os import sys - -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import * diff --git a/tests/test_source_point/test_source_point.py b/tests/test_source_point/test_source_point.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_source_point/test_source_point.py +++ b/tests/test_source_point/test_source_point.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index a306b9aa78..eb3136754c 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -3,9 +3,10 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class SourcepointTestHarness(TestHarness): diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index a306b9aa78..eb3136754c 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -3,9 +3,10 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class SourcepointTestHarness(TestHarness): diff --git a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py index 7d0af89b97..245eede759 100644 --- a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py +++ b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py @@ -1,11 +1,10 @@ #!/usr/bin/env python -import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness class SourcepointTestHarness(TestHarness): diff --git a/tests/test_sourcepoint_restart/test_sourcepoint_restart.py b/tests/test_sourcepoint_restart/test_sourcepoint_restart.py index 1777db993e..67227ca324 100644 --- a/tests/test_sourcepoint_restart/test_sourcepoint_restart.py +++ b/tests/test_sourcepoint_restart/test_sourcepoint_restart.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_statepoint_batch/test_statepoint_batch.py b/tests/test_statepoint_batch/test_statepoint_batch.py index bc5632618f..8a0ef83d27 100644 --- a/tests/test_statepoint_batch/test_statepoint_batch.py +++ b/tests/test_statepoint_batch/test_statepoint_batch.py @@ -1,7 +1,10 @@ #!/usr/bin/env python + +import os import sys -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness class StatepointTestHarness(TestHarness): diff --git a/tests/test_statepoint_interval/test_statepoint_interval.py b/tests/test_statepoint_interval/test_statepoint_interval.py index b41ee2b7ae..47db80f656 100644 --- a/tests/test_statepoint_interval/test_statepoint_interval.py +++ b/tests/test_statepoint_interval/test_statepoint_interval.py @@ -1,8 +1,10 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness class StatepointTestHarness(TestHarness): diff --git a/tests/test_statepoint_restart/test_statepoint_restart.py b/tests/test_statepoint_restart/test_statepoint_restart.py index dd42dc8ff5..91c316f6a5 100644 --- a/tests/test_statepoint_restart/test_statepoint_restart.py +++ b/tests/test_statepoint_restart/test_statepoint_restart.py @@ -3,9 +3,11 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint +from openmc.executor import Executor class StatepointRestartTestHarness(TestHarness): diff --git a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py index c7221c90c2..70ba94838f 100644 --- a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py +++ b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py @@ -3,9 +3,9 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness class SourcepointTestHarness(TestHarness): diff --git a/tests/test_survival_biasing/test_survival_biasing.py b/tests/test_survival_biasing/test_survival_biasing.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_survival_biasing/test_survival_biasing.py +++ b/tests/test_survival_biasing/test_survival_biasing.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_tally_assumesep/test_tally_assumesep.py b/tests/test_tally_assumesep/test_tally_assumesep.py index 1777db993e..67227ca324 100644 --- a/tests/test_tally_assumesep/test_tally_assumesep.py +++ b/tests/test_tally_assumesep/test_tally_assumesep.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_tally_nuclides/test_tally_nuclides.py b/tests/test_tally_nuclides/test_tally_nuclides.py index 1777db993e..67227ca324 100644 --- a/tests/test_tally_nuclides/test_tally_nuclides.py +++ b/tests/test_tally_nuclides/test_tally_nuclides.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trace/test_trace.py b/tests/test_trace/test_trace.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_trace/test_trace.py +++ b/tests/test_trace/test_trace.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_track_output/test_track_output.py b/tests/test_track_output/test_track_output.py index dc0eb1a69d..7039120a41 100644 --- a/tests/test_track_output/test_track_output.py +++ b/tests/test_track_output/test_track_output.py @@ -4,9 +4,9 @@ import glob import os import shutil import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from testing_harness import TestHarness class TrackTestHarness(TestHarness): diff --git a/tests/test_translation/test_translation.py b/tests/test_translation/test_translation.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_translation/test_translation.py +++ b/tests/test_translation/test_translation.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py index e5c5b54b6b..18b904efb5 100644 --- a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py +++ b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py index ff19e3d08d..983f941d93 100644 --- a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py +++ b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_no_status/test_trigger_no_status.py b/tests/test_trigger_no_status/test_trigger_no_status.py index 1777db993e..67227ca324 100644 --- a/tests/test_trigger_no_status/test_trigger_no_status.py +++ b/tests/test_trigger_no_status/test_trigger_no_status.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_tallies/test_trigger_tallies.py b/tests/test_trigger_tallies/test_trigger_tallies.py index 20094827e0..812e2c5e50 100644 --- a/tests/test_trigger_tallies/test_trigger_tallies.py +++ b/tests/test_trigger_tallies/test_trigger_tallies.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_uniform_fs/test_uniform_fs.py b/tests/test_uniform_fs/test_uniform_fs.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_uniform_fs/test_uniform_fs.py +++ b/tests/test_uniform_fs/test_uniform_fs.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_union_energy_grids/test_union_energy_grids.py b/tests/test_union_energy_grids/test_union_energy_grids.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_union_energy_grids/test_union_energy_grids.py +++ b/tests/test_union_energy_grids/test_union_energy_grids.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_universe/test_universe.py b/tests/test_universe/test_universe.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_universe/test_universe.py +++ b/tests/test_universe/test_universe.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_void/test_void.py b/tests/test_void/test_void.py index 6633e59111..835bf91c7b 100644 --- a/tests/test_void/test_void.py +++ b/tests/test_void/test_void.py @@ -1,7 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness From 67971b5c6025a0ea02fac567d91cbd6441ad5b5e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 00:04:01 -0400 Subject: [PATCH 251/519] Cleaned up docstring comments in filter.py and cross.py --- .../examples/pandas-dataframes.ipynb | 753 ++++++++---------- .../pythonapi/examples/post-processing.ipynb | 82 +- .../pythonapi/examples/tally-arithmetic.ipynb | 297 +++---- openmc/cross.py | 13 +- openmc/filter.py | 20 +- openmc/mesh.py | 2 +- openmc/mgxs/groups.py | 42 +- openmc/statepoint.py | 2 +- 8 files changed, 551 insertions(+), 660 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index cb63e2ac39..34bb533cdc 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -358,7 +358,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Run openmc in plotting mode\n", "executor = openmc.Executor()\n", @@ -374,7 +385,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQMbBgd4EXAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMjFUMTA6MjU6\nMjYrMDc6MDAKj62JAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTIxVDEwOjI1OjI2KzA3OjAw\ne9IVNQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAwOjAx\nOjMxLTA0OjAw4140mAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMDowMTozMS0wNDow\nMJIDjCQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -563,8 +574,9 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", - " Date/Time: 2015-09-21 10:27:06\n", + " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", + " Date/Time: 2015-10-03 00:01:31\n", + " MPI Processes: 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -631,20 +643,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.4100E-01 seconds\n", - " Reading cross sections = 1.7900E-01 seconds\n", - " Total time in simulation = 1.2656E+01 seconds\n", - " Time in transport only = 1.2642E+01 seconds\n", - " Time in inactive batches = 2.0300E+00 seconds\n", - " Time in active batches = 1.0626E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 5.9000E-01 seconds\n", + " Reading cross sections = 1.2900E-01 seconds\n", + " Total time in simulation = 1.4684E+01 seconds\n", + " Time in transport only = 1.4653E+01 seconds\n", + " Time in inactive batches = 1.7680E+00 seconds\n", + " Time in active batches = 1.2916E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 2.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.3110E+01 seconds\n", - " Calculation Rate (inactive) = 6157.64 neutrons/second\n", - " Calculation Rate (active) = 3529.08 neutrons/second\n", + " Total time elapsed = 1.5286E+01 seconds\n", + " Calculation Rate (inactive) = 7070.14 neutrons/second\n", + " Calculation Rate (active) = 2903.38 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -769,13 +781,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.15044911]]\n", + "[[[ 0.1127471 ]]\n", "\n", - " [[ 0.09149973]]\n", + " [[ 0.06599162]]\n", "\n", - " [[ 0.27611475]]\n", + " [[ 0.25310075]]\n", "\n", - " [[ 0.12476673]]]\n" + " [[ 0.10150973]]]\n" ] } ], @@ -819,16 +831,6 @@ " \n", " \n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -836,229 +838,228 @@ " 1\n", " 1\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000236\n", - " 0.000035\n", + " 0.000224\n", + " 0.000025\n", " \n", " \n", " 1\n", " 1\n", " 1\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.000574\n", - " 0.000086\n", + " 0.000546\n", + " 0.000062\n", " \n", " \n", " 2\n", " 1\n", " 1\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000072\n", - " 0.000006\n", + " 0.000071\n", + " 0.000004\n", " \n", " \n", " 3\n", " 1\n", " 1\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000190\n", - " 0.000014\n", + " 0.000187\n", + " 0.000010\n", " \n", " \n", " 4\n", " 1\n", " 2\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000451\n", - " 0.000058\n", + " 0.000392\n", + " 0.000045\n", " \n", " \n", " 5\n", " 1\n", " 2\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001100\n", - " 0.000141\n", + " 0.000955\n", + " 0.000110\n", " \n", " \n", " 6\n", " 1\n", " 2\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000095\n", - " 0.000006\n", + " 0.000096\n", + " 0.000005\n", " \n", " \n", " 7\n", " 1\n", " 2\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000250\n", - " 0.000016\n", + " 0.000252\n", + " 0.000014\n", " \n", " \n", " 8\n", " 1\n", " 3\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000575\n", - " 0.000080\n", + " 0.000551\n", + " 0.000053\n", " \n", " \n", " 9\n", " 1\n", " 3\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001401\n", - " 0.000194\n", + " 0.001343\n", + " 0.000130\n", " \n", " \n", " 10\n", " 1\n", " 3\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000134\n", - " 0.000011\n", + " 0.000131\n", + " 0.000008\n", " \n", " \n", " 11\n", " 1\n", " 3\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000353\n", - " 0.000028\n", + " 0.000343\n", + " 0.000019\n", " \n", " \n", " 12\n", " 1\n", " 4\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000655\n", - " 0.000071\n", + " 0.000688\n", + " 0.000063\n", " \n", " \n", " 13\n", " 1\n", " 4\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001596\n", - " 0.000174\n", + " 0.001676\n", + " 0.000153\n", " \n", " \n", " 14\n", " 1\n", " 4\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000149\n", - " 0.000009\n", + " 0.000151\n", + " 0.000007\n", " \n", " \n", " 15\n", " 1\n", " 4\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000391\n", - " 0.000023\n", + " 0.000395\n", + " 0.000019\n", " \n", " \n", " 16\n", " 1\n", " 5\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000781\n", - " 0.000078\n", + " 0.000785\n", + " 0.000065\n", " \n", " \n", " 17\n", " 1\n", " 5\n", " 1\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001903\n", - " 0.000191\n", + " 0.001914\n", + " 0.000158\n", " \n", " \n", " 18\n", " 1\n", " 5\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000185\n", - " 0.000009\n", + " 0.000187\n", + " 0.000008\n", " \n", " \n", " 19\n", " 1\n", " 5\n", " 1\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000484\n", - " 0.000024\n", + " 0.000487\n", + " 0.000019\n", " \n", " \n", "\n", "" ], "text/plain": [ - " mesh 1 energy [MeV] score mean std. dev.\n", - " x y z \n", - "bin \n", - "0 1 1 1 0.0e+00 - 6.3e-07 fission 0.000236 0.000035\n", - "1 1 1 1 0.0e+00 - 6.3e-07 nu-fission 0.000574 0.000086\n", - "2 1 1 1 6.3e-07 - 2.0e+01 fission 0.000072 0.000006\n", - "3 1 1 1 6.3e-07 - 2.0e+01 nu-fission 0.000190 0.000014\n", - "4 1 2 1 0.0e+00 - 6.3e-07 fission 0.000451 0.000058\n", - "5 1 2 1 0.0e+00 - 6.3e-07 nu-fission 0.001100 0.000141\n", - "6 1 2 1 6.3e-07 - 2.0e+01 fission 0.000095 0.000006\n", - "7 1 2 1 6.3e-07 - 2.0e+01 nu-fission 0.000250 0.000016\n", - "8 1 3 1 0.0e+00 - 6.3e-07 fission 0.000575 0.000080\n", - "9 1 3 1 0.0e+00 - 6.3e-07 nu-fission 0.001401 0.000194\n", - "10 1 3 1 6.3e-07 - 2.0e+01 fission 0.000134 0.000011\n", - "11 1 3 1 6.3e-07 - 2.0e+01 nu-fission 0.000353 0.000028\n", - "12 1 4 1 0.0e+00 - 6.3e-07 fission 0.000655 0.000071\n", - "13 1 4 1 0.0e+00 - 6.3e-07 nu-fission 0.001596 0.000174\n", - "14 1 4 1 6.3e-07 - 2.0e+01 fission 0.000149 0.000009\n", - "15 1 4 1 6.3e-07 - 2.0e+01 nu-fission 0.000391 0.000023\n", - "16 1 5 1 0.0e+00 - 6.3e-07 fission 0.000781 0.000078\n", - "17 1 5 1 0.0e+00 - 6.3e-07 nu-fission 0.001903 0.000191\n", - "18 1 5 1 6.3e-07 - 2.0e+01 fission 0.000185 0.000009\n", - "19 1 5 1 6.3e-07 - 2.0e+01 nu-fission 0.000484 0.000024" + " mesh 1 energy [MeV] score mean std. dev.\n", + " x y z \n", + "0 1 1 1 (0.0e+00 - 6.3e-07) fission 0.000224 0.000025\n", + "1 1 1 1 (0.0e+00 - 6.3e-07) nu-fission 0.000546 0.000062\n", + "2 1 1 1 (6.3e-07 - 2.0e+01) fission 0.000071 0.000004\n", + "3 1 1 1 (6.3e-07 - 2.0e+01) nu-fission 0.000187 0.000010\n", + "4 1 2 1 (0.0e+00 - 6.3e-07) fission 0.000392 0.000045\n", + "5 1 2 1 (0.0e+00 - 6.3e-07) nu-fission 0.000955 0.000110\n", + "6 1 2 1 (6.3e-07 - 2.0e+01) fission 0.000096 0.000005\n", + "7 1 2 1 (6.3e-07 - 2.0e+01) nu-fission 0.000252 0.000014\n", + "8 1 3 1 (0.0e+00 - 6.3e-07) fission 0.000551 0.000053\n", + "9 1 3 1 (0.0e+00 - 6.3e-07) nu-fission 0.001343 0.000130\n", + "10 1 3 1 (6.3e-07 - 2.0e+01) fission 0.000131 0.000008\n", + "11 1 3 1 (6.3e-07 - 2.0e+01) nu-fission 0.000343 0.000019\n", + "12 1 4 1 (0.0e+00 - 6.3e-07) fission 0.000688 0.000063\n", + "13 1 4 1 (0.0e+00 - 6.3e-07) nu-fission 0.001676 0.000153\n", + "14 1 4 1 (6.3e-07 - 2.0e+01) fission 0.000151 0.000007\n", + "15 1 4 1 (6.3e-07 - 2.0e+01) nu-fission 0.000395 0.000019\n", + "16 1 5 1 (0.0e+00 - 6.3e-07) fission 0.000785 0.000065\n", + "17 1 5 1 (0.0e+00 - 6.3e-07) nu-fission 0.001914 0.000158\n", + "18 1 5 1 (6.3e-07 - 2.0e+01) fission 0.000187 0.000008\n", + "19 1 5 1 (6.3e-07 - 2.0e+01) nu-fission 0.000487 0.000019" ] }, "execution_count": 25, @@ -1083,9 +1084,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nBPCvjMC6bD6xSh4AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1108,7 +1109,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1117,9 +1118,9 @@ }, { "data": { - "image/png": "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\nEvx/rHWCrxSlro8AAAAASUVORK5CYII=\n", + "image/png": "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\nefX/AdmeWI23zkQnAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1129,7 +1130,7 @@ "source": [ "# Extract thermal nu-fission rates from pandas\n", "fiss = df[df['score'] == 'nu-fission']\n", - "fiss = fiss[fiss['energy [MeV]'] == '0.0e+00 - 6.3e-07']\n", + "fiss = fiss[fiss['energy [MeV]'] == '(0.0e+00 - 6.3e-07)']\n", "\n", "# Extract mean and reshape as 2D NumPy arrays\n", "mean = fiss['mean'].reshape((17,17))\n", @@ -1200,14 +1201,6 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -1215,170 +1208,169 @@ " 10000\n", " U-235\n", " scatter-Y0,0\n", - " 0.036453\n", - " 0.001219\n", + " 0.038330\n", + " 0.001119\n", " \n", " \n", " 1\n", " 10000\n", " U-235\n", " scatter-Y1,-1\n", - " 0.000302\n", - " 0.000314\n", + " 0.000008\n", + " 0.000341\n", " \n", " \n", " 2\n", " 10000\n", " U-235\n", " scatter-Y1,0\n", - " -0.000006\n", - " 0.000347\n", + " -0.000342\n", + " 0.000342\n", " \n", " \n", " 3\n", " 10000\n", " U-235\n", " scatter-Y1,1\n", - " 0.000244\n", - " 0.000286\n", + " 0.000201\n", + " 0.000262\n", " \n", " \n", " 4\n", " 10000\n", " U-235\n", " scatter-Y2,-2\n", - " 0.000184\n", - " 0.000211\n", + " 0.000136\n", + " 0.000152\n", " \n", " \n", " 5\n", " 10000\n", " U-235\n", " scatter-Y2,-1\n", - " 0.000067\n", - " 0.000173\n", + " 0.000042\n", + " 0.000131\n", " \n", " \n", " 6\n", " 10000\n", " U-235\n", " scatter-Y2,0\n", - " 0.000353\n", - " 0.000210\n", + " 0.000303\n", + " 0.000185\n", " \n", " \n", " 7\n", " 10000\n", " U-235\n", " scatter-Y2,1\n", - " -0.000266\n", - " 0.000263\n", + " -0.000407\n", + " 0.000184\n", " \n", " \n", " 8\n", " 10000\n", " U-235\n", " scatter-Y2,2\n", - " -0.000246\n", - " 0.000153\n", + " -0.000145\n", + " 0.000120\n", " \n", " \n", " 9\n", " 10000\n", " U-238\n", " scatter-Y0,0\n", - " 2.315893\n", - " 0.008243\n", + " 2.319322\n", + " 0.006166\n", " \n", " \n", " 10\n", " 10000\n", " U-238\n", " scatter-Y1,-1\n", - " -0.022028\n", - " 0.002316\n", + " -0.023638\n", + " 0.001940\n", " \n", " \n", " 11\n", " 10000\n", " U-238\n", " scatter-Y1,0\n", - " -0.003426\n", - " 0.002651\n", + " -0.003463\n", + " 0.001892\n", " \n", " \n", " 12\n", " 10000\n", " U-238\n", " scatter-Y1,1\n", - " 0.026620\n", - " 0.002084\n", + " 0.025099\n", + " 0.002270\n", " \n", " \n", " 13\n", " 10000\n", " U-238\n", " scatter-Y2,-2\n", - " -0.001295\n", - " 0.001627\n", + " -0.000617\n", + " 0.001197\n", " \n", " \n", " 14\n", " 10000\n", " U-238\n", " scatter-Y2,-1\n", - " 0.000759\n", - " 0.001426\n", + " 0.002549\n", + " 0.001187\n", " \n", " \n", " 15\n", " 10000\n", " U-238\n", " scatter-Y2,0\n", - " 0.005513\n", - " 0.001983\n", + " 0.007121\n", + " 0.001646\n", " \n", " \n", " 16\n", " 10000\n", " U-238\n", " scatter-Y2,1\n", - " 0.000431\n", - " 0.001862\n", + " -0.000058\n", + " 0.001323\n", " \n", " \n", " 17\n", " 10000\n", " U-238\n", " scatter-Y2,2\n", - " -0.001962\n", - " 0.001222\n", + " -0.002235\n", + " 0.000867\n", " \n", " \n", "\n", "" ], "text/plain": [ - " cell nuclide score mean std. dev.\n", - "bin \n", - "0 10000 U-235 scatter-Y0,0 0.036453 0.001219\n", - "1 10000 U-235 scatter-Y1,-1 0.000302 0.000314\n", - "2 10000 U-235 scatter-Y1,0 -0.000006 0.000347\n", - "3 10000 U-235 scatter-Y1,1 0.000244 0.000286\n", - "4 10000 U-235 scatter-Y2,-2 0.000184 0.000211\n", - "5 10000 U-235 scatter-Y2,-1 0.000067 0.000173\n", - "6 10000 U-235 scatter-Y2,0 0.000353 0.000210\n", - "7 10000 U-235 scatter-Y2,1 -0.000266 0.000263\n", - "8 10000 U-235 scatter-Y2,2 -0.000246 0.000153\n", - "9 10000 U-238 scatter-Y0,0 2.315893 0.008243\n", - "10 10000 U-238 scatter-Y1,-1 -0.022028 0.002316\n", - "11 10000 U-238 scatter-Y1,0 -0.003426 0.002651\n", - "12 10000 U-238 scatter-Y1,1 0.026620 0.002084\n", - "13 10000 U-238 scatter-Y2,-2 -0.001295 0.001627\n", - "14 10000 U-238 scatter-Y2,-1 0.000759 0.001426\n", - "15 10000 U-238 scatter-Y2,0 0.005513 0.001983\n", - "16 10000 U-238 scatter-Y2,1 0.000431 0.001862\n", - "17 10000 U-238 scatter-Y2,2 -0.001962 0.001222" + " cell nuclide score mean std. dev.\n", + "0 10000 U-235 scatter-Y0,0 0.038330 0.001119\n", + "1 10000 U-235 scatter-Y1,-1 0.000008 0.000341\n", + "2 10000 U-235 scatter-Y1,0 -0.000342 0.000342\n", + "3 10000 U-235 scatter-Y1,1 0.000201 0.000262\n", + "4 10000 U-235 scatter-Y2,-2 0.000136 0.000152\n", + "5 10000 U-235 scatter-Y2,-1 0.000042 0.000131\n", + "6 10000 U-235 scatter-Y2,0 0.000303 0.000185\n", + "7 10000 U-235 scatter-Y2,1 -0.000407 0.000184\n", + "8 10000 U-235 scatter-Y2,2 -0.000145 0.000120\n", + "9 10000 U-238 scatter-Y0,0 2.319322 0.006166\n", + "10 10000 U-238 scatter-Y1,-1 -0.023638 0.001940\n", + "11 10000 U-238 scatter-Y1,0 -0.003463 0.001892\n", + "12 10000 U-238 scatter-Y1,1 0.025099 0.002270\n", + "13 10000 U-238 scatter-Y2,-2 -0.000617 0.001197\n", + "14 10000 U-238 scatter-Y2,-1 0.002549 0.001187\n", + "15 10000 U-238 scatter-Y2,0 0.007121 0.001646\n", + "16 10000 U-238 scatter-Y2,1 -0.000058 0.001323\n", + "17 10000 U-238 scatter-Y2,2 -0.002235 0.000867" ] }, "execution_count": 29, @@ -1412,8 +1404,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00122163 0.00824348]\n", - " [ 0.00015287 0.00121882]]]\n" + "[[[ 0.00086668 0.0061658 ]\n", + " [ 0.00011981 0.00111862]]]\n" ] } ], @@ -1481,25 +1473,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.0400168 ]]\n", - "\n", - " [[ 0.05233031]]\n", - "\n", - " [[ 0.03819276]]\n", - "\n", - " [[ 0.02900783]]\n", - "\n", - " [[ 0.03176394]]\n", - "\n", - " [[ 0.03046477]]\n", - "\n", - " [[ 0.03864163]]\n", - "\n", - " [[ 0.02455132]]\n", - "\n", - " [[ 0.02282716]]\n", - "\n", - " [[ 0.02162945]]]\n" + "[[[ 0.03658762]]]\n" ] } ], @@ -1507,7 +1481,7 @@ "# Get the relative error for the scattering reaction rates in\n", "# the first 30 distribcell instances \n", "data = tally.get_values(scores=['scatter'], filters=['distribcell'],\n", - " filter_bins=[range(10)], value='rel_err')\n", + " filter_bins=[(i,) for i in range(10)], value='rel_err')\n", "print(data)" ] }, @@ -1538,154 +1512,147 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 558\n", " 279\n", " absorption\n", - " 0.000085\n", + " 0.000081\n", " 0.000008\n", " \n", " \n", " 559\n", " 279\n", " scatter\n", - " 0.013429\n", - " 0.000449\n", + " 0.013109\n", + " 0.000358\n", " \n", " \n", " 560\n", " 280\n", " absorption\n", - " 0.000095\n", - " 0.000014\n", + " 0.000088\n", + " 0.000010\n", " \n", " \n", " 561\n", " 280\n", " scatter\n", - " 0.014770\n", - " 0.000783\n", + " 0.014395\n", + " 0.000586\n", " \n", " \n", " 562\n", " 281\n", " absorption\n", - " 0.000107\n", - " 0.000013\n", + " 0.000097\n", + " 0.000010\n", " \n", " \n", " 563\n", " 281\n", " scatter\n", - " 0.015044\n", - " 0.000605\n", + " 0.014637\n", + " 0.000427\n", " \n", " \n", " 564\n", " 282\n", " absorption\n", - " 0.000110\n", - " 0.000010\n", + " 0.000107\n", + " 0.000009\n", " \n", " \n", " 565\n", " 282\n", " scatter\n", - " 0.016090\n", - " 0.000795\n", + " 0.015683\n", + " 0.000552\n", " \n", " \n", " 566\n", " 283\n", " absorption\n", - " 0.000121\n", - " 0.000012\n", + " 0.000110\n", + " 0.000009\n", " \n", " \n", " 567\n", " 283\n", " scatter\n", - " 0.017010\n", - " 0.000793\n", + " 0.016293\n", + " 0.000627\n", " \n", " \n", " 568\n", " 284\n", " absorption\n", - " 0.000110\n", + " 0.000111\n", " 0.000007\n", " \n", " \n", " 569\n", " 284\n", " scatter\n", - " 0.017010\n", - " 0.000430\n", + " 0.017032\n", + " 0.000445\n", " \n", " \n", " 570\n", " 285\n", " absorption\n", " 0.000112\n", - " 0.000007\n", + " 0.000006\n", " \n", " \n", " 571\n", " 285\n", " scatter\n", - " 0.017499\n", - " 0.000615\n", + " 0.017666\n", + " 0.000425\n", " \n", " \n", " 572\n", " 286\n", " absorption\n", - " 0.000127\n", - " 0.000016\n", + " 0.000123\n", + " 0.000011\n", " \n", " \n", " 573\n", " 286\n", " scatter\n", - " 0.017716\n", - " 0.000690\n", + " 0.017706\n", + " 0.000597\n", " \n", " \n", " 574\n", " 287\n", " absorption\n", - " 0.000119\n", - " 0.000013\n", + " 0.000108\n", + " 0.000011\n", " \n", " \n", " 575\n", " 287\n", " scatter\n", - " 0.018041\n", - " 0.000702\n", + " 0.017339\n", + " 0.000664\n", " \n", " \n", " 576\n", " 288\n", " absorption\n", - " 0.000125\n", - " 0.000013\n", + " 0.000129\n", + " 0.000011\n", " \n", " \n", " 577\n", " 288\n", " scatter\n", - " 0.018212\n", - " 0.000715\n", + " 0.018452\n", + " 0.000523\n", " \n", " \n", "\n", @@ -1693,27 +1660,26 @@ ], "text/plain": [ " distribcell score mean std. dev.\n", - "bin \n", - "558 279 absorption 0.000085 0.000008\n", - "559 279 scatter 0.013429 0.000449\n", - "560 280 absorption 0.000095 0.000014\n", - "561 280 scatter 0.014770 0.000783\n", - "562 281 absorption 0.000107 0.000013\n", - "563 281 scatter 0.015044 0.000605\n", - "564 282 absorption 0.000110 0.000010\n", - "565 282 scatter 0.016090 0.000795\n", - "566 283 absorption 0.000121 0.000012\n", - "567 283 scatter 0.017010 0.000793\n", - "568 284 absorption 0.000110 0.000007\n", - "569 284 scatter 0.017010 0.000430\n", - "570 285 absorption 0.000112 0.000007\n", - "571 285 scatter 0.017499 0.000615\n", - "572 286 absorption 0.000127 0.000016\n", - "573 286 scatter 0.017716 0.000690\n", - "574 287 absorption 0.000119 0.000013\n", - "575 287 scatter 0.018041 0.000702\n", - "576 288 absorption 0.000125 0.000013\n", - "577 288 scatter 0.018212 0.000715" + "558 279 absorption 0.000081 0.000008\n", + "559 279 scatter 0.013109 0.000358\n", + "560 280 absorption 0.000088 0.000010\n", + "561 280 scatter 0.014395 0.000586\n", + "562 281 absorption 0.000097 0.000010\n", + "563 281 scatter 0.014637 0.000427\n", + "564 282 absorption 0.000107 0.000009\n", + "565 282 scatter 0.015683 0.000552\n", + "566 283 absorption 0.000110 0.000009\n", + "567 283 scatter 0.016293 0.000627\n", + "568 284 absorption 0.000111 0.000007\n", + "569 284 scatter 0.017032 0.000445\n", + "570 285 absorption 0.000112 0.000006\n", + "571 285 scatter 0.017666 0.000425\n", + "572 286 absorption 0.000123 0.000011\n", + "573 286 scatter 0.017706 0.000597\n", + "574 287 absorption 0.000108 0.000011\n", + "575 287 scatter 0.017339 0.000664\n", + "576 288 absorption 0.000129 0.000011\n", + "577 288 scatter 0.018452 0.000523" ] }, "execution_count": 33, @@ -1786,21 +1752,6 @@ " \n", " \n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -1815,8 +1766,8 @@ " 10000\n", " 0\n", " absorption\n", - " 0.000136\n", - " 0.000017\n", + " 0.000131\n", + " 0.000014\n", " \n", " \n", " 1\n", @@ -1830,8 +1781,8 @@ " 10000\n", " 0\n", " scatter\n", - " 0.018504\n", - " 0.000740\n", + " 0.018582\n", + " 0.000680\n", " \n", " \n", " 2\n", @@ -1845,8 +1796,8 @@ " 10000\n", " 1\n", " absorption\n", - " 0.000231\n", - " 0.000031\n", + " 0.000220\n", + " 0.000023\n", " \n", " \n", " 3\n", @@ -1860,8 +1811,8 @@ " 10000\n", " 1\n", " scatter\n", - " 0.029149\n", - " 0.001525\n", + " 0.028711\n", + " 0.001186\n", " \n", " \n", " 4\n", @@ -1875,8 +1826,8 @@ " 10000\n", " 2\n", " absorption\n", - " 0.000306\n", - " 0.000032\n", + " 0.000295\n", + " 0.000022\n", " \n", " \n", " 5\n", @@ -1890,8 +1841,8 @@ " 10000\n", " 2\n", " scatter\n", - " 0.039770\n", - " 0.001519\n", + " 0.038782\n", + " 0.001084\n", " \n", " \n", " 6\n", @@ -1905,8 +1856,8 @@ " 10000\n", " 3\n", " absorption\n", - " 0.000339\n", - " 0.000028\n", + " 0.000331\n", + " 0.000022\n", " \n", " \n", " 7\n", @@ -1920,8 +1871,8 @@ " 10000\n", " 3\n", " scatter\n", - " 0.046708\n", - " 0.001355\n", + " 0.045772\n", + " 0.001084\n", " \n", " \n", " 8\n", @@ -1935,8 +1886,8 @@ " 10000\n", " 4\n", " absorption\n", - " 0.000433\n", - " 0.000031\n", + " 0.000419\n", + " 0.000026\n", " \n", " \n", " 9\n", @@ -1950,8 +1901,8 @@ " 10000\n", " 4\n", " scatter\n", - " 0.056359\n", - " 0.001790\n", + " 0.055975\n", + " 0.001344\n", " \n", " \n", " 10\n", @@ -1965,8 +1916,8 @@ " 10000\n", " 5\n", " absorption\n", - " 0.000538\n", - " 0.000028\n", + " 0.000514\n", + " 0.000024\n", " \n", " \n", " 11\n", @@ -1980,8 +1931,8 @@ " 10000\n", " 5\n", " scatter\n", - " 0.064943\n", - " 0.001978\n", + " 0.063289\n", + " 0.001605\n", " \n", " \n", " 12\n", @@ -1995,8 +1946,8 @@ " 10000\n", " 6\n", " absorption\n", - " 0.000588\n", - " 0.000028\n", + " 0.000591\n", + " 0.000027\n", " \n", " \n", " 13\n", @@ -2010,8 +1961,8 @@ " 10000\n", " 6\n", " scatter\n", - " 0.070231\n", - " 0.002714\n", + " 0.071011\n", + " 0.002058\n", " \n", " \n", " 14\n", @@ -2025,8 +1976,8 @@ " 10000\n", " 7\n", " absorption\n", - " 0.000670\n", - " 0.000041\n", + " 0.000671\n", + " 0.000036\n", " \n", " \n", " 15\n", @@ -2040,8 +1991,8 @@ " 10000\n", " 7\n", " scatter\n", - " 0.075852\n", - " 0.001862\n", + " 0.077891\n", + " 0.001952\n", " \n", " \n", " 16\n", @@ -2055,8 +2006,8 @@ " 10000\n", " 8\n", " absorption\n", - " 0.000745\n", - " 0.000039\n", + " 0.000721\n", + " 0.000031\n", " \n", " \n", " 17\n", @@ -2070,8 +2021,8 @@ " 10000\n", " 8\n", " scatter\n", - " 0.086234\n", - " 0.001968\n", + " 0.086393\n", + " 0.001722\n", " \n", " \n", " 18\n", @@ -2085,8 +2036,8 @@ " 10000\n", " 9\n", " absorption\n", - " 0.000731\n", - " 0.000039\n", + " 0.000748\n", + " 0.000033\n", " \n", " \n", " 19\n", @@ -2100,63 +2051,61 @@ " 10000\n", " 9\n", " scatter\n", - " 0.090448\n", - " 0.001956\n", + " 0.090861\n", + " 0.001669\n", " \n", " \n", "\n", "" ], "text/plain": [ - " level 1 level 2 level 3 distribcell score \\\n", - " cell univ lat cell univ \n", - " id id id x y z id id \n", - "bin \n", - "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n", - "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n", - "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n", - "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n", - "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n", - "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n", - "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n", - "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n", - "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n", - "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n", - "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n", - "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n", - "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n", - "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n", - "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n", - "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n", - "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n", - "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n", - "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n", - "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n", + " level 1 level 2 level 3 distribcell score \\\n", + " cell univ lat cell univ \n", + " id id id x y z id id \n", + "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n", + "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n", + "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n", + "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n", + "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n", + "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n", + "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n", + "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n", + "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n", + "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n", + "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n", + "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n", + "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n", + "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n", + "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n", + "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n", + "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n", + "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n", + "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n", + "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n", "\n", - " mean std. dev. \n", - " \n", - " \n", - "bin \n", - "0 0.000136 0.000017 \n", - "1 0.018504 0.000740 \n", - "2 0.000231 0.000031 \n", - "3 0.029149 0.001525 \n", - "4 0.000306 0.000032 \n", - "5 0.039770 0.001519 \n", - "6 0.000339 0.000028 \n", - "7 0.046708 0.001355 \n", - "8 0.000433 0.000031 \n", - "9 0.056359 0.001790 \n", - "10 0.000538 0.000028 \n", - "11 0.064943 0.001978 \n", - "12 0.000588 0.000028 \n", - "13 0.070231 0.002714 \n", - "14 0.000670 0.000041 \n", - "15 0.075852 0.001862 \n", - "16 0.000745 0.000039 \n", - "17 0.086234 0.001968 \n", - "18 0.000731 0.000039 \n", - "19 0.090448 0.001956 " + " mean std. dev. \n", + " \n", + " \n", + "0 0.000131 0.000014 \n", + "1 0.018582 0.000680 \n", + "2 0.000220 0.000023 \n", + "3 0.028711 0.001186 \n", + "4 0.000295 0.000022 \n", + "5 0.038782 0.001084 \n", + "6 0.000331 0.000022 \n", + "7 0.045772 0.001084 \n", + "8 0.000419 0.000026 \n", + "9 0.055975 0.001344 \n", + "10 0.000514 0.000024 \n", + "11 0.063289 0.001605 \n", + "12 0.000591 0.000027 \n", + "13 0.071011 0.002058 \n", + "14 0.000671 0.000036 \n", + "15 0.077891 0.001952 \n", + "16 0.000721 0.000031 \n", + "17 0.086393 0.001722 \n", + "18 0.000748 0.000033 \n", + "19 0.090861 0.001669 " ] }, "execution_count": 34, @@ -2209,38 +2158,38 @@ " \n", " \n", " mean\n", - " 0.000416\n", - " 0.000025\n", + " 0.000417\n", + " 0.000020\n", " \n", " \n", " std\n", " 0.000238\n", - " 0.000011\n", + " 0.000008\n", " \n", " \n", " min\n", - " 0.000023\n", - " 0.000004\n", + " 0.000020\n", + " 0.000003\n", " \n", " \n", " 25%\n", - " 0.000206\n", - " 0.000017\n", + " 0.000214\n", + " 0.000014\n", " \n", " \n", " 50%\n", - " 0.000391\n", - " 0.000024\n", + " 0.000394\n", + " 0.000019\n", " \n", " \n", " 75%\n", - " 0.000626\n", - " 0.000031\n", + " 0.000627\n", + " 0.000025\n", " \n", " \n", " max\n", - " 0.000928\n", - " 0.000061\n", + " 0.000915\n", + " 0.000049\n", " \n", " \n", "\n", @@ -2251,13 +2200,13 @@ " \n", " \n", "count 289.000000 289.000000\n", - "mean 0.000416 0.000025\n", - "std 0.000238 0.000011\n", - "min 0.000023 0.000004\n", - "25% 0.000206 0.000017\n", - "50% 0.000391 0.000024\n", - "75% 0.000626 0.000031\n", - "max 0.000928 0.000061" + "mean 0.000417 0.000020\n", + "std 0.000238 0.000008\n", + "min 0.000020 0.000003\n", + "25% 0.000214 0.000014\n", + "50% 0.000394 0.000019\n", + "75% 0.000627 0.000025\n", + "max 0.000915 0.000049" ] }, "execution_count": 35, @@ -2292,7 +2241,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 0.474494586047\n" + "Mann-Whitney Test p-value: 0.498462484897\n" ] } ], @@ -2330,7 +2279,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 1.364780046e-41\n" + "Mann-Whitney Test p-value: 1.61253828675e-41\n" ] } ], @@ -2376,7 +2325,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2385,9 +2334,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\norlkyRKeP3+erVp1IWCgqI78DIFVDAuLossVo41pQ4rqwy2ZmHgjbbYuFKvqVlBVI1i3bnMajRMo\nZofbaLNF+F0sBAtI4yGNR2kSSvozMzO5Zs0aLlmyxFtp9Vr1d+p0K4HV9ATQgXrU6XoQeJ6KUpuT\nJz9T+EEoTugNG7amw5FIp7Mbw8NjvUUbe/S4g6Jib87VvO+Vty8e/WFh0QS20RPstdsT+eGHH+bZ\nfvPmzbTbI+l01qfVGsYFCxbx6aefZnh4RZrN5Vi/fjMeOnTIu/2MGTNoMPhWEn6Fwp1zG1W1OgcO\nHMLGjdvSZqtB4f6qR1Ep+B1GR1fzHmfQoH9RBNQ9x9nJ6OjqHDz4Ier1U7TnXtBmEdna1buFgIF3\n331/ntldcnIyq1evR5OpEnW6kVTVBD722JMFjvfp06dpt0dSuKNI4FM6nVH866+/Cv1fpaamagH5\ntfQ013I6b+XUqVO928yf/xLNZjtVNZ7h4bHctWuX9n/0XTDxGZs06cixY59gtWpN2Lx5F37zzTdM\nSUlhixadaTCYGB5eievWrStUUyCANB6hbTwkocWQIcNpNI7TTgbrKPzkHjdOCo1Ga5FWy0yfPkOr\ntOqpwjuPN97YgyS5ePF/tF7tRyiqurbnlCkFNzM6cuQIq1Spr13lhtFqrcpu3frmWVKbkZGhXUF7\nakMdpF7vok7XjqKrYWMCbVmhQrw3nrN//35tietSAl9RUdry3nvv56pVq7h161a63W5mZmZy8uTJ\ntFq7Myf/xU293uTN5J816wXabN00N46bJtNY3nrrXdoJdixFwPlhiuCzZzx3sly52AI/d3Z2Nleu\nXMlp06YV2nHw66+/ptOZ6HMiJ53O+oW23RVFJQdTLCvvps3Q3qaiVMxTBTctLY0HDx70xnPuvXeY\nj2EkdboF7Nbt9qu+V0kCaTyk8ZCUHCdOnGB0dDXa7T1osTQh0NXnhJRJo9FapFav9933EP0bS33P\nuLi6JMVJZOLEKbTZXLRY7HzwwVFXNUgJCU1pMEzTTtxfetu65ubo0aNUlGif9/yGQGXm5FecI+Ck\n3d6aGzdu9O63fft2tmnTnbVrt+SkSc/kuxJo69atVNUqFKu1xFV2eHis94R45coVdu9+G222GNrt\nNVizZmOePHmSnTr1pEgMbEaxuEClwdCLOt0TVJQYLl/+Zp73uh6OHDmi9WPxFMg8SoslLE/9sNx8\n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\nRCKRSCSB5/8ByMyfADZGvh4AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2414,7 +2363,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2423,9 +2372,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEZCAYAAAB4hzlwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XeYVPXZ//H3vUuRsjSBBaSsSkSKqIAFMYgkoiaCIhZK\nECP2lkfDozH+ErHFJI8plqgRUUEFEiVGUKMgRkQCEgUEBEQ60kFdWZC2e//+mLPjArvLbJk5M7Of\n13Wdi5nT5jOH2bnnfM8532PujoiICEBG2AFERCR5qCiIiEiUioKIiESpKIiISJSKgoiIRKkoiIhI\nlIqCSAnM7C4zGxV2DpFEUlGQhDKzM83sP2b2tZltN7MPzKxbBdd5pZnNOGjc82Z2f0XW6+4Pufs1\nFVlHScyswMzyzGyHma03s0fNrFqMy440sxfikUtERUESxszqAa8DjwANgaOAe4E9YeYqjpllJuBl\nOrt7FtATuBi4NgGvKVIqFQVJpOMAd/e/ecRud5/q7gsLZzCza8xssZl9Y2afmtnJwfhfmNnyIuMv\nCsa3B54Euge/ur8ys2uAwcAdwbjXgnlbmNlEM9tiZivN7JYirzvSzF4xsxfMLBe4sugvcjPLCX7d\nX2Fma8xsq5n9ssjytcxsjJl9GeS/w8zWxbJR3H0FMBPoUGR9j5jZWjPLNbOPzOzMYPx5wF3A5cF7\nmxeMr29mo81sg5l9YWb3m1lGMK2tmU0P9s62mtmEsv7HSdWhoiCJ9BmQHzTtnGdmDYtONLNLgXuA\noe5eD+gHbA8mLwfODMbfC7xoZtnuvgS4Hpjl7lnu3tDdRwEvAb8Lxl0YfEFOBuYBLYAfAP9jZn2K\nROgHvOzu9YPli+sDpgeR4vYD4Ndm1i4Yfw/QGjgaOAf4SQnLH/CWg/d9PPB9YE6RaXOAE4nsUY0D\nXjazGu7+FvAbYELw3k4O5n8e2AscC5wM9AGuDqbdD7zl7g2I7J09ephcUoWpKEjCuPsO4EwiX5aj\ngC1m9pqZNQ1muZrIF/nHwfwr3H1t8PgVd98UPP478DlwWrCclfCSRcefAjR29wfcfb+7rwKeAQYW\nmec/7j4peI3dJaz3Xnff4+4LgE+IfHEDXAr8xt1z3X09kSayknIVmmtmecBi4BV3H1s4wd1fcvev\n3L3A3f8I1AQKC5AVXbeZZQPnA7e5+7fuvhX4c5H3thfIMbOj3H2vu//nMLmkClNRkIRy96Xu/lN3\nbwV0IvKr/c/B5JbAiuKWC5pt5gXNQ18Fyx5ZhpduA7QoXD5Yx11A0yLzfBHDejYVebwLqBs8bgEU\nbS6KZV0nu3td4HLgCjNrUzjBzEYEzVBfB1nrA41LWE8boDqwsch7ewpoEky/g0gRmWNmi8zspzFk\nkyoqprMdROLB3T8zszF8d4B1HdD24PmCL8ungd5Emok8aEsv/LVcXDPNwePWAqvc/biS4hSzTFm6\nEN4ItAKWBs9bxbqgu79sZhcCI4Gfmtn3gf8Ferv7pwBm9iUlv991RA7WH+nuBcWsfzPBNjazHsA7\nZjbd3VfGmlGqDu0pSMKYWTszu93MjgqetwIGAbOCWZ4BRphZF4toa2atgTpEvgi3ARnBL91ORVa9\nGWhpZtUPGndMkedzgB3BAeBaZpZpZp3su9Nhi2vqOVzzT1F/B+4yswbB+7uZshWV3wKDzKwlkAXs\nB7aZWQ0z+zVQr8i8m4g0BxmAu28EpgB/NLMsM8sws2PNrCdEjtUE6wX4Osh1SPEQARUFSawdRI4D\nfBi0pc8CFgA/h8hxA+BBIgdWvwH+ATR098XAH4L5NxEpCB8UWe804FNgk5ltCcaNBjoEzSn/CH5B\nXwCcBKwEthLZ+yj8si1pT8EPel6S+4g0Ga0i8gX9MpG2/JIcsC53XwS8C9wOvBUMy4DVwLdE9nQK\nvRz8u93MPgoeXwHUIHJ84stgnmbBtG7AbDPbAbwG3Oruq0vJJlWYxesmO8GvwLFE2mwdeNrdHzWz\nRsDfiLSDrgYuc/ev4xJCJCRmdgORz/bZYWcRKYt47insI3I2REfgdOAmi5xT/gtgatC2Oy14LpLS\nzKyZmfUImm7aEfnF/2rYuUTKKm5Fwd03ufv84HEesITIOdL9gDHBbGOAi+KVQSSBahA54+cbIj92\n/gk8EWoikXKIW/PRAS9ilgNMJ9IWvNbdGwbjDfiy8LmIiIQr7geazawuMBH4WXDxUpRHKlL8q5KI\niMQkrtcpBKcITgRecPd/BqM3m1kzd99kZs2BLcUsp0IhIlIO7l6WU6kPEbc9haBpaDSw2N3/XGTS\nJGBY8HgYkbbXQ7i7BncuvvjiuKw32MrFDMm77eO1LVJx0LbQtihuqAzx3FPoQaRTsAWFPTkS6Vbg\nt8DfzWw4wSmpccwgIiJlELei4O4fUPKeyA/j9boiIlJ+uqI5ybVv3z7sCElD2+I72hbf0baoXCoK\nSa5Dhw6Hn6mK0Lb4jrbFd7QtKpd6SRWRYgX97aWEIUOGhB0h4SrrwPLBVBREpETx+uKRiolnwVbz\nkYiIRKkoiIhIlIqCiIhEqSiIiEiUioKIpJScnBymTZsWfT5hwgQaNWrE+++/T0ZGBllZWWRlZdGs\nWTP69u3LO++8c8jytWvXjs6XlZXFrbfemui3kbRUFEQkpZhZ9OybMWPGcPPNN/Pmm2/SunVrAHJz\nc9mxYwcLFizgnHPOoX///owZM+aA5V9//XV27NgRHR599NFQ3ksyUlEQkZTj7vz1r39lxIgRTJky\nhdNPP/2QeZo2bcqtt97KyJEjufPOO0NImZpUFEQk5TzxxBPcc889vPvuu3Tp0qXUefv378+WLVv4\n7LPPouN0/UXJdPGaiJSL3Vs5F1D5PWX7gnZ33nnnHXr37k2nTp0OO3+LFi0A+PLLL6PLX3TRRVSr\n9t3X38MPP8zw4cPLlCNdqSiISLmU9cu8spgZTz31FPfffz9XX301o0ePLnX+9evXA9CoUaPo8q+9\n9hq9e/eOe9ZUpOYjEUk52dnZTJs2jRkzZnDjjTeWOu+rr75KdnY27dq1S1C61KaiICIpqXnz5kyb\nNo233nqL22+/PTq+8HjB5s2befzxx7nvvvt46KGHDlhWxxRKpuYjEUlZrVq14t1336Vnz55s2rQJ\ngAYNGuDu1KlTh1NOOYVXXnmFPn36HLBc3759yczMjD7v06cPEydOTGj2ZKWiICIpZdWqVQc8z8nJ\nYe3atQCMGzeuzMvLgdR8JCIiUSoKIiISpaIgIiJRKgoiIhKloiAiIlEqCiIiEqWiICIiUSoKIiIS\npaIgImmlU6dOvP/++2HHSFkqCiISk8I7nsVziMXBt+MEeP755/n+978PwKJFi+jZs2ep61i9ejUZ\nGRkUFBSUb2OkMXVzISJlEM+O5GIrCmUpIIcTr47x8vPzD+hbKZVoT0FCVZFfjCLFycnJ4d133wVg\nzpw5dOvWjfr169OsWTNGjBgBEN2TaNCgAVlZWXz44Ye4Ow888AA5OTlkZ2czbNgwvvnmm+h6x44d\nS5s2bWjcuHF0vsLXGTlyJJdccglDhw6lfv36jBkzhv/+9790796dhg0b0qJFC2655Rb27dsXXV9G\nRgZPPvkk3/ve96hXrx6//vWvWbFiBd27d6dBgwYMHDjwgPkTRUVBkoAfNIiUrrRf+EV/VPzsZz/j\ntttuIzc3l5UrV3LppZcCMGPGDAByc3PZsWMHp512Gs899xxjxozhvffeY+XKleTl5XHzzTcDsHjx\nYm666SbGjx/Pxo0byc3NZcOGDQe87qRJk7j00kvJzc1l8ODBZGZm8sgjj7B9+3ZmzZrFtGnTeOKJ\nJw5YZsqUKcybN4/Zs2fzu9/9jmuuuYbx48ezdu1aFi5cyPjx4ytle5WFioKIpJTC22k2bNgwOtx0\n003F7mHWqFGDzz//nG3btlG7dm1OO+206DoO9tJLL/Hzn/+cnJwc6tSpw0MPPcSECRPIz8/nlVde\noV+/fpxxxhlUr16d++6775DXO+OMM+jXrx8ARxxxBF26dOHUU08lIyODNm3acO211zJ9+vQDlrnj\njjuoW7cuHTp04IQTTuD8888nJyeHevXqcf755zNv3rzK2mwxU1EQkZRSeDvNr776Kjo88cQTxX7R\njx49mmXLltG+fXtOPfVU3njjjRLXu3HjRtq0aRN93rp1a/bv38/mzZvZuHEjLVu2jE6rVasWRx55\n5AHLF50OsGzZMi644AKaN29O/fr1ufvuu9m+ffsB82RnZx+wzoOf5+XlHWZrVD4VBRFJeSU1J7Vt\n25Zx48axdetW7rzzTi655BK+/fbbYvcqWrRowerVq6PP165dS7Vq1WjWrBnNmzfniy++iE779ttv\nD/mCP3idN9xwAx06dGD58uXk5uby4IMPpsTZTioKIpK2XnzxRbZu3QpA/fr1MTMyMjJo0qQJGRkZ\nrFixIjrvoEGD+NOf/sTq1avJy8vjl7/8JQMHDiQjI4MBAwYwefJkZs2axd69exk5cuRhz1zKy8sj\nKyuL2rVrs3TpUp588snD5i26zrBuGaqiICJlYHEcKpCqhLPW3n77bTp16kRWVha33XYbEyZMoGbN\nmtSuXZu7776bHj160LBhQ+bMmcNVV13F0KFD6dmzJ8cccwy1a9fmscceA6Bjx4489thjDBw4kBYt\nWpCVlUXTpk2pWbNmia//8MMPM27cOOrVq8e1117LwIEDD5inuLwHTw/jTDxLxhtYm5knY64wjBs3\njsGDB1f6eiMftuK2sSX0F0rxOYrPEK9tkYoSsS3MEvtZSCV5eXk0bNiQ5cuXH3AcIlFK+r8Jxleo\nkmhPQUQkBpMnT2bXrl3s3LmTESNG0Llz51AKQrypKIiIxGDSpEkcddRRHHXUUaxYsYIJEyaEHSku\n1M2FiEgMRo0axahRo8KOEXfaUxARkSgVBRERiVJREBGRKB1TEJESqcfaqkdFQUSKlSrXKOj6lcql\n5iMREYlSURARkai4FgUze9bMNpvZwiLjRprZF2Y2LxjOi2cGERGJXbz3FJ4DDv7Sd+CP7n5yMLwV\n5wwiIhKjuBYFd58BfFXMJJ3SICKShMI6pnCLmX1iZqPNrEFIGURE5CBhnJL6JHBf8Ph+4A/A8INn\nGjBgQPRx+/bt6dChQ0LCJZuZM2cm/DXHjRt3wPMhQ4aUOO9LL72UkAxQOduipPcSr/cRL2F8LpJV\nVd4WixcvZsmSJZW6zrjfT8HMcoDJ7n5CrNN0P4XvJMP9FOJ574VE30+hLK+XzHRu/ne0Lb6TkvdT\nMLPmRZ72BxaWNK+IiCRWXJuPzGw8cBbQ2MzWAfcAvczsJCI/11YB18Uzg4iIxC6uRcHdBxUz+tl4\nvqaIiJSfrmgWEZEoFQUREYlSURARkSgVBRERiVJREBGRKBUFERGJUlEQEZEo3Y6zCojnfXbLsu5k\n7kqipPcRa+bStkMyv2+Rg6koVBmH9vcTn/UWrjterxcvJb2PRK9DJFxqPhIRkSgVBRERiVJREBGR\nKBUFERGJUlEQEZEoFQUREYlSURARkSgVBRERiVJREBGRKBUFERGJUlEQEZEoFQUREYlSURARkSgV\nBRERiVJREBGRKBUFERGJUlEQEZEoFQUREYlSURARkSgVBRERiaoWdgBJPma62XxlKm57untM85U0\nr0i8qChIMQ7+ElKRqJiybE9tewmXmo9ERCRKRUFERKJUFEREJOqwxxTM7B/AaOBf7l4Q/0iSdOoD\nrcZDw5WQuQ/ysmFLJ9gA7A87nIhUplj2FJ4EhgDLzey3ZtYuzpkkWTT/GH5yLlwHdHgFauSBFUCz\n+XDuz+F/gUsvheMmg+WHnVZEKsFh9xTcfSow1cwaAAOBaWa2FhgFvOju++KcURLOoddI6PYUvPsA\nTJgC+yceOtsRBh3PgZ4PRIrEB3fCgqGg+iCSsmI6pmBmRwJXAlcDc4FHga7A1Lglk3AY0P8KOHYK\nPLkQ5l5TchPRbuDja+GZ2TD5aej4d7i5HXSEQ0+tFJFUEMsxhVeB44EXgL7uvjGYNMHMPo5nOEk0\nh/OArA0w5l3YXyvG5QxW94oMOe9Bn7Ph9DPg7T/CF93jllZEKl8sF6+Ncvc3i44ws5ruvsfdu8Yp\nl4ShyzNwNPDsxDIUhIOs7hVpWOx8A1x2KazoA1N/D7sqMaeIxE0szUcPFjNuVmUHkZA1+hx+8Ev4\nO7C7QcXW5cAnV8DjS2B3fbixI5wMBWU4ec3MDhmGDBlS7PiShnhJ5GuJJFqJRcHMmptZV6CWmXUx\ns67Bv72A2glLKAngcOFV8P6vYFslrnZvFrz9J3jxLegKZz1/Fou2LIo90yFDWcbHW6JfTyQxSttT\nOBd4GDgK+EPw+A/A7cAv4x9NEqbjy1BjJ8y5KT7r33QyjIYhJwzh7DFnc+fUO9m5d2d8XktEKqTE\nouDuz7v72cCV7n52kaGfu/8jgRklnqrthnPugLf+BJ4Zv9dxuL7b9Sy6YREb8jbQ4YkOvLrk1fi9\nnoiUS4kHms1sqLu/AOSY2e1FJwHu7n+MezqJv5Oeg80nwJqzEvJy2XWzeaH/C7y3+j1ufONGGAz8\nayV8dUxCXl9ESlda81HhcYOsEgZJdRn7ocfvYUbiWwN75fRi/vXzYQ1wzalw1n2RvRYRCVWJewru\n/tfg35EJSyOJ1WkC5LYJ7VqCGpk1YCawaC6c9z9wwwnw5uOwIpQ4IkIMp6Sa2e/NrJ6ZVTezaWa2\nzcyGxrJyM3vWzDab2cIi4xqZ2VQzW2ZmU4LuMyQMPX4PH/wi7BSQ2xr+9g946xH4cdCk1DTWs5RE\npDLFcp3Cue7+DXABsBo4lkhXaLF4jsg1skX9Apjq7scB04LnkmitiDTXLD837CTf+fxH8JfFsBIY\n1hv6XQ1Z68NOJVKlxFIUCpuYLgBecfdcYjwx291nAF8dNLofMCZ4PAa4KJZ1SSXrSqTfomS73WN+\nTZgNPLYMdjWGG0+A82+B+mvCTiZSJcRSFCab2VIiXyPTzKwpka7Qyivb3TcHjzcD2RVYl5THEV9F\nerOaPyzsJCXb3QDe+S385dNIlxvXdYn8fGg2P+xkImktlq6zf2Fm/wd87e75ZrYTuLAyXtzd3cyK\n3esYMGBA9HH79u3p0KFDZbxkypk5c2blr7TzS7Ac2NWk8tddinJ1B5HXPNJ30oy74JRGMPDCyB7E\n3Kvh08vh20YlLjpu3LgKpK28dVR0vcXNO2TIEIYMGVLs/C+99FK5c6WiuPyNpIjFixezZMmSSl2n\nuR++JcjMegBtgOrBKHf3sTG9gFkOMNndTwieLwV6ufsmM2sO/Nvdjz9oGY8lV1Uwbtw4Bg8eXKF1\nRL6Mi2zP4d1h+mxYXtw2PmjeEseVdXwlzWv74Zh3oMtoaPsWbOgKn70HKxfC1g7gGdF5i/sMHbIt\nDvN6lbGO4uYty3pjn7fk+dNZZfyNpAszw90r1CYcS9fZLwLHAPM58PYpMRWFYkwChgG/C/79ZznX\nI+XRYBU0Wh45mJuKPBNWnBsZqu+Co6dBu/fglP5QexusOwM2dIMtsHTbUto2aku1jFg6AxYRiK3r\n7K5Ah/L8dDez8cBZQGMzWwf8Gvgt8HczG07kbKbLyrpeqYBOE2DxJVDwVNhJKm5fbVjWF5YBfA51\nNkPrmdBsHpwAF4y7gA07NnDckcfRqWknOjbpCMcBW1ZFrs/wmO4xJVKlxFIUFgHNidymvUzcfVAJ\nk35Y1nVJJTlhfOQCMdKgKBxsZzYsuTgy8ADLJyxn596dLNm2hEVbFvHplk/hFKBpT6j1VaS5aUsn\nWA+sXQhbO6pQSJUXS1FoAiw2sznAnmCcu3u/+MWSuGi8BGpth7Vnhp0kYerUqEO3Ft3o1qIbAA+f\n+zCwDo74GposhuwF0PI5OKN/ZNt8cTqs6Rm5OdCmcLOLhCGWojAy+Nf57qT2qnUkK10c/xos7a9f\nwxA55XXdGZHhoxuA5ZHmp1b/idxS9OKfQG0YNHEQfY7pwznHnkPLei3DTi0Sd7GckvpecAZRW3d/\nx8xqx7KcJKF2k+C9kWGnSF47syNFc2n/yPP6xg8H/pC3V7zN/079X5pnNefCdhdCC2BjgYqrpKVY\nzj66FrgGaESki4uWwJPAD+IbTSpVnc2R5pLViekiOy3kwvAuwxneZTj5Bfl8uP5DXlv6GlwM1GgF\nn/WLHL9Y1Vv7zpI2YvmpcxNwJvANgLsvA5rGM5TEwXGvR9rJ82uGnSQlZWZkckarM/jdOb+Dx4Ex\n78LXR8MP74Lb2kR+IjVeGnZMkQqLpSjscffCA8yYWTX0uyj1tJsESyvlQnQB2N4OZt4BT38UuQd1\nBjDsbPjJuZFrJ/QnIikqlqIw3czuBmqb2TnAy8Dk+MaSSlUdOPrfsPz8sJMklJkdMsTFlk4wFfjz\nalg0EM6/Fa45Ddq8H5/XE4mjWIrCL4CtwELgOuBN4P/FM5RUsjbAppNK7ScoPXkxQxzl14T5P4Un\nF8Ks26D/FXA56v5bUsphi4K75xPpiuJGd7/E3UepY6IUcyzJdd+EdOcZsGgQPL400g/w9SfDSc+j\nJiVJBSUWBYsYaWbbgM+Az4K7rt1jcdsPl7g4Flh5Ttgpqp79R8B7wNipcPqfItc+VN8VdiqRUpW2\np3Ab0AM4xd0buntD4NRg3G2JCCcVt/6b9VCXSG+iEo7NJ8LoWZE9iOHdQTeglSRWWlG4Ahjs7qsK\nR7j7SmBIME1SwNSVU2EVkd5FJTz7asOrYyPHHK4i0g+TSBIqrShUc/etB48MxumK5hQxdeVUWBF2\nCokwmP0/MBV+MPYHzFk/J+xAIocorSjsK+c0SRIFXsDUFSoKSWchjOo7ir7j+7Jg84Kw04gcoLSi\n0NnMdhQ3ACckKqCU3yebPqFhrYaQG3YSOVjfdn159LxHOf+l81nxpaq2JI8Sm4Hc1Qid6t5Z+Q7n\nHHMOyyJ3oZEkc3mny/l699f0ebEPc65WU5IkB3XzmMamr5lOr5xeYceQUlzX7TouPv5iBk4cqL9G\nSQr6GKap/QX7+WDtB/Rs0zPsKHIYD/3wIQzT/QglKagopJGiffxUb1Wd3HW5ZNfNDjuWHEa1jGpM\nuGQCtAeO/2eF15ewPp8kLakopJ2gj582D8PqG1HXCqmhUa1G8A/gguuh7sYKri2B/T1J2lFRSFc5\n78Ea3VAnpawDProOLrwKfZlLWFQU0pHlQ+sPdJe1VPT+/4NaX0LXp8NOIlWUikI6avYJ5DWP3HNY\nUktBdXjtWej9K6i7Kew0UgWpKKSjnPe0l5DKtnaEucPh3NvDTiJVkIpCOmozHVb3CjuFVMT7v4KW\nsyPdnoskkIpCurH8yG0gdZA5te2rDW8+BudFrjkRSRQVhXSTvTByLCGvWdhJpKI+/xHsgGfmPhN2\nEqlCVBTSjY4npBGDKXDv9Hv5Zs83YYeRKkJFId20ngFr1LVF2tgEfY7tw+9n/j7sJFJFqCikmzYz\nYO33w06RNuLVZURZ1jt22FgenPIgVlfdVkj8qSikkyOJ3Cw+t3XYSdLIwV1GVNaVxmVY7zcOi26A\n7ndUcgaRQ6kopJPWwBrtJaSlD34BXUdB7W1hJ5E0p6KQTtqgpqN0ldsaPr0Muv8h7CSS5lQU0on2\nFNLbjLsifSLV+jLsJJLGVBTSxMYdG+EIYFv7sKNIvOS2gWV91VmexJWKQpqYsXZGpOtl139pWpt1\nG5z6GOgO6hIn+gZJEzPWzIA1YaeQuNt8YmRvsGPYQSRdqSikiQ/WfQBrw04hCTHrdugOOjVV4kFF\nIQ3k7s7l8+2fQ0Xv4iipYfl5UA04+t9hJ5E0VC3sAFI2ubm5XHHFtezd+924rQ02UrN5bXbm7wwv\nmCSOZ8Bs4LRHYFXvsNNImlFRSDF79uzhX//6F/v2jfpuZO8JsPlIYGtouSTBFgI/nAH11sE3rcJO\nI2lEzUcpKDPzCODy74Y222HtKSGnkoTaCywcDF3UrbZULhWFVJe5B5rPhXX6tVjlfHQddBkNGboJ\nj1QeFYVUd9R/YdvxsLdm2Ekk0bacAF+3geNeDzuJpBEVhVTX+gNYe2bYKSQsH10P3Z4KO4WkERWF\nVNd6hvo7qsoWXwLNP4aGK8NOImlCRSGVWT60+o/2FKqy/bVgwVAdcJZKE1pRMLPVZrbAzOaZ2Zyw\ncqS0pp/CriawMzvsJBKm+VdC5xciPxJEKijM6xQc6OXu6ge4vNR0JACbO8POpnD0u6BWJKmgsJuP\ndLPZitD9mKXQ/CvhpOfDTiFpIMyi4MA7ZvaRmV0TYo4U5dpTkO8sGgTHvQE6M1kqKMzmox7uvtHM\nmgBTzWypu88onDhgwIDojO3bt6dDhw5hZAzdzJkzD3iem5tLfn4+NFwF5vDVMSElk6SyqzGs/AF0\n/AfMPXTyuHHjEp8pQQ7+G6lKFi9ezJIlSyp1naEVBXffGPy71cxeBU4FokVh4sSJYUVLOoMHD44+\n3rJlC7fffg/7cv4Nq3uhFjiJmv9TOLP4olD0M5SO0v39xcqs4t8HoTQfmVltM8sKHtcB+hDp4kti\nlfMerDo77BSSTJafC42AIz8LO4mksLCOKWQDM8xsPvAh8Lq7TwkpS8pxPFIUVvcKO4okk4LqsAA4\naUzYSSSFhVIU3H2Vu58UDJ3c/aEwcqQqb1AAVgBftg07iiSb+cCJY3XNgpRb2KekSjkUtN4Lq89G\nxxPkEFsIrlnQXdmkfFQUUlBB631qOpKSzR8GJ6oJScpHRSHFuDsFbfbpILOUbNEgaDcZauwIO4mk\nIBWFFLMqd1Xksj9dnyAl2dkU1vSEDjqtW8pORSHFzNwwk4y11dHxBCmVmpCknFQUUszM9YVFQaQU\nyy6A7IVQf03YSSTFqCikEHeP7CmsqRF2FEl2+TXh08vgxBfCTiIpRkUhhSzcspDa1WqTkZsZdhRJ\nBfOHRa5ZECkDFYUUMmXFFM5upbOOJEbrTwU3aBl2EEklKgop5O0Vb3NWq7PCjiEpw+CTYXBS2Dkk\nlagopIhd+3Yx+4vZnHmU7scsZbDgJ9ABdu/fHXYSSREqCilixpoZnNzsZLJqZIUdRVJJbmvYBJM/\nmxx2EklLx8GIAAALz0lEQVQRKgop4u0Vb9Pn2D5hx5BU9AmMXaADzhIbFYUUMWXFFBUFKZ8lkT3N\nzXmbw04iKUBFIQWsy13HxryNdG3eNewokor2woXHX8i4hel7S06pPCoKKeD1Za/zo+/9iMwMXZ8g\n5TPsxGFqQpKYqCikgEnLJtHvuH5hx5AU1iunF9t3bWfB5gVhR5Ekp6KQ5L4t+JYP1n7AuW3PDTuK\npLAMy2Bo56GM/UR7C1I6FYUkt3DnQs5odQb1atYLO4qkuCtOvIKXFr7E/oL9YUeRJKaikOTm7pyr\npiOpFO0atyOnQQ5TVkwJO4okMRWFJLa/YD/zd82nb7u+YUeRNHFF5yvUhCSlUlFIYtNXT6dxtca0\nrt867CiSJgZ2GsjbK95m686tYUeRJKWikMQmLJpA96zuYceQNNKwVkP6H9+f0fNGhx1FkpSKQpLa\nm7+XV5e+yul1Tw87iqSZm065iac+eor8gvywo0gSUlFIUlNXTKV9k/YcWf3IsKNImunaoivN6jbj\nzc/fDDuKJCEVhSQ14dMJDOw4MOwYkqZuPOVG/vLfv4QdQ5KQikIS2rVvF68ve51LOlwSdhRJU5d1\nvIy5G+fy+fbPw44iSUZFIQm9/OnL9GjVg+y62WFHkTR1RLUjuLrL1Tzy4SNhR5Eko6KQhJ6Z9wxX\nd7k67BiS5m497VbGLRzHlp1bwo4iSURFIcks3baU5V8u58ff+3HYUSTNNavbjMs6XsZjHz4WdhRJ\nIioKSeaZuc9w5YlXUj2zethRpAoYccYInvr4KXbs2RF2FEkSKgpJJG9vHs/Pf55rul4TdhSpIto2\nakvvo3vz9MdPhx1FkoSKQhJ5dt6z9MrpxTENjwk7ilQhvzzzlzw862Hy9uaFHUWSgIpCksgvyOfP\ns//MiDNGhB1FqpgTm51I76N786dZfwo7iiQBFYUkMXHJRJpnNef0lurWQhLvvl738ciHj7Bt17aw\no0jIVBSSwP6C/dzz3j38uuevw44iVdSxjY7l8o6X88D7D4QdRUKmopAEXvjkBZrWaUqfY/uEHUWq\nsJG9RjJ+0Xg+2fRJ2FEkRCoKIdu9fzf3Tr+XB3s/iJmFHUeqsCZ1mvDA2Q9w/RvXU+AFYceRkKgo\nhOw3M35D1xZdObP1mWFHEWF4l+EYplNUq7BqYQeoypZuW8oT/32C+dfPDzuKCAAZlsGovqM46/mz\n6H10b4478riwI0mCaU8hJPsL9nPt5Gv5Vc9f0bJey7DjiER1bNqRe3vdy+CJg9mbvzfsOJJgKgoh\neeD9B6ieWZ2bT7057Cgih7jxlBtpVb8VN71xE+4edhxJIBWFELz5+Zs8/fHTvNj/RTIzMsOOI3II\nM2PsRWOZs2EOf5z1x7DjSALpmEKCzd04lyv/eSWTBk2ieVbzsOOIlCirZhaTB02mx7M9yKqZxbVd\nrw07kiSAikICzf5iNhdOuJCn+z6tK5clJbSu35p/D/s3vcf0Zvf+3dxy6i06dTrNqfkoQV5b+hr9\nxvfjuQuf46LjLwo7jkjM2jZqy/Qrp/PXj//Kda9fx579e8KOJHEUSlEws/PMbKmZfW5md4aRIVHy\n9uZx21u38bO3fsakQZP40fd+FHYkkTI7uuHRzB4+m+3fbqfr012Zs35O2JEkThJeFMwsE3gcOA/o\nAAwys/aJzhFve/bv4bl5z9H+L+3Z9u025l43t1xNRosXL45DOpGyy6qZxSuXvsLd37+bfuP7MWji\nIJZuWxp2LP2NVLIwjimcCix399UAZjYBuBBYEkKWSlXgBXy04SP+ufSfPDf/OTpnd2b8gPEVulp5\nyZKU3yySRsyMQScMom+7vjz24WP0fK4nHZt2ZGjnoZzf9vxQTp7Q30jlCqMoHAWsK/L8C+C0EHKU\ni7uzJ38P23ZtY23uWtZ8vYZl25fx3w3/Zc76OTSu3ZgL213I1KFT6dS0U9hxReKibo263PX9u7i9\n++28vux1xi8az4gpI2ie1ZxuLbrRuWln2jVux1FZR9EiqwVN6jQhw3QIMxWEURRiuhKmwAvoN74f\njuPu0X8jKzj8OA9eJpZxh1tvfkE+O/bu4Js930TvZXtk7SNpU78Nreu3pm2jtlx18lU88eMnaF2/\ndSVuquLt2/c19er1PWDcnj3L2KPjf5JgNavVZECHAQzoMID8gnzmbZrH/E3zWbh5IdNWTWPDjg2s\n37GeL7/9klrValG3Rl3q1qhLnRp1qJ5RncyMTKplVCPTMsnMyIz+m2EZGKWf5VR4FtTHOR/z43E/\nLn6eUtbRvWV37u55d/nffJqyRF+taGanAyPd/bzg+V1Agbv/rsg8uoRSRKQc3L1C5wyHURSqAZ8B\nPwA2AHOAQe6uhkERkZAlvPnI3feb2c3A20AmMFoFQUQkOSR8T0FERJJXaKcDmFkjM5tqZsvMbIqZ\nNShhvmIvdDOzkWb2hZnNC4bzEpe+csRyEZ+ZPRpM/8TMTi7LsqmkgttitZktCD4HKX9V1eG2hZkd\nb2azzGy3mf28LMummgpui6r2uRgS/G0sMLOZZtY51mUP4O6hDMDvgTuCx3cCvy1mnkxgOZADVAfm\nA+2DafcAt4eVvxLef4nvrcg8PwLeDB6fBsyOddlUGiqyLYLnq4BGYb+PBG6LJkA34AHg52VZNpWG\nimyLKvq56A7UDx6fV97vizBPHO4HjAkejwGK6xAoeqGbu+8DCi90K5TKPXMd7r1BkW3k7h8CDcys\nWYzLppLybovsItNT+bNQ1GG3hbtvdfePgH1lXTbFVGRbFKpKn4tZ7p4bPP0QaBnrskWFWRSy3X1z\n8HgzkF3MPMVd6HZUkee3BLtLo0tqfkpih3tvpc3TIoZlU0lFtgVErn15x8w+MrNr4pYyMWLZFvFY\nNhlV9P1U5c/FcODN8iwb17OPzGwq0KyYSQdcMeLuXsK1CaUdBX8SuC94fD/wByIbIlXEeoQ/XX7p\nlKai2+JMd99gZk2AqWa21N1nVFK2RKvImR/pdtZIRd9PD3ffWNU+F2Z2NnAV0KOsy0Kci4K7n1PS\nNDPbbGbN3H2TmTUHthQz23qgVZHnrYhUOdw9Or+ZPQNMrpzUCVPieytlnpbBPNVjWDaVlHdbrAdw\n9w3Bv1vN7FUiu8up+scfy7aIx7LJqELvx903Bv9Wmc9FcHB5FHCeu39VlmULhdl8NAkYFjweBvyz\nmHk+Ar5nZjlmVgO4PFiOoJAU6g8sjGPWeCjxvRUxCbgColeCfx00ucWybCop97Yws9pmlhWMrwP0\nIfU+C0WV5f/24D2nqvi5KHTAtqiKnwszaw38A/iJuy8vy7IHCPFoeiPgHWAZMAVoEIxvAbxRZL7z\niVwBvRy4q8j4scAC4BMiBSU77DMEyrENDnlvwHXAdUXmeTyY/gnQ5XDbJVWH8m4L4BgiZ1PMBxZV\nhW1BpEl2HZALfAWsBepWxc9FSduiin4ungG2A/OCYU5py5Y06OI1ERGJUl+2IiISpaIgIiJRKgoi\nIhKloiAiIlEqCiIiEqWiICIiUSoKUqWZWYGZvVDkeTUz22pmqXaFvEilUFGQqm4n0NHMjgien0Ok\nCwBdwCNVkoqCSKQ3yR8HjwcB4wm6TTCzOmb2rJl9aGZzzaxfMD7HzN43s4+DoXswvpeZvWdmL5vZ\nEjN7MYw3JFJeKgoi8DdgoJnVBE4g0hd9obuBae5+GtAb+D8zq02ku/dz3L0rMBB4tMgyJwE/AzoA\nx5hZD0RSRFx7SRVJBe6+0MxyiOwlvHHQ5D5AXzMbETyvSaSXyU3A42Z2IpAPfK/IMnM86LnVzOYT\nuePVzHjlF6lMKgoiEZOAh4GziNzisaiL3f3zoiPMbCSw0d2HmlkmsLvI5D1FHuejvzNJIWo+Eol4\nFhjp7p8eNP5t4NbCJ2Z2cvCwHpG9BYh06Z0Z94QiCaCiIFWdA7j7end/vMi4wrOP7geqm9kCM1sE\n3BuMfwIYFjQPtQPyDl5nKc9Fkpa6zhYRkSjtKYiISJSKgoiIRKkoiIhIlIqCiIhEqSiIiEiUioKI\niESpKIiISJSKgoiIRP1/aoYdn8j4yjkAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2458,7 +2407,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 1bd7ee49a6..cea483f9d0 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -326,7 +326,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Run openmc in plotting mode\n", "executor = openmc.Executor()\n", @@ -342,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JEwAiCb5uYN4AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMThUMjE6MTc6\nMDErMDc6MDA/DItCAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTE4VDIxOjE3OjAxKzA3OjAw\nTlEz/gAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDJUMjM6NTE6MTQtMDQ6MDBw2InyAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAy\nVDIzOjUxOjE0LTA0OjAwAYUxTgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -376,8 +387,7 @@ "outputs": [], "source": [ "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "tallies_file.tallies = []" + "tallies_file = openmc.TalliesFile()" ] }, { @@ -454,9 +464,9 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 3df61825cc8c93656ed1458c34fca14000884e73\n", - " Date/Time: 2015-09-19 07:34:09\n", - " OpenMP Threads: 4\n", + " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", + " Date/Time: 2015-10-02 23:51:14\n", + " MPI Processes: 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -591,20 +601,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6600E-01 seconds\n", - " Reading cross sections = 1.1500E-01 seconds\n", - " Total time in simulation = 8.1308E+01 seconds\n", - " Time in transport only = 8.1157E+01 seconds\n", - " Time in inactive batches = 2.1600E+00 seconds\n", - " Time in active batches = 7.9148E+01 seconds\n", - " Time synchronizing fission bank = 1.6000E-02 seconds\n", - " Sampling source sites = 9.0000E-03 seconds\n", - " SEND/RECV source sites = 7.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-02 seconds\n", - " Total time for finalization = 1.6400E-01 seconds\n", - " Total time elapsed = 8.1856E+01 seconds\n", - " Calculation Rate (inactive) = 23148.1 neutrons/second\n", - " Calculation Rate (active) = 5685.55 neutrons/second\n", + " Total time for initialization = 5.7400E-01 seconds\n", + " Reading cross sections = 1.3400E-01 seconds\n", + " Total time in simulation = 3.5996E+02 seconds\n", + " Time in transport only = 3.5984E+02 seconds\n", + " Time in inactive batches = 1.0821E+01 seconds\n", + " Time in active batches = 3.4914E+02 seconds\n", + " Time synchronizing fission bank = 1.5000E-02 seconds\n", + " Sampling source sites = 7.0000E-03 seconds\n", + " SEND/RECV source sites = 8.0000E-03 seconds\n", + " Time accumulating tallies = 3.4000E-02 seconds\n", + " Total time for finalization = 2.5500E-01 seconds\n", + " Total time elapsed = 3.6081E+02 seconds\n", + " Calculation Rate (inactive) = 4620.64 neutrons/second\n", + " Calculation Rate (active) = 1288.87 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -682,8 +692,8 @@ "\tName =\t\n", "\tFilters =\t\n", " \t\tmesh\t[10000]\n", - "\tNuclides =\t-1 \n", - "\tScores =\t['flux', 'fission']\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux', u'fission']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -817,8 +827,8 @@ "\tName =\t\n", "\tFilters =\t\n", " \t\tmesh\t[10000]\n", - "\tNuclides =\t-1 \n", - "\tScores =\t['flux']\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux']\n", "\tEstimator =\ttracklength\n", "\n" ] @@ -861,7 +871,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -870,9 +880,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -902,9 +912,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFPNJREFUeJzt3XuMHVd9wPHvxhsXAl7sbYrjRyIbx65xHyJIMaiFMrTB\nNWnwuiA5Rmq1gKmqWg3pk9hBrbeqKE4qCq1QKrU8ukTYrQut5VTU2EkzfUitXSAOSZatH22ADXhD\ncIi3hRYbb/84Z72zd+/uzt29M/fu7PcjXd25M2dmzvHcvT+fc+bMAUmSJEmSJEmSJEmSJEmSJKkp\n7gaeAJ6MywDdwHHgNHAMWJpJvxc4AwwCW8rLpiSpSD9KCAYvAhYRgsA64H7gvTHNPcD+uLwJOAVc\nC6wBzgLXlJddSdJszfRjvRE4Afwv8H3gH4G3AduA/pimH9gel3uAg8Al4GlCQNjc1BxLkgoxU0B4\nEng9oYnoOuB2YDWwHBiOaYbjZ4CVwFBm/yFgVbMyK0kqTucM2weB+wj9BP9DaA76fk2a0fiaynTb\nJEltYqaAAPDx+AJ4P+F//cPADcB5YAXwbNz+DHBjZt/Vcd0E69atGz137twssyxJC9Y54OaiDp6n\nw/fl8f0m4K3AAeAI0BvX9wKH4/IRYCewGFgLrAdO1h7w3LlzjI6OVva1b9++lufB8lm+hVa2hVA+\nwk09hclTQ/g08IOEjuLdwAuEu4oOAbsIncc7YtqBuH4AuBzT22QkSfNAnoDwU3XWXQBumyL9H8SX\nJGkecYxAAZIkaXUWCmX55q8qlw2qX76idbTovKOxPUySlFNHRwcU+LttDUGSBBgQJEmRAUGSBBgQ\nJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJElRnoCwF3gKeIIw\nfeYPAN3AceA0cAxYWpP+DDAIbGlmZtV+urq66ejomPTq6upuddYkNWim52qvAf4BeCXwf8BfAZ8F\nfgR4DrgfuAdYBuwBNhGCxq3AKuBhYANwpea4zodQEeH57PWuZQf1rnFXVzcjI89PWr9kyTIuXrzQ\n/AxKFdLq+RAuEuZSvo4w3eZ1wNeBbUB/TNMPbI/LPcDBuM/TwFlgc1NzrHktBIPRSa96QUJSuWYK\nCBeADwJfJQSCbxOaipYDwzHNcPwMsBIYyuw/RKgpSJLaXOcM29cBv0ZoOnoB+GvgF2rSjP03byp1\nt/X19V1dTpLEuVAlqUaapqRpWtr5ZmqLuhN4E/Du+PkXgdcCPw28ETgPrAAeBTYS+hEA9sf3o8A+\n4ETNce1DqIhG+xAaTS9pXKv7EAYJAeDFMRO3AQPAQ0BvTNMLHI7LR4CdwGJgLbAeONncLGt+6Kx7\n95Gk9jVTk9HjwCeBzxPuFPoi8GfAEuAQsIvQebwjph+I6weAy8Bupm9OUmVdZqqagKT21Kq/TpuM\nKmK6JqBG1/udkKbX6iYjSdICYUCQJAEGBElSZECQJAEGBElSZECQJAEGBDWg3qOuJVWH4xCUW/0x\nB45DkMriOARJUikMCJIkwICgtlH/YXhOxSmVxz4E5VZ0H4J9C9L07EOQJJXCgCBJAgwIkqTIgCBJ\nAvIFhB8GHsu8XgDeA3QDx4HTwDFgaWafvcAZwhScW5qYX0lSQRrtrb4GeAbYDNwFPAfcD9wDLAP2\nAJuAA8CtwCrgYWADYQrOMd5lNA95l5HUWu12l9FtwFnga8A2oD+u7we2x+Ue4CBwiTDf8llCAJEk\ntbFGA8JOwo89wHJgOC4Px88AK4GhzD5DhJqCJKmNdTaQdjHwFkLzUK1R6tf3s9sn6Ovru7qcJAlJ\nkjSQFUmqvjRNSdO0tPM10hbVA/wKsDV+HgQS4DywAngU2EjoRwDYH9+PAvuAE5lj2YcwD9mHILVW\nO/UhvJ3x5iKAI0BvXO4FDmfW7yTUKNYC64GTc8umFq7Jzzjy+UZSMfJGmpcAXyH8wI/Edd3AIeAm\nQufxDuDbcdu9wLuAy8DdwOdqjmcNYR5qVQ2h3jn9/mghKrqG4MPtlJsBQWqtdmoykiRVmAFBkgQY\nECRJkQFBk3R1ddedvUxStdmprEnqdx7DVB28dipL5bBTWZJUCgOCJAkwIEiSIgOCJAkwIEiSIgOC\nJAkwIEiSIgOCJAkwIEiSIgOCJAkwIGhemjyLmjOpSXOXNyAsBT4NfBkYAF5DmDHtOHAaOBbTjNkL\nnCHMu7ylWZmVgsuE5xtNfI2MPN/SXEnzXd6A8MfAZ4FXAj9O+KHfQwgIG4BH4meATcCd8X0r8EAD\n55EktUieH+qXAa8HPh4/XwZeALYB/XFdP7A9LvcAB4FLhLmWzwKbm5NdSVJR8gSEtcA3gU8AXwT+\nHHgJsBwYjmmG42eAlcBQZv8hYFUzMitJKk5nzjSvBn4V+Hfgw4w3D40Za8idyqRtfX19V5eTJCFJ\nkhxZkaSFI01T0jQt7Xx5Jlq4AfhXQk0B4HWETuNXAG8EzgMrgEeBjYwHi/3x/SiwDziROaYT5LSx\n+TBBzlRp/V6pytphgpzzwNcInccAtwFPAQ8BvXFdL3A4Lh8BdgKLCUFkPXCySfmVJBUkT5MRwF3A\npwg/8ueAdwKLgEPALkLn8Y6YdiCuHyB0QO9m+uYkSVIbcE5lTWKTkdSe2qHJSJK0ABgQFrCuru66\nj4CQtDDZZLSANdY0NNV6m4yksthkJEkqhQFBkgQYECRJkQFBkgQYECRJkQFBkgQYECRJkQFBkgQY\nECRJkQFBkgQYECRJkQFBkgTkDwhPA18CHmN89rNu4DhwGjgGLM2k3wucAQaBLc3IqCSpWHkDwiiQ\nALcAm+O6PYSAsAF4hPG5lDcBd8b3rcADDZxHktQijfxQ1z5ydRvQH5f7ge1xuQc4CFwi1CzOMh5E\nJEltqpEawsPA54FfiuuWA8NxeTh+BlgJDGX2HQJWzS2bkqSideZM95PAN4AfIjQTDdZsH6X+jCXZ\n7ZKkNpY3IHwjvn8T+FtCE9AwcANwHlgBPBvTPAPcmNl3dVw3QV9f39XlJElIkiR/riVpAUjTlDRN\nSztfnqnYrgMWASPASwh3FP0ecBvwLeA+Qofy0vi+CThACBqrCE1NNzOxluAUmm3AKTSl+aXoKTTz\n1BCWE2oFY+k/RQgKnwcOAbsIncc7YpqBuH4AuAzsxiYjlaJz7A9mgiVLlnHx4oUW5EeaXwqLNDOw\nhtAGqlhDsOagKiu6huD4AEkSYECQJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYECQ\nJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYEBYELq6uuno6Jj0kqSsvAFhEfAY8FD83A0cB04TZk9b\nmkm7FzgDDAJbmpNNzcXIyPOEiWNqX5I0Lm9AuJswJebYr8geQkDYADwSP0OYT/nO+L4VeKCBc0iS\nWijPj/Vq4Hbgo4xP3bYN6I/L/cD2uNwDHAQuEeZZPgtsblJeJUkFyhMQPgT8NnAls245MByXh+Nn\ngJXAUCbdELBqjnmUJJVgpoBwB/Asof9gql7ImRqkbayWpHmgc4btP0FoHrodeBHQBTxIqBXcAJwH\nVhCCBsAzwI2Z/VfHdZP09fVdXU6ShCRJGs27JFVamqakaVra+Rq59/ANwG8BbwHuB74F3EfoUF4a\n3zcBBwj9BquAh4GbmVxLGB0dteJQlnCLab1/72asL/LYzTun3zdVQbxdvLB7xmeqIdQa+6vaDxwC\ndhE6j3fE9QNx/QBwGdiNTUZquc664y6WLFnGxYsXWpAfqT21anSSNYQSWUOw5qBqKLqG4BgBSRJg\nQJAkRQYESRJgQJAkRQYESRJgQJAkRQYESRJgQJAkRQaEiqk3O5ok5eFI5YqpPyp5fowadqSyND1H\nKkuSSmFAkCQBBgRJUmRAkCQBBgRJUmRAkCQBMweEFwEngFOEWdA+ENd3A8eB08AxwhSaY/YCZ4BB\nYEszMytJKk6e+1mvA75DmG7zXwjzKm8DniPMrXwPsIyJcyrfyvicyhuAKzXHdBxCQRyH4DgEVVc7\njEP4TnxfDCwCnicEhP64vh/YHpd7gIPAJcJcy2eBzU3KqySpQHkCwjWEJqNh4FHgKWB5/Ex8Xx6X\nVwJDmX2HCDUFSVKb68yR5grwKuBlwOeAN9ZsH6V+fTy7fZK+vr6ry0mSkCRJjqxI0sKRpilpmpZ2\nvkbbon4H+C7wbiABzgMrCDWHjYR+BID98f0osI/QMZ1lH0JB7EOwD0HV1eo+hOsZv4PoxcCbgMeA\nI0BvXN8LHI7LR4CdhP6GtcB64GQT8ytJKshMTUYrCJ3G18TXg8AjhKBwCNhF6DzeEdMPxPUDwGVg\nN9M3J0kt1Dnp8eBLlizj4sULLcqP1Fo+/rpibDKa+7H9bqpdtbrJSJK0QBgQJEmAAUGSFBkQJEmA\nAUGSFBkQJEmAAUGSFBkQJEmAAWHe6urqpqOjY9JLkmbLkcrzVP0RydCKkb2OVJbK4UhlSVIpDAiS\nJMCAIEmKDAiSJMCAINXorHv3VldXd6szJhUuz5zK0gJymXp3JI2MeEuvqi9PDeFGwpzJTwFPAu+J\n67uB48Bp4BjjU20C7AXOAIPAlmZlVpJUnDz/7bkhvk4BLwW+AGwH3gk8B9wP3AMsA/YAm4ADwK3A\nKuBhYANwJXNMxyHMkeMQyj+231m1WjuMQzhPCAYA/w18mfBDv40w3zLxfXtc7gEOApcI8y2fBTY3\nJ7uSpKI02qm8BrgFOAEsB4bj+uH4GWAlMJTZZ4gQQCRJbayRTuWXAp8B7gZGaraNUr+end0+QV9f\n39XlJElIkqSBrEhS9aVpSpqmpZ0vb1vUtcDfAX8PfDiuGwQSQpPSCkLH80ZCPwLA/vh+FNhHqFWM\nsQ9hjuxDsA9BC0879CF0AB8DBhgPBgBHgN643AsczqzfCSwG1gLrgZPNyKwkqTh5Is3rgH8CvsT4\nf532En7kDwE3ETqPdwDfjtvvBd5FuKn7buBzNce0hjBH1hCsIWjhKbqG4OOv5ykDggFBC087NBlJ\nkhYAA0Kbc2Y0SWXxWUZtbmTkeaZu7pCk5rGGIEkCDAiSpMiAIEkCDAhSTk6co+qzU1nKxYlzVH3W\nECRJgAFBmiObklQdNhlJc2JTkqrDGoIkCTAgSJIiA4IkCTAgtA0fYiep1exUbhM+xE5Sq+WpIXwc\nGAaeyKzrBo4Dp4FjwNLMtr3AGcKcy1uak01JUtHyBIRPAFtr1u0hBIQNwCPxM8Am4M74vhV4IOc5\nJEktlufH+p+B52vWbQP643I/sD0u9wAHgUuEeZbPApvnnEtJUuFm+7/35YRmJOL78ri8EhjKpBsC\nVs3yHJKkEjWjU3mU+r2h2e2T9PX1XV1OkoQkSZqQFUmqjjRNSdO0tPPlvYVlDfAQ8GPx8yCQAOeB\nFcCjwEbG+xL2x/ejwD7gRM3xRkdHp4shC0+4xXSqu4zmun6+HrsV52zesf2Oq9nireiF3Xo42yaj\nI0BvXO4FDmfW7wQWA2uB9cDJuWRQklSOPE1GB4E3ANcDXwN+l1ADOATsInQe74hpB+L6AcJTv3Yz\nfXOSVFGdkwYWLlmyjIsXL7QoP9LMWjXqySajGjYZtcs5iz2233vNRbs2GUmSKsaA0AL1nlskSa3m\ns4xaoP5ziwwKklrLGoIkCTAgSJIiA4IkCTAgFMpJbzRRZ93vQ1dXd6szJgGOQyhUY2ML5u+99Y5D\nmOuxryWM45zIgWyqVfQ4BO8yklruMvUCxciItUmVyyYjSRJgQJAkRQYESRJgQJDamHclqVwGBKlt\njXU2T3yNjIwYJFQI7zKS5p3JdyV5R5KaoagawlbCNJtngHsKOkfbcACaWs/mJc1dEQFhEfARQlDY\nBLwdeGUB52kb408vHXs9SrUniktbnYGCpa3OwCzkb16qcqAoc0L6KioiIGwGzhKm1rwE/CXQU8B5\nSpe/JpCWnbWSpa3OQMHSVmegiWoDxT6mCxQdHYvndQAxIMxNEQFhFWHu5TFDcd28N7kmMPaS5pv6\nNYrwfzg7sheqIgJC4b+QV65cmeJ/Nx3cccfPN+UczmomZU0OII02R01Vw66XvpG0ap4ifuVeC/QR\n+hAA9gJXgPsyac4C6wo4tyRV2Tng5lZnohGdhEyvARYDp6h4p7IkaWpvBv6DUBPY2+K8SJIkSSpa\nnoFnfxK3Pw7ckmPfPwS+HNP/DfCyzLa9Mf0gsGXu2Z9RmeVbA3wXeCy+HmhGAWZQRPl+P6Y9BTwC\n3JjZVoXrN1X51lDu9SuibGN+k9Dfl+25rcK1G1NbvjVU42+vj3A351g53pzZVvj1W0RoClpDmOqp\nXh/B7cBn4/JrgH/Lse+bGL/raX98QRjcdiqmXxP3L/IZTGWXbw3wRPOyP6Oiyrcks/9dwEfjclWu\n31TlW0N516+oskEIcEeB/2L8B7Mq1w7ql28N1fjb2wf8Rp3zNXz9ZnNx8ww82wb0x+UTwFLghhn2\nPU6I3mP7rI7LPcDBmP7puP/mWeQ7r7LLV7aiyjeS2f+lwHNxuSrXb6rylamosgH8EfDemmNV5dpB\n/fKVrcjy1btjtOHrN5uAkGfg2VRpVubYF+BdjEfJlTHdTPs0S9nlA1hLqOqlwOtmk+kGFFm+9wNf\nBd4BfCCuq9L1GytfL+M1PCjv+hVVtp74+Us1x6rKtZuqfFCdv727CE1MHyMEEZjF9ZtNQMg78Gy2\nYxzeB3wPONCEPMxG2eX7OqE6ewuh2neAic0TzVZk+d4H3AR8AvhwE/IwG2WU7y+AD8V1ZV6/Isr2\nYuBeQrNDnv3n27WbrnxV+dv7U0JgexXwDeCDs83DbB5//QwTOwxvZGIUqpdmdUxz7Qz7voPQhvYz\nMxzrmVnkO6+yy/e9+AL4ImEMx/q4XIQiyzfmAOM1oCpdvzHZ8pV5/Yoo2zpC+/LjmfRfILRfV+Ha\nTVW+zcCzVONv79nM+o8CD01zrKZfvzwDz7IdI69lvGNkun23Ak8B19cca6xjZDEhCp6jmBHWY8ou\n3/WEDiOAVxAu8lKKU1T51mf2vwt4MC5X5fpNVb4yr19RZcuq16k8369dVrZ8VfnbW5HZ/9cZb30o\n7frVG3j2y/E15iNx++PAq2fYF8KtUV+h/i1g98b0g8DPNqsQ0yizfG8DnozrvgD8XBPLMZUiyvdp\nwh0bp4DPAC/PbKvC9ZuqfG+l3OtXRNmy/pOJt51W4dplZctX9rWDYsr3SUL/yOPAYWB5ZlvZ10+S\nJEmSJEmSJEmSJEmSJEmSJEmStJD8PzxAIwQKcNCwAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1018,7 +1028,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 28, @@ -1027,9 +1037,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEUCAYAAAA8+dFZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGeRJREFUeJzt3X20ZFV55/Hvz8YXUBL6Jo4O0IojELtdOgENsGJmxBdc\npFVQOhFoEpUZBY0dXyaZMK6oMOOsTHSiImHJ4BIVDQ0qEAdHEF9BaR0UQVT6grAcMrysIcRu3yAq\nL8/8UXWhKG7VrXO7zq26t7+ftWp1nX32OfXUprof9tn77JOqQpKkUT1i0gFIkpYXE4ckqREThySp\nEROHJKkRE4ckqREThySpkVYTR5LDk1yf5MYkJ82z/2lJvpHkF0n+rMmxkqTJSFv3cSRZBdwAvBC4\nDfgWcGxVzfbUeTzwZOBlwPaqes+ox0qSJqPNHsdBwE1VdXNV3QOcBxzZW6Gq7qyqq4B7mh4rSZqM\nNhPHXsAtPdu3dsvaPlaS1KI2E8eOXANzHRRJmlK7tHju24A1Pdtr6PQcxnZsEhOMJC1CVWWxx7bZ\n47gK2C/JPkkeBRwNXDSgbv8XGPnYqmr9dfLJJ7d+3EJ1B+1vUt5f1r991FFHTW1bNjl2lHq25/ja\nc9j+UdptlLKlaMsdac+l+Lu+I+3Zv72jWutxVNW9STYBlwKrgLOqajbJid39ZyZ5Ip0ZU78G3J/k\nTcC6qvr5fMe2FetCDj300NaPW6juoP1NyvvLFvu9dsSOfOaox45Sz/YcX3sO2z9KuzUpa9s0/10f\ntG8Sv83WpuMuhSS1nOOfNhs2bOCCCy6YdBgrhu05PrbleCWhpvRSlZaZtWvXTjqEFcX2HB/bcrqY\nOPSAdevWTTqEFcX2HB/bcrqYOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmN\nmDgkSY2YOCRJjZg4JK14MzOQzP+amZl0dMtPmw9ykqSpsH07DFpIO4teI3bnZY9DktSIiUOS1IiJ\nQ5LUiIlDktSIiUPSsuHsqOngrCpJy4azo6aDPQ5JUiMmDklSIyYOSVIjJg5JUiMmDklSIyYOSZqH\nU38HczquJM3Dqb+D2eOQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1\n0mriSHJ4kuuT3JjkpAF1TuvuvzbJAT3lb01yXZLvJdmc5NFtxipJGk1riSPJKuB04HBgHXBskrV9\n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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1078,9 +1088,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1113,7 +1123,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 2f32f3d9a7..9460b8c32b 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -342,7 +342,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Run openmc in plotting mode\n", "executor = openmc.Executor()\n", @@ -358,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98JFQMZGiFPL70AAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDktMjFUMTA6MDg6\nNTcrMDc6MDALr51VAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA5LTIxVDEwOjA4OjU3KzA3OjAw\nevIl6QAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDJUMjM6NDg6NTQtMDQ6MDDJCXMCAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAy\nVDIzOjQ4OjU0LTA0OjAwuFTLvgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -387,13 +398,12 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "tallies_file.tallies = []" + "tallies_file = openmc.TalliesFile()" ] }, { @@ -569,8 +579,9 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: b167d70c877c516deca785801b9fa6f53fb0985b\n", - " Date/Time: 2015-09-21 10:25:26\n", + " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", + " Date/Time: 2015-10-02 23:48:55\n", + " MPI Processes: 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -625,20 +636,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.1800E-01 seconds\n", - " Reading cross sections = 6.5800E-01 seconds\n", - " Total time in simulation = 1.7037E+01 seconds\n", - " Time in transport only = 1.7024E+01 seconds\n", - " Time in inactive batches = 2.8600E+00 seconds\n", - " Time in active batches = 1.4177E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", + " Total time for initialization = 5.7300E-01 seconds\n", + " Reading cross sections = 1.2700E-01 seconds\n", + " Total time in simulation = 2.1409E+01 seconds\n", + " Time in transport only = 2.1383E+01 seconds\n", + " Time in inactive batches = 2.7630E+00 seconds\n", + " Time in active batches = 1.8646E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.7971E+01 seconds\n", - " Calculation Rate (inactive) = 4370.63 neutrons/second\n", - " Calculation Rate (active) = 2645.13 neutrons/second\n", + " Total time elapsed = 2.1994E+01 seconds\n", + " Calculation Rate (inactive) = 4524.07 neutrons/second\n", + " Calculation Rate (active) = 2011.16 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -746,13 +757,6 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -767,9 +771,8 @@ "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total (nu-fission / absorption) 1.046353 0.00935" + " nuclide score mean std. dev.\n", + "0 total (nu-fission / absorption) 1.046353 0.00935" ] }, "execution_count": 26, @@ -809,22 +812,17 @@ " \n", " \n", " \n", + " energy [MeV]\n", " nuclide\n", " score\n", " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", + " (0.0e+00 - 6.2e-01)\n", " total\n", " absorption\n", " 0.95873\n", @@ -835,9 +833,8 @@ "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total absorption 0.95873 0.00774" + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total absorption 0.95873 0.00774" ] }, "execution_count": 27, @@ -880,13 +877,6 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -901,9 +891,8 @@ "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "bin \n", - "0 total nu-fission 1.091622 0.011163" + " nuclide score mean std. dev.\n", + "0 total nu-fission 1.091622 0.011163" ] }, "execution_count": 28, @@ -949,20 +938,11 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", - " 0.0e+00 - 6.2e-01\n", + " (0.0e+00 - 6.2e-01)\n", " 10000\n", " total\n", " absorption\n", @@ -975,8 +955,7 @@ ], "text/plain": [ " energy [MeV] cell nuclide score mean std. dev.\n", - "bin \n", - "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802012 0.006609" + "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.802012 0.006609" ] }, "execution_count": 29, @@ -1014,27 +993,16 @@ " \n", " \n", " energy [MeV]\n", - " cell\n", " nuclide\n", " score\n", " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", - " 0.0e+00 - 6.2e-01\n", - " 10000\n", + " (0.0e+00 - 6.2e-01)\n", " total\n", " (nu-fission / absorption)\n", " 1.246604\n", @@ -1045,13 +1013,8 @@ "" ], "text/plain": [ - " energy [MeV] cell nuclide score mean \\\n", - "bin \n", - "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.246604 \n", - "\n", - " std. dev. \n", - "bin \n", - "0 0.011825 " + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.246604 0.011825" ] }, "execution_count": 30, @@ -1087,22 +1050,17 @@ " \n", " \n", " \n", + " energy [MeV]\n", " nuclide\n", " score\n", " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", + " (0.0e+00 - 6.2e-01)\n", " total\n", " (((absorption * nu-fission) * absorption) * (n...\n", " 1.046353\n", @@ -1113,13 +1071,11 @@ "" ], "text/plain": [ - " nuclide score mean \\\n", - "bin \n", - "0 total (((absorption * nu-fission) * absorption) * (n... 1.046353 \n", + " energy [MeV] nuclide \\\n", + "0 (0.0e+00 - 6.2e-01) total \n", "\n", - " std. dev. \n", - "bin \n", - "0 0.01894 " + " score mean std. dev. \n", + "0 (((absorption * nu-fission) * absorption) * (n... 1.046353 0.01894 " ] }, "execution_count": 31, @@ -1179,87 +1135,78 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", " 10000\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " (U-238 / total)\n", " (nu-fission / flux)\n", - " 0.000001\n", + " 6.641746e-07\n", " 6.859257e-09\n", " \n", " \n", " 1\n", " 10000\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " (U-238 / total)\n", " (scatter / flux)\n", - " 0.209986\n", + " 2.099861e-01\n", " 1.966887e-03\n", " \n", " \n", " 2\n", " 10000\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " (U-235 / total)\n", " (nu-fission / flux)\n", - " 0.355667\n", + " 3.556665e-01\n", " 3.717881e-03\n", " \n", " \n", " 3\n", " 10000\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " (U-235 / total)\n", " (scatter / flux)\n", - " 0.005555\n", + " 5.554650e-03\n", " 5.218094e-05\n", " \n", " \n", " 4\n", " 10000\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " (U-238 / total)\n", " (nu-fission / flux)\n", - " 0.007165\n", + " 7.165057e-03\n", " 5.625590e-05\n", " \n", " \n", " 5\n", " 10000\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " (U-238 / total)\n", " (scatter / flux)\n", - " 0.227653\n", + " 2.276535e-01\n", " 8.544314e-04\n", " \n", " \n", " 6\n", " 10000\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " (U-235 / total)\n", " (nu-fission / flux)\n", - " 0.008089\n", + " 8.089493e-03\n", " 5.080374e-05\n", " \n", " \n", " 7\n", " 10000\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " (U-235 / total)\n", " (scatter / flux)\n", - " 0.003370\n", + " 3.370111e-03\n", " 1.361116e-05\n", " \n", " \n", @@ -1267,27 +1214,25 @@ "" ], "text/plain": [ - " cell energy [MeV] nuclide score mean \\\n", - "bin \n", - "0 10000 0.0e+00 - 6.3e-07 (U-238 / total) (nu-fission / flux) 0.000001 \n", - "1 10000 0.0e+00 - 6.3e-07 (U-238 / total) (scatter / flux) 0.209986 \n", - "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355667 \n", - "3 10000 0.0e+00 - 6.3e-07 (U-235 / total) (scatter / flux) 0.005555 \n", - "4 10000 6.3e-07 - 2.0e+01 (U-238 / total) (nu-fission / flux) 0.007165 \n", - "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227653 \n", - "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008089 \n", - "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003370 \n", + " cell energy [MeV] nuclide score \\\n", + "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", + "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", + "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", + "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", + "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", + "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", + "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", + "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", "\n", - " std. dev. \n", - "bin \n", - "0 6.859257e-09 \n", - "1 1.966887e-03 \n", - "2 3.717881e-03 \n", - "3 5.218094e-05 \n", - "4 5.625590e-05 \n", - "5 8.544314e-04 \n", - "6 5.080374e-05 \n", - "7 1.361116e-05 " + " mean std. dev. \n", + "0 6.641746e-07 6.859257e-09 \n", + "1 2.099861e-01 1.966887e-03 \n", + "2 3.556665e-01 3.717881e-03 \n", + "3 5.554650e-03 5.218094e-05 \n", + "4 7.165057e-03 5.625590e-05 \n", + "5 2.276535e-01 8.544314e-04 \n", + "6 8.089493e-03 5.080374e-05 \n", + "7 3.370111e-03 1.361116e-05 " ] }, "execution_count": 33, @@ -1416,21 +1361,12 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", " 10000\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " U-238\n", " nu-fission\n", " 0.000002\n", @@ -1439,7 +1375,7 @@ " \n", " 1\n", " 10000\n", - " 0.0e+00 - 6.3e-07\n", + " (0.0e+00 - 6.3e-07)\n", " U-235\n", " nu-fission\n", " 0.867982\n", @@ -1448,7 +1384,7 @@ " \n", " 2\n", " 10000\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " U-238\n", " nu-fission\n", " 0.082801\n", @@ -1457,7 +1393,7 @@ " \n", " 3\n", " 10000\n", - " 6.3e-07 - 2.0e+01\n", + " (6.3e-07 - 2.0e+01)\n", " U-235\n", " nu-fission\n", " 0.093484\n", @@ -1468,12 +1404,11 @@ "" ], "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "bin \n", - "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 1.284890e-08\n", - "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.867982 7.022256e-03\n", - "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.082801 6.087096e-04\n", - "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093484 5.275039e-04" + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.284890e-08\n", + "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.867982 7.022256e-03\n", + "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082801 6.087096e-04\n", + "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.093484 5.275039e-04" ] }, "execution_count": 37, @@ -1509,21 +1444,12 @@ " mean\n", " std. dev.\n", " \n", - " \n", - " bin\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " 0\n", " 10002\n", - " 1.0e-08 - 1.1e-07\n", + " (1.0e-08 - 1.1e-07)\n", " H-1\n", " scatter\n", " 4.620525\n", @@ -1532,7 +1458,7 @@ " \n", " 1\n", " 10002\n", - " 1.1e-07 - 1.2e-06\n", + " (1.1e-07 - 1.2e-06)\n", " H-1\n", " scatter\n", " 2.036841\n", @@ -1541,7 +1467,7 @@ " \n", " 2\n", " 10002\n", - " 1.2e-06 - 1.3e-05\n", + " (1.2e-06 - 1.3e-05)\n", " H-1\n", " scatter\n", " 1.659916\n", @@ -1550,7 +1476,7 @@ " \n", " 3\n", " 10002\n", - " 1.3e-05 - 1.4e-04\n", + " (1.3e-05 - 1.4e-04)\n", " H-1\n", " scatter\n", " 1.861546\n", @@ -1559,7 +1485,7 @@ " \n", " 4\n", " 10002\n", - " 1.4e-04 - 1.5e-03\n", + " (1.4e-04 - 1.5e-03)\n", " H-1\n", " scatter\n", " 2.049664\n", @@ -1568,7 +1494,7 @@ " \n", " 5\n", " 10002\n", - " 1.5e-03 - 1.6e-02\n", + " (1.5e-03 - 1.6e-02)\n", " H-1\n", " scatter\n", " 2.162157\n", @@ -1577,7 +1503,7 @@ " \n", " 6\n", " 10002\n", - " 1.6e-02 - 1.7e-01\n", + " (1.6e-02 - 1.7e-01)\n", " H-1\n", " scatter\n", " 2.224496\n", @@ -1586,7 +1512,7 @@ " \n", " 7\n", " 10002\n", - " 1.7e-01 - 1.9e+00\n", + " (1.7e-01 - 1.9e+00)\n", " H-1\n", " scatter\n", " 1.997585\n", @@ -1595,7 +1521,7 @@ " \n", " 8\n", " 10002\n", - " 1.9e+00 - 2.0e+01\n", + " (1.9e+00 - 2.0e+01)\n", " H-1\n", " scatter\n", " 0.373472\n", @@ -1606,17 +1532,16 @@ "" ], "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "bin \n", - "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.620525 0.038249\n", - "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.036841 0.013203\n", - "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.659916 0.010107\n", - "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.861546 0.013328\n", - "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.049664 0.008215\n", - "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.162157 0.010245\n", - "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.224496 0.013796\n", - "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.997585 0.009161\n", - "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.373472 0.003922" + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.620525 0.038249\n", + "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.036841 0.013203\n", + "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.659916 0.010107\n", + "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.861546 0.013328\n", + "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.049664 0.008215\n", + "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.162157 0.010245\n", + "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.224496 0.013796\n", + "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 1.997585 0.009161\n", + "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373472 0.003922" ] }, "execution_count": 38, @@ -1649,7 +1574,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/openmc/cross.py b/openmc/cross.py index e2281142c3..f361313b31 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -14,7 +14,7 @@ TALLY_ARITHMETIC_OPS = ['+', '-', '*', '/', '^'] class CrossScore(object): """A special-purpose tally score used to encapsulate all combinations of two - tally's scores as a outer product for tally arithmetic. + tally's scores as an outer product for tally arithmetic. Parameters ---------- @@ -270,7 +270,6 @@ class CrossFilter(object): self._left_filter = None self._right_filter = None self._binary_op = None - self._num_bins = 0 if left_filter is not None: self.left_filter = left_filter @@ -281,9 +280,6 @@ class CrossFilter(object): if binary_op is not None: self.binary_op = binary_op - if self.left_filter is not None and self.right_filter is not None: - self._num_bins = left_filter.num_bins * right_filter.num_bins - def __hash__(self): return hash((self.left_filter, self.right_filter)) @@ -337,7 +333,10 @@ class CrossFilter(object): @property def num_bins(self): - return self._num_bins + if self.left_filter is not None and self.right_filter is not None: + return self.left_filter.num_bins * self.right_filter.num_bins + else: + return 0 @property def stride(self): @@ -356,11 +355,13 @@ class CrossFilter(object): def left_filter(self, left_filter): cv.check_type('left_filter', left_filter, (Filter, CrossFilter)) self._left_filter = left_filter + self._bins['left'] = left_filter.bins @right_filter.setter def right_filter(self, right_filter): cv.check_type('right_filter', right_filter, (Filter, CrossFilter)) self._right_filter = right_filter + self._bins['right'] = right_filter.bins @binary_op.setter def binary_op(self, binary_op): diff --git a/openmc/filter.py b/openmc/filter.py index 5dbf83fdd5..9735d95bb9 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -35,7 +35,7 @@ class Filter(object): ---------- type : str The type of the tally filter. - bins : Integral or Iterable of Integral or Iterable of float + bins : Integral or Iterable of Integral or Iterable of Real The bins for the filter num_bins : Integral The number of filter bins @@ -325,8 +325,8 @@ class Filter(object): elif self.type in ['energy', 'energyout']: return np.all(self.bins == other.bins) - for bin in self.bins: - if bin not in other.bins: + for bin in other.bins: + if bin not in self.bins: return False return True @@ -404,7 +404,7 @@ class Filter(object): The zero-based index into the filter's array of bins. The bin index for 'material', 'surface', 'cell', 'cellborn', and 'universe' filters corresponds to the ID in the filter's list of bins. For - 'distribcell' tallies the bin_index necessarily can only be zero + 'distribcell' tallies the bin index necessarily can only be zero since only one cell can be tracked per tally. The bin index for 'energy' and 'energyout' filters corresponds to the energy range of interest in the filter bins of energies. The bin index for 'mesh' @@ -434,22 +434,28 @@ class Filter(object): if self.type == 'mesh': + # Construct 3-tuple of x,y,z cell indices for a 3D mesh if (len(self.mesh.dimension) == 3): nx, ny, nz = self.mesh.dimension x = bin_index / (ny * nz) y = (bin_index - (x * ny * nz)) / nz z = bin_index - (x * ny * nz) - (y * nz) filter_bin = (x, y, z) + + # Construct 2-tuple of x,y cell indices for a 2D mesh else: nx, ny = self.mesh.dimension x = bin_index / ny y = bin_index - (x * ny) filter_bin = (x, y) + # Construct 2-tuple of lower, upper energies for energy(out) filters elif self.type in ['energy', 'energyout']: filter_bin = (self.bins[bin_index], self.bins[bin_index+1]) + # Construct 1-tuple of with the cell ID for distribcell filters elif self.type == 'distribcell': filter_bin = (self.bins[0],) + # Construct 1-tuple with domain ID (e.g., material) for other filters else: filter_bin = (self.bins[bin_index],) @@ -586,8 +592,8 @@ class Filter(object): openmc_geometry = summary.openmc_geometry # Use OpenCG to compute the number of regions - opencg_geometry.initializeCellOffsets() - num_regions = opencg_geometry._num_regions + opencg_geometry.initialize_cell_offsets() + num_regions = opencg_geometry.num_regions # Initialize a dictionary mapping OpenMC distribcell # offsets to OpenCG LocalCoords linked lists @@ -596,7 +602,7 @@ class Filter(object): # Use OpenCG to compute LocalCoords linked list for # each region and store in dictionary for region in range(num_regions): - coords = opencg_geometry.findRegion(region) + coords = opencg_geometry.find_region(region) path = opencg.get_path(coords) cell_id = path[-1] diff --git a/openmc/mesh.py b/openmc/mesh.py index 7c2a625832..e410c99100 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -151,7 +151,7 @@ class Mesh(object): @name.setter def name(self, name): if name is not None: - check_type('name for mesh ID="{0}"'.format(self._id), + cv.check_type('name for mesh ID="{0}"'.format(self._id), name, basestring) self._name = name else: diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index a989d27e9d..9b85e9bfcd 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -24,7 +24,7 @@ class EnergyGroups(object): Attributes ---------- - group_edges : NumPy array + group_edges : ndarray The energy group boundaries [MeV] num_groups : Integral The number of energy groups @@ -57,6 +57,20 @@ class EnergyGroups(object): else: return existing + def __eq__(self, other): + if not isinstance(other, EnergyGroups): + return False + elif self.group_edges != other.group_edges: + return False + else: + return True + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self.group_edges)) + @property def group_edges(self): return self._group_edges @@ -72,20 +86,6 @@ class EnergyGroups(object): self._group_edges = np.array(edges) self._num_groups = len(edges)-1 - def __eq__(self, other): - if not isinstance(other, EnergyGroups): - return False - elif self.group_edges != other.group_edges: - return False - else: - return True - - def __ne__(self, other): - return not self == other - - def __hash__(self): - return hash(tuple(self.group_edges)) - def generate_bin_edges(self, start, stop, num_groups, spacing='linear'): """Generate equally or logarithmically-spaced energy group boundaries. @@ -97,8 +97,8 @@ class EnergyGroups(object): The highest energy in MeV num_groups : Integral The number of energy groups - spacing : str - The spacing between groups ('linear' or 'logarithmic') + spacing : {'linear', 'logarithmic'} + The spacing between groups """ @@ -107,15 +107,15 @@ class EnergyGroups(object): cv.check_type('number of groups', num_groups, Integral) cv.check_type('spacing', spacing, basestring) cv.check_greater_than('first edge', start, 0, True) - cv.check_greater_than('first edge', stop, start, False) + cv.check_greater_than('last edge', stop, start, False) cv.check_greater_than('number of groups', num_groups, 0) cv.check_value('spacing', spacing, ('linear', 'logarithmic')) if spacing == 'linear': - self.group_edges = np.linspace(start, stop, num_groups+1) + self.group_edges = np.linspace(start, stop, num_groups + 1) elif spacing == 'logarithmic': self.group_edges = \ - np.logspace(np.log10(start), np.log10(stop), num_groups+1) + np.logspace(np.log10(start), np.log10(stop), num_groups + 1) self._num_groups = num_groups @@ -189,7 +189,7 @@ class EnergyGroups(object): Returns ------- ndarray - The NumPy array indices for each energy group of interest + The ndarray array indices for each energy group of interest Raises ------ diff --git a/openmc/statepoint.py b/openmc/statepoint.py index f58994b8c7..5f0b5adbd6 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -544,7 +544,7 @@ class StatePoint(object): contains_filters = False for test_filter in test_tally.filters: - if filter.is_subset(test_filter): + if test_filter.is_subset(filter): contains_filters = True break From 7bc104b21b8afc043ff7ad1a4afa9c17fbe03a47 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 00:08:16 -0400 Subject: [PATCH 252/519] Simplified EnergyGroups.get_condensed_groups(...) routine --- openmc/mgxs/groups.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index 9b85e9bfcd..f0adc5101a 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -227,11 +227,11 @@ class EnergyGroups(object): ---------- coarse_groups : Iterable of 2-tuple The energy groups of interest - a list of 2-tuples, each directly - corresponding to one of the new coarse groups. The values in the - 2-tuples are upper/lower energy groups used to construct a new - coarse group. For example, if [(1,2), (2,4)] was used as the coarse - groups, fine groups 1 and 2 would be merged into coarse group 1 - while fine groups 3 and 4 would be merged into coarse group 2. + corresponding to one of the new coarse groups. The values in the + 2-tuples are upper/lower energy groups used to construct a new + coarse group. For example, if [(1,2), (2,4)] was used as the coarse + groups, fine groups 1 and 2 would be merged into coarse group 1 + while fine groups 3 and 4 would be merged into coarse group 2. Returns ------- @@ -255,9 +255,7 @@ class EnergyGroups(object): cv.check_less_than('lower group', group[0], group[1], False) # Compute the group indices into the coarse group - group_bounds = list() - for group in coarse_groups: - group_bounds.append(group[0]) + group_bounds = [group[0] for group in coarse_groups] group_bounds.append(coarse_groups[-1][1]) # Determine the indices mapping the fine-to-coarse energy groups From 8030112938c77d36da23b9da46008c465535748a Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 3 Oct 2015 00:16:15 -0400 Subject: [PATCH 253/519] Use OrderedDict for material nuclides in PyAPI --- openmc/clean_xml.py | 2 +- openmc/material.py | 10 +- tests/test_filter_cell/inputs_true.dat | 2 +- tests/test_filter_cell/results_true.dat | 14 +- tests/test_filter_cellborn/inputs_true.dat | 2 +- tests/test_filter_cellborn/results_true.dat | 6 +- tests/test_filter_energy/inputs_true.dat | 2 +- tests/test_filter_energy/results_true.dat | 18 +- tests/test_filter_energyout/inputs_true.dat | 2 +- tests/test_filter_energyout/results_true.dat | 18 +- .../inputs_true.dat | 2 +- .../results_true.dat | 66 +- tests/test_filter_material/inputs_true.dat | 2 +- tests/test_filter_material/results_true.dat | 18 +- tests/test_filter_universe/inputs_true.dat | 2 +- tests/test_filter_universe/results_true.dat | 18 +- tests/test_score_MT/inputs_true.dat | 2 +- tests/test_score_MT/results_true.dat | 90 +- tests/test_score_absorption/inputs_true.dat | 2 +- tests/test_score_absorption/results_true.dat | 38 +- tests/test_score_events/inputs_true.dat | 2 +- tests/test_score_events/results_true.dat | 18 +- tests/test_score_fission/inputs_true.dat | 2 +- tests/test_score_fission/results_true.dat | 26 +- tests/test_score_flux/inputs_true.dat | 2 +- tests/test_score_flux/results_true.dat | 74 +- tests/test_score_flux_yn/inputs_true.dat | 2 +- tests/test_score_flux_yn/results_true.dat | 2594 ++++++++--------- tests/test_score_kappafission/inputs_true.dat | 2 +- .../test_score_kappafission/results_true.dat | 26 +- tests/test_score_nufission/inputs_true.dat | 2 +- tests/test_score_nufission/results_true.dat | 26 +- tests/test_score_nuscatter/inputs_true.dat | 2 +- tests/test_score_nuscatter/results_true.dat | 14 +- tests/test_score_nuscatter_n/inputs_true.dat | 2 +- tests/test_score_nuscatter_n/results_true.dat | 62 +- tests/test_score_nuscatter_pn/inputs_true.dat | 2 +- .../test_score_nuscatter_pn/results_true.dat | 42 +- tests/test_score_nuscatter_yn/inputs_true.dat | 2 +- .../test_score_nuscatter_yn/results_true.dat | 70 +- tests/test_score_scatter/inputs_true.dat | 2 +- tests/test_score_scatter/results_true.dat | 38 +- tests/test_score_scatter_n/inputs_true.dat | 2 +- tests/test_score_scatter_n/results_true.dat | 62 +- tests/test_score_scatter_pn/inputs_true.dat | 2 +- tests/test_score_scatter_pn/results_true.dat | 42 +- tests/test_score_scatter_yn/inputs_true.dat | 2 +- tests/test_score_scatter_yn/results_true.dat | 106 +- tests/test_score_total/inputs_true.dat | 2 +- tests/test_score_total/results_true.dat | 38 +- tests/test_score_total_yn/inputs_true.dat | 2 +- tests/test_score_total_yn/results_true.dat | 1202 ++++---- 52 files changed, 2394 insertions(+), 2394 deletions(-) diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index 2bb3f39f1b..aefd30ac7b 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -29,7 +29,7 @@ def sort_xml_elements(tree): comment_elements.append((element, next_element)) # Now iterate over all tags and order the elements within each tag - for tag in tags: + for tag in sorted(list(tags)): # Retrieve all of the elements for this tag try: diff --git a/openmc/material.py b/openmc/material.py index e495357b54..a5714e339e 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -1,4 +1,4 @@ -from collections import Iterable +from collections import Iterable, OrderedDict from copy import deepcopy from numbers import Real, Integral import warnings @@ -64,15 +64,15 @@ class Material(object): self._density = None self._density_units = '' - # A dictionary of Nuclides + # An ordered dictionary of Nuclides (order affects OpenMC results) # Keys - Nuclide names # Values - tuple (nuclide, percent, percent type) - self._nuclides = {} + self._nuclides = OrderedDict() - # A dictionary of Elements + # An ordered dictionary of Elements (order affects OpenMC results) # Keys - Element names # Values - tuple (element, percent, percent type) - self._elements = {} + self._elements = OrderedDict() # If specified, a list of tuples of (table name, xs identifier) self._sab = [] diff --git a/tests/test_filter_cell/inputs_true.dat b/tests/test_filter_cell/inputs_true.dat index 7455ded398..7cf1c07c2f 100644 --- a/tests/test_filter_cell/inputs_true.dat +++ b/tests/test_filter_cell/inputs_true.dat @@ -1 +1 @@ -55f5e81110db78873ebe2d1411e6f3feb1df98ee14a6489a6b2d9c1164448e48a158b2c0f4efc8ea71d6aabe2e64d029b997d656e5975d2ab549ea365480933b \ No newline at end of file +3b06e27fa039762b59076bb9431ef003e69ef32f8d01bcf908fe85f59bf7127bd8b94bf2f895b1b63e9fcdbd97aeaf4b02bc02e7bd029bfd85263c68498ce562 \ No newline at end of file diff --git a/tests/test_filter_cell/results_true.dat b/tests/test_filter_cell/results_true.dat index 5aebd42967..47ff3c281a 100644 --- a/tests/test_filter_cell/results_true.dat +++ b/tests/test_filter_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -2.240915E+01 -1.009032E+02 -4.711189E+00 -4.469059E+00 -6.533718E+01 -8.552989E+02 +1.767552E+01 +6.295417E+01 +3.863588E+00 +3.013300E+00 +5.356594E+01 +5.839391E+02 diff --git a/tests/test_filter_cellborn/inputs_true.dat b/tests/test_filter_cellborn/inputs_true.dat index 8a234a6223..3379e4b26a 100644 --- a/tests/test_filter_cellborn/inputs_true.dat +++ b/tests/test_filter_cellborn/inputs_true.dat @@ -1 +1 @@ -b9e90c6f594460d23ab84d56ff31897da3f47fdb558356468bb74119df0081f1600953045e4ec68e6048e334cb14abe1566cd72c414d3133c7f4a29d1140bb9e \ No newline at end of file +6dd7d019587330bbf9c19bae7ad1d888331858b68bd77218315d5fa7b85df7fb97cb208daed584a780592cf9840e67ea3777ccbde502f3861798aac95722be9c \ No newline at end of file diff --git a/tests/test_filter_cellborn/results_true.dat b/tests/test_filter_cellborn/results_true.dat index 1aedcc9c63..d0ab58f4ed 100644 --- a/tests/test_filter_cellborn/results_true.dat +++ b/tests/test_filter_cellborn/results_true.dat @@ -1,10 +1,10 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.073903E+02 -2.311705E+03 +8.921179E+01 +1.601939E+03 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_energy/inputs_true.dat b/tests/test_filter_energy/inputs_true.dat index 977dfc0ae0..58da3ba3e0 100644 --- a/tests/test_filter_energy/inputs_true.dat +++ b/tests/test_filter_energy/inputs_true.dat @@ -1 +1 @@ -f41cd0988306e97da0e720c37ca123b2fab894f0cd60a69b6d47a0d6097d993efbf20c61345c71f3e0561af7968684f8fcd39eb908c9c34fbbe2e835eccc659b \ No newline at end of file +bc9f43ff6368da544942b93ecfb2561911071c44524e35608fcb92c1262fe5543e09525414a87cd647fbc50113d64ff867730e5f4391f31b096abd7a0543b474 \ No newline at end of file diff --git a/tests/test_filter_energy/results_true.dat b/tests/test_filter_energy/results_true.dat index b25314510c..599e0bf888 100644 --- a/tests/test_filter_energy/results_true.dat +++ b/tests/test_filter_energy/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -2.777972E+01 -1.636507E+02 -4.274382E+01 -3.658341E+02 -5.403589E+01 -5.860017E+02 -1.137001E+01 -2.594280E+01 +2.844008E+01 +1.619630E+02 +4.425619E+01 +3.938244E+02 +5.527425E+01 +6.120383E+02 +9.799897E+00 +1.957877E+01 diff --git a/tests/test_filter_energyout/inputs_true.dat b/tests/test_filter_energyout/inputs_true.dat index f31f456eb4..4cfce0b49d 100644 --- a/tests/test_filter_energyout/inputs_true.dat +++ b/tests/test_filter_energyout/inputs_true.dat @@ -1 +1 @@ -52c9c541a82b4f395889450ab4696dffb13ee01427e65e79556080bab88388e91c932b862686a4e449948016e03240bc0692d1fc4386b61f5d0a05310158d232 \ No newline at end of file +74c55768b2b0f5696d5bff9d36a3639c6d858bf2984d799c8b46908b897af11e691b1f9f05646d52fcee046de3bfee11e35b9b379b2967abb0922f60168017b7 \ No newline at end of file diff --git a/tests/test_filter_energyout/results_true.dat b/tests/test_filter_energyout/results_true.dat index 7c626faa4b..814385d5a4 100644 --- a/tests/test_filter_energyout/results_true.dat +++ b/tests/test_filter_energyout/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -2.742000E+01 -1.574582E+02 -4.267000E+01 -3.646435E+02 -5.278000E+01 -5.578420E+02 -7.900000E+00 -1.253260E+01 +2.842000E+01 +1.620214E+02 +4.361000E+01 +3.810139E+02 +5.297000E+01 +5.616595E+02 +6.530000E+00 +8.828900E+00 diff --git a/tests/test_filter_group_transfer/inputs_true.dat b/tests/test_filter_group_transfer/inputs_true.dat index d19163cafa..f98d11bd2b 100644 --- a/tests/test_filter_group_transfer/inputs_true.dat +++ b/tests/test_filter_group_transfer/inputs_true.dat @@ -1 +1 @@ -25c0be6220072084bed91a172e0e55545b968b60da14f6b36a58493e0fb6b0e96a4b3eb576df1c503b0e18629149d3ee0754de2ffed5ffd82d6e6b7e0f261993 \ No newline at end of file +dd69e0768aa7a4e28efd20adc6a607337c9a15682fa307b1aa2459595f90a523f1fa6e4e4f6db1d74e52a2287ef4efa85d77b1751cd1a2d2e6618385cf7f4607 \ No newline at end of file diff --git a/tests/test_filter_group_transfer/results_true.dat b/tests/test_filter_group_transfer/results_true.dat index 576c6b9d76..c41451e776 100644 --- a/tests/test_filter_group_transfer/results_true.dat +++ b/tests/test_filter_group_transfer/results_true.dat @@ -1,54 +1,54 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -2.486000E+01 -1.303342E+02 +2.576000E+01 +1.331666E+02 0.000000E+00 0.000000E+00 -5.000000E-02 -1.700000E-03 +7.000000E-02 +1.300000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.967969E-01 -1.846735E-01 +1.050675E+00 +2.274991E-01 0.000000E+00 0.000000E+00 -2.379073E+00 -1.190296E+00 -2.560000E+00 -1.318200E+00 +2.070821E+00 +8.886068E-01 +2.660000E+00 +1.422000E+00 0.000000E+00 0.000000E+00 -3.800000E+01 -2.893420E+02 +3.897000E+01 +3.042635E+02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.734177E-01 -3.189810E-02 +4.352932E-01 +4.705717E-02 0.000000E+00 0.000000E+00 -9.891140E-01 -2.024582E-01 +1.018668E+00 +2.090017E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.620000E+00 -4.269800E+00 +4.570000E+00 +4.182700E+00 0.000000E+00 0.000000E+00 -4.933000E+01 -4.873911E+02 -1.011778E-02 -1.023695E-04 +4.968000E+01 +4.940534E+02 +6.537406E-02 +1.230788E-03 0.000000E+00 0.000000E+00 -5.982886E-02 -1.821968E-03 +8.678070E-02 +2.482037E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -57,11 +57,11 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.450000E+00 -2.383100E+00 -1.413190E-01 -4.286264E-03 -7.900000E+00 -1.253260E+01 -2.891151E-01 -1.897512E-02 +3.290000E+00 +2.178900E+00 +1.610879E-01 +5.883677E-03 +6.530000E+00 +8.828900E+00 +3.151783E-01 +2.052521E-02 diff --git a/tests/test_filter_material/inputs_true.dat b/tests/test_filter_material/inputs_true.dat index 83b555b1d5..0610b45c44 100644 --- a/tests/test_filter_material/inputs_true.dat +++ b/tests/test_filter_material/inputs_true.dat @@ -1 +1 @@ -d9822da9c74042812df6046cc810a7b13b90c7f4e6487c8f904b8e6b6a3655938b7f5bec0866a51fc3bc8b9612368f6f79b4f34283abd73663c58172b25d073e \ No newline at end of file +91dd096441a7f01689ed605b7b3322c63a90c4802d73450acd825b715a8163fc892b4971e4b8b0d5a179eb51ad22bcc886f3935e7ab734d0fedebaf679415816 \ No newline at end of file diff --git a/tests/test_filter_material/results_true.dat b/tests/test_filter_material/results_true.dat index eb9d920358..d2b23e2901 100644 --- a/tests/test_filter_material/results_true.dat +++ b/tests/test_filter_material/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -2.840222E+01 -1.617027E+02 -6.793657E+00 -9.256930E+00 -7.648212E+01 -1.171747E+03 -2.158747E+01 -9.962972E+01 +2.868239E+01 +1.648549E+02 +6.779424E+00 +9.202676E+00 +6.446222E+01 +8.387204E+02 +3.367496E+01 +2.349072E+02 diff --git a/tests/test_filter_universe/inputs_true.dat b/tests/test_filter_universe/inputs_true.dat index e442de057e..cf1c7db55b 100644 --- a/tests/test_filter_universe/inputs_true.dat +++ b/tests/test_filter_universe/inputs_true.dat @@ -1 +1 @@ -a65cbed55e510edcb54362e9bd38a639b36d2bf4ff312f9355c5552e9407bab27730437f3298a90deb6abbdf36810e8e23c87d11d09a55ce5227fa2bfba1f4aa \ No newline at end of file +f3dc4c28827ca9035d2d1a39f4adef794f0e27b8c95776485e419b9610aefc6c268e6a1d5889d8170ec9400fc3a4a52bc69cd94e5056078aee7405e0bc62bad5 \ No newline at end of file diff --git a/tests/test_filter_universe/results_true.dat b/tests/test_filter_universe/results_true.dat index 22f863c913..f71c4d2c21 100644 --- a/tests/test_filter_universe/results_true.dat +++ b/tests/test_filter_universe/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -9.245752E+01 -1.713583E+03 -1.150558E+01 -2.689915E+01 -2.299276E+01 -1.068299E+02 -3.009831E+00 -1.837623E+00 +7.510505E+01 +1.143811E+03 +8.792943E+00 +1.575416E+01 +4.214462E+01 +3.642975E+02 +4.335157E+00 +3.864423E+00 diff --git a/tests/test_score_MT/inputs_true.dat b/tests/test_score_MT/inputs_true.dat index b78dd8061f..7b56862ea3 100644 --- a/tests/test_score_MT/inputs_true.dat +++ b/tests/test_score_MT/inputs_true.dat @@ -1 +1 @@ -5bf02c7821f3a428d780a95fcffc5873d3ff025f77e511a8bc4d35551bfa8ff1bf95b3d177971fe55f6b58133f303fe7003054125f396bd56c1924a852ff4681 \ No newline at end of file +6ba3ebe9d50584343b012b7a935a0f75b8366659600d4de050a8e4e48405f8da36682e8ab5f495f69b646fc72e176755c0a3540f235806c73d5ebc4fc67db107 \ No newline at end of file diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index dc3dce006a..44656963f0 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -1,5 +1,5 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -9,30 +9,30 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.549173E-03 -1.042847E-05 -4.549173E-03 -1.042847E-05 -5.349258E-01 -5.819756E-02 -1.771520E+00 -6.368768E-01 -2.840231E-04 -7.989175E-08 -2.840231E-04 -7.989175E-08 -4.456152E-02 -4.011605E-04 -3.237732E-02 -2.535641E-04 +1.538090E-03 +1.381456E-06 +1.538090E-03 +1.381456E-06 +3.974412E-01 +3.209809E-02 +1.373550E+00 +3.796357E-01 +5.252455E-06 +2.290531E-11 +5.252455E-06 +2.290531E-11 +3.359792E-02 +2.267331E-04 +2.459115E-02 +1.233078E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.260440E-05 -2.080213E-09 -9.514028E-02 -1.832676E-03 +7.004005E-05 +1.748739E-09 +8.104946E-02 +1.395618E-03 tally 2: 0.000000E+00 0.000000E+00 @@ -46,16 +46,16 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -5.700000E-01 -6.530000E-02 +2.000000E-01 +9.000000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -5.000000E-02 -1.100000E-03 +2.000000E-02 +2.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -75,27 +75,27 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -7.477762E-03 -3.606695E-05 -7.477762E-03 -3.606695E-05 -5.749995E-01 -6.679702E-02 -1.748150E+00 -6.191138E-01 +1.408027E-03 +1.849607E-06 +1.408027E-03 +1.849607E-06 +3.946436E-01 +3.166261E-02 +1.288136E+00 +3.382059E-01 +2.179241E-05 +4.749090E-10 +2.179241E-05 +4.749090E-10 +3.146594E-02 +2.159308E-04 +4.278352E-02 +4.094478E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.201948E-02 -3.812116E-04 -2.128743E-02 -1.104373E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.503792E-04 -7.112750E-09 -9.209675E-02 -1.724470E-03 +1.736514E-04 +1.245171E-08 +7.989710E-02 +1.377742E-03 diff --git a/tests/test_score_absorption/inputs_true.dat b/tests/test_score_absorption/inputs_true.dat index be73d98b6c..ad2d1f40ea 100644 --- a/tests/test_score_absorption/inputs_true.dat +++ b/tests/test_score_absorption/inputs_true.dat @@ -1 +1 @@ -55faff4d2b9eb95d51b31ec618a03a25b1bc82338fe5a043ffcf4ced388265c75cf7d97db94dc50622edc592f093f366de490c94c01ee20a1df1de635f659533 \ No newline at end of file +a2be808e033014c9d748a0ec503ab6ad498f6b70250c8136bfcb9dc8f5580e69fc0bc1c6acab428c139edf64f51237ba07495b0275a19f509bf3bd20fa298e4e \ No newline at end of file diff --git a/tests/test_score_absorption/results_true.dat b/tests/test_score_absorption/results_true.dat index 1984cc4e66..72661f77f4 100644 --- a/tests/test_score_absorption/results_true.dat +++ b/tests/test_score_absorption/results_true.dat @@ -1,29 +1,29 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -3.336094E+00 -2.246259E+00 -3.247758E-02 -2.553866E-04 -4.583764E-01 -4.253734E-02 +2.533174E+00 +1.298118E+00 +2.453769E-02 +1.227715E-04 +3.869051E-01 +3.180828E-02 tally 2: 0.000000E+00 0.000000E+00 -3.380000E+00 -2.293800E+00 -1.000000E-02 -1.000000E-04 -4.400000E-01 -4.360000E-02 +2.540000E+00 +1.293400E+00 +4.000000E-02 +6.000000E-04 +4.000000E-01 +3.600000E-02 tally 3: 0.000000E+00 0.000000E+00 -3.251414E+00 -2.129893E+00 -2.185530E-02 -1.156492E-04 -4.456283E-01 -4.031784E-02 +2.422314E+00 +1.193460E+00 +4.285618E-02 +4.109734E-04 +3.832282E-01 +3.169516E-02 diff --git a/tests/test_score_events/inputs_true.dat b/tests/test_score_events/inputs_true.dat index 7535b3f66f..1d2c8447cd 100644 --- a/tests/test_score_events/inputs_true.dat +++ b/tests/test_score_events/inputs_true.dat @@ -1 +1 @@ -6ad38e2ba1108cbc2a1cb6bfcb5131fd5f7d31c7699c7659daeb42733d75df6cb1ef058277e300d35374d54f0b85a210c0ab0a37dc80a1b234e455d4293af94f \ No newline at end of file +493830fe4598d5a2e31d4b79aceb79390bfa0bd7e08681ef36d5978a72de3cd7bcdbc06147061664614ed8e069be82d01e880e8e8cb629d3bd7aa1223850c8e6 \ No newline at end of file diff --git a/tests/test_score_events/results_true.dat b/tests/test_score_events/results_true.dat index e6547cc820..34b114fbcb 100644 --- a/tests/test_score_events/results_true.dat +++ b/tests/test_score_events/results_true.dat @@ -1,12 +1,12 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -8.539000E+01 -1.463307E+03 -2.312000E+01 -1.070560E+02 +6.520000E+01 +8.551888E+02 +4.035000E+01 +3.351119E+02 tally 2: -2.278000E+01 -1.042404E+02 -6.260000E+00 -7.850600E+00 +1.739000E+01 +6.083290E+01 +1.104000E+01 +2.498260E+01 diff --git a/tests/test_score_fission/inputs_true.dat b/tests/test_score_fission/inputs_true.dat index e4f120bc16..0abc63556a 100644 --- a/tests/test_score_fission/inputs_true.dat +++ b/tests/test_score_fission/inputs_true.dat @@ -1 +1 @@ -43d51743c601d4e347e7a1735398b76213fdf22488749d9496093bd8ccc2ead36c1fadfe7dc27b74d21832b270a0b88d03c6e0ce5fcae066f7a7a32789abb8fd \ No newline at end of file +e94e6338c6aadaebd6f3cdad768b53908e470dc6d650a170703b21bf0140313559ce2af78f6b8bd13498dc5019ce02603ec6ba7c68731dfa05ca4a540f159625 \ No newline at end of file diff --git a/tests/test_score_fission/results_true.dat b/tests/test_score_fission/results_true.dat index aecb466dda..2b28cc825c 100644 --- a/tests/test_score_fission/results_true.dat +++ b/tests/test_score_fission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.559747E+00 -4.911504E-01 +1.156315E+00 +2.733527E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.579938E-01 -2.731974E-02 +6.971594E-01 +1.004973E-01 tally 2: -1.526951E+00 -4.824326E-01 +1.225263E+00 +3.054971E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.966177E-01 -3.291468E-02 +6.475958E-01 +8.567154E-02 tally 3: -1.496616E+00 -4.530639E-01 +1.131528E+00 +2.612886E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.919885E-01 -3.104206E-02 +7.021712E-01 +1.008605E-01 diff --git a/tests/test_score_flux/inputs_true.dat b/tests/test_score_flux/inputs_true.dat index d56fdcb9a7..fe2b65dfe1 100644 --- a/tests/test_score_flux/inputs_true.dat +++ b/tests/test_score_flux/inputs_true.dat @@ -1 +1 @@ -6f1f560fb5830abea765a6ee6a2d5762f6107398e7ec6adf136d718846ca9b73b00f3e1b73a3433cf812532def4cd614e251d7c40b0d4e0e38f47c4a44d08b8b \ No newline at end of file +23454cbb568dd5f8569f228b3d0e6d180144279005521ad009d6a99384db79330b274edc431133f5e304a6750bef2b85bfc5af46258a75ce3f0673dd0ec0c54c \ No newline at end of file diff --git a/tests/test_score_flux/results_true.dat b/tests/test_score_flux/results_true.dat index 575b8ff178..5c366ea8c7 100644 --- a/tests/test_score_flux/results_true.dat +++ b/tests/test_score_flux/results_true.dat @@ -1,41 +1,41 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -5.010477E+01 -5.039958E+02 -1.732466E+01 -6.033456E+01 -8.428445E+01 -1.425022E+03 -1.357577E+01 -3.704803E+01 -4.758922E+00 -4.591527E+00 -2.297418E+01 -1.067445E+02 +3.890713E+01 +3.046363E+02 +1.366220E+01 +3.758161E+01 +6.561669E+01 +8.680729E+02 +2.382728E+01 +1.170590E+02 +8.047875E+00 +1.334796E+01 +4.056568E+01 +3.389623E+02 tally 2: -5.188799E+01 -5.402176E+02 -1.593914E+01 -5.169154E+01 -8.557014E+01 -1.465192E+03 -1.427596E+01 -4.078276E+01 -4.943558E+00 -5.054633E+00 -2.194332E+01 -9.737940E+01 +3.862543E+01 +2.993190E+02 +1.438678E+01 +4.193571E+01 +6.400634E+01 +8.298077E+02 +2.426423E+01 +1.215124E+02 +7.600812E+00 +1.199814E+01 +4.104875E+01 +3.455300E+02 tally 3: -5.188799E+01 -5.402176E+02 -1.593914E+01 -5.169154E+01 -8.557014E+01 -1.465192E+03 -1.427596E+01 -4.078276E+01 -4.943558E+00 -5.054633E+00 -2.194332E+01 -9.737940E+01 +3.862543E+01 +2.993190E+02 +1.438678E+01 +4.193571E+01 +6.400634E+01 +8.298077E+02 +2.426423E+01 +1.215124E+02 +7.600812E+00 +1.199814E+01 +4.104875E+01 +3.455300E+02 diff --git a/tests/test_score_flux_yn/inputs_true.dat b/tests/test_score_flux_yn/inputs_true.dat index b4d82f71eb..ebb757bbdd 100644 --- a/tests/test_score_flux_yn/inputs_true.dat +++ b/tests/test_score_flux_yn/inputs_true.dat @@ -1 +1 @@ -7436214ee6931cdc4e8cf00a35f67c60280187fd6989a2ba3e8d51215e585cfc5cae41d5bab63176e306bcaf16e425f0b36bb8241a063f35ef36df2410bdf86a \ No newline at end of file +56b5f317d465ab32d9bc2cf85f1a22b7df773edcc642981707febd2e988e4174a3f0234744f192182edb51af23b541325496c2ca4530303afc0d2baefc0ce60e \ No newline at end of file diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 78ee844771..c657cb7bba 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -1,1301 +1,1301 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -5.010477E+01 -5.039958E+02 -2.176053E-01 -4.865261E-01 --1.086984E+00 -1.047217E+00 --4.795412E-01 -1.558959E-01 --5.701504E-01 -1.292349E-01 --5.368919E-01 -9.576579E-02 --9.479107E-01 -2.504916E-01 -1.224897E-01 -4.670746E-01 -8.535124E-01 -5.228963E-01 --1.992643E-01 -7.139374E-02 --5.251275E-01 -1.407419E-01 -4.161764E-01 -8.583663E-02 -1.900003E-01 -6.274903E-02 -1.756301E-01 -6.672692E-02 -8.899097E-01 -2.932284E-01 -1.829964E-01 -1.780842E-01 -3.128622E-02 -1.040374E-01 --2.048946E-01 -7.820016E-02 --1.770632E-01 -4.339147E-02 -3.158973E-02 -1.032146E-01 --2.632637E-01 -1.069343E-01 -4.191749E-01 -7.076456E-02 --2.010288E-01 -3.814062E-02 -1.087619E-01 -2.328146E-02 --2.966642E-01 -7.687789E-02 -2.042266E-01 -3.305349E-02 --2.931179E-01 -6.178212E-02 --5.521659E-01 -1.525784E-01 --1.344386E-01 -1.983161E-01 --1.636737E-01 -1.164849E-01 -5.187003E-01 -1.397304E-01 -2.399050E-01 -2.860510E-01 -2.967924E-01 -1.035081E-01 --7.005240E-02 -2.007454E-02 -3.237492E-02 -2.506195E-02 --6.959898E-02 -7.999033E-02 -1.732466E+01 -6.033456E+01 -3.107535E-02 -4.649239E-02 --3.970747E-01 -9.427351E-02 --1.123739E-01 -1.390365E-02 --2.898450E-02 -3.902114E-03 --2.631777E-01 -1.693614E-02 --3.010145E-01 -2.549605E-02 -3.897172E-02 -3.337532E-02 -2.061855E-01 -5.566838E-02 --6.067592E-02 -1.537371E-02 --1.412859E-01 -1.026936E-02 -2.971338E-01 -2.017773E-02 -2.229947E-01 -2.097948E-02 --6.075875E-03 -1.442041E-02 -2.389356E-01 -2.418354E-02 -4.914702E-02 -1.401262E-02 --8.942816E-02 -1.285068E-02 --1.041318E-01 -8.815681E-03 --8.589408E-02 -4.120018E-03 --7.343529E-02 -1.344074E-02 -4.450570E-02 -9.667309E-03 -1.602555E-01 -1.139203E-02 -1.567487E-02 -6.127441E-03 -5.173147E-02 -7.550481E-03 --1.719948E-01 -7.484666E-03 -7.675999E-02 -5.875577E-03 --5.024191E-02 -1.070000E-02 --1.702066E-01 -1.443420E-02 --3.419759E-02 -2.637248E-02 -4.600843E-02 -1.078680E-02 -2.458398E-01 -2.682601E-02 --3.085412E-02 -2.243953E-02 -1.178334E-01 -8.380493E-03 --8.449310E-02 -2.905176E-03 --1.512034E-02 -3.692235E-03 -7.089635E-03 -4.536425E-03 -8.428445E+01 -1.425022E+03 --1.362036E-01 -4.955117E-01 --2.368550E+00 -1.691161E+00 --7.107734E-01 -8.353526E-01 --6.040498E-01 -1.849927E-01 --7.580790E-01 -2.328322E-01 --2.827702E-01 -4.902552E-01 -2.263047E-01 -4.920612E-01 -1.086735E+00 -1.264217E+00 --2.674729E-01 -1.812824E-01 --9.480041E-01 -3.494658E-01 -1.131279E+00 -4.394262E-01 -6.028149E-01 -7.611055E-01 --4.226627E-01 -9.934511E-02 -4.674984E-01 -4.988034E-01 -4.404050E-01 -2.451286E-01 -9.924713E-02 -2.916276E-01 --5.691463E-01 -1.499514E-01 -3.042408E-02 -1.223962E-01 -9.963351E-03 -1.056905E-01 -7.166813E-01 -1.498011E-01 -3.740392E-01 -2.456929E-01 --9.657707E-02 -1.698541E-01 -2.079664E-01 -1.965244E-01 --1.119856E+00 -3.770763E-01 -2.039849E-01 -8.304410E-02 --4.199012E-01 -2.410734E-01 --6.791470E-01 -2.497291E-01 -2.416848E-01 -5.299837E-01 -8.546582E-02 -4.898367E-02 -4.674386E-01 -2.280610E-01 -3.594172E-01 -5.739204E-01 -4.972395E-01 -2.816960E-01 --4.736196E-01 -7.973237E-02 --1.484500E-01 -8.763644E-02 -1.318617E-02 -1.581561E-01 -1.357577E+01 -3.704803E+01 -3.384888E-03 -1.080209E-01 -2.872142E-01 -1.224352E-01 -2.863822E-01 -1.491797E-01 --1.972755E-01 -3.885966E-02 -2.015479E-02 -3.471051E-02 -2.173233E-01 -6.336006E-02 --2.432345E-01 -9.646809E-02 -3.387966E-02 -3.753576E-02 -1.185678E-01 -1.112748E-02 --7.895500E-02 -3.265370E-02 --2.546256E-01 -5.142289E-02 --4.647286E-02 -1.740042E-02 --2.660905E-01 -4.717290E-02 --1.510244E-01 -2.742362E-02 -1.058091E-01 -2.185823E-02 -2.153774E-01 -1.729585E-02 --4.988894E-02 -2.207988E-02 --4.352527E-02 -1.760359E-02 -1.436143E-02 -2.593599E-02 --2.352747E-01 -1.960774E-02 --2.822795E-01 -3.249990E-02 --7.774355E-02 -9.008554E-03 -1.239406E-01 -2.331185E-02 --2.880954E-01 -4.411740E-02 --2.049660E-02 -2.503723E-02 -3.213790E-02 -3.867984E-02 -1.371693E-01 -4.194468E-02 -2.551557E-02 -4.767256E-02 --1.191569E-01 -3.416422E-02 --3.330294E-01 -3.474803E-02 --1.842925E-01 -4.126454E-02 --1.224990E-02 -1.230302E-02 -1.544261E-01 -8.671624E-03 --2.122959E-01 -6.350218E-02 --2.914181E-01 -3.809905E-02 -4.758922E+00 -4.591527E+00 --6.067377E-02 -6.804346E-03 -1.316435E-01 -1.476493E-02 -1.867152E-01 -1.538802E-02 --7.179389E-02 -3.473818E-03 -4.986417E-02 -4.841351E-03 -6.776718E-02 -8.811355E-03 --4.792045E-02 -9.184441E-03 --8.434738E-03 -3.853397E-03 -2.548586E-02 -7.203200E-04 -7.527437E-03 -2.037011E-03 --2.163081E-02 -4.158974E-03 --8.760026E-02 -5.772134E-03 --7.520795E-02 -4.970576E-03 --3.964671E-02 -1.497841E-03 -7.221753E-02 -5.863209E-03 -4.932819E-02 -2.532767E-03 --9.734545E-03 -1.795577E-03 --7.011235E-02 -2.210883E-03 -2.399198E-02 -4.136626E-03 --3.191172E-04 -1.877929E-03 --9.710977E-02 -5.285483E-03 --4.824457E-02 -3.483504E-03 -7.075225E-02 -3.161643E-03 --8.040602E-02 -5.499063E-03 --1.607824E-02 -4.903695E-03 -3.492398E-02 -5.092265E-03 --1.006502E-02 -3.910353E-03 -1.573863E-02 -6.305496E-03 --3.123873E-02 -3.823757E-03 --7.909433E-02 -1.715877E-03 --7.160670E-02 -1.015353E-02 --4.496969E-02 -1.852488E-03 -6.430477E-02 -1.306442E-03 --3.397473E-02 -9.427230E-03 --1.245838E-01 -4.976908E-03 -2.297418E+01 -1.067445E+02 -3.798346E-02 -3.290807E-01 -4.774316E-01 -1.652719E-01 -4.484246E-01 -1.838690E-01 --2.684741E-01 -1.314460E-01 -1.697264E-01 -1.010791E-01 -5.566969E-01 -1.619332E-01 --1.922269E-01 -1.622489E-01 --2.094814E-01 -6.127647E-02 -3.104826E-02 -6.793969E-02 -4.360087E-02 -4.949024E-02 --2.391312E-01 -9.061066E-02 --2.985719E-01 -5.766047E-02 --4.703235E-01 -1.110755E-01 --2.651010E-01 -7.292117E-02 -1.640899E-01 -7.843023E-02 -4.369130E-01 -7.815370E-02 -2.842619E-02 -3.428084E-02 --2.196648E-01 -4.603142E-02 --1.710839E-01 -1.096328E-01 --1.574989E-02 -2.927805E-02 --1.811474E-01 -8.048153E-02 --2.781610E-01 -1.252087E-01 -5.703734E-02 -4.910322E-02 --3.299004E-01 -1.018308E-01 --1.639460E-01 -1.231675E-01 -1.411391E-01 -8.293452E-02 -2.675276E-02 -7.910978E-02 --4.464321E-02 -1.158543E-01 --1.929947E-01 -9.887250E-02 --5.501938E-01 -9.398742E-02 --4.386734E-01 -1.054327E-01 --1.583625E-01 -9.952385E-03 -1.449942E-01 -7.975730E-03 --1.797342E-01 -1.517262E-01 --5.629679E-01 -8.574197E-02 +3.890713E+01 +3.046363E+02 +1.623579E-01 +4.602199E-02 +4.860074E-01 +5.999399E-01 +7.895692E-01 +2.803790E-01 +2.525526E-01 +8.261176E-02 +-9.103525E-02 +2.246700E-01 +4.583205E-01 +8.444556E-02 +1.246553E-01 +2.351010E-01 +-3.534581E-01 +1.247916E-01 +3.700473E-01 +5.215562E-02 +-1.831625E-01 +1.927381E-01 +1.540114E-01 +1.918221E-02 +-1.266458E-01 +1.455875E-01 +6.796869E-01 +3.911926E-01 +1.987931E-02 +4.966442E-02 +-4.443797E-01 +8.842717E-02 +-1.073855E-01 +4.912428E-02 +3.999416E-02 +4.440138E-02 +2.857919E-01 +6.935717E-02 +-4.174851E-01 +5.485570E-02 +-2.178958E-01 +8.052149E-02 +1.179644E-02 +6.709330E-02 +8.843286E-01 +2.749681E-01 +-2.935079E-01 +3.032897E-02 +-1.809434E-01 +1.902413E-01 +2.091991E-01 +1.061912E-01 +-7.137275E-02 +4.397656E-02 +-2.311558E-01 +4.680679E-02 +9.927573E-02 +1.844111E-01 +2.821437E-02 +7.293762E-02 +6.224251E-01 +1.028351E-01 +-4.136440E-01 +5.198207E-02 +-7.833133E-02 +1.192960E-02 +-1.041586E-01 +1.587417E-01 +-3.595677E-01 +3.086335E-01 +2.096284E-01 +7.881012E-02 +1.366220E+01 +3.758161E+01 +-1.461402E-02 +3.260482E-03 +8.325893E-02 +6.248769E-02 +2.785736E-01 +3.698417E-02 +1.932396E-03 +1.561742E-02 +-8.063397E-02 +3.598680E-02 +8.565555E-02 +5.344369E-03 +3.899905E-02 +2.422867E-02 +-1.215439E-01 +9.193858E-03 +1.982614E-01 +1.045860E-02 +-7.712629E-02 +2.199979E-02 +-3.626484E-02 +9.872078E-04 +-6.305159E-02 +1.645879E-02 +3.052155E-01 +5.620564E-02 +3.507115E-02 +1.056383E-02 +-1.297490E-02 +5.889958E-03 +-1.208752E-02 +7.323602E-03 +3.441007E-03 +1.841496E-02 +5.543442E-02 +1.186636E-02 +-8.000436E-02 +3.703835E-03 +-3.636792E-02 +1.490603E-02 +-8.753196E-02 +7.958027E-03 +2.066727E-01 +1.414130E-02 +-3.652482E-02 +8.380395E-04 +-1.652432E-01 +1.878732E-02 +1.375567E-01 +1.302400E-02 +3.692057E-03 +6.312506E-03 +-9.016211E-02 +6.699735E-03 +-5.875401E-02 +1.731945E-02 +3.960008E-02 +3.595906E-03 +1.653510E-01 +9.277293E-03 +-4.064973E-02 +2.794606E-03 +-1.729061E-02 +3.219772E-03 +-5.764808E-02 +1.861051E-02 +-5.970583E-02 +2.070164E-02 +6.739411E-02 +1.063341E-02 +6.561669E+01 +8.680729E+02 +7.938430E-01 +2.994198E-01 +9.278084E-01 +1.861899E+00 +1.432236E+00 +7.429647E-01 +7.460836E-02 +5.946808E-01 +-6.140731E-02 +3.175177E-01 +1.212677E+00 +5.125288E-01 +-1.952865E-02 +5.468421E-01 +-2.965796E-01 +1.123288E-01 +5.334195E-01 +1.589612E-01 +-6.340814E-01 +4.874650E-01 +4.264003E-02 +9.109571E-03 +-4.323424E-01 +3.370329E-01 +1.186876E+00 +9.854644E-01 +-2.420825E-01 +1.699455E-01 +-2.920627E-02 +6.816643E-02 +-2.684345E-01 +9.799236E-02 +-1.281596E-01 +3.092987E-01 +3.746150E-01 +1.242044E-01 +-1.035056E+00 +2.589772E-01 +2.005450E-01 +2.074622E-01 +-5.412719E-01 +3.193584E-01 +1.070173E+00 +3.266747E-01 +-2.657850E-01 +1.599950E-01 +-4.694853E-01 +2.738937E-01 +7.761977E-01 +2.561652E-01 +3.673179E-02 +9.486916E-02 +-3.309909E-01 +1.095243E-01 +1.623761E-01 +2.874582E-01 +-2.846296E-01 +2.430397E-01 +7.384842E-01 +2.556480E-01 +-3.577508E-01 +1.763210E-01 +-2.917525E-01 +1.875646E-01 +-1.634324E-01 +2.952144E-01 +-4.329582E-01 +3.418652E-01 +2.719362E-01 +2.278925E-01 +2.382728E+01 +1.170590E+02 +4.718326E-01 +1.961501E-01 +1.612551E-02 +2.815245E-02 +6.390587E-01 +1.902968E-01 +2.290989E-01 +3.758858E-02 +1.568179E-01 +1.509162E-01 +-2.363058E-01 +6.671396E-02 +-4.350800E-02 +1.031680E-01 +-2.956828E-01 +2.515141E-02 +-4.835878E-01 +8.614200E-02 +-5.365970E-02 +8.404087E-02 +-6.079969E-02 +3.684343E-02 +-1.313088E-02 +1.488843E-02 +2.603258E-02 +2.900625E-02 +1.249213E-01 +2.737277E-02 +4.491422E-01 +9.482600E-02 +-1.095589E-01 +3.711500E-02 +-2.248159E-01 +2.815827E-02 +-5.976009E-02 +5.887828E-03 +-6.097208E-02 +5.393315E-02 +3.449714E-02 +4.332442E-02 +-1.030757E-01 +2.839453E-02 +-4.399117E-01 +8.887569E-02 +4.564910E-01 +1.172398E-01 +-2.528382E-01 +1.217655E-01 +3.443316E-01 +4.275616E-02 +5.437008E-02 +2.355567E-02 +-5.505588E-02 +5.479129E-02 +-8.326640E-02 +3.095858E-02 +-1.888781E-01 +2.884542E-02 +1.981251E-01 +1.520694E-02 +-5.279866E-02 +1.020641E-01 +-1.465368E-01 +3.070686E-02 +-2.356940E-01 +7.899657E-02 +4.109278E-01 +5.291082E-02 +2.572510E-01 +3.420895E-02 +8.047875E+00 +1.334796E+01 +1.707535E-01 +3.290927E-02 +1.024687E-01 +1.308811E-02 +1.805451E-01 +1.696222E-02 +3.519587E-02 +7.546726E-03 +1.034933E-01 +2.224207E-02 +-1.580512E-01 +2.369625E-02 +4.302961E-02 +1.635623E-02 +-2.992903E-02 +5.190220E-03 +-2.130862E-01 +1.186351E-02 +-3.321696E-02 +7.972404E-03 +-4.992040E-02 +5.667098E-03 +1.261320E-02 +2.436872E-03 +-8.314024E-04 +5.360616E-03 +-6.318247E-02 +1.644558E-03 +1.373600E-01 +1.030707E-02 +1.511677E-03 +3.467685E-03 +-1.923485E-02 +8.106508E-04 +-1.180094E-01 +4.381376E-03 +2.798056E-02 +4.871288E-03 +-7.689499E-02 +7.079493E-03 +5.842586E-02 +1.380713E-03 +-9.946341E-02 +7.085062E-03 +8.061825E-02 +8.679468E-03 +-9.229524E-03 +9.187483E-03 +1.048310E-01 +3.506026E-03 +3.666209E-02 +3.259203E-03 +-1.190727E-01 +4.935341E-03 +-7.391655E-02 +2.805554E-03 +-2.029126E-02 +2.497736E-03 +2.787185E-02 +5.677987E-04 +-6.873108E-02 +1.287727E-02 +-5.262840E-02 +3.190440E-03 +-3.910911E-02 +8.661121E-03 +1.076197E-01 +5.456176E-03 +7.476066E-02 +2.693605E-03 +4.056568E+01 +3.389623E+02 +6.428633E-01 +6.128893E-01 +4.878518E-01 +2.130257E-01 +9.548044E-01 +4.556949E-01 +2.234940E-01 +1.006817E-01 +-1.080276E-01 +5.980158E-01 +-3.639229E-01 +3.120105E-01 +-3.237506E-01 +3.451548E-01 +1.143081E-01 +7.924550E-02 +-6.456733E-01 +2.424413E-01 +1.478136E-01 +1.458665E-01 +-2.134798E-02 +9.102875E-02 +3.633264E-01 +7.386463E-02 +2.213946E-01 +1.253249E-01 +-3.153847E-01 +1.094273E-01 +7.161113E-01 +2.275500E-01 +-2.461979E-01 +1.484452E-01 +-2.332886E-01 +9.715521E-02 +-7.029988E-02 +1.835254E-02 +1.982842E-01 +9.722998E-02 +-2.089693E-01 +2.271404E-01 +-7.316104E-02 +3.974665E-02 +-3.266640E-01 +8.054809E-02 +5.126088E-01 +3.234942E-01 +-3.048753E-01 +3.439501E-01 +4.872647E-01 +9.473730E-02 +1.590200E-01 +3.613462E-02 +-4.641787E-01 +1.671339E-01 +-1.391114E-01 +3.581561E-02 +-2.209343E-01 +1.489367E-02 +3.015665E-01 +4.265694E-02 +-1.334716E-01 +2.321929E-01 +-3.702914E-01 +1.699549E-01 +-8.891532E-02 +1.708595E-01 +6.123686E-01 +1.429184E-01 +5.891300E-01 +1.085467E-01 tally 2: -5.188799E+01 -5.402176E+02 --5.713505E-01 -4.615729E-01 --3.761827E-01 -5.750500E-01 -8.374325E-01 -1.862938E-01 --3.954940E-01 -2.347775E-01 --6.290233E-01 -1.864254E-01 --6.656201E-01 -2.124518E-01 -4.729571E-01 -6.739065E-01 -4.921338E-01 -1.907183E-01 --3.988992E-01 -3.761412E-01 --1.125861E-01 -3.659299E-01 --1.283461E-01 -5.045920E-02 -1.101261E-02 -1.391469E-01 -4.286921E-01 -2.097120E-01 -5.360702E-01 -1.809190E-01 -8.470757E-01 -2.461922E-01 --4.140592E-01 -2.702824E-01 --2.269391E-02 -5.000308E-03 --1.585595E-01 -3.527370E-02 --9.890128E-02 -1.067921E-01 -3.153468E-02 -1.483763E-01 -6.967922E-02 -7.789031E-02 -2.040956E-01 -4.637270E-02 --2.345641E-01 -3.574654E-01 --1.500187E-01 -1.514334E-01 --3.019192E-01 -1.334819E-01 -1.796739E-01 -7.106788E-02 --2.120506E-01 -1.144496E-01 --6.891611E-02 -7.257229E-02 --2.306514E-01 -7.048631E-02 -7.800814E-01 -2.467831E-01 -2.790547E-02 -5.494857E-02 --1.896182E-01 -5.971620E-02 -1.644354E-02 -1.059859E-01 --7.792754E-02 -2.085845E-02 --1.114682E-01 -1.227128E-01 -1.593914E+01 -5.169154E+01 -1.039804E+00 -5.028617E-01 --7.912437E-01 -5.548318E-01 -2.575930E-01 -1.148260E-01 --6.331302E-01 -2.556615E-01 --1.712129E-01 -7.877790E-02 --5.816921E-01 -1.456126E-01 -2.272958E-01 -8.788738E-02 -3.822477E-01 -6.244032E-02 --2.999416E-01 -8.461810E-02 --2.623060E-02 -1.458472E-02 -1.300437E-01 -4.478019E-02 --4.767351E-02 -7.362462E-02 -7.928962E-02 -4.510319E-02 -3.500548E-03 -4.881244E-02 --2.067837E-01 -8.186594E-02 --3.825304E-01 -1.082951E-01 --3.558676E-01 -5.708469E-02 -4.048126E-01 -9.076309E-02 -4.553585E-02 -2.926622E-02 --1.294373E-01 -1.870238E-02 --3.195745E-01 -5.918983E-02 --5.541420E-02 -6.185102E-02 -2.517910E-01 -1.252247E-01 --6.864842E-02 -8.483359E-02 --3.087092E-02 -1.682640E-02 --6.457777E-02 -2.980731E-02 --3.360246E-01 -3.729711E-02 --2.091466E-01 -1.119332E-01 --4.226988E-01 -5.973848E-02 --5.390062E-02 -1.424816E-01 --2.955041E-02 -7.118983E-03 -3.100944E-01 -5.584902E-02 --4.266659E-01 -4.397359E-02 --3.155083E-01 -7.428242E-02 -5.282933E-02 -2.010740E-02 -8.557014E+01 -1.465192E+03 --3.913589E-01 -5.368834E-01 --2.113693E+00 -2.169443E+00 -2.298156E-01 -6.330809E-01 -1.449786E-01 -2.666314E-01 --2.958820E-01 -2.750937E-01 -1.054389E+00 -5.351584E-01 -4.775640E-02 -2.044779E-01 -4.186858E-01 -8.940845E-01 --6.035852E-02 -3.754000E-01 --1.597608E+00 -5.815293E-01 -5.200807E-01 -3.829815E-01 -9.437855E-01 -7.241779E-01 --5.232235E-01 -1.966074E-01 -2.872008E-01 -1.241395E+00 --1.039246E+00 -6.158088E-01 -3.058638E-01 -1.593114E-01 --5.132144E-01 -4.577375E-01 -6.727602E-01 -4.119990E-01 -3.280880E-01 -4.971028E-01 -7.837744E-01 -2.444483E-01 -7.686392E-01 -3.456688E-01 --5.035943E-01 -1.631734E-01 -4.145045E-01 -3.177084E-01 --1.924638E-01 -3.336696E-01 --1.484767E-01 -9.030824E-02 --2.393846E-01 -6.598721E-02 --5.318081E-01 -2.895430E-01 -1.518564E-01 -3.818155E-01 -5.795851E-01 -9.003270E-02 -3.580512E-01 -8.821756E-02 -5.366649E-01 -2.497151E-01 --3.347132E-01 -1.352062E-01 -4.567995E-01 -1.561741E-01 --2.279100E-01 -2.122433E-01 -4.461881E-01 -2.325205E-01 -1.427596E+01 -4.078276E+01 -5.217165E-02 -2.453888E-02 -1.584690E-01 -3.106540E-01 -4.560315E-01 -4.277362E-01 --1.990373E-02 -5.277850E-02 -1.125203E-02 -6.443927E-02 -3.308696E-01 -1.037411E-01 --2.750414E-01 -3.814328E-02 --2.758789E-01 -1.449907E-01 --3.474494E-02 -1.886069E-02 --3.638818E-03 -1.651468E-01 --2.060159E-02 -3.031181E-02 -3.225892E-01 -7.944048E-02 --3.922626E-01 -5.950804E-02 --7.374795E-01 -1.624566E-01 --1.467806E-02 -1.234636E-01 -8.061252E-02 -4.356030E-02 --1.065107E-01 -1.431995E-02 --2.455689E-01 -4.182386E-02 --3.425697E-01 -1.088413E-01 --9.867791E-03 -4.864904E-02 --2.403769E-01 -2.231699E-02 -1.795461E-01 -2.969251E-02 --1.516375E-01 -2.951230E-02 --3.101470E-01 -7.377660E-02 -1.996325E-01 -1.846547E-02 -9.153483E-02 -2.867924E-02 -2.545349E-01 -4.621843E-02 -1.776575E-01 -1.075483E-01 --2.561501E-01 -4.947817E-02 --1.558585E-01 -1.467725E-02 --1.530184E-01 -5.532615E-02 --1.802320E-01 -1.603564E-02 -3.331892E-01 -3.315195E-02 --1.878592E-01 -3.588542E-02 --3.843863E-01 -1.011661E-01 -4.943558E+00 -5.054633E+00 -3.508923E-01 -5.360844E-02 -2.595623E-01 -3.819756E-02 --2.524359E-01 -4.825078E-02 --3.376117E-01 -4.115606E-02 -8.885054E-02 -3.685958E-02 -1.168333E-01 -5.916818E-02 --1.993698E-01 -5.632369E-02 -3.988948E-01 -4.366034E-02 -1.021403E-01 -4.690526E-03 --1.508432E-01 -2.173064E-02 --2.407920E-01 -2.510560E-02 --1.703993E-01 -2.599072E-02 -8.752998E-02 -3.657089E-02 --1.269869E-02 -2.565400E-02 -2.026727E-01 -1.804748E-02 --4.913307E-03 -4.059747E-02 --2.554771E-02 -7.959679E-03 --1.549008E-02 -3.658041E-02 --9.294647E-02 -2.754890E-03 -2.566876E-02 -4.951779E-03 --1.016212E-02 -2.777381E-02 -3.601396E-01 -3.828736E-02 --8.923373E-03 -3.126410E-03 -8.722969E-02 -1.182345E-02 --2.332024E-02 -5.685275E-03 -2.101415E-01 -1.224880E-02 --9.619916E-03 -9.042453E-03 --2.480871E-01 -2.222042E-02 -9.764734E-02 -4.847970E-03 --1.623487E-01 -1.814336E-02 -5.091875E-02 -1.290604E-02 -7.192058E-02 -1.343350E-02 --1.316640E-01 -3.514269E-02 --9.198972E-02 -1.244138E-02 --1.225056E-01 -3.035718E-02 -2.194332E+01 -9.737940E+01 --3.052407E-01 -4.072957E-01 -3.531168E-02 -2.019382E-01 -8.793928E-01 -4.041664E-01 --4.072462E-01 -6.027190E-02 --8.907772E-02 -1.952922E-01 -9.519375E-02 -9.821752E-02 -3.205302E-01 -2.075134E-01 -1.124955E-01 -6.446089E-02 --3.366117E-01 -8.184450E-02 --3.676127E-02 -3.861064E-02 -2.001007E-01 -6.507942E-02 --1.155787E-01 -4.761238E-02 --2.779628E-01 -3.425225E-02 -1.099627E-01 -5.462866E-02 --2.654341E-01 -1.868127E-02 -2.246854E-01 -3.157231E-02 --1.422513E-01 -5.939434E-02 --8.583155E-02 -5.668810E-02 -6.967936E-02 -1.924265E-02 --2.246405E-03 -1.576409E-02 -7.321307E-02 -2.061990E-02 --4.949248E-01 -1.278374E-01 -4.468760E-02 -3.814622E-02 --9.398135E-02 -1.772831E-02 --2.757022E-01 -1.349555E-01 -1.715161E-02 -5.040025E-02 --1.682974E-01 -7.558363E-02 --4.700401E-02 -2.700354E-02 -1.109855E-01 -2.666559E-02 -2.136115E-01 -7.786593E-02 --2.089667E-01 -1.489893E-02 --6.959959E-02 -7.545487E-02 --3.296680E-02 -1.604995E-02 --1.587440E-01 -5.482886E-02 --3.203027E-01 -3.421361E-02 +3.862543E+01 +2.993190E+02 +5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +-5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +-4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +-2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +-3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +-2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +-2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +-6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +-7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +-1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +-3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +-5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +-4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +-6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +-1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +-6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +-1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +-8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +-2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +-3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +-1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +-4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +-1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +-5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +-6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +-4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +-3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +-2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +-2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +-3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +-4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +-4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +-6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +-3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +-2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +-7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +-2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +-8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +-8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +-1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +-2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +-6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +-9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +-8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +-8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +-7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +-4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +-4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +-7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +-5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +-3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +-2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +-8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +1.062149E-01 +5.400365E-02 tally 3: -5.188799E+01 -5.402176E+02 --5.713505E-01 -4.615729E-01 --3.761827E-01 -5.750500E-01 -8.374325E-01 -1.862938E-01 --3.954940E-01 -2.347775E-01 --6.290233E-01 -1.864254E-01 --6.656201E-01 -2.124518E-01 -4.729571E-01 -6.739065E-01 -4.921338E-01 -1.907183E-01 --3.988992E-01 -3.761412E-01 --1.125861E-01 -3.659299E-01 --1.283461E-01 -5.045920E-02 -1.101261E-02 -1.391469E-01 -4.286921E-01 -2.097120E-01 -5.360702E-01 -1.809190E-01 -8.470757E-01 -2.461922E-01 --4.140592E-01 -2.702824E-01 --2.269391E-02 -5.000308E-03 --1.585595E-01 -3.527370E-02 --9.890128E-02 -1.067921E-01 -3.153468E-02 -1.483763E-01 -6.967922E-02 -7.789031E-02 -2.040956E-01 -4.637270E-02 --2.345641E-01 -3.574654E-01 --1.500187E-01 -1.514334E-01 --3.019192E-01 -1.334819E-01 -1.796739E-01 -7.106788E-02 --2.120506E-01 -1.144496E-01 --6.891611E-02 -7.257229E-02 --2.306514E-01 -7.048631E-02 -7.800814E-01 -2.467831E-01 -2.790547E-02 -5.494857E-02 --1.896182E-01 -5.971620E-02 -1.644354E-02 -1.059859E-01 --7.792754E-02 -2.085845E-02 --1.114682E-01 -1.227128E-01 -1.593914E+01 -5.169154E+01 -1.039804E+00 -5.028617E-01 --7.912437E-01 -5.548318E-01 -2.575930E-01 -1.148260E-01 --6.331302E-01 -2.556615E-01 --1.712129E-01 -7.877790E-02 --5.816921E-01 -1.456126E-01 -2.272958E-01 -8.788738E-02 -3.822477E-01 -6.244032E-02 --2.999416E-01 -8.461810E-02 --2.623060E-02 -1.458472E-02 -1.300437E-01 -4.478019E-02 --4.767351E-02 -7.362462E-02 -7.928962E-02 -4.510319E-02 -3.500548E-03 -4.881244E-02 --2.067837E-01 -8.186594E-02 --3.825304E-01 -1.082951E-01 --3.558676E-01 -5.708469E-02 -4.048126E-01 -9.076309E-02 -4.553585E-02 -2.926622E-02 --1.294373E-01 -1.870238E-02 --3.195745E-01 -5.918983E-02 --5.541420E-02 -6.185102E-02 -2.517910E-01 -1.252247E-01 --6.864842E-02 -8.483359E-02 --3.087092E-02 -1.682640E-02 --6.457777E-02 -2.980731E-02 --3.360246E-01 -3.729711E-02 --2.091466E-01 -1.119332E-01 --4.226988E-01 -5.973848E-02 --5.390062E-02 -1.424816E-01 --2.955041E-02 -7.118983E-03 -3.100944E-01 -5.584902E-02 --4.266659E-01 -4.397359E-02 --3.155083E-01 -7.428242E-02 -5.282933E-02 -2.010740E-02 -8.557014E+01 -1.465192E+03 --3.913589E-01 -5.368834E-01 --2.113693E+00 -2.169443E+00 -2.298156E-01 -6.330809E-01 -1.449786E-01 -2.666314E-01 --2.958820E-01 -2.750937E-01 -1.054389E+00 -5.351584E-01 -4.775640E-02 -2.044779E-01 -4.186858E-01 -8.940845E-01 --6.035852E-02 -3.754000E-01 --1.597608E+00 -5.815293E-01 -5.200807E-01 -3.829815E-01 -9.437855E-01 -7.241779E-01 --5.232235E-01 -1.966074E-01 -2.872008E-01 -1.241395E+00 --1.039246E+00 -6.158088E-01 -3.058638E-01 -1.593114E-01 --5.132144E-01 -4.577375E-01 -6.727602E-01 -4.119990E-01 -3.280880E-01 -4.971028E-01 -7.837744E-01 -2.444483E-01 -7.686392E-01 -3.456688E-01 --5.035943E-01 -1.631734E-01 -4.145045E-01 -3.177084E-01 --1.924638E-01 -3.336696E-01 --1.484767E-01 -9.030824E-02 --2.393846E-01 -6.598721E-02 --5.318081E-01 -2.895430E-01 -1.518564E-01 -3.818155E-01 -5.795851E-01 -9.003270E-02 -3.580512E-01 -8.821756E-02 -5.366649E-01 -2.497151E-01 --3.347132E-01 -1.352062E-01 -4.567995E-01 -1.561741E-01 --2.279100E-01 -2.122433E-01 -4.461881E-01 -2.325205E-01 -1.427596E+01 -4.078276E+01 -5.217165E-02 -2.453888E-02 -1.584690E-01 -3.106540E-01 -4.560315E-01 -4.277362E-01 --1.990373E-02 -5.277850E-02 -1.125203E-02 -6.443927E-02 -3.308696E-01 -1.037411E-01 --2.750414E-01 -3.814328E-02 --2.758789E-01 -1.449907E-01 --3.474494E-02 -1.886069E-02 --3.638818E-03 -1.651468E-01 --2.060159E-02 -3.031181E-02 -3.225892E-01 -7.944048E-02 --3.922626E-01 -5.950804E-02 --7.374795E-01 -1.624566E-01 --1.467806E-02 -1.234636E-01 -8.061252E-02 -4.356030E-02 --1.065107E-01 -1.431995E-02 --2.455689E-01 -4.182386E-02 --3.425697E-01 -1.088413E-01 --9.867791E-03 -4.864904E-02 --2.403769E-01 -2.231699E-02 -1.795461E-01 -2.969251E-02 --1.516375E-01 -2.951230E-02 --3.101470E-01 -7.377660E-02 -1.996325E-01 -1.846547E-02 -9.153483E-02 -2.867924E-02 -2.545349E-01 -4.621843E-02 -1.776575E-01 -1.075483E-01 --2.561501E-01 -4.947817E-02 --1.558585E-01 -1.467725E-02 --1.530184E-01 -5.532615E-02 --1.802320E-01 -1.603564E-02 -3.331892E-01 -3.315195E-02 --1.878592E-01 -3.588542E-02 --3.843863E-01 -1.011661E-01 -4.943558E+00 -5.054633E+00 -3.508923E-01 -5.360844E-02 -2.595623E-01 -3.819756E-02 --2.524359E-01 -4.825078E-02 --3.376117E-01 -4.115606E-02 -8.885054E-02 -3.685958E-02 -1.168333E-01 -5.916818E-02 --1.993698E-01 -5.632369E-02 -3.988948E-01 -4.366034E-02 -1.021403E-01 -4.690526E-03 --1.508432E-01 -2.173064E-02 --2.407920E-01 -2.510560E-02 --1.703993E-01 -2.599072E-02 -8.752998E-02 -3.657089E-02 --1.269869E-02 -2.565400E-02 -2.026727E-01 -1.804748E-02 --4.913307E-03 -4.059747E-02 --2.554771E-02 -7.959679E-03 --1.549008E-02 -3.658041E-02 --9.294647E-02 -2.754890E-03 -2.566876E-02 -4.951779E-03 --1.016212E-02 -2.777381E-02 -3.601396E-01 -3.828736E-02 --8.923373E-03 -3.126410E-03 -8.722969E-02 -1.182345E-02 --2.332024E-02 -5.685275E-03 -2.101415E-01 -1.224880E-02 --9.619916E-03 -9.042453E-03 --2.480871E-01 -2.222042E-02 -9.764734E-02 -4.847970E-03 --1.623487E-01 -1.814336E-02 -5.091875E-02 -1.290604E-02 -7.192058E-02 -1.343350E-02 --1.316640E-01 -3.514269E-02 --9.198972E-02 -1.244138E-02 --1.225056E-01 -3.035718E-02 -2.194332E+01 -9.737940E+01 --3.052407E-01 -4.072957E-01 -3.531168E-02 -2.019382E-01 -8.793928E-01 -4.041664E-01 --4.072462E-01 -6.027190E-02 --8.907772E-02 -1.952922E-01 -9.519375E-02 -9.821752E-02 -3.205302E-01 -2.075134E-01 -1.124955E-01 -6.446089E-02 --3.366117E-01 -8.184450E-02 --3.676127E-02 -3.861064E-02 -2.001007E-01 -6.507942E-02 --1.155787E-01 -4.761238E-02 --2.779628E-01 -3.425225E-02 -1.099627E-01 -5.462866E-02 --2.654341E-01 -1.868127E-02 -2.246854E-01 -3.157231E-02 --1.422513E-01 -5.939434E-02 --8.583155E-02 -5.668810E-02 -6.967936E-02 -1.924265E-02 --2.246405E-03 -1.576409E-02 -7.321307E-02 -2.061990E-02 --4.949248E-01 -1.278374E-01 -4.468760E-02 -3.814622E-02 --9.398135E-02 -1.772831E-02 --2.757022E-01 -1.349555E-01 -1.715161E-02 -5.040025E-02 --1.682974E-01 -7.558363E-02 --4.700401E-02 -2.700354E-02 -1.109855E-01 -2.666559E-02 -2.136115E-01 -7.786593E-02 --2.089667E-01 -1.489893E-02 --6.959959E-02 -7.545487E-02 --3.296680E-02 -1.604995E-02 --1.587440E-01 -5.482886E-02 --3.203027E-01 -3.421361E-02 +3.862543E+01 +2.993190E+02 +5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +-5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +-4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +-2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +-3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +-2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +-2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +-6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +-7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +-1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +-3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +-5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +-4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +-6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +-1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +-6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +-1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +-8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +-2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +-3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +-1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +-4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +-1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +-5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +-6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +-4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +-3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +-2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +-2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +-3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +-4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +-4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +-6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +-3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +-2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +-7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +-2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +-8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +-8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +-1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +-2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +-6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +-9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +-8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +-8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +-7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +-4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +-4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +-7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +-5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +-3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +-2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +-8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +1.062149E-01 +5.400365E-02 diff --git a/tests/test_score_kappafission/inputs_true.dat b/tests/test_score_kappafission/inputs_true.dat index 67b1e38750..86939274b8 100644 --- a/tests/test_score_kappafission/inputs_true.dat +++ b/tests/test_score_kappafission/inputs_true.dat @@ -1 +1 @@ -46d1dbf99a14e08eddf34721d2380bf7969b8d299c48a64cfae22dfde29e3b8eab227d663f3ecb234dac2712b5971af2735fd69301b7614c7adae6c3da795e51 \ No newline at end of file +8dd415b571ad51a62f2394d149f6c417d63babd4e85a1ff6f1cac267c4f4bcd0642ba0b24da39ff926bee4aea7dbbe0371face03d2009d8d74e7ac31c7c45000 \ No newline at end of file diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index 23c12eed20..75d37cd87e 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -3.057169E+02 -1.886844E+04 +2.266048E+02 +1.049833E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -7.017044E+01 -1.049216E+03 +1.366139E+02 +3.859561E+03 tally 2: -2.992056E+02 -1.852593E+04 +2.402814E+02 +1.174003E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -7.782271E+01 -1.267469E+03 +1.270420E+02 +3.297537E+03 tally 3: -2.933944E+02 -1.740955E+04 +2.217075E+02 +1.003168E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -7.679811E+01 -1.191597E+03 +1.375693E+02 +3.872389E+03 diff --git a/tests/test_score_nufission/inputs_true.dat b/tests/test_score_nufission/inputs_true.dat index dbf21a50b3..4e6018f99c 100644 --- a/tests/test_score_nufission/inputs_true.dat +++ b/tests/test_score_nufission/inputs_true.dat @@ -1 +1 @@ -8500d149868598a30fc818a34fe0465cf926b79632a8a7a1f96799cc955f30544b2cec131878bbded295179a2fc103657c2ecdb8c28ea10b84b7f6f0091fac7a \ No newline at end of file +0e60125f41bbc362703886097b2bc7297ff0aae6365d4653771b86b1aab2de43a924d81b3d73afb781733b2919f30089373f74da4a96f94f988eb04ddf482e85 \ No newline at end of file diff --git a/tests/test_score_nufission/results_true.dat b/tests/test_score_nufission/results_true.dat index 046c5b289e..31c6abe9d5 100644 --- a/tests/test_score_nufission/results_true.dat +++ b/tests/test_score_nufission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -4.110726E+00 -3.411205E+00 +3.041781E+00 +1.891714E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.429333E-01 -1.889683E-01 +1.835166E+00 +6.963265E-01 tally 2: -4.104411E+00 -3.453290E+00 +3.341227E+00 +2.322075E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.034371E+00 -2.220105E-01 +1.862652E+00 +7.112121E-01 tally 3: -3.947006E+00 -3.149452E+00 +2.975121E+00 +1.806644E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.031768E+00 -2.152452E-01 +1.846861E+00 +6.985413E-01 diff --git a/tests/test_score_nuscatter/inputs_true.dat b/tests/test_score_nuscatter/inputs_true.dat index 889941afce..440db11243 100644 --- a/tests/test_score_nuscatter/inputs_true.dat +++ b/tests/test_score_nuscatter/inputs_true.dat @@ -1 +1 @@ -41644968ea3a500af029e799ceef40c270d26944e0e7426afe1b8b2e15743b79c8b2989ecaaa0dac958046a89a49dab9d592cc7a4e059cd1f917b62219a8ed31 \ No newline at end of file +5d0e915af1f424b8ca9d3723fecc2e0e0c558bcbe70b5ad45bcc8e03caf9b4caae9ed593010ce31c6dfe09be06a6dc3929b839999132917569f2ed93c3b70455 \ No newline at end of file diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index 675509932e..6e9935f218 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.940000E+01 -7.561780E+01 -4.340000E+00 -3.813000E+00 -6.440000E+01 -8.302674E+02 +1.485000E+01 +4.439790E+01 +4.120000E+00 +3.438000E+00 +5.173000E+01 +5.467243E+02 diff --git a/tests/test_score_nuscatter_n/inputs_true.dat b/tests/test_score_nuscatter_n/inputs_true.dat index 228c224001..a907148a7c 100644 --- a/tests/test_score_nuscatter_n/inputs_true.dat +++ b/tests/test_score_nuscatter_n/inputs_true.dat @@ -1 +1 @@ -c8072b4ce735db4cc196a688f2d253e5683d5ef7b7a254ceab4d689d3902bb4fd7223ad824d002f3abf7e0fe7fbd80ab6c0273c8972df1ec26ff69cbd26c13ee \ No newline at end of file +3db6a6067fb07ed0e213c1e293f32a23ab64fbfb45a7a69320e8326ae76e5a3020c2f73986e7a93eeee1dde1422d84081ff18f0a9770aaba94423586bd134721 \ No newline at end of file diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index cdcbcfb524..96e56bd6ab 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.940000E+01 -7.561780E+01 -2.629221E+00 -1.399188E+00 -1.567944E+00 -5.124385E-01 -6.926532E-01 -1.577035E-01 -6.111349E-01 -1.006724E-01 -4.340000E+00 -3.813000E+00 -6.633546E-01 -9.836364E-02 -3.707954E-01 -3.694050E-02 --4.267991E-02 -1.870638E-03 -5.239484E-02 -1.032955E-02 -6.440000E+01 -8.302674E+02 -3.312945E+01 -2.197504E+02 -1.239256E+01 -3.104303E+01 -7.813162E-01 -2.790254E-01 --1.320978E+00 -4.696586E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 +4.120000E+00 +3.438000E+00 +6.222571E-01 +8.335984E-02 +1.670136E-01 +1.374768E-02 +-5.819374E-02 +1.091808E-02 +-6.389550E-02 +5.688533E-03 +5.173000E+01 +5.467243E+02 +2.669403E+01 +1.451361E+02 +9.691140E+00 +1.933574E+01 +5.860769E-01 +2.122377E-01 +-1.190340E+00 +3.145785E-01 diff --git a/tests/test_score_nuscatter_pn/inputs_true.dat b/tests/test_score_nuscatter_pn/inputs_true.dat index f04187297d..eb2962dc34 100644 --- a/tests/test_score_nuscatter_pn/inputs_true.dat +++ b/tests/test_score_nuscatter_pn/inputs_true.dat @@ -1 +1 @@ -dbe91c112a02bf9c1098c2ba93c737bfd048f356d00dab280a245c572821d345a9d4c2cfa766f8b83c42362d9b8dbbb3d5ce240b6e749541aac3cae567b715c4 \ No newline at end of file +5cd39eacee3efe8d7a8db38edb741d8f773a0b42276dab8635d36e7fc9809617d9ad47510be06bc019472e1b792bc678d88fcbb26ca4ed07504a222388ee230c \ No newline at end of file diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 81d1d1ad73..753216a8b7 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.940000E+01 -7.561780E+01 -2.629221E+00 -1.399188E+00 -1.567944E+00 -5.124385E-01 -6.926532E-01 -1.577035E-01 -6.111349E-01 -1.006724E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 tally 2: -1.940000E+01 -7.561780E+01 -2.629221E+00 -1.399188E+00 -1.567944E+00 -5.124385E-01 -6.926532E-01 -1.577035E-01 -6.111349E-01 -1.006724E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 diff --git a/tests/test_score_nuscatter_yn/inputs_true.dat b/tests/test_score_nuscatter_yn/inputs_true.dat index 2a0fde3095..510c6f04d9 100644 --- a/tests/test_score_nuscatter_yn/inputs_true.dat +++ b/tests/test_score_nuscatter_yn/inputs_true.dat @@ -1 +1 @@ -31e4d35c4845eaa7d3ec4b021f820a4526b0d8a43fdd69288c1c94551a895c05bbd10cfe72b54dafc9abe31ed56ef06a6fb3de77088e4c2da25b547fc06ac74d \ No newline at end of file +4bce40c1119ba7ac23c12b0fcf79fbf9b6dfb89ce2921f5f3906cb8683b79355bd9ba208c80f736f03ea18dccf3449a4ddaedb72ebb10b27301e843c31822f58 \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index fde6f07ec4..d1b165274d 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.940000E+01 -7.561780E+01 +1.485000E+01 +4.439790E+01 tally 2: -1.940000E+01 -7.561780E+01 --8.464573E-02 -1.823218E-02 --1.116469E-01 -3.380141E-02 --2.130479E-03 -1.022241E-02 --4.896859E-02 -1.074348E-02 --1.482536E-01 -1.114316E-02 --6.827566E-02 -4.248457E-03 -1.494503E-01 -2.605186E-02 -2.010847E-01 -1.699034E-02 -4.535125E-02 -2.658493E-03 --4.135950E-02 -4.170544E-03 -1.277006E-01 -6.276355E-03 -4.192667E-02 -4.955945E-03 --9.607170E-02 -3.280003E-03 -1.533637E-01 -7.107300E-03 -3.570929E-02 -4.795032E-03 +1.485000E+01 +4.439790E+01 +8.440076E-02 +1.135203E-02 +8.198663E-02 +3.887429E-02 +1.358080E-01 +2.890416E-02 +-3.544823E-02 +9.843339E-04 +1.542072E-01 +8.228126E-03 +1.057111E-01 +3.758100E-03 +1.647870E-02 +4.827841E-03 +1.378297E-01 +1.566876E-02 +-4.676778E-02 +4.809366E-03 +1.966204E-02 +7.447981E-04 +-1.889258E-02 +6.841953E-04 +1.337703E-02 +1.250077E-03 +1.044684E-01 +6.969498E-03 +-1.177995E-02 +8.208715E-03 +1.940058E-04 +5.128759E-03 diff --git a/tests/test_score_scatter/inputs_true.dat b/tests/test_score_scatter/inputs_true.dat index c5f1c1f17a..d7a6f4719a 100644 --- a/tests/test_score_scatter/inputs_true.dat +++ b/tests/test_score_scatter/inputs_true.dat @@ -1 +1 @@ -c07fa98f19d66732be7bd394b30b6e2d18d54a9fec2ae729e9d00adb55d9c00533bacb2d3fe4eee7f41e6e0b6841e82ff313bc593bf3b7932bd8d026dc81a58d \ No newline at end of file +8b5e7c3825ef033d12c0574595b16559981ed3dd0ced8609c461cd0e81f1f2ef28195e0a6f6886fcbae64185dfe96001fa12d3d472f6446a3135d3bd6ef83394 \ No newline at end of file diff --git a/tests/test_score_scatter/results_true.dat b/tests/test_score_scatter/results_true.dat index 50782e4167..8d3e0fdc03 100644 --- a/tests/test_score_scatter/results_true.dat +++ b/tests/test_score_scatter/results_true.dat @@ -1,29 +1,29 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.907306E+01 -7.310892E+01 -4.678711E+00 -4.406892E+00 -6.487881E+01 -8.433246E+02 +1.514235E+01 +4.620490E+01 +3.839050E+00 +2.975620E+00 +5.317903E+01 +5.754103E+02 tally 2: 0.000000E+00 0.000000E+00 -1.940000E+01 -7.561780E+01 -4.340000E+00 -3.813000E+00 -6.440000E+01 -8.302674E+02 +1.485000E+01 +4.439790E+01 +4.120000E+00 +3.438000E+00 +5.173000E+01 +5.467243E+02 tally 3: 0.000000E+00 0.000000E+00 -1.952859E+01 -7.659866E+01 -4.328145E+00 -3.794232E+00 -6.439437E+01 -8.300759E+02 +1.496769E+01 +4.502714E+01 +4.117144E+00 +3.431861E+00 +5.174677E+01 +5.469474E+02 diff --git a/tests/test_score_scatter_n/inputs_true.dat b/tests/test_score_scatter_n/inputs_true.dat index 37dc7074f0..68febf4bc5 100644 --- a/tests/test_score_scatter_n/inputs_true.dat +++ b/tests/test_score_scatter_n/inputs_true.dat @@ -1 +1 @@ -5a6ec0557a68deb5334e0689575531328bad6964f48409ef70343266e88a5c691099486813c69c3c4c0e6154e23342d228f924606b664ae7c4cdd24818626797 \ No newline at end of file +414d0faeba75d27e4785faa9812f5eac6aa108e7fd3c1388d51ae8e0d7fddd25e9f61e51afdaa70874a32e1c3d2815d82b5c79636b1ccb0d6767144fcf6f813a \ No newline at end of file diff --git a/tests/test_score_scatter_n/results_true.dat b/tests/test_score_scatter_n/results_true.dat index cdcbcfb524..96e56bd6ab 100644 --- a/tests/test_score_scatter_n/results_true.dat +++ b/tests/test_score_scatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.940000E+01 -7.561780E+01 -2.629221E+00 -1.399188E+00 -1.567944E+00 -5.124385E-01 -6.926532E-01 -1.577035E-01 -6.111349E-01 -1.006724E-01 -4.340000E+00 -3.813000E+00 -6.633546E-01 -9.836364E-02 -3.707954E-01 -3.694050E-02 --4.267991E-02 -1.870638E-03 -5.239484E-02 -1.032955E-02 -6.440000E+01 -8.302674E+02 -3.312945E+01 -2.197504E+02 -1.239256E+01 -3.104303E+01 -7.813162E-01 -2.790254E-01 --1.320978E+00 -4.696586E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 +4.120000E+00 +3.438000E+00 +6.222571E-01 +8.335984E-02 +1.670136E-01 +1.374768E-02 +-5.819374E-02 +1.091808E-02 +-6.389550E-02 +5.688533E-03 +5.173000E+01 +5.467243E+02 +2.669403E+01 +1.451361E+02 +9.691140E+00 +1.933574E+01 +5.860769E-01 +2.122377E-01 +-1.190340E+00 +3.145785E-01 diff --git a/tests/test_score_scatter_pn/inputs_true.dat b/tests/test_score_scatter_pn/inputs_true.dat index 06dab53407..53b1d21608 100644 --- a/tests/test_score_scatter_pn/inputs_true.dat +++ b/tests/test_score_scatter_pn/inputs_true.dat @@ -1 +1 @@ -112ae1a84c81f58885583b463f576bf1d9b5f5cbb0f5dfb36147ab30be2ef0d7506cfee053b54c26baad1b233d5d97cd1698c2af909682275e0b8fd79dd8f43c \ No newline at end of file +f83e5a272e78dba7a4b3412aa264300efbeae641de0bbcae3febe7ba5fa6668dbf9364fdc7f1c431ab9c58aaf019ae41d98ee69d4dd035d6b5e0188e7d181b20 \ No newline at end of file diff --git a/tests/test_score_scatter_pn/results_true.dat b/tests/test_score_scatter_pn/results_true.dat index 81d1d1ad73..753216a8b7 100644 --- a/tests/test_score_scatter_pn/results_true.dat +++ b/tests/test_score_scatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.940000E+01 -7.561780E+01 -2.629221E+00 -1.399188E+00 -1.567944E+00 -5.124385E-01 -6.926532E-01 -1.577035E-01 -6.111349E-01 -1.006724E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 tally 2: -1.940000E+01 -7.561780E+01 -2.629221E+00 -1.399188E+00 -1.567944E+00 -5.124385E-01 -6.926532E-01 -1.577035E-01 -6.111349E-01 -1.006724E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 diff --git a/tests/test_score_scatter_yn/inputs_true.dat b/tests/test_score_scatter_yn/inputs_true.dat index c7c1c822af..6e5210212e 100644 --- a/tests/test_score_scatter_yn/inputs_true.dat +++ b/tests/test_score_scatter_yn/inputs_true.dat @@ -1 +1 @@ -ad59269de656ab6ea87cf55f1ecb8cd60f4bb652b881bc9f3f705fd17714fee4cdbb105b99d9b50e5d39375f89d37437888d432f53457cd5d61e1956b81e2097 \ No newline at end of file +c90d836355fcbe14112c16f8743b9180371400c022b19f693881d91924788555ed1507a1936b4d241a63564a7661f380c5d0568d398fa8a20a25f41c5b7c4fb8 \ No newline at end of file diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 3e22703ad7..20b7672eb5 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -1,56 +1,56 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: -1.940000E+01 -7.561780E+01 +1.485000E+01 +4.439790E+01 tally 2: -1.940000E+01 -7.561780E+01 --8.464573E-02 -1.823218E-02 --1.116469E-01 -3.380141E-02 --2.130479E-03 -1.022241E-02 --4.896859E-02 -1.074348E-02 --1.482536E-01 -1.114316E-02 --6.827566E-02 -4.248457E-03 -1.494503E-01 -2.605186E-02 -2.010847E-01 -1.699034E-02 -4.535125E-02 -2.658493E-03 --4.135950E-02 -4.170544E-03 -1.277006E-01 -6.276355E-03 -4.192667E-02 -4.955945E-03 --9.607170E-02 -3.280003E-03 -1.533637E-01 -7.107300E-03 -3.570929E-02 -4.795032E-03 --1.183812E-01 -3.369458E-03 --1.555883E-02 -9.917545E-04 --9.288972E-02 -2.083169E-03 --1.698033E-02 -1.027209E-03 -7.433184E-03 -5.046022E-04 -9.078711E-02 -2.020877E-03 --7.502769E-02 -2.431965E-03 --3.565718E-02 -5.978599E-03 --7.076433E-02 -2.138810E-03 +1.485000E+01 +4.439790E+01 +8.440076E-02 +1.135203E-02 +8.198663E-02 +3.887429E-02 +1.358080E-01 +2.890416E-02 +-3.544823E-02 +9.843339E-04 +1.542072E-01 +8.228126E-03 +1.057111E-01 +3.758100E-03 +1.647870E-02 +4.827841E-03 +1.378297E-01 +1.566876E-02 +-4.676778E-02 +4.809366E-03 +1.966204E-02 +7.447981E-04 +-1.889258E-02 +6.841953E-04 +1.337703E-02 +1.250077E-03 +1.044684E-01 +6.969498E-03 +-1.177995E-02 +8.208715E-03 +1.940058E-04 +5.128759E-03 +-2.165868E-02 +1.335569E-03 +3.080886E-02 +4.544434E-04 +1.039856E-03 +1.209631E-03 +1.317068E-02 +1.469722E-03 +-6.432758E-02 +2.106736E-03 +-3.323023E-02 +4.513838E-03 +2.683700E-02 +1.146747E-03 +3.494912E-02 +1.006153E-03 +6.289525E-02 +3.700145E-03 diff --git a/tests/test_score_total/inputs_true.dat b/tests/test_score_total/inputs_true.dat index 114ec33e14..975588a1ac 100644 --- a/tests/test_score_total/inputs_true.dat +++ b/tests/test_score_total/inputs_true.dat @@ -1 +1 @@ -1ba17d4cef859221f314a0e7576a762260effe8f1977c9c6c74a80007d80b92d8d0fffadf39dde5e054809f3bf63529930428f79c6c4008d53e8be7644cd538a \ No newline at end of file +90633c6010148c10c363ed3b2e9de3213468c51dea6153dff4bb18eadc579041d967e4835023d10b6d8c42fe81017238d119f24cae754d0621698547464b16f3 \ No newline at end of file diff --git a/tests/test_score_total/results_true.dat b/tests/test_score_total/results_true.dat index a51e32b159..9b8a06f807 100644 --- a/tests/test_score_total/results_true.dat +++ b/tests/test_score_total/results_true.dat @@ -1,29 +1,29 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -2.240915E+01 -1.009032E+02 -4.711189E+00 -4.469059E+00 -6.533718E+01 -8.552989E+02 +1.767552E+01 +6.295417E+01 +3.863588E+00 +3.013300E+00 +5.356594E+01 +5.839391E+02 tally 2: 0.000000E+00 0.000000E+00 -2.278000E+01 -1.042404E+02 -4.350000E+00 -3.833900E+00 -6.484000E+01 -8.416314E+02 +1.739000E+01 +6.083290E+01 +4.160000E+00 +3.501000E+00 +5.213000E+01 +5.552351E+02 tally 3: 0.000000E+00 0.000000E+00 -2.278000E+01 -1.042404E+02 -4.350000E+00 -3.833900E+00 -6.484000E+01 -8.416314E+02 +1.739000E+01 +6.083290E+01 +4.160000E+00 +3.501000E+00 +5.213000E+01 +5.552351E+02 diff --git a/tests/test_score_total_yn/inputs_true.dat b/tests/test_score_total_yn/inputs_true.dat index 471cadfb20..133138775d 100644 --- a/tests/test_score_total_yn/inputs_true.dat +++ b/tests/test_score_total_yn/inputs_true.dat @@ -1 +1 @@ -8967621db0c045e1c12b181eb825b0528bf1f8ef03d5d5e036e14f5151d4bcec36c56b1ec2faba66254d09a29795f9ed44599762e7dfd506fff8bf4d27de8328 \ No newline at end of file +1bbb4a3aa9e60b4117ae6cdac13ad20e037846be37100516cbca70ad48947837f157ba441d839b773a260026284fb0f45c80b49db4c1522e64e46d905c77899a \ No newline at end of file diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index 5d7a1498de..3565711be5 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -1,5 +1,5 @@ k-combined: -9.935192E-01 5.457292E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -101,106 +101,106 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.265629E+00 -3.233643E-01 -5.626298E-02 -1.292090E-03 -2.035173E-02 -6.296227E-04 -1.928563E-02 -8.190514E-04 --2.468301E-02 -2.354849E-04 -9.148092E-03 -2.225568E-04 --5.879447E-02 -8.590977E-04 --1.445300E-02 -1.531576E-04 -6.018866E-02 -8.591329E-04 -1.403996E-02 -4.821838E-04 -9.815924E-03 -5.880801E-04 --9.749601E-03 -4.650507E-04 --8.702902E-03 -6.682813E-05 -1.953899E-02 -2.762602E-04 -2.823080E-02 -3.090601E-04 --2.932935E-03 -1.767294E-05 -6.394250E-03 -1.447695E-04 --1.504208E-03 -4.671038E-05 --1.575220E-02 -1.620546E-04 --2.910381E-03 -2.389274E-04 --3.020227E-02 -5.422131E-04 --8.190946E-03 -3.025911E-04 -2.246625E-02 -3.354891E-04 --2.002110E-02 -2.075929E-04 --1.962614E-02 -3.166447E-04 -2.240915E+01 -1.009032E+02 -1.856657E-01 -9.493183E-02 --1.690914E-01 -1.047180E-01 --1.866343E-01 -5.134677E-02 --2.029558E-01 -1.341115E-02 --1.379135E-01 -2.187965E-02 --5.257769E-01 -7.022699E-02 --6.848163E-02 -8.861152E-02 -3.794798E-01 -6.518809E-02 --1.093894E-01 -2.155411E-02 --1.520483E-01 -2.978741E-02 -1.718356E-01 -2.986391E-02 -8.273807E-02 -1.139398E-02 -1.312033E-01 -1.195907E-02 -3.286682E-01 -4.246009E-02 -8.878513E-02 -3.773227E-02 --2.541223E-02 -1.841611E-02 --1.249772E-02 -7.518231E-03 --1.468495E-01 -1.193263E-02 -2.206397E-02 -3.376086E-02 --1.990498E-01 -2.246024E-02 -1.181081E-01 -2.651049E-02 --8.952636E-03 -9.032436E-03 -5.183546E-02 -1.061147E-02 --1.047213E-01 -9.680702E-03 +9.780506E-01 +1.942072E-01 +4.170415E-02 +7.581469E-04 +-2.419728E-03 +6.296241E-04 +8.163997E-03 +4.785197E-04 +3.971909E-03 +1.363304E-04 +-1.585497E-02 +1.295251E-04 +-7.029875E-02 +1.208194E-03 +1.524070E-02 +2.828843E-04 +-2.141105E-02 +2.953327E-04 +2.147623E-02 +2.390414E-04 +5.592040E-04 +1.720605E-04 +-3.022066E-03 +1.843720E-04 +1.489821E-02 +9.193290E-05 +1.354668E-02 +2.551940E-04 +-5.692690E-04 +3.013453E-04 +-2.324582E-02 +2.170615E-04 +1.883012E-02 +1.045949E-04 +3.997107E-03 +1.674058E-04 +1.616443E-02 +2.046286E-04 +-1.625747E-02 +1.851351E-04 +1.120209E-02 +2.028649E-04 +-4.240284E-03 +4.019011E-05 +1.535379E-02 +9.872559E-05 +8.973926E-03 +1.448680E-04 +-3.933227E-03 +4.305328E-04 +1.767552E+01 +6.295417E+01 +1.458308E-01 +8.239551E-03 +1.976485E-01 +7.360520E-02 +2.647182E-01 +5.347815E-02 +1.828025E-01 +1.840743E-02 +-1.865994E-01 +2.843407E-02 +-6.438995E-02 +8.898045E-03 +1.416445E-01 +3.839856E-02 +-3.298894E-01 +2.672141E-02 +1.462639E-01 +1.225250E-02 +-6.410138E-02 +3.766615E-02 +-4.701705E-02 +1.968428E-03 +2.953056E-02 +2.358647E-02 +1.717672E-01 +5.877351E-02 +1.927497E-02 +1.358953E-02 +-1.708870E-01 +1.502033E-02 +4.453803E-02 +1.622532E-02 +2.076143E-02 +1.850686E-03 +1.111325E-01 +8.415150E-03 +-1.249594E-01 +7.491280E-03 +1.381757E-02 +1.537264E-02 +7.286234E-03 +9.057874E-03 +3.162973E-01 +3.303388E-02 +-1.012773E-01 +8.345375E-03 +-5.238963E-02 +3.920421E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -251,56 +251,56 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.711189E+00 -4.469059E+00 -1.149862E-03 -4.006261E-03 --5.485896E-02 -5.881771E-03 --6.936896E-02 -1.501967E-03 -1.033506E-02 -4.261122E-04 --1.042957E-01 -2.255383E-03 --7.082011E-02 -2.495972E-03 -1.099802E-02 -2.333908E-03 -5.635534E-02 -4.286572E-03 --2.310646E-02 -1.542196E-03 --2.259159E-02 -5.408191E-04 -9.307209E-02 -1.773060E-03 -6.296915E-02 -2.394743E-03 --8.108703E-03 -9.384558E-04 -7.125823E-02 -2.782853E-03 -7.168104E-03 -1.083383E-03 --2.498842E-02 -5.768656E-04 --2.297890E-02 -8.711670E-04 --1.775752E-02 -2.271706E-04 --1.794820E-02 -8.018486E-04 -1.963115E-02 -7.104338E-04 -5.288264E-02 -6.415302E-04 -5.895017E-03 -3.571409E-04 -2.190858E-02 -5.489095E-04 --3.829208E-02 -5.977452E-04 +3.863588E+00 +3.013300E+00 +-5.075749E-02 +1.018210E-03 +3.445344E-02 +5.778215E-03 +6.239642E-02 +4.107408E-03 +-1.475495E-02 +7.971898E-04 +-5.809323E-02 +3.039895E-03 +-2.510339E-02 +3.529134E-04 +9.731680E-03 +1.221628E-03 +-5.815144E-02 +1.403261E-03 +4.936694E-02 +6.481626E-04 +5.141985E-03 +1.343973E-03 +-1.515105E-02 +3.044735E-04 +4.474521E-03 +1.155268E-03 +6.855877E-02 +4.048417E-03 +-2.701969E-05 +1.279041E-03 +-2.197636E-02 +2.843662E-04 +-1.780381E-02 +8.441574E-04 +-2.916634E-02 +2.530602E-03 +2.289834E-02 +2.201375E-03 +-3.283424E-02 +7.615219E-04 +9.623726E-03 +7.614092E-04 +-2.808239E-02 +1.500381E-03 +4.835419E-02 +6.933678E-04 +2.636221E-02 +2.230834E-04 +-4.957463E-02 +1.939266E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -351,56 +351,56 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.533718E+01 -8.552989E+02 -4.658976E-02 -2.719315E-01 --5.661220E-01 -5.439751E-01 --3.051142E-01 -4.890036E-01 --1.640760E-01 -2.200294E-02 --2.675559E-01 -1.660319E-01 -2.007804E-01 -3.303623E-01 -2.670686E-02 -2.330239E-02 -3.111327E-01 -2.876993E-01 --6.871786E-02 -1.625684E-01 --5.849816E-01 -2.074413E-01 -3.674709E-01 -9.029605E-02 -3.420122E-01 -3.147918E-01 -1.580259E-01 -4.184964E-02 -1.509855E-01 -1.718636E-01 -4.008602E-01 -1.315982E-01 -1.253163E-01 -7.030618E-02 -1.826521E-02 -4.452932E-02 --9.755491E-02 -1.276313E-01 -5.434521E-02 -3.809202E-02 -7.041533E-01 -1.522383E-01 -1.434910E-01 -1.112940E-01 -1.947700E-01 -9.469651E-02 --7.044463E-02 -3.058029E-02 --6.586398E-01 -1.337469E-01 +5.356594E+01 +5.839391E+02 +1.198882E+00 +3.391100E-01 +3.952398E-01 +5.729760E-01 +1.045726E+00 +4.419194E-01 +2.683170E-01 +1.872580E-01 +-5.059349E-01 +2.592209E-01 +4.561651E-01 +1.253696E-01 +4.273775E-01 +3.509266E-01 +-6.300496E-01 +2.102051E-01 +3.094705E-01 +1.410278E-01 +-6.840225E-01 +1.971765E-01 +-4.123355E-02 +3.962538E-02 +-1.554557E-01 +2.784362E-02 +4.698631E-01 +1.867413E-01 +-7.016026E-02 +3.059344E-02 +-2.922284E-01 +8.680517E-02 +-1.252431E-01 +3.180591E-02 +-1.825937E-01 +8.626653E-02 +1.637960E-01 +1.329538E-01 +-6.662867E-01 +1.497985E-01 +4.662585E-01 +7.552145E-02 +-1.198254E-03 +2.020899E-01 +5.281410E-01 +9.615758E-02 +-6.396211E-02 +1.806992E-01 +-1.898620E-01 +1.113751E-01 tally 2: 0.000000E+00 0.000000E+00 @@ -502,106 +502,106 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -1.270000E+00 -3.313000E-01 -6.672369E-03 -5.154703E-03 -2.741231E-02 -3.707114E-03 -6.785459E-02 -1.525452E-03 --7.226258E-02 -3.119519E-03 --1.458773E-02 -5.829469E-03 -9.286573E-02 -4.614384E-03 --8.836014E-02 -3.693860E-03 -7.682597E-02 -3.692450E-03 -5.624405E-04 -1.894653E-03 --2.446734E-02 -2.962636E-04 --2.865534E-02 -8.238323E-04 -1.746333E-02 -1.350727E-03 -6.812468E-02 -2.154847E-03 -2.170333E-02 -8.368218E-04 --3.464644E-02 -6.341450E-04 -1.586865E-03 -2.086260E-04 -1.122866E-02 -1.828956E-03 -5.147244E-02 -2.116013E-03 --5.140617E-03 -2.011918E-03 -3.662973E-02 -1.511591E-03 --3.826498E-04 -1.254739E-03 -9.466189E-02 -2.206340E-03 --1.695030E-02 -2.963888E-04 --4.620345E-02 -1.330607E-03 -2.278000E+01 -1.042404E+02 --2.705944E-01 -4.019819E-02 -8.910115E-02 -7.598548E-02 -4.240148E-01 -6.249778E-02 --1.711683E-01 -3.365297E-02 --1.320939E-01 -4.677615E-02 --3.833055E-01 -3.838770E-02 -1.938748E-01 -8.311489E-02 -1.859290E-01 -1.653719E-02 --2.875551E-01 -7.432886E-02 -1.513934E-02 -7.854478E-02 -1.932642E-02 -1.428749E-02 -4.617741E-02 -1.844961E-02 -1.063807E-01 -3.103047E-02 -1.309557E-01 -1.198530E-02 -2.797364E-01 -2.403350E-02 --1.332777E-01 -2.277289E-02 -9.430025E-02 -5.826855E-03 --1.012356E-01 -1.537804E-02 --8.178736E-02 -4.470169E-02 --1.197123E-01 -2.596045E-02 -3.984096E-02 -1.209844E-02 -1.148842E-01 -6.772712E-03 --1.705431E-02 -3.920009E-02 --2.694201E-02 -2.653514E-02 +9.300000E-01 +1.839000E-01 +-4.056201E-03 +8.670884E-04 +-2.262959E-02 +2.263780E-03 +4.568371E-02 +4.078305E-03 +6.023055E-02 +1.099458E-03 +2.468374E-02 +3.403931E-03 +-8.676202E-02 +2.444658E-03 +-2.075016E-02 +5.432442E-03 +1.101095E-02 +3.129947E-04 +-8.689134E-03 +2.422445E-03 +-1.097503E-02 +4.670673E-04 +-4.979355E-02 +1.791811E-03 +1.769845E-02 +6.074665E-04 +1.473469E-02 +1.257671E-03 +-1.133757E-02 +1.555143E-03 +-1.730195E-02 +1.841949E-03 +-1.191492E-02 +1.859105E-03 +-9.038577E-03 +4.401577E-04 +1.770047E-02 +4.158291E-04 +-1.492809E-02 +5.488168E-04 +7.970152E-02 +1.597910E-03 +-3.741348E-02 +5.704935E-04 +2.078478E-02 +5.379832E-04 +1.355930E-02 +6.747758E-04 +3.416200E-02 +8.262470E-04 +1.739000E+01 +6.083290E+01 +2.434171E-01 +3.049063E-02 +-1.278707E-01 +9.585267E-02 +2.597328E-01 +8.692607E-02 +2.496700E-01 +3.750933E-02 +1.309937E-01 +4.217907E-02 +-1.863241E-01 +1.738581E-02 +-1.292679E-01 +1.799004E-02 +-3.543191E-01 +3.682107E-02 +-1.904413E-01 +1.455250E-02 +-7.093238E-02 +1.473997E-02 +-1.920412E-01 +1.308864E-02 +1.566093E-01 +1.913492E-02 +2.499642E-01 +3.036874E-02 +-2.323022E-01 +3.794368E-02 +-6.361729E-02 +3.266166E-02 +4.688479E-02 +2.806712E-02 +-9.796563E-02 +1.419748E-02 +1.000847E-02 +3.233262E-02 +-7.570231E-02 +4.626536E-03 +1.489091E-01 +1.159345E-02 +-2.236285E-01 +1.480084E-02 +2.461305E-01 +1.643844E-02 +-1.773523E-02 +1.626036E-03 +6.570774E-02 +1.069893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -652,56 +652,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -4.350000E+00 -3.833900E+00 -2.792800E-01 -3.102658E-02 --2.343095E-01 -3.826449E-02 -3.428573E-02 -6.437027E-03 --1.025176E-01 -1.798807E-02 --4.106130E-02 -3.786695E-03 --1.470480E-01 -8.519720E-03 -1.989035E-02 -5.067928E-03 -8.094404E-02 -3.412899E-03 --5.616421E-02 -2.709728E-03 -2.421213E-02 -3.683849E-03 -4.794858E-02 -4.392540E-03 --1.637085E-02 -5.339723E-03 --2.046073E-02 -5.231271E-03 -1.554627E-02 -4.457612E-03 --3.441131E-02 -7.049061E-03 --1.139075E-01 -7.627867E-03 --8.358967E-02 -4.023855E-03 -1.221815E-01 -5.628324E-03 --2.061337E-02 -1.926605E-03 --1.583607E-02 -1.093902E-03 --7.623859E-02 -5.519074E-03 --1.115748E-02 -3.984642E-03 -7.665232E-02 -1.111550E-02 --2.673980E-02 -7.957502E-03 +4.160000E+00 +3.501000E+00 +9.464171E-02 +8.682833E-03 +8.467800E-02 +1.402624E-02 +-1.283471E-02 +2.630439E-02 +1.859869E-01 +1.189528E-02 +-1.910311E-02 +2.907370E-03 +-2.542253E-01 +2.143851E-02 +4.021473E-02 +5.812599E-03 +-1.242140E-01 +1.017873E-02 +2.934198E-02 +2.409920E-03 +5.719767E-02 +2.211520E-03 +-3.023903E-02 +2.870625E-03 +1.092479E-01 +6.089989E-03 +-1.604743E-02 +1.110224E-02 +3.811062E-03 +5.234112E-03 +-5.446762E-02 +5.323411E-03 +-3.868978E-02 +4.949255E-03 +-1.384260E-01 +4.903532E-03 +-3.761889E-02 +2.524889E-03 +6.079772E-02 +2.328339E-03 +1.956623E-03 +4.096814E-03 +-1.716402E-03 +2.022751E-03 +-1.108600E-01 +3.227014E-03 +2.447622E-03 +4.075421E-03 +1.582493E-02 +4.847858E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -752,56 +752,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -6.484000E+01 -8.416314E+02 --3.758929E-01 -3.104729E-01 --7.263839E-01 -7.809822E-01 -4.648018E-03 -2.834459E-01 --1.055002E-01 -3.040070E-02 -7.118727E-02 -7.977682E-02 -7.664673E-01 -1.821315E-01 -2.087917E-01 -4.041777E-02 -2.761598E-01 -3.014608E-01 -2.119970E-01 -2.965940E-02 --8.139971E-01 -1.653848E-01 -1.280103E-01 -4.989381E-02 -6.090725E-01 -2.822967E-01 -2.502533E-02 -1.011286E-02 --3.776030E-01 -2.846556E-01 --1.484779E-01 -1.060501E-01 -3.365875E-01 -2.827604E-02 --8.437307E-02 -9.086937E-02 -2.827425E-01 -6.353956E-02 -1.139952E-01 -1.067588E-01 -6.809505E-01 -1.329962E-01 -1.408254E-01 -3.003253E-02 --1.222838E-01 -5.353793E-02 --2.274047E-02 -3.333572E-02 --1.026245E-01 -5.889851E-02 +5.213000E+01 +5.552351E+02 +6.019876E-01 +2.938936E-01 +2.126970E-01 +3.363271E-01 +6.928646E-01 +3.077152E-01 +-2.976474E-01 +5.830705E-02 +-7.804821E-01 +3.967156E-01 +5.737502E-01 +1.090147E-01 +2.867929E-01 +1.312720E-01 +-4.735578E-01 +6.714577E-02 +6.340442E-02 +4.240623E-02 +-1.594570E-01 +1.167021E-01 +5.403124E-02 +6.452745E-02 +-2.670969E-01 +5.822561E-02 +3.033558E-01 +4.890487E-02 +-3.515557E-01 +5.069681E-02 +-2.257462E-01 +4.682933E-02 +-1.449924E-02 +1.625521E-02 +-2.809498E-01 +6.883451E-02 +1.904808E-01 +1.004755E-01 +-2.570005E-01 +4.301248E-02 +9.493600E-02 +7.708499E-02 +2.804222E-01 +4.455703E-02 +3.199914E-01 +7.435651E-02 +2.818069E-04 +7.231318E-02 +3.689494E-01 +1.349712E-01 tally 3: 0.000000E+00 0.000000E+00 @@ -903,106 +903,106 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -1.220551E+00 -3.029523E-01 -1.939259E-02 -4.050014E-04 -3.502926E-03 -8.473601E-04 -4.575201E-02 -2.544994E-03 --1.560898E-02 -2.801847E-04 --8.658638E-03 -8.241229E-04 --4.445033E-02 -1.063052E-03 -7.845580E-03 -2.558127E-04 -2.549169E-02 -8.288961E-04 --9.797138E-03 -2.713506E-04 -8.620131E-03 -8.537125E-04 --4.992993E-03 -2.206385E-04 -2.780887E-02 -3.020884E-04 --2.040716E-02 -1.760440E-04 -2.351435E-02 -2.067041E-04 -7.044751E-03 -7.297774E-05 -7.233581E-03 -1.258072E-04 -5.582777E-03 -9.135959E-05 -3.887969E-03 -4.965340E-04 --2.396743E-02 -7.407861E-04 --7.371142E-03 -1.109942E-04 --1.089834E-02 -2.188565E-04 -2.790414E-02 -2.398608E-04 --1.464849E-02 -1.014603E-04 --1.981204E-02 -2.919798E-04 -2.278000E+01 -1.042404E+02 --2.705944E-01 -4.019819E-02 -8.910115E-02 -7.598548E-02 -4.240148E-01 -6.249778E-02 --1.711683E-01 -3.365297E-02 --1.320939E-01 -4.677615E-02 --3.833055E-01 -3.838770E-02 -1.938748E-01 -8.311489E-02 -1.859290E-01 -1.653719E-02 --2.875551E-01 -7.432886E-02 -1.513934E-02 -7.854478E-02 -1.932642E-02 -1.428749E-02 -4.617741E-02 -1.844961E-02 -1.063807E-01 -3.103047E-02 -1.309557E-01 -1.198530E-02 -2.797364E-01 -2.403350E-02 --1.332777E-01 -2.277289E-02 -9.430025E-02 -5.826855E-03 --1.012356E-01 -1.537804E-02 --8.178736E-02 -4.470169E-02 --1.197123E-01 -2.596045E-02 -3.984096E-02 -1.209844E-02 -1.148842E-01 -6.772712E-03 --1.705431E-02 -3.920009E-02 --2.694201E-02 -2.653514E-02 +9.453374E-01 +1.815824E-01 +4.552571E-02 +8.689847E-04 +4.192526E-03 +6.095248E-04 +4.085060E-03 +3.488081E-04 +3.074303E-02 +3.709785E-04 +-1.949067E-02 +1.995057E-04 +-7.372260E-02 +1.709765E-03 +5.140901E-03 +6.268082E-05 +-2.589014E-02 +1.616678E-04 +-1.683116E-02 +2.122512E-04 +-1.074659E-02 +1.087471E-04 +-3.762844E-03 +3.439135E-05 +1.365793E-02 +5.255161E-05 +-5.869374E-05 +4.060049E-04 +-7.715004E-03 +3.629588E-04 +-8.240120E-03 +5.192031E-04 +1.662861E-02 +5.038262E-04 +2.845811E-03 +2.843348E-04 +1.826833E-03 +1.104947E-05 +5.596885E-04 +1.922661E-05 +1.398723E-02 +1.025178E-04 +-1.733988E-02 +1.184228E-04 +1.250057E-02 +1.447801E-04 +5.450018E-03 +3.725923E-05 +2.390947E-02 +6.837656E-04 +1.739000E+01 +6.083290E+01 +2.434171E-01 +3.049063E-02 +-1.278707E-01 +9.585267E-02 +2.597328E-01 +8.692607E-02 +2.496700E-01 +3.750933E-02 +1.309937E-01 +4.217907E-02 +-1.863241E-01 +1.738581E-02 +-1.292679E-01 +1.799004E-02 +-3.543191E-01 +3.682107E-02 +-1.904413E-01 +1.455250E-02 +-7.093238E-02 +1.473997E-02 +-1.920412E-01 +1.308864E-02 +1.566093E-01 +1.913492E-02 +2.499642E-01 +3.036874E-02 +-2.323022E-01 +3.794368E-02 +-6.361729E-02 +3.266166E-02 +4.688479E-02 +2.806712E-02 +-9.796563E-02 +1.419748E-02 +1.000847E-02 +3.233262E-02 +-7.570231E-02 +4.626536E-03 +1.489091E-01 +1.159345E-02 +-2.236285E-01 +1.480084E-02 +2.461305E-01 +1.643844E-02 +-1.773523E-02 +1.626036E-03 +6.570774E-02 +1.069893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1053,56 +1053,56 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -4.350000E+00 -3.833900E+00 -2.792800E-01 -3.102658E-02 --2.343095E-01 -3.826449E-02 -3.428573E-02 -6.437027E-03 --1.025176E-01 -1.798807E-02 --4.106130E-02 -3.786695E-03 --1.470480E-01 -8.519720E-03 -1.989035E-02 -5.067928E-03 -8.094404E-02 -3.412899E-03 --5.616421E-02 -2.709728E-03 -2.421213E-02 -3.683849E-03 -4.794858E-02 -4.392540E-03 --1.637085E-02 -5.339723E-03 --2.046073E-02 -5.231271E-03 -1.554627E-02 -4.457612E-03 --3.441131E-02 -7.049061E-03 --1.139075E-01 -7.627867E-03 --8.358967E-02 -4.023855E-03 -1.221815E-01 -5.628324E-03 --2.061337E-02 -1.926605E-03 --1.583607E-02 -1.093902E-03 --7.623859E-02 -5.519074E-03 --1.115748E-02 -3.984642E-03 -7.665232E-02 -1.111550E-02 --2.673980E-02 -7.957502E-03 +4.160000E+00 +3.501000E+00 +9.464171E-02 +8.682833E-03 +8.467800E-02 +1.402624E-02 +-1.283471E-02 +2.630439E-02 +1.859869E-01 +1.189528E-02 +-1.910311E-02 +2.907370E-03 +-2.542253E-01 +2.143851E-02 +4.021473E-02 +5.812599E-03 +-1.242140E-01 +1.017873E-02 +2.934198E-02 +2.409920E-03 +5.719767E-02 +2.211520E-03 +-3.023903E-02 +2.870625E-03 +1.092479E-01 +6.089989E-03 +-1.604743E-02 +1.110224E-02 +3.811062E-03 +5.234112E-03 +-5.446762E-02 +5.323411E-03 +-3.868978E-02 +4.949255E-03 +-1.384260E-01 +4.903532E-03 +-3.761889E-02 +2.524889E-03 +6.079772E-02 +2.328339E-03 +1.956623E-03 +4.096814E-03 +-1.716402E-03 +2.022751E-03 +-1.108600E-01 +3.227014E-03 +2.447622E-03 +4.075421E-03 +1.582493E-02 +4.847858E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1153,53 +1153,53 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -6.484000E+01 -8.416314E+02 --3.758929E-01 -3.104729E-01 --7.263839E-01 -7.809822E-01 -4.648018E-03 -2.834459E-01 --1.055002E-01 -3.040070E-02 -7.118727E-02 -7.977682E-02 -7.664673E-01 -1.821315E-01 -2.087917E-01 -4.041777E-02 -2.761598E-01 -3.014608E-01 -2.119970E-01 -2.965940E-02 --8.139971E-01 -1.653848E-01 -1.280103E-01 -4.989381E-02 -6.090725E-01 -2.822967E-01 -2.502533E-02 -1.011286E-02 --3.776030E-01 -2.846556E-01 --1.484779E-01 -1.060501E-01 -3.365875E-01 -2.827604E-02 --8.437307E-02 -9.086937E-02 -2.827425E-01 -6.353956E-02 -1.139952E-01 -1.067588E-01 -6.809505E-01 -1.329962E-01 -1.408254E-01 -3.003253E-02 --1.222838E-01 -5.353793E-02 --2.274047E-02 -3.333572E-02 --1.026245E-01 -5.889851E-02 +5.213000E+01 +5.552351E+02 +6.019876E-01 +2.938936E-01 +2.126970E-01 +3.363271E-01 +6.928646E-01 +3.077152E-01 +-2.976474E-01 +5.830705E-02 +-7.804821E-01 +3.967156E-01 +5.737502E-01 +1.090147E-01 +2.867929E-01 +1.312720E-01 +-4.735578E-01 +6.714577E-02 +6.340442E-02 +4.240623E-02 +-1.594570E-01 +1.167021E-01 +5.403124E-02 +6.452745E-02 +-2.670969E-01 +5.822561E-02 +3.033558E-01 +4.890487E-02 +-3.515557E-01 +5.069681E-02 +-2.257462E-01 +4.682933E-02 +-1.449924E-02 +1.625521E-02 +-2.809498E-01 +6.883451E-02 +1.904808E-01 +1.004755E-01 +-2.570005E-01 +4.301248E-02 +9.493600E-02 +7.708499E-02 +2.804222E-01 +4.455703E-02 +3.199914E-01 +7.435651E-02 +2.818069E-04 +7.231318E-02 +3.689494E-01 +1.349712E-01 From 9c9eb446a103f815bd30a1e0acaa7f679c6a209d Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 00:48:14 -0400 Subject: [PATCH 254/519] Cleaning up docstrings for new tally arithmetic routines in tallies.py --- .../examples/pandas-dataframes.ipynb | 42 +-- .../pythonapi/examples/post-processing.ipynb | 44 +-- .../pythonapi/examples/tally-arithmetic.ipynb | 28 +- openmc/statepoint.py | 26 +- openmc/summary.py | 2 +- openmc/tallies.py | 303 +++++++++++------- 6 files changed, 252 insertions(+), 193 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 34bb533cdc..f84e9ec1a3 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -385,7 +385,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAwOjAx\nOjMxLTA0OjAw4140mAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMDowMTozMS0wNDow\nMJIDjCQAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAwOjQ2\nOjE5LTA0OjAwwJEVeQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMDo0NjoxOS0wNDow\nMLHMrcUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -575,7 +575,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 00:01:31\n", + " Date/Time: 2015-10-03 00:46:19\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -643,20 +643,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.9000E-01 seconds\n", - " Reading cross sections = 1.2900E-01 seconds\n", - " Total time in simulation = 1.4684E+01 seconds\n", - " Time in transport only = 1.4653E+01 seconds\n", - " Time in inactive batches = 1.7680E+00 seconds\n", - " Time in active batches = 1.2916E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Total time for initialization = 3.9600E-01 seconds\n", + " Reading cross sections = 9.0000E-02 seconds\n", + " Total time in simulation = 1.2458E+01 seconds\n", + " Time in transport only = 1.2445E+01 seconds\n", + " Time in inactive batches = 1.2760E+00 seconds\n", + " Time in active batches = 1.1182E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.5286E+01 seconds\n", - " Calculation Rate (inactive) = 7070.14 neutrons/second\n", - " Calculation Rate (active) = 2903.38 neutrons/second\n", + " Total time elapsed = 1.2865E+01 seconds\n", + " Calculation Rate (inactive) = 9796.24 neutrons/second\n", + " Calculation Rate (active) = 3353.60 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1086,7 +1086,7 @@ "data": { "image/png": "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\nBPCvjMC6bD6xSh4AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1109,7 +1109,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1120,7 +1120,7 @@ "data": { "image/png": "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\nefX/AdmeWI23zkQnAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2325,7 +2325,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2336,7 +2336,7 @@ "data": { "image/png": "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\norlkyRKeP3+erVp1IWCgqI78DIFVDAuLossVo41pQ4rqwy2ZmHgjbbYuFKvqVlBVI1i3bnMajRMo\nZofbaLNF+F0sBAtI4yGNR2kSSvozMzO5Zs0aLlmyxFtp9Vr1d+p0K4HV9ATQgXrU6XoQeJ6KUpuT\nJz9T+EEoTugNG7amw5FIp7Mbw8NjvUUbe/S4g6Jib87VvO+Vty8e/WFh0QS20RPstdsT+eGHH+bZ\nfvPmzbTbI+l01qfVGsYFCxbx6aefZnh4RZrN5Vi/fjMeOnTIu/2MGTNoMPhWEn6Fwp1zG1W1OgcO\nHMLGjdvSZqtB4f6qR1Ep+B1GR1fzHmfQoH9RBNQ9x9nJ6OjqHDz4Ier1U7TnXtBmEdna1buFgIF3\n331/ntldcnIyq1evR5OpEnW6kVTVBD722JMFjvfp06dpt0dSuKNI4FM6nVH866+/Cv1fpaamagH5\ntfQ013I6b+XUqVO928yf/xLNZjtVNZ7h4bHctWuX9n/0XTDxGZs06cixY59gtWpN2Lx5F37zzTdM\nSUlhixadaTCYGB5eievWrStUUyCANB6hbTwkocWQIcNpNI7TTgbrKPzkHjdOCo1Ga5FWy0yfPkOr\ntOqpwjuPN97YgyS5ePF/tF7tRyiqurbnlCkFNzM6cuQIq1Spr13lhtFqrcpu3frmWVKbkZGhXUF7\nakMdpF7vok7XjqKrYWMCbVmhQrw3nrN//35tietSAl9RUdry3nvv56pVq7h161a63W5mZmZy8uTJ\ntFq7Myf/xU293uTN5J816wXabN00N46bJtNY3nrrXdoJdixFwPlhiuCzZzx3sly52AI/d3Z2Nleu\nXMlp06YV2nHw66+/ptOZ6HMiJ53O+oW23RVFJQdTLCvvps3Q3qaiVMxTBTctLY0HDx70xnPuvXeY\nj2EkdboF7Nbt9qu+V0kCaTyk8ZCUHCdOnGB0dDXa7T1osTQh0NXnhJRJo9FapFav9933EP0bS33P\nuLi6JMVJZOLEKbTZXLRY7HzwwVFXNUgJCU1pMEzTTtxfetu65ubo0aNUlGif9/yGQGXm5FecI+Ck\n3d6aGzdu9O63fft2tmnTnbVrt+SkSc/kuxJo69atVNUqFKu1xFV2eHis94R45coVdu9+G222GNrt\nNVizZmOePHmSnTr1pEgMbEaxuEClwdCLOt0TVJQYLl/+Zp73uh6OHDmi9WPxFMg8SoslLE/9sNx8\n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\nRCKRSCSB5/8ByMyfADZGvh4AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2363,7 +2363,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2374,7 +2374,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index cea483f9d0..b9bc809df9 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -353,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDJUMjM6NTE6MTQtMDQ6MDBw2InyAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAy\nVDIzOjUxOjE0LTA0OjAwAYUxTgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDA6Mjg6MjUtMDQ6MDB/woIeAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAwOjI4OjI1LTA0OjAwDp86ogAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -465,7 +465,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-02 23:51:14\n", + " Date/Time: 2015-10-03 00:28:25\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -601,20 +601,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.7400E-01 seconds\n", - " Reading cross sections = 1.3400E-01 seconds\n", - " Total time in simulation = 3.5996E+02 seconds\n", - " Time in transport only = 3.5984E+02 seconds\n", - " Time in inactive batches = 1.0821E+01 seconds\n", - " Time in active batches = 3.4914E+02 seconds\n", - " Time synchronizing fission bank = 1.5000E-02 seconds\n", - " Sampling source sites = 7.0000E-03 seconds\n", - " SEND/RECV source sites = 8.0000E-03 seconds\n", - " Time accumulating tallies = 3.4000E-02 seconds\n", - " Total time for finalization = 2.5500E-01 seconds\n", - " Total time elapsed = 3.6081E+02 seconds\n", - " Calculation Rate (inactive) = 4620.64 neutrons/second\n", - " Calculation Rate (active) = 1288.87 neutrons/second\n", + " Total time for initialization = 3.9300E-01 seconds\n", + " Reading cross sections = 8.4000E-02 seconds\n", + " Total time in simulation = 2.4111E+02 seconds\n", + " Time in transport only = 2.4106E+02 seconds\n", + " Time in inactive batches = 8.4970E+00 seconds\n", + " Time in active batches = 2.3262E+02 seconds\n", + " Time synchronizing fission bank = 7.0000E-03 seconds\n", + " Sampling source sites = 5.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 3.1000E-02 seconds\n", + " Total time for finalization = 1.6600E-01 seconds\n", + " Total time elapsed = 2.4169E+02 seconds\n", + " Calculation Rate (inactive) = 5884.43 neutrons/second\n", + " Calculation Rate (active) = 1934.51 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -871,7 +871,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -882,7 +882,7 @@ "data": { "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -914,7 +914,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFPNJREFUeJzt3XuMHVd9wPHvxhsXAl7sbYrjRyIbx65xHyJIMaiFMrTB\nNWnwuiA5Rmq1gKmqWg3pk9hBrbeqKE4qCq1QKrU8ukTYrQut5VTU2EkzfUitXSAOSZatH22ADXhD\ncIi3hRYbb/84Z72zd+/uzt29M/fu7PcjXd25M2dmzvHcvT+fc+bMAUmSJEmSJEmSJEmSJEmSJKkp\n7gaeAJ6MywDdwHHgNHAMWJpJvxc4AwwCW8rLpiSpSD9KCAYvAhYRgsA64H7gvTHNPcD+uLwJOAVc\nC6wBzgLXlJddSdJszfRjvRE4Afwv8H3gH4G3AduA/pimH9gel3uAg8Al4GlCQNjc1BxLkgoxU0B4\nEng9oYnoOuB2YDWwHBiOaYbjZ4CVwFBm/yFgVbMyK0kqTucM2weB+wj9BP9DaA76fk2a0fiaynTb\nJEltYqaAAPDx+AJ4P+F//cPADcB5YAXwbNz+DHBjZt/Vcd0E69atGz137twssyxJC9Y54OaiDp6n\nw/fl8f0m4K3AAeAI0BvX9wKH4/IRYCewGFgLrAdO1h7w3LlzjI6OVva1b9++lufB8lm+hVa2hVA+\nwk09hclTQ/g08IOEjuLdwAuEu4oOAbsIncc7YtqBuH4AuBzT22QkSfNAnoDwU3XWXQBumyL9H8SX\nJGkecYxAAZIkaXUWCmX55q8qlw2qX76idbTovKOxPUySlFNHRwcU+LttDUGSBBgQJEmRAUGSBBgQ\nJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJElRnoCwF3gKeIIw\nfeYPAN3AceA0cAxYWpP+DDAIbGlmZtV+urq66ejomPTq6upuddYkNWim52qvAf4BeCXwf8BfAZ8F\nfgR4DrgfuAdYBuwBNhGCxq3AKuBhYANwpea4zodQEeH57PWuZQf1rnFXVzcjI89PWr9kyTIuXrzQ\n/AxKFdLq+RAuEuZSvo4w3eZ1wNeBbUB/TNMPbI/LPcDBuM/TwFlgc1NzrHktBIPRSa96QUJSuWYK\nCBeADwJfJQSCbxOaipYDwzHNcPwMsBIYyuw/RKgpSJLaXOcM29cBv0ZoOnoB+GvgF2rSjP03byp1\nt/X19V1dTpLEuVAlqUaapqRpWtr5ZmqLuhN4E/Du+PkXgdcCPw28ETgPrAAeBTYS+hEA9sf3o8A+\n4ETNce1DqIhG+xAaTS9pXKv7EAYJAeDFMRO3AQPAQ0BvTNMLHI7LR4CdwGJgLbAeONncLGt+6Kx7\n95Gk9jVTk9HjwCeBzxPuFPoi8GfAEuAQsIvQebwjph+I6weAy8Bupm9OUmVdZqqagKT21Kq/TpuM\nKmK6JqBG1/udkKbX6iYjSdICYUCQJAEGBElSZECQJAEGBElSZECQJAEGBDWg3qOuJVWH4xCUW/0x\nB45DkMriOARJUikMCJIkwICgtlH/YXhOxSmVxz4E5VZ0H4J9C9L07EOQJJXCgCBJAgwIkqTIgCBJ\nAvIFhB8GHsu8XgDeA3QDx4HTwDFgaWafvcAZwhScW5qYX0lSQRrtrb4GeAbYDNwFPAfcD9wDLAP2\nAJuAA8CtwCrgYWADYQrOMd5lNA95l5HUWu12l9FtwFnga8A2oD+u7we2x+Ue4CBwiTDf8llCAJEk\ntbFGA8JOwo89wHJgOC4Px88AK4GhzD5DhJqCJKmNdTaQdjHwFkLzUK1R6tf3s9sn6Ovru7qcJAlJ\nkjSQFUmqvjRNSdO0tPM10hbVA/wKsDV+HgQS4DywAngU2EjoRwDYH9+PAvuAE5lj2YcwD9mHILVW\nO/UhvJ3x5iKAI0BvXO4FDmfW7yTUKNYC64GTc8umFq7Jzzjy+UZSMfJGmpcAXyH8wI/Edd3AIeAm\nQufxDuDbcdu9wLuAy8DdwOdqjmcNYR5qVQ2h3jn9/mghKrqG4MPtlJsBQWqtdmoykiRVmAFBkgQY\nECRJkQFBk3R1ddedvUxStdmprEnqdx7DVB28dipL5bBTWZJUCgOCJAkwIEiSIgOCJAkwIEiSIgOC\nJAkwIEiSIgOCJAkwIEiSIgOCJAkwIGhemjyLmjOpSXOXNyAsBT4NfBkYAF5DmDHtOHAaOBbTjNkL\nnCHMu7ylWZmVgsuE5xtNfI2MPN/SXEnzXd6A8MfAZ4FXAj9O+KHfQwgIG4BH4meATcCd8X0r8EAD\n55EktUieH+qXAa8HPh4/XwZeALYB/XFdP7A9LvcAB4FLhLmWzwKbm5NdSVJR8gSEtcA3gU8AXwT+\nHHgJsBwYjmmG42eAlcBQZv8hYFUzMitJKk5nzjSvBn4V+Hfgw4w3D40Za8idyqRtfX19V5eTJCFJ\nkhxZkaSFI01T0jQt7Xx5Jlq4AfhXQk0B4HWETuNXAG8EzgMrgEeBjYwHi/3x/SiwDziROaYT5LSx\n+TBBzlRp/V6pytphgpzzwNcInccAtwFPAQ8BvXFdL3A4Lh8BdgKLCUFkPXCySfmVJBUkT5MRwF3A\npwg/8ueAdwKLgEPALkLn8Y6YdiCuHyB0QO9m+uYkSVIbcE5lTWKTkdSe2qHJSJK0ABgQFrCuru66\nj4CQtDDZZLSANdY0NNV6m4yksthkJEkqhQFBkgQYECRJkQFBkgQYECRJkQFBkgQYECRJkQFBkgQY\nECRJkQFBkgQYECRJkQFBkgTkDwhPA18CHmN89rNu4DhwGjgGLM2k3wucAQaBLc3IqCSpWHkDwiiQ\nALcAm+O6PYSAsAF4hPG5lDcBd8b3rcADDZxHktQijfxQ1z5ydRvQH5f7ge1xuQc4CFwi1CzOMh5E\nJEltqpEawsPA54FfiuuWA8NxeTh+BlgJDGX2HQJWzS2bkqSideZM95PAN4AfIjQTDdZsH6X+jCXZ\n7ZKkNpY3IHwjvn8T+FtCE9AwcANwHlgBPBvTPAPcmNl3dVw3QV9f39XlJElIkiR/riVpAUjTlDRN\nSztfnqnYrgMWASPASwh3FP0ecBvwLeA+Qofy0vi+CThACBqrCE1NNzOxluAUmm3AKTSl+aXoKTTz\n1BCWE2oFY+k/RQgKnwcOAbsIncc7YpqBuH4AuAzsxiYjlaJz7A9mgiVLlnHx4oUW5EeaXwqLNDOw\nhtAGqlhDsOagKiu6huD4AEkSYECQJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYECQ\nJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYEBYELq6uuno6Jj0kqSsvAFhEfAY8FD83A0cB04TZk9b\nmkm7FzgDDAJbmpNNzcXIyPOEiWNqX5I0Lm9AuJswJebYr8geQkDYADwSP0OYT/nO+L4VeKCBc0iS\nWijPj/Vq4Hbgo4xP3bYN6I/L/cD2uNwDHAQuEeZZPgtsblJeJUkFyhMQPgT8NnAls245MByXh+Nn\ngJXAUCbdELBqjnmUJJVgpoBwB/Asof9gql7ImRqkbayWpHmgc4btP0FoHrodeBHQBTxIqBXcAJwH\nVhCCBsAzwI2Z/VfHdZP09fVdXU6ShCRJGs27JFVamqakaVra+Rq59/ANwG8BbwHuB74F3EfoUF4a\n3zcBBwj9BquAh4GbmVxLGB0dteJQlnCLab1/72asL/LYzTun3zdVQbxdvLB7xmeqIdQa+6vaDxwC\ndhE6j3fE9QNx/QBwGdiNTUZquc664y6WLFnGxYsXWpAfqT21anSSNYQSWUOw5qBqKLqG4BgBSRJg\nQJAkRQYESRJgQJAkRQYESRJgQJAkRQYESRJgQJAkRQaEiqk3O5ok5eFI5YqpPyp5fowadqSyND1H\nKkuSSmFAkCQBBgRJUmRAkCQBBgRJUmRAkCQBMweEFwEngFOEWdA+ENd3A8eB08AxwhSaY/YCZ4BB\nYEszMytJKk6e+1mvA75DmG7zXwjzKm8DniPMrXwPsIyJcyrfyvicyhuAKzXHdBxCQRyH4DgEVVc7\njEP4TnxfDCwCnicEhP64vh/YHpd7gIPAJcJcy2eBzU3KqySpQHkCwjWEJqNh4FHgKWB5/Ex8Xx6X\nVwJDmX2HCDUFSVKb68yR5grwKuBlwOeAN9ZsH6V+fTy7fZK+vr6ry0mSkCRJjqxI0sKRpilpmpZ2\nvkbbon4H+C7wbiABzgMrCDWHjYR+BID98f0osI/QMZ1lH0JB7EOwD0HV1eo+hOsZv4PoxcCbgMeA\nI0BvXN8LHI7LR4CdhP6GtcB64GQT8ytJKshMTUYrCJ3G18TXg8AjhKBwCNhF6DzeEdMPxPUDwGVg\nN9M3J0kt1Dnp8eBLlizj4sULLcqP1Fo+/rpibDKa+7H9bqpdtbrJSJK0QBgQJEmAAUGSFBkQJEmA\nAUGSFBkQJEmAAUGSFBkQJEmAAWHe6urqpqOjY9JLkmbLkcrzVP0RydCKkb2OVJbK4UhlSVIpDAiS\nJMCAIEmKDAiSJMCAINXorHv3VldXd6szJhUuz5zK0gJymXp3JI2MeEuvqi9PDeFGwpzJTwFPAu+J\n67uB48Bp4BjjU20C7AXOAIPAlmZlVpJUnDz/7bkhvk4BLwW+AGwH3gk8B9wP3AMsA/YAm4ADwK3A\nKuBhYANwJXNMxyHMkeMQyj+231m1WjuMQzhPCAYA/w18mfBDv40w3zLxfXtc7gEOApcI8y2fBTY3\nJ7uSpKI02qm8BrgFOAEsB4bj+uH4GWAlMJTZZ4gQQCRJbayRTuWXAp8B7gZGaraNUr+end0+QV9f\n39XlJElIkqSBrEhS9aVpSpqmpZ0vb1vUtcDfAX8PfDiuGwQSQpPSCkLH80ZCPwLA/vh+FNhHqFWM\nsQ9hjuxDsA9BC0879CF0AB8DBhgPBgBHgN643AsczqzfCSwG1gLrgZPNyKwkqTh5Is3rgH8CvsT4\nf532En7kDwE3ETqPdwDfjtvvBd5FuKn7buBzNce0hjBH1hCsIWjhKbqG4OOv5ykDggFBC087NBlJ\nkhYAA0Kbc2Y0SWXxWUZtbmTkeaZu7pCk5rGGIEkCDAiSpMiAIEkCDAhSTk6co+qzU1nKxYlzVH3W\nECRJgAFBmiObklQdNhlJc2JTkqrDGoIkCTAgSJIiA4IkCTAgtA0fYiep1exUbhM+xE5Sq+WpIXwc\nGAaeyKzrBo4Dp4FjwNLMtr3AGcKcy1uak01JUtHyBIRPAFtr1u0hBIQNwCPxM8Am4M74vhV4IOc5\nJEktlufH+p+B52vWbQP643I/sD0u9wAHgUuEeZbPApvnnEtJUuFm+7/35YRmJOL78ri8EhjKpBsC\nVs3yHJKkEjWjU3mU+r2h2e2T9PX1XV1OkoQkSZqQFUmqjjRNSdO0tPPlvYVlDfAQ8GPx8yCQAOeB\nFcCjwEbG+xL2x/ejwD7gRM3xRkdHp4shC0+4xXSqu4zmun6+HrsV52zesf2Oq9nireiF3Xo42yaj\nI0BvXO4FDmfW7wQWA2uB9cDJuWRQklSOPE1GB4E3ANcDXwN+l1ADOATsInQe74hpB+L6AcJTv3Yz\nfXOSVFGdkwYWLlmyjIsXL7QoP9LMWjXqySajGjYZtcs5iz2233vNRbs2GUmSKsaA0AL1nlskSa3m\ns4xaoP5ziwwKklrLGoIkCTAgSJIiA4IkCTAgFMpJbzRRZ93vQ1dXd6szJgGOQyhUY2ML5u+99Y5D\nmOuxryWM45zIgWyqVfQ4BO8yklruMvUCxciItUmVyyYjSRJgQJAkRQYESRJgQJDamHclqVwGBKlt\njXU2T3yNjIwYJFQI7zKS5p3JdyV5R5KaoagawlbCNJtngHsKOkfbcACaWs/mJc1dEQFhEfARQlDY\nBLwdeGUB52kb408vHXs9SrUniktbnYGCpa3OwCzkb16qcqAoc0L6KioiIGwGzhKm1rwE/CXQU8B5\nSpe/JpCWnbWSpa3OQMHSVmegiWoDxT6mCxQdHYvndQAxIMxNEQFhFWHu5TFDcd28N7kmMPaS5pv6\nNYrwfzg7sheqIgJC4b+QV65cmeJ/Nx3cccfPN+UczmomZU0OII02R01Vw66XvpG0ap4ifuVeC/QR\n+hAA9gJXgPsyac4C6wo4tyRV2Tng5lZnohGdhEyvARYDp6h4p7IkaWpvBv6DUBPY2+K8SJIkSSpa\nnoFnfxK3Pw7ckmPfPwS+HNP/DfCyzLa9Mf0gsGXu2Z9RmeVbA3wXeCy+HmhGAWZQRPl+P6Y9BTwC\n3JjZVoXrN1X51lDu9SuibGN+k9Dfl+25rcK1G1NbvjVU42+vj3A351g53pzZVvj1W0RoClpDmOqp\nXh/B7cBn4/JrgH/Lse+bGL/raX98QRjcdiqmXxP3L/IZTGWXbw3wRPOyP6Oiyrcks/9dwEfjclWu\n31TlW0N516+oskEIcEeB/2L8B7Mq1w7ql28N1fjb2wf8Rp3zNXz9ZnNx8ww82wb0x+UTwFLghhn2\nPU6I3mP7rI7LPcDBmP7puP/mWeQ7r7LLV7aiyjeS2f+lwHNxuSrXb6rylamosgH8EfDemmNV5dpB\n/fKVrcjy1btjtOHrN5uAkGfg2VRpVubYF+BdjEfJlTHdTPs0S9nlA1hLqOqlwOtmk+kGFFm+9wNf\nBd4BfCCuq9L1GytfL+M1PCjv+hVVtp74+Us1x6rKtZuqfFCdv727CE1MHyMEEZjF9ZtNQMg78Gy2\nYxzeB3wPONCEPMxG2eX7OqE6ewuh2neAic0TzVZk+d4H3AR8AvhwE/IwG2WU7y+AD8V1ZV6/Isr2\nYuBeQrNDnv3n27WbrnxV+dv7U0JgexXwDeCDs83DbB5//QwTOwxvZGIUqpdmdUxz7Qz7voPQhvYz\nMxzrmVnkO6+yy/e9+AL4ImEMx/q4XIQiyzfmAOM1oCpdvzHZ8pV5/Yoo2zpC+/LjmfRfILRfV+Ha\nTVW+zcCzVONv79nM+o8CD01zrKZfvzwDz7IdI69lvGNkun23Ak8B19cca6xjZDEhCp6jmBHWY8ou\n3/WEDiOAVxAu8lKKU1T51mf2vwt4MC5X5fpNVb4yr19RZcuq16k8369dVrZ8VfnbW5HZ/9cZb30o\n7frVG3j2y/E15iNx++PAq2fYF8KtUV+h/i1g98b0g8DPNqsQ0yizfG8DnozrvgD8XBPLMZUiyvdp\nwh0bp4DPAC/PbKvC9ZuqfG+l3OtXRNmy/pOJt51W4dplZctX9rWDYsr3SUL/yOPAYWB5ZlvZ10+S\nJEmSJEmSJEmSJEmSJEmSJEmStJD8PzxAIwQKcNCwAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1028,7 +1028,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 28, @@ -1039,7 +1039,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1090,7 +1090,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWEAAAD7CAYAAAC7dSVGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4FNXawH8z23ez6b1XEkIn9N4FkY6AXeyKHfXaxd4L\nXnsXFFCRJlKk9w4hJISEhPReN8n23Znvj+W7WNArgsjV/T3PeZ6dmVPeM3Pm3TPnvOc94MWLFy9e\nvHjx4sWLFy9evHjx4sWLFy9evHjx4sWLFy9evHjx4sWLFy9evPwpCH+1AP/P4MGD5S1btvzVYnjx\n4uV/gy3AkD+aWAuy7cySNAGBf7S83+KCUcKALMvyeSlozpw5zJkz57yUdb74O9YJ/p71+jvWCc5v\nvQRBgLPTX/IzZxD50ZPFnkV5v4ryz8jUixcvXi50VH+1ACfxKmEvXrz8I7lQlN+FIsd5ZciQIX+1\nCOecv2Od4O9Zr79jneB/r166v1qAk/wjx4S9ePHyv825GBP+8Awi33iy2LMo71f5R/aEvXjx4uVC\nUX7iXy2AFy9evPwVqM4gnIYYYBOQA2QDd/5ROS6UPwMvXrx4Oa+cpfJzAvcAmYAPcABYB+SeZzm8\nePHi5X+TszRRqz4ZANrwKN9IvErYixcvXn4f59BOOB7oBuz5I4m9StiLFy//SM6RiZoPsBi4C0+P\n+IzxKmEvXrz8I/kt5Zd5MvwXVMC3wBfAsj8qh9dO2Mufj6UF1FpQqn95zWmF0t2QNPT8y+Xlf5Zz\nYSe8/QwiDzhZ7I9FAD4HGvBM0P1hvCZqXv58lGp4oB2UZP3yWva3kL/2/Mvk5R+P8gzCaegPXAkM\nBQ6dDKP/qBxevPy5qLWg94e7u0LCOHht+alrBz4Dyf2T6DIywrn6SDMfB0PKucnLy9+Ks5yY2845\n6sR6e8Jezg9j7oOYSNi4EqZ2BYsF2qqh4xToc9tPou4lj1JqT59PW+N/Leo/w1oNW6D0nVMXnA3Q\nsu+P1sDL34yz7AmfM7xK2Mvv53Rj9rIMkv2/p+1/JbxwFHwV0Hocll0CphNQWwpBP+2pJhLBi3zN\nDxxA5mdlfnYHOH+jvG3LcMofI9sK4fDloPqRH25lIGRPA/Ox/y6vl789Z7li7pxxLpTwaOAYcBz4\n12/E6wm4gMnnoEwvfwbF/0U5fTvvl+cEAcoeAstpxnt/jlYHry+EflYo3udRvkW5sH31T6KF4Mcg\nOlFK7c9VMNSegE9nnf4PAeDAOuRja7CqHkT2y4Dgi05dcztBFQInHgFZ+u/yngG1mM5pfl7+fHRn\nEP5MzlYJK4C38CjidOAyoP2vxHsRWMOFZZHh5ce8chu4XKe/tv47mP+jT3t7y6nfPr0huyeYNv52\n/tVfgWkZhI+AZhusmQlOM8x7GsrzfxJ1GoPoRjLf/9z+vd9lYGv7xTjyf1CoEDbvwu3ahhw5EPx7\nIcsyrcXFsPk16Pg1yG7+0wxlGQ7sga2nZJdw4MLy23X5ETacLGDH747v5cLg79IT7gUUAMV41lIv\nAiacJt4deAya686yPC9/Fi4XHNoCa7/85TWnEz56HaLiTp07+AaUndwT0NoeWkZB2TIoP32P2O1u\nhZz7wEcPN/8AYT5QsRpUbujQH7SGn8QXEMggBTcSmRSeujD6ThBFcFhPX4+rHkFV3QF1sYzVX0Ki\nFUEQOPb03bhWP4esjoGA4dCwGlpbYeIwuGE6dOt5sl4b2MtsXPz+HcgWs4c6Wn93fC8XBn+XMeEo\noOxHx+Unz/08zgTg3ZPHXmPgCwXnj3p7disMuxRCfv74AKUSjL7w4kenzoX3hCWjoGQdRHaEXA28\n8jasnP3TtG3VIMtIc8fjFFsxRwUiI8H1OWAWQNoGGWmQffqe5Hj6sJc8qvnRhFy/ibBl7unr5B+C\nEJuEutgHV8OzVLunIWEmeWA7HC2tVCydD5E3QOWH8O6r4B8Ab34KRiMAtneuxlp/AC2ByMiYqPnN\nWygjY0BDX05jgeG1e7+gUSl/f/gzOdvsf08rewN48GRcgd8YjvjxJoFDhgz5n/PU/z+FLMPe56D/\nye0ODUYYdTk0n+ZjZfcW6D3Yo4j/n+jBEDQcqo5C3Ei4eT481hkOb4X1z8GwBz091tzFkL8H1Re5\nWAcnUNv2FWHMRC9qIa0nfLcbgt6CLfkwZNovihYRuYJhfMparmc0OjTQZRy8EAEj7waFzy/lTXcg\nFA1FqTyIXTxMq+U2/Ptraa1J59iCpUSOmIC4sQTSOsH93/40ra2V1M8raZ5dzQ4WkM4Q/Aj71dso\nIFBFMzcz/JcXa1ZA+Ok+DL2cKZs3b2bz5s3nNE/lmWi/XxmlOxecrRKuwONX8/+JwdMb/jEZeIYp\nAIKBMXiGLlb8PLO/4w60FyymE3DoTej1MKj0nnMpXeHbt2HUZZ7j2qNgroPF78Njb/80vbkNtuWD\nQQ2Wy0EfAhMeg7YKaPoK3twNU5+HrI9hfR3UmtBWO4lIvI1S3iRaOxN9SwHE+sBSO8QcgZq9ENbL\nk7/1GGhTobkaQ3EmV53YxZqMEiaY4xBTRkKMEw7OhJ7f/FQuyQWaBsgT0I6/msDmV3DK6xBa2uGb\nMY0O0QmYBncn4PN5oHjTM7G4aglc7JkvPnZ3Fzod7s0q5mOjlXi6/uZttOJAgxLFzz8qZQmO3gdB\nQ0Dl9wcekJcf8/NO2ZNPPnnWeaoUZ53FOeFshyP2Ayl4vAipgen8UrkmAgknw2Lg1tPE8XK+MZ0A\nSQslO0+dC4uBmtJTx4HJsOVV0C6Cwh8tsJBl5G8extW1CanzCOQN14HLCno/8I2Dke/BIAV8MRFq\nKiA5Gq4ahGBrQ7t3C0lf1VFVeRc2UY0z3A6Dr4VyJXx3D7x9MezqB80rPRNwXz0GL47DT2Vk3MLH\nEb+eCF9cBR3uhd15P62TZIbSR0CuAO1RFPVqVLXBYE3G2RIC1TYi1i6lfsw4Gt9/Cop0sPdzmOv5\nGqhmG9YenbGU7SVCTuEibkf4L69INmV0/Ek/5CR168FSAi1HzvDBeDlfKJW/P/ypcpxlehdwO7AW\njwXEx3j8ad588vr7Z5m/lz+LuJGgT4Knb4VnV0F0iqdXKMueIAie5catvaBLMjQWwtdXwID7ILIb\ngsUFU+7H6n8XukwdwjxfUE2DwnIo6INr70qUuCFlGGzfD+P6gX83mLAehVJNYtVBykZ8TL3zCF1z\n1Qi7gxEygaQ98GQzjEzCzUTco69BPeByOPQ8SnsrruRRKLXtYfVyKD0KT3SAlHTkdCvWeCv6OhsU\njoSe6XC4BVXEWPRr36K5ly8h247CR4dIVqkomt6bwNfWe/5gqvwBKORzjPJoGpNrySiIRUgJ/a+3\n8QhlzKDvLy+EjICIKeDb6Rw/OC/nCpXmr5bAw7nQ8atPhh/za8p35jkoz8u5IigC3DVQnO1RwgDB\nkdBQDcERUFEAa7+C77I8StlcD9tfhQ1Pg6BEjnwQhRREw+gC9LvfRX9gAUJiX9h8iN3Jw8m/ui8z\nrDHod5jAtxRaI/7jxMftsqM+Uk1LTwUFQTn4J8UTqpAgpAvoP4PqLHh5K408ht4uo85tpfK6bkT4\nPYLSbxDwDNzbg+am49S7nSTUlCNmaQADbPwa1L4QGo3y/k9wmuciSE7sM1PRFLyN0P5O4h57GPe7\nUxDsoYhxkdgtpZj0ZhzVB+jU/zGEjYsgpfsv71n+Vmg3CAAJCRtO9JzmbXa1gdLXOxRxIXOBOG3w\nrpj7J6PRwXuHYM0n4HJ6zqV0heOZcCILru8FGX08ChhA5wc9p+A2KTEFSOyaP4N/1TQyS+5D45EU\nbP00OMXjyKNtDOjblSHBV/NmUA0NbhuEKGDQHGyY+ZKn+TBmEZbOk1CICiiScXy/DKl8N2Qtg0Fu\noADx9dGEyW/gLPqMvIktCFF90PkNOiX/pQ+y+7beBPvUYk+XILQ3GIZDaD0YjkFdDmXfv4Ey+gZ8\ncs00pWSB5R04+jKKDuOxzdpG6VEt0sBknHMmErytjsGZ3yEcnQ4Fm05v3bDyaWgoAeAEtSTyK71l\nWwXoos/ds/Jy7rlAbNQukP8CL+eNiiKISvD8FtWg1cAlN8PXr0Cf3iDWQn4FyHZoluCmhwGwuGFz\nq4oVFSomtJg4eG1n3OZYpu7YRp/st2mwB9H6ni/Ge6bi7lhGWUkFBpeJ+0ps1EtmqtVqjhtO0Lx6\nIYFfZhJn9yNszkzC9/ki5+yivFlFjU8zwQ49rpQMLGmVKPaU4P/vQZiubCKwPh45oh4nJaiIA0mi\nNvN9NMNkjGlG3PRDuawaWrdB/yGQFoBc7mbblRlcIvdGJc9DdbAGm7s72so34chGDNooRH8dm7JV\nuJ6+nBEvrkUsr8MxsgWlNQLx2F5o3/un968yG9bPhemvcZgSMqRUDtXVcm9DKCoBRvjB3eGgtpaB\n1quEL2guEO13gYjh5byQuQMWvQUvLPQcq7Vw4GZodzuseR8UJyAkForykI9spHnApXwmJrDnOGhE\n6Kn8gceP34K9kx899+5Gb5mP0NaGUukiJLSG4/3j8D/2NaJ1ODFVS9BkLsKuTUfrZ8ZqMLBZHUTf\nMXcTKO/D/OQb2L95i8DoVOy6YsRRLugdQKOxDY0UQ2DhboRuM7DtOYLvVgmhXwW+a5XU974eo/ZG\nfDY72TsmjqHKvrjEZ1Cb70EYtRz5aCt2zQbsdh1acwz5FFHasIcUqS+uTRuoO1BCzMWN0C4FMKEd\nWkVa+/WELt6MonM8aDSwSMaEDf+dyxCSu4JKgyxDsVXCkT6NbSV6Nm86RkFwKKl6P9KqtpHgC0Mi\nQrk8GJQCYCsHXeype19eBJuWQ9d+0KnXX/DwvfyCC8Q6wquE/ylUlsA9E+DKHy2m0IaBjxY29oIZ\nH8FXq2HaB/BVT1rG3MKn4cPo7QOzwmXeEhpxSJ0JLYxH3KhGvH8ePJ+KrbkjBU92IybvANGtIs1+\nAoeT0+keko6maT/WhlSMfp/ir+nEo8IYPmE/H1ws8Yi6P76ffoy8tRX3KH+iOwahqzkOjq7Q2giN\nUN9+A+5xyYR94cIy5DbsI82El6fQUPwgDfvrCIhpjxjYhHisI0LhW1Cbh21sOM7Scgxb/VE2VPDY\n8EdondyDyoPR+PRTE5paDr39wPkt+H6IsHkHEZO+QIzvCrkfge051C4D4u5anPvn8oQqkGJjB1Dq\nibObGNHiZsSJr0nLzCI8opTkZ3dC5kLP18N1KzxWIrY6sJZBQD/Pfd75Hnx5K6T1gbiLfvFo3NJ2\nFOKA89QQvPyHC0T7XSBiePnTaaqFYZNhyMnFAy4naPwgsD9kfAQVS6FHb1j7KTz9OH66TtyLizaj\nxH3UMsVeymCpPXyQBxfHwbUdYVAPtM//QIwji6LOswkv78f3ERH4GCSCjq+Hvl8T8OKDEOYLLVoc\nRz6lX/P7DNlQQ1NQCHWdIwlPLkA/bR6yrKbt35fgExQI0nYaY32x12qIzD4Gs75B98q/aXo8FG3M\nKHyXp7DnkgAGZB1G3ViPOHAR8uCLaDXNQrAXoi0cgDI6FE58g9AuGs1BCfH7NTSLEYjuClR2C2L3\neDgwHcbcgpjSHxk3LmMxyjgFQm0iCk02y266jlur1xCb+y2M7Y/sU4lcm4vgH8DnZTO5df3l5Lw5\nnONXjMFpVTOmYg0+B57A2f5WVC1HQOGHvPZaBFM5jAiA7reDMe0Xj8bpfhWBEEQx9fy2iX86F4h1\nxIXkTMe7vdG5xnEc1CkgSTB7Mjz1ORhPzta/9QCMGQmBcRDQDhzNsP962FYGg5tBdRyTrQtHxUTS\nUeNHGcw7AsZw6FaPpFDTFj8Yo6MerAVIxo6URUSxMdwHl0nNjX73IWiCYXoXGGZBzm9EKm3DNTAM\n52gZddYw1M8vhOsS4bIVIEPhnY+QME6ilZ209OlB9K5QhLB+yG1LcIQPQ7VsPnUBJrQtzdjDFCg7\nWjHm2HANuRR7kg19gQl18hf8ULMWv0MfEyS2I8gaiTa3lEOdu6Ap3Udi7TLk9ToCLjUhSDpklw7b\ncH+snZrR56nRytXwvj+kjcPlb+ZghJV4RwihRdVIV96G5JOHct4OdiRNxV73DkXdk2iJ8eO63Xvw\nqzmKUwXV0f2JqSvFvSMQmzkZw6vvet40pQ9YGkAf9JPHZLEnoRDHolG9ef7byP8o52J7I7nHGZS3\nn7Mt71fxWkf8XbHnQsNznt8r58HQiaDRQo6nNWFtg1eeAXWE51jtD70XQJ9YOBzHKvszfBffnvQk\nJX7Rk2GdHZocoDXhFC/BpW9CU7Ia1u2A/ErEiGp2CH6E1FSRFFRKpvIl5KIdyP71yGsKkEP9EB54\nAFVwGgbDQtTKUZAaCNmR0NIMFbn4tGzCXLCJphQdYYcCsfSOpG6YneoBgUg7HsWSn49UZ2bdLcPJ\nvOYimtJisbX44TCU4LeuEnWxBIcvJc+nnCJtMpUBdrb0c7Lwcj3fjHOx+MZ08kd0o00wIVQLoLZD\nSAuSVIOqzRdtWwIcDvL8KU17EOXxnWR8n8/ylAysAQK8fw2iPYO8lASOD1NxoGE8V677llvWfY8x\n/ygtRgMvjXqWrb0fAe2dWDQjsDdIoPI5qYDrYO8rP3lMsiyjVFyFQhxy3pqGl5NcINYRXiV8ISL9\nDl+3LaVw+ENwO06T3g6Vl5+M1wzzXgGjP6z4HA5u85zvMsDjicz+Iyc+Cg0MWERdx2iiq7cz9oMm\n/J5aDzunQ+IBuETA3k7F8QEliKZOaIL0CH19oNsYXKELcaka2KDqgTb/OFbnBirqrkFOd4BChfh5\nEcLLC3FEKxFWvwPv3gZF9TjDm7GsHk1z2R0YO9qw57ei1abSEnMCteMzjPtWEvZOOYX5I3hx6LMU\nDuyBEOWD0sdEpKsOonvQUqoGZSV0vAhaCrl9+xKiXSUk5pYxsbUTV7V7mzvsg7jm8Hp6NexDlv2R\nGYi8XcI6djD6Ezp8Dnenpu9dWJXpyMbD4K4HgwGFSsHV73zCJyOn4hpgRnjzHmI73s1VO0QmW7NQ\n+9qwpY6jPCCU6uNGmpQC0WY7jJiFq7IGd2XlqZ0+9r0BtT9dQScIAgqxPzLNf6CheDkrFGcQ/kS8\nwxEXIuZWePJWMLfA6GnQww5Na8DQGaLugYJVsOsZaMyHdlN+mtZpgaKj4CuAJhG2bgUJCAkEcxOE\nRECHHuAwgaELNOph5qOn0ltakW6KR+zvALUIB2UoMSO30yINlSHKjax4C2XpBohJg+oPQRfJhgh/\nlO5A/DNLKKwIJb0on2CjkUCjGlGTA8GDIS0cadl8hCwHQnsldEmiVTsG29b9+LYdpvWAGYckETi8\nK9pp06HqcfgogNqOsTTFGghRZFGSGkWyOg7Bfz9qzQgqinYTuaeUoqsuJiV8Ngp1D1i/GMvmG8np\nm06P6gMITSngNuOOqAIpgKIXLehCoomMK0Z4aBLYuiNvehjLlSOo+KaJXQMHMKW+DZ+SXVBpRRY6\nsOfKWRTHbWfaejXur19DNgYjJJxgX1470ntUoAuA7O7JNDT7MXzfFpx19yCFp4HBB/2MGR6b4zU3\nAwKM+elaJkk6hkv6GrXy8T+9af1dOCfDEYPPoDyP19Yfl/cJMBaoBc5qWaR3Yu5CxGCEOe/DrPHw\n3ZdgmQA9O0HtF+A2QeJ9kJYFphLwiQDFya3kS3fB8nvheDHsd0HPNgiyQsjlYNOCowEufRTSu8PB\nByF+Grz5CtRVglYEawPkrUQMNoFxEtTtgHozstlA2eX9sEc5SGpORtH6FMRUQ6EL9yERW2MTCUIo\nQS4z5QMDSO0u4ULmu+tGcfWmJdDogpShsOhDhEQDLiEMZVwdQlArxvB8jDYBhmxEvmc0jYVtOG3+\nKL75CMVmN5UhOt4b+AaP1jzBzohukNoJ3ba5CI06hMYs4lqqoMqJMb+YHaFrGLDkIOK2tehsNqKK\nNXzZ7TIuy16Kok5gzYRnGEsvfLaNx2EyIfjqodAFk/9FY+QR/Ks7kZT3Blkz3KwIgilWGXVtGY7D\n0HPh8xy7bxJzNS3M6pSAougQDqeWMIeMQWFBGalle9hYblxhQgzZgjqqDFtjFwT9SedIggC6IOh6\nk+dYcnjstAFBiEGWy37ZDrz8uZyd9vsU+Ddwmu1mzqcYXs6Oho0QNOz01/QGeHclKFWwcTm8ugqG\n3w3t+kDBfWBWQ7uHTingzOWw6SNIuxQGDYcHPoXgOuTg2xHumgvrvoY3boYCAxQch8bDYCpBbm+C\nR3ogJTYiGJWIcX2Qu7TH5b8L0SqisFoxT4qgrpuKdnmxiKlzYd0mSO6E1D6fJpcaS4CG+tSBJGQf\npN3RUMSCXYiJdhIXvo6stiPbJZy7noCLw1AdrUeZWo+rXRxKXQpCph0GPQOx3dB+dAjdtb1QdBQQ\n1zfzbI/HGV61nqcCvsJ+aC/Bk96iY9kWhAFLkOQF2H0TkWr2ojJUElqoQlW1hFqHk9COXbDWJxNq\n2UtavZn3O1zFbdvdSAHBUPs1IZMEGuY7Qe8D5duQcj/FFSKjUPUBQ0+mmFbRmhOFS1uCtMeBZnAN\nQnE1nRaH89L0i+nfNZSOC41oHXbih0hYjypoCO5GRH04+rueQq6eiljyKXKNE1GnPfVMTSXgFwe2\nMs+XSOUiSH0SQTAgYz5tM5CwIKI/xw3PC3C22m8bHsdlf7EYXs6O4rkgqCHwV2xEtSd3txo1BYZP\nhO8XwF33QKcukBYC+ddD764QfT9EtoeIKBhzL1RcCi91Qb5jK/kLdpKwaQMKXRBSZTPuVxci9x+L\n2KzDuQHAB021HSEoEaHHeGQpE8sYM7K1DkPMElxpzWg/uYXuN5UjjOsGIYchuBSXRckLKY+SEmWg\nXeUKeh5dgLA2CGXvavCLx2VsQFvfiGyWkZqNSEojtS2t+PgGYDPo0NdnYDi4EaXJD+HgZdBjIkx9\nCr+p43EYPuPlB5eRezCcuxrewl5hwX35lXQ++CrUV4GuDsWYj9DpgyAQpPgK5PevQH9dP5o5QI5U\nQPJuB3KZntjWSkr8naz0rSJx/TcghyHaggjqX4bcYEawOJF3ziEALXywAFQKhK690VflIFVYEMNB\nLrQiZYh02Pgtj47Lp9i3Oz2bJIh24crsiWQuY0leey5dvRBnogm5pBhF6PdQk4faWgDuK+GiV0CW\naTmWh3T0Zvw7pkLVDmjJgoyvOd2XtZtmmniHYPvdUJkDFUcgdSiEnFzx2FQLR3ZAQgcIjfEsQ/fy\n+7lATNS8SvivRFBA3v3Qa90vnJPLshtB+NGMgEIB468CUwFs/QEOVIG/Fi5JhNKnAaWnd1W6AVQV\nyLHXYQ1TosreT/2iW/DXDkDhBoXBjaJjEkKnXmik7jB3Itz4AKz+HHpchUs7FKqmoSkyIiQdR6kO\nhuAusG8frLfhqvsem6ihtlMUt2tmIdXk4f/RVwgpXcE3B7M6CDGkiZbUYYR/vhS7VYO5ly+anABi\n1x8HjR1niIGG0TVow67BbduFRn0Xwqq34bkxCH0vxd2kIz1lK5d1j8L4US0tJjOGvb7QUgBmMwzU\nnTLzkmVEXRRoU/Fpuh99QBiBX2UgSJXIokyI0kJXcy4r+g7laIQ/SYFXo1XoENd0xbzegt0RiP15\nPeFV94L/0/D4v5H7jcA2sjOGWY1g9UH+3okrz0FL90DarTlGWmJnCJ8MhsWoroynZHUs6UcPo43S\noRgzDungPqR8E6qUTIRIN/jEwbI7QaFAqddTeTwJ//CvIGC0Z3LUbQXBYylxcqwTGYka9+0oXWHw\n7b9g01sw5SWwOmDJy9DY7HGwtO4byBgI1z0NXQbh5Qz4De23uc4Tzgde64i/ktQXQJcAzlwoHwIN\nj4Hz/8cG63C7Pv9lmqYqiAyAq8YgxxfinLcSvrXDnHlgXQ8LLoGqGtzvH0C3aClRviMxPR+P/soO\naG5ORzVIRExQISjiYf3bMPY6SC0Bv0rc26fjMF+L/mgLSrMMmffAymvAUABxao6FiXzWsycKi55E\nRUf8l3Yl8P0XEYPqQDcYxGQMu500BysI+XYFDB2I0Gs52pwRCOk2amdfg6VfDKrYSsJPVKD1z0bZ\n8yosfbfh/NeDoPejtfQbTGod7SzrCT+8CPeocMSEZJQBDmhzQ+8XoN0ssNXAkmdgxRxoKISO/ZHn\njsO1YDj6tn6o93fG0fdNmrslYBg+g6HVG1gXlc7GLYvh5usQ6tQY+kUgjkxFWGdCUOyGeyZD+z1I\nOdMo+iIMV5AROSEeucRFa88gGoYMpDUvDGHH19ChP8KApQhaHxKDa8lTTcHZUI1olFBeNRPxshjk\nkS3YhnRD7j8TItKh8DAqvZLWUh30zAffBGj3BOTcjUAA/MhCQmo8gc+Xuwh+7UPIzAHjQNifCRsW\nQF0OxPrDzKc9k65zFnsU8K9tfurl9PyGNcSQcJjT6VT4s8W4UJjzj9tZQx0EtSsh9ApQhUPT0yCo\nQN0LZAVOxzBExWQEIcRjtiYIIIgQnQapWciHy5ATklCMskDH6yDmOmTFDiwrEnE26VAP7ofSLwmT\nfSG6yu6oDDogE+oPQeUuGHoNRKihajVugwV7Uhu65e0RNkgIhVaI8gG/OFwttRzrFIfLN4AR64+i\nOVQFB+rApwrarFBfD8XHYNBoBO0eFG02ZLMb5YoKxLo6LPN3Yogfitu9ksZQLcaieMTxc0CbhdBy\nEKf6OE5DPpp+K1AG2fHdtoaQE00oBy3BlJ6Jj94Pi+SgXt8X4755UHYE1rwEcgPEd4KD70PaNFj8\nPIKjBlFjQ8g8gFrahDY1CrF+H9FrjpNaWsayi4Zw0bCrENRqBPNidNqjaIcbEBdvxOGyouw4Eymv\njKZIDSGfHUZYVIPpOT1qTQpR71TiHtAFp6sSzeCXEfJq4MAT2ILd9PpiNUpFPFLOB7gVuTiT1uAK\nb0VXkIqo7QJuO/jHIO58m5oCG+FTr4eAkaCJAHstkpyFoOuKKAXDrvkIL12D7OeHOqAcpr8D05+F\nQVOg21Co2QK5iyBiOOTuh94XgUEHB1+C6CF/caM+P5zcWeNstteYM6cLnm7o7whPZnO68vyByzm1\nf+YfwttL1ioPAAAgAElEQVQT/qsJHedRxK4YiM0CTU+ouRR23Q74IrlXeuI9f43HzMlph+AtSGIS\n7lwDqrhE2LMGLJ8jVd2Cs64eTdAujNPtCLnPQPVGoqqgIuRbWHEAyrtDlgtmHITmPZDzMZImGvtg\nN9rlNoScPEjSQooeVHboNJd373iKumEz6dT5XlSiGRI1oDDDV24wKWH299iTQpBqP6bFV4myzklj\nXyNSUjeEhmx04wZgtbbHOCCTiNXBWKOdsPEA+C1E8BuJvqoZVYMV6eh1UPk5yAngDsG99ibq1K08\nFdyd+zKuxqfDpTDwCTjRBMmDod0AGHg/6HVIISFIokRrgALJUQwOPWwQENYEYNhag1Am0mfVZp5+\n9hEa545C/uRx3AYtZksUSvFunIZQyNuPe+HVtOTlEHP7EezFWqqmRqL73oHhmAI+ysJY1ILxQAPS\nonFQXQqXfIdmhRs5KRJ1dTmSpRnlzo1otJ+hr7wNMX8FZD2EI/8DWgI7Iox5muSIDbD9HiheBnUn\nIHAqYnM1ctZceGcSKBQ0fjgL8c6FENgZrMU/bTOdL4PonpDSBdIyICoClg7zbKnk5fdzdos1FgI7\ngXZ4Njv+w77SvWPCfzUhoyH7Jqj4Bto/C8bRoOmJkBmFurwP7tgyUAFRyVCUA+rDoCvB+owbXWo7\n5MBeuFwDEFRZEK6kbfAI3MciCHF0hV43gCyjW76Itn5NNKlrCIi9ESoPwf6boU3AWWLAkbgb9So1\ncqwNZ5gDt74NlVHCvU7CVfocfWaYMW5w4lT6Is58GUXyRDix3uO4pmgLFH5DdncFe5KvxWzwp9w/\niI5tFQyZkUtKycWoNx7B+vZS9Gl61IZOqCv2Q+ZcSE6AyJ4I5WvQluxFTgzAqfBH3VqP3OcqatML\nWa3rgE3p4F+t+/AtzaDJsgWfJ1ajWvMkVOyDltfBZznisyspTw9Csvpywi+MzDtH0S84ldRVnyGH\nC0gBbSjdMr5tpThDA2mM9sen3ow+oQJqHkA9PBbH9ijq1tRh3luJdMtsfPVVBGxpojU2EOXALMS5\nqdDYAIFRuHpW4grWI0r7EOLacPTzQ6xvQf2diBg/kaZXHmZXz3fZvlFHYYUGlVrLHTcp6M029Akm\nODQPAkfAofmw4ikURl8YkAM35IMuBN22f6EZmA7Dv4Xcn3W0YnrBujZoqofAcLA1eBbtRHnHhM+I\nsxsHuOwcSeFdrHFBcPhqz4vkbIZ+m6F4Amw3Q1wsUtIGBOPzCEdMkL0M+mfhynoYe1YF+pBMzEI/\n3NnP4HubiNwWjFzcjBSSgapCAaOfg31vQlh76tTvkNsjkfRltQSvK4GJDyLveQ3rFX6UMZOE6n0I\nGY9B+UHE3Ddx+2Ugl5bQkqYks6eaI81dGKzZSkq9Bl3gi6gMwzw7bayZBVVLoVFErnews9cIFA4r\n6TXRmCccwydLh3F/K/bSBlxmLYaRRmitgDoX/OsTyLwdVFHQZxFy80xceYdQfmBm1/x/s9ZZx7X7\nFxMd0IgyU4Uj4U4ODlpHb2ElYlstvJUKjUChCpvdTt6sRLqkfgjrXsNWtIOdg8axLyYeY6CK3pZv\n6b7gKNZeN6FStLJjxCjaV9xA6JFGmtrfRGCZBvmudyBYRpqmw35MiyPIQeOdejRHZZyKaPQtjYgn\n2ijp0ZVATSG5iiRCKl3YFxXTfWIFuw/GsWR/OlPzysmM6E7AlbPo3yecpJobEPwGQt0eaDeT7Puf\nomPTfhiYDqUVENfTs4imJQek4zD9e/j0Q3jypAnqmolgHgEVeciihBwRjLjwVTA7IX0wjE6A7ndC\nYHvPcNU/gHOyWOOGMyjvI862vF/P+8/I9A/yz1TC29dDYj2Yj0PbcUi8G8rHA0rYp0PqpEXQWhGU\nBliRixyRgiu3BEVfPUKhA6eiE8quhUjaKErKYzCG5REcGI+42wGtJuTrl1OpXkWF4w0cWgXaMitJ\na+rREAfjWlH7v8dnLWu5QX8TGOOh4G3YfRgWroP5e5EDg9njnE6n1sd5TT7GFUvWkbj9B1AI0C4c\nukeAT0c4UIy8cR7ld4yE7Cqib/6BKvXDuIUGYliB7GjDNH4ofmMKEBqaIUYP0cMhbhQcngtR45D7\nP4O5dT5f5u5BmaFixp5V6OXLEL5/meb+/pSPG4OJavo3vAt3D4FYC+jAYRjGiaAc4qRwdJuroIMa\nyo6CDYjrRnE87BiZTJFPAmXKJKaY9jGiZSGSbEOuEHFF+6J6oRWaJERJQgiVcPlpqFvrh/T+TQSG\nfIWkisZ0JBVt92tRh7fHJufQ2PQ+b43y4Z1DQax8dgHduggoY30JTpoHD72EfNEE3GIxSuunkHYj\npN4OgsC+yy+n54O3wFePQnIQxPeFoQ94dqleexPkAbUqiOoPjW1QdxhqTUhGH2RdK6KuE0KkH8T2\nBz9/CCyB/s+D0vhXtuTzyjlRwrefQXlvcbbl/Sr/jL/N84Hb+cfSzX0K2tpB4yaoXgoHJoDcBqoy\n8OuA0BKH3CQjV9YjxduRDFkI6W0I+jDQuVF2PAFOLbbifOLyluESbIgl1RxMUyJr9Ai7PsOwQU3w\nu+UoawQklQ53UDsaQitRG/9No64zIYGDPQq46SBS4Q/Ib3+OXWjBHeCL4JZIVT6MIaADs11pfHnV\nFIpeXwEPzQF7HnzrhEMaGDsDOT0SJQcJO3acPUdeJHy3FWVDCfKuKxCyH0XTvxFHphbZLwh2KKAx\nBCQb2Ish/98Iu97AmdXA5JXLmCq50MU+iFCugGu3IvftjMtVRGyJiJz1GcyaDWMfRhJl2o7tJKSt\nGW3KbOh3A0yeCoMyILEzKLREl7qZMfd77ji8jm65Rzla4cvOLZ0Ql/giqy6lMGgGis7DcTaH4iqX\ncRqScVYr8XmlkYjVL6PxnYqhPJvIRgltaS2qBzrid/2NxD25gbl9c2i9600GWFoIVxsIjhiO7CjB\nltwd10N3IRQJMOQrsDWf2iZKEKDzIJjxLDSFQLcroGEelM4AU2/IVnisHo7uA0s1DJuKrHPj6NaG\nlOyP/OTrMGkWtNZA9UoIOOExd/RyZlwgviO8Y8LnAskNe66Fvl+cetF+L6YmmPsCXKPFrbkUqaQa\nVbtSsJ6AbnfCtjtw92lADg9ENgkI2wUUPsnQaRTy/leRk920GF/hi7p8ppq+pLhbHGHmkQSsXUhl\nZTXBB3bRWJ2A/3234V/0Hm2t7WnMCCblmR0I3SI5pjtBmpACm75EPnE/zs/M1I+PIqAuCM2mdVBa\nQMBHL0FqF/SjBjC7fDEvjxnDdPtBUoNEhNnz4bXbIXAGQlAH5IB8lEnd2NHjMiJJIwQLNb2XYGzU\noIzeR/OSvQR3FFHQGbauAH00FMaDbwEUfYN/eAiyQYNw53aEuc/D5Z493PxLIqkMicY/fjgV8d8S\nwkw0cgoVucvwaciFzlEINSZI6QRJo8C5E5KPQdArSOtexJaUiF/mZm6xHQWLjDz0IYRsGbVDh1Bb\nhtTUhvbZD7AoQrE+Nh6fGBnD5lCka+7GrSxB/WUd7uZFbBcc5EwaT6JJxcXbloOwD63LQuPEobhT\nBuOzdTnWN99Dc+unKPcVItx3AxxKBnXJfx65oFAguVyIaT2hPB/WLYDYzbC6H+w/jNzcAgPuQBgT\nCdZKKKhADlbBhJsgbSpOaRka8WbIvBEMSvCXIVkGneSZnBO9r/Xv4gK5Td6e8LnAbYO8r6B6yZmn\nfeA5SOsCUZfhLpdQRICsSsapicMe+Biu7tUoMiVw34b86Y2IazqjqPRHznwPwSIh7h2NrHajCB+C\nXqkhihuoXhpI87tONohDEDLCUI0LoMm9hgBnPTF17QgrlCkbGwuP96Vs/VwSJwxG3nknzR+0Upum\nofqGaPT6drB5IaR0pG3SBL5/rSsrRuRQObY7/6ox8XHqAJbM7EXVutEQqwfUEJiGQRGGOOl5bqQr\n/2Y/G2hDIyaRH/waddE2RH8d7lYH8sBjoFXD/qUw7CGoDAaVEWHQV8jTx0JII9zQGeo8rjebtFYC\n6IOR0UTwMo18ylHrbAKyTBgCwtEqU7EJX+POng9vzYb83iDOhgVTaetWjaOrDxxsBocEN85D2Pwe\nNB6D6FG0+2gfdlchrT3DaH3zDYxDOqHRC7SuVdE2/ROYvhq3vx6luY1hYjEJuhaOddaydGQfGgLV\nVE0PQtVYg+LKdxAsh/B5W4t60mQEUYLH74OFr3lsfKtW4WhupunAAYreew8+ngG5y3GtegwWHoUO\nk3HMnIotMpAj0jGykyYiu7Nxa/cjtQ9Ak/YagtgPWa5BCrCCUw+1NijSwKOD4ZZkeOw6+PRl2L0e\nmhs8bUyWoa3lnDX3vw0XiCtL75jwucDWAItCIWkQDNx0ZmklCe68HF5/D/vSHqgS3cixKkyWeKTm\nHLY03oAxOJ5e6+9DWG7AN6IWYZCA3OyHoAxBHlnByvRniXqhnETz25Tk9iT82lsIHdCeqsPvU6jP\nI7Khjfgf1Cju7Qm1/rD7a4rjLPjmiohl9fiXBSA/MIPGdz+i8rYk4jJuRGOYSumquyntFw9+QVga\nt9DN1otoezhsvQx7QAoPjbyRUdV76a4aRui+Y3B0M6bOJnzHF2KztvBN8RIMrQeYkuugSdiJvV0E\n1mQjvh+vQ3FJBv4/FECsCQq7g8MO/tFgyUO642Mk5QYU30Ug7NwJL7xHnu1iEvVfohJDcDccRVp1\nB4rCTUhqo0fJhKiR3HZUIRMQmo8gV2UhmFSg9MOllcBiQqlSwMCxUG6CjBuh5l7ch1po1WgpG5pA\n6Kc90fqvQtNoQapyIV0yCTnpCqpmjiDgsiSCLx2PsCoTl8uJ+cg+bD30FJVHoG2wER07ksB7b0E0\njYY2EyTPg+LDcOwZiL0JyqogygAdn2XLmGtIvmYSUaF1YIWD4j66HXThbu9Gai1ClaNEDvfH1NvJ\n1n6TGDX/A3RNdVgun8Th+Kvo5pqPLFegeyYOhrbBsmMwtQhi74HQOVCYC8eyIC8TTI2er7ND22HG\n7XDZ7aD73/dFcU7GhB8+g/I8rrm9E3MXLG4XZN4GqmDo/Nyvx2upAt+In6V1I08fjOvdUKTqzah9\nkhG0MyHiVjikR2oJpaUmjFU1kWiC3MRkVlFz87sMz1qOZv+bWHRd2FFUg3LecXrcG4XfhIEI/RZg\nKzvA0dKbOeo/jr6+dfjfuwO9QYvuut6wbRPSpBspODGP5Pv2I4wJprXZl/yZ3Uhr2U7m4Fk4jRHE\nOdKIeeYFVHe9g7QyDnHwNxA/BVoKYc1FtAl+vJxxE4HROgaVfUmHBRuRlAIurS8qXRfEQ8WYZsci\n2B8laNk38Oi7WE0fUC2uIHjHPhSNaejrCiDGD744Bn2ugh5JyJu+wD0tlpbwBAxv70GuNFM0V4lO\n2ZlI9ZtUkcuJ4hcIeK2OpDCQMyoQXTKGnb5w71Ksn7yLWJGNdkQvGPkEVc13Y3hqPiqLEl2QALVq\nCMlA6lOK82AF9uHdKBbjCNyWRUSXYbDhbfIevwhWnEA//Cniji2jKduCbtc2xEgnCpcTwWmneSkI\nZmj4rj2ZXSfjctUy3KQgtPl7cIZA3N2g0ELUVKQtfRA7fAgHb6GkaDLhEXY0YT6w9VOyh15GSKKM\nv/wwSsVaFPPmeKxPt5mwxlai3t+KZABpuExFv3eIDxqBzTkZ/SMKuGUI5BTCYQnuuAnq3/f4I4n/\nDBQnJ+pqK2HeaxAaCekZ0OMMfDheoJwTJXwGnkOFpzjb8n4V73DEuUChhOixULPjt+P98CA0n1yW\nLMvww1KYNQkhNhFhxzTcS6eAqgpqD3mi6G9E/tyGX8VeJpcuY1LLBjqmtyNm8YfMluKZ+MAJ7uk/\nA+ddb5DQOgFVNw32kGiaNs0mp/4h2p9wMFZ+nfdDx6NfsB6xcT+Wwx9jH3kCp+l1ghce5/CSfliE\nGAhrILTlAD711fQVZjCU60lU90d1/Uvw3HjEhCs9ChjANwmUCficyKF3aSPr1EZqY8IRpohU9Q7H\ndPcwGm6KQhhSQmBdJUGPzIJr7gNnLbrjzxFvvxKVLYJWXR7yh1WQ8BYYkmH/elhTjnDRWMQd+fit\nctMy1U311VbC760mdHUdarOREvsKMh7Jwr+kBVvfSkSfIegWmSC7COfU8UjvfIxq8EwY+wpo/ZCO\nZqNVGRC1TszpyTAsBueQUGx5tchTXoLtQYR9+QOmOy5CsXINosaPWDkA48WTKdRVUaOvJeDELjRJ\nPsgqGw5RRDquwhGiQz0tkKDOSYzzUTC67ABbjQLLY4Zj0ZWCucizp1ztRuTmAqSt18HW3cRV34/6\nyIfg3AGOIWhD/SlUrQBRQFw9BZr3wgY17tB0iib6IQhqrO260qQPwbZmMVVCIKL4CK7wMqRsC4xb\nChmXwLf7IPQesOVB4RSPu0zwKN/7XoGr7/1bKOBzxgUyHOFVwucK305gq/3tOKIK5l0Cm1bAbZOg\nvhreXAy3PAjfLUbVNw7UccjVK5HN9QipcxFv/gL3QR3OcD8kQw+0JSvpcugD3q0v4y6xkQx9CeVJ\nvfDPHYeQVUtZ/jZKNBvoEnAtWr8G9LKDWRWzqG/uCLOVqHLsKF80o36ojqVPX0zkGpnqzm3YMkRi\nlhaDPATFK7fB3BvAVAdx7aFdMqzbDLbGU3XpOBN0dsZs/5DHnDtwOuwg6hD99FRJdehNl+Popcdd\nqoDAQAgM9fjPNVciOFxoG00EWfywZOioybkbp7MJd4Ie8xUjcH2xk7buMtWdtxP8Qi4+RQYM3Yag\nv30bzjHhJL24BmNePb6X2XDnB1AulNB2ZQauVBVtwRkoXv8axeTrQRTBaUOXX4NCY0cVHoRjTwFm\ndyBSxfdo3Q40m59AZ95EWEQjsQs/w62sR4jsgCF0Pn4RDnqaswhbs4mKKUZsGU2oIgOQB4ZT8vpU\nVOlasJvwW7IVzaLnMdrrmVLVxOA6N20KH7BLsHwmfDkSoaAVl6YEuUWGKh+EVjfyNiXyhiW4d3yI\noLVCoYDsHwiHg+GeD3HMeoiYjy04/ZUcGdqfID8tyeYWsqRPaGm+BXuBFbm5C9RngyYHVBrYWgwd\nsiFhHrgbf6UhegE8XtR+b/gT8Srhc4UmCpQitJac/vqxLKj0gfW1cDwXXlsAl98KajWS3hd51xYU\nscug1Q6F9QjmAwAI/8fee8dXUeaL/++ZOb2f9N4ISQgJvfdeBEFBAbtiW7Gtupa14epid1Vce1mx\noCCggCBdeguEEpIQEtJ7L6efMzPfP7L3d+/uvXu/7lfvrnt/vl+v83rNzDMzn2dy5vmcJ8+njZyG\ntKoHdcxgWnOKCHjcCCNAjfiAqSUDuMO1hztamjHqIzjy4ACC9hj6JC/A//7deDLMqPiRBSOlpWmE\nuq5GWxeNWC/g9fnIOVyILLajim5CCZkoKU4ouAhGK9zyCtgje/u+4GFoboU9H4Lf23vMmQt2O0Jc\nDgkVeUz2xdIcO5H4zAfoq4RT5TxBW2cyT1Vez67Ji8BiA0EP0ddB8X0QnYvU3YB3xaPI6Y20LxlC\nKNWIK2wDnUsrqEm2INQE8P72PRSditaYQ2jiWKRuHZE9dbgejMDYk0DxvCSkrDiMh+MIeXU4H7se\no6McPr0eVl0Fb4zHcbYLMS4BwRmOJUHH6W2NeA1piP1yELwdaKfdClPfxVQSj+TwQGwLgiChO2hE\n7inGl+lAzpxAU2YmLbkODMZqHMEdaG4RME2TEdwBhCYr4h4Dyoa92D84TNT6ZihaCRdjUGqtCKdE\ndK+1QrkIsgi2AF0P9sOfJZF+1VYSQj6E6sH4ayPwjDcTOvgbxINfIkX2JyTAqIfeQfBnE5jTxsTq\nd3F858eU5aLO+TXql5MhCrj2ESg8CHk7e3ORaGP+59/7f2V+JjPhn4mTxv8CRD3YI6BhN1iX/mVb\nYT7cNB3sYfDoDEjJ+EvjiPY8YnYrqGHwkYx6eRjrLN1cCbSxnoDYTEeOhczf9tCzIIugUouuvQmp\nQEY8XoVgv4+SRSqJR1US3NGYtBmoJT4aI8YQ9WI5DfeNJfFMNdInnxNEjyZXwiub6bevlO6JUeji\nohCd0YhjY2DIH+DAJbA1HWYcAHsW2PvDNSvhqdvAkARTFoM9HbQBlLSxhDLq0deUoYTNRBKWYlJE\nYtuvJveh28hIKOauX3+Mmx2YxWmQ+CC0HIG4KQiyQkTcQ3iqNhAKFNM83UjMvvUE/WlYglF8HDaZ\nDmMboXEPoLEm4BvVnyTjMa6zroLDaVRP9WHxNpP0dj2uNV047xcRin8LnWFgHgHXvghvT0eMjEaN\nTaXNfBF7TxijRkwg/6Uv6DvQjIkRlJ3dxaoBkRhvW05Uy34ixVqiGr6hc9iNdBzu5JI54wnXnMd8\nwk/gRDu1S6KhSyLJnIHS/zDitiSQmxEtjYTGzMcXdgFD4jIEVz5MnkYo6ETaV4C4pQD52iFovitA\njspFKHkRUU1HlXcTofsNkm8HUstxWq+JxpNynIhPDuKr0BLmchOYOBDXgLNYL7ZjiN+E0vQaalgz\nceEp4CsAy8eQ74eUC/DRvVByHVz9cO9/A7/wX/Mz0X6/fEM/JbYoaDzwl8dCIagshfe3wqYzkOWG\n0tcBUJVW1PZbECqXEwxGIF4YgpAViRB2HVqpgJ1spZonaWIjiZszkDKvxmHoQW9NpnWmHSVSQ6jF\nhxzcy8CKZDKEJZg2roEjmxEUD7FvfYegFXGFtaCZOokmaxS1qWFQFcSVE4UUPx5do5cYh4QzEEJQ\nW0ATgIlfQ+p1cOJh2HMP7H0N9eu7UTNF1HWP9Xp06IzgSKQ7x4lVHoVfaMMpTkMQJEKBG3hwxXlu\nHfwhfxq1hRjjB3g4QqfwCZizYPBaUOuh2wOCBinxVurnGtHVuJFswzDO/JCkuDAeuvA1z7+0l1dm\n3sczz1zL0q3fMjuwleZ9/WkLs+ML1+Lc0ULXFgXnjekI0X4Qa6CgCubdD3tfALdIcPh42pLd6Iet\nQGuXkE4fY/DoCMq2q7izR5NtiuP5nS/wUH07U8KtRMW00OT8gp3qSVaNu4znrcOor6gi0FZExyQJ\nrE6kfgKqtAc54Kcl0ApSBOQuQjP2EQzFVoRXHyAQcKI2rkNOmEFLQwdCtAjpiaiuIGpLE9a2/uja\nO1DlDRika5GQID2ZSOtKIjrupHm6nmCCllCuSvCSOvwdEtpmLaGj99MRcZTuGZkExEqY8QQYukHt\ngPg4mCxB/qPw1Q29RuNf+K/5JVjjX5SD66GiACwOmHYDWJ3/3ibpIOjqNbr9W9CGRgNzFvduyx2o\ngX1gTYL2p8GzA3quR9gZQOc5DRe1MCkOoXsGc2ybeVqqJIsFXHEmB736HMztD9ui0TWeJPbEQNSk\nZoQbOhA7xoHWA4f+BGFxEJ4NsZFg9NCT6CD++/PEv3+Yj96fy0XPIJ5/59c4D7k5nxsk61wqXXGN\nhNcVQpYXDmZCvR5qtKhCOHLiOQJ96hCnGVD7XI5q/QYhdA/o4tHGQLvjKyxdVtotAWJVkbYLB7nl\nWQ33TFiLZlwXCQWTEJCIZDmdfEArzxL+XRRC1UqoVWHnNPQRcUSOlAgrqEcwBWHvO3CPGWl/DbI5\nQMH7l1A/SE/KyRayip9ENDhp+W456b+vJWj3E3zCjlBXBU160ETDNcm9PsA7noBgIs13TSDC8AT6\nIFDugcpONHPvZvD9Szk1cxBpo+041TBMxe+SmfUx6fm7kd07udQsoI++CfXEV7g/byCUk0r7DJWM\nxmmIcgVKfTSdERdxuL1w6Q3grwPPRwgZdQSTF6CUvI0iD0fctIITv8pm7koVqcgKDi1ij4uezHux\nyfcjhGIQ9HoQRIQ5T6Hod2LRPMIx736GzDhCqMqE5mAskZZUaqadwFBbR2CSGYtiwKAZg2CZDSwF\nNQS590GOBxLPw+Hfw4ZUSF0IQ17qtUn8wr/zM9F+v8yE/15Gz+9NJ7n2BXjvfjixDeQ/J9PWRYI9\nFToK/8tLVcEArTI0XYStv4NdZ1DXvQuhbYjRXhg8DPLbUL2diPd+yIyvvmK3LwFd160w/Xdwvj9E\njoexv0fMnoc0egOibgR0HoFTNTDlChgUBRtegHF3QepEXOF6Mp4thZV70SV5mF27iZNXLGHDI3PJ\n9J1CZ5dxbGjrTf04vQeifg+xvwZHfzB0ILlqMZwKoKn3oCvchNiioAQ+QqtOQjakoxVykerLMZ9t\nomH9q9zwYjQv3a5hstFLn9Ac9g7Nw0WvgcjIUPRCLs2LilCX/AnGjAJvDd2jGjGMHoEwQAtpEfDy\nxyiKRKC/i6L5ETT3c5C6yUv2Fbth/ZfQ00X4tEfRj+rAsKyHhpQ4iF0F3eNh1KMgD4BzV4LBAAY/\n8R2Xo9+xG569BoKNQCec3YVk0TN4kZmKPY2c3VyDkjYewb8WTb0f/XEBY/s0ROdMpJ4wLBEOqkbF\nkvS+C43zJKLqRU5ajLslHG1GOGj0UG+Ad0vA/DbaESvRZE5GqWqltl+Arhgzvnu/QWgPgVYBfyuV\nLWupvCIa8dvT8NE1UJWP8PmrqBVvc+bMEgYEj6KRjRhOmfG3N3N0ZBun7aOxfhgk1nCAsN0NiIMf\nhmA+6GdAIAgaI5y/BUZeA3cXw+wTKK4CAkUJ+L2LkJXT/6CB8i/AL2vC/6JIGlj6HFy6DAxm2L8W\nnl0EsX0gVwNRmVC/C8Jy/uIyVQ2B+3rwBCE0EMGXj6pkop5ohCgN6Mzw3fOoFc14y0rRZPRlbMFB\nOoc5CETHo4+aD7Pn/+f+BGbAyePw4GPgUeHEmxDWA4Z88J4nTvGjXqpBeGQ+0+L0HLx9IlbRwVVv\nH0VrdqHMqkTY0Q+h+zTKxWJEowqzVsBsqdcpMhhAeOlWxPbT0F2EIOqQg35U01W49dGEV12GYetb\n7DFO4Y9nH+Tj52KIWHc/LP2CmOo6TJtPcfieTxjAbMwUIREJXEFj9+fEivkEFtoJGEoJ962E5nUw\nKwujRKkAACAASURBVAx1XQw1ljQqF40gOaGUvt7bMe5+g673xuEaWkHc4b2I5z5FTQsh50pEVlph\nz7ew7FZwFcGYZ+F0P2i9ozfd46MToaGL0EtrCBjDMBgjEJtOwLoBSIEmEjI0nPxOxFGVRHL0F2Dp\nhLBM2PUYxGbA0Ntoq9qMY8SjiEffIXi6Bc0lH+HV3EWM3YWwKwN2PQmeVFh+EvQGKLyV0JYuOhGJ\nSBlLUqeAsHs5KAL+hAS0PTVEbqqh4OE0LC/EETH/NwidhxDiB9OV8D2+uhNYvhiGafbTeOPvxdXQ\nhdYBYfoeAm+G8LaNxZZ9PzqNATx5YLoV1G8ABbyl0LYNIuejaBWCYzMIBU+gP7kLyTYVbFWQ0vsu\nqV4v6rnTiMNH/w8PnJ8hP5N0Gz+TbgD/SpU1gj6whvcWVswYBhMXQ1Qy7NkOJ0+CXYK0Wf9+fqAN\nLv4B5NsQolsRUi0Q7kcYsITWs2VIXjfiwIUEZ4uUXD+LSDLRTQ5B1jwy8r5AimhDyNsL2nCwpfUa\nW1QVvn4eutth2Ew4sB1cByC+EPQyyAmg9IPVJxE6FNwT7mHdZYMw2VwsXL0RqbiKUHcs2txqxEA4\nSv+FiA3LEcKzIXr6v/ddkmD85TDSD7lNCIOLkIQZhNR3EP3J6PafpbVC4bHWj3jxFZmkXa/BhF9B\nZBqoIG3dSZ8Zj3OWrQQVB5rgl0QdKaSn+yiaSBuqEMQ28gjCU7eDtYX23OvJT23HbGhlQHEJ9i3T\nUZJL6HIew+ePQWOpwlxxBAQB1amCIwbL/lbUISeh4wuEsn3Q8yW0noetjZDlhLFhcP0fUbMXscca\n4uORAo6WLuK2n4HwKCzeEEkrl9KxeyWOgckIzYWgxIKuAw5tIFDXQv2kZlKKrOjmXkvgWAHeL5rp\nMtdht3UgGYugwA4GN0x7CKq2UVN2gHVzkxjU3I1hQC5OrQnr0PdQOorxdu3H22NGe7QJW76b7oR2\nIlfnQWsbtJdRlh1O1h/+hPaqRwjte47XZ02l/8ULdA1KIVVcgE7agSi5cAVKseQZIfo4uPtD62FI\nWgTaMFRzHEH/W8jit2g1D6DV/hrJdiWULIL6z0DfDAETyvIbQYlAHDoC1V2EumYa5H0ESAgxg//+\nXCj/IH6SyhpL+MEz4d+t58fK+5v8MhP+f2HLCzDvib+0PCdkQJsEpmaw/DmowXUBLjwKgU6Es0lQ\n/RQsa4IiIwVOA3viq0mZl8qsV7tpMuzD0mYke30VwqXXgb8M+eOjSI++BXnL4WItyG9DRRn0mQ2b\nn4MB02Do5fD6MkiJgDkPwoVxsPfR3rSYyWaE8WF0jJ/MJ5HNXBJ9MzVVD0JBGcKgoQTKc9CEvBB2\nAaH/o6j7P0NIuQkq9sLJ93qfQRBBHwR9OdTZIf4ZSI5E1zAM12CZe0+/RKTbw7rpO9lZe4HM6b9H\nsEUAoDocyEjo0DL2kJ+u1l/RNdpBkXEJjE7AL35A0roQQkQ8vofv4Fz9M0j+7xhRFEB3uBMWWiH6\nGNLRJtSjAo7BxxGPBwkk6NEa/CixKiFfK8ExNkQJRDRoHAqCvR1BLofFEeALh8hwaH4USUpitmk0\no7/9is6IaNpS+2BubcU77TIcxlrSf3cIGs+ANhE6vwVBRVV1VGQfIeVcN8Kx1yEyHeNVUQS+64M9\n52N8wevR5kbD/j9C32zo/C3Kc59y6N6phAd0OEY+h1J1C3oawLQHecp6miJ2k/LpWZoLZDjsQym9\ng45rpuH86BXYvZbc3WHIiV6kr//AhqkLKHdGEtfYSOSqPkjd9yIlJSNXNKMsa6Qr/U5stUkI8hZo\nP40KyAe2IH63HG2LCeHyO8C4EYxmVPkTlMk+1HZAXota+zbKWA1qeD2BDStQXS70LheBMaPR5eb8\nf0VH/9fyM9F+P5Nu/ItRsBViM2HEYsjb2pu5Kiy2N+l6pgbSkuD0IuSO/fgigpg+G4Ww5EZIyofa\n31HTmcKpAfMIx8DsU214zT1EbKtHynIiXL0IopJQX4W2/BKiLOMRssZCiQRCBmy9H5SPYNkHUHyK\n0GfLkSaPQMhbBauaoMAF1REwoT9dpha6RQ27Y2QuCa4nQm1ADS+j+wodOrUObXINvm4X3lEaAnH3\noo9Mxm6OQbJmQOqk3meVG6D5BhDehu7XQOmAxn0IkZfQtH4P1095htwOI/pZ7xPdvYbiNQ+QnTwd\npixGlDQQyIcdlyGcKMI2YCYnNu1DjvuUjCoNHbY+JPac5Xz+EtriGshZV4Fd7oHI/lAnQmtHbw6G\nmF9htPZAjx1Sh6KPmAylxwkFd6FbHUKavgClz+coXekIreEIVYUgx0H0eMg7DjExEGaF81dBWQyO\nxiYc1xSB5xbkHV+TN9qJKV8h+vhybL48bAW54JwAI0ppuDIT69HDGAxW0DbDic+gNBv3+a0YZ0r4\nXy5BO2Qyhth5MG4pnLyXsr5RxHkFhm5eDWNPoTozCBn7oO0OIR8aRLJHQmOOIuI3Mt6OK9Auy0d8\ntBlGLYbiYwiBelSioM5Iu7eFu9ftQvLIaPvaCF3iRn63A31tB7qyzwjID+PPqEQNnkcTNwRZvAPt\n4qcRTcuhexZMW4jsXQkdG1HbArj0V6Hr3IuuopFOUhDb/Ih1DromzKFlSDhZ8gysmv7/zNH1j+Nn\nsg7wUyjhWcBr9D7SB8ALf9V+DfAQvXHXPcAdwNmfQO4/D1EDpYdg5BJIHwIrFkD5GdTEIEJ0CJo+\nAzUcsSsVv7EU94uFOCUHQuc+vq8dgz9HYMnJvoizlyB0L8ZiSUQ+V4G47iJ0FcCKu/AawLuvFfXM\nfISovnDPBrglG+pUGOaBDx+CUfPwxVdjev0bhJAKY5LhjT/AqSOobU2snmei3lXC7V+9R2RDM/Ss\nI8FhRpQVDJe/TGN2COsVyzAlabD09EG4MAuh8z2ozAOtDm57HqS7Ieo9kFJgwSeQfynIEWBNod/w\nq3BrdXSM/i2Wqk8ZbC9lYeQS1p24BDXyHTRKHzTZdXC2H8x/lKZmF5W3fczYA7G07E6ma0g63Rnj\nsZpOk9maimAsg24N7CiFxEHQeAx8r0CcDWI8ENsFWjvor0U5uZ2ukbn4xwvEa4Yitm5DLEkG+1hI\nvQzSZsC530KFAA2jYdxv4Nxd0L0BFk2Fsw/AsW+QhsQwfmcn6vavqB86md0zhuBbPJzcoiqSrWV0\naqvJSuiCPLE3Sfzhs6hlJUQ6eujyzceSOZeuRYuQXr0Bbcl7tHsvcnzZInTVGsxjp4FwDm/8KHo6\ndiC2CrgHDSLV8DLC8RvQh2Wjv+dlrB2dBFcPpfvLr7EuuxbBBdr83fQkxjKg3UB2XwmCmVD9FXJ+\nBGVDTKTetBFTv5noTv+R0N5a3JfsJGCIwyLuQRISIDcDorvwua+iK7Eee0M7TRFX4jgqYyhtBlMS\nEYmJUH8c4Vg0zlnzSfFkgtn2zx5d/zh+vPb7v+m+H8SP9Y6QgD/+uTPZ9NZd6vdX55QDE4ABwDPA\nez9S5v88zaWQ9/nfLiF+zUoIS+zdDouF5/fCHctRjBJyTRIUHYAzfoQHjiL4LkHXHEtD12JWW4eT\natMx96vj6CbMR/PWI0hV55FueQIh2oLy/ffwwnMw+2EY/3sc03NRI58Hdx4Ea8CWA9GpcOgixNaA\n/wE0GwrwSRLKkkjosxWVx1EHfEh+51oCmjoWbDuFLdxOq+qgdbtKoNoMdSrqqzcSOLQS7VgzhjVO\n9J0FaMZNQ65uBqUHHN/CxoGwpgHyzoGrFQpuQgnWE8hNIBRhgiP3EKy6E0uEh5DjQcTO91EVH10j\nctC8ex7hkzNoxlWgGjSQPZyusosMfuhqIjJH0O+S28nUT6C8q5WITTtxr4tESc1EzUmBOSIMLexN\nkZnUB2wpYL8Lsi/AufFwyQiUa9LRO59CmPUYjJ4FfRbAoi2QPRvagvD2r2H5d6BVoc9A+HwZPTU7\nCIiJoLsVThRAgx8q41GP7EOelUP86DFcXuhiwdY8PJn17M8cR2xhFKJehdkvgqKFfC/uVD2aOhln\ncRLGa64k/OvFaCI/Q2ldy6mMURwyZJHuL4RAE0qPHu03H2HLr0MX04mzrQFv5yqY/TjUl4EoIYWH\nox+YjajT0LoqD/myBwk+9Sk7rprI0AtVCG+cQDh0Ebrs6Mq7CS83UZOV0Pv+BYqQdAHsZddj2Gan\nh7F41RfBmQYuFeGUxCnN5Ui+MJK/O4G9vRxxaghx3tPgaoMYGeYmwgs3/f9LAcOP9Y74IbrvB/Fj\nlfAIoAyoBILAl8Bfm/CPAF1/3j4GJPxImf/zRPWF45/AC4Oho+Y/t8fnQN25f9/X6qHxHELqNGrv\nSEPt8yzsOkTgchumEzuwraol5qMyFn25g/SLJ6E6Cu4ZBQMHQngkVK9FM3sqweUPobbug4YTGFZe\ngyXVhpQ0A/S5kDcfhmSC3QwfnYV7yqDvSyg3Z9P49lAY4Ie4yxB2yWCZTN+q49zT8DGD5o9EHDYP\n18gYpDgTnhoth1dMoP1uB05DC1KfMHx1sVDkRrB/jXqhGoZfBns6oa8XRglQtxoeS0Bd9TWhTjdB\n9xcoVZ/hBw46J6Cvj6REP46i+NV0K5N4P+cempZ/jqDVIETKoPmCwPJh1Lz/FEPGS0i+M7TFPEli\ncx3tE3rQjZ2CcayEvzAMr6YAb9l4lC2psF4BTR4kfwgZr+Gq6KHm4+dQZw9FjfKgiumAQJtvJ6p+\nLogSJA8Dx2DoscCsBTCuGQ4th9ptyDoXex4Op/jMXainT4FVDxYz/pULkS9NhhMvotYcQsg9yQDr\nVOZY3uVV8XLKXSMgciF4+6EM0aGObqd1eTL+NVtpbz2FJk4C950cTRrNhcSFTBWHMajfO6hiBZ41\n/QjNnocyw48/IQpr+Lvo6yN7Q8P9zdBeDfWboDUfy1A7zl9NJfDESOreWUK/8/lorliO8s7LqNOs\nqKoVIXko0W0mYr/ZAGf2IohBxLWDEOq16M0d2NY0ITe9hrd1A2rtAXwJpfSrH0VPZGzvd1lQB0U2\n+H4bVFai6uZAWSGk5fzn9/x/Oz8uWOOH6L4fxI9VwvH0lnv+N2r/fOxvcTOw9UfK/Mcw/yWU9ja8\nz0/Gvfejv2zT6nt9hVsqevc9naiVB2HerdiPWXD5v4OJmbQvHIzfnkJIDtA1IhX9uX1QVgMNJahN\nRQSVW/FPOkrnrmJafrcJOqpRa/zw1R/o9Icj5jbAG06UnmbUrbEw+gwMSQerCUp2g9eGyZtL5OFC\nBF04rmm/50BaBr5yCev4Z+H4daC1o9R8hitRh/2+mfhLmjDk2xF0EZi7Owj2acfnbkOtT0JofBVx\nUBGd9jjUJ/ZC892w0wjOTbAwAEvnIhmup2fVDKrW1CPJWsaKMqbwdPq1uynjEPkdDip7LLQ6VDAH\nUD/QQLVIWZ2OQYMGIOQp2I+PRvIqqBEXiSEDnxBEEgox3vEi2gFZ6EIaxPIClBg/qj6IqsvgwooV\n7Bs6BkemiDJhH2KLlkqfgWe6kvmTICDoxoOnB165EwqPwuMfg6ERSt3QfgT6CjguWU3aliCudCft\nCSZkP6hzbyJo2IgaykMdFoLZfjSVPgw12dBRw/2b3uMVdQnyc3fBXW8QCgvHlK5QM+W3bHkqC+MD\n8/A1b+cEpzjt6EOEL8RchuMt201baR+6RrZS5Uml2HwLZf5UDqjvscteymbzIcpHxcDXc+Cd+cgX\nusDQjWbPy+h+t52StngqDzshbgCqegZMDTDDCpcsRph7J7ZP34AHJkOFG25ZDmdFiP0DosmJZVcr\nhoqzqP4jGC76SWypo9mkhVAJxEVClQKbT6F2ZSHI34JhGNzxyj96hP3zMfwdn//M36v7/iY/dlXk\n70kAPBlYCoz9kTL/MSQMQHymFOWxNKTddxCquhtN7BSY/EVvvtby49BWDZGp8MIgZKNId9XD2PMa\naLdEoJfjQBtF5fT+dNOKbKgld1QTtgM9qLMklNFOFEeQwDOdyPUdhE1yIjU2EOx0oLvFQeidKsRu\nP5SBSyqj6xoFVaOBGU0QvAaNrS9aWxhaQz714gT0mkI+4i1mZU3GW78MY59P4M1XYfxLeNrfoGWi\nA21oKtEf70O5bTP2P8iIkhad8zF8Q/NoiztGuFZBtRTi3XAl5ier0OZOhIoDsPW3KEO9hNiBN2En\nzqwQ0X4NwkEnmqeDhCamoz9+mtb3tjOiT4h7YqeS9tggMLVDtYo310TYlEoiB+WB0Y504GuiXv8G\n1bWOfmOX4tZUYLQNho5ShKooxMp8uO1xRPFtCNYTqPqajgPfknbffVgnxRDM+CNSnYXfO9qoUvS8\n6v0evjgOxdVwyzOQPgD+eAVUngBJC1GpMO4GaL6SviVpqKPX4u7MYccrk7lo8XNjixvdJgeBIZ1o\nm3WIYWlQtwgqM3Fkl/LgytfYPWoUM86/huaSdmgbxJBV68i1mxEnGPFv0LP/+WF0Gkw02mrwnlxG\nrL8SOTyeWKWJqOOlkHeOE+NyyRUziPNuQmsuwSb7oecCSsZUmhxFRA/dhubAa7Rue5QPFv2Gm154\nF2XTOhi+A2QnQnk2qE+B6QG4712o3wbfv4e8dDeq+WvU4g1onR5oFlCDfkIWAbVag3L2baKMPtSE\nDISUVtjthJvvQt33PmKzDPEXIfQ3lt7+N/PjDHM/WfLzH6uE64DE/7CfSO8vwl8zAHif3vWTjr91\ns//oJzxp0iQmTZr0I7v3d/AfQ43/TFBbw8kVN5O+txHHkc24g2VY99+MWFsE3pre4p4Fm6CjCsmt\nwxCaSN0NRnR+maDnBNqyMJSqOsaeb0Qe0Il6JAAtKtqZfmqOm3GsqcFg0aLpLyBNWow6dh7iE1MJ\nHm9GlEX8DSPRlpdgPqciHk4HUUATVYv+umO4dzcRCvWgJkmIaS7cQyQWyhsIP78Fz6BWrNeMR2Ma\ni/DqA0SlmgnrjEWTdgUcvJ+kJQHkzRJS4nCCRafZn5TEyBd3cfKmMAb2ayNitRXZXIhWsaCmjKb6\nhjlItauJ7ASrmozgdaOGpaGGFWL6/cPs3vgOGclR3PxIDom2QaS3RaMLNUDSdSiLS1CteThPS/Dr\n+XDT1RBpRj9ZATUBoXAdRnMLwcZqtIfrEZvdKJclIlmPw/l0gh1BTi9bRM4bGzEpPaiF21CCFh4a\nvIIlnnrGfnsVxtpy8I6AFbuh+Qi8NR5qy6HffGhsgptWQagYWoII5XkIK2Zi1Rrol99MVMpKtvlG\nMWnUAez6CCiPR829FzIuRTgxFGQ3KdNqODjhFop76smyBxCq26CrHq0sQpiH87deQ3RPHMsW/YGg\nVYepfxeSO0DQloI3WmHrDSOQ7DlcznA01KI/NhViZhDIXUowN45GcT7Bxiq6o63Yxt6Afe0s3j/j\n5+WZc5i96beIrT4Qx8CsZ0AeBc3nUU+ugvpK/BlG2sLz0HX68Q4xEd3uo/yK24hv+Qjrag9KSEDS\nG6m/NgVzywV0gUbUoUkI4XnIbh2SbhyqdBrWrYDrXwSTCUH78wtv3rt3L3v37v1pb/rfaL+9J2Fv\n/n979Q/Vff9XfqwjoIbeAt1TgXrgOL0L1MX/4ZwkYA9wLXD0v7nXP7ayhqrC/jWw5xOoLoIlj0NC\nFkQm9uZf0GhpUM+zjWe5uuMLdAVX4jnfRXd5NQ6nGWNCHNSegebK3oCGvhNQEwahNL+GUKGhc3IY\nHcM1nNEOYEz1eZzbu9F90o2aFaC93o7B6ccYDCIGQwg39gf3RdQmFdw2XLu9qDE2LJmXI659E9Vm\nRLhvMYTaoPkCZMsQ7oGULRQrdeyPCDGz+R2S7C8g2/S4z9yK7dlzvYUvESE7klBsFkJkAkHdN2gz\nrDTc2Ibz5c+xTI5iefAIt930OLYbHZjT4lF2nEfo8VMzOZl14+4jWxrMdE8QbctLsC8MSIQ52agH\nHyE4bjQfdg6iq7CTm77/jAhLN6LPRyAyE/2ke2ipWQkR5UT4RiOcaYQGAdLaURMGIGS6UMvLqIiO\nx769nvAmAeWhh1A0O9FsPkSoOkD+JpV+94K1ORK6u5EtAV658QlGiwsYv/IJyD4DmnpIGwWJjWA8\nD/udEL4Ctq6AwXMh5IWa3SBE4tMVog7vi+pxoahm2lPasHZ4EAMqrY4EwhIsiJouvFYNNLTSddrC\nhbgceqIiCBptLGosxPjWKbgpG7oPUpW8gO9aorjx5o9RUpIx3b4YLj4NsVdSXx5k/xQDI8Nnkdr3\nBlRVRW06hfjVDZBlgxFvoVS9hdu0D7nHi6X/Hr6/uJYJ+99Co09gc1kcl874FjHPiJr4G0RrOJza\nDN79ECGiGnpoGe8gaE0i5uB1qPGPQ5sZnKnIJi/6nU4w6eDXuyjquZ6stT6w7SUUHqQzzIB+pwdL\n/4dQTpYjNH1MKK8/2hdfRxo+/GdvpPtJKmuc+DvkDeOv5f0Q3feD+LGecgpQCnwO3A18CnwN3A4M\nA04CrwCDgfHAr+hdF37/v7jXPzZiThAguT9EJoPPBelDoa4UTu+GvZ/Dwa9wV+2jPVwgfk8EBq8L\nrVKDyRCDp72NVo0Jm18L9gSQqyC+AqGlCcXiQBk9FlN7AE1SAy7tnYR1DaRHX4k3MoBHltAnm7Cd\n6cA9MZnKX0djK65BqPAgOq0IMQZ68juxxXcjes6CNRKuvgPh8kfAcAFc5TD9RdAsg7oanNmzGa7J\noimwg0g5Esmbhnz2S/SOKQi1VSgx4YTuMqLKCs3DyvDHGjFLfbGkdSAfWoW26k8MbM8jOCuSyCgD\nwsVS1JG3EywqRanUMHLsFHI045C6W6CqDOatgp4SSBiD0NmBZOzLsLzDDCk6hLm1DdEksfSxL4m0\nDiAx/y2UwAVsxSak7iAhdxVC6kCEbVV4F9xAV5YdU0UBzh0dKDECpVuDtB93Y8o4grg/gaaGVvrM\n1WNK6AcjJBp7ErhzwZvcfD7EsL6jYf2vwOaGaAPkKyhnXQiNMTD4eVj3NEQlQcoAiOrqDe2dM4qA\nWo4nx8DxrFTKMh1Y6jx4+jvRVKWxr/9w9lvSCLlj8Zj1tAX0iH1tDHBaGVy4m9iUvvzB8QDZ327E\n0p1LW3MnGwYNZ0apwvrnxjD4xi/ROoOE4iL4fsxsKgbFc+lLe4morIHYNoTC52h47SvExkIYcgNS\n5hKEuhJClSWEwhMQ7N9zQrAzqKAahFZOBZMZsKsEZA3CwZMItjqYFgOZM1A9e0ALQsICZE83YuUG\ngg6JBWPW0ifsIDHJ+9A2lIAhAOWv02UqxGzoRpOYS2O/aVjXncRa68I98jzigLmIrS60jgLEwoPQ\npx9EZfROVIJ1IFp/dpFzP0nE3DJ6rWI/4PO7d/hreX9L9/3d/Jz+sj/LGnN7lLeY0nEZtNSgNh6D\nfR8i9B2Bd8JSjGseh1QL6DrBdRzUCNTTbahKAAIy3psSuJg7Fm++lhGFOagx3+D+7iyebCtKspWI\nlh6o6CYoSpTcnEzG490Yc26j9dO1RGpLQA4g14DQtx/CM9cjen4L9SNgXwvUN8PqcxCTAsBZ92P0\nb5VQksbRpdyMqcWHrjuAFHChGATELTpUnx/0RgSnHzUynM7DLgyyG03OIN4ecgn3nvsjhBIg5Wno\nMwS2rodpCyEhFRUF4eAzcPgjiJoAjnzQtkJZAgx9GPY8hievHhYPRTPvHBtN7zJq29NoQq1EnmhH\ncqr4+s7Fb/LgqIpF/eILfPfbMHzZAtNtBC+YEIoaOXMqiqTX2il9CPrffgmOm16C/GdQdB1sbzQx\n9vhWbOYYsFpA9kDnRdSRIl5tHEy4EVN9BoGNjxOYlIQ2yomORITqTvx+NxVT76b25IuY0syY6+zE\nRSdQUbyLwtRk1MgYvIYcipUOQrKOy7UqEwPz0DXdiBD1BaHmMSgRdr6XcllfO4fX37qPj26/k6uE\narTdG3AdjqVr4eNUNB8lP0aDzRPiaPJwLH4vCzdtZVq5AenBPyEfuZmLN65BSBtL+ju/QajcSqdU\njEHTjhpvI9TVgeWtGujuoSw8jT7eMgQzMD4eoUiEpP4Qq0WNKYaCGuTN/RFGVuIp7kBjjcH3XDdb\nQ4vZX3EdL53diW3qTajtq6gwf4muRsVqbEdDOuZP8iBKRInuS8fldYgaJ471EoKvA26thPpbwX0A\n4t8Ex8J/5hD8L/lJZsIFf4e8XH6svL/JzyRmBPhn5o7o6oDTR3trvkXEgL03PaWqylQIO0jUVyJG\nzoKyPMidBXI9mo339tbwmpAC/jOg9yGERMh6mUD/HYhaFanRTdTZAoLxnZiDe9EeFtEXdmNZaMF8\naCjS8SKEIoWAy4jUHKBrtAHj6W5CmDBd1wLJ8QiR4xEffRqxbw/E3ws+H5y8gKrphInTkF0rCTU/\nhE5/CkFzDEGvR1F60JTJqIEBhJKiEesChAbNQcjQQ+pKKj7ZgWd7G9QG0HVHos8cT4PNjCVrBfbw\nw+DLgIMboPoLKN0P1WdQD71Cm+cCBtmC0LcI9gFxHSApkL8Jwu1onjyC59WdiNbRZMeV4W8pJ3zI\ns/idG9BoJGjooCdTg2tgG1a7Gc07zSgLbbROScQ6/QSSvobwx1fj7XwX+ZSKuyEZ/fgsNIOvInTu\nNOqgwzhbBXTJl8M1H8HIpdBpxj2yBG9uN1bj5wjhowgNn4k/Ppkuu4MSewed3x7n1MI0TGIXmdv3\nkJyymMijX3GqfzYl4UaM7XYmxg5hAJHEeRsIrz1HZtjNxIiphLoeQjy4Hyn1bTT2FeAbT8aLj3J0\n0SRacqex12LkgphBSXQEh6M9KFIn008cYLivDItZx3xjOCPL6xDDpsAntyHOuQNjWB2SLZP2D97A\nduenXHQ0EF1/kJC9EX3XdQhKJYJfwpuqYE12I8brENRL4abVsPtJ8FQgpL6AcK4TIb0WoaUR4aiA\nRu9FmB5DX9ttJHnepyXvIoVREn3qnqAiLoGuVDMpVQL61hroUVFj+iBMWY0u+gY0DccQqi8i1Iwx\ntgAAIABJREFUGHQI2v2gEyB6OTgu/+eMyf8LP8lM+B5++Ez4TX6svL/JL2HL0FuNdvt6+OYTOHMM\nNBpUVUYVyuFGG+qhY4QcXyKdv4g8MxORMsT5CpyqhuYasAlQq8DqAELqXegXx6AMrkfxWhAsHjRq\nEKm9Cy744YIH3pQh9jToU1HHO5AfthGn/4QapZYLdVeSZiyHdpHAzIFI2g4EfTNS9DI4sx02bIE3\nttHe9QRazVUYa4xovAnouxcjFL6APr4SX5oLbXEFksaAEPsmatPtCGILknCco2vvp/VYC8EOGL/x\nN5i7voaOWmac7MJTsAjqG2FOG1x9GMqyYMc90NWNGOqDNW8L7gwVs88D3RJq82Sk1n2gk2HgdQhh\nSZgfeIr20aOxPfk4MSPcKMs3IGUIyENkvAeChPvPUZcbRm1IRvtgX3QWLeaNFyHpRZBl6j9ciuPa\ncM5dP5FxI/ZQ+fQyUqRGSl/JwuizYNaWo7a8Q1FlOFnfvYeaWYcq67FV34iY3puzwtcTpNB/nqDc\nQ9auVmKeKyLbuARZ5yF0pAOx8i2E78vIfuhZMgQzYV9toodkqriOVKObDEsd4epzqKEmgkIXqvUE\nXsObGC9eoM8La0meaSR24K8ZIvSgP/0NTvtQPk9rZmjdBabX78Nq8ILZx0L/ZXRqTHiUPAzZTiT3\naFjxIaa4M5ja9tGti6Bicg71u+6gn+zGELEWNboA4Ts3gsVPRHgHakAA7ePg+xJ2TYTFqbCsGbY8\nCPM9CI0yLnsfDI8IqEdkdPdEY+y/nOExYai6k7gaTrI3azySNZbE3dVIb/pQrtZArhn/EA3GpCG9\n8Qi+CaA9BjFRkLcHFhaC/f8p9uBfh//h2nE/lF+WI/4jrp7epDwmM5Q+Ds657BO2MOasg9DRfRgj\nBoM7CE2bYMHjcPIVGJULe/fCmnpo06I+nUPDkvk4N76KrmICrbeUY95/gRJHLoNOBRC2n0EYr0Jk\nH4TuscgnN9LzjBf7dzEImia8VT5a4pOpmTKaQKiOnP3FmMYPxei/FT54HEZcQCyzE4wxUniHlajT\nLmLymmn/UIP+9iDWJgs9d16KvsCDLvVRVH0C6pbrUJOm0Na8kWNPljH85laMiTbskTMg9XKwfgDB\nU3zc8zuWnDyDLrQdoakHJXw0XlM/ggU7UOoF9KYKfNMlmnbqSDcqaEaMRCo7CrIWahshqy/q1Zvw\nrvoG/2cf4nxRAlcrqsFMcMoiAn4dlloJVc2lIOV5Ug9dxBqzFHQeMN8IW+4gGHmer6MWkdC3mUF5\nHow7mmnI9NNo02JvjUaaGcHBMCODy7z0Ky5GaDuPGqPBtSMMxqRhW3w9bk88nDmE2a+DtS9CXhDu\nvB+mRcGxp/BXxeJaX4us1WL/ZDulo44D63HgIUgPkWW5WCz3otqdKGfmIie1EDomoNmXgO+Bfui6\ny2nvP5L9GJmFHQ/R2LetwRjuRzw1A27+DdQsBZcefCeQjzTRHa3B4DJgKE1HqDgBD7wJ2ijcm1+n\ncPcpBuYE0MZqIDmE2NoDGnCHTPT4bcS4FQgLwqgwiK+ApqVw91dw/ShUxym6D2mxL30Qiv+IGrcS\n5Z5FcBu4+kNTdDg6x2Ws9i6mO17ibv1ATDuHYK8rJpCehKH+VhhSBCePwSUbwd8CZV+BzgHDVvxz\nx+N/w0+yHFH9d8hL4sfK+5v8MhP+NyoPQ2QG1J6Gi3uhdjN0r0C34Aa80QM5FhdN5rjxJB14Ha74\nGHY8Dx4RTuyHvVWQOgxlWC3+xDqclc10ZsXhGiiSfL4MjAFatHpUTT2CRgudXgSxA7TfIbn8hEpS\nIaeICvNALprDKQ1L5ap3t2G2hNPT6qA0rgmneA+xV3nQekMohh60bQFSP/XgjRFQmpPQJ1RjaAlA\nhwbp5FYUtw0chQj9ByIbp1M49wG8ybEMebI/+osnUUMSwXQH2uSFoExCrvuc8ZveQ9NUSGdHOsaF\nQfz5Ckb7CUxxLgRnA/hC6Cds5UDyx8hLt5MbUQwzn4SESaB1gHQS/A+g3j8D7XQNckcbktuHMO59\ndLp4/J7PoeAgQtFbGH93PY05rWhO5aEbdBmivZn9IwbTXJXNXNsaNG0BtOcG07nicbyBQwzanEBz\nZhbbatdhsbuIeeNbmu40YfoYjEIMhlQTGoMIeRsxh/aBToWIOSAH4IqJELWHQMUZulfrkQako/1y\nEL6cRkqNt6IniljuxdQ2jAbnPhosa0jfPRdh7jHQqGjfikJqCOF9Kw3/gRDB8X8ij3PMYDZWZExq\nDbK6AbUc0G+FI+NA1wKb+4K3P5KtCUdzJ55JmcjdR5BTneg+XAErTyAP/JwBSz6n9tevEp3ehfl4\nFwRrUG1u9LVeyjVpxGSfA7cFNrshYSqk7YWvR4H3Fmo3nSdq3l5o2AiFrQjlVyEuDNCZrqdocl8y\n1pQTXlzFo+aX6YiJ45URx8kIX8b8d+7Fcl0T1C6H3Ta46pHeWoIAUZOg9b/3z/pfwc9E+/2yJtxR\nA+tug80PQMsFsERC/3lgEcF7lpakaBxHC0k3mzjQU4F9/ttY7Umw/l64/BX44h3okAjl/h/23jtK\nqjLr9/8851ROnXNONN0N3eScM4iMoDgGHPMYRscxj2FUUDGPo5gDKmYQQQQkSM40qYGGbjrnWB2q\nunLVOfePnnXn/f3W6yzfq87MXd7PWuePOutZaz/dp/auffbZ57t19C6JxlrVjgYPrlQbusbTmDq6\n0HTIdIRHoAuZsG7rRmRq4aF2OL4Ll9FInV3i7EV3sjktnW8Hz2ZKyERh3Unk0bkY954jrqeLwMWL\nKMkYT6siMHc7MGj0GOwG5NTR9GYH0e70YKjyIjR5hBpbCMWo6Gra8W5aScvXG4keE4duhIFWEcI/\nRINB46E+vQWr24vWOgflXB047Xw0ZQrGCTeQPu4RDEMOohl7P8JaiDi+ARGtIJfVEjf7JS4UVZPx\nbQlSyoX+1rm0eai6NNx6F6L7IUy6NqQWPzinwcfPQfpslsnpHDWlUTR9GQ5bGenFLson9xGSO3j1\nsEBqc7HYcRZNnwmSQngtY2kxfk/WqjOoF3rYcc9gRkbkkfXs5+ieSSSsdBzaJd+gIYSmcC7iQF2/\n9rFdBV8KROeBpoagLoPe5/bjdJgJvmIkeFkK3Wkt2LVJpLeaSTKtQScNR3T3EXz/MZqmdmJrD6Kv\nq0KsPE3wN9MJVPdQHRtPmGMfrQNOIIkJ5IrR4F+NLA1Gu6UY4Q6ipp1C3fshpEYhLv0Ydf7FqGfe\nRgoo6DRRiM5uGmdb6BsxDOX9RxBiCJbaIGHOw7R8Vo6wmTFMugxRcYT2+Wkc1o1ksKUC0eAGUxzs\nOwNtsVCfhBpzAEIbMU36AOzHQCoFyU0gWdA0No7UQx2E14xCEWl4bkqH1FLmnNAx8LOXINqEbHEj\n5U1AJLX3Z76ps/pHdAGYEv71vvg/4GepCT/Ij68Jv8BPtfeD/GrLEUpXF95PP0E5+Cla+SQEZUK2\n0YScNhTZCiKApWArZwdlENvsI2HOB7SkjOQetZu37U5sj+RC0iw4coTACAXXwjTC2k5DzhqUk1fT\nNSOWiFUN7LhpGqagEW2fTLUtlqtmfgB/vBIuvQoevAp7UCU4xMi2CQupzhnGKIfErM33Ihss4IqD\nA+3wp9chfTjoIvEXX0ens5fYC3vQZMwErZ66llKMPUFih0+C75sInNuHagvQJ3IpTzRgn5RFTEsj\n6ZXnCfP00pEehabUT/iSXs6nDSLYPZzIyPkkxczlMXGImWeOMitpHoSuATmVssZbGbh6HvSmQF8I\n4jupkJKI1muI+O1DcGYpinkAQf0ZfFOWYjqwAdm2BSpiYH4p7LkPUtdCUGJj8GmeyryG4dr9vBwq\norJrLg1hEfTuXMTlgaegNwd1TCIh7VaammzE26PxpSdTmtRFolVPVHEIZXo6JvEnNOc8kD8Omo/A\npuUgYqDlMAyVIXIUisNKaOs7hJo8SK0K3neS8IZ5qTAMpFGN55IPK9BnDYF5K0D7977YJbNxxBym\nb9ZQEj8oR703iC//jxguewYGRtOzdBnCeDsG6RY0QSdqqBiNpQRevRpVG4E67RiSeoSQU4fiSQdv\nB21mHZrGIHH8BiLc+O1OGpPLaB9rxdimJ8owA2tPBMaqzfh907HOvR/2vYtbf5LQ1rXoqgPoFA/C\nqoKIhrSBqNUHUaIEJMlI0QHUJBuqbSyibjPoBFJwDpR/hxqcRs99NvzycaI5jByMgWMfE6q7ESVT\nRlOjwsCHEIMeA0n3L/O/n8rPUY5Q7D9+sRTFT7X3g/yHJOT/WlSXC8977+HftQs56Ee9egVS6W60\nO/agb29BGp6KKHKC34PJEktgYCdItcQxgjtD37G0W2G5XY+ufguO6WkE5w8nAiOhVEF76jMYXXrC\nPvLQXRtOpSmNma27SGj3UBucANlaGNAF9mtQAz5OzbuOihFBFnz3NQs6yghzAp7BMOMvULwaiqrB\nvQ+qdoLfjq5zH4ldIZQkP6rYDQl3YL5jJ317J+P/9Aheh526YUkcvSwP81E30zrCGKtfDP4N0FeB\nWpRPhLGC1qsLUexuUp+uo/GlIAm7P+VY1nxyht9Kn04m+P4cQtesJOi8g4Fb54IS0d+S7m+BzLHk\nOBupGmpFbdqMdvIlWNavQBuRiW7zcrBp4KAe8mcQ+vx65KzTIOKhzMKs7qWc9Uh8njWeRRVRsG0l\nf7nZzOSoh0CTAL/dj1BV5K5txPceQ1m7nO4H20gK/ZHkvx7B9fseDL4FaM5+ARfOw7JiKNCDYgHv\nSejRwqybaEq6jOA1FxM/OBpDZD0hvUAXkU6f2kRaWSrjth5CjLge5j/W/53oskOXHWZPw/baLiz7\nDsInXxLqvBP/7z9Cn5gC7mp2y3Zm6MoRobUoPZ8g++aDvRzcbkTSYITmFnrCV2JxfYbGEAKvg9iW\nMI4sysRd2ktG3rt0bZjDgVFLmKCZT1JiIorw4bTuwB4Vj9/0Plq2ET7+Nozr6qm5Lo0uIrDYu0nO\nW0783m2o9s2QEIQ4IGUK5G1BChyAE7/DY7NiDF0EmlMQMQP/zIUY9h4gLPtrpGAlxBshyooU9SgY\nl6McSSHY7kVf+CMCsBoCdyWYc3855/wXEvoPiX6/2kz4fxt9bCzivm/BFt0/sHPHRki3wPrZEEim\n3paKT+ojy1JC3wQTFpuX8tWDid5UT3Sena75iQQGJ2Js7OBs4XyCdScZc+Iw8loJX6IGzcL5BAuM\nhC58TffBUaSNnwdbP4YOJ2rBApbenI2px889Rzej6dsFrmkQNxZmL+vf4Ion4erbIDIaelrhubFw\n92ZCNa/RoT1L2FuRKNHpqMsv5nTwM9p6rBjONzD82x1w6XJKMzoZ9vka+mbfQVzqQtzaOlyHFxDT\n6EEz8jXUjCvofuq3NM89TUSNQte4e9G21JF46C3qk7J4P/EPTAq1sXDj3+B0D6RqoMcCL35IoOZJ\nGisbiRmSjuVCK7gaIDIESX+Fqg/g4rfx+uehN6xDlPdB6XPQVYZao1I3LYZDpYMxiyzmTxuJZG4D\naR+kvQYHPkYtmonLs5P9wRImPfwNRmMzvuEGxLhh6JVRYEqFow+DPQ2+qABLBHxVAk+Mgavf4usx\nY0g8+w6jzy1F+cpP0B6JHD0cjALh240UIQidjoC8qf3/50AAdf0aiLQij9AiTXfBzFtQ9Q24m3zo\n7t6JPDgeJXc6mrvfI+S9C8k5C177FLHtc4i1wqCROBZdSfHwz5lam4bU0g0HIuAKE17fbrr83QRO\nhGOraMGUMQb9km/6tS0Aek+g2r/HHumghW+wWzPwq71IwRCmQBwDi9sQTheBqCxiUn+Pv3YpWs0h\n1PR5yIkbwdkDnyTRnJNBYmIcVWYbmft8iLAr4PVH4PGHoP0sJCTDyZdg9D0o9ieRpLsJHvwSdcrH\naMf/E1mXkBfOXA2pd0HkpF/WKX8EP0cm7HX9+MUGMz/V3g/yqw/C3BbfP9Hg2lf+ca6nDg4/BZOe\nofHbdUjjc/BHPk/S5gNozg+Aj4/hv92A0xdL1LkslBkBTi0eghxIYuDWT9F1lkKphBgYQsQtRPGa\nCCqrkU/okQf9Bk6uA60EFwfoqsknIpCJ6N4ESV5Qc2DoE1B01f9nm6rzAsprc2FiLmLQvUhhUwk8\nm0fX1y5idpXRZrkJi3obnR33k658AXvvIzg8jlBgMw7bdQR2v8exRbcwybCYbvaS6p2DcqIGx+NP\no58yBeMDd1JRdTEJPVZsujk0xGVhO/IhK+Iv5q6KLwnz6aG0F1ynwOzoFy6Kn0Cg/RQn5lkZVV+F\naGuAoX+G3R/Aza+gKB/QHHacGGkzenUYbEmFuAX4W49yciLkvtpH+IUWiPJB7iDIz4dNx6H5PL45\nt7N+RiyTe/KJ12bAmw+jHt6FmHwlPLmq/1XkcyugbB1sqIBgCkSlwUWLoHYNy66+i/kn/kx2bQ1e\nNESXXoTw+xAiCGc3QVo2KCVQeCOMvBw1PBp12wZEzXbEZAfk/gnsD0DcVXg7v0L3oRXXGQnTtVMQ\n1+RDqBpJtwyohQ1XgnoOyk0EewQBWUJvNhJq9qDtC6HcEEPPiPXo14zDO8NKRGkHoiEMQhG4hkyh\nIy+LrugQqvM4lrBLUPp2Izz7EW0qWc/78P11G/rKVWgzr6Quzo2/9a+EbTqNZs7vkHRrsKoGpO+C\niM6TtOXkEjfsRZo0rfR6TpD/wHYI18F1N8HIW+GTKdAbhMJy1JJMxLhwVDEDzzsbMSzfgBQX99/7\nyYU/Q/0KmNb9H1G2+DmCcG/wx/8dYRr/T7X3g/y/B3NKCBJzIa3oH+fOfQopk+k+XINn5wHCFw5E\nfPQaxq6LkA/tRRTFoEnuplaXgjdFQpRVEFHVQXpPH9ruQ6gtibiuSkZjGYTkSEAp+QbvsDi8uiSk\nzk7Uu+9FmqxA+hqM2vGIkrPQWQvDfgc9zRC2GeKvBdnYvx+PE/H6bahL7iCoeQVVrUdyj0P9chMu\nbTf6SzPRH30G7acHkSMEPbYGDDXr8Q8/jjbmESzhD2I59DrJbR6qBrhIFb/BLdvwP/ECwbIywleu\nRO4pIapuKw3DrEjh2cQ2rMF49jRJWiuJl70PBzdByATZMyElBrJiYMsR5K5yYqrbwNaF1KXC2f0w\n0gWynlDZTAKaJkwfNyGtXQe5MmTfiBIzEk3jZqItsxHFR0EfBSY7tLfBHd+jLvgLXw9xMtV6BXFR\noyEiEUQvImM4fPUu5KRBQhqcWAEHfDDeDfYE8Lhg3jWQnUz28QdYPWAJ477dQ/DGW1HyZmBoDcIA\nJ1x1F8RaoNYJY3qhtQxR0or4+n1ESRlo82Dx06C+Cp/nQd8+5DYn2oJ03HtbkaI2ognsgMpd0FkE\nE5+A2jowD0R0n0JOKiR4qAdtjA/+5MFeJxPavA1rtBkSJaoTE4gwWKjPVOjKiiKi5gTJ7RZCllZU\ni40U/Z0k7H2XyFcaoNDNNncD+X2nwHmEcM8RzGoKh2Iiic65jh5tBtZTm5Fd5wnpx7L38svIsd2A\n7dhu2p0nCan1WG1m6HDCnhWgj4DFL6DGNhHKeQmpTUWkeJGNbXjffRFp0gGEchbkCQjx9/CgqtD0\nDuS+BOacf7WH/rf8HA/mHliqQ5WkH3U8tzT4U+39IP8hVZF/I1NugK8eh4nX/ONc/S4czny61q4l\n8/336ZDfwDpqGZolt8HsiZB1AbQDyG+X6AmvoXuMjVhfHuJoMeQPRlV70BeuoqfzRaK+6ezXqdWa\nsHRpcFxxAUPnR2j0i8B3BPKnQc5f4PtTUCZDRztkJ0L9s5D1PPi98Mb1cPky5OQipF2vgb8VZetE\nXAkTiRjrRFd+JUqvgdDY6wnf/QANVzfTlygTpj+FpBkINWch/XYsPTvwhRrYW/saSStbyB4zjfDn\nn0M6eS+0rUOytpPTvpwK7Qs0pkYxaPHn5Ox6pl8svaYe2l3wl5Xw0TUQfQlUr4V5WvQWF2qsBloU\nCAccwL4iNCkJCFsymssfA7MZ3psCEyah1ZuIqHkHUbEfppph0FME4vaxMTuHFN8+RpiWsJCr0apa\n8FWCYxccex7mFEJeMjxwA1xzP7iOQ4EfzkXDLIE64WV49wFEQRBN5lwGXjiOvjseU8xfOB75MIOr\nNqIfdSdi6FVwbh0UTINxE0CzG4JlEMiHsPlw5VIw+MBgA4sDJT0J9bwf0VqM8dFkPEutEN2GLu4o\nzL0PXqyBsGtwjx+Dr/YU5o1taAt0qMOsNJosiN5uwvQu5NN1WFq0xFw0FHd4HBm9Sfi0l9E49hBd\nISdJZ5yYQ4NQ48IhMAzZfY6gp5HRI/ag7tcjRCUos9AHBJOP7KK15wzNnmQaQzmEIguZ9vJmihZ1\noqzaglxymPy+IJ0T4gmKLjQ+M7S3g2YwvHErIXsvobapyK0uRLQZaUw0hvEJeN+8gP72YtTQBgKa\nZhRtEYb20ciRMyBq+r/HR38hQv8hOeh/xi76+fdkwnoz7P0Ixizu/9xTTeDcHpo+PkrmSy+gHvqW\nHs+HRL3dgUhKJSi7qXIIoqJSUKjHF+WlwpXHoWu+pKi9DnXNAejrRpPchv5vG0FuhUgnmkA3yvgO\n3O1mTF83INUcRVQegK5qaD8KZhfMfLFfDyG4APZshOoWsJ2H/JGQ0e8AQlER607Cwr/R98Ez6C/y\nIBd7cRfGIMbcgabDjm2XBoOtHmlfOAydDOEx8PwdhFrLsbSdJWXpfqKn3IrlplsQxx+Bhi/AFgOZ\nExDnNyPkwfRkJqJaI7E6osBth0/egz8+Cil5sGlZf3ZU1Alx3f0CMwu7oXYLdLdCIK1fW2JkBO5Y\nCZPlCtAZQE6GQx9DbhqayDzErnchyUPTQD1fpyukei2M8cVD3xHk1jfA/hn466HbAqSBQwtHSsHb\nC+VloE0ApQXm3Q3jl8G+Rai59XAqC5G6kbwXytFd/Rhi4BhUexmGI9/CzR8gSyZoOo4qJaLqixGW\nQ2D6EORXwWyHgrugaXi/VGl7OMGQE/mYB2wupIQ+dDMfwLexDbXZiube76GiGCKOEwxtQ7/Pg7a+\nGTHjekJz/djWOwi3t6DJ9HLqogk0NEYSscOESg/VC/Q0mlajFT2YRRheTSkOcy1OzWnYW48hYSGl\nyVFIWhe22BbwGhG9XgLt9dR0SrwZuZSNGb/nOv9REivPYqrpwLi/B2VTHWqLgrj4BnSDFtOaWIUp\nQoMc54WiKBhXT2fIiu/ibJQ2H7KcgHLbcOg7ha/DgmZYPVgeBtWB/qQTyXUYjJMQ4cP/9f75A/wc\nmfA9TxhRkH7U8dJS30+194P8emrCagiaX4O2j0HxQs6bYBkOsgneuwWueBZ6HARemEbzYSfJg8cj\nx8XTfmUQfVsGtqG3EooM5x32ccUnm4i88BL+QXo80YuxbKzGUdlF+J+fRH3nOsRJNyLFiJraB3aB\nepWKMngg0ssVnH/6JuL9U7GFT0br00LzWdh3O3gkCFpAyJA2HuILwKOBugcha2n/JF8g6NiC9OUn\nBLJuwLt9G1KMFu3JZ/CM1CIMk7HV1COSIxELIuGtXiirgnveok1uQ/vpI5h1LkINQUzzJoMa6A/0\ndzwLnW9AMBoyX4BvlqPqTTh+cwk2aRg8PhpRUUvwixL8UjWmKj3Kwb+ixn6DIlSUketRIqwoZ+5B\naTmP4ktBKmzHcKyH3nkDiHKOQACKkJBOn4CsKahyAqxcRd+ULmRtHxjB5POBZQQkPw3WcbD3AGxd\nBa5jYM0FdsF5FTpdYIuH7k5wB+G2FFAFaBTUUDtK0E8oR6B9GMSTy2DWn/GtHEcocySmhiAseQ3a\nzqBufwKlrRX5Rj2UXQ9BE2rHCtRxGUh962CzDnJ+D2PvRb1lIL4kN56xyYTFFlI16EZ6/vw8YRYZ\ni17BN/lSxFvPoZujQxqZjNHZitVnRkqPgAM9UHAHyhcPU5YbhTOikPj9h3DffxeJGYOQhRELE6B9\nEyg+WFcO+UOhuZUacxnayK0k6TWoLcfBIVg+eB15tSeYX/sFclQbmgs5+OzN+Lu7CD6WRth77ain\nHNjn/JHIxvcJbPPTesNkLANGE3N+A1ibqB1jJOZ8O3pnFoFdjWgv+TOa6bEodbGEcq+iXb6f9j1D\nGbrxIdSnn4G1tyGuuwCa/9+YCXcdnLwZ7AcgcREM/lt/eekX5ueoCTeqP36fycL+U+39IL+eTFhI\nYBsDhkxQPKD6oXUldHwBvbVQfxDf+i/x9Z0hcsGTaJ54GabPR1R54OrH8K14mT2uYxQlGkl1Hcfj\nb0Onc2FsqUI61o2REGpkGEFjE5plj0LHUcRluVDUgjM1GX34Fcgpk4k6WkX1sHpsPge6UCNoasB/\nBAaPh1O7YUg4pDaCr69/rIq+BD7cBFOuRTWY8egfQTfsfeSEFHSTJmOYNBtN31nERQMRbQeQjroJ\npjoJ9XXgC16EZtg5vKvWoB4/hB0rYToFQ54bIbdCUw80d0G6AoZkGPQW6G1QOA+hNaD/bDme9FKC\nnmJ8BdG0Dn4PL4fwRXTise7GFxUkgJZQynBUSQH7XlxhXizbojFG9OFYNRhlgQ6lrZnDKY+jt5ix\nRj+P+vanVEl9HBtuw+TqJaq9BzQm5NRFkPAw2KaDIsHj98Jz70LTEbjl9f568JSBYGkCRQ8hBQqC\nkOMGTzesDsLE+1Cz2qC8EzzxSCU7QW2ie6gO65gVSLoI+OohiEtD7FsGnjDINCLe2Qm5wxHtKsqo\nOETjfsRhL0x7CDUxFfYsR3Jn8+k6A/uPNdA5zsTBuYMZ8tIWNMVNFGcFaFo4maZQGC3WYUTHH0Mn\nedGGcmCrCdoPIdqbiS7rJDmqmtNXzED7zlHs23dSmZFMfFQeWlM+dPphy7fw+/uho42+vq94NXkR\ns8prwdVCb3ISs01vkefSIz9fgpwFBFW46wOCx1ZzZupI0taehVkmXrzuWqaqTQT+8DRONaS7AAAg\nAElEQVTlo0tpz/KQbi7DtbOITmsPEW4PfTGX0ji1kFPOGr6JLaDqXC2Fr3xHwFZP8iOfo4kKIS59\nCbHrQTDGQPxwsO+H6jeg5m3oK4eIUZCyBHIfBY3pl/Ph/8LPkQnf9YQVFelHHX9b6vqp9n6QX08m\n/M9oPo3rhRvpqLWTvNiIZuggkG2EbKORenJR1r5GU1Ml637/G67XlKJJuh71qcsx+T0In76/fyUz\nApoi6U3tJeyOEqgqANMFQkej8StODG4tYvAgaK5DiRtAU0KAGHkWhuJvIS0BYnPhlRVw/V0QpgXL\nQqj+ABzl8FEl3PEh/kFOFJoxcMs/9h70w5qbCEwoRHp6OX0vTsdcux/Z7EDpCoOWNtw7ZXbPnEh2\nRCWRjYKoE42IZAnJY0VEmfqz72AOzFwOlv6X5EO2IE7pEXSnOzB+sB+RNxrl6ncIWB3oz62Dc8vB\nJcNBT7+0dXQSjvs8KD1hhFdHQLKFnm2DCdx7jBixGHflm/T0monKvZdicwVJn67izD3zufjjN0An\n8FWZMFzzHIQ3g78K9gUgqEBNHTgaoc4OqSkQ2w4NHrjsNfhwJQw9D+MuB81oaP0ONAUEO19HnHSi\nusKRezygMeHOisXM32+n3T1QUwwaP2rAiXqdDrFORuTNheYy1OcPo5woRDoci/uq6wixE8Mze+m5\ncQKB2KGceWM1mkAnBUt8iLpwjH+uQU0JI/zya+D0epjT0l8f79CBRQcHzf3i6mOvhg/ehVlZ9M3s\nwZDyLf5VE/EtcNKSnsB+6Q/Eb2lhZtHNGBMy4dwZ1p1ez32LF3P0wdlEXawBOQbaGqEhCgxe8AdB\nToJ4E761RwjYorDMKOREoZ3mPVpm7NtF8Cj4H5yAkldNZHsTN3m+Yuyco7jqwxlXtZnIunRiu/Yh\nfD1Yb94K5ecJJT6F9JcGhCYPVn0PxU9D4iQ4+mcYeBnkXw+WrP92Is2/gp8jE65Wf/xbgZmi5afa\n+0H+XxAGfLW19F2TiXbWKKxLXiLk8SHnDGUTHzNT+3t0L92J+OI9/FdcjG58K4FtKcjbtyGN8MK8\nR0FeD6sqIU6iNy4Ky00fIPs+gQ4Ifb0aVXHhvXYsFp6HppNQ/AGBxbfREXibhHePIjr1/ZmfLwsy\nxkBKFiQlg3sFDF8IdSmobS24Fh3GLH+G4L+01jR8Ar3LUPVVhEJ63NEarPLTiNalKFt9BA0aAvjQ\n+/x0ThpK5J4T2DNskCEjwgTaqEswBaejv1CFdPZzsHoJdLrxZHZjqipCM02GNwSkSqjOGsR9e2Bp\nPrjNkNsFNVpIv47AFeOxK48RZ3wVUfkyfKOhT5eBd8p2ojV/gCN/xV6Qyo4JueStOUPe9nJEihHH\nRSrG0wGkviC6sATQpEF3PSTVQbSAwzIU26DdDZMyISIEbc3wche0lcOz18JT2/onQawfCV1nCeRE\n4DszAq0xC63yGaEWI+60kYSJOaAo/cfOFXC6EdUcQH3Ag+K1ItcnIaIHwIIXUGxVEDiAf/sBlNyL\n0b72NxzP/gmftQNbaBLes1/ha/wapUPFmhqL7ByCdfd+mNPRr0S2fQB07gWLCXJf7J/Hu+8TGKDF\nW23C/VA6Zg/oM14lUPY6vpjtNMdE0aSW4xGJDHFeSkLnFva1tfHssKd5+a4ryB2bAb9dBYEauPAA\ntDmgIh6mSqiHTqNsbEFMl5CmP02vYztuZyXm7h70B9zIYyci5e8hWAbHt8zG8rs2sj+MwanZj0kd\nRjA8BovhawL6dPTeRJDOg14gnZcgEAFjhkKkBOogOL4Xeu1QMBJUBdobYdLFMHkBxPxrXnf+OYLw\neTXtRy/OE3U/1d4P8uvrjvC64Pv3IC4TfC5ovkD36o1EZsSgU+pg85vsvyiBvC4tBqsNvdsBOjMU\nFqFDB831aPtcsHA6jLoY7GUwfSU0zoOjfszV7Th2LiZCuggubMA35RoaEo+RGDsedCPgxEfQcgzt\npnVEzfkDnQuriO5yIIa/AsIL+huhoQpOvgUNCpw8DO5jcHwT5g+siN+9B4tuBN3fdfiaO1C2R+Mb\nNp2e1O2EvAo2dR5sfRqJDNRQLyZXBb3ZEYTXnUIzKpeo2+uQlnmRg8kEFj2MhwM4RnWijBqLGjiL\nuaoG645cJPU0bPNBXzIU3UPb5yswbMhDo5mJ5cXP4e0U6JZRRw+g0/Q3YrSrEN0vQigc8q2Yuj9A\nezYc5gyh8sYPOaJ9j4ldh0nIrkONlpBRMcRbsU9wEfmND1XXjeit7Rer6UqB72uhAMiIhpGToOAE\naGeB/e3+7Ct+ILywrz9o77ka7AL8FkgNJxgYgEbKQbjDCcR3oe2shuzsfpW8jiqUwSMIuQxoak8g\njAL17Ey4/D6w2eDYe0hd1SjpregNgxDr10FJAxFns2gcVonlxCFMO1fh/yqcqtRwitsqmXWtFnwS\nWCJhWyyEW8A4BqX+BOLUdpTi3UgDu0HMoP4eH7HrHfinN6Pr3oE2/0403EEOkCIC9CnnUfbcjntS\nOFnt5aRpPGRffhO07Ojv0TWMgFAyVH4BcbH0WjLoiDpHhkmlI28WsUY9+p4qDM4OdEOegyF61N0r\nwC7Q7IQhabtoaoxBampE3JqOO6ydwBkb7vRoTFIv5zIHMHhzGJpsoLoVVXUgejPhfAnYWvt7ujOK\noKYCdq8Hgwm0OvD7/m1u/X9C6D8k/P26MuH6UvjoXig/CKMXwqiFkJSLGpNBYPcKuhwnsR7fhjbg\nR+PoQwlPQBOVAxfa4M7nISoJdNvBNgd8MfgOfoLrxLtEDrkWAuvAXYu6vxt/ZhTalDBUYy8ECmle\ndDfJ0jSEMPXfvlXvgfWPQYQbJbaWjqwBRA3chuaNcXDbERAGODYLIj0om3IJuhMI6V9BP+ElRM7F\niPB/ZBuhP42jo07DmV2nSVylQf06El1xNxGDE7AObQCLG0fmYvRRi9GevgyDXyL4pUxvr4RxxgCM\ni0ZCsBPv8GH4nF+hLzYTiDfhTS0HvJhbZ2B1z4V1z8GN8fheb6Gy3IpwV5Nx6yiMO3fTNdaCbnAW\nlqgy8E+Dik5oPIAiQUfKNPTzV7HZ8yRDy46Q0+tE7urFN6OVc77J9LX/hlEZKXSdfITo7l50ujTw\nNcCo++HDDyFzCSy+F1oPw5lXoFUPxVvggaOQnAptB+DQIyiuEPS1Elh4K5LjDZwRv0MfPgSj61m6\nNW3YjtegpiUgxXxBww0PUbvhJLIR4jLMJN8RILg/hDr3TYxjpqGLi0OoIdTvbkccfh81eTRiRzl8\nWIXr61GYTtdBpgEKxqEGS2nr0LPnxRamXxlDlKGPYMsMNMnbUQMKgQ1+9IM9KGcgcI+EOk7liGkU\n6dW9tGWEMbo0DvLfBn38P76nK1dAhATjjnN2WRNfvv4MtwS+JLzsXbS596E/44Kmz/Gf7mHfTZOR\nwscz6dJnoKmXwLYbcFlL0ZdaaQ0YyB61BqWxEeXrFUhVH6OabPjlTrw5EhFSD6hJNE0zkwC4u7s5\nFSpA7+tBT5CqkbdjFMlYi78i3DEEm76EsHEvYSs9DUe3QFMVnD8C4y4BdwiKd8OwifDQiv6g/Avy\nc2TCJeqAH724SFz4qfZ+kF9XEP6HJQj4UHU6GjlHBYcwtdkp/GQHpiPfE0rKoT3NSIIusb/lytkD\nBh20XehvF5t/PWTcxnZ6cXz1EJdqw8D1KnQrKC4/obkCOfsJxPc7EIfKUaf8HjHriX67PhfuvhfR\nN0cjVz8DI1fjP/4uLt8xwh6rQFp/H0RNgc6NULsC9fSl+DZsQp4gIw9xQ3QsQns5Ag20NcHRTZBq\nJZgxAa/0PZYmBbVb7e8QsIWod4/AmjwLT00bKco7SEkqoEU1mHFu9aObkYwht5xui41ww2qkzFmw\n7hmoexQ12kQoV0ZTeBjagNP3QvTNcHQf3lNv0m7Kx08lujlakt4UyIt90Ckg3AyGXnzOXBwhHVKc\nEZfSjGHiY8SebQLCCU2Podn7BC+Yr+aPWxrIOPYWwaFmvDlabL6BCMc9sPVhePLvcxP3Xg/efPj0\nKahwQMY8oBY1ugXCk1DDBuOPKCGUcgE1xkpvWCS2pHkYAwHsmhqigrORdr0Kkx9AensD3k4Fx9Fi\nwgZnEppqQ1O7i+aVUfhnXIu/rQ1VUWhSnCT1fk/qZV7CzANA6yZ0wYHkCCBueAYq9tK4wYSvow0R\n7KPqMgeatxoYdHkG0dmnUVrNeD9NQB6cii5qB94rMgkYPOxPHkWhVICdraSVTCcicA6Gru5/Oafi\nPLy+HO5vBjmW0kPjOTApjjENH1N4fhdq/gI6O/x4KktxDZlO8pilWHu9KNcNwJ+XhWtZAuEV5XSF\nrkDa8QVRVX64eGp/rd+aDiXPUZuqIWlnAlp9E7T3ofjtBGcb0GY5EadHcH7KlWTvfpDe/OsIdh+i\nNzedvnVxOKaE482Zw1zNzP5r0tMJ614DWQOZg6C6GpprISUbrryj/67jF+LnCMIn1B8vWj9MnP+p\n9n6Q/4x8/F+IEzttopIeXSud1JNMAeO5Gn2cieqbh+Nfch2huIEIBAkMg78sgTsfheMfwv4V4KuC\nnt3AbWyih/pxC7j0u7fAmoYyvgHV5CPYFoZ8tARh3w1XPotY+xaEF0H+JFj/BMZDb6COE6hdExAt\nz6OZcw9y1SHUUBDl+2+Qsl6A3KdhVyrK3QuQJ+5D+Ws6crQMk+ajaPYhdusQW2oQhQPBocfVsRl9\nwVhoPoqqDxEIE3TpC8nuKoXYYnBqCOljYHsvaowJEevHEuNDGn8B1+E4wqv1SH+ZDXs3QdtSCJcR\nmX9AU/IuHCkCy70w+k749ibI/CO+Mz4iBkyg9/IQ2kfKaIoVJB2PRE7vhuxYUAcgfDasB8/gvPRF\nUpw2xNd/hokPQ9EiZCGI1x3gL8eXo6vWoIxLIlgKphOddN3tJXzNe8gzh/39otX2B6iskZBmAJ0C\nCccgIwumPUPIuxZpVTn6b8oJ/caMu3AiWBQ02lsJqN9gRIss305IH4B3lqNmzMdw06MYHp0EUV1Q\nW0IgLZrEYT60SU2Ii+dB5jBeStBw54ZPMFmeQ1XDEedsIFvxTI7GlHMXFL9F8s1XwvCPKeUCVvpI\n035K48k30Y2LxNWsR/tgH1EzlhMq+Q3GtU2IwdPJbpcwZtQTEaXSlulC3luLbVs8jD4KTz8IL70F\n3mvBfAkFo7w0eJrx6jJojSzllE1PQks3RcfPg3k2HL4E1dNFMB/8Vw0iUnoH4VuE7synNBUtJqpg\nJMy4AkJBOPs4gak34dKtx1tRB+dMaDIHIFUfQ6534WmIwJTlJE9uxb/gLJ6Ti4kNVBBjLkDOuRR2\nrgFzeP/8dIDwaLj+iX8414R/oSP/DAR/ueawxcATwEBgJPBPxZl/uZ+q/0AaKWUtT3CQz0mlkDnq\nHQyq6EH//T2oX4zD3vkVAzSFVHsPkqsOhsZqsEVA0kBY8Cw83Q6RNnAcgKCT2b3nWNCxETU+A7r1\niLI+5E3p6Br9qH1VMOYdGHQ/LCqEz2+EipMwfDxiYQFl36XTXaRFrTmD9NIUrDs6CS4Zjk+yQsAE\nF2ww4TKU9j/hGzUe7Zf7EX0gffwy0qsHEMs2oOa3o6TWoGQk4h1jRf/VMZSuPjqHavDExJGY/zs4\n7oQNCvgzCV2yGn/2QETRnSgXFOSrZIR5FaY5JSidTtw3jEbdsQaGWUFKhW8boWYOHAwHo4Bn50HW\nFXDweWx+FfPx10l430tsQi5JSYNRDTbU6hC8dxaO69Ae3IuuoYWYF69DnP8UZo+AIZf+76fpsvIH\nIq0erGM1BGLfoGWlgcZrbkAyP0XPby/gC+vsv3DnVsDA26BkK6qnHbQumHATXH8QkbYATdjjSA3l\nKEuGI7QhtGUnkDSD8H/xJc6jq5G+OIDr1t8TOB1E1jqRtPVw/CEIi0O5Zw+VNz1D+5QCgvOeJ3TG\ni2qNQj26jitfvx/DhUNodtpQjDWoOU6klgu4orX4aIKECXDycSh7gxOOtQw9+goJceUMGRGH3u7G\nPLiLQChEyPMUGsd8Qr4I9GVbSdKMIXpfJJEVYzBZj9IxKZ+AToXnBkK+AHMtiHaw/hZH3FQK2neQ\n1r6HmoIUJp84QlGzBUb8FppPQdkBlMMtEBmJJeF+RO27cGgXlTOewpUnYGjH3zsYJNh1CLfLTUeU\nBt/MUYh5fagVBwhl+BCpCn3TVNRADax+G13xFGylYZyfcAWS6UHILYB3tsHekn+fA//MhPqVqH/U\n8T/kDLAQ2PtjFv9q+oQVQrhxUMBUiphDGLEIIYEtHQJ9OLoPEWYdTlvrBhKqThJ+fhti74uQKkHt\nRvBWQuJUiAsH/9dQuYmq0Cl0NSZyxz6AOPAiQidQBxipnHE5SqgaS8H7/QFHnwAH34GN66D7M9Rt\n7Si13eiONaIz+xE+gegLoOnrQ9PYhagNwLHvUNNO4PMZMOR+hSwiEa5KQvkzkc65EJEOsIQQUjye\ni31Imj701V14XXr8YfFEmiyIvZ+AEahXIHEAktdKsGUfmrDhEP89IvsWOP0mwtmBqJTQaA/hPluH\nJqAgukfAk19B0Rg48R3Bzlpq4uZTsraYeEMNPbdbUXo1GPWjEEXTkKRWpEHnEPk6yJZhaCJoCqGl\nFFE4D9TzMGAC2Cb2B4Wu84iauQifStCi0rYxk+pP1zDokZXUh54nYrcb3dHTSHmLEGfehc2bwHUe\ngh00zJ2OIWYqmvgh/WWl9+8i2CvjOliCZpqPUI0G/9tOxFWj8RSeJzx1KMZE0IZXInwmRFQ05N6C\n3XGQ4zn7ia2rImlvEzKTUV58DunRv6KMnMuhMbOxSL0kd2xEmeRBWtOJGq/F4+zELqqwdOxDdvXQ\nHmbCnjiS/IRrwN6O+P4gcqUXjdaHa1QCLwRvZpS3E13sJRwr6CTjy2OIvkT0tkwCUh1KVCttDgMi\nqGBq7IbgSohKwx4+m6Mtf6Lw+LeIEa+R5Qdt4rdwrBucdhg9AwZNpXT4QJyGbqI3v4so3g6BKCoH\nLSEicSExgQroeg2+PQJ7vkI6X459eDTZ69KQmYHIzEXsP4NaqWJQ3KgZMiJvHuJ4NYacJqwbK3GJ\nSIwD5kJdDWxbA9fc/ov56Y/l5+gTvv6JpB/dJ7xyacv/xF4nYAeuA7YBLf9s8a+mHCEhk0C/+Ij3\n2DH8Wi3a3Fwkg5H2/ImU5PYwszedMu8R5JibSXONhKP3wp3vgbsEetZB0AnR81Hb/kgwTItDzSdG\nU0JoYyayCmLos4iBEKfRU10oEQdwcAsUb4BGGWZ6oSyHwPixVJ3YQu6yz+ibvBXzvkPIygI48i5i\npx1SouB3HtS0F9FbEpDpb6VRw1LpDDyOeVgsuu4UykcNxBAEW98OojY56Br/W2oNTQzbvgcRcylo\nT0NSBqoxEXq1CCkOOeiCwSUob8qQNhMpJhmOP4QIl6FHQc0x0L7Gi2FEH+Hb3gKvG1QXJfqFHHz8\nGeauXQuGtfQO20PkKS9q8QWUqiaIqkKKdqP2alCSI9Bkv4GvYhc933xD9OhkNM7dsGtd/54AIi1w\nPAex6yTSbdEkXGTHZLegP3wruSMfozznEVJ8ZqxrhoG5CJY8D+EpiLfGEpN5G9XGL7B5giQ+8RoM\nCyHnp2IWU3AMqcdyyInthssIDswgEHQgXdgFaix4FdQMIwG1krOOZxETMhhrfopAzHaI2IA0/1pC\nLdUEGoshdgDJZw/SptShhuvgmyA0Qf34MUT2nMA5sAK1qBR23M6hWCPjO1Lg21nQYUUNmQj8tptA\njIb4vYVcMyWc+1JHcmvKKPrEV6geE2L/O5D4HBHm+QT8z5NUXUD75dNxKFYyLryMWO1AKnqF6W0H\nkdwKhlWfo8pBxGwNKK3QFwVnnkMd/w3dzW8RqbOC/jwkGiH9RuK++IyUuk7IKICJE2H0ahi7B+2a\nB8iMeRJx+0TwdcO+3yHmLUdacTdSDXhlUAvmo209BwOnYZz0Ab2+zYQ9vx9p2FA49E/jyf9V+Pll\nHx7+WH41Qfi/oklNpXnOHHxnz5Kw+3u+GbOKBc3VBLvrGeLvxeTNggsrYHYEnL0JAvshfA5U3wWd\n3yJw4dWeR2+OJ1t7Ab8ERh1w9HHI2o7N/RxpZ3Px7L0UQ6cDYUqFkbEQ9ht45F60D40lM8pJ9OQJ\nqDs/wZUVwpB1CZpgFnx2KaHrfQSz9fi+fJSuuAICYW8TNBtI2r6PyJvt1A1LJaRdRre2kkS7C0vp\nfjSzvkF4KyhqPgvhZwh9vwVi8lC9PQjNedST3QQ/KcH/rBW/uQXzfj2uKSuJ3t0MMTKkxiHiVSyB\nduR4hcCqXTQdryYsV+ZkKBeNVeLSfftInDCB7mA9yasFvm93EZrlQKo+j/ADfaAYBKH6m5GSQQrV\no3T6kDs+gcIhcK4OFr8Lh7bChq2QBVylRw7LQgQ2EZ4RBZnXIdtVcr+XKLvERtopN5YpH0FYTr/i\nXVQ6RutQ8r7bhb/pfUK15/FdsQRz9CzUpgr6Oj8g3NmJLqUB/4ntpHQ0IplDhDxNCMlDb1Qczdn5\nRDc0oEtOwq59Gr+uHL3hGC7faDR3D8fT/Q7WUyUYm7PZNfk28urbydxVgjrMQJohA8+YOaTsW4a2\naDdebwJORxvR2x+CiVWoYU8Q9K9C1QZxlmViGnAJA9e/yevuYxRHTCUwuwDXuDqsajaUP48YcTlq\nhBV/cg3Z97bjy2rEm6rB0NVJRNkK1FYPoWQdxbu/In3wOBLqLkHE7IV2Paw30ZdVwcjyOoxWPfyx\nHjbkg62Hww/+gZi+FExfvwvvvAa91XDJB4iwVKJLgzAwBMX3QPLt8PFbiEHjwSJhKN+PcuRmPM8m\ngP9r5P/F3ntHt3Vdad+/W1CJQoK9k2InRfUuUZLVm2Vbki0XWY4dN7nHVtySuPeSuMVyibstd1tW\ntSXL6qJEdRaRYu+dBAkQHbj3+4OZ981MkplknMz4nfmetbAWLtbBOgcH5zx33332fnZJgBhTB+5Z\nHZii10Pcp8O629JP6SH6P4d/zyd8Zu8AZ/YO/ntf3wXE/YXP7we2/D3j+N9JwjExJO7Zg+ONN+j9\n6A1GvVNN2N134Mt4DzXQhNJbg9TcBUtyQFsAu/eCpwkyBbCtgP4SzEPl5BdX0peWQqTaR59Og9Fn\nQ/7iAzRNnURMTWD/va+zr72U38yYi3BJIXhehcQMQrFawhuD8NHVNNZVEmieR/SIX2He3oz8CxMB\nw01INivmWd9giX8Of+VRxC9fQFGSUXebCVvSj2336+S0hhFo3oq6y4nffAWm7DGo8mFCMwWkJ72g\nVOM/Fo3U4MSHmYYnc4jK9xIqU7HemoYt9XLIswMhqH0TpHIEUwiDRof+kokY6ysIOu1I5S2YR0/C\nnJAAgNl3Fa64PNRlVXgHTqDPAbFVRBBVxLx3CdrN+D9+G7G6Cn12PCHjXESjCXGEF15YADXdkGqB\nyEhIm4FQ8CSCayeyeBu0tsCeJ5AumkbO6X2cK8ojzdBBGFnDam4XvwYn74aqTWjHFaI2+NA1fom3\nZBuesVqMO/0IM26CiJVIHz+GeFsxft3zeOtU+jWHEBLzyTK8hFz1MWLO3cMLQqmi3zmdOo3MlHe2\nkaj4EHSJyGt2YHCdIidtPlx2FXh3gf1rjImrUN7zooQv58TNDzPe0QZjEiFqOsJgL1KpHwXoHGkm\nyl6LXLsfOVbPhEPfMJg0B8Pbx2DUIhjdidj3OXGhafj15TBZQBfjxllhZuA8H6o2i4h8B5JvARPn\nfEFHMIeunbuISbMjlotgtGHOmgA/3AspS8EQAcuOQfE65NIyKK2Ai+8gZNYR2P17tE47YsMJqDgF\nZjP0t6M6dqNMz0C5NpNQUhDqBMRzOoRmB5oqK2K7hHDDGRyNRTRFvkVsbAJR7a2Q/LcnOvxU8e/5\nekfOjmLk7Kj/c/3hwy3/tsn8f9Q4/neGqP0JumnE3BJk6LmXCTkcWO9dSyD1dcTBneianMgdCsLX\nQL0KN+XBtJsh4Urw9/PaUCtXPrmQMJMLFahujyXm/LEopl4M9mZ04hS8YhjK3m+RG6MwXJ0AbYfw\nucM4ujWOaQ/cwnUvT+Ye/z2kT29CymtGtF8AZV7UsDrsNdU4ZJmYiQHCNCrBXiNOrQnrnAA+2YtR\nTUV1BhFK21BTCwi1nqM/zsypORdgVrvI27sHSZiF6cxeRI0HJvkJFWYg+HsRGhJhQjHCxyuhoR6S\n/RAvQfRs1ONttEaZCevdh6UpBbW7D48uHH9bCwT8qOMysFyoolpvpPfXT5J4eStUgyAsgdhUQte9\nyAGeYJx6DWH7boTy7Zw7mIucKZDdY4chO8y/Z1j/9/Q++M1GaHmPPvdWTNrz0DWUwoJF0C8RzFjE\nuaGbST+3BqO7ChwbwdUJRxXQJkJCO8y7D3fONXQOzSbyIxvMX4v1vc/gutfxZ6bQ5ZpBlTSLSe1d\nWDb1IiSOhslrIG0ShHxw7AlCVb/Fnp3O2VFmpvwgoV2yFVVjwd/3DTo1AMYi1M2jUdPGE/qskb79\nVQSeXsL3ozO46mwIUZDAdxY15CUknYWtAxCTiXOsgXCfCaGpCvWQB98jCtpP/QixCkKDAOVhhLIj\nCM2/Hk2CGcGwAaUlSH1WHnJXOSktTYQiFqJaHGjHfU/omzsRdr7JgD4cZdKjWA68RCgygJjuQp7/\nIlLMHNS+Uvp+czPi2JspvuVCnId+Q8KIlcy0e1F33owSk0IwsYZQcipiTApiiwuptA2xKwxBroEe\nEXXBYzC4E+p3Eryhk+OOC2lVYjncOI+4mDFcmzyOyP9GG+4fEaK2Vf3bpTmXCbv/M/3tAdYDJ/69\nRv8rLeE/RQxpkAyGF18k2N6O/fnncfX0EXNVFrLzGP4yAW2rgrBOhuhmaH0U2h6GjN/h6JRwZVkw\n1nkhUiLR2kPTx7vJe/QZhmYa6VB3En1yPNpr17Gprpy06iomp5QQqhkEfwjqNhgjoF4AACAASURB\nVPLWgqOIbV7UsfVQAf2uOga2NtBjjicycxpptl40rk6UKAGN0U64VwuHBvDnRqBvbERsjYYBC6Gl\nD9O/KB6XQWXK0RewHmkDkqBhG4gGOD8BvmlBMMkEfohD1+eD4lXgaYZ8PyROgZPbcXd0UlbdSe64\nISyaq+nsO4XPPwXzyFwsD09Dq/4W+o9B/iFCWpHoJb+EcFCFBEJT9AiH3ibUsBVTWxI/5B9l0cfV\nlC2cwuPZ9/Heks1gzB7OwPM9BC874ZdvwOAp6K3AZJrNUM9XKOESWk0S0ojFyG2V5Hxv5dyc90j7\neAhdrQs5YIJIB3R2Q3Ii6sdncZYtQvegHtOZMrpMT6MJD0efVUil+iGJR+KY7ClG7rUjfBuABflg\n3AE7HgVvNeQvRDJlEdXQTQY+jizNZJIcQI+ArvMQOP1QdgfEu6lOz0R/uoeQX+L4nIvpVez4pVr0\nDTsgcQpq06eInX4AxJQerHYHfbYkolz9CEMiUpUN36wExE4FXbgJritC3f8ewtkXEORJ0NyL2JlA\nZn0UgfQkfHGDaA8doG1RIh91vsuNe77HHJtFxKQa3LvuRyocREwVEd0WxIYboElBiTwf7eguxIL3\nSWzcwgj1DGa/nxAOfIsi0dgV5GINXdpwEj7cjSgaES/5FPvqZYT/fhTCyWMIgx2oHQdADeI+chvu\naQLzdjsZIb5JWEkRT61LIAqZa9UwIgUzKirCT8qm+4/xT9QTvgh4CYgCtgGngMV/rfFPadb++wR8\n/hRKkKEjS5D2lKOr7oELMlDz25EMyUAW2L8F7RSwBzjWFKCgrhyDw4NqFFBc4TRVQSDJRO5sD2q4\nGx73ELSNRNUZOKtR6FtqYXJbMae2K0z6uUDgcBRabS9SZBDvtyYqwyeR3H6YmJnTEfInQtkbYOyF\nqBSQ+kDxERJS8Y1soT86kcSSPlT3FESzFVVvJSjrkVteQW2XCKpRaA0deHrN+IJeTH4tsimeUIyA\nlFYELZshXw/5N4I6iuBn66hqaCf7pmy04hWw9zO4QAfHVMgNg0gdpGyAoAvaXwDDJYRKbiVgNiFX\n1qIEXWj2gGpMxTFPT8PcQlqEW/n00z7enLsWoyEfKk4PyyGOCkDgIzj5ILSVQcJs0MWiVu+CzAHc\nQ0ZErxVDKBai4nC7PJRd7CHGfDnpd38Ag8dB1qM8tovOWx8gsN5KbMp16D75OYGuCIKJZsSbNqEn\nDh9fE+QkYe0/h9jkf+3P7KqGHx6Hio/AptIXPwfnVC9NqRFMYANh59bB3hpQuyAyCUd9HT0fa0i9\n3M+Ha69hXtz9JCnR8NHsYQU0zwl6r70H6/vfIA814J09gdaiFqSgSOQHQcz72/A/YEFTM4QUoYEx\nx7E3PIb58OfINj30hYN+Cdi80NiAur8YdDrU6S7a9yfw3u3XMLbXztToT9A02dCaRVR7K65mM9L8\nhbTp+8jrD9K+vZ0/PLiBuxqa0Q8N0Le9B1/lWWLTWtFl6uHUUTy/2U5pzCvEsojUXX6GvtiFNmIf\nuph4UAdRbe2gqgScGoayL8QwWIBm12+RI+bAc59zyvMcjbpjIMYzzX0HsUPtqJHjESTdP32b/iMs\n4S/Vv8qLf4aVwo4f299fxf96S/hfwW+HA1cgH2hCq/Mh3hCE7FfBmgq960ENokRMQQ2VIAWWMHFw\nG8T7wJoNpW5IaiPNKHPy2yG6TotY4mR0YRqEjg4Ck+IIHxvEkwZ9GVYyZoUI7h5AX9lKpTsaa6Se\nBGcHY7sOIKR4ELJSYcXlMPQ+5C4EzQRInACRSUifF6ETAwx2OLGcc+CP7sR5Sk+E4SAG4wBqgow/\nZRqSV4/a7UDvd2IQU2HCfGj8GunCO4alH9V+FEYhKCMRNlyEnFtAwQIVIm9BFT6B8wfAGoRCEITF\nEH4naDNA8BOyaBFOXYoy9+d4HikmfM6NBPa+i5QxiFjVSnj+S4yuuZmGTB2vXGnD2OOHmtnQXwWx\nChAF3gdg7vlwNAXOew3qTiKcOkYoysjgiPHoq08ipM5Fn5qP0OlCu+0H2uZ/Qqy7Bb0mFsEwhHtn\nI16hHO8oC2qnCyFHh9YwGa0aRHEMEbAcxM9OTPweEv5CWLwtEcRmGLsChs4hDzaRcCQLU/gSSn+4\nkMLREZjGF8HuA6A7R7UjHc38cKTOoyx97zOiV14M+2+DhPmoq+/CtykWt/wNwUvNmH8wozvYREyv\njtZxWkwf1SBOtCC6DbimZyEetmEaisCS9RJDvSexGkZD3X74fBNkDMHCWIRxF4MpiVDxx0TcPMjI\nUSZ61HEcae9lfMHPMXVp4Oub0GiG6O34ll2pN5GuX4oU/zi/OXA3nD1F55FxWK59hNisQRi7Dlq2\nQc4qDPYQE2LepZvvqZ53lhF59zB06wF00Q4Y7EXNGQkDZfj9Ev5bv8R4g4QcbcDbd4Y278Pogh+T\nPRiOcMDCs4VfEeMdBEM4vzTn/T9hFfv5598s/hb8lI44/3sqa/wL+sth80I4EUPvpdmEjehFiBs9\nrF2rvwxMl4FxPl6xE3dFOPreTtBfA9p4KBiFEFGKMPIKFLmK8LsXc8wfRt9jczCPceGbGQRpEOtZ\nkeaRNkIZVxC9ZyelL/vR5lpIXTsVW8kZxNkqQpsNodEFo8cjZGyBMU/CnjqoOTosQD/+Eoj/BuGY\nD7Og0jvBQmxFA7YMCf3NHyDPvByhdTtydR9SWwVCQjKCD/jlN7D8Rji9Azp2gHgE1QFK5xDn0kuw\nRQ8gjO6CEWOhcRNUtIOQAEOJMOZdhOR1EBYDgkDww1/iUSqRZBNBpRBt/Rak+FTEJa/DyV2o3f28\n3zSCwoJTZLjqOZU1ncSqs4itZ6C5H2JESF89XEvvqxIoH4Bv34PEbFD8iBPSMAu3oK9xIdji8Ze8\nicdWQXLmXBLf2o4i2RG8gyD48TV8T/i4ZAzOaMxfVMHK2yBBgpLjeCP34o7fgpn3EPmjGLmqQmAI\nzn4AJ56DU8+jBrpRBzsJVQSQKhoRjtuRf/ATeKGEc7+2Yn69BbkjHqGhBs92N+2v3M6I0t0YOn04\nm5pRVj2Jx/M1AykHUEIdaJv7idpRh7ZMQLSY0TsEIip7qbl+BLqcK9CbV+C1fILD7MPSex5iQg5i\nQIu0dyNoPBCfDBELIaOT/rXv03fiVSpunssI8QC5xbsYc7qVJGGAHUmFlEWnkp22GM3x38FACF9B\nHlE7B5E02bh2HcE4YgDz+VPRmRKG04xnXgORuVDzOUy8HlHUYSYbUdDRqduA4YuD6NIsCENOgqlP\nEerbhNgjEzZlCsG7n6UhpwmH3ETCiRoSjJVE10wkpnAZCw7fTmnCat5OiKcj5GWWZEX8JxLxPyJO\n+KKHCv7mOOGvHq78sf39VfzPtoTVILheBnwgZYB+5XDm0L/F4Zfg1FOQ+zxcfhkOniDady9QDs4b\nwfALkPNBisZQGsIQPnN45jqaCE5MROipQ1pRRaDjFcRWH6YdXxFz1XK8TzRiefo4ss4Ivq+ozvqc\nsKFaqgmiTLiU6Q9uRuiKgJNOSJJBlRFMnaiJENr3EWJXLmLuFjj5DRj9qKMuRn1uHWqPgBgzEY24\nizC9GX/2PAy6ymHpxEPvoza3gltECAkQPQ/ieiF3Iqgq6sJ5qMXHUC1hiDV+pNHpeBLgeGoBYz4E\nXW48nClBbfch+MwoYw14fG8Spp8AQE/DB7SN/I4xJZV4rVEMaj/HmF6EdswtSCW3oCzMot4byfzS\nL6BDjz5eJO+zrZyccRmTOrTgeA1EBSrfAcUCbgc0dDGwZB2mrCkIYjOqby+ec0vxzrYiZ80nlOKh\nKmBmuvtB1CYtsiEFYjtQtCMoe7ERqbGFzHfOwD3PglYLgQdQoueidB3GwO8QGK5Xzreb4EwJLE6F\n6i+Gy0rNeBah5A1QB5HGyQgtIBoNdGZfQPCL7aR+MUTl+hTyytsIvGXCmumi216CO6jDbYuix9dG\n/C9nYRR1mF8KgtiHGi4gZIhgVcHrA6MdxRJDwvZGNN7XEO+vwmCox284DSlTYagX7faPQGmF2FUw\n8DmsvZegXyFwZhnxLgdJ/jhQ44YF7EUDBqWUyzq3UG44w7MmE3eYwgh26sg+cJih19/CenEREddf\nh5izBLw98N1FMGHd8EGkNRmC3uE4YTkGABsT0Mn3Elr5GUMnuzDrVcTP1yKlKzjM0LGoGW35fFIq\nJQy/bYf3HyFQ/RKVuUOE9G+RsPor1ukXcwMqbQRwEiL8J04v/8S05b8LP+1Z+rEQZDCuBfsKCHWA\n0guGtSD+cVOGglDxynCNtTFXwJQVwx/jRdRlg5oC1h3geRlcP4Ntl0PqYpj5BLhb4XQO6lA6fVMm\nEi3o0Kb9mkMRC8n4YC2j9uwiOD4fzw/PoVt4D8VjPkL3ZS1JLjdDkzKYkLMGvt8FnkEI6OHS50Hq\ngLbHoEJEqPURMNejyxJRM/SoniyUP7yHeroa6ZHH4epbkP8wH/3CSfj1szDYx6HeO5JQtgOpMBe2\n9oItBMuvgm9fQPU1QNN6VNs03IcjCWvsREgZD8lu4uVU2hx2xKguqNoC/X6EaathZBDRV4uxqRHy\neqG3l+hDZUS3N+PLzUDKXU+cJgk+vRjcFahTWzhQeQmJCWYS2ivoe9WC7b5OwuvBnNlOw+AZ0pMC\nqI0WhJXToCkZhDIYE8LeV4fwwnJq5hZCwErblN8y8tPPseatRXVuY0CcQrHXzLSevZAZgm494tLz\nGX9yN/Le8YRc0agX/wIh4AIhH2XyZAxfdiIuXguBADxzH+j0sP5RaN8HBisUXEnIdRwxaQqCIRL7\n6CJ6T95ASeFoTI4dZMyJQZ8WJLtOwSToaalPIP3pBhZu+gFvmoHIsJEM5BZg7RpALN4L7U2AFkHW\nQZQI+gAMRIDTg86chpQ2FU9/KerXjyFfcTOm0A5C/ZuQPn0TjAZwGeDkFlCB47chx8QQ+3I77QsW\nQ0czCXsyYU49RLSDJhlS3mGkMkBO1Xj2jzqf0kIb4z/cT3KLG6u8G6HMBaPXwqd3wPnfAw1wZDUN\nWfeQGJuBdvulEJUA4adAN0DYUAyhLCMdrw9ivDYHSSnDm5LBYL6HjNONiL0JyKu24r7mRXxJ22lK\nmINDbCdLv55YzSIARASSfyJJEP8RfipSlv/ztSPESLDtAtt3ICXD4DXguAdCzXDgM/BmQsZiaN8J\n+66H1l2g/vGkVzAM+2IdwPbzQNDAvFcg1A8NU8Ebh+ZUDlbhVnq5mwPUc84qE3vLWXyuaFomu+iL\nO03vzjzCXe2kbY4hamoRdeIZqgJfoN5+AkbGwJ0fQt5k+HonzDIijFMQchXEMgfB79sJ1Y5BzV2L\ntPEH5O+PIt5wF5w6AHGXYe4tx/TA63DbBNQwE/4cI4N+D46XMgjOd8CHa+DsFrxbFtD/pR3/3Q+g\nDfQjtMpQ2g+/qyD+vSPkfFFLjUmFE25oNsBvPoXfV4HmAoSofNBEQUwmnPoMBq0MTJxDT3YrGI3g\n8lKrjWTOp3twDJrIdHyJoBOxPfoMvhM6gtpycrZtomNCAqc7RVoCLihPhKOf0RzmomZKGHGLl6MX\nhhhn7SPTNomevk5eW/oUN7gjqQyOxqs6sLticYZH4o2eCu0BVEVFOn4KdYUR/bqHEAaq4JNfQ8Sb\nyJpsRG0knPgebrwEpp0H6x+GXfdA8YuQeRchqxHx9B+G3TN1z2HetppY5yBzdx8nr70JOTmJVlsq\npzMiONyeSNsVozk0bjzdUwoZVIyI9l6yNHmIA+2w5BbABDFmKPTBQQ+QDfcdh7n3Qf0+5Aufw/SL\nckKrf45TbcbZP4jw6a+HReBnXo+qt6Fkq5ATBwrgXgPBfvorTxJ/3QGo7QBU8DYARpB00HQL0tAs\nRh4owGgUObX2YuSfXYsncBO+CjvqhhGg7oWyR6DsAwilsiXUSXH8OPxOGUaZIU6B5Hth4nG8vmja\nJozA81Ur/pw4tPY2krpT8fVMwNU/yPH4j2i9fhymkJ4xx+xME18j/o8E/P8aQkh/8+ufiZ/GreCf\nDUELcvrwS78MAuUw9BSq/juc2efhtHaSOOoAKAHYtYzkM92QnghZa0AOg+9+AGcAVj4DzvfB+QHY\nHoe8NfDqGvShNGqUVBTNM/zM/STNm+5n07zZLMjYj0mtwOWPYxQL8T+zHMn/Gn2aMJqrt5N69iUM\nbSK47oYz5bD6ZtSeUtQACEcVRIuOQP4CHPc9S78hAruiYs8Op98T5M3M6egypvD4nk8Yfe4M4i2v\nIbibkXW7aZ3cTey+UoJdMlKgByxJ+Pa6iag4TKgvQECjwR1uwVLkQzwXjtAeiyUgIU/T4V86A+3Y\nVyAiCmKHkzPouROCrSAngTmfvsmVhH9+AN9yH6pzP8GsLC4/8xbnJx5lutgGDhNojAgPrkFrMCDe\nLuJ6WWV8TitNyWEkjYiHiq2QfDHRlz/IW/4N9MtNTHx5KjOqKsB/mLXvDBDIK8GXeojdebNJ39mE\nqbEWu1vkjM/FPLMeffXLaIZEVPEMiFfCUAVkLIHeBujuB30c3HkV3Pc0ZCbD0YfB3oBasguqv8W3\nPBvdlEeQ9j8MsgHH3NsJhnYTs/sUcSdX0x/6kJStXRgmRtK0cTJJn76KJ3gruo++5+DPR5O+uxjB\n2QNrNg0nkgRMsHsDflsEfee3E3WsAvXeGNxLk9GNTMRTuhbn+AsxSZvob4gh5kQvwcUhtGoFyN2Q\nqsBgkEGjGYM+lob8NAzphRQcP4swIx4e+AK6X4GBCuhsg22LoKgdMfETYpM2Up+TzlOHTAR/Pgre\nuQlNfweKJxyfIRNxyu10jz5LB19wJDCOMS3vEJjnx2M5D1m6Dm0wDrn0XmrDYjn3iwjSb27CILpo\nsk6jf0wmccl+bM1jGXMgB3mqARp6Yfy7yGGZf3nP/TeVPfp78FMpef+/g4T/BCp+XJoWhqwS1sMK\njDxIvD0Z9JvBcAkkz0Vb/wqIMuy9FnrLhg+kVr0J7lugtwISToBuzHClZFsx3tqRHM/8kBXE4Gj+\nGYGeUpK/LsQ4GIWYXU+qV0ZoLEE38C2qp5xr9Bp82zLouW8xrtaTZChxaA8ehmceofiCZQTHdZMg\nthPX1IXw/afsmjmR+mlXY5MlwrvqsLVVMC1lPCmtVYzmBG1Pp2ErfhhzuQsxppMRnyTTtdqA0uNF\n059OQOpFys7H3REgbEw3ikFCFoIEK7vQ9AXB3Iugk8ncHaKxaASpYiNS7Kj/O2mGIvAchP50SB9N\naIoPsbgEzTYV0qcyMOMG9pTdhj6wH1/5PJT+AbqOOYmNBenhj6F/DcZ5JkJ1dYxYaaQzYz2OC1sJ\n4UJTeT2zux0cmJ5Cc2cqzoFzmLWnCa5WcWV201WRistiJLm2H32zC9NQiGSpG+GyxTD/BZS3Z6Ce\nvx4CE+D7y0F/FjpegzMKVITBAgM0vArNXij6BV6pBX3Qgy8+Fo3mNiTTCFhTBQ2fILR8jnYsCB4X\nRItorQUEupwED/ZimhiFXLsf05licLoZvaWaoZGTMLU2IGy8FoK+YeLRDaDd20z8uAtg8iiChTcS\ntucrFEcHRpcdMasZQ0sZtoM91K9KZUhrY2RgLJJjAGEwnFByLy3562ju3MR5r69F6E+H5WnQ0gHW\neAh2QeE2aL0aRisQsx+kcHyTz4PgSYSKg2hOeHjvyivJOHOEAtII720l9OKVxIgi0St03JL5Bp1R\n6wnY4vHTi5Mz+KUt+KO/xdjjJHEwGXfIiMYcwhxuJO7OE2jjalGzliIGN6Km1CLEvwgRI//15go5\noKl02Pd+/ZMga/4rt/bfjf+fhP8L4eUUIXoY4hAKXYQxF2PPePryDuI13Uyj2onF+w2RQSOBxCjE\nPi2hqDgMpc2Q9sdYwuLHIcYHGc8MEzDQa3QTltdJadgqrmIGwqkPaI+vQ794iKLtR6makMbklx2I\nBckEqxXU0VchyE9iFbTIweMI+zW46htxH60hECtiDAaZGlaFMKMB5kSjHguCLsAVb99FT6GV5qp+\nJMfHWBs9THBNQgoeRhN0kXTAhWbk01RN34Nwoo70gXriD42i+fZK5M12uiOyST9yBOe0dQiBZ9Gl\njkNOmENvwQUY1i9B6TVhietGEHyEp91JbUYnOX86gfrp0P8wfd47iCwMYexKo2f6OCJ2NuGv2EJY\n8DuCNRoGfNF4KCEqRkQWbXDfs4Q2P0rrqhxc41zESj7cnQbCGquI8exH0PXg6h9ECZi4/KgfsTmW\nb+YuJO1MO+lTTmMwhojI7We5bjsWn4JHI1F742WklvajD2yGUi3YUlFaDiD1PA5payB2ObyxGDQt\nMKYV0i2QfAEcL4OMi9BXv0sIDXXpo8jOuwrQgqIQaDGAuRbL3nEoAyNBeRk5ax7eQyEUh0h40TaU\nUx+CTkVZVIC5N5x+pY+uA520PvMIs4VeMM2CwXawxMOXj0PzceS6pXBzB2z/A7xxJ7rWOpQEA8LK\njxjx/jX0L8vFL3ZisDwB+1fCtBCR3maSHzyD7qIg9jkxnM5OJLJVR+K2S9DPX42oDIH3AOjngmgF\n4JSjkktf+JBgYwvyzAtZ8fr7bF46l4hQLBHuDuQJrQS9Ev7nfcTmpJGdu5HwwkUwaiHYEgm0/Aql\n1YGzxslgZgxRmip8j4aIDN+LOGk8qjUB+r7CX+FHTNEiW/YiOKPg6G5wboOZ9XAuHF6pgfve+8kT\nMIDvJxKi9o8g4UXACwyHu/0BePovtHmJ4YwRN8Pybqf+Af3+h1BRGeQ9OngcB+kEiMNEJiF2I3uq\nicxdRQyzMAmpiIbhwwRn9FlqZuxi7BfroD8VlOdh9NMw4SuU2g855DtIkdIDqoTTeSfPZD7Mb7wL\nEN+ZjZo6i6qNSWQ9oCPiYCkTPVloHTIYq7CvGk8HG0jq6sPtu5j4zY0QKifMZCR000005XyL5pwT\n61knprPTES/cjJBzAlQPuE/j3nmK5os7MRk1nA2kMNgQwt93J7VjpzJgTMblLeXt8o3UJo8ldtoB\n8nThvCLNIb7mBHFhg9jrs7EtOAj9RpjzAoK9jv6GF8nImcjgrDGIpx8jVCdivHEjoa0XMnj2LqwN\njcPhTMmp4N6IqpcI6GXsz50jcJueYLiKsdeHGh2NqbARR9I64pUmqK0k6pOXEbZdjjoujIikQpLP\nHUds0mEbbQD3k8PcJxswJWciqjNh3zn8vQdZ9YGB06Onsdm8moua95H0XClKbA4hawvaPi9fXqTn\nukYt+klvQdlTCGosctcP0FIMHzdB130wMZWh/BHIxsnoYyaCRgZtGezIxz15MqJuDjlbTrJ3zqvM\n3BaB8O1DuG4foC2YgGAPx6Q7Tijdh7buO/RJKpqIWDQJ6xHyC1EdP0MSC5HfPIw5zkvkPWEEeu8G\n+w7Qj4SUl0BMhIt/A1uegT37ofsMXHg7xEXAN3ei5s6DXgVhxdPYar6gVzOE5vBCJF0UlZpCko6+\nhXbO9ajTRxFZey+RUzfhig/h7JmF/5P12JuexxLpwX/KiyCugaEywo1mdF+V4iyIxaBImE1hrDLP\noi2wkaE4L4ZTWnw2AePCK2BBE4JVBMdZ2HkUTDKa/AwYd4J+/10YpqxGjN2Od7MXV7KM3H8E/bVX\n4YvLRFtwDBwBgmIumrcuhrRumFYE+gVw0g5XrILZF/5XbO8fjf8plrAEvALMA9qAY8BmoPJP2iwB\nMoEsYDKwAZjyI/v9m6DgQEMeYb0/Rx6sQVUh3ugjlJCI9Ss/QkIbtGyAsXeCOQmAsEA6Md3xCHXH\nUVNBmXwPUvsx6NmHmHcDfUoMra57iBzoYEfMDdzkm4L5+Kvgc9JUL5EcNpnogwWI1jvRVx6By61w\nxEVk6iTkiBLs+4oI31ZOX1wi9WGxpOfqiOrYRHrYWHpDW2nPiMCkDxDvrUSxBFHoRF4jE1e6mbFO\nHzrN9US8vwH9iJ/B3J+B34297CkqND/gUNLIzHiA18KimakR0dutBKJ0uJExX3wlQrQTTlVD7HjE\n2PGYusx06q8ltngXim8ETUVXoSZtJ/mNd6m+MJKx7SmI/qrhysp6iaZANgnaduIye7HbNQgBmUCq\niFYNIaz5iPAv16OKcQijUsH+DFgMCOfCsOSvQ5VL8fVFoPmskqF5yXA0DEvuKggTYc/jhJAJJEdj\n6E7Eku9kao+Z7wPjGD1ST+HOcoTkNNTgWVIlAcfqUsKTrkBz0IoQLIbIBVDaCe4ImL8Kp+MsUt1J\ndLZwmD4NnG1wworfUkugsARL1DQI2cn9+CB7CnuZcHkfkrcQxenC2rgLYaEPsXkUQmEs/b9vJOn2\ncISDD8BBBRZmwtgHIHoRYc06SP+ATYGD5MU+CIZRwyni/4Lz74YwK3z4EFzxLBitBB9+GFHMgYYG\nKH4NobEdmymKmpWZtGS/QNorK1DHaTEsfA623j4s46mzEebaT9jEK8FfgmXCIZzyBKruLmJs+wH0\ndW2IyfMpv+59Zk+/BLHqe8h9AZ3jPlJ1d/JaVTlzxllIFiIRwi7gcOx48j0dREa2QtR3EGgHrQWU\nCnwTL8Xg+wTDEjP+U0Z0y6chtR6k+9vD6FJb0V3tgl0KcuptcIkJ+k2AGX6/D5ZNhhF+OFMwrBsd\ndSlELP7LYaE/AfxPIeFJQC3Q+MfrT4AL+NckvBx474/vjwLhQCzDVcv+qZCwEsZkwmwTUc++jvr1\nXYSyC9BETMNfW4KqFdDNfhtKfgWWNkjORXz6KxLG5IM2jUBeHYI1FimiALofhLoHmGfN5AudgUsi\n7+Im3TwQXJA6A8+E+6i44UYWf/YZ7qnjCMWoCLEjEF7tgVVFhD6+C2WZhrTH6iE/B+bOJ+L4cZyh\nAQbowdhegxUJg9FNx+IWvG8Wwew4/OO6UDUW1JEiMcIi5KpS5DFjUF0fIOx8H58rkoOaOKagJSp8\nEkLkHFb/8fcXDxjJyQN168UYjEdRZZGQ2YRj41r8jTKWnk/QaIJ4wrT0Ztal7AAAIABJREFU5GpJ\nkaoQlt5NT1wcKU0vUTtyiOyyZLDMhRN7sPr78Q0KBAdF/FuMaO65F8+5TzBNeAGDfjx0HkTofAfK\nPFAVDg8eB+UQVNyHV3SjHd2B8I4e4Ww6pvIDMPQl6MPhuj14PljJ4Oyx8OZukk5cjt9ZSoExmsPj\nU2jxDpGwsx1xpobl9aMZ4DAubsSiH4uYfTWcfgtmbobrpuO9YyVnL3ExoWYFQuo4iMiDtPm4LvkC\n+VQDlj1jESrPoYZ0RG7aQuT5OZzgfCYe7qTg9lMIH90I4geI2jyo/xpJmoNY9AV4b4L698DZAd/d\nAPoBqFIg6MMlWFB12Qii/s8X4ZwbQNLCg0XwYhOcW4N48MFh7RDNAvjZh0g1pzFa6zB++zQJs0W0\nkghfvwnFr8JFLwAQ7N+AI+EJbEtuQ9yXgDW6hel9Sagd+/Bnj0dj3sGEFDtBNYBsy0fwvI/6YTmB\n3h2sviCGQ1lF6NTbMRXfQbikEurcN/yEZ1kKgFK/F/XoK0RkVmIS6hF0EtYPdqIIXYQ+HSQ4pgmb\nJw3VXY6aLhOszkeTm0AwQo/86nbEVVfC9IcAL6gBME0E0/ifLAHDTydO+MeOYgoQzf/Vz0wD8oAd\nf9LmBoZFLP5FC+5CoIQ/V5v/p2XMeYWDDKZ+hzj1JsSCarp2NSD3DmEIORDObhwul9PbCn37INOL\nIJtR7Rr851vQ7WxGGPkURF4DTiva3g/pjLkBTXk7tuZm0BogbToH169nwn33YYyKQtAEEHfvQBDt\nCEtdoOnDMyuIZouM5t02WLEWZl6M+P1O9D/LwlDWgtDnQ0gCAT/KoBHLjFTUGCch+Uos5ZEYLb9D\nri9GdOxDMbpRVTdBTw8tNgn9KCspWc8hZV7/f35z6GwJ8iuP4xUD6FKWM9QeQd8bbzBY7UNylBKZ\nV4HB60Gy6dElxhCc/RA7swIo/hZGnNtHKHc+3e7TRO/Yg7j3Bej2YJ6xggOz8ihMVbDM3oAmbjqa\nfT/gzu3FeOZ1aD8CeffAkT1g0UDsKLyZ09kVVoG/zU34fgeS34uuuglfpJZQyIHc34S6/220VW7M\nm2uR5ACGskoMXzUgnraT6OpF29pJYMRYtGlhaLdsw7w7DM4bgcZ2EMFYBfUuSAsQlGs5PbWewgYR\nXd1nECqD7KkENfUMpD2H5oQObU0l6GT8BeHoKnqxHvMxcP5Kaj3NJHoL0C7WQcpHYFeh9jChoBP9\n4nUIlkTQJUO4F9RWhOxsOFFPyL+XqHNfcNAURkHEmD9ffM4B+OhaMAbg4LMI3Q2ISUGY/BQseQYs\n8aifP4Su2Ip72RC2pEik46WIG4/hHhtFw6wp1Gta+NrsYaw8H71jEOwvQo0E8lcIGg+k76Fb3E7M\nV0uRnn2eUMphQvJXqLsqkMqH8E6dQG7qQ3wsVpAcv5q44+vxDFYQHzEBjAkotTX4phShthupW5eK\n8VwienEiQm4mavfjVGMhpSWIxl6DoDmPUHEbrg8V/LsG0Xmqqb00k6acZnpCB/AaI1BtS9GGTUOU\nhv3V/wxxn39Extysh2b+zRlzex8+9GP7+6v4sZbw36q482//gb/4vT8l4dmzZzN79uz/1KD+FB72\n0MOlRPA0Q4ejcZ3rIumWMqS23yEcr4IVj8GZR+HYDmgHvAGQThOMlpBb8xH8MrSWQPoV+DfVoi24\nhtnOT/lw9FIy7r4bIRSkc/Hj6KOisOXno57bglT9K4TzVZQWPcLQRBR9IyFbON6UZgx/KAJlCKKT\noekonC6CcTOQnMVw2o+s9xNtGYGol5DCv8FQ9TwEuqHuSYTmHji/DlHW4nrnXr5NbCYuzUnBKyaC\n+XvRXDoWVVUZ+N3ldD70FZqwEKFoHeKlb2Kb9SrRsoCAjC9eIBTwIFkNSNJCmHgJtvbTXHj6aU40\nz6Ns4wFi0z4gP9OIaE1BjU1HTStFiPst5+0qgIO1MGsZcunVSIFiAlVlsN8EVc0wbzl4HoLwAFTv\nR68zsNi1G7d3CG/uhRj8+3CkhuP35hAuR4DNhuKuRuz/AWHuYsSjp8HRgpojIL5biXLiFowvfIra\nsR+SgVVmBFHEp/WgM61EOLsVJj6B2vQlFcYBsj6vwJg3EmYvg9Z22Ho13oVxRPRdia6qGiZGwegV\naD67CdUqYGh1k/H9OSoyAxx4qoCJ9hqstW8jnzyLumY34SVLEQ7dA5YjEDsBKluh2w7nbYDrH0Vy\nlTAy4Kc1dBK46l8vvtAAnHgElDY4N4jaA+rKMFRpPoJihWAfwY638J7tR7tgNJne+dQP3kd2/BTa\nbu6jeGYOo+XR7AttY4YaQ1jdHtj9NRg9sMMLJ0W6b1xOdMMviFZmIu75EkZOQE4cwP9+CN+cZfQ/\n3EX86xXwTQ7X3P0sb0X5mRWXwcjqT6DxfkL7LyX46RY0D92PkL4TrzeGQKML9Zp36PRVEesvIbs5\nEk2XAHe9hKKMQN1fjH5NOnJbG4Eilcxx3yC5+gkcuo/BRcn0SWU0sgWFADIG9EThppMcrsQ4XG/m\n78bevXvZu3fvjyODf4Ofijvix96epjBcVfRforXvYzjM/E8P514D9jLsqgCoAmbx5+6If7iKmoKL\nfu5EOzCL5nv3ok9MJv36K1C2r8En9eLa4MN4xR2ISeng6UCW7ydQnoTcp8W/ogLD3iD4RIgU0ARs\nOPc4MN15B8K0Uexr3EpP8iQubEin9bGbSSnSEljeiqiYkd/UItx/DDUoELp5FN7f6/A2jEGjTcR6\ntg06D0HRCjieBdPmQPC64WyuiA1w9AYYn4n3eDOqUoGECe3szbDjfljxLphjofEU/a/eiaTvQCrp\nRTN+GbpH/wCijLukBOfvlqEc6cEwZwHml2YwKL2I7VkXGEyw9G1ad99L+YIJLPzkK4jRoYx9izrT\nHjJrzIh1ZQwYNNQ3HyHcW4i/7gy6NC8RI/yYZhYgH+9jqOg2whruQAjK0L+CrsIzRH7rQC64Fi56\nCLZtgPINkDcdar6D6B5ImgdlAlx+L/ZTa1E+krBV9yA8+T6MnQD3FIHXD1fchfrxs4TaepBX/Qpl\noATl0HbkZD9M1qKaIgnGiwTSLiAkncS8rxZGROMwdGEc8iAfSYTLZ4NpHYRy4IHlqBYrwrqX4cV7\nYIQf9bJ3CL4zG825k6jBCXC8hO5No+nRhnPKmsCoyiZGVHbhvHg58S3jENpOQvtxiKtDbXTC2PUI\nGx+BRTdCxx9oj76MLms/Y/N+Dz4FDj0M8Xng3wBnRSAGmusINgxCuB9p+rMIF92OKgh4r0vDPlMi\nwbUS7H7a74pC9BzGNXCWztAUWuOns/i7L9A59PRcWouoiSNuSyOiTgYX1LelM8IbRC06jmCbD46d\nqF1jUWa8TmvEqyTwOKLaR7BuA/Iz3+ObsZRHr5jOrftfJr7tMIpuDGJePGr/fgKZQ+yLnUSu2ICl\nM5lgdT2Wrl40G0MIubEMPLUJjr5P6N1SzIkNeJa5MSQvQBv56fCG6ymHA7+GokchuhCAAC6a2EEH\nBzESSxaXYSHtR+/tf4SK2v3qb/7mxk8Ij/7Y/v4qfqwlfJzhA7c0hu3I1cBl/6bNZuAWhkl4CjDA\nf4E/GEBAi7J9OTWvvU7WY49hGTUKSrYR+uAYwqqpGBYVo9gbEWOTQBeL32bAMNRAMNuAqKYjhPkI\nFjchSBpIVJAMYSiVu5DOvYjWlsf+MaOYtvdWYp/0ElJj0ezSILTZ8N5yJXK4A7GnjNAEH0NDCrK3\nBtkhgrwDXBFwrg+664Yzq0bVQHQBqudXOEQzwvY9eHWxCL5wGiLjEHZex+gTNWiLs0Fnhd4OIiIj\nCdZ3IYzVIF+/cjiuGTBOmoRxlhY1H7ArcEqHxhhCHb8CoasZTr5BUvoyAsWHUE97IXoIoe4SetYt\nQTtpAWkXPIJBaAbuYETfnaiiCfcTM7Hv1tK5pxONw05cz10MTonEHC0idTVjTvglQ4sOED7uj4u6\ncBYMdEDdb6FQC6VjwNcO6cthqIZw7zlOFV2CxVWBpu4MzF4E+ePg6pehfC+4mvDOLyQs4EX47DuU\nK9NRO88hNAZQf/Y5VQlvkl9fitNQhmL30eyaTOikhxGG6WA5Bb49wwk55tvhsa0IAz3wyq2AdliR\n7A+FON/rwzZOQAjWoVplbJ9LhC85Tps0nuoUG8LIbjI8RQgJy6D5I9AboNQOI6eCfxsU5UHft3Bm\nIQl33I2x8lnoa/v/2Hvv6DrKa+//88zM6UXSUa+WZEmWZcmSe8c2tsHGxmCwAdM7hBaSkFwgFBMC\nFy4EQkhCL6YZMDYu4I5tjHuVLVmyZfXepSOdfs7M/P5Q3ptyL/fl/kKycvPez1rP0lpnZumZc87s\n79mzn/3sDfufAG8VJB6AlN9C6dvgD6Hf+wke66/xSauI2xnB+LMlBP0ulKLpiPO+JtCfhjlpEfGf\nr6BqSQPD+tsRB08yfhA2TZ3L+KK7iZZa6A0/T/fsehyVnVikEFowjpDXi+FUDHrCZgg76R5zM93G\nX5G53YWh5X2Iike++AV4Tca6bhVPLXqKiBpGv2chcmY+2M6hK0kYOofjspjwhVrwR9rQcqx0lgzD\nFe/GfjJAQ/hhQhPcuLw9WKsTsBmnoqiZfzS4+EIYuRzeLYErd0LGTAzYyGEpOSz9e5j8f4vgP8j2\n6r9WhCMMCexWhuLLbzG0KHfHH46/BmxiKEOiGvACN/2Vc/5f0XWd9tWr6dmxA3NGBmPWrEEy/CFv\n0WzDeOHlGK9Zit64Hy1xP1LcjwijED7rQrFA+HyBtTKC5GhFmTUP/EG48VGkO5fRkfMDAgt3kt1U\nypzAHqouHkmeIR4FO4wIIZ/9GtPGnxI2aoTnxyPND2HdqTJQ6MZ4ci/0jgLvOShYBuIQ2jvPoU+9\nAMmwjhNiCfGDJpIbZ+Ds/gaiE/DqYY6Mz6MuP4eE9n7GHSvHnppKsMyKKc+LcATh1CfQcwQiHggP\nomflgLEN1fUN8le7sIdViN4ENx2CqEw4+DvSd1ZDJAIhI2L6RYSSVdpN3WQKgUfbjb3JiP/Yesxt\nv8Uyczy2GdOh+hNCqh8pRqM2LZokvYf4KXOw9CWj5qcO7RoDSB4Ops8gbTicq4DUGNj7Ncy8Ep74\niP7ri0h25OAbU0bUO89D4ZDXhMMFUy4jdHIRoqUefd9rDLz+IeYNj8Bx0B+QGCy9lqSjPrRhuRhr\nBF0lMQx66klZ0Em7vYaElQ505wcotrF/vCESM+DRT+GRi+HIJsL1HvylEup9LyPvfBbtYhNKUxuC\ny5leexxPeRnnlufTc+yX2LLTYKASfP0w933wt0NgI7p2DGJcCOUsxI4kOhyAlElw8e+g5V5Ifw3W\nPQ+9rZCUg9j7Bs7pl2OLvpvAhY0oCU48gXeJe6mPaGcx/XNeJf53n3LkR5MYXVOPkh4mdVDFNHER\n44vP42OexaYJlvdDdPMFeAxfEtxjxLPQwbFJTsYfGkEk4uJIrY7S9iZSt0KpnI7EKRK3+MmoPIGY\nOI3wF+sR51+Koa8R8e5W9MkR9Lgy9Ixm5A1mxiky7G6Hq2aiBXcjRY1BD9cSabGTGb4D228fJ7Av\nE8vH2+Dkg7BnNViDMOMOcMRDzuKh2iqHnoH08/6hd839o9SO+D6uYjN/vhAHQ+L7p9zzPczznal+\n8kmqH3+c4o8+ImX5Xzjm0Qlwy6/A7EH4RyIFV6AF7sGjDsdqn45W0AShg0gjfwXKM9BaBoZ01OqX\n8cYITvje4Tw1AVNoOIu+nI338lt4jy+ZEIxn4qnnEKFogikZKCu/Qm30o6cJDEdD1F2Rim1lEP1n\nnyGcChx5n7pkGX/aMCzBcpI/T6G4aAZy72fg6gaTG3KmkG4z4Z24mEFep9WTwReKjYJXTuF+cDLp\njmySa3ZSOcmMMIcxSHZGeUCo90LlfpSpz6H9/nVCth70CVbk3i8wGpdCdQ8S8XjnhTF2y5i8NRQf\nNNCVUQebPsJs7iD7mB/JG0SflYBUVwNJ58AYh1FWwOlkZE077iIDtDyLqDDgyP2TDi7dx9H6W5F8\n7qFnntovwKPD1kfQ88djOOrGGtmI7m5DD2mI55+AGTmolDNY+i69NdVkHDwLU0ah2X7Bs7deys3u\nfhI3DmC824+QdZQ1J/HFOzAIH5l7O6kvSiOt7h6Cw6uJ2KpxMvbPv3chQWwfdAgUm4R5Qir0vQg3\nX4m26yMkk0y4pgUONRDTHYYlQUqnxhJ78l1sjgXgrAOzhvCWQ6AD3bQYff8GtPH9yAdGowcNuLsX\nEt3ZBE1dULsEKrtg+o9AkmDbs0it5UjpYzCULEE7/DTGcbmQlo6lsYIOBumZ20VWmaCvaCSJ55oI\nulLYbz+At/UEJfGZ5HW9j1ZthNgLMKwZT99NEuYcN3H1IaSExeg5t2GefC1qeBTpn2gk9m+gfXwm\nR6cWcGRVF4U3341xhkT44HEc3TZcDc2YjjSiX2tG6s+D3aWIjCj04gCo25F6JETnaUgGzyQnzi82\nIp9tRrVPBsUImdmQfzl0yPD5z4ayQGbeBXHTYfStEPKAyfE3t/f/v/yjxIT/MX4Kvkc8Z84gJIlp\npaU4Ro/+DyuzekYOKtWo+mn0GAO64XEClhRsza+hHM4klB/CeGA8FJbDtPfBewtB2yBK8xEMP4xm\nwkAfduNqSLGi/uY+nJfbmUwR75u+JH7Cm2STikQ7vanXYjVXYn7bg6rIRDcXEqUY8D/+GJa33qN7\ndA6hmt+jRxuJ2t2COWCFzb+EoAcyM1ELchEhDXnh64wSDtoDbzLq1U2wTkd8uJtDmV52hCoosDox\nRrsYbrwel54PNU+B7wmYYYXGXyA9vRnzc08QHvVjAgO/Ilz7KpYdjUipQcz5OQTLuzFW9eMId1Gb\nMQZ9Yi/mz/yIGNBzdeS9AYidCYYCmNAPnVWgRFBq4vDEZWE1f4PlWAAGHocrVqAn5hBs0vEfjkYe\no2FFQlc8DIwfRmxsAmzbS3hYNF3FdjIGNMKpCRhWluJ7qA3RrWF7dzPm3YMowzTauzNxvubmmqum\n0J67hajGANaqXiwjNfyLjRzOnU7RZ3tRCiDnixbM7j0Es/1I6qz/mPcT8oLaAX4jhktHIVZUIF9b\nQcTVgRrZij7YSOjAAaydPvTREtP6MvA0NDBgd2MtfAq8O+HMh4i+CtBBaCfhtE7zWBeRlF6iowaw\nt5ZBfTT4uuBk+9BTx6x7hkR43JVgj4OmE0P5wf1NmFe3oR+0IM6fSFgqoC9USZfVQHFVLe6ASldc\nkKK248S1V4N7AD2UT+d7Ad56Q+eqshziz8zCkjOPk6lvE3/q17j1BmzKWb42TKVpmpllZ2JIFXGo\nR3tpyW+l51fJJDmnk3XmVRSTAzkooS6cirSuHEQXXJ8AJBPYfRZzkhe6FMgMgwUsaamEG8sRviKk\n+Bjw74fBTyB8CDJfgex3oL8F1j0MRz6Ey1+A2ff+HS3/v8//ivDfCHt+PjmPPIJOhCCfEOJzFMai\nUo1OGIERmRxkRmLY7kPK8+NOuhctdBBbdj2RbAXj4RBsP0Ck/gQdRjPOznYUo4b9tIzneCpiNuBw\nEPQ20qZvoEQswMZSvuIwiRTRy9MkTXgGZe1SxB0v4Iuxk/TY7Yh4BdOUsairZxBvP0T8uDUwdi/s\nfhHSTOgPn0LbsBzvFcnIfg8W7RbQ6lF724gEKwiEfMQ+UoiU6GSOP4rZDaWclsIcVZOp7fuIsf2Q\nG0oE7TH45TK4zAbKW/AvNgx6JYbsT9A/vIvIiA68FrDvq0EymOm7YzQxTfFEDInovz6O9KMgWouR\nwZZYLAVjMN2/Ggx/iJ9t3wLhHjTVRFpTIaWzuhmRNwmb7R3Y+glapxERysZYYia4bZDATIjEWVHH\netAGatEusGA96YfJKl1yEdg6iWtKxTLgRH+tD71mFNINsWgNdUSbvXR6RtB3/nKKFvnpm59C77lk\nlEkXEBVcxaTju/FHXYF6QTd+XwTLT3dhdnegdtfBZWPBmTp0zSE3HLkbdDeQDpfsR3x+PbrVRYT1\nRIrr6Ou1kHzCjRaxop03A+mMB2skDcOIs+B7HbRNUDAN3foZQhkNpd8gxq4mfd97aEqYQKJGfeZE\n7MPyiCtPxHh6LTxQPiTAMCTAQkDGWGhvI9j9FoayEGJyGFJDxJ0KUDYxB09nFN3mWtLPtRN/+BjM\nvhQ99Rw0aOhd5ST0SVx0toeN00q4/MXt2BddTL1BJic5D9V9FKfdxwUnviFkXEqfJYTeGCJjWg7D\npMWES1+j1bmRU5eMwdo8QFqHjqNqL7pdIEU0SLCg627Ms30QDSJHgrYIIgTmcBl1ky4i9YgBeVgs\n9P0CAicg5V2Q7EPvMToVFv8SJl4DvY3QVQ0JuX9nBfju/KPkCf/TiTCAjkaQDwmxEx0PRhYgMxLB\nn+xn93VDKAZKW3Cdewg5L0TQpSA3hRFJdga8LtRAGS7TVMzJKqHhg5h+Y8CW3ABbJkPGMkyuKNpL\nf03HmH2M5UnMkTpOyfdTsP1agrUPoribYdp4HLUdDM65nP6cQ0QfPIkhdgCypqJb1xOauhMlIKHn\ndhHuH41xjBl7s4Tk6YaBGyHzXiKf1iBbPNidyUiZXjhxHVjsSL3nKNKbKOzcT3NbPkEP9I6fj2vr\nSlj+Cxj8V4j/Hegh8G2EqksQ2V0oqZdjO7Qf1dGOFIoiaus5UNrAakZ/cCl6sh+Jg0hP+uj93RSS\nDX9cwIgk3k147ysEvjmHc+o5snZZ6Bw1j4zoV5BzZiAPRJA2XoOxtR73iAL8D1ZhXByP2ZOBN+96\nzlx4KWeW7GWB/2maXS4qmUXB9GhGfLkL0ydbUV6bidIXhp4OzLd/RIo9Fdv0WfRuupveCcMY0Xcp\n/jVPExguiKnz4pz9CZ7gaCJWG3rmLNzLzFiiliJH/H/8ro1R4LoKZs+BDdtA15EzMlGbm5Fy0vCS\nQnxVHXKvBA9vRjm0HBYcQNq3G9Pdd+K5K4h50TEM4g8VNTqa4F+WwO1PUze6mCzLHswDkP7BUSLj\nJ9Ka04z2wFRig1twntbQ82cglW6FScuhbC988CxGkx9pGDD5ASi5mO7Gm+iPnsps612Y2sYTznsM\n5WQ/HF+Dvs4A1mhEcz9Ck0g5tYcFo8P0NG5HaNV4pArqkyYS27aBGMN56MXRZG44hIgpQA0dxKcd\nwnhsDobGyQzr8DBs7Vo8JfE05dsYTJ6CWqAyep+KbdRD8Oq16M0KnmoJx6/fQIReBHcLYuRY4twX\nEDQ/jtHRBPEfQPiHQ+2u/hRX+tD4H8DfMCb8HLAICAE1DK2Dub/t5H/c7Sx/BQIJMzfgZCVRfInC\n6D8KsK5D+6uw73kI9IDfiFSYg2T3ILtl+oZ9wZp5d2NM8BI9FiyxnWjhHsTRAbQT7Xhrc1HlNCh/\nDqlvOzkbnSjYcbe9T+JHtxHte5Btc6IRZV+jeiTUrjOE37iGvvkqHeN1/IU+NCkJveI0YW8a0pou\n9BgTnASPRUd1dqIFjqIdqwJPIXrCz9GlcRivuxbTssWwvxFsUyDlKpC70cd/yWB0NKHLH2X4/kEc\nb/4C94Jk1GU/A6sRzqwGyYx2aBDW2WDcZoThGMJeReAmG5KvAzlhKfSDwThAKLAf6Ss3wnMVapGG\nbfnT6LVbhj46TUN0bSAc8yCyZkIKCmKMHqLNHyKd2oZ6YD1q371oo5sg+hqSD1UTPzsBmz2K8OYo\nzKm3Mj52NMvUaKItnzN22xVM2VxGOGUPHXX9fPPBPfTlBsG2DUpC0LcZxeUidslC9EdjyW7tJyJt\nxNwewFZpZSAYy0BkIZq/Do1vCPzgEGpkH5ISAzFZf35TlG+AwsUwZykEA8jp6ahNTcgU4ZLfwTht\nFlz4Y8ShJ2H0NHBkIC64FjF1KfatEXytj+I7cxn6gUdh7TMw2APJ6cQXX8/xjhLCRw2YbC5sJz9k\n2Lls0vcmEzz6ItXafVR2TqWv/S148mo4tAU6qxA2UM97lPr8JCIfXUxu+Tmmla2DurswnFxLXUYs\ng7NTIWRC0sNIU4YhlDTwR1DXnsZTL3PmB4V81bECf8RBtP84Uv0g5k2NnNhyIaetOpGGI2gxCaix\nKeycl0ydoQ7e2AQ2gb2tg/yjMqOOGjAqWVQuHEfX9h8OlWz9/Sk0UzJi0iSwtIMlDSKncfbfCXV9\nqLm3g5L+Rw/4fyh/w3rC24BRQDFQxVDq7rfyj+GPD/H36THXUwNfvQitH8GF98Il7yFF1qL399Md\nyKF85EwubC3C9EEdYtoIiGwgNDUaLc2BctqIiDtJaDAZU/Q8+PowhlofSbHxnHV8SnTUZaRtXIc3\nQ6NyVAIpA500J5TjrNNxbe0mzlWIIdGJnFGGGAwg7TpAZMpojAW/QSr/FGuFH22PhNdgom9WJoPp\nvWjhM0iTRhPkGMb3SpEbGyErdqi8Zv92/Mo2rD31xPZNQ+xbi2SZQiD3HGVxx0k9UYNo2os3+kIM\nz1yEmLAYxl4KyoUEbWcI5fZiKE9Cb9qFcMr0JURhOOLBtqYM6lrRpnjoT3RhObML2bgHEepAaqvE\ntGARpmFfIk4nIWIL8aUk0D92NPbuF9HazyEeC0MRSHNHIMelYLjsMUzX38HgihVEPl+Jdc+XyHUd\niBEz8U2/gMakfSTmdzBGz8RiWQhR/TBhM5Tdh975NS37N9Fu8GC3OJDsbZj74jDWNRG5fSvvZJaQ\nIk5h0Tz4LUlEjP3Ym19FUn87FH5QCkA3wbFVMPF6yCoAxYDW3Y3a0oKpZBaSdArRXonQ42HumzCw\nAVyXD4UPZlyCiFYxv/Q2IldDnF6PThci3gBRvRg622mN8hJ3ogNDrRsRyEB3nEYM78DeOY+oNa1Y\n2mqJyL2Ep5VgPlwDynFwSLQbatHjihBxBzDXGzE6Y+lOdmFr6cebJlClKJx9o2hIKGFPxEGvbODA\n8vFUFqUwUFOJfWs/Kb+qIqGjDKO5i6ZrVWTHABm2csRFY4ntTUI/u0tNAAAgAElEQVTpNyGGOUji\nBOqRAU4vHk7yJ+3oxSMQ3i7k9LmkHBog9Y01WFwOxGPrkZ59kYivEpH4PproRR7ogRIBA3MJNafQ\nNTeWGPde6H8HopeAEve3t9u/4PvYMVew4rLvLMJlT2z478xXyx83pDkYSs1d+20n/1N6wn+GGhn6\n23ICPr4RvnkJ5v0WLroaTKeGmmcGWghXQqzWzAVPvo/xiZugfB2s/Boq0hB1HgztvUiFfQS3aoRO\nSBAzCfGj1yBlFOLYmxSdLqS6GAaX38iYj1/EkRnBn1CAtFMQSgiDPYJQo/DlOvGmX4Y6+kVEswtT\nZzl643vgc4AOSkQnar+BxFULSNgxCcNtq9FvuQ5ObYVNx9HmCchaDrqBsEOjLe5WpFodfvMgPLEd\nkeHE0dJA4f7P6JwyFZ0BKu68lPbhl8C1/zokLDYnuAcxtOUiHWulek48wToVV4VO/4VWtB89g37z\n7ZgzgxjG2PGe7EbrMcPXP4G+djj3MDjCcP7d4K0gpv0ckvF9mP4whj1XIPsiSCWHUJt2obccAPcp\n5NhYYm6YjWLy03tAJzz5Lhi/iDR5LknyIjRzLM1pYci7AzLvA//rUHAneu9Z6rIaye6sx9rYg8E7\njYg9hBojoQ3+lOs6nsMX9rP32FREdQi1OYz0mQ2avRBYOVQesmYP5Mz6s9vi/3jCutYOoY9wZxhh\n8lPQWwWeP6kBIUlQMAemqshfG9CuCBMYp9L34KX4Fl+JmPYjirPvpHN8Hl5rOuLoWUSbF3GgDH3/\nC8hSmKgjHuLKnTg/eRt9cCMDE9NoL8iiN8+G5ey7+CaCFvShYmQgox/3/EyyTk8lYLPRLHVwrqiX\nzqUZpMppXDzzZSbGeJkQK+G9ZCnpY304H47m+MTzmHbkK0bc/zDpqQdJFRcR1KuQpj2EaUcN9u2j\niP/hUnIu+4Dmxenwfhkhv0Zz0TH0o5+hTsxAvywPsfYSGLUa44gAvjQZLSEBpGIIJ4I5j4GZCWSc\nfAW8PeA3gYj9u5ny900E+TuPv4KbGUrT/Vb+KWPC/05gAD68Gkx2cGXBRc+AM2noWOzb4DsGVZeC\n14zJ3jdUHWvCCIh+Dy6Kh2Y3PNWELG9H1mdA81hcq8cS2NsCBz6Hxz9H7HwbPf3HKD01FD/bR+lD\nX5J2j50caQde2YV/nBHZE09woA3Tyl1Eue9Cb61AnH4VfcBDxBSP0rEO3aqhu0EkqWjhPkTOx4is\nC/GlGzClxSM8frSskYQ/khDeB9BEK56kaIZlVBJ+X0VZNAGRPgrufgf57gkYl/RiqW1GjYtQVRcg\n+tYr4MiXsG8N+AbRCkuxvDwcMX8JpqR6zv7IRHLgB7Q3HSEz9DiRwzGYMieRsPEgnWNcBH++EeMj\ny5ASXAjTQVjRD6NeQi/uRs8xY21JpiHfyXB7A4y2oLdE4R//Jp6zjyOt+wSnlIAycQmWWddj6u9n\n4OGHkb7cguGR24k15dGfexFq93aCvEqMfSKucBOcXU/Y34jSOpKo7n70Agv6gQbknmTErIk431+F\nXhxFZHoGw9e1Ytx1Fve9BkL2GMzrVECFBdcPtWSav+LPbg05PR21sRECr0JkD0IZB1tvB4MVjFPg\nnjwIeuGut6F4HizciGg6jbRGwzSyDclyMT3iRqSuTEz6dLIKbWinI+i35hDsbaZdScZ/3ywClgAl\nz57A09mJTdboWDCHkKuZ5FovZlccxpwRKB9/jB7rwrS3mZiiNLTo8xDyaRyJt2OepTL3nbvhVBzq\n4Uo++vptfvLqOh4bsZar5u1FvV3G+Qs/vStGYmt7AHKeh9EfYK38gs7cDIzV+1HqFeTz5uIX3zCg\nXUXUmHb8jekYfSHSVx2AyaCl1kBPBtK50YicxRhc+xkcnYSy/gT0NUHHJAJyFAFrM3LsDdCwBnQH\nDByHuAv/7qb9ffBfxYS7dlfQtbvyW48D24Gk/+T1h/ljLZ2fMxQX/ui/+kf/vOGIgTb4YDkEB2Hy\nHTDtniEx/j8IAcIJFW9DggvkTshaBO3rIP4qqHwT7NGwZzdi0r0Iqwsq6hH5t2CI2gqDQSj7GQTN\naHu7EKmZcPIDolI7MB3vQU0FR00fzoMD2OsaEYWDhIUHpMOEkxoQZ5vQYoCJBuSYBRBdiUgCvRdC\n7+hEypzooovAzDDyLhVtmoLztrMo8+LRZ62n8fwpJAemo61dhVol0EhFS8/E09SCp7EH3yft4C+j\n7sUgGfkjyLnvx4ioOJixDKpOERx2FKPrYcQFV2LwtRDRTuM6UEfmvu0EiyTUUTrGyEL0ilP4Judj\nivbgd4SxJBdD1wxoa0S3tqJnhpHO5WKuO0eYcux9Y+D2FxlI2IVm34PhxmlYCp6jceU66p58En9N\nDbELF2JZtIhBzwAVNz/GQFQnclYIs7uNjqhaPL1fkfJaK1qhyqcFV9PuMDJWvgNtjwdZO4M42YpY\nPAzhiyNQMhU9yY2zsBi5yoN0pgNj7iDSBAcUxYCaAUc+g84zQ+l/zlgwRSFMJgJr3sY85Qw02Qjq\nPRiV2xAHmuFEKUxcAhZlaKPq5pfgbBVE5yG8IxFHTyAVurFa3ydiFRiqn0eY8xHKIHTWMDDyGsxd\ndcQdKCW9OQkhNWNye/De9ArKB5/jah2PsWQallEPYAh9TDivFWNoANWsY20Jo/vqMOX9CnN4GO3x\nm4ipCsHhbYTnPkTqef/CvRfbGTNjAliewfR6COOpfryhGP7V8SaFHfdgDJZjbOjCUGYk5N2P8aaf\nQnUtBvlCrFENmCtlzIkRlPWNaIXD8V1wHYNJeXhyRiHvO4vxgTcRu9/FM13D3mVBDFsErtkMnHyZ\nxBBIBfdB8nToeBXSbgFL5vdnt9+R7yMcMWLFsm8t2GPJTCRu1qh/H2eeWPOX873PUFnevxxVfzh+\nI3AVQ1UlI//VhfzzirBihgk3wsRbICH/Px73tcKRn0Dhk+CaDeIcWGQwXwSDB+FoFRw3wM9fQLxw\nLxRNBT0A5zaB2wuD+8CeDlo7dNdAqJtAagC1xIEeoyEqIti+0ZDcKoZWDakwBbGoAHnEWYTqQ8oH\ncb5A1gYQSh2YE9H8XjSHjnKRwLDAi2HCEpTjNZgHugkszEVqDhOoXY3U0EDM4Ewi67agLehhIK+Y\nds8wPHX1IEkEZ54lrk7CHc7DcYmRuAX/gmn7R7B7HfT3oM2aTTi8m4pIDD7vILGeo8SUV+PTO/g4\n/hombm7HmD6AXu8kZIsQjO4kcF0E27tJyMOc+MMvEJrshYkS4kgIqUGFuxuxt9bBeXegOiQGUl9H\nd+hEv5WLce7VuObNQ607x2DlWZrq2vlNdxqftAeYuOgLSpyHSd+ZgutADwlbzqKGA8gVp6nakc0H\nS6bys0OvYjqzHmnWCvj6JBHLJKSvehBzZhI+/hb+MWasqpnwnAP0zo7CvCGM0uyDgmzoOgbZN8DC\nZ8DdAl/dAMe3Qm8z/vWbseQ3Q81ZurZo2GJHII+5CPZsgnAEKr6C+m4IHIHYGAhHweZXEXH50PoN\nkqEXU9K/IuKWQctG6KtBbIvBHJeBIS+I0t+GXFkLnX4iyakcvHwkefpplKlPw9rnQHWhm46ihntR\nhkdQowSSPwT+PvTjH2IINhBxyRhNOci15Sjp9dgPfY11xlJU4+eEbVaUxlNYGy1k9fSyZOECei1R\nOMvfJFJZR2ufg+CNCibTHPzD78G48ylExgSgFDlxLGhWpBOZmC5/AduaHTjq8jBu3gMdx6DrGN5J\nfdh9cVDyIzpTY+jITiGprAaOPgejr4fmDTDsFjAnf392+x35PkQ4d8WV37mKWtUTq/87883/w7kX\nMtQm+L/knzccIf9FexVdh68+gNIdQ3HijMOQMh5cxaBrEPcQtF4NOU9A9TUw5V749H7IHQ33/Rwe\nmQM5GqT6IXMZJGqQPJKeK5dguv5+rFVn8f3CgT3vNdStL6F27qKtUcKZ5MLsaMffNxLD2uOEGwWy\nVyFyUCO4bBi2shr83RkYcgLoaSqh/QLbZIFwKGjTE1G2dRCcawJHKjXBc5i7a8n2DaJZ2gjOuw/L\nwEskTFJIXPERCEGEZvppINy5lLg3fkFDgkTSUgss/N3QNuVju3AffwC5oZVQfj39h3aSKjViUiQU\nn0ZkYRixzo7Y6kVP2YtIjqNnqp1c28co8/8NdefbyIud9I1TcTR4CRbnY+voQOpwoxuXE2i4mUBh\nPoaeePTEbET2WPjdT5Euno42rJe3rNfh8Rv4oWU1JdeMBv1RBp1r8WVfTdNDNxLb3k2UNhVHey2j\nDLtZsj4Bu6MHkoyI3S8h4h10LLoeY8U2fJ+ewZQdRUPt3XyTORd50EVR2hY+e+hOUg4Op+j3n+HL\njmb7RTbGNZxiTu4scMwd6jpc24XjpiWEs0poWn091qs19C9+DbedD29uG/qsHp4CvU2Q7wWhQO17\n0BcCtwPRVIAW+x76zuMIRx6YDkJyEOYmQvX7RKJdGMREkHajOTUCURozj72GiEmH+E5Yej18fQ7x\n4zIM+Tb6Hyrm9EgT03afoLU4i6Z4K8b0Pkz+DtSzNSSZBtF3nkak1BPaMgd/QQ+m2lz8GUFsIzsw\nJF8Fz9xA3nMbYDAKIi3Y5v8AZ98PqAmv4McVC7DHvc5v/J3Exj6KzNWI8eMRKSH49TNgrQXrZrDK\naJ+vR70sF1wlULoNXXNTyTamme8A5+/BUAQbF0P8dAhY/lPz+5/A3zBP+GXAyFDIAuAAcNe3nfzP\n6wn/JUJAZhF4+uHQWmjphu4k6O0EzQdHfw8F50Hbc2AuAdNK8M5Bt65FbFgNhTmwrwJdDKKaGvAl\nGfEFj+L37kcfHEQtDOAMyhgOr0UcPUXnQYE+xoJh7k8I5hdg2/EJUrcfOSQh5cxGLp6MHOdBavCj\nLLuV4Fel+OdC79wkNF1G6Q4h/24nQmh4r3ahJocxaLUkRqVhSPYiRR3DnGNCLtMQhi4YNhNMyfTz\nEo7IlQQ/eAW9+hTWcArmnCpImgMYISkDbfgJrM8fpD/BQHZ7HY2mRE5NzcatxHE2O5/c6SrW5FlQ\ndQD9KtDkScQc3o2wtiNMrYQPqzhT0qk0xuMx5CCPNeOvfZaA/gGylIfDdwHmYyFCuYP4JDMNahUP\nb0zngGcy96z5JbdekEDy9tWw5BdgyUf1vIyp/0UsBSMI2ocTt6AIsfw9/s1lZqZkJbZeRR0xnx1F\nybyRN5mCHU/RW6jRckMhicZjWHdW0xdViu10GxZzEGviClJOfogzJY24UwHG/X4N2Vs+R9nwHOLL\nY9BhgTo7espEzj7zPuLm69GP92ISHgzvvQMJ5Yi4FAhZIDUNJCfYG6C9AC5xQu9JxLVPIqwz0aZV\nIIJehDUXDnggqxn3pTfQUGIgzj2HSP4x1D4dSw9oegApYxH0loMxBbJGohp3INrM+LISEPmXEneq\nEVdrF6mOO1EeOU7a/JfpMZQTs6GG1gkJ9Bfa6JlvJWj/CQ2O02Q1BVDMI0C0QqARTr4H4RZImI09\nK4jBsh9h0LlQ3ozDL5Pd+QCOxk6qXNW4spYgndwBe0/Dwb2Qm44+Pxbti2ZCt/ZBeh6Hvp5K8uCT\nxHiisB/+HPDChB+Bcg4OlwIK5M7929ntt/B9eMLZK675zp5wzRMf/3fme5mhlm+v/WF8+V+d/M/r\nCf9nSBJceDMUF0DCuKGim1VH4MQOKGuDvSehRIb8fSA1oC8eB3XvwyVfQ+NmsB4mfCaMCIUxDxiQ\no0bgbKpE+DrQ4nXkjhCaTyci60QX2+m8MYco62LaSndhjVeQQ3EozmiYmQRHBQx4wOulujCauIxB\nAksUomqX0Tj3CPG7AqRsOYhqjiJweASWuCKsyn7Unv14YmUkYxpS3CSkkl8hBSxI3SvRHDmo7IWT\nXeiHPqM7kkrmmSPg+xl8kom2KwORVoR+bRWyyUFhbTlsEYw0tJDX2sSa5Ys51lPCreVv0te9D+G1\nUiulE7PBS7AajMVHoUdD3yTBqNO4HeeR9lYltuIg/uviEA1uvJOTUGtXYlUH2Vm5jLWn55IUuIHH\nbfNJ+XoALW0kzLwYTu2Ft5+A23+Jak1ByuvFPkLGPrETNk1g36QnqZmyGMcTy/jVjEvoGVXC8obn\neEr6EGlxAI5Uwu4dMDMBofkZ9ssdENNL6GQqIx8dTdX58Qz71Wew7H60zlJ6EhJpOmPGNnkyCXfe\niX7sx/heeYrocZmYqxowrarG7usnEgDx0Bbk+zsRoWNw1g+XLoRgP7TuhrpBSFSg805EMIDU6EPL\nTUN61IuIxMNFU7A2voeTdHqiXiHR1E/d1eczWN3CiM19yO3vDPUNFGNg2iWIJpngIjfu9BB5kfMJ\ni1eRunQMGbNIHn8Y7w8vIXPUMAKZY0iZ9yQtGTcT0xKPJy0ed3wifUVVxO6sR9EK4adb4MfFkJMN\n82+HrGnQs5JI/O24Ez5nedODiIgR3aZiU4L80NfOL8LHcLkaoEKgyQHUT9tQrlaxvOwlnP4ZxlAO\nXsMArvYyqLShXzgHkTIbBjfAlFlQuhaC3TD+NkgZC/L/HEkJ/YNUUft/xxP+U+xpIOShql/x6TB6\nJkxZBDW/hXAIWkej2yZC2buEqycjX/4D2PMYRLegXWRHT+vGEB6GqGtBHPWhng4gNQuQcuiuK0HP\n9xGd4aa7SMbw6lO4KnahB2PwFo3HMvYSaN+DLh9H6wJvSQltgSa8yUFsZi/n8ifhHUwm5eXDBBbY\nqH0kG/wDJD77BeZz3RgaTRgOZSNvdyN6u9BjO1BjVcKxpwhYXkFSG4nYDmMQFuQaB7bhueD2Q2s9\nugW01jOoJR6MvnyEsxvx4EGo2UtgrImXp9zMuZ7hLC7dQEzAjc0Lcf1dyMEIckEfnuybMPd6GLx1\nNqaKCuLf7EG+c5BI0UwcDRdhW7+NvteN2OeN4Hisj77GLGZNOcZ11BA7aibClILuCcOYSYjyPRAV\nhWYK40teBSKIgSmg2Cjr/JrNCS1czm8YHB/FHMM+FnZVkFDRg+gahageQW9hN5a9HsReBQpTIG0i\nnHUhNzYj5t9Gd1wz9qlPoXy1DuF3Y/OW4po3g/Co2TQ89wZV7x/FMSGKVK8P21O7KN95mKQd2xAF\niciOg1BxhuChVGRJRcyZCZYqOFMI8fPBXwRNKeBqRKSWIKRr4KNNiDmzwG9CtVYS/UkXWqNEsCAd\ng7GfzM1OlNN1kJcAyVfC3J/A6geQ+nrwJY/EPtiEv3k1Eb8P2R1E7teRZl9P5LwbaHtvG+otZuT2\nA5jKPUSvihDjzCcnqgW70oh0LA8Spg/1s8udgf7lOwi5G4ovByUWa8ckbOtWowQLkbIM+G0RXF1d\nTJIPcHpkDtZiD9Y5PoS7H2mKCzH7IdTP9vDrAz/FObOdzAmzMe5tQPccJrCwBqVNQsRMg6yr0Ms+\nhsyxiLW3g78X8ub/X83v++D78ITTVtyAhvSdRuMT7/+1830r/2+K8H+G0Q4jl0HVZ7DwctiwAb20\ni0jWDSiuZvjmc/QZNxCcFY1pdwonG5eSFD2A2tBCZEoUsi7RU6lhVlUiP8nC3B1LMKGXhDOD6PU6\n8vU/xXd0E7auUugLwHlLCRTtx6iNJO2JDViLxmKo85M78i2yHnwOs68RY2wOZyY6ESkZBCYPEr2+\nDy1LIhLyos/NgZh2lLoQhsgkFOdSAt0+LE/1YP4qDsOGdjTnMEyf7h8qIJ8YQlgl9GNtSEf6kVrC\niAQdDm4nMngWERGcnjaF0B435+9Yj8Gm4LGYMK0OYB7tI9IUjfmNHeiVTYg1NehXWQgvFlh+P0h4\nq49ASzMi7KNj5xmCG3vI+bKWUdMvJzZvH9bjHyFsu2BUP8LUjGj8NcLVD9mpiN0foWZZUBiJIhez\nRoT4KqGJiepuSoSL4fWXYX39U8RZL2LUXYjihZDXRn06mN1TMLWXwrFW6GHoB/RALax7DUenge6R\nYZw762H2LIiLR2s9x66B/XS+e4ScN15Abj1CZ0U0A1s24R4MkD7iJFLrrxGLViLOmhDGfrTOXrTx\nv0SyF0PtVrjtc5hwEQQ/hIpYCI6E11+HfB/+8+cgbX+bspnTMRl6iX7PjbnUi7U3jGhSwaGDpxcS\niiDih/qd6IQ48cAVZBwrRag+lG4DhjgNteoUvZdbsA9fhKJY6T+4E/OkCTi70xBT7PDK8/BNA2QD\n+wdBscO659Dzx+FpOIC2oAx12++RTkaQ161CLr6VyMIrUUQLyge1iN94MFsCxNnTWNH/EJWVaUys\nr0RecC16bAjSj1OcfZgeRyxpjgb0gTIkXYA5gtzvR8+7C7XidaS9n9F/4WEiOfEorT6EkoiI+9vX\ni/g+RDh1xU3fORzR/MTKv3a+b+V/RfhPMUehHepAnH0HEmR8LXOwPP084pHnYUwWkcXzkeQslNyf\n8NCbVhZf30CotBRzTy99vRlIoxzYpysoZQ1obR2Q6ce6J4SeORxRdBaPz4JiykCZswLR6UX0H0e2\nTkN0WfDNDWFzj0fuD8KqlxEF8fRM66ZhRDwT+6YRHfEhzv8p0uEWgnUJCPs1mDKXIG35CGHzErQn\nYNm4FYPrEuRztYQ8fnRXDsb212HjTpAOg1iMlJQNp48S9LmRiiI0jYjG0jVIq+rE9fx+Lnj5Q0Jn\nI4RawB0QBMMa3l0xBHZ04e3xE7DJBFIljCVFOLtvo81p5cRvX6CkaSUGrQtXuo6l30uPwUSwrRlb\nlA2FRsTwn4FzKyS+jrbqIKG0fLzrD0CJGbnyHGr1McIHf0tax24u6vYgVXaQenIQUboFjA6w5MLs\nH4DnXdT6ZOpGnkOK9OL4sh9p6kQYOweOrwaXHXw68qQFeDp24TQUwPVPEgn10tV1GOeLZ4g9fxg5\n979IdHoDUVNqaVvZhC1cjnlYNKYFbwzlwI7JRurvRHJakObfBKufg8uiIeYagt/8KyLzfKTJ9xN8\n/A7OXB2HOceHfPQY4bY4EquDmKROlGwNvlBhX3DoPdx1AxgzoGMdeI/DMDtnxTBOxU+n6ORmjIZU\njFlz0EbNQz+yD4N8lpBegXtaN4mlX2FpO0Iku5yaCQLHwR6UUjfarDB83YPoqANVRQzWYpx3B1rb\nDtTLw3i3OwjV+zBVfYqxQwJjHaKuCUKCnqnRtKeO56r1J2iPMvH0+B8wvVnHOPoqgi+9zleVF3B+\nSjVKZyqh+fVEUhMxf+FFzfERSPOjxySi7NuLNv92LPtLkTOuQIy+5e9SQ/j7EOGUFTd/ZxFueeLd\nv3a+b+V/RfgPhAjxDp+zNa2NGO0Mq+ZcxriSWzG+9G+w9Bp0/ymC+fsI6wvxtS3hsy8nc0nH06gp\n0BlKxjvMj7QoF+MX5Sh1/YTtEtpwHYNXxZB+H9LklUgJZuSDqxAXX4HQ05A+fx3J3QRXjMcrV+A8\nlzeURiYFGPjxzzHHlmI2XYDdeRxj3CvIsbMR591I6LkXCW/5AtOihYgqN7r9FKHVLZim2BA7OqG+\nBmJTMd2/FJHWgD42HjVKQbrgBfA1INWWEc5MJrRvkPJ7biGcmc2IvhOkj8vgncueYlxfFYnmDoy3\nJJE4WsJ15QtEvfIh9sZNOMZmY7uhDUtbEPHOeqK6+1CqviS6uREhzUKzFdAT7SJteRqOlAkYHDqq\npQmBCdHSCv+2Af9AHg17PVgq6nDn3Y3UFoXuKyFSfA/2MTehjL4dl5oM21+HgAEmroCat+CrldAU\nhPhxhB31RA/U4dbtNBcY6F96PiIpB9O5SsTtdyPGT0f5eiviquVIRgt6+lhMWjRx/TUk7DyLdGYT\nXDcXKXiChAKZ3nAOcvYSbNOuRAxbPJRf3vo2+G2w7Tew/LfgOY6++/e0rSrl3G9WEWpZS3uJg5Vz\nr2ZW1TlapUL6lo8ioXoXsluFbhAJEqS60GcMB89uxJYeSOoE4wDEGpC63ezrKea1hFvYap6DTzMx\nkHCK2MoO6heMoi8ljoyda7CMDyDqddQNGt3jRuAeCxbTcIxRzQQLFqEUXgvaIDR8g7A4ketHIn92\nGuV6FcP4EJG2KHpfLUP1Z2G4tBGpMwXrhCCO3nMIQzJFjVsYEzjB/aOuI2n9B6S1VvCq+SUWqHtQ\nBo+h7LPC2HEYGrORZ76H0XQ1BmUSwpaAMfOnSJodyl+Dwjv+vcvL35LvQ4STVtz6nUW47Ym3/9r5\nvpX/OVH0vyFuBnmTz+iijwkDdWT3JnO/IRb2H4DM4TA8QqTnC5TjPqx6A5pmJ9E8iF7tJ5woY+mo\nI3WMBKXdiNYw+vQUuhNlYttBvvQ26K2AZ6/COukidGk6qu8r6lIPk7ngceT2OvSvdmGeHgBRBs0n\n6ZxioyvlVRwiSGLFKizv5CIMPwbT0EKCpSCLQF8j4plraYkpIR4JZXwvTeTROzGNBFnQMLKELUXL\nuKZ2F9F9h/AOqvTtuIR4k5O0iQJLajyR5GamrnoGY7KMHhXGd9VPaD+cwMCsWNJ7YvDXexlYmk9s\n/b/AQD4iIwPUFIThCFz4IUTvRrz9AorJBPtVKBlEfn0TgQlxcOl5sOY1eOxNQsEyDN37kHdJSMNz\nscx5iBHNjYidq4i5526kqGh44hooGA0pf3iUrauA8gicaILIHkhygLETqs8hXZMDug+H5XFcH/yQ\n5KXT8TiC9Jw/iaZRPegpElE7X8B7ZRrZfR+hHF7C/8fee0fHVV5t37/7nOkzmpFGvTfLsizJvfcC\nuIHpzRBKQjWBQEgChN5CCJhgIHTTuzHGxg1s3HBvwpZsS5bVe5mRNL2cOef7Q3m+5P2eJC9ZKfB8\nea617rWm7HP2lLP37NnlumXbHOR5ayAtDy3ul4hTbXD5PQTeXYYubQM2w2UEv12LWLkDCsvAPAO6\np0PjF4NphI/OR5ufS6SsFueASn3xOLCeyUd3zOO6Ay9hxUB/SSpjf7EKKUOGYgVk0GxFaLctxfPI\nU9iTHYgHl8Pxx0G3F3xunFGN82uqOK/qDZJWrGRNrJdhG3J1kw0AACAASURBVHdxNK2MtcfO5oLd\nG9CRRUODk+yO/Xg64ki8TSEupRDfK1ejeh9AV5GEtv0lRNY4+NUeKJqM6O1CvqsV6Q9dKJe7kC4z\nEpAuIe5UHf1PjMQSOoZp7hBMbcfQNm2GcXkUNLfzofwkD8x+kIa8MPMPfIRh5mz4QkE6fBTd3i1o\nt70C9uF/Mp4J1wwS5pffBHmLwNcK8YX/3ch+gPih8An/MF7FIL63SNiEkSmM5oxQEcP3vIKeKyAq\nYHsl3P0wWlwOYcvzGAzDEBk/RhSt4PC6k8QvOEpwshlTCVi+DkLQTESXgHayD4NqxWpuQetsQgRq\nEJIT4qsQ6RcQ6O5DH9Fh+fQZUF0EZg/B3DscKdCAho/mu1OJs6t4rTJJvYXoT/RDUwhuvAeuvR1x\nzuVoDauQ52Zg836LdlwhdvltJAUTSbPUYfnxh2S01DJh1hJMyWdgjp1CNLfhKr+XrNG/xtRtQ+xY\ng5wYRU6JQlQgzHp0rg3cnn0nC21rMc5M5pXM88l6dQv6MSkYHOOQmqrRmvQMnKXHnPwgvH4XtPVi\njfk4PTaXpCmLENoA3tXvYh0eh5ThA3U9ujEfEDv5DqLdg7D5EGOmoe38A9L4U4hvG2DrShARWLkM\nTh8BYpBVBjMWwNQsuPkJEF9CZzfYrdDdR9/kEhydCci2HsQvVmFc/gfix19HWuoVpDSnouz6iKYF\ncXRnJWJynIV1xxfEWg8Qensl0X49+hdXIA69xanDbradV4JPbEE7GU/GFReC+xn4bBX+AgWp9AKk\n+DLwVyDq+9CNT8cQnk6etZutJ2JkCT8GTwXpbx8izVWJyNeQssyow4eikU6ku5kaGui5vITMHRqM\nWgxl80HbBClXEWmqwXWsiaIiCbPRzqhgHBa/m1z9CYaYNLYFh/Ki4wr2OsvpMg1l9OzpGOOCGGdf\nhXjgPaxnJdE7aj66Q5sRvlqklFmwYRWsfguOHESUzkE2+IkYLiWa/AJxd7xOXHMvOs2LKDkJlQLR\nE4NJ46ClFjnaypyifZxISOe4K5MxK17E1NEBSXrIiCCGOCFpJJjiB43nz1MPRgeYnP8Wm/1nRMIJ\nD91CDN13Wr0Pv/KP6vur+F8n/OfofB3C+VBZCV9UwfIVoNOhaBsQNXuJZTWgkytBmsOxuu2M2b+f\nwkA7sQwZOV7gGhaH64rRnJyRSPswI/YcP9h7QDcf2b0VKhXUUB9q+zrijDPA14ia2UFgfDfmYcsY\naG7FL3WS3tmGqh+PEguRcO8B5BOtcN5lsOsAnD4J0Y3IPZvRmqNouxS001EM06YgdGYIb0MqXYp0\n/BDGifMxy3EYDt+MtamVrLz5GG058Nr1UFkHxTZE8Zko8k2E7t2PVNuH70wb0717SR97E1rBYtKU\nfdR9FU9uVhViIIJao9J5cTEJW76EXV/DkjLklCROWm1k7v8Mqa4D3egRyAU6ZF0PFN2O8Kmwfg2U\nKwhvFJHTgWitgH4Jobpg7nzIM0N1P7TVw5hZ0FoN9ccHuS76X4bNAVjVC6cUKBqAvAYs0bWIhB7Y\nKcFlN8ET90DZGNizDsvGdWQrieRa70H//l6C7x9EEanobp6PcW4GUtd6mGrE1q5nVe48IglR9G+v\nh1FbiFd6kJpT6FlYjN1jQ2x9g/5Ll2F88UtEsBOKz2Nz4SRMHZVk3Psmw0QdupF6lF6BZ245llA7\nkhukxH40nUBtUTEYPcTn9iBWn4ZxaeDahFc9A++xE+SUxpAuvR+aGmDPG9AYQo0rRA7VsrlgHIvi\n1zBF7KctbgLpDZtx58XRe+6t6OYEsEZfIrJCxVLfRu8YB6Lhc7TSCeiuXw7zL4HJxWBPI7ZpLS3v\nGHBeNQATMpE2nEbkKaDzwsyb4eIPIDkHUtcg0m9lxIO7sVpd1IwZy5Bjp+jPH88m8yxKtM/h0LLB\ndE3GZJCN34up/jOcsPOhpd85HeF6+OV/VN9fxf+mI/4LagQCW6B1I3TkwLK9YDCgaDuItTyNsXE4\n29NnM+XkNxj753FdUgzfqHRkXCTU+1EN2fgW3IDc/xljeqtpSs6kNiWPVMNCUgzt6BPSEFIzPgTS\nBR8g1lTBJAtCmYpj2V6EtAhfUgIDOhu2rR4cp3ehm2LFf1c58dva4KbfgCzDJ++i/WYt1PTD0w8j\naQ9CBVA8BNxmkGJQeRODVKaAEGj2eER+wWDU8s65kBaGDjuUnwt4kTMTEUNHET7+FT/ZtQ7j5Kug\n5Tiz0zcRnVGDtjWRqveNlI+ohWOJZDyiQksH5AKn96FaJpLb46EmZxil7u1YI3pIvRM6FDjdBBUv\nIi00Q61KNC8Hw8S9aK8sgBIdwrgO9t8HRuCCK+FEN6QmwdRBKkltgpPI6hcQ9W70SSrq7UVIdbW4\n+7OwuZORjS4oW4Goegm6AnDOOiK/1BN5QUXJ2gv7ZqCbWoIpOxFliYeY9gFCvhq99Bqi4RIsMzN4\n7OvHeb7kLjbN0VNSuY+2IQ4ytFq0ARUppEF8Ec1FM6j++b2M/GYNvuCXbHAs5KnwDtRrI1R/EKXw\nTifGQgcD7niSCp6EpuPgiNKYXUvu5x50mh5hqkG1dyCCW9EyI/i+Wk7q5JFITdvA/XNQpsCsUWi7\nd6HVNWGTYzzS/gSRWgkpqjJOfxDyBWqngS1aPvVxYWaWJfD5iImc0XGS3AodjEsjWvEC7uhWHHPW\nIO9ZDvoitNYOSsZ7MBiWowRXEL6zF+OhXMTxLpjfCrFatNTXUP9gQfOtQCcbmbCrDr5yQb8Pa+NR\n8rL0aOduRiQU/SkS/h+MH0o64v//VJbfFZIBsm6HcXdB8liQ2uDQ44i3z8b47jfQ9jVlVW00ZV4K\nc7bSGncXauIA2vRkNJ2EiLRQuNVH/sY+9I1RCr9uorS9GW/XZ3zbfpKOUw4aZk6ma2Yutkd/D1E/\nJHUScxwjao+DDj+JR93Yzr6BhpuGcnTpedh9k/FaOiC5H/bdAG1foS1ahJbeizhHj4gehvBoKD0b\nMfpm2PcVjHgceqsHdw75I47mz4L566D/NKSa4Lx74YqroOEdaD2EVDgJyxdfYr4yjTRHCGfBNbAz\nSvREMhis5D0awxjrw1NvgFKZzglmlCQH6nUjByfPpkwmrdRBbqwJLV+g6mTU/a+jBg6j7f0ETQWG\nTEcY49Bb69E2pCLS/MR6MlC3j0CxXkEkNYNg0WTCZ19IpPcDAl/PpfvjApq2vkz12Di6VphpePNC\n2vOLULAQSzQQCGlE6w3EIqAVFRC7pxztl1FEowPp7alY12Rg71AxVJ9GPunHKK/FbKjB8G0M7l+A\np7KOJn8FLaky1wQ2MX3gJM9PvxJLXQdhxUZIshOK9KJd+iTlSgIX6v047D6Oafk8/cpD4POBWSX3\nKkHdql58t5yDLtZGYGYi0c5thGqOEB0yG4PeiKRdAdbrEU0a/XclUPmkjrSzu3DLTWgjo3AqCq/t\nIPZsFdqXHjDlIk+cizRmDKYzUhg4Ix4lpEdqNGPUZbFo1q0s9nXgaC/gusABsv290HwCMeDGmDQU\nx4YTSB//GI5+Dl+8TkdfGrrRhbD7JXT7+zF85Ue194NDBsWOumU0m2uSiA6biy/OAWMngiULDn0B\nSghDeSlufxaxV26G6Pdko/9k/JuoLP+v+GH8FAzi+09HBF3QcB9s2QMp7ZA6nXBRO3Lez5AmPIRx\n7E/ZmOJmZOtRbFTwxM6VnDFGQuvfisgAYWiDysHpJV3YhhwsJ8FTgVPnpiM3Ba3Rje1YP8dnyRhM\nG7E1ZSOX3oA6qQRxugF54mziAxkonQO4hvWhM+QjzAEszRJSXyP0V8PRRxGjsiCSCaILLf4YYs5k\niBuPOL4bFj4KxGDrZzD7J1D7PKbalRi6jyCG3zwYDX/9DBjbwGaC6atgzQNw6EMkbxsiuw88m5Em\nPIDy2VME5iQh+WaT6NiBZ0cEc1jCvq4d7awi9F/rEMdbkK58AVltJGDsZcBaQtyF20EpQFTug4Ze\ntOJ8RK0TUVRGzBwimjYWvb+H/ske+qZa0H95AtecTHxDRxBwCGJ1fuS3D1JTnsDGKxbSmZOOJ2BD\nc8WwNAQwTJpPJMdIojQZvdeApBxHFWcS3nyCWFRDnhFGnj+AnHsR/ro+dANedKUSktGLMOVD92qE\nLYTxSy/ytMdpLS3AOuCmuH8vpTVH+F3Zzxmy9RRDPz2BVNlF7PBKlAPv0dR7nCMZhSw6VYs51IuI\nU9F0IFKMKGVj8S07SMuiqSQ3fI0ItmHY04Jj3nXoGqshbjck6tCSuqjYZmbInDBGxYRfNxoROIXU\nZUPUR1CMXmJFVsSvVyFZxkCXBAPHMPe5GSiz4bFZiOtzQk7yYLTttSOOrEZyFkF8OrGcGUiTbEjS\nXMShLRDVody6gcCXvyHe2AlHv4KeFkRzFCmWBePdYK1AvDUGz62P0TR9MvHLP8J6jgFsZ4L/FDQd\nhdFzecq/nBmLq9EvewApawwkpv9pD71/M/4Z6Yi4h27/zukIz8PP/6P6/ir+9Q193x2apmn/d6l/\nJfy1UDUNHI9DzkKwZKAqdUgfXADTn4SkoTRX/Ii0rOtAN4Gr7irlnfOmoB8+Bo69ghAKpAJNEjSZ\nofgcyPucyIFZRE27UIcIvAk2hBJBtkZJORxGO/dOMN+EIAmMZtj3Jp5dD9P5s1tp06+iuCYL89AL\nSegoGEwepYxHCzXBlwtBnAK3Ah4jImM+jLwb8suh5hPYcDeUj4aEfHpDR3CoxegVDYZdA+tWgNkA\n2noIG0Htg2ARZPiBesifBiE76hf19P6uDXtTCJEcQdKmodx0HF11P9qOgxh+eSnEu2FIP6RcTigY\noN14GHnE9eQW3AdPjofqQzByHHQeAhGH5vQR7s/AOO5uxPk/hWOr0Z64ERICMOt3iE1fw7jJaBNP\nIWyJRIrupyf0FAkrnsGdmU5w+ixsus+wGfvp9meiSjIOQxomwyjMUgnSx68jtHg4dJKoEkKcdxvy\nnFuQP/o5XPgYtDwJPV8QU9xoyTeh22qAgVaYUQLVT6IV5tAdLuMF+1ByTrcydt1RipQ22jITOVAw\nimBmAtfljEJ4Wohseo7wjOFY5TTk0FGqXsvGX3+I4RddRNvl8Qxd9gnyvMWw5CW4cyGxYi8Bx170\nMRVDkYTw61Htc2j7eiPhAzqG2BS0UhuSloHWEkPEpcPin8PAauoNLaTFT6M6YTvFLymIFAdmZwJc\n9R4i2As3X4zy4zvwmrw0H76Fkv1hDEQJOKxEYxrWNIHOYQAtD7qDkNsG1V643AG/DcPzKyHrbD5X\nVzH25YfIsnsQ8/bCxmfg9Ca44DHe7DiP9ESNaeV3Yl5+Eqk5hPj5czCk/N9uqmKwIPiP+C8tXav/\nzsIdouAf1fdX8b/piP9CLArrfwaJ3ZA3GiwZ4GlB2vQg9FXDtoWw9SKEcz6NRNn46i5SN9yKq96K\niDsfocUInBoO+4ugTgZfCNq2Q1sqwipoG52A7YSX9HAHcbYAvYVOgq4SRLAWYcwedMAAk66lY3Q6\nRW99wzjPkwRtiXjbX4C0sWiJTjT/7aDcC0wH+6+IbcmHWBmaYw3UXA0HloLigWob5F8D7m4iuixC\ncROhwwTv3gUVa+HgSqgIDfI7ySUQ7YXkDPBlgqkYWtchzbahP2YlaragF2vQxe2A2YvQ0nMxvLsU\nMlVYOBWK74XuLky1u0gLdBM4vAr/OwuJjpsGJh1kTBz8z2V3IEwCnaoSSfgjw1+nHpFVAN+G0J57\nAG3JObD0F4jC66H4CQyShcwTHswdgkRvC4X1o0hel0e/Fk/Q5OT3todxx73IUeMs6uT1tCS4EF8d\nJjjMiTy5AMPEy5Dl1MF/APoMsJ0N3e2g15D6l8NiKyxaCiueBUcJovxenJZ07vvyt2y6aDEPfvAK\nHXdMpOuuMrzjnVxx4gB8tpXQ6o+IuMzY3vMjrKOIDTGTeWkvQYuBkyMOMiBV0PK7pfTYT9H1VRku\naS/u7RWcGjmC0+On0LI/E/VAGBHaSEoGmEoVovkmtKl+tGtO0f/0JUR/+RrUfQtVW9kxsRx3/35G\ndk7jwK8K6Yn0ENz1Gf1PltP1+FQOnmyj4xeXIV5+nOROG9roErQMgTkZ7KVx6IoXwfRlsPgV8FfD\nBC/kZMKeHDjjWgishIpLWVi5BjU3hPdgGOKTYMrF4KqB+EwmDYd9JwRW81P4fyKIKcfhnksg4Pte\nTPYfxb9wj7m/C/+5hbkBFzxzG+xYDWNmwrA4mHEnWCTQ/7HP0Z4Nc5ZBcCvEVHBMIU1XQEP7e5R3\nfIukeki6YC18cjtBr4briw4st84GUwYMBEBqRIl0oq9porBDj0g0E2vMJniWH3skmdYiGNLaikiO\nDhbUiKFJFvqyh+IbtZS4Dx/DtvAROmz3Eq0Zii57AZhvQ8hFoLwO7z+NlJ6KmDGVULwFXdCPnDEd\nob8ITfc0NB1E9CeSuOFzhPkEpA8DrxFGXgDqYZi6DMpmwxuXwa2bwbMPCsxQ/R6k3QrmAI4jBwlN\nNkLjp4iBDzEpu/Ebm/HvifDGH96m2+LkkY9+idEyFVzbsPh0FNKFt7iP1tkjKN6UAse/hkVXwYqd\ncPsipA87UZrfQv20E6kyDBc/hLDeiGqcg/bZa0i+LsS5v/rTdxXzISacheHIaiI9T2Jasgm1/UpC\nOQpx+nqSw5+TZTSghCs5VFBKwuVdWBZ+gS5iHdyZevS7g1Smri3grkTROegrTkbX2EeCZzeEj8IV\n5bCzF7p2I3teRnPYuE9ay8lAIYfzhzE6/hD5w/YRtkh4xowhSBaGUAHq1g70B/6A+UQ3xrHJlF8H\ngb2tOOvCSA3Por/eim5TO90VEnGuKCm/H07Ggq0Ej8TBUBD9YDgqMdCt4ixTMBg1tDYJe+R52pxV\nxGbrcdaOYGi/jX7ZSOb2Nyg/acFfrGIIxDDEy8i37yP1mg547Xd03zYJa+0JjIfXo9kFeIJw2Wi0\nnTXw9TZEcjYM1cHbCgwL4dncif3xBEhaAkWTMey4gtRIPJ9dNI7Leg8gaWGYsQRCTRTHG6hpGQlI\nGJOvw/NqHXGtj6Nvb/heouF/FOHID4PA5z/XCTsS4aH34Mv3Yd9z0C7DOy/D+GEwwQ2Zf6z+amE4\npxLCx/FWXUXIdgxXfCFif4D0MhP6vEmonjY635fR51ihYTtE+iCqEUVP92gzjnk6LEetqEMjKAU9\nmNS7ML61nKx9/TBTgngDmMsh5T2EYQSjhj7PIe11hl5WTPKni0kYOQJP9rkkru6E8m8Jj8ogalex\nefuQbl4GYxYhsYl+7SISeo8Q6/uCtnsLyYxOwDB5Dk2Tp5H26xXosh1Itz0ALU2wYz9sX4Fy4E5k\n8wRU/3Zo/gyp/hAiaID0EqhYhRS1Ym5JJFruwJD+LGL7B1i3XYuiuLjorbdROw7TlJyMQVqLes1Q\nApnXM+TtV7GJbKqpJWtYItbuUxAGnPPA6UJyjKL/YgPG33SR0H8Y6oIwOg+5L46YGEnsm93oen8K\nF/waEjJAa4bGbqTseajlu4kZ+8j9QxN2xc7MnxzCrx5ENzQNPTeib9iAOC6jn58OBplQ2Y0Yqq5D\nwgyaFa3hPgKFqehcfcQsEuH2aoySC1wXwuwF0O+HXSpaeQirpOc833MYe/ORK11oniLCogL3mAqi\nTKHA9HvEQgFcCDO+wDqpmS7PB7SeXEf2c1+gdsSQXvdAdgnOkk50qo3M9N2I052YF3UhZwLNIEaq\nFOt07HpVMKvNgPjZTOTgIXI6txOrLyBQEcE6zMnAjA6qssoZtvokzWOdoCWTuSMRYYiH4iS47Cr6\n6u5myIkY5CqIGhmMiWif+2CcB+JdKFtcyH0yQrPC2yGa7lhEec4MiOwFXzO4DmMKjyHvYJgTPEVZ\nt25wYCUlHalo8eDulZrAKC7AwFlEsw4D//McMEBM+WG4v//swpymwr4XYO7NcMmDMOtCUOyw6V3Y\n+CwMPAtffwEP/RLWr0GfV05ME7gT85FW7iL94QR80hZIshLd3E7KeSAWPIGUdBQ6vdTXmJAHfCRO\nTUYadRX0bSU81IjS6kHO8WLI9UOGDfZE6S+9H0P8AgQSOoxkh3OR+u7n9NizSa1KI+I5iC6azmGx\nmi15Bwn0nkTIcbjPOxcAM8NApNBh3Y3cHSLNq6ErfghMCXg8J/EumETCO+vRegJIF90CU29FK5+B\nWvkoYuQtUHUfWtc3iG4X4WlOqGtBKxyNGDoS9g5HTmlGhGVYcQd0BpGMAuWUjfSzLCTpbMRf/AaW\n3jdwBedSk5RKdXwm/mYFbWwLVn0m+q1jEdfcBIHVYLsQ7/u7CRd3YO8YC4Xx0BcGrQ8pUI8WsKG6\nfEif3gGF42FoBKY+gRh2DlLLJ0RTP0OXcQfeQztIOT5AvM2JJ70PpDDiKzehhGScwTCBHIUeniRe\ndyNqzVNE+g8SKAKrp5+gQYeqM6Fv7kZ/MhuGRWDSo5BSiC+xB3NVGINRIZrVgz8xHcseGabdhdr9\nPgMlZ5MplmIkefA6iq2Cnckw6cfYt92FLc6JtSOCMPWgFTiRllyJnNAKUi2ROi+6Pg2pW0AA+AbY\nJyFnpxPZGEKTFKyJ58DUj8F4Bd49b+CpcJEeOs7x/PPZlDYa56SfMyIwlIN5ddgPZxPduw3zjHlo\nb16NlFSPtaMBiufDkEy4Yj9ixi0ofo1vW+Lw9ulJmrYU4dHAcArTGDcmw3sgjGD9Gbha4PhWUny9\ndMZFUYomY5v8BNKIa0DtJFO6D3PkfSwmC8IwHJm8f6/N/hH/jMKcfNc9aKr0nZby2yf/UX1/Ff+5\nOWF/H3y4FEaeC2ULBx+TZRgxBa48A845BSlNMNQIv98Gw0qRjhlxvBch58qPkK8pwdHRR/yJLvyU\nEJyWQsuSBGpHraOnKEw4WdC5O8Tx4GgknQRty9FMTkzHy9CSa5GcKmQIyPCCFKPTuxbCu0BpgvAu\nxOmfYEndSX4wQOvEA2hjH0V/wcuUp/yM8/fnMuZkLpnfhhFKjAb2cTD2U1oG3iOBMdjXmxHZj0Dr\n5RBpwZg1mnB6MvLN54CmEbvnDrT6/bByKYFzFKLjdMjnn0b2XIpYn4Hh4ySkg22oqh8tfg9UvYeQ\nz4C9V0JfN+Le3yEu/yXOoaeIVVagnfciVF+N0T6J8sqNzJn6OOcMW8qij9/DGDSwbWIJvYFaKC4F\ndxda6RSkCg17TTZEq/CUTuL0j38F594PhTFk6hFt1ahp0+Dj+0Hp+yOxejZyOBUNlVD5GfQNLyKt\nsQlbUwZJG3T4lTYSOtroHj0GNdJNp/cGLP4k6NuG0LvpLWphoKAEKSxhir8L4QkignFwSwVM+BAa\nL0BtnYlWVMP2ZZdTN66AoDXKKdNwoqEmYsKNIBlLl5c4SgavmYHtaNYRqFluQEPOOIe6+09R29WG\n1gmixIb64RZim+OIdEsYZsZgsURsghk6BDjtkK7CITdFpSGqjsRQP/k9fHoFvD0chxRBDfjRG6OM\nP7geZ3sfdT0b0dsTyGoO0jTSz8llrxGpPIgnR0cg+1z4JgHsYyDaBVVXQcXlBCueJqt2OxkJoxEj\nrwazFS1BT2/mUOgsgcN22HQrBDS0krHoxzdSHjlKNXv5xtYA/c+h9fyUbNuXPLvxXLD+eygr/5WI\nKfJ3Xv9K/Gc64e7T8FAx5IyBEef89+fjz4Kxp2Fy9+CW3uUT4aw0eHglgXuW0xXqw+b2ET2sw7Sz\nC90WJzkTDBTWNJJ9aDe0GhnIiie+xIJ+wXg0qQdUBa1DRW7uQTWegaT/FXyVTKwzn+DUK0jfcwop\n+C34Xoa+n4F9E7RMwpz4KJnWexD9t9AQ+QP60os4MBEOzPfTnyFI1skkKGsoqWxgWPhpHO4lqL5K\n1MQSyHgF6pdijGlEtAEA5KuuQMyci/bE1VC5E4Plx+iYDg17EOnpCIMVseso0Xsfw7OgAX+qHzJj\naD+9D34XD6nTobsPTrwC8T0oSiLuq0aj+Zpg12lY8PRg21JzPbqwgfw93Qzp76f6oWKCUhAMZyMy\n89FZwtj37QHDMOJM41FrniDW9CpYfwIuCTnWSEzORsktR+tYR7TyRpTQNpBz0ZtvpV95kH3T5uEf\nPxciiZhCCtk1J4jNlokW96LMXoI5VITWWIvW8gyqQ6CLVwkNNIMaxbp2JSGyMHzuQz2xEgyZqM4x\naOYAyiqNaVc+SekHNZiCeoafrEPkFxHxrKe9KJu0+sFzoGnQ/hyqsxfieyHcAPY8Ci6dQ+WbA7SH\nhqE+FkDxTaS1PZPA1FXEDuvpr7UOjgonGWCeAj8FRgSRcgUTLoVoEdCwDdQh4J9BypBZtPxOIm3T\naW6/81lM3hA7/btxdpxG17AP2SyIvPQI7jIzzqLbIaEQeodB1nsw8kNqdBdTZZ2Kf/HdOFq/hJqJ\nMPYY6sxMUt+ugf4QJFYN0mL69yDK56MlXkOsxUp+5DTO4HI0QxkibRV14gBHuy7+d1rrvwxKVP7O\n61+J/0wnvO5BKJ4Dw878y8//+Ty83gq+9sFhDtlA08sryX3qBcSZeqSlAm1eL6EtL2NKiiDcBqwn\nMkhOeZ2UziHg9zIz/D5+v56gLp62phn8duQt+EMBovGT+WDyLTyYeysn1TDhzElwoAvin4Ckz0B9\nCrzjQSShs84nIWMXiX1f0uK6gEyKCSXBsSXxuHzvk7trAMfQDxApkxFbbkfX5ifgug1NlwoNAqPk\nIDG4cvD9KH66pyajOPwon7oQzQ5ikUOw+Tew8FG0syeDTYehJg+HtgODfxHaaB14/ShTC+DM2+Gb\nA7A1gLpWg2YXluQQys5OVHcd+HdALAQ53ZCZj6ZLIZDYSm64hqauX0DZdShb3yC+5wh82wZjShHt\nd5NsmIF7awsM+OClPTBkPjpnOxG5gZixFd2BjcgVm4kJBUleQlywgcasPPSRdnA3w/44pNgEMp5x\nI4XbaFZ/giX5RqK5pahuQTDbSNBair3OjKYqaMY+UsHpAQAAIABJREFUspZWEZseQ9t6Pewej3Ry\nH/LX43Aer0c/YwKG/Chx/jCWQwfQa6C4qhDWJGT7PGh6Bfo3oVpUhH4IojoHzbMfTUrC6T3K5NlT\naezWoZx1Ib2na3Fccy0JZy1AGTEVoxQDdwwi46EhGSriQVhgqB1LJ9Ssh2inCvpGcFZiuvExDEnJ\nuOqNyCUxFh8+gW9AT8BRSq7dT864IIETh6CzHfPBQzDrLFpOvA1P3sGukIsXS8YzasFVZFhWEbXZ\n6Jv0OZoyAzXOhtQDTFoO6YWQ/2vozIS4KmRtC7rR8zn53FiMqe/QaykHITFzjINr/ucHwQCoMd13\nXn8nHgWOAt8CXwPZf0v4P69POBKAjhOQO+67yVc8C6ofHEOIWIsJb59HXIFAM0J/JIrnWz2WtQrJ\nS86EJAE91bC9iYjsob5Kh7R8CYbwZiJyMkPq7Vxw7gNMDaxG6rMxvi7E9IZ21t18Bosa85E+uw7K\nL4HZj4DOCEcuhBEvguoBwyC7WJvnXoyeF+lOTsRZdwbH0wIM0caiP72fjAGgdSvo+lEyxyH8fcha\nMq6EJGyRdei8Q5GjJrS+PgLNnZwedz7FVQPIZS70I55Ay8tEaZ0C9i6oSEMXPRvhqgTRifZCH9qP\ncpFuqIDazagnX2fgyS9IWPY0So8f7cD9RJr1GHvCcHEWuoWPwRsHIc6Ol130/CSBAvcI2LIB7f1K\nYsPGoVOb4EeTIOkWeP13nD7HQGbprzAnTEH97YWEr3Wgf2s92sgBok2Xor/gMmI7bkJvGYlveAZf\nZvQwe8VOkuuB072Qpwe3ga+W/4wR2z4j6a1GlOFOBn4SJanWg9Q2nejYIFLgCNFPIGxOJnamh1i/\nAXtiDqbki8GzA7RW8DXBtyGiF6WjX9cEhTKxQBbuUXk4lRLkmgNoGd2oZZci6R4nNjMNsVSD+HiE\nms5brg9pWfs+0ypeYUpJEubVu+Dk5/TtvJ/4zDroBPw6RL8ept4IBzfBgnZ4PkBvqoJ00ITziSvg\n2Bto/Q4iL3qoMlkZs3gWwrYNJcNKjTOJ+FAvCaf7aVwbZmiqhDzagpa3hH1TDBztDHByyhU85n0A\nv9lGYzhM7jdBxMXXktiSg/foJthSQ+LvN0K0B94ZD65kyMiDUTegDJ3JhuuvZ/E77/wfJqFp/xbK\n4L+Jf0afME1/x+hfrv7v0RcHeP94+1YGOQSu+2vC/3mFOVkP8RnfXT7YBtWvwfiH6f30dqzDU9AZ\nFUR9gEDRtQy8dIyUcR7k6nbE+ZeAtR5aE+lPaEU2FpKbUg0BL0aTlQORmZz9/nJC+gLmd26nOGUb\nIV8RXSPKKIxfDCOvhm2PQf06aN0NVjPEloNtHujSABBGM2FjFumnduA3Rxme+AgtoS3sz9ewFv2C\nBI+EiDciJn+M2vQc2tzX6MvIwGxbgycpDUxTMejM6BKqiE7RYx5VirDsQMtoQKtfj/R5HXKCipzk\nR3xeAataoXoAYdcj3EEQBki1El3zW8LNw7Hk9yCdfB05XkE/YMJ7Rg6tl5TRH6/D2G/GUPU+hjQj\n1lMGdEfXQp+E2z8W/bhats0pptaq4WtdS0qBjD53PN8m1RAnv4UatxFDSw1qsiDmc6IkjUc/8iIC\n7jWY3S5MlTWku5s4NmMISc1dGL2p0OpG80fJ/2IXWkDCaEvHu1Qi6gygrzMTKdIxkNyHx55EyFlC\n3wUK5qAPxaFi6LajzXgMnfMMCLsg4VzoqkYdNxy5/zJwJiLFjmD2g7R1C8T5wOiB+E9RrjkPqeM0\nWmYxdbM/w9vzMgVZa5gW3YY9dwaNVbWkb3uTaM0G/FOysOGA+D5i3TpEOITo2Tc49NJqgX4/lmHF\nuL6NYLn8OcS4X6F+9Sm6F9Yh791Hd4mFhKILkdr7MZuasdUOEE3V09mtI9EYQ9cYJmqppiYxh4/P\nWMBzp35GqOA24iyTcTbp6J5WjUFKJcFxI5FtTyOiKZhlBT5+BHyVIDpg2m9hxAJ6T54k6HaTM336\n/2ES37cDhn9OYY6bHwFF+m7rhb9LX+TPbs9lcDfLLX9N+IfRo/FDRvLEweb2wxNJmdiDOAaYLTD3\nHRIcc2i/+DDm5v1oU3shaoKmbliUifctSI5XkWJd2FJMeKMygQWTKDq0hpJv1tIwZyKcOEH7WRWk\ncsmgLksCzLoX6rdC217or0BzREHzglIFUjJx/gziNn5OY8L5iILN6FsuYqRyEVbbbHbonsacuod0\n7zhE6zbktFK8lmfI0N6hRXsbt+YiJfEQWn4LFl+M9EALkcrjRPIc2F5oQRgV6FOhOgZDHXBlMUgO\nOCsCfSOg0w9fv4p25DSxYyrWcA1UnYB4FS7dgjjVRfxjVxNvP4/whTfR67wR48hmWgsVEp+vxDBm\nOq2LBDULI7j1E+lKcVJWX0OhfAwRjSAsRjINbWjBOVib8hE6hXBbOv3XX4+Pk8R4Fl2ahK2lF2UA\n7KGZTHt8A1pAQQm50QlQE2SCeTr6p+jwFUwkbN5KZMCOkptERtcxLH0gRc6GnOsJNz+G1FlDyG4n\nNtBEQ+x8cqxPYY90QvoStNIwGI6gLvgFauevUBwhDAfqwaGiFfiIJMtIxxaik2uJ3uIgGj2N5cWZ\nJBsGUBtbUAvMJF61D52xleov4zAUJpGROA0+eQaRISOPscHmENoQM6JaQZPtaEWTEIUjyLr1CNrL\nS4m5E5F/vYbgEHC96yO85Gtcz+7AEp2IIedqAr7XON5ahHlqLz2VXrLDUVZk30hr0hRe2/MqZqMf\nTd6L1mvEk3gYuzyfNH6JgkLtmNGU7dsIv/0Arvw1bN0BF42A/EEvu+/pp3Hk5X1flvevh/IvPfvj\nwI8Y7IGZ9LcEfwC/af8vvv+x5b+E5o1wYilktkOLAyJWCIRh2hrIHkdH00JSvt2NXBeGUCHMmgFD\ncqi66T1KzzqNKMwDkwdPUjY1JSHMPitDOu/BtOJuBoa2IhIFocwFhLujZGxpR77zVXhjBsz8NYwq\nQ2v9CWQWQGwPdOVBvR++dNI1pZ/fzHuV5yyFUP8MZN/NJ5a1GF3bGN8dIbWpFynhBMGRP0amDn2o\nGS3aiWooQgtMRVq+HKn0R/h0bQQmVxLXeSPGlvVIgTqi6bOJBkuR/afQF+xF1BmRl5yEo2eBtxWO\n1dO/Jom41aeRl08B63C44+PBz6u3Bd6YD4vfgdsmEV4isXPRRFrtWVhcUbJ7WykKyCQ/uJfg9IuQ\n736IttDLWMKbiHP1IfVNIxbcg9X6W/jsTQg2wLPNUH8UNrxI+OD7+MaasO/0E81yYijrwduegKVv\nAFmJIvepdM/MQMxSsHqHY9qfgGzfCoeS0NJaIRpG1AIWHcQLYnIMVadDZJlRUycTGTMPiy+G1H4Q\n1RskesZmdIZXkdoT0VadjbJ4PrJvP6IqFWndCdQ2PSGrjepgAdabrPTPmU7JR2vxei4ibbaM3HAS\nPDvpi7XTujKGcFjInw1WgwmGF6F59hPzGZH1Q6DuOJpboHZpSH4bJDkQXi+xG66lo+wIXrWNtGea\n6duskDotm76Rk8lo+JZjw2z0tsSR/GINOTeoHEpbyOxvehDBSrruzUQr1IiE3KTHf4BJKkc07YDq\n1RyJHWTkY0eRM0phvBNGL4b5t0G4BkzDeGPCBIaeey7T7r33ezTAv4x/Sjri6N/hb0b+N32bgbS/\nIPlr4Is/u383UAxc+9dO/b+R8N+C+yPouR1yXMS67ciFN0PvKnBcCweehfrjWJPKaHHOJ++zNTCl\nHopfAd9yEsosaKN+TjDwFooWxFtYirG2mZJ37MiuZZAwDPNX9XTmJ5Fa8AUMeYCWH53CueFGLD/6\nFN2el2BYPaJtLtrKRhiRCOEumPY4FL1HcrSWn4buZ73pLAr1XsJqJ4nSJVQ7WphVd4RITjcmWxRf\nYCU1rvHEci+mta2FghY949oqiQ2Lp3l0BofLhpMkxQgUtBOv3Im9vYmsta9h96yjZcFPMYXGk2ja\njHz6AtDFQdrP0eJCRJ7+PbIWBV82FOqgrwkSciEpG+91z1Nz5G6aHl+ElAAFtXVM9Q5gds5DjHoD\n9m+Dxz/EXHgREd0xorYOYv6bsJx6C6Q1KAaJ8JG7MXY5YMJ08PRAbhmNw/vZvuQ8zlvXgH6eF/1F\nv0FzPUdYH6CvNYDtaBN2r5mUej1hVwRTyXZImgXWIWhPbYNP5yASqmDWg9C0AuL0aMYahKbSmT+K\nrM92oTfHI065IGELIjoaBRuxXjfmffcjJiYjN21CWmNB7DyBmqJjtX86y3qv5+uh1xDQF1Dc/g1q\n6RTsE64dHHJw1cPsxZwwVzLRX0GkPEzXugiGoIytbDgOtR1x0kDHL2aS/oKVSG87qs9DOBIjkuFG\nmmuA8NvE6mwUfaSiEwruoI6mOj05KW3IJRdSYjjAq/dcQnvNWjqPNTEv422iLdmoEQ/WZwWu+2Jk\nuW/A2PUiRPyQNwuKLyZ5zz5EATBwGua9C2PPG7zuTcMg6CVt1CjG33rr92V9/3r8rUj40HY4vP1v\nHf1Xqvr/DR8AG/6WwD8aCTuBjxlklm0ELgH6/z8y2cA7QAqgAa8Cz/2Fc/2wIuHQCaiZBN4gOBXY\nK8OIHBhdDbV3gGsNyD9GXf8xq+cWM6fBSoLzM+gaQ3DBMNr6DkBxHBkbGjGphUgzb6B353r0bXoc\nzpFw6e0c+nwu+b0J9BZmkaysI2HadoIHnkUJrCE4/WFSQhsQpt9B/3bUlhakibeA0UlH45t0eCoY\nHZRh7KUE2u6n0a7QoddIUcIMaT2KMVZOtTWDZ/IuJM7l40JnkMKqV4nTJREun4waeBW3eQJ54iVi\nnMYd242yvpH86hDuH93EzsRPSR6IMHLnRqTCa7Fs/wKWFIPtN0Qruhi443aSlkyBHDsc/A1cuwGG\nzoOOI1RFvsZcv4vc49vQbdbBhZlw5RGQ9H/6fDUVTl1Bf88J1kweyeUVbgzhBogfg6KGkKyrEC/a\nEWN/DEqYqK+ZDy51kNrSzvzVh2D2fSBehoIX0LZejrbTg2d2BqfmzSZXfxWpq1aD//3BfJ5Xh5Y7\nCgocCGkAzbUN7aQVaexlqKGVKI5RDITaSaqpheka+FMGW85UC0GbQHUr6JtVDNvCUAuMt4AcRXwR\nZdPsF4ib1suY957DnBiDdA8UlUHKJAgaUVWN/uQKXMlOipw3wf0/hbRmonlDadgOAW8pJdfUEtgo\nYyoLYzzRg2qKEbw6ir74HWJH9bTwKAWvHoOwCdnSR+02Kz31ISa/dju64pmQmIa/sIiVn/+SsgtX\nkPfmuXidNTgTEuhPrCfthS7U9lQMN7+MPGMuHPsENj+E6u9BCjuhrQ8umwnltw2Wk3a9DVll+CZe\nhy3eAmpsMFX2A8I/JRLe93f4m0l/l74iBq8UGCzMTWAwNfEX8Y+2qN3NYFg+lMFWjLv/gkwUuAMo\nZTA3cgv8V6f7Dxgtm6FpDPTLcAiYEINaF3yZN0ghmPgMSDVIUidGQ5Q3L8/Bn5JE3aJOuk3fkJEx\nlSH6L7FYhyF1uEHbjX22iYPTdEQX3wTfrCLrWC/Omz6nOJCH2p2Me/t8LK43iOtLxziwixba8Og7\nCeSdSeSbGME770Ht6aG3cx05w+5BjH0coZuENTidfN0LjDWvYfipLoRJI+qLo1RXwoq+oTy17jjT\nxTwyEkZgK1iJQ7sCc4dETzREM1fS37YcU8O7iLRcam6/Dmf6HCbob8Rl8rL/7BnIshWkOHi5Fyrn\nE9mxDEP5H79Cvw9GXzNIgAR4qn7E8G27Kdy/E50UBCUCJjvsXQYP3wiR4OBxrmaInYeIdXL+5s8x\nEIO4YTD8HeTSFbTEn0WkKAqpiWiGLr5ZlMN07TzyIr2g6aC/GdIKYf9LaAMRpLFgHX41Y+ujtFmq\nadDvhKMyTAmDcMD+Y0S7LfjXbUPrBQkv7HoNaftU9F+FSQr1oxZmwY5EvLYL8H2TTeyQgvwG+Fea\nES8qhMiBpFRE7m2Igej/w95bx8lRpfv/71NV7TbT4+4Snbg7MYhhwQkSfHHbxcOii+vitoQEggRI\nCBJCXCaeTJJJJhn3mR7r6e5prfr90fzu3rt3793lu7Cwd3m/Xuc11TWnquvVferpU8/znM8D8yWG\nRV4h3duEafJlcMsKGKVAswuQ4HgpTUVO2gMusvaXQaUDGh2gCnQ9VRQG6xhw1Rwato8llL2Pho8q\n0OiMhgCKJPQrP6c14wVyLb9BmTob3QAPYZeOvFPAe+VQfLkLYNQ8yBuJESuphVakeIEUPIwa78Fr\nOk7m8hYUswl9bgh55z3w9DRY8wAEVaSUhWAYBBY9bNwPR96FtZdCVxUUDMP66fnw3nlgsP4MN+A/\ngcgPaD+MR4AyoilqU4Bb/rfO/6g7Yj4w+fvtd4AN/HdD3PJ9A/AA5UDq939/mXia4Jv7wZEIs7ZC\n+8nQFob0LqiwADHg+hR8XZCgo1BqwR2y06e3kN3QgbxFgjwZxpRCzhlQvhQq69EXxhPs7qDx+QfI\n3vwsydc+Hy2SeOrtxG2KJ7LtOtQ0M9LgM4k5/jgW1xSOnbOW+qqdlHQESbr6SdruvAHl1EbilKTo\noojatRDwYf7gKcyDRoKtGl9kJsfNPQz3+6F1I7qCMdDVCg4nwpKMiOzAX22h/9HBxFZ00TPcT9uE\nBCx5VWRsqIKEE6SaU5juzaJhkJ1t/QRjHvFh2r8VRAlS4jr03QWwaDW8eDpcvyLqjmjagcljwKfr\nxKoFYcpyNNNNYGhFlL8M8Wnw4YLoY2B7I/Q14Bg+Ei24HsLdkH4haBqibh9xByyEdaA4BTumnEOa\nlEkaWTQyHmLfg4kqhEajzVmEeHUAmuREFzMBj34ZJftPojQ/CX9yNsXNm2FKMVyzBsT79JbaMTmN\nEPBBZxFaZiri5FnQ+BKybg5a3RPo9rwPDRHkqmQUQyxmcZTWOQkYtofRhIL5xF6YP56+xCpc2Yvp\nr7sSXGWQ0B+6kyA3Fvatgf5n0RnTQ1c4nsLS3bD+McjMA2cXVIVgRBjd+4tJH3sNnrpc4hY00XP0\nJOxp1ejkwUSKJpC07Ab0+laQ9hGe4US3ReAxBLGfn4jZM4fA8WEcyb0KT+cBRpeV0h4j4c7sRTUZ\nSf28Hc3kRJV06PrfCFV7wdINgxdC2jgIh2DjMjixDhKToawDTnsFyp6ArXdBxAwXvh/NKPq/yE8X\nmDvzh3T+R1PUHgDu+X7b+/3rP/wv/bOBO4g6r4N/8b+fX9QdokmQB1+BfhfA6HvAagf9+OjMbdQG\naHXDxOvAmQ91++DEURw1fVjS3dTYC8hsPoIoyiZ0sBWtZzVi9FNEvOsQ7V8hmsoJ1DgIyG0kTL8e\nMXEhmCwAiO1/wNPPju5oOVLHWjDpkLsGYi65ElN8HGX+BpK2H2TH7+aTU9WAcutLSOYapNJ7oKMJ\nqoIweivobsOQ/zjHmj4jfs92lFCYjhFzkNuWohx+H07U06ffiOGTMuxHm2HRi4QHmYk5OBh/zze4\nYl3oWveg3/cmXSP7kaK/iryr3yTc10ztJROQp9+D96w30ZkFSve7iPaDEKoCTz1Uf4JUq0dU70DM\nW0JLeAjG2teR7G2IviI49beQWQSZ2WBXwdgKTjdC+KCrHmrq4OAaIrLAOPZu2keeylHLh5j14xkg\nJuGniaA+jGPDF6gDnfgdY5G0dxD7QlFNXSETimnCnfEZdUmzSTzQjcmgIkJliOYIct5ULGOOE9rj\nQW4BkWzDe7uK6KxAat5JV3+VPucwrM0RlPowPLYbUQx6cxzWTeUYrV5qc/JYc/e3FMcn0OPuIEfU\ngHkcbL0eCEHfR9Dvbti0Cnr2406LY/CxKuTWHqjogbteg80fQ8YEUCIwbTJK7W4iKb1Ik+OJSagn\n0hHC2P+PyFVl6A+uRTP1EJ6VCC4/ytYediwYijspi47CmVTJzWQfWkq/yoNwzEXMCQ/KkDBuxygS\niq5F1VkIF2WgtIXgyDsw6WaYdSMkZ4K/Cnq3RIuPNh6AhQ9D837wiui+4EFo3w05C34ZeWn/iR8l\nRe3cJVFD/Pe0pf/w+/2P/D3uiLVEp9Z/2eb/RT/t+/Y/YQU+Am4gOiP+ZSIEjLwNis4CSyooKRA7\nC0Z+CIZ0mHYX6uY/EOg3Ht/Z16BJZhQpgYzyBpJVMzvyToavj6Cs3oO87Qi+awbTZvUSaTSixQ4h\nJQmcI44RKjgOUmvU6ANUrsNgGYR7gR5/jA5NGQj2JKwPLyJXPQfTvBvYZ2lkzGOPkNKXhMm4A3Hg\nEcKdFrSMfJhyBNKfg/ybQbJgZyjmhmrKY+vZGLcV44BXoH8hWl4Af81+DGZQs5yEzz0Z+cL7Maxz\nkWR+HUdaKmrzCRrGpWBdtwLl5ClwdDc6yyDSN8m0vP0gIU8EUp2Ej1rQrt0MJ78Kkx6FyjJEWQtM\n7kfXkCwsBjO1b3shRiXockDSqeA8HRwLYfw7YDWgFT0EY8ugPClaamfhctzjJtNu3UuXFEQzz6Ck\n8zMA3BxCjfhQrTGEPYdpU+7G3fQd2tYmKLoVYgeg+8RDly4GPMeInZcLx0PIb/ciTlUQxo1IzWnI\n+mLCTUD1EYy3liJfvhZ3+gAcfjNxE55FklPpKIhn/4arYOM+xOBLkF+tRbl9E/k9rZz01gSe79Tj\nMEyEhFeg5gxQTLD9FlBzoPwYLHgRevvI//IzlEwnkAHFbjDKhJ1FuOddQlf8YDztO+meNpLGhXb6\nOiQ0SxN9Di+1315Ia9sLBDIEkeJ8hKsDxRWk7MFiTszKxaJVM+Db5zhp7VbiToSIbGzDsK8dvRXM\nATNHCzNBbyA8aiAMGA8nPoGZD0HP9zrOZe9D2XIIZoJshqALXjsFQn1w9hsw6ArIPyuqrFZ675/H\n6f8l/l4D/NOmsv1d7oj/LQrYSjRNowVIAdr+h3464GNgKfDp/3Sy/zwTnjJlClOmTPk7Lu+fhMEO\ngMeisnemlSZxEcm2LDKXOImrAnutg3xF5lDqPDpzS3FmdEO/eCyGa1GGXkWgawDyluMoASi9bhyT\nddMwNH6MVn4vImYY5I9B501EF56LVLgezwfDsV40C7F9KZR/h7DuYdU1o5l80WuIPZ/BRbcgjIfQ\nUi4nfGguSjGw63rEpO0gGSgxn46qe5K+YJASbSKUbQFLKl2xWciSgoiZBi1bkebFozP0wYm3kZYd\nwFbrRmvRkfRWB6I3jBrbgXz5eORTnkexJpNx/110D6mlc5qO+L2d+J5Yivn++xDPTwHJANm96BIu\npVvdQMa9b5HbKPBfB4eLdjE0GEQ2WuCR0yG3lnC8FVdSGUlLtyEGFsCQB+DgzeiH3sw2sQQDp3KS\nciUoD4P3UzotWyHcich1ovTUkRwchK5qEZL9WfB7Yese9N1pVFfYGdBvF4aXD2PUjYP4CsTWACSa\nQC5GScmg2zwRQ/VmDM3liBF6zG0g5SyEskVQX8X2EbNoKY5h2KzrwZoFQIBeDtxwMoXBPM75+laW\nTp3Pqbv+QHxrFySWQ/p4tK6jEH4fCnbAhATY1ogWboPeNsjR4JWpdA0ewQnxNda0UrIP+Ym4jmAJ\n9iDtz8dva6Vv0mmEd+8noERo8zpI1R9E8qbTFGOm15pJdlUbQw+04rD0Q3PF0dNYTXypC9d5Duxr\nfLhV8Jvb6PU8BhEZw/4+vGfPRH/0KLqpD8K2p6I1CPtfDO/cCTE7Ic0PvVkw+4HoeBcSlNwQbWF/\nNJAqfr61XRs2bGDDhg0/7kl/YuP69/KPfqqZRINyW4nKkNTw31eGCOAtoI7/fTq/ZMOGDf9hfLN/\noUnieixk6WcTt+4DknNuIyLraNBXUZ0WS6NZIqnBxc4BORRVlSH16sDUjLKlFimYhFKxFxGrEvDp\n6BwUS6exl4acDMI6HXZFh1T9Bvqwg2BhBK15EuHDLehvfRmOrKGr7Wvcuf1Iye7FWmlBtHyHmHYP\n0og5aHf+nkhHApHdlUjyFwhDACnzJMSulTTGxTMg5RCiTIXS9bj9u3DUxCCb9iKOZhBpaoNjcUhx\nLoT5MHJOBp7fFKFfU4kyci7y7bciYrIQR56BsJvIN19hVduxxSYTsPcSGGJF/9u7EaekIzzAiEJE\n0SCwDML34QYs1+ahdMVjP1hF0wsvY6ytQic+QWtrRxppxNRcgVq/G7lTgSmPgLeG5sBeavxexqgT\nsBgKwTAeuu7Cb+xHbJ0Rs9KAplQh95Yg2U8HtQW8y2F8CiotdDhl8tf1EDo3Nuq7btwHpn6IWfHw\ndjksSMfQ+CXhfT34bxcYz52L6N4HX65HmE+HjCZWTLyIutg0Zu9+mu7sNGrFxxyT1pJeaaQhoQPJ\n38DNo+7E4TQzXOoEvQd8R6BLRPODxr8GBgVcu+CgD4p00BkASx/m4jrSw2Uk5gTQa+2YdtZhaPTj\n6JeGrroCqzEf56dbMcX5MSb3oAsYkYJm7JFqMjYPQJU7SNl9AM2dSu/mowgHNFwTg9CnoTeWYPU7\n8Mb4ia1rwVruQ1y0AV2jFf/md1DTDIRPrERp9EPvbgjvAjkFZt8NY+8Ce9J/H/SSEjXKPyPZ2dn/\nYRumTJny47gjFi6JrmX7e9qKn84d8WOkqK0gaoxr+HOKWirwGjAHmABsAg7yZ3fFHcBXf3GuX1aK\n2n8mEoKqzSDJIOvRMkciDq0EXwckD0X7Zj7keoikP0G3VEO5uQ6BG6HpKOpwEv/l1/BRM1qRQMNA\nw+U60ipVpHEvciS3jXDDIWKaFTI2f420+F0CTgsdymfY75OQUxyYkvbyQWGASQfWs3bmbKYHtpJ8\neS8icxji0jPQDt9IeI1Cy7lPEL9+L/pLhiG/8FvoktAcfnhqCSLutxzmCDGhm0hVViO+Wowmb6A7\nux+xa7wQPxl8Knz+KlpNJ4GhFnT3LEE2DIeuY9HZ4Irz0NrcYLMgNvXCxFhW3PAq83Y9hb7hGFJM\nCdSvR4xWUJWRtK/rIPHCsQj9vfDCFHz2UwglzAqSAAAgAElEQVS/vBTjPD36c05G27QR5jaj+fV0\np2ViSf4Cg5ZHh2cj+kbomTQX6/mX43j4YYTShqdzEea9BxApYVRFQuoYiohcBqW3QubJ0NZLo9hB\nZKAgU+0iHCNDOIJcZoLjSYi6DlgYA5/LYIoQyauh9ZswsbeOROl/DF8c+GqG4M8v4YCvCZ+UxnC5\nkXalB69OZcQHjTgiA/juNDO5t37Fpy9s5VOdmzVsxsZ1iA9tgBfkEbBgC6hhWDoJavbC8Pug7HEY\nMgu0I9BtRDvzXsKP3UX3BB0Je1xoiUbodCP6zYUn3iFYZIFFEXQnIoj0mbBnLWhJdPcEcLR2EgxA\ny9WZBCwRnAcj2Mr7I7f46brwPMT2ZcTPuY5e8Sesr2oIQ5j2U3owMwjv0HT6jA2kryxFnrcKAnp4\n4mq4+QWI/wFL+n9GfpQUtfd/gL055x9+v/+RfzQ7ohOY/lf2NxE1wABb+BdXa9NkhaBuJ8ryhyDo\nJzL9HLS4HKSNLyDZBiPNeRLR5UepqiK+7ysmJpwKk+6Hpl2oQ4ZB0ja07MVQfxyxoQ/HgxH8V8Ri\nVrMZMP26aPBvbC6MOR+ObuQp+2hOt5finKon+GwTgf5x6MaMISW2E8mfh+3TL2FYH6z7Fu2eb9HO\nzqEmbxyt+YVkTJ0NS86A9LFoA/eBLQSXv05kVpgDFydwmpSAQAEplWBnMrb0Bjj9TNhzEJxz0Crd\ntF+aiHplDNZjz2E9HA/dVdCTDN4UREk3BHqjP7PHVXKOVuKWY3EWP0d4z60oCXZkQwlClBI7MYdQ\nxUH0gbugxo25czXaG+MJq5uoW7qXDLcHPCOJnDYV3YaXcJ32NCntdxCXPgWKof23owl+vJ3Aju2o\nU+14LZ0oWRoG+hD1cWAqQyu/E2FWYFMpFDRi6s3AlJeNJk9E9pXjTW3C7O1C7N6PNl5AVQARUwjX\n3o28+mIMs8O0LizF/mgMxtNHYI85gFN3GS0+M2rNm/QOTCPBW8A443mITadC7CYyBpdQ2W3lysNv\nMX9AGi1KLIZ1V2PoyIX0Mug3D7beDLuqIbYsGuDd9TL0WwC+Csi8DM3YhFhxDZ0j4rAOnAf7tqPt\n3YDQD4DN76ANGYs6dDdKcz4avbDpS2hQUU1+dqScziD3esy3qSQHh9K5RcX37Fb8dd+gcxjpnZWF\niS644mwsWXbEhBEw6VosA7Pxit0kspgwPbSf8yZBnifRfAVGWyxcPQFWVP7ignA/GT889ewn4d9P\nwOeH0teGaFiL3FZFJCcd/0ALcmUd0vG9iFAf4dgOfEVB/OnN+CPv4c9wExicgSYC6GwzEJoAuhH5\nl8CxN9BiQ7RVK5jNIK15HylrOKT2wahiCPt4V2RwV9p5PJo9jy7TSkwbatmbYCONAhLNbdhTJrEv\nPkBBfCrCMgS+Kkd1eVlyzSLOfOBOLJ8/AIkWiNsTfUSO2FAHmVCPfMHA175A+BqRmvcj2ncQsR1D\nMeQjepdC4lC45xGIsyKV+LCWC/py3RhLQQQ7oVEHI86AkAaBBoiLB3kEKcY1NOt6SRg4HP97Mv4P\nytGdMhTvu62Ypko0F5Zgf8eOiOhgegRsEeQNYeyBeta5SrBe9CiWtXejHA3R2+XCPPIsJCWWICcI\njOnCd7EX7chb7C09TNz6DhyhDkTKQIJ9eSiiCnZ3IkwKxIVQC71ozl5EvzA6lwlh64fcm0yguRbd\n2gAYI5DSCwtuQHx4O5HzbiGYtxdtdQhdgwXbkFYw+JE7dyICJ2jNjpD70QHSghdESxFtfhqyC7BU\nV3BoXA5J69aSLn+Hc/NWlOV7EZkRCPnAIqBhFWQeBzULxo0Fmwbdh9FSGwjv3Ie6qg6cY+me3YCz\nZQfaF0a0uiakfgLOe53IbA/ahwdQJrWh2QLg0VDbHEg7u1BrXWihOBInlNO3tZneL1wYqoMkxgQx\njRhJ1803EwxoxHt8iGtfhIJ+0LAFxW/FlbSHGGYjYcTKWMwMwSXewT1MxbinETlrJCSk/dx33d/k\nR3FHLFjy97sjPv3p3BG/Llv+WyhWCLoR5cvQuerRJQ+BxCJI0IGmotTtwPjZAfB0Qq8HuBDt8rvR\nEhzR44WAE0vAnxVN0/JWYYxJpndaBr6x+7Dd2IBxTxO0nECrqWbnTSM5uakcJT4b46YufONd1Ayb\nTsHUBwm+kUCmeSvfDHuYA4NPomR8MqL5EBFpGLc+/yZxwTo0WcM/bRbG4/sg4whiQTvujxfgMFfi\nfTUf00cFiGXdhIe14xmeis1dhd7nRHV9jDRZQLcbQ4MdOW0M9lYXkfOuQ3nqMnh8P9gT4OEiMDsg\nPx/OuBNp1Tw8Wem0dz5G4vAhhAeeSfdl36KflYLWWkHabR/R+rupJDuuQKu+Bt8HczHq3cgnNzHJ\ncTab3nuRKVobWi9YCk6l3fgiIuDF2GLHKQ2G11/B1KUxVjTSI/yo+hCtjfEYHeXI2ckoRdVozi6E\nmkjEMYDIhOPovlMg1w8ZtyK/kIOxxo8a6kMadTt4n4WeD8DnQnLVo88KYn8uhd7tzYTih6E01tI4\nYjD7TfnE7zRh32NDHnwDnLBDuhmhDUU/6jxk20ZqE6eQumIFZI+G5GpQXZAfhu4MsFohXATTHkcz\n64igEak7gj6nB6VfJ8JlI9Qm4VQMaMf9aJUHkQsFXPw12ubr0WJ6oFqHiBOgD9PznB17oZugqrF2\n2mzGnbaYnISnsY9+Dvet95PkeRjppnPR5p3DvpjDJMwZS1H6yXB4C5x3LxSfjXj7NET/XFQ5gIQB\nAB0JpHE3AUs9bY8ZkHqWYvJ3YjeOR+b/6CKN/x//z30BUf6l3QT/FHTmqJZvymVw0nswfw3MXBHd\nnr4cLq4E5zAIB1Djp6PNXoy4+1qkA8eix7uqYH8ZdD8HjomIomKsw424/1iJp6OQitviCD98LuGL\nMiA/jyICLKufCq8VYS0swj2oGL3fR/w78wmsTCQSuQAvLvb3LYPuL+DGG+Ca2+nJTkUENLz1TpSl\nn6Ke7IJ+y0GS2H7mNRy7ZQ0GXxHy3npYHCFy3IPtziaCy7tp0DkpmzSXuhsfRJ01FzkdyKxFkTJQ\nPnkPTrs1aoABdAFIzwB0VBkOQuoUcg4MZV/wGrS0UuRd7yHCrVhma0jLZ+B95Sl8/atQvY/je9iL\nLqkX+dSrwGREyVvAaHcQSdUITyvEcGwLKYdnk7pkK8673sa88h0Uh0J4TD5m5xGSqUZqVrHZ6tHl\ndNIV8BDWFCgVaLszCRlCdL9jQMdw+OIIlB+CjxqQ0lwErgC1rRmBDdFTBxMlxLdvozABaeo22s4t\npCImg21jh9NZ72dI/SBym2rQuvciZXsg4IBTV6N5/Ci1AVKNWXTl6eCsF2F1DfjroG80GPQQWAUT\nS/GNuYW2tXfiuehBQjs19MYBiK+GIg4JOCgh23oIN7kIP2lEHikjrBpa+DDhrN3Iq4+gOFV4Jx66\nIziyu+ghHuWyOJouS6ageRfa5rX41UaMFCNZrTBpNmLWmSgoOHBC/zFQux9aa6LxjGm/w1zehI99\nAKiRCP72droPH6Zr/QnCHw+l51sbtZEb2LN7CNt/swhfU9PPcNP9k/gXSlH7lZxx0fbX6DoRjR5f\ncgD1662Ilg7kZz6AJdfA8uvB3wQjzoWCeBicAKVNmEQuasu3JLqrSAz70dJDaDFdCNnGNVXPoe3T\nwaRORNdyjrXMJf7LA+jePIDOcA6acxaX+3JZadsPnfdB/ByOxJ9CxbT+lIwYQejptzA2u5AynkQY\nZwEwSowiPsaJVn8QcXg12lcy6mAf4ozFWK5ajnFXE4H3svA6VtGU7yUtEIc0+EV47yaYfCmM+V6P\nOuyB7FBUqCeUzjprNbETbsVx8RkY1WK2XZvDwKAV+/gKJOMR+MMn2OypGEsfw3fnfvSZevRZMsy6\nEfXTV+DSgVjxI8ZkYkqYCzkz4bN7IUuBQ91oXbWIRU9Qn7yb3MpB0PgVmmk4kYePE7mshIS0bWgK\n7NWGUSjakExm+r7NQIz5Bipc8OajcOmjEPMZprcPwSwzRDog5WYYdDN0/w6973xISEYrnkttYC+m\nHpViWwqG755B9YXxyimQVI5IkAlecgrygvOQD3/OqKFXsTPFBbu64MRhmJ4Mp+ShdaiETozmePgO\nHt9/EgPTL+OWEY8hKr8FghCbDccNaNOyUAtr6PlsOH+441we3HYHwm6GuteQ/UPwVjdgHuJENMaj\nVnUipoZx5BYjHyvkzpXPY3mkg8hDBnzhjVh034/NU04Dg4F08ujPSDi0DMaOh3fvgZtepeKD5Zi9\ne6mvvBHfijwkScUWq5CuHMBiNGBMHIBl+IX0fBdPJKaR+KfGYTb8awTq/p/4haSo/WqE/1EcWTAv\nWnlAGugh8s1ypGnNcPtoePYgwjgPznoQVB8cXQy5k5G+/ZSkC17EkpNEW9NMLGHQOscigmtB7Ua7\n7kpUWwXhUDedWYJxy04gmrdCwQJE+jBsb4/k1HM+BfdQyF1ITNVZTNV8MO0zDidvYezKJjB8XwdM\n04jvbYPKOxG6AlhwOeqcU6HzXozOTvh8BlqHHWdrD7YD5+K9/lL6Rg/C/OUMxJiBkOgDzQOHdkDG\nILA6YNhzhDffTHvMUL4Ovc7kJy+n6LmVSCcm4JixDG1DEbRrcPsQtLMdBP6oQ3/xb9BnjYJPHiLy\n5uNEVBndq48h7roBEsZASwOMyoA7d6DuXgHrL8f9mQf18EpkuRyPQ4cWziGiT0YeMxj96BkEyqZD\nfoT8TCvBUAWdH1lxpYXIuqUc474b4J1WWHQ7hK5CVGTA6rfhAi8UXAiblkDNK4j9H8Dde5BiMxns\nTiKj9G5IioWxN6G9dR9yzhUIVxva09cSWL0Oo9+NfO0tSMUzGdFYDseegYESjO2PduIZgk2FfPl2\nHy9ceze/u8rH9JRpsPlDOHgAKvTQLwDZKpp6ENEkEdPUQfcZ8WibAzBoLGJbI+KmMkKfno102nXw\n+GzEQQmGnY4UewhtwDlYjr8OvwdZH8C45TFM1slwrAGa2mHWdEbIMrJYDwfeAHs2xCvw0Q0UpDVC\ncDSxtV9hnpaN0JkhPheaI5A6ACZdDRYnCZz0c91N/1x+NcL/R1AM/7EpCovQnq4DeTbI58EtyWhN\nBrjjNMQtz0cF35M+B+0Ysf2SQZ9Nc/YVOMNzUXbeAi+CtuRpAhndhD3LCPoSsVj8pC9S0couRPT0\nh3AC6G3YNy2BIafCtjK29QzknCwFjo0g22KA390WTeFZ/gxk1kPHy4TGvo8uYR4YDyI2rcBw8VpQ\nJVAc6IAIzxPaWIZ5pBnNfBytz4BWOAFJfRSa/wRJr9K36gKURBcVsa+QFWpgfMMkrOGBpIS66Xr4\nc4LHzyDkugG5ux9i3z60cX68D3oxzCxBN9gHA86CY18iff4U0kUeRMtTkO8gcunTdCw9hwR/D6Jq\nPVr5u4QHnIUu0YOy8GqkSdUYlr+ObuFaUKI6Bl4+pjacSubHboznudC5E/l2QiFV2/P42NzHwykF\nGKcVwcevw7zJYEpG6zqOcJvBmARKD6FZZ6K1HkT3+VRywx5UZzEUPQ++p6D7JcK1YRTjCqjIQuvp\nRjIoUF8O334E6z5GMVlhyzK4QIWuTfSWWrg9/R7sC5v4POZrTKn3AQJMC2FoHegbIC4Pze0gNKIC\n8aYf66LDPPfkIiSHF2xGGNwPtv0R57Pf1wRMWoSw7UUblgTWmyB4NnRlEnE0oqQPZ1dSNlP25MGa\n96BgFAy8B1kNQrAX/vQqpIehcCwoIUTSHMLFc6lXj+Os8ZJY9G5UF+KXUK/o5+AHVDf6KfnVCP+I\nCJ0OwmGEbiKa/UB0Bpl3BH7bhHZoEpAFlZsRsUHoawdHNg4K6S7fgvNDI76HMwjm3Ymk6JC6Jfzf\nSgyeHMIz04a9czzyib1RwZy0fhDYDLNfQ31kICMTkpHTZqO9omK/zYvUeg9UavDhY4Ru7U/VtPmk\nGpPRAX3OIKYTx0CK/S8RgTiuxn84DyVVDyWxRMasJLLsLHRjfXhGJeDX3YgptxWpPYX+PIqYVMfQ\nms1sdFYzfO2fsHlfRE7tJZxQjfqmSggIbdKhP0WPbmg3eN6Gaz6EqZcirrwFUptQ177BttOmUKG7\nk2mSF9bfhX9UG9K5V2AoL8FQc4hwv3os6x5AkVP/wwADyKRiPWFCqu9CDQYRpfWcUdBAW9IZpLq3\ngaiAMSo8+ibE34xW40G9TCA3Ctg6Aga9gy5+DKpw4eUpfJE92I4OQnfkT9DTBYYWpOQwUl427LgH\naewViFqB7qI5sPC26EX4euHgG7jcxRzsGMFTuWdz1+HnGduyHsp1UFMBfT44vBZypsADb8DmmSC7\nke8NITJB2hVBnOxBPSChVfahtG0F7QCEDDBwNowaAUosWuUnSHmXowVzUcdsRZL00FmGlDoUPvx9\n9Lu89GUwxEevzQQMmwoVTqiywzg/FJyMYszE2tUPrXY1mHdD9th/TwMMv5gUtV8Dcz82JhOa14uQ\nnAg5E6GfjUj8AMbuhxPNoIIWr6BF3Gj0Eas2ouXfRddTFYSTOjCK6ZhbBfbl7aR2eMnpK0HEOJDi\nM2DiChhdCNX1QC88NhKtx01mXRUodtA0KkIz8Dm/gWceQn1sFUfH5eO3KNh8KYTopdIXXfmGu+vP\n19zRgqgoxeANEbRrqA4HyuAS9DMmIVo8iJg7SDB/jC1ow3BUQax+GhKysI+8AF9WAQw6DSUBSrMm\n0paYgBrR8B/V0Bk1dJ16iBsAtnQYOw6aKqB8DZFBv2dPyWjcJVMYKS0kq7qXEBsIpdWi+2QXtOxE\nrVmH9OVlKHVdiLH3RJXgvsfIWByNNrQ5PRgrqhD9RyKaYokvWAuhbggIkIrg/Cfh5gDCBxGbEY0w\n2PwgbgSXBcl1A1bXHCLyKfgHtOKdXow67D7C2mL6vpUhwQzGXjTvG4j2w3DKlX/+3Pra2FM/miG2\njXyeNZzlp1zH2Hv+CLbvl/ge3AD714BHwJCJsOol6PBAMICmV5EcGbDdjFhlQzJpBOcegGkSDM5H\n2/gg6qsXwP5vYO/nSFsq0DZcA2VlBPeASIuAy0nR6rWQXgz3rYO8of91LM5/Fu5/BUpK4PGlcKQW\ngOTYZ9EXXwrVW366++BfAf8PaD8hv86Ef2RE/4Fo5YcRI0b91/3GOAIzXqbj0MuktB0mVHcBvWmF\n6MqasB1woCz6CHn9faj9vkQqjYVp94G1HZF+DiZKEJGVEFKgcCYUavDpSuitoq4gH0NMDKmOk8D+\newxxAwncdTmWi17Fk29ETzyy/wA10kLCnEJcykUQOB8+nAMjMwjtOIDUXYd80gzE0GZ0IUGoqQVZ\n0xC2LMCOLVIENZeArRMGOuGzR9CKpiNMYSZ8/QTqxIeRJl3P8ObvqHTaSBh8JXYD0H84YvAwGHgJ\n1N0I8ydBsJKW3fXsrVjMYIYzXNyAFPERHqBDak7HrH8AMU1FPbgc4V+L2iVozneQUHEL+tIUuOw1\nSMwEILLQg+mJfgjtMNz8Eb2hcvQHr0Uf+zIc7YCkNbAsDIl66JIQHj2azY2oc0LSFNgjQdUK0G3G\nZpEwulUkTUU0vISaYCVcqaHlJ8C4y9E+6UYEv4RQ4D++0+atpdx80ZPMTV3PtdphrPuNaK6nEOhg\nzELYWQa6CIydCpVvQECgxSWi7mlCnjgMccUfoOYreOVRtKNwsGMMI+w1aMGBeForsWUeR7ruQ1CC\nqN/mIAx5hD4rRxcvwB0kmCYIlavw2G4wWv77YLR9H1TrnwzzW+DrV+Drj1Bmn0VMyQMQ95f1F/7N\n+IX4hH+dCf/ISANLUMsOoEX+4llHCPSDZ9B+XgmtZ49Grusm5r7D2N+QMQ59HqXTAB07EXUC0gbA\nmFsh1AyJQ9GrJ0OfDg48A+aJUHkE9lWBloAp4ibBkQsnvkOc9iSG77YTnDaVwPSJNPAW+dxH7jon\n+o4QnZQRlFbQOyMddWM9HU/p6binDinpHhjyAWLjKMi4jKAlC+3YjVHxlswpaK4H0TxrUc2dhEUW\nasBM6JkJ+DecSe2k4bjtPWDNRVd0FcV1KeiGhNCMBsTd70br8ZlGgj6HYPyNbE2bTvX8xcy46VPS\nP1qJtOlMgt7poDYhtzQje9vRajYSFkdo7D+Jg2ePR3EnoOu/DBz5cOdM6G7HpzXjNcYgdRQQnnsx\nWu9xtG3LaA9dCZ2DIbYWvumA4TIs0iDLhKKzEc4Q4JKh/HOwzoeRj8CE+2DKDWhXrke69gTijgqk\n6XPQzwB39loi3ldRTR8inTYfrKbo99n1Oba6K1n74Uz+6K0k7603iKxpBHM89B8Hpy+GlGMwZwDM\nmAK37YUHKqBfEVLqFKRrn4PiyTD7EdQBaTRt0eEz386O2400Pb0L22/eQpEs8NlCRFUL0scKfL0Z\n3w6Besu7qC4DstyAGOCEry6C0sejmTp/DWseJA2Du5bBjDNg8QzEg9eD7a/oRPw7EfoB7SfkVyP8\nI6MdKyd072+h9QjUfQs1a8B1GABRXUHxc8001TYiVRcjjwjCo+ug5zC8OAwt3o4Y9AbCNBj6KsE+\nOHpccCP4suDoW7DsQXhtPQyIg0sXYZTM6AJqVMfiUD36bug8J0IlD5LHHcgYkXTxpJw4CR39yBQv\nI814kIi7hXDpUvRLb0U7+8qolm++hpSxGGuBHuq70DrvRE3aCx+8RKhTR+SEBfnlzxGmenT90wkm\ndzP01bcwvPEHtN9dBm8sgdfuRRRcgpYlg6RCMPosV2dLZF3kGQoYw9jemeiS8+HRVwip21DrZaQB\nL4Ixg2C3QlXuTg5NmYWu0s2QB7aRlDML4d8IKc3gUCESpEvdg1fuIshqwsNGQPwQ1B3vQd1uwv5R\nRLbHoA6AiLkLWs6AKUsQMbGo2RKafAQCYfB3wL4D0NKLteoIOjkR9CZIKEBJOQ/DWSn4r7LgyZ5K\npC0XqUSF+j/C5lSoewnr6iC6uAn4/WHa7s/Fc9gAO95HG38WrH8YnHkw+0lwNYJiBE8noucQ4pzH\nITf6pKR2tdK4tof4M6wMvec3RI41E5fbivLh+XD2E7DvKHz2EKSMQRytwjwyEa/vJaR1IfqOTuHw\nzFNgwQpInwAHXo1WMPlLDEkw4OGo73fYBHj9G3A4YfNfyrf8m/HTVdb4Qfzqjvgx0TSk8QORCsOI\njrXQ2wFfPwbH4qLaxMlpGOKPkKaNpfqWc8k9FoDProO+Xpj5MKJyPWL5YzDuamj+FFK/L7wY+A4O\nNUKDAvG7oH8GnJME9nYi9nioXAUZl8HHywms+T3d6pdkqSp6xRk9Pq4QT1oiNrwIZKQ1PoL1MglT\noXdkKs3G+1B6y3Hm+lEab0CLDaHqV6LapiPvGY3obEMZvxPp0fNR7T40/UDkRZ9jvz4btc4GnloC\nE1ppyuyPYZWb1LHTESfeRG39hkBeM5uazyCur4mZO0uRj/8e+uvhNB1sPBlF0XG8O5GAeBzjOAN+\n8Sope9vIWbULSUqAUQNg2oPQegAcXxMe1If/g2JcZ6eRdqIFnSsWqcwLGYep6zER+WYjmbs+IDhS\nj3DLhGONhK+7BJtuMiJyNbrqpwhnvYmSej1aeC3i9d0Q6ETENsDE6Cr+CF1ETBCJsRBe34n6yES0\ngBepsB8EPgHHJDTPMbTZNqpPSiJn9hKMsySab8lArgxhHjMLddd9eK/1o7O+hVkXhzi2FtY/AWPm\nQGYJAKrPR9Piq0lY8gAG9zNIiYMYmrcXqXgIlJwChldg/gj4ZCPBMc/i/6AUU34r1qUmvFPjIXku\nERqiCmdpY6PtryEEJM+Mbut0MHJytP278wtxR/yqHfGjoiGC5UiGrYju9XCsF75tj94kCzJB2Y5m\nUPGXq9Tam3AtL8Uw50wi0y8kEpOI3HgMQRDefxpsfbDrBGRkwdEH4fhQWPQ2fLgNntuIZkyjs30D\n3l0tOEQY1u6Bp35HpfMIbsnNoLZU/Mc/RF+vgPc1uu0unI1mwpub8N57M44l9yFV7sRYW4HdJWHu\n2YTkdOF1deKpHo5uZw4Gwyyk6i1ERvSjvecASrkLUi5ESdRg2144UoXIjUOkpuG55ml2DdvKgHG7\n0Yfeh7BANG+jW2ch0TQW0dIJKXmYllYjGkpg6BNo37hpKBjJOycXkNCvERM2Bj3fgG2nipSZBVWd\n0G5D+2Y9och3eAe3UDY8D8dXZrqzi4mVUzG/1wRNG6H/MfzdlST4JKwzrCgGgbCFwTwZufYzukIf\n0Ot6G9PmlYRH5SHq4gkk7EGtjtB+/2h6U5rojT1BL1/h4Rtazc/jSpbRPLno+vrQVW9APycJkfsS\nWtKZuJ0Kke71hBz1GEb2Rw6rWN70YzzrBqSWTiTnKETRJGSRRcj1Gqx9mXBERRp0FsI6APWLN2i6\n8ALiHnoC07SFiMYvkIddj6h4EeOgKyDzM4h7EVrjoelrNMMRdNYGtDgb+kvX4e9+Hf2g66g07aWQ\neT/3wP+n86NoRwxf8vdrR+z+5UpZ/pj8cqUsfyBaOIwItIA5LToLUSPQfTwatffV03d8J3tfXk7H\nYieOd9zYHjIhsgXJH/eRVBFLR4kHnS+AbVs8cuQInGmHwLWwaifMy0Y1leOK8dF7zIO8qZfsvTVw\n6hAouB6f+SAnCqwMvmEVariNvpV3Yt72DYjVaK1OOh8xEffZN4iMArhlCpj2w6xQNIAUmYK77SSq\nr3iMrMvH4TBupu46C0GDkaQHupBbSzAPGIhYvQIGZUTV39CgowbV10Bgng5Drkxv7I1I5W9jre9C\nrArACzvRXv4NoeJqWrVs0neUIe74GH9MGNeVtxOJ6yJhvhlTZxHipa/glvvB+QFql4lgvolwagNB\nbyHvJ87nZOM8cipb2ad7nIzcOOIXN8CiE5BzFE/jcwSDA3GOKYFv+oNPgr4BUDIHNt+Ef+Bc2oYn\nELt9HeTnYo1/GrHkPHjmCHx9Psx6D4rhJtMAACAASURBVIAQDXQF38Thv59XrBdz0pyPiY0z0LX0\nInQkImMh2FOD6fA6jDl2Yuq2oilxGG7zIvVZ4bzT4TfPQNc+Itv+QOdDqzFmRzCNMSJ/EiI4P5P2\nJyqIefZ5rGdfGx00my6A3N/h33o2xj4NznkPujxEHj+P5otHkty8G3VTG7q5byO+eI6Qdxe+SxS6\nPBlkDd+JMMREzxP2QM1bEDcBYgb/rELsPyU/ipTlZT/A3rz+//R+twCPA/FEFSf/Kr+6I34ChKKA\nkv7nHZIMzuLvX4zBlH0m49cspZ6R+FeMJ7lxKi2rfo+28VtaElpo1GeQ4Kmm40JQAulYtS7sxx5D\n54gllDUUV7cHZ08mhpZ9KK0ecCTD/D/B4hmYn3yMQc9fAnljENeswW/6LfRVoFSZoNlL3CuDELGd\n0FwK/fvwhcKYfBqeYjNK+qlYKo4w8P1TCG3eQc08I5bGPlJXOmkYHCZ7RQfi4AYojgCHoCURioeC\nIYuwYsKUWgVrVWwJbkTStQjHkzB0NOQORpz/CPqjZ+HMuImjWe9QcOMCQqZMkk5uQLEFEKsSoWUL\n5NjQmlYTTKwjPDEHqaoSd2URnxTP5ILQOGKsmUSKkhGH+hCdPsjvD5Z1YLkQy6hrsAgBXXsIOE8i\n6NiMrcUJNVtg1AMYVR/JlquI1H5KcNpOGhruJybDj7WvGiFHF90EWlpoWrYCoXyI/UyJTJGNcnYc\nxj9pFNXX4s64mnaO4gscJ8s4ib7ks3BbPia09zPic1wY8pJhz2H46D0YXkjgWC/uGj/26XkoIwvR\n2h00vbuWoy+dwQjfp8AOdJyEXtMQez4lVKKiV+YhfXcrfLmH5vwMvOEaIoqK3qdDdDwKk2OgVRDI\n02Hd24Z77yk4pJzvx5cGjSshYTLk/QZS5v775gH/LQJ/u8s/QAbRqkS1f6vjr0b456CnBTSVjJF3\ncYTV+OVS8vd3Ii56GRqaidn2OU0zg6i6XkyOTsTHQVpHWAidaqHHuY9cw8toPS46u+4m84gLLrgN\nKnaDuxuefAkx9fRoGaBQgJjLewi2NKLEhZH6XYbYH4GKhWjxMvTLp3VVPEnVQYwig86ch1EKS7Cs\n3Y8Ybye1byHBZ1eh9lUR12hAPPQsDDoNHp8JjkaozwTHQDhrEnr/76FnGex9COmmGbDij9DRAVnH\n4aGbID0H1ZKB4bnFFFjshIsdWJorwQXsUuBQD4wrguLBiIHz0Ndcjr6pnk2TptFkLODKhlJ0GZPA\n14zXsx5L2jTMH7wFAy+E1sngnI5QjoOtAPatxDPAg327HJXdtA6CMXfTy3a62u8iNW4hmtxMelkT\nwdRzaf/8W8LHuml7/RwUh4PU887DMSKMqN7K/JQ72Xp2OcqwMuyeTtbzBgp65v1/7Z13dFTV1sB/\n506flEkhPSGdkgRCkd6LKAiCYkcURQXFDjZ4Cs+un8/yxPJsiAryEJQiCEpHkCKdQAglhFTSy0ym\n3/v9MfhApEoLen9rzVr3nNn33rPnntlzZp9z9nYOQDLkYRYdwR2G46cvWPdaN5oEP0RkxV7ER6/j\nfDWf2shU4n/8Cs0vE5C37+bwhij2fno7rXN+hOWZeKwZaIfvQ5EPIbYuRYpT8O6YibRNghIH+eOC\nSHVX4gyLgnwremNPRGgndIsqCUwUZEc7SZ0BtOkGXW70TbW3/BeYoi5xJ78MuLA+4TeBJ4G5pxNU\njfCloLoIHlsILg+J76+npvwnKh/5glD/nrBkDObn55KycThKfStsBZOoaBOOHCaImlpIWEs7tZ3f\noNKShyezHvcSF5ppL0KtDiQdpKbBQRfkHoLdA5A216N0lHCV+WF07oDAntBoPAQ+giyVYe6poSDf\nSExlDYZ5QegOr6N+mAU/8QS6r6ehrz3M7gGpxMkFePbPQIsJ0vtA1nwoXQF7F6N0+BfO+KEYYhTE\nwO4QHAOTF0H2SpTiz/EUt8c9bSpSSDz69t2RgiMRd42h8rMu+Bfvxt0iAes/n6S6LIfatAyidE1o\nXNeZyupcAg9X01k7GZ3bCXu2gX87rJQT4FEwFEnQaA20vA10FsidDptmopjNeDR2dJWlMGQuyrLn\nKLW+ittPIXZLc6Q2vZCkVBx7H2fvp5MpPugk48E+pL18Pfq4/mDdjFdZh7DHIISGpqaJ7E17g+A9\nc2hWGElUzMtItcuoK/mZmrptxGbvQndYQ+adWZSkP0dAxqNYs1thStQRsXcLHPgCb2UZtRvrcfYB\nOXQHEUkalOWrqfrlJ+pXV6BrDUqFCc36ELyJenRBEvKQFjjiuqOVDmOufA7r/l7oF26GLgsgLAqD\nuSeSeTOM/wjWrYeXrvXlgnvuh0vbvy8XLtzSs8FAAb5sQqdFNcIXG0WBuKZgL4THh2K01VHy/vNU\nWLYQpKQhue0+f5cxGpE+FP93PqC2VSdCvp+Nd2Af/MvW4bd4HsXdW1AjJ+NoXYxhZj0i3gRXRoDH\nDDO/9KV/73s99vRF1AdJMCcK++tbCFw5Ga38CqLuJjSd3kOa2J3ITiW40rWYNsgo/kmY36mivs9Y\nvLcpaOoUHFcbMC+RsW+Zi2n1cjTX94T9O6G5CaW5FltiBiLUgqhPgdajYI0DJe193EsXQuk6HM06\nsHfOaEJ1ScjubMIKJlCWO4eim64iZkoNjphQWPkWFn0UcQGt8XN+j2LfiDk6k6RiB5+2vAtXdBvu\nrd6CqWwKdZZEYrfbkAbeC2v3QpobtrwD5XXgiMTepjGmw4vBFoC8/UVkzzLC5ixFCmkK+8zQ92kE\nAkoU4if0JikoBNOsLNyRc8EaiVL8LjQ2+TZdAOE0JYe+1AXPJ3X7Ljwb11F48AO0+6oJ3FqE0qsO\ne44BslyE/FxFafRTBLfKwDJ5BnwyBuW1LLxDDOjDA9k5OJPuS3MQrV9DtPySEJZRtcZM4Xt2wjtI\naIbfjtO9Gqy/UtZ0JGFkYOFFrC+Oxe++YYjtv0BOPETZEJ5c0rfXIoUHQcchvrmH3T/DzBdg2Itg\nMF3avt7QOdXSs7IVUL7iVGf/hC/J8fFMwJe+rd8xdaf0BzUkZ9FfZmLupCgKWP8L5WMhqwRMt0L7\n28HciWrNQRRexjhpDt5Jr+O3X4uwtEKe8y2eglXo0k2Id6tg2jeQP5YVjerolv0zmsoIOGQFTSh4\nbbA6CKXzlXgWfoacGoocVYnip8W0Nx7ZZkW21+NtZKcgowPVrQKJiF2N9oATnZ8Rb4keb+ZVeFKi\ncFd+TV2MBgu1yDYdiTOLENng1IXBXgl99yFIfdfircrEnb0QzV2z0LmSIKcnrPSDpOvxygK352eK\nhBOvuQxNRiv0UeMJsf6KqfRhxOooXCus6IrLEZFu6CdBh/dAY4Q1I+HaPWCOp3ZBfxYlNqcyMo2r\nRBuqA96lVWkBwrGVHHNfmkTNhC/agewPq1dRNjGUIElgneemctT1xOV2RL/8OWh5J2RtgdungTEM\nxt8Bkz6AqSGwLxPHC03xZnmoNy7BpYRgXKElNG0Erk0zsG2IprrjJnT9wPCdC1OTtphajEWKSkN8\nOwx5dSX2rGwq93uwv5SKMcBB4x1ayCtEHiph32+hJkmwr3dXuv+8CnZZQNMYcpfh0SsUfgkEBhK7\nZy3W1Z0JtD7Cr0NSacZVmPZUUf/22wTeczXMfA5y8qHfPdC9N0y7HTT1EDYM7noVAkIvdS+/KJyX\niblBZ2Fv5p/x/TKApUD9kXIsUAi05yTZ6FUjfCmQbWCbA/qW4FgPzg0g16AIP+R3fsI58Ua8Fb9i\n8GSi+9aD6BaJd88cxMR8eOYFPP36s9j9BK2+LiXMVIdIjsLg3A9he+CQBuXXplRX1LKhcxpN7fko\nJY1IOLSan/o9isbfTVjzNei8Vvzy7OjrJLDaMLS4Ea0uH23Hd9HunY0m999UREZRGWwnjAiEsY6A\nd7ehTbwVT+5epAEHEBkz8K66Cc0+oLkDkXoleA9D7UawBUOj5lAuw8e5YHWh9E1ADP0YwtPBdRCK\nBuOtcSCmFSPtr4MwCQx+ENsSpBKIvxbCU8ASgZy9Gufcz9h4Tz8Cdfk0av86Ydbp5NWtockKCaRQ\nKN+ILVCP9RpBqKOGQyKCuIO90OEPUiQ4zJDcFZKPxN996jZ4aQrcFQo9TcgBUQjrQZQYK1WmaPRK\nDX5GG3U5ARR1v43aAxtID9iFJ2YoQQcTIG0kGELhxyeoKmmL4+eVRMRL1BXZKR5hJWVJHdrmXrBt\nQylxMPfawfT/JQDDdxuhQyAEHYRgAywLxBVXR/5OF+EjZexXygRV9WBNoI5epRpqHlmD//1N0RSV\nw7LNsB9IjoCBD/uSiTILosN8AeUz3we/xJP1vL8M58UI9z8Le/PDn75fLtCWU6yOUI1wQ0Kug+eu\ng7F9USpXI1fuQP6mDleKE9cuF4fnRBMRH4G9Twabrqmmw/ICjJIbY20F+qgCCG4EjXpRVF1AxVoN\nZmMdOenNKL0uhaHvbcO/ah20NqIcjECelwW6WNyGGA5mdiLWlI9fUhGlPZ9Ae+gB5radQkbF02hC\nU2i1YTvC1oq65qVImij8DyxChI1Gtr2BKLYihMY3B3zbFLDuhUMvQFUKZL4KyBA2CAr3Q94CWDoH\nDCnQIRR0AmrKoWMVVBwGVydYa4K8bVB9EOrKoGkShAaArRKsZciuGiS7FZfewMZBN9Dp52+RNFrY\nXwdBRkontMNt3k3khnrEQpCcCgQBRr3va3DdQN8PxMFNMH87pCjgtkMLBUUGxWhEhHmgUWdo1BEh\nwLvxA1zVLqrd4RjS7Vh0ldjLwyhL641Wn4D/V7+g+F1H8EMPITxuHL0TMfzzdcT2pbBgEUil7H3t\nFepqV9Jm7a9gTABDPFAP6zdD7xjkoFR2frWSjM8mU+Z3N1rbNA7tnUva5D14Cirwu/kan5Fd8iHU\nh0BVDSwu9K18qC+GtSNBWw3uKui6FEx/4WDsnCcj3Pcs7M2SP32/A8AVqEvULhOkANBEQPDTiIAH\n0VQ9huT8CW1oHtorLTR6qC8BMT3wHnqXKJeXIMmErkkIQs4FuRMEJFDSuhmyuSctZnwAgdkkUoZd\nWkFFj2BEfn/8pq6k6NOONBr7GXaakHXfIPK7xrG6GCKSzXTJvoOiJm9wnb4DNcYI9muK8EjdMTiX\nYHm4GNdXMyC2Fcq8F5G7JKCtdoKrCjaFQ//WKIFdqS3dhEW7HHn5GGSRguaKRERgKLTsB5aZEHk7\nTLsfZasHOqQiNzEiQh2I1d8gfoiC7zdBdRXe55/Auj0fy513w7U3gRDY931DlXczscoQ0ucNZndy\nJiVd76Nb9gL0v2YjRAHhFTKa2vshYBvUrIR8D1gdOJroMGqmwesSuDRQ7YYiE4pbQdkZjHiwGmrd\nUCsQrZ+hNDScoE098dZ40OQHEtlyKN6SJRSkBBIUU0Zj+To8h3MR196PvvlQn0EsOki9FYwfvgbX\nWqFPBLnJ3diR4mHw1+W+kWu72+CLH6FqK1zfAVb9gNQh0Lem13wt/vID7Cv4F5ErorFuKCfohx8g\nNhZyNsA3L0LrATD7c18kPEsImKMg5hqfi6XxIHBVXOqefHlwYZeo/UbS6QRUI9zQ+G1Np9cJzlJE\nYjQk9sOwYz1awzAcmq+pj4W11iG0WvgV8rbDiEYBiJBd1MZDyNvL0ZdaoWtPUEqQNKH4bdmJ30YD\nHtt8dvaMJXTiTL68tylkuknIzKB9fh21G0ppZfkJHOWE/t9IiHyJmtdHkVa9HkNlMcwOhVut6LPG\nIEddiSfagm7aftguYKA/PP4B2K2sKZ+CpfdY4ovX4apy4iguJ2rrUjQVO5HDizlo243XcTeRA2VM\nD/RGFNkQP+5E7AlCFNbDmCwono/DkUHOT+tJeO896N4dAPnQITT7dASXxuBu5qDo3ttIL+iC5ud5\nLIqLZGBEAcHbDqBtOQGqd0BWAVQFQLAZLAUUDw8jVgHdv5rAri3wdTW0HwkaBU9QDKJwEnRxoVkX\ngHvz1xyQsihP60RVy9u58j/Ps7RpBamexpRFNqNb3sdsL3qe+F+q0flfgf6th8BtRDGYMCVKYKyG\nFYchOI9N/RrjLtmJPOATNO5qCGwMGybAU+2htg5sDtxJXvQxLuybhmGMb0llQBAJy+cjhychGfPA\n6YSkFOg1HAa0g8hIKMz1GWGApqNh+fXgroUm91ySrnvZ0UC2LatGuCHhcfuMcF01uPdD8Txf+iS/\nWyApHs2O/fhFTcIrP8XwsOFoPhsKi19BWTAd+0ET7lAbFtESRtwBmYPh2fvg/6bDgZV4XYL6964l\nIq4Qc5abke+OQ4Q0QknoiHveLMoz7NA4FXY4oHdv2LySsP/+jJ8lFdZ/AN1bQ1wMinUHzuq5GErb\nI/wlaGyHkRvAGEBh6S/MbRbKrdI0lOpuhO5aQE5MOPNa1jHki3WI/h8RvnU+a//xGfLH96H4OdCm\nJBPcaDiWcZ+gfeApKHof9o2kdEZ3POVlBHTuDB4bbB2NCExGU7gPsfFb3AQRVyjh2T+XJkFamhbE\nQ00l2tUOMP8Dej0CFge0+jcob8MHDjxhWoqLBY2n10JRIBTUQ/BWCHEiOkoIMRxiVuDq0hvbhHlc\n0a8aPLFI6V2RqjUMeycbJWMT3t5XUBXyIcmOhyE0FN2OHdD9IRh8P66D+djnf49J2Qi5WSjXWVCa\npjNk2h5096bDplXwTGdoHuoLvL43D9q1oLZFN6TiCGr2yWS3MmG1mVCiEgl6VodQ1kJlLXiroW89\nOJ+FzgqYg0HJBKEFxePLdZj9nmqEzxQ1s4bKH7DbYNVciG8GIyZASGdwHwJnNTQdANPeg6vvIkCW\nEDSGxlro/iRiQwHmg7sxR94JoUWwdR7s+AFKdqEUfYgI247mP99jukJC5wemblGQ2Ax2L0NE/Yz2\nnlKik0CRvYi290Gr16AsHz+XHT5/EfKdoN8DYjj2QUno5eZIY56DjStg+2LwC8Kb8wgB1V/x2DcJ\n6O+aQ2B4LKImmZiUBBy79uB0l6Fd/jH62hJazu+Gy28qupqrCBF3UzN1NLnvdsdr3oR/bX8CJ2dT\nW7WI9BlTEN5KyB4Hh6chqgS6Fkko/ReSHbSBeONwpB0r8W5aijc7CE3zbCS3GbEDxMEpIBth/SpE\ncCS0cBJSFYHbakEZ+QLiqxshsQXe8q1UPBSNO64CU5kDv7JmSEumYejYF5G6ElGgwbPxASiQ0RXu\nQpZDQP4PITdsRK65H611GuJfWaDzLQdzZS1Gv28ePPo8fPE+nv3pDGqchTEsAwqzYNED0EEHe6th\nTRVEm6H7s2j9AnCUHaL8jVl4b2xLTHk0llF3IcIc4JoH/u8fCdSjgCMLjM1/vyVZY4AeM2HDo2Av\nBVP4penDlxNqZg2VPxAQBJ36Q8suvrJ0NVj1UJ0DIWngsIFzLsI1D7w7ofgQPDjQF5axaTcY8jjc\n+AaM+i/c+SlKdw0u7UvgmocSacMxIB3dYRPOPoNhUw30+xZ+iIU3QJ5gQLwSC2vyYeo98FhPeGUE\nrFsNPRKgmw5v8QZ0cwrR6kf72pe9BU+XDtRoxuEwHSKgVCYq6iDBr9wA1mooS8LPL4gm9TVUdzNT\n0GYVZde3wmJ8mCDrf9h1cyG23r0Ij7ueVPPrNC28E8vcXzho0WH7JJmsHjOoMRRC5hcos+NQ8vpA\n8gtg/TcOsQmz4o+Umo7uqiSME19Ed1UGmm53I6rbQoYdJUVBsUVA2qvQNpiQwi44442I2SNgfwIY\natFIbsIWSYTu6YhlcXv0I5ahRBgxjemEFJuM48A1KPWFiMhq5BtuQ66ORzirkCem433nc7y2cOR1\n08FVBhXf4Zr5GnpPCcx+C0Y9h2721xgtI6ClB5Z+CgMC4ZEcbLcm463YTb2uMd6Ns9Dp0tC30+Ot\nshEkucnMbozQ6cEwAHS9wfYEeIt8/5RMGSeOCSFpoMO/QRdwMXrr5Y+a8l7lhAwaCWkdfMdVm2G3\nFZp5QGOCiESoaQoaLWjSoG4PfLMVgkLhuzt+fx2dAZeShqd6OPqo26nsPhpL2LtoMjbi/PUFNCM/\nQ/vKU2A7hNy1NcqWrXgGHUS7oRixvxKUMMS2g5BgAF1LlD5v4L5yGobDT8JHT6AEGLAmrEVO6YE/\nT6Op3Qwb9FC5HSViJ9YdzXBeHwYWI0ZbLmE5SYg1hazuUkRg9fu0avEO3fWF/FxhJ8PSgrBPxiHs\ndXgaDSEk+xABeyoRoe0QjXXIbju2vcH49++Ld1soBzx5uAOMyAWdkYLb40GLcM1Ec1CDMnsqXGVD\nVPZEOAR0KYN970DmPYgmzyIpjyHn7ULK2gGjP4V5UxABGzAaJsLe98BfQtN3MqLufYQnEXPzlXjy\ngqmrrMNS+iWaZ79CWnoHGn872qQUFNM+vDvvwf2rFpclDOdBJ8Fx1TgiwZW8A2OCi+KCn9BHbsHc\nbg+7I29ivzKPzgEeosJhb7uetJj+FrrV86FbOhFj2hAv0tF4CnzPGcB4E9T9BNXtIWQPiBNk0fgN\nIUCrbtI4IxqIT1hdotbQODbz7aq+kBsKhoXQ50fIrfTFKO7sBNO9R8+pK4INr0Gfd353qaof+mLR\n30NFn/UYaEEgd4OiIL85iOp7DARMs6ErzoaqKpRNteAAuSeQLsCrQSDw+OtR8CK5JLRCizAG4TWb\n8cjV6HeXIpJbQEoGxL+EZ/K9VI30oNE2wrAzGOPsWUiZDoTFAkHxUFAHzW4nx7qWQr86us7cg9D5\n8fPCEpqNe5ZGQ+9h/4gRpE7wR0oeBmufQrlqA7ZRo/Gs+4Wge9vhib2GbY2nok9JJm5lHg7/fRxK\nNPOaZgKZ+q3c7/2IRls8iGwP5FohyQj93VDWEuLSqAzegnZqCQFeI1h6Iuz5MOR+COgB42+DO6+D\n5IMotnUI5TYwZkDODKxrv8ccGoPQH0BYbLDdAQd08NT7eOKicRUvwPXkVCpXOglqE42r0op1biqx\nzk3YV7anbvRdROa+i0j8Cl3lAZy7v0U/ZSGiqjm8NBH5x3eo1eThP/hjRLQGzZzVkN4FmrXzPUzv\nAbA+AbpOYB53UbpiQ+a8LFFLOQt7s++c73dS1JFwQ+M3A+wshoBG0GMMZO2BRh3BVAOfPQm9P/z9\nOfkroHGv31U5yUKkZOKqysPKLPzo7/s7a30O0W8nAStLELUeuDIIvg4BrQPF5EJaC25vFM52MuUZ\nGurSg/BzCfQOL9G/VqMprkHsq0OT3A/HxsUYrxqBCGkJS95AQyyNYj/1bQmOBLmmJ8y6EyXGi0g6\nBFES7HmWJvJ4IjZ/zcq729NuSx1te7Zl4/sfErTiQ5pkpCKt3gW17fAqULXjXmqHVOAe35YDoblo\n/D/GVVGFSXJTfkMTdHIr4tbO4hr/H5BCvOQYUhnV/HnGJj9Dm0W5GG9/GmGbD9mbYV84/sEVlHWJ\nxL9gCOz+GGFxQew18ORd8MATsH8pBE9FeO2Q/C9fOEyjoCKhEeadmxDtR0NCDMhLoXo9TH0LbZN2\naN1GpGcWIHbegf+kz/BufIfwkp/x0AVzp3KCKr2I4GdAtICKNzAUV0DzTFhSCYntkZR6atsmY5n7\nNqK+BgKTQXNM4HVNElhmg2fnBe1+fysuzhK106L6hBsqux8Edz7EtoOMCT7j7B8E9TW+CZrfsBbD\ngR8g7veZEmr4Cv/UcTja+xPBF5iVPmD/AFwzENFGtMuicKX0Qf5SQr7lNdwtjOQPC2P/zBuoTfPD\nL6+axEnVtBjvT9xbEfiviKIiaSDu+EnULoii4vaZSOV2hF9TOPwxlE5D9Er1GeAjSNfdDJKEvNuK\n0m46eEfCfi/kP48l3UjPkjoKbqsm7+ocWsx7nnpzN9ZttuPpfh0kdEDkleK3cBUxS3aTsKaO4J0S\nLbfeyxUbbTR/eD2J03VE5qcR5HQwomoGg+Yux2Z/lGYhHm7Xf0vTgXvYKDZhi58BQ1+GTuvQ79fh\nCg3EviIfUVCH0n0c/PczyF0Pb46FWZ9Drg5KDPDMv+DLG+D1FYQsqqPG5A8/TYG9P4JhGXRIgl05\nKDVb4I5/oEtrQfAzz6Dv3QfTMB1S3BXor5iK1jMIuXoSiqU31KzwbUyJ6gBX3wRXdgZFxlOVg7di\nB3UjHvYlE131Acz79x/7hTbjwvS3vyMNxCesGuGGTMKTvtxkjW84WhccCSW5R8vVB2DXNDi85X9V\nXqpRsKMlikDuwEwv8O4CpQIM42HvYwhHMObZWdiHJWHPepqacY8T/E4NSbOTaJTbDCnSA9coiPsn\noH/sK4I1oVhWFWO7fTz6YaOw3HkNhjvuhawlEPs4+Dug9mufH/s3hAB/PUqtFu/kyTB0IuibQFA7\nFGc40sEtNPu2luRfetHoydkk9etP1fadZM2pgtTOiNBmKPoI5JFGKu/QQsubEe5JaK9agGI2IH3y\nHoZVUzDGByJ+MRG6u5h+e/bxUsRV5MbWkS0/zM7afjTbH07m4VtYvK0LcloHDIk9EKFrYZcTJd8D\ne7bD9P9CGxckeKDre9BtLQw1w10/wPTV+Le+HkxBECVgxwbIaYJcqaE8oh/uA3aUykPIH7+H6ftZ\nuMaMQLF2hLjFYIhHkxCHCH0Wp3ckcvnLKLmbIPMuiO4GHQJAI6GMmoXkkfH3vwImLIGUqyGuyUXo\nZH9jGkiiT9Un3FAp+QYib/x9naLAS0PBWgWvLvfVHd4Ca5+H6777n1gVH2EgAzOd/3jdCdfDlkXw\n1FcwaxiKx4G47zvYdwj5u89QWvdF8+grsLg92LbC4iCYnIeHLFxV/TC86o9mwgYY3hke+SdkGGDr\nf8Blhvo6XxD3QzshchDgD989jtJkOLIzFclSgEhsCoXz4frvIHcRzH0XFAm6DYMvZuJNq+CAYTjR\nNx+Cok/AY8Mo0liW9CA9K9egW7AD2vRH3vE9Srkfkm0XBFlR/MYiij5FRHUA63ZomQad3gNDFMwa\nw8+/bmPX2AyK1ofTz7SCZsZaAMSxCQAAEShJREFUgn88hLKqFvHgzYjE1rBkESi5oK+DVi0h6gZo\ndmQlyJcvkBXzI813lCPKs1GcEvaqcCT/wej3zMJrTIXoDNDq0D37AiL0SCCdyqlQ9SUkfo8i7Dgr\n0sEBhpgCxP7vYOGNcPsuCGlGUe1UogPv9J23+HPoPBgCgs9rt/qrcF58wsFnYW+qVJ/w34+IG/5Y\nJwT0HQHz3z1aZwqF3m/9r+giBwfrCeLeP56/YKovLoO/H8SmgM6FqND6/o4PeQBp2hZkRYHK3RCY\nAcZciDfBGy1w3noF+gAbopsR9oyD8iLQLIeqcLAdgvSxUO0EcxtodTVsfQkOloJJj9jzHZrkRDhc\nAfoS2LcYZneGTDMMXgnuu2H5KogzIu3KIu6WN/CIasTOGkxh/kipo2hkW4JO1xJ343gOZxQjWnYl\n+O2peB+KQppXg/7HV3EM12IwrYImb6PftBc+ugdkP9i9jK6PfE7TsCQOtf8Q5f4SbFN7E/xDG+Qx\nWdinl2F+OBJNdQ2kN4aqDbBjGTjyIQQwNUGxzyV8QwplW+oJNhuRwv0wabUQtQeRkonmQCHK0+MQ\nYU1//5nXzvNtpkAgRDDa4nRcSbl45PfRJd4HwU3AYAEgKvD2o+f1GQZa3Z/uPipnQANZHaEa4YbK\nyVLSdBgEVSVHy4GNf/d2Je/ioRgFB4LjlipddRvs/AlSOsDEmyA0Fe58GtI7Qqwv/ZIkBBz8wReD\nIPcbCA0HQ3OcpXvQf2+CXgOg1VS4ZyL0/6cviHjiOJg6Cu76CL4fB7d9BdG94F8JkBoNmypAHwt3\nfAs7e4I7BVxOcN4AQTeBuTH03wd7nwdbBYb/6jCstCE7gpD6+eFx7CJEPgQRn6HtCzHuMsi7GeUa\nBeVQN0STXJTkMMw/VSEKZaR3BkI/PbzcDcoXw9AXoflAwoD88JZ4kpajWbsRQq9EDPTH3Pt+6gfc\nimHw1WiKZqIJckHCezBnClhK8OrfQskqwrxsD9mv3ky4ownC5IWOb8KU0eAfBeWrEB+0g2GzIPmY\nULKaEGj8JUgG8LrQ5vijydiLrKxDEVpEt7dBH+h75Mfm3VUN8IWngRhh1Sd8uSEEXHXybakyNYTx\nKtLxBhh8X+wWfWDN99D2Snj2R7hqxP8MMABFv8CuLyCgBSQ9D3fOQ0m5BYfZgTzXi9hW65O755kj\n7ZEgKAr6PwFzXwRTMFQcgG9v9W2/Tp8EXhk6jIW8VVDfAqIlSO0OwgVOAc4y8HjB0gNx41jEqPEo\n5TLS3gr4ohjvwW+pDB8P9r2Ig5MgbwiwHVEdjsYxH8mZgqasGZpeKUhJZfB0LLzfBSIi4emdvpzi\n8x6HlW/Swn09VYMbUWGsRVzTH6G9BmFajX96DK5FnyJXFKGkPwpthoB/EJ53ppL/9H48iVrM/UJJ\nXrsMIbQQ3MyXQSSlI6z4HK7oAfqrweU9El4Sn/so+m2QzL7ydzdBRGuEEGikTgghQcLVoDWfU5dQ\n+ZOoPuE/oPqEzwMOtmCk9Z+/QN4SWHgr8ogsZEMAe+VVHNDm0HLXh0R/Eo3GuhtufMX3d1k67jd8\n8ZvgcYBcCQcXQL0dbv0exnaAPmNh5NMotXlQuR1R+g54A8EeBZ4ja4Wqf4GoAcgV1Sj71qJxB8D+\nHSh1Eq5RHTCkdkMJGQx1r0KlgnDVgF8VbDND9WEIyYSwGMj5HvKbQ9UWsLghPB7MTmjbClko7Pzy\nZ8qeSCRjl4bw3nORF12Lxno7sv47lIK1eCPeRH/T3Tiysqh78zn0LVphilmDvqA9tZYZBBQUIHq9\nDt2OZErO2wrT74Y8DzTvBI/854+fq+yB140weDo0v+nPPx8V4Dz5hDkbe3PhfMLnctEQ4L9APHAQ\nuAmoPomsBvgVX96lQSeRUY1wQyB/BQXWpWxpHooWHU3oSKxdi23uIEKuXAfbFsK+7ZB/EPqNgA4D\nfOfpjb6R3/s3QOFyX5SvYQvAFIL3n/1wHI5B6AJR9HrkEffiKipEqpmDXruWw6vTcdeaibktBf9e\nD+KYeA2GHl5E6G7QN2aL3JnMkAeRktv47rH4cagvh0NLwN8GscPAPxWqiqDqkC+0piUC3voRKmrh\ns2+haRqEROMuKqXw5eFsfjMEizaMPtoPUR5oDK8sQGx+BTpPRvEaEebjRqcTM2DOISpf6IDOmkdA\nXhdo1hGG3Of7dzJzGDS+Baa/AP/e8MfPtTYftn4C3f95oZ/g34K/khE+F3fE0/jyLDXBl87j6VPI\nPgLs4uy0VrnIKMhsDi9hVTPwI4irGE0ybXHvmIxhWxXYa+CKISAc8NwsqCmDfwyCZ6/1BR8SAu7+\nHJRgiOqBs15LzqgHKF29EfuSpdgXzuewoqVmxQpkhxNNyn1oO08n8QE9Tf+vF/4DJpFf9xnaPkZE\nhwlQMRbFfyp57Xr4DPBvaAXkfHckAEsKVB4AQwh0eQjumAl3L4LClVBuhWEa+GE6XNcDdmfhLi3F\nL7wbXb6NwKH1UjNjHEqkgszT0HMaGEL+aIABuiRBahq2uHhqg7zw5Ee+nG6vjfZlz3bbIbkJ3PG8\nLxre8RhDoNvEC/TkVC5nzmVi7lrgtx0CU4EVnNgQxwIDgJeAx8/hfioXgdaGm2lz3A++M3chlpIw\niG3uq6iv9rkiBo4Cgxl+mQ/vPwoPvAWmABgzF74ajWFoDMkffoT81mGcLcfgN+8rQtunw/DRoDlm\nEkqZgVL8CRvyH6UioiOHr3yWK+pbQ95TVOi3ExDbA9nsQarPA79kaJ4PHcbAwvkQ2h3aBkLwiKPX\ny1kB1Q4Y1RYysyDuCdAGwwuPIF83Gm1CEsHbcul027McCL2FVvoOKDrnySdDAVr0gBvribFV4yqp\nAK8Dhj4AO36BSSNAtxIS+kCXMSc+X3+KeA8qf2vOZSQcARw+cnz4SPlEvAU8AcjncC+Vi4BA+t2O\nNwAHG6jvLOMdN+FoZfMekL3Kd3zlcHhuJoz9GEz+vrrYDOj9MMwej6byALr4pvj37Ir4eJYvBdO9\nQyFrG+zbA0CBqGJydCJ1kUPpt+kflFVOJ89cARvKETuziD20FGnTbbCyFWSNg/BPfUlSGzlB+yss\nn+yLtQtH3BWT4eH10DQaUl+Appkw6V34eiVV8+bjzM0FWSbEHkuAO4rqJ59F6I5ZHnYizK2gZySS\nLhCl62ugPxKprEUneHYqlETAF1+eeBSs0kBpGDNzpxsJnyqt87EonNjVMBBfhtEtQM/TNWbSpEn/\nO+7Zsyc9e572FJULjMCMHG5GG3fMuuXQOPj8IRj/EwSfJJdZWh+Y8TjYqnyTUp/dDY/Oh8E3Q49+\n8NAw5F3bmDtvMnUx4YygKwFaLTR9n35l3/Gt35cED7gPzdbvCG82BewOCOsL2gCw5UBASzD2hJR2\nsOMh+CYJmr4AtgBoNRBCkqD3u7511P9TRuAuKUWXlOIryzIJvaayQ3qXZmLMidaTHMWcCVXfQcKd\nmMKv+P17IREw+CGY+xV8+k8Y9eKf+KRVTsWKFStYsWLFeb7qBVujNgm4Byg7Un4GWHQy4XNxNGfj\nM6wlQBSwHGh2nMzLwHB82hqBQGA2cFzcRUCdmGuQeCjBpszFIkYdrSzMhvGt4Y1sCIs/+cklOfDl\nA9D2elj7JfzjFwC2kId15zo0yxaRcVgi8B/vgun3flirUsMC55dc81MF/uYY6HPcsjzZA9+mQty1\nkNQIZs+CyhJf5LTnN0PUcZsmjlA8fjyh992H/r3x8H/TkXGxnkcxEk5rJp36w9h3K6R8fWqZvdsg\noTno9KeWUzknzs/EXM1ZiFvO5n4TgTrgzTMRPhd3xDzgyB5L7gTmnEBmPBAHJAK3AMs4sQFWaaBo\naESgGPH7yphmcMsr4D3N37TIJvDYD9DuZmjeB4BsipnMUtZmBNDx4c8IfOnTPxhgAH9hoZtxMMsG\nNkHZsRRKc38vIGkh7TGwNAP/HnDLSPBP963WiDx5zIVGDz2EPiEBDCaw1yOhpzkPUk/hqXXx2kB2\ngm3zqeVSM1UDfNlgP4vXWXPGPxDnukRtJtCY3y9RiwY+Bq45Tr4HMBbfhN6JUEfClxOyDG6Hb2Lu\nTHDZ8egNbOAAjQkhhuA/+J9PxHY24ag6QPtPZ8D9n4Jf0NE33Vao3QcBEpSPhrI7IHP06dvi8cA7\nE6D3YGjti69RxU4CaYKGkxhQ2Q5bkyHiQYgZfyYaq1xAzs9IOP8sxOPO5n4TgbvwDbV/xWf3TrZ8\nV92sodLwWcr3tP18JpbNvyDe3vPHTSKunVCYCTFZoD/eI3YCFAUGpUHLjvDylDNvyOH3QfKDsDtP\nL6tyQTk/Rjj39FL/I/H4+51qvmwdR/3BL+Bz14482ZXV2BEqDZ5e9GdJ3x103bwU89510PS46HD6\nDAi4zxen4UwQAm6872j6oDMl7B5wHji7c1QaMKdyp60/8jopV57hTT4B5p9KQB0Jq1wWrGMla6yz\nufdAdwJbniDCnLcMpCAQZxj4pqYKCnMhrc3pZVUaHOdnJLzrLMTTzuZ+UUDxkePHgHbAbScTVo2w\nymXDIXIpo4S2dLrUTVG5xJwfI7ztLMQzz+Z+XwCtfPcgFxjF0T0Vf0A1wiqXFQoyQg3+97fn/Bjh\ndWch3vFc73dSVJ+wymWFaoBVzh8NI6CwaoRVVFT+pjSMLeaqEVZRUfmboo6EVVRUVC4h6khYRUVF\n5RKijoRVVFRULiHqSFhFRUXlEvKnAvOcd1QjrKKi8jdFHQmrqKioXEJUn7CKiorKJaRhjIT/ltuP\nzn+alEvPX1En+Gvq9VfUCS5HvTxn8bpwqEb4L8JfUSf4a+r1V9QJLke9Lo9EnyoqKip/UVSfsIqK\nisolpGEsUWtIoSxX4MtDp6KionI6VuLL9v5nOdu4uVX48mqqqKioqKioqKioqKioqKioqDR8QvCl\np84BfgSCTiGrAbZwmuyoDYQz0SsOWA5kATuBhy9a686Oq4FsYC/w1Elk/n3k/W1A64vUrnPldHoN\nw6fPdmAN0PLiNe2cOJPnBb4Elx7g+ovRKJWGy+vAk0eOnwJePYXs48A0YN6FbtR54Ez0isSXcBDA\nH9gDNL/wTTsrNMA+IAHQAVv5YxsHAAuPHHfg7JKDXSrORK9OgOXI8dX8dfT6TW4Z8D0w9GI1TqVh\nkg1EHDmOPFI+EbHAEqAXl8dI+Ez1OpY5QJ8L1qI/Rydg0THlp4+8juVD4OZjysfq3lA5E72OJRgo\nuKAtOj+cqV6PAg8AU1CN8Cn5O+yYi+BouunDnPzL+xbwBCBfjEadB85Ur99IwPc3fv0FbNOfIQbI\nP6ZccKTudDKxF7hd58qZ6HUsIzk62m/InOnzGgx8cKSsplE/BX+VzRo/4RsNHs+E48oKJ+4QA4FS\nfP7gnue1ZefGuer1G/7ALOARwHp+mnbeONMv6PFr2hv6F/ts2tcLuBvocoHacj45E73exjc6VvA9\nt4a0H6HB8Vcxwlee4r3D+AxZCRCFz9geT2fgWny+RyMQCHwB3HF+m3nWnKte4PPbzQa+wueOaGgU\n4ptA/I04/vi3/HiZ2CN1DZkz0Qt8k3Ef4/MJV12Edp0rZ6JXW2DGkeNGQH98ARguh7kWlQvA6xyd\nwX2aU0/MgW/X3uXgEz4TvQS+H5O3Llaj/gRaYD8+d4me00/MdeTymMA6E70a45vk6nhRW3ZunIle\nxzIFdXXE354QfBNuxy/ligYWnEC+B5fHL/aZ6NUVn497Kz5XyxZ8I66GRn98Kzf2Ac8cqRt15PUb\nk4+8vw1oc1Fb9+c5nV6fABUcfTYbLnYD/yRn8rx+QzXCKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKioqKheP/wdfnzF8qVT/lAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 9460b8c32b..ca8b842458 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -369,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDJUMjM6NDg6NTQtMDQ6MDDJCXMCAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAy\nVDIzOjQ4OjU0LTA0OjAwuFTLvgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDA6MjQ6NTQtMDQ6MDDJTGA9AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAwOjI0OjU0LTA0OjAwuBHYgQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -580,7 +580,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-02 23:48:55\n", + " Date/Time: 2015-10-03 00:24:54\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -636,20 +636,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.7300E-01 seconds\n", - " Reading cross sections = 1.2700E-01 seconds\n", - " Total time in simulation = 2.1409E+01 seconds\n", - " Time in transport only = 2.1383E+01 seconds\n", - " Time in inactive batches = 2.7630E+00 seconds\n", - " Time in active batches = 1.8646E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 7.0100E-01 seconds\n", + " Reading cross sections = 1.5800E-01 seconds\n", + " Total time in simulation = 2.0485E+01 seconds\n", + " Time in transport only = 2.0465E+01 seconds\n", + " Time in inactive batches = 3.0920E+00 seconds\n", + " Time in active batches = 1.7393E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 2.1994E+01 seconds\n", - " Calculation Rate (inactive) = 4524.07 neutrons/second\n", - " Calculation Rate (active) = 2011.16 neutrons/second\n", + " Total time elapsed = 2.1200E+01 seconds\n", + " Calculation Rate (inactive) = 4042.69 neutrons/second\n", + " Calculation Rate (active) = 2156.04 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 5f0b5adbd6..55abf010a2 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -33,42 +33,42 @@ class StatePoint(object): each batch cmfd_src : ndarray CMFD fission source distribution over all mesh cells and energy groups. - current_batch : int + current_batch : Integral Number of batches simulated date_and_time : str Date and time when simulation began entropy : ndarray Shannon entropy of fission source at each batch - gen_per_batch : int + gen_per_batch : Integral Number of fission generations per batch global_tallies : ndarray of compound datatype Global tallies for k-effective estimates and leakage. The compound datatype has fields 'name', 'sum', 'sum_sq', 'mean', and 'std_dev'. k_combined : list Combined estimator for k-effective and its uncertainty - k_col_abs : float + k_col_abs : Real Cross-product of collision and absorption estimates of k-effective - k_col_tra : float + k_col_tra : Real Cross-product of collision and tracklength estimates of k-effective - k_abs_tra : float + k_abs_tra : Real Cross-product of absorption and tracklength estimates of k-effective k_generation : ndarray Estimate of k-effective for each batch/generation meshes : dict Dictionary whose keys are mesh IDs and whose values are Mesh objects - n_batches : int + n_batches : Integral Number of batches - n_inactive : int + n_inactive : Integral Number of inactive batches - n_particles : int + n_particles : Integral Number of particles per generation - n_realizations : int + n_realizations : Integral Number of tally realizations path : str Working directory for simulation run_mode : str Simulation run mode, e.g. 'k-eigenvalue' - seed : int + seed : Integral Pseudorandom number generator seed source : ndarray of compound datatype Array of source sites. The compound datatype has fields 'wgt', 'xyz', @@ -80,7 +80,7 @@ class StatePoint(object): Dictionary whose keys are tally IDs and whose values are Tally objects tallies_present : bool Indicate whether user-defined tallies are present - version: tuple of int + version: tuple of Integral Version of OpenMC summary : None or openmc.summary.Summary A summary object if the statepoint has been linked with a summary file @@ -487,7 +487,7 @@ class StatePoint(object): A list of Nuclide objects (default is []). name : str, optional The name specified for the Tally (default is None). - id : int, optional + id : Integral, optional The id specified for the Tally (default is None). estimator: str, optional The type of estimator ('tracklength', 'analog'; default is None). @@ -543,6 +543,8 @@ class StatePoint(object): for filter in filters: contains_filters = False + # Test if requested filter is a subset of any of the test + # tally's filters and if so continue to next filter for test_filter in test_tally.filters: if test_filter.is_subset(filter): contains_filters = True diff --git a/openmc/summary.py b/openmc/summary.py index 35aa703f55..f572b48ef9 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -82,7 +82,7 @@ class Summary(object): # Create the Material material = openmc.Material(material_id=material_id, name=name) - # Set the Material's density to g/cm3 - this is what is used in OpenMC + # Set the Material's density to atom/b-cm as used by OpenMC material.set_density(density=density, units='atom/b-cm') # Add all nuclides to the Material diff --git a/openmc/tallies.py b/openmc/tallies.py index 5ea0aa8ea9..50afe6072a 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -34,7 +34,7 @@ class Tally(object): Parameters ---------- - tally_id : int, optional + tally_id : Integral, optional Unique identifier for the tally. If none is specified, an identifier will automatically be assigned name : str, optional @@ -42,7 +42,7 @@ class Tally(object): Attributes ---------- - id : int + id : Integral Unique identifier for the tally name : str Name of the tally @@ -56,17 +56,17 @@ class Tally(object): Type of estimator for the tally triggers : list of openmc.trigger.Trigger List of tally triggers - num_score_bins : int + num_score_bins : Integral Total number of scores, accounting for the fact that a single user-specified score, e.g. scatter-P3 or flux-Y2,2, might have multiple bins - num_scores : int + num_scores : Integral Total number of user-specified scores - num_filter_bins : int + num_filter_bins : Integral Total number of filter bins accounting for all filters - num_bins : int + num_bins : Integral Total number of bins for the tally - num_realizations : int + num_realizations : Integral Total number of realizations with_summary : bool Whether or not a Summary has been linked @@ -743,7 +743,7 @@ class Tally(object): filter_type : str The type of Filter (e.g., 'cell', 'energy', etc.) - filter_bin : int, tuple + filter_bin : Integral or tuple The bin is an integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. The bin is an integer for the cell instance ID for 'distribcell' Filters. The bin is a 2-tuple of @@ -842,11 +842,36 @@ class Tally(object): return score_index def get_filter_indices(self, filters=[], filter_bins=[]): - """ + """Get indices into the filter axis of this tally's data arrays. + + This is a helper routine for the Tally.get_values(...) routine to + extract tally data. This routine returns the indices into the filter + axis of the tally's data array (axis=0) for particular combinations + of filters and their corresponding bins. + + Parameters + ---------- + filters : list of str + A list of filter type strings + (e.g., ['mesh', 'energy']; default is []) + + filter_bins : list of Iterables + A list of the filter bins corresponding to the filter_types + parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin + in the list is the integer ID for 'material', 'surface', 'cell', + 'cellborn', and 'universe' Filters. Each bin is an integer for the + cell instance ID for 'distribcell' Filters. Each 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 a (x,y,z) + 3-tuple for 'mesh' filters corresponding to the mesh cell of + interest. The order of the bins in the list must correspond to the + filter_types parameter. + + Returns + ------- + ndarray + A NumPy array of the filter indices - :param filters: - :param filter_bins: - :return: """ cv.check_iterable_type('filters', filters, basestring) @@ -882,10 +907,11 @@ class Tally(object): for k in range(filter.num_bins): bins.append((filter.bins[k], filter.bins[k+1])) + # Create list of cell instance IDs for distribcell Filters elif filter.type == 'distribcell': bins = np.arange(filter.num_bins) - # Create list of IDs for bins for all other Filter types + # Create list of IDs for bins for all other filter types else: bins = filter.bins @@ -911,10 +937,23 @@ class Tally(object): return filter_indices def get_nuclide_indices(self, nuclides): - """ + """Get indices into the nuclide axis of this tally's data arrays. + + This is a helper routine for the Tally.get_values(...) routine to + extract tally data. This routine returns the indices into the nuclide + axis of the tally's data array (axis=1) for one or more nuclides. + + Parameters + ---------- + nuclides : list of str + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + + Returns + ------- + ndarray + A NumPy array of the nuclide indices - :param nuclides: - :return: """ cv.check_iterable_type('nuclides', nuclides, basestring) @@ -932,10 +971,23 @@ class Tally(object): return nuclide_indices def get_score_indices(self, scores): - """ + """Get indices into the score axis of this tally's data arrays. + + This is a helper routine for the Tally.get_values(...) routine to + extract tally data. This routine returns the indices into the score + axis of the tally's data array (axis=2) for one or more scores. + + Parameters + ---------- + scores : list of str + A list of one or more score strings + (e.g., ['absorption', 'nu-fission']; default is []) + + Returns + ------- + ndarray + A NumPy array of the score indices - :param scores: - :return: """ cv.check_iterable_type('scores', scores, basestring) @@ -954,19 +1006,20 @@ class Tally(object): def get_values(self, scores=[], filters=[], filter_bins=[], nuclides=[], value='mean'): - """Returns a tally score value given a list of filters to satisfy. + """Returns one or more tallied values given a list of scores, filters, + filter bins and nuclides. This method constructs a 3D NumPy array for the requested Tally data indexed by filter bin, nuclide bin, and score index. The method will - order the data in the array as specified in the parameter lists + order the data in the array as specified in the parameter lists. Parameters ---------- - scores : list + scores : list of str A list of one or more score strings (e.g., ['absorption', 'nu-fission']; default is []) - filters : list + filters : list of str A list of filter type strings (e.g., ['mesh', 'energy']; default is []) @@ -982,7 +1035,7 @@ class Tally(object): interest. The order of the bins in the list must correspond to the filter_types parameter. - nuclides : list + nuclides : list of str A list of nuclide name strings (e.g., ['U-235', 'U-238']; default is []) @@ -1121,7 +1174,7 @@ class Tally(object): # Build DataFrame columns for filters if user requested them if filters: - # Append each Filter's DataFRame to the overall DataFrame + # Append each Filter's DataFrame to the overall DataFrame for filter in self.filters: filter_df = filter.get_pandas_dataframe(data_size, summary) @@ -1192,7 +1245,7 @@ class Tally(object): suppose this tally has arrays of data with shape (8,5,5) corresponding to two filters (2 and 4 bins, respectively), five nuclides and five scores. This routine will return a version of the data array with the - with a new shape of (2,4,5,5) such that the first two dimensions now + with a new shape of (2,4,5,5) such that the first two dimensions correspond directly to the two filters with two and four bins. Parameters @@ -1203,9 +1256,8 @@ class Tally(object): Returns ------- - float or ndarray - A scalar or NumPy array of the Tally data indexed in the order - each filter, nuclide and score is listed in the parameters. + ndarray + The tally data array indexed by filters, nuclides and scores. """ @@ -1388,7 +1440,7 @@ class Tally(object): Returns ------- Tally - A new Tally outer that is the outer product with this one. + A new Tally that is the outer product with this one. Raises ------ @@ -1408,15 +1460,17 @@ class Tally(object): new_tally.with_batch_statistics = True new_tally._derived = True + # Construct a combined derived name from the two tally operands if self.name != '' and other.name != '': new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) new_tally.name = new_name - # FIXME: Align filters + # Find any shared filters between the two tallies self_filters = set(self.filters) other_filters = set(other.filters) filter_intersect = self_filters.intersection(other_filters) + # Align the shared filters to follow in each tally operand for i, filter in enumerate(filter_intersect): self_index = self.filters.index(filter) other_filter = other.filters[self_index] @@ -1461,12 +1515,15 @@ class Tally(object): if self.num_realizations == other.num_realizations: new_tally.num_realizations = self.num_realizations - # Generate filter "outer products" + # If filters are identical, simply reuse them in derived tally if self.filters == other.filters: for self_filter in self.filters: new_tally.add_filter(self_filter) + + # Generate filter "outer products" for non-identical filters else: + # Find the common longest sequence of shared filters match = 0 for self_filter, other_filter in zip(self.filters, other.filters): if self_filter == other_filter: @@ -1477,11 +1534,11 @@ class Tally(object): match_filters = self.filters[:match] cross_filters = [self.filters[match:], other.filters[match:]] - # FIXME: This must be the common longest sequence of tallies at the beginning - + # Simply reuse shared filters in derived tally for filter in match_filters: new_tally.add_filter(filter) + # Use cross filters to combine non-shared filters in derived tally if len(self.filters) != match and len(other.filters) == match: for filter in cross_filters[0]: new_tally.add_filter(filter) @@ -1523,94 +1580,6 @@ class Tally(object): return new_tally - def swap_filters(self, filter1, filter2): - """ - - :param filter1: - :param filter2: - :return: - """ - - # Check that results have been read - if not self.derived and self.sum is None: - msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ - 'since it does not contain any results.'.format(self.id) - raise ValueError(msg) - - cv.check_type('filter1', filter1, Filter) - cv.check_type('filter2', filter2, Filter) - - if filter1 == filter2: - msg = 'Unable to swap a filter with itself' - raise ValueError(msg) - elif filter1 not in self.filters: - msg = 'Unable to swap "{0}" filter1 in Tally ID="{1}" since it ' \ - 'does not contain such a filter'.format(filter1.type, self.id) - raise ValueError(msg) - elif filter2 not in self.filters: - msg = 'Unable to swap "{0}" filter2 in Tally ID="{1}" since it ' \ - 'does not contain such a filter'.format(filter2.type, self.id) - raise ValueError(msg) - - swap_tally = copy.deepcopy(self) - - # Swap the filters in the copied version of this Tally - filter1_index = swap_tally.filters.index(filter1) - filter2_index = swap_tally.filters.index(filter2) - swap_tally.filters[filter1_index] = filter2 - swap_tally.filters[filter2_index] = filter1 - - # Update the strides for each of the filters - stride = swap_tally.num_nuclides * swap_tally.num_score_bins - for filter in reversed(swap_tally.filters): - filter.stride = stride - stride *= filter.num_bins - - filters = [filter1.type, filter2.type] - if filter1.type == 'distribcell': - filter1_bins = np.arange(filter.num_bins) - else: - filter1_bins = [(filter1.get_bin(i)) for i in range(filter1.num_bins)] - - if filter1.type == 'distribcell': - filter2_bins = np.arange(filter2.num_bins) - else: - filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] - - if self.sum is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='sum') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally.sum[indices, :, :] = data - - if self.sum_sq is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='sum_sq') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally.sum_sq[indices, :, :] = data - - if self.sum is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='mean') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally._mean[indices, :, :] = data - - if self.sum is not None: - for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): - filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='std_dev') - indices = swap_tally.get_filter_indices(filters, filter_bins) - swap_tally._std_dev[indices, :, :] = data - - return swap_tally - def _align_tally_data(self, other): """Aligns data from two tallies for tally arithmetic. @@ -1727,6 +1696,94 @@ class Tally(object): data['other']['std. dev.'] = other_std_dev return data + def swap_filters(self, filter1, filter2): + """ + + :param filter1: + :param filter2: + :return: + """ + + # Check that results have been read + if not self.derived and self.sum is None: + msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \ + 'since it does not contain any results.'.format(self.id) + raise ValueError(msg) + + cv.check_type('filter1', filter1, Filter) + cv.check_type('filter2', filter2, Filter) + + if filter1 == filter2: + msg = 'Unable to swap a filter with itself' + raise ValueError(msg) + elif filter1 not in self.filters: + msg = 'Unable to swap "{0}" filter1 in Tally ID="{1}" since it ' \ + 'does not contain such a filter'.format(filter1.type, self.id) + raise ValueError(msg) + elif filter2 not in self.filters: + msg = 'Unable to swap "{0}" filter2 in Tally ID="{1}" since it ' \ + 'does not contain such a filter'.format(filter2.type, self.id) + raise ValueError(msg) + + swap_tally = copy.deepcopy(self) + + # Swap the filters in the copied version of this Tally + filter1_index = swap_tally.filters.index(filter1) + filter2_index = swap_tally.filters.index(filter2) + swap_tally.filters[filter1_index] = filter2 + swap_tally.filters[filter2_index] = filter1 + + # Update the strides for each of the filters + stride = swap_tally.num_nuclides * swap_tally.num_score_bins + for filter in reversed(swap_tally.filters): + filter.stride = stride + stride *= filter.num_bins + + filters = [filter1.type, filter2.type] + if filter1.type == 'distribcell': + filter1_bins = np.arange(filter.num_bins) + else: + filter1_bins = [(filter1.get_bin(i)) for i in range(filter1.num_bins)] + + if filter1.type == 'distribcell': + filter2_bins = np.arange(filter2.num_bins) + else: + filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] + + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(bin1,), (bin2,)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='sum') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally.sum[indices, :, :] = data + + if self.sum_sq is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(bin1,), (bin2,)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='sum_sq') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally.sum_sq[indices, :, :] = data + + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(bin1,), (bin2,)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='mean') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally._mean[indices, :, :] = data + + if self.sum is not None: + for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): + filter_bins = [(bin1,), (bin2,)] + data = self.get_values(filters=filters, + filter_bins=filter_bins, value='std_dev') + indices = swap_tally.get_filter_indices(filters, filter_bins) + swap_tally._std_dev[indices, :, :] = data + + return swap_tally + def __add__(self, other): """Adds this tally to another tally or scalar value. @@ -2422,7 +2479,7 @@ class Tally(object): Returns ------- Tally - A new Tally outer that is the outer product with this one. + A new Tally that is the outer product with this one. """ From 0eee99ee203f724007a1f96ccf4a62044ae33a12 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 01:04:42 -0400 Subject: [PATCH 255/519] Added docstring for Tally.swap_filter(...) routine --- docs/source/pythonapi/examples/geometry.xml | 38 + .../pythonapi/examples/materials-xy.png | Bin 0 -> 1271 bytes docs/source/pythonapi/examples/materials.xml | 20 + docs/source/pythonapi/examples/plots.xml | 8 + .../pythonapi/examples/post-processing.ipynb | 44 +- docs/source/pythonapi/examples/settings.xml | 21 + docs/source/pythonapi/examples/tallies.xml | 23 + .../pythonapi/examples/tally-arithmetic.ipynb | 665 ++---------------- openmc/tallies.py | 62 +- 9 files changed, 230 insertions(+), 651 deletions(-) create mode 100644 docs/source/pythonapi/examples/geometry.xml create mode 100644 docs/source/pythonapi/examples/materials-xy.png create mode 100644 docs/source/pythonapi/examples/materials.xml create mode 100644 docs/source/pythonapi/examples/plots.xml create mode 100644 docs/source/pythonapi/examples/settings.xml create mode 100644 docs/source/pythonapi/examples/tallies.xml diff --git a/docs/source/pythonapi/examples/geometry.xml b/docs/source/pythonapi/examples/geometry.xml new file mode 100644 index 0000000000..8e9f1ef3d1 --- /dev/null +++ b/docs/source/pythonapi/examples/geometry.xml @@ -0,0 +1,38 @@ + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 + + + + + + + + + + diff --git a/docs/source/pythonapi/examples/materials-xy.png b/docs/source/pythonapi/examples/materials-xy.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c31899516ea2a3f585861e65394dfd9bb9ba56 GIT binary patch literal 1271 zcmZ{jeN>Wn6vrPkJ7<=2={b=rqn489Of1U{1V#q}n*te4O4EEPU#Fg=BWn66nP%lQ z%d*gHT2}KUW3DVJX}+YDNot18hAAswP|-jI8;Sf3UDR*%Wz7LnSW-JU%%UB(!SR4hvzM^s*rhoir@GmO$*Ml{ z&2`TtWgqezYj0L}E4GHFu?t`QejA+>(5Q&uhIWHIyU;(Fv!AA#GLhebv>9u3daQKG zb9~sF+RY9j@Y8EF_x?+z;(~_UKFjm?-8HYC2%~MMR^QDrIg-^SYDCb<2Ncs)RkL3O zSQBH`WvP_us5ZgX?*ZVP4RiJYrJRJwLy_^-!wOwca=T{Hd+vlWUX;*VhSpV|3tN>c z1@Zp#CNIfpF6gtU_(P|11LhRd==}?5ou(ksykgT8G^$_5Aq3|H ze*F-nHFES8d=?7ni>Wa39jG)|im0GP zhkr4T?;hd)Eixdh%&7fQV05(Lj)G+m!Hz*i3wmmb*7|QQ;w1#0Hvnf44t`I7psfr3V?_BvpDY{UPKXSagSMB!Vr3NxNozK# zY>d*zxPS*V#}2r?QjxEOYetk&%BudEQKTRT4Uv~zL^IRP(g8T;FPd0K`*~g(`RT+0 zJc_iez7JOR!!hcr!g0mXT0j`G;O@ew)$mVbxXB6*EyLfXuIR?T-BrjG2%{r}2T4(f z4`KpsCVFr6^d@=|xA2MHB;pp54>tRdh{W^7w4(n2KPE@V9ZLUyV5FzO8v`JJCWleK H{ebu%i<^#J literal 0 HcmV?d00001 diff --git a/docs/source/pythonapi/examples/materials.xml b/docs/source/pythonapi/examples/materials.xml new file mode 100644 index 0000000000..42c2e50292 --- /dev/null +++ b/docs/source/pythonapi/examples/materials.xml @@ -0,0 +1,20 @@ + + + 71c + + + + + + + + + + + + + + + + + diff --git a/docs/source/pythonapi/examples/plots.xml b/docs/source/pythonapi/examples/plots.xml new file mode 100644 index 0000000000..512070a33f --- /dev/null +++ b/docs/source/pythonapi/examples/plots.xml @@ -0,0 +1,8 @@ + + + + 0 0 0 + 21.5 21.5 + 250 250 + + diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index b9bc809df9..7c1269c674 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -353,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDA6Mjg6MjUtMDQ6MDB/woIeAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAwOjI4OjI1LTA0OjAwDp86ogAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDA6NTg6MTItMDQ6MDAd0a7wAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAwOjU4OjEyLTA0OjAwbIwWTAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -465,7 +465,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 00:28:25\n", + " Date/Time: 2015-10-03 00:58:12\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -601,20 +601,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9300E-01 seconds\n", - " Reading cross sections = 8.4000E-02 seconds\n", - " Total time in simulation = 2.4111E+02 seconds\n", - " Time in transport only = 2.4106E+02 seconds\n", - " Time in inactive batches = 8.4970E+00 seconds\n", - " Time in active batches = 2.3262E+02 seconds\n", - " Time synchronizing fission bank = 7.0000E-03 seconds\n", - " Sampling source sites = 5.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 3.1000E-02 seconds\n", - " Total time for finalization = 1.6600E-01 seconds\n", - " Total time elapsed = 2.4169E+02 seconds\n", - " Calculation Rate (inactive) = 5884.43 neutrons/second\n", - " Calculation Rate (active) = 1934.51 neutrons/second\n", + " Total time for initialization = 3.9800E-01 seconds\n", + " Reading cross sections = 9.2000E-02 seconds\n", + " Total time in simulation = 2.4145E+02 seconds\n", + " Time in transport only = 2.4139E+02 seconds\n", + " Time in inactive batches = 7.6900E+00 seconds\n", + " Time in active batches = 2.3376E+02 seconds\n", + " Time synchronizing fission bank = 1.2000E-02 seconds\n", + " Sampling source sites = 8.0000E-03 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Time accumulating tallies = 3.4000E-02 seconds\n", + " Total time for finalization = 1.7000E-01 seconds\n", + " Total time elapsed = 2.4203E+02 seconds\n", + " Calculation Rate (inactive) = 6501.95 neutrons/second\n", + " Calculation Rate (active) = 1925.07 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -871,7 +871,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -882,7 +882,7 @@ "data": { "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -914,7 +914,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1028,7 +1028,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 28, @@ -1039,7 +1039,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1090,7 +1090,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/settings.xml b/docs/source/pythonapi/examples/settings.xml new file mode 100644 index 0000000000..26a23e9421 --- /dev/null +++ b/docs/source/pythonapi/examples/settings.xml @@ -0,0 +1,21 @@ + + + + 2500 + 20 + 5 + + + + -10.71 -10.71 -10 10.71 10.71 10.0 + + + + false + true + + + true + 200 + + diff --git a/docs/source/pythonapi/examples/tallies.xml b/docs/source/pythonapi/examples/tallies.xml new file mode 100644 index 0000000000..61873a91d7 --- /dev/null +++ b/docs/source/pythonapi/examples/tallies.xml @@ -0,0 +1,23 @@ + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + + + + fission nu-fission + + + + U-235 U-238 + scatter-y2 + + + + absorption scatter + + + diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index ca8b842458..f3f2c52f1f 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -369,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDA6MjQ6NTQtMDQ6MDDJTGA9AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAwOjI0OjU0LTA0OjAwuBHYgQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDE6MDM6MjktMDQ6MDDFeHPZAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAxOjAzOjI5LTA0OjAwtCXLZQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -580,7 +580,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 00:24:54\n", + " Date/Time: 2015-10-03 01:03:29\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -636,20 +636,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.0100E-01 seconds\n", - " Reading cross sections = 1.5800E-01 seconds\n", - " Total time in simulation = 2.0485E+01 seconds\n", - " Time in transport only = 2.0465E+01 seconds\n", - " Time in inactive batches = 3.0920E+00 seconds\n", - " Time in active batches = 1.7393E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", + " Total time for initialization = 4.1300E-01 seconds\n", + " Reading cross sections = 9.0000E-02 seconds\n", + " Total time in simulation = 2.1398E+01 seconds\n", + " Time in transport only = 2.1378E+01 seconds\n", + " Time in inactive batches = 2.0260E+00 seconds\n", + " Time in active batches = 1.9372E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling 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 = 1.0000E-03 seconds\n", - " Total time elapsed = 2.1200E+01 seconds\n", - " Calculation Rate (inactive) = 4042.69 neutrons/second\n", - " Calculation Rate (active) = 2156.04 neutrons/second\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 2.1823E+01 seconds\n", + " Calculation Rate (inactive) = 6169.79 neutrons/second\n", + " Calculation Rate (active) = 1935.78 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -721,7 +721,20 @@ "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "ename": "KeyError", + "evalue": "10003", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the summary file and link with statepoint\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msu\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'summary.h5'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlink_with_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msu\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/statepoint.pyc\u001b[0m in \u001b[0;36mlink_with_summary\u001b[1;34m(self, summary)\u001b[0m\n\u001b[0;32m 610\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mtally_id\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtally\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 611\u001b[0m \u001b[1;31m# Get the Tally name from the summary file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 612\u001b[1;33m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtally_id\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 613\u001b[0m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_summary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 614\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: 10003" + ] + } + ], "source": [ "# Load the summary file and link with statepoint\n", "su = Summary('summary.h5')\n", @@ -739,47 +752,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nuclidescoremeanstd. dev.
0total(nu-fission / absorption)1.0463530.00935
\n", - "
" - ], - "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total (nu-fission / absorption) 1.046353 0.00935" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute k-infinity using tally arithmetic\n", "fiss_rate = sp.get_tally(name='fiss. rate')\n", @@ -799,49 +776,11 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)totalabsorption0.958730.00774
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total absorption 0.95873 0.00774" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", @@ -859,47 +798,11 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nuclidescoremeanstd. dev.
0totalnu-fission1.0916220.011163
\n", - "
" - ], - "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total nu-fission 1.091622 0.011163" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", @@ -918,51 +821,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]cellnuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8020120.006609
\n", - "
" - ], - "text/plain": [ - " energy [MeV] cell nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.802012 0.006609" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", @@ -979,49 +842,11 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2466040.011825
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.246604 0.011825" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", "eta = therm_fiss_rate / fuel_therm_abs_rate\n", @@ -1037,52 +862,11 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0463530.01894
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide \\\n", - "0 (0.0e+00 - 6.2e-01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((absorption * nu-fission) * absorption) * (n... 1.046353 0.01894 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "keff = res_esc * fast_fiss * therm_util * eta\n", "keff.get_pandas_dataframe()" @@ -1099,7 +883,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -1115,131 +899,11 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.641746e-076.859257e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099861e-011.966887e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.556665e-013.717881e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.554650e-035.218094e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.165057e-035.625590e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.276535e-018.544314e-04
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.089493e-035.080374e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.370111e-031.361116e-05
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", - "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", - "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", - "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", - "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", - "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", - "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", - "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", - "\n", - " mean std. dev. \n", - "0 6.641746e-07 6.859257e-09 \n", - "1 2.099861e-01 1.966887e-03 \n", - "2 3.556665e-01 3.717881e-03 \n", - "3 5.554650e-03 5.218094e-05 \n", - "4 7.165057e-03 5.625590e-05 \n", - "5 2.276535e-01 8.544314e-04 \n", - "6 8.089493e-03 5.080374e-05 \n", - "7 3.370111e-03 1.361116e-05 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "fuel_xs = fuel_rxn_rates / flux\n", "fuel_xs.get_pandas_dataframe()" @@ -1254,23 +918,11 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 6.64174599e-07]\n", - " [ 3.55666541e-01]]\n", - "\n", - " [[ 7.16505734e-03]\n", - " [ 8.08949336e-03]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore\n", "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", @@ -1286,21 +938,11 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.00555465]]\n", - "\n", - " [[ 0.00337011]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", @@ -1310,20 +952,11 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.22765348]\n", - " [ 0.00337011]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", @@ -1341,81 +974,11 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.284890e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8679827.022256e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0828016.087096e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0934845.275039e-04
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.284890e-08\n", - "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.867982 7.022256e-03\n", - "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082801 6.087096e-04\n", - "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.093484 5.275039e-04" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# \"Slice\" the nu-fission data into a new derived Tally\n", "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", @@ -1424,131 +987,11 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010002(1.0e-08 - 1.1e-07)H-1scatter4.6205250.038249
110002(1.1e-07 - 1.2e-06)H-1scatter2.0368410.013203
210002(1.2e-06 - 1.3e-05)H-1scatter1.6599160.010107
310002(1.3e-05 - 1.4e-04)H-1scatter1.8615460.013328
410002(1.4e-04 - 1.5e-03)H-1scatter2.0496640.008215
510002(1.5e-03 - 1.6e-02)H-1scatter2.1621570.010245
610002(1.6e-02 - 1.7e-01)H-1scatter2.2244960.013796
710002(1.7e-01 - 1.9e+00)H-1scatter1.9975850.009161
810002(1.9e+00 - 2.0e+01)H-1scatter0.3734720.003922
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.620525 0.038249\n", - "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.036841 0.013203\n", - "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.659916 0.010107\n", - "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.861546 0.013328\n", - "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.049664 0.008215\n", - "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.162157 0.010245\n", - "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.224496 0.013796\n", - "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 1.997585 0.009161\n", - "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373472 0.003922" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", "need_to_slice = sp.get_tally(name='need-to-slice')\n", diff --git a/openmc/tallies.py b/openmc/tallies.py index 50afe6072a..63ba4df078 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1612,26 +1612,23 @@ class Tally(object): if self.filters != other.filters: - self_shape = list(self.mean.shape) - other_shape = list(other.mean.shape) - - # FIXME: # Determine the number of paired combinations of filter bins # between the two tallies and repeat arrays along filter axes diff1 = list(set(self.filters).difference(set(other.filters))) diff2 = list(set(other.filters).difference(set(self.filters))) - # + # Determine the factors by which each tally operands' data arrays + # must be tiled or repeated for the tally outer product other_tile_factor = 1 self_repeat_factor = 1 - - # for filter in diff1: other_tile_factor *= filter.num_bins for filter in diff2: self_repeat_factor *= filter.num_bins - # Replicate the data + # Tile / repeat the tally data for the tally outer product + self_shape = list(self.mean.shape) + other_shape = list(other.mean.shape) self_shape[0] *= self_repeat_factor self_mean = np.repeat(self_mean, self_repeat_factor) self_std_dev = np.repeat(self_std_dev, self_repeat_factor) @@ -1644,6 +1641,8 @@ class Tally(object): other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) + # NumPy repeat and tile routines return 1D flattened arrays + # Reshape arrays as 3D with filters, nuclides and scores axes self_mean.shape = tuple(self_shape) self_std_dev.shape = tuple(self_shape) other_mean.shape = tuple(other_shape) @@ -1656,14 +1655,15 @@ class Tally(object): self_repeat_factor = other.num_nuclides other_tile_factor = self.num_nuclides - self_shape = list(self.mean.shape) - # Replicate the data self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1)) + # NumPy repeat and tile routines return 1D flattened arrays + # Reshape arrays as 3D with filters, nuclides and scores axes + self_shape = list(self.mean.shape) self_shape[1] *= self_repeat_factor self_mean.shape = tuple(self_shape) self_std_dev.shape = tuple(self_shape) @@ -1675,14 +1675,15 @@ class Tally(object): self_repeat_factor = other.num_score_bins other_tile_factor = self.num_score_bins - self_shape = list(self.mean.shape) - # Replicate the data self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor)) + # NumPy repeat and tile routines return 1D flattened arrays + # Reshape arrays as 3D with filters, nuclides and scores axes + self_shape = list(self.mean.shape) self_shape[2] *= self_repeat_factor self_mean.shape = tuple(self_shape) self_std_dev.shape = tuple(self_shape) @@ -1697,11 +1698,31 @@ class Tally(object): return data def swap_filters(self, filter1, filter2): - """ + """Reverse the ordering of two filters in this tally + + This is a helper routine for tally arithmetic which helps align the data + in two tallies with shared filters. This routine copies this tally and + reverses the order of the two filters. + + Parameters + ---------- + filter1 : Filter + The filter to swap with filter2 + + filter2 : Filter + The filter to swap with filter1 + + Returns + ------- + swap_tally + A copy of this tally with the filters swapped + + Raises + ------ + ValueError + If this is a derived tally or this method is called before the tally + is populated with data by the StatePoint.read_results() method. - :param filter1: - :param filter2: - :return: """ # Check that results have been read @@ -1739,6 +1760,7 @@ class Tally(object): filter.stride = stride stride *= filter.num_bins + # Construct lists of tuples for the bins in each of the two filters filters = [filter1.type, filter2.type] if filter1.type == 'distribcell': filter1_bins = np.arange(filter.num_bins) @@ -1750,6 +1772,7 @@ class Tally(object): else: filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] + # Adjust the sum data array to relect the new filter order if self.sum is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] @@ -1758,6 +1781,7 @@ class Tally(object): indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally.sum[indices, :, :] = data + # Adjust the sum_sq data array to relect the new filter order if self.sum_sq is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] @@ -1766,7 +1790,8 @@ class Tally(object): indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally.sum_sq[indices, :, :] = data - if self.sum is not None: + # Adjust the mean data array to relect the new filter order + if self.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = self.get_values(filters=filters, @@ -1774,7 +1799,8 @@ class Tally(object): indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally._mean[indices, :, :] = data - if self.sum is not None: + # Adjust the std_dev data array to relect the new filter order + if self.std_dev is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = self.get_values(filters=filters, From 5ee352bc95e1dfead88cfbd3aafa5a0cc0d580af Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 01:05:14 -0400 Subject: [PATCH 256/519] Removed IPython Notebook example XML files --- docs/source/pythonapi/examples/geometry.xml | 38 ------------------ .../pythonapi/examples/materials-xy.png | Bin 1271 -> 0 bytes docs/source/pythonapi/examples/materials.xml | 20 --------- docs/source/pythonapi/examples/plots.xml | 8 ---- docs/source/pythonapi/examples/settings.xml | 21 ---------- docs/source/pythonapi/examples/tallies.xml | 23 ----------- 6 files changed, 110 deletions(-) delete mode 100644 docs/source/pythonapi/examples/geometry.xml delete mode 100644 docs/source/pythonapi/examples/materials-xy.png delete mode 100644 docs/source/pythonapi/examples/materials.xml delete mode 100644 docs/source/pythonapi/examples/plots.xml delete mode 100644 docs/source/pythonapi/examples/settings.xml delete mode 100644 docs/source/pythonapi/examples/tallies.xml diff --git a/docs/source/pythonapi/examples/geometry.xml b/docs/source/pythonapi/examples/geometry.xml deleted file mode 100644 index 8e9f1ef3d1..0000000000 --- a/docs/source/pythonapi/examples/geometry.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 - - - - - - - - - - diff --git a/docs/source/pythonapi/examples/materials-xy.png b/docs/source/pythonapi/examples/materials-xy.png deleted file mode 100644 index f4c31899516ea2a3f585861e65394dfd9bb9ba56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmZ{jeN>Wn6vrPkJ7<=2={b=rqn489Of1U{1V#q}n*te4O4EEPU#Fg=BWn66nP%lQ z%d*gHT2}KUW3DVJX}+YDNot18hAAswP|-jI8;Sf3UDR*%Wz7LnSW-JU%%UB(!SR4hvzM^s*rhoir@GmO$*Ml{ z&2`TtWgqezYj0L}E4GHFu?t`QejA+>(5Q&uhIWHIyU;(Fv!AA#GLhebv>9u3daQKG zb9~sF+RY9j@Y8EF_x?+z;(~_UKFjm?-8HYC2%~MMR^QDrIg-^SYDCb<2Ncs)RkL3O zSQBH`WvP_us5ZgX?*ZVP4RiJYrJRJwLy_^-!wOwca=T{Hd+vlWUX;*VhSpV|3tN>c z1@Zp#CNIfpF6gtU_(P|11LhRd==}?5ou(ksykgT8G^$_5Aq3|H ze*F-nHFES8d=?7ni>Wa39jG)|im0GP zhkr4T?;hd)Eixdh%&7fQV05(Lj)G+m!Hz*i3wmmb*7|QQ;w1#0Hvnf44t`I7psfr3V?_BvpDY{UPKXSagSMB!Vr3NxNozK# zY>d*zxPS*V#}2r?QjxEOYetk&%BudEQKTRT4Uv~zL^IRP(g8T;FPd0K`*~g(`RT+0 zJc_iez7JOR!!hcr!g0mXT0j`G;O@ew)$mVbxXB6*EyLfXuIR?T-BrjG2%{r}2T4(f z4`KpsCVFr6^d@=|xA2MHB;pp54>tRdh{W^7w4(n2KPE@V9ZLUyV5FzO8v`JJCWleK H{ebu%i<^#J diff --git a/docs/source/pythonapi/examples/materials.xml b/docs/source/pythonapi/examples/materials.xml deleted file mode 100644 index 42c2e50292..0000000000 --- a/docs/source/pythonapi/examples/materials.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 71c - - - - - - - - - - - - - - - - - diff --git a/docs/source/pythonapi/examples/plots.xml b/docs/source/pythonapi/examples/plots.xml deleted file mode 100644 index 512070a33f..0000000000 --- a/docs/source/pythonapi/examples/plots.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - 0 0 0 - 21.5 21.5 - 250 250 - - diff --git a/docs/source/pythonapi/examples/settings.xml b/docs/source/pythonapi/examples/settings.xml deleted file mode 100644 index 26a23e9421..0000000000 --- a/docs/source/pythonapi/examples/settings.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 2500 - 20 - 5 - - - - -10.71 -10.71 -10 10.71 10.71 10.0 - - - - false - true - - - true - 200 - - diff --git a/docs/source/pythonapi/examples/tallies.xml b/docs/source/pythonapi/examples/tallies.xml deleted file mode 100644 index 61873a91d7..0000000000 --- a/docs/source/pythonapi/examples/tallies.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - - - - fission nu-fission - - - - U-235 U-238 - scatter-y2 - - - - absorption scatter - - - From dd50063e87cb19dbba6d0e82739e566386f3c853 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 01:08:37 -0400 Subject: [PATCH 257/519] Removed unused Tally.tile_filter(...) routine --- .../examples/pandas-dataframes.ipynb | 1424 +---------------- .../pythonapi/examples/post-processing.ipynb | 368 +---- openmc/tallies.py | 75 +- 3 files changed, 93 insertions(+), 1774 deletions(-) diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index f84e9ec1a3..2267703c46 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -385,7 +385,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAwOjQ2\nOjE5LTA0OjAwwJEVeQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMDo0NjoxOS0wNDow\nMLHMrcUAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAxOjAz\nOjQwLTA0OjAwlo8/jQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMTowMzo0MC0wNDow\nMOfShzEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -558,6 +558,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "rm: cannot remove ‘statepoint.*’: No such file or directory\n", "\n", " .d88888b. 888b d888 .d8888b.\n", " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", @@ -575,7 +576,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 00:46:19\n", + " Date/Time: 2015-10-03 01:03:41\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -643,20 +644,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9600E-01 seconds\n", - " Reading cross sections = 9.0000E-02 seconds\n", - " Total time in simulation = 1.2458E+01 seconds\n", - " Time in transport only = 1.2445E+01 seconds\n", - " Time in inactive batches = 1.2760E+00 seconds\n", - " Time in active batches = 1.1182E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for initialization = 7.5300E-01 seconds\n", + " Reading cross sections = 1.6900E-01 seconds\n", + " Total time in simulation = 2.0057E+01 seconds\n", + " Time in transport only = 1.9977E+01 seconds\n", + " Time in inactive batches = 2.1180E+00 seconds\n", + " Time in active batches = 1.7939E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 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.2865E+01 seconds\n", - " Calculation Rate (inactive) = 9796.24 neutrons/second\n", - " Calculation Rate (active) = 3353.60 neutrons/second\n", + " Total time elapsed = 2.0825E+01 seconds\n", + " Calculation Rate (inactive) = 5901.79 neutrons/second\n", + " Calculation Rate (active) = 2090.42 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -717,7 +718,20 @@ "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "ename": "KeyError", + "evalue": "10003", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the summary file and link with statepoint\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msu\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'summary.h5'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlink_with_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msu\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/statepoint.pyc\u001b[0m in \u001b[0;36mlink_with_summary\u001b[1;34m(self, summary)\u001b[0m\n\u001b[0;32m 610\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mtally_id\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtally\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 611\u001b[0m \u001b[1;31m# Get the Tally name from the summary file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 612\u001b[1;33m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtally_id\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 613\u001b[0m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_summary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 614\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: 10003" + ] + } + ], "source": [ "# Load the summary file and link with statepoint\n", "su = Summary('summary.h5')\n", @@ -733,28 +747,11 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\tmesh tally\n", - "\tFilters =\t\n", - " \t\tmesh\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'fission', u'nu-fission']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Find the mesh tally with the StatePoint API\n", "tally = sp.get_tally(name='mesh tally')\n", @@ -772,25 +769,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.1127471 ]]\n", - "\n", - " [[ 0.06599162]]\n", - "\n", - " [[ 0.25310075]]\n", - "\n", - " [[ 0.10150973]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Get the relative error for the thermal fission reaction \n", "# rates in the four corner pins \n", @@ -802,271 +785,11 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
mesh 1energy [MeV]scoremeanstd. dev.
xyz
0111(0.0e+00 - 6.3e-07)fission0.0002240.000025
1111(0.0e+00 - 6.3e-07)nu-fission0.0005460.000062
2111(6.3e-07 - 2.0e+01)fission0.0000710.000004
3111(6.3e-07 - 2.0e+01)nu-fission0.0001870.000010
4121(0.0e+00 - 6.3e-07)fission0.0003920.000045
5121(0.0e+00 - 6.3e-07)nu-fission0.0009550.000110
6121(6.3e-07 - 2.0e+01)fission0.0000960.000005
7121(6.3e-07 - 2.0e+01)nu-fission0.0002520.000014
8131(0.0e+00 - 6.3e-07)fission0.0005510.000053
9131(0.0e+00 - 6.3e-07)nu-fission0.0013430.000130
10131(6.3e-07 - 2.0e+01)fission0.0001310.000008
11131(6.3e-07 - 2.0e+01)nu-fission0.0003430.000019
12141(0.0e+00 - 6.3e-07)fission0.0006880.000063
13141(0.0e+00 - 6.3e-07)nu-fission0.0016760.000153
14141(6.3e-07 - 2.0e+01)fission0.0001510.000007
15141(6.3e-07 - 2.0e+01)nu-fission0.0003950.000019
16151(0.0e+00 - 6.3e-07)fission0.0007850.000065
17151(0.0e+00 - 6.3e-07)nu-fission0.0019140.000158
18151(6.3e-07 - 2.0e+01)fission0.0001870.000008
19151(6.3e-07 - 2.0e+01)nu-fission0.0004870.000019
\n", - "
" - ], - "text/plain": [ - " mesh 1 energy [MeV] score mean std. dev.\n", - " x y z \n", - "0 1 1 1 (0.0e+00 - 6.3e-07) fission 0.000224 0.000025\n", - "1 1 1 1 (0.0e+00 - 6.3e-07) nu-fission 0.000546 0.000062\n", - "2 1 1 1 (6.3e-07 - 2.0e+01) fission 0.000071 0.000004\n", - "3 1 1 1 (6.3e-07 - 2.0e+01) nu-fission 0.000187 0.000010\n", - "4 1 2 1 (0.0e+00 - 6.3e-07) fission 0.000392 0.000045\n", - "5 1 2 1 (0.0e+00 - 6.3e-07) nu-fission 0.000955 0.000110\n", - "6 1 2 1 (6.3e-07 - 2.0e+01) fission 0.000096 0.000005\n", - "7 1 2 1 (6.3e-07 - 2.0e+01) nu-fission 0.000252 0.000014\n", - "8 1 3 1 (0.0e+00 - 6.3e-07) fission 0.000551 0.000053\n", - "9 1 3 1 (0.0e+00 - 6.3e-07) nu-fission 0.001343 0.000130\n", - "10 1 3 1 (6.3e-07 - 2.0e+01) fission 0.000131 0.000008\n", - "11 1 3 1 (6.3e-07 - 2.0e+01) nu-fission 0.000343 0.000019\n", - "12 1 4 1 (0.0e+00 - 6.3e-07) fission 0.000688 0.000063\n", - "13 1 4 1 (0.0e+00 - 6.3e-07) nu-fission 0.001676 0.000153\n", - "14 1 4 1 (6.3e-07 - 2.0e+01) fission 0.000151 0.000007\n", - "15 1 4 1 (6.3e-07 - 2.0e+01) nu-fission 0.000395 0.000019\n", - "16 1 5 1 (0.0e+00 - 6.3e-07) fission 0.000785 0.000065\n", - "17 1 5 1 (0.0e+00 - 6.3e-07) nu-fission 0.001914 0.000158\n", - "18 1 5 1 (6.3e-07 - 2.0e+01) fission 0.000187 0.000008\n", - "19 1 5 1 (6.3e-07 - 2.0e+01) nu-fission 0.000487 0.000019" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Get a pandas dataframe for the mesh tally data\n", "df = tally.get_pandas_dataframe(nuclides=False)\n", @@ -1077,22 +800,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\nBPCvjMC6bD6xSh4AAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create a boxplot to view the distribution of\n", "# fission and nu-fission rates in the pins\n", @@ -1101,32 +813,11 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\nefX/AdmeWI23zkQnAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Extract thermal nu-fission rates from pandas\n", "fiss = df[df['score'] == 'nu-fission']\n", @@ -1151,27 +842,11 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10001\n", - "\tName =\tcell tally\n", - "\tFilters =\t\n", - " \t\tcell\t[10000]\n", - "\tNuclides =\tU-235 U-238 \n", - "\tScores =\t[u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2']\n", - "\tEstimator =\tanalog\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Find the cell Tally with the StatePoint API\n", "tally = sp.get_tally(name='cell tally')\n", @@ -1182,202 +857,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellnuclidescoremeanstd. dev.
010000U-235scatter-Y0,00.0383300.001119
110000U-235scatter-Y1,-10.0000080.000341
210000U-235scatter-Y1,0-0.0003420.000342
310000U-235scatter-Y1,10.0002010.000262
410000U-235scatter-Y2,-20.0001360.000152
510000U-235scatter-Y2,-10.0000420.000131
610000U-235scatter-Y2,00.0003030.000185
710000U-235scatter-Y2,1-0.0004070.000184
810000U-235scatter-Y2,2-0.0001450.000120
910000U-238scatter-Y0,02.3193220.006166
1010000U-238scatter-Y1,-1-0.0236380.001940
1110000U-238scatter-Y1,0-0.0034630.001892
1210000U-238scatter-Y1,10.0250990.002270
1310000U-238scatter-Y2,-2-0.0006170.001197
1410000U-238scatter-Y2,-10.0025490.001187
1510000U-238scatter-Y2,00.0071210.001646
1610000U-238scatter-Y2,1-0.0000580.001323
1710000U-238scatter-Y2,2-0.0022350.000867
\n", - "
" - ], - "text/plain": [ - " cell nuclide score mean std. dev.\n", - "0 10000 U-235 scatter-Y0,0 0.038330 0.001119\n", - "1 10000 U-235 scatter-Y1,-1 0.000008 0.000341\n", - "2 10000 U-235 scatter-Y1,0 -0.000342 0.000342\n", - "3 10000 U-235 scatter-Y1,1 0.000201 0.000262\n", - "4 10000 U-235 scatter-Y2,-2 0.000136 0.000152\n", - "5 10000 U-235 scatter-Y2,-1 0.000042 0.000131\n", - "6 10000 U-235 scatter-Y2,0 0.000303 0.000185\n", - "7 10000 U-235 scatter-Y2,1 -0.000407 0.000184\n", - "8 10000 U-235 scatter-Y2,2 -0.000145 0.000120\n", - "9 10000 U-238 scatter-Y0,0 2.319322 0.006166\n", - "10 10000 U-238 scatter-Y1,-1 -0.023638 0.001940\n", - "11 10000 U-238 scatter-Y1,0 -0.003463 0.001892\n", - "12 10000 U-238 scatter-Y1,1 0.025099 0.002270\n", - "13 10000 U-238 scatter-Y2,-2 -0.000617 0.001197\n", - "14 10000 U-238 scatter-Y2,-1 0.002549 0.001187\n", - "15 10000 U-238 scatter-Y2,0 0.007121 0.001646\n", - "16 10000 U-238 scatter-Y2,1 -0.000058 0.001323\n", - "17 10000 U-238 scatter-Y2,2 -0.002235 0.000867" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Get a pandas dataframe for the cell tally data\n", "df = tally.get_pandas_dataframe()\n", @@ -1395,20 +879,11 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.00086668 0.0061658 ]\n", - " [ 0.00011981 0.00111862]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Get the standard deviations for two of the spherical harmonic\n", "# scattering reaction rates \n", @@ -1426,27 +901,11 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10002\n", - "\tName =\tdistribcell tally\n", - "\tFilters =\t\n", - " \t\tdistribcell\t[10002]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'absorption', u'scatter']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Find the distribcell Tally with the StatePoint API\n", "tally = sp.get_tally(name='distribcell tally')\n", @@ -1464,19 +923,11 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.03658762]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Get the relative error for the scattering reaction rates in\n", "# the first 30 distribcell instances \n", @@ -1494,199 +945,11 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - "
distribcellscoremeanstd. dev.
558279absorption0.0000810.000008
559279scatter0.0131090.000358
560280absorption0.0000880.000010
561280scatter0.0143950.000586
562281absorption0.0000970.000010
563281scatter0.0146370.000427
564282absorption0.0001070.000009
565282scatter0.0156830.000552
566283absorption0.0001100.000009
567283scatter0.0162930.000627
568284absorption0.0001110.000007
569284scatter0.0170320.000445
570285absorption0.0001120.000006
571285scatter0.0176660.000425
572286absorption0.0001230.000011
573286scatter0.0177060.000597
574287absorption0.0001080.000011
575287scatter0.0173390.000664
576288absorption0.0001290.000011
577288scatter0.0184520.000523
\n", - "
" - ], - "text/plain": [ - " distribcell score mean std. dev.\n", - "558 279 absorption 0.000081 0.000008\n", - "559 279 scatter 0.013109 0.000358\n", - "560 280 absorption 0.000088 0.000010\n", - "561 280 scatter 0.014395 0.000586\n", - "562 281 absorption 0.000097 0.000010\n", - "563 281 scatter 0.014637 0.000427\n", - "564 282 absorption 0.000107 0.000009\n", - "565 282 scatter 0.015683 0.000552\n", - "566 283 absorption 0.000110 0.000009\n", - "567 283 scatter 0.016293 0.000627\n", - "568 284 absorption 0.000111 0.000007\n", - "569 284 scatter 0.017032 0.000445\n", - "570 285 absorption 0.000112 0.000006\n", - "571 285 scatter 0.017666 0.000425\n", - "572 286 absorption 0.000123 0.000011\n", - "573 286 scatter 0.017706 0.000597\n", - "574 287 absorption 0.000108 0.000011\n", - "575 287 scatter 0.017339 0.000664\n", - "576 288 absorption 0.000129 0.000011\n", - "577 288 scatter 0.018452 0.000523" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Get a pandas dataframe for the distribcell tally data\n", "df = tally.get_pandas_dataframe(nuclides=False)\n", @@ -1704,415 +967,11 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
level 1level 2level 3distribcellscoremeanstd. dev.
cellunivlatcelluniv
idididxyzidid
01000301000100010002100000absorption0.0001310.000014
11000301000100010002100000scatter0.0185820.000680
21000301000110010002100001absorption0.0002200.000023
31000301000110010002100001scatter0.0287110.001186
41000301000120010002100002absorption0.0002950.000022
51000301000120010002100002scatter0.0387820.001084
61000301000130010002100003absorption0.0003310.000022
71000301000130010002100003scatter0.0457720.001084
81000301000140010002100004absorption0.0004190.000026
91000301000140010002100004scatter0.0559750.001344
101000301000150010002100005absorption0.0005140.000024
111000301000150010002100005scatter0.0632890.001605
121000301000160010002100006absorption0.0005910.000027
131000301000160010002100006scatter0.0710110.002058
141000301000170010002100007absorption0.0006710.000036
151000301000170010002100007scatter0.0778910.001952
161000301000180010002100008absorption0.0007210.000031
171000301000180010002100008scatter0.0863930.001722
181000301000190010002100009absorption0.0007480.000033
191000301000190010002100009scatter0.0908610.001669
\n", - "
" - ], - "text/plain": [ - " level 1 level 2 level 3 distribcell score \\\n", - " cell univ lat cell univ \n", - " id id id x y z id id \n", - "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n", - "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n", - "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n", - "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n", - "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n", - "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n", - "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n", - "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n", - "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n", - "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n", - "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n", - "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n", - "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n", - "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n", - "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n", - "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n", - "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n", - "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n", - "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n", - "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n", - "\n", - " mean std. dev. \n", - " \n", - " \n", - "0 0.000131 0.000014 \n", - "1 0.018582 0.000680 \n", - "2 0.000220 0.000023 \n", - "3 0.028711 0.001186 \n", - "4 0.000295 0.000022 \n", - "5 0.038782 0.001084 \n", - "6 0.000331 0.000022 \n", - "7 0.045772 0.001084 \n", - "8 0.000419 0.000026 \n", - "9 0.055975 0.001344 \n", - "10 0.000514 0.000024 \n", - "11 0.063289 0.001605 \n", - "12 0.000591 0.000027 \n", - "13 0.071011 0.002058 \n", - "14 0.000671 0.000036 \n", - "15 0.077891 0.001952 \n", - "16 0.000721 0.000031 \n", - "17 0.086393 0.001722 \n", - "18 0.000748 0.000033 \n", - "19 0.090861 0.001669 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Get a pandas dataframe for the distribcell tally data\n", "df = tally.get_pandas_dataframe(summary=su, nuclides=False)\n", @@ -2123,97 +982,11 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
meanstd. dev.
count289.000000289.000000
mean0.0004170.000020
std0.0002380.000008
min0.0000200.000003
25%0.0002140.000014
50%0.0003940.000019
75%0.0006270.000025
max0.0009150.000049
\n", - "
" - ], - "text/plain": [ - " mean std. dev.\n", - " \n", - " \n", - "count 289.000000 289.000000\n", - "mean 0.000417 0.000020\n", - "std 0.000238 0.000008\n", - "min 0.000020 0.000003\n", - "25% 0.000214 0.000014\n", - "50% 0.000394 0.000019\n", - "75% 0.000627 0.000025\n", - "max 0.000915 0.000049" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Show summary statistics for absorption distribcell tally data\n", "absorption = df[df['score'] == 'absorption']\n", @@ -2232,19 +1005,11 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mann-Whitney Test p-value: 0.498462484897\n" - ] - } - ], + "outputs": [], "source": [ "# Extract tally data from pins in the pins divided along y=x diagonal \n", "multi_index = ('level 2', 'lat',)\n", @@ -2270,19 +1035,11 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mann-Whitney Test p-value: 1.61253828675e-41\n" - ] - } - ], + "outputs": [], "source": [ "# Extract tally data from pins in the pins divided along y=-x diagonal\n", "multi_index = ('level 2', 'lat',)\n", @@ -2306,43 +1063,11 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:4: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\norlkyRKeP3+erVp1IWCgqI78DIFVDAuLossVo41pQ4rqwy2ZmHgjbbYuFKvqVlBVI1i3bnMajRMo\nZofbaLNF+F0sBAtI4yGNR2kSSvozMzO5Zs0aLlmyxFtp9Vr1d+p0K4HV9ATQgXrU6XoQeJ6KUpuT\nJz9T+EEoTugNG7amw5FIp7Mbw8NjvUUbe/S4g6Jib87VvO+Vty8e/WFh0QS20RPstdsT+eGHH+bZ\nfvPmzbTbI+l01qfVGsYFCxbx6aefZnh4RZrN5Vi/fjMeOnTIu/2MGTNoMPhWEn6Fwp1zG1W1OgcO\nHMLGjdvSZqtB4f6qR1Ep+B1GR1fzHmfQoH9RBNQ9x9nJ6OjqHDz4Ier1U7TnXtBmEdna1buFgIF3\n331/ntldcnIyq1evR5OpEnW6kVTVBD722JMFjvfp06dpt0dSuKNI4FM6nVH866+/Cv1fpaamagH5\ntfQ013I6b+XUqVO928yf/xLNZjtVNZ7h4bHctWuX9n/0XTDxGZs06cixY59gtWpN2Lx5F37zzTdM\nSUlhixadaTCYGB5eievWrStUUyCANB6hbTwkocWQIcNpNI7TTgbrKPzkHjdOCo1Ga5FWy0yfPkOr\ntOqpwjuPN97YgyS5ePF/tF7tRyiqurbnlCkFNzM6cuQIq1Spr13lhtFqrcpu3frmWVKbkZGhXUF7\nakMdpF7vok7XjqKrYWMCbVmhQrw3nrN//35tietSAl9RUdry3nvv56pVq7h161a63W5mZmZy8uTJ\ntFq7Myf/xU293uTN5J816wXabN00N46bJtNY3nrrXdoJdixFwPlhiuCzZzx3sly52AI/d3Z2Nleu\nXMlp06YV2nHw66+/ptOZ6HMiJ53O+oW23RVFJQdTLCvvps3Q3qaiVMxTBTctLY0HDx70xnPuvXeY\nj2EkdboF7Nbt9qu+V0kCaTyk8ZCUHCdOnGB0dDXa7T1osTQh0NXnhJRJo9FapFav9933EP0bS33P\nuLi6JMVJZOLEKbTZXLRY7HzwwVFXNUgJCU1pMEzTTtxfetu65ubo0aNUlGif9/yGQGXm5FecI+Ck\n3d6aGzdu9O63fft2tmnTnbVrt+SkSc/kuxJo69atVNUqFKu1xFV2eHis94R45coVdu9+G222GNrt\nNVizZmOePHmSnTr1pEgMbEaxuEClwdCLOt0TVJQYLl/+Zp73uh6OHDmi9WPxFMg8SoslLE/9sNx8\n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\nRCKRSCSB5/8ByMyfADZGvh4AAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Extract the scatter tally data from pandas\n", "scatter = df[df['score'] == 'scatter']\n", @@ -2355,32 +1080,11 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot a histogram and kernel density estimate for the scattering rates\n", "scatter['mean'].plot(kind='hist', bins=25)\n", diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 7c1269c674..22e9baf09c 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -353,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDA6NTg6MTItMDQ6MDAd0a7wAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAwOjU4OjEyLTA0OjAwbIwWTAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDE6MDM6MzQtMDQ6MDBoBRKHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAxOjAzOjM0LTA0OjAwGViqOwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "collapsed": true }, @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -465,7 +465,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 00:58:12\n", + " Date/Time: 2015-10-03 01:03:34\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -525,116 +525,8 @@ " 31/1 1.02685 1.03706 +/- 0.00352\n", " 32/1 1.03458 1.03695 +/- 0.00335\n", " 33/1 1.05243 1.03762 +/- 0.00328\n", - " 34/1 1.05717 1.03843 +/- 0.00324\n", - " 35/1 1.07396 1.03985 +/- 0.00342\n", - " 36/1 1.01690 1.03897 +/- 0.00340\n", - " 37/1 1.03340 1.03877 +/- 0.00328\n", - " 38/1 1.04153 1.03886 +/- 0.00316\n", - " 39/1 1.01971 1.03820 +/- 0.00312\n", - " 40/1 1.01491 1.03743 +/- 0.00311\n", - " 41/1 1.02779 1.03712 +/- 0.00303\n", - " 42/1 1.03047 1.03691 +/- 0.00294\n", - " 43/1 1.02305 1.03649 +/- 0.00288\n", - " 44/1 1.07854 1.03773 +/- 0.00305\n", - " 45/1 1.04412 1.03791 +/- 0.00297\n", - " 46/1 1.05139 1.03828 +/- 0.00291\n", - " 47/1 1.05357 1.03870 +/- 0.00286\n", - " 48/1 1.06435 1.03937 +/- 0.00287\n", - " 49/1 1.02632 1.03904 +/- 0.00281\n", - " 50/1 1.05201 1.03936 +/- 0.00276\n", - " 51/1 1.04582 1.03952 +/- 0.00270\n", - " 52/1 1.02056 1.03907 +/- 0.00267\n", - " 53/1 1.06448 1.03966 +/- 0.00267\n", - " 54/1 1.03609 1.03958 +/- 0.00261\n", - " 55/1 1.02701 1.03930 +/- 0.00257\n", - " 56/1 1.04865 1.03950 +/- 0.00252\n", - " 57/1 1.06310 1.04000 +/- 0.00252\n", - " 58/1 1.02975 1.03979 +/- 0.00247\n", - " 59/1 1.03922 1.03978 +/- 0.00242\n", - " 60/1 1.07259 1.04043 +/- 0.00246\n", - " 61/1 1.04555 1.04053 +/- 0.00242\n", - " 62/1 1.01950 1.04013 +/- 0.00240\n", - " 63/1 1.04618 1.04024 +/- 0.00236\n", - " 64/1 1.02489 1.03996 +/- 0.00233\n", - " 65/1 1.06850 1.04048 +/- 0.00235\n", - " 66/1 1.03623 1.04040 +/- 0.00231\n", - " 67/1 0.99892 1.03967 +/- 0.00238\n", - " 68/1 1.05557 1.03995 +/- 0.00236\n", - " 69/1 1.01211 1.03948 +/- 0.00236\n", - " 70/1 1.04679 1.03960 +/- 0.00233\n", - " 71/1 1.03461 1.03952 +/- 0.00229\n", - " 72/1 1.01993 1.03920 +/- 0.00227\n", - " 73/1 1.04742 1.03933 +/- 0.00224\n", - " 74/1 1.05269 1.03954 +/- 0.00222\n", - " 75/1 1.05696 1.03981 +/- 0.00220\n", - " 76/1 1.05904 1.04010 +/- 0.00218\n", - " 77/1 1.05930 1.04039 +/- 0.00217\n", - " 78/1 1.03375 1.04029 +/- 0.00214\n", - " 79/1 1.07044 1.04073 +/- 0.00215\n", - " 80/1 1.04144 1.04074 +/- 0.00212\n", - " 81/1 1.06296 1.04105 +/- 0.00212\n", - " 82/1 1.04630 1.04112 +/- 0.00209\n", - " 83/1 1.03772 1.04108 +/- 0.00206\n", - " 84/1 1.03774 1.04103 +/- 0.00203\n", - " 85/1 1.03984 1.04101 +/- 0.00200\n", - " 86/1 1.03040 1.04087 +/- 0.00198\n", - " 87/1 1.03484 1.04080 +/- 0.00196\n", - " 88/1 1.03820 1.04076 +/- 0.00193\n", - " 89/1 1.04654 1.04084 +/- 0.00191\n", - " 90/1 1.03377 1.04075 +/- 0.00189\n", - " 91/1 1.03370 1.04066 +/- 0.00187\n", - " 92/1 1.04172 1.04067 +/- 0.00184\n", - " 93/1 1.04945 1.04078 +/- 0.00182\n", - " 94/1 1.03360 1.04069 +/- 0.00181\n", - " 95/1 1.06547 1.04099 +/- 0.00181\n", - " 96/1 1.04340 1.04101 +/- 0.00179\n", - " 97/1 1.07502 1.04140 +/- 0.00181\n", - " 98/1 1.05391 1.04155 +/- 0.00179\n", - " 99/1 1.05622 1.04171 +/- 0.00178\n", - " 100/1 1.01519 1.04142 +/- 0.00179\n", - " Creating state point statepoint.100.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 3.9800E-01 seconds\n", - " Reading cross sections = 9.2000E-02 seconds\n", - " Total time in simulation = 2.4145E+02 seconds\n", - " Time in transport only = 2.4139E+02 seconds\n", - " Time in inactive batches = 7.6900E+00 seconds\n", - " Time in active batches = 2.3376E+02 seconds\n", - " Time synchronizing fission bank = 1.2000E-02 seconds\n", - " Sampling source sites = 8.0000E-03 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", - " Time accumulating tallies = 3.4000E-02 seconds\n", - " Total time for finalization = 1.7000E-01 seconds\n", - " Total time elapsed = 2.4203E+02 seconds\n", - " Calculation Rate (inactive) = 6501.95 neutrons/second\n", - " Calculation Rate (active) = 1925.07 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.04100 +/- 0.00169\n", - " k-effective (Track-length) = 1.04142 +/- 0.00179\n", - " k-effective (Absorption) = 1.04380 +/- 0.00147\n", - " Combined k-effective = 1.04287 +/- 0.00130\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" + " 34/1 1.05717 1.03843 +/- 0.00324\n" ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -658,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -678,27 +570,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tmesh\t[10000]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'flux', u'fission']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -713,33 +589,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[ 0.41271426, 0. ]],\n", - "\n", - " [[ 0.40846766, 0. ]],\n", - "\n", - " [[ 0.4112029 , 0. ]],\n", - "\n", - " ..., \n", - " [[ 0.41437289, 0. ]],\n", - "\n", - " [[ 0.41376468, 0. ]],\n", - "\n", - " [[ 0.41312074, 0. ]]])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tally.sum" ] @@ -753,52 +607,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(10000, 1, 2)\n" - ] - }, - { - "data": { - "text/plain": [ - "(array([[[ 0.00458571, 0. ]],\n", - " \n", - " [[ 0.00453853, 0. ]],\n", - " \n", - " [[ 0.00456892, 0. ]],\n", - " \n", - " ..., \n", - " [[ 0.00460414, 0. ]],\n", - " \n", - " [[ 0.00459739, 0. ]],\n", - " \n", - " [[ 0.00459023, 0. ]]]),\n", - " array([[[ 2.02702426e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.77108625e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.79568064e-05, 0.00000000e+00]],\n", - " \n", - " ..., \n", - " [[ 1.83114148e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.69970626e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.92143217e-05, 0.00000000e+00]]]))" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -813,27 +626,11 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tmesh\t[10000]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'flux']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -849,7 +646,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": false }, @@ -863,32 +660,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -905,22 +681,11 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -947,29 +712,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n", - " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n", - " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n", - " ...,\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n", - " dtype=[('wgt', '" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -1071,32 +778,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.5, 0.5)" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/openmc/tallies.py b/openmc/tallies.py index 63ba4df078..dcf67b485c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2379,15 +2379,13 @@ class Tally(object): for filter_bin in filter_bins[i]: bin_index = filter.get_bin_index(filter_bin) if filter_type in ['energy', 'energyout']: - bin_indices.append(bin_index) - bin_indices.append(bin_index+1) + bin_indices.extend([bin_index, bin_index+1]) elif filter_type == 'distribcell': bin_indices.append(0) else: bin_indices.append(bin_index) - new_bins = filter.bins[bin_indices] - filter.bins = new_bins + filter.bins = filter.bins[bin_indices] filter.num_bins = len(filter_bins[i]) # Correct each Filter's stride @@ -2478,7 +2476,6 @@ class Tally(object): # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice - # FIXME: test if this works for filter for filter_type in summed_filters: filters = summed_filters[filter_type] for i in range(1, len(filters)): @@ -2487,74 +2484,6 @@ class Tally(object): return tally_sum - def tile_filter(self, new_filter): - """Combines filters, scores and nuclides with another tally. - - This is a helper method for the tally arithmetic methods. The filters, - scores and nuclides from both tallies are enumerated into all possible - combinations and expressed as CrossFilter, CrossScore and - CrossNuclide objects in the new derived tally. - - Parameters - ---------- - other : Tally - The tally on the right hand side of the outer product - binary_op : {'+', '-', '*', '/', '^'} - The binary operation in the outer product - - Returns - ------- - Tally - A new Tally that is the outer product with this one. - - """ - - cv.check_type('new_filter', new_filter, Filter) - - if new_filter in self.filters: - msg = 'Unable to tile Tally ID="{0}" which already ' \ - 'contains a "{1}" filter'.format(self.id, new_filter.type) - raise ValueError(msg) - - new_tally = copy.deepcopy(self) - new_tally.add_filter(new_filter) - - num_filter_bins = new_tally.num_filter_bins - num_nuclides = new_tally.num_nuclides - num_score_bins = new_tally.num_score_bins - new_shape = (num_filter_bins, num_nuclides, num_score_bins) - - repeat_indices = np.arange(0, new_tally.num_bins, new_filter.num_bins) - repeat_factor = new_filter.num_bins - - if self.sum is not None: - new_tally._sum = np.zeros(new_shape, dtype=np.float64) - if self.sum_sq is not None: - new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) - if self.mean is not None: - new_tally._mean = np.zeros(new_shape, dtype=np.float64) - if self.std_dev is not None: - new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) - - for i in range(repeat_factor): - if self.sum is not None: - new_tally._sum[repeat_indices+i, :, :] = self.sum - if self.sum_sq is not None: - new_tally._sum_sq[repeat_indices+i, :, :] = self.sum_sq - if self.mean is not None: - new_tally._mean[repeat_indices+i, :, :] = self.mean - if self.std_dev is not None: - new_tally._std_dev[repeat_indices+i, :, :] = self.std_dev - - # Correct each Filter's stride - stride = new_tally.num_nuclides * new_tally.num_score_bins - for filter in reversed(new_tally.filters): - filter.stride = stride - stride *= filter.num_bins - - return new_tally - - def diagonalize_filter(self, new_filter): """Combines filters, scores and nuclides with another tally. From 352c0e919f42c625923bda365586e470f2e351d6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 01:45:51 -0400 Subject: [PATCH 258/519] Updated docstring for Tally.diagonalize_filter(...) routine --- .../examples/pandas-dataframes.ipynb | 28 +- .../pythonapi/examples/post-processing.ipynb | 364 ++++++++++++++++-- .../pythonapi/examples/tally-arithmetic.ipynb | 32 +- openmc/cross.py | 1 - openmc/filter.py | 1 - openmc/mgxs/mgxs.py | 36 -- openmc/tallies.py | 79 ++-- openmc/temp.py | 12 - 8 files changed, 405 insertions(+), 148 deletions(-) delete mode 100644 openmc/temp.py diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 2267703c46..70ff464060 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -385,7 +385,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAxOjAz\nOjQwLTA0OjAwlo8/jQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMTowMzo0MC0wNDow\nMOfShzEAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAxOjE0\nOjM0LTA0OjAwS1fWPgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMToxNDozNC0wNDow\nMDoKboIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -576,7 +576,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 01:03:41\n", + " Date/Time: 2015-10-03 01:14:34\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -644,20 +644,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.5300E-01 seconds\n", - " Reading cross sections = 1.6900E-01 seconds\n", - " Total time in simulation = 2.0057E+01 seconds\n", - " Time in transport only = 1.9977E+01 seconds\n", - " Time in inactive batches = 2.1180E+00 seconds\n", - " Time in active batches = 1.7939E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Total time for initialization = 1.2000E+00 seconds\n", + " Reading cross sections = 2.5000E-01 seconds\n", + " Total time in simulation = 1.8967E+01 seconds\n", + " Time in transport only = 1.8921E+01 seconds\n", + " Time in inactive batches = 2.8760E+00 seconds\n", + " Time in active batches = 1.6091E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 2.0825E+01 seconds\n", - " Calculation Rate (inactive) = 5901.79 neutrons/second\n", - " Calculation Rate (active) = 2090.42 neutrons/second\n", + " Total time elapsed = 2.0192E+01 seconds\n", + " Calculation Rate (inactive) = 4346.31 neutrons/second\n", + " Calculation Rate (active) = 2330.50 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 22e9baf09c..7c5508e955 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "collapsed": false, "scrolled": true @@ -525,8 +525,116 @@ " 31/1 1.02685 1.03706 +/- 0.00352\n", " 32/1 1.03458 1.03695 +/- 0.00335\n", " 33/1 1.05243 1.03762 +/- 0.00328\n", - " 34/1 1.05717 1.03843 +/- 0.00324\n" + " 34/1 1.05717 1.03843 +/- 0.00324\n", + " 35/1 1.07396 1.03985 +/- 0.00342\n", + " 36/1 1.01690 1.03897 +/- 0.00340\n", + " 37/1 1.03340 1.03877 +/- 0.00328\n", + " 38/1 1.04153 1.03886 +/- 0.00316\n", + " 39/1 1.01971 1.03820 +/- 0.00312\n", + " 40/1 1.01491 1.03743 +/- 0.00311\n", + " 41/1 1.02779 1.03712 +/- 0.00303\n", + " 42/1 1.03047 1.03691 +/- 0.00294\n", + " 43/1 1.02305 1.03649 +/- 0.00288\n", + " 44/1 1.07854 1.03773 +/- 0.00305\n", + " 45/1 1.04412 1.03791 +/- 0.00297\n", + " 46/1 1.05139 1.03828 +/- 0.00291\n", + " 47/1 1.05357 1.03870 +/- 0.00286\n", + " 48/1 1.06435 1.03937 +/- 0.00287\n", + " 49/1 1.02632 1.03904 +/- 0.00281\n", + " 50/1 1.05201 1.03936 +/- 0.00276\n", + " 51/1 1.04582 1.03952 +/- 0.00270\n", + " 52/1 1.02056 1.03907 +/- 0.00267\n", + " 53/1 1.06448 1.03966 +/- 0.00267\n", + " 54/1 1.03609 1.03958 +/- 0.00261\n", + " 55/1 1.02701 1.03930 +/- 0.00257\n", + " 56/1 1.04865 1.03950 +/- 0.00252\n", + " 57/1 1.06310 1.04000 +/- 0.00252\n", + " 58/1 1.02975 1.03979 +/- 0.00247\n", + " 59/1 1.03922 1.03978 +/- 0.00242\n", + " 60/1 1.07259 1.04043 +/- 0.00246\n", + " 61/1 1.04555 1.04053 +/- 0.00242\n", + " 62/1 1.01950 1.04013 +/- 0.00240\n", + " 63/1 1.04618 1.04024 +/- 0.00236\n", + " 64/1 1.02489 1.03996 +/- 0.00233\n", + " 65/1 1.06850 1.04048 +/- 0.00235\n", + " 66/1 1.03623 1.04040 +/- 0.00231\n", + " 67/1 0.99892 1.03967 +/- 0.00238\n", + " 68/1 1.05557 1.03995 +/- 0.00236\n", + " 69/1 1.01211 1.03948 +/- 0.00236\n", + " 70/1 1.04679 1.03960 +/- 0.00233\n", + " 71/1 1.03461 1.03952 +/- 0.00229\n", + " 72/1 1.01993 1.03920 +/- 0.00227\n", + " 73/1 1.04742 1.03933 +/- 0.00224\n", + " 74/1 1.05269 1.03954 +/- 0.00222\n", + " 75/1 1.05696 1.03981 +/- 0.00220\n", + " 76/1 1.05904 1.04010 +/- 0.00218\n", + " 77/1 1.05930 1.04039 +/- 0.00217\n", + " 78/1 1.03375 1.04029 +/- 0.00214\n", + " 79/1 1.07044 1.04073 +/- 0.00215\n", + " 80/1 1.04144 1.04074 +/- 0.00212\n", + " 81/1 1.06296 1.04105 +/- 0.00212\n", + " 82/1 1.04630 1.04112 +/- 0.00209\n", + " 83/1 1.03772 1.04108 +/- 0.00206\n", + " 84/1 1.03774 1.04103 +/- 0.00203\n", + " 85/1 1.03984 1.04101 +/- 0.00200\n", + " 86/1 1.03040 1.04087 +/- 0.00198\n", + " 87/1 1.03484 1.04080 +/- 0.00196\n", + " 88/1 1.03820 1.04076 +/- 0.00193\n", + " 89/1 1.04654 1.04084 +/- 0.00191\n", + " 90/1 1.03377 1.04075 +/- 0.00189\n", + " 91/1 1.03370 1.04066 +/- 0.00187\n", + " 92/1 1.04172 1.04067 +/- 0.00184\n", + " 93/1 1.04945 1.04078 +/- 0.00182\n", + " 94/1 1.03360 1.04069 +/- 0.00181\n", + " 95/1 1.06547 1.04099 +/- 0.00181\n", + " 96/1 1.04340 1.04101 +/- 0.00179\n", + " 97/1 1.07502 1.04140 +/- 0.00181\n", + " 98/1 1.05391 1.04155 +/- 0.00179\n", + " 99/1 1.05622 1.04171 +/- 0.00178\n", + " 100/1 1.01519 1.04142 +/- 0.00179\n", + " Creating state point statepoint.100.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.1100E-01 seconds\n", + " Reading cross sections = 1.0300E-01 seconds\n", + " Total time in simulation = 2.6639E+02 seconds\n", + " Time in transport only = 2.6632E+02 seconds\n", + " Time in inactive batches = 1.0721E+01 seconds\n", + " Time in active batches = 2.5566E+02 seconds\n", + " Time synchronizing fission bank = 1.8000E-02 seconds\n", + " Sampling source sites = 1.0000E-02 seconds\n", + " SEND/RECV source sites = 6.0000E-03 seconds\n", + " Time accumulating tallies = 1.9000E-02 seconds\n", + " Total time for finalization = 2.1800E-01 seconds\n", + " Total time elapsed = 2.6703E+02 seconds\n", + " Calculation Rate (inactive) = 4663.74 neutrons/second\n", + " Calculation Rate (active) = 1760.12 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.04100 +/- 0.00169\n", + " k-effective (Track-length) = 1.04142 +/- 0.00179\n", + " k-effective (Absorption) = 1.04380 +/- 0.00147\n", + " Combined k-effective = 1.04287 +/- 0.00130\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -550,7 +658,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "collapsed": false, "scrolled": true @@ -570,11 +678,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux', u'fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -589,11 +713,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[ 0.41271426, 0. ]],\n", + "\n", + " [[ 0.40846766, 0. ]],\n", + "\n", + " [[ 0.4112029 , 0. ]],\n", + "\n", + " ..., \n", + " [[ 0.41437289, 0. ]],\n", + "\n", + " [[ 0.41376468, 0. ]],\n", + "\n", + " [[ 0.41312074, 0. ]]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tally.sum" ] @@ -607,11 +753,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10000, 1, 2)\n" + ] + }, + { + "data": { + "text/plain": [ + "(array([[[ 0.00458571, 0. ]],\n", + " \n", + " [[ 0.00453853, 0. ]],\n", + " \n", + " [[ 0.00456892, 0. ]],\n", + " \n", + " ..., \n", + " [[ 0.00460414, 0. ]],\n", + " \n", + " [[ 0.00459739, 0. ]],\n", + " \n", + " [[ 0.00459023, 0. ]]]),\n", + " array([[[ 2.02702426e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.77108625e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.79568064e-05, 0.00000000e+00]],\n", + " \n", + " ..., \n", + " [[ 1.83114148e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.69970626e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.92143217e-05, 0.00000000e+00]]]))" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -626,11 +813,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -646,7 +849,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -660,11 +863,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -681,11 +905,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -712,11 +947,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n", + " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n", + " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n", + " ...,\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n", + " dtype=[('wgt', '" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -778,11 +1071,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 0.5)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWEAAAD7CAYAAAC7dSVGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4FNXawH8z23ez6b1XEkIn9N4FkY6AXeyKHfXaxd4L\nXnsXFFCRJlKk9w4hJISEhPReN8n23Znvj+W7WNArgsjV/T3PeZ6dmVPeM3Pm3TPnvOc94MWLFy9e\nvHjx4sWLFy9evHjx4sWLFy9evHjx4sWLFy9evHjx4sWLFy9evPwpCH+1AP/P4MGD5S1btvzVYnjx\n4uV/gy3AkD+aWAuy7cySNAGBf7S83+KCUcKALMvyeSlozpw5zJkz57yUdb74O9YJ/p71+jvWCc5v\nvQRBgLPTX/IzZxD50ZPFnkV5v4ryz8jUixcvXi50VH+1ACfxKmEvXrz8I7lQlN+FIsd5ZciQIX+1\nCOecv2Od4O9Zr79jneB/r166v1qAk/wjx4S9ePHyv825GBP+8Awi33iy2LMo71f5R/aEvXjx4uVC\nUX7iXy2AFy9evPwVqM4gnIYYYBOQA2QDd/5ROS6UPwMvXrx4Oa+cpfJzAvcAmYAPcABYB+SeZzm8\nePHi5X+TszRRqz4ZANrwKN9IvErYixcvXn4f59BOOB7oBuz5I4m9StiLFy//SM6RiZoPsBi4C0+P\n+IzxKmEvXrz8I/kt5Zd5MvwXVMC3wBfAsj8qh9dO2Mufj6UF1FpQqn95zWmF0t2QNPT8y+Xlf5Zz\nYSe8/QwiDzhZ7I9FAD4HGvBM0P1hvCZqXv58lGp4oB2UZP3yWva3kL/2/Mvk5R+P8gzCaegPXAkM\nBQ6dDKP/qBxevPy5qLWg94e7u0LCOHht+alrBz4Dyf2T6DIywrn6SDMfB0PKucnLy9+Ks5yY2845\n6sR6e8Jezg9j7oOYSNi4EqZ2BYsF2qqh4xToc9tPou4lj1JqT59PW+N/Leo/w1oNW6D0nVMXnA3Q\nsu+P1sDL34yz7AmfM7xK2Mvv53Rj9rIMkv2/p+1/JbxwFHwV0Hocll0CphNQWwpBP+2pJhLBi3zN\nDxxA5mdlfnYHOH+jvG3LcMofI9sK4fDloPqRH25lIGRPA/Ox/y6vl789Z7li7pxxLpTwaOAYcBz4\n12/E6wm4gMnnoEwvfwbF/0U5fTvvl+cEAcoeAstpxnt/jlYHry+EflYo3udRvkW5sH31T6KF4Mcg\nOlFK7c9VMNSegE9nnf4PAeDAOuRja7CqHkT2y4Dgi05dcztBFQInHgFZ+u/yngG1mM5pfl7+fHRn\nEP5MzlYJK4C38CjidOAyoP2vxHsRWMOFZZHh5ce8chu4XKe/tv47mP+jT3t7y6nfPr0huyeYNv52\n/tVfgWkZhI+AZhusmQlOM8x7GsrzfxJ1GoPoRjLf/9z+vd9lYGv7xTjyf1CoEDbvwu3ahhw5EPx7\nIcsyrcXFsPk16Pg1yG7+0wxlGQ7sga2nZJdw4MLy23X5ETacLGDH747v5cLg79IT7gUUAMV41lIv\nAiacJt4deAya686yPC9/Fi4XHNoCa7/85TWnEz56HaLiTp07+AaUndwT0NoeWkZB2TIoP32P2O1u\nhZz7wEcPN/8AYT5QsRpUbujQH7SGn8QXEMggBTcSmRSeujD6ThBFcFhPX4+rHkFV3QF1sYzVX0Ki\nFUEQOPb03bhWP4esjoGA4dCwGlpbYeIwuGE6dOt5sl4b2MtsXPz+HcgWs4c6Wn93fC8XBn+XMeEo\noOxHx+Unz/08zgTg3ZPHXmPgCwXnj3p7disMuxRCfv74AKUSjL7w4kenzoX3hCWjoGQdRHaEXA28\n8jasnP3TtG3VIMtIc8fjFFsxRwUiI8H1OWAWQNoGGWmQffqe5Hj6sJc8qvnRhFy/ibBl7unr5B+C\nEJuEutgHV8OzVLunIWEmeWA7HC2tVCydD5E3QOWH8O6r4B8Ab34KRiMAtneuxlp/AC2ByMiYqPnN\nWygjY0BDX05jgeG1e7+gUSl/f/gzOdvsf08rewN48GRcgd8YjvjxJoFDhgz5n/PU/z+FLMPe56D/\nye0ODUYYdTk0n+ZjZfcW6D3Yo4j/n+jBEDQcqo5C3Ei4eT481hkOb4X1z8GwBz091tzFkL8H1Re5\nWAcnUNv2FWHMRC9qIa0nfLcbgt6CLfkwZNovihYRuYJhfMparmc0OjTQZRy8EAEj7waFzy/lTXcg\nFA1FqTyIXTxMq+U2/Ptraa1J59iCpUSOmIC4sQTSOsH93/40ra2V1M8raZ5dzQ4WkM4Q/Aj71dso\nIFBFMzcz/JcXa1ZA+Ok+DL2cKZs3b2bz5s3nNE/lmWi/XxmlOxecrRKuwONX8/+JwdMb/jEZeIYp\nAIKBMXiGLlb8PLO/4w60FyymE3DoTej1MKj0nnMpXeHbt2HUZZ7j2qNgroPF78Njb/80vbkNtuWD\nQQ2Wy0EfAhMeg7YKaPoK3twNU5+HrI9hfR3UmtBWO4lIvI1S3iRaOxN9SwHE+sBSO8QcgZq9ENbL\nk7/1GGhTobkaQ3EmV53YxZqMEiaY4xBTRkKMEw7OhJ7f/FQuyQWaBsgT0I6/msDmV3DK6xBa2uGb\nMY0O0QmYBncn4PN5oHjTM7G4aglc7JkvPnZ3Fzod7s0q5mOjlXi6/uZttOJAgxLFzz8qZQmO3gdB\nQ0Dl9wcekJcf8/NO2ZNPPnnWeaoUZ53FOeFshyP2Ayl4vAipgen8UrkmAgknw2Lg1tPE8XK+MZ0A\nSQslO0+dC4uBmtJTx4HJsOVV0C6Cwh8tsJBl5G8extW1CanzCOQN14HLCno/8I2Dke/BIAV8MRFq\nKiA5Gq4ahGBrQ7t3C0lf1VFVeRc2UY0z3A6Dr4VyJXx3D7x9MezqB80rPRNwXz0GL47DT2Vk3MLH\nEb+eCF9cBR3uhd15P62TZIbSR0CuAO1RFPVqVLXBYE3G2RIC1TYi1i6lfsw4Gt9/Cop0sPdzmOv5\nGqhmG9YenbGU7SVCTuEibkf4L69INmV0/Ek/5CR168FSAi1HzvDBeDlfKJW/P/ypcpxlehdwO7AW\njwXEx3j8ad588vr7Z5m/lz+LuJGgT4Knb4VnV0F0iqdXKMueIAie5catvaBLMjQWwtdXwID7ILIb\ngsUFU+7H6n8XukwdwjxfUE2DwnIo6INr70qUuCFlGGzfD+P6gX83mLAehVJNYtVBykZ8TL3zCF1z\n1Qi7gxEygaQ98GQzjEzCzUTco69BPeByOPQ8SnsrruRRKLXtYfVyKD0KT3SAlHTkdCvWeCv6OhsU\njoSe6XC4BVXEWPRr36K5ly8h247CR4dIVqkomt6bwNfWe/5gqvwBKORzjPJoGpNrySiIRUgJ/a+3\n8QhlzKDvLy+EjICIKeDb6Rw/OC/nCpXmr5bAw7nQ8atPhh/za8p35jkoz8u5IigC3DVQnO1RwgDB\nkdBQDcERUFEAa7+C77I8StlcD9tfhQ1Pg6BEjnwQhRREw+gC9LvfRX9gAUJiX9h8iN3Jw8m/ui8z\nrDHod5jAtxRaI/7jxMftsqM+Uk1LTwUFQTn4J8UTqpAgpAvoP4PqLHh5K408ht4uo85tpfK6bkT4\nPYLSbxDwDNzbg+am49S7nSTUlCNmaQADbPwa1L4QGo3y/k9wmuciSE7sM1PRFLyN0P5O4h57GPe7\nUxDsoYhxkdgtpZj0ZhzVB+jU/zGEjYsgpfsv71n+Vmg3CAAJCRtO9JzmbXa1gdLXOxRxIXOBOG3w\nrpj7J6PRwXuHYM0n4HJ6zqV0heOZcCILru8FGX08ChhA5wc9p+A2KTEFSOyaP4N/1TQyS+5D45EU\nbP00OMXjyKNtDOjblSHBV/NmUA0NbhuEKGDQHGyY+ZKn+TBmEZbOk1CICiiScXy/DKl8N2Qtg0Fu\noADx9dGEyW/gLPqMvIktCFF90PkNOiX/pQ+y+7beBPvUYk+XILQ3GIZDaD0YjkFdDmXfv4Ey+gZ8\ncs00pWSB5R04+jKKDuOxzdpG6VEt0sBknHMmErytjsGZ3yEcnQ4Fm05v3bDyaWgoAeAEtSTyK71l\nWwXoos/ds/Jy7rlAbNQukP8CL+eNiiKISvD8FtWg1cAlN8PXr0Cf3iDWQn4FyHZoluCmhwGwuGFz\nq4oVFSomtJg4eG1n3OZYpu7YRp/st2mwB9H6ni/Ge6bi7lhGWUkFBpeJ+0ps1EtmqtVqjhtO0Lx6\nIYFfZhJn9yNszkzC9/ki5+yivFlFjU8zwQ49rpQMLGmVKPaU4P/vQZiubCKwPh45oh4nJaiIA0mi\nNvN9NMNkjGlG3PRDuawaWrdB/yGQFoBc7mbblRlcIvdGJc9DdbAGm7s72so34chGDNooRH8dm7JV\nuJ6+nBEvrkUsr8MxsgWlNQLx2F5o3/un968yG9bPhemvcZgSMqRUDtXVcm9DKCoBRvjB3eGgtpaB\n1quEL2guEO13gYjh5byQuQMWvQUvLPQcq7Vw4GZodzuseR8UJyAkForykI9spHnApXwmJrDnOGhE\n6Kn8gceP34K9kx899+5Gb5mP0NaGUukiJLSG4/3j8D/2NaJ1ODFVS9BkLsKuTUfrZ8ZqMLBZHUTf\nMXcTKO/D/OQb2L95i8DoVOy6YsRRLugdQKOxDY0UQ2DhboRuM7DtOYLvVgmhXwW+a5XU974eo/ZG\nfDY72TsmjqHKvrjEZ1Cb70EYtRz5aCt2zQbsdh1acwz5FFHasIcUqS+uTRuoO1BCzMWN0C4FMKEd\nWkVa+/WELt6MonM8aDSwSMaEDf+dyxCSu4JKgyxDsVXCkT6NbSV6Nm86RkFwKKl6P9KqtpHgC0Mi\nQrk8GJQCYCsHXeype19eBJuWQ9d+0KnXX/DwvfyCC8Q6wquE/ylUlsA9E+DKHy2m0IaBjxY29oIZ\nH8FXq2HaB/BVT1rG3MKn4cPo7QOzwmXeEhpxSJ0JLYxH3KhGvH8ePJ+KrbkjBU92IybvANGtIs1+\nAoeT0+keko6maT/WhlSMfp/ir+nEo8IYPmE/H1ws8Yi6P76ffoy8tRX3KH+iOwahqzkOjq7Q2giN\nUN9+A+5xyYR94cIy5DbsI82El6fQUPwgDfvrCIhpjxjYhHisI0LhW1Cbh21sOM7Scgxb/VE2VPDY\n8EdondyDyoPR+PRTE5paDr39wPkt+H6IsHkHEZO+QIzvCrkfge051C4D4u5anPvn8oQqkGJjB1Dq\nibObGNHiZsSJr0nLzCI8opTkZ3dC5kLP18N1KzxWIrY6sJZBQD/Pfd75Hnx5K6T1gbiLfvFo3NJ2\nFOKA89QQvPyHC0T7XSBiePnTaaqFYZNhyMnFAy4naPwgsD9kfAQVS6FHb1j7KTz9OH66TtyLizaj\nxH3UMsVeymCpPXyQBxfHwbUdYVAPtM//QIwji6LOswkv78f3ERH4GCSCjq+Hvl8T8OKDEOYLLVoc\nRz6lX/P7DNlQQ1NQCHWdIwlPLkA/bR6yrKbt35fgExQI0nYaY32x12qIzD4Gs75B98q/aXo8FG3M\nKHyXp7DnkgAGZB1G3ViPOHAR8uCLaDXNQrAXoi0cgDI6FE58g9AuGs1BCfH7NTSLEYjuClR2C2L3\neDgwHcbcgpjSHxk3LmMxyjgFQm0iCk02y266jlur1xCb+y2M7Y/sU4lcm4vgH8DnZTO5df3l5Lw5\nnONXjMFpVTOmYg0+B57A2f5WVC1HQOGHvPZaBFM5jAiA7reDMe0Xj8bpfhWBEEQx9fy2iX86F4h1\nxIXkTMe7vdG5xnEc1CkgSTB7Mjz1ORhPzta/9QCMGQmBcRDQDhzNsP962FYGg5tBdRyTrQtHxUTS\nUeNHGcw7AsZw6FaPpFDTFj8Yo6MerAVIxo6URUSxMdwHl0nNjX73IWiCYXoXGGZBzm9EKm3DNTAM\n52gZddYw1M8vhOsS4bIVIEPhnY+QME6ilZ209OlB9K5QhLB+yG1LcIQPQ7VsPnUBJrQtzdjDFCg7\nWjHm2HANuRR7kg19gQl18hf8ULMWv0MfEyS2I8gaiTa3lEOdu6Ap3Udi7TLk9ToCLjUhSDpklw7b\ncH+snZrR56nRytXwvj+kjcPlb+ZghJV4RwihRdVIV96G5JOHct4OdiRNxV73DkXdk2iJ8eO63Xvw\nqzmKUwXV0f2JqSvFvSMQmzkZw6vvet40pQ9YGkAf9JPHZLEnoRDHolG9ef7byP8o52J7I7nHGZS3\nn7Mt71fxWkf8XbHnQsNznt8r58HQiaDRQo6nNWFtg1eeAXWE51jtD70XQJ9YOBzHKvszfBffnvQk\nJX7Rk2GdHZocoDXhFC/BpW9CU7Ia1u2A/ErEiGp2CH6E1FSRFFRKpvIl5KIdyP71yGsKkEP9EB54\nAFVwGgbDQtTKUZAaCNmR0NIMFbn4tGzCXLCJphQdYYcCsfSOpG6YneoBgUg7HsWSn49UZ2bdLcPJ\nvOYimtJisbX44TCU4LeuEnWxBIcvJc+nnCJtMpUBdrb0c7Lwcj3fjHOx+MZ08kd0o00wIVQLoLZD\nSAuSVIOqzRdtWwIcDvL8KU17EOXxnWR8n8/ylAysAQK8fw2iPYO8lASOD1NxoGE8V677llvWfY8x\n/ygtRgMvjXqWrb0fAe2dWDQjsDdIoPI5qYDrYO8rP3lMsiyjVFyFQhxy3pqGl5NcINYRXiV8ISL9\nDl+3LaVw+ENwO06T3g6Vl5+M1wzzXgGjP6z4HA5u85zvMsDjicz+Iyc+Cg0MWERdx2iiq7cz9oMm\n/J5aDzunQ+IBuETA3k7F8QEliKZOaIL0CH19oNsYXKELcaka2KDqgTb/OFbnBirqrkFOd4BChfh5\nEcLLC3FEKxFWvwPv3gZF9TjDm7GsHk1z2R0YO9qw57ei1abSEnMCteMzjPtWEvZOOYX5I3hx6LMU\nDuyBEOWD0sdEpKsOonvQUqoGZSV0vAhaCrl9+xKiXSUk5pYxsbUTV7V7mzvsg7jm8Hp6NexDlv2R\nGYi8XcI6djD6Ezp8Dnenpu9dWJXpyMbD4K4HgwGFSsHV73zCJyOn4hpgRnjzHmI73s1VO0QmW7NQ\n+9qwpY6jPCCU6uNGmpQC0WY7jJiFq7IGd2XlqZ0+9r0BtT9dQScIAgqxPzLNf6CheDkrFGcQ/kS8\nwxEXIuZWePJWMLfA6GnQww5Na8DQGaLugYJVsOsZaMyHdlN+mtZpgaKj4CuAJhG2bgUJCAkEcxOE\nRECHHuAwgaELNOph5qOn0ltakW6KR+zvALUIB2UoMSO30yINlSHKjax4C2XpBohJg+oPQRfJhgh/\nlO5A/DNLKKwIJb0on2CjkUCjGlGTA8GDIS0cadl8hCwHQnsldEmiVTsG29b9+LYdpvWAGYckETi8\nK9pp06HqcfgogNqOsTTFGghRZFGSGkWyOg7Bfz9qzQgqinYTuaeUoqsuJiV8Ngp1D1i/GMvmG8np\nm06P6gMITSngNuOOqAIpgKIXLehCoomMK0Z4aBLYuiNvehjLlSOo+KaJXQMHMKW+DZ+SXVBpRRY6\nsOfKWRTHbWfaejXur19DNgYjJJxgX1470ntUoAuA7O7JNDT7MXzfFpx19yCFp4HBB/2MGR6b4zU3\nAwKM+elaJkk6hkv6GrXy8T+9af1dOCfDEYPPoDyP19Yfl/cJMBaoBc5qWaR3Yu5CxGCEOe/DrPHw\n3ZdgmQA9O0HtF+A2QeJ9kJYFphLwiQDFya3kS3fB8nvheDHsd0HPNgiyQsjlYNOCowEufRTSu8PB\nByF+Grz5CtRVglYEawPkrUQMNoFxEtTtgHozstlA2eX9sEc5SGpORtH6FMRUQ6EL9yERW2MTCUIo\nQS4z5QMDSO0u4ULmu+tGcfWmJdDogpShsOhDhEQDLiEMZVwdQlArxvB8jDYBhmxEvmc0jYVtOG3+\nKL75CMVmN5UhOt4b+AaP1jzBzohukNoJ3ba5CI06hMYs4lqqoMqJMb+YHaFrGLDkIOK2tehsNqKK\nNXzZ7TIuy16Kok5gzYRnGEsvfLaNx2EyIfjqodAFk/9FY+QR/Ks7kZT3Blkz3KwIgilWGXVtGY7D\n0HPh8xy7bxJzNS3M6pSAougQDqeWMIeMQWFBGalle9hYblxhQgzZgjqqDFtjFwT9SedIggC6IOh6\nk+dYcnjstAFBiEGWy37ZDrz8uZyd9vsU+Ddwmu1mzqcYXs6Oho0QNOz01/QGeHclKFWwcTm8ugqG\n3w3t+kDBfWBWQ7uHTingzOWw6SNIuxQGDYcHPoXgOuTg2xHumgvrvoY3boYCAxQch8bDYCpBbm+C\nR3ogJTYiGJWIcX2Qu7TH5b8L0SqisFoxT4qgrpuKdnmxiKlzYd0mSO6E1D6fJpcaS4CG+tSBJGQf\npN3RUMSCXYiJdhIXvo6stiPbJZy7noCLw1AdrUeZWo+rXRxKXQpCph0GPQOx3dB+dAjdtb1QdBQQ\n1zfzbI/HGV61nqcCvsJ+aC/Bk96iY9kWhAFLkOQF2H0TkWr2ojJUElqoQlW1hFqHk9COXbDWJxNq\n2UtavZn3O1zFbdvdSAHBUPs1IZMEGuY7Qe8D5duQcj/FFSKjUPUBQ0+mmFbRmhOFS1uCtMeBZnAN\nQnE1nRaH89L0i+nfNZSOC41oHXbih0hYjypoCO5GRH04+rueQq6eiljyKXKNE1GnPfVMTSXgFwe2\nMs+XSOUiSH0SQTAgYz5tM5CwIKI/xw3PC3C22m8bHsdlf7EYXs6O4rkgqCHwV2xEtSd3txo1BYZP\nhO8XwF33QKcukBYC+ddD764QfT9EtoeIKBhzL1RcCi91Qb5jK/kLdpKwaQMKXRBSZTPuVxci9x+L\n2KzDuQHAB021HSEoEaHHeGQpE8sYM7K1DkPMElxpzWg/uYXuN5UjjOsGIYchuBSXRckLKY+SEmWg\nXeUKeh5dgLA2CGXvavCLx2VsQFvfiGyWkZqNSEojtS2t+PgGYDPo0NdnYDi4EaXJD+HgZdBjIkx9\nCr+p43EYPuPlB5eRezCcuxrewl5hwX35lXQ++CrUV4GuDsWYj9DpgyAQpPgK5PevQH9dP5o5QI5U\nQPJuB3KZntjWSkr8naz0rSJx/TcghyHaggjqX4bcYEawOJF3ziEALXywAFQKhK690VflIFVYEMNB\nLrQiZYh02Pgtj47Lp9i3Oz2bJIh24crsiWQuY0leey5dvRBnogm5pBhF6PdQk4faWgDuK+GiV0CW\naTmWh3T0Zvw7pkLVDmjJgoyvOd2XtZtmmniHYPvdUJkDFUcgdSiEnFzx2FQLR3ZAQgcIjfEsQ/fy\n+7lATNS8SvivRFBA3v3Qa90vnJPLshtB+NGMgEIB468CUwFs/QEOVIG/Fi5JhNKnAaWnd1W6AVQV\nyLHXYQ1TosreT/2iW/DXDkDhBoXBjaJjEkKnXmik7jB3Itz4AKz+HHpchUs7FKqmoSkyIiQdR6kO\nhuAusG8frLfhqvsem6ihtlMUt2tmIdXk4f/RVwgpXcE3B7M6CDGkiZbUYYR/vhS7VYO5ly+anABi\n1x8HjR1niIGG0TVow67BbduFRn0Xwqq34bkxCH0vxd2kIz1lK5d1j8L4US0tJjOGvb7QUgBmMwzU\nnTLzkmVEXRRoU/Fpuh99QBiBX2UgSJXIokyI0kJXcy4r+g7laIQ/SYFXo1XoENd0xbzegt0RiP15\nPeFV94L/0/D4v5H7jcA2sjOGWY1g9UH+3okrz0FL90DarTlGWmJnCJ8MhsWoroynZHUs6UcPo43S\noRgzDungPqR8E6qUTIRIN/jEwbI7QaFAqddTeTwJ//CvIGC0Z3LUbQXBYylxcqwTGYka9+0oXWHw\n7b9g01sw5SWwOmDJy9DY7HGwtO4byBgI1z0NXQbh5Qz4De23uc4Tzgde64i/ktQXQJcAzlwoHwIN\nj4Hz/8cG63C7Pv9lmqYqiAyAq8YgxxfinLcSvrXDnHlgXQ8LLoGqGtzvH0C3aClRviMxPR+P/soO\naG5ORzVIRExQISjiYf3bMPY6SC0Bv0rc26fjMF+L/mgLSrMMmffAymvAUABxao6FiXzWsycKi55E\nRUf8l3Yl8P0XEYPqQDcYxGQMu500BysI+XYFDB2I0Gs52pwRCOk2amdfg6VfDKrYSsJPVKD1z0bZ\n8yosfbfh/NeDoPejtfQbTGod7SzrCT+8CPeocMSEZJQBDmhzQ+8XoN0ssNXAkmdgxRxoKISO/ZHn\njsO1YDj6tn6o93fG0fdNmrslYBg+g6HVG1gXlc7GLYvh5usQ6tQY+kUgjkxFWGdCUOyGeyZD+z1I\nOdMo+iIMV5AROSEeucRFa88gGoYMpDUvDGHH19ChP8KApQhaHxKDa8lTTcHZUI1olFBeNRPxshjk\nkS3YhnRD7j8TItKh8DAqvZLWUh30zAffBGj3BOTcjUAA/MhCQmo8gc+Xuwh+7UPIzAHjQNifCRsW\nQF0OxPrDzKc9k65zFnsU8K9tfurl9PyGNcSQcJjT6VT4s8W4UJjzj9tZQx0EtSsh9ApQhUPT0yCo\nQN0LZAVOxzBExWQEIcRjtiYIIIgQnQapWciHy5ATklCMskDH6yDmOmTFDiwrEnE26VAP7ofSLwmT\nfSG6yu6oDDogE+oPQeUuGHoNRKihajVugwV7Uhu65e0RNkgIhVaI8gG/OFwttRzrFIfLN4AR64+i\nOVQFB+rApwrarFBfD8XHYNBoBO0eFG02ZLMb5YoKxLo6LPN3Yogfitu9ksZQLcaieMTxc0CbhdBy\nEKf6OE5DPpp+K1AG2fHdtoaQE00oBy3BlJ6Jj94Pi+SgXt8X4755UHYE1rwEcgPEd4KD70PaNFj8\nPIKjBlFjQ8g8gFrahDY1CrF+H9FrjpNaWsayi4Zw0bCrENRqBPNidNqjaIcbEBdvxOGyouw4Eymv\njKZIDSGfHUZYVIPpOT1qTQpR71TiHtAFp6sSzeCXEfJq4MAT2ILd9PpiNUpFPFLOB7gVuTiT1uAK\nb0VXkIqo7QJuO/jHIO58m5oCG+FTr4eAkaCJAHstkpyFoOuKKAXDrvkIL12D7OeHOqAcpr8D05+F\nQVOg21Co2QK5iyBiOOTuh94XgUEHB1+C6CF/caM+P5zcWeNstteYM6cLnm7o7whPZnO68vyByzm1\nf+YfwttL1ioPAAAgAElEQVQT/qsJHedRxK4YiM0CTU+ouRR23Q74IrlXeuI9f43HzMlph+AtSGIS\n7lwDqrhE2LMGLJ8jVd2Cs64eTdAujNPtCLnPQPVGoqqgIuRbWHEAyrtDlgtmHITmPZDzMZImGvtg\nN9rlNoScPEjSQooeVHboNJd373iKumEz6dT5XlSiGRI1oDDDV24wKWH299iTQpBqP6bFV4myzklj\nXyNSUjeEhmx04wZgtbbHOCCTiNXBWKOdsPEA+C1E8BuJvqoZVYMV6eh1UPk5yAngDsG99ibq1K08\nFdyd+zKuxqfDpTDwCTjRBMmDod0AGHg/6HVIISFIokRrgALJUQwOPWwQENYEYNhag1Am0mfVZp5+\n9hEa545C/uRx3AYtZksUSvFunIZQyNuPe+HVtOTlEHP7EezFWqqmRqL73oHhmAI+ysJY1ILxQAPS\nonFQXQqXfIdmhRs5KRJ1dTmSpRnlzo1otJ+hr7wNMX8FZD2EI/8DWgI7Iox5muSIDbD9HiheBnUn\nIHAqYnM1ctZceGcSKBQ0fjgL8c6FENgZrMU/bTOdL4PonpDSBdIyICoClg7zbKnk5fdzdos1FgI7\ngXZ4Njv+w77SvWPCfzUhoyH7Jqj4Bto/C8bRoOmJkBmFurwP7tgyUAFRyVCUA+rDoCvB+owbXWo7\n5MBeuFwDEFRZEK6kbfAI3MciCHF0hV43gCyjW76Itn5NNKlrCIi9ESoPwf6boU3AWWLAkbgb9So1\ncqwNZ5gDt74NlVHCvU7CVfocfWaYMW5w4lT6Is58GUXyRDix3uO4pmgLFH5DdncFe5KvxWzwp9w/\niI5tFQyZkUtKycWoNx7B+vZS9Gl61IZOqCv2Q+ZcSE6AyJ4I5WvQluxFTgzAqfBH3VqP3OcqatML\nWa3rgE3p4F+t+/AtzaDJsgWfJ1ajWvMkVOyDltfBZznisyspTw9Csvpywi+MzDtH0S84ldRVnyGH\nC0gBbSjdMr5tpThDA2mM9sen3ow+oQJqHkA9PBbH9ijq1tRh3luJdMtsfPVVBGxpojU2EOXALMS5\nqdDYAIFRuHpW4grWI0r7EOLacPTzQ6xvQf2diBg/kaZXHmZXz3fZvlFHYYUGlVrLHTcp6M029Akm\nODQPAkfAofmw4ikURl8YkAM35IMuBN22f6EZmA7Dv4Xcn3W0YnrBujZoqofAcLA1eBbtRHnHhM+I\nsxsHuOwcSeFdrHFBcPhqz4vkbIZ+m6F4Amw3Q1wsUtIGBOPzCEdMkL0M+mfhynoYe1YF+pBMzEI/\n3NnP4HubiNwWjFzcjBSSgapCAaOfg31vQlh76tTvkNsjkfRltQSvK4GJDyLveQ3rFX6UMZOE6n0I\nGY9B+UHE3Ddx+2Ugl5bQkqYks6eaI81dGKzZSkq9Bl3gi6gMwzw7bayZBVVLoVFErnews9cIFA4r\n6TXRmCccwydLh3F/K/bSBlxmLYaRRmitgDoX/OsTyLwdVFHQZxFy80xceYdQfmBm1/x/s9ZZx7X7\nFxMd0IgyU4Uj4U4ODlpHb2ElYlstvJUKjUChCpvdTt6sRLqkfgjrXsNWtIOdg8axLyYeY6CK3pZv\n6b7gKNZeN6FStLJjxCjaV9xA6JFGmtrfRGCZBvmudyBYRpqmw35MiyPIQeOdejRHZZyKaPQtjYgn\n2ijp0ZVATSG5iiRCKl3YFxXTfWIFuw/GsWR/OlPzysmM6E7AlbPo3yecpJobEPwGQt0eaDeT7Puf\nomPTfhiYDqUVENfTs4imJQek4zD9e/j0Q3jypAnqmolgHgEVeciihBwRjLjwVTA7IX0wjE6A7ndC\nYHvPcNU/gHOyWOOGMyjvI862vF/P+8/I9A/yz1TC29dDYj2Yj0PbcUi8G8rHA0rYp0PqpEXQWhGU\nBliRixyRgiu3BEVfPUKhA6eiE8quhUjaKErKYzCG5REcGI+42wGtJuTrl1OpXkWF4w0cWgXaMitJ\na+rREAfjWlH7v8dnLWu5QX8TGOOh4G3YfRgWroP5e5EDg9njnE6n1sd5TT7GFUvWkbj9B1AI0C4c\nukeAT0c4UIy8cR7ld4yE7Cqib/6BKvXDuIUGYliB7GjDNH4ofmMKEBqaIUYP0cMhbhQcngtR45D7\nP4O5dT5f5u5BmaFixp5V6OXLEL5/meb+/pSPG4OJavo3vAt3D4FYC+jAYRjGiaAc4qRwdJuroIMa\nyo6CDYjrRnE87BiZTJFPAmXKJKaY9jGiZSGSbEOuEHFF+6J6oRWaJERJQgiVcPlpqFvrh/T+TQSG\nfIWkisZ0JBVt92tRh7fHJufQ2PQ+b43y4Z1DQax8dgHduggoY30JTpoHD72EfNEE3GIxSuunkHYj\npN4OgsC+yy+n54O3wFePQnIQxPeFoQ94dqleexPkAbUqiOoPjW1QdxhqTUhGH2RdK6KuE0KkH8T2\nBz9/CCyB/s+D0vhXtuTzyjlRwrefQXlvcbbl/Sr/jL/N84Hb+cfSzX0K2tpB4yaoXgoHJoDcBqoy\n8OuA0BKH3CQjV9YjxduRDFkI6W0I+jDQuVF2PAFOLbbifOLyluESbIgl1RxMUyJr9Ai7PsOwQU3w\nu+UoawQklQ53UDsaQitRG/9No64zIYGDPQq46SBS4Q/Ib3+OXWjBHeCL4JZIVT6MIaADs11pfHnV\nFIpeXwEPzQF7HnzrhEMaGDsDOT0SJQcJO3acPUdeJHy3FWVDCfKuKxCyH0XTvxFHphbZLwh2KKAx\nBCQb2Ish/98Iu97AmdXA5JXLmCq50MU+iFCugGu3IvftjMtVRGyJiJz1GcyaDWMfRhJl2o7tJKSt\nGW3KbOh3A0yeCoMyILEzKLREl7qZMfd77ji8jm65Rzla4cvOLZ0Ql/giqy6lMGgGis7DcTaH4iqX\ncRqScVYr8XmlkYjVL6PxnYqhPJvIRgltaS2qBzrid/2NxD25gbl9c2i9600GWFoIVxsIjhiO7CjB\nltwd10N3IRQJMOQrsDWf2iZKEKDzIJjxLDSFQLcroGEelM4AU2/IVnisHo7uA0s1DJuKrHPj6NaG\nlOyP/OTrMGkWtNZA9UoIOOExd/RyZlwgviO8Y8LnAskNe66Fvl+cetF+L6YmmPsCXKPFrbkUqaQa\nVbtSsJ6AbnfCtjtw92lADg9ENgkI2wUUPsnQaRTy/leRk920GF/hi7p8ppq+pLhbHGHmkQSsXUhl\nZTXBB3bRWJ2A/3234V/0Hm2t7WnMCCblmR0I3SI5pjtBmpACm75EPnE/zs/M1I+PIqAuCM2mdVBa\nQMBHL0FqF/SjBjC7fDEvjxnDdPtBUoNEhNnz4bXbIXAGQlAH5IB8lEnd2NHjMiJJIwQLNb2XYGzU\noIzeR/OSvQR3FFHQGbauAH00FMaDbwEUfYN/eAiyQYNw53aEuc/D5Z493PxLIqkMicY/fjgV8d8S\nwkw0cgoVucvwaciFzlEINSZI6QRJo8C5E5KPQdArSOtexJaUiF/mZm6xHQWLjDz0IYRsGbVDh1Bb\nhtTUhvbZD7AoQrE+Nh6fGBnD5lCka+7GrSxB/WUd7uZFbBcc5EwaT6JJxcXbloOwD63LQuPEobhT\nBuOzdTnWN99Dc+unKPcVItx3AxxKBnXJfx65oFAguVyIaT2hPB/WLYDYzbC6H+w/jNzcAgPuQBgT\nCdZKKKhADlbBhJsgbSpOaRka8WbIvBEMSvCXIVkGneSZnBO9r/Xv4gK5Td6e8LnAbYO8r6B6yZmn\nfeA5SOsCUZfhLpdQRICsSsapicMe+Biu7tUoMiVw34b86Y2IazqjqPRHznwPwSIh7h2NrHajCB+C\nXqkhihuoXhpI87tONohDEDLCUI0LoMm9hgBnPTF17QgrlCkbGwuP96Vs/VwSJwxG3nknzR+0Upum\nofqGaPT6drB5IaR0pG3SBL5/rSsrRuRQObY7/6ox8XHqAJbM7EXVutEQqwfUEJiGQRGGOOl5bqQr\n/2Y/G2hDIyaRH/waddE2RH8d7lYH8sBjoFXD/qUw7CGoDAaVEWHQV8jTx0JII9zQGeo8rjebtFYC\n6IOR0UTwMo18ylHrbAKyTBgCwtEqU7EJX+POng9vzYb83iDOhgVTaetWjaOrDxxsBocEN85D2Pwe\nNB6D6FG0+2gfdlchrT3DaH3zDYxDOqHRC7SuVdE2/ROYvhq3vx6luY1hYjEJuhaOddaydGQfGgLV\nVE0PQtVYg+LKdxAsh/B5W4t60mQEUYLH74OFr3lsfKtW4WhupunAAYreew8+ngG5y3GtegwWHoUO\nk3HMnIotMpAj0jGykyYiu7Nxa/cjtQ9Ak/YagtgPWa5BCrCCUw+1NijSwKOD4ZZkeOw6+PRl2L0e\nmhs8bUyWoa3lnDX3vw0XiCtL75jwucDWAItCIWkQDNx0ZmklCe68HF5/D/vSHqgS3cixKkyWeKTm\nHLY03oAxOJ5e6+9DWG7AN6IWYZCA3OyHoAxBHlnByvRniXqhnETz25Tk9iT82lsIHdCeqsPvU6jP\nI7Khjfgf1Cju7Qm1/rD7a4rjLPjmiohl9fiXBSA/MIPGdz+i8rYk4jJuRGOYSumquyntFw9+QVga\nt9DN1otoezhsvQx7QAoPjbyRUdV76a4aRui+Y3B0M6bOJnzHF2KztvBN8RIMrQeYkuugSdiJvV0E\n1mQjvh+vQ3FJBv4/FECsCQq7g8MO/tFgyUO642Mk5QYU30Ug7NwJL7xHnu1iEvVfohJDcDccRVp1\nB4rCTUhqo0fJhKiR3HZUIRMQmo8gV2UhmFSg9MOllcBiQqlSwMCxUG6CjBuh5l7ch1po1WgpG5pA\n6Kc90fqvQtNoQapyIV0yCTnpCqpmjiDgsiSCLx2PsCoTl8uJ+cg+bD30FJVHoG2wER07ksB7b0E0\njYY2EyTPg+LDcOwZiL0JyqogygAdn2XLmGtIvmYSUaF1YIWD4j66HXThbu9Gai1ClaNEDvfH1NvJ\n1n6TGDX/A3RNdVgun8Th+Kvo5pqPLFegeyYOhrbBsmMwtQhi74HQOVCYC8eyIC8TTI2er7ND22HG\n7XDZ7aD73/dFcU7GhB8+g/I8rrm9E3MXLG4XZN4GqmDo/Nyvx2upAt+In6V1I08fjOvdUKTqzah9\nkhG0MyHiVjikR2oJpaUmjFU1kWiC3MRkVlFz87sMz1qOZv+bWHRd2FFUg3LecXrcG4XfhIEI/RZg\nKzvA0dKbOeo/jr6+dfjfuwO9QYvuut6wbRPSpBspODGP5Pv2I4wJprXZl/yZ3Uhr2U7m4Fk4jRHE\nOdKIeeYFVHe9g7QyDnHwNxA/BVoKYc1FtAl+vJxxE4HROgaVfUmHBRuRlAIurS8qXRfEQ8WYZsci\n2B8laNk38Oi7WE0fUC2uIHjHPhSNaejrCiDGD744Bn2ugh5JyJu+wD0tlpbwBAxv70GuNFM0V4lO\n2ZlI9ZtUkcuJ4hcIeK2OpDCQMyoQXTKGnb5w71Ksn7yLWJGNdkQvGPkEVc13Y3hqPiqLEl2QALVq\nCMlA6lOK82AF9uHdKBbjCNyWRUSXYbDhbfIevwhWnEA//Cniji2jKduCbtc2xEgnCpcTwWmneSkI\nZmj4rj2ZXSfjctUy3KQgtPl7cIZA3N2g0ELUVKQtfRA7fAgHb6GkaDLhEXY0YT6w9VOyh15GSKKM\nv/wwSsVaFPPmeKxPt5mwxlai3t+KZABpuExFv3eIDxqBzTkZ/SMKuGUI5BTCYQnuuAnq3/f4I4n/\nDBQnJ+pqK2HeaxAaCekZ0OMMfDheoJwTJXwGnkOFpzjb8n4V73DEuUChhOixULPjt+P98CA0n1yW\nLMvww1KYNQkhNhFhxzTcS6eAqgpqD3mi6G9E/tyGX8VeJpcuY1LLBjqmtyNm8YfMluKZ+MAJ7uk/\nA+ddb5DQOgFVNw32kGiaNs0mp/4h2p9wMFZ+nfdDx6NfsB6xcT+Wwx9jH3kCp+l1ghce5/CSfliE\nGAhrILTlAD711fQVZjCU60lU90d1/Uvw3HjEhCs9ChjANwmUCficyKF3aSPr1EZqY8IRpohU9Q7H\ndPcwGm6KQhhSQmBdJUGPzIJr7gNnLbrjzxFvvxKVLYJWXR7yh1WQ8BYYkmH/elhTjnDRWMQd+fit\nctMy1U311VbC760mdHUdarOREvsKMh7Jwr+kBVvfSkSfIegWmSC7COfU8UjvfIxq8EwY+wpo/ZCO\nZqNVGRC1TszpyTAsBueQUGx5tchTXoLtQYR9+QOmOy5CsXINosaPWDkA48WTKdRVUaOvJeDELjRJ\nPsgqGw5RRDquwhGiQz0tkKDOSYzzUTC67ABbjQLLY4Zj0ZWCucizp1ztRuTmAqSt18HW3cRV34/6\nyIfg3AGOIWhD/SlUrQBRQFw9BZr3wgY17tB0iib6IQhqrO260qQPwbZmMVVCIKL4CK7wMqRsC4xb\nChmXwLf7IPQesOVB4RSPu0zwKN/7XoGr7/1bKOBzxgUyHOFVwucK305gq/3tOKIK5l0Cm1bAbZOg\nvhreXAy3PAjfLUbVNw7UccjVK5HN9QipcxFv/gL3QR3OcD8kQw+0JSvpcugD3q0v4y6xkQx9CeVJ\nvfDPHYeQVUtZ/jZKNBvoEnAtWr8G9LKDWRWzqG/uCLOVqHLsKF80o36ojqVPX0zkGpnqzm3YMkRi\nlhaDPATFK7fB3BvAVAdx7aFdMqzbDLbGU3XpOBN0dsZs/5DHnDtwOuwg6hD99FRJdehNl+Popcdd\nqoDAQAgM9fjPNVciOFxoG00EWfywZOioybkbp7MJd4Ie8xUjcH2xk7buMtWdtxP8Qi4+RQYM3Yag\nv30bzjHhJL24BmNePb6X2XDnB1AulNB2ZQauVBVtwRkoXv8axeTrQRTBaUOXX4NCY0cVHoRjTwFm\ndyBSxfdo3Q40m59AZ95EWEQjsQs/w62sR4jsgCF0Pn4RDnqaswhbs4mKKUZsGU2oIgOQB4ZT8vpU\nVOlasJvwW7IVzaLnMdrrmVLVxOA6N20KH7BLsHwmfDkSoaAVl6YEuUWGKh+EVjfyNiXyhiW4d3yI\noLVCoYDsHwiHg+GeD3HMeoiYjy04/ZUcGdqfID8tyeYWsqRPaGm+BXuBFbm5C9RngyYHVBrYWgwd\nsiFhHrgbf6UhegE8XtR+b/gT8Srhc4UmCpQitJac/vqxLKj0gfW1cDwXXlsAl98KajWS3hd51xYU\nscug1Q6F9QjmAwAI/8fee8dXUeaL/++ZOb2f9N4ISQgJvfdeBEFBAbtiW7Gtupa14epid1Vce1mx\noCCggCBdeguEEpIQEtJ7L6efMzPfP7L3d+/uvXu/7lfvrnt/vl+v83rNzDMzn2dy5vmcJ8+njZyG\ntKoHdcxgWnOKCHjcCCNAjfiAqSUDuMO1hztamjHqIzjy4ACC9hj6JC/A//7deDLMqPiRBSOlpWmE\nuq5GWxeNWC/g9fnIOVyILLajim5CCZkoKU4ouAhGK9zyCtgje/u+4GFoboU9H4Lf23vMmQt2O0Jc\nDgkVeUz2xdIcO5H4zAfoq4RT5TxBW2cyT1Vez67Ji8BiA0EP0ddB8X0QnYvU3YB3xaPI6Y20LxlC\nKNWIK2wDnUsrqEm2INQE8P72PRSditaYQ2jiWKRuHZE9dbgejMDYk0DxvCSkrDiMh+MIeXU4H7se\no6McPr0eVl0Fb4zHcbYLMS4BwRmOJUHH6W2NeA1piP1yELwdaKfdClPfxVQSj+TwQGwLgiChO2hE\n7inGl+lAzpxAU2YmLbkODMZqHMEdaG4RME2TEdwBhCYr4h4Dyoa92D84TNT6ZihaCRdjUGqtCKdE\ndK+1QrkIsgi2AF0P9sOfJZF+1VYSQj6E6sH4ayPwjDcTOvgbxINfIkX2JyTAqIfeQfBnE5jTxsTq\nd3F858eU5aLO+TXql5MhCrj2ESg8CHk7e3ORaGP+59/7f2V+JjPhn4mTxv8CRD3YI6BhN1iX/mVb\nYT7cNB3sYfDoDEjJ+EvjiPY8YnYrqGHwkYx6eRjrLN1cCbSxnoDYTEeOhczf9tCzIIugUouuvQmp\nQEY8XoVgv4+SRSqJR1US3NGYtBmoJT4aI8YQ9WI5DfeNJfFMNdInnxNEjyZXwiub6bevlO6JUeji\nohCd0YhjY2DIH+DAJbA1HWYcAHsW2PvDNSvhqdvAkARTFoM9HbQBlLSxhDLq0deUoYTNRBKWYlJE\nYtuvJveh28hIKOauX3+Mmx2YxWmQ+CC0HIG4KQiyQkTcQ3iqNhAKFNM83UjMvvUE/WlYglF8HDaZ\nDmMboXEPoLEm4BvVnyTjMa6zroLDaVRP9WHxNpP0dj2uNV047xcRin8LnWFgHgHXvghvT0eMjEaN\nTaXNfBF7TxijRkwg/6Uv6DvQjIkRlJ3dxaoBkRhvW05Uy34ixVqiGr6hc9iNdBzu5JI54wnXnMd8\nwk/gRDu1S6KhSyLJnIHS/zDitiSQmxEtjYTGzMcXdgFD4jIEVz5MnkYo6ETaV4C4pQD52iFovitA\njspFKHkRUU1HlXcTofsNkm8HUstxWq+JxpNynIhPDuKr0BLmchOYOBDXgLNYL7ZjiN+E0vQaalgz\nceEp4CsAy8eQ74eUC/DRvVByHVz9cO9/A7/wX/Mz0X6/fEM/JbYoaDzwl8dCIagshfe3wqYzkOWG\n0tcBUJVW1PZbECqXEwxGIF4YgpAViRB2HVqpgJ1spZonaWIjiZszkDKvxmHoQW9NpnWmHSVSQ6jF\nhxzcy8CKZDKEJZg2roEjmxEUD7FvfYegFXGFtaCZOokmaxS1qWFQFcSVE4UUPx5do5cYh4QzEEJQ\nW0ATgIlfQ+p1cOJh2HMP7H0N9eu7UTNF1HWP9Xp06IzgSKQ7x4lVHoVfaMMpTkMQJEKBG3hwxXlu\nHfwhfxq1hRjjB3g4QqfwCZizYPBaUOuh2wOCBinxVurnGtHVuJFswzDO/JCkuDAeuvA1z7+0l1dm\n3sczz1zL0q3fMjuwleZ9/WkLs+ML1+Lc0ULXFgXnjekI0X4Qa6CgCubdD3tfALdIcPh42pLd6Iet\nQGuXkE4fY/DoCMq2q7izR5NtiuP5nS/wUH07U8KtRMW00OT8gp3qSVaNu4znrcOor6gi0FZExyQJ\nrE6kfgKqtAc54Kcl0ApSBOQuQjP2EQzFVoRXHyAQcKI2rkNOmEFLQwdCtAjpiaiuIGpLE9a2/uja\nO1DlDRika5GQID2ZSOtKIjrupHm6nmCCllCuSvCSOvwdEtpmLaGj99MRcZTuGZkExEqY8QQYukHt\ngPg4mCxB/qPw1Q29RuNf+K/5JVjjX5SD66GiACwOmHYDWJ3/3ibpIOjqNbr9W9CGRgNzFvduyx2o\ngX1gTYL2p8GzA3quR9gZQOc5DRe1MCkOoXsGc2ybeVqqJIsFXHEmB736HMztD9ui0TWeJPbEQNSk\nZoQbOhA7xoHWA4f+BGFxEJ4NsZFg9NCT6CD++/PEv3+Yj96fy0XPIJ5/59c4D7k5nxsk61wqXXGN\nhNcVQpYXDmZCvR5qtKhCOHLiOQJ96hCnGVD7XI5q/QYhdA/o4tHGQLvjKyxdVtotAWJVkbYLB7nl\nWQ33TFiLZlwXCQWTEJCIZDmdfEArzxL+XRRC1UqoVWHnNPQRcUSOlAgrqEcwBWHvO3CPGWl/DbI5\nQMH7l1A/SE/KyRayip9ENDhp+W456b+vJWj3E3zCjlBXBU160ETDNcm9PsA7noBgIs13TSDC8AT6\nIFDugcpONHPvZvD9Szk1cxBpo+041TBMxe+SmfUx6fm7kd07udQsoI++CfXEV7g/byCUk0r7DJWM\nxmmIcgVKfTSdERdxuL1w6Q3grwPPRwgZdQSTF6CUvI0iD0fctIITv8pm7koVqcgKDi1ij4uezHux\nyfcjhGIQ9HoQRIQ5T6Hod2LRPMIx736GzDhCqMqE5mAskZZUaqadwFBbR2CSGYtiwKAZg2CZDSwF\nNQS590GOBxLPw+Hfw4ZUSF0IQ17qtUn8wr/zM9F+v8yE/15Gz+9NJ7n2BXjvfjixDeQ/J9PWRYI9\nFToK/8tLVcEArTI0XYStv4NdZ1DXvQuhbYjRXhg8DPLbUL2diPd+yIyvvmK3LwFd160w/Xdwvj9E\njoexv0fMnoc0egOibgR0HoFTNTDlChgUBRtegHF3QepEXOF6Mp4thZV70SV5mF27iZNXLGHDI3PJ\n9J1CZ5dxbGjrTf04vQeifg+xvwZHfzB0ILlqMZwKoKn3oCvchNiioAQ+QqtOQjakoxVykerLMZ9t\nomH9q9zwYjQv3a5hstFLn9Ac9g7Nw0WvgcjIUPRCLs2LilCX/AnGjAJvDd2jGjGMHoEwQAtpEfDy\nxyiKRKC/i6L5ETT3c5C6yUv2Fbth/ZfQ00X4tEfRj+rAsKyHhpQ4iF0F3eNh1KMgD4BzV4LBAAY/\n8R2Xo9+xG569BoKNQCec3YVk0TN4kZmKPY2c3VyDkjYewb8WTb0f/XEBY/s0ROdMpJ4wLBEOqkbF\nkvS+C43zJKLqRU5ajLslHG1GOGj0UG+Ad0vA/DbaESvRZE5GqWqltl+Arhgzvnu/QWgPgVYBfyuV\nLWupvCIa8dvT8NE1UJWP8PmrqBVvc+bMEgYEj6KRjRhOmfG3N3N0ZBun7aOxfhgk1nCAsN0NiIMf\nhmA+6GdAIAgaI5y/BUZeA3cXw+wTKK4CAkUJ+L2LkJXT/6CB8i/AL2vC/6JIGlj6HFy6DAxm2L8W\nnl0EsX0gVwNRmVC/C8Jy/uIyVQ2B+3rwBCE0EMGXj6pkop5ohCgN6Mzw3fOoFc14y0rRZPRlbMFB\nOoc5CETHo4+aD7Pn/+f+BGbAyePw4GPgUeHEmxDWA4Z88J4nTvGjXqpBeGQ+0+L0HLx9IlbRwVVv\nH0VrdqHMqkTY0Q+h+zTKxWJEowqzVsBsqdcpMhhAeOlWxPbT0F2EIOqQg35U01W49dGEV12GYetb\n7DFO4Y9nH+Tj52KIWHc/LP2CmOo6TJtPcfieTxjAbMwUIREJXEFj9+fEivkEFtoJGEoJ962E5nUw\nKwujRKkAACAASURBVAx1XQw1ljQqF40gOaGUvt7bMe5+g673xuEaWkHc4b2I5z5FTQsh50pEVlph\nz7ew7FZwFcGYZ+F0P2i9ozfd46MToaGL0EtrCBjDMBgjEJtOwLoBSIEmEjI0nPxOxFGVRHL0F2Dp\nhLBM2PUYxGbA0Ntoq9qMY8SjiEffIXi6Bc0lH+HV3EWM3YWwKwN2PQmeVFh+EvQGKLyV0JYuOhGJ\nSBlLUqeAsHs5KAL+hAS0PTVEbqqh4OE0LC/EETH/NwidhxDiB9OV8D2+uhNYvhiGafbTeOPvxdXQ\nhdYBYfoeAm+G8LaNxZZ9PzqNATx5YLoV1G8ABbyl0LYNIuejaBWCYzMIBU+gP7kLyTYVbFWQ0vsu\nqV4v6rnTiMNH/w8PnJ8hP5N0Gz+TbgD/SpU1gj6whvcWVswYBhMXQ1Qy7NkOJ0+CXYK0Wf9+fqAN\nLv4B5NsQolsRUi0Q7kcYsITWs2VIXjfiwIUEZ4uUXD+LSDLRTQ5B1jwy8r5AimhDyNsL2nCwpfUa\nW1QVvn4eutth2Ew4sB1cByC+EPQyyAmg9IPVJxE6FNwT7mHdZYMw2VwsXL0RqbiKUHcs2txqxEA4\nSv+FiA3LEcKzIXr6v/ddkmD85TDSD7lNCIOLkIQZhNR3EP3J6PafpbVC4bHWj3jxFZmkXa/BhF9B\nZBqoIG3dSZ8Zj3OWrQQVB5rgl0QdKaSn+yiaSBuqEMQ28gjCU7eDtYX23OvJT23HbGhlQHEJ9i3T\nUZJL6HIew+ePQWOpwlxxBAQB1amCIwbL/lbUISeh4wuEsn3Q8yW0noetjZDlhLFhcP0fUbMXscca\n4uORAo6WLuK2n4HwKCzeEEkrl9KxeyWOgckIzYWgxIKuAw5tIFDXQv2kZlKKrOjmXkvgWAHeL5rp\nMtdht3UgGYugwA4GN0x7CKq2UVN2gHVzkxjU3I1hQC5OrQnr0PdQOorxdu3H22NGe7QJW76b7oR2\nIlfnQWsbtJdRlh1O1h/+hPaqRwjte47XZ02l/8ULdA1KIVVcgE7agSi5cAVKseQZIfo4uPtD62FI\nWgTaMFRzHEH/W8jit2g1D6DV/hrJdiWULIL6z0DfDAETyvIbQYlAHDoC1V2EumYa5H0ESAgxg//+\nXCj/IH6SyhpL+MEz4d+t58fK+5v8MhP+f2HLCzDvib+0PCdkQJsEpmaw/DmowXUBLjwKgU6Es0lQ\n/RQsa4IiIwVOA3viq0mZl8qsV7tpMuzD0mYke30VwqXXgb8M+eOjSI++BXnL4WItyG9DRRn0mQ2b\nn4MB02Do5fD6MkiJgDkPwoVxsPfR3rSYyWaE8WF0jJ/MJ5HNXBJ9MzVVD0JBGcKgoQTKc9CEvBB2\nAaH/o6j7P0NIuQkq9sLJ93qfQRBBHwR9OdTZIf4ZSI5E1zAM12CZe0+/RKTbw7rpO9lZe4HM6b9H\nsEUAoDocyEjo0DL2kJ+u1l/RNdpBkXEJjE7AL35A0roQQkQ8vofv4Fz9M0j+7xhRFEB3uBMWWiH6\nGNLRJtSjAo7BxxGPBwkk6NEa/CixKiFfK8ExNkQJRDRoHAqCvR1BLofFEeALh8hwaH4USUpitmk0\no7/9is6IaNpS+2BubcU77TIcxlrSf3cIGs+ANhE6vwVBRVV1VGQfIeVcN8Kx1yEyHeNVUQS+64M9\n52N8wevR5kbD/j9C32zo/C3Kc59y6N6phAd0OEY+h1J1C3oawLQHecp6miJ2k/LpWZoLZDjsQym9\ng45rpuH86BXYvZbc3WHIiV6kr//AhqkLKHdGEtfYSOSqPkjd9yIlJSNXNKMsa6Qr/U5stUkI8hZo\nP40KyAe2IH63HG2LCeHyO8C4EYxmVPkTlMk+1HZAXota+zbKWA1qeD2BDStQXS70LheBMaPR5eb8\nf0VH/9fyM9F+P5Nu/ItRsBViM2HEYsjb2pu5Kiy2N+l6pgbSkuD0IuSO/fgigpg+G4Ww5EZIyofa\n31HTmcKpAfMIx8DsU214zT1EbKtHynIiXL0IopJQX4W2/BKiLOMRssZCiQRCBmy9H5SPYNkHUHyK\n0GfLkSaPQMhbBauaoMAF1REwoT9dpha6RQ27Y2QuCa4nQm1ADS+j+wodOrUObXINvm4X3lEaAnH3\noo9Mxm6OQbJmQOqk3meVG6D5BhDehu7XQOmAxn0IkZfQtH4P1095htwOI/pZ7xPdvYbiNQ+QnTwd\npixGlDQQyIcdlyGcKMI2YCYnNu1DjvuUjCoNHbY+JPac5Xz+EtriGshZV4Fd7oHI/lAnQmtHbw6G\nmF9htPZAjx1Sh6KPmAylxwkFd6FbHUKavgClz+coXekIreEIVYUgx0H0eMg7DjExEGaF81dBWQyO\nxiYc1xSB5xbkHV+TN9qJKV8h+vhybL48bAW54JwAI0ppuDIT69HDGAxW0DbDic+gNBv3+a0YZ0r4\nXy5BO2Qyhth5MG4pnLyXsr5RxHkFhm5eDWNPoTozCBn7oO0OIR8aRLJHQmOOIuI3Mt6OK9Auy0d8\ntBlGLYbiYwiBelSioM5Iu7eFu9ftQvLIaPvaCF3iRn63A31tB7qyzwjID+PPqEQNnkcTNwRZvAPt\n4qcRTcuhexZMW4jsXQkdG1HbArj0V6Hr3IuuopFOUhDb/Ih1DromzKFlSDhZ8gysmv7/zNH1j+Nn\nsg7wUyjhWcBr9D7SB8ALf9V+DfAQvXHXPcAdwNmfQO4/D1EDpYdg5BJIHwIrFkD5GdTEIEJ0CJo+\nAzUcsSsVv7EU94uFOCUHQuc+vq8dgz9HYMnJvoizlyB0L8ZiSUQ+V4G47iJ0FcCKu/AawLuvFfXM\nfISovnDPBrglG+pUGOaBDx+CUfPwxVdjev0bhJAKY5LhjT/AqSOobU2snmei3lXC7V+9R2RDM/Ss\nI8FhRpQVDJe/TGN2COsVyzAlabD09EG4MAuh8z2ozAOtDm57HqS7Ieo9kFJgwSeQfynIEWBNod/w\nq3BrdXSM/i2Wqk8ZbC9lYeQS1p24BDXyHTRKHzTZdXC2H8x/lKZmF5W3fczYA7G07E6ma0g63Rnj\nsZpOk9maimAsg24N7CiFxEHQeAx8r0CcDWI8ENsFWjvor0U5uZ2ukbn4xwvEa4Yitm5DLEkG+1hI\nvQzSZsC530KFAA2jYdxv4Nxd0L0BFk2Fsw/AsW+QhsQwfmcn6vavqB86md0zhuBbPJzcoiqSrWV0\naqvJSuiCPLE3Sfzhs6hlJUQ6eujyzceSOZeuRYuQXr0Bbcl7tHsvcnzZInTVGsxjp4FwDm/8KHo6\ndiC2CrgHDSLV8DLC8RvQh2Wjv+dlrB2dBFcPpfvLr7EuuxbBBdr83fQkxjKg3UB2XwmCmVD9FXJ+\nBGVDTKTetBFTv5noTv+R0N5a3JfsJGCIwyLuQRISIDcDorvwua+iK7Eee0M7TRFX4jgqYyhtBlMS\nEYmJUH8c4Vg0zlnzSfFkgtn2zx5d/zh+vPb7v+m+H8SP9Y6QgD/+uTPZ9NZd6vdX55QDE4ABwDPA\nez9S5v88zaWQ9/nfLiF+zUoIS+zdDouF5/fCHctRjBJyTRIUHYAzfoQHjiL4LkHXHEtD12JWW4eT\natMx96vj6CbMR/PWI0hV55FueQIh2oLy/ffwwnMw+2EY/3sc03NRI58Hdx4Ea8CWA9GpcOgixNaA\n/wE0GwrwSRLKkkjosxWVx1EHfEh+51oCmjoWbDuFLdxOq+qgdbtKoNoMdSrqqzcSOLQS7VgzhjVO\n9J0FaMZNQ65uBqUHHN/CxoGwpgHyzoGrFQpuQgnWE8hNIBRhgiP3EKy6E0uEh5DjQcTO91EVH10j\nctC8ex7hkzNoxlWgGjSQPZyusosMfuhqIjJH0O+S28nUT6C8q5WITTtxr4tESc1EzUmBOSIMLexN\nkZnUB2wpYL8Lsi/AufFwyQiUa9LRO59CmPUYjJ4FfRbAoi2QPRvagvD2r2H5d6BVoc9A+HwZPTU7\nCIiJoLsVThRAgx8q41GP7EOelUP86DFcXuhiwdY8PJn17M8cR2xhFKJehdkvgqKFfC/uVD2aOhln\ncRLGa64k/OvFaCI/Q2ldy6mMURwyZJHuL4RAE0qPHu03H2HLr0MX04mzrQFv5yqY/TjUl4EoIYWH\nox+YjajT0LoqD/myBwk+9Sk7rprI0AtVCG+cQDh0Ebrs6Mq7CS83UZOV0Pv+BYqQdAHsZddj2Gan\nh7F41RfBmQYuFeGUxCnN5Ui+MJK/O4G9vRxxaghx3tPgaoMYGeYmwgs3/f9LAcOP9Y74IbrvB/Fj\nlfAIoAyoBILAl8Bfm/CPAF1/3j4GJPxImf/zRPWF45/AC4Oho+Y/t8fnQN25f9/X6qHxHELqNGrv\nSEPt8yzsOkTgchumEzuwraol5qMyFn25g/SLJ6E6Cu4ZBQMHQngkVK9FM3sqweUPobbug4YTGFZe\ngyXVhpQ0A/S5kDcfhmSC3QwfnYV7yqDvSyg3Z9P49lAY4Ie4yxB2yWCZTN+q49zT8DGD5o9EHDYP\n18gYpDgTnhoth1dMoP1uB05DC1KfMHx1sVDkRrB/jXqhGoZfBns6oa8XRglQtxoeS0Bd9TWhTjdB\n9xcoVZ/hBw46J6Cvj6REP46i+NV0K5N4P+cempZ/jqDVIETKoPmCwPJh1Lz/FEPGS0i+M7TFPEli\ncx3tE3rQjZ2CcayEvzAMr6YAb9l4lC2psF4BTR4kfwgZr+Gq6KHm4+dQZw9FjfKgiumAQJtvJ6p+\nLogSJA8Dx2DoscCsBTCuGQ4th9ptyDoXex4Op/jMXainT4FVDxYz/pULkS9NhhMvotYcQsg9yQDr\nVOZY3uVV8XLKXSMgciF4+6EM0aGObqd1eTL+NVtpbz2FJk4C950cTRrNhcSFTBWHMajfO6hiBZ41\n/QjNnocyw48/IQpr+Lvo6yN7Q8P9zdBeDfWboDUfy1A7zl9NJfDESOreWUK/8/lorliO8s7LqNOs\nqKoVIXko0W0mYr/ZAGf2IohBxLWDEOq16M0d2NY0ITe9hrd1A2rtAXwJpfSrH0VPZGzvd1lQB0U2\n+H4bVFai6uZAWSGk5fzn9/x/Oz8uWOOH6L4fxI9VwvH0lnv+N2r/fOxvcTOw9UfK/Mcw/yWU9ja8\nz0/Gvfejv2zT6nt9hVsqevc9naiVB2HerdiPWXD5v4OJmbQvHIzfnkJIDtA1IhX9uX1QVgMNJahN\nRQSVW/FPOkrnrmJafrcJOqpRa/zw1R/o9Icj5jbAG06UnmbUrbEw+gwMSQerCUp2g9eGyZtL5OFC\nBF04rmm/50BaBr5yCev4Z+H4daC1o9R8hitRh/2+mfhLmjDk2xF0EZi7Owj2acfnbkOtT0JofBVx\nUBGd9jjUJ/ZC892w0wjOTbAwAEvnIhmup2fVDKrW1CPJWsaKMqbwdPq1uynjEPkdDip7LLQ6VDAH\nUD/QQLVIWZ2OQYMGIOQp2I+PRvIqqBEXiSEDnxBEEgox3vEi2gFZ6EIaxPIClBg/qj6IqsvgwooV\n7Bs6BkemiDJhH2KLlkqfgWe6kvmTICDoxoOnB165EwqPwuMfg6ERSt3QfgT6CjguWU3aliCudCft\nCSZkP6hzbyJo2IgaykMdFoLZfjSVPgw12dBRw/2b3uMVdQnyc3fBXW8QCgvHlK5QM+W3bHkqC+MD\n8/A1b+cEpzjt6EOEL8RchuMt201baR+6RrZS5Uml2HwLZf5UDqjvscteymbzIcpHxcDXc+Cd+cgX\nusDQjWbPy+h+t52StngqDzshbgCqegZMDTDDCpcsRph7J7ZP34AHJkOFG25ZDmdFiP0DosmJZVcr\nhoqzqP4jGC76SWypo9mkhVAJxEVClQKbT6F2ZSHI34JhGNzxyj96hP3zMfwdn//M36v7/iY/dlXk\n70kAPBlYCoz9kTL/MSQMQHymFOWxNKTddxCquhtN7BSY/EVvvtby49BWDZGp8MIgZKNId9XD2PMa\naLdEoJfjQBtF5fT+dNOKbKgld1QTtgM9qLMklNFOFEeQwDOdyPUdhE1yIjU2EOx0oLvFQeidKsRu\nP5SBSyqj6xoFVaOBGU0QvAaNrS9aWxhaQz714gT0mkI+4i1mZU3GW78MY59P4M1XYfxLeNrfoGWi\nA21oKtEf70O5bTP2P8iIkhad8zF8Q/NoiztGuFZBtRTi3XAl5ier0OZOhIoDsPW3KEO9hNiBN2En\nzqwQ0X4NwkEnmqeDhCamoz9+mtb3tjOiT4h7YqeS9tggMLVDtYo310TYlEoiB+WB0Y504GuiXv8G\n1bWOfmOX4tZUYLQNho5ShKooxMp8uO1xRPFtCNYTqPqajgPfknbffVgnxRDM+CNSnYXfO9qoUvS8\n6v0evjgOxdVwyzOQPgD+eAVUngBJC1GpMO4GaL6SviVpqKPX4u7MYccrk7lo8XNjixvdJgeBIZ1o\nm3WIYWlQtwgqM3Fkl/LgytfYPWoUM86/huaSdmgbxJBV68i1mxEnGPFv0LP/+WF0Gkw02mrwnlxG\nrL8SOTyeWKWJqOOlkHeOE+NyyRUziPNuQmsuwSb7oecCSsZUmhxFRA/dhubAa7Rue5QPFv2Gm154\nF2XTOhi+A2QnQnk2qE+B6QG4712o3wbfv4e8dDeq+WvU4g1onR5oFlCDfkIWAbVag3L2baKMPtSE\nDISUVtjthJvvQt33PmKzDPEXIfQ3lt7+N/PjDHM/WfLzH6uE64DE/7CfSO8vwl8zAHif3vWTjr91\ns//oJzxp0iQmTZr0I7v3d/AfQ43/TFBbw8kVN5O+txHHkc24g2VY99+MWFsE3pre4p4Fm6CjCsmt\nwxCaSN0NRnR+maDnBNqyMJSqOsaeb0Qe0Il6JAAtKtqZfmqOm3GsqcFg0aLpLyBNWow6dh7iE1MJ\nHm9GlEX8DSPRlpdgPqciHk4HUUATVYv+umO4dzcRCvWgJkmIaS7cQyQWyhsIP78Fz6BWrNeMR2Ma\ni/DqA0SlmgnrjEWTdgUcvJ+kJQHkzRJS4nCCRafZn5TEyBd3cfKmMAb2ayNitRXZXIhWsaCmjKb6\nhjlItauJ7ASrmozgdaOGpaGGFWL6/cPs3vgOGclR3PxIDom2QaS3RaMLNUDSdSiLS1CteThPS/Dr\n+XDT1RBpRj9ZATUBoXAdRnMLwcZqtIfrEZvdKJclIlmPw/l0gh1BTi9bRM4bGzEpPaiF21CCFh4a\nvIIlnnrGfnsVxtpy8I6AFbuh+Qi8NR5qy6HffGhsgptWQagYWoII5XkIK2Zi1Rrol99MVMpKtvlG\nMWnUAez6CCiPR829FzIuRTgxFGQ3KdNqODjhFop76smyBxCq26CrHq0sQpiH87deQ3RPHMsW/YGg\nVYepfxeSO0DQloI3WmHrDSOQ7DlcznA01KI/NhViZhDIXUowN45GcT7Bxiq6o63Yxt6Afe0s3j/j\n5+WZc5i96beIrT4Qx8CsZ0AeBc3nUU+ugvpK/BlG2sLz0HX68Q4xEd3uo/yK24hv+Qjrag9KSEDS\nG6m/NgVzywV0gUbUoUkI4XnIbh2SbhyqdBrWrYDrXwSTCUH78wtv3rt3L3v37v1pb/rfaL+9J2Fv\n/n979Q/Vff9XfqwjoIbeAt1TgXrgOL0L1MX/4ZwkYA9wLXD0v7nXP7ayhqrC/jWw5xOoLoIlj0NC\nFkQm9uZf0GhpUM+zjWe5uuMLdAVX4jnfRXd5NQ6nGWNCHNSegebK3oCGvhNQEwahNL+GUKGhc3IY\nHcM1nNEOYEz1eZzbu9F90o2aFaC93o7B6ccYDCIGQwg39gf3RdQmFdw2XLu9qDE2LJmXI659E9Vm\nRLhvMYTaoPkCZMsQ7oGULRQrdeyPCDGz+R2S7C8g2/S4z9yK7dlzvYUvESE7klBsFkJkAkHdN2gz\nrDTc2Ibz5c+xTI5iefAIt930OLYbHZjT4lF2nEfo8VMzOZl14+4jWxrMdE8QbctLsC8MSIQ52agH\nHyE4bjQfdg6iq7CTm77/jAhLN6LPRyAyE/2ke2ipWQkR5UT4RiOcaYQGAdLaURMGIGS6UMvLqIiO\nx769nvAmAeWhh1A0O9FsPkSoOkD+JpV+94K1ORK6u5EtAV658QlGiwsYv/IJyD4DmnpIGwWJjWA8\nD/udEL4Ctq6AwXMh5IWa3SBE4tMVog7vi+pxoahm2lPasHZ4EAMqrY4EwhIsiJouvFYNNLTSddrC\nhbgceqIiCBptLGosxPjWKbgpG7oPUpW8gO9aorjx5o9RUpIx3b4YLj4NsVdSXx5k/xQDI8Nnkdr3\nBlRVRW06hfjVDZBlgxFvoVS9hdu0D7nHi6X/Hr6/uJYJ+99Co09gc1kcl874FjHPiJr4G0RrOJza\nDN79ECGiGnpoGe8gaE0i5uB1qPGPQ5sZnKnIJi/6nU4w6eDXuyjquZ6stT6w7SUUHqQzzIB+pwdL\n/4dQTpYjNH1MKK8/2hdfRxo+/GdvpPtJKmuc+DvkDeOv5f0Q3feD+LGecgpQCnwO3A18CnwN3A4M\nA04CrwCDgfHAr+hdF37/v7jXPzZiThAguT9EJoPPBelDoa4UTu+GvZ/Dwa9wV+2jPVwgfk8EBq8L\nrVKDyRCDp72NVo0Jm18L9gSQqyC+AqGlCcXiQBk9FlN7AE1SAy7tnYR1DaRHX4k3MoBHltAnm7Cd\n6cA9MZnKX0djK65BqPAgOq0IMQZ68juxxXcjes6CNRKuvgPh8kfAcAFc5TD9RdAsg7oanNmzGa7J\noimwg0g5Esmbhnz2S/SOKQi1VSgx4YTuMqLKCs3DyvDHGjFLfbGkdSAfWoW26k8MbM8jOCuSyCgD\nwsVS1JG3EywqRanUMHLsFHI045C6W6CqDOatgp4SSBiD0NmBZOzLsLzDDCk6hLm1DdEksfSxL4m0\nDiAx/y2UwAVsxSak7iAhdxVC6kCEbVV4F9xAV5YdU0UBzh0dKDECpVuDtB93Y8o4grg/gaaGVvrM\n1WNK6AcjJBp7ErhzwZvcfD7EsL6jYf2vwOaGaAPkKyhnXQiNMTD4eVj3NEQlQcoAiOrqDe2dM4qA\nWo4nx8DxrFTKMh1Y6jx4+jvRVKWxr/9w9lvSCLlj8Zj1tAX0iH1tDHBaGVy4m9iUvvzB8QDZ327E\n0p1LW3MnGwYNZ0apwvrnxjD4xi/ROoOE4iL4fsxsKgbFc+lLe4morIHYNoTC52h47SvExkIYcgNS\n5hKEuhJClSWEwhMQ7N9zQrAzqKAahFZOBZMZsKsEZA3CwZMItjqYFgOZM1A9e0ALQsICZE83YuUG\ngg6JBWPW0ifsIDHJ+9A2lIAhAOWv02UqxGzoRpOYS2O/aVjXncRa68I98jzigLmIrS60jgLEwoPQ\npx9EZfROVIJ1IFp/dpFzP0nE3DJ6rWI/4PO7d/hreX9L9/3d/Jz+sj/LGnN7lLeY0nEZtNSgNh6D\nfR8i9B2Bd8JSjGseh1QL6DrBdRzUCNTTbahKAAIy3psSuJg7Fm++lhGFOagx3+D+7iyebCtKspWI\nlh6o6CYoSpTcnEzG490Yc26j9dO1RGpLQA4g14DQtx/CM9cjen4L9SNgXwvUN8PqcxCTAsBZ92P0\nb5VQksbRpdyMqcWHrjuAFHChGATELTpUnx/0RgSnHzUynM7DLgyyG03OIN4ecgn3nvsjhBIg5Wno\nMwS2rodpCyEhFRUF4eAzcPgjiJoAjnzQtkJZAgx9GPY8hievHhYPRTPvHBtN7zJq29NoQq1EnmhH\ncqr4+s7Fb/LgqIpF/eILfPfbMHzZAtNtBC+YEIoaOXMqiqTX2il9CPrffgmOm16C/GdQdB1sbzQx\n9vhWbOYYsFpA9kDnRdSRIl5tHEy4EVN9BoGNjxOYlIQ2yomORITqTvx+NxVT76b25IuY0syY6+zE\nRSdQUbyLwtRk1MgYvIYcipUOQrKOy7UqEwPz0DXdiBD1BaHmMSgRdr6XcllfO4fX37qPj26/k6uE\narTdG3AdjqVr4eNUNB8lP0aDzRPiaPJwLH4vCzdtZVq5AenBPyEfuZmLN65BSBtL+ju/QajcSqdU\njEHTjhpvI9TVgeWtGujuoSw8jT7eMgQzMD4eoUiEpP4Qq0WNKYaCGuTN/RFGVuIp7kBjjcH3XDdb\nQ4vZX3EdL53diW3qTajtq6gwf4muRsVqbEdDOuZP8iBKRInuS8fldYgaJ471EoKvA26thPpbwX0A\n4t8Ex8J/5hD8L/lJZsIFf4e8XH6svL/JzyRmBPhn5o7o6oDTR3trvkXEgL03PaWqylQIO0jUVyJG\nzoKyPMidBXI9mo339tbwmpAC/jOg9yGERMh6mUD/HYhaFanRTdTZAoLxnZiDe9EeFtEXdmNZaMF8\naCjS8SKEIoWAy4jUHKBrtAHj6W5CmDBd1wLJ8QiR4xEffRqxbw/E3ws+H5y8gKrphInTkF0rCTU/\nhE5/CkFzDEGvR1F60JTJqIEBhJKiEesChAbNQcjQQ+pKKj7ZgWd7G9QG0HVHos8cT4PNjCVrBfbw\nw+DLgIMboPoLKN0P1WdQD71Cm+cCBtmC0LcI9gFxHSApkL8Jwu1onjyC59WdiNbRZMeV4W8pJ3zI\ns/idG9BoJGjooCdTg2tgG1a7Gc07zSgLbbROScQ6/QSSvobwx1fj7XwX+ZSKuyEZ/fgsNIOvInTu\nNOqgwzhbBXTJl8M1H8HIpdBpxj2yBG9uN1bj5wjhowgNn4k/Ppkuu4MSewed3x7n1MI0TGIXmdv3\nkJyymMijX3GqfzYl4UaM7XYmxg5hAJHEeRsIrz1HZtjNxIiphLoeQjy4Hyn1bTT2FeAbT8aLj3J0\n0SRacqex12LkgphBSXQEh6M9KFIn008cYLivDItZx3xjOCPL6xDDpsAntyHOuQNjWB2SLZP2D97A\nduenXHQ0EF1/kJC9EX3XdQhKJYJfwpuqYE12I8brENRL4abVsPtJ8FQgpL6AcK4TIb0WoaUR4aiA\nRu9FmB5DX9ttJHnepyXvIoVREn3qnqAiLoGuVDMpVQL61hroUVFj+iBMWY0u+gY0DccQqi8i1Iwx\ntgAAIABJREFUGHQI2v2gEyB6OTgu/+eMyf8LP8lM+B5++Ez4TX6svL/JL2HL0FuNdvt6+OYTOHMM\nNBpUVUYVyuFGG+qhY4QcXyKdv4g8MxORMsT5CpyqhuYasAlQq8DqAELqXegXx6AMrkfxWhAsHjRq\nEKm9Cy744YIH3pQh9jToU1HHO5AfthGn/4QapZYLdVeSZiyHdpHAzIFI2g4EfTNS9DI4sx02bIE3\nttHe9QRazVUYa4xovAnouxcjFL6APr4SX5oLbXEFksaAEPsmatPtCGILknCco2vvp/VYC8EOGL/x\nN5i7voaOWmac7MJTsAjqG2FOG1x9GMqyYMc90NWNGOqDNW8L7gwVs88D3RJq82Sk1n2gk2HgdQhh\nSZgfeIr20aOxPfk4MSPcKMs3IGUIyENkvAeChPvPUZcbRm1IRvtgX3QWLeaNFyHpRZBl6j9ciuPa\ncM5dP5FxI/ZQ+fQyUqRGSl/JwuizYNaWo7a8Q1FlOFnfvYeaWYcq67FV34iY3puzwtcTpNB/nqDc\nQ9auVmKeKyLbuARZ5yF0pAOx8i2E78vIfuhZMgQzYV9toodkqriOVKObDEsd4epzqKEmgkIXqvUE\nXsObGC9eoM8La0meaSR24K8ZIvSgP/0NTvtQPk9rZmjdBabX78Nq8ILZx0L/ZXRqTHiUPAzZTiT3\naFjxIaa4M5ja9tGti6Bicg71u+6gn+zGELEWNboA4Ts3gsVPRHgHakAA7ePg+xJ2TYTFqbCsGbY8\nCPM9CI0yLnsfDI8IqEdkdPdEY+y/nOExYai6k7gaTrI3azySNZbE3dVIb/pQrtZArhn/EA3GpCG9\n8Qi+CaA9BjFRkLcHFhaC/f8p9uBfh//h2nE/lF+WI/4jrp7epDwmM5Q+Ds657BO2MOasg9DRfRgj\nBoM7CE2bYMHjcPIVGJULe/fCmnpo06I+nUPDkvk4N76KrmICrbeUY95/gRJHLoNOBRC2n0EYr0Jk\nH4TuscgnN9LzjBf7dzEImia8VT5a4pOpmTKaQKiOnP3FmMYPxei/FT54HEZcQCyzE4wxUniHlajT\nLmLymmn/UIP+9iDWJgs9d16KvsCDLvVRVH0C6pbrUJOm0Na8kWNPljH85laMiTbskTMg9XKwfgDB\nU3zc8zuWnDyDLrQdoakHJXw0XlM/ggU7UOoF9KYKfNMlmnbqSDcqaEaMRCo7CrIWahshqy/q1Zvw\nrvoG/2cf4nxRAlcrqsFMcMoiAn4dlloJVc2lIOV5Ug9dxBqzFHQeMN8IW+4gGHmer6MWkdC3mUF5\nHow7mmnI9NNo02JvjUaaGcHBMCODy7z0Ky5GaDuPGqPBtSMMxqRhW3w9bk88nDmE2a+DtS9CXhDu\nvB+mRcGxp/BXxeJaX4us1WL/ZDulo44D63HgIUgPkWW5WCz3otqdKGfmIie1EDomoNmXgO+Bfui6\ny2nvP5L9GJmFHQ/R2LetwRjuRzw1A27+DdQsBZcefCeQjzTRHa3B4DJgKE1HqDgBD7wJ2ijcm1+n\ncPcpBuYE0MZqIDmE2NoDGnCHTPT4bcS4FQgLwqgwiK+ApqVw91dw/ShUxym6D2mxL30Qiv+IGrcS\n5Z5FcBu4+kNTdDg6x2Ws9i6mO17ibv1ATDuHYK8rJpCehKH+VhhSBCePwSUbwd8CZV+BzgHDVvxz\nx+N/w0+yHFH9d8hL4sfK+5v8MhP+NyoPQ2QG1J6Gi3uhdjN0r0C34Aa80QM5FhdN5rjxJB14Ha74\nGHY8Dx4RTuyHvVWQOgxlWC3+xDqclc10ZsXhGiiSfL4MjAFatHpUTT2CRgudXgSxA7TfIbn8hEpS\nIaeICvNALprDKQ1L5ap3t2G2hNPT6qA0rgmneA+xV3nQekMohh60bQFSP/XgjRFQmpPQJ1RjaAlA\nhwbp5FYUtw0chQj9ByIbp1M49wG8ybEMebI/+osnUUMSwXQH2uSFoExCrvuc8ZveQ9NUSGdHOsaF\nQfz5Ckb7CUxxLgRnA/hC6Cds5UDyx8hLt5MbUQwzn4SESaB1gHQS/A+g3j8D7XQNckcbktuHMO59\ndLp4/J7PoeAgQtFbGH93PY05rWhO5aEbdBmivZn9IwbTXJXNXNsaNG0BtOcG07nicbyBQwzanEBz\nZhbbatdhsbuIeeNbmu40YfoYjEIMhlQTGoMIeRsxh/aBToWIOSAH4IqJELWHQMUZulfrkQako/1y\nEL6cRkqNt6IniljuxdQ2jAbnPhosa0jfPRdh7jHQqGjfikJqCOF9Kw3/gRDB8X8ij3PMYDZWZExq\nDbK6AbUc0G+FI+NA1wKb+4K3P5KtCUdzJ55JmcjdR5BTneg+XAErTyAP/JwBSz6n9tevEp3ehfl4\nFwRrUG1u9LVeyjVpxGSfA7cFNrshYSqk7YWvR4H3Fmo3nSdq3l5o2AiFrQjlVyEuDNCZrqdocl8y\n1pQTXlzFo+aX6YiJ45URx8kIX8b8d+7Fcl0T1C6H3Ta46pHeWoIAUZOg9b/3z/pfwc9E+/2yJtxR\nA+tug80PQMsFsERC/3lgEcF7lpakaBxHC0k3mzjQU4F9/ttY7Umw/l64/BX44h3okAjl/h/23jtK\nqjLr9/8851ROnXNONN0N3eScM4iMoDgGHPMYRscxj2FUUDGPo5gDKmYQQQQkSM40qYGGbjrnWB2q\nunLVOfePnnXn/f3W6yzfq87MXd7PWuePOutZaz/dp/auffbZ57t19C6JxlrVjgYPrlQbusbTmDq6\n0HTIdIRHoAuZsG7rRmRq4aF2OL4Ll9FInV3i7EV3sjktnW8Hz2ZKyERh3Unk0bkY954jrqeLwMWL\nKMkYT6siMHc7MGj0GOwG5NTR9GYH0e70YKjyIjR5hBpbCMWo6Gra8W5aScvXG4keE4duhIFWEcI/\nRINB46E+vQWr24vWOgflXB047Xw0ZQrGCTeQPu4RDEMOohl7P8JaiDi+ARGtIJfVEjf7JS4UVZPx\nbQlSyoX+1rm0eai6NNx6F6L7IUy6NqQWPzinwcfPQfpslsnpHDWlUTR9GQ5bGenFLson9xGSO3j1\nsEBqc7HYcRZNnwmSQngtY2kxfk/WqjOoF3rYcc9gRkbkkfXs5+ieSSSsdBzaJd+gIYSmcC7iQF2/\n9rFdBV8KROeBpoagLoPe5/bjdJgJvmIkeFkK3Wkt2LVJpLeaSTKtQScNR3T3EXz/MZqmdmJrD6Kv\nq0KsPE3wN9MJVPdQHRtPmGMfrQNOIIkJ5IrR4F+NLA1Gu6UY4Q6ipp1C3fshpEYhLv0Ydf7FqGfe\nRgoo6DRRiM5uGmdb6BsxDOX9RxBiCJbaIGHOw7R8Vo6wmTFMugxRcYT2+Wkc1o1ksKUC0eAGUxzs\nOwNtsVCfhBpzAEIbMU36AOzHQCoFyU0gWdA0No7UQx2E14xCEWl4bkqH1FLmnNAx8LOXINqEbHEj\n5U1AJLX3Z76ps/pHdAGYEv71vvg/4GepCT/Ij68Jv8BPtfeD/GrLEUpXF95PP0E5+Cla+SQEZUK2\n0YScNhTZCiKApWArZwdlENvsI2HOB7SkjOQetZu37U5sj+RC0iw4coTACAXXwjTC2k5DzhqUk1fT\nNSOWiFUN7LhpGqagEW2fTLUtlqtmfgB/vBIuvQoevAp7UCU4xMi2CQupzhnGKIfErM33Ihss4IqD\nA+3wp9chfTjoIvEXX0ens5fYC3vQZMwErZ66llKMPUFih0+C75sInNuHagvQJ3IpTzRgn5RFTEsj\n6ZXnCfP00pEehabUT/iSXs6nDSLYPZzIyPkkxczlMXGImWeOMitpHoSuATmVssZbGbh6HvSmQF8I\n4jupkJKI1muI+O1DcGYpinkAQf0ZfFOWYjqwAdm2BSpiYH4p7LkPUtdCUGJj8GmeyryG4dr9vBwq\norJrLg1hEfTuXMTlgaegNwd1TCIh7VaammzE26PxpSdTmtRFolVPVHEIZXo6JvEnNOc8kD8Omo/A\npuUgYqDlMAyVIXIUisNKaOs7hJo8SK0K3neS8IZ5qTAMpFGN55IPK9BnDYF5K0D7977YJbNxxBym\nb9ZQEj8oR703iC//jxguewYGRtOzdBnCeDsG6RY0QSdqqBiNpQRevRpVG4E67RiSeoSQU4fiSQdv\nB21mHZrGIHH8BiLc+O1OGpPLaB9rxdimJ8owA2tPBMaqzfh907HOvR/2vYtbf5LQ1rXoqgPoFA/C\nqoKIhrSBqNUHUaIEJMlI0QHUJBuqbSyibjPoBFJwDpR/hxqcRs99NvzycaI5jByMgWMfE6q7ESVT\nRlOjwsCHEIMeA0n3L/O/n8rPUY5Q7D9+sRTFT7X3g/yHJOT/WlSXC8977+HftQs56Ee9egVS6W60\nO/agb29BGp6KKHKC34PJEktgYCdItcQxgjtD37G0W2G5XY+ufguO6WkE5w8nAiOhVEF76jMYXXrC\nPvLQXRtOpSmNma27SGj3UBucANlaGNAF9mtQAz5OzbuOihFBFnz3NQs6yghzAp7BMOMvULwaiqrB\nvQ+qdoLfjq5zH4ldIZQkP6rYDQl3YL5jJ317J+P/9Aheh526YUkcvSwP81E30zrCGKtfDP4N0FeB\nWpRPhLGC1qsLUexuUp+uo/GlIAm7P+VY1nxyht9Kn04m+P4cQtesJOi8g4Fb54IS0d+S7m+BzLHk\nOBupGmpFbdqMdvIlWNavQBuRiW7zcrBp4KAe8mcQ+vx65KzTIOKhzMKs7qWc9Uh8njWeRRVRsG0l\nf7nZzOSoh0CTAL/dj1BV5K5txPceQ1m7nO4H20gK/ZHkvx7B9fseDL4FaM5+ARfOw7JiKNCDYgHv\nSejRwqybaEq6jOA1FxM/OBpDZD0hvUAXkU6f2kRaWSrjth5CjLge5j/W/53oskOXHWZPw/baLiz7\nDsInXxLqvBP/7z9Cn5gC7mp2y3Zm6MoRobUoPZ8g++aDvRzcbkTSYITmFnrCV2JxfYbGEAKvg9iW\nMI4sysRd2ktG3rt0bZjDgVFLmKCZT1JiIorw4bTuwB4Vj9/0Plq2ET7+Nozr6qm5Lo0uIrDYu0nO\nW0783m2o9s2QEIQ4IGUK5G1BChyAE7/DY7NiDF0EmlMQMQP/zIUY9h4gLPtrpGAlxBshyooU9SgY\nl6McSSHY7kVf+CMCsBoCdyWYc3855/wXEvoPiX6/2kz4fxt9bCzivm/BFt0/sHPHRki3wPrZEEim\n3paKT+ojy1JC3wQTFpuX8tWDid5UT3Sena75iQQGJ2Js7OBs4XyCdScZc+Iw8loJX6IGzcL5BAuM\nhC58TffBUaSNnwdbP4YOJ2rBApbenI2px889Rzej6dsFrmkQNxZmL+vf4Ion4erbIDIaelrhubFw\n92ZCNa/RoT1L2FuRKNHpqMsv5nTwM9p6rBjONzD82x1w6XJKMzoZ9vka+mbfQVzqQtzaOlyHFxDT\n6EEz8jXUjCvofuq3NM89TUSNQte4e9G21JF46C3qk7J4P/EPTAq1sXDj3+B0D6RqoMcCL35IoOZJ\nGisbiRmSjuVCK7gaIDIESX+Fqg/g4rfx+uehN6xDlPdB6XPQVYZao1I3LYZDpYMxiyzmTxuJZG4D\naR+kvQYHPkYtmonLs5P9wRImPfwNRmMzvuEGxLhh6JVRYEqFow+DPQ2+qABLBHxVAk+Mgavf4usx\nY0g8+w6jzy1F+cpP0B6JHD0cjALh240UIQidjoC8qf3/50AAdf0aiLQij9AiTXfBzFtQ9Q24m3zo\n7t6JPDgeJXc6mrvfI+S9C8k5C177FLHtc4i1wqCROBZdSfHwz5lam4bU0g0HIuAKE17fbrr83QRO\nhGOraMGUMQb9km/6tS0Aek+g2r/HHumghW+wWzPwq71IwRCmQBwDi9sQTheBqCxiUn+Pv3YpWs0h\n1PR5yIkbwdkDnyTRnJNBYmIcVWYbmft8iLAr4PVH4PGHoP0sJCTDyZdg9D0o9ieRpLsJHvwSdcrH\naMf/E1mXkBfOXA2pd0HkpF/WKX8EP0cm7HX9+MUGMz/V3g/yqw/C3BbfP9Hg2lf+ca6nDg4/BZOe\nofHbdUjjc/BHPk/S5gNozg+Aj4/hv92A0xdL1LkslBkBTi0eghxIYuDWT9F1lkKphBgYQsQtRPGa\nCCqrkU/okQf9Bk6uA60EFwfoqsknIpCJ6N4ESV5Qc2DoE1B01f9nm6rzAsprc2FiLmLQvUhhUwk8\nm0fX1y5idpXRZrkJi3obnR33k658AXvvIzg8jlBgMw7bdQR2v8exRbcwybCYbvaS6p2DcqIGx+NP\no58yBeMDd1JRdTEJPVZsujk0xGVhO/IhK+Iv5q6KLwnz6aG0F1ynwOzoFy6Kn0Cg/RQn5lkZVV+F\naGuAoX+G3R/Aza+gKB/QHHacGGkzenUYbEmFuAX4W49yciLkvtpH+IUWiPJB7iDIz4dNx6H5PL45\nt7N+RiyTe/KJ12bAmw+jHt6FmHwlPLmq/1XkcyugbB1sqIBgCkSlwUWLoHYNy66+i/kn/kx2bQ1e\nNESXXoTw+xAiCGc3QVo2KCVQeCOMvBw1PBp12wZEzXbEZAfk/gnsD0DcVXg7v0L3oRXXGQnTtVMQ\n1+RDqBpJtwyohQ1XgnoOyk0EewQBWUJvNhJq9qDtC6HcEEPPiPXo14zDO8NKRGkHoiEMQhG4hkyh\nIy+LrugQqvM4lrBLUPp2Izz7EW0qWc/78P11G/rKVWgzr6Quzo2/9a+EbTqNZs7vkHRrsKoGpO+C\niM6TtOXkEjfsRZo0rfR6TpD/wHYI18F1N8HIW+GTKdAbhMJy1JJMxLhwVDEDzzsbMSzfgBQX99/7\nyYU/Q/0KmNb9H1G2+DmCcG/wx/8dYRr/T7X3g/y/B3NKCBJzIa3oH+fOfQopk+k+XINn5wHCFw5E\nfPQaxq6LkA/tRRTFoEnuplaXgjdFQpRVEFHVQXpPH9ruQ6gtibiuSkZjGYTkSEAp+QbvsDi8uiSk\nzk7Uu+9FmqxA+hqM2vGIkrPQWQvDfgc9zRC2GeKvBdnYvx+PE/H6bahL7iCoeQVVrUdyj0P9chMu\nbTf6SzPRH30G7acHkSMEPbYGDDXr8Q8/jjbmESzhD2I59DrJbR6qBrhIFb/BLdvwP/ECwbIywleu\nRO4pIapuKw3DrEjh2cQ2rMF49jRJWiuJl70PBzdByATZMyElBrJiYMsR5K5yYqrbwNaF1KXC2f0w\n0gWynlDZTAKaJkwfNyGtXQe5MmTfiBIzEk3jZqItsxHFR0EfBSY7tLfBHd+jLvgLXw9xMtV6BXFR\noyEiEUQvImM4fPUu5KRBQhqcWAEHfDDeDfYE8Lhg3jWQnUz28QdYPWAJ477dQ/DGW1HyZmBoDcIA\nJ1x1F8RaoNYJY3qhtQxR0or4+n1ESRlo82Dx06C+Cp/nQd8+5DYn2oJ03HtbkaI2ognsgMpd0FkE\nE5+A2jowD0R0n0JOKiR4qAdtjA/+5MFeJxPavA1rtBkSJaoTE4gwWKjPVOjKiiKi5gTJ7RZCllZU\ni40U/Z0k7H2XyFcaoNDNNncD+X2nwHmEcM8RzGoKh2Iiic65jh5tBtZTm5Fd5wnpx7L38svIsd2A\n7dhu2p0nCan1WG1m6HDCnhWgj4DFL6DGNhHKeQmpTUWkeJGNbXjffRFp0gGEchbkCQjx9/CgqtD0\nDuS+BOacf7WH/rf8HA/mHliqQ5WkH3U8tzT4U+39IP8hVZF/I1NugK8eh4nX/ONc/S4czny61q4l\n8/336ZDfwDpqGZolt8HsiZB1AbQDyG+X6AmvoXuMjVhfHuJoMeQPRlV70BeuoqfzRaK+6ezXqdWa\nsHRpcFxxAUPnR2j0i8B3BPKnQc5f4PtTUCZDRztkJ0L9s5D1PPi98Mb1cPky5OQipF2vgb8VZetE\nXAkTiRjrRFd+JUqvgdDY6wnf/QANVzfTlygTpj+FpBkINWch/XYsPTvwhRrYW/saSStbyB4zjfDn\nn0M6eS+0rUOytpPTvpwK7Qs0pkYxaPHn5Ox6pl8svaYe2l3wl5Xw0TUQfQlUr4V5WvQWF2qsBloU\nCAccwL4iNCkJCFsymssfA7MZ3psCEyah1ZuIqHkHUbEfppph0FME4vaxMTuHFN8+RpiWsJCr0apa\n8FWCYxccex7mFEJeMjxwA1xzP7iOQ4EfzkXDLIE64WV49wFEQRBN5lwGXjiOvjseU8xfOB75MIOr\nNqIfdSdi6FVwbh0UTINxE0CzG4JlEMiHsPlw5VIw+MBgA4sDJT0J9bwf0VqM8dFkPEutEN2GLu4o\nzL0PXqyBsGtwjx+Dr/YU5o1taAt0qMOsNJosiN5uwvQu5NN1WFq0xFw0FHd4HBm9Sfi0l9E49hBd\nISdJZ5yYQ4NQ48IhMAzZfY6gp5HRI/ag7tcjRCUos9AHBJOP7KK15wzNnmQaQzmEIguZ9vJmihZ1\noqzaglxymPy+IJ0T4gmKLjQ+M7S3g2YwvHErIXsvobapyK0uRLQZaUw0hvEJeN+8gP72YtTQBgKa\nZhRtEYb20ciRMyBq+r/HR38hQv8hOeh/xi76+fdkwnoz7P0Ixizu/9xTTeDcHpo+PkrmSy+gHvqW\nHs+HRL3dgUhKJSi7qXIIoqJSUKjHF+WlwpXHoWu+pKi9DnXNAejrRpPchv5vG0FuhUgnmkA3yvgO\n3O1mTF83INUcRVQegK5qaD8KZhfMfLFfDyG4APZshOoWsJ2H/JGQ0e8AQlER607Cwr/R98Ez6C/y\nIBd7cRfGIMbcgabDjm2XBoOtHmlfOAydDOEx8PwdhFrLsbSdJWXpfqKn3IrlplsQxx+Bhi/AFgOZ\nExDnNyPkwfRkJqJaI7E6osBth0/egz8+Cil5sGlZf3ZU1Alx3f0CMwu7oXYLdLdCIK1fW2JkBO5Y\nCZPlCtAZQE6GQx9DbhqayDzErnchyUPTQD1fpyukei2M8cVD3xHk1jfA/hn466HbAqSBQwtHSsHb\nC+VloE0ApQXm3Q3jl8G+Rai59XAqC5G6kbwXytFd/Rhi4BhUexmGI9/CzR8gSyZoOo4qJaLqixGW\nQ2D6EORXwWyHgrugaXi/VGl7OMGQE/mYB2wupIQ+dDMfwLexDbXZiube76GiGCKOEwxtQ7/Pg7a+\nGTHjekJz/djWOwi3t6DJ9HLqogk0NEYSscOESg/VC/Q0mlajFT2YRRheTSkOcy1OzWnYW48hYSGl\nyVFIWhe22BbwGhG9XgLt9dR0SrwZuZSNGb/nOv9REivPYqrpwLi/B2VTHWqLgrj4BnSDFtOaWIUp\nQoMc54WiKBhXT2fIiu/ibJQ2H7KcgHLbcOg7ha/DgmZYPVgeBtWB/qQTyXUYjJMQ4cP/9f75A/wc\nmfA9TxhRkH7U8dJS30+194P8emrCagiaX4O2j0HxQs6bYBkOsgneuwWueBZ6HARemEbzYSfJg8cj\nx8XTfmUQfVsGtqG3EooM5x32ccUnm4i88BL+QXo80YuxbKzGUdlF+J+fRH3nOsRJNyLFiJraB3aB\nepWKMngg0ssVnH/6JuL9U7GFT0br00LzWdh3O3gkCFpAyJA2HuILwKOBugcha2n/JF8g6NiC9OUn\nBLJuwLt9G1KMFu3JZ/CM1CIMk7HV1COSIxELIuGtXiirgnveok1uQ/vpI5h1LkINQUzzJoMa6A/0\ndzwLnW9AMBoyX4BvlqPqTTh+cwk2aRg8PhpRUUvwixL8UjWmKj3Kwb+ixn6DIlSUketRIqwoZ+5B\naTmP4ktBKmzHcKyH3nkDiHKOQACKkJBOn4CsKahyAqxcRd+ULmRtHxjB5POBZQQkPw3WcbD3AGxd\nBa5jYM0FdsF5FTpdYIuH7k5wB+G2FFAFaBTUUDtK0E8oR6B9GMSTy2DWn/GtHEcocySmhiAseQ3a\nzqBufwKlrRX5Rj2UXQ9BE2rHCtRxGUh962CzDnJ+D2PvRb1lIL4kN56xyYTFFlI16EZ6/vw8YRYZ\ni17BN/lSxFvPoZujQxqZjNHZitVnRkqPgAM9UHAHyhcPU5YbhTOikPj9h3DffxeJGYOQhRELE6B9\nEyg+WFcO+UOhuZUacxnayK0k6TWoLcfBIVg+eB15tSeYX/sFclQbmgs5+OzN+Lu7CD6WRth77ain\nHNjn/JHIxvcJbPPTesNkLANGE3N+A1ibqB1jJOZ8O3pnFoFdjWgv+TOa6bEodbGEcq+iXb6f9j1D\nGbrxIdSnn4G1tyGuuwCa/9+YCXcdnLwZ7AcgcREM/lt/eekX5ueoCTeqP36fycL+U+39IL+eTFhI\nYBsDhkxQPKD6oXUldHwBvbVQfxDf+i/x9Z0hcsGTaJ54GabPR1R54OrH8K14mT2uYxQlGkl1Hcfj\nb0Onc2FsqUI61o2REGpkGEFjE5plj0LHUcRluVDUgjM1GX34Fcgpk4k6WkX1sHpsPge6UCNoasB/\nBAaPh1O7YUg4pDaCr69/rIq+BD7cBFOuRTWY8egfQTfsfeSEFHSTJmOYNBtN31nERQMRbQeQjroJ\npjoJ9XXgC16EZtg5vKvWoB4/hB0rYToFQ54bIbdCUw80d0G6AoZkGPQW6G1QOA+hNaD/bDme9FKC\nnmJ8BdG0Dn4PL4fwRXTise7GFxUkgJZQynBUSQH7XlxhXizbojFG9OFYNRhlgQ6lrZnDKY+jt5ix\nRj+P+vanVEl9HBtuw+TqJaq9BzQm5NRFkPAw2KaDIsHj98Jz70LTEbjl9f568JSBYGkCRQ8hBQqC\nkOMGTzesDsLE+1Cz2qC8EzzxSCU7QW2ie6gO65gVSLoI+OohiEtD7FsGnjDINCLe2Qm5wxHtKsqo\nOETjfsRhL0x7CDUxFfYsR3Jn8+k6A/uPNdA5zsTBuYMZ8tIWNMVNFGcFaFo4maZQGC3WYUTHH0Mn\nedGGcmCrCdoPIdqbiS7rJDmqmtNXzED7zlHs23dSmZFMfFQeWlM+dPphy7fw+/uho42+vq94NXkR\ns8prwdVCb3ISs01vkefSIz9fgpwFBFW46wOCx1ZzZupI0taehVkmXrzuWqaqTQT+8DRONaS7AAAg\nAElEQVTlo0tpz/KQbi7DtbOITmsPEW4PfTGX0ji1kFPOGr6JLaDqXC2Fr3xHwFZP8iOfo4kKIS59\nCbHrQTDGQPxwsO+H6jeg5m3oK4eIUZCyBHIfBY3pl/Ph/8LPkQnf9YQVFelHHX9b6vqp9n6QX08m\n/M9oPo3rhRvpqLWTvNiIZuggkG2EbKORenJR1r5GU1Ml637/G67XlKJJuh71qcsx+T0In76/fyUz\nApoi6U3tJeyOEqgqANMFQkej8StODG4tYvAgaK5DiRtAU0KAGHkWhuJvIS0BYnPhlRVw/V0QpgXL\nQqj+ABzl8FEl3PEh/kFOFJoxcMs/9h70w5qbCEwoRHp6OX0vTsdcux/Z7EDpCoOWNtw7ZXbPnEh2\nRCWRjYKoE42IZAnJY0VEmfqz72AOzFwOlv6X5EO2IE7pEXSnOzB+sB+RNxrl6ncIWB3oz62Dc8vB\nJcNBT7+0dXQSjvs8KD1hhFdHQLKFnm2DCdx7jBixGHflm/T0monKvZdicwVJn67izD3zufjjN0An\n8FWZMFzzHIQ3g78K9gUgqEBNHTgaoc4OqSkQ2w4NHrjsNfhwJQw9D+MuB81oaP0ONAUEO19HnHSi\nusKRezygMeHOisXM32+n3T1QUwwaP2rAiXqdDrFORuTNheYy1OcPo5woRDoci/uq6wixE8Mze+m5\ncQKB2KGceWM1mkAnBUt8iLpwjH+uQU0JI/zya+D0epjT0l8f79CBRQcHzf3i6mOvhg/ehVlZ9M3s\nwZDyLf5VE/EtcNKSnsB+6Q/Eb2lhZtHNGBMy4dwZ1p1ez32LF3P0wdlEXawBOQbaGqEhCgxe8AdB\nToJ4E761RwjYorDMKOREoZ3mPVpm7NtF8Cj4H5yAkldNZHsTN3m+Yuyco7jqwxlXtZnIunRiu/Yh\nfD1Yb94K5ecJJT6F9JcGhCYPVn0PxU9D4iQ4+mcYeBnkXw+WrP92Is2/gp8jE65Wf/xbgZmi5afa\n+0H+XxAGfLW19F2TiXbWKKxLXiLk8SHnDGUTHzNT+3t0L92J+OI9/FdcjG58K4FtKcjbtyGN8MK8\nR0FeD6sqIU6iNy4Ky00fIPs+gQ4Ifb0aVXHhvXYsFp6HppNQ/AGBxbfREXibhHePIjr1/ZmfLwsy\nxkBKFiQlg3sFDF8IdSmobS24Fh3GLH+G4L+01jR8Ar3LUPVVhEJ63NEarPLTiNalKFt9BA0aAvjQ\n+/x0ThpK5J4T2DNskCEjwgTaqEswBaejv1CFdPZzsHoJdLrxZHZjqipCM02GNwSkSqjOGsR9e2Bp\nPrjNkNsFNVpIv47AFeOxK48RZ3wVUfkyfKOhT5eBd8p2ojV/gCN/xV6Qyo4JueStOUPe9nJEihHH\nRSrG0wGkviC6sATQpEF3PSTVQbSAwzIU26DdDZMyISIEbc3wche0lcOz18JT2/onQawfCV1nCeRE\n4DszAq0xC63yGaEWI+60kYSJOaAo/cfOFXC6EdUcQH3Ag+K1ItcnIaIHwIIXUGxVEDiAf/sBlNyL\n0b72NxzP/gmftQNbaBLes1/ha/wapUPFmhqL7ByCdfd+mNPRr0S2fQB07gWLCXJf7J/Hu+8TGKDF\nW23C/VA6Zg/oM14lUPY6vpjtNMdE0aSW4xGJDHFeSkLnFva1tfHssKd5+a4ryB2bAb9dBYEauPAA\ntDmgIh6mSqiHTqNsbEFMl5CmP02vYztuZyXm7h70B9zIYyci5e8hWAbHt8zG8rs2sj+MwanZj0kd\nRjA8BovhawL6dPTeRJDOg14gnZcgEAFjhkKkBOogOL4Xeu1QMBJUBdobYdLFMHkBxPxrXnf+OYLw\neTXtRy/OE3U/1d4P8uvrjvC64Pv3IC4TfC5ovkD36o1EZsSgU+pg85vsvyiBvC4tBqsNvdsBOjMU\nFqFDB831aPtcsHA6jLoY7GUwfSU0zoOjfszV7Th2LiZCuggubMA35RoaEo+RGDsedCPgxEfQcgzt\npnVEzfkDnQuriO5yIIa/AsIL+huhoQpOvgUNCpw8DO5jcHwT5g+siN+9B4tuBN3fdfiaO1C2R+Mb\nNp2e1O2EvAo2dR5sfRqJDNRQLyZXBb3ZEYTXnUIzKpeo2+uQlnmRg8kEFj2MhwM4RnWijBqLGjiL\nuaoG645cJPU0bPNBXzIU3UPb5yswbMhDo5mJ5cXP4e0U6JZRRw+g0/Q3YrSrEN0vQigc8q2Yuj9A\nezYc5gyh8sYPOaJ9j4ldh0nIrkONlpBRMcRbsU9wEfmND1XXjeit7Rer6UqB72uhAMiIhpGToOAE\naGeB/e3+7Ct+ILywrz9o77ka7AL8FkgNJxgYgEbKQbjDCcR3oe2shuzsfpW8jiqUwSMIuQxoak8g\njAL17Ey4/D6w2eDYe0hd1SjpregNgxDr10FJAxFns2gcVonlxCFMO1fh/yqcqtRwitsqmXWtFnwS\nWCJhWyyEW8A4BqX+BOLUdpTi3UgDu0HMoP4eH7HrHfinN6Pr3oE2/0403EEOkCIC9CnnUfbcjntS\nOFnt5aRpPGRffhO07Ojv0TWMgFAyVH4BcbH0WjLoiDpHhkmlI28WsUY9+p4qDM4OdEOegyF61N0r\nwC7Q7IQhabtoaoxBampE3JqOO6ydwBkb7vRoTFIv5zIHMHhzGJpsoLoVVXUgejPhfAnYWvt7ujOK\noKYCdq8Hgwm0OvD7/m1u/X9C6D8k/P26MuH6UvjoXig/CKMXwqiFkJSLGpNBYPcKuhwnsR7fhjbg\nR+PoQwlPQBOVAxfa4M7nISoJdNvBNgd8MfgOfoLrxLtEDrkWAuvAXYu6vxt/ZhTalDBUYy8ECmle\ndDfJ0jSEMPXfvlXvgfWPQYQbJbaWjqwBRA3chuaNcXDbERAGODYLIj0om3IJuhMI6V9BP+ElRM7F\niPB/ZBuhP42jo07DmV2nSVylQf06El1xNxGDE7AObQCLG0fmYvRRi9GevgyDXyL4pUxvr4RxxgCM\ni0ZCsBPv8GH4nF+hLzYTiDfhTS0HvJhbZ2B1z4V1z8GN8fheb6Gy3IpwV5Nx6yiMO3fTNdaCbnAW\nlqgy8E+Dik5oPIAiQUfKNPTzV7HZ8yRDy46Q0+tE7urFN6OVc77J9LX/hlEZKXSdfITo7l50ujTw\nNcCo++HDDyFzCSy+F1oPw5lXoFUPxVvggaOQnAptB+DQIyiuEPS1Elh4K5LjDZwRv0MfPgSj61m6\nNW3YjtegpiUgxXxBww0PUbvhJLIR4jLMJN8RILg/hDr3TYxjpqGLi0OoIdTvbkccfh81eTRiRzl8\nWIXr61GYTtdBpgEKxqEGS2nr0LPnxRamXxlDlKGPYMsMNMnbUQMKgQ1+9IM9KGcgcI+EOk7liGkU\n6dW9tGWEMbo0DvLfBn38P76nK1dAhATjjnN2WRNfvv4MtwS+JLzsXbS596E/44Kmz/Gf7mHfTZOR\nwscz6dJnoKmXwLYbcFlL0ZdaaQ0YyB61BqWxEeXrFUhVH6OabPjlTrw5EhFSD6hJNE0zkwC4u7s5\nFSpA7+tBT5CqkbdjFMlYi78i3DEEm76EsHEvYSs9DUe3QFMVnD8C4y4BdwiKd8OwifDQiv6g/Avy\nc2TCJeqAH724SFz4qfZ+kF9XEP6HJQj4UHU6GjlHBYcwtdkp/GQHpiPfE0rKoT3NSIIusb/lytkD\nBh20XehvF5t/PWTcxnZ6cXz1EJdqw8D1KnQrKC4/obkCOfsJxPc7EIfKUaf8HjHriX67PhfuvhfR\nN0cjVz8DI1fjP/4uLt8xwh6rQFp/H0RNgc6NULsC9fSl+DZsQp4gIw9xQ3QsQns5Ag20NcHRTZBq\nJZgxAa/0PZYmBbVb7e8QsIWod4/AmjwLT00bKco7SEkqoEU1mHFu9aObkYwht5xui41ww2qkzFmw\n7hmoexQ12kQoV0ZTeBjagNP3QvTNcHQf3lNv0m7Kx08lujlakt4UyIt90Ckg3AyGXnzOXBwhHVKc\nEZfSjGHiY8SebQLCCU2Podn7BC+Yr+aPWxrIOPYWwaFmvDlabL6BCMc9sPVhePLvcxP3Xg/efPj0\nKahwQMY8oBY1ugXCk1DDBuOPKCGUcgE1xkpvWCS2pHkYAwHsmhqigrORdr0Kkx9AensD3k4Fx9Fi\nwgZnEppqQ1O7i+aVUfhnXIu/rQ1VUWhSnCT1fk/qZV7CzANA6yZ0wYHkCCBueAYq9tK4wYSvow0R\n7KPqMgeatxoYdHkG0dmnUVrNeD9NQB6cii5qB94rMgkYPOxPHkWhVICdraSVTCcicA6Gru5/Oafi\nPLy+HO5vBjmW0kPjOTApjjENH1N4fhdq/gI6O/x4KktxDZlO8pilWHu9KNcNwJ+XhWtZAuEV5XSF\nrkDa8QVRVX64eGp/rd+aDiXPUZuqIWlnAlp9E7T3ofjtBGcb0GY5EadHcH7KlWTvfpDe/OsIdh+i\nNzedvnVxOKaE482Zw1zNzP5r0tMJ614DWQOZg6C6GpprISUbrryj/67jF+LnCMIn1B8vWj9MnP+p\n9n6Q/4x8/F+IEzttopIeXSud1JNMAeO5Gn2cieqbh+Nfch2huIEIBAkMg78sgTsfheMfwv4V4KuC\nnt3AbWyih/pxC7j0u7fAmoYyvgHV5CPYFoZ8tARh3w1XPotY+xaEF0H+JFj/BMZDb6COE6hdExAt\nz6OZcw9y1SHUUBDl+2+Qsl6A3KdhVyrK3QuQJ+5D+Ws6crQMk+ajaPYhdusQW2oQhQPBocfVsRl9\nwVhoPoqqDxEIE3TpC8nuKoXYYnBqCOljYHsvaowJEevHEuNDGn8B1+E4wqv1SH+ZDXs3QdtSCJcR\nmX9AU/IuHCkCy70w+k749ibI/CO+Mz4iBkyg9/IQ2kfKaIoVJB2PRE7vhuxYUAcgfDasB8/gvPRF\nUpw2xNd/hokPQ9EiZCGI1x3gL8eXo6vWoIxLIlgKphOddN3tJXzNe8gzh/39otX2B6iskZBmAJ0C\nCccgIwumPUPIuxZpVTn6b8oJ/caMu3AiWBQ02lsJqN9gRIss305IH4B3lqNmzMdw06MYHp0EUV1Q\nW0IgLZrEYT60SU2Ii+dB5jBeStBw54ZPMFmeQ1XDEedsIFvxTI7GlHMXFL9F8s1XwvCPKeUCVvpI\n035K48k30Y2LxNWsR/tgH1EzlhMq+Q3GtU2IwdPJbpcwZtQTEaXSlulC3luLbVs8jD4KTz8IL70F\n3mvBfAkFo7w0eJrx6jJojSzllE1PQks3RcfPg3k2HL4E1dNFMB/8Vw0iUnoH4VuE7synNBUtJqpg\nJMy4AkJBOPs4gak34dKtx1tRB+dMaDIHIFUfQ6534WmIwJTlJE9uxb/gLJ6Ti4kNVBBjLkDOuRR2\nrgFzeP/8dIDwaLj+iX8414R/oSP/DAR/ueawxcATwEBgJPBPxZl/uZ+q/0AaKWUtT3CQz0mlkDnq\nHQyq6EH//T2oX4zD3vkVAzSFVHsPkqsOhsZqsEVA0kBY8Cw83Q6RNnAcgKCT2b3nWNCxETU+A7r1\niLI+5E3p6Br9qH1VMOYdGHQ/LCqEz2+EipMwfDxiYQFl36XTXaRFrTmD9NIUrDs6CS4Zjk+yQsAE\nF2ww4TKU9j/hGzUe7Zf7EX0gffwy0qsHEMs2oOa3o6TWoGQk4h1jRf/VMZSuPjqHavDExJGY/zs4\n7oQNCvgzCV2yGn/2QETRnSgXFOSrZIR5FaY5JSidTtw3jEbdsQaGWUFKhW8boWYOHAwHo4Bn50HW\nFXDweWx+FfPx10l430tsQi5JSYNRDTbU6hC8dxaO69Ae3IuuoYWYF69DnP8UZo+AIZf+76fpsvIH\nIq0erGM1BGLfoGWlgcZrbkAyP0XPby/gC+vsv3DnVsDA26BkK6qnHbQumHATXH8QkbYATdjjSA3l\nKEuGI7QhtGUnkDSD8H/xJc6jq5G+OIDr1t8TOB1E1jqRtPVw/CEIi0O5Zw+VNz1D+5QCgvOeJ3TG\ni2qNQj26jitfvx/DhUNodtpQjDWoOU6klgu4orX4aIKECXDycSh7gxOOtQw9+goJceUMGRGH3u7G\nPLiLQChEyPMUGsd8Qr4I9GVbSdKMIXpfJJEVYzBZj9IxKZ+AToXnBkK+AHMtiHaw/hZH3FQK2neQ\n1r6HmoIUJp84QlGzBUb8FppPQdkBlMMtEBmJJeF+RO27cGgXlTOewpUnYGjH3zsYJNh1CLfLTUeU\nBt/MUYh5fagVBwhl+BCpCn3TVNRADax+G13xFGylYZyfcAWS6UHILYB3tsHekn+fA//MhPqVqH/U\n8T/kDLAQ2PtjFv9q+oQVQrhxUMBUiphDGLEIIYEtHQJ9OLoPEWYdTlvrBhKqThJ+fhti74uQKkHt\nRvBWQuJUiAsH/9dQuYmq0Cl0NSZyxz6AOPAiQidQBxipnHE5SqgaS8H7/QFHnwAH34GN66D7M9Rt\n7Si13eiONaIz+xE+gegLoOnrQ9PYhagNwLHvUNNO4PMZMOR+hSwiEa5KQvkzkc65EJEOsIQQUjye\ni31Imj701V14XXr8YfFEmiyIvZ+AEahXIHEAktdKsGUfmrDhEP89IvsWOP0mwtmBqJTQaA/hPluH\nJqAgukfAk19B0Rg48R3Bzlpq4uZTsraYeEMNPbdbUXo1GPWjEEXTkKRWpEHnEPk6yJZhaCJoCqGl\nFFE4D9TzMGAC2Cb2B4Wu84iauQifStCi0rYxk+pP1zDokZXUh54nYrcb3dHTSHmLEGfehc2bwHUe\ngh00zJ2OIWYqmvgh/WWl9+8i2CvjOliCZpqPUI0G/9tOxFWj8RSeJzx1KMZE0IZXInwmRFQ05N6C\n3XGQ4zn7ia2rImlvEzKTUV58DunRv6KMnMuhMbOxSL0kd2xEmeRBWtOJGq/F4+zELqqwdOxDdvXQ\nHmbCnjiS/IRrwN6O+P4gcqUXjdaHa1QCLwRvZpS3E13sJRwr6CTjy2OIvkT0tkwCUh1KVCttDgMi\nqGBq7IbgSohKwx4+m6Mtf6Lw+LeIEa+R5Qdt4rdwrBucdhg9AwZNpXT4QJyGbqI3v4so3g6BKCoH\nLSEicSExgQroeg2+PQJ7vkI6X459eDTZ69KQmYHIzEXsP4NaqWJQ3KgZMiJvHuJ4NYacJqwbK3GJ\nSIwD5kJdDWxbA9fc/ov56Y/l5+gTvv6JpB/dJ7xyacv/xF4nYAeuA7YBLf9s8a+mHCEhk0C/+Ij3\n2DH8Wi3a3Fwkg5H2/ImU5PYwszedMu8R5JibSXONhKP3wp3vgbsEetZB0AnR81Hb/kgwTItDzSdG\nU0JoYyayCmLos4iBEKfRU10oEQdwcAsUb4BGGWZ6oSyHwPixVJ3YQu6yz+ibvBXzvkPIygI48i5i\npx1SouB3HtS0F9FbEpDpb6VRw1LpDDyOeVgsuu4UykcNxBAEW98OojY56Br/W2oNTQzbvgcRcylo\nT0NSBqoxEXq1CCkOOeiCwSUob8qQNhMpJhmOP4QIl6FHQc0x0L7Gi2FEH+Hb3gKvG1QXJfqFHHz8\nGeauXQuGtfQO20PkKS9q8QWUqiaIqkKKdqP2alCSI9Bkv4GvYhc933xD9OhkNM7dsGtd/54AIi1w\nPAex6yTSbdEkXGTHZLegP3wruSMfozznEVJ8ZqxrhoG5CJY8D+EpiLfGEpN5G9XGL7B5giQ+8RoM\nCyHnp2IWU3AMqcdyyInthssIDswgEHQgXdgFaix4FdQMIwG1krOOZxETMhhrfopAzHaI2IA0/1pC\nLdUEGoshdgDJZw/SptShhuvgmyA0Qf34MUT2nMA5sAK1qBR23M6hWCPjO1Lg21nQYUUNmQj8tptA\njIb4vYVcMyWc+1JHcmvKKPrEV6geE2L/O5D4HBHm+QT8z5NUXUD75dNxKFYyLryMWO1AKnqF6W0H\nkdwKhlWfo8pBxGwNKK3QFwVnnkMd/w3dzW8RqbOC/jwkGiH9RuK++IyUuk7IKICJE2H0ahi7B+2a\nB8iMeRJx+0TwdcO+3yHmLUdacTdSDXhlUAvmo209BwOnYZz0Ab2+zYQ9vx9p2FA49E/jyf9V+Pll\nHx7+WH41Qfi/oklNpXnOHHxnz5Kw+3u+GbOKBc3VBLvrGeLvxeTNggsrYHYEnL0JAvshfA5U3wWd\n3yJw4dWeR2+OJ1t7Ab8ERh1w9HHI2o7N/RxpZ3Px7L0UQ6cDYUqFkbEQ9ht45F60D40lM8pJ9OQJ\nqDs/wZUVwpB1CZpgFnx2KaHrfQSz9fi+fJSuuAICYW8TNBtI2r6PyJvt1A1LJaRdRre2kkS7C0vp\nfjSzvkF4KyhqPgvhZwh9vwVi8lC9PQjNedST3QQ/KcH/rBW/uQXzfj2uKSuJ3t0MMTKkxiHiVSyB\nduR4hcCqXTQdryYsV+ZkKBeNVeLSfftInDCB7mA9yasFvm93EZrlQKo+j/ADfaAYBKH6m5GSQQrV\no3T6kDs+gcIhcK4OFr8Lh7bChq2QBVylRw7LQgQ2EZ4RBZnXIdtVcr+XKLvERtopN5YpH0FYTr/i\nXVQ6RutQ8r7bhb/pfUK15/FdsQRz9CzUpgr6Oj8g3NmJLqUB/4ntpHQ0IplDhDxNCMlDb1Qczdn5\nRDc0oEtOwq59Gr+uHL3hGC7faDR3D8fT/Q7WUyUYm7PZNfk28urbydxVgjrMQJohA8+YOaTsW4a2\naDdebwJORxvR2x+CiVWoYU8Q9K9C1QZxlmViGnAJA9e/yevuYxRHTCUwuwDXuDqsajaUP48YcTlq\nhBV/cg3Z97bjy2rEm6rB0NVJRNkK1FYPoWQdxbu/In3wOBLqLkHE7IV2Paw30ZdVwcjyOoxWPfyx\nHjbkg62Hww/+gZi+FExfvwvvvAa91XDJB4iwVKJLgzAwBMX3QPLt8PFbiEHjwSJhKN+PcuRmPM8m\ngP9r5P/F3ntHt3Vdad+/W1CJQoK9k2InRfUuUZLVm2Vbki0XWY4dN7nHVtySuPeSuMVyibstd1tW\ntSXL6qJEdRaRYu+dBAkQHbj3+4OZ981MkplknMz4nfmetbAWLtbBOgcH5zx33332fnZJgBhTB+5Z\nHZii10Pcp8O629JP6SH6P4d/zyd8Zu8AZ/YO/ntf3wXE/YXP7we2/D3j+N9JwjExJO7Zg+ONN+j9\n6A1GvVNN2N134Mt4DzXQhNJbg9TcBUtyQFsAu/eCpwkyBbCtgP4SzEPl5BdX0peWQqTaR59Og9Fn\nQ/7iAzRNnURMTWD/va+zr72U38yYi3BJIXhehcQMQrFawhuD8NHVNNZVEmieR/SIX2He3oz8CxMB\nw01INivmWd9giX8Of+VRxC9fQFGSUXebCVvSj2336+S0hhFo3oq6y4nffAWm7DGo8mFCMwWkJ72g\nVOM/Fo3U4MSHmYYnc4jK9xIqU7HemoYt9XLIswMhqH0TpHIEUwiDRof+kokY6ysIOu1I5S2YR0/C\nnJAAgNl3Fa64PNRlVXgHTqDPAbFVRBBVxLx3CdrN+D9+G7G6Cn12PCHjXESjCXGEF15YADXdkGqB\nyEhIm4FQ8CSCayeyeBu0tsCeJ5AumkbO6X2cK8ojzdBBGFnDam4XvwYn74aqTWjHFaI2+NA1fom3\nZBuesVqMO/0IM26CiJVIHz+GeFsxft3zeOtU+jWHEBLzyTK8hFz1MWLO3cMLQqmi3zmdOo3MlHe2\nkaj4EHSJyGt2YHCdIidtPlx2FXh3gf1rjImrUN7zooQv58TNDzPe0QZjEiFqOsJgL1KpHwXoHGkm\nyl6LXLsfOVbPhEPfMJg0B8Pbx2DUIhjdidj3OXGhafj15TBZQBfjxllhZuA8H6o2i4h8B5JvARPn\nfEFHMIeunbuISbMjlotgtGHOmgA/3AspS8EQAcuOQfE65NIyKK2Ai+8gZNYR2P17tE47YsMJqDgF\nZjP0t6M6dqNMz0C5NpNQUhDqBMRzOoRmB5oqK2K7hHDDGRyNRTRFvkVsbAJR7a2Q/LcnOvxU8e/5\nekfOjmLk7Kj/c/3hwy3/tsn8f9Q4/neGqP0JumnE3BJk6LmXCTkcWO9dSyD1dcTBneianMgdCsLX\nQL0KN+XBtJsh4Urw9/PaUCtXPrmQMJMLFahujyXm/LEopl4M9mZ04hS8YhjK3m+RG6MwXJ0AbYfw\nucM4ujWOaQ/cwnUvT+Ye/z2kT29CymtGtF8AZV7UsDrsNdU4ZJmYiQHCNCrBXiNOrQnrnAA+2YtR\nTUV1BhFK21BTCwi1nqM/zsypORdgVrvI27sHSZiF6cxeRI0HJvkJFWYg+HsRGhJhQjHCxyuhoR6S\n/RAvQfRs1ONttEaZCevdh6UpBbW7D48uHH9bCwT8qOMysFyoolpvpPfXT5J4eStUgyAsgdhUQte9\nyAGeYJx6DWH7boTy7Zw7mIucKZDdY4chO8y/Z1j/9/Q++M1GaHmPPvdWTNrz0DWUwoJF0C8RzFjE\nuaGbST+3BqO7ChwbwdUJRxXQJkJCO8y7D3fONXQOzSbyIxvMX4v1vc/gutfxZ6bQ5ZpBlTSLSe1d\nWDb1IiSOhslrIG0ShHxw7AlCVb/Fnp3O2VFmpvwgoV2yFVVjwd/3DTo1AMYi1M2jUdPGE/qskb79\nVQSeXsL3ozO46mwIUZDAdxY15CUknYWtAxCTiXOsgXCfCaGpCvWQB98jCtpP/QixCkKDAOVhhLIj\nCM2/Hk2CGcGwAaUlSH1WHnJXOSktTYQiFqJaHGjHfU/omzsRdr7JgD4cZdKjWA68RCgygJjuQp7/\nIlLMHNS+Uvp+czPi2JspvuVCnId+Q8KIlcy0e1F33owSk0IwsYZQcipiTApiiwuptA2xKwxBroEe\nEXXBYzC4E+p3Eryhk+OOC2lVYjncOI+4mDFcmzyOyP9GG+4fEaK2Vf3bpTmXCbv/M/3tAdYDJ/69\nRv8rLeE/RQxpkAyGF18k2N6O/fnncfX0EXNVFrLzGP4yAW2rgrBOhuhmaH0U2h6GjN/h6JRwZVkw\n1nkhUiLR2kPTx7vJe/QZhmYa6VB3En1yPNpr17Gprpy06iomp5QQqhkEfwjqNhgjoF4AACAASURB\nVPLWgqOIbV7UsfVQAf2uOga2NtBjjicycxpptl40rk6UKAGN0U64VwuHBvDnRqBvbERsjYYBC6Gl\nD9O/KB6XQWXK0RewHmkDkqBhG4gGOD8BvmlBMMkEfohD1+eD4lXgaYZ8PyROgZPbcXd0UlbdSe64\nISyaq+nsO4XPPwXzyFwsD09Dq/4W+o9B/iFCWpHoJb+EcFCFBEJT9AiH3ibUsBVTWxI/5B9l0cfV\nlC2cwuPZ9/Heks1gzB7OwPM9BC874ZdvwOAp6K3AZJrNUM9XKOESWk0S0ojFyG2V5Hxv5dyc90j7\neAhdrQs5YIJIB3R2Q3Ii6sdncZYtQvegHtOZMrpMT6MJD0efVUil+iGJR+KY7ClG7rUjfBuABflg\n3AE7HgVvNeQvRDJlEdXQTQY+jizNZJIcQI+ArvMQOP1QdgfEu6lOz0R/uoeQX+L4nIvpVez4pVr0\nDTsgcQpq06eInX4AxJQerHYHfbYkolz9CEMiUpUN36wExE4FXbgJritC3f8ewtkXEORJ0NyL2JlA\nZn0UgfQkfHGDaA8doG1RIh91vsuNe77HHJtFxKQa3LvuRyocREwVEd0WxIYboElBiTwf7eguxIL3\nSWzcwgj1DGa/nxAOfIsi0dgV5GINXdpwEj7cjSgaES/5FPvqZYT/fhTCyWMIgx2oHQdADeI+chvu\naQLzdjsZIb5JWEkRT61LIAqZa9UwIgUzKirCT8qm+4/xT9QTvgh4CYgCtgGngMV/rfFPadb++wR8\n/hRKkKEjS5D2lKOr7oELMlDz25EMyUAW2L8F7RSwBzjWFKCgrhyDw4NqFFBc4TRVQSDJRO5sD2q4\nGx73ELSNRNUZOKtR6FtqYXJbMae2K0z6uUDgcBRabS9SZBDvtyYqwyeR3H6YmJnTEfInQtkbYOyF\nqBSQ+kDxERJS8Y1soT86kcSSPlT3FESzFVVvJSjrkVteQW2XCKpRaA0deHrN+IJeTH4tsimeUIyA\nlFYELZshXw/5N4I6iuBn66hqaCf7pmy04hWw9zO4QAfHVMgNg0gdpGyAoAvaXwDDJYRKbiVgNiFX\n1qIEXWj2gGpMxTFPT8PcQlqEW/n00z7enLsWoyEfKk4PyyGOCkDgIzj5ILSVQcJs0MWiVu+CzAHc\nQ0ZErxVDKBai4nC7PJRd7CHGfDnpd38Ag8dB1qM8tovOWx8gsN5KbMp16D75OYGuCIKJZsSbNqEn\nDh9fE+QkYe0/h9jkf+3P7KqGHx6Hio/AptIXPwfnVC9NqRFMYANh59bB3hpQuyAyCUd9HT0fa0i9\n3M+Ha69hXtz9JCnR8NHsYQU0zwl6r70H6/vfIA814J09gdaiFqSgSOQHQcz72/A/YEFTM4QUoYEx\nx7E3PIb58OfINj30hYN+Cdi80NiAur8YdDrU6S7a9yfw3u3XMLbXztToT9A02dCaRVR7K65mM9L8\nhbTp+8jrD9K+vZ0/PLiBuxqa0Q8N0Le9B1/lWWLTWtFl6uHUUTy/2U5pzCvEsojUXX6GvtiFNmIf\nuph4UAdRbe2gqgScGoayL8QwWIBm12+RI+bAc59zyvMcjbpjIMYzzX0HsUPtqJHjESTdP32b/iMs\n4S/Vv8qLf4aVwo4f299fxf96S/hfwW+HA1cgH2hCq/Mh3hCE7FfBmgq960ENokRMQQ2VIAWWMHFw\nG8T7wJoNpW5IaiPNKHPy2yG6TotY4mR0YRqEjg4Ck+IIHxvEkwZ9GVYyZoUI7h5AX9lKpTsaa6Se\nBGcHY7sOIKR4ELJSYcXlMPQ+5C4EzQRInACRSUifF6ETAwx2OLGcc+CP7sR5Sk+E4SAG4wBqgow/\nZRqSV4/a7UDvd2IQU2HCfGj8GunCO4alH9V+FEYhKCMRNlyEnFtAwQIVIm9BFT6B8wfAGoRCEITF\nEH4naDNA8BOyaBFOXYoy9+d4HikmfM6NBPa+i5QxiFjVSnj+S4yuuZmGTB2vXGnD2OOHmtnQXwWx\nChAF3gdg7vlwNAXOew3qTiKcOkYoysjgiPHoq08ipM5Fn5qP0OlCu+0H2uZ/Qqy7Bb0mFsEwhHtn\nI16hHO8oC2qnCyFHh9YwGa0aRHEMEbAcxM9OTPweEv5CWLwtEcRmGLsChs4hDzaRcCQLU/gSSn+4\nkMLREZjGF8HuA6A7R7UjHc38cKTOoyx97zOiV14M+2+DhPmoq+/CtykWt/wNwUvNmH8wozvYREyv\njtZxWkwf1SBOtCC6DbimZyEetmEaisCS9RJDvSexGkZD3X74fBNkDMHCWIRxF4MpiVDxx0TcPMjI\nUSZ61HEcae9lfMHPMXVp4Oub0GiG6O34ll2pN5GuX4oU/zi/OXA3nD1F55FxWK59hNisQRi7Dlq2\nQc4qDPYQE2LepZvvqZ53lhF59zB06wF00Q4Y7EXNGQkDZfj9Ev5bv8R4g4QcbcDbd4Y278Pogh+T\nPRiOcMDCs4VfEeMdBEM4vzTn/T9hFfv5598s/hb8lI44/3sqa/wL+sth80I4EUPvpdmEjehFiBs9\nrF2rvwxMl4FxPl6xE3dFOPreTtBfA9p4KBiFEFGKMPIKFLmK8LsXc8wfRt9jczCPceGbGQRpEOtZ\nkeaRNkIZVxC9ZyelL/vR5lpIXTsVW8kZxNkqQpsNodEFo8cjZGyBMU/CnjqoOTosQD/+Eoj/BuGY\nD7Og0jvBQmxFA7YMCf3NHyDPvByhdTtydR9SWwVCQjKCD/jlN7D8Rji9Azp2gHgE1QFK5xDn0kuw\nRQ8gjO6CEWOhcRNUtIOQAEOJMOZdhOR1EBYDgkDww1/iUSqRZBNBpRBt/Rak+FTEJa/DyV2o3f28\n3zSCwoJTZLjqOZU1ncSqs4itZ6C5H2JESF89XEvvqxIoH4Bv34PEbFD8iBPSMAu3oK9xIdji8Ze8\nicdWQXLmXBLf2o4i2RG8gyD48TV8T/i4ZAzOaMxfVMHK2yBBgpLjeCP34o7fgpn3EPmjGLmqQmAI\nzn4AJ56DU8+jBrpRBzsJVQSQKhoRjtuRf/ATeKGEc7+2Yn69BbkjHqGhBs92N+2v3M6I0t0YOn04\nm5pRVj2Jx/M1AykHUEIdaJv7idpRh7ZMQLSY0TsEIip7qbl+BLqcK9CbV+C1fILD7MPSex5iQg5i\nQIu0dyNoPBCfDBELIaOT/rXv03fiVSpunssI8QC5xbsYc7qVJGGAHUmFlEWnkp22GM3x38FACF9B\nHlE7B5E02bh2HcE4YgDz+VPRmRKG04xnXgORuVDzOUy8HlHUYSYbUdDRqduA4YuD6NIsCENOgqlP\nEerbhNgjEzZlCsG7n6UhpwmH3ETCiRoSjJVE10wkpnAZCw7fTmnCat5OiKcj5GWWZEX8JxLxPyJO\n+KKHCv7mOOGvHq78sf39VfzPtoTVILheBnwgZYB+5XDm0L/F4Zfg1FOQ+zxcfhkOniDady9QDs4b\nwfALkPNBisZQGsIQPnN45jqaCE5MROipQ1pRRaDjFcRWH6YdXxFz1XK8TzRiefo4ss4Ivq+ozvqc\nsKFaqgmiTLiU6Q9uRuiKgJNOSJJBlRFMnaiJENr3EWJXLmLuFjj5DRj9qKMuRn1uHWqPgBgzEY24\nizC9GX/2PAy6ymHpxEPvoza3gltECAkQPQ/ieiF3Iqgq6sJ5qMXHUC1hiDV+pNHpeBLgeGoBYz4E\nXW48nClBbfch+MwoYw14fG8Spp8AQE/DB7SN/I4xJZV4rVEMaj/HmF6EdswtSCW3oCzMot4byfzS\nL6BDjz5eJO+zrZyccRmTOrTgeA1EBSrfAcUCbgc0dDGwZB2mrCkIYjOqby+ec0vxzrYiZ80nlOKh\nKmBmuvtB1CYtsiEFYjtQtCMoe7ERqbGFzHfOwD3PglYLgQdQoueidB3GwO8QGK5Xzreb4EwJLE6F\n6i+Gy0rNeBah5A1QB5HGyQgtIBoNdGZfQPCL7aR+MUTl+hTyytsIvGXCmumi216CO6jDbYuix9dG\n/C9nYRR1mF8KgtiHGi4gZIhgVcHrA6MdxRJDwvZGNN7XEO+vwmCox284DSlTYagX7faPQGmF2FUw\n8DmsvZegXyFwZhnxLgdJ/jhQ44YF7EUDBqWUyzq3UG44w7MmE3eYwgh26sg+cJih19/CenEREddf\nh5izBLw98N1FMGHd8EGkNRmC3uE4YTkGABsT0Mn3Elr5GUMnuzDrVcTP1yKlKzjM0LGoGW35fFIq\nJQy/bYf3HyFQ/RKVuUOE9G+RsPor1ukXcwMqbQRwEiL8J04v/8S05b8LP+1Z+rEQZDCuBfsKCHWA\n0guGtSD+cVOGglDxynCNtTFXwJQVwx/jRdRlg5oC1h3geRlcP4Ntl0PqYpj5BLhb4XQO6lA6fVMm\nEi3o0Kb9mkMRC8n4YC2j9uwiOD4fzw/PoVt4D8VjPkL3ZS1JLjdDkzKYkLMGvt8FnkEI6OHS50Hq\ngLbHoEJEqPURMNejyxJRM/SoniyUP7yHeroa6ZHH4epbkP8wH/3CSfj1szDYx6HeO5JQtgOpMBe2\n9oItBMuvgm9fQPU1QNN6VNs03IcjCWvsREgZD8lu4uVU2hx2xKguqNoC/X6EaathZBDRV4uxqRHy\neqG3l+hDZUS3N+PLzUDKXU+cJgk+vRjcFahTWzhQeQmJCWYS2ivoe9WC7b5OwuvBnNlOw+AZ0pMC\nqI0WhJXToCkZhDIYE8LeV4fwwnJq5hZCwErblN8y8tPPseatRXVuY0CcQrHXzLSevZAZgm494tLz\nGX9yN/Le8YRc0agX/wIh4AIhH2XyZAxfdiIuXguBADxzH+j0sP5RaN8HBisUXEnIdRwxaQqCIRL7\n6CJ6T95ASeFoTI4dZMyJQZ8WJLtOwSToaalPIP3pBhZu+gFvmoHIsJEM5BZg7RpALN4L7U2AFkHW\nQZQI+gAMRIDTg86chpQ2FU9/KerXjyFfcTOm0A5C/ZuQPn0TjAZwGeDkFlCB47chx8QQ+3I77QsW\nQ0czCXsyYU49RLSDJhlS3mGkMkBO1Xj2jzqf0kIb4z/cT3KLG6u8G6HMBaPXwqd3wPnfAw1wZDUN\nWfeQGJuBdvulEJUA4adAN0DYUAyhLCMdrw9ivDYHSSnDm5LBYL6HjNONiL0JyKu24r7mRXxJ22lK\nmINDbCdLv55YzSIARASSfyJJEP8RfipSlv/ztSPESLDtAtt3ICXD4DXguAdCzXDgM/BmQsZiaN8J\n+66H1l2g/vGkVzAM+2IdwPbzQNDAvFcg1A8NU8Ebh+ZUDlbhVnq5mwPUc84qE3vLWXyuaFomu+iL\nO03vzjzCXe2kbY4hamoRdeIZqgJfoN5+AkbGwJ0fQt5k+HonzDIijFMQchXEMgfB79sJ1Y5BzV2L\ntPEH5O+PIt5wF5w6AHGXYe4tx/TA63DbBNQwE/4cI4N+D46XMgjOd8CHa+DsFrxbFtD/pR3/3Q+g\nDfQjtMpQ2g+/qyD+vSPkfFFLjUmFE25oNsBvPoXfV4HmAoSofNBEQUwmnPoMBq0MTJxDT3YrGI3g\n8lKrjWTOp3twDJrIdHyJoBOxPfoMvhM6gtpycrZtomNCAqc7RVoCLihPhKOf0RzmomZKGHGLl6MX\nhhhn7SPTNomevk5eW/oUN7gjqQyOxqs6sLticYZH4o2eCu0BVEVFOn4KdYUR/bqHEAaq4JNfQ8Sb\nyJpsRG0knPgebrwEpp0H6x+GXfdA8YuQeRchqxHx9B+G3TN1z2HetppY5yBzdx8nr70JOTmJVlsq\npzMiONyeSNsVozk0bjzdUwoZVIyI9l6yNHmIA+2w5BbABDFmKPTBQQ+QDfcdh7n3Qf0+5Aufw/SL\nckKrf45TbcbZP4jw6a+HReBnXo+qt6Fkq5ATBwrgXgPBfvorTxJ/3QGo7QBU8DYARpB00HQL0tAs\nRh4owGgUObX2YuSfXYsncBO+CjvqhhGg7oWyR6DsAwilsiXUSXH8OPxOGUaZIU6B5Hth4nG8vmja\nJozA81Ur/pw4tPY2krpT8fVMwNU/yPH4j2i9fhymkJ4xx+xME18j/o8E/P8aQkh/8+ufiZ/GreCf\nDUELcvrwS78MAuUw9BSq/juc2efhtHaSOOoAKAHYtYzkM92QnghZa0AOg+9+AGcAVj4DzvfB+QHY\nHoe8NfDqGvShNGqUVBTNM/zM/STNm+5n07zZLMjYj0mtwOWPYxQL8T+zHMn/Gn2aMJqrt5N69iUM\nbSK47oYz5bD6ZtSeUtQACEcVRIuOQP4CHPc9S78hAruiYs8Op98T5M3M6egypvD4nk8Yfe4M4i2v\nIbibkXW7aZ3cTey+UoJdMlKgByxJ+Pa6iag4TKgvQECjwR1uwVLkQzwXjtAeiyUgIU/T4V86A+3Y\nVyAiCmKHkzPouROCrSAngTmfvsmVhH9+AN9yH6pzP8GsLC4/8xbnJx5lutgGDhNojAgPrkFrMCDe\nLuJ6WWV8TitNyWEkjYiHiq2QfDHRlz/IW/4N9MtNTHx5KjOqKsB/mLXvDBDIK8GXeojdebNJ39mE\nqbEWu1vkjM/FPLMeffXLaIZEVPEMiFfCUAVkLIHeBujuB30c3HkV3Pc0ZCbD0YfB3oBasguqv8W3\nPBvdlEeQ9j8MsgHH3NsJhnYTs/sUcSdX0x/6kJStXRgmRtK0cTJJn76KJ3gruo++5+DPR5O+uxjB\n2QNrNg0nkgRMsHsDflsEfee3E3WsAvXeGNxLk9GNTMRTuhbn+AsxSZvob4gh5kQvwcUhtGoFyN2Q\nqsBgkEGjGYM+lob8NAzphRQcP4swIx4e+AK6X4GBCuhsg22LoKgdMfETYpM2Up+TzlOHTAR/Pgre\nuQlNfweKJxyfIRNxyu10jz5LB19wJDCOMS3vEJjnx2M5D1m6Dm0wDrn0XmrDYjn3iwjSb27CILpo\nsk6jf0wmccl+bM1jGXMgB3mqARp6Yfy7yGGZf3nP/TeVPfp78FMpef+/g4T/BCp+XJoWhqwS1sMK\njDxIvD0Z9JvBcAkkz0Vb/wqIMuy9FnrLhg+kVr0J7lugtwISToBuzHClZFsx3tqRHM/8kBXE4Gj+\nGYGeUpK/LsQ4GIWYXU+qV0ZoLEE38C2qp5xr9Bp82zLouW8xrtaTZChxaA8ehmceofiCZQTHdZMg\nthPX1IXw/afsmjmR+mlXY5MlwrvqsLVVMC1lPCmtVYzmBG1Pp2ErfhhzuQsxppMRnyTTtdqA0uNF\n059OQOpFys7H3REgbEw3ikFCFoIEK7vQ9AXB3Iugk8ncHaKxaASpYiNS7Kj/O2mGIvAchP50SB9N\naIoPsbgEzTYV0qcyMOMG9pTdhj6wH1/5PJT+AbqOOYmNBenhj6F/DcZ5JkJ1dYxYaaQzYz2OC1sJ\n4UJTeT2zux0cmJ5Cc2cqzoFzmLWnCa5WcWV201WRistiJLm2H32zC9NQiGSpG+GyxTD/BZS3Z6Ce\nvx4CE+D7y0F/FjpegzMKVITBAgM0vArNXij6BV6pBX3Qgy8+Fo3mNiTTCFhTBQ2fILR8jnYsCB4X\nRItorQUEupwED/ZimhiFXLsf05licLoZvaWaoZGTMLU2IGy8FoK+YeLRDaDd20z8uAtg8iiChTcS\ntucrFEcHRpcdMasZQ0sZtoM91K9KZUhrY2RgLJJjAGEwnFByLy3562ju3MR5r69F6E+H5WnQ0gHW\neAh2QeE2aL0aRisQsx+kcHyTz4PgSYSKg2hOeHjvyivJOHOEAtII720l9OKVxIgi0St03JL5Bp1R\n6wnY4vHTi5Mz+KUt+KO/xdjjJHEwGXfIiMYcwhxuJO7OE2jjalGzliIGN6Km1CLEvwgRI//15go5\noKl02Pd+/ZMga/4rt/bfjf+fhP8L4eUUIXoY4hAKXYQxF2PPePryDuI13Uyj2onF+w2RQSOBxCjE\nPi2hqDgMpc2Q9sdYwuLHIcYHGc8MEzDQa3QTltdJadgqrmIGwqkPaI+vQ794iKLtR6makMbklx2I\nBckEqxXU0VchyE9iFbTIweMI+zW46htxH60hECtiDAaZGlaFMKMB5kSjHguCLsAVb99FT6GV5qp+\nJMfHWBs9THBNQgoeRhN0kXTAhWbk01RN34Nwoo70gXriD42i+fZK5M12uiOyST9yBOe0dQiBZ9Gl\njkNOmENvwQUY1i9B6TVhietGEHyEp91JbUYnOX86gfrp0P8wfd47iCwMYexKo2f6OCJ2NuGv2EJY\n8DuCNRoGfNF4KCEqRkQWbXDfs4Q2P0rrqhxc41zESj7cnQbCGquI8exH0PXg6h9ECZi4/KgfsTmW\nb+YuJO1MO+lTTmMwhojI7We5bjsWn4JHI1F742WklvajD2yGUi3YUlFaDiD1PA5payB2ObyxGDQt\nMKYV0i2QfAEcL4OMi9BXv0sIDXXpo8jOuwrQgqIQaDGAuRbL3nEoAyNBeRk5ax7eQyEUh0h40TaU\nUx+CTkVZVIC5N5x+pY+uA520PvMIs4VeMM2CwXawxMOXj0PzceS6pXBzB2z/A7xxJ7rWOpQEA8LK\njxjx/jX0L8vFL3ZisDwB+1fCtBCR3maSHzyD7qIg9jkxnM5OJLJVR+K2S9DPX42oDIH3AOjngmgF\n4JSjkktf+JBgYwvyzAtZ8fr7bF46l4hQLBHuDuQJrQS9Ev7nfcTmpJGdu5HwwkUwaiHYEgm0/Aql\n1YGzxslgZgxRmip8j4aIDN+LOGk8qjUB+r7CX+FHTNEiW/YiOKPg6G5wboOZ9XAuHF6pgfve+8kT\nMIDvJxKi9o8g4UXACwyHu/0BePovtHmJ4YwRN8Pybqf+Af3+h1BRGeQ9OngcB+kEiMNEJiF2I3uq\nicxdRQyzMAmpiIbhwwRn9FlqZuxi7BfroD8VlOdh9NMw4SuU2g855DtIkdIDqoTTeSfPZD7Mb7wL\nEN+ZjZo6i6qNSWQ9oCPiYCkTPVloHTIYq7CvGk8HG0jq6sPtu5j4zY0QKifMZCR000005XyL5pwT\n61knprPTES/cjJBzAlQPuE/j3nmK5os7MRk1nA2kMNgQwt93J7VjpzJgTMblLeXt8o3UJo8ldtoB\n8nThvCLNIb7mBHFhg9jrs7EtOAj9RpjzAoK9jv6GF8nImcjgrDGIpx8jVCdivHEjoa0XMnj2LqwN\njcPhTMmp4N6IqpcI6GXsz50jcJueYLiKsdeHGh2NqbARR9I64pUmqK0k6pOXEbZdjjoujIikQpLP\nHUds0mEbbQD3k8PcJxswJWciqjNh3zn8vQdZ9YGB06Onsdm8moua95H0XClKbA4hawvaPi9fXqTn\nukYt+klvQdlTCGosctcP0FIMHzdB130wMZWh/BHIxsnoYyaCRgZtGezIxz15MqJuDjlbTrJ3zqvM\n3BaB8O1DuG4foC2YgGAPx6Q7Tijdh7buO/RJKpqIWDQJ6xHyC1EdP0MSC5HfPIw5zkvkPWEEeu8G\n+w7Qj4SUl0BMhIt/A1uegT37ofsMXHg7xEXAN3ei5s6DXgVhxdPYar6gVzOE5vBCJF0UlZpCko6+\nhXbO9ajTRxFZey+RUzfhig/h7JmF/5P12JuexxLpwX/KiyCugaEywo1mdF+V4iyIxaBImE1hrDLP\noi2wkaE4L4ZTWnw2AePCK2BBE4JVBMdZ2HkUTDKa/AwYd4J+/10YpqxGjN2Od7MXV7KM3H8E/bVX\n4YvLRFtwDBwBgmIumrcuhrRumFYE+gVw0g5XrILZF/5XbO8fjf8plrAEvALMA9qAY8BmoPJP2iwB\nMoEsYDKwAZjyI/v9m6DgQEMeYb0/Rx6sQVUh3ugjlJCI9Ss/QkIbtGyAsXeCOQmAsEA6Md3xCHXH\nUVNBmXwPUvsx6NmHmHcDfUoMra57iBzoYEfMDdzkm4L5+Kvgc9JUL5EcNpnogwWI1jvRVx6By61w\nxEVk6iTkiBLs+4oI31ZOX1wi9WGxpOfqiOrYRHrYWHpDW2nPiMCkDxDvrUSxBFHoRF4jE1e6mbFO\nHzrN9US8vwH9iJ/B3J+B34297CkqND/gUNLIzHiA18KimakR0dutBKJ0uJExX3wlQrQTTlVD7HjE\n2PGYusx06q8ltngXim8ETUVXoSZtJ/mNd6m+MJKx7SmI/qrhysp6iaZANgnaduIye7HbNQgBmUCq\niFYNIaz5iPAv16OKcQijUsH+DFgMCOfCsOSvQ5VL8fVFoPmskqF5yXA0DEvuKggTYc/jhJAJJEdj\n6E7Eku9kao+Z7wPjGD1ST+HOcoTkNNTgWVIlAcfqUsKTrkBz0IoQLIbIBVDaCe4ImL8Kp+MsUt1J\ndLZwmD4NnG1wworfUkugsARL1DQI2cn9+CB7CnuZcHkfkrcQxenC2rgLYaEPsXkUQmEs/b9vJOn2\ncISDD8BBBRZmwtgHIHoRYc06SP+ATYGD5MU+CIZRwyni/4Lz74YwK3z4EFzxLBitBB9+GFHMgYYG\nKH4NobEdmymKmpWZtGS/QNorK1DHaTEsfA623j4s46mzEebaT9jEK8FfgmXCIZzyBKruLmJs+wH0\ndW2IyfMpv+59Zk+/BLHqe8h9AZ3jPlJ1d/JaVTlzxllIFiIRwi7gcOx48j0dREa2QtR3EGgHrQWU\nCnwTL8Xg+wTDEjP+U0Z0y6chtR6k+9vD6FJb0V3tgl0KcuptcIkJ+k2AGX6/D5ZNhhF+OFMwrBsd\ndSlELP7LYaE/AfxPIeFJQC3Q+MfrT4AL+NckvBx474/vjwLhQCzDVcv+qZCwEsZkwmwTUc++jvr1\nXYSyC9BETMNfW4KqFdDNfhtKfgWWNkjORXz6KxLG5IM2jUBeHYI1FimiALofhLoHmGfN5AudgUsi\n7+Im3TwQXJA6A8+E+6i44UYWf/YZ7qnjCMWoCLEjEF7tgVVFhD6+C2WZhrTH6iE/B+bOJ+L4cZyh\nAQbowdhegxUJg9FNx+IWvG8Wwew4/OO6UDUW1JEiMcIi5KpS5DFjUF0fIOx8H58rkoOaOKagJSp8\nEkLkHFb/8fcXDxjJyQN168UYjEdRZZGQ2YRj41r8jTKWnk/QaIJ4wrT0Ztal7AAAIABJREFU5GpJ\nkaoQlt5NT1wcKU0vUTtyiOyyZLDMhRN7sPr78Q0KBAdF/FuMaO65F8+5TzBNeAGDfjx0HkTofAfK\nPFAVDg8eB+UQVNyHV3SjHd2B8I4e4Ww6pvIDMPQl6MPhuj14PljJ4Oyx8OZukk5cjt9ZSoExmsPj\nU2jxDpGwsx1xpobl9aMZ4DAubsSiH4uYfTWcfgtmbobrpuO9YyVnL3ExoWYFQuo4iMiDtPm4LvkC\n+VQDlj1jESrPoYZ0RG7aQuT5OZzgfCYe7qTg9lMIH90I4geI2jyo/xpJmoNY9AV4b4L698DZAd/d\nAPoBqFIg6MMlWFB12Qii/s8X4ZwbQNLCg0XwYhOcW4N48MFh7RDNAvjZh0g1pzFa6zB++zQJs0W0\nkghfvwnFr8JFLwAQ7N+AI+EJbEtuQ9yXgDW6hel9Sagd+/Bnj0dj3sGEFDtBNYBsy0fwvI/6YTmB\n3h2sviCGQ1lF6NTbMRXfQbikEurcN/yEZ1kKgFK/F/XoK0RkVmIS6hF0EtYPdqIIXYQ+HSQ4pgmb\nJw3VXY6aLhOszkeTm0AwQo/86nbEVVfC9IcAL6gBME0E0/ifLAHDTydO+MeOYgoQzf/Vz0wD8oAd\nf9LmBoZFLP5FC+5CoIQ/V5v/p2XMeYWDDKZ+hzj1JsSCarp2NSD3DmEIORDObhwul9PbCn37INOL\nIJtR7Rr851vQ7WxGGPkURF4DTiva3g/pjLkBTXk7tuZm0BogbToH169nwn33YYyKQtAEEHfvQBDt\nCEtdoOnDMyuIZouM5t02WLEWZl6M+P1O9D/LwlDWgtDnQ0gCAT/KoBHLjFTUGCch+Uos5ZEYLb9D\nri9GdOxDMbpRVTdBTw8tNgn9KCspWc8hZV7/f35z6GwJ8iuP4xUD6FKWM9QeQd8bbzBY7UNylBKZ\nV4HB60Gy6dElxhCc/RA7swIo/hZGnNtHKHc+3e7TRO/Yg7j3Bej2YJ6xggOz8ihMVbDM3oAmbjqa\nfT/gzu3FeOZ1aD8CeffAkT1g0UDsKLyZ09kVVoG/zU34fgeS34uuuglfpJZQyIHc34S6/220VW7M\nm2uR5ACGskoMXzUgnraT6OpF29pJYMRYtGlhaLdsw7w7DM4bgcZ2EMFYBfUuSAsQlGs5PbWewgYR\nXd1nECqD7KkENfUMpD2H5oQObU0l6GT8BeHoKnqxHvMxcP5Kaj3NJHoL0C7WQcpHYFeh9jChoBP9\n4nUIlkTQJUO4F9RWhOxsOFFPyL+XqHNfcNAURkHEmD9ffM4B+OhaMAbg4LMI3Q2ISUGY/BQseQYs\n8aifP4Su2Ip72RC2pEik46WIG4/hHhtFw6wp1Gta+NrsYaw8H71jEOwvQo0E8lcIGg+k76Fb3E7M\nV0uRnn2eUMphQvJXqLsqkMqH8E6dQG7qQ3wsVpAcv5q44+vxDFYQHzEBjAkotTX4phShthupW5eK\n8VwienEiQm4mavfjVGMhpSWIxl6DoDmPUHEbrg8V/LsG0Xmqqb00k6acZnpCB/AaI1BtS9GGTUOU\nhv3V/wxxn39Extysh2b+zRlzex8+9GP7+6v4sZbw36q482//gb/4vT8l4dmzZzN79uz/1KD+FB72\n0MOlRPA0Q4ejcZ3rIumWMqS23yEcr4IVj8GZR+HYDmgHvAGQThOMlpBb8xH8MrSWQPoV+DfVoi24\nhtnOT/lw9FIy7r4bIRSkc/Hj6KOisOXno57bglT9K4TzVZQWPcLQRBR9IyFbON6UZgx/KAJlCKKT\noekonC6CcTOQnMVw2o+s9xNtGYGol5DCv8FQ9TwEuqHuSYTmHji/DlHW4nrnXr5NbCYuzUnBKyaC\n+XvRXDoWVVUZ+N3ldD70FZqwEKFoHeKlb2Kb9SrRsoCAjC9eIBTwIFkNSNJCmHgJtvbTXHj6aU40\nz6Ns4wFi0z4gP9OIaE1BjU1HTStFiPst5+0qgIO1MGsZcunVSIFiAlVlsN8EVc0wbzl4HoLwAFTv\nR68zsNi1G7d3CG/uhRj8+3CkhuP35hAuR4DNhuKuRuz/AWHuYsSjp8HRgpojIL5biXLiFowvfIra\nsR+SgVVmBFHEp/WgM61EOLsVJj6B2vQlFcYBsj6vwJg3EmYvg9Z22Ho13oVxRPRdia6qGiZGwegV\naD67CdUqYGh1k/H9OSoyAxx4qoCJ9hqstW8jnzyLumY34SVLEQ7dA5YjEDsBKluh2w7nbYDrH0Vy\nlTAy4Kc1dBK46l8vvtAAnHgElDY4N4jaA+rKMFRpPoJihWAfwY638J7tR7tgNJne+dQP3kd2/BTa\nbu6jeGYOo+XR7AttY4YaQ1jdHtj9NRg9sMMLJ0W6b1xOdMMviFZmIu75EkZOQE4cwP9+CN+cZfQ/\n3EX86xXwTQ7X3P0sb0X5mRWXwcjqT6DxfkL7LyX46RY0D92PkL4TrzeGQKML9Zp36PRVEesvIbs5\nEk2XAHe9hKKMQN1fjH5NOnJbG4Eilcxx3yC5+gkcuo/BRcn0SWU0sgWFADIG9EThppMcrsQ4XG/m\n78bevXvZu3fvjyODf4Ofijvix96epjBcVfRforXvYzjM/E8P514D9jLsqgCoAmbx5+6If7iKmoKL\nfu5EOzCL5nv3ok9MJv36K1C2r8En9eLa4MN4xR2ISeng6UCW7ydQnoTcp8W/ogLD3iD4RIgU0ARs\nOPc4MN15B8K0Uexr3EpP8iQubEin9bGbSSnSEljeiqiYkd/UItx/DDUoELp5FN7f6/A2jEGjTcR6\ntg06D0HRCjieBdPmQPC64WyuiA1w9AYYn4n3eDOqUoGECe3szbDjfljxLphjofEU/a/eiaTvQCrp\nRTN+GbpH/wCijLukBOfvlqEc6cEwZwHml2YwKL2I7VkXGEyw9G1ad99L+YIJLPzkK4jRoYx9izrT\nHjJrzIh1ZQwYNNQ3HyHcW4i/7gy6NC8RI/yYZhYgH+9jqOg2whruQAjK0L+CrsIzRH7rQC64Fi56\nCLZtgPINkDcdar6D6B5ImgdlAlx+L/ZTa1E+krBV9yA8+T6MnQD3FIHXD1fchfrxs4TaepBX/Qpl\noATl0HbkZD9M1qKaIgnGiwTSLiAkncS8rxZGROMwdGEc8iAfSYTLZ4NpHYRy4IHlqBYrwrqX4cV7\nYIQf9bJ3CL4zG825k6jBCXC8hO5No+nRhnPKmsCoyiZGVHbhvHg58S3jENpOQvtxiKtDbXTC2PUI\nGx+BRTdCxx9oj76MLms/Y/N+Dz4FDj0M8Xng3wBnRSAGmusINgxCuB9p+rMIF92OKgh4r0vDPlMi\nwbUS7H7a74pC9BzGNXCWztAUWuOns/i7L9A59PRcWouoiSNuSyOiTgYX1LelM8IbRC06jmCbD46d\nqF1jUWa8TmvEqyTwOKLaR7BuA/Iz3+ObsZRHr5jOrftfJr7tMIpuDGJePGr/fgKZQ+yLnUSu2ICl\nM5lgdT2Wrl40G0MIubEMPLUJjr5P6N1SzIkNeJa5MSQvQBv56fCG6ymHA7+GokchuhCAAC6a2EEH\nBzESSxaXYSHtR+/tf4SK2v3qb/7mxk8Ij/7Y/v4qfqwlfJzhA7c0hu3I1cBl/6bNZuAWhkl4CjDA\nf4E/GEBAi7J9OTWvvU7WY49hGTUKSrYR+uAYwqqpGBYVo9gbEWOTQBeL32bAMNRAMNuAqKYjhPkI\nFjchSBpIVJAMYSiVu5DOvYjWlsf+MaOYtvdWYp/0ElJj0ezSILTZ8N5yJXK4A7GnjNAEH0NDCrK3\nBtkhgrwDXBFwrg+664Yzq0bVQHQBqudXOEQzwvY9eHWxCL5wGiLjEHZex+gTNWiLs0Fnhd4OIiIj\nCdZ3IYzVIF+/cjiuGTBOmoRxlhY1H7ArcEqHxhhCHb8CoasZTr5BUvoyAsWHUE97IXoIoe4SetYt\nQTtpAWkXPIJBaAbuYETfnaiiCfcTM7Hv1tK5pxONw05cz10MTonEHC0idTVjTvglQ4sOED7uj4u6\ncBYMdEDdb6FQC6VjwNcO6cthqIZw7zlOFV2CxVWBpu4MzF4E+ePg6pehfC+4mvDOLyQs4EX47DuU\nK9NRO88hNAZQf/Y5VQlvkl9fitNQhmL30eyaTOikhxGG6WA5Bb49wwk55tvhsa0IAz3wyq2AdliR\n7A+FON/rwzZOQAjWoVplbJ9LhC85Tps0nuoUG8LIbjI8RQgJy6D5I9AboNQOI6eCfxsU5UHft3Bm\nIQl33I2x8lnoa/v/2Hvv6DrKa+//88zM6UXSUa+WZEmWZcmSe8c2tsHGxmCwAdM7hBaSkFwgFBMC\nFy4EQkhCL6YZMDYu4I5tjHuVLVmyZfXepSOdfs7M/P5Q3ptyL/fl/kKycvPez1rP0lpnZumZc87s\n79mzn/3sDfufAG8VJB6AlN9C6dvgD6Hf+wke66/xSauI2xnB+LMlBP0ulKLpiPO+JtCfhjlpEfGf\nr6BqSQPD+tsRB08yfhA2TZ3L+KK7iZZa6A0/T/fsehyVnVikEFowjpDXi+FUDHrCZgg76R5zM93G\nX5G53YWh5X2Iike++AV4Tca6bhVPLXqKiBpGv2chcmY+2M6hK0kYOofjspjwhVrwR9rQcqx0lgzD\nFe/GfjJAQ/hhQhPcuLw9WKsTsBmnoqiZfzS4+EIYuRzeLYErd0LGTAzYyGEpOSz9e5j8f4vgP8j2\n6r9WhCMMCexWhuLLbzG0KHfHH46/BmxiKEOiGvACN/2Vc/5f0XWd9tWr6dmxA3NGBmPWrEEy/CFv\n0WzDeOHlGK9Zit64Hy1xP1LcjwijED7rQrFA+HyBtTKC5GhFmTUP/EG48VGkO5fRkfMDAgt3kt1U\nypzAHqouHkmeIR4FO4wIIZ/9GtPGnxI2aoTnxyPND2HdqTJQ6MZ4ci/0jgLvOShYBuIQ2jvPoU+9\nAMmwjhNiCfGDJpIbZ+Ds/gaiE/DqYY6Mz6MuP4eE9n7GHSvHnppKsMyKKc+LcATh1CfQcwQiHggP\nomflgLEN1fUN8le7sIdViN4ENx2CqEw4+DvSd1ZDJAIhI2L6RYSSVdpN3WQKgUfbjb3JiP/Yesxt\nv8Uyczy2GdOh+hNCqh8pRqM2LZokvYf4KXOw9CWj5qcO7RoDSB4Ops8gbTicq4DUGNj7Ncy8Ep74\niP7ri0h25OAbU0bUO89D4ZDXhMMFUy4jdHIRoqUefd9rDLz+IeYNj8Bx0B+QGCy9lqSjPrRhuRhr\nBF0lMQx66klZ0Em7vYaElQ505wcotrF/vCESM+DRT+GRi+HIJsL1HvylEup9LyPvfBbtYhNKUxuC\ny5leexxPeRnnlufTc+yX2LLTYKASfP0w933wt0NgI7p2DGJcCOUsxI4kOhyAlElw8e+g5V5Ifw3W\nPQ+9rZCUg9j7Bs7pl2OLvpvAhY0oCU48gXeJe6mPaGcx/XNeJf53n3LkR5MYXVOPkh4mdVDFNHER\n44vP42OexaYJlvdDdPMFeAxfEtxjxLPQwbFJTsYfGkEk4uJIrY7S9iZSt0KpnI7EKRK3+MmoPIGY\nOI3wF+sR51+Koa8R8e5W9MkR9Lgy9Ixm5A1mxiky7G6Hq2aiBXcjRY1BD9cSabGTGb4D228fJ7Av\nE8vH2+Dkg7BnNViDMOMOcMRDzuKh2iqHnoH08/6hd839o9SO+D6uYjN/vhAHQ+L7p9zzPczznal+\n8kmqH3+c4o8+ImX5Xzjm0Qlwy6/A7EH4RyIFV6AF7sGjDsdqn45W0AShg0gjfwXKM9BaBoZ01OqX\n8cYITvje4Tw1AVNoOIu+nI338lt4jy+ZEIxn4qnnEKFogikZKCu/Qm30o6cJDEdD1F2Rim1lEP1n\nnyGcChx5n7pkGX/aMCzBcpI/T6G4aAZy72fg6gaTG3KmkG4z4Z24mEFep9WTwReKjYJXTuF+cDLp\njmySa3ZSOcmMMIcxSHZGeUCo90LlfpSpz6H9/nVCth70CVbk3i8wGpdCdQ8S8XjnhTF2y5i8NRQf\nNNCVUQebPsJs7iD7mB/JG0SflYBUVwNJ58AYh1FWwOlkZE077iIDtDyLqDDgyP2TDi7dx9H6W5F8\n7qFnntovwKPD1kfQ88djOOrGGtmI7m5DD2mI55+AGTmolDNY+i69NdVkHDwLU0ah2X7Bs7deys3u\nfhI3DmC824+QdZQ1J/HFOzAIH5l7O6kvSiOt7h6Cw6uJ2KpxMvbPv3chQWwfdAgUm4R5Qir0vQg3\nX4m26yMkk0y4pgUONRDTHYYlQUqnxhJ78l1sjgXgrAOzhvCWQ6AD3bQYff8GtPH9yAdGowcNuLsX\nEt3ZBE1dULsEKrtg+o9AkmDbs0it5UjpYzCULEE7/DTGcbmQlo6lsYIOBumZ20VWmaCvaCSJ55oI\nulLYbz+At/UEJfGZ5HW9j1ZthNgLMKwZT99NEuYcN3H1IaSExeg5t2GefC1qeBTpn2gk9m+gfXwm\nR6cWcGRVF4U3341xhkT44HEc3TZcDc2YjjSiX2tG6s+D3aWIjCj04gCo25F6JETnaUgGzyQnzi82\nIp9tRrVPBsUImdmQfzl0yPD5z4ayQGbeBXHTYfStEPKAyfE3t/f/v/yjxIT/MX4Kvkc8Z84gJIlp\npaU4Ro/+DyuzekYOKtWo+mn0GAO64XEClhRsza+hHM4klB/CeGA8FJbDtPfBewtB2yBK8xEMP4xm\nwkAfduNqSLGi/uY+nJfbmUwR75u+JH7Cm2STikQ7vanXYjVXYn7bg6rIRDcXEqUY8D/+GJa33qN7\ndA6hmt+jRxuJ2t2COWCFzb+EoAcyM1ELchEhDXnh64wSDtoDbzLq1U2wTkd8uJtDmV52hCoosDox\nRrsYbrwel54PNU+B7wmYYYXGXyA9vRnzc08QHvVjAgO/Ilz7KpYdjUipQcz5OQTLuzFW9eMId1Gb\nMQZ9Yi/mz/yIGNBzdeS9AYidCYYCmNAPnVWgRFBq4vDEZWE1f4PlWAAGHocrVqAn5hBs0vEfjkYe\no2FFQlc8DIwfRmxsAmzbS3hYNF3FdjIGNMKpCRhWluJ7qA3RrWF7dzPm3YMowzTauzNxvubmmqum\n0J67hajGANaqXiwjNfyLjRzOnU7RZ3tRCiDnixbM7j0Es/1I6qz/mPcT8oLaAX4jhktHIVZUIF9b\nQcTVgRrZij7YSOjAAaydPvTREtP6MvA0NDBgd2MtfAq8O+HMh4i+CtBBaCfhtE7zWBeRlF6iowaw\nt5ZBfTT4uuBk+9BTx6x7hkR43JVgj4OmE0P5wf1NmFe3oR+0IM6fSFgqoC9USZfVQHFVLe6ASldc\nkKK248S1V4N7AD2UT+d7Ad56Q+eqshziz8zCkjOPk6lvE3/q17j1BmzKWb42TKVpmpllZ2JIFXGo\nR3tpyW+l51fJJDmnk3XmVRSTAzkooS6cirSuHEQXXJ8AJBPYfRZzkhe6FMgMgwUsaamEG8sRviKk\n+Bjw74fBTyB8CDJfgex3oL8F1j0MRz6Ey1+A2ff+HS3/v8//ivDfCHt+PjmPPIJOhCCfEOJzFMai\nUo1OGIERmRxkRmLY7kPK8+NOuhctdBBbdj2RbAXj4RBsP0Ck/gQdRjPOznYUo4b9tIzneCpiNuBw\nEPQ20qZvoEQswMZSvuIwiRTRy9MkTXgGZe1SxB0v4Iuxk/TY7Yh4BdOUsairZxBvP0T8uDUwdi/s\nfhHSTOgPn0LbsBzvFcnIfg8W7RbQ6lF724gEKwiEfMQ+UoiU6GSOP4rZDaWclsIcVZOp7fuIsf2Q\nG0oE7TH45TK4zAbKW/AvNgx6JYbsT9A/vIvIiA68FrDvq0EymOm7YzQxTfFEDInovz6O9KMgWouR\nwZZYLAVjMN2/Ggx/iJ9t3wLhHjTVRFpTIaWzuhmRNwmb7R3Y+glapxERysZYYia4bZDATIjEWVHH\netAGatEusGA96YfJKl1yEdg6iWtKxTLgRH+tD71mFNINsWgNdUSbvXR6RtB3/nKKFvnpm59C77lk\nlEkXEBVcxaTju/FHXYF6QTd+XwTLT3dhdnegdtfBZWPBmTp0zSE3HLkbdDeQDpfsR3x+PbrVRYT1\nRIrr6Ou1kHzCjRaxop03A+mMB2skDcOIs+B7HbRNUDAN3foZQhkNpd8gxq4mfd97aEqYQKJGfeZE\n7MPyiCtPxHh6LTxQPiTAMCTAQkDGWGhvI9j9FoayEGJyGFJDxJ0KUDYxB09nFN3mWtLPtRN/+BjM\nvhQ99Rw0aOhd5ST0SVx0toeN00q4/MXt2BddTL1BJic5D9V9FKfdxwUnviFkXEqfJYTeGCJjWg7D\npMWES1+j1bmRU5eMwdo8QFqHjqNqL7pdIEU0SLCg627Ms30QDSJHgrYIIgTmcBl1ky4i9YgBeVgs\n9P0CAicg5V2Q7EPvMToVFv8SJl4DvY3QVQ0JuX9nBfju/KPkCf/TiTCAjkaQDwmxEx0PRhYgMxLB\nn+xn93VDKAZKW3Cdewg5L0TQpSA3hRFJdga8LtRAGS7TVMzJKqHhg5h+Y8CW3ABbJkPGMkyuKNpL\nf03HmH2M5UnMkTpOyfdTsP1agrUPoribYdp4HLUdDM65nP6cQ0QfPIkhdgCypqJb1xOauhMlIKHn\ndhHuH41xjBl7s4Tk6YaBGyHzXiKf1iBbPNidyUiZXjhxHVjsSL3nKNKbKOzcT3NbPkEP9I6fj2vr\nSlj+Cxj8V4j/Hegh8G2EqksQ2V0oqZdjO7Qf1dGOFIoiaus5UNrAakZ/cCl6sh+Jg0hP+uj93RSS\nDX9cwIgk3k147ysEvjmHc+o5snZZ6Bw1j4zoV5BzZiAPRJA2XoOxtR73iAL8D1ZhXByP2ZOBN+96\nzlx4KWeW7GWB/2maXS4qmUXB9GhGfLkL0ydbUV6bidIXhp4OzLd/RIo9Fdv0WfRuupveCcMY0Xcp\n/jVPExguiKnz4pz9CZ7gaCJWG3rmLNzLzFiiliJH/H/8ro1R4LoKZs+BDdtA15EzMlGbm5Fy0vCS\nQnxVHXKvBA9vRjm0HBYcQNq3G9Pdd+K5K4h50TEM4g8VNTqa4F+WwO1PUze6mCzLHswDkP7BUSLj\nJ9Ka04z2wFRig1twntbQ82cglW6FScuhbC988CxGkx9pGDD5ASi5mO7Gm+iPnsps612Y2sYTznsM\n5WQ/HF+Dvs4A1mhEcz9Ck0g5tYcFo8P0NG5HaNV4pArqkyYS27aBGMN56MXRZG44hIgpQA0dxKcd\nwnhsDobGyQzr8DBs7Vo8JfE05dsYTJ6CWqAyep+KbdRD8Oq16M0KnmoJx6/fQIReBHcLYuRY4twX\nEDQ/jtHRBPEfQPiHQ+2u/hRX+tD4H8DfMCb8HLAICAE1DK2Dub/t5H/c7Sx/BQIJMzfgZCVRfInC\n6D8KsK5D+6uw73kI9IDfiFSYg2T3ILtl+oZ9wZp5d2NM8BI9FiyxnWjhHsTRAbQT7Xhrc1HlNCh/\nDqlvOzkbnSjYcbe9T+JHtxHte5Btc6IRZV+jeiTUrjOE37iGvvkqHeN1/IU+NCkJveI0YW8a0pou\n9BgTnASPRUd1dqIFjqIdqwJPIXrCz9GlcRivuxbTssWwvxFsUyDlKpC70cd/yWB0NKHLH2X4/kEc\nb/4C94Jk1GU/A6sRzqwGyYx2aBDW2WDcZoThGMJeReAmG5KvAzlhKfSDwThAKLAf6Ss3wnMVapGG\nbfnT6LVbhj46TUN0bSAc8yCyZkIKCmKMHqLNHyKd2oZ6YD1q371oo5sg+hqSD1UTPzsBmz2K8OYo\nzKm3Mj52NMvUaKItnzN22xVM2VxGOGUPHXX9fPPBPfTlBsG2DUpC0LcZxeUidslC9EdjyW7tJyJt\nxNwewFZpZSAYy0BkIZq/Do1vCPzgEGpkH5ISAzFZf35TlG+AwsUwZykEA8jp6ahNTcgU4ZLfwTht\nFlz4Y8ShJ2H0NHBkIC64FjF1KfatEXytj+I7cxn6gUdh7TMw2APJ6cQXX8/xjhLCRw2YbC5sJz9k\n2Lls0vcmEzz6ItXafVR2TqWv/S148mo4tAU6qxA2UM97lPr8JCIfXUxu+Tmmla2DurswnFxLXUYs\ng7NTIWRC0sNIU4YhlDTwR1DXnsZTL3PmB4V81bECf8RBtP84Uv0g5k2NnNhyIaetOpGGI2gxCaix\nKeycl0ydoQ7e2AQ2gb2tg/yjMqOOGjAqWVQuHEfX9h8OlWz9/Sk0UzJi0iSwtIMlDSKncfbfCXV9\nqLm3g5L+Rw/4fyh/w3rC24BRQDFQxVDq7rfyj+GPD/H36THXUwNfvQitH8GF98Il7yFF1qL399Md\nyKF85EwubC3C9EEdYtoIiGwgNDUaLc2BctqIiDtJaDAZU/Q8+PowhlofSbHxnHV8SnTUZaRtXIc3\nQ6NyVAIpA500J5TjrNNxbe0mzlWIIdGJnFGGGAwg7TpAZMpojAW/QSr/FGuFH22PhNdgom9WJoPp\nvWjhM0iTRhPkGMb3SpEbGyErdqi8Zv92/Mo2rD31xPZNQ+xbi2SZQiD3HGVxx0k9UYNo2os3+kIM\nz1yEmLAYxl4KyoUEbWcI5fZiKE9Cb9qFcMr0JURhOOLBtqYM6lrRpnjoT3RhObML2bgHEepAaqvE\ntGARpmFfIk4nIWIL8aUk0D92NPbuF9HazyEeC0MRSHNHIMelYLjsMUzX38HgihVEPl+Jdc+XyHUd\niBEz8U2/gMakfSTmdzBGz8RiWQhR/TBhM5Tdh975NS37N9Fu8GC3OJDsbZj74jDWNRG5fSvvZJaQ\nIk5h0Tz4LUlEjP3Ym19FUn87FH5QCkA3wbFVMPF6yCoAxYDW3Y3a0oKpZBaSdArRXonQ42HumzCw\nAVyXD4UPZlyCiFYxv/Q2IldDnF6PThci3gBRvRg622mN8hJ3ogNDrRsRyEB3nEYM78DeOY+oNa1Y\n2mqJyL2Ep5VgPlwDynFwSLQbatHjihBxBzDXGzE6Y+lOdmFr6cebJlClKJx9o2hIKGFPxEGvbODA\n8vFUFqUwUFOJfWs/Kb+qIqGjDKO5i6ZrVWTHABm2csRFY4ntTUI/u0tNAAAgAElEQVTpNyGGOUji\nBOqRAU4vHk7yJ+3oxSMQ3i7k9LmkHBog9Y01WFwOxGPrkZ59kYivEpH4PproRR7ogRIBA3MJNafQ\nNTeWGPde6H8HopeAEve3t9u/4PvYMVew4rLvLMJlT2z478xXyx83pDkYSs1d+20n/1N6wn+GGhn6\n23ICPr4RvnkJ5v0WLroaTKeGmmcGWghXQqzWzAVPvo/xiZugfB2s/Boq0hB1HgztvUiFfQS3aoRO\nSBAzCfGj1yBlFOLYmxSdLqS6GAaX38iYj1/EkRnBn1CAtFMQSgiDPYJQo/DlOvGmX4Y6+kVEswtT\nZzl643vgc4AOSkQnar+BxFULSNgxCcNtq9FvuQ5ObYVNx9HmCchaDrqBsEOjLe5WpFodfvMgPLEd\nkeHE0dJA4f7P6JwyFZ0BKu68lPbhl8C1/zokLDYnuAcxtOUiHWulek48wToVV4VO/4VWtB89g37z\n7ZgzgxjG2PGe7EbrMcPXP4G+djj3MDjCcP7d4K0gpv0ckvF9mP4whj1XIPsiSCWHUJt2obccAPcp\n5NhYYm6YjWLy03tAJzz5Lhi/iDR5LknyIjRzLM1pYci7AzLvA//rUHAneu9Z6rIaye6sx9rYg8E7\njYg9hBojoQ3+lOs6nsMX9rP32FREdQi1OYz0mQ2avRBYOVQesmYP5Mz6s9vi/3jCutYOoY9wZxhh\n8lPQWwWeP6kBIUlQMAemqshfG9CuCBMYp9L34KX4Fl+JmPYjirPvpHN8Hl5rOuLoWUSbF3GgDH3/\nC8hSmKgjHuLKnTg/eRt9cCMDE9NoL8iiN8+G5ey7+CaCFvShYmQgox/3/EyyTk8lYLPRLHVwrqiX\nzqUZpMppXDzzZSbGeJkQK+G9ZCnpY304H47m+MTzmHbkK0bc/zDpqQdJFRcR1KuQpj2EaUcN9u2j\niP/hUnIu+4Dmxenwfhkhv0Zz0TH0o5+hTsxAvywPsfYSGLUa44gAvjQZLSEBpGIIJ4I5j4GZCWSc\nfAW8PeA3gYj9u5ny900E+TuPv4KbGUrT/Vb+KWPC/05gAD68Gkx2cGXBRc+AM2noWOzb4DsGVZeC\n14zJ3jdUHWvCCIh+Dy6Kh2Y3PNWELG9H1mdA81hcq8cS2NsCBz6Hxz9H7HwbPf3HKD01FD/bR+lD\nX5J2j50caQde2YV/nBHZE09woA3Tyl1Eue9Cb61AnH4VfcBDxBSP0rEO3aqhu0EkqWjhPkTOx4is\nC/GlGzClxSM8frSskYQ/khDeB9BEK56kaIZlVBJ+X0VZNAGRPgrufgf57gkYl/RiqW1GjYtQVRcg\n+tYr4MiXsG8N+AbRCkuxvDwcMX8JpqR6zv7IRHLgB7Q3HSEz9DiRwzGYMieRsPEgnWNcBH++EeMj\ny5ASXAjTQVjRD6NeQi/uRs8xY21JpiHfyXB7A4y2oLdE4R//Jp6zjyOt+wSnlIAycQmWWddj6u9n\n4OGHkb7cguGR24k15dGfexFq93aCvEqMfSKucBOcXU/Y34jSOpKo7n70Agv6gQbknmTErIk431+F\nXhxFZHoGw9e1Ytx1Fve9BkL2GMzrVECFBdcPtWSav+LPbg05PR21sRECr0JkD0IZB1tvB4MVjFPg\nnjwIeuGut6F4HizciGg6jbRGwzSyDclyMT3iRqSuTEz6dLIKbWinI+i35hDsbaZdScZ/3ywClgAl\nz57A09mJTdboWDCHkKuZ5FovZlccxpwRKB9/jB7rwrS3mZiiNLTo8xDyaRyJt2OepTL3nbvhVBzq\n4Uo++vptfvLqOh4bsZar5u1FvV3G+Qs/vStGYmt7AHKeh9EfYK38gs7cDIzV+1HqFeTz5uIX3zCg\nXUXUmHb8jekYfSHSVx2AyaCl1kBPBtK50YicxRhc+xkcnYSy/gT0NUHHJAJyFAFrM3LsDdCwBnQH\nDByHuAv/7qb9ffBfxYS7dlfQtbvyW48D24Gk/+T1h/ljLZ2fMxQX/ui/+kf/vOGIgTb4YDkEB2Hy\nHTDtniEx/j8IAcIJFW9DggvkTshaBO3rIP4qqHwT7NGwZzdi0r0Iqwsq6hH5t2CI2gqDQSj7GQTN\naHu7EKmZcPIDolI7MB3vQU0FR00fzoMD2OsaEYWDhIUHpMOEkxoQZ5vQYoCJBuSYBRBdiUgCvRdC\n7+hEypzooovAzDDyLhVtmoLztrMo8+LRZ62n8fwpJAemo61dhVol0EhFS8/E09SCp7EH3yft4C+j\n7sUgGfkjyLnvx4ioOJixDKpOERx2FKPrYcQFV2LwtRDRTuM6UEfmvu0EiyTUUTrGyEL0ilP4Judj\nivbgd4SxJBdD1wxoa0S3tqJnhpHO5WKuO0eYcux9Y+D2FxlI2IVm34PhxmlYCp6jceU66p58En9N\nDbELF2JZtIhBzwAVNz/GQFQnclYIs7uNjqhaPL1fkfJaK1qhyqcFV9PuMDJWvgNtjwdZO4M42YpY\nPAzhiyNQMhU9yY2zsBi5yoN0pgNj7iDSBAcUxYCaAUc+g84zQ+l/zlgwRSFMJgJr3sY85Qw02Qjq\nPRiV2xAHmuFEKUxcAhZlaKPq5pfgbBVE5yG8IxFHTyAVurFa3ydiFRiqn0eY8xHKIHTWMDDyGsxd\ndcQdKCW9OQkhNWNye/De9ArKB5/jah2PsWQallEPYAh9TDivFWNoANWsY20Jo/vqMOX9CnN4GO3x\nm4ipCsHhbYTnPkTqef/CvRfbGTNjAliewfR6COOpfryhGP7V8SaFHfdgDJZjbOjCUGYk5N2P8aaf\nQnUtBvlCrFENmCtlzIkRlPWNaIXD8V1wHYNJeXhyRiHvO4vxgTcRu9/FM13D3mVBDFsErtkMnHyZ\nxBBIBfdB8nToeBXSbgFL5vdnt9+R7yMcMWLFsm8t2GPJTCRu1qh/H2eeWPOX873PUFnevxxVfzh+\nI3AVQ1UlI//VhfzzirBihgk3wsRbICH/Px73tcKRn0Dhk+CaDeIcWGQwXwSDB+FoFRw3wM9fQLxw\nLxRNBT0A5zaB2wuD+8CeDlo7dNdAqJtAagC1xIEeoyEqIti+0ZDcKoZWDakwBbGoAHnEWYTqQ8oH\ncb5A1gYQSh2YE9H8XjSHjnKRwLDAi2HCEpTjNZgHugkszEVqDhOoXY3U0EDM4Ewi67agLehhIK+Y\nds8wPHX1IEkEZ54lrk7CHc7DcYmRuAX/gmn7R7B7HfT3oM2aTTi8m4pIDD7vILGeo8SUV+PTO/g4\n/hombm7HmD6AXu8kZIsQjO4kcF0E27tJyMOc+MMvEJrshYkS4kgIqUGFuxuxt9bBeXegOiQGUl9H\nd+hEv5WLce7VuObNQ607x2DlWZrq2vlNdxqftAeYuOgLSpyHSd+ZgutADwlbzqKGA8gVp6nakc0H\nS6bys0OvYjqzHmnWCvj6JBHLJKSvehBzZhI+/hb+MWasqpnwnAP0zo7CvCGM0uyDgmzoOgbZN8DC\nZ8DdAl/dAMe3Qm8z/vWbseQ3Q81ZurZo2GJHII+5CPZsgnAEKr6C+m4IHIHYGAhHweZXEXH50PoN\nkqEXU9K/IuKWQctG6KtBbIvBHJeBIS+I0t+GXFkLnX4iyakcvHwkefpplKlPw9rnQHWhm46ihntR\nhkdQowSSPwT+PvTjH2IINhBxyRhNOci15Sjp9dgPfY11xlJU4+eEbVaUxlNYGy1k9fSyZOECei1R\nOMvfJFJZR2ufg+CNCibTHPzD78G48ylExgSgFDlxLGhWpBOZmC5/AduaHTjq8jBu3gMdx6DrGN5J\nfdh9cVDyIzpTY+jITiGprAaOPgejr4fmDTDsFjAnf392+x35PkQ4d8WV37mKWtUTq/87883/w7kX\nMtQm+L/knzccIf9FexVdh68+gNIdQ3HijMOQMh5cxaBrEPcQtF4NOU9A9TUw5V749H7IHQ33/Rwe\nmQM5GqT6IXMZJGqQPJKeK5dguv5+rFVn8f3CgT3vNdStL6F27qKtUcKZ5MLsaMffNxLD2uOEGwWy\nVyFyUCO4bBi2shr83RkYcgLoaSqh/QLbZIFwKGjTE1G2dRCcawJHKjXBc5i7a8n2DaJZ2gjOuw/L\nwEskTFJIXPERCEGEZvppINy5lLg3fkFDgkTSUgss/N3QNuVju3AffwC5oZVQfj39h3aSKjViUiQU\nn0ZkYRixzo7Y6kVP2YtIjqNnqp1c28co8/8NdefbyIud9I1TcTR4CRbnY+voQOpwoxuXE2i4mUBh\nPoaeePTEbET2WPjdT5Euno42rJe3rNfh8Rv4oWU1JdeMBv1RBp1r8WVfTdNDNxLb3k2UNhVHey2j\nDLtZsj4Bu6MHkoyI3S8h4h10LLoeY8U2fJ+ewZQdRUPt3XyTORd50EVR2hY+e+hOUg4Op+j3n+HL\njmb7RTbGNZxiTu4scMwd6jpc24XjpiWEs0poWn091qs19C9+DbedD29uG/qsHp4CvU2Q7wWhQO17\n0BcCtwPRVIAW+x76zuMIRx6YDkJyEOYmQvX7RKJdGMREkHajOTUCURozj72GiEmH+E5Yej18fQ7x\n4zIM+Tb6Hyrm9EgT03afoLU4i6Z4K8b0Pkz+DtSzNSSZBtF3nkak1BPaMgd/QQ+m2lz8GUFsIzsw\nJF8Fz9xA3nMbYDAKIi3Y5v8AZ98PqAmv4McVC7DHvc5v/J3Exj6KzNWI8eMRKSH49TNgrQXrZrDK\naJ+vR70sF1wlULoNXXNTyTamme8A5+/BUAQbF0P8dAhY/lPz+5/A3zBP+GXAyFDIAuAAcNe3nfzP\n6wn/JUJAZhF4+uHQWmjphu4k6O0EzQdHfw8F50Hbc2AuAdNK8M5Bt65FbFgNhTmwrwJdDKKaGvAl\nGfEFj+L37kcfHEQtDOAMyhgOr0UcPUXnQYE+xoJh7k8I5hdg2/EJUrcfOSQh5cxGLp6MHOdBavCj\nLLuV4Fel+OdC79wkNF1G6Q4h/24nQmh4r3ahJocxaLUkRqVhSPYiRR3DnGNCLtMQhi4YNhNMyfTz\nEo7IlQQ/eAW9+hTWcArmnCpImgMYISkDbfgJrM8fpD/BQHZ7HY2mRE5NzcatxHE2O5/c6SrW5FlQ\ndQD9KtDkScQc3o2wtiNMrYQPqzhT0qk0xuMx5CCPNeOvfZaA/gGylIfDdwHmYyFCuYP4JDMNahUP\nb0zngGcy96z5JbdekEDy9tWw5BdgyUf1vIyp/0UsBSMI2ocTt6AIsfw9/s1lZqZkJbZeRR0xnx1F\nybyRN5mCHU/RW6jRckMhicZjWHdW0xdViu10GxZzEGviClJOfogzJY24UwHG/X4N2Vs+R9nwHOLL\nY9BhgTo7espEzj7zPuLm69GP92ISHgzvvQMJ5Yi4FAhZIDUNJCfYG6C9AC5xQu9JxLVPIqwz0aZV\nIIJehDUXDnggqxn3pTfQUGIgzj2HSP4x1D4dSw9oegApYxH0loMxBbJGohp3INrM+LISEPmXEneq\nEVdrF6mOO1EeOU7a/JfpMZQTs6GG1gkJ9Bfa6JlvJWj/CQ2O02Q1BVDMI0C0QqARTr4H4RZImI09\nK4jBsh9h0LlQ3ozDL5Pd+QCOxk6qXNW4spYgndwBe0/Dwb2Qm44+Pxbti2ZCt/ZBeh6Hvp5K8uCT\nxHiisB/+HPDChB+Bcg4OlwIK5M7929ntt/B9eMLZK675zp5wzRMf/3fme5mhlm+v/WF8+V+d/M/r\nCf9nSBJceDMUF0DCuKGim1VH4MQOKGuDvSehRIb8fSA1oC8eB3XvwyVfQ+NmsB4mfCaMCIUxDxiQ\no0bgbKpE+DrQ4nXkjhCaTyci60QX2+m8MYco62LaSndhjVeQQ3EozmiYmQRHBQx4wOulujCauIxB\nAksUomqX0Tj3CPG7AqRsOYhqjiJweASWuCKsyn7Unv14YmUkYxpS3CSkkl8hBSxI3SvRHDmo7IWT\nXeiHPqM7kkrmmSPg+xl8kom2KwORVoR+bRWyyUFhbTlsEYw0tJDX2sSa5Ys51lPCreVv0te9D+G1\nUiulE7PBS7AajMVHoUdD3yTBqNO4HeeR9lYltuIg/uviEA1uvJOTUGtXYlUH2Vm5jLWn55IUuIHH\nbfNJ+XoALW0kzLwYTu2Ft5+A23+Jak1ByuvFPkLGPrETNk1g36QnqZmyGMcTy/jVjEvoGVXC8obn\neEr6EGlxAI5Uwu4dMDMBofkZ9ssdENNL6GQqIx8dTdX58Qz71Wew7H60zlJ6EhJpOmPGNnkyCXfe\niX7sx/heeYrocZmYqxowrarG7usnEgDx0Bbk+zsRoWNw1g+XLoRgP7TuhrpBSFSg805EMIDU6EPL\nTUN61IuIxMNFU7A2voeTdHqiXiHR1E/d1eczWN3CiM19yO3vDPUNFGNg2iWIJpngIjfu9BB5kfMJ\ni1eRunQMGbNIHn8Y7w8vIXPUMAKZY0iZ9yQtGTcT0xKPJy0ed3wifUVVxO6sR9EK4adb4MfFkJMN\n82+HrGnQs5JI/O24Ez5nedODiIgR3aZiU4L80NfOL8LHcLkaoEKgyQHUT9tQrlaxvOwlnP4ZxlAO\nXsMArvYyqLShXzgHkTIbBjfAlFlQuhaC3TD+NkgZC/L/HEkJ/YNUUft/xxP+U+xpIOShql/x6TB6\nJkxZBDW/hXAIWkej2yZC2buEqycjX/4D2PMYRLegXWRHT+vGEB6GqGtBHPWhng4gNQuQcuiuK0HP\n9xGd4aa7SMbw6lO4KnahB2PwFo3HMvYSaN+DLh9H6wJvSQltgSa8yUFsZi/n8ifhHUwm5eXDBBbY\nqH0kG/wDJD77BeZz3RgaTRgOZSNvdyN6u9BjO1BjVcKxpwhYXkFSG4nYDmMQFuQaB7bhueD2Q2s9\nugW01jOoJR6MvnyEsxvx4EGo2UtgrImXp9zMuZ7hLC7dQEzAjc0Lcf1dyMEIckEfnuybMPd6GLx1\nNqaKCuLf7EG+c5BI0UwcDRdhW7+NvteN2OeN4Hisj77GLGZNOcZ11BA7aibClILuCcOYSYjyPRAV\nhWYK40teBSKIgSmg2Cjr/JrNCS1czm8YHB/FHMM+FnZVkFDRg+gahageQW9hN5a9HsReBQpTIG0i\nnHUhNzYj5t9Gd1wz9qlPoXy1DuF3Y/OW4po3g/Co2TQ89wZV7x/FMSGKVK8P21O7KN95mKQd2xAF\niciOg1BxhuChVGRJRcyZCZYqOFMI8fPBXwRNKeBqRKSWIKRr4KNNiDmzwG9CtVYS/UkXWqNEsCAd\ng7GfzM1OlNN1kJcAyVfC3J/A6geQ+nrwJY/EPtiEv3k1Eb8P2R1E7teRZl9P5LwbaHtvG+otZuT2\nA5jKPUSvihDjzCcnqgW70oh0LA8Spg/1s8udgf7lOwi5G4ovByUWa8ckbOtWowQLkbIM+G0RXF1d\nTJIPcHpkDtZiD9Y5PoS7H2mKCzH7IdTP9vDrAz/FObOdzAmzMe5tQPccJrCwBqVNQsRMg6yr0Ms+\nhsyxiLW3g78X8ub/X83v++D78ITTVtyAhvSdRuMT7/+1830r/2+K8H+G0Q4jl0HVZ7DwctiwAb20\ni0jWDSiuZvjmc/QZNxCcFY1pdwonG5eSFD2A2tBCZEoUsi7RU6lhVlUiP8nC3B1LMKGXhDOD6PU6\n8vU/xXd0E7auUugLwHlLCRTtx6iNJO2JDViLxmKo85M78i2yHnwOs68RY2wOZyY6ESkZBCYPEr2+\nDy1LIhLyos/NgZh2lLoQhsgkFOdSAt0+LE/1YP4qDsOGdjTnMEyf7h8qIJ8YQlgl9GNtSEf6kVrC\niAQdDm4nMngWERGcnjaF0B435+9Yj8Gm4LGYMK0OYB7tI9IUjfmNHeiVTYg1NehXWQgvFlh+P0h4\nq49ASzMi7KNj5xmCG3vI+bKWUdMvJzZvH9bjHyFsu2BUP8LUjGj8NcLVD9mpiN0foWZZUBiJIhez\nRoT4KqGJiepuSoSL4fWXYX39U8RZL2LUXYjihZDXRn06mN1TMLWXwrFW6GHoB/RALax7DUenge6R\nYZw762H2LIiLR2s9x66B/XS+e4ScN15Abj1CZ0U0A1s24R4MkD7iJFLrrxGLViLOmhDGfrTOXrTx\nv0SyF0PtVrjtc5hwEQQ/hIpYCI6E11+HfB/+8+cgbX+bspnTMRl6iX7PjbnUi7U3jGhSwaGDpxcS\niiDih/qd6IQ48cAVZBwrRag+lG4DhjgNteoUvZdbsA9fhKJY6T+4E/OkCTi70xBT7PDK8/BNA2QD\n+wdBscO659Dzx+FpOIC2oAx12++RTkaQ161CLr6VyMIrUUQLyge1iN94MFsCxNnTWNH/EJWVaUys\nr0RecC16bAjSj1OcfZgeRyxpjgb0gTIkXYA5gtzvR8+7C7XidaS9n9F/4WEiOfEorT6EkoiI+9vX\ni/g+RDh1xU3fORzR/MTKv3a+b+V/RfhPMUehHepAnH0HEmR8LXOwPP084pHnYUwWkcXzkeQslNyf\n8NCbVhZf30CotBRzTy99vRlIoxzYpysoZQ1obR2Q6ce6J4SeORxRdBaPz4JiykCZswLR6UX0H0e2\nTkN0WfDNDWFzj0fuD8KqlxEF8fRM66ZhRDwT+6YRHfEhzv8p0uEWgnUJCPs1mDKXIG35CGHzErQn\nYNm4FYPrEuRztYQ8fnRXDsb212HjTpAOg1iMlJQNp48S9LmRiiI0jYjG0jVIq+rE9fx+Lnj5Q0Jn\nI4RawB0QBMMa3l0xBHZ04e3xE7DJBFIljCVFOLtvo81p5cRvX6CkaSUGrQtXuo6l30uPwUSwrRlb\nlA2FRsTwn4FzKyS+jrbqIKG0fLzrD0CJGbnyHGr1McIHf0tax24u6vYgVXaQenIQUboFjA6w5MLs\nH4DnXdT6ZOpGnkOK9OL4sh9p6kQYOweOrwaXHXw68qQFeDp24TQUwPVPEgn10tV1GOeLZ4g9fxg5\n979IdHoDUVNqaVvZhC1cjnlYNKYFbwzlwI7JRurvRHJakObfBKufg8uiIeYagt/8KyLzfKTJ9xN8\n/A7OXB2HOceHfPQY4bY4EquDmKROlGwNvlBhX3DoPdx1AxgzoGMdeI/DMDtnxTBOxU+n6ORmjIZU\njFlz0EbNQz+yD4N8lpBegXtaN4mlX2FpO0Iku5yaCQLHwR6UUjfarDB83YPoqANVRQzWYpx3B1rb\nDtTLw3i3OwjV+zBVfYqxQwJjHaKuCUKCnqnRtKeO56r1J2iPMvH0+B8wvVnHOPoqgi+9zleVF3B+\nSjVKZyqh+fVEUhMxf+FFzfERSPOjxySi7NuLNv92LPtLkTOuQIy+5e9SQ/j7EOGUFTd/ZxFueeLd\nv3a+b+V/RfgPhAjxDp+zNa2NGO0Mq+ZcxriSWzG+9G+w9Bp0/ymC+fsI6wvxtS3hsy8nc0nH06gp\n0BlKxjvMj7QoF+MX5Sh1/YTtEtpwHYNXxZB+H9LklUgJZuSDqxAXX4HQ05A+fx3J3QRXjMcrV+A8\nlzeURiYFGPjxzzHHlmI2XYDdeRxj3CvIsbMR591I6LkXCW/5AtOihYgqN7r9FKHVLZim2BA7OqG+\nBmJTMd2/FJHWgD42HjVKQbrgBfA1INWWEc5MJrRvkPJ7biGcmc2IvhOkj8vgncueYlxfFYnmDoy3\nJJE4WsJ15QtEvfIh9sZNOMZmY7uhDUtbEPHOeqK6+1CqviS6uREhzUKzFdAT7SJteRqOlAkYHDqq\npQmBCdHSCv+2Af9AHg17PVgq6nDn3Y3UFoXuKyFSfA/2MTehjL4dl5oM21+HgAEmroCat+CrldAU\nhPhxhB31RA/U4dbtNBcY6F96PiIpB9O5SsTtdyPGT0f5eiviquVIRgt6+lhMWjRx/TUk7DyLdGYT\nXDcXKXiChAKZ3nAOcvYSbNOuRAxbPJRf3vo2+G2w7Tew/LfgOY6++/e0rSrl3G9WEWpZS3uJg5Vz\nr2ZW1TlapUL6lo8ioXoXsluFbhAJEqS60GcMB89uxJYeSOoE4wDEGpC63ezrKea1hFvYap6DTzMx\nkHCK2MoO6heMoi8ljoyda7CMDyDqddQNGt3jRuAeCxbTcIxRzQQLFqEUXgvaIDR8g7A4ketHIn92\nGuV6FcP4EJG2KHpfLUP1Z2G4tBGpMwXrhCCO3nMIQzJFjVsYEzjB/aOuI2n9B6S1VvCq+SUWqHtQ\nBo+h7LPC2HEYGrORZ76H0XQ1BmUSwpaAMfOnSJodyl+Dwjv+vcvL35LvQ4STVtz6nUW47Ym3/9r5\nvpX/OVH0vyFuBnmTz+iijwkDdWT3JnO/IRb2H4DM4TA8QqTnC5TjPqx6A5pmJ9E8iF7tJ5woY+mo\nI3WMBKXdiNYw+vQUuhNlYttBvvQ26K2AZ6/COukidGk6qu8r6lIPk7ngceT2OvSvdmGeHgBRBs0n\n6ZxioyvlVRwiSGLFKizv5CIMPwbT0EKCpSCLQF8j4plraYkpIR4JZXwvTeTROzGNBFnQMLKELUXL\nuKZ2F9F9h/AOqvTtuIR4k5O0iQJLajyR5GamrnoGY7KMHhXGd9VPaD+cwMCsWNJ7YvDXexlYmk9s\n/b/AQD4iIwPUFIThCFz4IUTvRrz9AorJBPtVKBlEfn0TgQlxcOl5sOY1eOxNQsEyDN37kHdJSMNz\nscx5iBHNjYidq4i5526kqGh44hooGA0pf3iUrauA8gicaILIHkhygLETqs8hXZMDug+H5XFcH/yQ\n5KXT8TiC9Jw/iaZRPegpElE7X8B7ZRrZfR+hHF7C/8fee0fHVV5t37/7nOkzmpFGvTfLsizJvfcC\nuIHpzRBKQjWBQEgChN5CCJhgIHTTuzHGxg1s3HBvwpZsS5bVe5mRNL2cOef7Q3m+5P2eJC9ZKfB8\nea617rWm7HP2lLP37NnlumXbHOR5ayAtDy3ul4hTbXD5PQTeXYYubQM2w2UEv12LWLkDCsvAPAO6\np0PjF4NphI/OR5ufS6SsFueASn3xOLCeyUd3zOO6Ay9hxUB/SSpjf7EKKUOGYgVk0GxFaLctxfPI\nU9iTHYgHl8Pxx0G3F3xunFGN82uqOK/qDZJWrGRNrJdhG3J1kw0AACAASURBVHdxNK2MtcfO5oLd\nG9CRRUODk+yO/Xg64ki8TSEupRDfK1ejeh9AV5GEtv0lRNY4+NUeKJqM6O1CvqsV6Q9dKJe7kC4z\nEpAuIe5UHf1PjMQSOoZp7hBMbcfQNm2GcXkUNLfzofwkD8x+kIa8MPMPfIRh5mz4QkE6fBTd3i1o\nt70C9uF/Mp4J1wwS5pffBHmLwNcK8YX/3ch+gPih8An/MF7FIL63SNiEkSmM5oxQEcP3vIKeKyAq\nYHsl3P0wWlwOYcvzGAzDEBk/RhSt4PC6k8QvOEpwshlTCVi+DkLQTESXgHayD4NqxWpuQetsQgRq\nEJIT4qsQ6RcQ6O5DH9Fh+fQZUF0EZg/B3DscKdCAho/mu1OJs6t4rTJJvYXoT/RDUwhuvAeuvR1x\nzuVoDauQ52Zg836LdlwhdvltJAUTSbPUYfnxh2S01DJh1hJMyWdgjp1CNLfhKr+XrNG/xtRtQ+xY\ng5wYRU6JQlQgzHp0rg3cnn0nC21rMc5M5pXM88l6dQv6MSkYHOOQmqrRmvQMnKXHnPwgvH4XtPVi\njfk4PTaXpCmLENoA3tXvYh0eh5ThA3U9ujEfEDv5DqLdg7D5EGOmoe38A9L4U4hvG2DrShARWLkM\nTh8BYpBVBjMWwNQsuPkJEF9CZzfYrdDdR9/kEhydCci2HsQvVmFc/gfix19HWuoVpDSnouz6iKYF\ncXRnJWJynIV1xxfEWg8Qensl0X49+hdXIA69xanDbradV4JPbEE7GU/GFReC+xn4bBX+AgWp9AKk\n+DLwVyDq+9CNT8cQnk6etZutJ2JkCT8GTwXpbx8izVWJyNeQssyow4eikU6ku5kaGui5vITMHRqM\nWgxl80HbBClXEWmqwXWsiaIiCbPRzqhgHBa/m1z9CYaYNLYFh/Ki4wr2OsvpMg1l9OzpGOOCGGdf\nhXjgPaxnJdE7aj66Q5sRvlqklFmwYRWsfguOHESUzkE2+IkYLiWa/AJxd7xOXHMvOs2LKDkJlQLR\nE4NJ46ClFjnaypyifZxISOe4K5MxK17E1NEBSXrIiCCGOCFpJJjiB43nz1MPRgeYnP8Wm/1nRMIJ\nD91CDN13Wr0Pv/KP6vur+F8n/OfofB3C+VBZCV9UwfIVoNOhaBsQNXuJZTWgkytBmsOxuu2M2b+f\nwkA7sQwZOV7gGhaH64rRnJyRSPswI/YcP9h7QDcf2b0VKhXUUB9q+zrijDPA14ia2UFgfDfmYcsY\naG7FL3WS3tmGqh+PEguRcO8B5BOtcN5lsOsAnD4J0Y3IPZvRmqNouxS001EM06YgdGYIb0MqXYp0\n/BDGifMxy3EYDt+MtamVrLz5GG058Nr1UFkHxTZE8Zko8k2E7t2PVNuH70wb0717SR97E1rBYtKU\nfdR9FU9uVhViIIJao9J5cTEJW76EXV/DkjLklCROWm1k7v8Mqa4D3egRyAU6ZF0PFN2O8Kmwfg2U\nKwhvFJHTgWitgH4Jobpg7nzIM0N1P7TVw5hZ0FoN9ccHuS76X4bNAVjVC6cUKBqAvAYs0bWIhB7Y\nKcFlN8ET90DZGNizDsvGdWQrieRa70H//l6C7x9EEanobp6PcW4GUtd6mGrE1q5nVe48IglR9G+v\nh1FbiFd6kJpT6FlYjN1jQ2x9g/5Ll2F88UtEsBOKz2Nz4SRMHZVk3Psmw0QdupF6lF6BZ245llA7\nkhukxH40nUBtUTEYPcTn9iBWn4ZxaeDahFc9A++xE+SUxpAuvR+aGmDPG9AYQo0rRA7VsrlgHIvi\n1zBF7KctbgLpDZtx58XRe+6t6OYEsEZfIrJCxVLfRu8YB6Lhc7TSCeiuXw7zL4HJxWBPI7ZpLS3v\nGHBeNQATMpE2nEbkKaDzwsyb4eIPIDkHUtcg0m9lxIO7sVpd1IwZy5Bjp+jPH88m8yxKtM/h0LLB\ndE3GZJCN34up/jOcsPOhpd85HeF6+OV/VN9fxf+mI/4LagQCW6B1I3TkwLK9YDCgaDuItTyNsXE4\n29NnM+XkNxj753FdUgzfqHRkXCTU+1EN2fgW3IDc/xljeqtpSs6kNiWPVMNCUgzt6BPSEFIzPgTS\nBR8g1lTBJAtCmYpj2V6EtAhfUgIDOhu2rR4cp3ehm2LFf1c58dva4KbfgCzDJ++i/WYt1PTD0w8j\naQ9CBVA8BNxmkGJQeRODVKaAEGj2eER+wWDU8s65kBaGDjuUnwt4kTMTEUNHET7+FT/ZtQ7j5Kug\n5Tiz0zcRnVGDtjWRqveNlI+ohWOJZDyiQksH5AKn96FaJpLb46EmZxil7u1YI3pIvRM6FDjdBBUv\nIi00Q61KNC8Hw8S9aK8sgBIdwrgO9t8HRuCCK+FEN6QmwdRBKkltgpPI6hcQ9W70SSrq7UVIdbW4\n+7OwuZORjS4oW4Goegm6AnDOOiK/1BN5QUXJ2gv7ZqCbWoIpOxFliYeY9gFCvhq99Bqi4RIsMzN4\n7OvHeb7kLjbN0VNSuY+2IQ4ytFq0ARUppEF8Ec1FM6j++b2M/GYNvuCXbHAs5KnwDtRrI1R/EKXw\nTifGQgcD7niSCp6EpuPgiNKYXUvu5x50mh5hqkG1dyCCW9EyI/i+Wk7q5JFITdvA/XNQpsCsUWi7\nd6HVNWGTYzzS/gSRWgkpqjJOfxDyBWqngS1aPvVxYWaWJfD5iImc0XGS3AodjEsjWvEC7uhWHHPW\nIO9ZDvoitNYOSsZ7MBiWowRXEL6zF+OhXMTxLpjfCrFatNTXUP9gQfOtQCcbmbCrDr5yQb8Pa+NR\n8rL0aOduRiQU/SkS/h+MH0o64v//VJbfFZIBsm6HcXdB8liQ2uDQ44i3z8b47jfQ9jVlVW00ZV4K\nc7bSGncXauIA2vRkNJ2EiLRQuNVH/sY+9I1RCr9uorS9GW/XZ3zbfpKOUw4aZk6ma2Yutkd/D1E/\nJHUScxwjao+DDj+JR93Yzr6BhpuGcnTpedh9k/FaOiC5H/bdAG1foS1ahJbeizhHj4gehvBoKD0b\nMfpm2PcVjHgceqsHdw75I47mz4L566D/NKSa4Lx74YqroOEdaD2EVDgJyxdfYr4yjTRHCGfBNbAz\nSvREMhis5D0awxjrw1NvgFKZzglmlCQH6nUjByfPpkwmrdRBbqwJLV+g6mTU/a+jBg6j7f0ETQWG\nTEcY49Bb69E2pCLS/MR6MlC3j0CxXkEkNYNg0WTCZ19IpPcDAl/PpfvjApq2vkz12Di6VphpePNC\n2vOLULAQSzQQCGlE6w3EIqAVFRC7pxztl1FEowPp7alY12Rg71AxVJ9GPunHKK/FbKjB8G0M7l+A\np7KOJn8FLaky1wQ2MX3gJM9PvxJLXQdhxUZIshOK9KJd+iTlSgIX6v047D6Oafk8/cpD4POBWSX3\nKkHdql58t5yDLtZGYGYi0c5thGqOEB0yG4PeiKRdAdbrEU0a/XclUPmkjrSzu3DLTWgjo3AqCq/t\nIPZsFdqXHjDlIk+cizRmDKYzUhg4Ix4lpEdqNGPUZbFo1q0s9nXgaC/gusABsv290HwCMeDGmDQU\nx4YTSB//GI5+Dl+8TkdfGrrRhbD7JXT7+zF85Ue194NDBsWOumU0m2uSiA6biy/OAWMngiULDn0B\nSghDeSlufxaxV26G6Pdko/9k/JuoLP+v+GH8FAzi+09HBF3QcB9s2QMp7ZA6nXBRO3Lez5AmPIRx\n7E/ZmOJmZOtRbFTwxM6VnDFGQuvfisgAYWiDysHpJV3YhhwsJ8FTgVPnpiM3Ba3Rje1YP8dnyRhM\nG7E1ZSOX3oA6qQRxugF54mziAxkonQO4hvWhM+QjzAEszRJSXyP0V8PRRxGjsiCSCaILLf4YYs5k\niBuPOL4bFj4KxGDrZzD7J1D7PKbalRi6jyCG3zwYDX/9DBjbwGaC6atgzQNw6EMkbxsiuw88m5Em\nPIDy2VME5iQh+WaT6NiBZ0cEc1jCvq4d7awi9F/rEMdbkK58AVltJGDsZcBaQtyF20EpQFTug4Ze\ntOJ8RK0TUVRGzBwimjYWvb+H/ske+qZa0H95AtecTHxDRxBwCGJ1fuS3D1JTnsDGKxbSmZOOJ2BD\nc8WwNAQwTJpPJMdIojQZvdeApBxHFWcS3nyCWFRDnhFGnj+AnHsR/ro+dANedKUSktGLMOVD92qE\nLYTxSy/ytMdpLS3AOuCmuH8vpTVH+F3Zzxmy9RRDPz2BVNlF7PBKlAPv0dR7nCMZhSw6VYs51IuI\nU9F0IFKMKGVj8S07SMuiqSQ3fI0ItmHY04Jj3nXoGqshbjck6tCSuqjYZmbInDBGxYRfNxoROIXU\nZUPUR1CMXmJFVsSvVyFZxkCXBAPHMPe5GSiz4bFZiOtzQk7yYLTttSOOrEZyFkF8OrGcGUiTbEjS\nXMShLRDVody6gcCXvyHe2AlHv4KeFkRzFCmWBePdYK1AvDUGz62P0TR9MvHLP8J6jgFsZ4L/FDQd\nhdFzecq/nBmLq9EvewApawwkpv9pD71/M/4Z6Yi4h27/zukIz8PP/6P6/ir+9Q193x2apmn/d6l/\nJfy1UDUNHI9DzkKwZKAqdUgfXADTn4SkoTRX/Ii0rOtAN4Gr7irlnfOmoB8+Bo69ghAKpAJNEjSZ\nofgcyPucyIFZRE27UIcIvAk2hBJBtkZJORxGO/dOMN+EIAmMZtj3Jp5dD9P5s1tp06+iuCYL89AL\nSegoGEwepYxHCzXBlwtBnAK3Ah4jImM+jLwb8suh5hPYcDeUj4aEfHpDR3CoxegVDYZdA+tWgNkA\n2noIG0Htg2ARZPiBesifBiE76hf19P6uDXtTCJEcQdKmodx0HF11P9qOgxh+eSnEu2FIP6RcTigY\noN14GHnE9eQW3AdPjofqQzByHHQeAhGH5vQR7s/AOO5uxPk/hWOr0Z64ERICMOt3iE1fw7jJaBNP\nIWyJRIrupyf0FAkrnsGdmU5w+ixsus+wGfvp9meiSjIOQxomwyjMUgnSx68jtHg4dJKoEkKcdxvy\nnFuQP/o5XPgYtDwJPV8QU9xoyTeh22qAgVaYUQLVT6IV5tAdLuMF+1ByTrcydt1RipQ22jITOVAw\nimBmAtfljEJ4Wohseo7wjOFY5TTk0FGqXsvGX3+I4RddRNvl8Qxd9gnyvMWw5CW4cyGxYi8Bx170\nMRVDkYTw61Htc2j7eiPhAzqG2BS0UhuSloHWEkPEpcPin8PAauoNLaTFT6M6YTvFLymIFAdmZwJc\n9R4i2As3X4zy4zvwmrw0H76Fkv1hDEQJOKxEYxrWNIHOYQAtD7qDkNsG1V643AG/DcPzKyHrbD5X\nVzH25YfIsnsQ8/bCxmfg9Ca44DHe7DiP9ESNaeV3Yl5+Eqk5hPj5czCk/N9uqmKwIPiP+C8tXav/\nzsIdouAf1fdX8b/piP9CLArrfwaJ3ZA3GiwZ4GlB2vQg9FXDtoWw9SKEcz6NRNn46i5SN9yKq96K\niDsfocUInBoO+4ugTgZfCNq2Q1sqwipoG52A7YSX9HAHcbYAvYVOgq4SRLAWYcwedMAAk66lY3Q6\nRW99wzjPkwRtiXjbX4C0sWiJTjT/7aDcC0wH+6+IbcmHWBmaYw3UXA0HloLigWob5F8D7m4iuixC\ncROhwwTv3gUVa+HgSqgIDfI7ySUQ7YXkDPBlgqkYWtchzbahP2YlaragF2vQxe2A2YvQ0nMxvLsU\nMlVYOBWK74XuLky1u0gLdBM4vAr/OwuJjpsGJh1kTBz8z2V3IEwCnaoSSfgjw1+nHpFVAN+G0J57\nAG3JObD0F4jC66H4CQyShcwTHswdgkRvC4X1o0hel0e/Fk/Q5OT3todxx73IUeMs6uT1tCS4EF8d\nJjjMiTy5AMPEy5Dl1MF/APoMsJ0N3e2g15D6l8NiKyxaCiueBUcJovxenJZ07vvyt2y6aDEPfvAK\nHXdMpOuuMrzjnVxx4gB8tpXQ6o+IuMzY3vMjrKOIDTGTeWkvQYuBkyMOMiBV0PK7pfTYT9H1VRku\naS/u7RWcGjmC0+On0LI/E/VAGBHaSEoGmEoVovkmtKl+tGtO0f/0JUR/+RrUfQtVW9kxsRx3/35G\ndk7jwK8K6Yn0ENz1Gf1PltP1+FQOnmyj4xeXIV5+nOROG9roErQMgTkZ7KVx6IoXwfRlsPgV8FfD\nBC/kZMKeHDjjWgishIpLWVi5BjU3hPdgGOKTYMrF4KqB+EwmDYd9JwRW81P4fyKIKcfhnksg4Pte\nTPYfxb9wj7m/C/+5hbkBFzxzG+xYDWNmwrA4mHEnWCTQ/7HP0Z4Nc5ZBcCvEVHBMIU1XQEP7e5R3\nfIukeki6YC18cjtBr4briw4st84GUwYMBEBqRIl0oq9porBDj0g0E2vMJniWH3skmdYiGNLaikiO\nDhbUiKFJFvqyh+IbtZS4Dx/DtvAROmz3Eq0Zii57AZhvQ8hFoLwO7z+NlJ6KmDGVULwFXdCPnDEd\nob8ITfc0NB1E9CeSuOFzhPkEpA8DrxFGXgDqYZi6DMpmwxuXwa2bwbMPCsxQ/R6k3QrmAI4jBwlN\nNkLjp4iBDzEpu/Ebm/HvifDGH96m2+LkkY9+idEyFVzbsPh0FNKFt7iP1tkjKN6UAse/hkVXwYqd\ncPsipA87UZrfQv20E6kyDBc/hLDeiGqcg/bZa0i+LsS5v/rTdxXzISacheHIaiI9T2Jasgm1/UpC\nOQpx+nqSw5+TZTSghCs5VFBKwuVdWBZ+gS5iHdyZevS7g1Smri3grkTROegrTkbX2EeCZzeEj8IV\n5bCzF7p2I3teRnPYuE9ay8lAIYfzhzE6/hD5w/YRtkh4xowhSBaGUAHq1g70B/6A+UQ3xrHJlF8H\ngb2tOOvCSA3Por/eim5TO90VEnGuKCm/H07Ggq0Ej8TBUBD9YDgqMdCt4ixTMBg1tDYJe+R52pxV\nxGbrcdaOYGi/jX7ZSOb2Nyg/acFfrGIIxDDEy8i37yP1mg547Xd03zYJa+0JjIfXo9kFeIJw2Wi0\nnTXw9TZEcjYM1cHbCgwL4dncif3xBEhaAkWTMey4gtRIPJ9dNI7Leg8gaWGYsQRCTRTHG6hpGQlI\nGJOvw/NqHXGtj6Nvb/heouF/FOHID4PA5z/XCTsS4aH34Mv3Yd9z0C7DOy/D+GEwwQ2Zf6z+amE4\npxLCx/FWXUXIdgxXfCFif4D0MhP6vEmonjY635fR51ihYTtE+iCqEUVP92gzjnk6LEetqEMjKAU9\nmNS7ML61nKx9/TBTgngDmMsh5T2EYQSjhj7PIe11hl5WTPKni0kYOQJP9rkkru6E8m8Jj8ogalex\nefuQbl4GYxYhsYl+7SISeo8Q6/uCtnsLyYxOwDB5Dk2Tp5H26xXosh1Itz0ALU2wYz9sX4Fy4E5k\n8wRU/3Zo/gyp/hAiaID0EqhYhRS1Ym5JJFruwJD+LGL7B1i3XYuiuLjorbdROw7TlJyMQVqLes1Q\nApnXM+TtV7GJbKqpJWtYItbuUxAGnPPA6UJyjKL/YgPG33SR0H8Y6oIwOg+5L46YGEnsm93oen8K\nF/waEjJAa4bGbqTseajlu4kZ+8j9QxN2xc7MnxzCrx5ENzQNPTeib9iAOC6jn58OBplQ2Y0Yqq5D\nwgyaFa3hPgKFqehcfcQsEuH2aoySC1wXwuwF0O+HXSpaeQirpOc833MYe/ORK11oniLCogL3mAqi\nTKHA9HvEQgFcCDO+wDqpmS7PB7SeXEf2c1+gdsSQXvdAdgnOkk50qo3M9N2I052YF3UhZwLNIEaq\nFOt07HpVMKvNgPjZTOTgIXI6txOrLyBQEcE6zMnAjA6qssoZtvokzWOdoCWTuSMRYYiH4iS47Cr6\n6u5myIkY5CqIGhmMiWif+2CcB+JdKFtcyH0yQrPC2yGa7lhEec4MiOwFXzO4DmMKjyHvYJgTPEVZ\nt25wYCUlHalo8eDulZrAKC7AwFlEsw4D//McMEBM+WG4v//swpymwr4XYO7NcMmDMOtCUOyw6V3Y\n+CwMPAtffwEP/RLWr0GfV05ME7gT85FW7iL94QR80hZIshLd3E7KeSAWPIGUdBQ6vdTXmJAHfCRO\nTUYadRX0bSU81IjS6kHO8WLI9UOGDfZE6S+9H0P8AgQSOoxkh3OR+u7n9NizSa1KI+I5iC6azmGx\nmi15Bwn0nkTIcbjPOxcAM8NApNBh3Y3cHSLNq6ErfghMCXg8J/EumETCO+vRegJIF90CU29FK5+B\nWvkoYuQtUHUfWtc3iG4X4WlOqGtBKxyNGDoS9g5HTmlGhGVYcQd0BpGMAuWUjfSzLCTpbMRf/AaW\n3jdwBedSk5RKdXwm/mYFbWwLVn0m+q1jEdfcBIHVYLsQ7/u7CRd3YO8YC4Xx0BcGrQ8pUI8WsKG6\nfEif3gGF42FoBKY+gRh2DlLLJ0RTP0OXcQfeQztIOT5AvM2JJ70PpDDiKzehhGScwTCBHIUeniRe\ndyNqzVNE+g8SKAKrp5+gQYeqM6Fv7kZ/MhuGRWDSo5BSiC+xB3NVGINRIZrVgz8xHcseGabdhdr9\nPgMlZ5MplmIkefA6iq2Cnckw6cfYt92FLc6JtSOCMPWgFTiRllyJnNAKUi2ROi+6Pg2pW0AA+AbY\nJyFnpxPZGEKTFKyJ58DUj8F4Bd49b+CpcJEeOs7x/PPZlDYa56SfMyIwlIN5ddgPZxPduw3zjHlo\nb16NlFSPtaMBiufDkEy4Yj9ixi0ofo1vW+Lw9ulJmrYU4dHAcArTGDcmw3sgjGD9Gbha4PhWUny9\ndMZFUYomY5v8BNKIa0DtJFO6D3PkfSwmC8IwHJm8f6/N/hH/jMKcfNc9aKr0nZby2yf/UX1/Ff+5\nOWF/H3y4FEaeC2ULBx+TZRgxBa48A845BSlNMNQIv98Gw0qRjhlxvBch58qPkK8pwdHRR/yJLvyU\nEJyWQsuSBGpHraOnKEw4WdC5O8Tx4GgknQRty9FMTkzHy9CSa5GcKmQIyPCCFKPTuxbCu0BpgvAu\nxOmfYEndSX4wQOvEA2hjH0V/wcuUp/yM8/fnMuZkLpnfhhFKjAb2cTD2U1oG3iOBMdjXmxHZj0Dr\n5RBpwZg1mnB6MvLN54CmEbvnDrT6/bByKYFzFKLjdMjnn0b2XIpYn4Hh4ySkg22oqh8tfg9UvYeQ\nz4C9V0JfN+Le3yEu/yXOoaeIVVagnfciVF+N0T6J8sqNzJn6OOcMW8qij9/DGDSwbWIJvYFaKC4F\ndxda6RSkCg17TTZEq/CUTuL0j38F594PhTFk6hFt1ahp0+Dj+0Hp+yOxejZyOBUNlVD5GfQNLyKt\nsQlbUwZJG3T4lTYSOtroHj0GNdJNp/cGLP4k6NuG0LvpLWphoKAEKSxhir8L4QkignFwSwVM+BAa\nL0BtnYlWVMP2ZZdTN66AoDXKKdNwoqEmYsKNIBlLl5c4SgavmYHtaNYRqFluQEPOOIe6+09R29WG\n1gmixIb64RZim+OIdEsYZsZgsURsghk6BDjtkK7CITdFpSGqjsRQP/k9fHoFvD0chxRBDfjRG6OM\nP7geZ3sfdT0b0dsTyGoO0jTSz8llrxGpPIgnR0cg+1z4JgHsYyDaBVVXQcXlBCueJqt2OxkJoxEj\nrwazFS1BT2/mUOgsgcN22HQrBDS0krHoxzdSHjlKNXv5xtYA/c+h9fyUbNuXPLvxXLD+eygr/5WI\nKfJ3Xv9K/Gc64e7T8FAx5IyBEef89+fjz4Kxp2Fy9+CW3uUT4aw0eHglgXuW0xXqw+b2ET2sw7Sz\nC90WJzkTDBTWNJJ9aDe0GhnIiie+xIJ+wXg0qQdUBa1DRW7uQTWegaT/FXyVTKwzn+DUK0jfcwop\n+C34Xoa+n4F9E7RMwpz4KJnWexD9t9AQ+QP60os4MBEOzPfTnyFI1skkKGsoqWxgWPhpHO4lqL5K\n1MQSyHgF6pdijGlEtAEA5KuuQMyci/bE1VC5E4Plx+iYDg17EOnpCIMVseso0Xsfw7OgAX+qHzJj\naD+9D34XD6nTobsPTrwC8T0oSiLuq0aj+Zpg12lY8PRg21JzPbqwgfw93Qzp76f6oWKCUhAMZyMy\n89FZwtj37QHDMOJM41FrniDW9CpYfwIuCTnWSEzORsktR+tYR7TyRpTQNpBz0ZtvpV95kH3T5uEf\nPxciiZhCCtk1J4jNlokW96LMXoI5VITWWIvW8gyqQ6CLVwkNNIMaxbp2JSGyMHzuQz2xEgyZqM4x\naOYAyiqNaVc+SekHNZiCeoafrEPkFxHxrKe9KJu0+sFzoGnQ/hyqsxfieyHcAPY8Ci6dQ+WbA7SH\nhqE+FkDxTaS1PZPA1FXEDuvpr7UOjgonGWCeAj8FRgSRcgUTLoVoEdCwDdQh4J9BypBZtPxOIm3T\naW6/81lM3hA7/btxdpxG17AP2SyIvPQI7jIzzqLbIaEQeodB1nsw8kNqdBdTZZ2Kf/HdOFq/hJqJ\nMPYY6sxMUt+ugf4QJFYN0mL69yDK56MlXkOsxUp+5DTO4HI0QxkibRV14gBHuy7+d1rrvwxKVP7O\n61+J/0wnvO5BKJ4Dw878y8//+Ty83gq+9sFhDtlA08sryX3qBcSZeqSlAm1eL6EtL2NKiiDcBqwn\nMkhOeZ2UziHg9zIz/D5+v56gLp62phn8duQt+EMBovGT+WDyLTyYeysn1TDhzElwoAvin4Ckz0B9\nCrzjQSShs84nIWMXiX1f0uK6gEyKCSXBsSXxuHzvk7trAMfQDxApkxFbbkfX5ifgug1NlwoNAqPk\nIDG4cvD9KH66pyajOPwon7oQzQ5ikUOw+Tew8FG0syeDTYehJg+HtgODfxHaaB14/ShTC+DM2+Gb\nA7A1gLpWg2YXluQQys5OVHcd+HdALAQ53ZCZj6ZLIZDYSm64hqauX0DZdShb3yC+5wh82wZjShHt\nd5NsmIF7awsM+OClPTBkPjpnOxG5gZixFd2BjcgVm4kJBUleQlywgcasPPSRdnA3w/44pNgEMp5x\nI4XbaFZ/giX5RqK5pahuQTDbSNBair3OjKYqaMY+UsHpAQAAIABJREFUspZWEZseQ9t6Pewej3Ry\nH/LX43Aer0c/YwKG/Chx/jCWQwfQa6C4qhDWJGT7PGh6Bfo3oVpUhH4IojoHzbMfTUrC6T3K5NlT\naezWoZx1Ib2na3Fccy0JZy1AGTEVoxQDdwwi46EhGSriQVhgqB1LJ9Ssh2inCvpGcFZiuvExDEnJ\nuOqNyCUxFh8+gW9AT8BRSq7dT864IIETh6CzHfPBQzDrLFpOvA1P3sGukIsXS8YzasFVZFhWEbXZ\n6Jv0OZoyAzXOhtQDTFoO6YWQ/2vozIS4KmRtC7rR8zn53FiMqe/QaykHITFzjINr/ucHwQCoMd13\nXn8nHgWOAt8CXwPZf0v4P69POBKAjhOQO+67yVc8C6ofHEOIWIsJb59HXIFAM0J/JIrnWz2WtQrJ\nS86EJAE91bC9iYjsob5Kh7R8CYbwZiJyMkPq7Vxw7gNMDaxG6rMxvi7E9IZ21t18Bosa85E+uw7K\nL4HZj4DOCEcuhBEvguoBwyC7WJvnXoyeF+lOTsRZdwbH0wIM0caiP72fjAGgdSvo+lEyxyH8fcha\nMq6EJGyRdei8Q5GjJrS+PgLNnZwedz7FVQPIZS70I55Ay8tEaZ0C9i6oSEMXPRvhqgTRifZCH9qP\ncpFuqIDazagnX2fgyS9IWPY0So8f7cD9RJr1GHvCcHEWuoWPwRsHIc6Ol130/CSBAvcI2LIB7f1K\nYsPGoVOb4EeTIOkWeP13nD7HQGbprzAnTEH97YWEr3Wgf2s92sgBok2Xor/gMmI7bkJvGYlveAZf\nZvQwe8VOkuuB072Qpwe3ga+W/4wR2z4j6a1GlOFOBn4SJanWg9Q2nejYIFLgCNFPIGxOJnamh1i/\nAXtiDqbki8GzA7RW8DXBtyGiF6WjX9cEhTKxQBbuUXk4lRLkmgNoGd2oZZci6R4nNjMNsVSD+HiE\nms5brg9pWfs+0ypeYUpJEubVu+Dk5/TtvJ/4zDroBPw6RL8ept4IBzfBgnZ4PkBvqoJ00ITziSvg\n2Bto/Q4iL3qoMlkZs3gWwrYNJcNKjTOJ+FAvCaf7aVwbZmiqhDzagpa3hH1TDBztDHByyhU85n0A\nv9lGYzhM7jdBxMXXktiSg/foJthSQ+LvN0K0B94ZD65kyMiDUTegDJ3JhuuvZ/E77/wfJqFp/xbK\n4L+Jf0afME1/x+hfrv7v0RcHeP94+1YGOQSu+2vC/3mFOVkP8RnfXT7YBtWvwfiH6f30dqzDU9AZ\nFUR9gEDRtQy8dIyUcR7k6nbE+ZeAtR5aE+lPaEU2FpKbUg0BL0aTlQORmZz9/nJC+gLmd26nOGUb\nIV8RXSPKKIxfDCOvhm2PQf06aN0NVjPEloNtHujSABBGM2FjFumnduA3Rxme+AgtoS3sz9ewFv2C\nBI+EiDciJn+M2vQc2tzX6MvIwGxbgycpDUxTMejM6BKqiE7RYx5VirDsQMtoQKtfj/R5HXKCipzk\nR3xeAataoXoAYdcj3EEQBki1El3zW8LNw7Hk9yCdfB05XkE/YMJ7Rg6tl5TRH6/D2G/GUPU+hjQj\n1lMGdEfXQp+E2z8W/bhats0pptaq4WtdS0qBjD53PN8m1RAnv4UatxFDSw1qsiDmc6IkjUc/8iIC\n7jWY3S5MlTWku5s4NmMISc1dGL2p0OpG80fJ/2IXWkDCaEvHu1Qi6gygrzMTKdIxkNyHx55EyFlC\n3wUK5qAPxaFi6LajzXgMnfMMCLsg4VzoqkYdNxy5/zJwJiLFjmD2g7R1C8T5wOiB+E9RrjkPqeM0\nWmYxdbM/w9vzMgVZa5gW3YY9dwaNVbWkb3uTaM0G/FOysOGA+D5i3TpEOITo2Tc49NJqgX4/lmHF\nuL6NYLn8OcS4X6F+9Sm6F9Yh791Hd4mFhKILkdr7MZuasdUOEE3V09mtI9EYQ9cYJmqppiYxh4/P\nWMBzp35GqOA24iyTcTbp6J5WjUFKJcFxI5FtTyOiKZhlBT5+BHyVIDpg2m9hxAJ6T54k6HaTM336\n/2ES37cDhn9OYY6bHwFF+m7rhb9LX+TPbs9lcDfLLX9N+IfRo/FDRvLEweb2wxNJmdiDOAaYLTD3\nHRIcc2i/+DDm5v1oU3shaoKmbliUifctSI5XkWJd2FJMeKMygQWTKDq0hpJv1tIwZyKcOEH7WRWk\ncsmgLksCzLoX6rdC217or0BzREHzglIFUjJx/gziNn5OY8L5iILN6FsuYqRyEVbbbHbonsacuod0\n7zhE6zbktFK8lmfI0N6hRXsbt+YiJfEQWn4LFl+M9EALkcrjRPIc2F5oQRgV6FOhOgZDHXBlMUgO\nOCsCfSOg0w9fv4p25DSxYyrWcA1UnYB4FS7dgjjVRfxjVxNvP4/whTfR67wR48hmWgsVEp+vxDBm\nOq2LBDULI7j1E+lKcVJWX0OhfAwRjSAsRjINbWjBOVib8hE6hXBbOv3XX4+Pk8R4Fl2ahK2lF2UA\n7KGZTHt8A1pAQQm50QlQE2SCeTr6p+jwFUwkbN5KZMCOkptERtcxLH0gRc6GnOsJNz+G1FlDyG4n\nNtBEQ+x8cqxPYY90QvoStNIwGI6gLvgFauevUBwhDAfqwaGiFfiIJMtIxxaik2uJ3uIgGj2N5cWZ\nJBsGUBtbUAvMJF61D52xleov4zAUJpGROA0+eQaRISOPscHmENoQM6JaQZPtaEWTEIUjyLr1CNrL\nS4m5E5F/vYbgEHC96yO85Gtcz+7AEp2IIedqAr7XON5ahHlqLz2VXrLDUVZk30hr0hRe2/MqZqMf\nTd6L1mvEk3gYuzyfNH6JgkLtmNGU7dsIv/0Arvw1bN0BF42A/EEvu+/pp3Hk5X1flvevh/IvPfvj\nwI8Y7IGZ9LcEfwC/af8vvv+x5b+E5o1wYilktkOLAyJWCIRh2hrIHkdH00JSvt2NXBeGUCHMmgFD\ncqi66T1KzzqNKMwDkwdPUjY1JSHMPitDOu/BtOJuBoa2IhIFocwFhLujZGxpR77zVXhjBsz8NYwq\nQ2v9CWQWQGwPdOVBvR++dNI1pZ/fzHuV5yyFUP8MZN/NJ5a1GF3bGN8dIbWpFynhBMGRP0amDn2o\nGS3aiWooQgtMRVq+HKn0R/h0bQQmVxLXeSPGlvVIgTqi6bOJBkuR/afQF+xF1BmRl5yEo2eBtxWO\n1dO/Jom41aeRl08B63C44+PBz6u3Bd6YD4vfgdsmEV4isXPRRFrtWVhcUbJ7WykKyCQ/uJfg9IuQ\n736IttDLWMKbiHP1IfVNIxbcg9X6W/jsTQg2wLPNUH8UNrxI+OD7+MaasO/0E81yYijrwduegKVv\nAFmJIvepdM/MQMxSsHqHY9qfgGzfCoeS0NJaIRpG1AIWHcQLYnIMVadDZJlRUycTGTMPiy+G1H4Q\n1RskesZmdIZXkdoT0VadjbJ4PrJvP6IqFWndCdQ2PSGrjepgAdabrPTPmU7JR2vxei4ibbaM3HAS\nPDvpi7XTujKGcFjInw1WgwmGF6F59hPzGZH1Q6DuOJpboHZpSH4bJDkQXi+xG66lo+wIXrWNtGea\n6duskDotm76Rk8lo+JZjw2z0tsSR/GINOTeoHEpbyOxvehDBSrruzUQr1IiE3KTHf4BJKkc07YDq\n1RyJHWTkY0eRM0phvBNGL4b5t0G4BkzDeGPCBIaeey7T7r33ezTAv4x/Sjri6N/hb0b+N32bgbS/\nIPlr4Is/u383UAxc+9dO/b+R8N+C+yPouR1yXMS67ciFN0PvKnBcCweehfrjWJPKaHHOJ++zNTCl\nHopfAd9yEsosaKN+TjDwFooWxFtYirG2mZJ37MiuZZAwDPNX9XTmJ5Fa8AUMeYCWH53CueFGLD/6\nFN2el2BYPaJtLtrKRhiRCOEumPY4FL1HcrSWn4buZ73pLAr1XsJqJ4nSJVQ7WphVd4RITjcmWxRf\nYCU1rvHEci+mta2FghY949oqiQ2Lp3l0BofLhpMkxQgUtBOv3Im9vYmsta9h96yjZcFPMYXGk2ja\njHz6AtDFQdrP0eJCRJ7+PbIWBV82FOqgrwkSciEpG+91z1Nz5G6aHl+ElAAFtXVM9Q5gds5DjHoD\n9m+Dxz/EXHgREd0xorYOYv6bsJx6C6Q1KAaJ8JG7MXY5YMJ08PRAbhmNw/vZvuQ8zlvXgH6eF/1F\nv0FzPUdYH6CvNYDtaBN2r5mUej1hVwRTyXZImgXWIWhPbYNP5yASqmDWg9C0AuL0aMYahKbSmT+K\nrM92oTfHI065IGELIjoaBRuxXjfmffcjJiYjN21CWmNB7DyBmqJjtX86y3qv5+uh1xDQF1Dc/g1q\n6RTsE64dHHJw1cPsxZwwVzLRX0GkPEzXugiGoIytbDgOtR1x0kDHL2aS/oKVSG87qs9DOBIjkuFG\nmmuA8NvE6mwUfaSiEwruoI6mOj05KW3IJRdSYjjAq/dcQnvNWjqPNTEv422iLdmoEQ/WZwWu+2Jk\nuW/A2PUiRPyQNwuKLyZ5zz5EATBwGua9C2PPG7zuTcMg6CVt1CjG33rr92V9/3r8rUj40HY4vP1v\nHf1Xqvr/DR8AG/6WwD8aCTuBjxlklm0ELgH6/z8y2cA7QAqgAa8Cz/2Fc/2wIuHQCaiZBN4gOBXY\nK8OIHBhdDbV3gGsNyD9GXf8xq+cWM6fBSoLzM+gaQ3DBMNr6DkBxHBkbGjGphUgzb6B353r0bXoc\nzpFw6e0c+nwu+b0J9BZmkaysI2HadoIHnkUJrCE4/WFSQhsQpt9B/3bUlhakibeA0UlH45t0eCoY\nHZRh7KUE2u6n0a7QoddIUcIMaT2KMVZOtTWDZ/IuJM7l40JnkMKqV4nTJREun4waeBW3eQJ54iVi\nnMYd242yvpH86hDuH93EzsRPSR6IMHLnRqTCa7Fs/wKWFIPtN0Qruhi443aSlkyBHDsc/A1cuwGG\nzoOOI1RFvsZcv4vc49vQbdbBhZlw5RGQ9H/6fDUVTl1Bf88J1kweyeUVbgzhBogfg6KGkKyrEC/a\nEWN/DEqYqK+ZDy51kNrSzvzVh2D2fSBehoIX0LZejrbTg2d2BqfmzSZXfxWpq1aD//3BfJ5Xh5Y7\nCgocCGkAzbUN7aQVaexlqKGVKI5RDITaSaqpheka+FMGW85UC0GbQHUr6JtVDNvCUAuMt4AcRXwR\nZdPsF4ib1suY957DnBiDdA8UlUHKJAgaUVWN/uQKXMlOipw3wf0/hbRmonlDadgOAW8pJdfUEtgo\nYyoLYzzRg2qKEbw6ir74HWJH9bTwKAWvHoOwCdnSR+02Kz31ISa/dju64pmQmIa/sIiVn/+SsgtX\nkPfmuXidNTgTEuhPrCfthS7U9lQMN7+MPGMuHPsENj+E6u9BCjuhrQ8umwnltw2Wk3a9DVll+CZe\nhy3eAmpsMFX2A8I/JRLe93f4m0l/l74iBq8UGCzMTWAwNfEX8Y+2qN3NYFg+lMFWjLv/gkwUuAMo\nZTA3cgv8V6f7Dxgtm6FpDPTLcAiYEINaF3yZN0ghmPgMSDVIUidGQ5Q3L8/Bn5JE3aJOuk3fkJEx\nlSH6L7FYhyF1uEHbjX22iYPTdEQX3wTfrCLrWC/Omz6nOJCH2p2Me/t8LK43iOtLxziwixba8Og7\nCeSdSeSbGME770Ht6aG3cx05w+5BjH0coZuENTidfN0LjDWvYfipLoRJI+qLo1RXwoq+oTy17jjT\nxTwyEkZgK1iJQ7sCc4dETzREM1fS37YcU8O7iLRcam6/Dmf6HCbob8Rl8rL/7BnIshWkOHi5Fyrn\nE9mxDEP5H79Cvw9GXzNIgAR4qn7E8G27Kdy/E50UBCUCJjvsXQYP3wiR4OBxrmaInYeIdXL+5s8x\nEIO4YTD8HeTSFbTEn0WkKAqpiWiGLr5ZlMN07TzyIr2g6aC/GdIKYf9LaAMRpLFgHX41Y+ujtFmq\nadDvhKMyTAmDcMD+Y0S7LfjXbUPrBQkv7HoNaftU9F+FSQr1oxZmwY5EvLYL8H2TTeyQgvwG+Fea\nES8qhMiBpFRE7m2Igej/w95bx8lRpfv/71NV7TbT4+4Snbg7MYhhwQkSfHHbxcOii+vitoQEggRI\nCBJCXCaeTJJJJhn3mR7r6e5prfr90fzu3rt3793lu7Cwd3m/Xuc11TWnquvVferpU8/znM8D8yWG\nRV4h3duEafJlcMsKGKVAswuQ4HgpTUVO2gMusvaXQaUDGh2gCnQ9VRQG6xhw1Rwato8llL2Pho8q\n0OiMhgCKJPQrP6c14wVyLb9BmTob3QAPYZeOvFPAe+VQfLkLYNQ8yBuJESuphVakeIEUPIwa78Fr\nOk7m8hYUswl9bgh55z3w9DRY8wAEVaSUhWAYBBY9bNwPR96FtZdCVxUUDMP66fnw3nlgsP4MN+A/\ngcgPaD+MR4AyoilqU4Bb/rfO/6g7Yj4w+fvtd4AN/HdD3PJ9A/AA5UDq939/mXia4Jv7wZEIs7ZC\n+8nQFob0LqiwADHg+hR8XZCgo1BqwR2y06e3kN3QgbxFgjwZxpRCzhlQvhQq69EXxhPs7qDx+QfI\n3vwsydc+Hy2SeOrtxG2KJ7LtOtQ0M9LgM4k5/jgW1xSOnbOW+qqdlHQESbr6SdruvAHl1EbilKTo\noojatRDwYf7gKcyDRoKtGl9kJsfNPQz3+6F1I7qCMdDVCg4nwpKMiOzAX22h/9HBxFZ00TPcT9uE\nBCx5VWRsqIKEE6SaU5juzaJhkJ1t/QRjHvFh2r8VRAlS4jr03QWwaDW8eDpcvyLqjmjagcljwKfr\nxKoFYcpyNNNNYGhFlL8M8Wnw4YLoY2B7I/Q14Bg+Ei24HsLdkH4haBqibh9xByyEdaA4BTumnEOa\nlEkaWTQyHmLfg4kqhEajzVmEeHUAmuREFzMBj34ZJftPojQ/CX9yNsXNm2FKMVyzBsT79JbaMTmN\nEPBBZxFaZiri5FnQ+BKybg5a3RPo9rwPDRHkqmQUQyxmcZTWOQkYtofRhIL5xF6YP56+xCpc2Yvp\nr7sSXGWQ0B+6kyA3Fvatgf5n0RnTQ1c4nsLS3bD+McjMA2cXVIVgRBjd+4tJH3sNnrpc4hY00XP0\nJOxp1ejkwUSKJpC07Ab0+laQ9hGe4US3ReAxBLGfn4jZM4fA8WEcyb0KT+cBRpeV0h4j4c7sRTUZ\nSf28Hc3kRJV06PrfCFV7wdINgxdC2jgIh2DjMjixDhKToawDTnsFyp6ArXdBxAwXvh/NKPq/yE8X\nmDvzh3T+R1PUHgDu+X7b+/3rP/wv/bOBO4g6r4N/8b+fX9QdokmQB1+BfhfA6HvAagf9+OjMbdQG\naHXDxOvAmQ91++DEURw1fVjS3dTYC8hsPoIoyiZ0sBWtZzVi9FNEvOsQ7V8hmsoJ1DgIyG0kTL8e\nMXEhmCwAiO1/wNPPju5oOVLHWjDpkLsGYi65ElN8HGX+BpK2H2TH7+aTU9WAcutLSOYapNJ7oKMJ\nqoIweivobsOQ/zjHmj4jfs92lFCYjhFzkNuWohx+H07U06ffiOGTMuxHm2HRi4QHmYk5OBh/zze4\nYl3oWveg3/cmXSP7kaK/iryr3yTc10ztJROQp9+D96w30ZkFSve7iPaDEKoCTz1Uf4JUq0dU70DM\nW0JLeAjG2teR7G2IviI49beQWQSZ2WBXwdgKTjdC+KCrHmrq4OAaIrLAOPZu2keeylHLh5j14xkg\nJuGniaA+jGPDF6gDnfgdY5G0dxD7QlFNXSETimnCnfEZdUmzSTzQjcmgIkJliOYIct5ULGOOE9rj\nQW4BkWzDe7uK6KxAat5JV3+VPucwrM0RlPowPLYbUQx6cxzWTeUYrV5qc/JYc/e3FMcn0OPuIEfU\ngHkcbL0eCEHfR9Dvbti0Cnr2406LY/CxKuTWHqjogbteg80fQ8YEUCIwbTJK7W4iKb1Ik+OJSagn\n0hHC2P+PyFVl6A+uRTP1EJ6VCC4/ytYediwYijspi47CmVTJzWQfWkq/yoNwzEXMCQ/KkDBuxygS\niq5F1VkIF2WgtIXgyDsw6WaYdSMkZ4K/Cnq3RIuPNh6AhQ9D837wiui+4EFo3w05C34ZeWn/iR8l\nRe3cJVFD/Pe0pf/w+/2P/D3uiLVEp9Z/2eb/RT/t+/Y/YQU+Am4gOiP+ZSIEjLwNis4CSyooKRA7\nC0Z+CIZ0mHYX6uY/EOg3Ht/Z16BJZhQpgYzyBpJVMzvyToavj6Cs3oO87Qi+awbTZvUSaTSixQ4h\nJQmcI44RKjgOUmvU6ANUrsNgGYR7gR5/jA5NGQj2JKwPLyJXPQfTvBvYZ2lkzGOPkNKXhMm4A3Hg\nEcKdFrSMfJhyBNKfg/ybQbJgZyjmhmrKY+vZGLcV44BXoH8hWl4Af81+DGZQs5yEzz0Z+cL7Maxz\nkWR+HUdaKmrzCRrGpWBdtwLl5ClwdDc6yyDSN8m0vP0gIU8EUp2Ej1rQrt0MJ78Kkx6FyjJEWQtM\n7kfXkCwsBjO1b3shRiXockDSqeA8HRwLYfw7YDWgFT0EY8ugPClaamfhctzjJtNu3UuXFEQzz6Ck\n8zMA3BxCjfhQrTGEPYdpU+7G3fQd2tYmKLoVYgeg+8RDly4GPMeInZcLx0PIb/ciTlUQxo1IzWnI\n+mLCTUD1EYy3liJfvhZ3+gAcfjNxE55FklPpKIhn/4arYOM+xOBLkF+tRbl9E/k9rZz01gSe79Tj\nMEyEhFeg5gxQTLD9FlBzoPwYLHgRevvI//IzlEwnkAHFbjDKhJ1FuOddQlf8YDztO+meNpLGhXb6\nOiQ0SxN9Di+1315Ia9sLBDIEkeJ8hKsDxRWk7MFiTszKxaJVM+Db5zhp7VbiToSIbGzDsK8dvRXM\nATNHCzNBbyA8aiAMGA8nPoGZD0HP9zrOZe9D2XIIZoJshqALXjsFQn1w9hsw6ArIPyuqrFZ675/H\n6f8l/l4D/NOmsv1d7oj/LQrYSjRNowVIAdr+h3464GNgKfDp/3Sy/zwTnjJlClOmTPk7Lu+fhMEO\ngMeisnemlSZxEcm2LDKXOImrAnutg3xF5lDqPDpzS3FmdEO/eCyGa1GGXkWgawDyluMoASi9bhyT\nddMwNH6MVn4vImYY5I9B501EF56LVLgezwfDsV40C7F9KZR/h7DuYdU1o5l80WuIPZ/BRbcgjIfQ\nUi4nfGguSjGw63rEpO0gGSgxn46qe5K+YJASbSKUbQFLKl2xWciSgoiZBi1bkebFozP0wYm3kZYd\nwFbrRmvRkfRWB6I3jBrbgXz5eORTnkexJpNx/110D6mlc5qO+L2d+J5Yivn++xDPTwHJANm96BIu\npVvdQMa9b5HbKPBfB4eLdjE0GEQ2WuCR0yG3lnC8FVdSGUlLtyEGFsCQB+DgzeiH3sw2sQQDp3KS\nciUoD4P3UzotWyHcich1ovTUkRwchK5qEZL9WfB7Yese9N1pVFfYGdBvF4aXD2PUjYP4CsTWACSa\nQC5GScmg2zwRQ/VmDM3liBF6zG0g5SyEskVQX8X2EbNoKY5h2KzrwZoFQIBeDtxwMoXBPM75+laW\nTp3Pqbv+QHxrFySWQ/p4tK6jEH4fCnbAhATY1ogWboPeNsjR4JWpdA0ewQnxNda0UrIP+Ym4jmAJ\n9iDtz8dva6Vv0mmEd+8noERo8zpI1R9E8qbTFGOm15pJdlUbQw+04rD0Q3PF0dNYTXypC9d5Duxr\nfLhV8Jvb6PU8BhEZw/4+vGfPRH/0KLqpD8K2p6I1CPtfDO/cCTE7Ic0PvVkw+4HoeBcSlNwQbWF/\nNJAqfr61XRs2bGDDhg0/7kl/YuP69/KPfqqZRINyW4nKkNTw31eGCOAtoI7/fTq/ZMOGDf9hfLN/\noUnieixk6WcTt+4DknNuIyLraNBXUZ0WS6NZIqnBxc4BORRVlSH16sDUjLKlFimYhFKxFxGrEvDp\n6BwUS6exl4acDMI6HXZFh1T9Bvqwg2BhBK15EuHDLehvfRmOrKGr7Wvcuf1Iye7FWmlBtHyHmHYP\n0og5aHf+nkhHApHdlUjyFwhDACnzJMSulTTGxTMg5RCiTIXS9bj9u3DUxCCb9iKOZhBpaoNjcUhx\nLoT5MHJOBp7fFKFfU4kyci7y7bciYrIQR56BsJvIN19hVduxxSYTsPcSGGJF/9u7EaekIzzAiEJE\n0SCwDML34QYs1+ahdMVjP1hF0wsvY6ytQic+QWtrRxppxNRcgVq/G7lTgSmPgLeG5sBeavxexqgT\nsBgKwTAeuu7Cb+xHbJ0Rs9KAplQh95Yg2U8HtQW8y2F8CiotdDhl8tf1EDo3Nuq7btwHpn6IWfHw\ndjksSMfQ+CXhfT34bxcYz52L6N4HX65HmE+HjCZWTLyIutg0Zu9+mu7sNGrFxxyT1pJeaaQhoQPJ\n38DNo+7E4TQzXOoEvQd8R6BLRPODxr8GBgVcu+CgD4p00BkASx/m4jrSw2Uk5gTQa+2YdtZhaPTj\n6JeGrroCqzEf56dbMcX5MSb3oAsYkYJm7JFqMjYPQJU7SNl9AM2dSu/mowgHNFwTg9CnoTeWYPU7\n8Mb4ia1rwVruQ1y0AV2jFf/md1DTDIRPrERp9EPvbgjvAjkFZt8NY+8Ce9J/H/SSEjXKPyPZ2dn/\nYRumTJny47gjFi6JrmX7e9qKn84d8WOkqK0gaoxr+HOKWirwGjAHmABsAg7yZ3fFHcBXf3GuX1aK\n2n8mEoKqzSDJIOvRMkciDq0EXwckD0X7Zj7keoikP0G3VEO5uQ6BG6HpKOpwEv/l1/BRM1qRQMNA\nw+U60ipVpHEvciS3jXDDIWKaFTI2f420+F0CTgsdymfY75OQUxyYkvbyQWGASQfWs3bmbKYHtpJ8\neS8icxji0jPQDt9IeI1Cy7lPEL9+L/pLhiG/8FvoktAcfnhqCSLutxzmCDGhm0hVViO+Wowmb6A7\nux+xa7wQPxl8Knz+KlpNJ4GhFnT3LEE2DIeuY9HZ4Irz0NrcYLMgNvXCxFhW3PAq83Y9hb7hGFJM\nCdSvR4xWUJWRtK/rIPHCsQj9vfDCFHz2UwglzAqSAAAgAElEQVS/vBTjPD36c05G27QR5jaj+fV0\np2ViSf4Cg5ZHh2cj+kbomTQX6/mX43j4YYTShqdzEea9BxApYVRFQuoYiohcBqW3QubJ0NZLo9hB\nZKAgU+0iHCNDOIJcZoLjSYi6DlgYA5/LYIoQyauh9ZswsbeOROl/DF8c+GqG4M8v4YCvCZ+UxnC5\nkXalB69OZcQHjTgiA/juNDO5t37Fpy9s5VOdmzVsxsZ1iA9tgBfkEbBgC6hhWDoJavbC8Pug7HEY\nMgu0I9BtRDvzXsKP3UX3BB0Je1xoiUbodCP6zYUn3iFYZIFFEXQnIoj0mbBnLWhJdPcEcLR2EgxA\ny9WZBCwRnAcj2Mr7I7f46brwPMT2ZcTPuY5e8Sesr2oIQ5j2U3owMwjv0HT6jA2kryxFnrcKAnp4\n4mq4+QWI/wFL+n9GfpQUtfd/gL055x9+v/+RfzQ7ohOY/lf2NxE1wABb+BdXa9NkhaBuJ8ryhyDo\nJzL9HLS4HKSNLyDZBiPNeRLR5UepqiK+7ysmJpwKk+6Hpl2oQ4ZB0ja07MVQfxyxoQ/HgxH8V8Ri\nVrMZMP26aPBvbC6MOR+ObuQp+2hOt5finKon+GwTgf5x6MaMISW2E8mfh+3TL2FYH6z7Fu2eb9HO\nzqEmbxyt+YVkTJ0NS86A9LFoA/eBLQSXv05kVpgDFydwmpSAQAEplWBnMrb0Bjj9TNhzEJxz0Crd\ntF+aiHplDNZjz2E9HA/dVdCTDN4UREk3BHqjP7PHVXKOVuKWY3EWP0d4z60oCXZkQwlClBI7MYdQ\nxUH0gbugxo25czXaG+MJq5uoW7qXDLcHPCOJnDYV3YaXcJ32NCntdxCXPgWKof23owl+vJ3Aju2o\nU+14LZ0oWRoG+hD1cWAqQyu/E2FWYFMpFDRi6s3AlJeNJk9E9pXjTW3C7O1C7N6PNl5AVQARUwjX\n3o28+mIMs8O0LizF/mgMxtNHYI85gFN3GS0+M2rNm/QOTCPBW8A443mITadC7CYyBpdQ2W3lysNv\nMX9AGi1KLIZ1V2PoyIX0Mug3D7beDLuqIbYsGuDd9TL0WwC+Csi8DM3YhFhxDZ0j4rAOnAf7tqPt\n3YDQD4DN76ANGYs6dDdKcz4avbDpS2hQUU1+dqScziD3esy3qSQHh9K5RcX37Fb8dd+gcxjpnZWF\niS644mwsWXbEhBEw6VosA7Pxit0kspgwPbSf8yZBnifRfAVGWyxcPQFWVP7ignA/GT889ewn4d9P\nwOeH0teGaFiL3FZFJCcd/0ALcmUd0vG9iFAf4dgOfEVB/OnN+CPv4c9wExicgSYC6GwzEJoAuhH5\nl8CxN9BiQ7RVK5jNIK15HylrOKT2wahiCPt4V2RwV9p5PJo9jy7TSkwbatmbYCONAhLNbdhTJrEv\nPkBBfCrCMgS+Kkd1eVlyzSLOfOBOLJ8/AIkWiNsTfUSO2FAHmVCPfMHA175A+BqRmvcj2ncQsR1D\nMeQjepdC4lC45xGIsyKV+LCWC/py3RhLQQQ7oVEHI86AkAaBBoiLB3kEKcY1NOt6SRg4HP97Mv4P\nytGdMhTvu62Ypko0F5Zgf8eOiOhgegRsEeQNYeyBeta5SrBe9CiWtXejHA3R2+XCPPIsJCWWICcI\njOnCd7EX7chb7C09TNz6DhyhDkTKQIJ9eSiiCnZ3IkwKxIVQC71ozl5EvzA6lwlh64fcm0yguRbd\n2gAYI5DSCwtuQHx4O5HzbiGYtxdtdQhdgwXbkFYw+JE7dyICJ2jNjpD70QHSghdESxFtfhqyC7BU\nV3BoXA5J69aSLn+Hc/NWlOV7EZkRCPnAIqBhFWQeBzULxo0Fmwbdh9FSGwjv3Ie6qg6cY+me3YCz\nZQfaF0a0uiakfgLOe53IbA/ahwdQJrWh2QLg0VDbHEg7u1BrXWihOBInlNO3tZneL1wYqoMkxgQx\njRhJ1803EwxoxHt8iGtfhIJ+0LAFxW/FlbSHGGYjYcTKWMwMwSXewT1MxbinETlrJCSk/dx33d/k\nR3FHLFjy97sjPv3p3BG/Llv+WyhWCLoR5cvQuerRJQ+BxCJI0IGmotTtwPjZAfB0Qq8HuBDt8rvR\nEhzR44WAE0vAnxVN0/JWYYxJpndaBr6x+7Dd2IBxTxO0nECrqWbnTSM5uakcJT4b46YufONd1Ayb\nTsHUBwm+kUCmeSvfDHuYA4NPomR8MqL5EBFpGLc+/yZxwTo0WcM/bRbG4/sg4whiQTvujxfgMFfi\nfTUf00cFiGXdhIe14xmeis1dhd7nRHV9jDRZQLcbQ4MdOW0M9lYXkfOuQ3nqMnh8P9gT4OEiMDsg\nPx/OuBNp1Tw8Wem0dz5G4vAhhAeeSfdl36KflYLWWkHabR/R+rupJDuuQKu+Bt8HczHq3cgnNzHJ\ncTab3nuRKVobWi9YCk6l3fgiIuDF2GLHKQ2G11/B1KUxVjTSI/yo+hCtjfEYHeXI2ckoRdVozi6E\nmkjEMYDIhOPovlMg1w8ZtyK/kIOxxo8a6kMadTt4n4WeD8DnQnLVo88KYn8uhd7tzYTih6E01tI4\nYjD7TfnE7zRh32NDHnwDnLBDuhmhDUU/6jxk20ZqE6eQumIFZI+G5GpQXZAfhu4MsFohXATTHkcz\n64igEak7gj6nB6VfJ8JlI9Qm4VQMaMf9aJUHkQsFXPw12ubr0WJ6oFqHiBOgD9PznB17oZugqrF2\n2mzGnbaYnISnsY9+Dvet95PkeRjppnPR5p3DvpjDJMwZS1H6yXB4C5x3LxSfjXj7NET/XFQ5gIQB\nAB0JpHE3AUs9bY8ZkHqWYvJ3YjeOR+b/6CKN/x//z30BUf6l3QT/FHTmqJZvymVw0nswfw3MXBHd\nnr4cLq4E5zAIB1Djp6PNXoy4+1qkA8eix7uqYH8ZdD8HjomIomKsw424/1iJp6OQitviCD98LuGL\nMiA/jyICLKufCq8VYS0swj2oGL3fR/w78wmsTCQSuQAvLvb3LYPuL+DGG+Ca2+nJTkUENLz1TpSl\nn6Ke7IJ+y0GS2H7mNRy7ZQ0GXxHy3npYHCFy3IPtziaCy7tp0DkpmzSXuhsfRJ01FzkdyKxFkTJQ\nPnkPTrs1aoABdAFIzwB0VBkOQuoUcg4MZV/wGrS0UuRd7yHCrVhma0jLZ+B95Sl8/atQvY/je9iL\nLqkX+dSrwGREyVvAaHcQSdUITyvEcGwLKYdnk7pkK8673sa88h0Uh0J4TD5m5xGSqUZqVrHZ6tHl\ndNIV8BDWFCgVaLszCRlCdL9jQMdw+OIIlB+CjxqQ0lwErgC1rRmBDdFTBxMlxLdvozABaeo22s4t\npCImg21jh9NZ72dI/SBym2rQuvciZXsg4IBTV6N5/Ci1AVKNWXTl6eCsF2F1DfjroG80GPQQWAUT\nS/GNuYW2tXfiuehBQjs19MYBiK+GIg4JOCgh23oIN7kIP2lEHikjrBpa+DDhrN3Iq4+gOFV4Jx66\nIziyu+ghHuWyOJouS6ageRfa5rX41UaMFCNZrTBpNmLWmSgoOHBC/zFQux9aa6LxjGm/w1zehI99\nAKiRCP72droPH6Zr/QnCHw+l51sbtZEb2LN7CNt/swhfU9PPcNP9k/gXSlH7lZxx0fbX6DoRjR5f\ncgD1662Ilg7kZz6AJdfA8uvB3wQjzoWCeBicAKVNmEQuasu3JLqrSAz70dJDaDFdCNnGNVXPoe3T\nwaRORNdyjrXMJf7LA+jePIDOcA6acxaX+3JZadsPnfdB/ByOxJ9CxbT+lIwYQejptzA2u5AynkQY\nZwEwSowiPsaJVn8QcXg12lcy6mAf4ozFWK5ajnFXE4H3svA6VtGU7yUtEIc0+EV47yaYfCmM+V6P\nOuyB7FBUqCeUzjprNbETbsVx8RkY1WK2XZvDwKAV+/gKJOMR+MMn2OypGEsfw3fnfvSZevRZMsy6\nEfXTV+DSgVjxI8ZkYkqYCzkz4bN7IUuBQ91oXbWIRU9Qn7yb3MpB0PgVmmk4kYePE7mshIS0bWgK\n7NWGUSjakExm+r7NQIz5Bipc8OajcOmjEPMZprcPwSwzRDog5WYYdDN0/w6973xISEYrnkttYC+m\nHpViWwqG755B9YXxyimQVI5IkAlecgrygvOQD3/OqKFXsTPFBbu64MRhmJ4Mp+ShdaiETozmePgO\nHt9/EgPTL+OWEY8hKr8FghCbDccNaNOyUAtr6PlsOH+441we3HYHwm6GuteQ/UPwVjdgHuJENMaj\nVnUipoZx5BYjHyvkzpXPY3mkg8hDBnzhjVh034/NU04Dg4F08ujPSDi0DMaOh3fvgZtepeKD5Zi9\ne6mvvBHfijwkScUWq5CuHMBiNGBMHIBl+IX0fBdPJKaR+KfGYTb8awTq/p/4haSo/WqE/1EcWTAv\nWnlAGugh8s1ypGnNcPtoePYgwjgPznoQVB8cXQy5k5G+/ZSkC17EkpNEW9NMLGHQOscigmtB7Ua7\n7kpUWwXhUDedWYJxy04gmrdCwQJE+jBsb4/k1HM+BfdQyF1ITNVZTNV8MO0zDidvYezKJjB8XwdM\n04jvbYPKOxG6AlhwOeqcU6HzXozOTvh8BlqHHWdrD7YD5+K9/lL6Rg/C/OUMxJiBkOgDzQOHdkDG\nILA6YNhzhDffTHvMUL4Ovc7kJy+n6LmVSCcm4JixDG1DEbRrcPsQtLMdBP6oQ3/xb9BnjYJPHiLy\n5uNEVBndq48h7roBEsZASwOMyoA7d6DuXgHrL8f9mQf18EpkuRyPQ4cWziGiT0YeMxj96BkEyqZD\nfoT8TCvBUAWdH1lxpYXIuqUc474b4J1WWHQ7hK5CVGTA6rfhAi8UXAiblkDNK4j9H8Dde5BiMxns\nTiKj9G5IioWxN6G9dR9yzhUIVxva09cSWL0Oo9+NfO0tSMUzGdFYDseegYESjO2PduIZgk2FfPl2\nHy9ceze/u8rH9JRpsPlDOHgAKvTQLwDZKpp6ENEkEdPUQfcZ8WibAzBoLGJbI+KmMkKfno102nXw\n+GzEQQmGnY4UewhtwDlYjr8OvwdZH8C45TFM1slwrAGa2mHWdEbIMrJYDwfeAHs2xCvw0Q0UpDVC\ncDSxtV9hnpaN0JkhPheaI5A6ACZdDRYnCZz0c91N/1x+NcL/R1AM/7EpCovQnq4DeTbI58EtyWhN\nBrjjNMQtz0cF35M+B+0Ysf2SQZ9Nc/YVOMNzUXbeAi+CtuRpAhndhD3LCPoSsVj8pC9S0couRPT0\nh3AC6G3YNy2BIafCtjK29QzknCwFjo0g22KA390WTeFZ/gxk1kPHy4TGvo8uYR4YDyI2rcBw8VpQ\nJVAc6IAIzxPaWIZ5pBnNfBytz4BWOAFJfRSa/wRJr9K36gKURBcVsa+QFWpgfMMkrOGBpIS66Xr4\nc4LHzyDkugG5ux9i3z60cX68D3oxzCxBN9gHA86CY18iff4U0kUeRMtTkO8gcunTdCw9hwR/D6Jq\nPVr5u4QHnIUu0YOy8GqkSdUYlr+ObuFaUKI6Bl4+pjacSubHboznudC5E/l2QiFV2/P42NzHwykF\nGKcVwcevw7zJYEpG6zqOcJvBmARKD6FZZ6K1HkT3+VRywx5UZzEUPQ++p6D7JcK1YRTjCqjIQuvp\nRjIoUF8O334E6z5GMVlhyzK4QIWuTfSWWrg9/R7sC5v4POZrTKn3AQJMC2FoHegbIC4Pze0gNKIC\n8aYf66LDPPfkIiSHF2xGGNwPtv0R57Pf1wRMWoSw7UUblgTWmyB4NnRlEnE0oqQPZ1dSNlP25MGa\n96BgFAy8B1kNQrAX/vQqpIehcCwoIUTSHMLFc6lXj+Os8ZJY9G5UF+KXUK/o5+AHVDf6KfnVCP+I\nCJ0OwmGEbiKa/UB0Bpl3BH7bhHZoEpAFlZsRsUHoawdHNg4K6S7fgvNDI76HMwjm3Ymk6JC6Jfzf\nSgyeHMIz04a9czzyib1RwZy0fhDYDLNfQ31kICMTkpHTZqO9omK/zYvUeg9UavDhY4Ru7U/VtPmk\nGpPRAX3OIKYTx0CK/S8RgTiuxn84DyVVDyWxRMasJLLsLHRjfXhGJeDX3YgptxWpPYX+PIqYVMfQ\nms1sdFYzfO2fsHlfRE7tJZxQjfqmSggIbdKhP0WPbmg3eN6Gaz6EqZcirrwFUptQ177BttOmUKG7\nk2mSF9bfhX9UG9K5V2AoL8FQc4hwv3os6x5AkVP/wwADyKRiPWFCqu9CDQYRpfWcUdBAW9IZpLq3\ngaiAMSo8+ibE34xW40G9TCA3Ctg6Aga9gy5+DKpw4eUpfJE92I4OQnfkT9DTBYYWpOQwUl427LgH\naewViFqB7qI5sPC26EX4euHgG7jcxRzsGMFTuWdz1+HnGduyHsp1UFMBfT44vBZypsADb8DmmSC7\nke8NITJB2hVBnOxBPSChVfahtG0F7QCEDDBwNowaAUosWuUnSHmXowVzUcdsRZL00FmGlDoUPvx9\n9Lu89GUwxEevzQQMmwoVTqiywzg/FJyMYszE2tUPrXY1mHdD9th/TwMMv5gUtV8Dcz82JhOa14uQ\nnAg5E6GfjUj8AMbuhxPNoIIWr6BF3Gj0Eas2ouXfRddTFYSTOjCK6ZhbBfbl7aR2eMnpK0HEOJDi\nM2DiChhdCNX1QC88NhKtx01mXRUodtA0KkIz8Dm/gWceQn1sFUfH5eO3KNh8KYTopdIXXfmGu+vP\n19zRgqgoxeANEbRrqA4HyuAS9DMmIVo8iJg7SDB/jC1ow3BUQax+GhKysI+8AF9WAQw6DSUBSrMm\n0paYgBrR8B/V0Bk1dJ16iBsAtnQYOw6aKqB8DZFBv2dPyWjcJVMYKS0kq7qXEBsIpdWi+2QXtOxE\nrVmH9OVlKHVdiLH3RJXgvsfIWByNNrQ5PRgrqhD9RyKaYokvWAuhbggIkIrg/Cfh5gDCBxGbEY0w\n2PwgbgSXBcl1A1bXHCLyKfgHtOKdXow67D7C2mL6vpUhwQzGXjTvG4j2w3DKlX/+3Pra2FM/miG2\njXyeNZzlp1zH2Hv+CLbvl/ge3AD714BHwJCJsOol6PBAMICmV5EcGbDdjFhlQzJpBOcegGkSDM5H\n2/gg6qsXwP5vYO/nSFsq0DZcA2VlBPeASIuAy0nR6rWQXgz3rYO8of91LM5/Fu5/BUpK4PGlcKQW\ngOTYZ9EXXwrVW366++BfAf8PaD8hv86Ef2RE/4Fo5YcRI0b91/3GOAIzXqbj0MuktB0mVHcBvWmF\n6MqasB1woCz6CHn9faj9vkQqjYVp94G1HZF+DiZKEJGVEFKgcCYUavDpSuitoq4gH0NMDKmOk8D+\newxxAwncdTmWi17Fk29ETzyy/wA10kLCnEJcykUQOB8+nAMjMwjtOIDUXYd80gzE0GZ0IUGoqQVZ\n0xC2LMCOLVIENZeArRMGOuGzR9CKpiNMYSZ8/QTqxIeRJl3P8ObvqHTaSBh8JXYD0H84YvAwGHgJ\n1N0I8ydBsJKW3fXsrVjMYIYzXNyAFPERHqBDak7HrH8AMU1FPbgc4V+L2iVozneQUHEL+tIUuOw1\nSMwEILLQg+mJfgjtMNz8Eb2hcvQHr0Uf+zIc7YCkNbAsDIl66JIQHj2azY2oc0LSFNgjQdUK0G3G\nZpEwulUkTUU0vISaYCVcqaHlJ8C4y9E+6UYEv4RQ4D++0+atpdx80ZPMTV3PtdphrPuNaK6nEOhg\nzELYWQa6CIydCpVvQECgxSWi7mlCnjgMccUfoOYreOVRtKNwsGMMI+w1aMGBeForsWUeR7ruQ1CC\nqN/mIAx5hD4rRxcvwB0kmCYIlavw2G4wWv77YLR9H1TrnwzzW+DrV+Drj1Bmn0VMyQMQ95f1F/7N\n+IX4hH+dCf/ISANLUMsOoEX+4llHCPSDZ9B+XgmtZ49Grusm5r7D2N+QMQ59HqXTAB07EXUC0gbA\nmFsh1AyJQ9GrJ0OfDg48A+aJUHkE9lWBloAp4ibBkQsnvkOc9iSG77YTnDaVwPSJNPAW+dxH7jon\n+o4QnZQRlFbQOyMddWM9HU/p6binDinpHhjyAWLjKMi4jKAlC+3YjVHxlswpaK4H0TxrUc2dhEUW\nasBM6JkJ+DecSe2k4bjtPWDNRVd0FcV1KeiGhNCMBsTd70br8ZlGgj6HYPyNbE2bTvX8xcy46VPS\nP1qJtOlMgt7poDYhtzQje9vRajYSFkdo7D+Jg2ePR3EnoOu/DBz5cOdM6G7HpzXjNcYgdRQQnnsx\nWu9xtG3LaA9dCZ2DIbYWvumA4TIs0iDLhKKzEc4Q4JKh/HOwzoeRj8CE+2DKDWhXrke69gTijgqk\n6XPQzwB39loi3ldRTR8inTYfrKbo99n1Oba6K1n74Uz+6K0k7603iKxpBHM89B8Hpy+GlGMwZwDM\nmAK37YUHKqBfEVLqFKRrn4PiyTD7EdQBaTRt0eEz386O2400Pb0L22/eQpEs8NlCRFUL0scKfL0Z\n3w6Besu7qC4DstyAGOCEry6C0sejmTp/DWseJA2Du5bBjDNg8QzEg9eD7a/oRPw7EfoB7SfkVyP8\nI6MdKyd072+h9QjUfQs1a8B1GABRXUHxc8001TYiVRcjjwjCo+ug5zC8OAwt3o4Y9AbCNBj6KsE+\nOHpccCP4suDoW7DsQXhtPQyIg0sXYZTM6AJqVMfiUD36bug8J0IlD5LHHcgYkXTxpJw4CR39yBQv\nI814kIi7hXDpUvRLb0U7+8qolm++hpSxGGuBHuq70DrvRE3aCx+8RKhTR+SEBfnlzxGmenT90wkm\ndzP01bcwvPEHtN9dBm8sgdfuRRRcgpYlg6RCMPosV2dLZF3kGQoYw9jemeiS8+HRVwip21DrZaQB\nL4Ixg2C3QlXuTg5NmYWu0s2QB7aRlDML4d8IKc3gUCESpEvdg1fuIshqwsNGQPwQ1B3vQd1uwv5R\nRLbHoA6AiLkLWs6AKUsQMbGo2RKafAQCYfB3wL4D0NKLteoIOjkR9CZIKEBJOQ/DWSn4r7LgyZ5K\npC0XqUSF+j/C5lSoewnr6iC6uAn4/WHa7s/Fc9gAO95HG38WrH8YnHkw+0lwNYJiBE8noucQ4pzH\nITf6pKR2tdK4tof4M6wMvec3RI41E5fbivLh+XD2E7DvKHz2EKSMQRytwjwyEa/vJaR1IfqOTuHw\nzFNgwQpInwAHXo1WMPlLDEkw4OGo73fYBHj9G3A4YfNfyrf8m/HTVdb4Qfzqjvgx0TSk8QORCsOI\njrXQ2wFfPwbH4qLaxMlpGOKPkKaNpfqWc8k9FoDProO+Xpj5MKJyPWL5YzDuamj+FFK/L7wY+A4O\nNUKDAvG7oH8GnJME9nYi9nioXAUZl8HHywms+T3d6pdkqSp6xRk9Pq4QT1oiNrwIZKQ1PoL1MglT\noXdkKs3G+1B6y3Hm+lEab0CLDaHqV6LapiPvGY3obEMZvxPp0fNR7T40/UDkRZ9jvz4btc4GnloC\nE1ppyuyPYZWb1LHTESfeRG39hkBeM5uazyCur4mZO0uRj/8e+uvhNB1sPBlF0XG8O5GAeBzjOAN+\n8Sope9vIWbULSUqAUQNg2oPQegAcXxMe1If/g2JcZ6eRdqIFnSsWqcwLGYep6zER+WYjmbs+IDhS\nj3DLhGONhK+7BJtuMiJyNbrqpwhnvYmSej1aeC3i9d0Q6ETENsDE6Cr+CF1ETBCJsRBe34n6yES0\ngBepsB8EPgHHJDTPMbTZNqpPSiJn9hKMsySab8lArgxhHjMLddd9eK/1o7O+hVkXhzi2FtY/AWPm\nQGYJAKrPR9Piq0lY8gAG9zNIiYMYmrcXqXgIlJwChldg/gj4ZCPBMc/i/6AUU34r1qUmvFPjIXku\nERqiCmdpY6PtryEEJM+Mbut0MHJytP278wtxR/yqHfGjoiGC5UiGrYju9XCsF75tj94kCzJB2Y5m\nUPGXq9Tam3AtL8Uw50wi0y8kEpOI3HgMQRDefxpsfbDrBGRkwdEH4fhQWPQ2fLgNntuIZkyjs30D\n3l0tOEQY1u6Bp35HpfMIbsnNoLZU/Mc/RF+vgPc1uu0unI1mwpub8N57M44l9yFV7sRYW4HdJWHu\n2YTkdOF1deKpHo5uZw4Gwyyk6i1ERvSjvecASrkLUi5ESdRg2144UoXIjUOkpuG55ml2DdvKgHG7\n0Yfeh7BANG+jW2ch0TQW0dIJKXmYllYjGkpg6BNo37hpKBjJOycXkNCvERM2Bj3fgG2nipSZBVWd\n0G5D+2Y9och3eAe3UDY8D8dXZrqzi4mVUzG/1wRNG6H/MfzdlST4JKwzrCgGgbCFwTwZufYzukIf\n0Ot6G9PmlYRH5SHq4gkk7EGtjtB+/2h6U5rojT1BL1/h4Rtazc/jSpbRPLno+vrQVW9APycJkfsS\nWtKZuJ0Kke71hBz1GEb2Rw6rWN70YzzrBqSWTiTnKETRJGSRRcj1Gqx9mXBERRp0FsI6APWLN2i6\n8ALiHnoC07SFiMYvkIddj6h4EeOgKyDzM4h7EVrjoelrNMMRdNYGtDgb+kvX4e9+Hf2g66g07aWQ\neT/3wP+n86NoRwxf8vdrR+z+5UpZ/pj8cqUsfyBaOIwItIA5LToLUSPQfTwatffV03d8J3tfXk7H\nYieOd9zYHjIhsgXJH/eRVBFLR4kHnS+AbVs8cuQInGmHwLWwaifMy0Y1leOK8dF7zIO8qZfsvTVw\n6hAouB6f+SAnCqwMvmEVariNvpV3Yt72DYjVaK1OOh8xEffZN4iMArhlCpj2w6xQNIAUmYK77SSq\nr3iMrMvH4TBupu46C0GDkaQHupBbSzAPGIhYvQIGZUTV39CgowbV10Bgng5Drkxv7I1I5W9jre9C\nrArACzvRXv4NoeJqWrVs0neUIe74GH9MGNeVtxOJ6yJhvhlTZxHipa/glvvB+QFql4lgvolwagNB\nbyHvJ87nZOM8cipb2ad7nIzcOOIXN8CiE5BzFE/jcwSDA3GOKYFv+oNPgr4BUDIHNt+Ef+Bc2oYn\nELt9HeTnYo1/GrHkPHjmCHx9Psx6D4rhJtMAACAASURBVIAQDXQF38Thv59XrBdz0pyPiY0z0LX0\nInQkImMh2FOD6fA6jDl2Yuq2oilxGG7zIvVZ4bzT4TfPQNc+Itv+QOdDqzFmRzCNMSJ/EiI4P5P2\nJyqIefZ5rGdfGx00my6A3N/h33o2xj4NznkPujxEHj+P5otHkty8G3VTG7q5byO+eI6Qdxe+SxS6\nPBlkDd+JMMREzxP2QM1bEDcBYgb/rELsPyU/ipTlZT/A3rz+//R+twCPA/FEFSf/Kr+6I34ChKKA\nkv7nHZIMzuLvX4zBlH0m49cspZ6R+FeMJ7lxKi2rfo+28VtaElpo1GeQ4Kmm40JQAulYtS7sxx5D\n54gllDUUV7cHZ08mhpZ9KK0ecCTD/D/B4hmYn3yMQc9fAnljENeswW/6LfRVoFSZoNlL3CuDELGd\n0FwK/fvwhcKYfBqeYjNK+qlYKo4w8P1TCG3eQc08I5bGPlJXOmkYHCZ7RQfi4AYojgCHoCURioeC\nIYuwYsKUWgVrVWwJbkTStQjHkzB0NOQORpz/CPqjZ+HMuImjWe9QcOMCQqZMkk5uQLEFEKsSoWUL\n5NjQmlYTTKwjPDEHqaoSd2URnxTP5ILQOGKsmUSKkhGH+hCdPsjvD5Z1YLkQy6hrsAgBXXsIOE8i\n6NiMrcUJNVtg1AMYVR/JlquI1H5KcNpOGhruJybDj7WvGiFHF90EWlpoWrYCoXyI/UyJTJGNcnYc\nxj9pFNXX4s64mnaO4gscJ8s4ib7ks3BbPia09zPic1wY8pJhz2H46D0YXkjgWC/uGj/26XkoIwvR\n2h00vbuWoy+dwQjfp8AOdJyEXtMQez4lVKKiV+YhfXcrfLmH5vwMvOEaIoqK3qdDdDwKk2OgVRDI\n02Hd24Z77yk4pJzvx5cGjSshYTLk/QZS5v775gH/LQJ/u8s/QAbRqkS1f6vjr0b456CnBTSVjJF3\ncYTV+OVS8vd3Ii56GRqaidn2OU0zg6i6XkyOTsTHQVpHWAidaqHHuY9cw8toPS46u+4m84gLLrgN\nKnaDuxuefAkx9fRoGaBQgJjLewi2NKLEhZH6XYbYH4GKhWjxMvTLp3VVPEnVQYwig86ch1EKS7Cs\n3Y8Ybye1byHBZ1eh9lUR12hAPPQsDDoNHp8JjkaozwTHQDhrEnr/76FnGex9COmmGbDij9DRAVnH\n4aGbID0H1ZKB4bnFFFjshIsdWJorwQXsUuBQD4wrguLBiIHz0Ndcjr6pnk2TptFkLODKhlJ0GZPA\n14zXsx5L2jTMH7wFAy+E1sngnI5QjoOtAPatxDPAg327HJXdtA6CMXfTy3a62u8iNW4hmtxMelkT\nwdRzaf/8W8LHuml7/RwUh4PU887DMSKMqN7K/JQ72Xp2OcqwMuyeTtbzBgp65v1/7Z13dFTV1sB/\n506flEkhPSGdkgRCkd6LKAiCYkcURQXFDjZ4Cs+un8/yxPJsiAryEJQiCEpHkCKdQAglhFTSy0ym\n3/v9MfhApEoLen9rzVr3nNn33rPnntlzZp9z9nYOQDLkYRYdwR2G46cvWPdaN5oEP0RkxV7ER6/j\nfDWf2shU4n/8Cs0vE5C37+bwhij2fno7rXN+hOWZeKwZaIfvQ5EPIbYuRYpT8O6YibRNghIH+eOC\nSHVX4gyLgnwremNPRGgndIsqCUwUZEc7SZ0BtOkGXW70TbW3/BeYoi5xJ78MuLA+4TeBJ4G5pxNU\njfCloLoIHlsILg+J76+npvwnKh/5glD/nrBkDObn55KycThKfStsBZOoaBOOHCaImlpIWEs7tZ3f\noNKShyezHvcSF5ppL0KtDiQdpKbBQRfkHoLdA5A216N0lHCV+WF07oDAntBoPAQ+giyVYe6poSDf\nSExlDYZ5QegOr6N+mAU/8QS6r6ehrz3M7gGpxMkFePbPQIsJ0vtA1nwoXQF7F6N0+BfO+KEYYhTE\nwO4QHAOTF0H2SpTiz/EUt8c9bSpSSDz69t2RgiMRd42h8rMu+Bfvxt0iAes/n6S6LIfatAyidE1o\nXNeZyupcAg9X01k7GZ3bCXu2gX87rJQT4FEwFEnQaA20vA10FsidDptmopjNeDR2dJWlMGQuyrLn\nKLW+ittPIXZLc6Q2vZCkVBx7H2fvp5MpPugk48E+pL18Pfq4/mDdjFdZh7DHIISGpqaJ7E17g+A9\nc2hWGElUzMtItcuoK/mZmrptxGbvQndYQ+adWZSkP0dAxqNYs1thStQRsXcLHPgCb2UZtRvrcfYB\nOXQHEUkalOWrqfrlJ+pXV6BrDUqFCc36ELyJenRBEvKQFjjiuqOVDmOufA7r/l7oF26GLgsgLAqD\nuSeSeTOM/wjWrYeXrvXlgnvuh0vbvy8XLtzSs8FAAb5sQqdFNcIXG0WBuKZgL4THh2K01VHy/vNU\nWLYQpKQhue0+f5cxGpE+FP93PqC2VSdCvp+Nd2Af/MvW4bd4HsXdW1AjJ+NoXYxhZj0i3gRXRoDH\nDDO/9KV/73s99vRF1AdJMCcK++tbCFw5Ga38CqLuJjSd3kOa2J3ITiW40rWYNsgo/kmY36mivs9Y\nvLcpaOoUHFcbMC+RsW+Zi2n1cjTX94T9O6G5CaW5FltiBiLUgqhPgdajYI0DJe193EsXQuk6HM06\nsHfOaEJ1ScjubMIKJlCWO4eim64iZkoNjphQWPkWFn0UcQGt8XN+j2LfiDk6k6RiB5+2vAtXdBvu\nrd6CqWwKdZZEYrfbkAbeC2v3QpobtrwD5XXgiMTepjGmw4vBFoC8/UVkzzLC5ixFCmkK+8zQ92kE\nAkoU4if0JikoBNOsLNyRc8EaiVL8LjQ2+TZdAOE0JYe+1AXPJ3X7Ljwb11F48AO0+6oJ3FqE0qsO\ne44BslyE/FxFafRTBLfKwDJ5BnwyBuW1LLxDDOjDA9k5OJPuS3MQrV9DtPySEJZRtcZM4Xt2wjtI\naIbfjtO9Gqy/UtZ0JGFkYOFFrC+Oxe++YYjtv0BOPETZEJ5c0rfXIoUHQcchvrmH3T/DzBdg2Itg\nMF3avt7QOdXSs7IVUL7iVGf/hC/J8fFMwJe+rd8xdaf0BzUkZ9FfZmLupCgKWP8L5WMhqwRMt0L7\n28HciWrNQRRexjhpDt5Jr+O3X4uwtEKe8y2eglXo0k2Id6tg2jeQP5YVjerolv0zmsoIOGQFTSh4\nbbA6CKXzlXgWfoacGoocVYnip8W0Nx7ZZkW21+NtZKcgowPVrQKJiF2N9oATnZ8Rb4keb+ZVeFKi\ncFd+TV2MBgu1yDYdiTOLENng1IXBXgl99yFIfdfircrEnb0QzV2z0LmSIKcnrPSDpOvxygK352eK\nhBOvuQxNRiv0UeMJsf6KqfRhxOooXCus6IrLEZFu6CdBh/dAY4Q1I+HaPWCOp3ZBfxYlNqcyMo2r\nRBuqA96lVWkBwrGVHHNfmkTNhC/agewPq1dRNjGUIElgneemctT1xOV2RL/8OWh5J2RtgdungTEM\nxt8Bkz6AqSGwLxPHC03xZnmoNy7BpYRgXKElNG0Erk0zsG2IprrjJnT9wPCdC1OTtphajEWKSkN8\nOwx5dSX2rGwq93uwv5SKMcBB4x1ayCtEHiph32+hJkmwr3dXuv+8CnZZQNMYcpfh0SsUfgkEBhK7\nZy3W1Z0JtD7Cr0NSacZVmPZUUf/22wTeczXMfA5y8qHfPdC9N0y7HTT1EDYM7noVAkIvdS+/KJyX\niblBZ2Fv5p/x/TKApUD9kXIsUAi05yTZ6FUjfCmQbWCbA/qW4FgPzg0g16AIP+R3fsI58Ua8Fb9i\n8GSi+9aD6BaJd88cxMR8eOYFPP36s9j9BK2+LiXMVIdIjsLg3A9he+CQBuXXplRX1LKhcxpN7fko\nJY1IOLSan/o9isbfTVjzNei8Vvzy7OjrJLDaMLS4Ea0uH23Hd9HunY0m999UREZRGWwnjAiEsY6A\nd7ehTbwVT+5epAEHEBkz8K66Cc0+oLkDkXoleA9D7UawBUOj5lAuw8e5YHWh9E1ADP0YwtPBdRCK\nBuOtcSCmFSPtr4MwCQx+ENsSpBKIvxbCU8ASgZy9Gufcz9h4Tz8Cdfk0av86Ydbp5NWtockKCaRQ\nKN+ILVCP9RpBqKOGQyKCuIO90OEPUiQ4zJDcFZKPxN996jZ4aQrcFQo9TcgBUQjrQZQYK1WmaPRK\nDX5GG3U5ARR1v43aAxtID9iFJ2YoQQcTIG0kGELhxyeoKmmL4+eVRMRL1BXZKR5hJWVJHdrmXrBt\nQylxMPfawfT/JQDDdxuhQyAEHYRgAywLxBVXR/5OF+EjZexXygRV9WBNoI5epRpqHlmD//1N0RSV\nw7LNsB9IjoCBD/uSiTILosN8AeUz3we/xJP1vL8M58UI9z8Le/PDn75fLtCWU6yOUI1wQ0Kug+eu\ng7F9USpXI1fuQP6mDleKE9cuF4fnRBMRH4G9Twabrqmmw/ICjJIbY20F+qgCCG4EjXpRVF1AxVoN\nZmMdOenNKL0uhaHvbcO/ah20NqIcjECelwW6WNyGGA5mdiLWlI9fUhGlPZ9Ae+gB5radQkbF02hC\nU2i1YTvC1oq65qVImij8DyxChI1Gtr2BKLYihMY3B3zbFLDuhUMvQFUKZL4KyBA2CAr3Q94CWDoH\nDCnQIRR0AmrKoWMVVBwGVydYa4K8bVB9EOrKoGkShAaArRKsZciuGiS7FZfewMZBN9Dp52+RNFrY\nXwdBRkontMNt3k3khnrEQpCcCgQBRr3va3DdQN8PxMFNMH87pCjgtkMLBUUGxWhEhHmgUWdo1BEh\nwLvxA1zVLqrd4RjS7Vh0ldjLwyhL641Wn4D/V7+g+F1H8EMPITxuHL0TMfzzdcT2pbBgEUil7H3t\nFepqV9Jm7a9gTABDPFAP6zdD7xjkoFR2frWSjM8mU+Z3N1rbNA7tnUva5D14Cirwu/kan5Fd8iHU\nh0BVDSwu9K18qC+GtSNBWw3uKui6FEx/4WDsnCcj3Pcs7M2SP32/A8AVqEvULhOkANBEQPDTiIAH\n0VQ9huT8CW1oHtorLTR6qC8BMT3wHnqXKJeXIMmErkkIQs4FuRMEJFDSuhmyuSctZnwAgdkkUoZd\nWkFFj2BEfn/8pq6k6NOONBr7GXaakHXfIPK7xrG6GCKSzXTJvoOiJm9wnb4DNcYI9muK8EjdMTiX\nYHm4GNdXMyC2Fcq8F5G7JKCtdoKrCjaFQ//WKIFdqS3dhEW7HHn5GGSRguaKRERgKLTsB5aZEHk7\nTLsfZasHOqQiNzEiQh2I1d8gfoiC7zdBdRXe55/Auj0fy513w7U3gRDY931DlXczscoQ0ucNZndy\nJiVd76Nb9gL0v2YjRAHhFTKa2vshYBvUrIR8D1gdOJroMGqmwesSuDRQ7YYiE4pbQdkZjHiwGmrd\nUCsQrZ+hNDScoE098dZ40OQHEtlyKN6SJRSkBBIUU0Zj+To8h3MR196PvvlQn0EsOki9FYwfvgbX\nWqFPBLnJ3diR4mHw1+W+kWu72+CLH6FqK1zfAVb9gNQh0Lem13wt/vID7Cv4F5ErorFuKCfohx8g\nNhZyNsA3L0LrATD7c18kPEsImKMg5hqfi6XxIHBVXOqefHlwYZeo/UbS6QRUI9zQ+G1Np9cJzlJE\nYjQk9sOwYz1awzAcmq+pj4W11iG0WvgV8rbDiEYBiJBd1MZDyNvL0ZdaoWtPUEqQNKH4bdmJ30YD\nHtt8dvaMJXTiTL68tylkuknIzKB9fh21G0ppZfkJHOWE/t9IiHyJmtdHkVa9HkNlMcwOhVut6LPG\nIEddiSfagm7aftguYKA/PP4B2K2sKZ+CpfdY4ovX4apy4iguJ2rrUjQVO5HDizlo243XcTeRA2VM\nD/RGFNkQP+5E7AlCFNbDmCwono/DkUHOT+tJeO896N4dAPnQITT7dASXxuBu5qDo3ttIL+iC5ud5\nLIqLZGBEAcHbDqBtOQGqd0BWAVQFQLAZLAUUDw8jVgHdv5rAri3wdTW0HwkaBU9QDKJwEnRxoVkX\ngHvz1xyQsihP60RVy9u58j/Ps7RpBamexpRFNqNb3sdsL3qe+F+q0flfgf6th8BtRDGYMCVKYKyG\nFYchOI9N/RrjLtmJPOATNO5qCGwMGybAU+2htg5sDtxJXvQxLuybhmGMb0llQBAJy+cjhychGfPA\n6YSkFOg1HAa0g8hIKMz1GWGApqNh+fXgroUm91ySrnvZ0UC2LatGuCHhcfuMcF01uPdD8Txf+iS/\nWyApHs2O/fhFTcIrP8XwsOFoPhsKi19BWTAd+0ET7lAbFtESRtwBmYPh2fvg/6bDgZV4XYL6964l\nIq4Qc5abke+OQ4Q0QknoiHveLMoz7NA4FXY4oHdv2LySsP/+jJ8lFdZ/AN1bQ1wMinUHzuq5GErb\nI/wlaGyHkRvAGEBh6S/MbRbKrdI0lOpuhO5aQE5MOPNa1jHki3WI/h8RvnU+a//xGfLH96H4OdCm\nJBPcaDiWcZ+gfeApKHof9o2kdEZ3POVlBHTuDB4bbB2NCExGU7gPsfFb3AQRVyjh2T+XJkFamhbE\nQ00l2tUOMP8Dej0CFge0+jcob8MHDjxhWoqLBY2n10JRIBTUQ/BWCHEiOkoIMRxiVuDq0hvbhHlc\n0a8aPLFI6V2RqjUMeycbJWMT3t5XUBXyIcmOhyE0FN2OHdD9IRh8P66D+djnf49J2Qi5WSjXWVCa\npjNk2h5096bDplXwTGdoHuoLvL43D9q1oLZFN6TiCGr2yWS3MmG1mVCiEgl6VodQ1kJlLXiroW89\nOJ+FzgqYg0HJBKEFxePLdZj9nmqEzxQ1s4bKH7DbYNVciG8GIyZASGdwHwJnNTQdANPeg6vvIkCW\nEDSGxlro/iRiQwHmg7sxR94JoUWwdR7s+AFKdqEUfYgI247mP99jukJC5wemblGQ2Ax2L0NE/Yz2\nnlKik0CRvYi290Gr16AsHz+XHT5/EfKdoN8DYjj2QUno5eZIY56DjStg+2LwC8Kb8wgB1V/x2DcJ\n6O+aQ2B4LKImmZiUBBy79uB0l6Fd/jH62hJazu+Gy28qupqrCBF3UzN1NLnvdsdr3oR/bX8CJ2dT\nW7WI9BlTEN5KyB4Hh6chqgS6Fkko/ReSHbSBeONwpB0r8W5aijc7CE3zbCS3GbEDxMEpIBth/SpE\ncCS0cBJSFYHbakEZ+QLiqxshsQXe8q1UPBSNO64CU5kDv7JmSEumYejYF5G6ElGgwbPxASiQ0RXu\nQpZDQP4PITdsRK65H611GuJfWaDzLQdzZS1Gv28ePPo8fPE+nv3pDGqchTEsAwqzYNED0EEHe6th\nTRVEm6H7s2j9AnCUHaL8jVl4b2xLTHk0llF3IcIc4JoH/u8fCdSjgCMLjM1/vyVZY4AeM2HDo2Av\nBVP4penDlxNqZg2VPxAQBJ36Q8suvrJ0NVj1UJ0DIWngsIFzLsI1D7w7ofgQPDjQF5axaTcY8jjc\n+AaM+i/c+SlKdw0u7UvgmocSacMxIB3dYRPOPoNhUw30+xZ+iIU3QJ5gQLwSC2vyYeo98FhPeGUE\nrFsNPRKgmw5v8QZ0cwrR6kf72pe9BU+XDtRoxuEwHSKgVCYq6iDBr9wA1mooS8LPL4gm9TVUdzNT\n0GYVZde3wmJ8mCDrf9h1cyG23r0Ij7ueVPPrNC28E8vcXzho0WH7JJmsHjOoMRRC5hcos+NQ8vpA\n8gtg/TcOsQmz4o+Umo7uqiSME19Ed1UGmm53I6rbQoYdJUVBsUVA2qvQNpiQwi44442I2SNgfwIY\natFIbsIWSYTu6YhlcXv0I5ahRBgxjemEFJuM48A1KPWFiMhq5BtuQ66ORzirkCem433nc7y2cOR1\n08FVBhXf4Zr5GnpPCcx+C0Y9h2721xgtI6ClB5Z+CgMC4ZEcbLcm463YTb2uMd6Ns9Dp0tC30+Ot\nshEkucnMbozQ6cEwAHS9wfYEeIt8/5RMGSeOCSFpoMO/QRdwMXrr5Y+a8l7lhAwaCWkdfMdVm2G3\nFZp5QGOCiESoaQoaLWjSoG4PfLMVgkLhuzt+fx2dAZeShqd6OPqo26nsPhpL2LtoMjbi/PUFNCM/\nQ/vKU2A7hNy1NcqWrXgGHUS7oRixvxKUMMS2g5BgAF1LlD5v4L5yGobDT8JHT6AEGLAmrEVO6YE/\nT6Op3Qwb9FC5HSViJ9YdzXBeHwYWI0ZbLmE5SYg1hazuUkRg9fu0avEO3fWF/FxhJ8PSgrBPxiHs\ndXgaDSEk+xABeyoRoe0QjXXIbju2vcH49++Ld1soBzx5uAOMyAWdkYLb40GLcM1Ec1CDMnsqXGVD\nVPZEOAR0KYN970DmPYgmzyIpjyHn7ULK2gGjP4V5UxABGzAaJsLe98BfQtN3MqLufYQnEXPzlXjy\ngqmrrMNS+iWaZ79CWnoHGn872qQUFNM+vDvvwf2rFpclDOdBJ8Fx1TgiwZW8A2OCi+KCn9BHbsHc\nbg+7I29ivzKPzgEeosJhb7uetJj+FrrV86FbOhFj2hAv0tF4CnzPGcB4E9T9BNXtIWQPiBNk0fgN\nIUCrbtI4IxqIT1hdotbQODbz7aq+kBsKhoXQ50fIrfTFKO7sBNO9R8+pK4INr0Gfd353qaof+mLR\n30NFn/UYaEEgd4OiIL85iOp7DARMs6ErzoaqKpRNteAAuSeQLsCrQSDw+OtR8CK5JLRCizAG4TWb\n8cjV6HeXIpJbQEoGxL+EZ/K9VI30oNE2wrAzGOPsWUiZDoTFAkHxUFAHzW4nx7qWQr86us7cg9D5\n8fPCEpqNe5ZGQ+9h/4gRpE7wR0oeBmufQrlqA7ZRo/Gs+4Wge9vhib2GbY2nok9JJm5lHg7/fRxK\nNPOaZgKZ+q3c7/2IRls8iGwP5FohyQj93VDWEuLSqAzegnZqCQFeI1h6Iuz5MOR+COgB42+DO6+D\n5IMotnUI5TYwZkDODKxrv8ccGoPQH0BYbLDdAQd08NT7eOKicRUvwPXkVCpXOglqE42r0op1biqx\nzk3YV7anbvRdROa+i0j8Cl3lAZy7v0U/ZSGiqjm8NBH5x3eo1eThP/hjRLQGzZzVkN4FmrXzPUzv\nAbA+AbpOYB53UbpiQ+a8LFFLOQt7s++c73dS1JFwQ+M3A+wshoBG0GMMZO2BRh3BVAOfPQm9P/z9\nOfkroHGv31U5yUKkZOKqysPKLPzo7/s7a30O0W8nAStLELUeuDIIvg4BrQPF5EJaC25vFM52MuUZ\nGurSg/BzCfQOL9G/VqMprkHsq0OT3A/HxsUYrxqBCGkJS95AQyyNYj/1bQmOBLmmJ8y6EyXGi0g6\nBFES7HmWJvJ4IjZ/zcq729NuSx1te7Zl4/sfErTiQ5pkpCKt3gW17fAqULXjXmqHVOAe35YDoblo\n/D/GVVGFSXJTfkMTdHIr4tbO4hr/H5BCvOQYUhnV/HnGJj9Dm0W5GG9/GmGbD9mbYV84/sEVlHWJ\nxL9gCOz+GGFxQew18ORd8MATsH8pBE9FeO2Q/C9fOEyjoCKhEeadmxDtR0NCDMhLoXo9TH0LbZN2\naN1GpGcWIHbegf+kz/BufIfwkp/x0AVzp3KCKr2I4GdAtICKNzAUV0DzTFhSCYntkZR6atsmY5n7\nNqK+BgKTQXNM4HVNElhmg2fnBe1+fysuzhK106L6hBsqux8Edz7EtoOMCT7j7B8E9TW+CZrfsBbD\ngR8g7veZEmr4Cv/UcTja+xPBF5iVPmD/AFwzENFGtMuicKX0Qf5SQr7lNdwtjOQPC2P/zBuoTfPD\nL6+axEnVtBjvT9xbEfiviKIiaSDu+EnULoii4vaZSOV2hF9TOPwxlE5D9Er1GeAjSNfdDJKEvNuK\n0m46eEfCfi/kP48l3UjPkjoKbqsm7+ocWsx7nnpzN9ZttuPpfh0kdEDkleK3cBUxS3aTsKaO4J0S\nLbfeyxUbbTR/eD2J03VE5qcR5HQwomoGg+Yux2Z/lGYhHm7Xf0vTgXvYKDZhi58BQ1+GTuvQ79fh\nCg3EviIfUVCH0n0c/PczyF0Pb46FWZ9Drg5KDPDMv+DLG+D1FYQsqqPG5A8/TYG9P4JhGXRIgl05\nKDVb4I5/oEtrQfAzz6Dv3QfTMB1S3BXor5iK1jMIuXoSiqU31KzwbUyJ6gBX3wRXdgZFxlOVg7di\nB3UjHvYlE131Acz79x/7hTbjwvS3vyMNxCesGuGGTMKTvtxkjW84WhccCSW5R8vVB2DXNDi85X9V\nXqpRsKMlikDuwEwv8O4CpQIM42HvYwhHMObZWdiHJWHPepqacY8T/E4NSbOTaJTbDCnSA9coiPsn\noH/sK4I1oVhWFWO7fTz6YaOw3HkNhjvuhawlEPs4+Dug9mufH/s3hAB/PUqtFu/kyTB0IuibQFA7\nFGc40sEtNPu2luRfetHoydkk9etP1fadZM2pgtTOiNBmKPoI5JFGKu/QQsubEe5JaK9agGI2IH3y\nHoZVUzDGByJ+MRG6u5h+e/bxUsRV5MbWkS0/zM7afjTbH07m4VtYvK0LcloHDIk9EKFrYZcTJd8D\ne7bD9P9CGxckeKDre9BtLQw1w10/wPTV+Le+HkxBECVgxwbIaYJcqaE8oh/uA3aUykPIH7+H6ftZ\nuMaMQLF2hLjFYIhHkxCHCH0Wp3ckcvnLKLmbIPMuiO4GHQJAI6GMmoXkkfH3vwImLIGUqyGuyUXo\nZH9jGkiiT9Un3FAp+QYib/x9naLAS0PBWgWvLvfVHd4Ca5+H6777n1gVH2EgAzOd/3jdCdfDlkXw\n1FcwaxiKx4G47zvYdwj5u89QWvdF8+grsLg92LbC4iCYnIeHLFxV/TC86o9mwgYY3hke+SdkGGDr\nf8Blhvo6XxD3QzshchDgD989jtJkOLIzFclSgEhsCoXz4frvIHcRzH0XFAm6DYMvZuJNq+CAYTjR\nNx+Cok/AY8Mo0liW9CA9K9egW7AD2vRH3vE9Srkfkm0XBFlR/MYiij5FRHUA63ZomQad3gNDFMwa\nw8+/bmPX2AyK1ofTz7SCZsZaAMSxCQAAEShJREFUgn88hLKqFvHgzYjE1rBkESi5oK+DVi0h6gZo\ndmQlyJcvkBXzI813lCPKs1GcEvaqcCT/wej3zMJrTIXoDNDq0D37AiL0SCCdyqlQ9SUkfo8i7Dgr\n0sEBhpgCxP7vYOGNcPsuCGlGUe1UogPv9J23+HPoPBgCgs9rt/qrcF58wsFnYW+qVJ/w34+IG/5Y\nJwT0HQHz3z1aZwqF3m/9r+giBwfrCeLeP56/YKovLoO/H8SmgM6FqND6/o4PeQBp2hZkRYHK3RCY\nAcZciDfBGy1w3noF+gAbopsR9oyD8iLQLIeqcLAdgvSxUO0EcxtodTVsfQkOloJJj9jzHZrkRDhc\nAfoS2LcYZneGTDMMXgnuu2H5KogzIu3KIu6WN/CIasTOGkxh/kipo2hkW4JO1xJ343gOZxQjWnYl\n+O2peB+KQppXg/7HV3EM12IwrYImb6PftBc+ugdkP9i9jK6PfE7TsCQOtf8Q5f4SbFN7E/xDG+Qx\nWdinl2F+OBJNdQ2kN4aqDbBjGTjyIQQwNUGxzyV8QwplW+oJNhuRwv0wabUQtQeRkonmQCHK0+MQ\nYU1//5nXzvNtpkAgRDDa4nRcSbl45PfRJd4HwU3AYAEgKvD2o+f1GQZa3Z/uPipnQANZHaEa4YbK\nyVLSdBgEVSVHy4GNf/d2Je/ioRgFB4LjlipddRvs/AlSOsDEmyA0Fe58GtI7Qqwv/ZIkBBz8wReD\nIPcbCA0HQ3OcpXvQf2+CXgOg1VS4ZyL0/6cviHjiOJg6Cu76CL4fB7d9BdG94F8JkBoNmypAHwt3\nfAs7e4I7BVxOcN4AQTeBuTH03wd7nwdbBYb/6jCstCE7gpD6+eFx7CJEPgQRn6HtCzHuMsi7GeUa\nBeVQN0STXJTkMMw/VSEKZaR3BkI/PbzcDcoXw9AXoflAwoD88JZ4kpajWbsRQq9EDPTH3Pt+6gfc\nimHw1WiKZqIJckHCezBnClhK8OrfQskqwrxsD9mv3ky4ownC5IWOb8KU0eAfBeWrEB+0g2GzIPmY\nULKaEGj8JUgG8LrQ5vijydiLrKxDEVpEt7dBH+h75Mfm3VUN8IWngRhh1Sd8uSEEXHXybakyNYTx\nKtLxBhh8X+wWfWDN99D2Snj2R7hqxP8MMABFv8CuLyCgBSQ9D3fOQ0m5BYfZgTzXi9hW65O755kj\n7ZEgKAr6PwFzXwRTMFQcgG9v9W2/Tp8EXhk6jIW8VVDfAqIlSO0OwgVOAc4y8HjB0gNx41jEqPEo\n5TLS3gr4ohjvwW+pDB8P9r2Ig5MgbwiwHVEdjsYxH8mZgqasGZpeKUhJZfB0LLzfBSIi4emdvpzi\n8x6HlW/Swn09VYMbUWGsRVzTH6G9BmFajX96DK5FnyJXFKGkPwpthoB/EJ53ppL/9H48iVrM/UJJ\nXrsMIbQQ3MyXQSSlI6z4HK7oAfqrweU9El4Sn/so+m2QzL7ydzdBRGuEEGikTgghQcLVoDWfU5dQ\n+ZOoPuE/oPqEzwMOtmCk9Z+/QN4SWHgr8ogsZEMAe+VVHNDm0HLXh0R/Eo3GuhtufMX3d1k67jd8\n8ZvgcYBcCQcXQL0dbv0exnaAPmNh5NMotXlQuR1R+g54A8EeBZ4ja4Wqf4GoAcgV1Sj71qJxB8D+\nHSh1Eq5RHTCkdkMJGQx1r0KlgnDVgF8VbDND9WEIyYSwGMj5HvKbQ9UWsLghPB7MTmjbClko7Pzy\nZ8qeSCRjl4bw3nORF12Lxno7sv47lIK1eCPeRH/T3Tiysqh78zn0LVphilmDvqA9tZYZBBQUIHq9\nDt2OZErO2wrT74Y8DzTvBI/854+fq+yB140weDo0v+nPPx8V4Dz5hDkbe3PhfMLnctEQ4L9APHAQ\nuAmoPomsBvgVX96lQSeRUY1wQyB/BQXWpWxpHooWHU3oSKxdi23uIEKuXAfbFsK+7ZB/EPqNgA4D\nfOfpjb6R3/s3QOFyX5SvYQvAFIL3n/1wHI5B6AJR9HrkEffiKipEqpmDXruWw6vTcdeaibktBf9e\nD+KYeA2GHl5E6G7QN2aL3JnMkAeRktv47rH4cagvh0NLwN8GscPAPxWqiqDqkC+0piUC3voRKmrh\ns2+haRqEROMuKqXw5eFsfjMEizaMPtoPUR5oDK8sQGx+BTpPRvEaEebjRqcTM2DOISpf6IDOmkdA\nXhdo1hGG3Of7dzJzGDS+Baa/AP/e8MfPtTYftn4C3f95oZ/g34K/khE+F3fE0/jyLDXBl87j6VPI\nPgLs4uy0VrnIKMhsDi9hVTPwI4irGE0ybXHvmIxhWxXYa+CKISAc8NwsqCmDfwyCZ6/1BR8SAu7+\nHJRgiOqBs15LzqgHKF29EfuSpdgXzuewoqVmxQpkhxNNyn1oO08n8QE9Tf+vF/4DJpFf9xnaPkZE\nhwlQMRbFfyp57Xr4DPBvaAXkfHckAEsKVB4AQwh0eQjumAl3L4LClVBuhWEa+GE6XNcDdmfhLi3F\nL7wbXb6NwKH1UjNjHEqkgszT0HMaGEL+aIABuiRBahq2uHhqg7zw5Ee+nG6vjfZlz3bbIbkJ3PG8\nLxre8RhDoNvEC/TkVC5nzmVi7lrgtx0CU4EVnNgQxwIDgJeAx8/hfioXgdaGm2lz3A++M3chlpIw\niG3uq6iv9rkiBo4Cgxl+mQ/vPwoPvAWmABgzF74ajWFoDMkffoT81mGcLcfgN+8rQtunw/DRoDlm\nEkqZgVL8CRvyH6UioiOHr3yWK+pbQ95TVOi3ExDbA9nsQarPA79kaJ4PHcbAwvkQ2h3aBkLwiKPX\ny1kB1Q4Y1RYysyDuCdAGwwuPIF83Gm1CEsHbcul027McCL2FVvoOKDrnySdDAVr0gBvribFV4yqp\nAK8Dhj4AO36BSSNAtxIS+kCXMSc+X3+KeA8qf2vOZSQcARw+cnz4SPlEvAU8AcjncC+Vi4BA+t2O\nNwAHG6jvLOMdN+FoZfMekL3Kd3zlcHhuJoz9GEz+vrrYDOj9MMwej6byALr4pvj37Ir4eJYvBdO9\nQyFrG+zbA0CBqGJydCJ1kUPpt+kflFVOJ89cARvKETuziD20FGnTbbCyFWSNg/BPfUlSGzlB+yss\nn+yLtQtH3BWT4eH10DQaUl+Appkw6V34eiVV8+bjzM0FWSbEHkuAO4rqJ59F6I5ZHnYizK2gZySS\nLhCl62ugPxKprEUneHYqlETAF1+eeBSs0kBpGDNzpxsJnyqt87EonNjVMBBfhtEtQM/TNWbSpEn/\nO+7Zsyc9e572FJULjMCMHG5GG3fMuuXQOPj8IRj/EwSfJJdZWh+Y8TjYqnyTUp/dDY/Oh8E3Q49+\n8NAw5F3bmDtvMnUx4YygKwFaLTR9n35l3/Gt35cED7gPzdbvCG82BewOCOsL2gCw5UBASzD2hJR2\nsOMh+CYJmr4AtgBoNRBCkqD3u7511P9TRuAuKUWXlOIryzIJvaayQ3qXZmLMidaTHMWcCVXfQcKd\nmMKv+P17IREw+CGY+xV8+k8Y9eKf+KRVTsWKFStYsWLFeb7qBVujNgm4Byg7Un4GWHQy4XNxNGfj\nM6wlQBSwHGh2nMzLwHB82hqBQGA2cFzcRUCdmGuQeCjBpszFIkYdrSzMhvGt4Y1sCIs/+cklOfDl\nA9D2elj7JfzjFwC2kId15zo0yxaRcVgi8B/vgun3flirUsMC55dc81MF/uYY6HPcsjzZA9+mQty1\nkNQIZs+CyhJf5LTnN0PUcZsmjlA8fjyh992H/r3x8H/TkXGxnkcxEk5rJp36w9h3K6R8fWqZvdsg\noTno9KeWUzknzs/EXM1ZiFvO5n4TgTrgzTMRPhd3xDzgyB5L7gTmnEBmPBAHJAK3AMs4sQFWaaBo\naESgGPH7yphmcMsr4D3N37TIJvDYD9DuZmjeB4BsipnMUtZmBNDx4c8IfOnTPxhgAH9hoZtxMMsG\nNkHZsRRKc38vIGkh7TGwNAP/HnDLSPBP963WiDx5zIVGDz2EPiEBDCaw1yOhpzkPUk/hqXXx2kB2\ngm3zqeVSM1UDfNlgP4vXWXPGPxDnukRtJtCY3y9RiwY+Bq45Tr4HMBbfhN6JUEfClxOyDG6Hb2Lu\nTHDZ8egNbOAAjQkhhuA/+J9PxHY24ag6QPtPZ8D9n4Jf0NE33Vao3QcBEpSPhrI7IHP06dvi8cA7\nE6D3YGjti69RxU4CaYKGkxhQ2Q5bkyHiQYgZfyYaq1xAzs9IOP8sxOPO5n4TgbvwDbV/xWf3TrZ8\nV92sodLwWcr3tP18JpbNvyDe3vPHTSKunVCYCTFZoD/eI3YCFAUGpUHLjvDylDNvyOH3QfKDsDtP\nL6tyQTk/Rjj39FL/I/H4+51qvmwdR/3BL+Bz14482ZXV2BEqDZ5e9GdJ3x103bwU89510PS46HD6\nDAi4zxen4UwQAm6872j6oDMl7B5wHji7c1QaMKdyp60/8jopV57hTT4B5p9KQB0Jq1wWrGMla6yz\nufdAdwJbniDCnLcMpCAQZxj4pqYKCnMhrc3pZVUaHOdnJLzrLMTTzuZ+UUDxkePHgHbAbScTVo2w\nymXDIXIpo4S2dLrUTVG5xJwfI7ztLMQzz+Z+XwCtfPcgFxjF0T0Vf0A1wiqXFQoyQg3+97fn/Bjh\ndWch3vFc73dSVJ+wymWFaoBVzh8NI6CwaoRVVFT+pjSMLeaqEVZRUfmboo6EVVRUVC4h6khYRUVF\n5RKijoRVVFRULiHqSFhFRUXlEvKnAvOcd1QjrKKi8jdFHQmrqKioXEJUn7CKiorKJaRhjIT/ltuP\nzn+alEvPX1En+Gvq9VfUCS5HvTxn8bpwqEb4L8JfUSf4a+r1V9QJLke9Lo9EnyoqKip/UVSfsIqK\nisolpGEsUWtIoSxX4MtDp6KionI6VuLL9v5nOdu4uVX48mqqqKioqKioqKioqKioqKioqDR8QvCl\np84BfgSCTiGrAbZwmuyoDYQz0SsOWA5kATuBhy9a686Oq4FsYC/w1Elk/n3k/W1A64vUrnPldHoN\nw6fPdmAN0PLiNe2cOJPnBb4Elx7g+ovRKJWGy+vAk0eOnwJePYXs48A0YN6FbtR54Ez0isSXcBDA\nH9gDNL/wTTsrNMA+IAHQAVv5YxsHAAuPHHfg7JKDXSrORK9OgOXI8dX8dfT6TW4Z8D0w9GI1TqVh\nkg1EHDmOPFI+EbHAEqAXl8dI+Ez1OpY5QJ8L1qI/Rydg0THlp4+8juVD4OZjysfq3lA5E72OJRgo\nuKAtOj+cqV6PAg8AU1CN8Cn5O+yYi+BouunDnPzL+xbwBCBfjEadB85Ur99IwPc3fv0FbNOfIQbI\nP6ZccKTudDKxF7hd58qZ6HUsIzk62m/InOnzGgx8cKSsplE/BX+VzRo/4RsNHs+E48oKJ+4QA4FS\nfP7gnue1ZefGuer1G/7ALOARwHp+mnbeONMv6PFr2hv6F/ts2tcLuBvocoHacj45E73exjc6VvA9\nt4a0H6HB8Vcxwlee4r3D+AxZCRCFz9geT2fgWny+RyMQCHwB3HF+m3nWnKte4PPbzQa+wueOaGgU\n4ptA/I04/vi3/HiZ2CN1DZkz0Qt8k3Ef4/MJV12Edp0rZ6JXW2DGkeNGQH98ARguh7kWlQvA6xyd\nwX2aU0/MgW/X3uXgEz4TvQS+H5O3Llaj/gRaYD8+d4me00/MdeTymMA6E70a45vk6nhRW3ZunIle\nxzIFdXXE354QfBNuxy/ligYWnEC+B5fHL/aZ6NUVn497Kz5XyxZ8I66GRn98Kzf2Ac8cqRt15PUb\nk4+8vw1oc1Fb9+c5nV6fABUcfTYbLnYD/yRn8rx+QzXCKioqKioqKioqKioqKioqKioqKioqKioq\nKioqKioqKioqKioqKioqKioqKioqKioqKheP/wdfnzF8qVT/lAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index f3f2c52f1f..5960ac1115 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -369,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDE6MDM6MjktMDQ6MDDFeHPZAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAxOjAzOjI5LTA0OjAwtCXLZQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDE6MTQ6MjctMDQ6MDC2Fcw9AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAxOjE0OjI3LTA0OjAwx0h0gQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -580,7 +580,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 01:03:29\n", + " Date/Time: 2015-10-03 01:14:27\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -636,20 +636,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1300E-01 seconds\n", - " Reading cross sections = 9.0000E-02 seconds\n", - " Total time in simulation = 2.1398E+01 seconds\n", - " Time in transport only = 2.1378E+01 seconds\n", - " Time in inactive batches = 2.0260E+00 seconds\n", - " Time in active batches = 1.9372E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 2.1823E+01 seconds\n", - " Calculation Rate (inactive) = 6169.79 neutrons/second\n", - " Calculation Rate (active) = 1935.78 neutrons/second\n", + " Total time for initialization = 6.7400E-01 seconds\n", + " Reading cross sections = 1.5200E-01 seconds\n", + " Total time in simulation = 2.4330E+01 seconds\n", + " Time in transport only = 2.4308E+01 seconds\n", + " Time in inactive batches = 2.4220E+00 seconds\n", + " Time in active batches = 2.1908E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 2.5018E+01 seconds\n", + " Calculation Rate (inactive) = 5161.02 neutrons/second\n", + " Calculation Rate (active) = 1711.70 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", diff --git a/openmc/cross.py b/openmc/cross.py index f361313b31..975d5cb363 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -417,7 +417,6 @@ class CrossFilter(object): ---------- data_size : Integral The total number of bins in the tally corresponding to this filter - summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric diff --git a/openmc/filter.py b/openmc/filter.py index 9735d95bb9..3bc0c866e5 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -476,7 +476,6 @@ class Filter(object): ---------- data_size : Integral The total number of bins in the tally corresponding to this filter - summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index fd696ff722..e6ea7564cb 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -326,13 +326,10 @@ class MultiGroupXS(object): ---------- scores : Iterable of str Scores for each tally - filters : Iterable of tuple of Filter Tuples of non-spatial domain filters for each tally - keys : Iterable of str Key string used to store each tally in the tallies dictionary - estimator : {'analog' or 'tracklength'} Type of estimator to use for each tally @@ -450,23 +447,18 @@ class MultiGroupXS(object): ---------- groups : Iterable of Integral or 'all' Energy groups of interest - subdomains : Iterable of Integral or 'all' Subdomain IDs of interest - nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns - order_groups: {'increasing', 'decreasing'} Return the cross section indexed according to increasing (default) or decreasing energy groups (decreasing or increasing energies) - value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -721,14 +713,12 @@ class MultiGroupXS(object): ---------- subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report - nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns @@ -820,13 +810,10 @@ class MultiGroupXS(object): ---------- filename : str Filename for the HDF5 file (default is 'mgxs') - directory : str Directory for the HDF5 file (default is 'mgxs') - xs_type: {'macro' or 'micro'} Store the macro or micro cross section in units of cm^-1 or barns - append : boolean If true, appends to an existing HDF5 file with the same filename directory (if one exists) @@ -940,16 +927,12 @@ class MultiGroupXS(object): ---------- filename : str Filename for the exported file (default is 'mgxs') - directory : str Directory for the exported file (default is 'mgxs') - format : {'csv', 'excel', 'pickle', 'latex'} The format for the exported data file - groups : Iterable of Integral or 'all' Energy groups of interest - xs_type: {'macro' or 'micro'} Store the macro or micro cross section in units of cm^-1 or barns @@ -1014,17 +997,14 @@ class MultiGroupXS(object): ---------- groups : Iterable of Integral or 'all' Energy groups of interest - nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} Return macro or micro cross section in units of cm^-1 or barns - summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric @@ -1443,25 +1423,19 @@ class ScatterMatrixXS(MultiGroupXS): ---------- in_groups : Iterable of Integral or 'all' Incoming energy groups of interest - out_groups : Iterable of Integral or 'all' Outgoing energy groups of interest - subdomains : Iterable of Integral or 'all' Subdomain IDs of interest - nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns - xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns - value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -1576,14 +1550,12 @@ class ScatterMatrixXS(MultiGroupXS): ---------- subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report - nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns @@ -1756,23 +1728,18 @@ class Chi(MultiGroupXS): ---------- groups : Iterable of Integral or 'all' Energy groups of interest - subdomains : Iterable of Integral or 'all' Subdomain IDs of interest - nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns - xs_type: {'macro' or 'micro'} This parameter is not relevant for chi but is included here to mirror the parent MultiGroupXS.get_xs(...) class method - value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted @@ -1888,17 +1855,14 @@ class Chi(MultiGroupXS): ---------- groups : Iterable of Integral or 'all' Energy groups of interest - nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' (default) will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} Return macro or micro cross section in units of cm^-1 or barns - summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric diff --git a/openmc/tallies.py b/openmc/tallies.py index dcf67b485c..3e0d70409d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -742,7 +742,6 @@ class Tally(object): ---------- filter_type : str The type of Filter (e.g., 'cell', 'energy', etc.) - filter_bin : Integral or tuple The bin is an integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. The bin is an integer for the @@ -854,7 +853,6 @@ class Tally(object): filters : list of str A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin @@ -1018,11 +1016,9 @@ class Tally(object): scores : list of str A list of one or more score strings (e.g., ['absorption', 'nu-fission']; default is []) - filters : list of str A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin @@ -1034,11 +1030,9 @@ class Tally(object): 3-tuple for 'mesh' filters corresponding to the mesh cell of interest. The order of the bins in the list must correspond to the filter_types parameter. - nuclides : list of str A list of nuclide name strings (e.g., ['U-235', 'U-238']; default is []) - value : str A string for the type of value to return - 'mean' (default), 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted @@ -1112,13 +1106,10 @@ class Tally(object): ---------- filters : bool Include columns with filter bin information (default is True). - nuclides : bool Include columns with nuclide bin information (default is True). - scores : bool Include columns with score bin information (default is True). - summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric @@ -1283,14 +1274,11 @@ class Tally(object): ---------- filename : str The name of the file for the results (default is 'tally-results') - directory : str The name of the directory for the results (default is '.') - format : str The format for the exported file - HDF5 ('hdf5', default) and Python pickle ('pkl') files are supported - append : bool Whether or not to append the results to the file (default is True) @@ -2274,14 +2262,12 @@ class Tally(object): Parameters ---------- - scores : list + scores : list of str A list of one or more score strings (e.g., ['absorption', 'nu-fission']; default is []) - - filters : list + filters : list of str A list of filter type strings (e.g., ['mesh', 'energy']; default is []) - filter_bins : list of Iterables A list of the filter bins corresponding to the filter_types parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin @@ -2293,8 +2279,7 @@ class Tally(object): 3-tuple for 'mesh' filters corresponding to the mesh cell of interest. The order of the bins in the list must correspond to the filter_types parameter. - - nuclides : list + nuclides : list of str A list of nuclide name strings (e.g., ['U-235', 'U-238']; default is []) @@ -2398,25 +2383,24 @@ class Tally(object): def summation(self, scores=[], filter_type=None, filter_bins=[], nuclides=[]): - """Build a sliced tally for the specified filter bins, nuclides, scores. + """Vectorized sum of tally data across scores, filter bins and/or + nuclides using tally addition. - This method constructs a new tally to encapsulate a subset of the data - represented by this tally. The subset of data to include in the tally - slice is determined by the scores, filter bins and nuclides specified + This method constructs a new tally to encapsulate the sum of the data + represented by the summation of the data in this tally. The tally data + sum is determined by the scores, filter bins and nuclides specified in the input parameters. Parameters ---------- - scores : list + scores : list of str A list of one or more score strings to sum across (e.g., ['absorption', 'nu-fission']; default is []) - filter_type : str A filter type string (e.g., 'cell', 'energy') corresponding to the filter bins to sum across - filter_bins : Iterable of Integral or tuple - A list of the filter bins corresponding to the filters parameter + A list of the filter bins corresponding to the filter_type parameter Each bin in the list is the integer ID for 'material', 'surface', 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer for the cell instance ID for 'distribcell Filters. Each bin is a @@ -2424,8 +2408,7 @@ class Tally(object): to the energy boundaries of the bin of interest. Each bin is an (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of interest. - - nuclides : list + nuclides : list of str A list of nuclide name strings to sum across (e.g., ['U-235', 'U-238']; default is []) @@ -2476,6 +2459,7 @@ class Tally(object): # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice + # Add back the filter(s) which were summed across to derived tally for filter_type in summed_filters: filters = summed_filters[filter_type] for i in range(1, len(filters)): @@ -2485,24 +2469,25 @@ class Tally(object): return tally_sum def diagonalize_filter(self, new_filter): - """Combines filters, scores and nuclides with another tally. + """Diagonalize the tally data array along a new axis of filter bins. - This is a helper method for the tally arithmetic methods. The filters, - scores and nuclides from both tallies are enumerated into all possible - combinations and expressed as CrossFilter, CrossScore and - CrossNuclide objects in the new derived tally. + This is a helper method for the tally arithmetic methods. This routine + adds the new filter to a derived tally constructed copied from this one. + The data in the derived tally arrays is "diagonalized" along the bins in + the new filter. This functionality is used by the openmc.mgxs module; to + transport-correct scattering matrices by subtracting a 'scatter-P1' + reaction rate tally with an energy filter from an 'scatter' reaction + rate tally with both energy and energyout filters. Parameters ---------- - other : Tally - The tally on the right hand side of the outer product - binary_op : {'+', '-', '*', '/', '^'} - The binary operation in the outer product + new_filter : Filter + The filter along which to diagonalize the data in the new Returns ------- Tally - A new Tally outer that is the outer product with this one. + A new derived Tally with data diagaonalized along the new filter. """ @@ -2513,35 +2498,42 @@ class Tally(object): 'contains a "{1}" filter'.format(self.id, new_filter.type) raise ValueError(msg) + # Add the new filter to a copy of this Tally new_tally = copy.deepcopy(self) new_tally.add_filter(new_filter) + # Determine the shape of data in the new diagonalized Tally num_filter_bins = new_tally.num_filter_bins num_nuclides = new_tally.num_nuclides num_score_bins = new_tally.num_score_bins new_shape = (num_filter_bins, num_nuclides, num_score_bins) - diag_factor = self.num_filter_bins / new_filter.num_bins + # Determine "base" indices along the new "diagonal", and the factor + # by which the "base" indices should be repeated to account for all + # other filter bins in the diagonalized tally indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1) + diag_factor = self.num_filter_bins / new_filter.num_bins diag_indices = np.zeros(self.num_filter_bins, dtype=np.int) + # Determine the filter indices along the new "diagonal" for i in range(diag_factor): start = i * new_filter.num_bins end = (i+1) * new_filter.num_bins diag_indices[start:end] = indices + (i * new_filter.num_bins**2) + # Inject this Tally's data along the diagonal of the diagonalized Tally if self.sum is not None: new_tally._sum = np.zeros(new_shape, dtype=np.float64) - new_tally._sum[diag_indices, :self.num_nuclides, :self.num_scores] = self.sum + new_tally._sum[diag_indices, :, :] = self.sum if self.sum_sq is not None: new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64) - new_tally._sum_sq[diag_indices, :self.num_nuclides, :self.num_scores] = self.sum_sq + new_tally._sum_sq[diag_indices, :, :] = self.sum_sq if self.mean is not None: new_tally._mean = np.zeros(new_shape, dtype=np.float64) - new_tally._mean[diag_indices, :self.num_nuclides, :self.num_scores] = self.mean + new_tally._mean[diag_indices, :, :] = self.mean if self.std_dev is not None: new_tally._std_dev = np.zeros(new_shape, dtype=np.float64) - new_tally._std_dev[diag_indices, :self.num_nuclides, :self.num_scores] = self.std_dev + new_tally._std_dev[diag_indices, :, :] = self.std_dev # Correct each Filter's stride stride = new_tally.num_nuclides * new_tally.num_score_bins @@ -2579,6 +2571,7 @@ class TalliesFile(object): ---------- tally : Tally Tally to add to file + merge : bool Indicate whether the tally should be merged with an existing tally, if possible. Defaults to False. diff --git a/openmc/temp.py b/openmc/temp.py deleted file mode 100644 index 91f6082996..0000000000 --- a/openmc/temp.py +++ /dev/null @@ -1,12 +0,0 @@ -from checkvalue import * -from checkvalue import _isinstance - -import numpy as np - -zs = np.zeros((2,)) - -print _isinstance(zs[0], Integral) -print _isinstance(zs[0], Real) -print _isinstance(zs[0], (Integral, Real)) - -print check_iterable_type('thing', zs, (Real, Integral)) From 070a229a937eb66ab28f90d4a63ab20d73658833 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 3 Oct 2015 02:02:44 -0400 Subject: [PATCH 259/519] Fix test_score_nuscatter* inactive batches --- tests/test_score_nuscatter/inputs_true.dat | 2 +- tests/test_score_nuscatter/results_true.dat | 14 ++-- .../test_score_nuscatter.py | 7 +- tests/test_score_nuscatter_n/inputs_true.dat | 2 +- tests/test_score_nuscatter_n/results_true.dat | 62 ++++++++-------- .../test_score_nuscatter_n.py | 7 +- tests/test_score_nuscatter_pn/inputs_true.dat | 2 +- .../test_score_nuscatter_pn/results_true.dat | 42 +++++------ .../test_score_nuscatter_pn.py | 7 +- tests/test_score_nuscatter_yn/inputs_true.dat | 2 +- .../test_score_nuscatter_yn/results_true.dat | 70 +++++++++---------- .../test_score_nuscatter_yn.py | 7 +- 12 files changed, 122 insertions(+), 102 deletions(-) diff --git a/tests/test_score_nuscatter/inputs_true.dat b/tests/test_score_nuscatter/inputs_true.dat index 440db11243..6ae99b4a17 100644 --- a/tests/test_score_nuscatter/inputs_true.dat +++ b/tests/test_score_nuscatter/inputs_true.dat @@ -1 +1 @@ -5d0e915af1f424b8ca9d3723fecc2e0e0c558bcbe70b5ad45bcc8e03caf9b4caae9ed593010ce31c6dfe09be06a6dc3929b839999132917569f2ed93c3b70455 \ No newline at end of file +c74fb5e4e8caecd11642231b55cb9442264da220329fd6a1c9959214342acd5efb4ef23368b0b018f0388a6102bce65226f6161d32f3613128d8c3762a3f6f9e \ No newline at end of file diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index 6e9935f218..8f9fcba891 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.903196E-01 4.279617E-02 +1.034954E+00 1.782721E-02 tally 1: 0.000000E+00 0.000000E+00 -1.485000E+01 -4.439790E+01 -4.120000E+00 -3.438000E+00 -5.173000E+01 -5.467243E+02 +2.514000E+01 +6.511880E+01 +6.370000E+00 +4.230900E+00 +8.547000E+01 +7.481913E+02 diff --git a/tests/test_score_nuscatter/test_score_nuscatter.py b/tests/test_score_nuscatter/test_score_nuscatter.py index e94ab61f15..d13ded507c 100644 --- a/tests/test_score_nuscatter/test_score_nuscatter.py +++ b/tests/test_score_nuscatter/test_score_nuscatter.py @@ -17,7 +17,12 @@ class ScoreNuScatterTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(t) - PyAPITestHarness._build_inputs(self) + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() def _cleanup(self): PyAPITestHarness._cleanup(self) diff --git a/tests/test_score_nuscatter_n/inputs_true.dat b/tests/test_score_nuscatter_n/inputs_true.dat index a907148a7c..c7924a247a 100644 --- a/tests/test_score_nuscatter_n/inputs_true.dat +++ b/tests/test_score_nuscatter_n/inputs_true.dat @@ -1 +1 @@ -3db6a6067fb07ed0e213c1e293f32a23ab64fbfb45a7a69320e8326ae76e5a3020c2f73986e7a93eeee1dde1422d84081ff18f0a9770aaba94423586bd134721 \ No newline at end of file +c184ef2764fa23db32253ec4c23d36cf842f173a0a57c93cb165faf771f2ff23346756160ba5793c558448283eb0917d23e3871753ea2b7e3e24f14d6cf4179f \ No newline at end of file diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index 96e56bd6ab..0c1315807f 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -9.903196E-01 4.279617E-02 +1.034954E+00 1.782721E-02 tally 1: -1.485000E+01 -4.439790E+01 -1.259515E+00 -3.360064E-01 -7.983154E-01 -1.355632E-01 -3.425460E-01 -2.971972E-02 -2.949225E-01 -3.975603E-02 -4.120000E+00 -3.438000E+00 -6.222571E-01 -8.335984E-02 -1.670136E-01 -1.374768E-02 --5.819374E-02 -1.091808E-02 --6.389550E-02 -5.688533E-03 -5.173000E+01 -5.467243E+02 -2.669403E+01 -1.451361E+02 -9.691140E+00 -1.933574E+01 -5.860769E-01 -2.122377E-01 --1.190340E+00 -3.145785E-01 +2.514000E+01 +6.511880E+01 +2.724740E+00 +8.378120E-01 +1.521255E+00 +2.667071E-01 +7.903706E-01 +1.216244E-01 +5.770120E-01 +5.508594E-02 +6.370000E+00 +4.230900E+00 +8.075261E-01 +9.047897E-02 +5.879624E-01 +4.107777E-02 +2.034636E-01 +8.243025E-03 +-2.744502E-02 +1.515916E-03 +8.547000E+01 +7.481913E+02 +4.446994E+01 +2.016855E+02 +1.664683E+01 +2.837713E+01 +1.373176E+00 +3.329601E-01 +-1.663772E+00 +4.264485E-01 diff --git a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py index 5b0a755567..c675bc7be3 100644 --- a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py +++ b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py @@ -21,7 +21,12 @@ class ScoreNuScatterNTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(t) - PyAPITestHarness._build_inputs(self) + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() def _cleanup(self): PyAPITestHarness._cleanup(self) diff --git a/tests/test_score_nuscatter_pn/inputs_true.dat b/tests/test_score_nuscatter_pn/inputs_true.dat index eb2962dc34..30a894dafb 100644 --- a/tests/test_score_nuscatter_pn/inputs_true.dat +++ b/tests/test_score_nuscatter_pn/inputs_true.dat @@ -1 +1 @@ -5cd39eacee3efe8d7a8db38edb741d8f773a0b42276dab8635d36e7fc9809617d9ad47510be06bc019472e1b792bc678d88fcbb26ca4ed07504a222388ee230c \ No newline at end of file +79d74ffe32f564b83bdde94048f57233454881f3b55413e9b5e30ce4b9813ff6436dca98d691d941d5f31947f2215dcb656369c2b32e6240e1424e6aad96395e \ No newline at end of file diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 753216a8b7..603c13e701 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -9.903196E-01 4.279617E-02 +1.034954E+00 1.782721E-02 tally 1: -1.485000E+01 -4.439790E+01 -1.259515E+00 -3.360064E-01 -7.983154E-01 -1.355632E-01 -3.425460E-01 -2.971972E-02 -2.949225E-01 -3.975603E-02 +2.514000E+01 +6.511880E+01 +2.724740E+00 +8.378120E-01 +1.521255E+00 +2.667071E-01 +7.903706E-01 +1.216244E-01 +5.770120E-01 +5.508594E-02 tally 2: -1.485000E+01 -4.439790E+01 -1.259515E+00 -3.360064E-01 -7.983154E-01 -1.355632E-01 -3.425460E-01 -2.971972E-02 -2.949225E-01 -3.975603E-02 +2.514000E+01 +6.511880E+01 +2.724740E+00 +8.378120E-01 +1.521255E+00 +2.667071E-01 +7.903706E-01 +1.216244E-01 +5.770120E-01 +5.508594E-02 diff --git a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py index a69679873f..d3a4a55961 100644 --- a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py +++ b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py @@ -25,7 +25,12 @@ class ScoreNuScatterPNTestHarness(PyAPITestHarness): self._input_set.tallies.add_tally(t1) self._input_set.tallies.add_tally(t2) - PyAPITestHarness._build_inputs(self) + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() def _cleanup(self): PyAPITestHarness._cleanup(self) diff --git a/tests/test_score_nuscatter_yn/inputs_true.dat b/tests/test_score_nuscatter_yn/inputs_true.dat index 510c6f04d9..9a8a934b17 100644 --- a/tests/test_score_nuscatter_yn/inputs_true.dat +++ b/tests/test_score_nuscatter_yn/inputs_true.dat @@ -1 +1 @@ -4bce40c1119ba7ac23c12b0fcf79fbf9b6dfb89ce2921f5f3906cb8683b79355bd9ba208c80f736f03ea18dccf3449a4ddaedb72ebb10b27301e843c31822f58 \ No newline at end of file +fd7b5b66e5d5e705da488651445d75240b05dcc1d243b2d2e8b8a729c8220221cdfa1eccfeca30897a006caaceae3e8c7449392b5027b290cb388b33e86ff2a3 \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index d1b165274d..79c89b7708 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -9.903196E-01 4.279617E-02 +1.034954E+00 1.782721E-02 tally 1: -1.485000E+01 -4.439790E+01 +2.514000E+01 +6.511880E+01 tally 2: -1.485000E+01 -4.439790E+01 -8.440076E-02 -1.135203E-02 -8.198663E-02 -3.887429E-02 -1.358080E-01 -2.890416E-02 --3.544823E-02 -9.843339E-04 -1.542072E-01 -8.228126E-03 -1.057111E-01 -3.758100E-03 -1.647870E-02 -4.827841E-03 -1.378297E-01 -1.566876E-02 --4.676778E-02 -4.809366E-03 -1.966204E-02 -7.447981E-04 --1.889258E-02 -6.841953E-04 -1.337703E-02 -1.250077E-03 -1.044684E-01 -6.969498E-03 --1.177995E-02 -8.208715E-03 -1.940058E-04 -5.128759E-03 +2.514000E+01 +6.511880E+01 +-2.222467E-01 +2.881247E-02 +3.019176E-01 +3.014833E-02 +8.459006E-04 +4.773570E-02 +9.596964E-02 +1.009754E-02 +-4.314855E-02 +6.207871E-03 +4.607677E-02 +9.205573E-03 +-2.345994E-03 +1.243004E-02 +9.577397E-02 +6.605519E-03 +-2.821584E-02 +3.834286E-03 +-1.077389E-01 +6.570217E-03 +-1.106443E-01 +1.006436E-02 +1.322104E-01 +7.721677E-03 +1.315548E-02 +5.488918E-04 +-2.792171E-02 +5.816161E-03 +-1.994370E-02 +1.169674E-03 diff --git a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py index 0b2005bdcb..d48df6a21e 100644 --- a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py +++ b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py @@ -21,7 +21,12 @@ class ScoreNuScatterYNTestHarness(PyAPITestHarness): self._input_set.tallies.add_tally(t1) self._input_set.tallies.add_tally(t2) - PyAPITestHarness._build_inputs(self) + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() def _cleanup(self): PyAPITestHarness._cleanup(self) From 3baaacda9990215fdc2969f06101b2fd988f35c8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 02:29:07 -0400 Subject: [PATCH 260/519] Cleaned up docstrings for MultiGroupXS class --- openmc/cross.py | 2 +- openmc/filter.py | 2 +- openmc/mgxs/mgxs.py | 110 +++++++++++++++++++++++++------------------- openmc/tallies.py | 24 +++++----- 4 files changed, 76 insertions(+), 62 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 975d5cb363..9b8a1d240d 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -405,7 +405,7 @@ class CrossFilter(object): This method constructs a Pandas DataFrame object for the CrossFilter with columns annotated by filter bin information. This is a helper - method for the Tally.get_pandas_dataframe(...) routine. This method + method for the Tally.get_pandas_dataframe(...) method. This method recursively builds and concatenates Pandas DataFrames for the left and right filters and crossfilters. diff --git a/openmc/filter.py b/openmc/filter.py index 3bc0c866e5..eaa30d30e5 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -466,7 +466,7 @@ class Filter(object): This method constructs a Pandas DataFrame object for the filter with columns annotated by filter bin information. This is a helper method - for the Tally.get_pandas_dataframe(...) routine. + for the Tally.get_pandas_dataframe(...) method. This capability has been tested for Pandas >=0.13.1. However, it is recommended to use v0.16 or newer versions of Pandas since this method diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e6ea7564cb..171718bc8d 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -17,12 +17,14 @@ if sys.version_info[0] >= 3: # Supported domain types +# TODO: Implement Mesh domains DOMAIN_TYPES = ['cell', 'distribcell', 'universe', 'material'] -# Supported domain objects +# Supported domain classes +# TODO: Implement Mesh domains DOMAINS = [openmc.Cell, openmc.Universe, openmc.Material] @@ -48,7 +50,7 @@ class MultiGroupXS(object): If true, computes multi-group cross sections for each nuclide in domain name : str, optional Name of the multi-group cross section. Used as a label to identify - tallies in OpenMC tallies.xml file. + tallies in OpenMC 'tallies.xml' file. Attributes ---------- @@ -92,6 +94,7 @@ class MultiGroupXS(object): self.name = name self.by_nuclide = by_nuclide + if domain_type is not None: self.domain_type = domain_type if domain is not None: @@ -213,7 +216,7 @@ class MultiGroupXS(object): Returns ------- - nuclides : list of str + list of str A list of the string names for each nuclide in the problem domain (e.g., ['U-235', 'U-238', 'O-16']) @@ -241,7 +244,7 @@ class MultiGroupXS(object): Returns ------- - density : Real + Real The atomic number density (atom/b-cm) for the nuclide of interest Raises @@ -279,7 +282,7 @@ class MultiGroupXS(object): Returns ------- - densities : ndarray of float + ndarray of Real An array of the atomic number densities (atom/b-cm) for each of the nuclides in the problem domain @@ -300,14 +303,14 @@ class MultiGroupXS(object): for nuclide in nuclides: densities[0] += self.get_nuclide_density(nuclide) - # Sum the atomic number densities for all nuclides + # Tabulate the atomic number densities for all nuclides elif nuclides == 'all': nuclides = self.get_all_nuclides() densities = np.zeros(self.num_nuclides, dtype=np.float) for i, nuclide in enumerate(nuclides): densities[i] += self.get_nuclide_density(nuclide) - # Store each nuclide's atomic number density in an array + # Tabulate the atomic number densities for each specified nuclide else: densities = np.zeros(len(nuclides), dtype=np.float) for i, nuclide in enumerate(nuclides): @@ -321,6 +324,8 @@ class MultiGroupXS(object): This is a helper method for MultiGroupXS subclasses to create tallies for input file generation. The tallies are stored in the tallies dict. + This method is called by each subclass' create_tallies(...) method + which define the parameters given to this parent class method. Parameters ---------- @@ -343,8 +348,8 @@ class MultiGroupXS(object): # Create a domain Filter object domain_filter = openmc.Filter(self.domain_type, self.domain.id) - domain_filter.num_bins = 1 + # Create each Tally needed to compute the multi group cross section for score, key, filters in zip(scores, keys, all_filters): self.tallies[key] = openmc.Tally(name=self.name) self.tallies[key].add_score(score) @@ -355,7 +360,7 @@ class MultiGroupXS(object): for filter in filters: self.tallies[key].add_filter(filter) - # If this is a by nuclide cross-section, add all nuclides to Tally + # If this is a by-nuclide cross-section, add all nuclides to Tally if self.by_nuclide and score != 'flux': all_nuclides = self.domain.get_all_nuclides() for nuclide in all_nuclides: @@ -366,7 +371,18 @@ class MultiGroupXS(object): @abc.abstractmethod def compute_xs(self): """Performs generic cleanup after a subclass' uses tally arithmetic to - compute a multi-group cross section as a derived tally.""" + compute a multi-group cross section as a derived tally. + + This method replaces CrossNuclides generated by tally arithmetic with + the original Nuclide objects in the xs_tally instance attribute. The + simple Nuclides allow for cleaner output through Pandas DataFrames as + well as simpler data access through the get_xs(...) class method. + + In addition, this routine resets NaNs in the multi group cross section + array to 0.0. This may be needed occur if no events were scored in + certain tally bins, which will lead to a divide-by-zero situation. + + """ # If computing xs for each nuclide, replace CrossNuclides with originals if self.by_nuclide: @@ -393,6 +409,12 @@ class MultiGroupXS(object): statepoint : openmc.StatePoint An OpenMC StatePoint object with tally data + Raises + ------ + ValueError + When this method is called with a statepoint that has not been + linked with a summary object. + """ cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) @@ -419,21 +441,13 @@ class MultiGroupXS(object): # Create Tallies to search for in StatePoint self.create_tallies() - if self.domain_type == 'distribcell': - filters = [] - filter_bins = [] - else: - filters = [self.domain_type] - filter_bins = [(self.domain.id,)] - # Find, slice and store Tallies from StatePoint # The tally slicing is needed if tally merging was used for tally_type, tally in self.tallies.items(): sp_tally = statepoint.get_tally(tally.scores, tally.filters, tally.nuclides, estimator=tally.estimator) - sp_tally = sp_tally.get_slice(tally.scores, filters, - filter_bins, tally.nuclides) + sp_tally = sp_tally.get_slice(tally.scores, nuclides=tally.nuclides) self.tallies[tally_type] = sp_tally def get_xs(self, groups='all', subdomains='all', nuclides='all', @@ -465,7 +479,7 @@ class MultiGroupXS(object): Returns ------- - xs : ndarray + ndarray A NumPy array of the multi-group cross section indexed in the order each group, subdomain and nuclide is listed in the parameters. @@ -502,8 +516,6 @@ class MultiGroupXS(object): filter_bins.append((self.energy_groups.get_group_bounds(group),)) # Construct a collection of the nuclides to retrieve from the xs tally - # NOTE: We must not override the "nuclides" parameter since it is used - # to retrieve atomic number densities for micro xs if self.by_nuclide: if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: query_nuclides = self.get_all_nuclides() @@ -512,14 +524,14 @@ class MultiGroupXS(object): else: query_nuclides = ['total'] - # Use tally summation if user requested the sum for all nuclides + # If user requested the sum for all nuclides, use tally summation if nuclides == 'sum' or nuclides == ['sum']: xs_tally = self.xs_tally.summation(nuclides=query_nuclides) xs = xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) else: xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, - nuclides=query_nuclides, value=value) + nuclides=query_nuclides, value=value) # Divide by atom number densities for microscopic cross sections if xs_type == 'micro': @@ -533,11 +545,12 @@ class MultiGroupXS(object): # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - # Reshape tally data array with separate axes for domain and energy if groups == 'all': num_groups = self.num_groups else: num_groups = len(groups) + + # Reshape tally data array with separate axes for domain and energy num_subdomains = xs.shape[0] / num_groups new_shape = (num_subdomains, num_groups) + xs.shape[1:] xs = np.reshape(xs, new_shape) @@ -583,7 +596,7 @@ class MultiGroupXS(object): condensed_xs = copy.deepcopy(self) condensed_xs.energy_groups = coarse_groups - # Build indices to sum up over + # Build energy indices to sum across energy_indices = [] for group in range(coarse_groups.num_groups, 0, -1): low, high = coarse_groups.get_group_bounds(group) @@ -629,9 +642,9 @@ class MultiGroupXS(object): def get_subdomain_avg_xs(self, subdomains='all'): """Construct a subdomain-averaged version of this cross section. - This is primarily useful for averaging across distribcell instances. - This routine performs spatial homogenization to compute the scalar - flux-weighted average cross section across the subdomains. + This method is useful for averaging cross sections across distribcell + instances. The method performs spatial homogenization to compute the + scalar flux-weighted average cross section across the subdomains. Parameters ---------- @@ -707,7 +720,7 @@ class MultiGroupXS(object): return avg_xs def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): - """Prints a string representation for the multi-group cross section. + """Print a string representation for the multi-group cross section. Parameters ---------- @@ -736,7 +749,7 @@ class MultiGroupXS(object): if self.by_nuclide: if nuclides == 'all': nuclides = self.get_all_nuclides() - if nuclides == 'sum': + elif nuclides == 'sum': nuclides = ['sum'] else: cv.check_iterable_type('nuclides', nuclides, basestring) @@ -784,9 +797,9 @@ class MultiGroupXS(object): average = self.get_xs([group], [subdomain], [nuclide], xs_type=xs_type, value='mean') rel_err = self.get_xs([group], [subdomain], [nuclide], - xs_type=xs_type, value='rel_err')*100 - average = np.nan_to_num(average.flatten())[0] - rel_err = np.nan_to_num(rel_err.flatten())[0] + xs_type=xs_type, value='rel_err') + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' @@ -796,13 +809,13 @@ class MultiGroupXS(object): def build_hdf5_store(self, filename='mgxs', directory='mgxs', xs_type='macro', append=True): - """Export the multi-group cross section data into an HDF5 binary file. + """Export the multi-group cross section data to an HDF5 binary file. - This routine constructs an HDF5 file which stores the multi-group - cross section data. The data is be stored in a hierarchy of HDF5 groups + This method constructs an HDF5 file which stores the multi-group + cross section data. The data is stored in a hierarchy of HDF5 groups from the domain type, domain id, subdomain id (for distribcell domains), - and cross section type. Two datasets for the mean and standard deviation - are stored for each subddomain entry in the HDF5 file. + nuclides and cross section type. Two datasets for the mean and standard + deviation are stored for each subdomain entry in the HDF5 file. NOTE: This requires the h5py Python package. @@ -892,9 +905,10 @@ class MultiGroupXS(object): for j, nuclide in enumerate(nuclides): if nuclide != 'sum': + density = densities[j] nuclide_group = rxn_group.require_group(nuclide) nuclide_group.require_dataset('density', dtype=np.float64, - data=[densities[j]], shape=(1,)) + data=[density], shape=(1,)) else: nuclide_group = rxn_group @@ -919,9 +933,9 @@ class MultiGroupXS(object): format='csv', groups='all', xs_type='macro'): """Export the multi-group cross section data to a file. - This routine leverages the functionality in the Pandas library to - export the multi-group cross section data in a variety of output - file formats for storage and/or post-processing. + This method leverages the functionality in the Pandas library to export + the multi-group cross section data in a variety of output file formats + for storage and/or post-processing. Parameters ---------- @@ -990,7 +1004,7 @@ class MultiGroupXS(object): xs_type='macro', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. - This routine leverages the Tally.get_pandas_dataframe(...) routine, but + This method leverages the Tally.get_pandas_dataframe(...) method, but renames the columns with terminology appropriate for cross section data. Parameters @@ -1799,7 +1813,7 @@ class Chi(MultiGroupXS): nu_fission_out = nu_fission_out.summation(nuclides=nuclides) # Compute chi and store it as the xs_tally attribute so we can use - # the generic get_xs routine + # the generic get_xs(...) method xs_tally = nu_fission_out / nu_fission_in xs = xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) @@ -1848,7 +1862,7 @@ class Chi(MultiGroupXS): xs_type='macro', summary=None): """Build a Pandas DataFrame for the MultiGroupXS data. - This routine leverages the Tally.get_pandas_dataframe(...) routine, but + This method leverages the Tally.get_pandas_dataframe(...) method, but renames the columns with terminology appropriate for cross section data. Parameters @@ -1883,12 +1897,12 @@ class Chi(MultiGroupXS): """ - # Build the dataframe using the parent class routine + # Build the dataframe using the parent class method df = super(Chi, self).get_pandas_dataframe(groups, nuclides, xs_type, summary) # If user requested micro cross sections, multiply by the atom - # densities to cancel out division made by the parent class routine + # densities to cancel out division made by the parent class method if xs_type == 'micro': if self.by_nuclide: densities = self.get_nuclide_densities(nuclides) diff --git a/openmc/tallies.py b/openmc/tallies.py index 3e0d70409d..dc58c2f6d7 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -843,8 +843,8 @@ class Tally(object): def get_filter_indices(self, filters=[], filter_bins=[]): """Get indices into the filter axis of this tally's data arrays. - This is a helper routine for the Tally.get_values(...) routine to - extract tally data. This routine returns the indices into the filter + This is a helper method for the Tally.get_values(...) method to + extract tally data. This method returns the indices into the filter axis of the tally's data array (axis=0) for particular combinations of filters and their corresponding bins. @@ -937,8 +937,8 @@ class Tally(object): def get_nuclide_indices(self, nuclides): """Get indices into the nuclide axis of this tally's data arrays. - This is a helper routine for the Tally.get_values(...) routine to - extract tally data. This routine returns the indices into the nuclide + This is a helper method for the Tally.get_values(...) method to + extract tally data. This method returns the indices into the nuclide axis of the tally's data array (axis=1) for one or more nuclides. Parameters @@ -971,8 +971,8 @@ class Tally(object): def get_score_indices(self, scores): """Get indices into the score axis of this tally's data arrays. - This is a helper routine for the Tally.get_values(...) routine to - extract tally data. This routine returns the indices into the score + This is a helper method for the Tally.get_values(...) method to + extract tally data. This method returns the indices into the score axis of the tally's data array (axis=2) for one or more scores. Parameters @@ -1227,7 +1227,7 @@ class Tally(object): The tally data in OpenMC is stored as a 3D array with the dimensions corresponding to filters, nuclides and scores. As a result, tally data can be opaque for a user to directly index (i.e., without use of the - Tally.get_values(...) routine) since one must know how to properly use + Tally.get_values(...) method) since one must know how to properly use the number of bins and strides for each filter to index into the first (filter) dimension. @@ -1235,7 +1235,7 @@ class Tally(object): unique dimensions corresponding to each tally filter. For example, suppose this tally has arrays of data with shape (8,5,5) corresponding to two filters (2 and 4 bins, respectively), five nuclides and five - scores. This routine will return a version of the data array with the + scores. This method will return a version of the data array with the with a new shape of (2,4,5,5) such that the first two dimensions correspond directly to the two filters with two and four bins. @@ -1293,7 +1293,7 @@ class Tally(object): # Ensure that StatePoint.read_results() was called first if self._sum is None or self._sum_sq is None and not self.derived: msg = 'The Tally ID="{0}" has no data to export. Call the ' \ - 'StatePoint.read_results() routine before using ' \ + 'StatePoint.read_results() method before using ' \ 'Tally.export_results(...)'.format(self.id) raise KeyError(msg) @@ -1688,8 +1688,8 @@ class Tally(object): def swap_filters(self, filter1, filter2): """Reverse the ordering of two filters in this tally - This is a helper routine for tally arithmetic which helps align the data - in two tallies with shared filters. This routine copies this tally and + This is a helper method for tally arithmetic which helps align the data + in two tallies with shared filters. This method copies this tally and reverses the order of the two filters. Parameters @@ -2471,7 +2471,7 @@ class Tally(object): def diagonalize_filter(self, new_filter): """Diagonalize the tally data array along a new axis of filter bins. - This is a helper method for the tally arithmetic methods. This routine + This is a helper method for the tally arithmetic methods. This method adds the new filter to a derived tally constructed copied from this one. The data in the derived tally arrays is "diagonalized" along the bins in the new filter. This functionality is used by the openmc.mgxs module; to From 40f893e6d0c2ab8d319558aefff36a680464bf25 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 02:57:06 -0400 Subject: [PATCH 261/519] Updated docstrings for MultiGroupXS subclasses in Python API --- .../pythonapi/examples/post-processing.ipynb | 360 +--------- .../pythonapi/examples/tally-arithmetic.ipynb | 659 ++++++++++++++++-- openmc/mgxs/mgxs.py | 232 ++++-- 3 files changed, 813 insertions(+), 438 deletions(-) diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 7c5508e955..51ca6adcf7 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -353,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDE6MDM6MzQtMDQ6MDBoBRKHAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAxOjAzOjM0LTA0OjAwGViqOwAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDI6NTE6MjktMDQ6MDANEGNoAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAyOjUxOjI5LTA0OjAwfE3b1AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "collapsed": true }, @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -465,7 +465,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 01:03:34\n", + " Date/Time: 2015-10-03 02:51:29\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -533,108 +533,8 @@ " 39/1 1.01971 1.03820 +/- 0.00312\n", " 40/1 1.01491 1.03743 +/- 0.00311\n", " 41/1 1.02779 1.03712 +/- 0.00303\n", - " 42/1 1.03047 1.03691 +/- 0.00294\n", - " 43/1 1.02305 1.03649 +/- 0.00288\n", - " 44/1 1.07854 1.03773 +/- 0.00305\n", - " 45/1 1.04412 1.03791 +/- 0.00297\n", - " 46/1 1.05139 1.03828 +/- 0.00291\n", - " 47/1 1.05357 1.03870 +/- 0.00286\n", - " 48/1 1.06435 1.03937 +/- 0.00287\n", - " 49/1 1.02632 1.03904 +/- 0.00281\n", - " 50/1 1.05201 1.03936 +/- 0.00276\n", - " 51/1 1.04582 1.03952 +/- 0.00270\n", - " 52/1 1.02056 1.03907 +/- 0.00267\n", - " 53/1 1.06448 1.03966 +/- 0.00267\n", - " 54/1 1.03609 1.03958 +/- 0.00261\n", - " 55/1 1.02701 1.03930 +/- 0.00257\n", - " 56/1 1.04865 1.03950 +/- 0.00252\n", - " 57/1 1.06310 1.04000 +/- 0.00252\n", - " 58/1 1.02975 1.03979 +/- 0.00247\n", - " 59/1 1.03922 1.03978 +/- 0.00242\n", - " 60/1 1.07259 1.04043 +/- 0.00246\n", - " 61/1 1.04555 1.04053 +/- 0.00242\n", - " 62/1 1.01950 1.04013 +/- 0.00240\n", - " 63/1 1.04618 1.04024 +/- 0.00236\n", - " 64/1 1.02489 1.03996 +/- 0.00233\n", - " 65/1 1.06850 1.04048 +/- 0.00235\n", - " 66/1 1.03623 1.04040 +/- 0.00231\n", - " 67/1 0.99892 1.03967 +/- 0.00238\n", - " 68/1 1.05557 1.03995 +/- 0.00236\n", - " 69/1 1.01211 1.03948 +/- 0.00236\n", - " 70/1 1.04679 1.03960 +/- 0.00233\n", - " 71/1 1.03461 1.03952 +/- 0.00229\n", - " 72/1 1.01993 1.03920 +/- 0.00227\n", - " 73/1 1.04742 1.03933 +/- 0.00224\n", - " 74/1 1.05269 1.03954 +/- 0.00222\n", - " 75/1 1.05696 1.03981 +/- 0.00220\n", - " 76/1 1.05904 1.04010 +/- 0.00218\n", - " 77/1 1.05930 1.04039 +/- 0.00217\n", - " 78/1 1.03375 1.04029 +/- 0.00214\n", - " 79/1 1.07044 1.04073 +/- 0.00215\n", - " 80/1 1.04144 1.04074 +/- 0.00212\n", - " 81/1 1.06296 1.04105 +/- 0.00212\n", - " 82/1 1.04630 1.04112 +/- 0.00209\n", - " 83/1 1.03772 1.04108 +/- 0.00206\n", - " 84/1 1.03774 1.04103 +/- 0.00203\n", - " 85/1 1.03984 1.04101 +/- 0.00200\n", - " 86/1 1.03040 1.04087 +/- 0.00198\n", - " 87/1 1.03484 1.04080 +/- 0.00196\n", - " 88/1 1.03820 1.04076 +/- 0.00193\n", - " 89/1 1.04654 1.04084 +/- 0.00191\n", - " 90/1 1.03377 1.04075 +/- 0.00189\n", - " 91/1 1.03370 1.04066 +/- 0.00187\n", - " 92/1 1.04172 1.04067 +/- 0.00184\n", - " 93/1 1.04945 1.04078 +/- 0.00182\n", - " 94/1 1.03360 1.04069 +/- 0.00181\n", - " 95/1 1.06547 1.04099 +/- 0.00181\n", - " 96/1 1.04340 1.04101 +/- 0.00179\n", - " 97/1 1.07502 1.04140 +/- 0.00181\n", - " 98/1 1.05391 1.04155 +/- 0.00179\n", - " 99/1 1.05622 1.04171 +/- 0.00178\n", - " 100/1 1.01519 1.04142 +/- 0.00179\n", - " Creating state point statepoint.100.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 4.1100E-01 seconds\n", - " Reading cross sections = 1.0300E-01 seconds\n", - " Total time in simulation = 2.6639E+02 seconds\n", - " Time in transport only = 2.6632E+02 seconds\n", - " Time in inactive batches = 1.0721E+01 seconds\n", - " Time in active batches = 2.5566E+02 seconds\n", - " Time synchronizing fission bank = 1.8000E-02 seconds\n", - " Sampling source sites = 1.0000E-02 seconds\n", - " SEND/RECV source sites = 6.0000E-03 seconds\n", - " Time accumulating tallies = 1.9000E-02 seconds\n", - " Total time for finalization = 2.1800E-01 seconds\n", - " Total time elapsed = 2.6703E+02 seconds\n", - " Calculation Rate (inactive) = 4663.74 neutrons/second\n", - " Calculation Rate (active) = 1760.12 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.04100 +/- 0.00169\n", - " k-effective (Track-length) = 1.04142 +/- 0.00179\n", - " k-effective (Absorption) = 1.04380 +/- 0.00147\n", - " Combined k-effective = 1.04287 +/- 0.00130\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" + " 42/1 1.03047 1.03691 +/- 0.00294\n" ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -658,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -678,27 +578,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tmesh\t[10000]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'flux', u'fission']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -713,33 +597,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[ 0.41271426, 0. ]],\n", - "\n", - " [[ 0.40846766, 0. ]],\n", - "\n", - " [[ 0.4112029 , 0. ]],\n", - "\n", - " ..., \n", - " [[ 0.41437289, 0. ]],\n", - "\n", - " [[ 0.41376468, 0. ]],\n", - "\n", - " [[ 0.41312074, 0. ]]])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tally.sum" ] @@ -753,52 +615,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(10000, 1, 2)\n" - ] - }, - { - "data": { - "text/plain": [ - "(array([[[ 0.00458571, 0. ]],\n", - " \n", - " [[ 0.00453853, 0. ]],\n", - " \n", - " [[ 0.00456892, 0. ]],\n", - " \n", - " ..., \n", - " [[ 0.00460414, 0. ]],\n", - " \n", - " [[ 0.00459739, 0. ]],\n", - " \n", - " [[ 0.00459023, 0. ]]]),\n", - " array([[[ 2.02702426e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.77108625e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.79568064e-05, 0.00000000e+00]],\n", - " \n", - " ..., \n", - " [[ 1.83114148e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.69970626e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.92143217e-05, 0.00000000e+00]]]))" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -813,27 +634,11 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tmesh\t[10000]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'flux']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -849,7 +654,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": false }, @@ -863,32 +668,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -905,22 +689,11 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -947,29 +720,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n", - " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n", - " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n", - " ...,\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n", - " dtype=[('wgt', '" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -1071,32 +786,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.5, 0.5)" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 5960ac1115..1196c27e10 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -369,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDE6MTQ6MjctMDQ6MDC2Fcw9AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAxOjE0OjI3LTA0OjAwx0h0gQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDI6NTA6NDctMDQ6MDB0gnqMAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAyOjUwOjQ3LTA0OjAwBd/CMAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -580,7 +580,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 01:14:27\n", + " Date/Time: 2015-10-03 02:50:47\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -636,20 +636,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.7400E-01 seconds\n", - " Reading cross sections = 1.5200E-01 seconds\n", - " Total time in simulation = 2.4330E+01 seconds\n", - " Time in transport only = 2.4308E+01 seconds\n", - " Time in inactive batches = 2.4220E+00 seconds\n", - " Time in active batches = 2.1908E+01 seconds\n", + " Total time for initialization = 1.1480E+00 seconds\n", + " Reading cross sections = 2.9100E-01 seconds\n", + " Total time in simulation = 2.7345E+01 seconds\n", + " Time in transport only = 2.7286E+01 seconds\n", + " Time in inactive batches = 5.8310E+00 seconds\n", + " Time in active batches = 2.1514E+01 seconds\n", " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 2.5018E+01 seconds\n", - " Calculation Rate (inactive) = 5161.02 neutrons/second\n", - " Calculation Rate (active) = 1711.70 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 2.8526E+01 seconds\n", + " Calculation Rate (inactive) = 2143.71 neutrons/second\n", + " Calculation Rate (active) = 1743.05 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -721,20 +721,7 @@ "collapsed": false, "scrolled": true }, - "outputs": [ - { - "ename": "KeyError", - "evalue": "10003", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the summary file and link with statepoint\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msu\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'summary.h5'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlink_with_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msu\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/statepoint.pyc\u001b[0m in \u001b[0;36mlink_with_summary\u001b[1;34m(self, summary)\u001b[0m\n\u001b[0;32m 610\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mtally_id\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtally\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 611\u001b[0m \u001b[1;31m# Get the Tally name from the summary file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 612\u001b[1;33m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtally_id\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 613\u001b[0m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_summary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 614\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mKeyError\u001b[0m: 10003" - ] - } - ], + "outputs": [], "source": [ "# Load the summary file and link with statepoint\n", "su = Summary('summary.h5')\n", @@ -752,11 +739,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nuclidescoremeanstd. dev.
0total(nu-fission / absorption)1.0463530.00935
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "0 total (nu-fission / absorption) 1.046353 0.00935" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute k-infinity using tally arithmetic\n", "fiss_rate = sp.get_tally(name='fiss. rate')\n", @@ -776,11 +799,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)totalabsorption0.958730.00774
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total absorption 0.95873 0.00774" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", @@ -798,11 +859,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nuclidescoremeanstd. dev.
0totalnu-fission1.0916220.011163
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "0 total nu-fission 1.091622 0.011163" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", @@ -821,11 +918,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]cellnuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8020120.006609
\n", + "
" + ], + "text/plain": [ + " energy [MeV] cell nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.802012 0.006609" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", @@ -842,11 +979,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2466040.011825
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.246604 0.011825" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", "eta = therm_fiss_rate / fuel_therm_abs_rate\n", @@ -862,11 +1037,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0463530.01894
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide \\\n", + "0 (0.0e+00 - 6.2e-01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption * nu-fission) * absorption) * (n... 1.046353 0.01894 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "keff = res_esc * fast_fiss * therm_util * eta\n", "keff.get_pandas_dataframe()" @@ -883,7 +1099,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false, "scrolled": true @@ -899,11 +1115,131 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.641746e-076.859257e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099861e-011.966887e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.556665e-013.717881e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.554650e-035.218094e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.165057e-035.625590e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.276535e-018.544314e-04
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.089493e-035.080374e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.370111e-031.361116e-05
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", + "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", + "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", + "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", + "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", + "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", + "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", + "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", + "\n", + " mean std. dev. \n", + "0 6.641746e-07 6.859257e-09 \n", + "1 2.099861e-01 1.966887e-03 \n", + "2 3.556665e-01 3.717881e-03 \n", + "3 5.554650e-03 5.218094e-05 \n", + "4 7.165057e-03 5.625590e-05 \n", + "5 2.276535e-01 8.544314e-04 \n", + "6 8.089493e-03 5.080374e-05 \n", + "7 3.370111e-03 1.361116e-05 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fuel_xs = fuel_rxn_rates / flux\n", "fuel_xs.get_pandas_dataframe()" @@ -918,11 +1254,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 6.64174599e-07]\n", + " [ 3.55666541e-01]]\n", + "\n", + " [[ 7.16505734e-03]\n", + " [ 8.08949336e-03]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore\n", "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", @@ -938,11 +1286,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.00555465]]\n", + "\n", + " [[ 0.00337011]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", @@ -952,11 +1310,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.22765348]\n", + " [ 0.00337011]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", @@ -974,11 +1341,81 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.284890e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8679827.022256e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0828016.087096e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0934845.275039e-04
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.284890e-08\n", + "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.867982 7.022256e-03\n", + "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082801 6.087096e-04\n", + "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.093484 5.275039e-04" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# \"Slice\" the nu-fission data into a new derived Tally\n", "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", @@ -987,11 +1424,131 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010002(1.0e-08 - 1.1e-07)H-1scatter4.6205250.038249
110002(1.1e-07 - 1.2e-06)H-1scatter2.0368410.013203
210002(1.2e-06 - 1.3e-05)H-1scatter1.6599160.010107
310002(1.3e-05 - 1.4e-04)H-1scatter1.8615460.013328
410002(1.4e-04 - 1.5e-03)H-1scatter2.0496640.008215
510002(1.5e-03 - 1.6e-02)H-1scatter2.1621570.010245
610002(1.6e-02 - 1.7e-01)H-1scatter2.2244960.013796
710002(1.7e-01 - 1.9e+00)H-1scatter1.9975850.009161
810002(1.9e+00 - 2.0e+01)H-1scatter0.3734720.003922
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.620525 0.038249\n", + "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.036841 0.013203\n", + "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.659916 0.010107\n", + "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.861546 0.013328\n", + "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.049664 0.008215\n", + "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.162157 0.010245\n", + "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.224496 0.013796\n", + "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 1.997585 0.009161\n", + "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373472 0.003922" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", "need_to_slice = sp.get_tally(name='need-to-slice')\n", diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 171718bc8d..919641f12c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1119,14 +1119,22 @@ class MultiGroupXS(object): class TotalXS(MultiGroupXS): + """A total multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(TotalXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(TotalXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'total' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two tracklength tallies to compute the 'flux' + and 'total' reaction rates in the spatial domain and energy groups + of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'total'] @@ -1143,21 +1151,30 @@ class TotalXS(MultiGroupXS): def compute_xs(self): """Computes the multi-group total cross sections using OpenMC - tally arithmetic.""" + tally arithmetic. + """ self._xs_tally = self.tallies['total'] / self.tallies['flux'] super(TotalXS, self).compute_xs() class TransportXS(MultiGroupXS): + """A transport-corrected total multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(TransportXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(TransportXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'transport' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs three analog tallies to compute the 'flux', + 'total' and 'scatter-P1' reaction rates in the spatial domain and + energy groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'total', 'scatter-P1'] @@ -1171,10 +1188,35 @@ class TransportXS(MultiGroupXS): filters = [[energy_filter], [energy_filter], [energyout_filter]] # Initialize the Tallies - super(TransportXS, self).create_tallies(scores, filters, keys, estimator) + super(TransportXS, self).create_tallies(scores, filters, + keys, estimator) def load_from_statepoint(self, statepoint): + """Extracts tallies in an OpenMC StatePoint with the data needed to + compute multi-group cross sections. + + This method is needed to compute cross section data from tallies + in an OpenMC StatePoint object. + + NOTE: The statepoint must first be linked with an OpenMC Summary object. + + Parameters + ---------- + statepoint : openmc.StatePoint + An OpenMC StatePoint object with tally data + + Raises + ------ + ValueError + When this method is called with a statepoint that has not been + linked with a summary object. + + """ + + # Load the tallies from the statepoint using the parent class method super(TransportXS, self).load_from_statepoint(statepoint) + + # Use tally slicing to remove scatter-P0 data from scatter-P1 tally scatter_p1 = self.tallies['scatter-P1'] self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1']) self.tallies['scatter-P1'].filters[-1].type = 'energy' @@ -1189,14 +1231,22 @@ class TransportXS(MultiGroupXS): class AbsorptionXS(MultiGroupXS): + """An absorption multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(AbsorptionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(AbsorptionXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'absorption' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two tracklength tallies to compute the 'flux' + and 'absorption' reaction rates in the spatial domain and energy + groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'absorption'] @@ -1209,7 +1259,8 @@ class AbsorptionXS(MultiGroupXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(AbsorptionXS, self).create_tallies(scores, filters, keys, estimator) + super(AbsorptionXS, self).create_tallies(scores, filters, + keys, estimator) def compute_xs(self): """Computes the multi-group absorption cross sections using OpenMC @@ -1220,14 +1271,22 @@ class AbsorptionXS(MultiGroupXS): class CaptureXS(MultiGroupXS): + """A capture multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(CaptureXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(CaptureXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'capture' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two tracklength tallies to compute the 'flux' + and 'capture' reaction rates in the spatial domain and energy + groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'absorption', 'fission'] @@ -1252,14 +1311,22 @@ class CaptureXS(MultiGroupXS): class FissionXS(MultiGroupXS): + """A fission multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(FissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(FissionXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'fission' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two tracklength tallies to compute the 'flux' + and 'fission' reaction rates in the spatial domain and energy + groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'fission'] @@ -1283,14 +1350,22 @@ class FissionXS(MultiGroupXS): class NuFissionXS(MultiGroupXS): + """A fission production multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(NuFissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(NuFissionXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'nu-fission' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two tracklength tallies to compute the 'flux' + and 'nu-fission' reaction rates in the spatial domain and energy + groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'nu-fission'] @@ -1303,7 +1378,8 @@ class NuFissionXS(MultiGroupXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(NuFissionXS, self).create_tallies(scores, filters, keys, estimator) + super(NuFissionXS, self).create_tallies(scores, filters, + keys, estimator) def compute_xs(self): """Computes the multi-group nu-fission cross sections using OpenMC @@ -1314,14 +1390,22 @@ class NuFissionXS(MultiGroupXS): class ScatterXS(MultiGroupXS): + """A scatter multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(ScatterXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(ScatterXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'scatter' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two tracklength tallies to compute the 'flux' + and 'scatter' reaction rates in the spatial domain and energy + groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'scatter'] @@ -1345,14 +1429,22 @@ class ScatterXS(MultiGroupXS): class NuScatterXS(MultiGroupXS): + """A nu-scatter multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(NuScatterXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(NuScatterXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'nu-scatter' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two analog tallies to compute the 'flux' + and 'nu-scatter' reaction rates in the spatial domain and energy + groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] @@ -1365,7 +1457,8 @@ class NuScatterXS(MultiGroupXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(NuScatterXS, self).create_tallies(scores, filters, keys, estimator) + super(NuScatterXS, self).create_tallies(scores, filters, + keys, estimator) def compute_xs(self): """Computes the nu-scattering multi-group cross section using OpenMC @@ -1376,14 +1469,22 @@ class NuScatterXS(MultiGroupXS): class ScatterMatrixXS(MultiGroupXS): + """A scattering matrix multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(ScatterMatrixXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'scatter matrix' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs three analog tallies to compute the 'flux', + 'scatter' and 'scatter-P1' reaction rates in the spatial domain and + energy groups of interest. + + """ group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) @@ -1397,7 +1498,8 @@ class ScatterMatrixXS(MultiGroupXS): keys = scores # Initialize the Tallies - super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) + super(ScatterMatrixXS, self).create_tallies(scores, filters, + keys, estimator) def compute_xs(self, correction='P0'): """Computes the multi-group scattering matrix using OpenMC @@ -1425,9 +1527,9 @@ class ScatterMatrixXS(MultiGroupXS): self._xs_tally = rxn_tally / self.tallies['flux'] super(ScatterMatrixXS, self).compute_xs() - def get_xs(self, in_groups='all', out_groups='all', subdomains='all', - nuclides='all', order_groups='increasing', - xs_type='macro', value='mean'): + def get_xs(self, in_groups='all', out_groups='all', + subdomains='all', nuclides='all', xs_type='macro', + order_groups='increasing', value='mean'): """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested scattering @@ -1448,15 +1550,16 @@ class ScatterMatrixXS(MultiGroupXS): return the cross section summed over all nuclides. xs_type: {'macro' or 'micro'} Return the macro or micro cross section in units of cm^-1 or barns - xs_type: {'macro' or 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing (default) + or decreasing energy groups (decreasing or increasing energies) value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted Returns ------- - xs : ndarray + ndarray A NumPy array of the multi-group cross section indexed in the order each group and subdomain is listed in the parameters. @@ -1500,8 +1603,6 @@ class ScatterMatrixXS(MultiGroupXS): filter_bins.append((self.energy_groups.get_group_bounds(group),)) # Construct a collection of the nuclides to retrieve from the xs tally - # NOTE: We must not override the "nuclides" parameter since it is used - # to retrieve atomic number densities for micro xs if self.by_nuclide: if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: query_nuclides = self.get_all_nuclides() @@ -1516,8 +1617,9 @@ class ScatterMatrixXS(MultiGroupXS): xs = xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) else: - xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, - nuclides=query_nuclides, value=value) + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=query_nuclides, value=value) xs = np.nan_to_num(xs) @@ -1533,7 +1635,6 @@ class ScatterMatrixXS(MultiGroupXS): # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - # Reshape tally data array with separate axes for domain and energy if in_groups == 'all': num_in_groups = self.num_groups else: @@ -1542,6 +1643,8 @@ class ScatterMatrixXS(MultiGroupXS): num_out_groups = self.num_groups else: num_out_groups = len(out_groups) + + # Reshape tally data array with separate axes for domain and energy num_subdomains = xs.shape[0] / (num_in_groups * num_out_groups) new_shape = (num_subdomains, num_in_groups, num_out_groups) new_shape += xs.shape[1:] @@ -1648,13 +1751,15 @@ class ScatterMatrixXS(MultiGroupXS): for out_group in range(1, self.num_groups+1): string += template.format('', in_group, out_group) average = \ - self.get_xs([in_group], [out_group], [subdomain], - [nuclide], xs_type=xs_type, value='mean') + self.get_xs([in_group], [out_group], + [subdomain], [nuclide], + xs_type=xs_type, value='mean') rel_err = \ - self.get_xs([in_group], [out_group], [subdomain], - [nuclide], xs_type=xs_type, value='rel_err') * 100 - average = np.nan_to_num(average.flatten())[0] - rel_err = np.nan_to_num(rel_err.flatten())[0] + self.get_xs([in_group], [out_group], + [subdomain], [nuclide], + xs_type=xs_type, value='rel_err') + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err) string += '\n' string += '\n' @@ -1665,14 +1770,22 @@ class ScatterMatrixXS(MultiGroupXS): class NuScatterMatrixXS(ScatterMatrixXS): + """A scattering production matrix multi-group cross section.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(NuScatterMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name) + super(NuScatterMatrixXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) self._rxn_type = 'nu-scatter matrix' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs three analog tallies to compute the 'flux', + 'nu-scatter' and 'scatter-P1' reaction rates in the spatial domain and + energy groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['flux', 'scatter', 'scatter-P1'] @@ -1686,9 +1799,11 @@ class NuScatterMatrixXS(ScatterMatrixXS): filters = [[energy], [energy, energyout], [energyout]] # Intialize the Tallies - super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) + super(ScatterMatrixXS, self).create_tallies(scores, filters, + keys, estimator) class Chi(MultiGroupXS): + """The fission spectrum.""" def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): @@ -1696,7 +1811,13 @@ class Chi(MultiGroupXS): self._rxn_type = 'chi' def create_tallies(self): - """Construct the OpenMC tallies needed to compute this cross section.""" + """Construct the OpenMC tallies needed to compute this cross section. + + This method constructs two analog tallies to compute 'nu-fission' + reaction rates with 'energy' and 'energyout' filters in the spatial + domain and energy groups of interest. + + """ # Create a list of scores for each Tally to be created scores = ['nu-fission', 'nu-fission'] @@ -1732,8 +1853,8 @@ class Chi(MultiGroupXS): super(Chi, self).compute_xs() def get_xs(self, groups='all', subdomains='all', nuclides='all', - order_groups='increasing', xs_type='macro', value='mean'): - """Returns an array of multi-group cross sections. + xs_type='macro', order_groups='increasing', value='mean'): + """Returns an array of the fission spectrum. This method constructs a 2D NumPy array for the requested multi-group cross section data data for one or more energy groups and subdomains. @@ -1749,18 +1870,19 @@ class Chi(MultiGroupXS): special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns xs_type: {'macro' or 'micro'} This parameter is not relevant for chi but is included here to mirror the parent MultiGroupXS.get_xs(...) class method + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing (default) + or decreasing energy groups (decreasing or increasing energies) value : str A string for the type of value to return - 'mean' (default), 'std_dev' or 'rel_err' are accepted Returns ------- - xs : ndarray + ndarray A NumPy array of the multi-group cross section indexed in the order each group, subdomain and nuclide is listed in the parameters. @@ -1812,8 +1934,8 @@ class Chi(MultiGroupXS): nu_fission_in = nu_fission_in.summation(nuclides=nuclides) nu_fission_out = nu_fission_out.summation(nuclides=nuclides) - # Compute chi and store it as the xs_tally attribute so we can use - # the generic get_xs(...) method + # Compute chi and store it as the xs_tally attribute so we can + # use the generic get_xs(...) method xs_tally = nu_fission_out / nu_fission_in xs = xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) @@ -1821,13 +1943,15 @@ class Chi(MultiGroupXS): # Get chi for all nuclides in the domain elif nuclides == 'all': nuclides = self.get_all_nuclides() - xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, nuclides=nuclides, value=value) # Get chi for user-specified nuclides in the domain else: cv.check_iterable_type('nuclides', nuclides, basestring) - xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, nuclides=nuclides, value=value) # If chi was computed as an average of nuclides in the domain From e3436d625bb1063b59225f955a1c6afc22fd2981 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 3 Oct 2015 17:58:50 +0700 Subject: [PATCH 262/519] Respond to more @smharper comments on #463 Move abstract interface block in surface_header. Make error messages more informative. Add description in openmc-update-inputs epilog. --- scripts/openmc-update-inputs | 5 +-- src/input_xml.F90 | 11 +++--- src/string.F90 | 15 ++++++++ src/surface_header.F90 | 68 +++++++++++++++++++++--------------- 4 files changed, 64 insertions(+), 35 deletions(-) diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index 1ff70d0505..2a8097854d 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -36,9 +36,10 @@ they will be moved to a new file with '.original' appended to their name. Formatting changes that will be made: -geometry.xml: Lattices containing 'outside' attributes/tags will be replaced +geometry.xml: Lattices containing 'outside' attributes/tags will be replaced with lattices containing 'outer' attributes, and the appropriate - cells/universes will be added. + cells/universes will be added. Any 'surfaces' attributes/elements on a cell + will be renamed 'region'. """ diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 8a77eaf354..7c6ac4cb72 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1135,7 +1135,7 @@ contains call tokenize(region_spec, tokens) ! Use shunting-yard algorithm to determine RPN for surface algorithm - call generate_rpn(tokens, rpn) + call generate_rpn(c%id, tokens, rpn) ! Copy region spec and RPN form to cell arrays allocate(c % region(tokens%size())) @@ -4801,7 +4801,8 @@ contains ! the infix notation. !=============================================================================== - subroutine generate_rpn(tokens, output) + subroutine generate_rpn(cell_id, tokens, output) + integer, intent(in) :: cell_id type(VectorInt), intent(in) :: tokens ! infix notation type(VectorInt), intent(inout) :: output ! RPN notation @@ -4851,7 +4852,8 @@ contains ! If we run out of operators without finding a left parenthesis, it ! means there are mismatched parentheses. if (stack%size() == 0) then - call fatal_error('Mimatched parentheses in region specification') + call fatal_error('Mimatched parentheses in region specification & + &for cell ' // trim(to_str(cell_id)) // '.') end if op = stack%data(stack%size()) @@ -4871,7 +4873,8 @@ contains ! If the operator is a parenthesis, it is mismatched if (op >= OP_RIGHT_PAREN) then - call fatal_error('Mimatched parentheses in region specification') + call fatal_error('Mimatched parentheses in region specification & + &for cell ' // trim(to_str(cell_id)) // '.') end if call output%push_back(op) diff --git a/src/string.F90 b/src/string.F90 index 91a255a361..45db59c875 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -76,6 +76,7 @@ contains integer :: i ! current index integer :: i_start ! starting index of word + integer :: token character(len=len_trim(string)) :: string_ ! Remove leading blanks @@ -97,8 +98,22 @@ contains case ('(') call tokens%push_back(OP_LEFT_PAREN) case (')') + if (tokens%size() > 0) then + token = tokens%data(tokens%size()) + if (token >= OP_UNION .and. token < OP_RIGHT_PAREN) then + call fatal_error("Right parentheses cannot follow an operator in & + ®ion specification: " // trim(string)) + end if + end if call tokens%push_back(OP_RIGHT_PAREN) case ('|') + if (tokens%size() > 0) then + token = tokens%data(tokens%size()) + if (.not. (token < OP_UNION .or. token == OP_RIGHT_PAREN)) then + call fatal_error("Union cannot follow an operator in region & + &specification: " // trim(string)) + end if + end if call tokens%push_back(OP_UNION) case ('~') call tokens%push_back(OP_COMPLEMENT) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 18ad030a2e..6fc1bbc237 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -24,10 +24,45 @@ module surface_header procedure(iNormal), deferred :: normal end type Surface + abstract interface + pure function iEvaluate(this, xyz) result(f) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + end function iEvaluate + + pure function iDistance(this, xyz, uvw, coincident) result(d) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + end function iDistance + + pure function iNormal(this, xyz) result(uvw) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + end function iNormal + end interface + +!=============================================================================== +! SURFACECONTAINER allows us to store an array of different types of surfaces +!=============================================================================== + type :: SurfaceContainer class(Surface), allocatable :: obj end type SurfaceContainer +!=============================================================================== +! All the derived types below are extensions of the abstract Surface type. They +! inherent the reflect() and sense() type-bound procedures and must implement +! evaluate(), distance(), and normal() +!=============================================================================== + type, extends(Surface) :: SurfaceXPlane ! x = x0 real(8) :: x0 @@ -148,31 +183,6 @@ module surface_header procedure :: normal => z_cone_normal end type SurfaceZCone - abstract interface - pure function iEvaluate(this, xyz) result(f) - import Surface - class(Surface), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: f - end function iEvaluate - - pure function iDistance(this, xyz, uvw, coincident) result(d) - import Surface - class(Surface), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8), intent(in) :: uvw(3) - logical, intent(in) :: coincident - real(8) :: d - end function iDistance - - pure function iNormal(this, xyz) result(uvw) - import Surface - class(Surface), intent(in) :: this - real(8), intent(in) :: xyz(3) - real(8) :: uvw(3) - end function iNormal - end interface - contains !=============================================================================== @@ -369,14 +379,14 @@ contains real(8) :: d real(8) :: f - real(8) :: tmp + real(8) :: projection f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D - tmp = this%A*uvw(1) + this%B*uvw(2) + this%C*uvw(3) - if (coincident .or. abs(f) < FP_COINCIDENT .or. tmp == ZERO) then + projection = this%A*uvw(1) + this%B*uvw(2) + this%C*uvw(3) + if (coincident .or. abs(f) < FP_COINCIDENT .or. projection == ZERO) then d = INFINITY else - d = -f/tmp + d = -f/projection if (d < ZERO) d = INFINITY end if end function plane_distance From 6b92694578bcf81687e6964a6315fd973588c438 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 3 Oct 2015 10:01:43 -0400 Subject: [PATCH 263/519] Return isotropic scores to total_yn, flux_yn tests --- tests/test_score_flux_yn/inputs_true.dat | 2 +- tests/test_score_flux_yn/results_true.dat | 879 +++++++++--------- .../test_score_flux_yn/test_score_flux_yn.py | 11 +- tests/test_score_total_yn/inputs_true.dat | 2 +- tests/test_score_total_yn/results_true.dat | 13 +- .../test_score_total_yn.py | 15 +- 6 files changed, 473 insertions(+), 449 deletions(-) diff --git a/tests/test_score_flux_yn/inputs_true.dat b/tests/test_score_flux_yn/inputs_true.dat index ebb757bbdd..9b9313a6ab 100644 --- a/tests/test_score_flux_yn/inputs_true.dat +++ b/tests/test_score_flux_yn/inputs_true.dat @@ -1 +1 @@ -56b5f317d465ab32d9bc2cf85f1a22b7df773edcc642981707febd2e988e4174a3f0234744f192182edb51af23b541325496c2ca4530303afc0d2baefc0ce60e \ No newline at end of file +977c9d76d335d79fa561f9eab8a575a118f900818759b96b6fbdbf8d06a012a44d5892bbb22292f9b730745d86859ffcba6b16b59096eff587fca2a5d6629cf5 \ No newline at end of file diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index c657cb7bba..fecff843d9 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -3,6 +3,19 @@ k-combined: tally 1: 3.890713E+01 3.046363E+02 +1.366220E+01 +3.758161E+01 +6.561669E+01 +8.680729E+02 +2.382728E+01 +1.170590E+02 +8.047875E+00 +1.334796E+01 +4.056568E+01 +3.389623E+02 +tally 2: +3.890713E+01 +3.046363E+02 1.623579E-01 4.602199E-02 4.860074E-01 @@ -433,439 +446,6 @@ tally 1: 1.429184E-01 5.891300E-01 1.085467E-01 -tally 2: -3.862543E+01 -2.993190E+02 -5.083613E-01 -2.933365E-01 --4.356793E-01 -6.676831E-01 -6.093148E-01 -5.685331E-01 -2.512276E-01 -1.308652E-01 -1.075955E+00 -4.775270E-01 -3.660307E-01 -1.627691E-01 --5.402149E-01 -2.324946E-01 --3.887573E-01 -1.028105E-01 --4.324152E-01 -1.015147E-01 -3.306993E-02 -8.425069E-02 --2.127456E-01 -5.435453E-02 -2.977294E-01 -1.088039E-01 -1.055079E+00 -3.590635E-01 --6.740592E-01 -2.606281E-01 --3.329512E-01 -1.587428E-01 --1.248691E-01 -1.659045E-01 --2.306000E-01 -1.062057E-01 -9.127791E-02 -2.649459E-01 --2.629881E-01 -4.786229E-02 -2.286813E-01 -2.363629E-02 --6.338613E-01 -1.118828E-01 -7.466647E-01 -1.424535E-01 --7.955161E-02 -1.003327E-02 -1.082691E-01 -2.727882E-02 -5.295185E-01 -1.335133E-01 --6.321517E-01 -1.422916E-01 --1.236137E-01 -2.041422E-01 --5.389265E-02 -1.852888E-01 --3.746082E-01 -5.580885E-02 -1.383528E-01 -2.754456E-01 --5.081204E-01 -1.886515E-01 --4.022264E-01 -1.417397E-01 -3.377771E-01 -6.673888E-02 -1.170109E-01 -1.783182E-02 -2.097916E-01 -7.139323E-02 -1.438678E+01 -4.193571E+01 -6.547124E-01 -1.780450E-01 -2.207489E-01 -2.115835E-01 --4.952323E-02 -3.039341E-01 -6.681546E-01 -1.389250E-01 -4.078026E-02 -4.393667E-02 --8.695509E-01 -2.850853E-01 -1.792062E-01 -7.367253E-02 --5.657500E-01 -2.115125E-01 -8.525189E-02 -2.541971E-02 -5.227867E-02 -2.008468E-02 --6.825349E-02 -5.316522E-02 -3.763076E-01 -7.112554E-02 -1.279973E-02 -1.883096E-01 -7.775189E-02 -6.874374E-02 --1.119537E-01 -8.467755E-02 --1.600632E-01 -8.650448E-02 --6.210095E-01 -1.094309E-01 --9.997484E-02 -3.935353E-02 -2.300525E-01 -2.351925E-02 -2.486103E-02 -3.125565E-02 --1.289518E-02 -2.879251E-02 --3.166559E-01 -2.931428E-02 -1.379285E-02 -2.416257E-02 -1.220552E-02 -5.154030E-02 -1.431676E-01 -3.434080E-02 -8.148581E-02 -4.218412E-02 --8.541678E-03 -6.396306E-02 --7.851012E-03 -5.799658E-02 --2.435723E-01 -6.744263E-02 --2.429877E-01 -6.966516E-02 -1.638644E-01 -2.058798E-02 --8.986584E-03 -1.374824E-02 --3.547454E-01 -7.765460E-02 --1.570173E-01 -6.916960E-02 -1.056941E-02 -7.626528E-03 -6.400634E+01 -8.298077E+02 -3.894111E-01 -8.617494E-01 -1.796567E-01 -1.065356E+00 -1.561037E+00 -7.701475E-01 --2.237530E-01 -2.259442E-01 --1.109999E+00 -6.179412E-01 -1.636912E+00 -7.887441E-01 --4.661183E-01 -4.191138E-01 --1.040546E+00 -2.971961E-01 --1.044850E-01 -1.493530E-01 --4.991935E-01 -3.222404E-01 -4.205099E-01 -2.734911E-01 --7.583139E-01 -3.000853E-01 -3.750811E-01 -1.348273E-01 --6.355508E-01 -3.666139E-01 --5.233787E-01 -1.292414E-01 --2.869538E-02 -9.115092E-02 --6.851052E-01 -3.061040E-01 -1.703522E-01 -7.300335E-02 --4.541075E-01 -4.438507E-01 --2.674857E-01 -4.718588E-01 --3.022517E-02 -1.136781E-01 -5.755596E-01 -2.688162E-01 --2.698373E-01 -1.403188E-01 -8.772347E-01 -3.503562E-01 -4.258508E-01 -1.400825E-01 --1.384853E-01 -4.924947E-02 -1.009402E-01 -2.039230E-01 --1.339732E-01 -4.772083E-02 -3.249636E-01 -4.339747E-01 -1.564400E-01 -2.703717E-01 --2.536360E-01 -8.543919E-02 --3.622063E-01 -7.442240E-02 -2.074953E-02 -1.355614E-01 --3.909820E-02 -1.007999E-01 --3.162815E-01 -9.656425E-02 -2.426423E+01 -1.215124E+02 -9.628829E-01 -3.563586E-01 -2.964625E-01 -9.739638E-02 -3.680881E-01 -3.484018E-01 -4.339143E-01 -7.590564E-02 --4.633394E-02 -1.080030E-01 -3.091634E-01 -1.246585E-01 --4.520500E-02 -1.095704E-01 -2.479383E-01 -1.138276E-01 --6.457108E-02 -6.833667E-02 --5.623363E-02 -1.087254E-01 --3.675294E-01 -9.602246E-02 --1.459951E-01 -9.440544E-02 -6.817672E-02 -4.978066E-02 -1.076782E-02 -1.697440E-01 -1.024501E-02 -1.184830E-01 --1.654178E-01 -1.689209E-02 -1.006214E-01 -3.392546E-02 -5.070063E-01 -7.598100E-02 --2.251704E-01 -7.867348E-02 --1.693789E-01 -2.069974E-01 -2.790249E-01 -2.674643E-02 -3.888604E-01 -3.649330E-02 --7.614452E-02 -7.098023E-02 -1.236282E-02 -5.476895E-02 -3.151637E-01 -3.543466E-02 --6.363562E-01 -9.323507E-02 --2.808153E-01 -8.537981E-02 -2.197639E-01 -3.393653E-02 --8.660625E-02 -1.575544E-02 -3.733826E-02 -1.449783E-02 --8.800903E-04 -3.993931E-02 -3.304886E-01 -3.099095E-02 -4.149186E-02 -5.375091E-02 -2.448819E-01 -9.225028E-02 -1.230091E-01 -3.865008E-02 -7.600812E+00 -1.199814E+01 -8.738539E-01 -3.078183E-01 --2.592305E-01 -1.015952E-01 -6.391696E-02 -6.657129E-02 --2.857855E-01 -2.216294E-02 -3.516811E-01 -3.429194E-02 -4.585144E-02 -6.204056E-02 -1.599494E-01 -1.684846E-02 --2.364219E-01 -1.550644E-02 --1.197289E-01 -8.631394E-02 --1.364517E-01 -5.086560E-02 -2.213374E-01 -2.779096E-02 --7.328761E-02 -1.216230E-02 --2.476803E-01 -2.724500E-02 --6.356296E-02 -2.513244E-02 -3.886281E-01 -9.479377E-02 -1.006972E-01 -1.352120E-02 --6.932242E-02 -3.192705E-02 --3.232505E-02 -5.592418E-02 --9.582599E-02 -1.504811E-02 --2.887999E-01 -3.760482E-02 -2.372013E-01 -1.868786E-02 --1.655526E-01 -4.720116E-02 --8.611265E-02 -2.284310E-02 --2.142116E-01 -2.619080E-02 -1.811202E-01 -1.457105E-02 -1.430164E-01 -2.016598E-02 -4.066031E-01 -7.671356E-02 -1.364946E-01 -1.385677E-02 --8.357667E-02 -1.521943E-02 --2.235270E-02 -1.029570E-02 -7.920760E-02 -4.227880E-02 -2.622096E-01 -2.327728E-02 -7.787296E-03 -2.288300E-02 --1.645219E-02 -5.394704E-02 --7.274557E-02 -1.075570E-02 -4.104875E+01 -3.455300E+02 -9.827893E-01 -2.751051E-01 -3.227606E-01 -1.213711E-01 -1.272840E-02 -2.813639E-01 --1.910394E-01 -5.682320E-02 --4.136260E-01 -2.444497E-01 --5.123352E-02 -3.867174E-01 --4.424857E-02 -9.651204E-02 --3.975443E-02 -1.867060E-01 --7.618837E-01 -1.756891E-01 -4.259599E-01 -1.146646E-01 --5.658031E-02 -1.366891E-01 -2.464931E-01 -2.181122E-01 -1.593998E-01 -2.666678E-01 --1.928096E-01 -1.216164E-01 -7.020992E-01 -1.701086E-01 -3.914244E-01 -1.772217E-01 --3.285697E-01 -1.521826E-01 --2.947923E-02 -8.201284E-02 -1.346653E-01 -4.498340E-02 -2.112724E-01 -9.923303E-02 -8.551910E-02 -8.804286E-03 --3.631005E-01 -1.168145E-01 -1.840770E-01 -5.714283E-02 --2.709303E-02 -9.381338E-02 -2.104005E-02 -4.479215E-02 -4.059493E-01 -8.277066E-02 --2.877400E-01 -8.584721E-02 -4.881128E-02 -1.864179E-01 --8.584545E-02 -4.421744E-02 --4.392466E-01 -6.260373E-02 -3.143214E-02 -8.184856E-02 --5.630973E-01 -1.323469E-01 -8.010498E-02 -1.096975E-01 -1.818829E-01 -1.717701E-02 -1.062149E-01 -5.400365E-02 tally 3: 3.862543E+01 2.993190E+02 @@ -1299,3 +879,436 @@ tally 3: 1.717701E-02 1.062149E-01 5.400365E-02 +tally 4: +3.862543E+01 +2.993190E+02 +5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +-5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +-4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +-2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +-3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +-2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +-2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +-6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +-7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +-1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +-3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +-5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +-4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +-6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +-1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +-6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +-1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +-8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +-2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +-3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +-1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +-4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +-1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +-5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +-6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +-4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +-3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +-2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +-2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +-3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +-4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +-4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +-6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +-3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +-2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +-7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +-2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +-8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +-8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +-1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +-2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +-6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +-9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +-8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +-8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +-7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +-4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +-4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +-7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +-5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +-3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +-2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +-8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +1.062149E-01 +5.400365E-02 diff --git a/tests/test_score_flux_yn/test_score_flux_yn.py b/tests/test_score_flux_yn/test_score_flux_yn.py index 08279dea79..2095fc9b15 100755 --- a/tests/test_score_flux_yn/test_score_flux_yn.py +++ b/tests/test_score_flux_yn/test_score_flux_yn.py @@ -11,12 +11,13 @@ import openmc class ScoreFluxYnTestHarness(PyAPITestHarness): def _build_inputs(self): filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27, 28, 29)) - tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + tallies = [openmc.Tally(tally_id=i) for i in range(1, 5)] [t.add_filter(filt) for t in tallies] - [t.add_score('flux-y5') for t in tallies] - tallies[0].estimator = 'tracklength' - tallies[1].estimator = 'analog' - tallies[2].estimator = 'collision' + tallies[0].add_score('flux') + [t.add_score('flux-y5') for t in tallies[1:]] + tallies[1].estimator = 'tracklength' + tallies[2].estimator = 'analog' + tallies[3].estimator = 'collision' self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] diff --git a/tests/test_score_total_yn/inputs_true.dat b/tests/test_score_total_yn/inputs_true.dat index 133138775d..72173a0319 100644 --- a/tests/test_score_total_yn/inputs_true.dat +++ b/tests/test_score_total_yn/inputs_true.dat @@ -1 +1 @@ -1bbb4a3aa9e60b4117ae6cdac13ad20e037846be37100516cbca70ad48947837f157ba441d839b773a260026284fb0f45c80b49db4c1522e64e46d905c77899a \ No newline at end of file +def382a2f9efec93baf521911ab89e0d73ceadba486f9bb306e9cf82ffc1c67b72498c153519e05b516ff54db431430b2b25b80675961697e19774455711a5f8 \ No newline at end of file diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index 3565711be5..a64aa49cc3 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -3,6 +3,15 @@ k-combined: tally 1: 0.000000E+00 0.000000E+00 +1.767552E+01 +6.295417E+01 +3.863588E+00 +3.013300E+00 +5.356594E+01 +5.839391E+02 +tally 2: +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -401,7 +410,7 @@ tally 1: 1.806992E-01 -1.898620E-01 1.113751E-01 -tally 2: +tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 @@ -802,7 +811,7 @@ tally 2: 7.231318E-02 3.689494E-01 1.349712E-01 -tally 3: +tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_score_total_yn/test_score_total_yn.py b/tests/test_score_total_yn/test_score_total_yn.py index 456e1f93b2..a1ca6715cb 100644 --- a/tests/test_score_total_yn/test_score_total_yn.py +++ b/tests/test_score_total_yn/test_score_total_yn.py @@ -11,14 +11,15 @@ import openmc class ScoreTotalYNTestHarness(PyAPITestHarness): def _build_inputs(self): filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) - tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + tallies = [openmc.Tally(tally_id=i) for i in range(1, 5)] [t.add_filter(filt) for t in tallies] - [t.add_score('total-y4') for t in tallies] - [t.add_nuclide('U-235') for t in tallies] - [t.add_nuclide('total') for t in tallies] - tallies[0].estimator = 'tracklength' - tallies[1].estimator = 'analog' - tallies[2].estimator = 'collision' + tallies[0].add_score('total') + [t.add_score('total-y4') for t in tallies[1:]] + [t.add_nuclide('U-235') for t in tallies[1:]] + [t.add_nuclide('total') for t in tallies[1:]] + tallies[1].estimator = 'tracklength' + tallies[2].estimator = 'analog' + tallies[3].estimator = 'collision' self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] From 3401c5d65f86ebc7df1b145190368cc76e72ddae Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 3 Oct 2015 10:34:56 -0400 Subject: [PATCH 264/519] Updated calc_rn to use same normalization scheme as scipys associatd legendres --- src/math.F90 | 238 +++++++++++++++++++++++++-------------------------- 1 file changed, 119 insertions(+), 119 deletions(-) diff --git a/src/math.F90 b/src/math.F90 index cd6f5567f4..51fcf36393 100644 --- a/src/math.F90 +++ b/src/math.F90 @@ -191,364 +191,364 @@ contains rn(1) = ONE case (1) ! l = 1, m = -1 - rn(1) = ONE*sqrt(w2m1) * sin(phi) + rn(1) = -(ONE*sqrt(w2m1) * sin(phi)) ! l = 1, m = 0 rn(2) = ONE * w ! l = 1, m = 1 - rn(3) = ONE*sqrt(w2m1) * cos(phi) + rn(3) = -(ONE*sqrt(w2m1) * cos(phi)) case (2) ! l = 2, m = -2 rn(1) = 0.288675134594813_8 * (-THREE * w**2 + THREE) * sin(TWO*phi) ! l = 2, m = -1 - rn(2) = 1.73205080756888_8 * w*sqrt(w2m1) * sin(phi) + rn(2) = -(1.73205080756888_8 * w*sqrt(w2m1) * sin(phi)) ! l = 2, m = 0 rn(3) = 1.5_8 * w**2 - HALF ! l = 2, m = 1 - rn(4) = 1.73205080756888_8 * w*sqrt(w2m1) * cos(phi) + rn(4) = -(1.73205080756888_8 * w*sqrt(w2m1) * cos(phi)) ! l = 2, m = 2 rn(5) = 0.288675134594813_8 * (-THREE * w**2 + THREE) * cos(TWO*phi) case (3) ! l = 3, m = -3 - rn(1) = 0.790569415042095_8 * (w2m1)**(THREE/TWO) * sin(THREE * phi) + rn(1) = -(0.790569415042095_8 * (w2m1)**(THREE/TWO) * sin(THREE * phi)) ! l = 3, m = -2 rn(2) = 1.93649167310371_8 * w*(w2m1) * sin(TWO*phi) ! l = 3, m = -1 - rn(3) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & - sin(phi) + rn(3) = -(0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & + sin(phi)) ! l = 3, m = 0 rn(4) = 2.5_8 * w**3 - 1.5_8 * w ! l = 3, m = 1 - rn(5) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & - cos(phi) + rn(5) = -(0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & + cos(phi)) ! l = 3, m = 2 rn(6) = 1.93649167310371_8 * w*(w2m1) * cos(TWO*phi) ! l = 3, m = 3 - rn(7) = 0.790569415042095_8 * (w2m1)**(THREE/TWO) * cos(THREE* phi) + rn(7) = -(0.790569415042095_8 * (w2m1)**(THREE/TWO) * cos(THREE* phi)) case (4) ! l = 4, m = -4 rn(1) = 0.739509972887452_8 * (w2m1)**2 * sin(4.0_8*phi) ! l = 4, m = -3 - rn(2) = 2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * sin(THREE* phi) + rn(2) = -(2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * sin(THREE* phi)) ! l = 4, m = -2 rn(3) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * & sin(TWO*phi) ! l = 4, m = -1 - rn(4) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& - * sin(phi) + rn(4) = -(0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& + * sin(phi)) ! l = 4, m = 0 rn(5) = 4.375_8 * w**4 - 3.75_8 * w**2 + 0.375_8 ! l = 4, m = 1 - rn(6) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& - * cos(phi) + rn(6) = -(0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& + * cos(phi)) ! l = 4, m = 2 rn(7) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * & cos(TWO*phi) ! l = 4, m = 3 - rn(8) = 2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * cos(THREE* phi) + rn(8) = -(2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * cos(THREE* phi)) ! l = 4, m = 4 rn(9) = 0.739509972887452_8 * (w2m1)**2 * cos(4.0_8*phi) case (5) ! l = 5, m = -5 - rn(1) = 0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * sin(5.0_8*phi) + rn(1) = -(0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * sin(5.0_8*phi)) ! l = 5, m = -4 rn(2) = 2.21852991866236_8 * w*(w2m1)**2 * sin(4.0_8*phi) ! l = 5, m = -3 - rn(3) = 0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & - ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(THREE*phi) + rn(3) = -(0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & + ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(THREE*phi)) ! l = 5, m = -2 rn(4) = 0.0487950036474267_8 * (w2m1) & * ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * sin(TWO*phi) ! l = 5, m = -1 - rn(5) = 0.258198889747161_8*sqrt(w2m1)* & + rn(5) = -(0.258198889747161_8*sqrt(w2m1)* & ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) & - * sin(phi) + * sin(phi)) ! l = 5, m = 0 rn(6) = 7.875_8 * w**5 - 8.75_8 * w**3 + 1.875_8 * w ! l = 5, m = 1 - rn(7) = 0.258198889747161_8*sqrt(w2m1)* & + rn(7) = -(0.258198889747161_8*sqrt(w2m1)* & ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) & - * cos(phi) + * cos(phi)) ! l = 5, m = 2 rn(8) = 0.0487950036474267_8 * (w2m1)* & ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * cos(TWO*phi) ! l = 5, m = 3 - rn(9) = 0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & - ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(THREE*phi) + rn(9) = -(0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & + ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(THREE*phi)) ! l = 5, m = 4 rn(10) = 2.21852991866236_8 * w*(w2m1)**2 * cos(4.0_8*phi) ! l = 5, m = 5 - rn(11) = 0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * cos(5.0_8* phi) + rn(11) = -(0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * cos(5.0_8* phi)) case (6) ! l = 6, m = -6 rn(1) = 0.671693289381396_8 * (w2m1)**3 * sin(6.0_8*phi) ! l = 6, m = -5 - rn(2) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * sin(5.0_8*phi) + rn(2) = -(2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * sin(5.0_8*phi)) ! l = 6, m = -4 rn(3) = 0.00104990131391452_8 * (w2m1)**2 * & ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * sin(4.0_8*phi) ! l = 6, m = -3 - rn(4) = 0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & - ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(THREE*phi) + rn(4) = -(0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & + ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(THREE*phi)) ! l = 6, m = -2 rn(5) = 0.0345032779671177_8 * (w2m1) * & ((3465.0_8/8.0_8)*w**4 - 945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) & * sin(TWO*phi) ! l = 6, m = -1 - rn(6) = 0.218217890235992_8*sqrt(w2m1) * & + rn(6) = -(0.218217890235992_8*sqrt(w2m1) * & ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) & - * sin(phi) + * sin(phi)) ! l = 6, m = 0 rn(7) = 14.4375_8 * w**6 - 19.6875_8 * w**4 + 6.5625_8 * w**2 - 0.3125_8 ! l = 6, m = 1 - rn(8) = 0.218217890235992_8*sqrt(w2m1) * & + rn(8) = -(0.218217890235992_8*sqrt(w2m1) * & ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) & - * cos(phi) + * cos(phi)) ! l = 6, m = 2 rn(9) = 0.0345032779671177_8 * (w2m1) * & ((3465.0_8/8.0_8)*w**4 -945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) & * cos(TWO*phi) ! l = 6, m = 3 - rn(10) = 0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & - ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(THREE*phi) + rn(10) = -(0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & + ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(THREE*phi)) ! l = 6, m = 4 rn(11) = 0.00104990131391452_8 * (w2m1)**2 * & ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * cos(4.0_8*phi) ! l = 6, m = 5 - rn(12) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * cos(5.0_8*phi) + rn(12) = -(2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * cos(5.0_8*phi)) ! l = 6, m = 6 rn(13) = 0.671693289381396_8 * (w2m1)**3 * cos(6.0_8*phi) case (7) ! l = 7, m = -7 - rn(1) = 0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * sin(7.0_8*phi) + rn(1) = -(0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * sin(7.0_8*phi)) ! l = 7, m = -6 rn(2) = 2.42182459624969_8 * w*(w2m1)**3 * sin(6.0_8*phi) ! l = 7, m = -5 - rn(3) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & - ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi) + rn(3) = -(9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & + ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi)) ! l = 7, m = -4 rn(4) = 0.000548293079133141_8 * (w2m1)**2* & ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * sin(4.0_8*phi) ! l = 7, m = -3 - rn(5) = 0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & - ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & - sin(THREE*phi) + rn(5) = -(0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & + ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & + sin(THREE*phi)) ! l = 7, m = -2 rn(6) = 0.025717224993682_8 * (w2m1)* & ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & sin(TWO*phi) ! l = 7, m = -1 - rn(7) = 0.188982236504614_8*sqrt(w2m1)* & - ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & - (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi) + rn(7) = -(0.188982236504614_8*sqrt(w2m1)* & + ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & + (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi)) ! l = 7, m = 0 rn(8) = 26.8125_8 * w**7 - 43.3125_8 * w**5 + 19.6875_8 * w**3 -2.1875_8 & * w ! l = 7, m = 1 - rn(9) = 0.188982236504614_8*sqrt(w2m1)* & - ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & - (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi) + rn(9) = -(0.188982236504614_8*sqrt(w2m1)* & + ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & + (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi)) ! l = 7, m = 2 rn(10) = 0.025717224993682_8 * (w2m1)* & ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & cos(TWO*phi) ! l = 7, m = 3 - rn(11) = 0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & - ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & - cos(THREE*phi) + rn(11) = -(0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & + ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & + cos(THREE*phi)) ! l = 7, m = 4 rn(12) = 0.000548293079133141_8 * (w2m1)**2 * & ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * cos(4.0_8*phi) ! l = 7, m = 5 - rn(13) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & - ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi) + rn(13) = -(9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & + ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi)) ! l = 7, m = 6 rn(14) = 2.42182459624969_8 * w*(w2m1)**3 * cos(6.0_8*phi) ! l = 7, m = 7 - rn(15) = 0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * cos(7.0_8*phi) + rn(15) = -(0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * cos(7.0_8*phi)) case (8) ! l = 8, m = -8 rn(1) = 0.626706654240044_8 * (w2m1)**4 * sin(8.0_8*phi) ! l = 8, m = -7 - rn(2) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * sin(7.0_8*phi) + rn(2) = -(2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * sin(7.0_8*phi)) ! l = 8, m = -6 rn(3) = 6.77369783729086d-6*(w2m1)**3* & ((2027025.0_8/TWO)*w**2 - 135135.0_8/TWO) * sin(6.0_8*phi) ! l = 8, m = -5 - rn(4) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)* & - ((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi) + rn(4) = -(4.38985792528482d-5*(w2m1)**(5.0_8/TWO)* & + ((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi)) ! l = 8, m = -4 rn(5) = 0.000316557156832328_8 * (w2m1)**2* & ((675675.0_8/8.0_8)*w**4 - 135135.0_8/4.0_8 * w**2 & + 10395.0_8/8.0_8) * sin(4.0_8*phi) ! l = 8, m = -3 - rn(6) = 0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & - ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 & - + (10395.0_8/8.0_8)*w) * sin(THREE*phi) + rn(6) = -(0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & + ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 & + + (10395.0_8/8.0_8)*w) * sin(THREE*phi)) ! l = 8, m = -2 rn(7) = 0.0199204768222399_8 * (w2m1)* & ((45045.0_8/16.0_8)*w**6- 45045.0_8/16.0_8 * w**4 + & (10395.0_8/16.0_8)*w**2 - 315.0_8/16.0_8) * sin(TWO*phi) ! l = 8, m = -1 - rn(8) = 0.166666666666667_8*sqrt(w2m1)* & - ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & - (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi) + rn(8) = -(0.166666666666667_8*sqrt(w2m1)* & + ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & + (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi)) ! l = 8, m = 0 rn(9) = 50.2734375_8 * w**8 - 93.84375_8 * w**6 + 54.140625_8 * w**4 -& 9.84375_8 * w**2 + 0.2734375_8 ! l = 8, m = 1 - rn(10) = 0.166666666666667_8*sqrt(w2m1)* & - ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & - (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi) + rn(10) = -(0.166666666666667_8*sqrt(w2m1)* & + ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & + (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi)) ! l = 8, m = 2 rn(11) = 0.0199204768222399_8 * (w2m1)*((45045.0_8/16.0_8)*w**6- & 45045.0_8/16.0_8 * w**4 + (10395.0_8/16.0_8)*w**2 - & 315.0_8/16.0_8) * cos(TWO*phi) ! l = 8, m = 3 - rn(12) = 0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & - ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + & - (10395.0_8/8.0_8)*w) * cos(THREE*phi) + rn(12) = -(0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & + ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + & + (10395.0_8/8.0_8)*w) * cos(THREE*phi)) ! l = 8, m = 4 rn(13) = 0.000316557156832328_8 * (w2m1)**2*((675675.0_8/8.0_8)*w**4 - & 135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * cos(4.0_8*phi) ! l = 8, m = 5 - rn(14) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 -& - 135135.0_8/TWO*w) * cos(5.0_8*phi) + rn(14) = -(4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 -& + 135135.0_8/TWO*w) * cos(5.0_8*phi)) ! l = 8, m = 6 rn(15) = 6.77369783729086d-6*(w2m1)**3*((2027025.0_8/TWO)*w**2 - & 135135.0_8/TWO) * cos(6.0_8*phi) ! l = 8, m = 7 - rn(16) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * cos(7.0_8*phi) + rn(16) = -(2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * cos(7.0_8*phi)) ! l = 8, m = 8 rn(17) = 0.626706654240044_8 * (w2m1)**4 * cos(8.0_8*phi) case (9) ! l = 9, m = -9 - rn(1) = 0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * sin(9.0_8*phi) + rn(1) = -(0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * sin(9.0_8*phi)) ! l = 9, m = -8 rn(2) = 2.58397773170915_8 * w*(w2m1)**4 * sin(8.0_8*phi) ! l = 9, m = -7 - rn(3) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & - ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi) + rn(3) = -(4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & + ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi)) ! l = 9, m = -6 rn(4) = 3.02928976464514d-6*(w2m1)**3* & ((11486475.0_8/TWO)*w**3 - 2027025.0_8/TWO*w) * sin(6.0_8*phi) ! l = 9, m = -5 - rn(5) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)* & - ((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + & - 135135.0_8/8.0_8) * sin(5.0_8*phi) + rn(5) = -(2.34647776186144d-5*(w2m1)**(5.0_8/TWO)* & + ((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + & + 135135.0_8/8.0_8) * sin(5.0_8*phi)) ! l = 9, m = -4 rn(6) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - & 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * sin(4.0_8*phi) ! l = 9, m = -3 - rn(7) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)* & - ((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + & - (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(THREE*phi) + rn(7) = -(0.00173385495536766_8 * (w2m1)**(THREE/TWO)* & + ((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + & + (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(THREE*phi)) ! l = 9, m = -2 rn(8) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7- & 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 & - 3465.0_8/16.0_8 * w) * sin(TWO*phi) ! l = 9, m = -1 - rn(9) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & - 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 & - * w**2 + 315.0_8/128.0_8) * sin(phi) + rn(9) = -(0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & + 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 & + * w**2 + 315.0_8/128.0_8) * sin(phi)) ! l = 9, m = 0 rn(10) = 94.9609375_8 * w**9 - 201.09375_8 * w**7 + 140.765625_8 * w**5- & 36.09375_8 * w**3 + 2.4609375_8 * w ! l = 9, m = 1 - rn(11) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & - 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 & - * w**2 + 315.0_8/128.0_8) * cos(phi) + rn(11) = -(0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & + 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 & + * w**2 + 315.0_8/128.0_8) * cos(phi)) ! l = 9, m = 2 rn(12) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7 - & 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 & - 3465.0_8/ 16.0_8 * w) * cos(TWO*phi) ! l = 9, m = 3 - rn(13) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)*((765765.0_8/16.0_8)& - *w**6 - 675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 & - - 3465.0_8/16.0_8)* cos(THREE*phi) + rn(13) = -(0.00173385495536766_8 * (w2m1)**(THREE/TWO)*((765765.0_8/16.0_8)& + *w**6 - 675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 & + - 3465.0_8/16.0_8)* cos(THREE*phi)) ! l = 9, m = 4 rn(14) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - & 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * cos(4.0_8*phi) ! l = 9, m = 5 - rn(15) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)*((11486475.0_8/8.0_8)* & - w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi) + rn(15) = -(2.34647776186144d-5*(w2m1)**(5.0_8/TWO)*((11486475.0_8/8.0_8)* & + w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi)) ! l = 9, m = 6 rn(16) = 3.02928976464514d-6*(w2m1)**3*((11486475.0_8/TWO)*w**3 - & 2027025.0_8/TWO*w) * cos(6.0_8*phi) ! l = 9, m = 7 - rn(17) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & - ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi) + rn(17) = -(4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & + ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi)) ! l = 9, m = 8 rn(18) = 2.58397773170915_8 * w*(w2m1)**4 * cos(8.0_8*phi) ! l = 9, m = 9 - rn(19) = 0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * cos(9.0_8*phi) + rn(19) = -(0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * cos(9.0_8*phi)) case (10) ! l = 10, m = -10 rn(1) = 0.593627917136573_8 * (w2m1)**5 * sin(10.0_8*phi) ! l = 10, m = -9 - rn(2) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * sin(9.0_8*phi) + rn(2) = -(2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * sin(9.0_8*phi)) ! l = 10, m = -8 rn(3) = 2.49953651452314d-8*(w2m1)**4*((654729075.0_8/TWO)*w**2 - & 34459425.0_8/TWO) * sin(8.0_8*phi) ! l = 10, m = -7 - rn(4) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & - ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi) + rn(4) = -(1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & + ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi)) ! l = 10, m = -6 rn(5) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - & 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * sin(6.0_8*phi) ! l = 10, m = -5 - rn(6) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & - ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & - (2027025.0_8/8.0_8)*w) * sin(5.0_8*phi) + rn(6) = -(1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & + ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & + (2027025.0_8/8.0_8)*w) * sin(5.0_8*phi)) ! l = 10, m = -4 rn(7) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 - & 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & 45045.0_8/16.0_8) * sin(4.0_8*phi) ! l = 10, m = -3 - rn(8) = 0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & - ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & - (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(THREE*phi) + rn(8) = -(0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & + ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & + (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(THREE*phi)) ! l = 10, m = -2 rn(9) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - & 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 - & 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * sin(TWO*phi) ! l = 10, m = -1 - rn(10) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & - 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - & - 15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi) + rn(10) = -(0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & + 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - & + 15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi)) ! l = 10, m = 0 rn(11) = 180.42578125_8 * w**10 - 427.32421875_8 * w**8 +351.9140625_8 & * w**6 - 117.3046875_8 * w**4 + 13.53515625_8 * w**2 -0.24609375_8 ! l = 10, m = 1 - rn(12) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & - 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ & - 32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi) + rn(12) = -(0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & + 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ & + 32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi)) ! l = 10, m = 2 rn(13) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - & 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 -& 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * cos(TWO*phi) ! l = 10, m = 3 - rn(14) = 0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & - ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & - (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(THREE*phi) + rn(14) = -(0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & + ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & + (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(THREE*phi)) ! l = 10, m = 4 rn(15) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 -& 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & 45045.0_8/16.0_8) * cos(4.0_8*phi) ! l = 10, m = 5 - rn(16) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & - ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & - (2027025.0_8/8.0_8)*w) * cos(5.0_8*phi) + rn(16) = -(1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & + ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & + (2027025.0_8/8.0_8)*w) * cos(5.0_8*phi)) ! l = 10, m = 6 rn(17) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - & 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * cos(6.0_8*phi) ! l = 10, m = 7 - rn(18) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & - ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi) + rn(18) = -(1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & + ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi)) ! l = 10, m = 8 rn(19) = 2.49953651452314d-8*(w2m1)**4* & ((654729075.0_8/TWO)*w**2 - 34459425.0_8/TWO) * cos(8.0_8*phi) ! l = 10, m = 9 - rn(20) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * cos(9.0_8*phi) + rn(20) = -(2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * cos(9.0_8*phi)) ! l = 10, m = 10 rn(21) = 0.593627917136573_8 * (w2m1)**5 * cos(10.0_8*phi) case default From a393378f4d483f1aedae64cb5c7ba2327094ef8a Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 3 Oct 2015 10:42:22 -0400 Subject: [PATCH 265/519] Updated tests for the revised calc_rn --- tests/test_score_flux_yn/results_true.dat | 648 +++++++++--------- .../test_score_nuscatter_yn/results_true.dat | 16 +- tests/test_score_scatter_yn/results_true.dat | 24 +- tests/test_score_total_yn/results_true.dat | 288 ++++---- 4 files changed, 488 insertions(+), 488 deletions(-) diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 937f810ea6..1821cc6abd 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -16,1299 +16,1299 @@ tally 1: tally 2: 3.224218E+01 2.217821E+02 --4.524803E-01 +4.524803E-01 1.326110E-01 -2.725152E-01 4.845463E-01 --4.030063E-01 +4.030063E-01 1.825349E-01 -2.145346E-01 7.197305E-02 -2.488985E-01 +-2.488985E-01 4.295894E-02 -6.797085E-01 2.125889E-01 -1.698034E-01 +-1.698034E-01 3.750580E-02 -6.596628E-02 6.507545E-02 -4.519597E-02 +-4.519597E-02 1.432412E-02 6.227959E-01 1.066624E-01 -2.328135E-01 +-2.328135E-01 8.583522E-02 -8.899482E-01 1.982834E-01 -3.269468E-01 +-3.269468E-01 5.392549E-02 1.684792E-01 1.461138E-01 --2.026161E-01 +2.026161E-01 1.992812E-01 2.599678E-01 7.704699E-02 --3.329837E-01 +3.329837E-01 8.761827E-02 -5.287177E-01 9.089410E-02 -3.666982E-01 +-3.666982E-01 4.451200E-02 2.096594E-01 4.539545E-02 -2.091762E-01 +-2.091762E-01 4.861771E-02 1.476292E-01 2.837569E-02 --4.091772E-01 +4.091772E-01 1.141307E-01 -1.652694E-01 5.552090E-02 -8.207679E-02 +-8.207679E-02 1.659512E-02 -1.203575E-01 6.408952E-02 --8.219791E-03 +8.219791E-03 9.915873E-02 -3.768675E-02 8.535079E-02 -1.305167E-01 +-1.305167E-01 1.917693E-02 1.823050E-01 1.945159E-02 -2.999655E-01 +-2.999655E-01 4.587948E-02 3.687435E-01 1.382795E-01 -1.220376E-01 +-1.220376E-01 6.297901E-02 3.899923E-01 5.894393E-02 --1.878957E-02 +1.878957E-02 1.159448E-01 1.079687E+01 2.494701E+01 --1.067271E-01 +1.067271E-01 9.075462E-03 -2.571244E-02 4.402172E-02 --3.646387E-02 +3.646387E-02 2.948533E-02 -1.043828E-01 1.600528E-02 -4.361032E-02 +-4.361032E-02 3.875958E-03 -3.096545E-01 3.184604E-02 -8.723730E-02 +-8.723730E-02 4.599654E-03 6.541966E-03 9.605866E-03 -5.837907E-02 +-5.837907E-02 3.026784E-03 1.523399E-01 7.846764E-03 -2.778305E-02 +-2.778305E-02 8.106935E-03 -2.895648E-01 1.983532E-02 -4.866247E-02 +-4.866247E-02 1.048055E-02 2.600097E-02 1.465465E-02 --6.958338E-02 +6.958338E-02 3.287519E-02 1.690742E-01 1.204714E-02 --1.127534E-01 +1.127534E-01 7.881362E-03 -1.662306E-01 9.412057E-03 -1.674047E-01 +-1.674047E-01 6.690449E-03 -4.370664E-02 5.828314E-03 -9.323095E-02 +-9.323095E-02 4.400433E-03 1.353164E-02 1.389416E-03 --1.062009E-01 +1.062009E-01 1.297730E-02 -5.331064E-02 5.321055E-03 -7.698466E-02 +-7.698466E-02 3.247975E-03 -2.095250E-02 4.788058E-03 --8.861817E-03 +8.861817E-03 7.657174E-03 1.769365E-02 1.144058E-03 -1.788678E-02 +-1.788678E-02 2.746804E-03 4.403056E-03 6.918351E-04 -1.059091E-01 +-1.059091E-01 1.394217E-02 1.442934E-01 1.318500E-02 -2.199047E-02 +-2.199047E-02 5.838245E-03 8.175546E-02 3.242012E-03 -7.359786E-03 +-7.359786E-03 1.673277E-02 5.252579E+01 5.951604E+02 --8.293789E-01 +8.293789E-01 2.900775E-01 6.285324E-01 1.487344E+00 --4.765860E-01 +4.765860E-01 8.058451E-01 -3.101266E-01 1.597231E-01 -3.333449E-01 +-3.333449E-01 1.162003E-01 -1.314742E+00 4.565068E-01 -4.726655E-01 +-4.726655E-01 1.161194E-01 2.824987E-01 8.732802E-02 -1.025468E-01 +-1.025468E-01 4.935830E-02 4.216767E-01 1.225700E-01 --4.022783E-02 +4.022783E-02 1.178843E-01 -7.967853E-01 2.698001E-01 -3.741686E-01 +-3.741686E-01 2.849501E-01 3.377745E-01 3.722806E-01 -9.234355E-02 +-9.234355E-02 4.498496E-01 8.019475E-01 3.404218E-01 --3.086622E-01 +3.086622E-01 1.857604E-01 -8.474654E-01 1.733363E-01 -8.124627E-01 +-8.124627E-01 1.415201E-01 -3.075481E-01 3.345921E-02 -7.126178E-01 +-7.126178E-01 2.478330E-01 2.983972E-01 2.913106E-02 --6.759256E-01 +6.759256E-01 4.245338E-01 -3.491214E-01 1.017784E-01 -1.637602E-01 +-1.637602E-01 7.414687E-02 -3.344942E-01 1.165491E-01 --6.038784E-02 +6.038784E-02 1.791698E-01 2.645086E-01 8.129446E-02 --2.738265E-01 +2.738265E-01 6.616303E-02 1.135151E-02 4.140154E-02 -4.679883E-01 +-4.679883E-01 1.914750E-01 2.876984E-01 1.355086E-01 --2.741613E-01 +2.741613E-01 1.060457E-01 5.972204E-01 2.144153E-01 --9.215131E-02 +9.215131E-02 4.815135E-01 3.325822E+01 2.414028E+02 --3.072951E-02 +3.072951E-02 3.385901E-01 9.729550E-01 3.745599E-01 --5.237870E-01 +5.237870E-01 3.101477E-01 -5.994810E-01 1.696123E-01 --3.402784E-01 +3.402784E-01 1.910685E-01 -3.779571E-01 2.598004E-01 --4.804007E-01 +4.804007E-01 1.417261E-01 -5.444032E-01 1.756801E-01 --9.921809E-02 +9.921809E-02 6.889191E-02 -3.768065E-01 8.931168E-02 -5.814513E-02 +-5.814513E-02 1.660714E-02 -1.263664E-01 2.650287E-01 -1.951860E-01 +-1.951860E-01 2.090892E-01 3.576168E-01 2.511782E-01 --9.547988E-02 +9.547988E-02 7.900044E-03 5.460746E-01 1.319868E-01 --1.577655E-01 +1.577655E-01 8.575762E-02 2.938792E-02 7.941653E-02 --7.505627E-01 +7.505627E-01 2.530444E-01 -2.399786E-01 1.105633E-01 -2.035740E-01 +-2.035740E-01 2.442135E-02 1.190368E-01 8.652216E-02 -5.753449E-01 +-5.753449E-01 9.353813E-02 4.911025E-01 6.795258E-02 --2.967023E-03 +2.967023E-03 7.063512E-03 -2.158307E-01 4.680921E-02 --1.811238E-01 +1.811238E-01 7.008450E-02 1.809785E-01 3.414843E-02 --1.380825E-01 +1.380825E-01 3.469381E-02 3.722241E-01 3.956589E-02 -2.064516E-01 +-2.064516E-01 2.676312E-02 -3.889056E-01 6.737109E-02 -1.625815E-01 +-1.625815E-01 1.356347E-02 -5.278455E-01 1.297993E-01 --1.269304E-02 +1.269304E-02 1.253029E-02 1.145800E+01 2.880575E+01 -6.201234E-02 +-6.201234E-02 4.410457E-02 2.694694E-01 6.262339E-02 --1.173739E-01 +1.173739E-01 4.727885E-02 -1.785056E-01 1.745391E-02 --4.744392E-02 +4.744392E-02 2.117667E-02 3.998416E-02 6.058339E-02 --1.927536E-01 +1.927536E-01 1.710512E-02 -1.800560E-01 2.420071E-02 --1.136912E-01 +1.136912E-01 1.049357E-02 -1.104415E-01 1.181394E-02 -3.486245E-02 +-3.486245E-02 3.673104E-03 -8.343502E-02 2.270299E-02 --3.064437E-02 +3.064437E-02 1.197968E-02 1.912081E-01 2.808487E-02 -2.601014E-02 +-2.601014E-02 1.311244E-03 1.295023E-01 1.108983E-02 --1.158397E-01 +1.158397E-01 1.033182E-02 8.316701E-02 2.061897E-02 --1.136796E-01 +1.136796E-01 3.133021E-02 -1.722931E-02 2.168654E-02 -1.464014E-01 +-1.464014E-01 8.570818E-03 5.859338E-02 6.076029E-03 -1.776223E-01 +-1.776223E-01 1.345571E-02 1.582455E-01 9.719314E-03 -9.088118E-03 +-9.088118E-03 1.681557E-03 -6.298727E-02 5.287397E-03 -5.793395E-03 +-5.793395E-03 6.397495E-03 -1.835123E-02 4.506573E-03 --7.558061E-02 +7.558061E-02 4.462082E-03 3.136371E-02 3.181332E-03 --2.787527E-02 +2.787527E-02 1.765822E-03 -9.878307E-02 3.381183E-03 -1.279690E-01 +-1.279690E-01 4.386067E-03 -1.043523E-01 5.381331E-03 -1.000162E-02 +-1.000162E-02 6.707280E-04 5.605671E+01 6.804062E+02 -1.431465E-01 +-1.431465E-01 1.700768E+00 2.010680E+00 2.307036E+00 --5.276592E-01 +5.276592E-01 1.006050E+00 -9.123132E-01 4.824313E-01 --3.276490E-01 +3.276490E-01 5.842232E-01 6.749445E-02 6.049661E-01 --1.317515E+00 +1.317515E+00 4.738014E-01 -9.470910E-01 4.937085E-01 --3.338536E-01 +3.338536E-01 2.196164E-01 -3.032729E-01 1.241029E-01 --3.285269E-01 +3.285269E-01 5.276607E-02 -4.107012E-01 6.402858E-01 -3.357626E-01 +-3.357626E-01 2.672801E-01 1.000507E+00 5.263322E-01 --1.834202E-01 +1.834202E-01 9.495434E-02 8.133484E-01 3.011488E-01 --4.083516E-01 +4.083516E-01 2.428630E-01 4.032934E-01 1.825835E-01 --8.291267E-01 +8.291267E-01 6.773284E-01 -2.401557E-01 2.280331E-01 -4.325658E-01 +-4.325658E-01 1.163540E-01 6.671759E-02 2.181769E-01 -6.984462E-01 +-6.984462E-01 1.716985E-01 7.108347E-01 1.386394E-01 -1.709795E-01 +-1.709795E-01 5.320122E-02 -2.354809E-01 7.105363E-02 -1.600239E-01 +-1.600239E-01 9.179874E-02 2.802111E-02 6.149546E-02 --4.005049E-01 +4.005049E-01 2.195356E-01 7.914623E-01 2.273026E-01 -3.392453E-01 +-3.392453E-01 1.101813E-01 -7.821576E-01 1.637944E-01 -4.736782E-01 +-4.736782E-01 1.531480E-01 -5.253391E-01 1.093913E-01 -2.235961E-01 +-2.235961E-01 5.449263E-02 tally 3: 3.077754E+01 2.017424E+02 --4.040800E-01 +4.040800E-01 5.606719E-01 -5.238239E-01 4.460714E-01 -1.155164E-01 +-1.155164E-01 1.686786E-01 -1.972294E-01 2.912851E-01 -4.908524E-01 +-4.908524E-01 1.374195E-01 -1.467088E-02 1.080839E-01 -6.749037E-02 +-6.749037E-02 1.397361E-01 4.136479E-03 9.237632E-02 --3.742305E-01 +3.742305E-01 9.917374E-02 5.374208E-01 2.530961E-01 -2.270996E-01 +-2.270996E-01 9.415721E-02 -4.568867E-02 1.277446E-01 -1.581716E-01 +-1.581716E-01 6.217155E-02 4.667840E-01 1.143380E-01 -9.684270E-02 +-9.684270E-02 7.302998E-02 8.366629E-01 1.797483E-01 --5.657893E-01 +5.657893E-01 2.553910E-01 -2.351441E-02 4.395513E-02 -7.843306E-01 +-7.843306E-01 1.466478E-01 4.617856E-02 1.154681E-02 -1.431343E-01 +-1.431343E-01 3.531062E-02 4.625825E-01 6.235642E-02 --8.837342E-02 +8.837342E-02 6.231694E-02 -3.766755E-01 6.412261E-02 -1.995226E-01 +-1.995226E-01 1.743990E-01 -2.498625E-02 8.897536E-02 --1.039315E-01 +1.039315E-01 1.868672E-01 6.712910E-01 2.084042E-01 -5.805639E-02 +-5.805639E-02 4.049580E-02 1.603677E-01 4.280033E-02 -3.909878E-01 +-3.909878E-01 7.726018E-02 9.878354E-02 4.630595E-02 --2.389983E-01 +2.389983E-01 3.528604E-02 1.641046E-01 1.669859E-01 --2.351986E-02 +2.351986E-02 1.048794E-02 1.172238E+01 3.139127E+01 --1.057733E+00 +1.057733E+00 2.820672E-01 5.708838E-02 6.224675E-02 -2.492981E-02 +-2.492981E-02 1.827498E-01 -1.339268E-01 1.968929E-02 -2.363867E-01 +-2.363867E-01 3.028587E-02 -2.867841E-01 2.680318E-02 --2.352784E-01 +2.352784E-01 1.895006E-02 4.365572E-01 1.883240E-01 --3.388837E-01 +3.388837E-01 7.209932E-02 3.488374E-01 6.640137E-02 --3.343893E-01 +3.343893E-01 4.149634E-02 -4.575314E-01 7.461614E-02 -4.436881E-01 +-4.436881E-01 1.325092E-01 3.394853E-01 2.987173E-02 --2.633936E-02 +2.633936E-02 6.171428E-02 9.994191E-02 6.447641E-02 --1.618840E-01 +1.618840E-01 3.497845E-02 -1.290678E-01 3.735394E-02 -9.852126E-03 +-9.852126E-03 2.963925E-02 -1.656539E-01 4.190396E-02 --2.292763E-01 +2.292763E-01 7.045480E-02 -4.616824E-03 1.926690E-02 --1.960839E-01 +1.960839E-01 1.396042E-02 -2.133526E-02 5.189823E-02 -2.933136E-01 +-2.933136E-01 5.721356E-02 -1.084914E-01 2.448532E-02 --4.778583E-01 +4.778583E-01 7.644033E-02 1.736901E-01 6.630467E-02 --5.460801E-02 +5.460801E-02 1.510381E-02 1.106093E-01 1.590306E-02 -1.659501E-01 +-1.659501E-01 5.983218E-02 1.343781E-02 2.751294E-02 -2.052693E-01 +-2.052693E-01 3.478581E-02 -1.006298E-01 1.815313E-02 --2.563766E-01 +2.563766E-01 3.045246E-02 5.231699E+01 5.870469E+02 --6.102587E-01 +6.102587E-01 5.930968E-01 1.184182E+00 1.364433E+00 --6.362263E-02 +6.362263E-02 8.852514E-01 -4.844978E-01 1.751923E-01 -8.223413E-01 +-8.223413E-01 2.436206E-01 -9.656506E-01 3.513566E-01 -2.710494E-01 +-2.710494E-01 7.170772E-01 4.792482E-01 2.551569E-01 --1.266077E-01 +1.266077E-01 2.824778E-01 6.389964E-01 2.501483E-01 -8.915816E-01 +-8.915816E-01 3.557431E-01 -1.007448E+00 5.743018E-01 -3.528444E-01 +-3.528444E-01 2.428078E-01 -5.833000E-01 3.733648E-01 --4.660289E-01 +4.660289E-01 6.567263E-02 5.856088E-01 2.336146E-01 -3.836351E-02 +-3.836351E-02 7.665403E-02 -6.721211E-01 2.651780E-01 -5.725993E-01 +-5.725993E-01 2.101026E-01 -2.130594E-01 1.855350E-02 -2.607168E-01 +-2.607168E-01 1.564288E-01 -3.399382E-02 3.067656E-02 --1.228976E+00 +1.228976E+00 6.554836E-01 -2.962235E-01 1.808511E-01 -5.521675E-01 +-5.521675E-01 1.722073E-01 -1.658751E-01 1.994119E-02 --2.671896E-01 +2.671896E-01 1.343320E-01 -2.325282E-01 4.677656E-02 --3.380310E-01 +3.380310E-01 1.703532E-01 -3.571853E-01 1.140525E-01 -3.836770E-02 +-3.836770E-02 8.586429E-02 7.328263E-01 1.567227E-01 -4.840110E-02 +-4.840110E-02 2.718471E-02 5.654783E-01 3.645579E-01 --3.027585E-01 +3.027585E-01 1.407867E-01 3.259142E+01 2.336719E+02 -3.053294E-01 +-3.053294E-01 2.086257E-01 -7.563597E-01 2.816768E-01 --3.039288E-01 +3.039288E-01 2.855043E-01 -2.648323E-01 1.883784E-01 -2.665933E-01 +-2.665933E-01 1.782353E-01 1.978960E-01 1.419567E-01 -1.228712E-01 +-1.228712E-01 1.913946E-01 -9.152681E-03 1.324681E-01 --5.707326E-01 +5.707326E-01 1.092067E-01 2.326858E-01 6.731743E-02 --5.170241E-01 +5.170241E-01 1.353439E-01 -4.064026E-01 9.715030E-02 --1.142031E-01 +1.142031E-01 7.748788E-02 2.928039E-01 2.716157E-01 --1.721186E-01 +1.721186E-01 1.447738E-01 6.452116E-01 1.821975E-01 --5.697276E-01 +5.697276E-01 1.047333E-01 -9.640967E-02 1.139327E-01 --4.509832E-01 +4.509832E-01 2.079493E-01 -2.134684E-02 2.907667E-01 --2.434868E-01 +2.434868E-01 1.235397E-01 2.550330E-01 2.979627E-01 -9.598615E-01 +-9.598615E-01 3.140885E-01 1.218430E-01 6.283872E-02 -2.412915E-01 +-2.412915E-01 1.907292E-02 -2.236667E-01 4.379414E-02 -2.844474E-01 +-2.844474E-01 2.965692E-02 1.618860E-01 8.293785E-03 --1.265583E-01 +1.265583E-01 4.515449E-02 6.356127E-02 1.358134E-02 --3.844886E-01 +3.844886E-01 8.600010E-02 -1.942739E-01 7.516022E-02 -1.765511E-01 +-1.765511E-01 3.522611E-02 -3.433188E-01 3.456066E-02 --1.501983E-01 +1.501983E-01 5.633844E-02 1.040924E+01 2.432332E+01 --4.138270E-01 +4.138270E-01 1.309129E-01 -3.151106E-01 1.286964E-01 -9.213222E-02 +-9.213222E-02 6.189454E-02 -2.746107E-01 8.103949E-02 --9.781742E-02 +9.781742E-02 3.783736E-02 -1.178371E-01 3.242332E-02 --5.837932E-01 +5.837932E-01 2.059491E-01 -7.338223E-03 8.012203E-02 -5.628994E-02 +-5.628994E-02 2.190669E-02 8.155585E-02 1.039007E-01 -6.052048E-02 +-6.052048E-02 4.339463E-02 -1.157646E-02 1.839000E-02 --2.641673E-01 +2.641673E-01 4.737589E-02 -8.531135E-02 5.432766E-02 -6.036555E-01 +-6.036555E-01 1.190329E-01 -3.149976E-01 5.735264E-02 --8.456340E-02 +8.456340E-02 4.563143E-03 2.224065E-01 6.600030E-02 -9.562392E-03 +-9.562392E-03 1.843524E-02 -2.400599E-01 3.182217E-02 --6.534941E-01 +6.534941E-01 1.180315E-01 4.371157E-01 9.076666E-02 -3.257455E-02 +-3.257455E-02 2.936184E-02 -8.788428E-02 1.923293E-02 --2.604776E-01 +2.604776E-01 3.660313E-02 -6.315350E-02 1.503534E-02 -5.609294E-01 +-5.609294E-01 8.783528E-02 -7.363672E-01 1.789210E-01 -2.883575E-01 +-2.883575E-01 6.478578E-02 -3.302954E-02 1.517946E-02 --3.234157E-01 +3.234157E-01 4.418920E-02 2.846318E-01 2.712085E-02 --3.227536E-01 +3.227536E-01 5.062832E-02 4.391474E-01 5.548002E-02 -1.322988E-01 +-1.322988E-01 2.995854E-02 5.709679E+01 6.978668E+02 -2.859201E-02 +-2.859201E-02 1.094507E+00 6.058587E-01 6.079927E-01 -7.553798E-02 +-7.553798E-02 1.131607E+00 -5.851206E-01 1.215663E+00 -8.266012E-02 +-8.266012E-02 9.031287E-01 -7.088368E-01 3.984608E-01 --4.414986E-01 +4.414986E-01 1.502417E-01 2.241998E-01 3.228823E-01 --7.328574E-01 +7.328574E-01 2.430448E-01 -8.070160E-01 1.767265E-01 --1.154449E-01 +1.154449E-01 8.739303E-03 -3.787161E-01 4.728756E-01 --1.743577E-01 +1.743577E-01 1.091245E-01 2.878137E-01 2.724285E-01 -2.128994E-01 +-2.128994E-01 4.440539E-01 9.495567E-01 3.622719E-01 -1.422950E-01 +-1.422950E-01 5.309223E-02 1.323659E-01 1.911979E-01 --1.303752E-01 +1.303752E-01 5.710728E-01 -4.611294E-02 4.086632E-02 -5.937879E-01 +-5.937879E-01 1.006156E-01 -3.558925E-01 2.998983E-01 -1.175971E+00 +-1.175971E+00 5.323321E-01 2.426485E-01 1.497265E-01 -7.805090E-02 +-7.805090E-02 5.060214E-02 -2.914577E-01 2.233355E-01 -1.053098E-01 +-1.053098E-01 6.693123E-02 4.541315E-01 1.328340E-01 --6.290732E-02 +6.290732E-02 8.910616E-02 7.371592E-01 1.980732E-01 -5.804701E-01 +-5.804701E-01 1.711949E-01 -6.642202E-01 1.131866E-01 -1.779818E-01 +-1.779818E-01 6.530190E-02 -5.224739E-01 2.534102E-01 --1.824905E-01 +1.824905E-01 2.910309E-02 tally 4: 3.077754E+01 2.017424E+02 --4.040800E-01 +4.040800E-01 5.606719E-01 -5.238239E-01 4.460714E-01 -1.155164E-01 +-1.155164E-01 1.686786E-01 -1.972294E-01 2.912851E-01 -4.908524E-01 +-4.908524E-01 1.374195E-01 -1.467088E-02 1.080839E-01 -6.749037E-02 +-6.749037E-02 1.397361E-01 4.136479E-03 9.237632E-02 --3.742305E-01 +3.742305E-01 9.917374E-02 5.374208E-01 2.530961E-01 -2.270996E-01 +-2.270996E-01 9.415721E-02 -4.568867E-02 1.277446E-01 -1.581716E-01 +-1.581716E-01 6.217155E-02 4.667840E-01 1.143380E-01 -9.684270E-02 +-9.684270E-02 7.302998E-02 8.366629E-01 1.797483E-01 --5.657893E-01 +5.657893E-01 2.553910E-01 -2.351441E-02 4.395513E-02 -7.843306E-01 +-7.843306E-01 1.466478E-01 4.617856E-02 1.154681E-02 -1.431343E-01 +-1.431343E-01 3.531062E-02 4.625825E-01 6.235642E-02 --8.837342E-02 +8.837342E-02 6.231694E-02 -3.766755E-01 6.412261E-02 -1.995226E-01 +-1.995226E-01 1.743990E-01 -2.498625E-02 8.897536E-02 --1.039315E-01 +1.039315E-01 1.868672E-01 6.712910E-01 2.084042E-01 -5.805639E-02 +-5.805639E-02 4.049580E-02 1.603677E-01 4.280033E-02 -3.909878E-01 +-3.909878E-01 7.726018E-02 9.878354E-02 4.630595E-02 --2.389983E-01 +2.389983E-01 3.528604E-02 1.641046E-01 1.669859E-01 --2.351986E-02 +2.351986E-02 1.048794E-02 1.172238E+01 3.139127E+01 --1.057733E+00 +1.057733E+00 2.820672E-01 5.708838E-02 6.224675E-02 -2.492981E-02 +-2.492981E-02 1.827498E-01 -1.339268E-01 1.968929E-02 -2.363867E-01 +-2.363867E-01 3.028587E-02 -2.867841E-01 2.680318E-02 --2.352784E-01 +2.352784E-01 1.895006E-02 4.365572E-01 1.883240E-01 --3.388837E-01 +3.388837E-01 7.209932E-02 3.488374E-01 6.640137E-02 --3.343893E-01 +3.343893E-01 4.149634E-02 -4.575314E-01 7.461614E-02 -4.436881E-01 +-4.436881E-01 1.325092E-01 3.394853E-01 2.987173E-02 --2.633936E-02 +2.633936E-02 6.171428E-02 9.994191E-02 6.447641E-02 --1.618840E-01 +1.618840E-01 3.497845E-02 -1.290678E-01 3.735394E-02 -9.852126E-03 +-9.852126E-03 2.963925E-02 -1.656539E-01 4.190396E-02 --2.292763E-01 +2.292763E-01 7.045480E-02 -4.616824E-03 1.926690E-02 --1.960839E-01 +1.960839E-01 1.396042E-02 -2.133526E-02 5.189823E-02 -2.933136E-01 +-2.933136E-01 5.721356E-02 -1.084914E-01 2.448532E-02 --4.778583E-01 +4.778583E-01 7.644033E-02 1.736901E-01 6.630467E-02 --5.460801E-02 +5.460801E-02 1.510381E-02 1.106093E-01 1.590306E-02 -1.659501E-01 +-1.659501E-01 5.983218E-02 1.343781E-02 2.751294E-02 -2.052693E-01 +-2.052693E-01 3.478581E-02 -1.006298E-01 1.815313E-02 --2.563766E-01 +2.563766E-01 3.045246E-02 5.231699E+01 5.870469E+02 --6.102587E-01 +6.102587E-01 5.930968E-01 1.184182E+00 1.364433E+00 --6.362263E-02 +6.362263E-02 8.852514E-01 -4.844978E-01 1.751923E-01 -8.223413E-01 +-8.223413E-01 2.436206E-01 -9.656506E-01 3.513566E-01 -2.710494E-01 +-2.710494E-01 7.170772E-01 4.792482E-01 2.551569E-01 --1.266077E-01 +1.266077E-01 2.824778E-01 6.389964E-01 2.501483E-01 -8.915816E-01 +-8.915816E-01 3.557431E-01 -1.007448E+00 5.743018E-01 -3.528444E-01 +-3.528444E-01 2.428078E-01 -5.833000E-01 3.733648E-01 --4.660289E-01 +4.660289E-01 6.567263E-02 5.856088E-01 2.336146E-01 -3.836351E-02 +-3.836351E-02 7.665403E-02 -6.721211E-01 2.651780E-01 -5.725993E-01 +-5.725993E-01 2.101026E-01 -2.130594E-01 1.855350E-02 -2.607168E-01 +-2.607168E-01 1.564288E-01 -3.399382E-02 3.067656E-02 --1.228976E+00 +1.228976E+00 6.554836E-01 -2.962235E-01 1.808511E-01 -5.521675E-01 +-5.521675E-01 1.722073E-01 -1.658751E-01 1.994119E-02 --2.671896E-01 +2.671896E-01 1.343320E-01 -2.325282E-01 4.677656E-02 --3.380310E-01 +3.380310E-01 1.703532E-01 -3.571853E-01 1.140525E-01 -3.836770E-02 +-3.836770E-02 8.586429E-02 7.328263E-01 1.567227E-01 -4.840110E-02 +-4.840110E-02 2.718471E-02 5.654783E-01 3.645579E-01 --3.027585E-01 +3.027585E-01 1.407867E-01 3.259142E+01 2.336719E+02 -3.053294E-01 +-3.053294E-01 2.086257E-01 -7.563597E-01 2.816768E-01 --3.039288E-01 +3.039288E-01 2.855043E-01 -2.648323E-01 1.883784E-01 -2.665933E-01 +-2.665933E-01 1.782353E-01 1.978960E-01 1.419567E-01 -1.228712E-01 +-1.228712E-01 1.913946E-01 -9.152681E-03 1.324681E-01 --5.707326E-01 +5.707326E-01 1.092067E-01 2.326858E-01 6.731743E-02 --5.170241E-01 +5.170241E-01 1.353439E-01 -4.064026E-01 9.715030E-02 --1.142031E-01 +1.142031E-01 7.748788E-02 2.928039E-01 2.716157E-01 --1.721186E-01 +1.721186E-01 1.447738E-01 6.452116E-01 1.821975E-01 --5.697276E-01 +5.697276E-01 1.047333E-01 -9.640967E-02 1.139327E-01 --4.509832E-01 +4.509832E-01 2.079493E-01 -2.134684E-02 2.907667E-01 --2.434868E-01 +2.434868E-01 1.235397E-01 2.550330E-01 2.979627E-01 -9.598615E-01 +-9.598615E-01 3.140885E-01 1.218430E-01 6.283872E-02 -2.412915E-01 +-2.412915E-01 1.907292E-02 -2.236667E-01 4.379414E-02 -2.844474E-01 +-2.844474E-01 2.965692E-02 1.618860E-01 8.293785E-03 --1.265583E-01 +1.265583E-01 4.515449E-02 6.356127E-02 1.358134E-02 --3.844886E-01 +3.844886E-01 8.600010E-02 -1.942739E-01 7.516022E-02 -1.765511E-01 +-1.765511E-01 3.522611E-02 -3.433188E-01 3.456066E-02 --1.501983E-01 +1.501983E-01 5.633844E-02 1.040924E+01 2.432332E+01 --4.138270E-01 +4.138270E-01 1.309129E-01 -3.151106E-01 1.286964E-01 -9.213222E-02 +-9.213222E-02 6.189454E-02 -2.746107E-01 8.103949E-02 --9.781742E-02 +9.781742E-02 3.783736E-02 -1.178371E-01 3.242332E-02 --5.837932E-01 +5.837932E-01 2.059491E-01 -7.338223E-03 8.012203E-02 -5.628994E-02 +-5.628994E-02 2.190669E-02 8.155585E-02 1.039007E-01 -6.052048E-02 +-6.052048E-02 4.339463E-02 -1.157646E-02 1.839000E-02 --2.641673E-01 +2.641673E-01 4.737589E-02 -8.531135E-02 5.432766E-02 -6.036555E-01 +-6.036555E-01 1.190329E-01 -3.149976E-01 5.735264E-02 --8.456340E-02 +8.456340E-02 4.563143E-03 2.224065E-01 6.600030E-02 -9.562392E-03 +-9.562392E-03 1.843524E-02 -2.400599E-01 3.182217E-02 --6.534941E-01 +6.534941E-01 1.180315E-01 4.371157E-01 9.076666E-02 -3.257455E-02 +-3.257455E-02 2.936184E-02 -8.788428E-02 1.923293E-02 --2.604776E-01 +2.604776E-01 3.660313E-02 -6.315350E-02 1.503534E-02 -5.609294E-01 +-5.609294E-01 8.783528E-02 -7.363672E-01 1.789210E-01 -2.883575E-01 +-2.883575E-01 6.478578E-02 -3.302954E-02 1.517946E-02 --3.234157E-01 +3.234157E-01 4.418920E-02 2.846318E-01 2.712085E-02 --3.227536E-01 +3.227536E-01 5.062832E-02 4.391474E-01 5.548002E-02 -1.322988E-01 +-1.322988E-01 2.995854E-02 5.709679E+01 6.978668E+02 -2.859201E-02 +-2.859201E-02 1.094507E+00 6.058587E-01 6.079927E-01 -7.553798E-02 +-7.553798E-02 1.131607E+00 -5.851206E-01 1.215663E+00 -8.266012E-02 +-8.266012E-02 9.031287E-01 -7.088368E-01 3.984608E-01 --4.414986E-01 +4.414986E-01 1.502417E-01 2.241998E-01 3.228823E-01 --7.328574E-01 +7.328574E-01 2.430448E-01 -8.070160E-01 1.767265E-01 --1.154449E-01 +1.154449E-01 8.739303E-03 -3.787161E-01 4.728756E-01 --1.743577E-01 +1.743577E-01 1.091245E-01 2.878137E-01 2.724285E-01 -2.128994E-01 +-2.128994E-01 4.440539E-01 9.495567E-01 3.622719E-01 -1.422950E-01 +-1.422950E-01 5.309223E-02 1.323659E-01 1.911979E-01 --1.303752E-01 +1.303752E-01 5.710728E-01 -4.611294E-02 4.086632E-02 -5.937879E-01 +-5.937879E-01 1.006156E-01 -3.558925E-01 2.998983E-01 -1.175971E+00 +-1.175971E+00 5.323321E-01 2.426485E-01 1.497265E-01 -7.805090E-02 +-7.805090E-02 5.060214E-02 -2.914577E-01 2.233355E-01 -1.053098E-01 +-1.053098E-01 6.693123E-02 4.541315E-01 1.328340E-01 --6.290732E-02 +6.290732E-02 8.910616E-02 7.371592E-01 1.980732E-01 -5.804701E-01 +-5.804701E-01 1.711949E-01 -6.642202E-01 1.131866E-01 -1.779818E-01 +-1.779818E-01 6.530190E-02 -5.224739E-01 2.534102E-01 --1.824905E-01 +1.824905E-01 2.910309E-02 diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index cdf051ee75..62d317bb5b 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -6,33 +6,33 @@ tally 1: tally 2: 3.353000E+01 1.133379E+02 -4.293226E-01 +-4.293226E-01 6.259462E-02 -2.011041E-02 5.388144E-02 -3.900136E-01 +-3.900136E-01 5.873137E-02 6.150213E-02 9.043796E-03 -5.518583E-02 +-5.518583E-02 1.739087E-02 -2.047987E-01 1.993679E-02 -6.710345E-02 +-6.710345E-02 1.652573E-02 -3.619254E-02 1.598186E-02 -3.551558E-02 +-3.551558E-02 9.077346E-03 1.044669E-01 2.082961E-03 --3.782063E-02 +3.782063E-02 1.681459E-02 1.752386E-01 1.411429E-02 --3.289649E-02 +3.289649E-02 9.534958E-03 5.252770E-02 7.518445E-03 -2.688056E-02 +-2.688056E-02 3.397824E-03 diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 9df7ea42a7..89877de5a7 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -6,51 +6,51 @@ tally 1: tally 2: 1.169000E+01 2.915330E+01 --2.198379E-01 +2.198379E-01 2.828670E-02 -1.317276E-01 9.568596E-03 -8.309792E-02 +-8.309792E-02 1.155410E-02 -2.288506E-02 3.710542E-03 --2.720674E-02 +2.720674E-02 1.789163E-03 -1.323964E-02 1.819112E-04 -8.941597E-02 +-8.941597E-02 4.265616E-03 1.516805E-01 1.332526E-02 --1.832782E-02 +1.832782E-02 6.611171E-03 1.311371E-02 2.840648E-03 -3.728365E-02 +-3.728365E-02 2.866806E-03 -5.100587E-02 2.957146E-03 -3.388028E-02 +-3.388028E-02 2.481570E-03 -7.766921E-02 3.129377E-03 -1.666131E-02 +-1.666131E-02 3.828290E-03 8.102553E-02 2.118169E-03 -6.303084E-03 +-6.303084E-03 7.156173E-04 -2.083478E-03 2.683340E-03 -6.794806E-03 +-6.794806E-03 3.912783E-04 1.005390E-01 2.920205E-03 --5.332517E-02 +5.332517E-02 2.205372E-03 -1.584725E-02 8.984498E-04 -3.486904E-02 +-3.486904E-02 6.448722E-04 -2.420912E-02 6.352276E-04 diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index 28a4b1627e..f037648d8c 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -112,101 +112,101 @@ tally 2: 0.000000E+00 7.812543E-01 1.349265E-01 --7.005988E-03 +7.005988E-03 2.198486E-04 3.237937E-02 7.569491E-04 --3.865436E-04 +3.865436E-04 4.048167E-04 -1.003877E-02 3.195619E-04 -3.738815E-03 +-3.738815E-03 3.506174E-04 -2.549288E-02 3.086810E-04 -1.693002E-02 +-1.693002E-02 1.255885E-04 3.059341E-03 1.971678E-04 -9.247344E-03 +-9.247344E-03 2.402855E-04 6.618469E-04 1.639025E-04 -1.992953E-02 +-1.992953E-02 1.365376E-04 3.262256E-03 1.341040E-05 -2.864166E-03 +-2.864166E-03 4.394787E-05 1.494351E-03 1.001007E-04 --1.091424E-02 +1.091424E-02 1.221030E-04 9.875992E-03 1.141979E-04 -1.263647E-02 +-1.263647E-02 2.400023E-04 -2.944398E-03 1.246417E-04 -1.970051E-03 +-1.970051E-03 1.600160E-04 6.148931E-03 4.774182E-05 -1.107728E-02 +-1.107728E-02 1.095420E-04 1.382599E-02 1.537793E-04 --1.296297E-02 +1.296297E-02 1.392028E-04 -1.479385E-02 1.650074E-04 1.423676E+01 4.330937E+01 --2.802155E-01 +2.802155E-01 3.016146E-02 -8.009314E-02 4.251899E-02 --7.383773E-02 +7.383773E-02 1.547362E-02 -1.274422E-01 2.290306E-02 -1.370426E-01 +-1.370426E-01 1.002935E-02 -2.607280E-01 3.414307E-02 -1.497421E-02 +-1.497421E-02 2.944540E-03 -2.866477E-02 9.113662E-03 --3.949118E-02 +3.949118E-02 4.437767E-03 2.283116E-01 1.792907E-02 -1.334103E-01 +-1.334103E-01 1.587762E-02 -3.139096E-01 2.330713E-02 -1.025884E-03 +-1.025884E-03 5.754195E-03 1.099489E-01 1.861634E-02 --7.863729E-02 +7.863729E-02 2.276108E-02 1.219111E-01 1.363203E-02 --1.261893E-01 +1.261893E-01 1.937908E-02 -1.995428E-01 1.383344E-02 -8.803472E-02 +-8.803472E-02 3.742219E-03 1.501143E-01 1.288322E-02 -4.522115E-02 +-4.522115E-02 8.283014E-03 1.113588E-01 8.523967E-03 --1.820582E-01 +1.820582E-01 1.648932E-02 -1.121108E-01 1.059879E-02 @@ -262,51 +262,51 @@ tally 2: 0.000000E+00 2.914798E+00 1.831649E+00 --3.213884E-02 +3.213884E-02 1.391026E-03 -1.124311E-02 2.059984E-03 --1.372399E-02 +1.372399E-02 2.990198E-03 -6.931800E-03 1.073303E-03 --5.448993E-03 +5.448993E-03 3.542504E-04 -7.264172E-02 1.742045E-03 -1.526380E-02 +-1.526380E-02 5.962297E-04 1.576474E-02 5.335071E-04 -2.028206E-02 +-2.028206E-02 2.915489E-04 4.014298E-02 4.285950E-04 -8.228146E-03 +-8.228146E-03 6.388002E-04 -8.183952E-02 2.031634E-03 -1.014523E-02 +-1.014523E-02 1.159653E-03 9.321030E-03 7.480844E-04 --3.156017E-02 +3.156017E-02 2.064357E-03 3.606483E-02 4.060244E-04 --3.866234E-02 +3.866234E-02 1.046100E-03 -5.723297E-02 1.042437E-03 -2.894838E-02 +-2.894838E-02 2.922848E-04 -1.529225E-03 2.472179E-04 -9.484410E-03 +-9.484410E-03 4.172637E-04 -4.442548E-04 2.518508E-04 --3.065480E-02 +3.065480E-02 3.571846E-04 -6.519117E-03 1.779322E-04 @@ -362,51 +362,51 @@ tally 2: 0.000000E+00 4.088282E+01 3.662539E+02 --9.859591E-01 +9.859591E-01 2.743013E-01 2.392244E-01 3.795971E-01 --3.389717E-01 +3.389717E-01 7.054539E-01 -1.673679E-01 1.081377E-01 -2.918680E-01 +-2.918680E-01 7.161035E-02 -5.627453E-01 9.124299E-02 -7.185542E-01 +-7.185542E-01 2.062140E-01 8.533956E-02 3.649126E-02 -7.630639E-02 +-7.630639E-02 1.623523E-02 3.785290E-02 4.181389E-02 -1.388919E-01 +-1.388919E-01 1.307834E-01 -2.682812E-01 6.653584E-02 -7.151084E-02 +-7.151084E-02 3.466772E-02 6.941393E-02 2.821800E-02 -2.392050E-02 +-2.392050E-02 1.132504E-01 3.749985E-01 8.337209E-02 --2.998887E-01 +2.998887E-01 6.767226E-02 -3.629285E-01 7.246083E-02 -3.989685E-01 +-3.989685E-01 4.378581E-02 1.330115E-01 2.634398E-02 -2.649739E-01 +-2.649739E-01 4.300042E-02 5.793351E-01 7.399884E-02 --2.236528E-01 +2.236528E-01 3.130205E-02 -3.695818E-01 4.703480E-02 @@ -513,101 +513,101 @@ tally 3: 0.000000E+00 7.200000E-01 1.152000E-01 --9.800486E-03 +9.800486E-03 5.637123E-04 -2.018554E-02 4.617738E-04 --6.271657E-03 +6.271657E-03 8.252833E-04 -8.231683E-03 3.035447E-03 --2.566508E-02 +2.566508E-02 1.108829E-03 2.748466E-03 1.641191E-03 -6.833190E-03 +-6.833190E-03 5.993876E-04 3.392213E-02 2.143714E-03 -3.105616E-02 +-3.105616E-02 1.012625E-03 -5.473567E-02 1.615531E-03 --1.435523E-02 +1.435523E-02 1.095690E-03 4.579564E-03 6.451444E-04 --1.570409E-02 +1.570409E-02 3.833387E-04 1.633422E-02 2.144997E-03 --7.438775E-03 +7.438775E-03 6.441846E-04 5.440025E-04 1.290719E-04 --1.687899E-02 +1.687899E-02 1.606230E-03 3.315902E-02 1.061759E-03 --1.184684E-02 +1.184684E-02 4.312573E-04 -4.732586E-02 1.387994E-03 --1.563538E-02 +1.563538E-02 3.316015E-04 3.681927E-02 5.403320E-04 -2.928507E-03 +-2.928507E-03 5.761742E-04 -3.519362E-02 6.725185E-04 1.372000E+01 4.018980E+01 --2.015212E-01 +2.015212E-01 1.072884E-01 -2.606953E-01 4.894468E-02 -7.537153E-02 +-7.537153E-02 2.216346E-02 -3.818524E-02 6.301675E-02 -2.386335E-01 +-2.386335E-01 1.931104E-02 -1.872805E-02 1.265896E-02 -3.732943E-02 +-3.732943E-02 2.347696E-02 -8.857050E-02 1.636275E-02 --1.718450E-01 +1.718450E-01 1.043488E-02 1.526226E-01 2.435399E-02 -7.344765E-02 +-7.344765E-02 1.541644E-02 -9.819186E-03 1.473467E-02 --8.215914E-03 +8.215914E-03 1.463085E-02 2.197504E-01 2.244815E-02 -2.521002E-02 +-2.521002E-02 8.206540E-03 3.677974E-01 3.982027E-02 --1.934606E-01 +1.934606E-01 3.440019E-02 1.050141E-01 2.346980E-02 -2.458487E-01 +-2.458487E-01 1.861429E-02 4.226131E-02 2.690841E-03 -3.174234E-02 +-3.174234E-02 1.867018E-02 2.284995E-01 1.190246E-02 --7.894573E-03 +7.894573E-03 3.715471E-03 -1.593928E-01 1.391828E-02 @@ -663,51 +663,51 @@ tally 3: 0.000000E+00 3.200000E+00 2.342600E+00 --2.991985E-01 +2.991985E-01 1.868406E-02 4.460301E-02 4.132113E-03 --2.190630E-02 +2.190630E-02 1.023889E-02 -3.265764E-02 2.060374E-03 -3.491521E-02 +-3.491521E-02 4.785957E-04 -3.623623E-02 5.929111E-04 --4.962268E-02 +4.962268E-02 1.814245E-03 1.406439E-01 1.174445E-02 --9.433277E-02 +9.433277E-02 5.036897E-03 9.058176E-02 3.871598E-03 --1.409089E-01 +1.409089E-01 6.665385E-03 -1.062337E-01 4.771650E-03 -1.155280E-01 +-1.155280E-01 8.020320E-03 8.348336E-02 1.633941E-03 -1.475434E-02 +-1.475434E-02 3.411046E-03 4.474425E-03 6.049348E-03 -6.716359E-03 +-6.716359E-03 2.898000E-03 -3.674047E-02 2.971797E-03 --2.368070E-02 +2.368070E-02 9.474965E-04 -6.109826E-02 4.846201E-03 --5.076118E-02 +5.076118E-02 8.354393E-03 -1.763594E-02 1.017310E-03 --2.941064E-02 +2.941064E-02 1.044916E-03 -5.631429E-03 3.915186E-03 @@ -763,51 +763,51 @@ tally 3: 0.000000E+00 4.104000E+01 3.668254E+02 --7.832373E-01 +7.832373E-01 3.913941E-01 2.281642E-01 2.669856E-01 --3.731272E-01 +3.731272E-01 6.152809E-01 -3.232973E-01 7.526283E-02 -3.686513E-01 +-3.686513E-01 9.047618E-02 -6.018185E-01 9.140623E-02 -3.848843E-01 +-3.848843E-01 3.431711E-01 3.397425E-03 8.879103E-02 --2.471531E-02 +2.471531E-02 5.561795E-02 1.373897E-01 7.288680E-02 -1.816888E-01 +-1.816888E-01 5.419638E-02 -3.504404E-01 1.461853E-01 -1.225356E-01 +-1.225356E-01 3.443595E-02 -3.109887E-01 5.492397E-02 --3.542105E-01 +3.542105E-01 6.530224E-02 2.104218E-01 4.093872E-02 -2.661467E-02 +-2.661467E-02 3.058847E-02 -3.744331E-01 6.755739E-02 -1.391218E-01 +-1.391218E-01 4.432842E-02 1.622041E-01 6.843992E-03 -4.149973E-02 +-4.149973E-02 1.782398E-02 2.551752E-01 2.626972E-02 --4.706697E-01 +4.706697E-01 9.193926E-02 -1.287882E-01 3.489982E-02 @@ -914,101 +914,101 @@ tally 4: 0.000000E+00 7.652157E-01 1.242826E-01 --1.008373E-02 +1.008373E-02 5.281691E-04 -1.014715E-02 2.749212E-04 --2.506414E-02 +2.506414E-02 2.613512E-04 4.320187E-03 4.316562E-04 -1.439246E-02 +-1.439246E-02 9.138575E-05 -1.532539E-02 2.360878E-04 -9.963404E-03 +-9.963404E-03 1.511695E-04 -6.314554E-03 2.742799E-05 -7.969329E-03 +-7.969329E-03 1.380329E-04 -1.298431E-03 3.287236E-04 -1.441639E-02 +-1.441639E-02 1.409552E-04 6.516689E-03 2.511011E-04 -1.294596E-02 +-1.294596E-02 2.249729E-04 6.983038E-03 6.334969E-05 --1.086161E-02 +1.086161E-02 1.140033E-04 2.217006E-02 4.221807E-04 --6.503276E-03 +6.503276E-03 2.028281E-04 2.915180E-02 3.659182E-04 --9.080091E-03 +9.080091E-03 1.503808E-04 -6.476980E-04 1.927326E-04 --1.549603E-02 +1.549603E-02 3.445843E-04 2.957508E-02 1.835035E-04 -6.982790E-03 +-6.982790E-03 1.237342E-04 -2.653281E-02 2.606704E-04 1.372000E+01 4.018980E+01 --2.015212E-01 +2.015212E-01 1.072884E-01 -2.606953E-01 4.894468E-02 -7.537153E-02 +-7.537153E-02 2.216346E-02 -3.818524E-02 6.301675E-02 -2.386335E-01 +-2.386335E-01 1.931104E-02 -1.872805E-02 1.265896E-02 -3.732943E-02 +-3.732943E-02 2.347696E-02 -8.857050E-02 1.636275E-02 --1.718450E-01 +1.718450E-01 1.043488E-02 1.526226E-01 2.435399E-02 -7.344765E-02 +-7.344765E-02 1.541644E-02 -9.819186E-03 1.473467E-02 --8.215914E-03 +8.215914E-03 1.463085E-02 2.197504E-01 2.244815E-02 -2.521002E-02 +-2.521002E-02 8.206540E-03 3.677974E-01 3.982027E-02 --1.934606E-01 +1.934606E-01 3.440019E-02 1.050141E-01 2.346980E-02 -2.458487E-01 +-2.458487E-01 1.861429E-02 4.226131E-02 2.690841E-03 -3.174234E-02 +-3.174234E-02 1.867018E-02 2.284995E-01 1.190246E-02 --7.894573E-03 +7.894573E-03 3.715471E-03 -1.593928E-01 1.391828E-02 @@ -1064,51 +1064,51 @@ tally 4: 0.000000E+00 3.200000E+00 2.342600E+00 --2.991985E-01 +2.991985E-01 1.868406E-02 4.460301E-02 4.132113E-03 --2.190630E-02 +2.190630E-02 1.023889E-02 -3.265764E-02 2.060374E-03 -3.491521E-02 +-3.491521E-02 4.785957E-04 -3.623623E-02 5.929111E-04 --4.962268E-02 +4.962268E-02 1.814245E-03 1.406439E-01 1.174445E-02 --9.433277E-02 +9.433277E-02 5.036897E-03 9.058176E-02 3.871598E-03 --1.409089E-01 +1.409089E-01 6.665385E-03 -1.062337E-01 4.771650E-03 -1.155280E-01 +-1.155280E-01 8.020320E-03 8.348336E-02 1.633941E-03 -1.475434E-02 +-1.475434E-02 3.411046E-03 4.474425E-03 6.049348E-03 -6.716359E-03 +-6.716359E-03 2.898000E-03 -3.674047E-02 2.971797E-03 --2.368070E-02 +2.368070E-02 9.474965E-04 -6.109826E-02 4.846201E-03 --5.076118E-02 +5.076118E-02 8.354393E-03 -1.763594E-02 1.017310E-03 --2.941064E-02 +2.941064E-02 1.044916E-03 -5.631429E-03 3.915186E-03 @@ -1164,51 +1164,51 @@ tally 4: 0.000000E+00 4.104000E+01 3.668254E+02 --7.832373E-01 +7.832373E-01 3.913941E-01 2.281642E-01 2.669856E-01 --3.731272E-01 +3.731272E-01 6.152809E-01 -3.232973E-01 7.526283E-02 -3.686513E-01 +-3.686513E-01 9.047618E-02 -6.018185E-01 9.140623E-02 -3.848843E-01 +-3.848843E-01 3.431711E-01 3.397425E-03 8.879103E-02 --2.471531E-02 +2.471531E-02 5.561795E-02 1.373897E-01 7.288680E-02 -1.816888E-01 +-1.816888E-01 5.419638E-02 -3.504404E-01 1.461853E-01 -1.225356E-01 +-1.225356E-01 3.443595E-02 -3.109887E-01 5.492397E-02 --3.542105E-01 +3.542105E-01 6.530224E-02 2.104218E-01 4.093872E-02 -2.661467E-02 +-2.661467E-02 3.058847E-02 -3.744331E-01 6.755739E-02 -1.391218E-01 +-1.391218E-01 4.432842E-02 1.622041E-01 6.843992E-03 -4.149973E-02 +-4.149973E-02 1.782398E-02 2.551752E-01 2.626972E-02 --4.706697E-01 +4.706697E-01 9.193926E-02 -1.287882E-01 3.489982E-02 From 991b3380f614e830630349b685415d898855dc0d Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 3 Oct 2015 10:45:06 -0400 Subject: [PATCH 266/519] removed extra comment from math.f90 --- src/math.F90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/math.F90 b/src/math.F90 index 51fcf36393..6b96baa0d9 100644 --- a/src/math.F90 +++ b/src/math.F90 @@ -555,8 +555,6 @@ contains rn = ONE end select - ! rn = rn * sin(phi) - end function calc_rn !=============================================================================== From 03a8fb64e6d8b54a4b24dbc2c9057fcdae7f9395 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 3 Oct 2015 11:28:36 -0400 Subject: [PATCH 267/519] Address @paulromano comments on #469 --- tests/test_basic/test_basic.py | 1 - tests/test_cmfd_feed/test_cmfd_feed.py | 1 - tests/test_cmfd_nofeed/test_cmfd_nofeed.py | 1 - tests/test_confidence_intervals/test_confidence_intervals.py | 1 - tests/test_density_atombcm/test_density_atombcm.py | 1 - tests/test_density_atomcm3/test_density_atomcm3.py | 1 - tests/test_density_kgm3/test_density_kgm3.py | 1 - tests/test_density_sum/test_density_sum.py | 1 - .../test_eigenvalue_genperbatch.py | 1 - .../test_eigenvalue_no_inactive.py | 1 - tests/test_energy_grid/test_energy_grid.py | 1 - tests/test_entropy/test_entropy.py | 1 - tests/test_filter_cell/test_filter_cell.py | 5 ++--- tests/test_filter_cellborn/test_filter_cellborn.py | 5 ++--- tests/test_filter_distribcell/test_filter_distribcell.py | 1 - tests/test_filter_energy/test_filter_energy.py | 5 ++--- tests/test_filter_energyout/test_filter_energyout.py | 5 ++--- .../test_filter_group_transfer/test_filter_group_transfer.py | 5 ++--- tests/test_filter_material/test_filter_material.py | 5 ++--- tests/test_filter_mesh_2d/test_filter_mesh_2d.py | 1 - tests/test_filter_mesh_3d/test_filter_mesh_3d.py | 1 - tests/test_filter_universe/test_filter_universe.py | 5 ++--- tests/test_fixed_source/test_fixed_source.py | 1 - tests/test_infinite_cell/test_infinite_cell.py | 1 - tests/test_lattice/test_lattice.py | 1 - tests/test_lattice_hex/test_lattice_hex.py | 1 - tests/test_lattice_mixed/test_lattice_mixed.py | 1 - tests/test_lattice_multiple/test_lattice_multiple.py | 1 - tests/test_many_scores/test_many_scores.py | 1 - tests/test_natural_element/test_natural_element.py | 1 - tests/test_output/test_output.py | 1 - .../test_particle_restart_eigval.py | 1 - .../test_particle_restart_fixed.py | 1 - tests/test_plot_background/test_plot_background.py | 1 - tests/test_plot_basis/test_plot_basis.py | 1 - tests/test_plot_colspec/test_plot_colspec.py | 1 - tests/test_plot_mask/test_plot_mask.py | 1 - tests/test_ptables_off/test_ptables_off.py | 1 - tests/test_reflective_cone/test_reflective_cone.py | 1 - tests/test_reflective_cylinder/test_reflective_cylinder.py | 1 - tests/test_reflective_plane/test_reflective_plane.py | 1 - tests/test_reflective_sphere/test_reflective_sphere.py | 1 - tests/test_resonance_scattering/test_resonance_scattering.py | 1 - tests/test_rotation/test_rotation.py | 1 - tests/test_salphabeta/test_salphabeta.py | 1 - tests/test_salphabeta_multiple/test_salphabeta_multiple.py | 1 - tests/test_score_MT/test_score_MT.py | 5 ++--- tests/test_score_absorption/test_score_absorption.py | 5 ++--- tests/test_score_current/test_score_current.py | 1 - tests/test_score_events/test_score_events.py | 5 ++--- tests/test_score_fission/test_score_fission.py | 5 ++--- tests/test_score_flux/test_score_flux.py | 5 ++--- tests/test_score_flux_yn/test_score_flux_yn.py | 5 ++--- tests/test_score_kappafission/test_score_kappafission.py | 5 ++--- tests/test_score_nufission/test_score_nufission.py | 5 ++--- tests/test_score_nuscatter/test_score_nuscatter.py | 3 +-- tests/test_score_nuscatter_n/test_score_nuscatter_n.py | 3 +-- tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py | 3 +-- tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py | 3 +-- tests/test_score_scatter/test_score_scatter.py | 5 ++--- tests/test_score_scatter_n/test_score_scatter_n.py | 5 ++--- tests/test_score_scatter_pn/test_score_scatter_pn.py | 5 ++--- tests/test_score_scatter_yn/test_score_scatter_yn.py | 5 ++--- tests/test_score_total/test_score_total.py | 5 ++--- tests/test_score_total_yn/test_score_total_yn.py | 5 ++--- tests/test_seed/test_seed.py | 1 - tests/test_source_angle_mono/test_source_angle_mono.py | 1 - .../test_source_energy_maxwell/test_source_energy_maxwell.py | 1 - tests/test_source_energy_mono/test_source_energy_mono.py | 1 - tests/test_source_file/test_source_file.py | 1 - tests/test_source_point/test_source_point.py | 1 - tests/test_sourcepoint_batch/test_sourcepoint_batch.py | 1 - tests/test_sourcepoint_interval/test_sourcepoint_interval.py | 1 - tests/test_sourcepoint_latest/test_sourcepoint_latest.py | 1 - tests/test_sourcepoint_restart/test_sourcepoint_restart.py | 1 - tests/test_statepoint_batch/test_statepoint_batch.py | 1 - tests/test_statepoint_interval/test_statepoint_interval.py | 1 - tests/test_statepoint_restart/test_statepoint_restart.py | 1 - tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py | 1 - tests/test_survival_biasing/test_survival_biasing.py | 1 - tests/test_tally_assumesep/test_tally_assumesep.py | 1 - tests/test_tally_nuclides/test_tally_nuclides.py | 1 - tests/test_trace/test_trace.py | 1 - tests/test_track_output/test_track_output.py | 1 - tests/test_translation/test_translation.py | 1 - .../test_trigger_batch_interval.py | 1 - .../test_trigger_no_batch_interval.py | 1 - tests/test_trigger_no_status/test_trigger_no_status.py | 1 - tests/test_trigger_tallies/test_trigger_tallies.py | 1 - tests/test_uniform_fs/test_uniform_fs.py | 1 - tests/test_union_energy_grids/test_union_energy_grids.py | 1 - tests/test_universe/test_universe.py | 1 - tests/test_void/test_void.py | 1 - tests/testing_harness.py | 2 +- 94 files changed, 47 insertions(+), 140 deletions(-) diff --git a/tests/test_basic/test_basic.py b/tests/test_basic/test_basic.py index 835bf91c7b..2a595f3e66 100755 --- a/tests/test_basic/test_basic.py +++ b/tests/test_basic/test_basic.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_cmfd_feed/test_cmfd_feed.py b/tests/test_cmfd_feed/test_cmfd_feed.py index af1f0542d4..3bc5f61743 100644 --- a/tests/test_cmfd_feed/test_cmfd_feed.py +++ b/tests/test_cmfd_feed/test_cmfd_feed.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import CMFDTestHarness diff --git a/tests/test_cmfd_nofeed/test_cmfd_nofeed.py b/tests/test_cmfd_nofeed/test_cmfd_nofeed.py index af1f0542d4..3bc5f61743 100644 --- a/tests/test_cmfd_nofeed/test_cmfd_nofeed.py +++ b/tests/test_cmfd_nofeed/test_cmfd_nofeed.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import CMFDTestHarness diff --git a/tests/test_confidence_intervals/test_confidence_intervals.py b/tests/test_confidence_intervals/test_confidence_intervals.py index 67227ca324..ed6addec45 100755 --- a/tests/test_confidence_intervals/test_confidence_intervals.py +++ b/tests/test_confidence_intervals/test_confidence_intervals.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_atombcm/test_density_atombcm.py b/tests/test_density_atombcm/test_density_atombcm.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_density_atombcm/test_density_atombcm.py +++ b/tests/test_density_atombcm/test_density_atombcm.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_atomcm3/test_density_atomcm3.py b/tests/test_density_atomcm3/test_density_atomcm3.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_density_atomcm3/test_density_atomcm3.py +++ b/tests/test_density_atomcm3/test_density_atomcm3.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_kgm3/test_density_kgm3.py b/tests/test_density_kgm3/test_density_kgm3.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_density_kgm3/test_density_kgm3.py +++ b/tests/test_density_kgm3/test_density_kgm3.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_density_sum/test_density_sum.py b/tests/test_density_sum/test_density_sum.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_density_sum/test_density_sum.py +++ b/tests/test_density_sum/test_density_sum.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py b/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py index 3b0d22b9ea..d6f69fdbb5 100644 --- a/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py +++ b/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py b/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py +++ b/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_energy_grid/test_energy_grid.py b/tests/test_energy_grid/test_energy_grid.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_energy_grid/test_energy_grid.py +++ b/tests/test_energy_grid/test_energy_grid.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_entropy/test_entropy.py b/tests/test_entropy/test_entropy.py index 1af8945e34..113cafcb27 100644 --- a/tests/test_entropy/test_entropy.py +++ b/tests/test_entropy/test_entropy.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness from openmc.statepoint import StatePoint diff --git a/tests/test_filter_cell/test_filter_cell.py b/tests/test_filter_cell/test_filter_cell.py index 767007d7ab..d532d59cf8 100644 --- a/tests/test_filter_cell/test_filter_cell.py +++ b/tests/test_filter_cell/test_filter_cell.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -17,10 +16,10 @@ class FilterCellTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterCellTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterCellTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_filter_cellborn/test_filter_cellborn.py b/tests/test_filter_cellborn/test_filter_cellborn.py index 14b50137eb..2fac6a1fcd 100644 --- a/tests/test_filter_cellborn/test_filter_cellborn.py +++ b/tests/test_filter_cellborn/test_filter_cellborn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -17,10 +16,10 @@ class FilterCellbornTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterCellbornTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterCellbornTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_filter_distribcell/test_filter_distribcell.py b/tests/test_filter_distribcell/test_filter_distribcell.py index a0ed938ba3..872d29552b 100644 --- a/tests/test_filter_distribcell/test_filter_distribcell.py +++ b/tests/test_filter_distribcell/test_filter_distribcell.py @@ -5,7 +5,6 @@ import hashlib import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import * diff --git a/tests/test_filter_energy/test_filter_energy.py b/tests/test_filter_energy/test_filter_energy.py index 55e7e55c65..54d1dd4b7f 100644 --- a/tests/test_filter_energy/test_filter_energy.py +++ b/tests/test_filter_energy/test_filter_energy.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -18,10 +17,10 @@ class FilterEnergyTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterEnergyTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterEnergyTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_filter_energyout/test_filter_energyout.py b/tests/test_filter_energyout/test_filter_energyout.py index d1fda4e0da..43a8c7d5a9 100644 --- a/tests/test_filter_energyout/test_filter_energyout.py +++ b/tests/test_filter_energyout/test_filter_energyout.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -18,10 +17,10 @@ class FilterEnergyoutTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterEnergyoutTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterEnergyoutTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_filter_group_transfer/test_filter_group_transfer.py b/tests/test_filter_group_transfer/test_filter_group_transfer.py index fcffc45d11..cbea5e0a7f 100644 --- a/tests/test_filter_group_transfer/test_filter_group_transfer.py +++ b/tests/test_filter_group_transfer/test_filter_group_transfer.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -22,10 +21,10 @@ class FilterGroupTransferTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterGroupTransferTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterGroupTransferTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_filter_material/test_filter_material.py b/tests/test_filter_material/test_filter_material.py index 8d66e822eb..8e42d8c9a2 100644 --- a/tests/test_filter_material/test_filter_material.py +++ b/tests/test_filter_material/test_filter_material.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -17,10 +16,10 @@ class FilterMaterialTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterMaterialTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterMaterialTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_filter_mesh_2d/test_filter_mesh_2d.py b/tests/test_filter_mesh_2d/test_filter_mesh_2d.py index 67227ca324..ed6addec45 100644 --- a/tests/test_filter_mesh_2d/test_filter_mesh_2d.py +++ b/tests/test_filter_mesh_2d/test_filter_mesh_2d.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_filter_mesh_3d/test_filter_mesh_3d.py b/tests/test_filter_mesh_3d/test_filter_mesh_3d.py index 67227ca324..ed6addec45 100644 --- a/tests/test_filter_mesh_3d/test_filter_mesh_3d.py +++ b/tests/test_filter_mesh_3d/test_filter_mesh_3d.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_filter_universe/test_filter_universe.py b/tests/test_filter_universe/test_filter_universe.py index 1bd62d0b27..00dd166196 100644 --- a/tests/test_filter_universe/test_filter_universe.py +++ b/tests/test_filter_universe/test_filter_universe.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -17,10 +16,10 @@ class FilterUniverseTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(tally) - PyAPITestHarness._build_inputs(self) + super(FilterUniverseTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(FilterUniverseTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index 2a41345f6a..12dbb8d769 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -5,7 +5,6 @@ import os import sys import numpy as np sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness from openmc.statepoint import StatePoint diff --git a/tests/test_infinite_cell/test_infinite_cell.py b/tests/test_infinite_cell/test_infinite_cell.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_infinite_cell/test_infinite_cell.py +++ b/tests/test_infinite_cell/test_infinite_cell.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice/test_lattice.py b/tests/test_lattice/test_lattice.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_lattice/test_lattice.py +++ b/tests/test_lattice/test_lattice.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice_hex/test_lattice_hex.py b/tests/test_lattice_hex/test_lattice_hex.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_lattice_hex/test_lattice_hex.py +++ b/tests/test_lattice_hex/test_lattice_hex.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice_mixed/test_lattice_mixed.py b/tests/test_lattice_mixed/test_lattice_mixed.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_lattice_mixed/test_lattice_mixed.py +++ b/tests/test_lattice_mixed/test_lattice_mixed.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_lattice_multiple/test_lattice_multiple.py b/tests/test_lattice_multiple/test_lattice_multiple.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_lattice_multiple/test_lattice_multiple.py +++ b/tests/test_lattice_multiple/test_lattice_multiple.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_many_scores/test_many_scores.py b/tests/test_many_scores/test_many_scores.py index 4518fc3637..88c3bdfb3d 100644 --- a/tests/test_many_scores/test_many_scores.py +++ b/tests/test_many_scores/test_many_scores.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_natural_element/test_natural_element.py b/tests/test_natural_element/test_natural_element.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_natural_element/test_natural_element.py +++ b/tests/test_natural_element/test_natural_element.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_output/test_output.py b/tests/test_output/test_output.py index 007d3952de..8e36ead808 100644 --- a/tests/test_output/test_output.py +++ b/tests/test_output/test_output.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py index 38441f1529..139cb2b9f5 100644 --- a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py +++ b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import ParticleRestartTestHarness diff --git a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py index dd74fa4f5b..5af7454894 100644 --- a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py +++ b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import ParticleRestartTestHarness diff --git a/tests/test_plot_background/test_plot_background.py b/tests/test_plot_background/test_plot_background.py index b769f2d3dc..7890eca19d 100644 --- a/tests/test_plot_background/test_plot_background.py +++ b/tests/test_plot_background/test_plot_background.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_basis/test_plot_basis.py b/tests/test_plot_basis/test_plot_basis.py index 34b7486247..d45479e256 100644 --- a/tests/test_plot_basis/test_plot_basis.py +++ b/tests/test_plot_basis/test_plot_basis.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_colspec/test_plot_colspec.py b/tests/test_plot_colspec/test_plot_colspec.py index b769f2d3dc..7890eca19d 100644 --- a/tests/test_plot_colspec/test_plot_colspec.py +++ b/tests/test_plot_colspec/test_plot_colspec.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_mask/test_plot_mask.py b/tests/test_plot_mask/test_plot_mask.py index 34b7486247..d45479e256 100644 --- a/tests/test_plot_mask/test_plot_mask.py +++ b/tests/test_plot_mask/test_plot_mask.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import PlotTestHarness diff --git a/tests/test_ptables_off/test_ptables_off.py b/tests/test_ptables_off/test_ptables_off.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_ptables_off/test_ptables_off.py +++ b/tests/test_ptables_off/test_ptables_off.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_cone/test_reflective_cone.py b/tests/test_reflective_cone/test_reflective_cone.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_reflective_cone/test_reflective_cone.py +++ b/tests/test_reflective_cone/test_reflective_cone.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_cylinder/test_reflective_cylinder.py b/tests/test_reflective_cylinder/test_reflective_cylinder.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_reflective_cylinder/test_reflective_cylinder.py +++ b/tests/test_reflective_cylinder/test_reflective_cylinder.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_plane/test_reflective_plane.py b/tests/test_reflective_plane/test_reflective_plane.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_reflective_plane/test_reflective_plane.py +++ b/tests/test_reflective_plane/test_reflective_plane.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_reflective_sphere/test_reflective_sphere.py b/tests/test_reflective_sphere/test_reflective_sphere.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_reflective_sphere/test_reflective_sphere.py +++ b/tests/test_reflective_sphere/test_reflective_sphere.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_resonance_scattering/test_resonance_scattering.py b/tests/test_resonance_scattering/test_resonance_scattering.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_resonance_scattering/test_resonance_scattering.py +++ b/tests/test_resonance_scattering/test_resonance_scattering.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_rotation/test_rotation.py b/tests/test_rotation/test_rotation.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_rotation/test_rotation.py +++ b/tests/test_rotation/test_rotation.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_salphabeta/test_salphabeta.py b/tests/test_salphabeta/test_salphabeta.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_salphabeta/test_salphabeta.py +++ b/tests/test_salphabeta/test_salphabeta.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_salphabeta_multiple/test_salphabeta_multiple.py b/tests/test_salphabeta_multiple/test_salphabeta_multiple.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_salphabeta_multiple/test_salphabeta_multiple.py +++ b/tests/test_salphabeta_multiple/test_salphabeta_multiple.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_score_MT/test_score_MT.py b/tests/test_score_MT/test_score_MT.py index a944771f3b..dae86d418c 100644 --- a/tests/test_score_MT/test_score_MT.py +++ b/tests/test_score_MT/test_score_MT.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -23,10 +22,10 @@ class ScoreMTTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreMTTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreMTTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_absorption/test_score_absorption.py b/tests/test_score_absorption/test_score_absorption.py index 7547b1e4ed..c7e3e130df 100644 --- a/tests/test_score_absorption/test_score_absorption.py +++ b/tests/test_score_absorption/test_score_absorption.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreAbsorptionTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreAbsorptionTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreAbsorptionTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_current/test_score_current.py b/tests/test_score_current/test_score_current.py index 87a3226b0b..99c2981c2a 100644 --- a/tests/test_score_current/test_score_current.py +++ b/tests/test_score_current/test_score_current.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import HashedTestHarness diff --git a/tests/test_score_events/test_score_events.py b/tests/test_score_events/test_score_events.py index 5d861f4509..dce944592e 100644 --- a/tests/test_score_events/test_score_events.py +++ b/tests/test_score_events/test_score_events.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -19,10 +18,10 @@ class ScoreEventsTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreEventsTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreEventsTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_fission/test_score_fission.py b/tests/test_score_fission/test_score_fission.py index 4dc76fc0c0..4026c0cabf 100644 --- a/tests/test_score_fission/test_score_fission.py +++ b/tests/test_score_fission/test_score_fission.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreFissionTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreFissionTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreFissionTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_flux/test_score_flux.py b/tests/test_score_flux/test_score_flux.py index f5f7351727..1eea55f45f 100644 --- a/tests/test_score_flux/test_score_flux.py +++ b/tests/test_score_flux/test_score_flux.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreFluxTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreFluxTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreFluxTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_flux_yn/test_score_flux_yn.py b/tests/test_score_flux_yn/test_score_flux_yn.py index 2095fc9b15..254069226c 100755 --- a/tests/test_score_flux_yn/test_score_flux_yn.py +++ b/tests/test_score_flux_yn/test_score_flux_yn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -21,10 +20,10 @@ class ScoreFluxYnTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreFluxYnTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreFluxYnTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_kappafission/test_score_kappafission.py b/tests/test_score_kappafission/test_score_kappafission.py index c9fc1bfe04..2e93b51c46 100644 --- a/tests/test_score_kappafission/test_score_kappafission.py +++ b/tests/test_score_kappafission/test_score_kappafission.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreKappaFissionTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreKappaFissionTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreKappaFissionTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_nufission/test_score_nufission.py b/tests/test_score_nufission/test_score_nufission.py index 800200725f..3d540daac7 100644 --- a/tests/test_score_nufission/test_score_nufission.py +++ b/tests/test_score_nufission/test_score_nufission.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreNuFissionTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreNuFissionTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreNuFissionTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_nuscatter/test_score_nuscatter.py b/tests/test_score_nuscatter/test_score_nuscatter.py index d13ded507c..6f33181265 100644 --- a/tests/test_score_nuscatter/test_score_nuscatter.py +++ b/tests/test_score_nuscatter/test_score_nuscatter.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -25,7 +24,7 @@ class ScoreNuScatterTestHarness(PyAPITestHarness): self._input_set.export() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreNuScatterTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py index c675bc7be3..40029bd02c 100644 --- a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py +++ b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -29,7 +28,7 @@ class ScoreNuScatterNTestHarness(PyAPITestHarness): self._input_set.export() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreNuScatterNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py index d3a4a55961..6a69fe054d 100644 --- a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py +++ b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -33,7 +32,7 @@ class ScoreNuScatterPNTestHarness(PyAPITestHarness): self._input_set.export() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreNuScatterPNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py index d48df6a21e..6a6ad54956 100644 --- a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py +++ b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -29,7 +28,7 @@ class ScoreNuScatterYNTestHarness(PyAPITestHarness): self._input_set.export() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreNuScatterYNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_scatter/test_score_scatter.py b/tests/test_score_scatter/test_score_scatter.py index b6396ff3ef..0b2621acd3 100644 --- a/tests/test_score_scatter/test_score_scatter.py +++ b/tests/test_score_scatter/test_score_scatter.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreScatterTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreScatterTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreScatterTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_scatter_n/test_score_scatter_n.py b/tests/test_score_scatter_n/test_score_scatter_n.py index 341b687c5f..47fd12b2ed 100644 --- a/tests/test_score_scatter_n/test_score_scatter_n.py +++ b/tests/test_score_scatter_n/test_score_scatter_n.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -21,10 +20,10 @@ class ScoreScatterNTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() self._input_set.tallies.add_tally(t) - PyAPITestHarness._build_inputs(self) + super(ScoreScatterNTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreScatterNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_scatter_pn/test_score_scatter_pn.py b/tests/test_score_scatter_pn/test_score_scatter_pn.py index 6fb304ac53..9186fe5480 100644 --- a/tests/test_score_scatter_pn/test_score_scatter_pn.py +++ b/tests/test_score_scatter_pn/test_score_scatter_pn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -26,10 +25,10 @@ class ScoreScatterPNTestHarness(PyAPITestHarness): self._input_set.tallies.add_tally(t1) self._input_set.tallies.add_tally(t2) - PyAPITestHarness._build_inputs(self) + super(ScoreScatterPNTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreScatterPNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_scatter_yn/test_score_scatter_yn.py b/tests/test_score_scatter_yn/test_score_scatter_yn.py index 7d572b2abb..9e6900031f 100644 --- a/tests/test_score_scatter_yn/test_score_scatter_yn.py +++ b/tests/test_score_scatter_yn/test_score_scatter_yn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -22,10 +21,10 @@ class ScoreScatterYNTestHarness(PyAPITestHarness): self._input_set.tallies.add_tally(t1) self._input_set.tallies.add_tally(t2) - PyAPITestHarness._build_inputs(self) + super(ScoreScatterYNTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreScatterYNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_total/test_score_total.py b/tests/test_score_total/test_score_total.py index c5e4294155..c6f3f335fc 100644 --- a/tests/test_score_total/test_score_total.py +++ b/tests/test_score_total/test_score_total.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -20,10 +19,10 @@ class ScoreTotalTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreTotalTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreTotalTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_score_total_yn/test_score_total_yn.py b/tests/test_score_total_yn/test_score_total_yn.py index a1ca6715cb..80f947f920 100644 --- a/tests/test_score_total_yn/test_score_total_yn.py +++ b/tests/test_score_total_yn/test_score_total_yn.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness, PyAPITestHarness import openmc @@ -23,10 +22,10 @@ class ScoreTotalYNTestHarness(PyAPITestHarness): self._input_set.tallies = openmc.TalliesFile() [self._input_set.tallies.add_tally(t) for t in tallies] - PyAPITestHarness._build_inputs(self) + super(ScoreTotalYNTestHarness, self)._build_inputs() def _cleanup(self): - PyAPITestHarness._cleanup(self) + super(ScoreTotalYNTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'tallies.xml') if os.path.exists(f): os.remove(f) diff --git a/tests/test_seed/test_seed.py b/tests/test_seed/test_seed.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_seed/test_seed.py +++ b/tests/test_seed/test_seed.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_angle_mono/test_source_angle_mono.py b/tests/test_source_angle_mono/test_source_angle_mono.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_source_angle_mono/test_source_angle_mono.py +++ b/tests/test_source_angle_mono/test_source_angle_mono.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_energy_maxwell/test_source_energy_maxwell.py b/tests/test_source_energy_maxwell/test_source_energy_maxwell.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_source_energy_maxwell/test_source_energy_maxwell.py +++ b/tests/test_source_energy_maxwell/test_source_energy_maxwell.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_energy_mono/test_source_energy_mono.py b/tests/test_source_energy_mono/test_source_energy_mono.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_source_energy_mono/test_source_energy_mono.py +++ b/tests/test_source_energy_mono/test_source_energy_mono.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_source_file/test_source_file.py b/tests/test_source_file/test_source_file.py index 5420d71e82..6f76438c2a 100644 --- a/tests/test_source_file/test_source_file.py +++ b/tests/test_source_file/test_source_file.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import * diff --git a/tests/test_source_point/test_source_point.py b/tests/test_source_point/test_source_point.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_source_point/test_source_point.py +++ b/tests/test_source_point/test_source_point.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index eb3136754c..5db0541344 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness from openmc.statepoint import StatePoint diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index eb3136754c..5db0541344 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness from openmc.statepoint import StatePoint diff --git a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py index 245eede759..724a88fa65 100644 --- a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py +++ b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_sourcepoint_restart/test_sourcepoint_restart.py b/tests/test_sourcepoint_restart/test_sourcepoint_restart.py index 67227ca324..ed6addec45 100644 --- a/tests/test_sourcepoint_restart/test_sourcepoint_restart.py +++ b/tests/test_sourcepoint_restart/test_sourcepoint_restart.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_statepoint_batch/test_statepoint_batch.py b/tests/test_statepoint_batch/test_statepoint_batch.py index 8a0ef83d27..e1dc167ffd 100644 --- a/tests/test_statepoint_batch/test_statepoint_batch.py +++ b/tests/test_statepoint_batch/test_statepoint_batch.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_statepoint_interval/test_statepoint_interval.py b/tests/test_statepoint_interval/test_statepoint_interval.py index 47db80f656..e7a42cdbe7 100644 --- a/tests/test_statepoint_interval/test_statepoint_interval.py +++ b/tests/test_statepoint_interval/test_statepoint_interval.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_statepoint_restart/test_statepoint_restart.py b/tests/test_statepoint_restart/test_statepoint_restart.py index 91c316f6a5..59b77a8213 100644 --- a/tests/test_statepoint_restart/test_statepoint_restart.py +++ b/tests/test_statepoint_restart/test_statepoint_restart.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness from openmc.statepoint import StatePoint from openmc.executor import Executor diff --git a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py index 70ba94838f..00ded42ec2 100644 --- a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py +++ b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py @@ -4,7 +4,6 @@ import glob import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_survival_biasing/test_survival_biasing.py b/tests/test_survival_biasing/test_survival_biasing.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_survival_biasing/test_survival_biasing.py +++ b/tests/test_survival_biasing/test_survival_biasing.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_tally_assumesep/test_tally_assumesep.py b/tests/test_tally_assumesep/test_tally_assumesep.py index 67227ca324..ed6addec45 100644 --- a/tests/test_tally_assumesep/test_tally_assumesep.py +++ b/tests/test_tally_assumesep/test_tally_assumesep.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_tally_nuclides/test_tally_nuclides.py b/tests/test_tally_nuclides/test_tally_nuclides.py index 67227ca324..ed6addec45 100644 --- a/tests/test_tally_nuclides/test_tally_nuclides.py +++ b/tests/test_tally_nuclides/test_tally_nuclides.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trace/test_trace.py b/tests/test_trace/test_trace.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_trace/test_trace.py +++ b/tests/test_trace/test_trace.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_track_output/test_track_output.py b/tests/test_track_output/test_track_output.py index 7039120a41..c19d39e0a6 100644 --- a/tests/test_track_output/test_track_output.py +++ b/tests/test_track_output/test_track_output.py @@ -5,7 +5,6 @@ import os import shutil import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_translation/test_translation.py b/tests/test_translation/test_translation.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_translation/test_translation.py +++ b/tests/test_translation/test_translation.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py index 18b904efb5..59b900e503 100644 --- a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py +++ b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py index 983f941d93..f9cb68d627 100644 --- a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py +++ b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_no_status/test_trigger_no_status.py b/tests/test_trigger_no_status/test_trigger_no_status.py index 67227ca324..ed6addec45 100644 --- a/tests/test_trigger_no_status/test_trigger_no_status.py +++ b/tests/test_trigger_no_status/test_trigger_no_status.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_trigger_tallies/test_trigger_tallies.py b/tests/test_trigger_tallies/test_trigger_tallies.py index 812e2c5e50..a0b2119dea 100644 --- a/tests/test_trigger_tallies/test_trigger_tallies.py +++ b/tests/test_trigger_tallies/test_trigger_tallies.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_uniform_fs/test_uniform_fs.py b/tests/test_uniform_fs/test_uniform_fs.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_uniform_fs/test_uniform_fs.py +++ b/tests/test_uniform_fs/test_uniform_fs.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_union_energy_grids/test_union_energy_grids.py b/tests/test_union_energy_grids/test_union_energy_grids.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_union_energy_grids/test_union_energy_grids.py +++ b/tests/test_union_energy_grids/test_union_energy_grids.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_universe/test_universe.py b/tests/test_universe/test_universe.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_universe/test_universe.py +++ b/tests/test_universe/test_universe.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/test_void/test_void.py b/tests/test_void/test_void.py index 835bf91c7b..2a595f3e66 100644 --- a/tests/test_void/test_void.py +++ b/tests/test_void/test_void.py @@ -3,7 +3,6 @@ import os import sys sys.path.insert(0, os.pardir) -sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from testing_harness import TestHarness diff --git a/tests/testing_harness.py b/tests/testing_harness.py index ff13e580cf..828fc3a094 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -11,8 +11,8 @@ import sys import numpy as np +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) from input_set import InputSet -sys.path.insert(0, '../..') from openmc.statepoint import StatePoint from openmc.executor import Executor import openmc.particle_restart as pr From d58e9027847be50982815d5f28d1843f4c1cadbf Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 11:40:11 -0400 Subject: [PATCH 268/519] Corrected tally slicing for Python API MultiGroupXS --- docs/source/pythonapi/examples/geometry.xml | 8 + .../pythonapi/examples/materials-xy.png | Bin 0 -> 1271 bytes docs/source/pythonapi/examples/materials.xml | 12 + .../pythonapi/examples/mgxs/transport-xs.xls | Bin 0 -> 5632 bytes .../pythonapi/examples/openmc-mgxs.ipynb | 1112 +++++++++++++++++ .../examples/pandas-dataframes.ipynb | 22 +- docs/source/pythonapi/examples/plots.xml | 8 + .../pythonapi/examples/post-processing.ipynb | 360 +++++- docs/source/pythonapi/examples/settings.xml | 17 + docs/source/pythonapi/examples/tallies.xml | 39 + .../pythonapi/examples/tally-arithmetic.ipynb | 662 +--------- .../tracks/128_angles_0.1_cm_spacing.data | Bin 0 -> 71256 bytes openmc/mgxs/mgxs.py | 7 +- 13 files changed, 1597 insertions(+), 650 deletions(-) create mode 100644 docs/source/pythonapi/examples/geometry.xml create mode 100644 docs/source/pythonapi/examples/materials-xy.png create mode 100644 docs/source/pythonapi/examples/materials.xml create mode 100644 docs/source/pythonapi/examples/mgxs/transport-xs.xls create mode 100644 docs/source/pythonapi/examples/openmc-mgxs.ipynb create mode 100644 docs/source/pythonapi/examples/plots.xml create mode 100644 docs/source/pythonapi/examples/settings.xml create mode 100644 docs/source/pythonapi/examples/tallies.xml create mode 100644 docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data diff --git a/docs/source/pythonapi/examples/geometry.xml b/docs/source/pythonapi/examples/geometry.xml new file mode 100644 index 0000000000..bfd99e0b96 --- /dev/null +++ b/docs/source/pythonapi/examples/geometry.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/source/pythonapi/examples/materials-xy.png b/docs/source/pythonapi/examples/materials-xy.png new file mode 100644 index 0000000000000000000000000000000000000000..cfed789b25a6f93030995c5645caee5dfd7cb7ac GIT binary patch literal 1271 zcmZ{jZ&Z?Z6vrPkJ7-pN={b=rqgImUOl%el1V#q}n*tF{O4IyPDmwKf9Z}Oq$uuj= zESH65)3TZ;8FOV(N%K!yS)^vzY?!iAK}7=g_T=jut|LAo=NqwkRjNcSz$gw?g&LSB%=tsu&h8 z1cEYg5R{w$3CuBzo5M`^5mOu9~ zF#3BY9XjUZ!LpmrQdzsx?D}zLLE9cDQXt6jbr7A#kJpS#Ny%FL7X{fxV|Tk36&E{) zdT-t!%CC?xxlx3PMnPpWlY7Q7Da!HoR`S;r&+XO(?&nFX9u}@T@~~oX@+_oNk*=kh=s!#L`ybsuCBRqUSDLXOxK(w%WNNM1uv}@4aZw66MG#PT#5 z5C+X!{G=y2px37651z;io>5Ms_s*kr+QKC3(hZl|>0>#A!& z*!pmV?K~Mte+ZM&B^tQFVbr7fmz<29#|=Zw_JPf%c?-*_a_ufazLnWe8j1A%6D5%V z3)w4qNhN}LR=-)R>@~a(c*HA`1FSOd2W#d)58Q8-cMrC{MfE%75uj2JJJ^ha2*w@$ z7Q`cMm+X06XyHucub@V+s+sfCVQDtZl&o(WOTI)fvyC=vHVPR}Q()vfP-(IiQ$ULW z`(hT`HO%>2Y(kb>QJ2HO>}JCp28$kmZ3D^{^uz?U_1|2?PXv6g1NHzM{sbL;gG7pe zy9R8V9f(oGW8z10BX-1cHp^_tHxf9Y?K%9%u + + 71c + + + + + + + + + diff --git a/docs/source/pythonapi/examples/mgxs/transport-xs.xls b/docs/source/pythonapi/examples/mgxs/transport-xs.xls new file mode 100644 index 0000000000000000000000000000000000000000..86a8cee39962fec9c37bb88dddedbafc034ce043 GIT binary patch literal 5632 zcmeI0YiJZ#6vzK}cJ@`0m>rXd5yCW}@r59zAhl-VqfPrEG0_hZ3FvADn!4`lb|YvZ zCdT;5R>4nNL8N{uz7c$oh>Aq~ASgZv2ufn1RivdY3L>W4bIxSeo&6BD6hf6b%bvOC z+H8-)4+{#UM=@r#RE`%u?~^vWrFIs@`AFoRRhL(uP38XQtru(hf41gO`BdZR zj*3&m)=|__EHLZ_jkpG&ABOLv(IH4IkxU$>%u;= zXvW3*Umpuw7xt&WpMF$+@*81u{tDUbbJW>V$5$6`{Y%&pVOK@# z+P4n%S@oKM^St2Dz-nBao#R^m)z5&R0Y3wN2K)^88JLs|@arW%mHBnedDU|M1K`&Q z{$FQ|zI^rN{mj5Br0A1@iO-OvYZ}{W=8Kmq1eKc^UQ5M@`+p&~ZKLREY{CW^$EISs md)m;?wOo82ho^EP!}%RIQHx^h{&oEP`!6=g1nvG){C@x;tuRIa literal 0 HcmV?d00001 diff --git a/docs/source/pythonapi/examples/openmc-mgxs.ipynb b/docs/source/pythonapi/examples/openmc-mgxs.ipynb new file mode 100644 index 0000000000..2aedc3121d --- /dev/null +++ b/docs/source/pythonapi/examples/openmc-mgxs.ipynb @@ -0,0 +1,1112 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates how to use the **``openmc.mgxs``** module to generate multi-group cross sections with OpenMC.\n", + "\n", + "**Note:** that this Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Infinite Homogeneous Medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Inputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "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')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.028999667)\n", + "inf_medium.add_nuclide(o16, 0.01450188)\n", + "inf_medium.add_nuclide(u235, 0.000114142)\n", + "inf_medium.add_nuclide(u238, 0.006886019)\n", + "inf_medium.add_nuclide(zr90, 0.002116053)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.default_xs = '71c'\n", + "materials_file.add_material(inf_medium)\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.add_surface(surface=min_x, halfspace=+1)\n", + "cell.add_surface(surface=max_x, halfspace=-1)\n", + "cell.add_surface(surface=min_y, halfspace=+1)\n", + "cell.add_surface(surface=max_y, halfspace=-1)\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('box', bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a \"fine\" 8-group EneryGroups object\n", + "fine_groups = mgxs.EnergyGroups()\n", + "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", + " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", + "\n", + "# Instantiate a \"coarse\" 2-group EneryGroups object\n", + "coarse_groups = mgxs.EnergyGroups()\n", + "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MultiGroupXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of generic and abstract `MultiGroupXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\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 cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define total, nu-fission, nu-scatter and chi cross sections for our infinite medium cell as the domain and our fine 8-group structure as our energy groups." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate cross sections needed for an OpenMOC simulation\n", + "transport = mgxs.TransportXS(domain=cell, domain_type='cell', groups=fine_groups)\n", + "nufission = mgxs.NuFissionXS(domain=cell, domain_type='cell', groups=fine_groups)\n", + "nuscatter = mgxs.NuScatterMatrixXS(domain=cell, domain_type='cell', groups=fine_groups)\n", + "chi = mgxs.Chi(domain=cell, domain_type='cell', groups=fine_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must instruct our multi-group cross section objects to generate the tallies needed to calculate each of them in OpenMC. This can be done with the `MultiGroupXS.create_tallies()` routine." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instruct each multi-group cross section to generate tallies\n", + "transport.create_tallies()\n", + "nufission.create_tallies()\n", + "nuscatter.create_tallies()\n", + "chi.create_tallies()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'flux': Tally\n", + " \tID =\t10003\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", + " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", + " 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['flux']\n", + " \tEstimator =\ttracklength, 'nu-fission': Tally\n", + " \tID =\t10004\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", + " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", + " 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['nu-fission']\n", + " \tEstimator =\ttracklength}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nufission.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `NuFission` object includes tracklength tallies for the 'nu-fission' and 'flux' scores in the 8-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Add transport tallies to the tallies file\n", + "for tally in transport.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Add nu-fission tallies to the tallies file\n", + "for tally in nufission.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Add nu-scatter tallies to the tallies file\n", + "for tally in nuscatter.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Add chi tallies to the tallies file \n", + "for tally in chi.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + " \n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Run OpenMC!\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. The first step is to load the tallies from the statepoint into each object." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'tuple' object has no attribute '__name__'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the tallies from the statepoint into each MultiGroupXS object\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mtransport\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mnufission\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mnuscatter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mchi\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mload_from_statepoint\u001b[1;34m(self, statepoint)\u001b[0m\n\u001b[0;32m 1216\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1217\u001b[0m \u001b[1;31m# Load the tallies from the statepoint using the parent class method\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1218\u001b[1;33m \u001b[0msuper\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mTransportXS\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstatepoint\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1219\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1220\u001b[0m \u001b[1;31m# Use tally slicing to remove scatter-P0 data from scatter-P1 tally\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mload_from_statepoint\u001b[1;34m(self, statepoint)\u001b[0m\n\u001b[0;32m 429\u001b[0m \u001b[1;31m# the isotopic number densities as computed by OpenMC\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 430\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'cell'\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'distribcell'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 431\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstatepoint\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_cell_by_id\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mid\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 432\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'universe'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 433\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstatepoint\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_universe_by_id\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mid\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mdomain\u001b[1;34m(self, domain)\u001b[0m\n\u001b[0;32m 198\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mdomain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msetter\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 199\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 200\u001b[1;33m \u001b[0mcv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_type\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'domain'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mDOMAINS\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 201\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_domain\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 202\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/checkvalue.pyc\u001b[0m in \u001b[0;36mcheck_type\u001b[1;34m(name, value, expected_type, expected_iter_type)\u001b[0m\n\u001b[0;32m 52\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0m_isinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexpected_type\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 53\u001b[0m msg = 'Unable to set \"{0}\" to \"{1}\" which is not of type \"{2}\"'.format(\n\u001b[1;32m---> 54\u001b[1;33m name, value, expected_type.__name__)\n\u001b[0m\u001b[0;32m 55\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 56\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute '__name__'" + ] + } + ], + "source": [ + "# Load the tallies from the statepoint into each MultiGroupXS object\n", + "transport.load_from_statepoint(sp)\n", + "nufission.load_from_statepoint(sp)\n", + "nuscatter.load_from_statepoint(sp)\n", + "chi.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The multi-group cross section objects can now use OpenMC's [tally arithmetic](http://mit-crpg.github.io/openmc/pythonapi/examples/pandas-dataframes.html) to compute cross sections from the tally data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "transport.compute_xs()\n", + "nufission.compute_xs()\n", + "nuscatter.compute_xs()\n", + "chi.compute_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll! Let's first inspect one of our cross sections by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "nufission.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "df = nuscatter.get_pandas_dataframe()\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "transport.export_xs_data(filename='transport-xs', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export all of four cross sections to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "transport.build_hdf5_store(filename='mgxs', append=True)\n", + "nufission.build_hdf5_store(filename='mgxs', append=True)\n", + "nuscatter.build_hdf5_store(filename='mgxs', append=True)\n", + "chi.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. First, we will use OpenCG to reconstruct our OpenMC geometry from the summary file into a equivalent OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Import OpenMOC and the OpenMOC/OpenCG compatibility module\n", + "import openmoc\n", + "from openmoc.compatible import get_openmoc_geometry\n", + "\n", + "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", + "su.make_opencg_geometry()\n", + "\n", + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can inject the multi-group cross sections into the equivalent infinite homogeneous medium OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Get all OpenMOC cells in the gometry\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", + "# as is the case for a complicated geometry like BEAVRS\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Get a reference to the Material filling this Cell\n", + " openmoc_material = cell.getFillMaterial()\n", + " \n", + " # Set the number of energy groups for the Material\n", + " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " openmoc_material.setSigmaT(transport.get_xs().flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs().flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs().flatten())\n", + " openmoc_material.setChi(chi.get_xs().flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although there is a non-trivial bias, one can easily run the preceding code with more particle histories to show that both codes converge to the same eigenvalue with <10 pcm bias. It should be noted that this discrepancy is partially due to use of tracklength tallies for `NuFission`, while one must use more slowly converging analog tallies must be used for `TransportXS`, `NuScatterMatrixXS` and `Chi` (which require an 'energyout' filter)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fuel Pin Cell" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Inputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "this time we separate our nuclides into three distinct materials for water, clad and fuel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "# Use both reflective and vacuum boundaries to make life interesting\n", + "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "pin_cell_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", + "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "pin_cell_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "pin_cell_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = pin_cell_universe\n", + "\n", + "# Add boundary planes\n", + "root_cell.add_surface(min_x, halfspace=+1)\n", + "root_cell.add_surface(max_x, halfspace=-1)\n", + "root_cell.add_surface(min_y, halfspace=+1)\n", + "root_cell.add_surface(max_y, halfspace=-1)\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will reuse our settings from the previous simulation. Now, we let's create transport, nu-fission, nu-scatter and chi multi-group cross sections for each cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Extract all Cells filled by Materials\n", + "openmc_cells = openmc_geometry.get_all_material_cells()\n", + "\n", + "# Create dictionary to store multi-group cross sections for all cells\n", + "xs_library = {}\n", + "\n", + "# Instantiate 8-group cross sections for each cell\n", + "for cell in openmc_cells:\n", + " xs_library[cell.id] = {}\n", + " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", + " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, we did not give our cross sections a spatial domain in their constructors. Instead, we will loop over all cells to set each cross sections domain. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id].keys():\n", + " print(cell.name, rxn_type)\n", + "\n", + " # Set the cross sections domain type to the cell\n", + " xs_library[cell.id][rxn_type].domain = cell\n", + " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", + " \n", + " # Tally cross sections by nuclide (e.g., micro cross sections)\n", + " xs_library[cell.id][rxn_type].by_nuclide = True\n", + " \n", + " # Create OpenMC tallies for this cross section\n", + " xs_library[cell.id][rxn_type].create_tallies()\n", + " \n", + " # Add OpenMC tallies to the tallies file for XML generation\n", + " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", + " print(tally)\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Delete old HDF5 files\n", + "!rm *.h5\n", + "\n", + "# Run OpenMC!\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. As before, we begin our analysis here loading the statepoint file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint and summary files\n", + "sp = openmc.StatePoint('statepoint.50.h5')\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id].keys():\n", + " xs_library[cell.id][rxn_type].load_from_statepoint(sp)\n", + " xs_library[cell.id][rxn_type].compute_xs()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 70ff464060..f227e2f71d 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -385,7 +385,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDAxOjE0\nOjM0LTA0OjAwS1fWPgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwMToxNDozNC0wNDow\nMDoKboIAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDExOjE3\nOjA5LTA0OjAw0jfqaAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QxMToxNzowOS0wNDow\nMKNqUtQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -576,7 +576,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 01:14:34\n", + " Date/Time: 2015-10-03 11:17:09\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -644,20 +644,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.2000E+00 seconds\n", - " Reading cross sections = 2.5000E-01 seconds\n", - " Total time in simulation = 1.8967E+01 seconds\n", - " Time in transport only = 1.8921E+01 seconds\n", - " Time in inactive batches = 2.8760E+00 seconds\n", - " Time in active batches = 1.6091E+01 seconds\n", + " Total time for initialization = 7.1300E-01 seconds\n", + " Reading cross sections = 1.5900E-01 seconds\n", + " Total time in simulation = 1.5700E+01 seconds\n", + " Time in transport only = 1.5659E+01 seconds\n", + " Time in inactive batches = 2.1510E+00 seconds\n", + " Time in active batches = 1.3549E+01 seconds\n", " Time synchronizing fission bank = 3.0000E-03 seconds\n", " Sampling source sites = 3.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 2.0192E+01 seconds\n", - " Calculation Rate (inactive) = 4346.31 neutrons/second\n", - " Calculation Rate (active) = 2330.50 neutrons/second\n", + " Total time elapsed = 1.6427E+01 seconds\n", + " Calculation Rate (inactive) = 5811.25 neutrons/second\n", + " Calculation Rate (active) = 2767.73 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", diff --git a/docs/source/pythonapi/examples/plots.xml b/docs/source/pythonapi/examples/plots.xml new file mode 100644 index 0000000000..512070a33f --- /dev/null +++ b/docs/source/pythonapi/examples/plots.xml @@ -0,0 +1,8 @@ + + + + 0 0 0 + 21.5 21.5 + 250 250 + + diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 51ca6adcf7..de6234a729 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -353,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDI6NTE6MjktMDQ6MDANEGNoAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAyOjUxOjI5LTA0OjAwfE3b1AAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMTE6MTc6MDItMDQ6MDDQML6SAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDExOjE3OjAyLTA0OjAwoW0GLgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "collapsed": false, "scrolled": true @@ -465,7 +465,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 02:51:29\n", + " Date/Time: 2015-10-03 11:17:02\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -533,8 +533,108 @@ " 39/1 1.01971 1.03820 +/- 0.00312\n", " 40/1 1.01491 1.03743 +/- 0.00311\n", " 41/1 1.02779 1.03712 +/- 0.00303\n", - " 42/1 1.03047 1.03691 +/- 0.00294\n" + " 42/1 1.03047 1.03691 +/- 0.00294\n", + " 43/1 1.02305 1.03649 +/- 0.00288\n", + " 44/1 1.07854 1.03773 +/- 0.00305\n", + " 45/1 1.04412 1.03791 +/- 0.00297\n", + " 46/1 1.05139 1.03828 +/- 0.00291\n", + " 47/1 1.05357 1.03870 +/- 0.00286\n", + " 48/1 1.06435 1.03937 +/- 0.00287\n", + " 49/1 1.02632 1.03904 +/- 0.00281\n", + " 50/1 1.05201 1.03936 +/- 0.00276\n", + " 51/1 1.04582 1.03952 +/- 0.00270\n", + " 52/1 1.02056 1.03907 +/- 0.00267\n", + " 53/1 1.06448 1.03966 +/- 0.00267\n", + " 54/1 1.03609 1.03958 +/- 0.00261\n", + " 55/1 1.02701 1.03930 +/- 0.00257\n", + " 56/1 1.04865 1.03950 +/- 0.00252\n", + " 57/1 1.06310 1.04000 +/- 0.00252\n", + " 58/1 1.02975 1.03979 +/- 0.00247\n", + " 59/1 1.03922 1.03978 +/- 0.00242\n", + " 60/1 1.07259 1.04043 +/- 0.00246\n", + " 61/1 1.04555 1.04053 +/- 0.00242\n", + " 62/1 1.01950 1.04013 +/- 0.00240\n", + " 63/1 1.04618 1.04024 +/- 0.00236\n", + " 64/1 1.02489 1.03996 +/- 0.00233\n", + " 65/1 1.06850 1.04048 +/- 0.00235\n", + " 66/1 1.03623 1.04040 +/- 0.00231\n", + " 67/1 0.99892 1.03967 +/- 0.00238\n", + " 68/1 1.05557 1.03995 +/- 0.00236\n", + " 69/1 1.01211 1.03948 +/- 0.00236\n", + " 70/1 1.04679 1.03960 +/- 0.00233\n", + " 71/1 1.03461 1.03952 +/- 0.00229\n", + " 72/1 1.01993 1.03920 +/- 0.00227\n", + " 73/1 1.04742 1.03933 +/- 0.00224\n", + " 74/1 1.05269 1.03954 +/- 0.00222\n", + " 75/1 1.05696 1.03981 +/- 0.00220\n", + " 76/1 1.05904 1.04010 +/- 0.00218\n", + " 77/1 1.05930 1.04039 +/- 0.00217\n", + " 78/1 1.03375 1.04029 +/- 0.00214\n", + " 79/1 1.07044 1.04073 +/- 0.00215\n", + " 80/1 1.04144 1.04074 +/- 0.00212\n", + " 81/1 1.06296 1.04105 +/- 0.00212\n", + " 82/1 1.04630 1.04112 +/- 0.00209\n", + " 83/1 1.03772 1.04108 +/- 0.00206\n", + " 84/1 1.03774 1.04103 +/- 0.00203\n", + " 85/1 1.03984 1.04101 +/- 0.00200\n", + " 86/1 1.03040 1.04087 +/- 0.00198\n", + " 87/1 1.03484 1.04080 +/- 0.00196\n", + " 88/1 1.03820 1.04076 +/- 0.00193\n", + " 89/1 1.04654 1.04084 +/- 0.00191\n", + " 90/1 1.03377 1.04075 +/- 0.00189\n", + " 91/1 1.03370 1.04066 +/- 0.00187\n", + " 92/1 1.04172 1.04067 +/- 0.00184\n", + " 93/1 1.04945 1.04078 +/- 0.00182\n", + " 94/1 1.03360 1.04069 +/- 0.00181\n", + " 95/1 1.06547 1.04099 +/- 0.00181\n", + " 96/1 1.04340 1.04101 +/- 0.00179\n", + " 97/1 1.07502 1.04140 +/- 0.00181\n", + " 98/1 1.05391 1.04155 +/- 0.00179\n", + " 99/1 1.05622 1.04171 +/- 0.00178\n", + " 100/1 1.01519 1.04142 +/- 0.00179\n", + " Creating state point statepoint.100.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 5.2900E-01 seconds\n", + " Reading cross sections = 9.6000E-02 seconds\n", + " Total time in simulation = 3.1874E+02 seconds\n", + " Time in transport only = 3.1866E+02 seconds\n", + " Time in inactive batches = 1.3286E+01 seconds\n", + " Time in active batches = 3.0545E+02 seconds\n", + " Time synchronizing fission bank = 1.1000E-02 seconds\n", + " Sampling source sites = 7.0000E-03 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Time accumulating tallies = 2.2000E-02 seconds\n", + " Total time for finalization = 1.7800E-01 seconds\n", + " Total time elapsed = 3.1947E+02 seconds\n", + " Calculation Rate (inactive) = 3763.36 neutrons/second\n", + " Calculation Rate (active) = 1473.24 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.04100 +/- 0.00169\n", + " k-effective (Track-length) = 1.04142 +/- 0.00179\n", + " k-effective (Absorption) = 1.04380 +/- 0.00147\n", + " Combined k-effective = 1.04287 +/- 0.00130\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -558,7 +658,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "collapsed": false, "scrolled": true @@ -578,11 +678,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux', u'fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -597,11 +713,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[ 0.41271426, 0. ]],\n", + "\n", + " [[ 0.40846766, 0. ]],\n", + "\n", + " [[ 0.4112029 , 0. ]],\n", + "\n", + " ..., \n", + " [[ 0.41437289, 0. ]],\n", + "\n", + " [[ 0.41376468, 0. ]],\n", + "\n", + " [[ 0.41312074, 0. ]]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tally.sum" ] @@ -615,11 +753,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10000, 1, 2)\n" + ] + }, + { + "data": { + "text/plain": [ + "(array([[[ 0.00458571, 0. ]],\n", + " \n", + " [[ 0.00453853, 0. ]],\n", + " \n", + " [[ 0.00456892, 0. ]],\n", + " \n", + " ..., \n", + " [[ 0.00460414, 0. ]],\n", + " \n", + " [[ 0.00459739, 0. ]],\n", + " \n", + " [[ 0.00459023, 0. ]]]),\n", + " array([[[ 2.02702426e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.77108625e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.79568064e-05, 0.00000000e+00]],\n", + " \n", + " ..., \n", + " [[ 1.83114148e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.69970626e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.92143217e-05, 0.00000000e+00]]]))" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -634,11 +813,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -654,7 +849,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -668,11 +863,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -689,11 +905,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFPNJREFUeJzt3XuMHVd9wPHvxhsXAl7sbYrjRyIbx65xHyJIMaiFMrTB\nNWnwuiA5Rmq1gKmqWg3pk9hBrbeqKE4qCq1QKrU8ukTYrQut5VTU2EkzfUitXSAOSZatH22ADXhD\ncIi3hRYbb/84Z72zd+/uzt29M/fu7PcjXd25M2dmzvHcvT+fc+bMAUmSJEmSJEmSJEmSJEmSJKkp\n7gaeAJ6MywDdwHHgNHAMWJpJvxc4AwwCW8rLpiSpSD9KCAYvAhYRgsA64H7gvTHNPcD+uLwJOAVc\nC6wBzgLXlJddSdJszfRjvRE4Afwv8H3gH4G3AduA/pimH9gel3uAg8Al4GlCQNjc1BxLkgoxU0B4\nEng9oYnoOuB2YDWwHBiOaYbjZ4CVwFBm/yFgVbMyK0kqTucM2weB+wj9BP9DaA76fk2a0fiaynTb\nJEltYqaAAPDx+AJ4P+F//cPADcB5YAXwbNz+DHBjZt/Vcd0E69atGz137twssyxJC9Y54OaiDp6n\nw/fl8f0m4K3AAeAI0BvX9wKH4/IRYCewGFgLrAdO1h7w3LlzjI6OVva1b9++lufB8lm+hVa2hVA+\nwk09hclTQ/g08IOEjuLdwAuEu4oOAbsIncc7YtqBuH4AuBzT22QkSfNAnoDwU3XWXQBumyL9H8SX\nJGkecYxAAZIkaXUWCmX55q8qlw2qX76idbTovKOxPUySlFNHRwcU+LttDUGSBBgQJEmRAUGSBBgQ\nJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJEmRAUGSBBgQJElRnoCwF3gKeIIw\nfeYPAN3AceA0cAxYWpP+DDAIbGlmZtV+urq66ejomPTq6upuddYkNWim52qvAf4BeCXwf8BfAZ8F\nfgR4DrgfuAdYBuwBNhGCxq3AKuBhYANwpea4zodQEeH57PWuZQf1rnFXVzcjI89PWr9kyTIuXrzQ\n/AxKFdLq+RAuEuZSvo4w3eZ1wNeBbUB/TNMPbI/LPcDBuM/TwFlgc1NzrHktBIPRSa96QUJSuWYK\nCBeADwJfJQSCbxOaipYDwzHNcPwMsBIYyuw/RKgpSJLaXOcM29cBv0ZoOnoB+GvgF2rSjP03byp1\nt/X19V1dTpLEuVAlqUaapqRpWtr5ZmqLuhN4E/Du+PkXgdcCPw28ETgPrAAeBTYS+hEA9sf3o8A+\n4ETNce1DqIhG+xAaTS9pXKv7EAYJAeDFMRO3AQPAQ0BvTNMLHI7LR4CdwGJgLbAeONncLGt+6Kx7\n95Gk9jVTk9HjwCeBzxPuFPoi8GfAEuAQsIvQebwjph+I6weAy8Bupm9OUmVdZqqagKT21Kq/TpuM\nKmK6JqBG1/udkKbX6iYjSdICYUCQJAEGBElSZECQJAEGBElSZECQJAEGBDWg3qOuJVWH4xCUW/0x\nB45DkMriOARJUikMCJIkwICgtlH/YXhOxSmVxz4E5VZ0H4J9C9L07EOQJJXCgCBJAgwIkqTIgCBJ\nAvIFhB8GHsu8XgDeA3QDx4HTwDFgaWafvcAZwhScW5qYX0lSQRrtrb4GeAbYDNwFPAfcD9wDLAP2\nAJuAA8CtwCrgYWADYQrOMd5lNA95l5HUWu12l9FtwFnga8A2oD+u7we2x+Ue4CBwiTDf8llCAJEk\ntbFGA8JOwo89wHJgOC4Px88AK4GhzD5DhJqCJKmNdTaQdjHwFkLzUK1R6tf3s9sn6Ovru7qcJAlJ\nkjSQFUmqvjRNSdO0tPM10hbVA/wKsDV+HgQS4DywAngU2EjoRwDYH9+PAvuAE5lj2YcwD9mHILVW\nO/UhvJ3x5iKAI0BvXO4FDmfW7yTUKNYC64GTc8umFq7Jzzjy+UZSMfJGmpcAXyH8wI/Edd3AIeAm\nQufxDuDbcdu9wLuAy8DdwOdqjmcNYR5qVQ2h3jn9/mghKrqG4MPtlJsBQWqtdmoykiRVmAFBkgQY\nECRJkQFBk3R1ddedvUxStdmprEnqdx7DVB28dipL5bBTWZJUCgOCJAkwIEiSIgOCJAkwIEiSIgOC\nJAkwIEiSIgOCJAkwIEiSIgOCJAkwIGhemjyLmjOpSXOXNyAsBT4NfBkYAF5DmDHtOHAaOBbTjNkL\nnCHMu7ylWZmVgsuE5xtNfI2MPN/SXEnzXd6A8MfAZ4FXAj9O+KHfQwgIG4BH4meATcCd8X0r8EAD\n55EktUieH+qXAa8HPh4/XwZeALYB/XFdP7A9LvcAB4FLhLmWzwKbm5NdSVJR8gSEtcA3gU8AXwT+\nHHgJsBwYjmmG42eAlcBQZv8hYFUzMitJKk5nzjSvBn4V+Hfgw4w3D40Za8idyqRtfX19V5eTJCFJ\nkhxZkaSFI01T0jQt7Xx5Jlq4AfhXQk0B4HWETuNXAG8EzgMrgEeBjYwHi/3x/SiwDziROaYT5LSx\n+TBBzlRp/V6pytphgpzzwNcInccAtwFPAQ8BvXFdL3A4Lh8BdgKLCUFkPXCySfmVJBUkT5MRwF3A\npwg/8ueAdwKLgEPALkLn8Y6YdiCuHyB0QO9m+uYkSVIbcE5lTWKTkdSe2qHJSJK0ABgQFrCuru66\nj4CQtDDZZLSANdY0NNV6m4yksthkJEkqhQFBkgQYECRJkQFBkgQYECRJkQFBkgQYECRJkQFBkgQY\nECRJkQFBkgQYECRJkQFBkgTkDwhPA18CHmN89rNu4DhwGjgGLM2k3wucAQaBLc3IqCSpWHkDwiiQ\nALcAm+O6PYSAsAF4hPG5lDcBd8b3rcADDZxHktQijfxQ1z5ydRvQH5f7ge1xuQc4CFwi1CzOMh5E\nJEltqpEawsPA54FfiuuWA8NxeTh+BlgJDGX2HQJWzS2bkqSideZM95PAN4AfIjQTDdZsH6X+jCXZ\n7ZKkNpY3IHwjvn8T+FtCE9AwcANwHlgBPBvTPAPcmNl3dVw3QV9f39XlJElIkiR/riVpAUjTlDRN\nSztfnqnYrgMWASPASwh3FP0ecBvwLeA+Qofy0vi+CThACBqrCE1NNzOxluAUmm3AKTSl+aXoKTTz\n1BCWE2oFY+k/RQgKnwcOAbsIncc7YpqBuH4AuAzsxiYjlaJz7A9mgiVLlnHx4oUW5EeaXwqLNDOw\nhtAGqlhDsOagKiu6huD4AEkSYECQJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYECQ\nJEUGBEkSYECQJEUGBEkSYECQJEUGBEkSYEBYELq6uuno6Jj0kqSsvAFhEfAY8FD83A0cB04TZk9b\nmkm7FzgDDAJbmpNNzcXIyPOEiWNqX5I0Lm9AuJswJebYr8geQkDYADwSP0OYT/nO+L4VeKCBc0iS\nWijPj/Vq4Hbgo4xP3bYN6I/L/cD2uNwDHAQuEeZZPgtsblJeJUkFyhMQPgT8NnAls245MByXh+Nn\ngJXAUCbdELBqjnmUJJVgpoBwB/Asof9gql7ImRqkbayWpHmgc4btP0FoHrodeBHQBTxIqBXcAJwH\nVhCCBsAzwI2Z/VfHdZP09fVdXU6ShCRJGs27JFVamqakaVra+Rq59/ANwG8BbwHuB74F3EfoUF4a\n3zcBBwj9BquAh4GbmVxLGB0dteJQlnCLab1/72asL/LYzTun3zdVQbxdvLB7xmeqIdQa+6vaDxwC\ndhE6j3fE9QNx/QBwGdiNTUZquc664y6WLFnGxYsXWpAfqT21anSSNYQSWUOw5qBqKLqG4BgBSRJg\nQJAkRQYESRJgQJAkRQYESRJgQJAkRQYESRJgQJAkRQaEiqk3O5ok5eFI5YqpPyp5fowadqSyND1H\nKkuSSmFAkCQBBgRJUmRAkCQBBgRJUmRAkCQBMweEFwEngFOEWdA+ENd3A8eB08AxwhSaY/YCZ4BB\nYEszMytJKk6e+1mvA75DmG7zXwjzKm8DniPMrXwPsIyJcyrfyvicyhuAKzXHdBxCQRyH4DgEVVc7\njEP4TnxfDCwCnicEhP64vh/YHpd7gIPAJcJcy2eBzU3KqySpQHkCwjWEJqNh4FHgKWB5/Ex8Xx6X\nVwJDmX2HCDUFSVKb68yR5grwKuBlwOeAN9ZsH6V+fTy7fZK+vr6ry0mSkCRJjqxI0sKRpilpmpZ2\nvkbbon4H+C7wbiABzgMrCDWHjYR+BID98f0osI/QMZ1lH0JB7EOwD0HV1eo+hOsZv4PoxcCbgMeA\nI0BvXN8LHI7LR4CdhP6GtcB64GQT8ytJKshMTUYrCJ3G18TXg8AjhKBwCNhF6DzeEdMPxPUDwGVg\nN9M3J0kt1Dnp8eBLlizj4sULLcqP1Fo+/rpibDKa+7H9bqpdtbrJSJK0QBgQJEmAAUGSFBkQJEmA\nAUGSFBkQJEmAAUGSFBkQJEmAAWHe6urqpqOjY9JLkmbLkcrzVP0RydCKkb2OVJbK4UhlSVIpDAiS\nJMCAIEmKDAiSJMCAINXorHv3VldXd6szJhUuz5zK0gJymXp3JI2MeEuvqi9PDeFGwpzJTwFPAu+J\n67uB48Bp4BjjU20C7AXOAIPAlmZlVpJUnDz/7bkhvk4BLwW+AGwH3gk8B9wP3AMsA/YAm4ADwK3A\nKuBhYANwJXNMxyHMkeMQyj+231m1WjuMQzhPCAYA/w18mfBDv40w3zLxfXtc7gEOApcI8y2fBTY3\nJ7uSpKI02qm8BrgFOAEsB4bj+uH4GWAlMJTZZ4gQQCRJbayRTuWXAp8B7gZGaraNUr+end0+QV9f\n39XlJElIkqSBrEhS9aVpSpqmpZ0vb1vUtcDfAX8PfDiuGwQSQpPSCkLH80ZCPwLA/vh+FNhHqFWM\nsQ9hjuxDsA9BC0879CF0AB8DBhgPBgBHgN643AsczqzfCSwG1gLrgZPNyKwkqTh5Is3rgH8CvsT4\nf532En7kDwE3ETqPdwDfjtvvBd5FuKn7buBzNce0hjBH1hCsIWjhKbqG4OOv5ykDggFBC087NBlJ\nkhYAA0Kbc2Y0SWXxWUZtbmTkeaZu7pCk5rGGIEkCDAiSpMiAIEkCDAhSTk6co+qzU1nKxYlzVH3W\nECRJgAFBmiObklQdNhlJc2JTkqrDGoIkCTAgSJIiA4IkCTAgtA0fYiep1exUbhM+xE5Sq+WpIXwc\nGAaeyKzrBo4Dp4FjwNLMtr3AGcKcy1uak01JUtHyBIRPAFtr1u0hBIQNwCPxM8Am4M74vhV4IOc5\nJEktlufH+p+B52vWbQP643I/sD0u9wAHgUuEeZbPApvnnEtJUuFm+7/35YRmJOL78ri8EhjKpBsC\nVs3yHJKkEjWjU3mU+r2h2e2T9PX1XV1OkoQkSZqQFUmqjjRNSdO0tPPlvYVlDfAQ8GPx8yCQAOeB\nFcCjwEbG+xL2x/ejwD7gRM3xRkdHp4shC0+4xXSqu4zmun6+HrsV52zesf2Oq9nireiF3Xo42yaj\nI0BvXO4FDmfW7wQWA2uB9cDJuWRQklSOPE1GB4E3ANcDXwN+l1ADOATsInQe74hpB+L6AcJTv3Yz\nfXOSVFGdkwYWLlmyjIsXL7QoP9LMWjXqySajGjYZtcs5iz2233vNRbs2GUmSKsaA0AL1nlskSa3m\ns4xaoP5ziwwKklrLGoIkCTAgSJIiA4IkCTAgFMpJbzRRZ93vQ1dXd6szJgGOQyhUY2ML5u+99Y5D\nmOuxryWM45zIgWyqVfQ4BO8yklruMvUCxciItUmVyyYjSRJgQJAkRQYESRJgQJDamHclqVwGBKlt\njXU2T3yNjIwYJFQI7zKS5p3JdyV5R5KaoagawlbCNJtngHsKOkfbcACaWs/mJc1dEQFhEfARQlDY\nBLwdeGUB52kb408vHXs9SrUniktbnYGCpa3OwCzkb16qcqAoc0L6KioiIGwGzhKm1rwE/CXQU8B5\nSpe/JpCWnbWSpa3OQMHSVmegiWoDxT6mCxQdHYvndQAxIMxNEQFhFWHu5TFDcd28N7kmMPaS5pv6\nNYrwfzg7sheqIgJC4b+QV65cmeJ/Nx3cccfPN+UczmomZU0OII02R01Vw66XvpG0ap4ifuVeC/QR\n+hAA9gJXgPsyac4C6wo4tyRV2Tng5lZnohGdhEyvARYDp6h4p7IkaWpvBv6DUBPY2+K8SJIkSSpa\nnoFnfxK3Pw7ckmPfPwS+HNP/DfCyzLa9Mf0gsGXu2Z9RmeVbA3wXeCy+HmhGAWZQRPl+P6Y9BTwC\n3JjZVoXrN1X51lDu9SuibGN+k9Dfl+25rcK1G1NbvjVU42+vj3A351g53pzZVvj1W0RoClpDmOqp\nXh/B7cBn4/JrgH/Lse+bGL/raX98QRjcdiqmXxP3L/IZTGWXbw3wRPOyP6Oiyrcks/9dwEfjclWu\n31TlW0N516+oskEIcEeB/2L8B7Mq1w7ql28N1fjb2wf8Rp3zNXz9ZnNx8ww82wb0x+UTwFLghhn2\nPU6I3mP7rI7LPcDBmP7puP/mWeQ7r7LLV7aiyjeS2f+lwHNxuSrXb6rylamosgH8EfDemmNV5dpB\n/fKVrcjy1btjtOHrN5uAkGfg2VRpVubYF+BdjEfJlTHdTPs0S9nlA1hLqOqlwOtmk+kGFFm+9wNf\nBd4BfCCuq9L1GytfL+M1PCjv+hVVtp74+Us1x6rKtZuqfFCdv727CE1MHyMEEZjF9ZtNQMg78Gy2\nYxzeB3wPONCEPMxG2eX7OqE6ewuh2neAic0TzVZk+d4H3AR8AvhwE/IwG2WU7y+AD8V1ZV6/Isr2\nYuBeQrNDnv3n27WbrnxV+dv7U0JgexXwDeCDs83DbB5//QwTOwxvZGIUqpdmdUxz7Qz7voPQhvYz\nMxzrmVnkO6+yy/e9+AL4ImEMx/q4XIQiyzfmAOM1oCpdvzHZ8pV5/Yoo2zpC+/LjmfRfILRfV+Ha\nTVW+zcCzVONv79nM+o8CD01zrKZfvzwDz7IdI69lvGNkun23Ak8B19cca6xjZDEhCp6jmBHWY8ou\n3/WEDiOAVxAu8lKKU1T51mf2vwt4MC5X5fpNVb4yr19RZcuq16k8369dVrZ8VfnbW5HZ/9cZb30o\n7frVG3j2y/E15iNx++PAq2fYF8KtUV+h/i1g98b0g8DPNqsQ0yizfG8DnozrvgD8XBPLMZUiyvdp\nwh0bp4DPAC/PbKvC9ZuqfG+l3OtXRNmy/pOJt51W4dplZctX9rWDYsr3SUL/yOPAYWB5ZlvZ10+S\nJEmSJEmSJEmSJEmSJEmSJEmStJD8PzxAIwQKcNCwAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -720,11 +947,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n", + " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n", + " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n", + " ...,\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n", + " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n", + " dtype=[('wgt', '" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -786,11 +1071,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 0.5)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/docs/source/pythonapi/examples/settings.xml b/docs/source/pythonapi/examples/settings.xml new file mode 100644 index 0000000000..b8d6b36e13 --- /dev/null +++ b/docs/source/pythonapi/examples/settings.xml @@ -0,0 +1,17 @@ + + + + 2500 + 50 + 10 + + + + -0.63 -0.63 -0.63 0.63 0.63 0.63 + + + + true + true + + diff --git a/docs/source/pythonapi/examples/tallies.xml b/docs/source/pythonapi/examples/tallies.xml new file mode 100644 index 0000000000..f72c8ea83f --- /dev/null +++ b/docs/source/pythonapi/examples/tallies.xml @@ -0,0 +1,39 @@ + + + + + + total + scatter-P1 nu-fission + analog + + + + + total + flux total + analog + + + + + total + flux nu-fission + tracklength + + + + + + total + nu-scatter + analog + + + + + total + nu-fission + analog + + diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 1196c27e10..4ce7641822 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -369,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMDI6NTA6NDctMDQ6MDB0gnqMAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDAyOjUwOjQ3LTA0OjAwBd/CMAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMTE6MTY6NTQtMDQ6MDAUwu7yAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDExOjE2OjU0LTA0OjAwZZ9WTgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -563,6 +563,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "rm: cannot remove ‘statepoint.*’: No such file or directory\n", "\n", " .d88888b. 888b d888 .d8888b.\n", " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", @@ -580,7 +581,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 02:50:47\n", + " Date/Time: 2015-10-03 11:16:55\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -636,20 +637,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.1480E+00 seconds\n", - " Reading cross sections = 2.9100E-01 seconds\n", - " Total time in simulation = 2.7345E+01 seconds\n", - " Time in transport only = 2.7286E+01 seconds\n", - " Time in inactive batches = 5.8310E+00 seconds\n", - " Time in active batches = 2.1514E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 6.8600E-01 seconds\n", + " Reading cross sections = 1.5400E-01 seconds\n", + " Total time in simulation = 2.4023E+01 seconds\n", + " Time in transport only = 2.3994E+01 seconds\n", + " Time in inactive batches = 3.1010E+00 seconds\n", + " Time in active batches = 2.0922E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 2.8526E+01 seconds\n", - " Calculation Rate (inactive) = 2143.71 neutrons/second\n", - " Calculation Rate (active) = 1743.05 neutrons/second\n", + " Total time elapsed = 2.4724E+01 seconds\n", + " Calculation Rate (inactive) = 4030.96 neutrons/second\n", + " Calculation Rate (active) = 1792.37 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -721,7 +722,20 @@ "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "ename": "KeyError", + "evalue": "10003", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the summary file and link with statepoint\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msu\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'summary.h5'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlink_with_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msu\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/statepoint.pyc\u001b[0m in \u001b[0;36mlink_with_summary\u001b[1;34m(self, summary)\u001b[0m\n\u001b[0;32m 610\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mtally_id\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtally\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 611\u001b[0m \u001b[1;31m# Get the Tally name from the summary file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 612\u001b[1;33m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtally_id\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 613\u001b[0m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_summary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 614\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: 10003" + ] + } + ], "source": [ "# Load the summary file and link with statepoint\n", "su = Summary('summary.h5')\n", @@ -739,47 +753,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nuclidescoremeanstd. dev.
0total(nu-fission / absorption)1.0463530.00935
\n", - "
" - ], - "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total (nu-fission / absorption) 1.046353 0.00935" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute k-infinity using tally arithmetic\n", "fiss_rate = sp.get_tally(name='fiss. rate')\n", @@ -799,49 +777,11 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)totalabsorption0.958730.00774
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total absorption 0.95873 0.00774" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", @@ -859,47 +799,11 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nuclidescoremeanstd. dev.
0totalnu-fission1.0916220.011163
\n", - "
" - ], - "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total nu-fission 1.091622 0.011163" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", @@ -918,51 +822,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]cellnuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8020120.006609
\n", - "
" - ], - "text/plain": [ - " energy [MeV] cell nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.802012 0.006609" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", @@ -979,49 +843,11 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2466040.011825
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.246604 0.011825" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", "eta = therm_fiss_rate / fuel_therm_abs_rate\n", @@ -1037,52 +863,11 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0463530.01894
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide \\\n", - "0 (0.0e+00 - 6.2e-01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((absorption * nu-fission) * absorption) * (n... 1.046353 0.01894 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "keff = res_esc * fast_fiss * therm_util * eta\n", "keff.get_pandas_dataframe()" @@ -1099,7 +884,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -1115,131 +900,11 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.641746e-076.859257e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099861e-011.966887e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.556665e-013.717881e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.554650e-035.218094e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.165057e-035.625590e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.276535e-018.544314e-04
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.089493e-035.080374e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.370111e-031.361116e-05
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", - "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", - "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", - "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", - "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", - "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", - "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", - "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", - "\n", - " mean std. dev. \n", - "0 6.641746e-07 6.859257e-09 \n", - "1 2.099861e-01 1.966887e-03 \n", - "2 3.556665e-01 3.717881e-03 \n", - "3 5.554650e-03 5.218094e-05 \n", - "4 7.165057e-03 5.625590e-05 \n", - "5 2.276535e-01 8.544314e-04 \n", - "6 8.089493e-03 5.080374e-05 \n", - "7 3.370111e-03 1.361116e-05 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "fuel_xs = fuel_rxn_rates / flux\n", "fuel_xs.get_pandas_dataframe()" @@ -1254,23 +919,11 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 6.64174599e-07]\n", - " [ 3.55666541e-01]]\n", - "\n", - " [[ 7.16505734e-03]\n", - " [ 8.08949336e-03]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore\n", "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", @@ -1286,21 +939,11 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.00555465]]\n", - "\n", - " [[ 0.00337011]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", @@ -1310,20 +953,11 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.22765348]\n", - " [ 0.00337011]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", @@ -1341,81 +975,11 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.284890e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8679827.022256e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0828016.087096e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0934845.275039e-04
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.284890e-08\n", - "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.867982 7.022256e-03\n", - "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082801 6.087096e-04\n", - "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.093484 5.275039e-04" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# \"Slice\" the nu-fission data into a new derived Tally\n", "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", @@ -1424,131 +988,11 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010002(1.0e-08 - 1.1e-07)H-1scatter4.6205250.038249
110002(1.1e-07 - 1.2e-06)H-1scatter2.0368410.013203
210002(1.2e-06 - 1.3e-05)H-1scatter1.6599160.010107
310002(1.3e-05 - 1.4e-04)H-1scatter1.8615460.013328
410002(1.4e-04 - 1.5e-03)H-1scatter2.0496640.008215
510002(1.5e-03 - 1.6e-02)H-1scatter2.1621570.010245
610002(1.6e-02 - 1.7e-01)H-1scatter2.2244960.013796
710002(1.7e-01 - 1.9e+00)H-1scatter1.9975850.009161
810002(1.9e+00 - 2.0e+01)H-1scatter0.3734720.003922
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.620525 0.038249\n", - "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.036841 0.013203\n", - "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.659916 0.010107\n", - "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.861546 0.013328\n", - "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.049664 0.008215\n", - "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.162157 0.010245\n", - "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.224496 0.013796\n", - "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 1.997585 0.009161\n", - "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373472 0.003922" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", "need_to_slice = sp.get_tally(name='need-to-slice')\n", diff --git a/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data b/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data new file mode 100644 index 0000000000000000000000000000000000000000..b108b863c52d6d385677f2f730b589892ee66001 GIT binary patch literal 71256 zcmd^|d$e6ub;d7-XOK2nC=V@M0tqn&3=n9HH>}G`!Sa5qQGyti7J)%11JMp6g6*Ik z)s~j0kFVNbfcXa>k{)49VUwH1P=e7QI zUhDsy*1vE6CFfuG$@#6{r?-EZKkvLtFS>+&z4S8|w@*Cbh|`Zb^|&LBpVt40^Dnrd z|NM`)KW2LCzZ&?2F6EC`O-n4!y&1uJ-aPslTv_rQmP=}dT|FcEWZ#(SJ zH`uEGO*gjxyDR)b>)-94KWzO>pr4(y$74HjJ|%JKVZ|5j7X{oAw83$5em zs=ZFDkFVVQvHE!Hk*Btg{jYrhvihmPs*bRIZ-4nB8?;vg={ zfpVdoDEBDUV-)qGdZOMq{(r51tBd;j-Z|&XKYD4(hKi11@>dT1yO(cXU;X4WN8EJk zxBtD}U$tghhtU}`H-riMxBt>`I3Il2Jg)V>Cky=`nur@;D#yqP7Pp7h80&it|TXYrQ)EZ)+e#asHbcuRj4FZ!`Ve->})&&QYbXYrQ)EZ)+e#asHb zcuRkrZ}c~{zV3~{w>tE9%)FcDj=SbR1ICPP{oOHdL|nf{z~LC6Cyl@AhUWyop@QDw z8`Pea#@{i|)-Uwr<)wb1Cohk9C_m-1yZnd;9(wY|m->aCygcF|K9whUdBg)x?J-8a z(J%DmjW6{JJ$ZS=L;0a6FOPWBxt`SeYx$3OdqqC!NRQv>Z~Ya!eDD419uHLR#6eHj z-t|xaa_@Ezh4y#9wgEGfl z{ad`He;?mm|Dh)(f7SlC^l!zt^q=u+{-V4k{bxMWk5~U0&-8!z_*J)DJbNvCvqS&u zK7G_tH}CmyXx|4W{g2+W+x_YKJEb0PEbZW-CyoE=El)}wadAx7e}$iW$48z`Je40D zjsf~t_`x4v`h4Qie$qc;e=e&OzE%I1I(XEV`^RE8FZ~00^2V3`f$P7Qm;Qn4zn7Q( zLFEZv9`!~0K~G*@`UmthHoox>Tu;3`{NqTjC$0W!{-M6pxSlkg{`qyw$| zx&FYTzB6O_yYjjIOaAfM_ScFl)>rGkKKYg}Uq2Gs&y&bM`u7>M{R6sI_@RSFZU6Yv zrc)O0b@eJO{(^UY#rBVfe%k(TSmXQt%a8hkr~Y)uM}0f=-3XWgXZcIztx#X`k4C?p@tJf_*VIC{}_&Z@bc0>_M_{Nmq&X+ zKR>AjG3<^n{o_i~gEzkP59ncxd_ei32QLr*ID_j!tH0X+@Q<^(9yFfiAMywO5%sVr zJwMaS-{e1dv{x+uaLPl4XZiz=_7Zx~%HNmkKjux@KTi7Lx!Zj5_BEkBKZX2b@C!TL zoAeXgz4Q44{6pdU_POTK#K*i@f__i+hJPsh(8bHvOCB7KVR_8|O5yug{8=;pi0#+; z`~!MW_@Nt~-kjo7`ynol0sf)zqsM-?^Zq0Jn))-qKNP;zelMr^=zp{~c=(5xm;M9) z@bc1s;2&Nd?Tzx!qH(;Jm;M7ijFAsNtMex5At=1sfAF7p-AQ`Tc$PotKlo3~o1_Pg zSMqm51^p$&za$Dj*8PCe^^`DGq z?MFP?8^;d+$#|vzQhO&JdO-hWJj)-^-iep~lksZ)TK<#qJ^7EtTmED5mj75h+MDt@ zNdK{T%YU4F(SI^t?LW(ZGM?oR^lSM~#w+=2`%lI*{UE;OKN-*T3*PddjA#DSx=GT$ zQxfnwbPT6mIWTG2Y3r-+UbOb4TPLm$?K!*TKMQ7`^uu)htuIsKS9S2Ge(iuq9y@i7 z#`jq_v@6q`FNq05hzo`D;aIEKB_Vq0qP}*UyBss8Bq)9Ulrr1)<+tZsid|0eYp;-48m&&|htc__s{E7r%& zpB&q(I*RAB#;fgzJleX>hm_A6&-xGTNAW}CQ$A}v%OCKkQ-8&BEV>)*sPsR}U+~oa zVFJ%*Ek4r^c+zVS`K<9wzu?I)0{KbmN2UDCKfM0aes5q){3qjC`Mv&=@vQxjH)sbs z2I)T;&-%~nKN-*RNAy=}cgmyWKN-*R*XutSuj zkVhr|$#~X($UDn_GM?oRc*}n>p5-ri%YQPS=?A>!KN-*T3*PddjA#DS9(}C3r9A#Q zXX~N!_SkzvXunTH{xkQBzgnEGp9de({_nAXa?mkQeJX`tF!2W~6F*Q3czFl^JG!1K z{NRQu^7+%99X#?`;rkx`S#$p_j+^g-y3>=P#9~6G*^}*);(KloNfy0sbhcv$b-#*$o{*nHLd{*MO`v28bfAqT? zKOvvJy!0>RvzJGIi+pz1AN?)zS>svzqyF$Ok`X4;}i}Eo*M@s!!{(*;o#phQk zpSAcb|G}fbMLugh(;s;BH??2NL#6yo|KQQz)PLQ0=0Bpp6L;@7_I&r6{nl64K0EG| zE3SVkwBM5?{~8@!aaYP;(cg(*dBVpgoc*3BG=6CFoQD%H`aALa*UxW8G=AZ-iKB@Z z{hj#NM=pP6@%2#CU&G_lLI{u1)deD)ce~(lOzi{=$wJHC9S@ZXG z@T6ajpZoFMoAFb;?k&Xg&g36+$$ymi3+C*-DaC&_#s`NZ{3|H@+^N?#&)@3D)SFg- z!!f){`Ka;Vx~_TtA8(gD4h~1k;}I?Xf{8aZ_n%_>tpkT+Kt3w*7kvF|o&F>J>mJHS zji0mkZ&UlB-{D^(AJy_}@#E)=RKKWiho<*YR6egi;={jUd!&5S__=xegNJ`@=J}}d zdH)MOjl1dZ8qe|%Jp5}T&qs}C`41lcMfFd4p!6TpA9&$5oY&$<9hChm=X>$5jPJ?6a=sV;%6OK4(7)wh8PD<`yyagR&-4f0 z@~@0%`Uh|MSH?5{0*B9`V}K7{a^{tN_YSw_`xN{O<(52rSm9au(QcB*bwJ@+`=Q?? zkL!@av;M>PG|5L_>+4f^mOr@eN*>o?g=hYS>%Qcv{z2n&|B77a{0EGS6`uJQ#yv8A z92c(B;OXD}`Um4HJ@Aa>YXYJ?puZ(B?=k>3QXZhpxuZ-`>zjD48|H}BD z{43{k|M2=(&iCS9IiJTz{#*W)^V;~!@~@2V$-i>G7yrt5mVcZ~0foyZj5!rM`aARcC$f_Fsnfnv&Z6_mY3%IfBBo`*$V(YQ3b~H+5OX!e^L2^!n6CgrSTV@Ybd;O|G0DfMfX9q`0W0> z9Dj-NxXS1E-=%+vd@y;5r;q)fqHzl0Gje zJe$8D<}Fm1x9R1@yosuh=8bxJ)EoXK@EBP1ZWhy+Izb5iE)tmC@ZiQ#_ z=Su#Cd8rD|=I@pKEAp#?!n659`neh|0wa9e|Y_8*H#1J{!{+`i`RcLz9;|5c-DSi z|H*jPe_sE|c$PoN8}tMEP5Mv9v;6h?PsTI-c>O2id-9(W@AaP&@AaP&k9N2GC*xWB zfw%l8<5~ZKxBMsLS^j`W9+mtj<5~WKxBMsLnSQ`q{*&=czu+zZ$#~{JcyAA%Lq}Tw zW3)Q@-cA3w?mvDL{`Hw0{wVR_D$yTWeD?lty#KZ|@uELW zUc9$kVcj9*fl_`JU%WS5(Yg<44>LZMH)_z|9$#~X(UjNB>mOozq$#|B(UjNB>rhl*hlz6ZI zlz6ZIlz6ZIlz5TvMgJ-BLO)f>e=?r+ANY7I`%lKR`~h$IPsX$S6@1ZuGM?!NyyZU` z&-4r4@}G=%`484{y6(JfAANTC`LKKAKWzObalK9c71xCut`wfFA64?7I38U*pzy6* z+s*v%lK;%1b+ix60qF-zNPB>wb87=|5Qa z$jeLr!MaOcUiuH#ee&|se}-t?IxjE%r?37)Gk#I}kF`I=sgUoq{$k2wg=hWG`Qa+A z-!$BfXZZ&{=6he?U)K{6R(0c9{)3O@9}c2DwftlH1CMnaMSE&I(?6Y$d{5;@Ip$t{ z#b509#tUJO#y{BluOG{`iE!_Grsf>(H3(g{RE_;^`lLG3?pspRFH{ zb*m+h?~xjxuV0OIvn7u_RCu<2HrDNyJl645c(#7G*mtB7?GY57tsgJeEw4m-m^`i< zD8FbAlNal@(>_`&;pZkV){U>QZakI8aZi21X!TYQ#(;Nc(C|J`_&|AG&cf8F@eTz}xPI`nVFm;NE@W5$>MA^gzfrGJR}n7s54Q6H0+{vq{mwV%)n z+CSx?#iQRTU&((~cjH<9f=9cF`V{Klx&IXOBI={@Ous@esoYZk@7O~9XM9ik&v@2; zUj1i$Px|l9+xjo@=y&7+=?Q+4`me+bz0mcu*+&KWTjIU?FY#Xemw2!KOT5ra$MxT; zztBrj|E2ioH%tE+&+->M@<7z5(EnrCe-_`R|F_e7R2L6T-?(Ja%i&KN{j>dJ#q~1z z$1Hk&sqy*#nc{lcF@D$heE(Rf|5R*({jIZmz8NXZcgDR|M`khwmr@4MwywtDMpT!Hk(D&y?e-R0N|;)PzSBZU4e9{NK+iq9*wU!xzPm(*@je|vAC z{y0B&{grsH{z|-8f8BXoe<9wq(aX$1{#m{?U;Lf8r{?)~EUJw1PKj8h-{Q4*BAN8;vpA&Sx z(VuMp_X_{9c-j9n{&dHe`A643H!t&_u77SG{f2(*kK<1_AN`}zfBd{=|17Khr2hT>mXzj(?_#@rT8W@lqA9zpDearl|NbhkfAadN@%jB5 zsXw}Zldc~YFZCy{pB69mC$FCtFZCD4pUwRXi#OZ~?BH1F?QywoqXXBz)myworCr<<4h zrF?Sp&>x<^Nc}72XZZ^rc_8(#@Jv78@%&ZlU*Va4z53s;Rlu#NkQ1+a(7b-fQycwf zJS)Ff{~6EP&#V88?@9k9-mCu-kA8>mmGocYz54IY+xjo@Uj3JNul`HCSN|p6tN#)& z^w;tI8T!k3mcQVU2POSyJkt+&OaB?~(m&pV`^xsaPWso4zYCLE1tk5m`J1Kde;ofW ztu#KLKUUH|=5H%Jo4+RY4;{U)exZ16PYw!Jjvx6(|Ma_?m-?sjxOu7n*dERJ!K%O1zZ^eUywtxOKUh5UhxwcI{3+n? z3eWNn=VAV)96u;L%YVUR{${uM+Wbw-8xL~)pu}hT7xTr@?-l%Gcx0#9Prm=nFuCy$ zHh&!LM)gQM{6pc{{B<#3KJhc_`v*&d!n67FV!nRj;U5am=I@L51*-aM%N5Q2dxh8D z|44D^{V)8km0#ln+K=AF;krYgXYx1?c|2S<$Z)s#EPud5|8o5SrT#2`1)p?`zbib`56(k7iuNefznQ;X z(m%aVR^9aS7gp{#|9`^%jsDsDV`w)j2lB2uDZam{@$CJzlK$g$WN1K%&)%Oa>Hnkj z{;0yU_xGg!QI8MP`=bia-X9e2D^-`r_eaqVLE+i^i{gDL+JCEAzrf<9{uhY%4=rBm ze_70bclo9M`=f8WdE_nHeNlXW)Xj^0uO`%gNb8xH?GOFn{m~h8-NE0L_GA5z^XUD} zYNhZGg=hH(KIVI0-`~Xk3;4Ujv;4<-;{DNXJkuX|@&0Hxp6S2jA5oX1)ypR=zvi0v z^$kvG{DZx}UhjKKSY0+yz~#c{w4h??Z@Iv|Dg4E+`RM;T!)d@R($CnqCd>~ zBM$Oi^oPc?{sSM6BbDe6jc54-KE_?rv3`+Kf0n<34|4pX@Jv78k?*2EwDL3kf=9lK z{?K^lA0pq8H_%Uo^1pKn{U_sD`Mv&=@vQy4{*&>n|GfT_@hpEtzRUJY?Vs^1e?`7y z{V#lu#xwnke6LFWlf`Ge*MCa9*MCa9$am=1U4N19mFN$%{e*tN2mD>hf7X9EFCNSO zlhvQ)4|vOeGM?qH;EVo~@k~G9E&s`QreE-u|71M#AG!V{eO`t2Brp5H9&dhYkF5r$ zHvYrbFO=(Fg2#H23eVP0l+e#1-0`Wu1M*d_f2@?BwI6uoEAj?^S9sQcI1lTe%JrWWp5+gCq4#DEUw8 zCRu9$vRvcY{v9R%iO&)4)OfakNNM~N$D?-!rTlFF666i)jU)EYQFyk0O38n)e~!Yl z{aZx7rhdSFBnr>=kCFaE`&Zy|wEDCCbEN;!{uORs`VZ}2;pUP5$X9BQZak|$c(H#@ zH=eaW`1n0?IlXt(yg#P2KkI++ly8;D2d({C{s|uY=LGy+iO=#M=VAXGkq=sYra$mv z|D0~|nf}2eUqwD>@tOaK{ld_16@6YcedqHIf8yn>1`lZbi|rpK_phV!RMW}76kgfC ztYiPYY6kh2!n6Gc#eQw6{1fWu7i}DgPQrnO8Hs) zfrtN0ub+D^>Q;W%f8gOi7e_we?@D}@KR6H9%k3Yj%ioP>`3oNY6W1M0`JlBQ(+_y~ z&!e&by2jr;=i!d_hyRFt(Bd=yDESZe1OMFh`;I*L>9-6X*!U0IKegmPn9r>6%Koh> z-_Y+>+|PAIrSNS3*pmOm{b=vgc(#9S$$#RwXyM&Te71jX$$vJUvUsnnH{BN$p6%aU z@}J1BQ2BiS=92%crS~6{_-y}X=|7Z@)iZVZ*J<(D{_`T=D*7G$sPfAG%>nsF`QMdS z_HPc@znS#cl~?v}4%olB^>CT_m(qUP{>=gV&&&PeHD1}jIZ(b0hX?ng4kG>)l)EUm35I-}bMJXYJ?p zuZ(B?=k>3Q@5#S1z9;|6`Cj}h<9qV2oX`D3c+0;sp6L&~9QjA#CZ>mHQ@*R2Y^Hs$ssryg+3 zxWVZK|3cnKewe-oC_F1au6vT7MBf7xp0yvYdy;>iz6U5g>pxugB#-X_3eWNfc_aDD z>3e{}Gyg)~NPZXk9-#5Le<5!qALsFn1chh*h3lT=*VFd^jo17G`GU{6KYou?<7@tf zar{$p+=o0=c`bg7J5oIw$DLhy&A)IR9IfN8=*Fx5h3nuGaopXN*Zd3Pu9%NQ1JsUc z{pal6IsU@9>%|y9bm3Y4<2;PJo{#nK#xwna$GA)6qgH;VfAF{tihR`gp8V^eE%dL9 zXXW?$SH`pU^ZHlDv;On?SH}0`Um4$%f8~5H{+01P`B%B z&iCS98Q+tC<$N#xmGLb9pnuE1GM?o>c+0;sp6L&~A4T;rNn3Lhx0Ignnurk@OOo0{fF}~ ze%d}hx9L`XmOtR(KXKirJJa|_iO=#EJpAWadhUb2D?HN=&V&CPM$dilcZFyA#d+|b zTj{wE{;u%MKT7_Cc@2HjPXFzUJ+~e_r12m2{IKLdr_j6xg=fz%OaAl5q3h4t_svHt zg=f!COa60w9sePXXU}g-{xewf_h>wOeq8dOI4)Z>pp>6Izb^UDr(*n|@a*|{$$#d? z`fI%U{2u*Hc~fnBSl#{_&*m>6&*VJ157qJ4xOq8`<*X|QCM`Q{y_?587U^F~`>FNE zJeH}#zZ9OeKk6U*yRUD$@GpgD{SO}V7Iqi@rSL5Oz+)bZ^e=^H`41lR7LFGFrSMFD z;4zOy`j^5p{e#E61(DB%{$HG)KVaS*eGYuTLOvh(56AbNdgIoEGaCP5^SA2ij!*kl zCZ6h3DLk7$hIw-`{_n`Y6rRmrL*7XK#He2_KAS&>d2^D-JZ2?6o4-f($Mr7NAO5BA zZ2lnT&B^%Df9?qiug+gYf8lfHkbfyWoBv7Y2kAdF4@!%#^3s239+sPj|DgQvFK_wb zKS#wIs^|wTzS@4sqpj=r4pKgAJnKKSAN(is4|I#q@&`Qp2YG|P>-F!Pe-8h_dlOxF zrXQRK{}K7D)t~7XJp4!Gv&J+3@cPf8t%lL&pL_i$<5~H={*&>n{g5}*4(Rtv`cKC9 zH7H>Ua-yJVU7Q=_xB>#Ie#F2uUT6uJbQl-?>)-+UySQGXgqs=k@z5atmC7^XYWtO z?{8_oTdF_SUs8DX{wCggl<|jX9S((8-ycPL<8!bMhr+Y>cji_h{GJl@0JSm)i6fWK?;FJ87jegDCE@jlAha3I}x#NQR3 z=@;kWJ#3)|t^JsPc>U*3x6pqwo|T{c1MQuT(tk3(C;!QK)_-3A$#|AOqP%SiI#w7H|2F#asU4e=?rsFL=v;GM?!N zyyZU`&-4r4@}G=n{)2U^=yQ^Opog=LowV!x*R~m)+4v7zzX|JBNuKIcDLh+03gceM zV;vxcXX{sC-73jr9Uz5g>t|uzD#^#|z*4RJ>iS)1FMQ5s8viKq+4^mCe#iJFUI%Xr zUS9gge)V;1shgMnLE}d^Fa3kop>*@oKcEM1{fQ4~f9S!>!#~cdpPM%0AB9)@AO7*7 znjeOawEDCBL;u4+q8=8f{ZEznEdRlyy@VdL_)LG`(OyCi8qf3(oul1xgdPSy_~bb| ze0kf!_cZ>&)_(?srnSQ{dzGyf6UE!I2OZvyY5_77bZ~FGV+YZiZ z^v~9h7WGZ~$2#g7pRXS;`;E#?`>?OB6rQc0E$W-%V;yycSJ&@GeGwn)s4F~MKOXHY z*U`s5EM8u&qaUv$3kSTsTt^@4sC#+2jy~2=_wsTbeJW4z^0B_nI#5_g-OJOu^#T2d zb>+v#H|ywQ9d$2{b@YXvwEC<0hjsL6+=o2Yc$WXjKhziFM*LkXf382AhjsMH|Im(F ze5QYz?~L-MBlPt7byNTR^QUY#_}<1p*!~r=-$nmb3eWb>5c925{Fo1`HD2An1LZ}0 z_=g_9**_BPC-skgoV>i$Km5bXOZ~$?yu8#u{KLyj{lh=Jyvzga!{Ftm{^1{E;~V`$ zPhKASNB+P+ygc;(xOjg<;nn;_c||)0g=hLf{zCs0Kj~lLnSQph)3q5(`OZ`GmULNt#ez=}`dBmglCU6~8>#yZM;_W4#f9mm@{hMXK zq5RO(2llz78oFxx!NW8C&Y0QkA5G^6oDUv)(s}#(N$pvAd8t3>$;;z>lplKX@;Dzn z^yKAnK6vQY%gcU*p1eHHM||jMY<#0X=*i3De8h*Iygbea4?TH#oDUv)^71%8_QUFQ z|6k`D{m6bpeCP>$dx0A4-`I=(I6rp%S-hn`i?{S=@s|E9-qN4N%YKBO^#1E?f1Hp0 zm-@5f<9zVYlQ%xj2M;}Yd7KX(dh+r(A3XHr<#B#Vf4uz~{k1i Date: Sat, 3 Oct 2015 11:40:52 -0400 Subject: [PATCH 269/519] Corrected tally slicing for Python API MultiGroupXS --- docs/source/pythonapi/examples/geometry.xml | 8 ---- .../pythonapi/examples/materials-xy.png | Bin 1271 -> 0 bytes docs/source/pythonapi/examples/materials.xml | 12 ------ docs/source/pythonapi/examples/plots.xml | 8 ---- docs/source/pythonapi/examples/settings.xml | 17 -------- docs/source/pythonapi/examples/tallies.xml | 39 ------------------ 6 files changed, 84 deletions(-) delete mode 100644 docs/source/pythonapi/examples/geometry.xml delete mode 100644 docs/source/pythonapi/examples/materials-xy.png delete mode 100644 docs/source/pythonapi/examples/materials.xml delete mode 100644 docs/source/pythonapi/examples/plots.xml delete mode 100644 docs/source/pythonapi/examples/settings.xml delete mode 100644 docs/source/pythonapi/examples/tallies.xml diff --git a/docs/source/pythonapi/examples/geometry.xml b/docs/source/pythonapi/examples/geometry.xml deleted file mode 100644 index bfd99e0b96..0000000000 --- a/docs/source/pythonapi/examples/geometry.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/source/pythonapi/examples/materials-xy.png b/docs/source/pythonapi/examples/materials-xy.png deleted file mode 100644 index cfed789b25a6f93030995c5645caee5dfd7cb7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmZ{jZ&Z?Z6vrPkJ7-pN={b=rqgImUOl%el1V#q}n*tF{O4IyPDmwKf9Z}Oq$uuj= zESH65)3TZ;8FOV(N%K!yS)^vzY?!iAK}7=g_T=jut|LAo=NqwkRjNcSz$gw?g&LSB%=tsu&h8 z1cEYg5R{w$3CuBzo5M`^5mOu9~ zF#3BY9XjUZ!LpmrQdzsx?D}zLLE9cDQXt6jbr7A#kJpS#Ny%FL7X{fxV|Tk36&E{) zdT-t!%CC?xxlx3PMnPpWlY7Q7Da!HoR`S;r&+XO(?&nFX9u}@T@~~oX@+_oNk*=kh=s!#L`ybsuCBRqUSDLXOxK(w%WNNM1uv}@4aZw66MG#PT#5 z5C+X!{G=y2px37651z;io>5Ms_s*kr+QKC3(hZl|>0>#A!& z*!pmV?K~Mte+ZM&B^tQFVbr7fmz<29#|=Zw_JPf%c?-*_a_ufazLnWe8j1A%6D5%V z3)w4qNhN}LR=-)R>@~a(c*HA`1FSOd2W#d)58Q8-cMrC{MfE%75uj2JJJ^ha2*w@$ z7Q`cMm+X06XyHucub@V+s+sfCVQDtZl&o(WOTI)fvyC=vHVPR}Q()vfP-(IiQ$ULW z`(hT`HO%>2Y(kb>QJ2HO>}JCp28$kmZ3D^{^uz?U_1|2?PXv6g1NHzM{sbL;gG7pe zy9R8V9f(oGW8z10BX-1cHp^_tHxf9Y?K%9%u - - 71c - - - - - - - - - diff --git a/docs/source/pythonapi/examples/plots.xml b/docs/source/pythonapi/examples/plots.xml deleted file mode 100644 index 512070a33f..0000000000 --- a/docs/source/pythonapi/examples/plots.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - 0 0 0 - 21.5 21.5 - 250 250 - - diff --git a/docs/source/pythonapi/examples/settings.xml b/docs/source/pythonapi/examples/settings.xml deleted file mode 100644 index b8d6b36e13..0000000000 --- a/docs/source/pythonapi/examples/settings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - 2500 - 50 - 10 - - - - -0.63 -0.63 -0.63 0.63 0.63 0.63 - - - - true - true - - diff --git a/docs/source/pythonapi/examples/tallies.xml b/docs/source/pythonapi/examples/tallies.xml deleted file mode 100644 index f72c8ea83f..0000000000 --- a/docs/source/pythonapi/examples/tallies.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - total - scatter-P1 nu-fission - analog - - - - - total - flux total - analog - - - - - total - flux nu-fission - tracklength - - - - - - total - nu-scatter - analog - - - - - total - nu-fission - analog - - From a0d1c3b7c5fa3d97c2010512a9bcdab5e99dea05 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 12:41:07 -0400 Subject: [PATCH 270/519] Adding multi-group cross section generation IPython Notebook --- .gitignore | 5 +- .../examples/multi-group-cross-sections.ipynb | 2864 +++++++++++++++++ .../pythonapi/examples/openmc-mgxs.ipynb | 1112 ------- .../tracks/128_angles_0.1_cm_spacing.data | Bin 71256 -> 0 bytes 4 files changed, 2868 insertions(+), 1113 deletions(-) create mode 100644 docs/source/pythonapi/examples/multi-group-cross-sections.ipynb delete mode 100644 docs/source/pythonapi/examples/openmc-mgxs.ipynb delete mode 100644 docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data diff --git a/.gitignore b/.gitignore index 5634632fa4..c5c4c729da 100644 --- a/.gitignore +++ b/.gitignore @@ -62,4 +62,7 @@ data/nndc .idea/* # IPython notebook checkpoints -.ipynb_checkpoints \ No newline at end of file +.ipynb_checkpoints + +# OpenMOC tracks +*.data \ No newline at end of file diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb new file mode 100644 index 0000000000..14392ec971 --- /dev/null +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -0,0 +1,2864 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates how to use the **``openmc.mgxs``** module to generate multi-group cross sections with OpenMC.\n", + "\n", + "**Note:** that this Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Infinite Homogeneous Medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Inputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "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')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.028999667)\n", + "inf_medium.add_nuclide(o16, 0.01450188)\n", + "inf_medium.add_nuclide(u235, 0.000114142)\n", + "inf_medium.add_nuclide(u238, 0.006886019)\n", + "inf_medium.add_nuclide(zr90, 0.002116053)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.default_xs = '71c'\n", + "materials_file.add_material(inf_medium)\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.add_surface(surface=min_x, halfspace=+1)\n", + "cell.add_surface(surface=max_x, halfspace=-1)\n", + "cell.add_surface(surface=min_y, halfspace=+1)\n", + "cell.add_surface(surface=max_y, halfspace=-1)\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('box', bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a \"fine\" 8-group EneryGroups object\n", + "fine_groups = mgxs.EnergyGroups()\n", + "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", + " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", + "\n", + "# Instantiate a \"coarse\" 2-group EneryGroups object\n", + "coarse_groups = mgxs.EnergyGroups()\n", + "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MultiGroupXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of generic and abstract `MultiGroupXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\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 cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define total, nu-fission, nu-scatter and chi cross sections for our infinite medium cell as the domain and our fine 8-group structure as our energy groups." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate cross sections needed for an OpenMOC simulation\n", + "transport = mgxs.TransportXS(domain=cell, domain_type='cell', groups=fine_groups)\n", + "nufission = mgxs.NuFissionXS(domain=cell, domain_type='cell', groups=fine_groups)\n", + "nuscatter = mgxs.NuScatterMatrixXS(domain=cell, domain_type='cell', groups=fine_groups)\n", + "chi = mgxs.Chi(domain=cell, domain_type='cell', groups=fine_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must instruct our multi-group cross section objects to generate the tallies needed to calculate each of them in OpenMC. This can be done with the `MultiGroupXS.create_tallies()` routine." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instruct each multi-group cross section to generate tallies\n", + "transport.create_tallies()\n", + "nufission.create_tallies()\n", + "nuscatter.create_tallies()\n", + "chi.create_tallies()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'flux': Tally\n", + " \tID =\t10003\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", + " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", + " 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['flux']\n", + " \tEstimator =\ttracklength, 'nu-fission': Tally\n", + " \tID =\t10004\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", + " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", + " 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['nu-fission']\n", + " \tEstimator =\ttracklength}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nufission.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `NuFission` object includes tracklength tallies for the 'nu-fission' and 'flux' scores in the 8-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Add transport tallies to the tallies file\n", + "for tally in transport.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Add nu-fission tallies to the tallies file\n", + "for tally in nufission.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Add nu-scatter tallies to the tallies file\n", + "for tally in nuscatter.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Add chi tallies to the tallies file \n", + "for tally in chi.tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + " \n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", + " Date/Time: 2015-10-03 12:30:47\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.14249 \n", + " 2/1 1.18016 \n", + " 3/1 1.16083 \n", + " 4/1 1.09124 \n", + " 5/1 1.15214 \n", + " 6/1 1.13453 \n", + " 7/1 1.15552 \n", + " 8/1 1.18149 \n", + " 9/1 1.10404 \n", + " 10/1 1.15703 \n", + " 11/1 1.21224 \n", + " 12/1 1.14147 1.17686 +/- 0.03538\n", + " 13/1 1.12601 1.15991 +/- 0.02655\n", + " 14/1 1.11972 1.14986 +/- 0.02129\n", + " 15/1 1.15683 1.15125 +/- 0.01655\n", + " 16/1 1.15236 1.15144 +/- 0.01351\n", + " 17/1 1.17833 1.15528 +/- 0.01205\n", + " 18/1 1.13229 1.15241 +/- 0.01082\n", + " 19/1 1.22394 1.16035 +/- 0.01242\n", + " 20/1 1.15867 1.16019 +/- 0.01111\n", + " 21/1 1.13611 1.15800 +/- 0.01029\n", + " 22/1 1.14101 1.15658 +/- 0.00950\n", + " 23/1 1.20864 1.16059 +/- 0.00961\n", + " 24/1 1.13475 1.15874 +/- 0.00909\n", + " 25/1 1.10697 1.15529 +/- 0.00914\n", + " 26/1 1.20824 1.15860 +/- 0.00916\n", + " 27/1 1.16775 1.15914 +/- 0.00863\n", + " 28/1 1.15904 1.15913 +/- 0.00813\n", + " 29/1 1.16967 1.15969 +/- 0.00771\n", + " 30/1 1.12574 1.15799 +/- 0.00751\n", + " 31/1 1.16177 1.15817 +/- 0.00715\n", + " 32/1 1.18082 1.15920 +/- 0.00689\n", + " 33/1 1.19549 1.16078 +/- 0.00677\n", + " 34/1 1.18508 1.16179 +/- 0.00656\n", + " 35/1 1.17697 1.16240 +/- 0.00632\n", + " 36/1 1.16342 1.16244 +/- 0.00607\n", + " 37/1 1.17400 1.16286 +/- 0.00586\n", + " 38/1 1.19281 1.16393 +/- 0.00575\n", + " 39/1 1.15669 1.16368 +/- 0.00555\n", + " 40/1 1.17987 1.16422 +/- 0.00539\n", + " 41/1 1.14129 1.16348 +/- 0.00527\n", + " 42/1 1.18323 1.16410 +/- 0.00514\n", + " 43/1 1.13885 1.16334 +/- 0.00504\n", + " 44/1 1.17943 1.16381 +/- 0.00491\n", + " 45/1 1.20014 1.16485 +/- 0.00488\n", + " 46/1 1.16056 1.16473 +/- 0.00474\n", + " 47/1 1.20077 1.16570 +/- 0.00471\n", + " 48/1 1.15469 1.16541 +/- 0.00460\n", + " 49/1 1.18862 1.16601 +/- 0.00452\n", + " 50/1 1.18755 1.16655 +/- 0.00444\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 3.8800E-01 seconds\n", + " Reading cross sections = 8.8000E-02 seconds\n", + " Total time in simulation = 1.4079E+01 seconds\n", + " Time in transport only = 1.4061E+01 seconds\n", + " Time in inactive batches = 2.0330E+00 seconds\n", + " Time in active batches = 1.2046E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 1.4478E+01 seconds\n", + " Calculation Rate (inactive) = 12297.1 neutrons/second\n", + " Calculation Rate (active) = 8301.51 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.16600 +/- 0.00432\n", + " k-effective (Track-length) = 1.16655 +/- 0.00444\n", + " k-effective (Absorption) = 1.16281 +/- 0.00314\n", + " Combined k-effective = 1.16367 +/- 0.00307\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run OpenMC!\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. The first step is to load the tallies from the statepoint into each object." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the tallies from the statepoint into each MultiGroupXS object\n", + "transport.load_from_statepoint(sp)\n", + "nufission.load_from_statepoint(sp)\n", + "nuscatter.load_from_statepoint(sp)\n", + "chi.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The multi-group cross section objects can now use OpenMC's [tally arithmetic](http://mit-crpg.github.io/openmc/pythonapi/examples/pandas-dataframes.html) to compute cross sections from the tally data." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1485: RuntimeWarning: invalid value encountered in divide\n" + ] + } + ], + "source": [ + "transport.compute_xs()\n", + "nufission.compute_xs()\n", + "nuscatter.compute_xs()\n", + "chi.compute_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cross Section Data Visualization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect our fission production cross section by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 5.93e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t6.60e-04 +/- 3.04e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t9.00e-03 +/- 4.10e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.44e-02 +/- 6.58e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.72e-02 +/- 9.80e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.59e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 7.92e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t2.39e-01 +/- 6.90e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
63111total0.0774600.000890
62112total0.0872760.000331
61113total0.0004500.000026
60114total0.0000000.000000
59115total0.0000000.000000
58116total0.0000000.000000
57117total0.0000000.000000
56118total0.0000000.000000
55121total0.0000000.000000
54122total0.2666510.001340
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "63 1 1 1 total 0.077460 0.000890\n", + "62 1 1 2 total 0.087276 0.000331\n", + "61 1 1 3 total 0.000450 0.000026\n", + "60 1 1 4 total 0.000000 0.000000\n", + "59 1 1 5 total 0.000000 0.000000\n", + "58 1 1 6 total 0.000000 0.000000\n", + "57 1 1 7 total 0.000000 0.000000\n", + "56 1 1 8 total 0.000000 0.000000\n", + "55 1 2 1 total 0.000000 0.000000\n", + "54 1 2 2 total 0.266651 0.001340" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = nuscatter.get_pandas_dataframe()\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "transport.export_xs_data(filename='transport-xs', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export all of four cross sections to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "transport.build_hdf5_store(filename='mgxs', append=True)\n", + "nufission.build_hdf5_store(filename='mgxs', append=True)\n", + "nuscatter.build_hdf5_store(filename='mgxs', append=True)\n", + "chi.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Verification with OpenMOC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. First, we will use OpenCG to reconstruct our OpenMC geometry from the summary file into a equivalent OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n" + ] + } + ], + "source": [ + "# Import OpenMOC and the OpenMOC/OpenCG compatibility module\n", + "import openmoc\n", + "from openmoc.compatible import get_openmoc_geometry\n", + "\n", + "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", + "su.make_opencg_geometry()\n", + "\n", + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can inject the multi-group cross sections into the equivalent infinite homogeneous medium OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Get all OpenMOC cells in the gometry\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Get a reference to the Material filling this Cell\n", + " openmoc_material = cell.getFillMaterial()\n", + " \n", + " # Set the number of energy groups for the Material\n", + " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " openmoc_material.setSigmaT(transport.get_xs().flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs().flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs().flatten())\n", + " openmoc_material.setChi(chi.get_xs().flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685180\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.785704\tres = 3.148E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.750352\tres = 1.467E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.729115\tres = 4.499E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.696059\tres = 2.830E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.663970\tres = 4.534E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.633141\tres = 4.610E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.605167\tres = 4.643E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.580592\tres = 4.418E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.559758\tres = 4.061E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.542846\tres = 3.588E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.529901\tres = 3.021E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.520893\tres = 2.385E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.515699\tres = 1.700E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.514152\tres = 9.971E-03\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.516033\tres = 2.999E-03\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.521086\tres = 3.657E-03\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.529034\tres = 9.792E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.539585\tres = 1.525E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.552436\tres = 1.994E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.567286\tres = 2.382E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.583843\tres = 2.688E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.601819\tres = 2.918E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.620946\tres = 3.079E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.640969\tres = 3.178E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.661654\tres = 3.225E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.682785\tres = 3.227E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.704168\tres = 3.194E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.725628\tres = 3.132E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.747011\tres = 3.048E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.768182\tres = 2.947E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.789024\tres = 2.834E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.809439\tres = 2.713E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.829342\tres = 2.587E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.848666\tres = 2.459E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.867356\tres = 2.330E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.885370\tres = 2.202E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.902676\tres = 2.077E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.919253\tres = 1.955E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.935087\tres = 1.836E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.950174\tres = 1.723E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.964514\tres = 1.613E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.978114\tres = 1.509E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.990987\tres = 1.410E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 1.003145\tres = 1.316E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 1.014610\tres = 1.227E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 1.025401\tres = 1.143E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 1.035542\tres = 1.064E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 1.045058\tres = 9.890E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 1.053973\tres = 9.189E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.062316\tres = 8.531E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 1.070112\tres = 7.915E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 1.077389\tres = 7.339E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 1.084173\tres = 6.800E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.090490\tres = 6.297E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.096368\tres = 5.827E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.101830\tres = 5.390E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.106902\tres = 4.982E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.111608\tres = 4.603E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.115969\tres = 4.251E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.120009\tres = 3.924E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.123747\tres = 3.620E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.127204\tres = 3.338E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.130399\tres = 3.076E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.133349\tres = 2.834E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.136072\tres = 2.610E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.138584\tres = 2.403E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.140899\tres = 2.211E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.143032\tres = 2.033E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.144996\tres = 1.869E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.146803\tres = 1.718E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.148466\tres = 1.579E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.149995\tres = 1.450E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.151399\tres = 1.331E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.152690\tres = 1.222E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.153875\tres = 1.121E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.154963\tres = 1.028E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.155961\tres = 9.428E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.156876\tres = 8.642E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.157716\tres = 7.920E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.158485\tres = 7.256E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.159190\tres = 6.646E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.159836\tres = 6.085E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.160427\tres = 5.571E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.160969\tres = 5.098E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.161464\tres = 4.665E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.161917\tres = 4.268E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.162332\tres = 3.903E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.162711\tres = 3.570E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.163058\tres = 3.264E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.163375\tres = 2.982E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.163664\tres = 2.725E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.163929\tres = 2.490E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.164171\tres = 2.275E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.164392\tres = 2.077E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.164593\tres = 1.897E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.164777\tres = 1.733E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.164946\tres = 1.581E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.165099\tres = 1.444E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.165239\tres = 1.317E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.165367\tres = 1.202E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.165483\tres = 1.096E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.165590\tres = 1.000E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.165687\tres = 9.126E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.165775\tres = 8.326E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.165856\tres = 7.590E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.165929\tres = 6.924E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.165996\tres = 6.304E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.166057\tres = 5.745E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.166113\tres = 5.243E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.166164\tres = 4.776E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.166210\tres = 4.355E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.166252\tres = 3.962E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.166291\tres = 3.624E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.166326\tres = 3.295E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.166358\tres = 3.003E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.166387\tres = 2.737E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.166413\tres = 2.486E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.166437\tres = 2.267E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.166459\tres = 2.061E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.166479\tres = 1.883E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.166497\tres = 1.711E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.166514\tres = 1.563E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.166529\tres = 1.418E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.166543\tres = 1.300E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.166555\tres = 1.176E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.166567\tres = 1.074E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.163673\n", + "openmoc keff = 1.166567\n", + "bias [pcm]: 289.4\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although there is a non-trivial bias, one can easily run the preceding code with more particle histories to show that both codes converge to the same eigenvalue with <10 pcm bias. It should be noted that this discrepancy is due to use of tracklength tallies for `NuFission`, while one must use more slowly converging analog tallies for `TransportXS`, `NuScatterMatrixXS` and `Chi` (which require an 'energyout' filter)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fuel Pin Cell" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Inputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "this time we separate our nuclides into three distinct materials for water, clad and fuel." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "# Use both reflective and vacuum boundaries to make life interesting\n", + "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "pin_cell_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", + "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "pin_cell_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "pin_cell_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = pin_cell_universe\n", + "\n", + "# Add boundary planes\n", + "root_cell.add_surface(min_x, halfspace=+1)\n", + "root_cell.add_surface(max_x, halfspace=-1)\n", + "root_cell.add_surface(min_y, halfspace=+1)\n", + "root_cell.add_surface(max_y, halfspace=-1)\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will reuse our settings from the previous simulation. Now, we let's create transport, nu-fission, nu-scatter and chi multi-group cross sections for each cell." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Extract all Cells filled by Materials\n", + "openmc_cells = openmc_geometry.get_all_material_cells()\n", + "\n", + "# Create dictionary to store multi-group cross sections for all cells\n", + "xs_library = {}\n", + "\n", + "# Instantiate 8-group cross sections for each cell\n", + "for cell in openmc_cells:\n", + " xs_library[cell.id] = {}\n", + " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", + " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, we did not give our cross sections a spatial domain in their constructors. Instead, we will loop over all cells to set each cross sections domain. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id].keys():\n", + "\n", + " # Set the cross sections domain type to the cell\n", + " xs_library[cell.id][rxn_type].domain = cell\n", + " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", + " \n", + " # Tally cross sections by nuclide (e.g., micro cross sections)\n", + " xs_library[cell.id][rxn_type].by_nuclide = True\n", + " \n", + " # Create OpenMC tallies for this cross section\n", + " xs_library[cell.id][rxn_type].create_tallies()\n", + " \n", + " # Add OpenMC tallies to the tallies file for XML generation\n", + " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", + " Date/Time: 2015-10-03 12:31:02\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.23064 \n", + " 2/1 1.18217 \n", + " 3/1 1.20248 \n", + " 4/1 1.20841 \n", + " 5/1 1.25078 \n", + " 6/1 1.26156 \n", + " 7/1 1.18239 \n", + " 8/1 1.24391 \n", + " 9/1 1.22294 \n", + " 10/1 1.20654 \n", + " 11/1 1.24695 \n", + " 12/1 1.26717 1.25706 +/- 0.01011\n", + " 13/1 1.26830 1.26080 +/- 0.00693\n", + " 14/1 1.25206 1.25862 +/- 0.00537\n", + " 15/1 1.23449 1.25379 +/- 0.00637\n", + " 16/1 1.13532 1.23405 +/- 0.02042\n", + " 17/1 1.25230 1.23666 +/- 0.01745\n", + " 18/1 1.17655 1.22914 +/- 0.01688\n", + " 19/1 1.26829 1.23349 +/- 0.01551\n", + " 20/1 1.26274 1.23642 +/- 0.01418\n", + " 21/1 1.19211 1.23239 +/- 0.01344\n", + " 22/1 1.23183 1.23234 +/- 0.01227\n", + " 23/1 1.22292 1.23162 +/- 0.01131\n", + " 24/1 1.21154 1.23018 +/- 0.01057\n", + " 25/1 1.21882 1.22943 +/- 0.00987\n", + " 26/1 1.22321 1.22904 +/- 0.00924\n", + " 27/1 1.20043 1.22736 +/- 0.00884\n", + " 28/1 1.20998 1.22639 +/- 0.00839\n", + " 29/1 1.26327 1.22833 +/- 0.00817\n", + " 30/1 1.26615 1.23022 +/- 0.00798\n", + " 31/1 1.21810 1.22964 +/- 0.00761\n", + " 32/1 1.23946 1.23009 +/- 0.00727\n", + " 33/1 1.25718 1.23127 +/- 0.00705\n", + " 34/1 1.21614 1.23064 +/- 0.00678\n", + " 35/1 1.23962 1.23100 +/- 0.00651\n", + " 36/1 1.24640 1.23159 +/- 0.00628\n", + " 37/1 1.24546 1.23210 +/- 0.00607\n", + " 38/1 1.21329 1.23143 +/- 0.00588\n", + " 39/1 1.24137 1.23177 +/- 0.00569\n", + " 40/1 1.27335 1.23316 +/- 0.00567\n", + " 41/1 1.24768 1.23363 +/- 0.00550\n", + " 42/1 1.19014 1.23227 +/- 0.00550\n", + " 43/1 1.24273 1.23259 +/- 0.00534\n", + " 44/1 1.20201 1.23169 +/- 0.00526\n", + " 45/1 1.24084 1.23195 +/- 0.00511\n", + " 46/1 1.25992 1.23273 +/- 0.00503\n", + " 47/1 1.19931 1.23182 +/- 0.00497\n", + " 48/1 1.24106 1.23207 +/- 0.00484\n", + " 49/1 1.28278 1.23337 +/- 0.00489\n", + " 50/1 1.26711 1.23421 +/- 0.00484\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.1100E-01 seconds\n", + " Reading cross sections = 1.1100E-01 seconds\n", + " Total time in simulation = 3.4700E+01 seconds\n", + " Time in transport only = 3.4683E+01 seconds\n", + " Time in inactive batches = 3.7780E+00 seconds\n", + " Time in active batches = 3.0922E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 9.0000E-03 seconds\n", + " Total time elapsed = 3.5131E+01 seconds\n", + " Calculation Rate (inactive) = 6617.26 neutrons/second\n", + " Calculation Rate (active) = 3233.94 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.23174 +/- 0.00461\n", + " k-effective (Track-length) = 1.23421 +/- 0.00484\n", + " k-effective (Absorption) = 1.23034 +/- 0.00239\n", + " Combined k-effective = 1.23109 +/- 0.00215\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Delete old HDF5 files\n", + "!rm *.h5\n", + "\n", + "# Run OpenMC!\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. As before, we begin our analysis here loading the statepoint file." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint and summary files\n", + "sp = openmc.StatePoint('statepoint.50.h5')\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object and to compute the cross sections using tally arithmetic." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id].keys():\n", + " xs_library[cell.id][rxn_type].load_from_statepoint(sp)\n", + " xs_library[cell.id][rxn_type].compute_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's it! Our multi-group cross sections are now ready for the big spotlight. This time we have cross sections in three distinct spatial zones - fuel, clad and moderator - on a per-nuclide basis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cross Section Data Visualization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect one of our cross sections by printing it to the screen as a microscopic cross section in units of barns." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 6.20e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 3.40e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.51e+01 +/- 5.07e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.79e+01 +/- 7.27e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.90e+02 +/- 1.13e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.11e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.88e+02 +/- 9.03e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 6.88e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.07e+00 +/- 6.51e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 6.61e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t6.15e-04 +/- 9.95e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 6.29e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.08e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.11e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 9.03e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 6.86e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission = xs_library[fuel_cell.id]['nu-fission']\n", + "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our multi-group cross sections are capable of summing across all nuclides to provide us with macroscopic cross sections as well." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.54e-02 +/- 6.20e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 3.34e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.07e-02 +/- 5.07e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.30e-02 +/- 7.26e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.13e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.11e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 9.03e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 6.88e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission = xs_library[fuel_cell.id]['nu-fission']\n", + "nufission.print_xs(xs_type='macro', nuclides='sum')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211O-161.5704670.018506
1271000211H-10.2356740.009063
1241000212O-160.2883330.003932
1251000212H-11.5812950.008248
1221000213O-160.0000000.000000
1231000213H-10.0108280.000616
1201000214O-160.0000000.000000
1211000214H-10.0000000.000000
1181000215O-160.0000000.000000
1191000215H-10.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "126 10002 1 1 O-16 1.570467 0.018506\n", + "127 10002 1 1 H-1 0.235674 0.009063\n", + "124 10002 1 2 O-16 0.288333 0.003932\n", + "125 10002 1 2 H-1 1.581295 0.008248\n", + "122 10002 1 3 O-16 0.000000 0.000000\n", + "123 10002 1 3 H-1 0.010828 0.000616\n", + "120 10002 1 4 O-16 0.000000 0.000000\n", + "121 10002 1 4 H-1 0.000000 0.000000\n", + "118 10002 1 5 O-16 0.000000 0.000000\n", + "119 10002 1 5 H-1 0.000000 0.000000" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", + "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can easily use the Pandas DataFrame to extract the H-1 and O-16 scattering matrices separately." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Slice DataFrame in two for each nuclide's mean values\n", + "h1 = df[df['nuclide'] == 'H-1']['mean']\n", + "o16 = df[df['nuclide'] == 'O-16']['mean']\n", + "\n", + "# Cast DataFrames as NumPy arrays\n", + "h1 = h1.as_matrix()\n", + "o16 = o16.as_matrix()\n", + "\n", + "# Reshape arrays to 2D matrix for plotting\n", + "h1.shape = (fine_groups.num_groups, fine_groups.num_groups)\n", + "o16.shape = (fine_groups.num_groups, fine_groups.num_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Matplotlib's `imshow` routine can be used to plot the matrices to illustrate their sparsity structures." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create plot of the H-1 scattering matrix\n", + "fig = plt.subplot(121)\n", + "fig.imshow(h1, interpolation='nearest')\n", + "plt.title('H-1 Scattering Matrix')\n", + "\n", + "# Create plot of the O-16 scattering matrix\n", + "fig2 = plt.subplot(122)\n", + "fig2.imshow(o16, interpolation='nearest')\n", + "plt.title('O-16 Scattering Matrix')\n", + "\n", + "# Show the plot on screen\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Extract the 16-group transport cross section for the fuel\n", + "fine_xs = xs_library[fuel_cell.id]['transport']\n", + "\n", + "# Condense to the 2-group structure\n", + "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttransport\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.16e-01 +/- 3.77e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.54e-01 +/- 6.46e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.03e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 7.83e-01%\n", + "\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.72e-03 +/- 1.13e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 5.18e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "condense_xs.print_xs()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2389.5669470.036112
4100001O-163.1467800.012666
5100001U-23520.5912530.232675
0100002U-23811.2049120.072348
1100002O-163.7984070.029742
2100002U-235484.5296842.510940
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-238 9.566947 0.036112\n", + "4 10000 1 O-16 3.146780 0.012666\n", + "5 10000 1 U-235 20.591253 0.232675\n", + "0 10000 2 U-238 11.204912 0.072348\n", + "1 10000 2 O-16 3.798407 0.029742\n", + "2 10000 2 U-235 484.529684 2.510940" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Verification with OpenMOC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry just as we did before." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", + "su.make_opencg_geometry()\n", + "\n", + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Likewise, we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Get all OpenMOC cells in the gometry\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", + "# as is the case for a complicated geometry like BEAVRS\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Ignore the root cell\n", + " if cell.getName() == 'root cell':\n", + " continue\n", + " \n", + " # Get a reference to the Material filling this Cell\n", + " openmoc_material = cell.getFillMaterial()\n", + " \n", + " # Set the number of energy groups for the Material\n", + " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", + " \n", + " # Extract the appropriate cross section objects for this cell\n", + " transport = xs_library[cell_id]['transport']\n", + " nufission = xs_library[cell_id]['nu-fission']\n", + " nuscatter = xs_library[cell_id]['nu-scatter']\n", + " chi = xs_library[cell_id]['chi']\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " # NOTE: In each case we must sum across nuclides to get the\n", + " # macroscopic cross sections needed by OpenMOC\n", + " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.574798\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.680220\tres = 4.252E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.661620\tres = 1.834E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.660063\tres = 2.734E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.644413\tres = 2.354E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.627431\tres = 2.371E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.608477\tres = 2.635E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.589425\tres = 3.021E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.571080\tres = 3.131E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.553841\tres = 3.112E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.538232\tres = 3.019E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.524518\tres = 2.818E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.512887\tres = 2.548E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.503407\tres = 2.218E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.496149\tres = 1.848E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.491110\tres = 1.442E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.488262\tres = 1.016E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.487559\tres = 5.798E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.488929\tres = 1.441E-03\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.492277\tres = 2.810E-03\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.497495\tres = 6.848E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.504468\tres = 1.060E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.513071\tres = 1.402E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.523171\tres = 1.705E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.534637\tres = 1.969E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.547332\tres = 2.192E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.561124\tres = 2.375E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.575881\tres = 2.520E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.591472\tres = 2.630E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.607776\tres = 2.707E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.624672\tres = 2.756E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.642047\tres = 2.780E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.659796\tres = 2.781E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.677818\tres = 2.764E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.696019\tres = 2.731E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.714314\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.732625\tres = 2.629E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.750879\tres = 2.563E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.769011\tres = 2.492E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.786963\tres = 2.415E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.804681\tres = 2.334E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.822119\tres = 2.251E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.839238\tres = 2.167E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.856002\tres = 2.082E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.872382\tres = 1.997E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.888351\tres = 1.913E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.903889\tres = 1.831E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.918979\tres = 1.749E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.933609\tres = 1.669E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.947768\tres = 1.592E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.961451\tres = 1.517E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.974653\tres = 1.444E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.987374\tres = 1.373E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.999614\tres = 1.305E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.011376\tres = 1.240E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.022667\tres = 1.177E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.033492\tres = 1.116E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.043858\tres = 1.058E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.053776\tres = 1.003E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.063254\tres = 9.501E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.072304\tres = 8.994E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.080937\tres = 8.512E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.089165\tres = 8.051E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.097001\tres = 7.612E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.104457\tres = 7.194E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.111546\tres = 6.797E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.118282\tres = 6.419E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.124677\tres = 6.060E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.130743\tres = 5.719E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.136495\tres = 5.394E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.141946\tres = 5.087E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.147109\tres = 4.796E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.151994\tres = 4.520E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.156615\tres = 4.259E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.160984\tres = 4.011E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.165111\tres = 3.777E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.169010\tres = 3.555E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.172690\tres = 3.346E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.176162\tres = 3.148E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.179436\tres = 2.960E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.182522\tres = 2.784E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.185431\tres = 2.617E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.188170\tres = 2.460E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.190750\tres = 2.311E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.193177\tres = 2.171E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.195460\tres = 2.039E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.197609\tres = 1.914E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.199628\tres = 1.797E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.201525\tres = 1.685E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.203309\tres = 1.582E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.204983\tres = 1.484E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.206555\tres = 1.391E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.208032\tres = 1.305E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.209416\tres = 1.224E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.210716\tres = 1.146E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.211934\tres = 1.075E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.213078\tres = 1.006E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.214149\tres = 9.432E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.215152\tres = 8.828E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.216093\tres = 8.267E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.216974\tres = 7.742E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.217799\tres = 7.244E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.218572\tres = 6.782E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.219295\tres = 6.344E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.219972\tres = 5.932E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.220605\tres = 5.554E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.221198\tres = 5.190E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.221753\tres = 4.854E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.222271\tres = 4.540E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.222756\tres = 4.243E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.223210\tres = 3.967E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.223633\tres = 3.709E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.224029\tres = 3.461E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.224399\tres = 3.238E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.224746\tres = 3.022E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.225068\tres = 2.827E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.225369\tres = 2.633E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.225651\tres = 2.460E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.225914\tres = 2.299E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.226160\tres = 2.147E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.226390\tres = 2.007E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.226604\tres = 1.871E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.226803\tres = 1.741E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.226990\tres = 1.628E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.227164\tres = 1.522E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.227326\tres = 1.414E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.227478\tres = 1.322E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.227619\tres = 1.233E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.227751\tres = 1.150E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.227874\tres = 1.077E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.227988\tres = 1.001E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.228095\tres = 9.273E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.228195\tres = 8.720E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.228288\tres = 8.102E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.228374\tres = 7.574E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.228455\tres = 7.035E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.228530\tres = 6.542E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.228601\tres = 6.126E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.228666\tres = 5.717E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.228727\tres = 5.295E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.228783\tres = 4.953E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.228835\tres = 4.580E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.228885\tres = 4.264E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.228931\tres = 3.986E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.228973\tres = 3.729E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.229013\tres = 3.467E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.229051\tres = 3.219E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.229085\tres = 3.040E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.229118\tres = 2.835E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.229147\tres = 2.611E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.229174\tres = 2.401E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.229201\tres = 2.208E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.229225\tres = 2.135E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.229247\tres = 1.992E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.229268\tres = 1.797E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.229288\tres = 1.687E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.229306\tres = 1.559E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.229322\tres = 1.474E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.229338\tres = 1.351E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.229352\tres = 1.242E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.229366\tres = 1.182E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.229378\tres = 1.086E-05\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.229390\tres = 1.005E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.231090\n", + "openmoc keff = 1.229390\n", + "bias [pcm]: -170.1\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "su.make_opencg_geometry()\n", + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Ignore the root cell\n", + " if cell.getName() == 'root cell':\n", + " continue\n", + " \n", + " openmoc_material = cell.getFillMaterial()\n", + " openmoc_material.setNumEnergyGroups(coarse_groups.num_groups)\n", + " \n", + " # Extract the appropriate cross section objects for this cell\n", + " transport = xs_library[cell_id]['transport']\n", + " nufission = xs_library[cell_id]['nu-fission']\n", + " nuscatter = xs_library[cell_id]['nu-scatter']\n", + " chi = xs_library[cell_id]['chi']\n", + " \n", + " # Perform group condensation\n", + " transport = transport.get_condensed_xs(coarse_groups)\n", + " nufission = nufission.get_condensed_xs(coarse_groups)\n", + " nuscatter = nuscatter.get_condensed_xs(coarse_groups)\n", + " chi = chi.get_condensed_xs(coarse_groups)\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Importing ray tracing data from file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.496342\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.558070\tres = 5.037E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.519062\tres = 1.244E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.510118\tres = 6.990E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.497533\tres = 1.723E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.489754\tres = 2.467E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.484192\tres = 1.564E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.481187\tres = 1.136E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.480359\tres = 6.206E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.481504\tres = 1.721E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.484422\tres = 2.384E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.488925\tres = 6.059E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.494842\tres = 9.295E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.502013\tres = 1.210E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.510294\tres = 1.449E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.519552\tres = 1.650E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.529662\tres = 1.814E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.540514\tres = 1.946E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.552005\tres = 2.049E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.564041\tres = 2.126E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.576537\tres = 2.180E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.589414\tres = 2.215E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.602601\tres = 2.233E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.616034\tres = 2.237E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.629654\tres = 2.229E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.643407\tres = 2.211E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.657246\tres = 2.184E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.671127\tres = 2.151E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.685011\tres = 2.112E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.698862\tres = 2.069E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.712650\tres = 2.022E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.726345\tres = 1.973E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.739923\tres = 1.922E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.753361\tres = 1.869E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.766641\tres = 1.816E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.779744\tres = 1.763E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.792655\tres = 1.709E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.805362\tres = 1.656E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.817853\tres = 1.603E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.830119\tres = 1.551E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.842152\tres = 1.500E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.853945\tres = 1.450E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.865493\tres = 1.400E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.876791\tres = 1.352E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.887837\tres = 1.305E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.898630\tres = 1.260E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.909165\tres = 1.216E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.919445\tres = 1.172E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.929468\tres = 1.131E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.939236\tres = 1.090E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.948749\tres = 1.051E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.958010\tres = 1.013E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.967022\tres = 9.762E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.975787\tres = 9.406E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.984307\tres = 9.064E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.992586\tres = 8.731E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.000628\tres = 8.411E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.008438\tres = 8.102E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.016018\tres = 7.805E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.023372\tres = 7.517E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.030506\tres = 7.237E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.037423\tres = 6.971E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.044129\tres = 6.712E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.050628\tres = 6.464E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.056924\tres = 6.224E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.063023\tres = 5.993E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.068929\tres = 5.771E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.074647\tres = 5.555E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.080180\tres = 5.349E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.085536\tres = 5.149E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.090717\tres = 4.958E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.095728\tres = 4.773E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.100575\tres = 4.595E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.105261\tres = 4.424E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.109791\tres = 4.257E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.114171\tres = 4.099E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.118403\tres = 3.946E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.122493\tres = 3.799E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.126443\tres = 3.656E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.130259\tres = 3.519E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.133946\tres = 3.388E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.137505\tres = 3.262E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.140942\tres = 3.139E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.144260\tres = 3.021E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.147464\tres = 2.908E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.150556\tres = 2.799E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.153540\tres = 2.695E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.156419\tres = 2.593E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.159198\tres = 2.496E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.161878\tres = 2.403E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.164464\tres = 2.312E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.166959\tres = 2.225E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.169365\tres = 2.143E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.171685\tres = 2.061E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.173922\tres = 1.984E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.176080\tres = 1.910E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.178160\tres = 1.838E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.180166\tres = 1.769E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.182100\tres = 1.702E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.183965\tres = 1.639E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.185761\tres = 1.577E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.187493\tres = 1.517E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.189162\tres = 1.461E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.190771\tres = 1.405E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.192321\tres = 1.353E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.193815\tres = 1.302E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.195253\tres = 1.253E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.196640\tres = 1.205E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.197976\tres = 1.160E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.199263\tres = 1.116E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.200504\tres = 1.074E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.201698\tres = 1.034E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.202848\tres = 9.950E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.203957\tres = 9.570E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.205024\tres = 9.215E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.206052\tres = 8.863E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.207043\tres = 8.531E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.207995\tres = 8.214E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.208913\tres = 7.891E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.209798\tres = 7.597E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.210649\tres = 7.320E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.211469\tres = 7.034E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.212259\tres = 6.771E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.213019\tres = 6.521E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.213749\tres = 6.268E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.214455\tres = 6.023E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.215133\tres = 5.809E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.215786\tres = 5.588E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.216414\tres = 5.368E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.217020\tres = 5.168E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.217601\tres = 4.980E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.218162\tres = 4.780E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.218703\tres = 4.601E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.219222\tres = 4.443E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.219722\tres = 4.260E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.220203\tres = 4.096E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.220667\tres = 3.946E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.221113\tres = 3.800E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.221542\tres = 3.655E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.221954\tres = 3.510E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.222352\tres = 3.378E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.222734\tres = 3.251E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.223102\tres = 3.131E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.223457\tres = 3.009E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.223798\tres = 2.896E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.224127\tres = 2.791E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.224442\tres = 2.684E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.224746\tres = 2.578E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.225039\tres = 2.481E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.225320\tres = 2.392E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.225591\tres = 2.296E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.225852\tres = 2.208E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.226103\tres = 2.125E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.226344\tres = 2.047E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.226575\tres = 1.965E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.226799\tres = 1.888E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.227014\tres = 1.822E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.227221\tres = 1.750E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.227419\tres = 1.687E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.227611\tres = 1.619E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.227794\tres = 1.560E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.227972\tres = 1.495E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.228142\tres = 1.442E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.228307\tres = 1.391E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.228464\tres = 1.338E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.228616\tres = 1.283E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.228762\tres = 1.235E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.228902\tres = 1.183E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.229037\tres = 1.145E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.229167\tres = 1.099E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.229293\tres = 1.056E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.229413\tres = 1.022E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.229529\tres = 9.787E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.229641\tres = 9.401E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.229748\tres = 9.086E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.229851\tres = 8.685E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.229950\tres = 8.395E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.230046\tres = 8.088E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.230138\tres = 7.760E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.230226\tres = 7.451E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.230310\tres = 7.146E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.230392\tres = 6.878E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.230470\tres = 6.632E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.230546\tres = 6.372E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.230619\tres = 6.170E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.230689\tres = 5.908E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.230756\tres = 5.654E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.230821\tres = 5.487E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.230883\tres = 5.247E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.230943\tres = 5.058E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.231001\tres = 4.846E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.231056\tres = 4.672E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.231109\tres = 4.478E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.231161\tres = 4.334E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.231210\tres = 4.165E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.231258\tres = 4.022E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.231303\tres = 3.850E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.231347\tres = 3.721E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.231389\tres = 3.559E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.231430\tres = 3.425E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.231469\tres = 3.291E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.231507\tres = 3.174E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.231543\tres = 3.023E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.231577\tres = 2.923E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.231611\tres = 2.808E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.231643\tres = 2.711E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.231673\tres = 2.587E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.231703\tres = 2.481E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.231731\tres = 2.409E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.231759\tres = 2.301E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.231785\tres = 2.220E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.231811\tres = 2.139E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.231835\tres = 2.065E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.231859\tres = 1.999E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.231881\tres = 1.899E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.231903\tres = 1.825E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.231924\tres = 1.761E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.231944\tres = 1.696E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.231963\tres = 1.648E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.231982\tres = 1.564E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.232000\tres = 1.508E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.232017\tres = 1.450E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.232033\tres = 1.398E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.232050\tres = 1.344E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.232065\tres = 1.312E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.232080\tres = 1.233E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.232094\tres = 1.204E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.232108\tres = 1.156E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.232121\tres = 1.114E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.232134\tres = 1.064E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.232146\tres = 1.029E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.231090\n", + "openmoc keff = 1.232146\n", + "bias [pcm]: 105.6\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "\n", + "* Appropriate transport-corrected cross sections\n", + "* Spatial discretization of OpenMOC's mesh\n", + "* Constant-in-angle multi-group cross sections" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/openmc-mgxs.ipynb b/docs/source/pythonapi/examples/openmc-mgxs.ipynb deleted file mode 100644 index 2aedc3121d..0000000000 --- a/docs/source/pythonapi/examples/openmc-mgxs.ipynb +++ /dev/null @@ -1,1112 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook demonstrates how to use the **``openmc.mgxs``** module to generate multi-group cross sections with OpenMC.\n", - "\n", - "**Note:** that this Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import openmc\n", - "import openmc.mgxs as mgxs\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Infinite Homogeneous Medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Inputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "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')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the nuclides we defined, we will now create a material for the homogeneous medium." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a Material and register the Nuclides\n", - "inf_medium = openmc.Material(name='moderator')\n", - "inf_medium.set_density('g/cc', 5.)\n", - "inf_medium.add_nuclide(h1, 0.028999667)\n", - "inf_medium.add_nuclide(o16, 0.01450188)\n", - "inf_medium.add_nuclide(u235, 0.000114142)\n", - "inf_medium.add_nuclide(u238, 0.006886019)\n", - "inf_medium.add_nuclide(zr90, 0.002116053)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our material, we can now create a materials file object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.default_xs = '71c'\n", - "materials_file.add_material(inf_medium)\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate boundary Planes\n", - "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", - "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", - "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", - "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a Cell\n", - "cell = openmc.Cell(cell_id=1, name='cell')\n", - "\n", - "# Register bounding Surfaces with the Cell\n", - "cell.add_surface(surface=min_x, halfspace=+1)\n", - "cell.add_surface(surface=max_x, halfspace=-1)\n", - "cell.add_surface(surface=min_y, halfspace=+1)\n", - "cell.add_surface(surface=max_y, halfspace=-1)\n", - "\n", - "# Fill the Cell with the Material\n", - "cell.fill = inf_medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# OpenMC simulation parameters\n", - "batches = 50\n", - "inactive = 10\n", - "particles = 2500\n", - "\n", - "# Instantiate a SettingsFile\n", - "settings_file = openmc.SettingsFile()\n", - "settings_file.batches = batches\n", - "settings_file.inactive = inactive\n", - "settings_file.particles = particles\n", - "settings_file.output = {'tallies': True, 'summary': True}\n", - "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", - "settings_file.set_source_space('box', bounds)\n", - "\n", - "# Export to \"settings.xml\"\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a \"fine\" 8-group EneryGroups object\n", - "fine_groups = mgxs.EnergyGroups()\n", - "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", - " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", - "\n", - "# Instantiate a \"coarse\" 2-group EneryGroups object\n", - "coarse_groups = mgxs.EnergyGroups()\n", - "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MultiGroupXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of generic and abstract `MultiGroupXS` class:\n", - "\n", - "* `TotalXS`\n", - "* `TransportXS`\n", - "* `AbsorptionXS`\n", - "* `CaptureXS`\n", - "* `FissionXS`\n", - "* `NuFissionXS`\n", - "* `ScatterXS`\n", - "* `NuScatterXS`\n", - "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", - "* `Chi`\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 cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define total, nu-fission, nu-scatter and chi cross sections for our infinite medium cell as the domain and our fine 8-group structure as our energy groups." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate cross sections needed for an OpenMOC simulation\n", - "transport = mgxs.TransportXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "nufission = mgxs.NuFissionXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "nuscatter = mgxs.NuScatterMatrixXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "chi = mgxs.Chi(domain=cell, domain_type='cell', groups=fine_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we must instruct our multi-group cross section objects to generate the tallies needed to calculate each of them in OpenMC. This can be done with the `MultiGroupXS.create_tallies()` routine." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instruct each multi-group cross section to generate tallies\n", - "transport.create_tallies()\n", - "nufission.create_tallies()\n", - "nuscatter.create_tallies()\n", - "chi.create_tallies()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'flux': Tally\n", - " \tID =\t10003\n", - " \tName =\t\n", - " \tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - " \tNuclides =\ttotal \n", - " \tScores =\t['flux']\n", - " \tEstimator =\ttracklength, 'nu-fission': Tally\n", - " \tID =\t10004\n", - " \tName =\t\n", - " \tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - " \tNuclides =\ttotal \n", - " \tScores =\t['nu-fission']\n", - " \tEstimator =\ttracklength}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nufission.tallies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `NuFission` object includes tracklength tallies for the 'nu-fission' and 'flux' scores in the 8-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Add transport tallies to the tallies file\n", - "for tally in transport.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add nu-fission tallies to the tallies file\n", - "for tally in nufission.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add nu-scatter tallies to the tallies file\n", - "for tally in nuscatter.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add chi tallies to the tallies file \n", - "for tally in chi.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - " \n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Run OpenMC!\n", - "executor = openmc.Executor()\n", - "executor.run_simulation()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.50.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the summary file and link it with the statepoint\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. The first step is to load the tallies from the statepoint into each object." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'tuple' object has no attribute '__name__'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the tallies from the statepoint into each MultiGroupXS object\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mtransport\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mnufission\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mnuscatter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mchi\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mload_from_statepoint\u001b[1;34m(self, statepoint)\u001b[0m\n\u001b[0;32m 1216\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1217\u001b[0m \u001b[1;31m# Load the tallies from the statepoint using the parent class method\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1218\u001b[1;33m \u001b[0msuper\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mTransportXS\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload_from_statepoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstatepoint\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1219\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1220\u001b[0m \u001b[1;31m# Use tally slicing to remove scatter-P0 data from scatter-P1 tally\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mload_from_statepoint\u001b[1;34m(self, statepoint)\u001b[0m\n\u001b[0;32m 429\u001b[0m \u001b[1;31m# the isotopic number densities as computed by OpenMC\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 430\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'cell'\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'distribcell'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 431\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstatepoint\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_cell_by_id\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mid\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 432\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain_type\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'universe'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 433\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstatepoint\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_universe_by_id\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mid\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mdomain\u001b[1;34m(self, domain)\u001b[0m\n\u001b[0;32m 198\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mdomain\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msetter\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 199\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 200\u001b[1;33m \u001b[0mcv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcheck_type\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'domain'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mDOMAINS\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 201\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_domain\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 202\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/checkvalue.pyc\u001b[0m in \u001b[0;36mcheck_type\u001b[1;34m(name, value, expected_type, expected_iter_type)\u001b[0m\n\u001b[0;32m 52\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0m_isinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexpected_type\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 53\u001b[0m msg = 'Unable to set \"{0}\" to \"{1}\" which is not of type \"{2}\"'.format(\n\u001b[1;32m---> 54\u001b[1;33m name, value, expected_type.__name__)\n\u001b[0m\u001b[0;32m 55\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 56\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute '__name__'" - ] - } - ], - "source": [ - "# Load the tallies from the statepoint into each MultiGroupXS object\n", - "transport.load_from_statepoint(sp)\n", - "nufission.load_from_statepoint(sp)\n", - "nuscatter.load_from_statepoint(sp)\n", - "chi.load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The multi-group cross section objects can now use OpenMC's [tally arithmetic](http://mit-crpg.github.io/openmc/pythonapi/examples/pandas-dataframes.html) to compute cross sections from the tally data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "transport.compute_xs()\n", - "nufission.compute_xs()\n", - "nuscatter.compute_xs()\n", - "chi.compute_xs()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! Our multi-group cross sections are now ready to rock 'n roll! Let's first inspect one of our cross sections by printing it to the screen." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "nufission.print_xs()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "df = nuscatter.get_pandas_dataframe()\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "transport.export_xs_data(filename='transport-xs', format='excel')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following code snippet shows how to export all of four cross sections to the same HDF5 binary data store." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "transport.build_hdf5_store(filename='mgxs', append=True)\n", - "nufission.build_hdf5_store(filename='mgxs', append=True)\n", - "nuscatter.build_hdf5_store(filename='mgxs', append=True)\n", - "chi.build_hdf5_store(filename='mgxs', append=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. First, we will use OpenCG to reconstruct our OpenMC geometry from the summary file into a equivalent OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Import OpenMOC and the OpenMOC/OpenCG compatibility module\n", - "import openmoc\n", - "from openmoc.compatible import get_openmoc_geometry\n", - "\n", - "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", - "su.make_opencg_geometry()\n", - "\n", - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we can inject the multi-group cross sections into the equivalent infinite homogeneous medium OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Get all OpenMOC cells in the gometry\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", - "# as is the case for a complicated geometry like BEAVRS\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Get a reference to the Material filling this Cell\n", - " openmoc_material = cell.getFillMaterial()\n", - " \n", - " # Set the number of energy groups for the Material\n", - " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " openmoc_material.setSigmaT(transport.get_xs().flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs().flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs().flatten())\n", - " openmoc_material.setChi(chi.get_xs().flatten())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although there is a non-trivial bias, one can easily run the preceding code with more particle histories to show that both codes converge to the same eigenvalue with <10 pcm bias. It should be noted that this discrepancy is partially due to use of tracklength tallies for `NuFission`, while one must use more slowly converging analog tallies must be used for `TransportXS`, `NuScatterMatrixXS` and `Chi` (which require an 'energyout' filter)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Fuel Pin Cell" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Inputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "this time we separate our nuclides into three distinct materials for water, clad and fuel." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# 1.6 enriched fuel\n", - "fuel = openmc.Material(name='1.6% Fuel')\n", - "fuel.set_density('g/cm3', 10.31341)\n", - "fuel.add_nuclide(u235, 3.7503e-4)\n", - "fuel.add_nuclide(u238, 2.2625e-2)\n", - "fuel.add_nuclide(o16, 4.6007e-2)\n", - "\n", - "# borated water\n", - "water = openmc.Material(name='Borated Water')\n", - "water.set_density('g/cm3', 0.740582)\n", - "water.add_nuclide(h1, 4.9457e-2)\n", - "water.add_nuclide(o16, 2.4732e-2)\n", - "\n", - "# zircaloy\n", - "zircaloy = openmc.Material(name='Zircaloy')\n", - "zircaloy.set_density('g/cm3', 6.55)\n", - "zircaloy.add_nuclide(zr90, 7.2758e-3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our materials, we can now create a materials file object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, add Materials\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.add_material(fuel)\n", - "materials_file.add_material(water)\n", - "materials_file.add_material(zircaloy)\n", - "materials_file.default_xs = '71c'\n", - "\n", - "# Export to \"materials.xml\"\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create cylinders for the fuel and clad\n", - "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", - "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", - "\n", - "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", - "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", - "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", - "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", - "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", - "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", - "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create a Universe to encapsulate a fuel pin\n", - "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", - "\n", - "# Create fuel Cell\n", - "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", - "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", - "pin_cell_universe.add_cell(fuel_cell)\n", - "\n", - "# Create a clad Cell\n", - "clad_cell = openmc.Cell(name='1.6% Clad')\n", - "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", - "pin_cell_universe.add_cell(clad_cell)\n", - "\n", - "# Create a moderator Cell\n", - "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", - "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", - "pin_cell_universe.add_cell(moderator_cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create root Cell\n", - "root_cell = openmc.Cell(name='root cell')\n", - "root_cell.fill = pin_cell_universe\n", - "\n", - "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "\n", - "# Create root Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(root_cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will reuse our settings from the previous simulation. Now, we let's create transport, nu-fission, nu-scatter and chi multi-group cross sections for each cell." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Extract all Cells filled by Materials\n", - "openmc_cells = openmc_geometry.get_all_material_cells()\n", - "\n", - "# Create dictionary to store multi-group cross sections for all cells\n", - "xs_library = {}\n", - "\n", - "# Instantiate 8-group cross sections for each cell\n", - "for cell in openmc_cells:\n", - " xs_library[cell.id] = {}\n", - " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", - " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", - " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", - " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, we did not give our cross sections a spatial domain in their constructors. Instead, we will loop over all cells to set each cross sections domain. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Iterate over all cells and cross section types\n", - "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id].keys():\n", - " print(cell.name, rxn_type)\n", - "\n", - " # Set the cross sections domain type to the cell\n", - " xs_library[cell.id][rxn_type].domain = cell\n", - " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", - " \n", - " # Tally cross sections by nuclide (e.g., micro cross sections)\n", - " xs_library[cell.id][rxn_type].by_nuclide = True\n", - " \n", - " # Create OpenMC tallies for this cross section\n", - " xs_library[cell.id][rxn_type].create_tallies()\n", - " \n", - " # Add OpenMC tallies to the tallies file for XML generation\n", - " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", - " print(tally)\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Delete old HDF5 files\n", - "!rm *.h5\n", - "\n", - "# Run OpenMC!\n", - "executor = openmc.Executor()\n", - "executor.run_simulation()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. As before, we begin our analysis here loading the statepoint file." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint and summary files\n", - "sp = openmc.StatePoint('statepoint.50.h5')\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Iterate over all cells and cross section types\n", - "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id].keys():\n", - " xs_library[cell.id][rxn_type].load_from_statepoint(sp)\n", - " xs_library[cell.id][rxn_type].compute_xs()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data b/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data deleted file mode 100644 index b108b863c52d6d385677f2f730b589892ee66001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71256 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%0AB9)@AO7*7 znjeOawEDCBL;u4+q8=8f{ZEznEdRlyy@VdL_)LG`(OyCi8qf3(oul1xgdPSy_~bb| ze0kf!_cZ>&)_(?srnSQ{dzGyf6UE!I2OZvyY5_77bZ~FGV+YZiZ z^v~9h7WGZ~$2#g7pRXS;`;E#?`>?OB6rQc0E$W-%V;yycSJ&@GeGwn)s4F~MKOXHY z*U`s5EM8u&qaUv$3kSTsTt^@4sC#+2jy~2=_wsTbeJW4z^0B_nI#5_g-OJOu^#T2d zb>+v#H|ywQ9d$2{b@YXvwEC<0hjsL6+=o2Yc$WXjKhziFM*LkXf382AhjsMH|Im(F ze5QYz?~L-MBlPt7byNTR^QUY#_}<1p*!~r=-$nmb3eWb>5c925{Fo1`HD2An1LZ}0 z_=g_9**_BPC-skgoV>i$Km5bXOZ~$?yu8#u{KLyj{lh=Jyvzga!{Ftm{^1{E;~V`$ zPhKASNB+P+ygc;(xOjg<;nn;_c||)0g=hLf{zCs0Kj~lLnSQph)3q5(`OZ`GmULNt#ez=}`dBmglCU6~8>#yZM;_W4#f9mm@{hMXK zq5RO(2llz78oFxx!NW8C&Y0QkA5G^6oDUv)(s}#(N$pvAd8t3>$;;z>lplKX@;Dzn z^yKAnK6vQY%gcU*p1eHHM||jMY<#0X=*i3De8h*Iygbea4?TH#oDUv)^71%8_QUFQ z|6k`D{m6bpeCP>$dx0A4-`I=(I6rp%S-hn`i?{S=@s|E9-qN4N%YKBO^#1E?f1Hp0 zm-@5f<9zVYlQ%xj2M;}Yd7KX(dh+r(A3XHr<#B#Vf4uz~{k1i Date: Sat, 3 Oct 2015 12:47:03 -0400 Subject: [PATCH 271/519] Fixed for check_source errors - i need to remember this exists. --- src/input_xml.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 7c6c80d708..d77e187355 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2357,8 +2357,8 @@ contains if (check_for_node(node_filt, "bins")) then if ((trim(temp_str) == 'energy' .or. & trim(temp_str) == 'energyout') .or. & - (trim(temp_str) == 'mu' .or. trim(temp_str) == 'polar') .or. & - (trim(temp_str) == 'azimuthal')) then + (trim(temp_str) == 'mu' .or. trim(temp_str) == 'polar') .or. & + (trim(temp_str) == 'azimuthal')) then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2807,7 +2807,7 @@ contains ! Check to see if the mu filter is applied and if that makes sense. if ((.not. starts_with(score_name,'scatter')) .and. & - (.not. starts_with(score_name,'nu-scatter'))) then + (.not. starts_with(score_name,'nu-scatter'))) then if (t % find_filter(FILTER_MU) > 0) then call fatal_error("Cannot tally " // trim(score_name) //" with a & &change of angle (mu) filter.") From fdd343e8df8fc6efb4446e2b6fd140357dfb12cb Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 3 Oct 2015 12:56:49 -0400 Subject: [PATCH 272/519] Fixed failing tests --- tests/test_filter_azimuthal/results_true.dat | 3378 +++++++++--------- tests/test_filter_azimuthal/tallies.xml | 2 +- tests/test_filter_mu/results_true.dat | 12 +- tests/test_filter_mu/tallies.xml | 2 +- tests/test_filter_polar/results_true.dat | 3308 ++++++++--------- tests/test_filter_polar/tallies.xml | 2 +- tests/test_many_scores/results_true.dat | 32 +- 7 files changed, 3368 insertions(+), 3368 deletions(-) diff --git a/tests/test_filter_azimuthal/results_true.dat b/tests/test_filter_azimuthal/results_true.dat index 4db1c808ff..cb505da8e6 100644 --- a/tests/test_filter_azimuthal/results_true.dat +++ b/tests/test_filter_azimuthal/results_true.dat @@ -254,8 +254,26 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 1.474302E-01 2.173566E-02 +4.893327E-03 +2.394465E-05 +9.074983E-02 +8.235532E-03 +6.119357E-02 +3.744653E-03 +1.520463E-01 +2.311808E-02 +1.161846E-01 +1.349886E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -264,8 +282,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.250677E-01 -1.806825E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -388,8 +404,36 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +3.606450E-01 +8.803108E-02 +2.305484E-01 +3.880049E-02 +2.281548E-01 +3.464917E-02 +2.376528E-01 +4.490614E-02 +3.227418E-01 +6.538660E-02 +1.047674E-01 +6.952817E-03 +2.245825E-01 +4.341251E-02 +4.460481E-02 +8.734916E-04 +3.800937E-02 +6.551272E-04 +2.918350E-02 +6.025580E-04 +5.290157E-02 +2.242503E-03 +7.748790E-02 +6.004374E-03 +1.123662E-01 +6.443566E-03 0.000000E+00 0.000000E+00 +3.614391E-01 +5.568956E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -404,8 +448,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.379743E+00 -1.311268E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -414,8 +456,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.411476E-01 -1.292788E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -424,8 +464,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -6.041947E-01 -1.293434E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -456,6 +494,16 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +1.269186E-01 +1.610833E-02 +1.101428E-01 +1.213144E-02 +2.704596E-02 +7.314841E-04 +2.061181E-02 +4.248469E-04 +1.011349E-01 +1.022826E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -494,8 +542,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.858540E-01 -1.488833E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -528,6 +574,56 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.448572E-01 +4.491249E-02 +1.354754E-01 +1.148682E-02 +1.036553E-01 +5.210946E-03 +1.197739E-01 +9.544361E-03 +1.301065E-01 +1.519723E-02 +2.653999E-01 +1.798093E-02 +7.053400E-01 +2.691010E-01 +3.550653E-01 +6.602182E-02 +3.995151E-01 +4.488675E-02 +1.906734E-01 +1.444847E-02 +1.092753E+00 +4.112046E-01 +6.904926E-01 +1.639522E-01 +9.582995E-01 +4.105614E-01 +8.568085E-01 +2.031240E-01 +7.847454E-01 +1.747299E-01 +3.179482E-01 +6.310285E-02 +4.521000E-02 +1.218581E-03 +2.396875E-01 +2.427537E-02 +2.447834E-01 +2.357128E-02 +1.257401E-01 +6.914384E-03 +7.204746E-02 +5.190836E-03 +7.151850E-02 +5.114896E-03 +6.602752E-02 +4.359634E-03 +2.421534E-02 +5.863829E-04 +1.020470E-01 +1.041360E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -538,6 +634,16 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.340315E-02 +5.477072E-04 +8.711651E-03 +7.589285E-05 +3.027497E-03 +9.165739E-06 +3.518410E-04 +1.237921E-07 +1.165678E-02 +1.358806E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -548,546 +654,446 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.624392E-02 +6.887435E-04 +5.055291E-02 +2.555596E-03 +5.100049E-03 +2.601050E-05 +1.320474E-02 +1.743651E-04 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.338682E-01 -3.487437E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.915994E+00 -1.046110E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.383099E+00 -6.158644E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.733692E-01 -4.271368E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.358559E-01 -1.127992E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.715092E-02 -2.223209E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.510162E-02 -9.044318E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.239565E-01 -3.408418E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.837242E-01 -3.095588E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.994150E-01 -2.866219E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.724238E-01 -7.421475E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.433355E-01 -1.157425E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.547867E-01 -1.313519E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.879130E+00 -9.055069E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.368540E-01 -6.270785E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.652111E+00 -1.033642E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.310051E+00 -9.755343E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.097363E+00 -1.364448E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.373035E+00 -1.305514E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.745973E+00 -1.053371E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.139451E+00 -1.572197E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.774043E+00 -3.284606E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.295905E+00 -6.522302E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.221434E+00 -5.018537E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.562734E+00 -8.637801E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.649733E-01 -2.226711E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.288704E+00 -7.109246E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.466278E+00 -1.578589E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.807475E-01 -4.695137E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.126927E-02 -8.330079E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.720195E-01 -8.707551E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.990373E+00 -2.342787E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.189163E+00 -5.672280E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.799118E+00 -9.852508E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.604690E+00 -9.452433E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.751744E+00 -2.548820E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.590271E+00 -1.069990E+01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.160807E+00 -2.684910E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.968641E+00 -1.977620E+01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.115995E+00 -3.927279E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.487088E+00 -8.377840E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.815094E-01 -7.655932E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.566015E+00 -8.425867E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.544552E-01 -3.858396E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.145926E-01 -8.654276E-02 -0.000000E+00 -0.000000E+00 +1.333239E-01 +1.777527E-02 +1.883042E-02 +3.545848E-04 +8.351253E-03 +6.974342E-05 +3.308624E-03 +1.094699E-05 +6.014221E-02 +1.891793E-03 +2.285867E-01 +1.731252E-02 +2.597469E-01 +6.386437E-02 +2.152687E-03 +4.634062E-06 +1.396882E-01 +5.831622E-03 +3.535498E-01 +3.297689E-02 +1.481495E-01 +9.087692E-03 +8.543734E-02 +2.660474E-03 +2.202068E-01 +2.136814E-02 +1.864444E-01 +1.224258E-02 +2.591769E-01 +2.379915E-02 +5.872738E-02 +3.448905E-03 +5.351124E-02 +2.863453E-03 +5.143634E-02 +2.645697E-03 +7.866165E-02 +6.187655E-03 +3.008723E-02 +9.052413E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.986516E-01 +3.946247E-02 +5.460946E-02 +2.658927E-03 +0.000000E+00 +0.000000E+00 +4.279994E-02 +1.831834E-03 +4.727444E-02 +2.234873E-03 +5.583625E-03 +3.117687E-05 +9.770956E-02 +4.775929E-03 +3.622523E-03 +1.312267E-05 +4.787097E-02 +2.291630E-03 +0.000000E+00 +0.000000E+00 +3.663182E-01 +3.901232E-02 +5.096289E-01 +1.425852E-01 +3.721281E-01 +4.002960E-02 +2.432912E-01 +1.847630E-02 +3.877633E-01 +7.117532E-02 +2.574724E-02 +6.629201E-04 +4.824475E-01 +2.327556E-01 +8.032403E-02 +6.451950E-03 +5.215563E-02 +2.720210E-03 +1.961796E-01 +2.460190E-02 +1.956052E-01 +1.707411E-02 +4.109858E-01 +8.829893E-02 +3.650051E-01 +6.581408E-02 +5.332428E-01 +1.062692E-01 +1.472720E-01 +1.352965E-02 +2.352153E-01 +5.365818E-02 +2.917669E-01 +3.702178E-02 +3.630666E-01 +7.000898E-02 +1.933146E-01 +2.290240E-02 +2.266878E-01 +3.389178E-02 +6.352729E-01 +1.262819E-01 +3.258084E-01 +3.144428E-02 +3.359217E-01 +7.028771E-02 +3.138711E-01 +3.042615E-02 +4.864884E-01 +8.197064E-02 +4.052413E-01 +5.263382E-02 +5.280291E-01 +7.463967E-02 +4.415094E-01 +4.110697E-02 +3.561420E-01 +3.775973E-02 +6.421128E-01 +1.432705E-01 +4.582457E-01 +9.035731E-02 +4.375113E-01 +7.559295E-02 +2.085802E-01 +1.627637E-02 +2.225318E-01 +1.723577E-02 +4.191042E-01 +8.237217E-02 +7.039392E-01 +1.816457E-01 +3.084044E-01 +3.275180E-02 +2.685092E-01 +2.572321E-02 +5.721738E-01 +1.282948E-01 +2.864246E-01 +3.524515E-02 +6.841688E-01 +2.593948E-01 +5.239256E-01 +1.318097E-01 +4.703226E-01 +1.003153E-01 +5.700203E-01 +1.447644E-01 +5.256055E-01 +9.786990E-02 +2.750779E-01 +2.749397E-02 +2.476165E-01 +2.628141E-02 +1.345304E-01 +6.348724E-03 +1.811728E-01 +1.101450E-02 +4.575075E-01 +1.155753E-01 +9.956031E-01 +3.236937E-01 +7.822380E-01 +1.576217E-01 +4.302676E-01 +8.654332E-02 +6.779994E-01 +1.273289E-01 +1.335326E+00 +4.959116E-01 +4.579971E-01 +1.037785E-01 +2.498542E-01 +3.500312E-02 +2.587582E-01 +2.446664E-02 +3.579200E-01 +3.739258E-02 +2.382048E-01 +2.511067E-02 +8.844200E-02 +4.178779E-03 +1.493227E-01 +1.382751E-02 +1.926833E-01 +3.623771E-02 +1.356547E-01 +1.149518E-02 +9.887065E-02 +3.834529E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.466423E-01 +8.511548E-03 +1.772139E-01 +1.084833E-02 +6.248891E-01 +2.517147E-01 +1.469570E-01 +1.361923E-02 +1.930014E-01 +1.939473E-02 +4.877778E-01 +7.218224E-02 +5.057551E-01 +7.949605E-02 +5.952215E-01 +9.519535E-02 +4.004282E-01 +5.623191E-02 +4.770953E-01 +8.006555E-02 +3.054262E-01 +4.173406E-02 +1.761785E-01 +3.103885E-02 +1.210180E-01 +1.051642E-02 +2.395766E-01 +3.979136E-02 +1.385482E-01 +1.857983E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.571800E-02 +6.614156E-04 +4.998189E-04 +2.498190E-07 +1.528778E-02 +2.337164E-04 +2.858524E-02 +8.171157E-04 +2.117843E-02 +4.485258E-04 +1.239872E-01 +7.764013E-03 +1.319425E-01 +9.461815E-03 +8.747032E-02 +4.129970E-03 +5.020910E-02 +1.320785E-03 +7.841043E-02 +2.289497E-03 +5.873242E-01 +7.715441E-02 +6.390109E-01 +1.271817E-01 +4.371329E-01 +4.391479E-02 +6.063587E-01 +9.576490E-02 +7.205461E-01 +1.991327E-01 +5.352844E-02 +2.865294E-03 +1.165072E-01 +8.697470E-03 +5.259717E-01 +9.680816E-02 +3.215701E-01 +6.824822E-02 +1.715858E-01 +1.360648E-02 +4.009911E-01 +6.121324E-02 +4.274770E-01 +6.197530E-02 +2.619790E-01 +2.507804E-02 +5.020785E-01 +8.953665E-02 +2.065920E-01 +1.834698E-02 +2.817103E-01 +5.727368E-02 +3.625259E-01 +7.732849E-02 +4.980250E-01 +8.652238E-02 +2.059145E-01 +1.633243E-02 +2.565146E-01 +2.291618E-02 +7.738021E-01 +2.033443E-01 +3.917692E-01 +5.258089E-02 +6.045178E-01 +1.259420E-01 +4.259765E-01 +6.210929E-02 +5.556781E-01 +1.172687E-01 +9.826969E-01 +2.930474E-01 +1.804633E+00 +9.618056E-01 +1.228542E+00 +3.290554E-01 +9.790031E-01 +2.809851E-01 +1.595396E+00 +6.480405E-01 +7.893874E-01 +1.662633E-01 +7.279604E-01 +1.794851E-01 +6.088511E-01 +1.219685E-01 +4.123154E-01 +6.248213E-02 +6.222925E-01 +1.129917E-01 +1.804817E+00 +9.721578E-01 +1.530452E+00 +6.104528E-01 +1.886855E+00 +8.989353E-01 +2.070262E+00 +1.044281E+00 +1.676256E+00 +7.627251E-01 +6.909846E-01 +2.166618E-01 +5.079273E-01 +1.443728E-01 +5.862180E-01 +1.586644E-01 +6.900428E-01 +1.752916E-01 +6.408226E-01 +1.544107E-01 +4.199020E-01 +6.160692E-02 +4.811223E-01 +1.043928E-01 +1.363487E-01 +1.078668E-02 +2.290971E-01 +2.287662E-02 +2.206176E-01 +1.651565E-02 +6.443180E-02 +4.151457E-03 +8.044959E-02 +2.587993E-03 +7.127891E-02 +2.586411E-03 +7.009290E-02 +4.133466E-03 +9.525623E-02 +9.073749E-03 +1.674401E-01 +9.979222E-03 +5.990721E-01 +1.648516E-01 +2.894743E-01 +3.063571E-02 +2.443739E-01 +3.157141E-02 +2.656548E-01 +4.199935E-02 +3.487093E-02 +5.237378E-04 +3.092382E-02 +5.324661E-04 +5.795673E-02 +2.378762E-03 +1.351906E-01 +1.126610E-02 +9.551312E-02 +5.778036E-03 +7.414490E-02 +5.497467E-03 +0.000000E+00 +0.000000E+00 +3.781200E-02 +1.429747E-03 +2.980733E-01 +4.777762E-02 +4.562331E-03 +2.081487E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1098,14 +1104,136 @@ tally 4: 5.782929E-02 0.000000E+00 0.000000E+00 +8.343675E-02 +3.485591E-03 +8.342148E-02 +4.382151E-03 +5.628723E-02 +3.168252E-03 +1.009169E-01 +5.687102E-03 +1.113680E-01 +7.941704E-03 +2.898649E-02 +4.713952E-04 +9.660437E-02 +5.617174E-03 +3.626816E-02 +7.248560E-04 +3.607715E-01 +1.301561E-01 +2.247590E-01 +5.051661E-02 +2.160150E-01 +2.179267E-02 +3.439049E-01 +5.045083E-02 +5.511705E-01 +1.236380E-01 +6.933040E-01 +1.414611E-01 +2.713608E-01 +2.827915E-02 +4.302988E-01 +1.402092E-01 +3.822389E-01 +4.128319E-02 +4.494981E-01 +1.190804E-01 +2.290552E-01 +4.033306E-02 +3.070920E-01 +3.156162E-02 +1.353947E-01 +1.616485E-02 +9.426313E-02 +5.916331E-03 +8.981082E-02 +8.065984E-03 +9.784559E-02 +9.573760E-03 +1.032600E-01 +7.849583E-03 +1.787970E-01 +2.723005E-02 +8.345128E-03 +6.964115E-05 +3.249023E-02 +8.620688E-04 +0.000000E+00 +0.000000E+00 +3.392995E-02 +7.648039E-04 +2.606350E-01 +3.603874E-02 +2.828391E-01 +7.999797E-02 +9.480101E-02 +8.987232E-03 +1.802329E-01 +1.929202E-02 +2.011460E-01 +4.045972E-02 +2.577200E-01 +3.330361E-02 +2.266050E-01 +3.081067E-02 +5.138649E-01 +1.188509E-01 +3.440738E-01 +6.978655E-02 +5.013213E-01 +1.806700E-01 +3.817956E-01 +1.260944E-01 +2.525655E-01 +4.969446E-02 +1.840306E-01 +1.758139E-02 +2.993258E-01 +5.478745E-02 +2.516357E-01 +3.591883E-02 +9.508692E-01 +3.144848E-01 +1.127748E+00 +4.533669E-01 +1.388614E+00 +5.938475E-01 +8.535628E-01 +1.856940E-01 +9.421672E-01 +2.321577E-01 +9.399456E-01 +1.963334E-01 +7.958092E-01 +1.494225E-01 +6.828877E-01 +1.019089E-01 +8.300655E-01 +1.459032E-01 +1.142542E+00 +3.197593E-01 +4.984674E-01 +8.304644E-02 +1.646552E-01 +1.418682E-02 +1.507110E-01 +6.136299E-03 +2.146555E-01 +1.739453E-02 +5.190606E-01 +1.282602E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.280722E-02 +1.640249E-04 +2.474463E-02 +6.122969E-04 0.000000E+00 0.000000E+00 -4.354304E-01 -9.779168E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1114,8 +1242,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.473896E-01 -4.381391E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1124,8 +1250,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.075755E+00 -1.180059E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1134,8 +1258,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.798183E+00 -1.189243E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1144,8 +1266,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.205742E-01 -2.287243E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1154,8 +1274,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.535623E-01 -4.961922E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1164,28 +1282,122 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.019654E+00 -6.953712E-01 0.000000E+00 0.000000E+00 +6.740089E-03 +4.542880E-05 +6.560966E-03 +4.304627E-05 +6.493094E-02 +4.216027E-03 +2.068633E-02 +4.279242E-04 +1.769168E-02 +3.129956E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.843585E+00 -1.633603E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.312159E-01 +7.544280E-03 +3.401693E-01 +5.861063E-02 +1.780763E-01 +1.837996E-02 +1.555608E-01 +1.438363E-02 +1.722326E-01 +1.265263E-02 +2.151577E-01 +3.095136E-02 +4.777775E-01 +9.068684E-02 +7.590086E-02 +2.347201E-03 +3.594051E-01 +7.295820E-02 +4.336617E-01 +6.930726E-02 +3.783609E-01 +5.517685E-02 +2.883440E-01 +2.262663E-02 +4.427321E-01 +6.029818E-02 +2.816265E-01 +2.820871E-02 +2.822418E-01 +2.349296E-02 +6.918377E-02 +3.199745E-03 +1.325588E-01 +1.046944E-02 +9.514313E-02 +3.035202E-03 +2.314335E-01 +2.200442E-02 +3.906344E-01 +9.721347E-02 +2.980723E-01 +2.376759E-02 +7.936355E-01 +1.709801E-01 +7.548875E-01 +1.345676E-01 +5.106013E-01 +6.529674E-02 +8.594656E-01 +1.968960E-01 +2.060661E-01 +2.343139E-02 +1.506635E-01 +1.503823E-02 +5.733100E-02 +3.286843E-03 +1.107212E-01 +6.501626E-03 +1.770281E-01 +1.870622E-02 +1.192415E+00 +7.591649E-01 +1.060765E+00 +6.226133E-01 +5.771704E-01 +2.175154E-01 +8.177694E-01 +5.589966E-01 +4.515739E-01 +1.637047E-01 +1.426047E+00 +5.365567E-01 +2.120869E+00 +1.061007E+00 +1.659944E+00 +5.728452E-01 +1.255272E+00 +3.964306E-01 +1.178254E+00 +3.384251E-01 +9.337444E-01 +3.123569E-01 +7.667372E-01 +1.681934E-01 +4.527240E-01 +6.948964E-02 +8.238011E-01 +2.050221E-01 +8.036425E-01 +1.680294E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.369353E+00 -1.220652E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1194,8 +1406,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.262961E+00 -8.319161E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1204,8 +1414,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.391250E+00 -3.942772E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1214,8 +1422,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.547550E+00 -6.442982E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1224,8 +1430,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.755185E-02 -1.410142E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1250,14 +1454,116 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +4.764809E-02 +2.270341E-03 0.000000E+00 0.000000E+00 +1.185675E-02 +1.405825E-04 +1.165402E-02 +1.358162E-04 +9.166220E-02 +8.401959E-03 +2.991580E-02 +8.949550E-04 +2.627216E-02 +6.902264E-04 0.000000E+00 0.000000E+00 +8.400675E-02 +7.057134E-03 +5.602092E-02 +3.138344E-03 +1.104073E-01 +1.218977E-02 +1.119794E-01 +1.253940E-02 +1.680266E-01 +2.823294E-02 +4.361668E-02 +1.496836E-03 +7.122617E-02 +5.073167E-03 +5.849049E-01 +7.256897E-02 +5.441320E-01 +1.095630E-01 +5.812436E-01 +1.126373E-01 +4.686984E-01 +6.439377E-02 +4.555221E-01 +5.789275E-02 +8.036184E-01 +1.587537E-01 +6.274889E-01 +1.346216E-01 +6.761298E-01 +1.486738E-01 +8.551357E-01 +1.775874E-01 +8.047687E-01 +1.857631E-01 +3.777360E-01 +4.100296E-02 +4.338168E-01 +5.840594E-02 +4.348303E-01 +6.465878E-02 +4.394179E-01 +4.959337E-02 +5.241966E-01 +7.845585E-02 +1.341670E-01 +1.800078E-02 +5.385871E-02 +1.793041E-03 +6.173743E-02 +2.259834E-03 +6.444110E-02 +4.152656E-03 +7.081432E-02 +5.014668E-03 +1.654473E-02 +2.737281E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.621176E-02 +6.870565E-04 +5.355889E-02 +2.868554E-03 +3.365409E-02 +1.132598E-03 +5.895246E-02 +1.852997E-03 +1.740885E-01 +3.030680E-02 +1.344788E-01 +9.243480E-03 +1.251748E-03 +1.566872E-06 +6.166105E-01 +1.377508E-01 +1.244951E+00 +9.076885E-01 +1.232574E+00 +5.268020E-01 +9.521659E-01 +5.501652E-01 +5.241743E-01 +7.793659E-02 +4.394736E-01 +8.132651E-02 +6.971345E-01 +2.259498E-01 +1.126805E+00 +4.735028E-01 +1.273626E+00 +5.782192E-01 +6.705929E-01 +1.804595E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1284,8 +1590,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.166100E-01 -1.359789E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1304,8 +1608,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.772549E-01 -3.883777E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1314,8 +1616,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.561903E+00 -8.529594E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1324,8 +1624,86 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.673305E+00 -8.100900E-01 +1.762319E-01 +3.105769E-02 +5.375135E-02 +2.889208E-03 +8.113299E-02 +6.582562E-03 +1.402536E-02 +1.967109E-04 +2.175530E-03 +4.732931E-06 +1.604349E-01 +1.836398E-02 +8.166972E-02 +6.669944E-03 +2.359411E-02 +5.566821E-04 +3.412428E-02 +1.164466E-03 +2.152492E-01 +3.284190E-02 +8.310769E-02 +6.906889E-03 +2.718964E-02 +3.830373E-04 +9.346948E-02 +4.197883E-03 +3.131857E-01 +6.183158E-02 +1.958378E-02 +3.835246E-04 +4.342264E-01 +6.578666E-02 +2.755809E-01 +3.698954E-02 +1.426118E-01 +1.165415E-02 +3.584510E-01 +5.617880E-02 +4.236136E-01 +7.237160E-02 +6.262156E-01 +1.002935E-01 +5.564149E-01 +7.346547E-02 +5.699276E-01 +8.461288E-02 +4.650999E-01 +5.247224E-02 +7.459889E-01 +1.197750E-01 +5.057661E-01 +1.445975E-01 +7.678966E-01 +4.132032E-01 +6.320990E-01 +1.958697E-01 +4.894738E-01 +6.228971E-02 +4.603769E-01 +7.554536E-02 +2.049228E-01 +4.049304E-02 +1.753413E-01 +3.074457E-02 +1.510422E-01 +2.281373E-02 +8.467573E-02 +5.992896E-03 +2.789757E-01 +5.516042E-02 +8.268724E-03 +6.837179E-05 +6.037070E-02 +3.644622E-03 +3.198510E-02 +1.023046E-03 +6.513803E-02 +4.242963E-03 +1.276091E-01 +1.628408E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1334,18 +1712,34 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.189537E-01 -2.053395E-01 0.000000E+00 0.000000E+00 +9.095439E-02 +8.272700E-03 +7.615705E-02 +5.799896E-03 +1.051019E-01 +1.104642E-02 +3.195211E-02 +1.020937E-03 +5.641339E-04 +3.182471E-07 +6.897666E-02 +2.528352E-03 +3.437301E-02 +6.622192E-04 +7.784183E-02 +3.049933E-03 +1.316453E-01 +9.720599E-03 +4.005528E-02 +1.604425E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.216662E+00 -2.266186E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1354,8 +1748,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.018099E-01 -2.801217E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1364,8 +1756,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.099694E+00 -1.039958E+01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1374,8 +1764,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.640385E+00 -1.310152E+01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1384,8 +1772,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.780649E+00 -3.660598E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1398,12 +1784,106 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +1.757204E-03 +3.087766E-06 +1.025424E-01 +1.051495E-02 +1.006125E-02 +1.012287E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.266868E-01 +4.153309E-02 +3.249877E-01 +5.501895E-02 +2.001322E-01 +2.100219E-02 +8.393296E-02 +3.529117E-03 +9.024131E-02 +3.598207E-03 +5.321158E-01 +9.327694E-02 +4.932906E-01 +9.055152E-02 +4.652667E-01 +8.695397E-02 +4.875968E-01 +6.316894E-02 +8.509569E-01 +2.979914E-01 +8.567368E-03 +7.339979E-05 +4.733770E-03 +2.240858E-05 +4.536176E-03 +2.057689E-05 +1.498357E-02 +2.245074E-04 +4.488923E-02 +2.015043E-03 +2.070988E-01 +1.965568E-02 +1.738740E-01 +1.258772E-02 +1.405557E-01 +7.957975E-03 +1.451949E-01 +1.087042E-02 +1.836997E-01 +2.875983E-02 +2.268012E-01 +1.857423E-02 +5.477375E-01 +1.263053E-01 +2.820488E-01 +3.084507E-02 +3.122200E-02 +4.465266E-04 +1.710861E-01 +1.069095E-02 +3.709273E-01 +8.078411E-02 +4.271262E-01 +1.186890E-01 +1.975158E-01 +1.206521E-02 +3.692730E-01 +4.299892E-02 +3.794769E-01 +4.120280E-02 +1.714536E-01 +1.369896E-02 +2.608383E-01 +3.353982E-02 +2.256484E-01 +1.437053E-02 +3.682180E-01 +3.555943E-02 +2.890424E-01 +2.851080E-02 +1.430463E-01 +2.038794E-02 +2.725924E-01 +3.969996E-02 +2.241288E-01 +2.517385E-02 +4.826084E-01 +1.182832E-01 +2.614025E-01 +5.415398E-02 0.000000E+00 0.000000E+00 +5.586315E-02 +2.033451E-03 +6.512409E-03 +2.930016E-05 +3.693278E-02 +1.364030E-03 +3.805149E-02 +1.180395E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1434,6 +1914,337 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +8.763335E-02 +7.679604E-03 +6.409891E-02 +4.108671E-03 +3.345201E-03 +1.119037E-05 +2.022211E-02 +4.089337E-04 +0.000000E+00 +0.000000E+00 +3.214088E-02 +1.033036E-03 +1.411115E-01 +1.991247E-02 +9.198624E-02 +8.461468E-03 +0.000000E+00 +0.000000E+00 +7.617573E-02 +5.802742E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.367870E-02 +4.054977E-03 +1.078459E-01 +1.163075E-02 +9.447489E-02 +8.925505E-03 +6.584131E-02 +4.335077E-03 +7.988089E-02 +6.380957E-03 +6.235285E-02 +2.002820E-03 +2.706093E-01 +7.076313E-02 +1.466476E-01 +1.361819E-02 +8.729887E-03 +7.621092E-05 +1.375778E-02 +1.844203E-04 +3.984916E-01 +9.373268E-02 +3.364990E-01 +5.661596E-02 +4.020450E-01 +8.472109E-02 +4.413636E-01 +1.003742E-01 +2.121461E-01 +2.663987E-02 +1.526046E-01 +1.168051E-02 +4.991575E-01 +1.536171E-01 +2.454845E-01 +3.283217E-02 +3.372705E-01 +6.595273E-02 +5.769460E-01 +1.741438E-01 +6.007458E-02 +3.608955E-03 +1.504711E-01 +2.264155E-02 +7.769465E-02 +6.036458E-03 +2.008044E-01 +4.032242E-02 +7.336520E-02 +5.382453E-03 +2.133977E-02 +4.553857E-04 +5.594369E-02 +3.129696E-03 +5.728259E-02 +3.281295E-03 +0.000000E+00 +0.000000E+00 +1.534125E-02 +2.353539E-04 +3.758790E-01 +4.785602E-02 +3.022183E-01 +3.500670E-02 +2.613223E-01 +2.768972E-02 +2.914065E-01 +3.099270E-02 +1.539804E-01 +1.675015E-02 +3.051518E-01 +7.523708E-02 +4.204406E-01 +8.562140E-02 +3.704730E-01 +4.598759E-02 +1.751173E-02 +2.449748E-04 +4.869293E-01 +1.044601E-01 +6.761704E-01 +1.461525E-01 +2.912160E-01 +2.793298E-02 +3.679771E-01 +5.754028E-02 +2.687719E-01 +3.216123E-02 +3.996186E-01 +7.570729E-02 +6.712416E-01 +1.613293E-01 +3.265655E-01 +3.103057E-02 +4.797228E-01 +6.482187E-02 +2.938893E-01 +3.636815E-02 +3.668696E-01 +7.065345E-02 +5.187273E-01 +1.303529E-01 +1.275917E-01 +1.507907E-02 +2.374463E-01 +3.038778E-02 +1.461346E-01 +1.173624E-02 +3.316802E-01 +8.419888E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.119260E-01 +1.252742E-02 +1.234360E-01 +1.523645E-02 +1.694900E-02 +2.872686E-04 +2.200755E-02 +4.843322E-04 +8.925340E-03 +7.966170E-05 +3.099425E-01 +2.333517E-02 +6.001031E-01 +8.959511E-02 +1.514686E-01 +8.369168E-03 +3.824816E-01 +5.885437E-02 +1.918112E-01 +9.015847E-03 +8.064652E-01 +2.330752E-01 +6.706961E-01 +1.132421E-01 +6.131817E-01 +1.007516E-01 +8.751240E-01 +1.943385E-01 +4.660559E-01 +4.849161E-02 +0.000000E+00 +0.000000E+00 +1.826995E-02 +3.337911E-04 +1.859029E-02 +1.784126E-04 +2.257601E-02 +3.943994E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.149011E-04 +9.916272E-08 +1.031750E-01 +1.018080E-02 +3.950811E-02 +1.106258E-03 +5.860091E-02 +1.175610E-03 +6.436945E-02 +2.663201E-03 +3.375382E-01 +3.988372E-02 +4.786264E-01 +1.021940E-01 +3.717899E-01 +8.893674E-02 +4.843765E-01 +7.500741E-02 +7.321566E-01 +2.622431E-01 +2.644543E-01 +3.460339E-02 +1.051276E-01 +4.706652E-03 +2.193827E-01 +2.079033E-02 +3.192620E-01 +5.154372E-02 +4.290455E-01 +6.413273E-02 +2.557525E-03 +6.540932E-06 +0.000000E+00 +0.000000E+00 +1.052090E-01 +1.106892E-02 +8.286540E-02 +6.866675E-03 +0.000000E+00 +0.000000E+00 +1.108319E-02 +1.228371E-04 +5.279365E-02 +2.787169E-03 +9.209996E-02 +8.482402E-03 +7.311185E-02 +5.345342E-03 +6.779218E-02 +4.595780E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.217913E-02 +2.722661E-03 +3.183172E-02 +1.013259E-03 +5.143123E-02 +2.645171E-03 +3.853962E-02 +1.485302E-03 +1.949072E-01 +1.922224E-02 +5.899907E-02 +3.480891E-03 +0.000000E+00 +0.000000E+00 +9.911631E-02 +4.914980E-03 +1.936066E-02 +3.748352E-04 +1.894345E-01 +1.975743E-02 +2.702327E-01 +3.872839E-02 +3.536531E-02 +6.346895E-04 +8.927224E-02 +3.117244E-03 +1.239024E-01 +1.460889E-02 +7.460673E-02 +1.997499E-03 +2.794038E-01 +3.362026E-02 +2.445230E-01 +2.175117E-02 +3.410532E-01 +2.922254E-02 +3.550664E-01 +3.489306E-02 +2.325575E-01 +3.512250E-02 +4.594717E-01 +9.534559E-02 +5.021181E-01 +7.072668E-02 +0.000000E+00 +0.000000E+00 +2.329054E-02 +5.424494E-04 +0.000000E+00 +0.000000E+00 +2.888777E-02 +8.345031E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1443,6 +2254,76 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +1.385420E-03 +1.919390E-06 +2.522303E-02 +3.885557E-04 +1.438283E-01 +1.096381E-02 +1.194387E-01 +9.501961E-03 +9.765239E-02 +7.032757E-03 +3.628610E-01 +4.465263E-02 +6.425628E-01 +1.448704E-01 +8.254508E-01 +2.022199E-01 +2.263208E-01 +1.950877E-02 +4.086773E-01 +5.427169E-02 +1.296965E-01 +1.433530E-02 +9.777235E-02 +9.559432E-03 +1.759685E-01 +2.120369E-02 +9.720573E-02 +8.041371E-03 +5.756698E-02 +1.656980E-03 +6.570752E-02 +4.317479E-03 +2.995199E-02 +8.971217E-04 +3.918618E-02 +1.535557E-03 +1.416971E-01 +2.007807E-02 +1.210479E-01 +1.465260E-02 +2.164294E-01 +1.273492E-02 +2.057206E-01 +1.289154E-02 +3.057417E-01 +2.906387E-02 +1.846244E-01 +1.150813E-02 +2.505386E-01 +2.352353E-02 +3.102978E-01 +3.075705E-02 +1.807102E-01 +1.130111E-02 +3.636532E-01 +4.277721E-02 +2.756322E-01 +4.629958E-02 +2.574707E-01 +2.390921E-02 +1.663280E-01 +1.055366E-02 +1.971757E-01 +1.617882E-02 +4.330849E-01 +1.046596E-01 +2.069552E-01 +2.229127E-02 +1.925621E-01 +1.943705E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1454,8 +2335,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.628211E-01 -2.651070E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1464,8 +2343,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.962156E-01 -3.850057E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1474,8 +2351,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.052562E-01 -2.499929E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1484,19 +2359,49 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.634501E+00 -1.758133E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.304368E-01 +8.705800E-03 +3.320497E-02 +8.247331E-04 +9.661007E-02 +3.530809E-03 +1.309409E-01 +1.044539E-02 +1.502393E-01 +1.063521E-02 +3.041909E-01 +4.449294E-02 +1.051607E-01 +5.720926E-03 +4.660472E-01 +1.043583E-01 +2.095413E-01 +1.848500E-02 +2.464474E-01 +5.064008E-02 +2.026234E-02 +4.105624E-04 +5.623882E-02 +1.709973E-03 +2.308936E-02 +5.331186E-04 +2.153979E-02 +3.386990E-04 +1.741974E-02 +2.593235E-04 +3.505900E-03 +1.229134E-05 0.000000E+00 0.000000E+00 0.000000E+00 -3.767142E+00 -2.999082E+00 0.000000E+00 +9.693909E-03 +9.397187E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1504,8 +2409,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.209998E+00 -1.296913E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1514,8 +2417,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.850185E-01 -1.260300E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1523,10 +2424,76 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +1.877721E-02 +3.525836E-04 +3.220986E-02 +1.037475E-03 +5.922775E-03 +3.507927E-05 +1.324027E-02 +1.753048E-04 +2.380758E-02 +5.668009E-04 +3.163073E-01 +4.136106E-02 +5.034850E-01 +8.165041E-02 +5.323116E-01 +1.070342E-01 +2.067587E-01 +1.617541E-02 +3.713337E-01 +4.573936E-02 +2.929441E-01 +2.492852E-02 +3.860197E-01 +4.752061E-02 +3.611950E-01 +4.832689E-02 +8.553920E-01 +2.489853E-01 +5.346553E-01 +1.070166E-01 +2.748655E-01 +3.207760E-02 +1.880564E-01 +1.454490E-02 +1.441330E-01 +7.384927E-03 +4.222507E-01 +6.303877E-02 +2.371504E-01 +3.784365E-02 +2.876155E-02 +8.272268E-04 +7.209175E-02 +5.197220E-03 +7.833937E-02 +6.137056E-03 +3.354994E-03 +1.125598E-05 +1.734437E-02 +3.008272E-04 +3.834849E-03 +1.470607E-05 0.000000E+00 -9.631538E-02 -9.276652E-03 0.000000E+00 +1.026300E-02 +1.053291E-04 +1.105643E-02 +1.222447E-04 +4.407736E-03 +1.942813E-05 +3.960455E-02 +1.249026E-03 +2.254955E-03 +5.084823E-06 +5.008555E-02 +1.568589E-03 +3.272442E-02 +5.361599E-04 +3.485209E-02 +6.419840E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1534,8 +2501,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.024256E-01 -9.618585E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1544,8 +2509,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.570476E+00 -8.807549E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1554,8 +2517,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.207632E+00 -6.365426E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1563,14 +2524,56 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.182776E-01 +2.619114E-02 +3.174056E-01 +5.433423E-02 +3.745919E-01 +1.196180E-01 +1.599302E-01 +1.291332E-02 +2.220796E-01 +2.899420E-02 +9.764734E-02 +9.535004E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.888114E-01 +3.564974E-02 +1.876245E-01 +3.247950E-02 +1.607592E-01 +2.430317E-02 +2.880051E-01 +4.250400E-02 +1.889880E-01 +1.852264E-02 +1.789814E-01 +2.024483E-02 +9.720855E-02 +9.449501E-03 +1.741882E-02 +3.034154E-04 +1.178715E-01 +1.389369E-02 +3.198634E-01 +1.023126E-01 +3.546193E-02 +9.738454E-04 +4.996773E-02 +2.496774E-03 +1.420664E-02 +2.018286E-04 0.000000E+00 0.000000E+00 +9.800069E-03 +9.604135E-05 +2.640870E-02 +6.974194E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1601,6 +2604,36 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.025873E-01 +2.135872E-02 +2.345491E-01 +3.182709E-02 +1.923074E-01 +1.902643E-02 +5.555865E-02 +1.786230E-03 +5.409278E-02 +1.631497E-03 +6.993790E-01 +1.999988E-01 +5.527654E-01 +7.214885E-02 +5.149839E-01 +6.167088E-02 +4.730824E-01 +6.445758E-02 +5.125355E-01 +9.159800E-02 +3.657482E-02 +1.337717E-03 +6.491103E-02 +4.213441E-03 +2.111583E-01 +2.321778E-02 +5.587914E-02 +3.122478E-03 +1.764618E-02 +3.113877E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1624,8 +2657,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.273172E-01 -1.071365E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1634,8 +2665,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.150722E-01 -1.477306E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1644,8 +2673,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.365363E-01 -1.545056E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1654,8 +2681,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.634484E+00 -1.006786E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1664,8 +2689,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.963647E+00 -1.921299E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1673,19 +2696,45 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +1.035788E-02 +1.072857E-04 +1.373000E-01 +1.345940E-02 +6.493738E-02 +2.500846E-03 0.000000E+00 -2.855612E+00 -3.738770E+00 0.000000E+00 +1.360043E-02 +1.849716E-04 +4.018634E-04 +1.614942E-07 +3.908707E-02 +1.527799E-03 +9.495691E-02 +9.016814E-03 +2.038259E-01 +4.154501E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.754347E-02 +3.077734E-04 +1.328306E-02 +1.764397E-04 0.000000E+00 0.000000E+00 +1.389367E-03 +1.930340E-06 +4.796108E-03 +2.300265E-05 +8.301133E-03 +6.890881E-05 +1.620052E-02 +2.624570E-04 +4.802741E-02 +2.306633E-03 0.000000E+00 -8.949577E-01 -6.996292E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1694,8 +2743,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.933716E-01 -8.606692E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1714,8 +2761,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.047296E-01 -9.286014E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1724,8 +2769,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.528920E-01 -6.502654E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1741,1059 +2784,16 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.143609E-01 -1.307841E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.259810E-01 -4.281927E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.829227E+00 -2.711068E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.771012E-02 -5.375002E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.504231E-01 -3.192897E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.258896E+00 -4.828866E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.744319E+00 -1.102318E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.315201E+00 -5.202230E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.383778E+00 -1.064894E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.373598E-01 -1.384092E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.752996E-01 -3.072994E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.414144E-01 -1.165638E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.117217E-01 -1.695148E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.020974E-01 -1.807843E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.790545E+00 -1.606987E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.811463E+00 -1.690787E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.624100E-01 -3.163050E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.499073E-01 -2.247220E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.384807E+00 -6.489982E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.600506E+00 -1.075835E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.003754E+00 -1.473659E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.138289E+00 -1.397348E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.361580E+00 -9.669336E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.832439E-01 -8.022708E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.635807E+00 -6.575567E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.431523E+00 -2.763717E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.943625E-02 -2.266446E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.659683E-01 -3.141838E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.404488E+00 -1.657632E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.337272E+00 -6.818393E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.906319E-01 -3.634051E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.968808E-01 -8.813823E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.401085E-02 -7.057823E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.438771E-01 -6.726955E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.135095E-01 -1.453647E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.117081E-01 -2.474125E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.890267E+00 -9.971621E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.217831E-02 -2.722576E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.875279E-01 -7.222991E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.465873E+00 -1.684795E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.582101E-01 -2.308163E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.975907E-01 -1.580784E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.163055E+00 -4.040199E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.387764E+00 -4.357290E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.196106E+00 -5.866078E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.414320E-01 -1.354077E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.331388E+00 -7.999297E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.385501E-01 -1.119957E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.319981E-02 -1.742350E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.395770E-02 -8.828049E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.930196E+00 -1.056890E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.430206E+00 -1.555413E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.266456E+00 -6.181299E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.998920E-01 -3.995682E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.956201E-02 -4.777812E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.595216E-01 -1.454967E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.292285E+00 -8.702623E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.864587E-01 -8.205860E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.004358E+00 -5.599700E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.878242E-01 -3.111548E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.003831E-01 -1.007678E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.390952E-01 -2.937091E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.752746E+00 -1.853071E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.861695E-01 -8.327886E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.125953E-01 -2.392175E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.518722E-01 -1.238140E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.082653E-02 -9.502751E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.871455E-02 -6.195980E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.032079E-01 -9.193502E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.462519E-02 +2.138962E-04 +7.673812E-02 +5.888740E-03 +1.631406E-01 +2.661484E-02 +4.823869E-02 +2.326971E-03 +4.653199E-04 +2.165226E-07 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_azimuthal/tallies.xml b/tests/test_filter_azimuthal/tallies.xml index b0c29d29be..b9a53b27e0 100644 --- a/tests/test_filter_azimuthal/tallies.xml +++ b/tests/test_filter_azimuthal/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -182.07 -182.07 182.07 182.07 17 17 diff --git a/tests/test_filter_mu/results_true.dat b/tests/test_filter_mu/results_true.dat index eb8c278fd0..11ac334d12 100644 --- a/tests/test_filter_mu/results_true.dat +++ b/tests/test_filter_mu/results_true.dat @@ -3,8 +3,8 @@ k-combined: tally 1: 1.238000E+01 3.065560E+01 -1.238000E+01 -3.065560E+01 +1.239000E+01 +3.070450E+01 1.397000E+01 3.913670E+01 1.397000E+01 @@ -20,8 +20,8 @@ tally 1: tally 2: 1.238000E+01 3.065560E+01 -1.238000E+01 -3.065560E+01 +1.239000E+01 +3.070450E+01 1.397000E+01 3.913670E+01 1.397000E+01 @@ -1637,8 +1637,8 @@ tally 3: 1.888300E+00 1.500000E-01 7.700000E-03 -1.500000E-01 -7.700000E-03 +1.600000E-01 +9.000000E-03 1.800000E-01 1.220000E-02 1.800000E-01 diff --git a/tests/test_filter_mu/tallies.xml b/tests/test_filter_mu/tallies.xml index b72a8ba5ec..c0f122c8d0 100644 --- a/tests/test_filter_mu/tallies.xml +++ b/tests/test_filter_mu/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -182.07 -182.07 182.07 182.07 17 17 diff --git a/tests/test_filter_polar/results_true.dat b/tests/test_filter_polar/results_true.dat index 409d7ed128..ffff7ded05 100644 --- a/tests/test_filter_polar/results_true.dat +++ b/tests/test_filter_polar/results_true.dat @@ -254,6 +254,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 1.474302E-01 2.173566E-02 0.000000E+00 @@ -262,10 +264,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +3.432595E-02 +1.178271E-03 +1.903587E-01 +3.623643E-02 +1.250046E-01 +1.562615E-02 +3.869169E-02 +1.497047E-03 +3.668674E-02 +1.345917E-03 0.000000E+00 0.000000E+00 -4.250677E-01 -1.806825E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -394,6 +404,36 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +3.190607E-02 +7.096961E-04 +3.895259E-01 +8.495601E-02 +2.284979E-01 +3.250979E-02 +4.643875E-01 +1.860775E-01 +2.654254E-01 +6.037390E-02 +2.698254E-02 +7.280575E-04 +1.817443E-01 +2.161385E-02 +7.254787E-02 +2.987520E-03 +1.582096E-01 +1.826557E-02 +1.663246E-03 +2.766386E-06 +8.259018E-03 +6.821137E-05 +2.558792E-01 +4.504604E-02 +2.453509E-01 +3.080447E-02 +8.083188E-02 +5.647153E-03 +1.387367E-02 +1.924786E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -404,8 +444,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.379743E+00 -1.311268E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -414,8 +452,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.411476E-01 -1.292788E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -424,8 +460,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -6.041947E-01 -1.293434E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -460,6 +494,16 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +4.347824E-02 +1.890357E-03 +9.303810E-02 +8.656089E-03 +1.089074E-01 +1.186081E-02 +7.890050E-02 +6.225288E-03 +6.152985E-02 +3.785923E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -494,8 +538,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.858540E-01 -1.488833E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -532,6 +574,56 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +4.699808E-03 +2.208819E-05 +1.704635E-01 +1.776343E-02 +3.739623E-01 +1.012665E-01 +1.175392E-01 +7.573086E-03 +6.720332E-02 +3.513831E-03 +1.769341E-01 +1.610590E-02 +4.744278E-01 +5.672771E-02 +5.501395E-01 +1.244910E-01 +4.728963E-01 +9.971839E-02 +2.415960E-01 +1.921861E-02 +8.118001E-02 +4.276190E-03 +9.462447E-01 +3.563633E-01 +1.217330E+00 +6.102058E-01 +1.283191E+00 +5.152286E-01 +8.551530E-01 +2.763767E-01 +1.325767E-01 +1.559092E-02 +4.092935E-01 +1.058373E-01 +2.419310E-01 +2.153941E-02 +1.411949E-01 +8.672931E-03 +4.837309E-02 +1.201282E-03 +1.731752E-02 +2.998966E-04 +2.037172E-01 +4.150072E-02 +7.239365E-02 +5.240841E-03 +4.466284E-03 +1.994770E-05 +3.796115E-02 +1.441049E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -542,6 +634,16 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +1.031321E-02 +1.063623E-04 +3.027497E-03 +9.165739E-06 +2.370722E-02 +5.620325E-04 +4.776229E-05 +2.281236E-09 +1.005522E-02 +1.011075E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -552,20 +654,56 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +3.944866E-02 +1.556197E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +8.416144E-03 +7.083149E-05 +4.723681E-02 +2.231316E-03 0.000000E+00 0.000000E+00 +6.157666E-02 +3.791685E-03 +1.435494E-01 +1.175050E-02 +1.883042E-02 +3.545848E-04 0.000000E+00 0.000000E+00 +9.858022E-02 +6.064864E-03 +1.377573E-01 +6.075009E-03 +5.553592E-01 +1.165658E-01 +1.920276E-01 +1.683819E-02 0.000000E+00 0.000000E+00 +9.291000E-02 +4.496084E-03 +1.528956E-01 +6.696896E-03 +3.470337E-01 +4.913557E-02 +1.668142E-01 +7.106155E-03 +1.397614E-01 +1.415223E-02 0.000000E+00 0.000000E+00 +1.462957E-02 +2.140245E-04 0.000000E+00 0.000000E+00 +2.356684E-01 +5.553959E-02 +2.212588E-02 +4.895545E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -574,8 +712,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.338682E-01 -3.487437E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -584,642 +720,510 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.915994E+00 -1.046110E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.383099E+00 -6.158644E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.733692E-01 -4.271368E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.358559E-01 -1.127992E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.715092E-02 -2.223209E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.510162E-02 -9.044318E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.239565E-01 -3.408418E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.837242E-01 -3.095588E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.994150E-01 -2.866219E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.724238E-01 -7.421475E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.433355E-01 -1.157425E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.547867E-01 -1.313519E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.879130E+00 -9.055069E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.368540E-01 -6.270785E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.652111E+00 -1.033642E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.310051E+00 -9.755343E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.097363E+00 -1.364448E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.373035E+00 -1.305514E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.745973E+00 -1.053371E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.139451E+00 -1.572197E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.774043E+00 -3.284606E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.295905E+00 -6.522302E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.221434E+00 -5.018537E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.562734E+00 -8.637801E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.649733E-01 -2.226711E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.288704E+00 -7.109246E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.466278E+00 -1.578589E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.807475E-01 -4.695137E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.126927E-02 -8.330079E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.720195E-01 -8.707551E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.990373E+00 -2.342787E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.189163E+00 -5.672280E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.799118E+00 -9.852508E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.604690E+00 -9.452433E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.751744E+00 -2.548820E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.590271E+00 -1.069990E+01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.160807E+00 -2.684910E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.968641E+00 -1.977620E+01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.115995E+00 -3.927279E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.487088E+00 -8.377840E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.815094E-01 -7.655932E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.566015E+00 -8.425867E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.544552E-01 -3.858396E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.145926E-01 -8.654276E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.404772E-01 -5.782929E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.354304E-01 -9.779168E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.473896E-01 -4.381391E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.075755E+00 -1.180059E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.798183E+00 -1.189243E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.205742E-01 -2.287243E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.535623E-01 -4.961922E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.019654E+00 -6.953712E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.843585E+00 -1.633603E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.369353E+00 -1.220652E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.262961E+00 -8.319161E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.391250E+00 -3.942772E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.547550E+00 -6.442982E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.216998E-02 +9.139549E-05 +3.932625E-02 +1.546554E-03 +9.602503E-02 +9.220806E-03 +8.630974E-02 +7.449371E-03 +1.095045E-01 +1.199123E-02 +4.255818E-03 +1.811199E-05 +9.836434E-02 +4.839529E-03 +5.216653E-02 +2.633697E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.832664E-02 +2.176805E-03 +1.141400E+00 +3.562881E-01 +3.160116E-01 +3.009071E-02 +1.902307E-01 +1.300689E-02 +1.531603E-01 +1.135371E-02 +1.228605E-01 +1.509470E-02 +3.450058E-01 +9.135498E-02 +3.182309E-01 +1.012709E-01 +5.058713E-02 +2.559057E-03 +1.697725E-04 +2.882269E-08 +3.492002E-01 +4.901829E-02 +5.660396E-01 +1.129198E-01 +5.226192E-01 +1.186296E-01 +1.987306E-01 +2.221535E-02 +1.552123E-02 +9.624873E-05 +1.695828E-01 +2.337364E-02 +3.719807E-01 +1.033719E-01 +4.987578E-01 +1.131589E-01 +2.633262E-01 +3.548629E-02 +6.403661E-03 +4.100687E-05 +2.098620E-01 +3.185923E-02 +5.327678E-01 +1.260314E-01 +6.830219E-01 +1.204174E-01 +4.959908E-01 +6.583551E-02 +1.757201E-01 +1.232506E-02 +2.426806E-01 +1.505768E-02 +5.661567E-01 +9.439168E-02 +7.963110E-01 +1.562706E-01 +5.914847E-01 +9.396630E-02 +1.764016E-01 +8.644711E-03 +3.903970E-02 +1.436954E-03 +3.529581E-01 +5.734566E-02 +4.483558E-01 +7.148105E-02 +6.954349E-01 +1.897543E-01 +2.101845E-01 +1.947836E-02 +3.255484E-01 +3.587411E-02 +5.457278E-01 +1.382796E-01 +6.298487E-01 +1.349603E-01 +5.149968E-01 +9.289024E-02 +1.233296E-01 +8.098392E-03 +2.114802E-01 +2.223257E-02 +7.493878E-01 +1.953165E-01 +9.606204E-01 +3.851562E-01 +5.959420E-01 +1.729410E-01 +2.566123E-01 +5.220316E-02 +1.300714E-01 +1.691857E-02 +4.188623E-01 +8.186145E-02 +3.525139E-01 +4.441007E-02 +2.539997E-01 +2.400996E-02 +1.404577E-01 +1.042754E-02 +4.883870E-01 +1.034732E-01 +1.303595E+00 +4.770995E-01 +1.264727E+00 +4.675060E-01 +8.520501E-01 +2.050500E-01 +3.126758E-01 +2.994247E-02 +1.924008E-01 +1.559227E-02 +2.935492E-01 +3.017433E-02 +4.324628E-01 +7.881462E-02 +3.975254E-01 +5.245815E-02 +2.467962E-01 +2.372880E-02 +1.444930E-01 +1.681850E-02 +1.556147E-01 +1.781515E-02 +1.223846E-01 +6.714831E-03 +1.404183E-01 +8.081436E-03 +1.020626E-01 +4.635949E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.646579E-02 +2.504559E-03 +3.031950E-01 +4.705208E-02 +5.003254E-01 +1.259295E-01 +3.681484E-01 +5.480080E-02 +4.056911E-02 +7.133468E-04 +1.728687E-01 +1.044538E-02 +7.900932E-01 +1.675525E-01 +7.556186E-01 +1.868565E-01 +5.898075E-01 +9.934908E-02 +1.578898E-01 +9.743581E-03 +3.443117E-02 +1.185505E-03 +3.856868E-01 +5.479213E-02 +3.114128E-01 +9.697792E-02 +1.501365E-01 +1.128685E-02 +9.908018E-02 +4.946696E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.848461E-02 +3.416807E-04 +1.735563E-02 +3.012179E-04 +3.766057E-02 +1.418319E-03 +1.452737E-02 +2.110444E-04 +3.241090E-03 +1.050466E-05 +6.571107E-02 +4.317945E-03 +1.818850E-01 +1.858395E-02 +1.423701E-01 +8.531355E-03 +5.192358E-02 +1.584201E-03 +3.012974E-02 +9.078010E-04 +3.460308E-01 +4.300833E-02 +8.886342E-01 +1.979649E-01 +9.842888E-01 +2.881765E-01 +5.321000E-01 +1.136150E-01 +2.393190E-01 +2.520479E-02 +2.493318E-01 +3.685476E-02 +2.500704E-01 +2.329962E-02 +4.018748E-01 +6.213118E-02 +2.163802E-01 +4.388987E-02 +7.150616E-02 +5.113131E-03 +3.654527E-01 +3.457991E-02 +3.002729E-01 +4.511272E-02 +2.822579E-01 +2.338732E-02 +6.528294E-01 +1.524807E-01 +1.983048E-01 +1.689245E-02 +4.589165E-01 +1.024191E-01 +3.589193E-01 +5.696940E-02 +3.829127E-01 +6.900291E-02 +3.434619E-01 +5.687528E-02 +6.047994E-02 +2.769308E-03 +2.829720E-01 +4.033132E-02 +8.343244E-01 +2.365735E-01 +8.461794E-01 +2.419086E-01 +5.328086E-01 +1.076794E-01 +2.554593E-01 +2.705326E-02 +5.690688E-01 +9.395399E-02 +1.710545E+00 +8.536400E-01 +2.487795E+00 +1.540558E+00 +1.180503E+00 +4.049532E-01 +6.423595E-01 +9.393144E-02 +3.064727E-01 +3.611240E-02 +8.865444E-01 +2.203178E-01 +1.156982E+00 +3.522074E-01 +6.756657E-01 +1.483080E-01 +1.351425E-01 +7.476476E-03 +6.597908E-01 +1.073049E-01 +2.457677E+00 +2.023614E+00 +2.652227E+00 +1.892776E+00 +2.281177E+00 +1.220067E+00 +9.177700E-01 +2.209165E-01 +2.942481E-01 +4.779456E-02 +8.896377E-01 +3.427659E-01 +6.573629E-01 +2.038360E-01 +1.068984E+00 +4.074942E-01 +2.057626E-01 +2.224194E-02 +2.108308E-01 +3.789794E-02 +5.315992E-01 +9.898359E-02 +2.762801E-01 +2.558533E-02 +3.243687E-01 +3.986361E-02 +1.440088E-01 +9.846532E-03 +6.273453E-02 +3.935622E-03 +1.890350E-02 +3.573424E-04 +1.244120E-01 +6.073193E-03 +1.524211E-01 +1.186313E-02 +2.303826E-02 +5.307612E-04 +6.935823E-02 +3.443786E-03 +2.979499E-01 +3.904359E-02 +6.378873E-01 +1.392033E-01 +3.462076E-01 +4.509511E-02 +2.146121E-01 +2.097943E-02 +0.000000E+00 +0.000000E+00 +1.762597E-01 +1.474243E-02 +4.841373E-02 +8.250738E-04 +1.041634E-01 +5.617826E-03 +2.561839E-02 +3.592083E-04 +1.686008E-02 +2.842622E-04 +3.235876E-01 +5.394411E-02 +7.334494E-02 +5.379480E-03 +7.999641E-04 +6.399425E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.975273E-02 +8.055552E-03 +5.250975E-03 +2.757273E-05 +1.454735E-01 +2.116254E-02 +0.000000E+00 +0.000000E+00 +2.599359E-02 +6.756667E-04 +1.189527E-01 +1.292776E-02 +1.366675E-01 +1.329920E-02 +7.681734E-02 +5.221801E-03 +7.699920E-02 +4.484948E-03 +0.000000E+00 +0.000000E+00 +4.931708E-02 +1.519629E-03 +2.075187E-01 +3.932831E-02 +4.866201E-01 +1.783976E-01 +3.933727E-03 +1.547420E-05 +1.447774E-01 +7.878318E-03 +7.337539E-01 +1.940469E-01 +4.244053E-01 +6.524380E-02 +6.956651E-01 +1.373331E-01 +7.715359E-02 +2.759193E-03 +2.608743E-02 +3.428298E-04 +4.420638E-01 +7.497408E-02 +7.192560E-01 +2.545420E-01 +5.225508E-01 +1.022956E-01 +8.822506E-02 +3.143855E-03 +5.973264E-02 +3.567988E-03 +1.721672E-01 +2.964154E-02 +1.092900E-01 +8.936541E-03 +1.123419E-01 +8.303025E-03 +6.704262E-02 +3.918055E-03 +0.000000E+00 +0.000000E+00 +1.479675E-01 +2.069803E-02 +4.274959E-02 +1.565916E-03 +4.860036E-02 +1.376540E-03 +1.424478E-02 +1.384768E-04 +9.918901E-02 +9.838461E-03 +3.241857E-01 +5.388926E-02 +3.722589E-01 +9.294021E-02 +1.613917E-01 +2.604727E-02 +6.262877E-02 +3.922363E-03 +4.517748E-02 +1.175222E-03 +5.902904E-01 +3.025110E-01 +6.688624E-01 +1.628101E-01 +3.657483E-01 +8.271269E-02 +1.735064E-01 +1.432316E-02 +9.656594E-02 +9.324980E-03 +4.579678E-01 +1.529918E-01 +4.117654E-01 +1.078929E-01 +3.294982E-01 +6.501983E-02 +7.355570E-02 +2.720089E-03 +3.353709E-01 +3.645392E-02 +1.366673E+00 +5.534696E-01 +1.626348E+00 +7.956301E-01 +1.557030E+00 +8.102316E-01 +3.775397E-01 +4.337036E-02 +3.810078E-01 +4.006540E-02 +8.925398E-01 +1.976057E-01 +1.494959E+00 +4.820858E-01 +1.109655E+00 +2.627263E-01 +5.130883E-01 +6.343981E-02 +1.276620E-01 +5.657924E-03 +4.705785E-01 +7.223213E-02 +2.779174E-01 +2.705433E-02 +4.893172E-01 +7.465499E-02 +1.820748E-01 +1.307515E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1282,10 +1286,114 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +8.468687E-02 +7.171866E-03 +2.903920E-02 +8.432750E-04 +2.883932E-03 +8.317065E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.314268E-02 +7.259921E-04 +2.029621E-01 +1.983891E-02 +2.943558E-01 +4.569215E-02 +2.376044E-01 +1.893725E-02 +2.091898E-01 +2.867530E-02 +1.532448E-01 +1.992068E-02 +4.416877E-01 +9.154407E-02 +4.413786E-01 +6.841708E-02 +4.412459E-01 +7.191730E-02 +8.434576E-02 +3.470402E-03 +1.304242E-01 +6.269176E-03 +4.348960E-01 +5.106950E-02 +2.460526E-01 +2.089796E-02 +6.142283E-01 +1.328688E-01 +2.477043E-01 +2.480481E-02 0.000000E+00 0.000000E+00 -1.166100E-01 -1.359789E-02 +3.484736E-01 +7.407098E-02 +3.662144E-01 +3.495803E-02 +1.691338E-01 +1.145274E-02 +3.513192E-02 +6.966704E-04 +1.866371E-01 +9.785455E-03 +8.658518E-01 +2.161446E-01 +9.638943E-01 +1.913045E-01 +7.854268E-01 +1.413095E-01 +4.148521E-01 +4.744507E-02 +1.105032E-01 +6.326652E-03 +1.171852E-01 +1.353690E-02 +3.104375E-01 +4.832172E-02 +9.995680E-02 +9.991361E-03 +6.372721E-02 +3.244987E-03 +3.605302E-01 +9.968218E-02 +1.099699E+00 +6.237421E-01 +1.597767E+00 +1.586586E+00 +9.544061E-01 +6.760972E-01 +8.729241E-02 +7.619964E-03 +4.395545E-01 +4.943293E-02 +2.117369E+00 +1.212555E+00 +2.055810E+00 +9.158404E-01 +2.278523E+00 +1.132537E+00 +7.491295E-01 +1.486131E-01 +4.336193E-01 +6.334650E-02 +1.458137E+00 +5.498244E-01 +1.205622E+00 +4.016799E-01 +5.450346E-01 +7.521207E-02 +1.382368E-01 +7.589255E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1304,8 +1412,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.772549E-01 -3.883777E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1314,8 +1420,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.561903E+00 -8.529594E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1324,8 +1428,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.673305E+00 -8.100900E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1334,8 +1436,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.189537E-01 -2.053395E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1344,8 +1444,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.216662E+00 -2.266186E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1354,18 +1452,118 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.018099E-01 -2.801217E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.652940E-02 +2.732211E-04 +5.660527E-02 +3.204156E-03 +8.968640E-02 +8.043650E-03 0.000000E+00 0.000000E+00 +1.377392E-04 +1.897208E-08 +3.707446E-02 +1.374516E-03 +4.732144E-02 +2.239319E-03 +9.872573E-02 +9.746769E-03 +1.295626E-02 +1.678647E-04 +1.643480E-02 +2.701026E-04 +1.469127E-01 +2.158334E-02 +1.739661E-01 +2.847920E-02 +1.226772E-01 +1.504971E-02 +4.526537E-02 +2.048953E-03 +2.743612E-01 +1.935488E-02 +7.004598E-01 +1.233628E-01 +9.918695E-01 +2.685056E-01 +4.582090E-01 +8.666853E-02 +2.096014E-01 +1.276117E-02 +1.058629E-01 +2.723827E-03 +1.187095E+00 +3.032117E-01 +1.357908E+00 +4.012459E-01 +8.554331E-01 +1.656922E-01 +2.608428E-01 +2.236927E-02 +1.282796E-01 +1.046417E-02 +8.199420E-01 +1.966086E-01 +6.898854E-01 +1.292887E-01 +4.216338E-01 +4.506530E-02 +1.502568E-01 +6.176513E-03 +2.031456E-02 +4.126812E-04 +1.802925E-02 +3.086793E-04 +1.193142E-01 +1.131635E-02 +2.115812E-01 +4.476660E-02 +1.577931E-02 +2.489865E-04 +1.544902E-02 +2.386723E-04 +2.016287E-02 +4.065414E-04 +2.750261E-02 +7.563936E-04 +3.320088E-02 +1.102298E-03 0.000000E+00 0.000000E+00 -4.099694E+00 -1.039958E+01 +3.490686E-02 +1.218489E-03 +1.205409E-01 +1.021218E-02 +7.309267E-02 +2.688000E-03 +1.332323E-01 +9.052410E-03 +4.065279E-02 +1.554009E-03 +8.080617E-01 +4.188794E-01 +1.202798E+00 +5.942992E-01 +1.010606E+00 +2.840204E-01 +8.887959E-01 +3.472468E-01 +6.602136E-01 +2.907517E-01 +4.266630E-01 +1.192779E-01 +9.611768E-01 +3.989244E-01 +1.348575E+00 +6.074390E-01 +1.019505E+00 +3.185084E-01 +4.517109E-01 +8.709865E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1374,8 +1572,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.640385E+00 -1.310152E+01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1384,8 +1580,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.780649E+00 -3.660598E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1430,6 +1624,86 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +5.153908E-02 +2.656277E-03 +5.794382E-02 +3.357486E-03 +9.838796E-02 +9.680191E-03 +7.152879E-02 +5.116368E-03 +4.791751E-02 +2.296088E-03 +1.888712E-02 +3.567231E-04 +7.076392E-02 +3.568253E-03 +1.283883E-01 +1.648356E-02 +1.262630E-01 +8.215235E-03 +1.707699E-01 +1.905865E-02 +2.502881E-02 +6.264411E-04 +1.707851E-01 +1.473743E-02 +1.745214E-01 +1.623261E-02 +7.269367E-02 +2.757335E-03 +9.350736E-02 +8.743625E-03 +2.774232E-01 +4.172901E-02 +3.637219E-01 +4.693551E-02 +3.527932E-01 +5.380019E-02 +5.222100E-01 +1.174753E-01 +1.183355E-01 +6.057836E-03 +2.886966E-01 +1.740085E-02 +1.034157E+00 +2.303798E-01 +7.768759E-01 +1.274066E-01 +6.628867E-01 +1.034133E-01 +2.010307E-01 +2.316808E-02 +2.009075E-01 +1.919952E-02 +6.804407E-01 +2.137544E-01 +8.260664E-01 +2.649841E-01 +8.820765E-01 +3.809810E-01 +2.661213E-01 +4.884605E-02 +1.408161E-02 +1.982916E-04 +2.416436E-01 +5.839162E-02 +3.056900E-01 +6.814222E-02 +2.122374E-01 +4.047759E-02 +1.213052E-01 +1.471494E-02 +2.817468E-02 +7.938125E-04 +4.695682E-02 +2.204943E-03 +1.915132E-01 +3.667731E-02 +2.369382E-02 +5.613973E-04 +3.033090E-03 +9.199635E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1440,6 +1714,26 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +6.103456E-02 +3.725218E-03 +1.882024E-02 +3.542015E-04 +1.002636E-01 +1.005280E-02 +7.170265E-02 +5.141270E-03 +5.290853E-02 +2.799313E-03 +6.869492E-02 +2.504127E-03 +1.500984E-01 +1.135598E-02 +6.108774E-02 +1.877322E-03 +6.278377E-02 +3.941802E-03 +1.022721E-02 +1.045959E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1454,8 +1748,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.628211E-01 -2.651070E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1464,8 +1756,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.962156E-01 -3.850057E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1474,8 +1764,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -5.052562E-01 -2.499929E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1484,8 +1772,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.634501E+00 -1.758133E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1494,8 +1780,118 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.767142E+00 -2.999082E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.993308E-02 +1.594651E-03 +2.687749E-02 +7.223997E-04 +0.000000E+00 +0.000000E+00 +4.755032E-02 +2.261033E-03 +1.796225E-02 +1.867762E-04 +2.500575E-01 +3.399577E-02 +2.773690E-01 +3.591173E-02 +1.805687E-01 +1.682597E-02 +2.000235E-01 +2.326675E-02 +1.392489E-01 +6.559818E-03 +7.549772E-01 +1.676529E-01 +7.060644E-01 +1.743673E-01 +8.058118E-01 +2.813447E-01 +4.231245E-01 +6.474373E-02 +1.296487E-02 +1.680878E-04 +6.363948E-03 +4.049983E-05 +3.776758E-02 +1.124903E-03 +1.638174E-02 +2.683614E-04 +4.231982E-03 +1.790967E-05 +5.098742E-02 +1.326815E-03 +1.909233E-01 +1.640214E-02 +2.126367E-01 +1.609441E-02 +3.843095E-01 +8.542147E-02 +1.156625E-02 +6.274892E-05 +9.148553E-02 +3.520727E-03 +5.974176E-01 +1.529417E-01 +3.615961E-01 +4.335834E-02 +2.083963E-01 +1.447201E-02 +0.000000E+00 +0.000000E+00 +1.706793E-01 +1.567394E-02 +4.061529E-01 +5.625387E-02 +6.831757E-01 +1.921612E-01 +4.061388E-01 +4.915675E-02 +7.817234E-02 +3.239000E-03 +1.276897E-01 +7.068786E-03 +3.439888E-01 +3.009075E-02 +4.917005E-01 +9.598551E-02 +2.505637E-01 +3.052234E-02 +1.012580E-01 +3.512005E-03 +8.694033E-02 +3.888202E-03 +4.532457E-01 +1.306139E-01 +5.125240E-01 +1.341966E-01 +2.948195E-01 +5.482499E-02 +3.624902E-02 +7.508096E-04 +5.267973E-03 +2.775154E-05 +2.680717E-02 +4.494477E-04 +3.781548E-02 +1.430011E-03 +6.093125E-02 +3.265771E-03 +6.537957E-03 +3.480947E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1504,8 +1900,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.209998E+00 -1.296913E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1514,8 +1908,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.850185E-01 -1.260300E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1524,8 +1916,24 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -9.631538E-02 -9.276652E-03 +5.052521E-02 +2.552797E-03 +6.366843E-02 +4.053669E-03 +5.584543E-02 +3.118712E-03 +5.260513E-03 +2.767300E-05 +1.561392E-02 +2.437944E-04 +1.060723E-01 +1.125133E-02 +1.260207E-01 +1.588121E-02 +2.123434E-02 +4.508974E-04 +7.247317E-02 +5.252360E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1534,8 +1942,296 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.024256E-01 -9.618585E-02 +0.000000E+00 +0.000000E+00 +1.123486E-01 +1.262220E-02 +1.001916E-01 +1.003836E-02 +1.365382E-01 +1.864269E-02 +5.905816E-02 +3.487866E-03 +3.585125E-03 +1.285312E-05 +0.000000E+00 +0.000000E+00 +2.010958E-01 +2.380672E-02 +2.300029E-01 +4.223133E-02 +3.158008E-02 +9.697567E-04 +3.941864E-02 +1.491640E-03 +1.018795E-01 +5.737457E-03 +7.404522E-01 +2.753307E-01 +3.876823E-01 +7.542264E-02 +3.136245E-01 +6.137180E-02 +2.469068E-01 +4.024613E-02 +3.986846E-01 +9.373937E-02 +3.763834E-01 +7.465653E-02 +4.504989E-01 +1.065055E-01 +3.665060E-01 +7.760850E-02 +2.193902E-01 +2.951258E-02 +4.781216E-02 +2.286003E-03 +2.202397E-01 +4.850551E-02 +1.767166E-01 +3.122875E-02 +4.736785E-02 +2.243713E-03 +7.027373E-02 +4.938397E-03 +0.000000E+00 +0.000000E+00 +1.196671E-02 +1.432021E-04 +1.035600E-01 +1.072467E-02 +3.438061E-02 +1.182026E-03 +0.000000E+00 +0.000000E+00 +1.671151E-01 +1.372626E-02 +3.895971E-01 +7.334028E-02 +3.496464E-01 +5.295532E-02 +3.701678E-01 +6.284342E-02 +1.082802E-01 +5.004071E-03 +1.021035E-01 +5.418111E-03 +3.287526E-01 +6.027052E-02 +7.227837E-01 +2.121855E-01 +3.815141E-01 +6.531564E-02 +6.535246E-02 +1.675612E-03 +2.163211E-01 +1.690100E-02 +5.009361E-01 +1.070866E-01 +7.448207E-01 +1.928387E-01 +3.496441E-01 +5.779330E-02 +1.920319E-01 +1.278333E-02 +1.741641E-01 +1.172464E-02 +6.842020E-01 +1.550861E-01 +6.141334E-01 +1.510617E-01 +4.525725E-01 +6.358762E-02 +2.132168E-01 +2.585479E-02 +1.245358E-01 +9.953467E-03 +2.306883E-01 +2.577748E-02 +4.692996E-01 +1.102387E-01 +4.368682E-01 +1.229075E-01 +1.001881E-01 +1.003766E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.598969E-02 +6.754641E-04 +1.947989E-01 +3.794660E-02 +2.389312E-02 +5.708810E-04 +2.161317E-02 +4.671292E-04 +1.694900E-02 +2.872686E-04 +1.748334E-01 +1.071107E-02 +6.475933E-01 +1.916446E-01 +5.269398E-01 +7.572050E-02 +2.078749E-01 +1.010486E-02 +7.856562E-02 +2.754145E-03 +3.231145E-01 +2.728292E-02 +9.551460E-01 +1.897020E-01 +9.998041E-01 +2.301423E-01 +8.040751E-01 +1.662941E-01 +3.493832E-01 +5.034209E-02 +7.957969E-04 +6.332927E-07 +6.440266E-03 +4.147702E-05 +5.077525E-02 +1.622275E-03 +1.424936E-03 +2.030442E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.610051E-03 +5.005488E-05 +4.838132E-02 +1.174361E-03 +7.867771E-02 +4.497312E-03 +1.155890E-01 +5.286198E-03 +1.371030E-02 +1.295059E-04 +1.108586E-01 +9.612284E-03 +4.826639E-01 +6.792237E-02 +8.138342E-01 +2.277442E-01 +7.166175E-01 +1.728010E-01 +2.805134E-01 +6.615031E-02 +3.994467E-02 +1.225601E-03 +1.952619E-01 +1.970875E-02 +2.998948E-01 +3.021082E-02 +5.099949E-01 +1.027077E-01 +2.921758E-01 +3.570411E-02 +4.147186E-02 +1.719915E-03 +5.058919E-02 +2.559267E-03 +5.015711E-02 +2.515736E-03 +2.693791E-02 +7.256511E-04 +2.147581E-02 +4.612104E-04 +0.000000E+00 +0.000000E+00 +6.387684E-02 +4.080251E-03 +1.094971E-01 +1.198962E-02 +9.427537E-02 +8.887845E-03 +2.923151E-02 +8.544813E-04 +2.624381E-02 +6.887377E-04 +4.355175E-02 +1.896755E-03 +0.000000E+00 +0.000000E+00 +1.421529E-02 +2.020745E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.138850E-01 +1.296980E-02 +1.172963E-01 +1.177552E-02 +2.924843E-02 +8.554706E-04 +8.344730E-02 +6.963452E-03 +1.790908E-02 +3.207351E-04 +2.040429E-01 +1.744156E-02 +1.211707E-01 +5.550660E-03 +1.701424E-01 +2.481600E-02 +1.002444E-01 +5.042870E-03 +2.021413E-02 +2.328403E-04 +6.084830E-02 +2.277218E-03 +1.413276E-01 +8.366252E-03 +4.405590E-01 +7.188019E-02 +1.487591E-01 +1.009388E-02 +6.017484E-02 +1.257458E-03 +3.004237E-01 +2.446519E-02 +5.279204E-01 +1.081350E-01 +8.465321E-01 +2.103958E-01 +1.552158E-01 +1.298814E-02 +0.000000E+00 +0.000000E+00 +2.888777E-02 +8.345031E-04 +2.329054E-02 +5.424494E-04 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1544,8 +2240,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.570476E+00 -8.807549E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1554,14 +2248,82 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.207632E+00 -6.365426E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.081901E-01 +9.386530E-03 +8.332276E-02 +3.925875E-03 +8.296972E-02 +2.891331E-03 +1.032723E-01 +1.066517E-02 +9.772983E-03 +9.551120E-05 +1.219378E-01 +6.969079E-03 +9.915707E-01 +4.393682E-01 +9.272640E-01 +2.840601E-01 +3.397731E-01 +3.599673E-02 +8.532717E-02 +5.629784E-03 +6.002200E-02 +3.602641E-03 +1.818609E-01 +2.816973E-02 +6.101278E-02 +1.779898E-03 +2.443820E-01 +4.179131E-02 +1.093240E-02 +1.195173E-04 +6.876526E-02 +4.728661E-03 +8.316908E-02 +6.917096E-03 +1.081239E-01 +1.169078E-02 +1.278570E-01 +1.634740E-02 +9.675530E-03 +9.361588E-05 +9.856127E-02 +9.450352E-03 +2.776843E-01 +2.251458E-02 +2.729358E-01 +2.241731E-02 +3.224249E-01 +3.902131E-02 +1.914486E-01 +1.415525E-02 +9.185279E-02 +2.506762E-03 +4.830178E-01 +8.863933E-02 +4.101232E-01 +4.592759E-02 +3.403773E-01 +3.821650E-02 +6.239298E-02 +3.080815E-03 +2.334112E-01 +2.816844E-02 +1.739766E-01 +9.302684E-03 +2.487991E-01 +2.194966E-02 +3.181942E-01 +4.445972E-02 +2.217247E-01 +2.828637E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1602,10 +2364,44 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +4.135048E-02 +1.286237E-03 +9.931438E-02 +3.987034E-03 +2.564604E-01 +2.381251E-02 +1.181685E-01 +1.098800E-02 +2.613830E-02 +6.832108E-04 +1.349020E-01 +9.203532E-03 +3.697105E-01 +5.338092E-02 +2.499389E-01 +2.180370E-02 +4.074931E-01 +1.098694E-01 +1.693429E-01 +2.787369E-02 +2.308936E-02 +5.331186E-04 +2.306473E-02 +5.319816E-04 +3.265979E-02 +1.066662E-03 +4.652999E-02 +1.123132E-03 +1.320619E-02 +1.744035E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +3.505900E-03 +1.229134E-05 +9.693909E-03 +9.397187E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1624,28 +2420,86 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.273172E-01 -1.071365E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +6.671218E-03 +4.450515E-05 +1.690165E-02 +2.856656E-04 +4.535546E-02 +2.057118E-03 +2.502937E-02 +6.264694E-04 0.000000E+00 0.000000E+00 +1.407189E-01 +8.385178E-03 +6.553520E-01 +1.368142E-01 +7.364116E-01 +2.092852E-01 +2.883891E-01 +3.909406E-02 +1.093246E-01 +4.852421E-03 +2.293298E-01 +4.898244E-02 +4.270630E-01 +6.379483E-02 +9.527555E-01 +2.965419E-01 +6.135966E-01 +1.129598E-01 +2.074613E-01 +1.387546E-02 +1.218120E-01 +8.320365E-03 +3.540331E-01 +4.277873E-02 +4.247827E-01 +1.151498E-01 +1.813918E-01 +1.241482E-02 +1.844365E-01 +1.258527E-02 +3.413147E-02 +1.164957E-03 +7.037565E-02 +4.952732E-03 +5.331322E-02 +2.842300E-03 +3.452221E-02 +1.191783E-03 +7.549480E-03 +5.699464E-05 0.000000E+00 0.000000E+00 -5.150722E-01 -1.477306E-01 +2.420999E-03 +5.861235E-06 +1.304317E-02 +1.701243E-04 +1.026300E-02 +1.053291E-04 +3.834849E-03 +1.470607E-05 0.000000E+00 0.000000E+00 +1.821153E-02 +3.082330E-04 +4.939295E-02 +2.418298E-03 +6.791796E-02 +2.397124E-03 +2.399913E-02 +3.987283E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -5.365363E-01 -1.545056E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1654,8 +2508,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.634484E+00 -1.006786E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1664,8 +2516,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.963647E+00 -1.921299E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1674,28 +2524,62 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.855612E+00 -3.738770E+00 +2.597861E-02 +4.091941E-04 +2.242527E-01 +2.514564E-02 +5.206791E-01 +1.362375E-01 +4.278034E-01 +1.072683E-01 +9.357104E-02 +5.085882E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.342225E-01 +5.486020E-02 +5.223619E-02 +2.728620E-03 0.000000E+00 0.000000E+00 +1.984032E-02 +1.969113E-04 +2.869380E-01 +4.229853E-02 +3.629156E-01 +7.722199E-02 +2.502239E-01 +4.462235E-02 +8.444045E-02 +5.785634E-03 +1.620300E-02 +2.625372E-04 +6.997979E-02 +4.897171E-03 +3.530199E-01 +1.165189E-01 +1.378799E-01 +1.449576E-02 +1.074160E-02 +1.153821E-04 0.000000E+00 0.000000E+00 -8.949577E-01 -6.996292E-01 +7.188581E-03 +5.167569E-05 +6.117296E-02 +3.742131E-03 0.000000E+00 0.000000E+00 +3.202160E-02 +1.025383E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.933716E-01 -8.606692E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1714,18 +2598,44 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.047296E-01 -9.286014E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +8.967116E-02 +5.487836E-03 +1.829027E-01 +1.387718E-02 +1.993434E-01 +2.068827E-02 +2.310943E-01 +3.674924E-02 +3.608376E-02 +7.095323E-04 +2.648305E-01 +2.560867E-02 +6.774169E-01 +1.235927E-01 +1.037935E+00 +2.855546E-01 +5.833780E-01 +8.095663E-02 +1.891854E-01 +1.421043E-02 +6.099779E-02 +3.720731E-03 +5.099107E-02 +2.600089E-03 +1.065628E-01 +5.688451E-03 +9.118831E-02 +5.498265E-03 +7.642950E-02 +5.841468E-03 0.000000E+00 0.000000E+00 -3.528920E-01 -6.502654E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1784,18 +2694,44 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.143609E-01 -1.307841E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +2.981344E-02 +4.696907E-04 +1.681761E-01 +1.587875E-02 +1.460569E-02 +2.133262E-04 +1.890566E-02 +3.574241E-04 +3.936450E-02 +1.549564E-03 +1.319270E-01 +1.740475E-02 +1.611774E-01 +2.597816E-02 +4.975424E-04 +2.475484E-07 0.000000E+00 0.000000E+00 +1.454593E-02 +2.115842E-04 +1.328306E-02 +1.764397E-04 +2.997538E-03 +8.985237E-06 0.000000E+00 0.000000E+00 -9.259810E-01 -4.281927E-01 +1.281814E-04 +1.643047E-08 +5.988861E-03 +3.586645E-05 +5.614799E-02 +3.152596E-03 +1.644952E-02 +2.705866E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1804,8 +2740,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -2.829227E+00 -2.711068E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1814,8 +2748,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.771012E-02 -5.375002E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1824,8 +2756,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -8.504231E-01 -3.192897E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1834,8 +2764,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.258896E+00 -4.828866E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1844,8 +2772,6 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.744319E+00 -1.102318E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1854,946 +2780,20 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -1.315201E+00 -5.202230E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.383778E+00 -1.064894E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.373598E-01 -1.384092E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.752996E-01 -3.072994E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.414144E-01 -1.165638E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.117217E-01 -1.695148E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.020974E-01 -1.807843E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.790545E+00 -1.606987E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.811463E+00 -1.690787E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.624100E-01 -3.163050E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.499073E-01 -2.247220E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.384807E+00 -6.489982E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.600506E+00 -1.075835E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.003754E+00 -1.473659E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.138289E+00 -1.397348E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.361580E+00 -9.669336E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.832439E-01 -8.022708E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.635807E+00 -6.575567E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.431523E+00 -2.763717E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.943625E-02 -2.266446E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.659683E-01 -3.141838E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.404488E+00 -1.657632E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.337272E+00 -6.818393E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.906319E-01 -3.634051E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.968808E-01 -8.813823E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.401085E-02 -7.057823E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.438771E-01 -6.726955E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.135095E-01 -1.453647E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.117081E-01 -2.474125E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.890267E+00 -9.971621E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.217831E-02 -2.722576E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.875279E-01 -7.222991E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.465873E+00 -1.684795E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.582101E-01 -2.308163E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.975907E-01 -1.580784E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.163055E+00 -4.040199E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.387764E+00 -4.357290E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.196106E+00 -5.866078E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.414320E-01 -1.354077E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.331388E+00 -7.999297E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.385501E-01 -1.119957E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.319981E-02 -1.742350E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.395770E-02 -8.828049E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.930196E+00 -1.056890E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.430206E+00 -1.555413E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.266456E+00 -6.181299E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.998920E-01 -3.995682E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.956201E-02 -4.777812E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.595216E-01 -1.454967E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.292285E+00 -8.702623E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.864587E-01 -8.205860E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.004358E+00 -5.599700E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.878242E-01 -3.111548E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.003831E-01 -1.007678E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.390952E-01 -2.937091E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.752746E+00 -1.853071E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.861695E-01 -8.327886E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.125953E-01 -2.392175E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.518722E-01 -1.238140E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.082653E-02 -9.502751E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.871455E-02 -6.195980E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.032079E-01 -9.193502E-02 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +5.309090E-02 +2.818643E-03 +1.002246E-01 +1.004498E-02 +1.453451E-01 +2.112519E-02 +4.547262E-03 +2.067759E-05 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_polar/tallies.xml b/tests/test_filter_polar/tallies.xml index 5e9ed87931..0dfa24f272 100644 --- a/tests/test_filter_polar/tallies.xml +++ b/tests/test_filter_polar/tallies.xml @@ -2,7 +2,7 @@ - rectangular + regular -182.07 -182.07 182.07 182.07 17 17 diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index bb151ae0e8..6c1f627325 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -37,73 +37,73 @@ tally 1: 5.986137E+03 2.247257E+01 1.683779E+02 --1.512960E-01 +1.512960E-01 2.623972E-02 -3.775020E-01 1.055377E-01 --1.916133E-01 +1.916133E-01 4.680798E-02 2.754367E-02 3.320008E-04 --2.028374E-02 +2.028374E-02 1.319357E-02 8.974271E-03 1.681081E-03 --1.658978E-01 +1.658978E-01 1.520448E-02 2.878360E-01 5.645480E-02 1.014000E+01 3.427342E+01 --4.798897E-02 +4.798897E-02 1.551226E-03 -1.818770E-01 1.492633E-02 --6.340651E-02 +6.340651E-02 9.011305E-03 3.395308E-02 4.612818E-04 --2.640250E-02 +2.640250E-02 6.434787E-04 -8.242639E-03 9.516540E-04 --8.378601E-02 +8.378601E-02 2.645988E-03 9.567484E-02 7.262477E-03 8.628000E+00 2.481430E+01 --4.712248E-02 +4.712248E-02 1.140942E-03 -6.431930E-02 4.290580E-03 --9.251642E-02 +9.251642E-02 8.134201E-03 1.020119E-04 1.154184E-04 --2.994164E-02 +2.994164E-02 3.079076E-04 2.128844E-02 2.046549E-04 -1.637972E-02 +-1.637972E-02 1.459209E-04 4.629047E-02 7.823267E-04 8.632000E+00 2.483728E+01 --4.651997E-02 +4.651997E-02 1.133839E-03 -6.416955E-02 4.279418E-03 --9.280565E-02 +9.280565E-02 8.095106E-03 -2.078094E-04 1.151292E-04 --3.005568E-02 +3.005568E-02 3.104764E-04 2.199519E-02 2.179172E-04 -1.660645E-02 +-1.660645E-02 1.451345E-04 4.607553E-02 7.673412E-04 From eb96e9dbdc350e62eb87e7be9c65ae976c5e9a5c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 13:00:51 -0400 Subject: [PATCH 273/519] Updated Python API MultiGroupXS.load_from_statepoint(...) to properly handle tally slicing of distribcell tallies --- .../examples/multi-group-cross-sections.ipynb | 589 +----------------- .../examples/multi-group-cross-sections.rst | 11 + docs/source/pythonapi/index.rst | 1 + openmc/mgxs/mgxs.py | 14 +- openmc/tallies.py | 3 +- 5 files changed, 50 insertions(+), 568 deletions(-) create mode 100644 docs/source/pythonapi/examples/multi-group-cross-sections.rst diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 14392ec971..e7820bca85 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -452,7 +452,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 12:30:47\n", + " Date/Time: 2015-10-03 12:56:30\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -537,20 +537,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.8800E-01 seconds\n", - " Reading cross sections = 8.8000E-02 seconds\n", - " Total time in simulation = 1.4079E+01 seconds\n", - " Time in transport only = 1.4061E+01 seconds\n", - " Time in inactive batches = 2.0330E+00 seconds\n", - " Time in active batches = 1.2046E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 6.4800E-01 seconds\n", + " Reading cross sections = 1.5500E-01 seconds\n", + " Total time in simulation = 1.6951E+01 seconds\n", + " Time in transport only = 1.6927E+01 seconds\n", + " Time in inactive batches = 3.1560E+00 seconds\n", + " Time in active batches = 1.3795E+01 seconds\n", + " Time synchronizing fission bank = 7.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 1.4478E+01 seconds\n", - " Calculation Rate (inactive) = 12297.1 neutrons/second\n", - " Calculation Rate (active) = 8301.51 neutrons/second\n", + " Total time elapsed = 1.7614E+01 seconds\n", + " Calculation Rate (inactive) = 7921.42 neutrons/second\n", + " Calculation Rate (active) = 7249.00 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1492,137 +1492,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stdout", - "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", - " Copyright: 2011-2015 Massachusetts Institute of Technology\n", - " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.7.0\n", - " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 12:31:02\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading tallies XML file...\n", - " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.23064 \n", - " 2/1 1.18217 \n", - " 3/1 1.20248 \n", - " 4/1 1.20841 \n", - " 5/1 1.25078 \n", - " 6/1 1.26156 \n", - " 7/1 1.18239 \n", - " 8/1 1.24391 \n", - " 9/1 1.22294 \n", - " 10/1 1.20654 \n", - " 11/1 1.24695 \n", - " 12/1 1.26717 1.25706 +/- 0.01011\n", - " 13/1 1.26830 1.26080 +/- 0.00693\n", - " 14/1 1.25206 1.25862 +/- 0.00537\n", - " 15/1 1.23449 1.25379 +/- 0.00637\n", - " 16/1 1.13532 1.23405 +/- 0.02042\n", - " 17/1 1.25230 1.23666 +/- 0.01745\n", - " 18/1 1.17655 1.22914 +/- 0.01688\n", - " 19/1 1.26829 1.23349 +/- 0.01551\n", - " 20/1 1.26274 1.23642 +/- 0.01418\n", - " 21/1 1.19211 1.23239 +/- 0.01344\n", - " 22/1 1.23183 1.23234 +/- 0.01227\n", - " 23/1 1.22292 1.23162 +/- 0.01131\n", - " 24/1 1.21154 1.23018 +/- 0.01057\n", - " 25/1 1.21882 1.22943 +/- 0.00987\n", - " 26/1 1.22321 1.22904 +/- 0.00924\n", - " 27/1 1.20043 1.22736 +/- 0.00884\n", - " 28/1 1.20998 1.22639 +/- 0.00839\n", - " 29/1 1.26327 1.22833 +/- 0.00817\n", - " 30/1 1.26615 1.23022 +/- 0.00798\n", - " 31/1 1.21810 1.22964 +/- 0.00761\n", - " 32/1 1.23946 1.23009 +/- 0.00727\n", - " 33/1 1.25718 1.23127 +/- 0.00705\n", - " 34/1 1.21614 1.23064 +/- 0.00678\n", - " 35/1 1.23962 1.23100 +/- 0.00651\n", - " 36/1 1.24640 1.23159 +/- 0.00628\n", - " 37/1 1.24546 1.23210 +/- 0.00607\n", - " 38/1 1.21329 1.23143 +/- 0.00588\n", - " 39/1 1.24137 1.23177 +/- 0.00569\n", - " 40/1 1.27335 1.23316 +/- 0.00567\n", - " 41/1 1.24768 1.23363 +/- 0.00550\n", - " 42/1 1.19014 1.23227 +/- 0.00550\n", - " 43/1 1.24273 1.23259 +/- 0.00534\n", - " 44/1 1.20201 1.23169 +/- 0.00526\n", - " 45/1 1.24084 1.23195 +/- 0.00511\n", - " 46/1 1.25992 1.23273 +/- 0.00503\n", - " 47/1 1.19931 1.23182 +/- 0.00497\n", - " 48/1 1.24106 1.23207 +/- 0.00484\n", - " 49/1 1.28278 1.23337 +/- 0.00489\n", - " 50/1 1.26711 1.23421 +/- 0.00484\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 4.1100E-01 seconds\n", - " Reading cross sections = 1.1100E-01 seconds\n", - " Total time in simulation = 3.4700E+01 seconds\n", - " Time in transport only = 3.4683E+01 seconds\n", - " Time in inactive batches = 3.7780E+00 seconds\n", - " Time in active batches = 3.0922E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 9.0000E-03 seconds\n", - " Total time elapsed = 3.5131E+01 seconds\n", - " Calculation Rate (inactive) = 6617.26 neutrons/second\n", - " Calculation Rate (active) = 3233.94 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.23174 +/- 0.00461\n", - " k-effective (Track-length) = 1.23421 +/- 0.00484\n", - " k-effective (Absorption) = 1.23034 +/- 0.00239\n", - " Combined k-effective = 1.23109 +/- 0.00215\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, { "data": { "text/plain": [ @@ -1638,9 +1507,9 @@ "# Delete old HDF5 files\n", "!rm *.h5\n", "\n", - "# Run OpenMC!\n", + "# Run OpenMC with the output throttled!\n", "executor = openmc.Executor()\n", - "executor.run_simulation()" + "executor.run_simulation(output=False)" ] }, { @@ -1999,7 +1868,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAADDCAYAAACxgLv/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFw5JREFUeJzt3XmYVNWZx/Fvs4mCgopxZWgSF3BcUBF3u6PG4EpmBo0a\nRyXqGJfRiXs0hiY6UTPGPY6ORsSVJIiOuzFqoyaCIosg6rjQCgooILiAitLzx3vKqq6u5VTVuVWn\n29/neerpru2tc6ve+95zz71VB0REREREREREREREREREREREREREquK/gV/WuhEBdJblkOTsBbxW\n60YE0FmWo40WYN+s244Dni3wnG2Ax4EPgdUerzECmAEsd895EqgvrZntNAF3ZN3WDBxfYdyk1GPv\n1bSs2/sBXwJzPeMcR+HP5tvuOGAW8BmwALgB6FPkOYcDf3fPeTrH/V2BS4D3gI+xzzBfzM2Ae7E8\nX+bacmwpC5BDPZY7XTJuO46486AZa/N2Wbff527f2zPOauC74ZpVui7FH5KIVncpxZfAePyK4ObA\nOODnWDIPBH4PfF3ia/oodTmyVeMzWBP4x4zrRwFvU3nbM9Uql2rtLOAy93cdYFdgAPAE0L3A85YA\nV7rn5jLGxdrVxT0a+DzPY+8A3gH+AVgP+FdgUSkLUUBdoDgA3QLGyqUVeB04JuO29YHdgA9KjFVo\nuZNejpqZC+yTddux+G2NN6d4j3kkML3A/V2AC4A3sd7IVGBTd981wLtYT3sqsKe7fTjwBbaB+ATr\njV8CfAWsdLdd6x47CFsxl2C7O4dlvPZt2C7/I8Cn2J7DbcDF7v5GYD5wJrZyvY/1VFLWBx507XvB\ntSHf+1aPvVcXAL/NuP1Fd1tmj/n8jPfjFeBH7vbBbvm+csu41HM5zgMmYz0/gJOB2UCPPG3tiNbB\n3pORWbf3wgrBKI8YJ9C+x7yuizvQsx2f0L6XmGlPrHf+EZbbqd70Qdh6stzdPjrjOe9iufMJlhO7\nYhuG7DxYA7gC2zAsxHKip7uvEcvlc7E9iXHutnkZr9OCbdRmYr398S5myrnYOjAfe68K9WafBi5y\n8VOF9TRsD2Ye6R7zMOB59368D1xHeiP6jHuNT91yHuaxHN/D1vUd3PVNsL0X3x56NOZS+lBGik9h\nHogVkyuxN7B31v3nAC8DW7jr22I9DYCfYCtGF6w4LiBdTEYDt2fFehr4acb1XtgHdqyLMQT7kAa7\n+2/DEnA3d30NYCzwa3e9EViFDZt0BQ7AdndTu7Hjgbux5B+MrUDP5HwX0oV5gHtcHbA18Cr2/mcW\n5pHARu7/w7HE3NBdz7XRLLYcdcAk7D3bAluRt8/Tzo5qOPZZ5dpbuA37nIrJVZj3xopGqhC8DpxS\nIMYTwHPAj7Fec6YBWGH9MZZP65H+HBpI70ltixXWERnPyx7KyJUHVwH3A32x9ewB4Dfuvkbs/bkU\nK3w9aV+Y52Ib8I2w9W4OcJK7bzi2/IOxvb47sb3eQoX5eGzIc7i7bQq2UckszDtixbmLW845wBkZ\ncbKLv89ynIB1aNZ0r5/ZESpZrXY/67AP86OMy+8Jt2s9F3vjNgX+hBXGsVjRBPvwLgTecNdnke4B\n3OXasxor7GsAW2W0O9cuTuZtB7vXH+dizAAm0rbXfD+2xQbrhWfHWIUVuK+BR7EiuRW2Yv0zVuw+\nxwrsuDxtyjQfW7l/gO3mZW9cACZgKybYe/YGsEuOtqW0FlmOVvdapwP/C1yO9Yo6k37AYnJ3FBa6\n+8uxGbYh3gLbuI7ENtT75Xn8YVjBvAgbopoODHX3HYUV7j9i+bSU9OcwCSsmYOvAeKxYQ/E8T10/\nEevALMPy9FLgiIzHrMbydRX5h2Kuxd6vj7C9wSHu9sOBW7E8X+ni+Ayt3I7l3iBsgzE56/5p2N7m\naqyn/z+klzufYstxC7bH+QLWobnQo5151XKMeQS2hUxdTiH9pv8E2434BHi4zNeYgvUSvoMdQd2b\n9JvVH3grz/POxragy7BE6UPxFSxzgzIAK2iZG52jSPc+W2m7pc1lCW1X9hVYb2QDbHwr8/nzi8RK\nvebt2K71EdiYZHaCH4Ot0Kk2b4MNmxRSbDnewQ7IDMA2vJ3NYiw3cq1HG2MdAoAbSefz+R5xV7q/\nv8Y2eKmieWCexy8DfoF9ZhtinYH73X39sWKdyy5YL/MDF+Mkin/mmTYA1gJeIp03j9J2ffkQG/4r\nZGHG/ytJd6A2prxcn4gNlZ5K7k7IlsBDWG98OfCfFF9un+W4BdsDuQ4r4GWL6YBNZqG4C1jbXQ4K\nEHsqdmQ2tds2DxsSybYXNsxxGLalXRf74DJ7gdmyb3sX64lkbnTWxpKkEJ+9hQ+xMb7+Gbf1z/PY\nbBOxFfst2if4AKzXcCq2q7suNh5caLl9HITtRj6JjUN2Ns9jhfNfsm7vje1KP+mu/4x0Pmcf7Mv1\n3r6c5/V8PoclwO+wcc71sHz8Xp7H3o0V8M2wfL+RdE3wyfXFWCHdmnSu98XG3ktpcz4LKC/XV2Ib\niJ/R/iwqsHHwOVgN6IN12IrVwmLL0Ru4GivOY7D3omwxFWYfPUmP965B24MEmfbAxnw2cNcHAYeQ\n3qW5BTtItTlWfLbDkrg3VvgWu9f5FW2TbCG2a5m5EVlE28R/CNsiH42NR3UHdnZtgPy7iD67aF9j\nBbYJG8sahB2B90n+z4DvY+9Ltl4uxmIsJ0Zhva+URdjKm3mWQbFd3X7Azdiw0XHY+3+ARzs7kuXY\nSngd8EPs/anHhoLmkbsopHTB8rm7+38N0u/vW9jQxIVYHg7G9v4eyhPrcqzT0Q0r/idjQ1FLseK7\nH9bZ6Ib1DFNjzL2xXu6X2JjrUaRzKXVaamZuL6RtHqzGPuOrSa9rmwL7F1huH6k8+hOWi4OwnvlF\nJcS4ABueeDfHfb2xvZcVLvbJWfdnr9M+rsGGMf4N28u/scTntxFTYS52Cl099kbOdo9biY095bIM\nOBTbBfwE23pOJD0gfyX2of8FW7luxlaSx4HHgP/DjhavpO0H+2f3dwnWCwf7QEZiK8HV2Djb/tiQ\nwXvYVv9S0huUXMuZfVuh9+E0bCu/EBtfvofCu1iZsabR9oBf6r45WC/reRd3G+xgUsqT2FjkQtKn\nHRVbjpuw3thj2HtzPLZBrKgnEaH/worAFVguTcaGcPal8O7sMVg+34Dtqa3E3rOUI7E9mSVYQf4l\nuc93BttI34cV2bewnuWh7r53sT2ls1ys6aTP4DgFGy75GCt6f8yIuQLbxf+bizsMeIr2eXAeNrY6\n2S3/E1jHJMWn5519X+r+x7Dx56exdTL7eEYhC7AzUXI5G9sIfYztKY7PalMTtm59hK3b+WpT6rYR\n2DqfKvBnYgcYj/Rop3RSl2MHNkU6u8HYHm1MHUoRwM7O2A7b3RuG7XIeWvAZIh3XP2HDPOtip+JN\nrG1zRHIbio0ffoYdbT+vts0RSdSj2NDkEuxr5xsWfriIiIiIiEhxOzakjljqoksyl+0bWqmBPg3b\n1H7ZdenElwGt5BHil6NamZo3ftpNTXBSU8GHDNjJ7+dNlzVdT9+m0wo+5p1Jgwre/42xTTCqcLu8\nKVYysRrrIOyvnPlq3af1waIPervpbr7bdFTBxzxVt1XB+9Ouxb7FXshdnrGasV8mCEGxwscaA3ny\nWqediIhERoVZRCQy1SvMOzUGC9WzcViwWAxpVKzOEKuG1m3cNmC0XYo/xFu9YnXQWD7jdsOxrxp3\nxb5Se3nW/X5jzB58x5h9eI8xS/ySG2Mumts+Y8w+/MeYffiOMUvcyh9j7gpcjyXw1th3vwcXfIZI\nx6DclmgVK8zDsB8oacF+kGU86RkORDoy5bZEq1hh3pT2P1S9aZ7HinQkym2JVrHZXv0Gj29qSv+/\nUyMMbSyzOSLA9GaY0Zz0q3jl9ttN6Wn71m3cNvCBPvl2aXGX4ooV5vdoP4NA++ldinxxRKQkOzTa\nJWXcmCRexSu3i31xRMRfPW3P1piU95HFhjKmkp4Qsgc2i8IDlTRNJBLKbYlWsR7zV9iMGY9jR7H/\nQP5ZQ0Q6EuW2RKtYYQb7PdRHk26ISA0otyVK+kq2iEhkVJhFRCKjwiwiEhkVZhGRyPgc/Cvu0yBR\nWJtPwgQCdmt4KlgsgOcn7RM0nnQMT9VNDRJnNIcEiQMwht8FiwUfB4wloajHLCISGRVmEZHIqDCL\niERGhVlEJDIqzCIikfEpzLcCi4BZCbdFpNqU2xIln8I8Fpt+R6SzUW5LlHwK87PAR0k3RKQGlNsS\nJY0xi4hEJsw3/8Y2pf8f0th29gmRUlVnailPzRn/19N2BgqRUrQQamopP6OagoQRAao1tZSnxhq+\ntnQu9YSaWkpERKrMpzDfA/wd2BKb7n1Uoi0SqR7ltkTJZyjjyMRbIVIbym2JkoYyREQio8IsIhIZ\nFWYRkcioMIuIRCbMecyBzJ60c7BYFzecHSwWwBcNPYLFmjZlz2Cx+CpcqKCxpI0xjA4WazRnBYul\naaripB6ziEhkVJhFRCKjwiwiEhkVZhGRyKgwi4hExqcw9weeBl4BZgOnJ9oikepRbkuUfE6XWwX8\nHJgB9AZeAp4AXk2wXSLVoNyWKPn0mBdiiQvwKZa0myTWIpHqUW5LlEodY64HdgCmhG+KSE3Vo9yW\nSJTyzb/ewATgDKx3kaappSSk6k8tlT+3NbWUBNNC6KmlugP3AncC97e7V1NLSUjVnVqqcG5raikJ\npp6QU0vVAX8A5gBXV9AqkdgotyVKPoV5D+Bo4PvAdHcZnmSjRKpEuS1R8hnKeA59EUU6J+W2RElJ\nKSISGRVmEZHIqDCLiERGhVlEJDJ1AWK00twaIEzkAp5Mdf99PwwW6zdcECzWm19vHiwWwNL53wkT\nqL4HhMnVUrUScEqoGE0l3DniQ5kaLJZ5MHC82IyBPHmtHrOISGRUmEVEIqPCLCISGRVmEZHIqDCL\niETGpzD3xH6jdgb2Yy+XJtoikepQXku0fH4r43PsR15WuMc/B+zp/op0VMpriZbvUMYK97cH0BVY\nmkxzRKpKeS1R8i3MXbBdvkXYrMJzEmuRSPUoryVKvjOYrAaGAH2Ax7FpHZq/uVdTS0lIz0+Cyfln\ndwiocF4DmlpKwmkh9NRSKcuBh4GhZGasppaSkHZrsEvKNZck/Yq58xrQ1FISTj0hp5bqB/R1/68J\n/ACb6UGkI1NeS7R8eswbA+OwIt4FuAN4MslGiVSB8lqi5VOYZwE7Jt0QkSpTXku09M0/EZHIqDCL\niERGhVlEJDIqzCIikVFhFhGJTKlfMPn2+o9woX5Ut1uwWKuXNAaLddl6ARcSeGTAgUHi6FeFkjOU\ny4LFam0YGiwWQN07AecSbWkKF6sK1GMWEYmMCrOISGRUmEVEIqPCLCISGd/C3BX7gZcHE2yLSC0o\ntyU6voX5DOxHxAMeJhWJgnJbouNTmDcDDgRuAeqSbY5IVSm3JUo+hfkq4BxstgeRzkS5LVEq9gWT\ng4EPsDG4xryP0tRSEtCy5pksb56Z9Mv45bamlpJgWgg1tdTuwKHY7l5PYB3gduCYNo/S1FISUN/G\n7enbuP031+eNuTOJl/HLbU0tJcHUE2pqqQuA/sBA4AjgKdolrkiHpNyWaJV6HrOOXEtnpdyWaJTy\nI0aTKNT3Fum4lNsSFX3zT0QkMirMIiKRUWEWEYmMCrOISGRUmEVEIqOppWphalOwUF3WXy9YrNab\nzwgWC6D+hLlB4mhqqSStDBapbtINwWIBtJ4V7udL6r4IeDbk9U3hYuWhHrOISGRUmEVEIqPCLCIS\nGRVmEZHI+B78awE+Br4GVgHDkmqQSBW1oLyWCPkW5lbs9w+XJtcUkapTXkuUShnK0NQ70hkpryU6\nvoW5FfgrMBU4MbnmiFSV8lqi5DuUsQewANgAeAJ4DXj2m3s1tZQENKd5MXOaF1fjpQrnNaCppSSc\nFkJNLZWywP39ELgPO0iSTmBNLSUBbd3Yj60b+31zfeKY15N6qcJ5DWhqKQmnnlBTSwGsBazt/u8F\n7A/MKq9hItFQXku0fHrMG2K9idTj7wL+kliLRKpDeS3R8inMc4EhSTdEpMqU1xItffNPRCQyKswi\nIpFRYRYRiYwKs4hIZFSYRUQiE+J3AlppDjhti5Sk55Bwv7/z+RXhpqkCaJ0Q5mco6l6zP0GClaYV\nRtfgZcXsGCxS67kjgsWqmxOo3j1UB3nyWj1mEZHIqDCLiERGhVlEJDIqzCIikfEpzH2BCcCrwBxg\n10RbJFI9ym2Jks9vZVwDPAKMdI/vlWiLRKpHuS1RKlaY+wB7Ace6618ByxNtkUh1KLclWsWGMgZi\nPyI+FpgG3Iz9jq1IR6fclmgV6zF3w87yPg14EbgaOB/4VZtHaWopCaj5M2hekfjL+OW2ppaSUBY3\nw5Jmr4cWK8zz3eVFd30ClrxtaWopCaixl11SxixJ5GX8cltTS0ko/RrtkvLGmLwPLTaUsRCYB2zp\nru8HvFJJ20QiodyWaPmclfHv2LQ7PYC3gFGJtkikepTbEiWfwjwT2DnphojUgHJboqRv/omIREaF\nWUQkMirMIiKRUWEWEYmMCrOISGR8zsqQiH3+WrjpoJ68ePdgsQCaLgkaTr51pgWLVPfbL4PFmhBo\nlrORBe5Tj1lEJDIqzCIikVFhFhGJjAqziEhkfArzVsD0jMty4PQkGyVSBcpriZbPWRmvAzu4/7sA\n7wH3JdYikepQXku0Sh3K2A/7Fa55CbRFpFaU1xKVUgvzEcDdSTREpIaU1xKVUr5g0gM4BDiv3T2a\nWkoCanGXKsmf14CmlpJQZuM/E0MphfkA4CVsAsu2NLWUBFRP2/I3KdmXy5/XgKaWklC2cZeUPxd4\nbClDGUcC95TVIpF4Ka8lOr6FuRd2gGRigm0RqTbltUTJdyjjM6Bfkg0RqQHltURJ3/wTEYlM9Qrz\n9GbFqlWsl8LFmtG8PFislmCRaq1FsTpFrHCHmWdX+PzqFeYZzYpVq1jTwsWa2fxxsFgtwSLVWoti\ndYpY4Qqz72lx+WgoQ0QkMirMIiKRCTFHSjPQECCOSD6TqM03PZpRbktyapXXIiIiIiIiIiId0XDg\nNeAN8v6Kl5dbgUXArABt6g88jZ3ZMpvKZq/oCUwBZgBzgEsrbFtXbFaNByuMA3Y+0csu3gsVxuoL\nTABexZZz1zLjdJbZQ5TXpQuV2y0oryvSFXgT+8Gw7tiHPLjMWHths06ESOCNgCHu/97YjBbltgtg\nLfe3GzAZ2LOCWGcCdwEPVBAjZS6wXoA4AOOAn7r/uwF9AsTsAizACkpHorwuT6jc7tR5XY3T5YZh\nCdwCrALGAyPKjPUs8FGYZrEQW5kAPsW2lptUEG+F+9sDW2mXlhlnM+BA4BbCnDVDoDh9sAJyq7v+\nFdYjqFRHnT1EeV260LndafO6GoV5U9o2br67LSb1WI9lSgUxumArxCJsV3JOmXGuAs4BVlfQlkyt\nwF+BqcCJFcQZiP1m8VhgGnAz6d5UJTrq7CHK69KFzO1OndfVKMytVXiNSvTGxpfOwHoY5VqN7UJu\nBuxNeecnHgx8gI1Pheot74GtnAcAp2K9g3J0A3YEbnB/PwPOr7BtqdlDCv1meKyU16UJndudOq+r\nUZjfo+04S3+sdxGD7sC9wJ3A/YFiLgceBoaW8dzdgUOx8bN7gH2A2ytszwL390NsFuhhZcaZ7y4v\nuusTsESuRJHZQ6KmvC5N6NxWXleoGzbWUo9tSSo5SIKLE+IgSR2WGFcFiNUPO7ILsCbwDLBvhTEb\nqPzI9VrA2u7/XsDfgP0riPcMsKX7vwm4vIJYYOOyx1YYo1aU1+WrNLeV14EcgB0dfhP4RQVx7gHe\nB77AxvdGVRBrT2w3bQbp01uGlxlrW2x8agZ2Cs85FbQrpYHKj1wPxNo0Azt1qpL3HmB7rGcxE5v1\no5Kj172AxaRXsI5IeV2eSnNbeS0iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiKd2/8DY4XfFd+LX2AA\nAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2274,181 +2143,11 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.574798\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.680220\tres = 4.252E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.661620\tres = 1.834E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.660063\tres = 2.734E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.644413\tres = 2.354E-03\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.627431\tres = 2.371E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.608477\tres = 2.635E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.589425\tres = 3.021E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.571080\tres = 3.131E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.553841\tres = 3.112E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.538232\tres = 3.019E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.524518\tres = 2.818E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.512887\tres = 2.548E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.503407\tres = 2.218E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.496149\tres = 1.848E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.491110\tres = 1.442E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.488262\tres = 1.016E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.487559\tres = 5.798E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.488929\tres = 1.441E-03\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.492277\tres = 2.810E-03\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.497495\tres = 6.848E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.504468\tres = 1.060E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.513071\tres = 1.402E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.523171\tres = 1.705E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.534637\tres = 1.969E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.547332\tres = 2.192E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.561124\tres = 2.375E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.575881\tres = 2.520E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.591472\tres = 2.630E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.607776\tres = 2.707E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.624672\tres = 2.756E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.642047\tres = 2.780E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.659796\tres = 2.781E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.677818\tres = 2.764E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.696019\tres = 2.731E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.714314\tres = 2.685E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.732625\tres = 2.629E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.750879\tres = 2.563E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.769011\tres = 2.492E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.786963\tres = 2.415E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.804681\tres = 2.334E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.822119\tres = 2.251E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.839238\tres = 2.167E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.856002\tres = 2.082E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.872382\tres = 1.997E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.888351\tres = 1.913E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.903889\tres = 1.831E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.918979\tres = 1.749E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.933609\tres = 1.669E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.947768\tres = 1.592E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.961451\tres = 1.517E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.974653\tres = 1.444E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.987374\tres = 1.373E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.999614\tres = 1.305E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.011376\tres = 1.240E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.022667\tres = 1.177E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.033492\tres = 1.116E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.043858\tres = 1.058E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.053776\tres = 1.003E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.063254\tres = 9.501E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.072304\tres = 8.994E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.080937\tres = 8.512E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.089165\tres = 8.051E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.097001\tres = 7.612E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.104457\tres = 7.194E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.111546\tres = 6.797E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.118282\tres = 6.419E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.124677\tres = 6.060E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.130743\tres = 5.719E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.136495\tres = 5.394E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.141946\tres = 5.087E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.147109\tres = 4.796E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.151994\tres = 4.520E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.156615\tres = 4.259E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.160984\tres = 4.011E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.165111\tres = 3.777E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.169010\tres = 3.555E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.172690\tres = 3.346E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.176162\tres = 3.148E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.179436\tres = 2.960E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.182522\tres = 2.784E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.185431\tres = 2.617E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.188170\tres = 2.460E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.190750\tres = 2.311E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.193177\tres = 2.171E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.195460\tres = 2.039E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.197609\tres = 1.914E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.199628\tres = 1.797E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.201525\tres = 1.685E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.203309\tres = 1.582E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.204983\tres = 1.484E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.206555\tres = 1.391E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.208032\tres = 1.305E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.209416\tres = 1.224E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.210716\tres = 1.146E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.211934\tres = 1.075E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.213078\tres = 1.006E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.214149\tres = 9.432E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.215152\tres = 8.828E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.216093\tres = 8.267E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.216974\tres = 7.742E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.217799\tres = 7.244E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.218572\tres = 6.782E-04\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.219295\tres = 6.344E-04\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.219972\tres = 5.932E-04\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.220605\tres = 5.554E-04\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.221198\tres = 5.190E-04\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.221753\tres = 4.854E-04\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.222271\tres = 4.540E-04\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.222756\tres = 4.243E-04\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.223210\tres = 3.967E-04\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.223633\tres = 3.709E-04\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.224029\tres = 3.461E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.224399\tres = 3.238E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.224746\tres = 3.022E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.225068\tres = 2.827E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.225369\tres = 2.633E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.225651\tres = 2.460E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.225914\tres = 2.299E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.226160\tres = 2.147E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.226390\tres = 2.007E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.226604\tres = 1.871E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.226803\tres = 1.741E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.226990\tres = 1.628E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.227164\tres = 1.522E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.227326\tres = 1.414E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.227478\tres = 1.322E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.227619\tres = 1.233E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.227751\tres = 1.150E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.227874\tres = 1.077E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.227988\tres = 1.001E-04\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.228095\tres = 9.273E-05\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.228195\tres = 8.720E-05\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.228288\tres = 8.102E-05\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.228374\tres = 7.574E-05\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.228455\tres = 7.035E-05\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.228530\tres = 6.542E-05\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.228601\tres = 6.126E-05\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.228666\tres = 5.717E-05\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.228727\tres = 5.295E-05\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.228783\tres = 4.953E-05\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.228835\tres = 4.580E-05\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.228885\tres = 4.264E-05\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.228931\tres = 3.986E-05\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.228973\tres = 3.729E-05\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.229013\tres = 3.467E-05\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.229051\tres = 3.219E-05\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.229085\tres = 3.040E-05\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.229118\tres = 2.835E-05\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.229147\tres = 2.611E-05\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.229174\tres = 2.401E-05\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.229201\tres = 2.208E-05\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.229225\tres = 2.135E-05\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.229247\tres = 1.992E-05\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.229268\tres = 1.797E-05\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.229288\tres = 1.687E-05\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.229306\tres = 1.559E-05\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.229322\tres = 1.474E-05\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.229338\tres = 1.351E-05\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.229352\tres = 1.242E-05\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.229366\tres = 1.182E-05\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.229378\tres = 1.086E-05\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.229390\tres = 1.005E-05\n" - ] - } - ], + "outputs": [], "source": [ + "# Throttle OpenMOC output to screen\n", + "openmoc.log.set_log_level('WARNING')\n", + "\n", "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", @@ -2503,7 +2202,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2544,251 +2243,11 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 52, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Importing ray tracing data from file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.496342\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.558070\tres = 5.037E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.519062\tres = 1.244E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.510118\tres = 6.990E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.497533\tres = 1.723E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.489754\tres = 2.467E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.484192\tres = 1.564E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.481187\tres = 1.136E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.480359\tres = 6.206E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.481504\tres = 1.721E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.484422\tres = 2.384E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.488925\tres = 6.059E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.494842\tres = 9.295E-03\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.502013\tres = 1.210E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.510294\tres = 1.449E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.519552\tres = 1.650E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.529662\tres = 1.814E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.540514\tres = 1.946E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.552005\tres = 2.049E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.564041\tres = 2.126E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.576537\tres = 2.180E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.589414\tres = 2.215E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.602601\tres = 2.233E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.616034\tres = 2.237E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.629654\tres = 2.229E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.643407\tres = 2.211E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.657246\tres = 2.184E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.671127\tres = 2.151E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.685011\tres = 2.112E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.698862\tres = 2.069E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.712650\tres = 2.022E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.726345\tres = 1.973E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.739923\tres = 1.922E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.753361\tres = 1.869E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.766641\tres = 1.816E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.779744\tres = 1.763E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.792655\tres = 1.709E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.805362\tres = 1.656E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.817853\tres = 1.603E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.830119\tres = 1.551E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.842152\tres = 1.500E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.853945\tres = 1.450E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.865493\tres = 1.400E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.876791\tres = 1.352E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.887837\tres = 1.305E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.898630\tres = 1.260E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.909165\tres = 1.216E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.919445\tres = 1.172E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.929468\tres = 1.131E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.939236\tres = 1.090E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.948749\tres = 1.051E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.958010\tres = 1.013E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.967022\tres = 9.762E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.975787\tres = 9.406E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.984307\tres = 9.064E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.992586\tres = 8.731E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.000628\tres = 8.411E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.008438\tres = 8.102E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.016018\tres = 7.805E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.023372\tres = 7.517E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.030506\tres = 7.237E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.037423\tres = 6.971E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.044129\tres = 6.712E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.050628\tres = 6.464E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.056924\tres = 6.224E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.063023\tres = 5.993E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.068929\tres = 5.771E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.074647\tres = 5.555E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.080180\tres = 5.349E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.085536\tres = 5.149E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.090717\tres = 4.958E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.095728\tres = 4.773E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.100575\tres = 4.595E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.105261\tres = 4.424E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.109791\tres = 4.257E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.114171\tres = 4.099E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.118403\tres = 3.946E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.122493\tres = 3.799E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.126443\tres = 3.656E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.130259\tres = 3.519E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.133946\tres = 3.388E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.137505\tres = 3.262E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.140942\tres = 3.139E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.144260\tres = 3.021E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.147464\tres = 2.908E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.150556\tres = 2.799E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.153540\tres = 2.695E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.156419\tres = 2.593E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.159198\tres = 2.496E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.161878\tres = 2.403E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.164464\tres = 2.312E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.166959\tres = 2.225E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.169365\tres = 2.143E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.171685\tres = 2.061E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.173922\tres = 1.984E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.176080\tres = 1.910E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.178160\tres = 1.838E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.180166\tres = 1.769E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.182100\tres = 1.702E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.183965\tres = 1.639E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.185761\tres = 1.577E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.187493\tres = 1.517E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.189162\tres = 1.461E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.190771\tres = 1.405E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.192321\tres = 1.353E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.193815\tres = 1.302E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.195253\tres = 1.253E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.196640\tres = 1.205E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.197976\tres = 1.160E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.199263\tres = 1.116E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.200504\tres = 1.074E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.201698\tres = 1.034E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.202848\tres = 9.950E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.203957\tres = 9.570E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.205024\tres = 9.215E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.206052\tres = 8.863E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.207043\tres = 8.531E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.207995\tres = 8.214E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.208913\tres = 7.891E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.209798\tres = 7.597E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.210649\tres = 7.320E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.211469\tres = 7.034E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.212259\tres = 6.771E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.213019\tres = 6.521E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.213749\tres = 6.268E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.214455\tres = 6.023E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.215133\tres = 5.809E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.215786\tres = 5.588E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.216414\tres = 5.368E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.217020\tres = 5.168E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.217601\tres = 4.980E-04\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.218162\tres = 4.780E-04\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.218703\tres = 4.601E-04\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.219222\tres = 4.443E-04\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.219722\tres = 4.260E-04\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.220203\tres = 4.096E-04\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.220667\tres = 3.946E-04\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.221113\tres = 3.800E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.221542\tres = 3.655E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.221954\tres = 3.510E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.222352\tres = 3.378E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.222734\tres = 3.251E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.223102\tres = 3.131E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.223457\tres = 3.009E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.223798\tres = 2.896E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.224127\tres = 2.791E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.224442\tres = 2.684E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.224746\tres = 2.578E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.225039\tres = 2.481E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.225320\tres = 2.392E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.225591\tres = 2.296E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.225852\tres = 2.208E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.226103\tres = 2.125E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.226344\tres = 2.047E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.226575\tres = 1.965E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.226799\tres = 1.888E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.227014\tres = 1.822E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.227221\tres = 1.750E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.227419\tres = 1.687E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.227611\tres = 1.619E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.227794\tres = 1.560E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.227972\tres = 1.495E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.228142\tres = 1.442E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.228307\tres = 1.391E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.228464\tres = 1.338E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.228616\tres = 1.283E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.228762\tres = 1.235E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.228902\tres = 1.183E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.229037\tres = 1.145E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.229167\tres = 1.099E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.229293\tres = 1.056E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.229413\tres = 1.022E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.229529\tres = 9.787E-05\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.229641\tres = 9.401E-05\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.229748\tres = 9.086E-05\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.229851\tres = 8.685E-05\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.229950\tres = 8.395E-05\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.230046\tres = 8.088E-05\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.230138\tres = 7.760E-05\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.230226\tres = 7.451E-05\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.230310\tres = 7.146E-05\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.230392\tres = 6.878E-05\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.230470\tres = 6.632E-05\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.230546\tres = 6.372E-05\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.230619\tres = 6.170E-05\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.230689\tres = 5.908E-05\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.230756\tres = 5.654E-05\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.230821\tres = 5.487E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.230883\tres = 5.247E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.230943\tres = 5.058E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.231001\tres = 4.846E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.231056\tres = 4.672E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.231109\tres = 4.478E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.231161\tres = 4.334E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.231210\tres = 4.165E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.231258\tres = 4.022E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.231303\tres = 3.850E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.231347\tres = 3.721E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.231389\tres = 3.559E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.231430\tres = 3.425E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.231469\tres = 3.291E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.231507\tres = 3.174E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.231543\tres = 3.023E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.231577\tres = 2.923E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.231611\tres = 2.808E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.231643\tres = 2.711E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.231673\tres = 2.587E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.231703\tres = 2.481E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.231731\tres = 2.409E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.231759\tres = 2.301E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.231785\tres = 2.220E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.231811\tres = 2.139E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.231835\tres = 2.065E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.231859\tres = 1.999E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.231881\tres = 1.899E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.231903\tres = 1.825E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.231924\tres = 1.761E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.231944\tres = 1.696E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.231963\tres = 1.648E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.231982\tres = 1.564E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.232000\tres = 1.508E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.232017\tres = 1.450E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.232033\tres = 1.398E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.232050\tres = 1.344E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.232065\tres = 1.312E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.232080\tres = 1.233E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.232094\tres = 1.204E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.232108\tres = 1.156E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.232121\tres = 1.114E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.232134\tres = 1.064E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.232146\tres = 1.029E-05\n" - ] - } - ], + "outputs": [], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", @@ -2802,7 +2261,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 53, "metadata": { "collapsed": false }, diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.rst b/docs/source/pythonapi/examples/multi-group-cross-sections.rst new file mode 100644 index 0000000000..b2da0e1bcf --- /dev/null +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.rst @@ -0,0 +1,11 @@ +==================================== +Multi-Group Cross Section Generation +==================================== + +.. only:: html + + .. notebook:: multi-group-cross-sections.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 12baf937d1..09fbb3ac96 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -65,6 +65,7 @@ on a given module or class. examples/post-processing examples/pandas-dataframes examples/tally-arithmetic + examples/multi-group-cross-sections .. _Jupyter: https://jupyter.org/ .. _NumPy: http://www.numpy.org/ diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 445bdcabbc..85b08362a0 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -441,14 +441,24 @@ class MultiGroupXS(object): # Create Tallies to search for in StatePoint self.create_tallies() + # Use tally "slicing" to ensure that tallies correspond to our domain + # NOTE: This is important if tally merging was used + if self.domain_type != 'distribcell': + filters = [self.domain_type] + filter_bins = [(self.domain.id,)] + # Distribcell filters only accept single cell - neglect it when slicing + else: + filters = [] + filter_bins = [] + # Find, slice and store Tallies from StatePoint # The tally slicing is needed if tally merging was used for tally_type, tally in self.tallies.items(): sp_tally = statepoint.get_tally(tally.scores, tally.filters, tally.nuclides, estimator=tally.estimator) - sp_tally = sp_tally.get_slice(tally.scores, [self.domain_type], - [(self.domain.id,)], tally.nuclides) + sp_tally = sp_tally.get_slice(tally.scores, filters, + filter_bins, tally.nuclides) self.tallies[tally_type] = sp_tally def get_xs(self, groups='all', subdomains='all', nuclides='all', diff --git a/openmc/tallies.py b/openmc/tallies.py index dc58c2f6d7..0bfdc299a0 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2366,7 +2366,8 @@ class Tally(object): if filter_type in ['energy', 'energyout']: bin_indices.extend([bin_index, bin_index+1]) elif filter_type == 'distribcell': - bin_indices.append(0) + indices = [(bin,) for bin in range(filter.num_bins)] + bin_indices.extend(indices) else: bin_indices.append(bin_index) From 9451b374ab794227d636a6fb81b6ba004c81adca Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 13:06:28 -0400 Subject: [PATCH 274/519] Updated .gitignore with MGXS IPython Notebook-generated files, re-ran other Notebook examples to update documentation --- .gitignore | 7 +- .../examples/pandas-dataframes.ipynb | 1422 ++++++++++++++++- .../pythonapi/examples/tally-arithmetic.ipynb | 660 +++++++- 3 files changed, 1972 insertions(+), 117 deletions(-) diff --git a/.gitignore b/.gitignore index c5c4c729da..7c6e6d9c2a 100644 --- a/.gitignore +++ b/.gitignore @@ -64,5 +64,8 @@ data/nndc # IPython notebook checkpoints .ipynb_checkpoints -# OpenMOC tracks -*.data \ No newline at end of file +# Multi-group cross section IPython Notebook +docs/source/pythonapi/examples/*.xml +docs/source/pythonapi/examples/*.png +docs/source/pythonapi/examples/*.xls +docs/source/pythonapi/examples/tracks \ No newline at end of file diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index f227e2f71d..c7da78a6ed 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -385,7 +385,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDExOjE3\nOjA5LTA0OjAw0jfqaAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QxMToxNzowOS0wNDow\nMKNqUtQAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDEzOjAz\nOjU5LTA0OjAwMu4u/QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QxMzowMzo1OS0wNDow\nMEOzlkEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -558,7 +558,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "rm: cannot remove ‘statepoint.*’: No such file or directory\n", "\n", " .d88888b. 888b d888 .d8888b.\n", " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", @@ -576,7 +575,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 11:17:09\n", + " Date/Time: 2015-10-03 13:03:59\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -644,20 +643,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.1300E-01 seconds\n", - " Reading cross sections = 1.5900E-01 seconds\n", - " Total time in simulation = 1.5700E+01 seconds\n", - " Time in transport only = 1.5659E+01 seconds\n", - " Time in inactive batches = 2.1510E+00 seconds\n", - " Time in active batches = 1.3549E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 3.9400E-01 seconds\n", + " Reading cross sections = 8.8000E-02 seconds\n", + " Total time in simulation = 1.0755E+01 seconds\n", + " Time in transport only = 1.0746E+01 seconds\n", + " Time in inactive batches = 1.2680E+00 seconds\n", + " Time in active batches = 9.4870E+00 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 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.6427E+01 seconds\n", - " Calculation Rate (inactive) = 5811.25 neutrons/second\n", - " Calculation Rate (active) = 2767.73 neutrons/second\n", + " Total time elapsed = 1.1159E+01 seconds\n", + " Calculation Rate (inactive) = 9858.04 neutrons/second\n", + " Calculation Rate (active) = 3952.78 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -718,20 +717,7 @@ "collapsed": false, "scrolled": true }, - "outputs": [ - { - "ename": "KeyError", - "evalue": "10003", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the summary file and link with statepoint\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msu\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'summary.h5'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlink_with_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msu\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/statepoint.pyc\u001b[0m in \u001b[0;36mlink_with_summary\u001b[1;34m(self, summary)\u001b[0m\n\u001b[0;32m 610\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mtally_id\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtally\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 611\u001b[0m \u001b[1;31m# Get the Tally name from the summary file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 612\u001b[1;33m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtally_id\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 613\u001b[0m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_summary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 614\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mKeyError\u001b[0m: 10003" - ] - } - ], + "outputs": [], "source": [ "# Load the summary file and link with statepoint\n", "su = Summary('summary.h5')\n", @@ -747,11 +733,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\tmesh tally\n", + "\tFilters =\t\n", + " \t\tmesh\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'fission', u'nu-fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "# Find the mesh tally with the StatePoint API\n", "tally = sp.get_tally(name='mesh tally')\n", @@ -769,11 +772,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.1127471 ]]\n", + "\n", + " [[ 0.06599162]]\n", + "\n", + " [[ 0.25310075]]\n", + "\n", + " [[ 0.10150973]]]\n" + ] + } + ], "source": [ "# Get the relative error for the thermal fission reaction \n", "# rates in the four corner pins \n", @@ -785,11 +802,271 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
mesh 1energy [MeV]scoremeanstd. dev.
xyz
0111(0.0e+00 - 6.3e-07)fission0.0002240.000025
1111(0.0e+00 - 6.3e-07)nu-fission0.0005460.000062
2111(6.3e-07 - 2.0e+01)fission0.0000710.000004
3111(6.3e-07 - 2.0e+01)nu-fission0.0001870.000010
4121(0.0e+00 - 6.3e-07)fission0.0003920.000045
5121(0.0e+00 - 6.3e-07)nu-fission0.0009550.000110
6121(6.3e-07 - 2.0e+01)fission0.0000960.000005
7121(6.3e-07 - 2.0e+01)nu-fission0.0002520.000014
8131(0.0e+00 - 6.3e-07)fission0.0005510.000053
9131(0.0e+00 - 6.3e-07)nu-fission0.0013430.000130
10131(6.3e-07 - 2.0e+01)fission0.0001310.000008
11131(6.3e-07 - 2.0e+01)nu-fission0.0003430.000019
12141(0.0e+00 - 6.3e-07)fission0.0006880.000063
13141(0.0e+00 - 6.3e-07)nu-fission0.0016760.000153
14141(6.3e-07 - 2.0e+01)fission0.0001510.000007
15141(6.3e-07 - 2.0e+01)nu-fission0.0003950.000019
16151(0.0e+00 - 6.3e-07)fission0.0007850.000065
17151(0.0e+00 - 6.3e-07)nu-fission0.0019140.000158
18151(6.3e-07 - 2.0e+01)fission0.0001870.000008
19151(6.3e-07 - 2.0e+01)nu-fission0.0004870.000019
\n", + "
" + ], + "text/plain": [ + " mesh 1 energy [MeV] score mean std. dev.\n", + " x y z \n", + "0 1 1 1 (0.0e+00 - 6.3e-07) fission 0.000224 0.000025\n", + "1 1 1 1 (0.0e+00 - 6.3e-07) nu-fission 0.000546 0.000062\n", + "2 1 1 1 (6.3e-07 - 2.0e+01) fission 0.000071 0.000004\n", + "3 1 1 1 (6.3e-07 - 2.0e+01) nu-fission 0.000187 0.000010\n", + "4 1 2 1 (0.0e+00 - 6.3e-07) fission 0.000392 0.000045\n", + "5 1 2 1 (0.0e+00 - 6.3e-07) nu-fission 0.000955 0.000110\n", + "6 1 2 1 (6.3e-07 - 2.0e+01) fission 0.000096 0.000005\n", + "7 1 2 1 (6.3e-07 - 2.0e+01) nu-fission 0.000252 0.000014\n", + "8 1 3 1 (0.0e+00 - 6.3e-07) fission 0.000551 0.000053\n", + "9 1 3 1 (0.0e+00 - 6.3e-07) nu-fission 0.001343 0.000130\n", + "10 1 3 1 (6.3e-07 - 2.0e+01) fission 0.000131 0.000008\n", + "11 1 3 1 (6.3e-07 - 2.0e+01) nu-fission 0.000343 0.000019\n", + "12 1 4 1 (0.0e+00 - 6.3e-07) fission 0.000688 0.000063\n", + "13 1 4 1 (0.0e+00 - 6.3e-07) nu-fission 0.001676 0.000153\n", + "14 1 4 1 (6.3e-07 - 2.0e+01) fission 0.000151 0.000007\n", + "15 1 4 1 (6.3e-07 - 2.0e+01) nu-fission 0.000395 0.000019\n", + "16 1 5 1 (0.0e+00 - 6.3e-07) fission 0.000785 0.000065\n", + "17 1 5 1 (0.0e+00 - 6.3e-07) nu-fission 0.001914 0.000158\n", + "18 1 5 1 (6.3e-07 - 2.0e+01) fission 0.000187 0.000008\n", + "19 1 5 1 (6.3e-07 - 2.0e+01) nu-fission 0.000487 0.000019" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get a pandas dataframe for the mesh tally data\n", "df = tally.get_pandas_dataframe(nuclides=False)\n", @@ -800,11 +1077,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\nBPCvjMC6bD6xSh4AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create a boxplot to view the distribution of\n", "# fission and nu-fission rates in the pins\n", @@ -813,11 +1101,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nefX/AdmeWI23zkQnAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Extract thermal nu-fission rates from pandas\n", "fiss = df[df['score'] == 'nu-fission']\n", @@ -842,11 +1151,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10001\n", + "\tName =\tcell tally\n", + "\tFilters =\t\n", + " \t\tcell\t[10000]\n", + "\tNuclides =\tU-235 U-238 \n", + "\tScores =\t[u'scatter-Y0,0', u'scatter-Y1,-1', u'scatter-Y1,0', u'scatter-Y1,1', u'scatter-Y2,-2', u'scatter-Y2,-1', u'scatter-Y2,0', u'scatter-Y2,1', u'scatter-Y2,2']\n", + "\tEstimator =\tanalog\n", + "\n" + ] + } + ], "source": [ "# Find the cell Tally with the StatePoint API\n", "tally = sp.get_tally(name='cell tally')\n", @@ -857,11 +1182,202 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellnuclidescoremeanstd. dev.
010000U-235scatter-Y0,00.0383300.001119
110000U-235scatter-Y1,-10.0000080.000341
210000U-235scatter-Y1,0-0.0003420.000342
310000U-235scatter-Y1,10.0002010.000262
410000U-235scatter-Y2,-20.0001360.000152
510000U-235scatter-Y2,-10.0000420.000131
610000U-235scatter-Y2,00.0003030.000185
710000U-235scatter-Y2,1-0.0004070.000184
810000U-235scatter-Y2,2-0.0001450.000120
910000U-238scatter-Y0,02.3193220.006166
1010000U-238scatter-Y1,-1-0.0236380.001940
1110000U-238scatter-Y1,0-0.0034630.001892
1210000U-238scatter-Y1,10.0250990.002270
1310000U-238scatter-Y2,-2-0.0006170.001197
1410000U-238scatter-Y2,-10.0025490.001187
1510000U-238scatter-Y2,00.0071210.001646
1610000U-238scatter-Y2,1-0.0000580.001323
1710000U-238scatter-Y2,2-0.0022350.000867
\n", + "
" + ], + "text/plain": [ + " cell nuclide score mean std. dev.\n", + "0 10000 U-235 scatter-Y0,0 0.038330 0.001119\n", + "1 10000 U-235 scatter-Y1,-1 0.000008 0.000341\n", + "2 10000 U-235 scatter-Y1,0 -0.000342 0.000342\n", + "3 10000 U-235 scatter-Y1,1 0.000201 0.000262\n", + "4 10000 U-235 scatter-Y2,-2 0.000136 0.000152\n", + "5 10000 U-235 scatter-Y2,-1 0.000042 0.000131\n", + "6 10000 U-235 scatter-Y2,0 0.000303 0.000185\n", + "7 10000 U-235 scatter-Y2,1 -0.000407 0.000184\n", + "8 10000 U-235 scatter-Y2,2 -0.000145 0.000120\n", + "9 10000 U-238 scatter-Y0,0 2.319322 0.006166\n", + "10 10000 U-238 scatter-Y1,-1 -0.023638 0.001940\n", + "11 10000 U-238 scatter-Y1,0 -0.003463 0.001892\n", + "12 10000 U-238 scatter-Y1,1 0.025099 0.002270\n", + "13 10000 U-238 scatter-Y2,-2 -0.000617 0.001197\n", + "14 10000 U-238 scatter-Y2,-1 0.002549 0.001187\n", + "15 10000 U-238 scatter-Y2,0 0.007121 0.001646\n", + "16 10000 U-238 scatter-Y2,1 -0.000058 0.001323\n", + "17 10000 U-238 scatter-Y2,2 -0.002235 0.000867" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get a pandas dataframe for the cell tally data\n", "df = tally.get_pandas_dataframe()\n", @@ -879,11 +1395,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.00086668 0.0061658 ]\n", + " [ 0.00011981 0.00111862]]]\n" + ] + } + ], "source": [ "# Get the standard deviations for two of the spherical harmonic\n", "# scattering reaction rates \n", @@ -901,11 +1426,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10002\n", + "\tName =\tdistribcell tally\n", + "\tFilters =\t\n", + " \t\tdistribcell\t[10002]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'absorption', u'scatter']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "# Find the distribcell Tally with the StatePoint API\n", "tally = sp.get_tally(name='distribcell tally')\n", @@ -923,11 +1464,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.03658762]]]\n" + ] + } + ], "source": [ "# Get the relative error for the scattering reaction rates in\n", "# the first 30 distribcell instances \n", @@ -945,11 +1494,199 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + "
distribcellscoremeanstd. dev.
558279absorption0.0000810.000008
559279scatter0.0131090.000358
560280absorption0.0000880.000010
561280scatter0.0143950.000586
562281absorption0.0000970.000010
563281scatter0.0146370.000427
564282absorption0.0001070.000009
565282scatter0.0156830.000552
566283absorption0.0001100.000009
567283scatter0.0162930.000627
568284absorption0.0001110.000007
569284scatter0.0170320.000445
570285absorption0.0001120.000006
571285scatter0.0176660.000425
572286absorption0.0001230.000011
573286scatter0.0177060.000597
574287absorption0.0001080.000011
575287scatter0.0173390.000664
576288absorption0.0001290.000011
577288scatter0.0184520.000523
\n", + "
" + ], + "text/plain": [ + " distribcell score mean std. dev.\n", + "558 279 absorption 0.000081 0.000008\n", + "559 279 scatter 0.013109 0.000358\n", + "560 280 absorption 0.000088 0.000010\n", + "561 280 scatter 0.014395 0.000586\n", + "562 281 absorption 0.000097 0.000010\n", + "563 281 scatter 0.014637 0.000427\n", + "564 282 absorption 0.000107 0.000009\n", + "565 282 scatter 0.015683 0.000552\n", + "566 283 absorption 0.000110 0.000009\n", + "567 283 scatter 0.016293 0.000627\n", + "568 284 absorption 0.000111 0.000007\n", + "569 284 scatter 0.017032 0.000445\n", + "570 285 absorption 0.000112 0.000006\n", + "571 285 scatter 0.017666 0.000425\n", + "572 286 absorption 0.000123 0.000011\n", + "573 286 scatter 0.017706 0.000597\n", + "574 287 absorption 0.000108 0.000011\n", + "575 287 scatter 0.017339 0.000664\n", + "576 288 absorption 0.000129 0.000011\n", + "577 288 scatter 0.018452 0.000523" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get a pandas dataframe for the distribcell tally data\n", "df = tally.get_pandas_dataframe(nuclides=False)\n", @@ -967,11 +1704,415 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
level 1level 2level 3distribcellscoremeanstd. dev.
cellunivlatcelluniv
idididxyzidid
01000301000100010002100000absorption0.0001310.000014
11000301000100010002100000scatter0.0185820.000680
21000301000110010002100001absorption0.0002200.000023
31000301000110010002100001scatter0.0287110.001186
41000301000120010002100002absorption0.0002950.000022
51000301000120010002100002scatter0.0387820.001084
61000301000130010002100003absorption0.0003310.000022
71000301000130010002100003scatter0.0457720.001084
81000301000140010002100004absorption0.0004190.000026
91000301000140010002100004scatter0.0559750.001344
101000301000150010002100005absorption0.0005140.000024
111000301000150010002100005scatter0.0632890.001605
121000301000160010002100006absorption0.0005910.000027
131000301000160010002100006scatter0.0710110.002058
141000301000170010002100007absorption0.0006710.000036
151000301000170010002100007scatter0.0778910.001952
161000301000180010002100008absorption0.0007210.000031
171000301000180010002100008scatter0.0863930.001722
181000301000190010002100009absorption0.0007480.000033
191000301000190010002100009scatter0.0908610.001669
\n", + "
" + ], + "text/plain": [ + " level 1 level 2 level 3 distribcell score \\\n", + " cell univ lat cell univ \n", + " id id id x y z id id \n", + "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n", + "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n", + "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n", + "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n", + "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n", + "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n", + "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n", + "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n", + "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n", + "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n", + "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n", + "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n", + "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n", + "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n", + "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n", + "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n", + "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n", + "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n", + "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n", + "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n", + "\n", + " mean std. dev. \n", + " \n", + " \n", + "0 0.000131 0.000014 \n", + "1 0.018582 0.000680 \n", + "2 0.000220 0.000023 \n", + "3 0.028711 0.001186 \n", + "4 0.000295 0.000022 \n", + "5 0.038782 0.001084 \n", + "6 0.000331 0.000022 \n", + "7 0.045772 0.001084 \n", + "8 0.000419 0.000026 \n", + "9 0.055975 0.001344 \n", + "10 0.000514 0.000024 \n", + "11 0.063289 0.001605 \n", + "12 0.000591 0.000027 \n", + "13 0.071011 0.002058 \n", + "14 0.000671 0.000036 \n", + "15 0.077891 0.001952 \n", + "16 0.000721 0.000031 \n", + "17 0.086393 0.001722 \n", + "18 0.000748 0.000033 \n", + "19 0.090861 0.001669 " + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Get a pandas dataframe for the distribcell tally data\n", "df = tally.get_pandas_dataframe(summary=su, nuclides=False)\n", @@ -982,11 +2123,97 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
meanstd. dev.
count289.000000289.000000
mean0.0004170.000020
std0.0002380.000008
min0.0000200.000003
25%0.0002140.000014
50%0.0003940.000019
75%0.0006270.000025
max0.0009150.000049
\n", + "
" + ], + "text/plain": [ + " mean std. dev.\n", + " \n", + " \n", + "count 289.000000 289.000000\n", + "mean 0.000417 0.000020\n", + "std 0.000238 0.000008\n", + "min 0.000020 0.000003\n", + "25% 0.000214 0.000014\n", + "50% 0.000394 0.000019\n", + "75% 0.000627 0.000025\n", + "max 0.000915 0.000049" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Show summary statistics for absorption distribcell tally data\n", "absorption = df[df['score'] == 'absorption']\n", @@ -1005,11 +2232,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mann-Whitney Test p-value: 0.498462484897\n" + ] + } + ], "source": [ "# Extract tally data from pins in the pins divided along y=x diagonal \n", "multi_index = ('level 2', 'lat',)\n", @@ -1035,11 +2270,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mann-Whitney Test p-value: 1.61253828675e-41\n" + ] + } + ], "source": [ "# Extract tally data from pins in the pins divided along y=-x diagonal\n", "multi_index = ('level 2', 'lat',)\n", @@ -1063,11 +2306,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:4: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\norlkyRKeP3+erVp1IWCgqI78DIFVDAuLossVo41pQ4rqwy2ZmHgjbbYuFKvqVlBVI1i3bnMajRMo\nZofbaLNF+F0sBAtI4yGNR2kSSvozMzO5Zs0aLlmyxFtp9Vr1d+p0K4HV9ATQgXrU6XoQeJ6KUpuT\nJz9T+EEoTugNG7amw5FIp7Mbw8NjvUUbe/S4g6Jib87VvO+Vty8e/WFh0QS20RPstdsT+eGHH+bZ\nfvPmzbTbI+l01qfVGsYFCxbx6aefZnh4RZrN5Vi/fjMeOnTIu/2MGTNoMPhWEn6Fwp1zG1W1OgcO\nHMLGjdvSZqtB4f6qR1Ep+B1GR1fzHmfQoH9RBNQ9x9nJ6OjqHDz4Ier1U7TnXtBmEdna1buFgIF3\n331/ntldcnIyq1evR5OpEnW6kVTVBD722JMFjvfp06dpt0dSuKNI4FM6nVH866+/Cv1fpaamagH5\ntfQ013I6b+XUqVO928yf/xLNZjtVNZ7h4bHctWuX9n/0XTDxGZs06cixY59gtWpN2Lx5F37zzTdM\nSUlhixadaTCYGB5eievWrStUUyCANB6hbTwkocWQIcNpNI7TTgbrKPzkHjdOCo1Ga5FWy0yfPkOr\ntOqpwjuPN97YgyS5ePF/tF7tRyiqurbnlCkFNzM6cuQIq1Spr13lhtFqrcpu3frmWVKbkZGhXUF7\nakMdpF7vok7XjqKrYWMCbVmhQrw3nrN//35tietSAl9RUdry3nvv56pVq7h161a63W5mZmZy8uTJ\ntFq7Myf/xU293uTN5J816wXabN00N46bJtNY3nrrXdoJdixFwPlhiuCzZzx3sly52AI/d3Z2Nleu\nXMlp06YV2nHw66+/ptOZ6HMiJ53O+oW23RVFJQdTLCvvps3Q3qaiVMxTBTctLY0HDx70xnPuvXeY\nj2EkdboF7Nbt9qu+V0kCaTyk8ZCUHCdOnGB0dDXa7T1osTQh0NXnhJRJo9FapFav9933EP0bS33P\nuLi6JMVJZOLEKbTZXLRY7HzwwVFXNUgJCU1pMEzTTtxfetu65ubo0aNUlGif9/yGQGXm5FecI+Ck\n3d6aGzdu9O63fft2tmnTnbVrt+SkSc/kuxJo69atVNUqFKu1xFV2eHis94R45coVdu9+G222GNrt\nNVizZmOePHmSnTr1pEgMbEaxuEClwdCLOt0TVJQYLl/+Zp73uh6OHDmi9WPxFMg8SoslLE/9sNx8\n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\nRCKRSCSB5/8ByMyfADZGvh4AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Extract the scatter tally data from pandas\n", "scatter = df[df['score'] == 'scatter']\n", @@ -1080,11 +2355,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Plot a histogram and kernel density estimate for the scattering rates\n", "scatter['mean'].plot(kind='hist', bins=25)\n", diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 4ce7641822..a0055b8b1d 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -369,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMTE6MTY6NTQtMDQ6MDAUwu7yAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDExOjE2OjU0LTA0OjAwZZ9WTgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMTM6MDI6MDItMDQ6MDCXyx9dAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDEzOjAyOjAyLTA0OjAw5pan4QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -563,7 +563,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "rm: cannot remove ‘statepoint.*’: No such file or directory\n", "\n", " .d88888b. 888b d888 .d8888b.\n", " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", @@ -581,7 +580,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 11:16:55\n", + " Date/Time: 2015-10-03 13:02:02\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -637,20 +636,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.8600E-01 seconds\n", - " Reading cross sections = 1.5400E-01 seconds\n", - " Total time in simulation = 2.4023E+01 seconds\n", - " Time in transport only = 2.3994E+01 seconds\n", - " Time in inactive batches = 3.1010E+00 seconds\n", - " Time in active batches = 2.0922E+01 seconds\n", + " Total time for initialization = 4.1600E-01 seconds\n", + " Reading cross sections = 9.1000E-02 seconds\n", + " Total time in simulation = 1.4793E+01 seconds\n", + " Time in transport only = 1.4785E+01 seconds\n", + " Time in inactive batches = 2.1450E+00 seconds\n", + " Time in active batches = 1.2648E+01 seconds\n", " Time synchronizing fission bank = 2.0000E-03 seconds\n", " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 2.4724E+01 seconds\n", - " Calculation Rate (inactive) = 4030.96 neutrons/second\n", - " Calculation Rate (active) = 1792.37 neutrons/second\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.5219E+01 seconds\n", + " Calculation Rate (inactive) = 5827.51 neutrons/second\n", + " Calculation Rate (active) = 2964.90 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -722,20 +721,7 @@ "collapsed": false, "scrolled": true }, - "outputs": [ - { - "ename": "KeyError", - "evalue": "10003", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Load the summary file and link with statepoint\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0msu\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSummary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'summary.h5'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlink_with_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msu\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/statepoint.pyc\u001b[0m in \u001b[0;36mlink_with_summary\u001b[1;34m(self, summary)\u001b[0m\n\u001b[0;32m 610\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mtally_id\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtally\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 611\u001b[0m \u001b[1;31m# Get the Tally name from the summary file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 612\u001b[1;33m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msummary\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtallies\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mtally_id\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 613\u001b[0m \u001b[0mtally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_summary\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 614\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mKeyError\u001b[0m: 10003" - ] - } - ], + "outputs": [], "source": [ "# Load the summary file and link with statepoint\n", "su = Summary('summary.h5')\n", @@ -753,11 +739,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nuclidescoremeanstd. dev.
0total(nu-fission / absorption)1.0463530.00935
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "0 total (nu-fission / absorption) 1.046353 0.00935" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute k-infinity using tally arithmetic\n", "fiss_rate = sp.get_tally(name='fiss. rate')\n", @@ -777,11 +799,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)totalabsorption0.958730.00774
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total absorption 0.95873 0.00774" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", @@ -799,11 +859,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nuclidescoremeanstd. dev.
0totalnu-fission1.0916220.011163
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "0 total nu-fission 1.091622 0.011163" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", @@ -822,11 +918,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]cellnuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8020120.006609
\n", + "
" + ], + "text/plain": [ + " energy [MeV] cell nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.802012 0.006609" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", @@ -843,11 +979,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2466040.011825
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.246604 0.011825" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", "eta = therm_fiss_rate / fuel_therm_abs_rate\n", @@ -863,11 +1037,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0463530.01894
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide \\\n", + "0 (0.0e+00 - 6.2e-01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption * nu-fission) * absorption) * (n... 1.046353 0.01894 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "keff = res_esc * fast_fiss * therm_util * eta\n", "keff.get_pandas_dataframe()" @@ -884,7 +1099,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false, "scrolled": true @@ -900,11 +1115,131 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.641746e-076.859257e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099861e-011.966887e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.556665e-013.717881e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.554650e-035.218094e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.165057e-035.625590e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.276535e-018.544314e-04
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.089493e-035.080374e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.370111e-031.361116e-05
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", + "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", + "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", + "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", + "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", + "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", + "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", + "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", + "\n", + " mean std. dev. \n", + "0 6.641746e-07 6.859257e-09 \n", + "1 2.099861e-01 1.966887e-03 \n", + "2 3.556665e-01 3.717881e-03 \n", + "3 5.554650e-03 5.218094e-05 \n", + "4 7.165057e-03 5.625590e-05 \n", + "5 2.276535e-01 8.544314e-04 \n", + "6 8.089493e-03 5.080374e-05 \n", + "7 3.370111e-03 1.361116e-05 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fuel_xs = fuel_rxn_rates / flux\n", "fuel_xs.get_pandas_dataframe()" @@ -919,11 +1254,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 6.64174599e-07]\n", + " [ 3.55666541e-01]]\n", + "\n", + " [[ 7.16505734e-03]\n", + " [ 8.08949336e-03]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore\n", "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", @@ -939,11 +1286,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.00555465]]\n", + "\n", + " [[ 0.00337011]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", @@ -953,11 +1310,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.22765348]\n", + " [ 0.00337011]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", @@ -975,11 +1341,81 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.284890e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8679827.022256e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0828016.087096e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0934845.275039e-04
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.284890e-08\n", + "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.867982 7.022256e-03\n", + "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082801 6.087096e-04\n", + "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.093484 5.275039e-04" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# \"Slice\" the nu-fission data into a new derived Tally\n", "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", @@ -988,11 +1424,131 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010002(1.0e-08 - 1.1e-07)H-1scatter4.6205250.038249
110002(1.1e-07 - 1.2e-06)H-1scatter2.0368410.013203
210002(1.2e-06 - 1.3e-05)H-1scatter1.6599160.010107
310002(1.3e-05 - 1.4e-04)H-1scatter1.8615460.013328
410002(1.4e-04 - 1.5e-03)H-1scatter2.0496640.008215
510002(1.5e-03 - 1.6e-02)H-1scatter2.1621570.010245
610002(1.6e-02 - 1.7e-01)H-1scatter2.2244960.013796
710002(1.7e-01 - 1.9e+00)H-1scatter1.9975850.009161
810002(1.9e+00 - 2.0e+01)H-1scatter0.3734720.003922
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.620525 0.038249\n", + "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.036841 0.013203\n", + "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.659916 0.010107\n", + "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.861546 0.013328\n", + "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.049664 0.008215\n", + "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.162157 0.010245\n", + "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.224496 0.013796\n", + "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 1.997585 0.009161\n", + "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373472 0.003922" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", "need_to_slice = sp.get_tally(name='need-to-slice')\n", From bcf6428a57c885ff558625cdd3501d72687aecb3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 13:09:55 -0400 Subject: [PATCH 275/519] Removed Excel file created by MGXS IPython Notebook from git tracking --- .gitignore | 1 + .../pythonapi/examples/mgxs/transport-xs.xls | Bin 5632 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 docs/source/pythonapi/examples/mgxs/transport-xs.xls diff --git a/.gitignore b/.gitignore index 7c6e6d9c2a..08f7bd2e48 100644 --- a/.gitignore +++ b/.gitignore @@ -68,4 +68,5 @@ data/nndc docs/source/pythonapi/examples/*.xml docs/source/pythonapi/examples/*.png docs/source/pythonapi/examples/*.xls +docs/source/pythonapi/examples/mgxs docs/source/pythonapi/examples/tracks \ No newline at end of file diff --git a/docs/source/pythonapi/examples/mgxs/transport-xs.xls b/docs/source/pythonapi/examples/mgxs/transport-xs.xls deleted file mode 100644 index 86a8cee39962fec9c37bb88dddedbafc034ce043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeI0YiJZ#6vzK}cJ@`0m>rXd5yCW}@r59zAhl-VqfPrEG0_hZ3FvADn!4`lb|YvZ zCdT;5R>4nNL8N{uz7c$oh>Aq~ASgZv2ufn1RivdY3L>W4bIxSeo&6BD6hf6b%bvOC z+H8-)4+{#UM=@r#RE`%u?~^vWrFIs@`AFoRRhL(uP38XQtru(hf41gO`BdZR zj*3&m)=|__EHLZ_jkpG&ABOLv(IH4IkxU$>%u;= zXvW3*Umpuw7xt&WpMF$+@*81u{tDUbbJW>V$5$6`{Y%&pVOK@# z+P4n%S@oKM^St2Dz-nBao#R^m)z5&R0Y3wN2K)^88JLs|@arW%mHBnedDU|M1K`&Q z{$FQ|zI^rN{mj5Br0A1@iO-OvYZ}{W=8Kmq1eKc^UQ5M@`+p&~ZKLREY{CW^$EISs md)m;?wOo82ho^EP!}%RIQHx^h{&oEP`!6=g1nvG){C@x;tuRIa From 221f026470c1c5d67ed0694d57b6ea9261200051 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 14:30:16 -0400 Subject: [PATCH 276/519] Now using property decorators for surface coeffs in OpenCG compatibility module --- docs/source/pythonapi/examples/geometry.xml | 38 ++++++++ .../pythonapi/examples/materials-xy.png | Bin 0 -> 1271 bytes docs/source/pythonapi/examples/materials.xml | 20 +++++ docs/source/pythonapi/examples/plots.xml | 8 ++ docs/source/pythonapi/examples/settings.xml | 21 +++++ docs/source/pythonapi/examples/tallies.xml | 23 +++++ .../tracks/128_angles_0.1_cm_spacing.data | Bin 0 -> 108911 bytes openmc/opencg_compatible.py | 82 +++++++++--------- 8 files changed, 151 insertions(+), 41 deletions(-) create mode 100644 docs/source/pythonapi/examples/geometry.xml create mode 100644 docs/source/pythonapi/examples/materials-xy.png create mode 100644 docs/source/pythonapi/examples/materials.xml create mode 100644 docs/source/pythonapi/examples/plots.xml create mode 100644 docs/source/pythonapi/examples/settings.xml create mode 100644 docs/source/pythonapi/examples/tallies.xml create mode 100644 docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data diff --git a/docs/source/pythonapi/examples/geometry.xml b/docs/source/pythonapi/examples/geometry.xml new file mode 100644 index 0000000000..8e9f1ef3d1 --- /dev/null +++ b/docs/source/pythonapi/examples/geometry.xml @@ -0,0 +1,38 @@ + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 +10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 + + + + + + + + + + diff --git a/docs/source/pythonapi/examples/materials-xy.png b/docs/source/pythonapi/examples/materials-xy.png new file mode 100644 index 0000000000000000000000000000000000000000..534f7e5ff7251fbc6984a811cb22d37ea2df8c4e GIT binary patch literal 1271 zcmZ{kZB&wH7{_ljJ7-pN={b=rqgImUR4U5_0<%G2Qy`;BX__zP>(rBUL`@$h)2v)( zSr(d2%W9rv%#}qY&6l*Y$jq?WFlFTn3L2<@JkLE^pY~xNuIqRI&$<5p>(hM|aoNm; z_Fviq02T(Y=)qQ+Kh_*uYo8MRR&T}JSpOh@0Hi19TO#eO+9oZSxdqfeTQ*`9E23G! zK>%bD0Lab%WX>H1;2;rz(Y*kW$^pQoR>-#dS!Wk;19=Px;Q>d-k=#>3^43xR{MnCz zQQtG^;HaGo%PKxgW$j9{^5dHYwmwRv0$}?(fbP$WQ;mzs$!g*k1=&SocU~+gF18PG z-{d98uMjc0k-pkSeq}S0d&)K`()QLC%GXraZRU9H=SeFb6s|b@pkiR+G^_rHw?jut z6dudrtySi?t^H_2_@{)Ng59fQG6;jtxVF{XCLOvKrc*nUmt4Z|l$=?HpyMd2e!23XuuQ0( zxY4o}2C<#at8N@SA1D*uV=VIaC?2a$8({d?VU-=e*}`@cnTolIpLHdW2+1+<^_%xq zlpG(QI7dzbCNr$wlbM-X_g*q;$lAUf5!dz)GHD0wa9k)=?;^}Qd|}$hxo)aqysF21 zedQBz*@uG0+UwO_@{M8XtfE)H-^9lGG%Cu!rdcD)DGCT-@1ZHRCh|L&K52_hjFirM ziVuHNyWTMrd3=TD-g}``RM?Q$V|kjeqvq8kL5#h2+3j4D6IoTFLiwFMNHJYjHv3h; z<*{a6wo;LSX%b!i?m_nHa2F3)%1(^hAC*u&DAxt2w5#X5=ZqN>go)i{SY7p*@TF-I zm=G{y@)n=qz#fZ|H*h>Ja9Tcr-93lZsSA_Li@h#k(e28wo?PkP%@@zRBb|)s7PPBN zpzN~73k&Tu^b4ez#)Q?v`dE{hZ&-(^*DczTTGu+nynR3@M)LQ=~(jF`>b-&;BButEeKO>CGmk zol(*lA9#=E)Pb~D$_o@o&5$BmQPn#+j27l%p|X_KCPHV zhS8Q~cj1y=Bvw^bG%7z-3kd@j+->B93i*kQG}$0wW%%3F#a-6l?kZsL1u>C=eWd6E z`>X)#iR(6ct|NL9H}KYNAQ3l^Hg5JL`jCjk^;$3VKZYMuV&eB_{J-J5hO^cS20#FV KO|RdwSM(2?bdD_m literal 0 HcmV?d00001 diff --git a/docs/source/pythonapi/examples/materials.xml b/docs/source/pythonapi/examples/materials.xml new file mode 100644 index 0000000000..42c2e50292 --- /dev/null +++ b/docs/source/pythonapi/examples/materials.xml @@ -0,0 +1,20 @@ + + + 71c + + + + + + + + + + + + + + + + + diff --git a/docs/source/pythonapi/examples/plots.xml b/docs/source/pythonapi/examples/plots.xml new file mode 100644 index 0000000000..512070a33f --- /dev/null +++ b/docs/source/pythonapi/examples/plots.xml @@ -0,0 +1,8 @@ + + + + 0 0 0 + 21.5 21.5 + 250 250 + + diff --git a/docs/source/pythonapi/examples/settings.xml b/docs/source/pythonapi/examples/settings.xml new file mode 100644 index 0000000000..26a23e9421 --- /dev/null +++ b/docs/source/pythonapi/examples/settings.xml @@ -0,0 +1,21 @@ + + + + 2500 + 20 + 5 + + + + -10.71 -10.71 -10 10.71 10.71 10.0 + + + + false + true + + + true + 200 + + diff --git a/docs/source/pythonapi/examples/tallies.xml b/docs/source/pythonapi/examples/tallies.xml new file mode 100644 index 0000000000..61873a91d7 --- /dev/null +++ b/docs/source/pythonapi/examples/tallies.xml @@ -0,0 +1,23 @@ + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + + + + fission nu-fission + + + + U-235 U-238 + scatter-y2 + + + + absorption scatter + + + diff --git a/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data b/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data new file mode 100644 index 0000000000000000000000000000000000000000..bbe6462a6c3b6855689590a0aaa161a18abec43c GIT binary patch literal 108911 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 lbx6l9p literal 0 HcmV?d00001 diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 000801ca2a..a6f90818f9 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -213,42 +213,42 @@ def get_opencg_surface(openmc_surface): opencg_surface = None if openmc_surface.type == 'plane': - A = openmc_surface.coeffs['A'] - B = openmc_surface.coeffs['B'] - C = openmc_surface.coeffs['C'] - D = openmc_surface.coeffs['D'] + A = openmc_surface.a + B = openmc_surface.b + C = openmc_surface.c + D = openmc_surface.d opencg_surface = opencg.Plane(surface_id, name, boundary, A, B, C, D) elif openmc_surface.type == 'x-plane': - x0 = openmc_surface.coeffs['x0'] + x0 = openmc_surface.y0 opencg_surface = opencg.XPlane(surface_id, name, boundary, x0) elif openmc_surface.type == 'y-plane': - y0 = openmc_surface.coeffs['y0'] + y0 = openmc_surface.y0 opencg_surface = opencg.YPlane(surface_id, name, boundary, y0) elif openmc_surface.type == 'z-plane': - z0 = openmc_surface.coeffs['z0'] + z0 = openmc_surface.z0 opencg_surface = opencg.ZPlane(surface_id, name, boundary, z0) elif openmc_surface.type == 'x-cylinder': - y0 = openmc_surface.coeffs['y0'] - z0 = openmc_surface.coeffs['z0'] - R = openmc_surface.coeffs['R'] + y0 = openmc_surface.y0 + z0 = openmc_surface.z0 + R = openmc_surface.r opencg_surface = opencg.XCylinder(surface_id, name, boundary, y0, z0, R) elif openmc_surface.type == 'y-cylinder': - x0 = openmc_surface.coeffs['x0'] - z0 = openmc_surface.coeffs['z0'] - R = openmc_surface.coeffs['R'] + x0 = openmc_surface.x0 + z0 = openmc_surface.z0 + R = openmc_surface.r opencg_surface = opencg.YCylinder(surface_id, name, boundary, x0, z0, R) elif openmc_surface.type == 'z-cylinder': - x0 = openmc_surface.coeffs['x0'] - y0 = openmc_surface.coeffs['y0'] - R = openmc_surface.coeffs['R'] + x0 = openmc_surface.x0 + y0 = openmc_surface.y0 + R = openmc_surface.r opencg_surface = opencg.ZCylinder(surface_id, name, boundary, x0, y0, R) @@ -297,40 +297,40 @@ def get_openmc_surface(opencg_surface): boundary = 'transmission' if opencg_surface.type == 'plane': - A = opencg_surface.coeffs['A'] - B = opencg_surface.coeffs['B'] - C = opencg_surface.coeffs['C'] - D = opencg_surface.coeffs['D'] + A = opencg_surface.a + B = opencg_surface.b + C = opencg_surface.c + D = opencg_surface.d openmc_surface = openmc.Plane(surface_id, boundary, A, B, C, D, name) elif opencg_surface.type == 'x-plane': - x0 = opencg_surface.coeffs['x0'] + x0 = opencg_surface.x0 openmc_surface = openmc.XPlane(surface_id, boundary, x0, name) elif opencg_surface.type == 'y-plane': - y0 = opencg_surface.coeffs['y0'] + y0 = opencg_surface.y0 openmc_surface = openmc.YPlane(surface_id, boundary, y0, name) elif opencg_surface.type == 'z-plane': - z0 = opencg_surface.coeffs['z0'] + z0 = opencg_surface.z0 openmc_surface = openmc.ZPlane(surface_id, boundary, z0, name) elif opencg_surface.type == 'x-cylinder': - y0 = opencg_surface.coeffs['y0'] - z0 = opencg_surface.coeffs['z0'] - R = opencg_surface.coeffs['R'] + y0 = opencg_surface.y0 + z0 = opencg_surface.z0 + R = opencg_surface.r openmc_surface = openmc.XCylinder(surface_id, boundary, y0, z0, R, name) elif opencg_surface.type == 'y-cylinder': - x0 = opencg_surface.coeffs['x0'] - z0 = opencg_surface.coeffs['z0'] - R = opencg_surface.coeffs['R'] + x0 = opencg_surface.x0 + z0 = opencg_surface.z0 + R = opencg_surface.r openmc_surface = openmc.YCylinder(surface_id, boundary, x0, z0, R, name) elif opencg_surface.type == 'z-cylinder': - x0 = opencg_surface.coeffs['x0'] - y0 = opencg_surface.coeffs['y0'] - R = opencg_surface.coeffs['R'] + x0 = opencg_surface.x0 + y0 = opencg_surface.y0 + R = opencg_surface.r openmc_surface = openmc.ZCylinder(surface_id, boundary, x0, y0, R, name) else: @@ -384,9 +384,9 @@ def get_compatible_opencg_surfaces(opencg_surface): boundary = opencg_surface.boundary_type if opencg_surface.type == 'x-squareprism': - y0 = opencg_surface.coeffs['y0'] - z0 = opencg_surface.coeffs['z0'] - R = opencg_surface.coeffs['R'] + y0 = opencg_surface.y0 + z0 = opencg_surface.z0 + R = opencg_surface.r # Create a list of the four planes we need left = opencg.YPlane(name=name, boundary=boundary, y0=y0-R) @@ -396,9 +396,9 @@ def get_compatible_opencg_surfaces(opencg_surface): surfaces = [left, right, bottom, top] elif opencg_surface.type == 'y-squareprism': - x0 = opencg_surface.coeffs['x0'] - z0 = opencg_surface.coeffs['z0'] - R = opencg_surface.coeffs['R'] + x0 = opencg_surface.x0 + z0 = opencg_surface.z0 + R = opencg_surface.r # Create a list of the four planes we need left = opencg.XPlane(name=name, boundary=boundary, x0=x0-R) @@ -408,9 +408,9 @@ def get_compatible_opencg_surfaces(opencg_surface): surfaces = [left, right, bottom, top] elif opencg_surface.type == 'z-squareprism': - x0 = opencg_surface.coeffs['x0'] - y0 = opencg_surface.coeffs['y0'] - R = opencg_surface.coeffs['R'] + x0 = opencg_surface.x0['x0'] + y0 = opencg_surface.y0['y0'] + R = opencg_surface.r['R'] # Create a list of the four planes we need left = opencg.XPlane(name=name, boundary=boundary, x0=x0-R) From 02d6b99d782d2e125bed15235ffe0870ef9cf9b8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 14:30:53 -0400 Subject: [PATCH 277/519] Removed accidental commit of Python API generated xml files --- docs/source/pythonapi/examples/geometry.xml | 38 ------------------ .../pythonapi/examples/materials-xy.png | Bin 1271 -> 0 bytes docs/source/pythonapi/examples/materials.xml | 20 --------- docs/source/pythonapi/examples/plots.xml | 8 ---- docs/source/pythonapi/examples/settings.xml | 21 ---------- docs/source/pythonapi/examples/tallies.xml | 23 ----------- .../tracks/128_angles_0.1_cm_spacing.data | Bin 108911 -> 0 bytes 7 files changed, 110 deletions(-) delete mode 100644 docs/source/pythonapi/examples/geometry.xml delete mode 100644 docs/source/pythonapi/examples/materials-xy.png delete mode 100644 docs/source/pythonapi/examples/materials.xml delete mode 100644 docs/source/pythonapi/examples/plots.xml delete mode 100644 docs/source/pythonapi/examples/settings.xml delete mode 100644 docs/source/pythonapi/examples/tallies.xml delete mode 100644 docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data diff --git a/docs/source/pythonapi/examples/geometry.xml b/docs/source/pythonapi/examples/geometry.xml deleted file mode 100644 index 8e9f1ef3d1..0000000000 --- a/docs/source/pythonapi/examples/geometry.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 -10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 - - - - - - - - - - diff --git a/docs/source/pythonapi/examples/materials-xy.png b/docs/source/pythonapi/examples/materials-xy.png deleted file mode 100644 index 534f7e5ff7251fbc6984a811cb22d37ea2df8c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmZ{kZB&wH7{_ljJ7-pN={b=rqgImUR4U5_0<%G2Qy`;BX__zP>(rBUL`@$h)2v)( zSr(d2%W9rv%#}qY&6l*Y$jq?WFlFTn3L2<@JkLE^pY~xNuIqRI&$<5p>(hM|aoNm; z_Fviq02T(Y=)qQ+Kh_*uYo8MRR&T}JSpOh@0Hi19TO#eO+9oZSxdqfeTQ*`9E23G! zK>%bD0Lab%WX>H1;2;rz(Y*kW$^pQoR>-#dS!Wk;19=Px;Q>d-k=#>3^43xR{MnCz zQQtG^;HaGo%PKxgW$j9{^5dHYwmwRv0$}?(fbP$WQ;mzs$!g*k1=&SocU~+gF18PG z-{d98uMjc0k-pkSeq}S0d&)K`()QLC%GXraZRU9H=SeFb6s|b@pkiR+G^_rHw?jut z6dudrtySi?t^H_2_@{)Ng59fQG6;jtxVF{XCLOvKrc*nUmt4Z|l$=?HpyMd2e!23XuuQ0( zxY4o}2C<#at8N@SA1D*uV=VIaC?2a$8({d?VU-=e*}`@cnTolIpLHdW2+1+<^_%xq zlpG(QI7dzbCNr$wlbM-X_g*q;$lAUf5!dz)GHD0wa9k)=?;^}Qd|}$hxo)aqysF21 zedQBz*@uG0+UwO_@{M8XtfE)H-^9lGG%Cu!rdcD)DGCT-@1ZHRCh|L&K52_hjFirM ziVuHNyWTMrd3=TD-g}``RM?Q$V|kjeqvq8kL5#h2+3j4D6IoTFLiwFMNHJYjHv3h; z<*{a6wo;LSX%b!i?m_nHa2F3)%1(^hAC*u&DAxt2w5#X5=ZqN>go)i{SY7p*@TF-I zm=G{y@)n=qz#fZ|H*h>Ja9Tcr-93lZsSA_Li@h#k(e28wo?PkP%@@zRBb|)s7PPBN zpzN~73k&Tu^b4ez#)Q?v`dE{hZ&-(^*DczTTGu+nynR3@M)LQ=~(jF`>b-&;BButEeKO>CGmk zol(*lA9#=E)Pb~D$_o@o&5$BmQPn#+j27l%p|X_KCPHV zhS8Q~cj1y=Bvw^bG%7z-3kd@j+->B93i*kQG}$0wW%%3F#a-6l?kZsL1u>C=eWd6E z`>X)#iR(6ct|NL9H}KYNAQ3l^Hg5JL`jCjk^;$3VKZYMuV&eB_{J-J5hO^cS20#FV KO|RdwSM(2?bdD_m diff --git a/docs/source/pythonapi/examples/materials.xml b/docs/source/pythonapi/examples/materials.xml deleted file mode 100644 index 42c2e50292..0000000000 --- a/docs/source/pythonapi/examples/materials.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 71c - - - - - - - - - - - - - - - - - diff --git a/docs/source/pythonapi/examples/plots.xml b/docs/source/pythonapi/examples/plots.xml deleted file mode 100644 index 512070a33f..0000000000 --- a/docs/source/pythonapi/examples/plots.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - 0 0 0 - 21.5 21.5 - 250 250 - - diff --git a/docs/source/pythonapi/examples/settings.xml b/docs/source/pythonapi/examples/settings.xml deleted file mode 100644 index 26a23e9421..0000000000 --- a/docs/source/pythonapi/examples/settings.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - 2500 - 20 - 5 - - - - -10.71 -10.71 -10 10.71 10.71 10.0 - - - - false - true - - - true - 200 - - diff --git a/docs/source/pythonapi/examples/tallies.xml b/docs/source/pythonapi/examples/tallies.xml deleted file mode 100644 index 61873a91d7..0000000000 --- a/docs/source/pythonapi/examples/tallies.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - - - - fission nu-fission - - - - U-235 U-238 - scatter-y2 - - - - absorption scatter - - - diff --git a/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data b/docs/source/pythonapi/examples/tracks/128_angles_0.1_cm_spacing.data deleted file mode 100644 index bbe6462a6c3b6855689590a0aaa161a18abec43c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108911 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 lbx6l9p From d193a1eb0b44c5430ea709a9133e69e3d6fa40c1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 14:33:28 -0400 Subject: [PATCH 278/519] Removed Cel.fill property in place of Cell.fill_type --- openmc/universe.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openmc/universe.py b/openmc/universe.py index 9516192802..ef89780e1f 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -85,8 +85,15 @@ class Cell(object): return self._fill @property - def type(self): - return self._fill + def fill_type(self): + if isinstance(self.fill, openmc.Material): + return 'material' + elif isinstance(self.fill, openmc.Universe): + return 'universe' + elif isinstance(self.fill, openmc.Lattice): + return 'lattice' + else: + return None @property def surfaces(self): From 81c00627f984e767193da01f2497da7e1ff094e3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 14:53:55 -0400 Subject: [PATCH 279/519] Fixed minor issues with OpenCG surface coefficient properties in compatibility module --- openmc/opencg_compatible.py | 2 +- openmc/surface.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index a6f90818f9..1cdf8e8756 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -220,7 +220,7 @@ def get_opencg_surface(openmc_surface): opencg_surface = opencg.Plane(surface_id, name, boundary, A, B, C, D) elif openmc_surface.type == 'x-plane': - x0 = openmc_surface.y0 + x0 = openmc_surface.x0 opencg_surface = opencg.XPlane(surface_id, name, boundary, x0) elif openmc_surface.type == 'y-plane': diff --git a/openmc/surface.py b/openmc/surface.py index 164bbd09bf..063787ce34 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -275,7 +275,7 @@ class XPlane(Plane): @property def x0(self): - return self.coeff['x0'] + return self.coeffs['x0'] @x0.setter def x0(self, x0): From e7cba5b22c39834869290e1c88da8c0e085485be Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 3 Oct 2015 14:54:46 -0400 Subject: [PATCH 280/519] Fixed minor issues with OpenCG surface coefficient properties in compatibility module --- openmc/opencg_compatible.py | 2 +- openmc/surface.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index a6f90818f9..1cdf8e8756 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -220,7 +220,7 @@ def get_opencg_surface(openmc_surface): opencg_surface = opencg.Plane(surface_id, name, boundary, A, B, C, D) elif openmc_surface.type == 'x-plane': - x0 = openmc_surface.y0 + x0 = openmc_surface.x0 opencg_surface = opencg.XPlane(surface_id, name, boundary, x0) elif openmc_surface.type == 'y-plane': diff --git a/openmc/surface.py b/openmc/surface.py index 164bbd09bf..063787ce34 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -275,7 +275,7 @@ class XPlane(Plane): @property def x0(self): - return self.coeff['x0'] + return self.coeffs['x0'] @x0.setter def x0(self, x0): From 82c9fce896dc4ad72db24d37be4bb5932fff818c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 3 Oct 2015 15:25:33 -0400 Subject: [PATCH 281/519] fixed errors in tallying delayed nu fission --- src/ace.F90 | 3 +- src/ace_header.F90 | 5 +- src/cross_section.F90 | 20 ++++++-- src/fission.F90 | 59 +++++++++++++++++++++- src/output.F90 | 2 +- src/state_point.F90 | 2 + src/summary.F90 | 2 + src/tally.F90 | 111 +++++++++++++++++++++++++----------------- 8 files changed, 149 insertions(+), 55 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index c5ed22665a..91653195b5 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -684,6 +684,7 @@ contains else nuc % nu_d_type = NU_NONE + nuc % n_precursor = ZERO end if end subroutine read_nu_data @@ -1399,7 +1400,7 @@ contains end subroutine generate_nu_fission !=============================================================================== -! GENERATE_DELAYED_NU_FISSION precalculates the microscopic delay-nu-fission +! GENERATE_DELAYED_NU_FISSION precalculates the microscopic delayed-nu-fission ! cross section for a given nuclide. This is done so that the nu_delayed ! function does not need to be called during cross section lookups. !=============================================================================== diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 13681985de..613cc44a43 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -1,6 +1,6 @@ module ace_header - use constants, only: MAX_FILE_LEN, ZERO + use constants, only: MAX_FILE_LEN, ZERO, MAX_DELAYED_GROUPS use endf_header, only: Tab1 use list_header, only: ListInt @@ -291,7 +291,8 @@ module ace_header real(8) :: fission ! macroscopic fission xs real(8) :: nu_fission ! macroscopic production xs real(8) :: kappa_fission ! macroscopic energy-released from fission - real(8) :: delayed_nu_fission ! macroscopic delayed production xs + real(8) :: delayed_nu_fission(MAX_DELAYED_GROUPS) ! macroscopic delayed + ! production xs end type MaterialMacroXS contains diff --git a/src/cross_section.F90 b/src/cross_section.F90 index e64362f03d..463ef6e577 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -4,7 +4,7 @@ module cross_section use constants use energy_grid, only: grid_method, log_spacing use error, only: fatal_error - use fission, only: nu_total, nu_delayed + use fission, only: nu_total, nu_delayed, yield_delayed use global use list_header, only: ListElemInt use material_header, only: Material @@ -33,9 +33,12 @@ contains integer :: i_nuclide ! index into nuclides array integer :: i_sab ! index into sab_tables array integer :: j ! index in mat % i_sab_nuclides + integer :: d ! index for delayed precursor groups real(8) :: atom_density ! atom density of a nuclide + real(8) :: yield ! delayed neutron yield logical :: check_sab ! should we check for S(a,b) table? type(Material), pointer :: mat ! current material + type(Nuclide), pointer :: nuc ! current nuclide ! Set all material macroscopic cross sections to zero material_xs % total = ZERO @@ -44,7 +47,10 @@ contains material_xs % fission = ZERO material_xs % nu_fission = ZERO material_xs % kappa_fission = ZERO - material_xs % delayed_nu_fission = ZERO + + do d = 1, MAX_DELAYED_GROUPS + material_xs % delayed_nu_fission(d) = ZERO + end do ! Exit subroutine if material is void if (p % material == MATERIAL_VOID) return @@ -63,6 +69,7 @@ contains ! Add contribution from each nuclide in material do i = 1, mat % n_nuclides + ! ======================================================================== ! CHECK FOR S(A,B) TABLE @@ -92,6 +99,7 @@ contains ! Determine microscopic cross sections for this nuclide i_nuclide = mat % nuclide(i) + nuc => nuclides(i_nuclide) ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E) then @@ -132,8 +140,12 @@ contains ! Add contributions to material macroscopic delayed-nu-fission cross ! section - material_xs % delayed_nu_fission = material_xs % delayed_nu_fission + & - atom_density * micro_xs(i_nuclide) % delayed_nu_fission + do d = 1, nuclides(i_nuclide) % n_precursor + yield = yield_delayed(nuc, p % E, d) + material_xs % delayed_nu_fission(d) = & + material_xs % delayed_nu_fission(d) +& + atom_density * micro_xs(i_nuclide) % delayed_nu_fission * yield + end do end do end subroutine calculate_xs diff --git a/src/fission.F90 b/src/fission.F90 index 27143bf386..461fa7d26d 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -63,7 +63,7 @@ contains ! since no prompt or delayed data is present, this means all neutron ! emission is prompt -- WARNING: This currently returns zero. The calling ! routine needs to know this situation is occurring since we don't want - ! to call nu_total unnecessarily if it's already been called + ! to call nu_total unnecessarily if it's already been called. nu = ZERO elseif (nuc % nu_p_type == NU_POLYNOMIAL) then ! determine number of coefficients @@ -94,6 +94,10 @@ contains real(8) :: nu ! number of delayed neutrons emitted per fission if (nuc % nu_d_type == NU_NONE) then + ! since no prompt or delayed data is present, this means all neutron + ! emission is prompt -- WARNING: This currently returns zero. The calling + ! routine needs to know this situation is occurring since we don't want + ! to call nu_delayed unnecessarily if it's already been called. nu = ZERO elseif (nuc % nu_d_type == NU_TABULAR) then ! use ENDF interpolation laws to determine nu @@ -102,4 +106,57 @@ contains end function nu_delayed +!=============================================================================== +! YIELD_DELAYED calculates the fractional yield of delayed neutrons emitted for +! a given nuclide and incoming neutron energy in a given delayed group. +!=============================================================================== + + function yield_delayed(nuc, E, g) result(yield) + + type(Nuclide), pointer :: nuc ! nuclide from which to find nu + real(8), intent(in) :: E ! energy of incoming neutron + real(8) :: yield ! delayed neutron precursor yield + integer :: g ! the delayed neutron precursor group + integer :: d ! precursor group + integer :: lc ! index before start of energies/nu values + integer :: NR ! number of interpolation regions + integer :: NE ! number of energies tabulated + + yield = ZERO + + if (g > nuc % n_precursor .or. g < 1) then + ! if the precursor group is outside the range of precursor groups for + ! the input nuclide, return ZERO. + yield = ZERO + else if (nuc % nu_d_type == NU_NONE) then + ! since no prompt or delayed data is present, this means all neutron + ! emission is prompt -- WARNING: This currently returns zero. The calling + ! routine needs to know this situation is occurring since we don't want + ! to call yield unnecessarily if it's already been called. + yield = ZERO + else if (nuc % nu_d_type == NU_TABULAR) then + + lc = 1 + + ! determine the yield for this group + do d = 1, nuc % n_precursor + + ! determine number of interpolation regions and energies + NR = int(nuc % nu_d_precursor_data(lc + 1)) + NE = int(nuc % nu_d_precursor_data(lc + 2 + 2*NR)) + + ! determine delayed neutron precursor yield for group d + yield = interpolate_tab1(nuc % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), E) + + ! Check if this group is the requested group + if (d == g) exit + + ! advance pointer + lc = lc + 2 + 2*NR + 2*NE + 1 + end do + end if + + end function yield_delayed + end module fission diff --git a/src/output.F90 b/src/output.F90 index d4b546a84f..6f6c44317f 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -983,7 +983,7 @@ contains score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment" score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment" score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" - score_names(abs(SCORE_DELAYED_NU_FISSION)) = "Delayed-Nu-fission Rate" + score_names(abs(SCORE_DELAYED_NU_FISSION)) = "Delayed-Nu-Fission Rate" ! Create filename for tally output filename = trim(path_output) // "tallies.out" diff --git a/src/state_point.F90 b/src/state_point.F90 index 64ba7ef55c..dc2710df99 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -326,6 +326,8 @@ contains str_array(j) = "fission" case (SCORE_NU_FISSION) str_array(j) = "nu-fission" + case (SCORE_DELAYED_NU_FISSION) + str_array(j) = "delayed-nu-fission" case (SCORE_KAPPA_FISSION) str_array(j) = "kappa-fission" case (SCORE_CURRENT) diff --git a/src/summary.F90 b/src/summary.F90 index b93bf120c6..b96bebeede 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -578,6 +578,8 @@ contains str_array(j) = "fission" case (SCORE_NU_FISSION) str_array(j) = "nu-fission" + case (SCORE_DELAYED_NU_FISSION) + str_array(j) = "delayed-nu-fission" case (SCORE_KAPPA_FISSION) str_array(j) = "kappa-fission" case (SCORE_CURRENT) diff --git a/src/tally.F90 b/src/tally.F90 index d1dc95f305..5f7c87023a 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -15,7 +15,7 @@ module tally use search, only: binary_search use string, only: to_str use tally_header, only: TallyResult, TallyMapItem, TallyMapElement - use fission, only: nu_total, nu_delayed + use fission, only: nu_total, nu_delayed, yield_delayed use interpolation, only: interpolate_tab1 #ifdef MPI @@ -55,10 +55,6 @@ contains integer :: i_energy ! index in nuclide energy grid integer :: score_bin ! scoring bin, e.g. SCORE_FLUX integer :: score_index ! scoring bin index - integer :: lc ! pointer for interpolating in precursor - ! yield table - integer :: NR ! number of interpolation regions - integer :: NE ! number of interpolation energies integer :: d ! delayed neutron index real(8) :: yield ! delayed neutron yield real(8) :: atom_density_ ! atom/b-cm @@ -69,6 +65,7 @@ contains real(8) :: uvw(3) ! particle direction type(Material), pointer :: mat type(Reaction), pointer :: rxn + type(Nuclide), pointer :: nuc i = 0 SCORE_LOOP: do q = 1, t % n_user_score_bins @@ -421,73 +418,95 @@ contains ! calculate fraction of absorptions that would have resulted in ! nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - !$omp critical - lc = 1 - do d = 1, nuclides(p % event_nuclide) % n_precursor + nuc => nuclides(p % event_nuclide) - ! determine number of interpolation regions and energies - NR = int(nuclides(p % event_nuclide) & - % nu_d_precursor_data(lc + 1)) - NE = int(nuclides(p % event_nuclide) & - % nu_d_precursor_data(lc + 2 + 2*NR)) + !$omp critical + do d = 1, nuclides(p % event_nuclide) % n_precursor - ! determine delayed neutron precursor yield for group d - yield = interpolate_tab1(nuclides(p % event_nuclide) & - % nu_d_precursor_data(lc+1:lc+2+2*NR+2*NE), p % E) + yield = yield_delayed(nuc, p % E, d) - ! advance pointer - lc = lc + 2 + 2*NR + 2*NE + 1 - - score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & - % delayed_nu_fission / micro_xs(p % event_nuclide) & - % absorption + score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & + % delayed_nu_fission / micro_xs(p % event_nuclide) & + % absorption + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then t % results(score_index, d) % value = & t % results(score_index, d) % value + score - end do - !$omp end critical - else - score = p % absorb_wgt * micro_xs(p % event_nuclide) % & - delayed_nu_fission / micro_xs(p % event_nuclide) % & - absorption - - t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score - end if - else - score = ZERO + else + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + end if + end do + !$omp end critical end if + + cycle SCORE_LOOP + else + ! Skip any non-fission events + if (.not. p % fission) cycle SCORE_LOOP + ! If there is no outgoing energy filter, than we only need to + ! score to one bin. For the score to be 'analog', we need to + ! score the number of particles that were banked in the fission + ! bank. Since this was weighted by 1/keff, we multiply by keff + ! to get the proper score. Loop over the neutrons produced from + ! fission and check which ones are delayed. If a delayed neutron is + ! encountered, add its contribution to the fission bank to the + ! score. - score = ZERO - - ! Loop over the neutrons produce from fission and check which - ! ones are delayed. If a delayed neutron is encountered, add - ! its contribution to the fission bank to the score. !$omp critical do d = 1, nuclides(p % event_nuclide) % n_precursor score = keff * p % wgt_bank / p % n_bank * p % n_delayed_bank(d) if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then t % results(score_index, d) % value = & - t % results(score_index, d) % value + score + t % results(score_index, d) % value + score else t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score + t % results(score_index, 1) % value + score end if end do !$omp end critical - cycle SCORE_LOOP - end if + cycle SCORE_LOOP + + end if else if (i_nuclide > 0) then - score = micro_xs(i_nuclide) % nu_fission * atom_density * flux + + nuc => nuclides(i_nuclide) + + do d = 1, nuclides(i_nuclide) % n_precursor + yield = yield_delayed(nuc, p % E, d) + score = micro_xs(i_nuclide) % delayed_nu_fission * yield & + * atom_density * flux + + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + else + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + end if + end do else - score = material_xs % nu_fission * flux + do d = 1, MAX_DELAYED_GROUPS + + score = material_xs % delayed_nu_fission(d) * flux + + if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then + t % results(score_index, d) % value = & + t % results(score_index, d) % value + score + else + t % results(score_index, 1) % value = & + t % results(score_index, 1) % value + score + end if + end do end if + + cycle SCORE_LOOP + end if case (SCORE_KAPPA_FISSION) From e16a3bd30d0383c6487420c5ccacb9c30b2005a8 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 3 Oct 2015 15:35:06 -0400 Subject: [PATCH 282/519] fixed syntax errors --- src/fission.F90 | 2 +- src/tally.F90 | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/fission.F90 b/src/fission.F90 index 461fa7d26d..5b5b05a588 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -147,7 +147,7 @@ contains ! determine delayed neutron precursor yield for group d yield = interpolate_tab1(nuc % nu_d_precursor_data( & - lc+1:lc+2+2*NR+2*NE), E) + lc+1:lc+2+2*NR+2*NE), E) ! Check if this group is the requested group if (d == g) exit diff --git a/src/tally.F90 b/src/tally.F90 index 5f7c87023a..1414f8c345 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -461,10 +461,10 @@ contains if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then t % results(score_index, d) % value = & - t % results(score_index, d) % value + score + t % results(score_index, d) % value + score else t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score + t % results(score_index, 1) % value + score end if end do !$omp end critical @@ -480,14 +480,14 @@ contains do d = 1, nuclides(i_nuclide) % n_precursor yield = yield_delayed(nuc, p % E, d) score = micro_xs(i_nuclide) % delayed_nu_fission * yield & - * atom_density * flux + * atom_density * flux if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then t % results(score_index, d) % value = & - t % results(score_index, d) % value + score + t % results(score_index, d) % value + score else t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score + t % results(score_index, 1) % value + score end if end do else @@ -497,10 +497,10 @@ contains if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then t % results(score_index, d) % value = & - t % results(score_index, d) % value + score + t % results(score_index, d) % value + score else t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score + t % results(score_index, 1) % value + score end if end do end if From e21e248a2d3d4494afc08b9ab4c643a0e14e4ef0 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 3 Oct 2015 15:45:29 -0400 Subject: [PATCH 283/519] removed unnecessary modification in cross_section.F90 --- src/cross_section.F90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 91752e26c7..d2885f1501 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -42,12 +42,12 @@ contains type(Nuclide), pointer :: nuc ! current nuclide ! Set all material macroscopic cross sections to zero - material_xs % total = ZERO - material_xs % elastic = ZERO - material_xs % absorption = ZERO - material_xs % fission = ZERO - material_xs % nu_fission = ZERO - material_xs % kappa_fission = ZERO + material_xs % total = ZERO + material_xs % elastic = ZERO + material_xs % absorption = ZERO + material_xs % fission = ZERO + material_xs % nu_fission = ZERO + material_xs % kappa_fission = ZERO do d = 1, MAX_DELAYED_GROUPS material_xs % delayed_nu_fission(d) = ZERO From e02a9114897532abd2e247f740719caac4a94cfa Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 3 Oct 2015 16:01:37 -0400 Subject: [PATCH 284/519] Fix PyAPI summary S(alpha,beta) bug Material needs to be instantiated before trying to add sab to it --- openmc/summary.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 2ae7464846..f3952f9b41 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -72,6 +72,9 @@ class Summary(object): nuc_densities = self._f['materials'][key]['nuclide_densities'][...] nuclides = self._f['materials'][key]['nuclides'].value + # Create the Material + material = openmc.Material(material_id=material_id, name=name) + # Read the names of the S(a,b) tables for this Material and add them if 'sab_names' in self._f['materials'][key]: sab_tables = self._f['materials'][key]['sab_names'].value @@ -79,10 +82,8 @@ class Summary(object): name, xs = sab_table.decode().split('.') material.add_s_alpha_beta(name, xs) - # Create the Material - material = openmc.Material(material_id=material_id, name=name) - - # Set the Material's density to g/cm3 - this is what is used in OpenMC + # Set the Material's density to g/cm3 - this is what is used in + # OpenMC material.set_density(density=density, units='g/cm3') # Add all nuclides to the Material From 1055bf56b52386f1995d217694202d34cb12ca3d Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 3 Oct 2015 16:43:03 -0400 Subject: [PATCH 285/519] added warning if delayedgroup filter is used with total nuclide tally --- src/input_xml.F90 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 4e037ae1dc..610db2b24f 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2562,6 +2562,21 @@ contains ! Check if total material was specified if (trim(sarray(j)) == 'total') then + + ! Check if a delayedgroup filter is present for this tally + do l = 1, t % n_filters + if (t % filters(l) % type == FILTER_DELAYEDGROUP) then + call warning("A delayedgroup filter was used on a total & + &nuclide tally. Cross section libraries are not & + &guaranteed to have the same delayed group structure & + &across all isotopes. In particular, ENDF/B-VII.1 does & + ¬ have a consistent delayed group structure across & + &all isotopes while the JEFF 3.1.1 library has the same & + &delayed group structure across all isotopes. Use with & + &caution!") + end if + end do + t % nuclide_bins(j) = -1 cycle end if From fa8bbfd43f4183bda869725d4d77812971c839af Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 4 Oct 2015 09:36:37 +0700 Subject: [PATCH 286/519] Make sure region specification gets written correctly in summary.h5 --- src/summary.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/summary.F90 b/src/summary.F90 index 56c31452b4..5a37eed8fb 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -188,7 +188,7 @@ contains region_spec = trim(region_spec) // " ~" case (OP_INTERSECTION) case (OP_UNION) - region_spec = trim(region_spec) // " ^" + region_spec = trim(region_spec) // " |" case default region_spec = trim(region_spec) // " " // to_str(& sign(surfaces(abs(k))%obj%id, k)) From b4a92883f246d0588f9b08fa443108ee8745dc2b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 4 Oct 2015 10:32:15 +0700 Subject: [PATCH 287/519] Allow run_tests.py to work even without MPI installed --- tests/run_tests.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/run_tests.py b/tests/run_tests.py index 70ea4c3dc9..338732c142 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -128,10 +128,8 @@ class Test(object): if self.mpi: if os.path.exists(os.path.join(MPI_DIR, 'bin', 'mpifort')): self.fc = os.path.join(MPI_DIR, 'bin', 'mpifort') - elif os.path.exists(os.path.join(MPI_DIR, 'bin', 'mpif90')): - self.fc = os.path.join(MPI_DIR, 'bin', 'mpif90') else: - raise RuntimeError('Cannot find an MPI Fortran compiler') + self.fc = os.path.join(MPI_DIR, 'bin', 'mpif90') else: self.fc = FC From 3327242acffe2847f6db8ae43fbc081f275ee001 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sat, 3 Oct 2015 23:53:06 -0400 Subject: [PATCH 288/519] Fix Python import in test_track_output --- tests/test_track_output/test_track_output.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_track_output/test_track_output.py b/tests/test_track_output/test_track_output.py index c19d39e0a6..9e9ce87adb 100644 --- a/tests/test_track_output/test_track_output.py +++ b/tests/test_track_output/test_track_output.py @@ -2,6 +2,7 @@ import glob import os +from subprocess import call import shutil import sys sys.path.insert(0, os.pardir) From a611b69500a4876d25c463fbf313a0ac9dc9ab86 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 4 Oct 2015 11:10:38 +0700 Subject: [PATCH 289/519] Add 'boxes' example input files --- examples/python/boxes/build-xml.py | 118 +++++++++++++++++++++++++++++ examples/xml/boxes/geometry.xml | 39 ++++++++++ examples/xml/boxes/materials.xml | 23 ++++++ examples/xml/boxes/settings.xml | 16 ++++ 4 files changed, 196 insertions(+) create mode 100644 examples/python/boxes/build-xml.py create mode 100644 examples/xml/boxes/geometry.xml create mode 100644 examples/xml/boxes/materials.xml create mode 100644 examples/xml/boxes/settings.xml diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py new file mode 100644 index 0000000000..fcbe242eee --- /dev/null +++ b/examples/python/boxes/build-xml.py @@ -0,0 +1,118 @@ +import openmc + +############################################################################### +# Simulation Input File Parameters +############################################################################### + +# OpenMC simulation parameters +batches = 15 +inactive = 5 +particles = 10000 + + +############################################################################### +# Exporting to OpenMC materials.xml File +############################################################################### + +# Instantiate some Nuclides +h1 = openmc.Nuclide('H-1') +o16 = openmc.Nuclide('O-16') +u235 = openmc.Nuclide('U-235') +u238 = openmc.Nuclide('U-238') + +# Instantiate some Materials and register the appropriate Nuclides +fuel1 = openmc.Material(material_id=1, name='fuel') +fuel1.set_density('g/cc', 4.5) +fuel1.add_nuclide(u235, 1.) + +fuel2 = openmc.Material(material_id=2, name='depleted fuel') +fuel2.set_density('g/cc', 4.5) +fuel2.add_nuclide(u238, 1.) + +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') + +# Instantiate a MaterialsFile, register all Materials, and export to XML +materials_file = openmc.MaterialsFile() +materials_file.default_xs = '71c' +materials_file.add_materials([fuel1, fuel2, moderator]) +materials_file.export_to_xml() + + +############################################################################### +# Exporting to OpenMC geometry.xml File +############################################################################### + +# Instantiate planar surfaces +x1 = openmc.XPlane(surface_id=1, x0=-10) +x2 = openmc.XPlane(surface_id=2, x0=-7) +x3 = openmc.XPlane(surface_id=3, x0=-4) +x4 = openmc.XPlane(surface_id=4, x0=4) +x5 = openmc.XPlane(surface_id=5, x0=7) +x6 = openmc.XPlane(surface_id=6, x0=10) +y1 = openmc.YPlane(surface_id=11, y0=-10) +y2 = openmc.YPlane(surface_id=12, y0=-7) +y3 = openmc.YPlane(surface_id=13, y0=-4) +y4 = openmc.YPlane(surface_id=14, y0=4) +y5 = openmc.YPlane(surface_id=15, y0=7) +y6 = openmc.YPlane(surface_id=16, y0=10) +z1 = openmc.ZPlane(surface_id=21, z0=-10) +z2 = openmc.ZPlane(surface_id=22, z0=-7) +z3 = openmc.ZPlane(surface_id=23, z0=-4) +z4 = openmc.ZPlane(surface_id=24, z0=4) +z5 = openmc.ZPlane(surface_id=25, z0=7) +z6 = openmc.ZPlane(surface_id=26, z0=10) + +# Set vacuum boundary conditions on outside +for surface in [x1, x6, y1, y6, z1, z6]: + surface.boundary_type = 'vacuum' + +# Instantiate Cells +inner_box = openmc.Cell(cell_id=1, name='inner box') +middle_box = openmc.Cell(cell_id=2, name='middle box') +outer_box = openmc.Cell(cell_id=3, name='outer box') + +# Use each set of six planes to create solid cube regions. We can then use these +# to create cubic shells. +inner_cube = +x3 & -x4 & +y3 & -y4 & +z3 & -z4 +middle_cube = +x2 & -x5 & +y2 & -y5 & +z2 & -z5 +outer_cube = +x1 & -x6 & +y1 & -y6 & +z1 & -z6 + +# Use surface half-spaces to define regions +inner_box.region = inner_cube +middle_box.region = middle_cube & ~inner_cube +outer_box.region = outer_cube & ~middle_cube + +# Register Materials with Cells +inner_box.fill = fuel1 +middle_box.fill = fuel2 +outer_box.fill = moderator + +# Instantiate root universe +root = openmc.Universe(universe_id=0, name='root universe') +root.add_cells([inner_box, middle_box, outer_box]) + +# Instantiate a Geometry and register the root Universe +geometry = openmc.Geometry() +geometry.root_universe = root + +# Instantiate a GeometryFile, register Geometry, and export to XML +geometry_file = openmc.GeometryFile() +geometry_file.geometry = geometry +geometry_file.export_to_xml() + + +############################################################################### +# Exporting to OpenMC settings.xml File +############################################################################### + +# Instantiate a SettingsFile, set all runtime parameters, and export to XML +settings_file = openmc.SettingsFile() +settings_file.batches = batches +settings_file.inactive = inactive +settings_file.particles = particles +settings_file.set_source_space('point', [0., 0., 0.]) +settings_file.export_to_xml() diff --git a/examples/xml/boxes/geometry.xml b/examples/xml/boxes/geometry.xml new file mode 100644 index 0000000000..29867f01ff --- /dev/null +++ b/examples/xml/boxes/geometry.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/boxes/materials.xml b/examples/xml/boxes/materials.xml new file mode 100644 index 0000000000..c6a591d2a4 --- /dev/null +++ b/examples/xml/boxes/materials.xml @@ -0,0 +1,23 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/boxes/settings.xml b/examples/xml/boxes/settings.xml new file mode 100644 index 0000000000..0ac26ec4d4 --- /dev/null +++ b/examples/xml/boxes/settings.xml @@ -0,0 +1,16 @@ + + + + + + 15 + 5 + 10000 + + + + + + + + From 4c2e0f5f82a3f19e65d3a18ed69a82af6f8c8f21 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 4 Oct 2015 21:47:52 +0700 Subject: [PATCH 290/519] Add examples in docstrings for Halfspace, Intersection, Union, and Complement --- openmc/region.py | 40 ++++++++++++++++++++++++++++++++++++++++ openmc/surface.py | 10 ++++++++++ 2 files changed, 50 insertions(+) diff --git a/openmc/region.py b/openmc/region.py index 24a21c3970..5baac22dd2 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -5,6 +5,15 @@ from openmc.checkvalue import check_type class Region(object): + """Region of space that can be assigned to a cell. + + Region is an abstract base class that is inherited by Halfspace, + Intersection, Union, and Complement. Each of those respective classes are + typically not instantiated directly but rather are created through operators + of the Surface and Region classes. + + """ + __metaclass__ = ABCMeta def __and__(self, other): @@ -178,6 +187,17 @@ class Region(object): class Intersection(Region): """Intersection of two or more regions. + Instances of Intersection are generally created via the __and__ operator + applied to two instances of Region. This is illustrated in the following + example: + + >>> equator = openmc.surface.ZPlane(z0=0.0) + >>> earth = openmc.surface.Sphere(R=637.1e6) + >>> northern_hemisphere = -earth & +equator + >>> southern_hemisphere = -earth & -equator + >>> type(northern_hemisphere) + + Parameters ---------- *nodes @@ -209,6 +229,14 @@ class Intersection(Region): class Union(Region): """Union of two or more regions. + Instances of Union are generally created via the __or__ operator applied to + two instances of Region. This is illustrated in the following example: + + >>> s1 = openmc.surface.ZPlane(z0=0.0) + >>> s2 = openmc.surface.Sphere(R=637.1e6) + >>> type(-s2 | +s1) + + Parameters ---------- *nodes @@ -240,6 +268,18 @@ class Union(Region): class Complement(Region): """Complement of a region. + The Complement of an existing Region can be created by using the __invert__ + operator as the following example demonstrates: + + >>> xl = openmc.surface.XPlane(x0=-10.0) + >>> xr = openmc.surface.XPlane(x0=10.0) + >>> yl = openmc.surface.YPlane(y0=-10.0) + >>> yr = openmc.surface.YPlane(y0=10.0) + >>> inside_box = +xl & -xr & +yl & -yl + >>> outside_box = ~inside_box + >>> type(outside_box) + + Parameters ---------- node : Region diff --git a/openmc/surface.py b/openmc/surface.py index 74f4fd7805..66376c2a0c 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -958,6 +958,16 @@ class Halfspace(Region): is referred to as the negative half-space and the region for which :math:`f(x,y,z) > 0` is referred to as the positive half-space. + Instances of Halfspace are generally not instantiated directly. Rather, they + can be created from an existing Surface through the __neg__ and __pos__ + operators, as the following example demonstrates: + + >>> sphere = openmc.surface.Sphere(surface_id=1, R=10.0) + >>> inside_sphere = -sphere + >>> outside_sphere = +sphere + >>> type(inside_sphere) + + Parameters ---------- surface : Surface From 55c599d21b949004164e486d327b0925082a51d5 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 4 Oct 2015 11:08:30 -0400 Subject: [PATCH 291/519] clean up delayed group tallies and added documentation --- docs/source/usersguide/input.rst | 24 +++- src/input_xml.F90 | 16 ++- src/tally.F90 | 211 ++++++++++++++++++++----------- 3 files changed, 167 insertions(+), 84 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index b4d153f184..85cbb8237e 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1213,8 +1213,8 @@ The ```` element accepts the following sub-elements: :type: The type of the filter. Accepted options are "cell", "cellborn", - "material", "universe", "energy", "energyout", "mesh", and - "distribcell". + "material", "universe", "energy", "energyout", "mesh", "distribcell", + and "delayedgroup". :bins: For each filter type, the corresponding ``bins`` entry is given as @@ -1262,7 +1262,13 @@ The ```` element accepts the following sub-elements: not accept more than one cell ID. It is not recommended to combine this filter with a cell or mesh filter. - :nuclides: + :delayedgroup: + A list of delayed neutron precursor groups for which the tally should + be accumulated. For instance, to tally to all 6 delayed groups in the + ENDF/B-VII.1 library the filter is specified as ````. + +:nuclides: If specified, the scores listed will be for particular nuclides, not the summation of reactions from all nuclides. The format for nuclides should be [Atomic symbol]-[Mass number], e.g. "U-235". The reaction rate for all @@ -1291,10 +1297,10 @@ The ```` element accepts the following sub-elements: :scores: A space-separated list of the desired responses to be accumulated. Accepted options are "flux", "total", "scatter", "absorption", "fission", - "nu-fission", "kappa-fission", "nu-scatter", "scatter-N", "scatter-PN", - "scatter-YN", "nu-scatter-N", "nu-scatter-PN", "nu-scatter-YN", "flux-YN", - "total-YN", "current", and "events". These corresponding to the following - physical quantities: + "nu-fission", "delayed-nu-fission", "kappa-fission", "nu-scatter", + "scatter-N", "scatter-PN", "scatter-YN", "nu-scatter-N", "nu-scatter-PN", + "nu-scatter-YN", "flux-YN", "total-YN", "current", and "events". These + corresponding to the following physical quantities: :flux: Total flux in particle-cm per source particle. Note: The ``analog`` @@ -1319,6 +1325,10 @@ The ```` element accepts the following sub-elements: Total production of neutrons due to fission. Units are neutrons produced per source neutron. + :delayed-nu-fission: + Total production of delayed neutrons due to fission. Units are neutrons produced + per source neutron. + :kappa-fission: The recoverable energy production rate due to fission. The recoverable energy is defined as the fission product kinetic energy, prompt and diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 610db2b24f..6cc41ad461 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2495,13 +2495,21 @@ contains t % filters(j) % type = FILTER_DELAYEDGROUP ! Set number of bins - t % filters(j) % n_bins = MAX_DELAYED_GROUPS + t % filters(j) % n_bins = n_words ! Allocate and store bins - allocate(t % filters(j) % int_bins(MAX_DELAYED_GROUPS)) + allocate(t % filters(j) % int_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % int_bins) - do d = 1, MAX_DELAYED_GROUPS - t % filters(j) % int_bins(d) = d + ! Check bins to make sure all are between 1 and MAX_DELAYED_GROUPS + do d = 1, n_words + if (t % filters(j) % int_bins(d) < 1 .or. & + t % filters(j) % int_bins(d) > MAX_DELAYED_GROUPS) then + call fatal_error("Encountered delayedgroup bin with index " & + &// trim(to_str(t % filters(j) % int_bins(d))) & + &//" that is outside the range of 1 to MAX_DELAYED_GROUPS"& + &// " (" // trim(to_str(MAX_DELAYED_GROUPS)) // ")") + end if end do case default diff --git a/src/tally.F90 b/src/tally.F90 index 1414f8c345..9a4b70ab84 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -56,6 +56,10 @@ contains integer :: score_bin ! scoring bin, e.g. SCORE_FLUX integer :: score_index ! scoring bin index integer :: d ! delayed neutron index + integer :: d_bin ! delayed group bin index + integer :: n_bins ! number of delayed group bins + integer :: i_filter ! filter index + integer :: dg_filter ! index of delayed group filter real(8) :: yield ! delayed neutron yield real(8) :: atom_density_ ! atom/b-cm real(8) :: f ! interpolation factor @@ -401,6 +405,15 @@ contains case (SCORE_DELAYED_NU_FISSION) + + ! Set the delayedgroup filter index and the number of delayed group bins + dg_filter = t % find_filter(FILTER_DELAYEDGROUP) + n_bins = 0 + + if (dg_filter > 0) then + n_bins = t % filters(dg_filter) % n_bins + end if + if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing .or. p % fission) then if (t % find_filter(FILTER_ENERGYOUT) > 0) then @@ -419,30 +432,27 @@ contains ! nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then - nuc => nuclides(p % event_nuclide) + ! Check if the delayed group filter is present + if (dg_filter > 0) then - !$omp critical - do d = 1, nuclides(p % event_nuclide) % n_precursor - - yield = yield_delayed(nuc, p % E, d) - - score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & + ! Loop over all delayed group bins and tally to them + ! individually + do d_bin = 1, n_bins + d = t % filters(dg_filter) % int_bins(d_bin) + nuc => nuclides(p % event_nuclide) + yield = yield_delayed(nuc, p % E, d) + score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & + % delayed_nu_fission / micro_xs(p % event_nuclide) & + % absorption + call score_fission_delayed_dg(t, d_bin, score, score_index) + end do + cycle SCORE_LOOP + else + score = p % absorb_wgt * micro_xs(p % event_nuclide) & % delayed_nu_fission / micro_xs(p % event_nuclide) & % absorption - - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - t % results(score_index, d) % value = & - t % results(score_index, d) % value + score - else - t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score - end if - end do - !$omp end critical + end if end if - - cycle SCORE_LOOP - else ! Skip any non-fission events if (.not. p % fission) cycle SCORE_LOOP @@ -455,60 +465,68 @@ contains ! encountered, add its contribution to the fission bank to the ! score. - !$omp critical - do d = 1, nuclides(p % event_nuclide) % n_precursor - score = keff * p % wgt_bank / p % n_bank * p % n_delayed_bank(d) - - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - t % results(score_index, d) % value = & - t % results(score_index, d) % value + score - else - t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score - end if - end do - !$omp end critical - - cycle SCORE_LOOP + ! Check if the delayed group filter is present + if (dg_filter > 0) then + ! Loop over all delayed group bins and tally to them individually + do d_bin = 1, t % filters(dg_filter) % n_bins + d = t % filters(dg_filter) % int_bins(d_bin) + score = keff * p % wgt_bank / p % n_bank * p % n_delayed_bank(d) + call score_fission_delayed_dg(t, d_bin, score, score_index) + end do + cycle SCORE_LOOP + else + score = ZERO + do d = 1, nuclides(p % event_nuclide) % n_precursor + score = score + keff * p % wgt_bank / p % n_bank * & + p % n_delayed_bank(d) + end do + end if end if else + + ! Check if material XS are present if (i_nuclide > 0) then - nuc => nuclides(i_nuclide) + ! Check if the delayed group filter is present + if (dg_filter > 0) then - do d = 1, nuclides(i_nuclide) % n_precursor - yield = yield_delayed(nuc, p % E, d) - score = micro_xs(i_nuclide) % delayed_nu_fission * yield & + ! Loop over all delayed group bins and tally to them individually + do d_bin = 1, t % filters(dg_filter) % n_bins + d = t % filters(dg_filter) % int_bins(d_bin) + nuc => nuclides(i_nuclide) + yield = yield_delayed(nuc, p % E, d) + score = micro_xs(i_nuclide) % delayed_nu_fission * yield & + * atom_density * flux + call score_fission_delayed_dg(t, d_bin, score, score_index) + end do + cycle SCORE_LOOP + else + score = micro_xs(i_nuclide) % delayed_nu_fission & * atom_density * flux - - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - t % results(score_index, d) % value = & - t % results(score_index, d) % value + score - else - t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score - end if - end do + end if else - do d = 1, MAX_DELAYED_GROUPS - score = material_xs % delayed_nu_fission(d) * flux + score = ZERO - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - t % results(score_index, d) % value = & - t % results(score_index, d) % value + score - else - t % results(score_index, 1) % value = & - t % results(score_index, 1) % value + score - end if - end do + ! Check if the delayed group filter is present + if (dg_filter > 0) then + ! Loop over all delayed group bins and tally to them individually + do d_bin = 1, t % filters(dg_filter) % n_bins + d = t % filters(dg_filter) % int_bins(d_bin) + score = score + material_xs % delayed_nu_fission(d) * flux + call score_fission_delayed_dg(t, d_bin, score, score_index) + end do + cycle SCORE_LOOP + else + do d = 1, MAX_DELAYED_GROUPS + score = score + material_xs % delayed_nu_fission(d) * flux + end do + end if end if - - cycle SCORE_LOOP - end if + case (SCORE_KAPPA_FISSION) if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing) then @@ -971,17 +989,23 @@ contains type(TallyObject), pointer :: t integer, intent(in) :: i_score ! index for score - integer :: j ! delayed group integer :: i ! index of outgoing energy filter + integer :: j ! index of delayedgroup filter + integer :: d ! delayed group + integer :: g ! another delayed group + integer :: d_bin = 1 ! delayed group bin index integer :: n ! number of energies on filter integer :: k ! loop index for bank sites integer :: bin_energyout ! original outgoing energy bin + integer :: bin_delayedgroup ! original delayedgroup bin integer :: i_filter ! index for matching filter bin combination real(8) :: score ! actual score real(8) :: E_out ! energy of fission bank site + logical :: d_found = .FALSE. ! bool to inidicate if delayed group was found - ! save original outgoing energy bin and score index + ! save original outgoing energy and delayed group bins i = t % find_filter(FILTER_ENERGYOUT) + j = t % find_filter(FILTER_DELAYEDGROUP) bin_energyout = matching_bins(i) ! Get number of energies on filter @@ -996,10 +1020,11 @@ contains do k = 1, p % n_bank ! get the delayed group - j = fission_bank(n_bank - p % n_bank + k) % delayed_group + g = fission_bank(n_bank - p % n_bank + k) % delayed_group + d_found = .FALSE. ! check if the particle was born delayed - if (j /= 0) then + if (g /= 0) then ! determine score based on bank site weight and keff score = keff * fission_bank(n_bank - p % n_bank + k) % wgt @@ -1011,24 +1036,64 @@ contains if (E_out < t % filters(i) % real_bins(1) .or. & E_out > t % filters(i) % real_bins(n)) cycle + ! check if delayed group is in delayed group bins + if (j > 0) then + do d_bin = 1, t % filters(j) % n_bins + d = t % filters(j) % int_bins(d_bin) + if (d == g) then + d_found = .TRUE. + exit + end if + end do + + ! if the delayedgroup filter is present and the delayed group is not + ! one of the delayedgroup bins, go to next particle in bank. + if (d_found .eqv. .FALSE.) cycle + end if + ! change outgoing energy bin matching_bins(i) = binary_search(t % filters(i) % real_bins, n, E_out) - ! determine scoring index - i_filter = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - - ! Add score to tally - !$omp atomic - t % results(i_score, i_filter) % value = & - t % results(i_score, i_filter) % value + score + call score_fission_delayed_dg(t, d_bin, score, i_score) end if end do - ! reset outgoing energy bin and score index + ! reset outgoing energy bin matching_bins(i) = bin_energyout end subroutine score_fission_delayed_eout +!=============================================================================== +! SCORE_FISSION_DELAYED_DG helper function used to increment the tally when a +! delayed group filter is present. +!=============================================================================== + + subroutine score_fission_delayed_dg(t, d_bin, score, score_index) + + type(TallyObject), pointer :: t + integer, intent(in) :: score_index ! index for score + integer, intent(in) :: d_bin ! delayed group bin index + + integer :: bin_original ! original bin index + integer :: filter_index ! index for matching filter bin combination + real(8) :: score ! actual score + + ! save original delayed group bin + bin_original = matching_bins(t % find_filter(FILTER_DELAYEDGROUP)) + matching_bins(t % find_filter(FILTER_DELAYEDGROUP)) = d_bin + + ! Compute the filter index based on the modified matching_bins + filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 + +!$omp atomic + t % results(score_index, filter_index) % value = & + t % results(score_index, filter_index) % value + score + + ! reset original delayed group bin + matching_bins(t % find_filter(FILTER_DELAYEDGROUP)) = bin_original + + end subroutine score_fission_delayed_dg + !=============================================================================== ! SCORE_TRACKLENGTH_TALLY calculates fluxes and reaction rates based on the ! track-length estimate of the flux. This is triggered at every event (surface From 6871d15447a8541eda01062dd37c90eadf928bbf Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 4 Oct 2015 16:20:10 -0400 Subject: [PATCH 292/519] Fix typo in #469 --- tests/input_set.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/input_set.py b/tests/input_set.py index 95cf07a142..0af9345d9a 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -435,14 +435,14 @@ class InputSet(object): c70.fill = hot_water fa_hw.add_cells((c70, )) - fa_cold = openmc.Universe(name='Fuel assemlby (cold)', universe_id=6) + fa_cold = openmc.Universe(name='Fuel assembly (cold)', universe_id=6) c60 = openmc.Cell(cell_id=60) c60.add_surface(s34, +1) c60.add_surface(s35, -1) c60.fill = l100 fa_cold.add_cells((c60, )) - fa_hot = openmc.Universe(name='Fuel assemlby (hot)', universe_id=8) + fa_hot = openmc.Universe(name='Fuel assembly (hot)', universe_id=8) c80 = openmc.Cell(cell_id=80) c80.add_surface(s35, +1) c80.add_surface(s36, -1) From 23535afa1c69644bb299bde18a094c3b99d53ae0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 4 Oct 2015 16:43:42 -0400 Subject: [PATCH 293/519] Made NuScatterXS tallies tracklength per comments from @nelsonag --- openmc/mgxs/mgxs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 85b08362a0..a41dcb5b26 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -331,7 +331,7 @@ class MultiGroupXS(object): ---------- scores : Iterable of str Scores for each tally - filters : Iterable of tuple of Filter + all_filters : Iterable of tuple of Filter Tuples of non-spatial domain filters for each tally keys : Iterable of str Key string used to store each tally in the tallies dictionary @@ -1459,7 +1459,7 @@ class NuScatterXS(MultiGroupXS): # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] - estimator = 'analog' + estimator = 'tracklength' keys = scores # Create the non-domain specific Filters for the Tallies From bb4608cf13ad8c1ecfd2c05614bd66210aeb2244 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 5 Oct 2015 07:32:48 +0700 Subject: [PATCH 294/519] Fix 'boxes' example to have complement and union --- examples/python/boxes/build-xml.py | 18 +++++++++++++++++- examples/xml/boxes/geometry.xml | 4 ++-- examples/xml/boxes/materials.xml | 2 +- examples/xml/boxes/plots.xml | 9 +++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 examples/xml/boxes/plots.xml diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py index fcbe242eee..4bac9fff4d 100644 --- a/examples/python/boxes/build-xml.py +++ b/examples/python/boxes/build-xml.py @@ -80,10 +80,11 @@ outer_box = openmc.Cell(cell_id=3, name='outer box') inner_cube = +x3 & -x4 & +y3 & -y4 & +z3 & -z4 middle_cube = +x2 & -x5 & +y2 & -y5 & +z2 & -z5 outer_cube = +x1 & -x6 & +y1 & -y6 & +z1 & -z6 +outside_inner_cube = -x3 | +x4 | -y3 | +y4 | -z3 | +z4 # Use surface half-spaces to define regions inner_box.region = inner_cube -middle_box.region = middle_cube & ~inner_cube +middle_box.region = middle_cube & outside_inner_cube outer_box.region = outer_cube & ~middle_cube # Register Materials with Cells @@ -116,3 +117,18 @@ settings_file.inactive = inactive settings_file.particles = particles settings_file.set_source_space('point', [0., 0., 0.]) settings_file.export_to_xml() + +############################################################################### +# Exporting to OpenMC plots.xml File +############################################################################### + +plot = openmc.Plot(plot_id=1) +plot.origin = [0, 0, 0] +plot.width = [20, 20] +plot.pixels = [200, 200] +plot.color = 'cell' + +# Instantiate a PlotsFile, add Plot, and export to XML +plot_file = openmc.PlotsFile() +plot_file.add_plot(plot) +plot_file.export_to_xml() diff --git a/examples/xml/boxes/geometry.xml b/examples/xml/boxes/geometry.xml index 29867f01ff..abe4924e66 100644 --- a/examples/xml/boxes/geometry.xml +++ b/examples/xml/boxes/geometry.xml @@ -31,9 +31,9 @@ - + - + diff --git a/examples/xml/boxes/materials.xml b/examples/xml/boxes/materials.xml index c6a591d2a4..6f6114a7da 100644 --- a/examples/xml/boxes/materials.xml +++ b/examples/xml/boxes/materials.xml @@ -15,8 +15,8 @@ - + diff --git a/examples/xml/boxes/plots.xml b/examples/xml/boxes/plots.xml new file mode 100644 index 0000000000..b7a3093d25 --- /dev/null +++ b/examples/xml/boxes/plots.xml @@ -0,0 +1,9 @@ + + + + cell + 0. 0. 0. + 20. 20. + 200 200 + + From cfb17517eb3d3fefa2edced5529c15f7455e3800 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 5 Oct 2015 07:45:55 +0700 Subject: [PATCH 295/519] Overload __invert__ for Halfspace (return opposite Halfspace) --- openmc/surface.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openmc/surface.py b/openmc/surface.py index 66376c2a0c..afa426fa3b 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -988,6 +988,9 @@ class Halfspace(Region): self.surface = surface self.side = side + def __invert__(self): + return -self.surface if self.side == '+' else +self.surface + @property def surface(self): return self._surface From 1ad6602b5c5f331a2d8d30d28f7df4c87ba5cf86 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 5 Oct 2015 08:25:39 +0700 Subject: [PATCH 296/519] Convert input_set to use region property and fix error in cell 2 --- tests/input_set.py | 98 ++++++------------- tests/test_filter_cell/inputs_true.dat | 2 +- tests/test_filter_cellborn/inputs_true.dat | 2 +- tests/test_filter_energy/inputs_true.dat | 2 +- tests/test_filter_energyout/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- tests/test_filter_material/inputs_true.dat | 2 +- tests/test_filter_universe/inputs_true.dat | 2 +- tests/test_score_MT/inputs_true.dat | 2 +- tests/test_score_absorption/inputs_true.dat | 2 +- tests/test_score_events/inputs_true.dat | 2 +- tests/test_score_fission/inputs_true.dat | 2 +- tests/test_score_flux/inputs_true.dat | 2 +- tests/test_score_flux_yn/inputs_true.dat | 2 +- tests/test_score_kappafission/inputs_true.dat | 2 +- tests/test_score_nufission/inputs_true.dat | 2 +- tests/test_score_nuscatter/inputs_true.dat | 2 +- tests/test_score_nuscatter_n/inputs_true.dat | 2 +- tests/test_score_nuscatter_pn/inputs_true.dat | 2 +- tests/test_score_nuscatter_yn/inputs_true.dat | 2 +- tests/test_score_scatter/inputs_true.dat | 2 +- tests/test_score_scatter_n/inputs_true.dat | 2 +- tests/test_score_scatter_pn/inputs_true.dat | 2 +- tests/test_score_scatter_yn/inputs_true.dat | 2 +- tests/test_score_total/inputs_true.dat | 2 +- tests/test_score_total_yn/inputs_true.dat | 2 +- tests/test_score_total_yn/results_true.dat | 2 +- 27 files changed, 56 insertions(+), 94 deletions(-) diff --git a/tests/input_set.py b/tests/input_set.py index 0af9345d9a..87b857f4a9 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -296,56 +296,52 @@ class InputSet(object): fuel_cold = openmc.Universe(name='Fuel pin, cladding, cold water', universe_id=1) c21 = openmc.Cell(cell_id=21) - c21.add_surface(s1, -1) + c21.region = -s1 c21.fill = fuel c22 = openmc.Cell(cell_id=22) - c22.add_surface(s1, +1) - c22.add_surface(s2, -1) + c22.region = +s1 & -s2 c22.fill = clad c23 = openmc.Cell(cell_id=23) - c23.add_surface(s2, +1) + c23.region = +s2 c23.fill = cold_water fuel_cold.add_cells((c21, c22, c23)) tube_cold = openmc.Universe(name='Instrumentation guide tube, ' 'cold water', universe_id=2) c24 = openmc.Cell(cell_id=24) - c24.add_surface(s3, -1) + c24.region = -s3 c24.fill = cold_water c25 = openmc.Cell(cell_id=25) - c25.add_surface(s3, +1) - c25.add_surface(s4, -1) + c25.region = +s3 & -s4 c25.fill = clad c26 = openmc.Cell(cell_id=26) - c26.add_surface(s4, +1) + c26.region = +s4 c26.fill = cold_water tube_cold.add_cells((c24, c25, c26)) fuel_hot = openmc.Universe(name='Fuel pin, cladding, hot water', universe_id=3) c27 = openmc.Cell(cell_id=27) - c27.add_surface(s1, -1) + c27.region = -s1 c27.fill = fuel c28 = openmc.Cell(cell_id=28) - c28.add_surface(s1, +1) - c28.add_surface(s2, -1) + c28.region = +s1 & -s2 c28.fill = clad c29 = openmc.Cell(cell_id=29) - c29.add_surface(s2, +1) + c29.region = +s2 c29.fill = hot_water fuel_hot.add_cells((c27, c28, c29)) tube_hot = openmc.Universe(name='Instrumentation guide tube, hot water', universe_id=4) c30 = openmc.Cell(cell_id=30) - c30.add_surface(s3, -1) + c30.region = -s3 c30.fill = hot_water c31 = openmc.Cell(cell_id=31) - c31.add_surface(s3, +1) - c31.add_surface(s4, -1) + c31.region = +s3 & -s4 c31.fill = clad c32 = openmc.Cell(cell_id=32) - c32.add_surface(s4, +1) + c32.region = +s4 c32.fill = hot_water tube_hot.add_cells((c30, c31, c32)) @@ -419,33 +415,27 @@ class InputSet(object): [fuel_hot]*17 ] # Define assemblies. - fa_cw = openmc.Universe(name='Water assembly (cold)', - universe_id=5) + fa_cw = openmc.Universe(name='Water assembly (cold)', universe_id=5) c50 = openmc.Cell(cell_id=50) - c50.add_surface(s34, +1) - c50.add_surface(s35, -1) + c50.region = +s34 & -s35 c50.fill = cold_water fa_cw.add_cells((c50, )) - fa_hw = openmc.Universe(name='Water assembly (hot)', - universe_id=7) + fa_hw = openmc.Universe(name='Water assembly (hot)', universe_id=7) c70 = openmc.Cell(cell_id=70) - c70.add_surface(s35, +1) - c70.add_surface(s36, -1) + c70.region = +s35 & -s36 c70.fill = hot_water fa_hw.add_cells((c70, )) fa_cold = openmc.Universe(name='Fuel assembly (cold)', universe_id=6) c60 = openmc.Cell(cell_id=60) - c60.add_surface(s34, +1) - c60.add_surface(s35, -1) + c60.region = +s34 & -s35 c60.fill = l100 fa_cold.add_cells((c60, )) fa_hot = openmc.Universe(name='Fuel assembly (hot)', universe_id=8) c80 = openmc.Cell(cell_id=80) - c80.add_surface(s35, +1) - c80.add_surface(s36, -1) + c80.region = +s35 & -s36 c80.fill = l101 fa_hot.add_cells((c80, )) @@ -509,79 +499,51 @@ class InputSet(object): # Define root universe. root = openmc.Universe(universe_id=0, name='root universe') c1 = openmc.Cell(cell_id=1) - c1.add_surface(s6, -1) - c1.add_surface(s34, +1) - c1.add_surface(s35, -1) + c1.region = -s6 & +s34 & -s35 c1.fill = l200 c2 = openmc.Cell(cell_id=2) - c2.add_surface(s6, -1) - c1.add_surface(s35, +1) - c2.add_surface(s36, -1) + c2.region = -s6 & +s35 & -s36 c2.fill = l201 c3 = openmc.Cell(cell_id=3) - c3.add_surface(s7, -1) - c3.add_surface(s31, +1) - c3.add_surface(s32, -1) + c3.region = -s7 & +s31 & -s32 c3.fill = bot_plate c4 = openmc.Cell(cell_id=4) - c4.add_surface(s5, -1) - c4.add_surface(s32, +1) - c4.add_surface(s33, -1) + c4.region = -s5 & +s32 & -s33 c4.fill = bot_nozzle c5 = openmc.Cell(cell_id=5) - c5.add_surface(s5, -1) - c5.add_surface(s33, +1) - c5.add_surface(s34, -1) + c5.region = -s5 & +s33 & -s34 c5.fill = bot_fa c6 = openmc.Cell(cell_id=6) - c6.add_surface(s5, -1) - c6.add_surface(s36, +1) - c6.add_surface(s37, -1) + c6.region = -s5 & +s36 & -s37 c6.fill = top_fa c7 = openmc.Cell(cell_id=7) - c7.add_surface(s5, -1) - c7.add_surface(s37, +1) - c7.add_surface(s38, -1) + c7.region = -s5 & +s37 & -s38 c7.fill = top_nozzle c8 = openmc.Cell(cell_id=8) - c8.add_surface(s7, -1) - c8.add_surface(s38, +1) - c8.add_surface(s39, -1) + c8.region = -s7 & +s38 & -s39 c8.fill = upper_rad_ref c9 = openmc.Cell(cell_id=9) - c9.add_surface(s6, +1) - c9.add_surface(s7, -1) - c9.add_surface(s32, +1) - c9.add_surface(s38, -1) + c9.region = +s6 & -s7 & +s32 & -s38 c9.fill = bot_nozzle c10 = openmc.Cell(cell_id=10) - c10.add_surface(s7, +1) - c10.add_surface(s8, -1) - c10.add_surface(s31, +1) - c10.add_surface(s39, -1) + c10.region = +s7 & -s8 & +s31 & -s39 c10.fill = rpv_steel c11 = openmc.Cell(cell_id=11) - c11.add_surface(s5, +1) - c11.add_surface(s6, -1) - c11.add_surface(s32, +1) - c11.add_surface(s34, -1) + c11.region = +s5 & -s6 & +s32 & -s34 c11.fill = lower_rad_ref c12 = openmc.Cell(cell_id=12) - c12.add_surface(s5, +1) - c12.add_surface(s6, -1) - c12.add_surface(s36, +1) - c12.add_surface(s38, -1) + c12.region = +s5 & -s6 & +s36 & -s38 c12.fill = upper_rad_ref root.add_cells((c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)) diff --git a/tests/test_filter_cell/inputs_true.dat b/tests/test_filter_cell/inputs_true.dat index 7cf1c07c2f..2320ff6ab4 100644 --- a/tests/test_filter_cell/inputs_true.dat +++ b/tests/test_filter_cell/inputs_true.dat @@ -1 +1 @@ -3b06e27fa039762b59076bb9431ef003e69ef32f8d01bcf908fe85f59bf7127bd8b94bf2f895b1b63e9fcdbd97aeaf4b02bc02e7bd029bfd85263c68498ce562 \ No newline at end of file +caae173f01f7073d634a68a5c4ce97177423e13596a863976e1c40303dc8c05afed457d5a1aa0ae73627ec953143e4f9c1f45bdbd3b0cca76433062467d59777 \ No newline at end of file diff --git a/tests/test_filter_cellborn/inputs_true.dat b/tests/test_filter_cellborn/inputs_true.dat index 3379e4b26a..5aef4cbb06 100644 --- a/tests/test_filter_cellborn/inputs_true.dat +++ b/tests/test_filter_cellborn/inputs_true.dat @@ -1 +1 @@ -6dd7d019587330bbf9c19bae7ad1d888331858b68bd77218315d5fa7b85df7fb97cb208daed584a780592cf9840e67ea3777ccbde502f3861798aac95722be9c \ No newline at end of file +2f24eb86cda981982a8db5bb110c72e9cef542c06e15b748c1c7e459f96b0d8ba0978b51dffc006e813cd2e2ae1fa0357336f8322ae263189841afde01f0327b \ No newline at end of file diff --git a/tests/test_filter_energy/inputs_true.dat b/tests/test_filter_energy/inputs_true.dat index 58da3ba3e0..b120e9fd62 100644 --- a/tests/test_filter_energy/inputs_true.dat +++ b/tests/test_filter_energy/inputs_true.dat @@ -1 +1 @@ -bc9f43ff6368da544942b93ecfb2561911071c44524e35608fcb92c1262fe5543e09525414a87cd647fbc50113d64ff867730e5f4391f31b096abd7a0543b474 \ No newline at end of file +49835200052ee1a4c9583a7bb4e9430de7d01a6d7a8d4f63ae37be9bbac4fd8c7ed9135ecbc4ab4cb075fd4d77b322265783463dd07c127decceee8c9fe25bfd \ No newline at end of file diff --git a/tests/test_filter_energyout/inputs_true.dat b/tests/test_filter_energyout/inputs_true.dat index 4cfce0b49d..7096648e6c 100644 --- a/tests/test_filter_energyout/inputs_true.dat +++ b/tests/test_filter_energyout/inputs_true.dat @@ -1 +1 @@ -74c55768b2b0f5696d5bff9d36a3639c6d858bf2984d799c8b46908b897af11e691b1f9f05646d52fcee046de3bfee11e35b9b379b2967abb0922f60168017b7 \ No newline at end of file +183b4a06cbd0930cfa4f28d0c385cf3ae93ab97c171580c2ba9eec0e4b716102ad83f510d62258ef6769c446e72e1d5ba9f630b171ee239ec04c9bbd1e56742e \ No newline at end of file diff --git a/tests/test_filter_group_transfer/inputs_true.dat b/tests/test_filter_group_transfer/inputs_true.dat index f98d11bd2b..813bb43c18 100644 --- a/tests/test_filter_group_transfer/inputs_true.dat +++ b/tests/test_filter_group_transfer/inputs_true.dat @@ -1 +1 @@ -dd69e0768aa7a4e28efd20adc6a607337c9a15682fa307b1aa2459595f90a523f1fa6e4e4f6db1d74e52a2287ef4efa85d77b1751cd1a2d2e6618385cf7f4607 \ No newline at end of file +461a6a4ec3b0b6dc7199c09fa8f527e51cc7a1ea4281a708f8b7bcdbb12f7162027928dfcef68a24eaf6c06037a68e151df9aac9eac6ce56617466f2f5270b71 \ No newline at end of file diff --git a/tests/test_filter_material/inputs_true.dat b/tests/test_filter_material/inputs_true.dat index 0610b45c44..aaa4a4939f 100644 --- a/tests/test_filter_material/inputs_true.dat +++ b/tests/test_filter_material/inputs_true.dat @@ -1 +1 @@ -91dd096441a7f01689ed605b7b3322c63a90c4802d73450acd825b715a8163fc892b4971e4b8b0d5a179eb51ad22bcc886f3935e7ab734d0fedebaf679415816 \ No newline at end of file +2fbd0986abff08126680925284929cf67bdad0cd564775197b78065ce3b0e6ad8094f5ca4d14ea69347db69a6cdcc9796a095178ae9b14a927b101f32f3cd0ec \ No newline at end of file diff --git a/tests/test_filter_universe/inputs_true.dat b/tests/test_filter_universe/inputs_true.dat index cf1c7db55b..7cda1ab848 100644 --- a/tests/test_filter_universe/inputs_true.dat +++ b/tests/test_filter_universe/inputs_true.dat @@ -1 +1 @@ -f3dc4c28827ca9035d2d1a39f4adef794f0e27b8c95776485e419b9610aefc6c268e6a1d5889d8170ec9400fc3a4a52bc69cd94e5056078aee7405e0bc62bad5 \ No newline at end of file +51fcaf0aa527d1fd1022e5f312d4d25cd9bacc5fc9792d9f7702ee97cac43700a31f25be767a2cff769c37b5e1cdf3f922467977a9958fa34561e2a102bf8537 \ No newline at end of file diff --git a/tests/test_score_MT/inputs_true.dat b/tests/test_score_MT/inputs_true.dat index 7b56862ea3..3789a69cba 100644 --- a/tests/test_score_MT/inputs_true.dat +++ b/tests/test_score_MT/inputs_true.dat @@ -1 +1 @@ -6ba3ebe9d50584343b012b7a935a0f75b8366659600d4de050a8e4e48405f8da36682e8ab5f495f69b646fc72e176755c0a3540f235806c73d5ebc4fc67db107 \ No newline at end of file +63295b9d510370e65e63a3db627d47d286f5479e53c8eabeda9a5cb25ffe35becb636835aadad11691e34c23292fe11b5f688daee76d76ceac4b5dfd2f9ede4c \ No newline at end of file diff --git a/tests/test_score_absorption/inputs_true.dat b/tests/test_score_absorption/inputs_true.dat index ad2d1f40ea..c4c133600a 100644 --- a/tests/test_score_absorption/inputs_true.dat +++ b/tests/test_score_absorption/inputs_true.dat @@ -1 +1 @@ -a2be808e033014c9d748a0ec503ab6ad498f6b70250c8136bfcb9dc8f5580e69fc0bc1c6acab428c139edf64f51237ba07495b0275a19f509bf3bd20fa298e4e \ No newline at end of file +482760c362f56e453ce4b466083e77f84a461e636330d7cc2cb1cf7facced678a57a7c785ff9d039b3f575396cb435f99df05d6fa207f553c28ed3ce4f8151b3 \ No newline at end of file diff --git a/tests/test_score_events/inputs_true.dat b/tests/test_score_events/inputs_true.dat index 1d2c8447cd..bb0fef8e5d 100644 --- a/tests/test_score_events/inputs_true.dat +++ b/tests/test_score_events/inputs_true.dat @@ -1 +1 @@ -493830fe4598d5a2e31d4b79aceb79390bfa0bd7e08681ef36d5978a72de3cd7bcdbc06147061664614ed8e069be82d01e880e8e8cb629d3bd7aa1223850c8e6 \ No newline at end of file +a97ae7049ac8c30b838987a3e87cbe5ff70b004ee0434e6204931def46c4c099bfef06e74658dab1114cc1035d3f404211a9bc94ef96e9cfb5b788da39d17bbd \ No newline at end of file diff --git a/tests/test_score_fission/inputs_true.dat b/tests/test_score_fission/inputs_true.dat index 0abc63556a..d90ca274ee 100644 --- a/tests/test_score_fission/inputs_true.dat +++ b/tests/test_score_fission/inputs_true.dat @@ -1 +1 @@ -e94e6338c6aadaebd6f3cdad768b53908e470dc6d650a170703b21bf0140313559ce2af78f6b8bd13498dc5019ce02603ec6ba7c68731dfa05ca4a540f159625 \ No newline at end of file +5a0461d03b0d9653ee35fded4be23e9b8316e3b7e21d352f822bc1f9763c03e9edab922bdc431f30d2a647c4216d45deba396bf56203027a328b7b28d970e0b8 \ No newline at end of file diff --git a/tests/test_score_flux/inputs_true.dat b/tests/test_score_flux/inputs_true.dat index fe2b65dfe1..2e7358c49e 100644 --- a/tests/test_score_flux/inputs_true.dat +++ b/tests/test_score_flux/inputs_true.dat @@ -1 +1 @@ -23454cbb568dd5f8569f228b3d0e6d180144279005521ad009d6a99384db79330b274edc431133f5e304a6750bef2b85bfc5af46258a75ce3f0673dd0ec0c54c \ No newline at end of file +33b7b97f55a337d7001e7927517db6d36d512efec01fa5512c80bbc76b0b581f691a72a3810251aa97491b8cdf25a8ddcc9c9b3e3f54ccc6c315a84e715567d3 \ No newline at end of file diff --git a/tests/test_score_flux_yn/inputs_true.dat b/tests/test_score_flux_yn/inputs_true.dat index 9b9313a6ab..c7a1a1b52e 100644 --- a/tests/test_score_flux_yn/inputs_true.dat +++ b/tests/test_score_flux_yn/inputs_true.dat @@ -1 +1 @@ -977c9d76d335d79fa561f9eab8a575a118f900818759b96b6fbdbf8d06a012a44d5892bbb22292f9b730745d86859ffcba6b16b59096eff587fca2a5d6629cf5 \ No newline at end of file +b1a63345fc721f87c8fc25babb06741b585ee5dff5f29bb6debfbabb2ad57cb762d98c14e544df998a27bc725fb2704092fcdde54315ff832dff96c3641551d0 \ No newline at end of file diff --git a/tests/test_score_kappafission/inputs_true.dat b/tests/test_score_kappafission/inputs_true.dat index 86939274b8..ecb42ddb46 100644 --- a/tests/test_score_kappafission/inputs_true.dat +++ b/tests/test_score_kappafission/inputs_true.dat @@ -1 +1 @@ -8dd415b571ad51a62f2394d149f6c417d63babd4e85a1ff6f1cac267c4f4bcd0642ba0b24da39ff926bee4aea7dbbe0371face03d2009d8d74e7ac31c7c45000 \ No newline at end of file +57e4aa7550789aec0fcbc4a8917e9d28b1f1ae098a09cde95b757fd87d0dd3924c1bb9d4b23c59cd3793446fb6bbc8af4e1bb46323d70d5e5acd13db1167f545 \ No newline at end of file diff --git a/tests/test_score_nufission/inputs_true.dat b/tests/test_score_nufission/inputs_true.dat index 4e6018f99c..52f7765fa7 100644 --- a/tests/test_score_nufission/inputs_true.dat +++ b/tests/test_score_nufission/inputs_true.dat @@ -1 +1 @@ -0e60125f41bbc362703886097b2bc7297ff0aae6365d4653771b86b1aab2de43a924d81b3d73afb781733b2919f30089373f74da4a96f94f988eb04ddf482e85 \ No newline at end of file +a42b2e165f59d3f499865d5db1e7db9b4cb25e48290f94080e569a9efc0b437d75cbb5773ac564f6cc95b19521fb7bc97a3eb641b491828c90cd086dc0c06a4b \ No newline at end of file diff --git a/tests/test_score_nuscatter/inputs_true.dat b/tests/test_score_nuscatter/inputs_true.dat index 6ae99b4a17..80840f900d 100644 --- a/tests/test_score_nuscatter/inputs_true.dat +++ b/tests/test_score_nuscatter/inputs_true.dat @@ -1 +1 @@ -c74fb5e4e8caecd11642231b55cb9442264da220329fd6a1c9959214342acd5efb4ef23368b0b018f0388a6102bce65226f6161d32f3613128d8c3762a3f6f9e \ No newline at end of file +764d3ba6b1bc86b462d44151242bd18fa5f0200b831bb7537cf881b728622799eb95a457f88a503487bfd30095c1fa995818d50a6bc41dd182009772c010e82b \ No newline at end of file diff --git a/tests/test_score_nuscatter_n/inputs_true.dat b/tests/test_score_nuscatter_n/inputs_true.dat index c7924a247a..c63f891d26 100644 --- a/tests/test_score_nuscatter_n/inputs_true.dat +++ b/tests/test_score_nuscatter_n/inputs_true.dat @@ -1 +1 @@ -c184ef2764fa23db32253ec4c23d36cf842f173a0a57c93cb165faf771f2ff23346756160ba5793c558448283eb0917d23e3871753ea2b7e3e24f14d6cf4179f \ No newline at end of file +17541e365f35ebd25134465a02d9a66e46536c4e3f5769da62137ec94ee7c8fb46ef38b9039aa6430261329a4e1b0ce677174323563e5be2f1368dc0c552e312 \ No newline at end of file diff --git a/tests/test_score_nuscatter_pn/inputs_true.dat b/tests/test_score_nuscatter_pn/inputs_true.dat index 30a894dafb..ef53ee8f65 100644 --- a/tests/test_score_nuscatter_pn/inputs_true.dat +++ b/tests/test_score_nuscatter_pn/inputs_true.dat @@ -1 +1 @@ -79d74ffe32f564b83bdde94048f57233454881f3b55413e9b5e30ce4b9813ff6436dca98d691d941d5f31947f2215dcb656369c2b32e6240e1424e6aad96395e \ No newline at end of file +8ae1b048b90a049d9ed42336a0a2e8f7a250a14d889cc15e0c2831ed71617a78b92570480a15f936f2dd623c75f55693e38c69041c3cae24aba082409b51bc9f \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/inputs_true.dat b/tests/test_score_nuscatter_yn/inputs_true.dat index 9a8a934b17..632a144031 100644 --- a/tests/test_score_nuscatter_yn/inputs_true.dat +++ b/tests/test_score_nuscatter_yn/inputs_true.dat @@ -1 +1 @@ -fd7b5b66e5d5e705da488651445d75240b05dcc1d243b2d2e8b8a729c8220221cdfa1eccfeca30897a006caaceae3e8c7449392b5027b290cb388b33e86ff2a3 \ No newline at end of file +205e5cac8129797b815f0e79dad6c41a1876157ba69fcffecf67c3603dc36ded5f0168f9961d51fcb7dc7db6d732e7a3e8f82d04947aa0309df56bb8333d4bc9 \ No newline at end of file diff --git a/tests/test_score_scatter/inputs_true.dat b/tests/test_score_scatter/inputs_true.dat index d7a6f4719a..35557cd3c5 100644 --- a/tests/test_score_scatter/inputs_true.dat +++ b/tests/test_score_scatter/inputs_true.dat @@ -1 +1 @@ -8b5e7c3825ef033d12c0574595b16559981ed3dd0ced8609c461cd0e81f1f2ef28195e0a6f6886fcbae64185dfe96001fa12d3d472f6446a3135d3bd6ef83394 \ No newline at end of file +b5baba05419ce120bd22d935af9cdd6d206ad5dc5cae5991a9d160c70bb029f2d87040fa4e19f7190de64b908ac6a41a8b28db4a4f3883ec16e529b1449e983d \ No newline at end of file diff --git a/tests/test_score_scatter_n/inputs_true.dat b/tests/test_score_scatter_n/inputs_true.dat index 68febf4bc5..e6e3a395bd 100644 --- a/tests/test_score_scatter_n/inputs_true.dat +++ b/tests/test_score_scatter_n/inputs_true.dat @@ -1 +1 @@ -414d0faeba75d27e4785faa9812f5eac6aa108e7fd3c1388d51ae8e0d7fddd25e9f61e51afdaa70874a32e1c3d2815d82b5c79636b1ccb0d6767144fcf6f813a \ No newline at end of file +a153add0502ff0fd4b0670f01679e104be1bb05941e73fb35e426c7f1e41a6144c7eb81fdba0d62ea3f39c7c6798028ff6d5df8c7a50b3e3f9e9bfe72fd48c2f \ No newline at end of file diff --git a/tests/test_score_scatter_pn/inputs_true.dat b/tests/test_score_scatter_pn/inputs_true.dat index 53b1d21608..3878939c50 100644 --- a/tests/test_score_scatter_pn/inputs_true.dat +++ b/tests/test_score_scatter_pn/inputs_true.dat @@ -1 +1 @@ -f83e5a272e78dba7a4b3412aa264300efbeae641de0bbcae3febe7ba5fa6668dbf9364fdc7f1c431ab9c58aaf019ae41d98ee69d4dd035d6b5e0188e7d181b20 \ No newline at end of file +fe56d58827d1803c1a49391711ad682be4a7cbc51519248812554f66e3e46266edc179f4254291a5f455751d3cdc13a17bbd103b9810c8818f36e4d283b503be \ No newline at end of file diff --git a/tests/test_score_scatter_yn/inputs_true.dat b/tests/test_score_scatter_yn/inputs_true.dat index 6e5210212e..1ae9f6047d 100644 --- a/tests/test_score_scatter_yn/inputs_true.dat +++ b/tests/test_score_scatter_yn/inputs_true.dat @@ -1 +1 @@ -c90d836355fcbe14112c16f8743b9180371400c022b19f693881d91924788555ed1507a1936b4d241a63564a7661f380c5d0568d398fa8a20a25f41c5b7c4fb8 \ No newline at end of file +d80a9e8befab978bc84a231437a2b96c8f6dba81984c9e82a79360feb26bc9875b661131dbaa2deeb66b0aa50a39b2e738303bc40c5c65ee1995cf52f687ae46 \ No newline at end of file diff --git a/tests/test_score_total/inputs_true.dat b/tests/test_score_total/inputs_true.dat index 975588a1ac..c8b979c725 100644 --- a/tests/test_score_total/inputs_true.dat +++ b/tests/test_score_total/inputs_true.dat @@ -1 +1 @@ -90633c6010148c10c363ed3b2e9de3213468c51dea6153dff4bb18eadc579041d967e4835023d10b6d8c42fe81017238d119f24cae754d0621698547464b16f3 \ No newline at end of file +8813917cab656135c4eebfdbe5f0d95e6a9409a2b36df1dfb483bdd193a3c0978727918a58399b259b82a7d51ae3f1801148bd978603fec11f27acdbf89520e2 \ No newline at end of file diff --git a/tests/test_score_total_yn/inputs_true.dat b/tests/test_score_total_yn/inputs_true.dat index 72173a0319..b2818f8568 100644 --- a/tests/test_score_total_yn/inputs_true.dat +++ b/tests/test_score_total_yn/inputs_true.dat @@ -1 +1 @@ -def382a2f9efec93baf521911ab89e0d73ceadba486f9bb306e9cf82ffc1c67b72498c153519e05b516ff54db431430b2b25b80675961697e19774455711a5f8 \ No newline at end of file +4dbbd9cec921d2420e7567533c833afbe94335073aa760d1fd937adb695191b3ab7c070ec0d32721dddb4a46054e68322cf6a058420e20e439eb1d44f09f4be4 \ No newline at end of file diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index a64aa49cc3..81bef81d22 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -288,7 +288,7 @@ tally 2: 1.155268E-03 6.855877E-02 4.048417E-03 --2.701969E-05 +-2.701967E-05 1.279041E-03 -2.197636E-02 2.843662E-04 From 0f691ad1799808622fb122240b2721d169a47480 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 28 Sep 2015 16:38:22 +0700 Subject: [PATCH 297/519] Add energy_min_neutron and energy_max_neutron variables to replace hard-coded instances of 20 MeV. --- src/ace.F90 | 9 +++++++++ src/cross_section.F90 | 2 +- src/energy_grid.F90 | 4 ++-- src/global.F90 | 4 ++++ src/physics.F90 | 8 ++++---- src/source.F90 | 13 +++++++------ 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index cccc570926..69ad2f1a9a 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -482,6 +482,15 @@ contains ! Continue reading elastic scattering and heating nuc % elastic = get_real(NE) + ! Determine if minimum/maximum energy for this nuclide is greater/less + ! than the previous + energy_min_neutron = max(energy_min_neutron, nuc%energy(1)) + energy_max_neutron = min(energy_max_neutron, nuc%energy(NE)) + if (nuc%energy(NE) < 20.0_8) then + call warning("Maximum energy for " // trim(adjustl(nuc%name)) // & + " is " // trim(to_str(nuc%energy(NE))) // " MeV. Neutrons will & + ¬ be allowed to go above this energy.") + end if end if end subroutine read_esz diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 4d8fb2f0fb..1c56d961e1 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -56,7 +56,7 @@ contains if (grid_method == GRID_MAT_UNION) then call find_energy_index(p % E, p % material) else if (grid_method == GRID_LOGARITHM) then - u = int(log(p % E/1.0e-11_8)/log_spacing) + u = int(log(p % E/energy_min_neutron)/log_spacing) end if ! Determine if this material has S(a,b) tables diff --git a/src/energy_grid.F90 b/src/energy_grid.F90 index 1473e52105..66419f83cc 100644 --- a/src/energy_grid.F90 +++ b/src/energy_grid.F90 @@ -73,8 +73,8 @@ contains type(Nuclide), pointer :: nuc ! Set minimum/maximum energies - E_max = 20.0_8 - E_min = 1.0e-11_8 + E_max = energy_max_neutron + E_min = energy_min_neutron ! Determine equal-logarithmic energy spacing M = n_log_bins diff --git a/src/global.F90 b/src/global.F90 index 87d7278296..a4c80daa79 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -74,6 +74,10 @@ module global integer :: n_sab_tables ! Number of S(a,b) thermal scattering tables integer :: n_listings ! Number of listings in cross_sections.xml + ! Minimum/maximum energies + real(8) :: energy_min_neutron = ZERO + real(8) :: energy_max_neutron = INFINITY + ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict type(DictCharInt) :: sab_dict diff --git a/src/physics.F90 b/src/physics.F90 index 11bc3720fe..a109eb1a69 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1220,8 +1220,8 @@ contains call sample_energy(edist, E, E_out) end if - ! resample if energy is >= 20 MeV - if (E_out < 20) exit + ! resample if energy is greater than maximum neutron energy + if (E_out < energy_max_neutron) exit ! check for large number of resamples n_sample = n_sample + 1 @@ -1246,8 +1246,8 @@ contains call sample_energy(rxn%edist, E, E_out) end if - ! resample if energy is >= 20 MeV - if (E_out < 20) exit + ! resample if energy is greater than maximum neutron energy + if (E_out < energy_max_neutron) exit ! check for large number of resamples n_sample = n_sample + 1 diff --git a/src/source.F90 b/src/source.F90 index c461749472..6226517f3e 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -211,8 +211,9 @@ contains case (SRC_ENERGY_MONO) ! Monoenergtic source site%E = external_source%params_energy(1) - if (site%E >= 20) then - call fatal_error("Source energies above 20 MeV not allowed.") + if (site%E >= energy_max_neutron) then + call fatal_error("Source energy above range of energies of at least & + &one cross section table") end if case (SRC_ENERGY_MAXWELL) @@ -221,8 +222,8 @@ contains ! Sample Maxwellian fission spectrum site%E = maxwell_spectrum(a) - ! resample if energy is >= 20 MeV - if (site%E < 20) exit + ! resample if energy is greater than maximum neutron energy + if (site%E < energy_max_neutron) exit end do case (SRC_ENERGY_WATT) @@ -232,8 +233,8 @@ contains ! Sample Watt fission spectrum site%E = watt_spectrum(a, b) - ! resample if energy is >= 20 MeV - if (site%E < 20) exit + ! resample if energy is greater than maximum neutron energy + if (site%E < energy_max_neutron) exit end do case default From 8e54e027526f6dcdb669d004d6c94c0fae14f5a0 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Mon, 5 Oct 2015 05:08:29 -0400 Subject: [PATCH 298/519] Updates to code per @paulromano s comments --- docs/source/usersguide/input.rst | 48 +- openmc/tallies.py | 6 +- src/input_xml.F90 | 26 +- src/physics.F90 | 12 +- src/tally.F90 | 4 +- tests/test_filter_azimuthal/results_true.dat | 2930 +---------- tests/test_filter_azimuthal/tallies.xml | 2 +- tests/test_filter_mu/results_true.dat | 4688 +----------------- tests/test_filter_mu/tallies.xml | 2 +- tests/test_filter_polar/results_true.dat | 2930 +---------- tests/test_filter_polar/tallies.xml | 2 +- 11 files changed, 200 insertions(+), 10450 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 2896f1aa1e..84303bd596 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1253,45 +1253,57 @@ The ```` element accepts the following sub-elements: :mu: A monotonically increasing list of bounding **post-collision** cosines of the change in a particle's angle (i.e., :math:`\mu`), - which represents a portion of the possible values of :math:'\[-1,1\]'. - For example, spanning all of :math:'\[-1,1\]' with five equi-width + which represents a portion of the possible values of :math:`\[-1,1\]`. + For example, spanning all of :math:`\[-1,1\]` with five equi-width bins can be specified as: - ```` + + .. code-block :: xml + ```` Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:'\[-1,1\]' should + interpret this to mean the complete range of :math:`\[-1,1\]` should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:'\[-1,1\]' can be instead written as: - ````. + :math:`\[-1,1\]` can be instead written as: + + .. code-block :: xml + ````. :polar: A monotonically increasing list of bounding particle polar angles - which represents a portion of the possible values of :math:'\[0,\pi\]'. - For example, spanning all of :math:'\[0,\pi\]' with five equi-width + which represents a portion of the possible values of :math:`\[0,\pi\]`. + For example, spanning all of :math:`\[0,\pi\]` with five equi-width bins can be specified as: - ```` + + .. code-block :: xml + ```` Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:'\[0,\pi\]' should + interpret this to mean the complete range of :math:`\[0,\pi\]` should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:'\[0,\pi\]' can be instead written as: - ````. + :math:`\[0,\pi\]` can be instead written as: + + .. code-block :: xml + ````. :azimuthal: A monotonically increasing list of bounding particle azimuthal angles - which represents a portion of the possible values of :math:'\[0,2\pi\]'. - For example, spanning all of :math:'\[0,2\pi\]' with two equi-width + which represents a portion of the possible values of :math:`\[-\pi,\pi\)`. + For example, spanning all of :math:`\[-\pi,\pi\)` with two equi-width bins can be specified as: - ```` + + .. code-block :: xml + ```` Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:'\[0,2\pi\]' should + interpret this to mean the complete range of :math:`\[-\pi,\pi\)` should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:'\[0,2\pi\]' can be instead written as: - ````. + :math:`\[-\pi,\pi\)` can be instead written as: + + .. code-block :: xml + ````. :mesh: The ``id`` of a structured mesh to be tallied over. diff --git a/openmc/tallies.py b/openmc/tallies.py index 16205e5e6a..075125f4e6 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1267,12 +1267,11 @@ class Tally(object): # energy, energyout filters elif 'energy' in filter.type: bins = filter.bins - num_bins = filter.num_bins # Create strings for template = '{0:.1e} - {1:.1e}' filter_bins = [] - for i in range(num_bins): + for i in range(filter.num_bins): filter_bins.append(template.format(bins[i], bins[i+1])) # Tile the energy bins into a DataFrame column @@ -1284,12 +1283,11 @@ class Tally(object): # mu, polar, and azimuthal elif filter.type in ['mu', 'polar', 'azimuthal']: bins = filter.bins - num_bins = filter.num_bins # Create strings for template = '{0:1.2f} - {1:1.2f}' filter_bins = [] - for i in range(num_bins): + for i in range(filter.num_bins): filter_bins.append(template.format(bins[i], bins[i+1])) # Tile the mu bins into a DataFrame column diff --git a/src/input_xml.F90 b/src/input_xml.F90 index d77e187355..c2a4ffd58a 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2355,10 +2355,10 @@ contains ! Determine number of bins if (check_for_node(node_filt, "bins")) then - if ((trim(temp_str) == 'energy' .or. & - trim(temp_str) == 'energyout') .or. & - (trim(temp_str) == 'mu' .or. trim(temp_str) == 'polar') .or. & - (trim(temp_str) == 'azimuthal')) then + if ((temp_str == 'energy' .or. & + temp_str == 'energyout') .or. & + (temp_str == 'mu' .or. temp_str == 'polar') .or. & + (temp_str == 'azimuthal')) then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2508,13 +2508,13 @@ contains ! Allow a user to input a lone number which will mean that ! you subivide [-1,1] evenly with the input being the number of bins if (n_words == 1) then - Nangle = abs(int(t % filters(j) % real_bins(1))) + Nangle = int(t % filters(j) % real_bins(1)) if (Nangle > 1) then t % filters(j) % n_bins = Nangle - dangle = TWO / (real(Nangle,8)) + dangle = TWO / real(Nangle,8) deallocate(t % filters(j) % real_bins) allocate(t % filters(j) % real_bins(Nangle + 1)) - do iangle = 1, Nangle + 1 + do iangle = 1, Nangle t % filters(j) % real_bins(iangle) = -ONE + (iangle - 1) * dangle end do t % filters(j) % real_bins(Nangle + 1) = ONE @@ -2542,13 +2542,13 @@ contains ! Allow a user to input a lone number which will mean that ! you subivide [0,pi] evenly with the input being the number of bins if (n_words == 1) then - Nangle = abs(int(t % filters(j) % real_bins(1))) + Nangle = int(t % filters(j) % real_bins(1)) if (Nangle > 1) then t % filters(j) % n_bins = Nangle - dangle = PI / (real(Nangle,8)) + dangle = PI / real(Nangle,8) deallocate(t % filters(j) % real_bins) allocate(t % filters(j) % real_bins(Nangle + 1)) - do iangle = 1, Nangle + 1 + do iangle = 1, Nangle t % filters(j) % real_bins(iangle) = (iangle - 1) * dangle end do t % filters(j) % real_bins(Nangle + 1) = PI @@ -2573,13 +2573,13 @@ contains ! Allow a user to input a lone number which will mean that ! you subivide [0,2pi] evenly with the input being the number of bins if (n_words == 1) then - Nangle = abs(int(t % filters(j) % real_bins(1))) + Nangle = int(t % filters(j) % real_bins(1)) if (Nangle > 1) then t % filters(j) % n_bins = Nangle - dangle = TWO * PI / (real(Nangle,8)) + dangle = TWO * PI / real(Nangle,8) deallocate(t % filters(j) % real_bins) allocate(t % filters(j) % real_bins(Nangle + 1)) - do iangle = 1, Nangle + 1 + do iangle = 1, Nangle t % filters(j) % real_bins(iangle) = -PI + (iangle - 1) * dangle end do t % filters(j) % real_bins(Nangle + 1) = PI diff --git a/src/physics.F90 b/src/physics.F90 index 9ea9f076b5..da5763a034 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -387,12 +387,12 @@ contains end if - ! Check p % mu to ensure it falls within the expected range - if (p % mu < -ONE) then - p % mu = -ONE - else if (p % mu > ONE) then - p % mu = ONE - end if + ! ! Check p % mu to ensure it falls within the expected range + ! if (p % mu < -ONE) then + ! p % mu = -ONE + ! else if (p % mu > ONE) then + ! p % mu = ONE + ! end if ! Set event component p % event = EVENT_SCATTER diff --git a/src/tally.F90 b/src/tally.F90 index f41fb26dd0..b1c9b7b343 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1097,7 +1097,7 @@ contains end if case (FILTER_AZIMUTHAL) - ! make sure the correct direction vector is used + ! make sure the correct direction vector is used phi = atan2(p % coord(1) % uvw(2), p % coord(1) % uvw(1)) ! determine mu bin @@ -1516,7 +1516,7 @@ contains end if case (FILTER_AZIMUTHAL) - ! make sure the correct direction vector is used + ! make sure the correct direction vector is used if (t % estimator == ESTIMATOR_TRACKLENGTH) then phi = atan2(p % coord(1) % uvw(2), p % coord(1) % uvw(1)) else diff --git a/tests/test_filter_azimuthal/results_true.dat b/tests/test_filter_azimuthal/results_true.dat index cb505da8e6..1141e186cd 100644 --- a/tests/test_filter_azimuthal/results_true.dat +++ b/tests/test_filter_azimuthal/results_true.dat @@ -34,2893 +34,43 @@ tally 3: 4.442206E+01 3.973876E+02 tally 4: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.474302E-01 -2.173566E-02 -4.893327E-03 -2.394465E-05 -9.074983E-02 -8.235532E-03 -6.119357E-02 -3.744653E-03 -1.520463E-01 -2.311808E-02 -1.161846E-01 -1.349886E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.606450E-01 -8.803108E-02 -2.305484E-01 -3.880049E-02 -2.281548E-01 -3.464917E-02 -2.376528E-01 -4.490614E-02 -3.227418E-01 -6.538660E-02 -1.047674E-01 -6.952817E-03 -2.245825E-01 -4.341251E-02 -4.460481E-02 -8.734916E-04 -3.800937E-02 -6.551272E-04 -2.918350E-02 -6.025580E-04 -5.290157E-02 -2.242503E-03 -7.748790E-02 -6.004374E-03 -1.123662E-01 -6.443566E-03 -0.000000E+00 -0.000000E+00 -3.614391E-01 -5.568956E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.269186E-01 -1.610833E-02 -1.101428E-01 -1.213144E-02 -2.704596E-02 -7.314841E-04 -2.061181E-02 -4.248469E-04 -1.011349E-01 -1.022826E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.448572E-01 -4.491249E-02 -1.354754E-01 -1.148682E-02 -1.036553E-01 -5.210946E-03 -1.197739E-01 -9.544361E-03 -1.301065E-01 -1.519723E-02 -2.653999E-01 -1.798093E-02 -7.053400E-01 -2.691010E-01 -3.550653E-01 -6.602182E-02 -3.995151E-01 -4.488675E-02 -1.906734E-01 -1.444847E-02 -1.092753E+00 -4.112046E-01 -6.904926E-01 -1.639522E-01 -9.582995E-01 -4.105614E-01 -8.568085E-01 -2.031240E-01 -7.847454E-01 -1.747299E-01 -3.179482E-01 -6.310285E-02 -4.521000E-02 -1.218581E-03 -2.396875E-01 -2.427537E-02 -2.447834E-01 -2.357128E-02 -1.257401E-01 -6.914384E-03 -7.204746E-02 -5.190836E-03 -7.151850E-02 -5.114896E-03 -6.602752E-02 -4.359634E-03 -2.421534E-02 -5.863829E-04 -1.020470E-01 -1.041360E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.340315E-02 -5.477072E-04 -8.711651E-03 -7.589285E-05 -3.027497E-03 -9.165739E-06 -3.518410E-04 -1.237921E-07 -1.165678E-02 -1.358806E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.624392E-02 -6.887435E-04 -5.055291E-02 -2.555596E-03 -5.100049E-03 -2.601050E-05 -1.320474E-02 -1.743651E-04 -0.000000E+00 -0.000000E+00 -1.333239E-01 -1.777527E-02 -1.883042E-02 -3.545848E-04 -8.351253E-03 -6.974342E-05 -3.308624E-03 -1.094699E-05 -6.014221E-02 -1.891793E-03 -2.285867E-01 -1.731252E-02 -2.597469E-01 -6.386437E-02 -2.152687E-03 -4.634062E-06 -1.396882E-01 -5.831622E-03 -3.535498E-01 -3.297689E-02 -1.481495E-01 -9.087692E-03 -8.543734E-02 -2.660474E-03 -2.202068E-01 -2.136814E-02 -1.864444E-01 -1.224258E-02 -2.591769E-01 -2.379915E-02 -5.872738E-02 -3.448905E-03 -5.351124E-02 -2.863453E-03 -5.143634E-02 -2.645697E-03 -7.866165E-02 -6.187655E-03 -3.008723E-02 -9.052413E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.986516E-01 -3.946247E-02 -5.460946E-02 -2.658927E-03 -0.000000E+00 -0.000000E+00 -4.279994E-02 -1.831834E-03 -4.727444E-02 -2.234873E-03 -5.583625E-03 -3.117687E-05 -9.770956E-02 -4.775929E-03 -3.622523E-03 -1.312267E-05 -4.787097E-02 -2.291630E-03 -0.000000E+00 -0.000000E+00 -3.663182E-01 -3.901232E-02 -5.096289E-01 -1.425852E-01 -3.721281E-01 -4.002960E-02 -2.432912E-01 -1.847630E-02 -3.877633E-01 -7.117532E-02 -2.574724E-02 -6.629201E-04 -4.824475E-01 -2.327556E-01 -8.032403E-02 -6.451950E-03 -5.215563E-02 -2.720210E-03 -1.961796E-01 -2.460190E-02 -1.956052E-01 -1.707411E-02 -4.109858E-01 -8.829893E-02 -3.650051E-01 -6.581408E-02 -5.332428E-01 -1.062692E-01 -1.472720E-01 -1.352965E-02 -2.352153E-01 -5.365818E-02 -2.917669E-01 -3.702178E-02 -3.630666E-01 -7.000898E-02 -1.933146E-01 -2.290240E-02 -2.266878E-01 -3.389178E-02 -6.352729E-01 -1.262819E-01 -3.258084E-01 -3.144428E-02 -3.359217E-01 -7.028771E-02 -3.138711E-01 -3.042615E-02 -4.864884E-01 -8.197064E-02 -4.052413E-01 -5.263382E-02 -5.280291E-01 -7.463967E-02 -4.415094E-01 -4.110697E-02 -3.561420E-01 -3.775973E-02 -6.421128E-01 -1.432705E-01 -4.582457E-01 -9.035731E-02 -4.375113E-01 -7.559295E-02 -2.085802E-01 -1.627637E-02 -2.225318E-01 -1.723577E-02 -4.191042E-01 -8.237217E-02 -7.039392E-01 -1.816457E-01 -3.084044E-01 -3.275180E-02 -2.685092E-01 -2.572321E-02 -5.721738E-01 -1.282948E-01 -2.864246E-01 -3.524515E-02 -6.841688E-01 -2.593948E-01 -5.239256E-01 -1.318097E-01 -4.703226E-01 -1.003153E-01 -5.700203E-01 -1.447644E-01 -5.256055E-01 -9.786990E-02 -2.750779E-01 -2.749397E-02 -2.476165E-01 -2.628141E-02 -1.345304E-01 -6.348724E-03 -1.811728E-01 -1.101450E-02 -4.575075E-01 -1.155753E-01 -9.956031E-01 -3.236937E-01 -7.822380E-01 -1.576217E-01 -4.302676E-01 -8.654332E-02 -6.779994E-01 -1.273289E-01 -1.335326E+00 -4.959116E-01 -4.579971E-01 -1.037785E-01 -2.498542E-01 -3.500312E-02 -2.587582E-01 -2.446664E-02 -3.579200E-01 -3.739258E-02 -2.382048E-01 -2.511067E-02 -8.844200E-02 -4.178779E-03 -1.493227E-01 -1.382751E-02 -1.926833E-01 -3.623771E-02 -1.356547E-01 -1.149518E-02 -9.887065E-02 -3.834529E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.466423E-01 -8.511548E-03 -1.772139E-01 -1.084833E-02 -6.248891E-01 -2.517147E-01 -1.469570E-01 -1.361923E-02 -1.930014E-01 -1.939473E-02 -4.877778E-01 -7.218224E-02 -5.057551E-01 -7.949605E-02 -5.952215E-01 -9.519535E-02 -4.004282E-01 -5.623191E-02 -4.770953E-01 -8.006555E-02 -3.054262E-01 -4.173406E-02 -1.761785E-01 -3.103885E-02 -1.210180E-01 -1.051642E-02 -2.395766E-01 -3.979136E-02 -1.385482E-01 -1.857983E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.571800E-02 -6.614156E-04 -4.998189E-04 -2.498190E-07 -1.528778E-02 -2.337164E-04 -2.858524E-02 -8.171157E-04 -2.117843E-02 -4.485258E-04 -1.239872E-01 -7.764013E-03 -1.319425E-01 -9.461815E-03 -8.747032E-02 -4.129970E-03 -5.020910E-02 -1.320785E-03 -7.841043E-02 -2.289497E-03 -5.873242E-01 -7.715441E-02 -6.390109E-01 -1.271817E-01 -4.371329E-01 -4.391479E-02 -6.063587E-01 -9.576490E-02 -7.205461E-01 -1.991327E-01 -5.352844E-02 -2.865294E-03 -1.165072E-01 -8.697470E-03 -5.259717E-01 -9.680816E-02 -3.215701E-01 -6.824822E-02 -1.715858E-01 -1.360648E-02 -4.009911E-01 -6.121324E-02 -4.274770E-01 -6.197530E-02 -2.619790E-01 -2.507804E-02 -5.020785E-01 -8.953665E-02 -2.065920E-01 -1.834698E-02 -2.817103E-01 -5.727368E-02 -3.625259E-01 -7.732849E-02 -4.980250E-01 -8.652238E-02 -2.059145E-01 -1.633243E-02 -2.565146E-01 -2.291618E-02 -7.738021E-01 -2.033443E-01 -3.917692E-01 -5.258089E-02 -6.045178E-01 -1.259420E-01 -4.259765E-01 -6.210929E-02 -5.556781E-01 -1.172687E-01 -9.826969E-01 -2.930474E-01 -1.804633E+00 -9.618056E-01 -1.228542E+00 -3.290554E-01 -9.790031E-01 -2.809851E-01 -1.595396E+00 -6.480405E-01 -7.893874E-01 -1.662633E-01 -7.279604E-01 -1.794851E-01 -6.088511E-01 -1.219685E-01 -4.123154E-01 -6.248213E-02 -6.222925E-01 -1.129917E-01 -1.804817E+00 -9.721578E-01 -1.530452E+00 -6.104528E-01 -1.886855E+00 -8.989353E-01 -2.070262E+00 -1.044281E+00 -1.676256E+00 -7.627251E-01 -6.909846E-01 -2.166618E-01 -5.079273E-01 -1.443728E-01 -5.862180E-01 -1.586644E-01 -6.900428E-01 -1.752916E-01 -6.408226E-01 -1.544107E-01 -4.199020E-01 -6.160692E-02 -4.811223E-01 -1.043928E-01 -1.363487E-01 -1.078668E-02 -2.290971E-01 -2.287662E-02 -2.206176E-01 -1.651565E-02 -6.443180E-02 -4.151457E-03 -8.044959E-02 -2.587993E-03 -7.127891E-02 -2.586411E-03 -7.009290E-02 -4.133466E-03 -9.525623E-02 -9.073749E-03 -1.674401E-01 -9.979222E-03 -5.990721E-01 -1.648516E-01 -2.894743E-01 -3.063571E-02 -2.443739E-01 -3.157141E-02 -2.656548E-01 -4.199935E-02 -3.487093E-02 -5.237378E-04 -3.092382E-02 -5.324661E-04 -5.795673E-02 -2.378762E-03 -1.351906E-01 -1.126610E-02 -9.551312E-02 -5.778036E-03 -7.414490E-02 -5.497467E-03 -0.000000E+00 -0.000000E+00 -3.781200E-02 -1.429747E-03 -2.980733E-01 -4.777762E-02 -4.562331E-03 -2.081487E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.404772E-01 -5.782929E-02 -0.000000E+00 -0.000000E+00 -8.343675E-02 -3.485591E-03 -8.342148E-02 -4.382151E-03 -5.628723E-02 -3.168252E-03 -1.009169E-01 -5.687102E-03 -1.113680E-01 -7.941704E-03 -2.898649E-02 -4.713952E-04 -9.660437E-02 -5.617174E-03 -3.626816E-02 -7.248560E-04 -3.607715E-01 -1.301561E-01 -2.247590E-01 -5.051661E-02 -2.160150E-01 -2.179267E-02 -3.439049E-01 -5.045083E-02 -5.511705E-01 -1.236380E-01 -6.933040E-01 -1.414611E-01 -2.713608E-01 -2.827915E-02 -4.302988E-01 -1.402092E-01 -3.822389E-01 -4.128319E-02 -4.494981E-01 -1.190804E-01 -2.290552E-01 -4.033306E-02 -3.070920E-01 -3.156162E-02 -1.353947E-01 -1.616485E-02 -9.426313E-02 -5.916331E-03 -8.981082E-02 -8.065984E-03 -9.784559E-02 -9.573760E-03 -1.032600E-01 -7.849583E-03 -1.787970E-01 -2.723005E-02 -8.345128E-03 -6.964115E-05 -3.249023E-02 -8.620688E-04 -0.000000E+00 -0.000000E+00 -3.392995E-02 -7.648039E-04 -2.606350E-01 -3.603874E-02 -2.828391E-01 -7.999797E-02 -9.480101E-02 -8.987232E-03 -1.802329E-01 -1.929202E-02 -2.011460E-01 -4.045972E-02 -2.577200E-01 -3.330361E-02 -2.266050E-01 -3.081067E-02 -5.138649E-01 -1.188509E-01 -3.440738E-01 -6.978655E-02 -5.013213E-01 -1.806700E-01 -3.817956E-01 -1.260944E-01 -2.525655E-01 -4.969446E-02 -1.840306E-01 -1.758139E-02 -2.993258E-01 -5.478745E-02 -2.516357E-01 -3.591883E-02 -9.508692E-01 -3.144848E-01 -1.127748E+00 -4.533669E-01 -1.388614E+00 -5.938475E-01 -8.535628E-01 -1.856940E-01 -9.421672E-01 -2.321577E-01 -9.399456E-01 -1.963334E-01 -7.958092E-01 -1.494225E-01 -6.828877E-01 -1.019089E-01 -8.300655E-01 -1.459032E-01 -1.142542E+00 -3.197593E-01 -4.984674E-01 -8.304644E-02 -1.646552E-01 -1.418682E-02 -1.507110E-01 -6.136299E-03 -2.146555E-01 -1.739453E-02 -5.190606E-01 -1.282602E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.280722E-02 -1.640249E-04 -2.474463E-02 -6.122969E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.740089E-03 -4.542880E-05 -6.560966E-03 -4.304627E-05 -6.493094E-02 -4.216027E-03 -2.068633E-02 -4.279242E-04 -1.769168E-02 -3.129956E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.312159E-01 -7.544280E-03 -3.401693E-01 -5.861063E-02 -1.780763E-01 -1.837996E-02 -1.555608E-01 -1.438363E-02 -1.722326E-01 -1.265263E-02 -2.151577E-01 -3.095136E-02 -4.777775E-01 -9.068684E-02 -7.590086E-02 -2.347201E-03 -3.594051E-01 -7.295820E-02 -4.336617E-01 -6.930726E-02 -3.783609E-01 -5.517685E-02 -2.883440E-01 -2.262663E-02 -4.427321E-01 -6.029818E-02 -2.816265E-01 -2.820871E-02 -2.822418E-01 -2.349296E-02 -6.918377E-02 -3.199745E-03 -1.325588E-01 -1.046944E-02 -9.514313E-02 -3.035202E-03 -2.314335E-01 -2.200442E-02 -3.906344E-01 -9.721347E-02 -2.980723E-01 -2.376759E-02 -7.936355E-01 -1.709801E-01 -7.548875E-01 -1.345676E-01 -5.106013E-01 -6.529674E-02 -8.594656E-01 -1.968960E-01 -2.060661E-01 -2.343139E-02 -1.506635E-01 -1.503823E-02 -5.733100E-02 -3.286843E-03 -1.107212E-01 -6.501626E-03 -1.770281E-01 -1.870622E-02 -1.192415E+00 -7.591649E-01 -1.060765E+00 -6.226133E-01 -5.771704E-01 -2.175154E-01 -8.177694E-01 -5.589966E-01 -4.515739E-01 -1.637047E-01 -1.426047E+00 -5.365567E-01 -2.120869E+00 -1.061007E+00 -1.659944E+00 -5.728452E-01 -1.255272E+00 -3.964306E-01 -1.178254E+00 -3.384251E-01 -9.337444E-01 -3.123569E-01 -7.667372E-01 -1.681934E-01 -4.527240E-01 -6.948964E-02 -8.238011E-01 -2.050221E-01 -8.036425E-01 -1.680294E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.764809E-02 -2.270341E-03 -0.000000E+00 -0.000000E+00 -1.185675E-02 -1.405825E-04 -1.165402E-02 -1.358162E-04 -9.166220E-02 -8.401959E-03 -2.991580E-02 -8.949550E-04 -2.627216E-02 -6.902264E-04 -0.000000E+00 -0.000000E+00 -8.400675E-02 -7.057134E-03 -5.602092E-02 -3.138344E-03 -1.104073E-01 -1.218977E-02 -1.119794E-01 -1.253940E-02 -1.680266E-01 -2.823294E-02 -4.361668E-02 -1.496836E-03 -7.122617E-02 -5.073167E-03 -5.849049E-01 -7.256897E-02 -5.441320E-01 -1.095630E-01 -5.812436E-01 -1.126373E-01 -4.686984E-01 -6.439377E-02 -4.555221E-01 -5.789275E-02 -8.036184E-01 -1.587537E-01 -6.274889E-01 -1.346216E-01 -6.761298E-01 -1.486738E-01 -8.551357E-01 -1.775874E-01 -8.047687E-01 -1.857631E-01 -3.777360E-01 -4.100296E-02 -4.338168E-01 -5.840594E-02 -4.348303E-01 -6.465878E-02 -4.394179E-01 -4.959337E-02 -5.241966E-01 -7.845585E-02 -1.341670E-01 -1.800078E-02 -5.385871E-02 -1.793041E-03 -6.173743E-02 -2.259834E-03 -6.444110E-02 -4.152656E-03 -7.081432E-02 -5.014668E-03 -1.654473E-02 -2.737281E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.621176E-02 -6.870565E-04 -5.355889E-02 -2.868554E-03 -3.365409E-02 -1.132598E-03 -5.895246E-02 -1.852997E-03 -1.740885E-01 -3.030680E-02 -1.344788E-01 -9.243480E-03 -1.251748E-03 -1.566872E-06 -6.166105E-01 -1.377508E-01 -1.244951E+00 -9.076885E-01 -1.232574E+00 -5.268020E-01 -9.521659E-01 -5.501652E-01 -5.241743E-01 -7.793659E-02 -4.394736E-01 -8.132651E-02 -6.971345E-01 -2.259498E-01 -1.126805E+00 -4.735028E-01 -1.273626E+00 -5.782192E-01 -6.705929E-01 -1.804595E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.762319E-01 -3.105769E-02 -5.375135E-02 -2.889208E-03 -8.113299E-02 -6.582562E-03 -1.402536E-02 -1.967109E-04 -2.175530E-03 -4.732931E-06 -1.604349E-01 -1.836398E-02 -8.166972E-02 -6.669944E-03 -2.359411E-02 -5.566821E-04 -3.412428E-02 -1.164466E-03 -2.152492E-01 -3.284190E-02 -8.310769E-02 -6.906889E-03 -2.718964E-02 -3.830373E-04 -9.346948E-02 -4.197883E-03 -3.131857E-01 -6.183158E-02 -1.958378E-02 -3.835246E-04 -4.342264E-01 -6.578666E-02 -2.755809E-01 -3.698954E-02 -1.426118E-01 -1.165415E-02 -3.584510E-01 -5.617880E-02 -4.236136E-01 -7.237160E-02 -6.262156E-01 -1.002935E-01 -5.564149E-01 -7.346547E-02 -5.699276E-01 -8.461288E-02 -4.650999E-01 -5.247224E-02 -7.459889E-01 -1.197750E-01 -5.057661E-01 -1.445975E-01 -7.678966E-01 -4.132032E-01 -6.320990E-01 -1.958697E-01 -4.894738E-01 -6.228971E-02 -4.603769E-01 -7.554536E-02 -2.049228E-01 -4.049304E-02 -1.753413E-01 -3.074457E-02 -1.510422E-01 -2.281373E-02 -8.467573E-02 -5.992896E-03 -2.789757E-01 -5.516042E-02 -8.268724E-03 -6.837179E-05 -6.037070E-02 -3.644622E-03 -3.198510E-02 -1.023046E-03 -6.513803E-02 -4.242963E-03 -1.276091E-01 -1.628408E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.095439E-02 -8.272700E-03 -7.615705E-02 -5.799896E-03 -1.051019E-01 -1.104642E-02 -3.195211E-02 -1.020937E-03 -5.641339E-04 -3.182471E-07 -6.897666E-02 -2.528352E-03 -3.437301E-02 -6.622192E-04 -7.784183E-02 -3.049933E-03 -1.316453E-01 -9.720599E-03 -4.005528E-02 -1.604425E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.757204E-03 -3.087766E-06 -1.025424E-01 -1.051495E-02 -1.006125E-02 -1.012287E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.266868E-01 -4.153309E-02 -3.249877E-01 -5.501895E-02 -2.001322E-01 -2.100219E-02 -8.393296E-02 -3.529117E-03 -9.024131E-02 -3.598207E-03 -5.321158E-01 -9.327694E-02 -4.932906E-01 -9.055152E-02 -4.652667E-01 -8.695397E-02 -4.875968E-01 -6.316894E-02 -8.509569E-01 -2.979914E-01 -8.567368E-03 -7.339979E-05 -4.733770E-03 -2.240858E-05 -4.536176E-03 -2.057689E-05 -1.498357E-02 -2.245074E-04 -4.488923E-02 -2.015043E-03 -2.070988E-01 -1.965568E-02 -1.738740E-01 -1.258772E-02 -1.405557E-01 -7.957975E-03 -1.451949E-01 -1.087042E-02 -1.836997E-01 -2.875983E-02 -2.268012E-01 -1.857423E-02 -5.477375E-01 -1.263053E-01 -2.820488E-01 -3.084507E-02 -3.122200E-02 -4.465266E-04 -1.710861E-01 -1.069095E-02 -3.709273E-01 -8.078411E-02 -4.271262E-01 -1.186890E-01 -1.975158E-01 -1.206521E-02 -3.692730E-01 -4.299892E-02 -3.794769E-01 -4.120280E-02 -1.714536E-01 -1.369896E-02 -2.608383E-01 -3.353982E-02 -2.256484E-01 -1.437053E-02 -3.682180E-01 -3.555943E-02 -2.890424E-01 -2.851080E-02 -1.430463E-01 -2.038794E-02 -2.725924E-01 -3.969996E-02 -2.241288E-01 -2.517385E-02 -4.826084E-01 -1.182832E-01 -2.614025E-01 -5.415398E-02 -0.000000E+00 -0.000000E+00 -5.586315E-02 -2.033451E-03 -6.512409E-03 -2.930016E-05 -3.693278E-02 -1.364030E-03 -3.805149E-02 -1.180395E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.763335E-02 -7.679604E-03 -6.409891E-02 -4.108671E-03 -3.345201E-03 -1.119037E-05 -2.022211E-02 -4.089337E-04 -0.000000E+00 -0.000000E+00 -3.214088E-02 -1.033036E-03 -1.411115E-01 -1.991247E-02 -9.198624E-02 -8.461468E-03 -0.000000E+00 -0.000000E+00 -7.617573E-02 -5.802742E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.367870E-02 -4.054977E-03 -1.078459E-01 -1.163075E-02 -9.447489E-02 -8.925505E-03 -6.584131E-02 -4.335077E-03 -7.988089E-02 -6.380957E-03 -6.235285E-02 -2.002820E-03 -2.706093E-01 -7.076313E-02 -1.466476E-01 -1.361819E-02 -8.729887E-03 -7.621092E-05 -1.375778E-02 -1.844203E-04 -3.984916E-01 -9.373268E-02 -3.364990E-01 -5.661596E-02 -4.020450E-01 -8.472109E-02 -4.413636E-01 -1.003742E-01 -2.121461E-01 -2.663987E-02 -1.526046E-01 -1.168051E-02 -4.991575E-01 -1.536171E-01 -2.454845E-01 -3.283217E-02 -3.372705E-01 -6.595273E-02 -5.769460E-01 -1.741438E-01 -6.007458E-02 -3.608955E-03 -1.504711E-01 -2.264155E-02 -7.769465E-02 -6.036458E-03 -2.008044E-01 -4.032242E-02 -7.336520E-02 -5.382453E-03 -2.133977E-02 -4.553857E-04 -5.594369E-02 -3.129696E-03 -5.728259E-02 -3.281295E-03 -0.000000E+00 -0.000000E+00 -1.534125E-02 -2.353539E-04 -3.758790E-01 -4.785602E-02 -3.022183E-01 -3.500670E-02 -2.613223E-01 -2.768972E-02 -2.914065E-01 -3.099270E-02 -1.539804E-01 -1.675015E-02 -3.051518E-01 -7.523708E-02 -4.204406E-01 -8.562140E-02 -3.704730E-01 -4.598759E-02 -1.751173E-02 -2.449748E-04 -4.869293E-01 -1.044601E-01 -6.761704E-01 -1.461525E-01 -2.912160E-01 -2.793298E-02 -3.679771E-01 -5.754028E-02 -2.687719E-01 -3.216123E-02 -3.996186E-01 -7.570729E-02 -6.712416E-01 -1.613293E-01 -3.265655E-01 -3.103057E-02 -4.797228E-01 -6.482187E-02 -2.938893E-01 -3.636815E-02 -3.668696E-01 -7.065345E-02 -5.187273E-01 -1.303529E-01 -1.275917E-01 -1.507907E-02 -2.374463E-01 -3.038778E-02 -1.461346E-01 -1.173624E-02 -3.316802E-01 -8.419888E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.119260E-01 -1.252742E-02 -1.234360E-01 -1.523645E-02 -1.694900E-02 -2.872686E-04 -2.200755E-02 -4.843322E-04 -8.925340E-03 -7.966170E-05 -3.099425E-01 -2.333517E-02 -6.001031E-01 -8.959511E-02 -1.514686E-01 -8.369168E-03 -3.824816E-01 -5.885437E-02 -1.918112E-01 -9.015847E-03 -8.064652E-01 -2.330752E-01 -6.706961E-01 -1.132421E-01 -6.131817E-01 -1.007516E-01 -8.751240E-01 -1.943385E-01 -4.660559E-01 -4.849161E-02 -0.000000E+00 -0.000000E+00 -1.826995E-02 -3.337911E-04 -1.859029E-02 -1.784126E-04 -2.257601E-02 -3.943994E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.149011E-04 -9.916272E-08 -1.031750E-01 -1.018080E-02 -3.950811E-02 -1.106258E-03 -5.860091E-02 -1.175610E-03 -6.436945E-02 -2.663201E-03 -3.375382E-01 -3.988372E-02 -4.786264E-01 -1.021940E-01 -3.717899E-01 -8.893674E-02 -4.843765E-01 -7.500741E-02 -7.321566E-01 -2.622431E-01 -2.644543E-01 -3.460339E-02 -1.051276E-01 -4.706652E-03 -2.193827E-01 -2.079033E-02 -3.192620E-01 -5.154372E-02 -4.290455E-01 -6.413273E-02 -2.557525E-03 -6.540932E-06 -0.000000E+00 -0.000000E+00 -1.052090E-01 -1.106892E-02 -8.286540E-02 -6.866675E-03 -0.000000E+00 -0.000000E+00 -1.108319E-02 -1.228371E-04 -5.279365E-02 -2.787169E-03 -9.209996E-02 -8.482402E-03 -7.311185E-02 -5.345342E-03 -6.779218E-02 -4.595780E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.217913E-02 -2.722661E-03 -3.183172E-02 -1.013259E-03 -5.143123E-02 -2.645171E-03 -3.853962E-02 -1.485302E-03 -1.949072E-01 -1.922224E-02 -5.899907E-02 -3.480891E-03 -0.000000E+00 -0.000000E+00 -9.911631E-02 -4.914980E-03 -1.936066E-02 -3.748352E-04 -1.894345E-01 -1.975743E-02 -2.702327E-01 -3.872839E-02 -3.536531E-02 -6.346895E-04 -8.927224E-02 -3.117244E-03 -1.239024E-01 -1.460889E-02 -7.460673E-02 -1.997499E-03 -2.794038E-01 -3.362026E-02 -2.445230E-01 -2.175117E-02 -3.410532E-01 -2.922254E-02 -3.550664E-01 -3.489306E-02 -2.325575E-01 -3.512250E-02 -4.594717E-01 -9.534559E-02 -5.021181E-01 -7.072668E-02 -0.000000E+00 -0.000000E+00 -2.329054E-02 -5.424494E-04 -0.000000E+00 -0.000000E+00 -2.888777E-02 -8.345031E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.385420E-03 -1.919390E-06 -2.522303E-02 -3.885557E-04 -1.438283E-01 -1.096381E-02 -1.194387E-01 -9.501961E-03 -9.765239E-02 -7.032757E-03 -3.628610E-01 -4.465263E-02 -6.425628E-01 -1.448704E-01 -8.254508E-01 -2.022199E-01 -2.263208E-01 -1.950877E-02 -4.086773E-01 -5.427169E-02 -1.296965E-01 -1.433530E-02 -9.777235E-02 -9.559432E-03 -1.759685E-01 -2.120369E-02 -9.720573E-02 -8.041371E-03 -5.756698E-02 -1.656980E-03 -6.570752E-02 -4.317479E-03 -2.995199E-02 -8.971217E-04 -3.918618E-02 -1.535557E-03 -1.416971E-01 -2.007807E-02 -1.210479E-01 -1.465260E-02 -2.164294E-01 -1.273492E-02 -2.057206E-01 -1.289154E-02 -3.057417E-01 -2.906387E-02 -1.846244E-01 -1.150813E-02 -2.505386E-01 -2.352353E-02 -3.102978E-01 -3.075705E-02 -1.807102E-01 -1.130111E-02 -3.636532E-01 -4.277721E-02 -2.756322E-01 -4.629958E-02 -2.574707E-01 -2.390921E-02 -1.663280E-01 -1.055366E-02 -1.971757E-01 -1.617882E-02 -4.330849E-01 -1.046596E-01 -2.069552E-01 -2.229127E-02 -1.925621E-01 -1.943705E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.304368E-01 -8.705800E-03 -3.320497E-02 -8.247331E-04 -9.661007E-02 -3.530809E-03 -1.309409E-01 -1.044539E-02 -1.502393E-01 -1.063521E-02 -3.041909E-01 -4.449294E-02 -1.051607E-01 -5.720926E-03 -4.660472E-01 -1.043583E-01 -2.095413E-01 -1.848500E-02 -2.464474E-01 -5.064008E-02 -2.026234E-02 -4.105624E-04 -5.623882E-02 -1.709973E-03 -2.308936E-02 -5.331186E-04 -2.153979E-02 -3.386990E-04 -1.741974E-02 -2.593235E-04 -3.505900E-03 -1.229134E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.693909E-03 -9.397187E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.877721E-02 -3.525836E-04 -3.220986E-02 -1.037475E-03 -5.922775E-03 -3.507927E-05 -1.324027E-02 -1.753048E-04 -2.380758E-02 -5.668009E-04 -3.163073E-01 -4.136106E-02 -5.034850E-01 -8.165041E-02 -5.323116E-01 -1.070342E-01 -2.067587E-01 -1.617541E-02 -3.713337E-01 -4.573936E-02 -2.929441E-01 -2.492852E-02 -3.860197E-01 -4.752061E-02 -3.611950E-01 -4.832689E-02 -8.553920E-01 -2.489853E-01 -5.346553E-01 -1.070166E-01 -2.748655E-01 -3.207760E-02 -1.880564E-01 -1.454490E-02 -1.441330E-01 -7.384927E-03 -4.222507E-01 -6.303877E-02 -2.371504E-01 -3.784365E-02 -2.876155E-02 -8.272268E-04 -7.209175E-02 -5.197220E-03 -7.833937E-02 -6.137056E-03 -3.354994E-03 -1.125598E-05 -1.734437E-02 -3.008272E-04 -3.834849E-03 -1.470607E-05 -0.000000E+00 -0.000000E+00 -1.026300E-02 -1.053291E-04 -1.105643E-02 -1.222447E-04 -4.407736E-03 -1.942813E-05 -3.960455E-02 -1.249026E-03 -2.254955E-03 -5.084823E-06 -5.008555E-02 -1.568589E-03 -3.272442E-02 -5.361599E-04 -3.485209E-02 -6.419840E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.182776E-01 -2.619114E-02 -3.174056E-01 -5.433423E-02 -3.745919E-01 -1.196180E-01 -1.599302E-01 -1.291332E-02 -2.220796E-01 -2.899420E-02 -9.764734E-02 -9.535004E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.888114E-01 -3.564974E-02 -1.876245E-01 -3.247950E-02 -1.607592E-01 -2.430317E-02 -2.880051E-01 -4.250400E-02 -1.889880E-01 -1.852264E-02 -1.789814E-01 -2.024483E-02 -9.720855E-02 -9.449501E-03 -1.741882E-02 -3.034154E-04 -1.178715E-01 -1.389369E-02 -3.198634E-01 -1.023126E-01 -3.546193E-02 -9.738454E-04 -4.996773E-02 -2.496774E-03 -1.420664E-02 -2.018286E-04 -0.000000E+00 -0.000000E+00 -9.800069E-03 -9.604135E-05 -2.640870E-02 -6.974194E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.025873E-01 -2.135872E-02 -2.345491E-01 -3.182709E-02 -1.923074E-01 -1.902643E-02 -5.555865E-02 -1.786230E-03 -5.409278E-02 -1.631497E-03 -6.993790E-01 -1.999988E-01 -5.527654E-01 -7.214885E-02 -5.149839E-01 -6.167088E-02 -4.730824E-01 -6.445758E-02 -5.125355E-01 -9.159800E-02 -3.657482E-02 -1.337717E-03 -6.491103E-02 -4.213441E-03 -2.111583E-01 -2.321778E-02 -5.587914E-02 -3.122478E-03 -1.764618E-02 -3.113877E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.035788E-02 -1.072857E-04 -1.373000E-01 -1.345940E-02 -6.493738E-02 -2.500846E-03 -0.000000E+00 -0.000000E+00 -1.360043E-02 -1.849716E-04 -4.018634E-04 -1.614942E-07 -3.908707E-02 -1.527799E-03 -9.495691E-02 -9.016814E-03 -2.038259E-01 -4.154501E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.754347E-02 -3.077734E-04 -1.328306E-02 -1.764397E-04 -0.000000E+00 -0.000000E+00 -1.389367E-03 -1.930340E-06 -4.796108E-03 -2.300265E-05 -8.301133E-03 -6.890881E-05 -1.620052E-02 -2.624570E-04 -4.802741E-02 -2.306633E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.462519E-02 -2.138962E-04 -7.673812E-02 -5.888740E-03 -1.631406E-01 -2.661484E-02 -4.823869E-02 -2.326971E-03 -4.653199E-04 -2.165226E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +7.168838E+00 +1.042163E+01 +7.971487E+00 +1.403081E+01 +7.476834E+00 +1.127244E+01 +7.777042E+00 +1.297721E+01 +7.305258E+00 +1.147474E+01 +2.136566E+01 +1.013300E+02 +2.111266E+01 +9.951975E+01 +1.879003E+01 +7.275943E+01 +1.902839E+01 +7.679731E+01 +2.069167E+01 +8.887050E+01 +7.056683E+00 +1.113235E+01 +8.240024E+00 +1.529926E+01 +7.945092E+00 +1.293685E+01 +7.537498E+00 +1.182572E+01 +7.441808E+00 +1.244441E+01 +8.434401E+00 +1.529856E+01 +8.211747E+00 +1.474916E+01 +8.883874E+00 +1.644290E+01 +8.356120E+00 +1.491287E+01 +8.612737E+00 +1.659522E+01 diff --git a/tests/test_filter_azimuthal/tallies.xml b/tests/test_filter_azimuthal/tallies.xml index b9a53b27e0..6ca5413879 100644 --- a/tests/test_filter_azimuthal/tallies.xml +++ b/tests/test_filter_azimuthal/tallies.xml @@ -5,7 +5,7 @@ regular -182.07 -182.07 182.07 182.07 - 17 17 + 2 2
diff --git a/tests/test_filter_mu/results_true.dat b/tests/test_filter_mu/results_true.dat index 11ac334d12..c3fbf729bb 100644 --- a/tests/test_filter_mu/results_true.dat +++ b/tests/test_filter_mu/results_true.dat @@ -35,4627 +35,67 @@ tally 2: 7.216000E+01 1.042565E+03 tally 3: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -2.000000E-01 -4.000000E-02 -2.000000E-01 -4.000000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -8.000000E-02 -3.400000E-03 -8.000000E-02 -3.400000E-03 -1.400000E-01 -1.000000E-02 -1.400000E-01 -1.000000E-02 -4.500000E-01 -1.025000E-01 -4.500000E-01 -1.025000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -1.600000E-01 -1.780000E-02 -1.600000E-01 -1.780000E-02 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.600000E-01 -2.260000E-02 -1.600000E-01 -2.260000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.900000E-01 -3.610000E-02 -1.900000E-01 -3.610000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.000000E-02 -4.100000E-03 -9.000000E-02 -4.100000E-03 -3.300000E-01 -7.250000E-02 -3.300000E-01 -7.250000E-02 -6.000000E-02 -1.200000E-03 -6.000000E-02 -1.200000E-03 -1.400000E-01 -7.800000E-03 -1.400000E-01 -7.800000E-03 -2.600000E-01 -2.100000E-02 -2.600000E-01 -2.100000E-02 -5.600000E-01 -9.800000E-02 -5.600000E-01 -9.800000E-02 -2.700000E-01 -2.870000E-02 -2.700000E-01 -2.870000E-02 -2.200000E-01 -1.900000E-02 -2.200000E-01 -1.900000E-02 -6.300000E-01 -1.643000E-01 -6.300000E-01 -1.643000E-01 -1.150000E+00 -4.549000E-01 -1.150000E+00 -4.549000E-01 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -9.000000E-02 -4.500000E-03 -9.000000E-02 -4.500000E-03 -1.200000E-01 -6.200000E-03 -1.200000E-01 -6.200000E-03 -4.600000E-01 -9.860000E-02 -4.600000E-01 -9.860000E-02 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.400000E-01 -1.960000E-02 -1.400000E-01 -1.960000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -1.100000E-01 -4.500000E-03 -1.100000E-01 -4.500000E-03 -2.500000E-01 -2.630000E-02 -2.500000E-01 -2.630000E-02 -9.000000E-02 -2.900000E-03 -9.000000E-02 -2.900000E-03 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -2.200000E-01 -1.740000E-02 -2.200000E-01 -1.740000E-02 -4.500000E-01 -6.810000E-02 -4.500000E-01 -6.810000E-02 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.700000E-01 -1.150000E-02 -1.700000E-01 -1.150000E-02 -1.400000E-01 -8.600000E-03 -1.400000E-01 -8.600000E-03 -3.200000E-01 -3.420000E-02 -3.200000E-01 -3.420000E-02 -5.200000E-01 -8.280000E-02 -5.200000E-01 -8.280000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.900000E-01 -3.610000E-02 -1.900000E-01 -3.610000E-02 -1.600000E-01 -1.100000E-02 -1.600000E-01 -1.100000E-02 -8.000000E-02 -3.200000E-03 -8.000000E-02 -3.200000E-03 -2.700000E-01 -3.650000E-02 -2.700000E-01 -3.650000E-02 -5.900000E-01 -1.701000E-01 -5.900000E-01 -1.701000E-01 -8.000000E-02 -2.400000E-03 -8.000000E-02 -2.400000E-03 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.800000E-01 -2.340000E-02 -1.800000E-01 -2.340000E-02 -4.100000E-01 -8.590000E-02 -4.100000E-01 -8.590000E-02 -1.600000E-01 -7.800000E-03 -1.600000E-01 -7.800000E-03 -1.300000E-01 -5.700000E-03 -1.300000E-01 -5.700000E-03 -2.900000E-01 -2.530000E-02 -2.900000E-01 -2.530000E-02 -6.100000E-01 -9.270000E-02 -6.100000E-01 -9.270000E-02 -1.300000E-01 -4.500000E-03 -1.300000E-01 -4.500000E-03 -1.500000E-01 -5.100000E-03 -1.500000E-01 -5.100000E-03 -3.800000E-01 -3.700000E-02 -3.800000E-01 -3.700000E-02 -8.400000E-01 -1.970000E-01 -8.400000E-01 -1.970000E-01 -1.200000E-01 -5.000000E-03 -1.200000E-01 -5.000000E-03 -8.000000E-02 -2.600000E-03 -8.000000E-02 -2.600000E-03 -2.900000E-01 -2.850000E-02 -2.900000E-01 -2.850000E-02 -6.200000E-01 -1.282000E-01 -6.200000E-01 -1.282000E-01 -1.500000E-01 -9.300000E-03 -1.500000E-01 -9.300000E-03 -1.300000E-01 -9.700000E-03 -1.300000E-01 -9.700000E-03 -3.400000E-01 -4.180000E-02 -3.400000E-01 -4.180000E-02 -7.500000E-01 -1.901000E-01 -7.500000E-01 -1.901000E-01 -1.100000E-01 -8.500000E-03 -1.100000E-01 -8.500000E-03 -1.600000E-01 -1.060000E-02 -1.600000E-01 -1.060000E-02 -3.100000E-01 -4.930000E-02 -3.100000E-01 -4.930000E-02 -9.900000E-01 -4.805000E-01 -9.900000E-01 -4.805000E-01 -1.000000E-01 -4.400000E-03 -1.000000E-01 -4.400000E-03 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.500000E-01 -9.300000E-03 -1.500000E-01 -9.300000E-03 -4.000000E-01 -6.160000E-02 -4.000000E-01 -6.160000E-02 -3.400000E-01 -3.580000E-02 -3.400000E-01 -3.580000E-02 -3.300000E-01 -3.450000E-02 -3.300000E-01 -3.450000E-02 -6.700000E-01 -1.431000E-01 -6.700000E-01 -1.431000E-01 -1.250000E+00 -4.875000E-01 -1.250000E+00 -4.875000E-01 -1.500000E-01 -7.700000E-03 -1.500000E-01 -7.700000E-03 -1.600000E-01 -7.800000E-03 -1.600000E-01 -7.800000E-03 -3.500000E-01 -4.250000E-02 -3.500000E-01 -4.250000E-02 -7.100000E-01 -1.677000E-01 -7.100000E-01 -1.677000E-01 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -8.000000E-02 -2.600000E-03 -8.000000E-02 -2.600000E-03 -1.700000E-01 -1.610000E-02 -1.700000E-01 -1.610000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-02 -2.100000E-03 -7.000000E-02 -2.100000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.900000E-01 -9.300000E-03 -1.900000E-01 -9.300000E-03 -5.000000E-01 -7.540000E-02 -5.000000E-01 -7.540000E-02 -1.800000E-01 -1.220000E-02 -1.800000E-01 -1.220000E-02 -2.700000E-01 -3.010000E-02 -2.700000E-01 -3.010000E-02 -5.200000E-01 -7.560000E-02 -5.200000E-01 -7.560000E-02 -1.140000E+00 -3.758000E-01 -1.140000E+00 -3.758000E-01 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -2.400000E-01 -4.860000E-02 -2.400000E-01 -4.860000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -6.000000E-02 -2.000000E-03 -6.000000E-02 -2.000000E-03 -5.000000E-02 -1.100000E-03 -5.000000E-02 -1.100000E-03 -1.000000E-01 -4.200000E-03 -1.000000E-01 -4.200000E-03 -1.300000E-01 -4.500000E-03 -1.300000E-01 -4.500000E-03 -2.700000E-01 -1.970000E-02 -2.700000E-01 -1.970000E-02 -3.500000E-01 -3.730000E-02 -3.500000E-01 -3.730000E-02 -9.500000E-01 -2.359000E-01 -9.500000E-01 -2.359000E-01 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -1.200000E-01 -9.000000E-03 -1.200000E-01 -9.000000E-03 -2.400000E-01 -3.060000E-02 -2.400000E-01 -3.060000E-02 -9.000000E-02 -2.300000E-03 -9.000000E-02 -2.300000E-03 -1.400000E-01 -8.600000E-03 -1.400000E-01 -8.600000E-03 -2.200000E-01 -1.620000E-02 -2.200000E-01 -1.620000E-02 -6.500000E-01 -1.527000E-01 -6.500000E-01 -1.527000E-01 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -7.000000E-02 -1.900000E-03 -7.000000E-02 -1.900000E-03 -2.200000E-01 -1.820000E-02 -2.200000E-01 -1.820000E-02 -5.100000E-01 -1.283000E-01 -5.100000E-01 -1.283000E-01 -1.300000E-01 -5.900000E-03 -1.300000E-01 -5.900000E-03 -1.200000E-01 -5.000000E-03 -1.200000E-01 -5.000000E-03 -3.800000E-01 -4.940000E-02 -3.800000E-01 -4.940000E-02 -8.400000E-01 -2.456000E-01 -8.400000E-01 -2.456000E-01 -4.000000E-01 -3.900000E-02 -4.000000E-01 -3.900000E-02 -3.700000E-01 -3.830000E-02 -3.700000E-01 -3.830000E-02 -9.000000E-01 -2.290000E-01 -9.000000E-01 -2.290000E-01 -1.920000E+00 -9.190000E-01 -1.920000E+00 -9.190000E-01 -1.300000E-01 -6.700000E-03 -1.300000E-01 -6.700000E-03 -1.800000E-01 -9.400000E-03 -1.800000E-01 -9.400000E-03 -4.700000E-01 -6.810000E-02 -4.700000E-01 -6.810000E-02 -9.000000E-01 -2.318000E-01 -9.000000E-01 -2.318000E-01 -4.000000E-01 -5.960000E-02 -4.000000E-01 -5.960000E-02 -5.800000E-01 -9.340000E-02 -5.800000E-01 -9.340000E-02 -1.200000E+00 -3.346000E-01 -1.200000E+00 -3.346000E-01 -2.850000E+00 -1.888300E+00 -2.850000E+00 -1.888300E+00 -1.500000E-01 -7.700000E-03 -1.600000E-01 -9.000000E-03 -1.800000E-01 -1.220000E-02 -1.800000E-01 -1.220000E-02 -2.300000E-01 -1.870000E-02 -2.300000E-01 -1.870000E-02 -1.010000E+00 -4.207000E-01 -1.010000E+00 -4.207000E-01 -2.000000E-01 -1.580000E-02 -2.000000E-01 -1.580000E-02 -1.800000E-01 -1.460000E-02 -1.800000E-01 -1.460000E-02 -2.300000E-01 -1.970000E-02 -2.300000E-01 -1.970000E-02 -5.800000E-01 -1.210000E-01 -5.800000E-01 -1.210000E-01 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -1.400000E-01 -1.100000E-02 -1.400000E-01 -1.100000E-02 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -1.100000E-01 -4.900000E-03 -1.100000E-01 -4.900000E-03 -2.600000E-01 -2.300000E-02 -2.600000E-01 -2.300000E-02 -3.600000E-01 -5.100000E-02 -3.600000E-01 -5.100000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.500000E-01 -1.070000E-02 -1.500000E-01 -1.070000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -1.000000E-01 -5.800000E-03 -1.000000E-01 -5.800000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -1.200000E-01 -6.200000E-03 -1.200000E-01 -6.200000E-03 -1.400000E-01 -6.600000E-03 -1.400000E-01 -6.600000E-03 -2.900000E-01 -3.130000E-02 -2.900000E-01 -3.130000E-02 -5.300000E-01 -1.137000E-01 -5.300000E-01 -1.137000E-01 -5.000000E-02 -1.100000E-03 -5.000000E-02 -1.100000E-03 -8.000000E-02 -3.400000E-03 -8.000000E-02 -3.400000E-03 -2.200000E-01 -1.640000E-02 -2.200000E-01 -1.640000E-02 -4.700000E-01 -8.470000E-02 -4.700000E-01 -8.470000E-02 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.100000E-01 -1.010000E-02 -1.100000E-01 -1.010000E-02 -1.400000E-01 -1.480000E-02 -1.400000E-01 -1.480000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -1.000000E-01 -5.800000E-03 -1.000000E-01 -5.800000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -1.600000E-01 -2.560000E-02 -1.600000E-01 -2.560000E-02 -2.200000E-01 -3.400000E-02 -2.200000E-01 -3.400000E-02 -1.000000E-01 -6.800000E-03 -1.000000E-01 -6.800000E-03 -8.000000E-02 -3.800000E-03 -8.000000E-02 -3.800000E-03 -1.800000E-01 -1.700000E-02 -1.800000E-01 -1.700000E-02 -4.600000E-01 -1.298000E-01 -4.600000E-01 -1.298000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-01 -8.200000E-03 -1.000000E-01 -8.200000E-03 -2.000000E-01 -2.980000E-02 -2.000000E-01 -2.980000E-02 -3.400000E-01 -5.860000E-02 -3.400000E-01 -5.860000E-02 -3.300000E-01 -4.030000E-02 -3.300000E-01 -4.030000E-02 -2.900000E-01 -2.410000E-02 -2.900000E-01 -2.410000E-02 -7.500000E-01 -1.651000E-01 -7.500000E-01 -1.651000E-01 -1.490000E+00 -7.477000E-01 -1.490000E+00 -7.477000E-01 -2.400000E-01 -1.300000E-02 -2.400000E-01 -1.300000E-02 -2.400000E-01 -1.840000E-02 -2.400000E-01 -1.840000E-02 -4.600000E-01 -4.640000E-02 -4.600000E-01 -4.640000E-02 -1.470000E+00 -4.667000E-01 -1.470000E+00 -4.667000E-01 -1.000000E-01 -5.800000E-03 -1.000000E-01 -5.800000E-03 -2.000000E-01 -1.480000E-02 -2.000000E-01 -1.480000E-02 -2.400000E-01 -1.880000E-02 -2.400000E-01 -1.880000E-02 -5.500000E-01 -9.330000E-02 -5.500000E-01 -9.330000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-01 -4.200000E-03 -1.000000E-01 -4.200000E-03 -3.000000E-02 -3.000000E-04 -3.000000E-02 -3.000000E-04 -1.700000E-01 -1.250000E-02 -1.700000E-01 -1.250000E-02 -4.100000E-01 -7.090000E-02 -4.100000E-01 -7.090000E-02 -6.000000E-02 -1.400000E-03 -6.000000E-02 -1.400000E-03 -8.000000E-02 -2.400000E-03 -8.000000E-02 -2.400000E-03 -2.000000E-01 -1.660000E-02 -2.000000E-01 -1.660000E-02 -5.400000E-01 -1.066000E-01 -5.400000E-01 -1.066000E-01 -7.000000E-02 -1.500000E-03 -7.000000E-02 -1.500000E-03 -1.000000E-01 -3.000000E-03 -1.000000E-01 -3.000000E-03 -1.900000E-01 -1.110000E-02 -1.900000E-01 -1.110000E-02 -4.600000E-01 -6.020000E-02 -4.600000E-01 -6.020000E-02 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -9.000000E-02 -2.700000E-03 -9.000000E-02 -2.700000E-03 -2.900000E-01 -2.830000E-02 -2.900000E-01 -2.830000E-02 -3.100000E-01 -2.230000E-02 -3.100000E-01 -2.230000E-02 -1.800000E-01 -8.600000E-03 -1.800000E-01 -8.600000E-03 -5.000000E-01 -5.740000E-02 -5.000000E-01 -5.740000E-02 -1.090000E+00 -2.509000E-01 -1.090000E+00 -2.509000E-01 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -8.000000E-02 -5.000000E-03 -8.000000E-02 -5.000000E-03 -1.300000E-01 -1.250000E-02 -1.300000E-01 -1.250000E-02 -2.100000E-01 -3.650000E-02 -2.100000E-01 -3.650000E-02 -2.600000E-01 -4.660000E-02 -2.600000E-01 -4.660000E-02 -2.200000E-01 -2.740000E-02 -2.200000E-01 -2.740000E-02 -4.600000E-01 -1.156000E-01 -4.600000E-01 -1.156000E-01 -8.600000E-01 -4.850000E-01 -8.600000E-01 -4.850000E-01 -3.800000E-01 -4.720000E-02 -3.800000E-01 -4.720000E-02 -4.400000E-01 -4.900000E-02 -4.400000E-01 -4.900000E-02 -1.000000E+00 -2.820000E-01 -1.000000E+00 -2.820000E-01 -2.440000E+00 -1.624200E+00 -2.440000E+00 -1.624200E+00 -1.500000E-01 -6.700000E-03 -1.500000E-01 -6.700000E-03 -2.000000E-01 -1.200000E-02 -2.000000E-01 -1.200000E-02 -5.200000E-01 -8.060000E-02 -5.200000E-01 -8.060000E-02 -1.020000E+00 -2.504000E-01 -1.020000E+00 -2.504000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-01 -1.000000E-02 -1.000000E-01 -1.000000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -1.000000E-01 -1.000000E-02 -1.000000E-01 -1.000000E-02 -1.800000E-01 -9.200000E-03 -1.800000E-01 -9.200000E-03 -2.100000E-01 -1.270000E-02 -2.100000E-01 -1.270000E-02 -3.900000E-01 -3.990000E-02 -3.900000E-01 -3.990000E-02 -9.000000E-01 -1.982000E-01 -9.000000E-01 -1.982000E-01 -8.000000E-02 -2.800000E-03 -8.000000E-02 -2.800000E-03 -2.100000E-01 -9.700000E-03 -2.100000E-01 -9.700000E-03 -4.900000E-01 -5.130000E-02 -4.900000E-01 -5.130000E-02 -1.230000E+00 -3.187000E-01 -1.230000E+00 -3.187000E-01 -1.200000E-01 -5.000000E-03 -1.200000E-01 -5.000000E-03 -1.100000E-01 -3.900000E-03 -1.100000E-01 -3.900000E-03 -4.000000E-01 -4.560000E-02 -4.000000E-01 -4.560000E-02 -8.800000E-01 -2.082000E-01 -8.800000E-01 -2.082000E-01 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.200000E-01 -1.040000E-02 -1.200000E-01 -1.040000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.300000E-01 -1.690000E-02 -1.300000E-01 -1.690000E-02 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -1.400000E-01 -1.700000E-02 -1.400000E-01 -1.700000E-02 -3.000000E-01 -2.680000E-02 -3.000000E-01 -2.680000E-02 -2.900000E-01 -3.210000E-02 -2.900000E-01 -3.210000E-02 -7.200000E-01 -1.774000E-01 -7.200000E-01 -1.774000E-01 -1.540000E+00 -8.082000E-01 -1.540000E+00 -8.082000E-01 -1.200000E-01 -7.400000E-03 -1.200000E-01 -7.400000E-03 -3.000000E-01 -3.020000E-02 -3.000000E-01 -3.020000E-02 -5.800000E-01 -1.142000E-01 -5.800000E-01 -1.142000E-01 -1.300000E+00 -5.652000E-01 -1.300000E+00 -5.652000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.700000E-01 -2.890000E-02 -1.700000E-01 -2.890000E-02 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-01 -1.000000E-02 -1.000000E-01 -1.000000E-02 -1.100000E-01 -1.010000E-02 -1.100000E-01 -1.010000E-02 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -1.200000E-01 -8.600000E-03 -1.200000E-01 -8.600000E-03 -1.200000E-01 -6.200000E-03 -1.200000E-01 -6.200000E-03 -1.100000E-01 -5.100000E-03 -1.100000E-01 -5.100000E-03 -2.200000E-01 -1.660000E-02 -2.200000E-01 -1.660000E-02 -4.700000E-01 -7.450000E-02 -4.700000E-01 -7.450000E-02 -1.400000E-01 -5.600000E-03 -1.400000E-01 -5.600000E-03 -2.500000E-01 -1.410000E-02 -2.500000E-01 -1.410000E-02 -4.600000E-01 -4.720000E-02 -4.600000E-01 -4.720000E-02 -1.140000E+00 -2.806000E-01 -1.140000E+00 -2.806000E-01 -2.100000E-01 -2.630000E-02 -2.100000E-01 -2.630000E-02 -2.000000E-01 -2.620000E-02 -2.000000E-01 -2.620000E-02 -4.500000E-01 -1.079000E-01 -4.500000E-01 -1.079000E-01 -9.100000E-01 -3.921000E-01 -9.100000E-01 -3.921000E-01 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -5.000000E-02 -1.700000E-03 -5.000000E-02 -1.700000E-03 -1.100000E-01 -1.210000E-02 -1.100000E-01 -1.210000E-02 -2.800000E-01 -7.840000E-02 -2.800000E-01 -7.840000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.700000E-01 -2.890000E-02 -1.700000E-01 -2.890000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.200000E-01 -1.440000E-02 -1.200000E-01 -1.440000E-02 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -1.300000E-01 -9.700000E-03 -1.300000E-01 -9.700000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -8.000000E-02 -3.200000E-03 -8.000000E-02 -3.200000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -9.000000E-02 -5.300000E-03 -9.000000E-02 -5.300000E-03 -3.700000E-01 -6.890000E-02 -3.700000E-01 -6.890000E-02 -1.800000E-01 -2.280000E-02 -1.800000E-01 -2.280000E-02 -1.900000E-01 -1.330000E-02 -1.900000E-01 -1.330000E-02 -4.700000E-01 -8.870000E-02 -4.700000E-01 -8.870000E-02 -1.060000E+00 -3.900000E-01 -1.060000E+00 -3.900000E-01 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.300000E-01 -7.300000E-03 -1.300000E-01 -7.300000E-03 -1.100000E-01 -5.100000E-03 -1.100000E-01 -5.100000E-03 -1.500000E-01 -9.900000E-03 -1.500000E-01 -9.900000E-03 -4.700000E-01 -8.510000E-02 -4.700000E-01 -8.510000E-02 -3.000000E-02 -3.000000E-04 -3.000000E-02 -3.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -1.300000E-01 -4.900000E-03 -1.300000E-01 -4.900000E-03 -3.000000E-01 -2.780000E-02 -3.000000E-01 -2.780000E-02 -5.000000E-02 -1.100000E-03 -5.000000E-02 -1.100000E-03 -1.100000E-01 -5.900000E-03 -1.100000E-01 -5.900000E-03 -2.700000E-01 -2.910000E-02 -2.700000E-01 -2.910000E-02 -5.400000E-01 -9.140000E-02 -5.400000E-01 -9.140000E-02 -1.100000E-01 -3.900000E-03 -1.100000E-01 -3.900000E-03 -1.400000E-01 -7.800000E-03 -1.400000E-01 -7.800000E-03 -2.300000E-01 -1.650000E-02 -2.300000E-01 -1.650000E-02 -4.800000E-01 -6.820000E-02 -4.800000E-01 -6.820000E-02 -9.000000E-02 -5.300000E-03 -9.000000E-02 -5.300000E-03 -1.500000E-01 -1.730000E-02 -1.500000E-01 -1.730000E-02 -2.200000E-01 -2.440000E-02 -2.200000E-01 -2.440000E-02 -4.600000E-01 -1.220000E-01 -4.600000E-01 -1.220000E-01 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -9.000000E-02 -8.100000E-03 -9.000000E-02 -8.100000E-03 -1.000000E-01 -1.000000E-02 -1.000000E-01 -1.000000E-02 -2.700000E-01 -7.290000E-02 -2.700000E-01 -7.290000E-02 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -7.000000E-02 -2.500000E-03 -7.000000E-02 -2.500000E-03 -2.200000E-01 -3.400000E-02 -2.200000E-01 -3.400000E-02 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -1.000000E-01 -5.200000E-03 -1.000000E-01 -5.200000E-03 -2.300000E-01 -2.890000E-02 -2.300000E-01 -2.890000E-02 -5.100000E-01 -1.313000E-01 -5.100000E-01 -1.313000E-01 -1.300000E-01 -9.700000E-03 -1.300000E-01 -9.700000E-03 -1.100000E-01 -6.500000E-03 -1.100000E-01 -6.500000E-03 -2.000000E-01 -2.320000E-02 -2.000000E-01 -2.320000E-02 -5.800000E-01 -2.194000E-01 -5.800000E-01 -2.194000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -1.300000E-01 -1.690000E-02 -1.300000E-01 -1.690000E-02 -2.400000E-01 -5.760000E-02 -2.400000E-01 -5.760000E-02 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.400000E-01 -1.080000E-02 -1.400000E-01 -1.080000E-02 -1.100000E-01 -4.500000E-03 -1.100000E-01 -4.500000E-03 -2.600000E-01 -2.920000E-02 -2.600000E-01 -2.920000E-02 -6.200000E-01 -1.470000E-01 -6.200000E-01 -1.470000E-01 -9.000000E-02 -3.500000E-03 -9.000000E-02 -3.500000E-03 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -2.100000E-01 -2.510000E-02 -2.100000E-01 -2.510000E-02 -5.900000E-01 -1.589000E-01 -5.900000E-01 -1.589000E-01 -1.100000E-01 -3.900000E-03 -1.100000E-01 -3.900000E-03 -1.400000E-01 -9.200000E-03 -1.400000E-01 -9.200000E-03 -4.100000E-01 -6.150000E-02 -4.100000E-01 -6.150000E-02 -8.600000E-01 -2.090000E-01 -8.600000E-01 -2.090000E-01 -1.300000E-01 -4.300000E-03 -1.300000E-01 -4.300000E-03 -8.000000E-02 -2.200000E-03 -8.000000E-02 -2.200000E-03 -2.900000E-01 -2.850000E-02 -2.900000E-01 -2.850000E-02 -5.900000E-01 -1.075000E-01 -5.900000E-01 -1.075000E-01 -1.000000E-01 -5.000000E-03 -1.000000E-01 -5.000000E-03 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -1.100000E-01 -5.300000E-03 -1.100000E-01 -5.300000E-03 -3.300000E-01 -5.090000E-02 -3.300000E-01 -5.090000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.500000E-01 -2.250000E-02 -1.500000E-01 -2.250000E-02 -8.000000E-02 -1.600000E-03 -8.000000E-02 -1.600000E-03 -1.100000E-01 -3.900000E-03 -1.100000E-01 -3.900000E-03 -2.500000E-01 -1.510000E-02 -2.500000E-01 -1.510000E-02 -5.600000E-01 -7.200000E-02 -5.600000E-01 -7.200000E-02 -2.100000E-01 -1.490000E-02 -2.100000E-01 -1.490000E-02 -1.700000E-01 -6.700000E-03 -1.700000E-01 -6.700000E-03 -5.900000E-01 -8.590000E-02 -5.900000E-01 -8.590000E-02 -1.090000E+00 -2.999000E-01 -1.090000E+00 -2.999000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -6.000000E-04 -4.000000E-02 -6.000000E-04 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -1.500000E-01 -8.900000E-03 -1.500000E-01 -8.900000E-03 -8.000000E-02 -2.200000E-03 -8.000000E-02 -2.200000E-03 -1.100000E-01 -4.500000E-03 -1.100000E-01 -4.500000E-03 -3.000000E-01 -2.440000E-02 -3.000000E-01 -2.440000E-02 -4.600000E-01 -6.580000E-02 -4.600000E-01 -6.580000E-02 -1.400000E-01 -7.400000E-03 -1.400000E-01 -7.400000E-03 -8.000000E-02 -3.400000E-03 -8.000000E-02 -3.400000E-03 -2.200000E-01 -2.220000E-02 -2.200000E-01 -2.220000E-02 -6.500000E-01 -1.385000E-01 -6.500000E-01 -1.385000E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-01 -8.200000E-03 -1.000000E-01 -8.200000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.800000E-01 -1.640000E-02 -1.800000E-01 -1.640000E-02 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -6.000000E-02 -1.000000E-03 -6.000000E-02 -1.000000E-03 -1.300000E-01 -6.300000E-03 -1.300000E-01 -6.300000E-03 -2.200000E-01 -2.040000E-02 -2.200000E-01 -2.040000E-02 -9.000000E-02 -2.300000E-03 -9.000000E-02 -2.300000E-03 -1.300000E-01 -5.500000E-03 -1.300000E-01 -5.500000E-03 -2.900000E-01 -2.290000E-02 -2.900000E-01 -2.290000E-02 -7.300000E-01 -1.393000E-01 -7.300000E-01 -1.393000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -2.000000E-04 -2.000000E-02 -2.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -1.000000E-01 -6.800000E-03 -1.000000E-01 -6.800000E-03 -1.400000E-01 -5.200000E-03 -1.400000E-01 -5.200000E-03 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -4.800000E-01 -6.740000E-02 -4.800000E-01 -6.740000E-02 -7.200000E-01 -1.454000E-01 -7.200000E-01 -1.454000E-01 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -1.600000E-01 -2.260000E-02 -1.600000E-01 -2.260000E-02 -3.300000E-01 -8.510000E-02 -3.300000E-01 -8.510000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -1.500000E-01 -2.250000E-02 -1.500000E-01 -2.250000E-02 -6.000000E-02 -1.800000E-03 -6.000000E-02 -1.800000E-03 -8.000000E-02 -2.000000E-03 -8.000000E-02 -2.000000E-03 -2.300000E-01 -1.650000E-02 -2.300000E-01 -1.650000E-02 -5.500000E-01 -9.410000E-02 -5.500000E-01 -9.410000E-02 -5.000000E-02 -9.000000E-04 -5.000000E-02 -9.000000E-04 -1.200000E-01 -4.000000E-03 -1.200000E-01 -4.000000E-03 -2.500000E-01 -2.230000E-02 -2.500000E-01 -2.230000E-02 -5.400000E-01 -8.000000E-02 -5.400000E-01 -8.000000E-02 -4.000000E-02 -8.000000E-04 -4.000000E-02 -8.000000E-04 -9.000000E-02 -3.500000E-03 -9.000000E-02 -3.500000E-03 -2.600000E-01 -2.760000E-02 -2.600000E-01 -2.760000E-02 -4.700000E-01 -8.450000E-02 -4.700000E-01 -8.450000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -4.000000E-02 -6.000000E-04 -4.000000E-02 -6.000000E-04 -1.100000E-01 -4.900000E-03 -1.100000E-01 -4.900000E-03 -1.600000E-01 -1.740000E-02 -1.600000E-01 -1.740000E-02 -8.000000E-02 -3.000000E-03 -8.000000E-02 -3.000000E-03 -1.100000E-01 -8.500000E-03 -1.100000E-01 -8.500000E-03 -1.700000E-01 -1.470000E-02 -1.700000E-01 -1.470000E-02 -2.900000E-01 -3.630000E-02 -2.900000E-01 -3.630000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -5.000000E-02 -1.300000E-03 -5.000000E-02 -1.300000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -8.000000E-02 -1.800000E-03 -8.000000E-02 -1.800000E-03 -2.200000E-01 -1.100000E-02 -2.200000E-01 -1.100000E-02 -1.700000E-01 -6.700000E-03 -1.700000E-01 -6.700000E-03 -5.500000E-01 -9.350000E-02 -5.500000E-01 -9.350000E-02 -1.100000E-01 -4.300000E-03 -1.100000E-01 -4.300000E-03 -8.000000E-02 -2.600000E-03 -8.000000E-02 -2.600000E-03 -2.500000E-01 -1.770000E-02 -2.500000E-01 -1.770000E-02 -7.500000E-01 -1.659000E-01 -7.500000E-01 -1.659000E-01 -8.000000E-02 -4.000000E-03 -8.000000E-02 -4.000000E-03 -7.000000E-02 -2.100000E-03 -7.000000E-02 -2.100000E-03 -1.200000E-01 -5.600000E-03 -1.200000E-01 -5.600000E-03 -4.700000E-01 -8.530000E-02 -4.700000E-01 -8.530000E-02 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.300000E-01 -1.690000E-02 -1.300000E-01 -1.690000E-02 -1.200000E-01 -1.440000E-02 -1.200000E-01 -1.440000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -4.000000E-02 -1.000000E-03 -4.000000E-02 -1.000000E-03 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-01 -1.130000E-02 -1.500000E-01 -1.130000E-02 -7.000000E-02 -3.700000E-03 -7.000000E-02 -3.700000E-03 -2.200000E-01 -2.600000E-02 -2.200000E-01 -2.600000E-02 -4.000000E-01 -8.080000E-02 -4.000000E-01 -8.080000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -7.000000E-02 -2.900000E-03 -7.000000E-02 -2.900000E-03 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -6.000000E-02 -3.600000E-03 -6.000000E-02 -3.600000E-03 -3.400000E-01 -6.500000E-02 -3.400000E-01 -6.500000E-02 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -1.600000E-01 -2.260000E-02 -1.600000E-01 -2.260000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.500000E-01 -1.170000E-02 -1.500000E-01 -1.170000E-02 -1.000000E-01 -4.200000E-03 -1.000000E-01 -4.200000E-03 -2.500000E-01 -3.250000E-02 -2.500000E-01 -3.250000E-02 -6.000000E-01 -2.054000E-01 -6.000000E-01 -2.054000E-01 -1.700000E-01 -8.300000E-03 -1.700000E-01 -8.300000E-03 -2.200000E-01 -1.320000E-02 -2.200000E-01 -1.320000E-02 -4.200000E-01 -4.220000E-02 -4.200000E-01 -4.220000E-02 -9.600000E-01 -2.324000E-01 -9.600000E-01 -2.324000E-01 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -1.100000E-01 -8.500000E-03 -1.100000E-01 -8.500000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.000000E-02 -5.000000E-04 -3.000000E-02 -5.000000E-04 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -3.000000E-02 -9.000000E-04 -3.000000E-02 -9.000000E-04 -7.000000E-02 -4.900000E-03 -7.000000E-02 -4.900000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -4.000000E-02 -1.600000E-03 -4.000000E-02 -1.600000E-03 -5.000000E-02 -2.500000E-03 -5.000000E-02 -2.500000E-03 -8.000000E-02 -6.400000E-03 -8.000000E-02 -6.400000E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -2.000000E-02 -4.000000E-04 -1.000000E-02 -1.000000E-04 -1.000000E-02 -1.000000E-04 -1.900000E-01 -3.610000E-02 -1.900000E-01 -3.610000E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.010000E+00 +8.185000E-01 +2.010000E+00 +8.185000E-01 +2.290000E+00 +1.101500E+00 +2.290000E+00 +1.101500E+00 +5.210000E+00 +5.469700E+00 +5.210000E+00 +5.469700E+00 +1.169000E+01 +2.756770E+01 +1.169000E+01 +2.756770E+01 +5.660000E+00 +6.866200E+00 +5.670000E+00 +6.881500E+00 +6.210000E+00 +8.343100E+00 +6.210000E+00 +8.343100E+00 +1.394000E+01 +4.207080E+01 +1.394000E+01 +4.207080E+01 +3.175000E+01 +2.109401E+02 +3.175000E+01 +2.109401E+02 +2.190000E+00 +1.105100E+00 +2.190000E+00 +1.105100E+00 +2.630000E+00 +1.495100E+00 +2.630000E+00 +1.495100E+00 +6.190000E+00 +8.277300E+00 +6.190000E+00 +8.277300E+00 +1.383000E+01 +4.204150E+01 +1.383000E+01 +4.204150E+01 +2.450000E+00 +1.331100E+00 +2.450000E+00 +1.331100E+00 +2.660000E+00 +1.566400E+00 +2.660000E+00 +1.566400E+00 +5.980000E+00 +7.883200E+00 +5.980000E+00 +7.883200E+00 +1.413000E+01 +4.213850E+01 +1.413000E+01 +4.213850E+01 diff --git a/tests/test_filter_mu/tallies.xml b/tests/test_filter_mu/tallies.xml index c0f122c8d0..095b75548b 100644 --- a/tests/test_filter_mu/tallies.xml +++ b/tests/test_filter_mu/tallies.xml @@ -5,7 +5,7 @@ regular -182.07 -182.07 182.07 182.07 - 17 17 + 2 2
diff --git a/tests/test_filter_polar/results_true.dat b/tests/test_filter_polar/results_true.dat index ffff7ded05..0d59076a5f 100644 --- a/tests/test_filter_polar/results_true.dat +++ b/tests/test_filter_polar/results_true.dat @@ -34,2893 +34,43 @@ tally 3: 1.984454E+01 7.925660E+01 tally 4: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.474302E-01 -2.173566E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.432595E-02 -1.178271E-03 -1.903587E-01 -3.623643E-02 -1.250046E-01 -1.562615E-02 -3.869169E-02 -1.497047E-03 -3.668674E-02 -1.345917E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.190607E-02 -7.096961E-04 -3.895259E-01 -8.495601E-02 -2.284979E-01 -3.250979E-02 -4.643875E-01 -1.860775E-01 -2.654254E-01 -6.037390E-02 -2.698254E-02 -7.280575E-04 -1.817443E-01 -2.161385E-02 -7.254787E-02 -2.987520E-03 -1.582096E-01 -1.826557E-02 -1.663246E-03 -2.766386E-06 -8.259018E-03 -6.821137E-05 -2.558792E-01 -4.504604E-02 -2.453509E-01 -3.080447E-02 -8.083188E-02 -5.647153E-03 -1.387367E-02 -1.924786E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.347824E-02 -1.890357E-03 -9.303810E-02 -8.656089E-03 -1.089074E-01 -1.186081E-02 -7.890050E-02 -6.225288E-03 -6.152985E-02 -3.785923E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.699808E-03 -2.208819E-05 -1.704635E-01 -1.776343E-02 -3.739623E-01 -1.012665E-01 -1.175392E-01 -7.573086E-03 -6.720332E-02 -3.513831E-03 -1.769341E-01 -1.610590E-02 -4.744278E-01 -5.672771E-02 -5.501395E-01 -1.244910E-01 -4.728963E-01 -9.971839E-02 -2.415960E-01 -1.921861E-02 -8.118001E-02 -4.276190E-03 -9.462447E-01 -3.563633E-01 -1.217330E+00 -6.102058E-01 -1.283191E+00 -5.152286E-01 -8.551530E-01 -2.763767E-01 -1.325767E-01 -1.559092E-02 -4.092935E-01 -1.058373E-01 -2.419310E-01 -2.153941E-02 -1.411949E-01 -8.672931E-03 -4.837309E-02 -1.201282E-03 -1.731752E-02 -2.998966E-04 -2.037172E-01 -4.150072E-02 -7.239365E-02 -5.240841E-03 -4.466284E-03 -1.994770E-05 -3.796115E-02 -1.441049E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.031321E-02 -1.063623E-04 -3.027497E-03 -9.165739E-06 -2.370722E-02 -5.620325E-04 -4.776229E-05 -2.281236E-09 -1.005522E-02 -1.011075E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.944866E-02 -1.556197E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.416144E-03 -7.083149E-05 -4.723681E-02 -2.231316E-03 -0.000000E+00 -0.000000E+00 -6.157666E-02 -3.791685E-03 -1.435494E-01 -1.175050E-02 -1.883042E-02 -3.545848E-04 -0.000000E+00 -0.000000E+00 -9.858022E-02 -6.064864E-03 -1.377573E-01 -6.075009E-03 -5.553592E-01 -1.165658E-01 -1.920276E-01 -1.683819E-02 -0.000000E+00 -0.000000E+00 -9.291000E-02 -4.496084E-03 -1.528956E-01 -6.696896E-03 -3.470337E-01 -4.913557E-02 -1.668142E-01 -7.106155E-03 -1.397614E-01 -1.415223E-02 -0.000000E+00 -0.000000E+00 -1.462957E-02 -2.140245E-04 -0.000000E+00 -0.000000E+00 -2.356684E-01 -5.553959E-02 -2.212588E-02 -4.895545E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.216998E-02 -9.139549E-05 -3.932625E-02 -1.546554E-03 -9.602503E-02 -9.220806E-03 -8.630974E-02 -7.449371E-03 -1.095045E-01 -1.199123E-02 -4.255818E-03 -1.811199E-05 -9.836434E-02 -4.839529E-03 -5.216653E-02 -2.633697E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.832664E-02 -2.176805E-03 -1.141400E+00 -3.562881E-01 -3.160116E-01 -3.009071E-02 -1.902307E-01 -1.300689E-02 -1.531603E-01 -1.135371E-02 -1.228605E-01 -1.509470E-02 -3.450058E-01 -9.135498E-02 -3.182309E-01 -1.012709E-01 -5.058713E-02 -2.559057E-03 -1.697725E-04 -2.882269E-08 -3.492002E-01 -4.901829E-02 -5.660396E-01 -1.129198E-01 -5.226192E-01 -1.186296E-01 -1.987306E-01 -2.221535E-02 -1.552123E-02 -9.624873E-05 -1.695828E-01 -2.337364E-02 -3.719807E-01 -1.033719E-01 -4.987578E-01 -1.131589E-01 -2.633262E-01 -3.548629E-02 -6.403661E-03 -4.100687E-05 -2.098620E-01 -3.185923E-02 -5.327678E-01 -1.260314E-01 -6.830219E-01 -1.204174E-01 -4.959908E-01 -6.583551E-02 -1.757201E-01 -1.232506E-02 -2.426806E-01 -1.505768E-02 -5.661567E-01 -9.439168E-02 -7.963110E-01 -1.562706E-01 -5.914847E-01 -9.396630E-02 -1.764016E-01 -8.644711E-03 -3.903970E-02 -1.436954E-03 -3.529581E-01 -5.734566E-02 -4.483558E-01 -7.148105E-02 -6.954349E-01 -1.897543E-01 -2.101845E-01 -1.947836E-02 -3.255484E-01 -3.587411E-02 -5.457278E-01 -1.382796E-01 -6.298487E-01 -1.349603E-01 -5.149968E-01 -9.289024E-02 -1.233296E-01 -8.098392E-03 -2.114802E-01 -2.223257E-02 -7.493878E-01 -1.953165E-01 -9.606204E-01 -3.851562E-01 -5.959420E-01 -1.729410E-01 -2.566123E-01 -5.220316E-02 -1.300714E-01 -1.691857E-02 -4.188623E-01 -8.186145E-02 -3.525139E-01 -4.441007E-02 -2.539997E-01 -2.400996E-02 -1.404577E-01 -1.042754E-02 -4.883870E-01 -1.034732E-01 -1.303595E+00 -4.770995E-01 -1.264727E+00 -4.675060E-01 -8.520501E-01 -2.050500E-01 -3.126758E-01 -2.994247E-02 -1.924008E-01 -1.559227E-02 -2.935492E-01 -3.017433E-02 -4.324628E-01 -7.881462E-02 -3.975254E-01 -5.245815E-02 -2.467962E-01 -2.372880E-02 -1.444930E-01 -1.681850E-02 -1.556147E-01 -1.781515E-02 -1.223846E-01 -6.714831E-03 -1.404183E-01 -8.081436E-03 -1.020626E-01 -4.635949E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.646579E-02 -2.504559E-03 -3.031950E-01 -4.705208E-02 -5.003254E-01 -1.259295E-01 -3.681484E-01 -5.480080E-02 -4.056911E-02 -7.133468E-04 -1.728687E-01 -1.044538E-02 -7.900932E-01 -1.675525E-01 -7.556186E-01 -1.868565E-01 -5.898075E-01 -9.934908E-02 -1.578898E-01 -9.743581E-03 -3.443117E-02 -1.185505E-03 -3.856868E-01 -5.479213E-02 -3.114128E-01 -9.697792E-02 -1.501365E-01 -1.128685E-02 -9.908018E-02 -4.946696E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.848461E-02 -3.416807E-04 -1.735563E-02 -3.012179E-04 -3.766057E-02 -1.418319E-03 -1.452737E-02 -2.110444E-04 -3.241090E-03 -1.050466E-05 -6.571107E-02 -4.317945E-03 -1.818850E-01 -1.858395E-02 -1.423701E-01 -8.531355E-03 -5.192358E-02 -1.584201E-03 -3.012974E-02 -9.078010E-04 -3.460308E-01 -4.300833E-02 -8.886342E-01 -1.979649E-01 -9.842888E-01 -2.881765E-01 -5.321000E-01 -1.136150E-01 -2.393190E-01 -2.520479E-02 -2.493318E-01 -3.685476E-02 -2.500704E-01 -2.329962E-02 -4.018748E-01 -6.213118E-02 -2.163802E-01 -4.388987E-02 -7.150616E-02 -5.113131E-03 -3.654527E-01 -3.457991E-02 -3.002729E-01 -4.511272E-02 -2.822579E-01 -2.338732E-02 -6.528294E-01 -1.524807E-01 -1.983048E-01 -1.689245E-02 -4.589165E-01 -1.024191E-01 -3.589193E-01 -5.696940E-02 -3.829127E-01 -6.900291E-02 -3.434619E-01 -5.687528E-02 -6.047994E-02 -2.769308E-03 -2.829720E-01 -4.033132E-02 -8.343244E-01 -2.365735E-01 -8.461794E-01 -2.419086E-01 -5.328086E-01 -1.076794E-01 -2.554593E-01 -2.705326E-02 -5.690688E-01 -9.395399E-02 -1.710545E+00 -8.536400E-01 -2.487795E+00 -1.540558E+00 -1.180503E+00 -4.049532E-01 -6.423595E-01 -9.393144E-02 -3.064727E-01 -3.611240E-02 -8.865444E-01 -2.203178E-01 -1.156982E+00 -3.522074E-01 -6.756657E-01 -1.483080E-01 -1.351425E-01 -7.476476E-03 -6.597908E-01 -1.073049E-01 -2.457677E+00 -2.023614E+00 -2.652227E+00 -1.892776E+00 -2.281177E+00 -1.220067E+00 -9.177700E-01 -2.209165E-01 -2.942481E-01 -4.779456E-02 -8.896377E-01 -3.427659E-01 -6.573629E-01 -2.038360E-01 -1.068984E+00 -4.074942E-01 -2.057626E-01 -2.224194E-02 -2.108308E-01 -3.789794E-02 -5.315992E-01 -9.898359E-02 -2.762801E-01 -2.558533E-02 -3.243687E-01 -3.986361E-02 -1.440088E-01 -9.846532E-03 -6.273453E-02 -3.935622E-03 -1.890350E-02 -3.573424E-04 -1.244120E-01 -6.073193E-03 -1.524211E-01 -1.186313E-02 -2.303826E-02 -5.307612E-04 -6.935823E-02 -3.443786E-03 -2.979499E-01 -3.904359E-02 -6.378873E-01 -1.392033E-01 -3.462076E-01 -4.509511E-02 -2.146121E-01 -2.097943E-02 -0.000000E+00 -0.000000E+00 -1.762597E-01 -1.474243E-02 -4.841373E-02 -8.250738E-04 -1.041634E-01 -5.617826E-03 -2.561839E-02 -3.592083E-04 -1.686008E-02 -2.842622E-04 -3.235876E-01 -5.394411E-02 -7.334494E-02 -5.379480E-03 -7.999641E-04 -6.399425E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.975273E-02 -8.055552E-03 -5.250975E-03 -2.757273E-05 -1.454735E-01 -2.116254E-02 -0.000000E+00 -0.000000E+00 -2.599359E-02 -6.756667E-04 -1.189527E-01 -1.292776E-02 -1.366675E-01 -1.329920E-02 -7.681734E-02 -5.221801E-03 -7.699920E-02 -4.484948E-03 -0.000000E+00 -0.000000E+00 -4.931708E-02 -1.519629E-03 -2.075187E-01 -3.932831E-02 -4.866201E-01 -1.783976E-01 -3.933727E-03 -1.547420E-05 -1.447774E-01 -7.878318E-03 -7.337539E-01 -1.940469E-01 -4.244053E-01 -6.524380E-02 -6.956651E-01 -1.373331E-01 -7.715359E-02 -2.759193E-03 -2.608743E-02 -3.428298E-04 -4.420638E-01 -7.497408E-02 -7.192560E-01 -2.545420E-01 -5.225508E-01 -1.022956E-01 -8.822506E-02 -3.143855E-03 -5.973264E-02 -3.567988E-03 -1.721672E-01 -2.964154E-02 -1.092900E-01 -8.936541E-03 -1.123419E-01 -8.303025E-03 -6.704262E-02 -3.918055E-03 -0.000000E+00 -0.000000E+00 -1.479675E-01 -2.069803E-02 -4.274959E-02 -1.565916E-03 -4.860036E-02 -1.376540E-03 -1.424478E-02 -1.384768E-04 -9.918901E-02 -9.838461E-03 -3.241857E-01 -5.388926E-02 -3.722589E-01 -9.294021E-02 -1.613917E-01 -2.604727E-02 -6.262877E-02 -3.922363E-03 -4.517748E-02 -1.175222E-03 -5.902904E-01 -3.025110E-01 -6.688624E-01 -1.628101E-01 -3.657483E-01 -8.271269E-02 -1.735064E-01 -1.432316E-02 -9.656594E-02 -9.324980E-03 -4.579678E-01 -1.529918E-01 -4.117654E-01 -1.078929E-01 -3.294982E-01 -6.501983E-02 -7.355570E-02 -2.720089E-03 -3.353709E-01 -3.645392E-02 -1.366673E+00 -5.534696E-01 -1.626348E+00 -7.956301E-01 -1.557030E+00 -8.102316E-01 -3.775397E-01 -4.337036E-02 -3.810078E-01 -4.006540E-02 -8.925398E-01 -1.976057E-01 -1.494959E+00 -4.820858E-01 -1.109655E+00 -2.627263E-01 -5.130883E-01 -6.343981E-02 -1.276620E-01 -5.657924E-03 -4.705785E-01 -7.223213E-02 -2.779174E-01 -2.705433E-02 -4.893172E-01 -7.465499E-02 -1.820748E-01 -1.307515E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.755185E-02 -1.410142E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.468687E-02 -7.171866E-03 -2.903920E-02 -8.432750E-04 -2.883932E-03 -8.317065E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.314268E-02 -7.259921E-04 -2.029621E-01 -1.983891E-02 -2.943558E-01 -4.569215E-02 -2.376044E-01 -1.893725E-02 -2.091898E-01 -2.867530E-02 -1.532448E-01 -1.992068E-02 -4.416877E-01 -9.154407E-02 -4.413786E-01 -6.841708E-02 -4.412459E-01 -7.191730E-02 -8.434576E-02 -3.470402E-03 -1.304242E-01 -6.269176E-03 -4.348960E-01 -5.106950E-02 -2.460526E-01 -2.089796E-02 -6.142283E-01 -1.328688E-01 -2.477043E-01 -2.480481E-02 -0.000000E+00 -0.000000E+00 -3.484736E-01 -7.407098E-02 -3.662144E-01 -3.495803E-02 -1.691338E-01 -1.145274E-02 -3.513192E-02 -6.966704E-04 -1.866371E-01 -9.785455E-03 -8.658518E-01 -2.161446E-01 -9.638943E-01 -1.913045E-01 -7.854268E-01 -1.413095E-01 -4.148521E-01 -4.744507E-02 -1.105032E-01 -6.326652E-03 -1.171852E-01 -1.353690E-02 -3.104375E-01 -4.832172E-02 -9.995680E-02 -9.991361E-03 -6.372721E-02 -3.244987E-03 -3.605302E-01 -9.968218E-02 -1.099699E+00 -6.237421E-01 -1.597767E+00 -1.586586E+00 -9.544061E-01 -6.760972E-01 -8.729241E-02 -7.619964E-03 -4.395545E-01 -4.943293E-02 -2.117369E+00 -1.212555E+00 -2.055810E+00 -9.158404E-01 -2.278523E+00 -1.132537E+00 -7.491295E-01 -1.486131E-01 -4.336193E-01 -6.334650E-02 -1.458137E+00 -5.498244E-01 -1.205622E+00 -4.016799E-01 -5.450346E-01 -7.521207E-02 -1.382368E-01 -7.589255E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.652940E-02 -2.732211E-04 -5.660527E-02 -3.204156E-03 -8.968640E-02 -8.043650E-03 -0.000000E+00 -0.000000E+00 -1.377392E-04 -1.897208E-08 -3.707446E-02 -1.374516E-03 -4.732144E-02 -2.239319E-03 -9.872573E-02 -9.746769E-03 -1.295626E-02 -1.678647E-04 -1.643480E-02 -2.701026E-04 -1.469127E-01 -2.158334E-02 -1.739661E-01 -2.847920E-02 -1.226772E-01 -1.504971E-02 -4.526537E-02 -2.048953E-03 -2.743612E-01 -1.935488E-02 -7.004598E-01 -1.233628E-01 -9.918695E-01 -2.685056E-01 -4.582090E-01 -8.666853E-02 -2.096014E-01 -1.276117E-02 -1.058629E-01 -2.723827E-03 -1.187095E+00 -3.032117E-01 -1.357908E+00 -4.012459E-01 -8.554331E-01 -1.656922E-01 -2.608428E-01 -2.236927E-02 -1.282796E-01 -1.046417E-02 -8.199420E-01 -1.966086E-01 -6.898854E-01 -1.292887E-01 -4.216338E-01 -4.506530E-02 -1.502568E-01 -6.176513E-03 -2.031456E-02 -4.126812E-04 -1.802925E-02 -3.086793E-04 -1.193142E-01 -1.131635E-02 -2.115812E-01 -4.476660E-02 -1.577931E-02 -2.489865E-04 -1.544902E-02 -2.386723E-04 -2.016287E-02 -4.065414E-04 -2.750261E-02 -7.563936E-04 -3.320088E-02 -1.102298E-03 -0.000000E+00 -0.000000E+00 -3.490686E-02 -1.218489E-03 -1.205409E-01 -1.021218E-02 -7.309267E-02 -2.688000E-03 -1.332323E-01 -9.052410E-03 -4.065279E-02 -1.554009E-03 -8.080617E-01 -4.188794E-01 -1.202798E+00 -5.942992E-01 -1.010606E+00 -2.840204E-01 -8.887959E-01 -3.472468E-01 -6.602136E-01 -2.907517E-01 -4.266630E-01 -1.192779E-01 -9.611768E-01 -3.989244E-01 -1.348575E+00 -6.074390E-01 -1.019505E+00 -3.185084E-01 -4.517109E-01 -8.709865E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.153908E-02 -2.656277E-03 -5.794382E-02 -3.357486E-03 -9.838796E-02 -9.680191E-03 -7.152879E-02 -5.116368E-03 -4.791751E-02 -2.296088E-03 -1.888712E-02 -3.567231E-04 -7.076392E-02 -3.568253E-03 -1.283883E-01 -1.648356E-02 -1.262630E-01 -8.215235E-03 -1.707699E-01 -1.905865E-02 -2.502881E-02 -6.264411E-04 -1.707851E-01 -1.473743E-02 -1.745214E-01 -1.623261E-02 -7.269367E-02 -2.757335E-03 -9.350736E-02 -8.743625E-03 -2.774232E-01 -4.172901E-02 -3.637219E-01 -4.693551E-02 -3.527932E-01 -5.380019E-02 -5.222100E-01 -1.174753E-01 -1.183355E-01 -6.057836E-03 -2.886966E-01 -1.740085E-02 -1.034157E+00 -2.303798E-01 -7.768759E-01 -1.274066E-01 -6.628867E-01 -1.034133E-01 -2.010307E-01 -2.316808E-02 -2.009075E-01 -1.919952E-02 -6.804407E-01 -2.137544E-01 -8.260664E-01 -2.649841E-01 -8.820765E-01 -3.809810E-01 -2.661213E-01 -4.884605E-02 -1.408161E-02 -1.982916E-04 -2.416436E-01 -5.839162E-02 -3.056900E-01 -6.814222E-02 -2.122374E-01 -4.047759E-02 -1.213052E-01 -1.471494E-02 -2.817468E-02 -7.938125E-04 -4.695682E-02 -2.204943E-03 -1.915132E-01 -3.667731E-02 -2.369382E-02 -5.613973E-04 -3.033090E-03 -9.199635E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.103456E-02 -3.725218E-03 -1.882024E-02 -3.542015E-04 -1.002636E-01 -1.005280E-02 -7.170265E-02 -5.141270E-03 -5.290853E-02 -2.799313E-03 -6.869492E-02 -2.504127E-03 -1.500984E-01 -1.135598E-02 -6.108774E-02 -1.877322E-03 -6.278377E-02 -3.941802E-03 -1.022721E-02 -1.045959E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.993308E-02 -1.594651E-03 -2.687749E-02 -7.223997E-04 -0.000000E+00 -0.000000E+00 -4.755032E-02 -2.261033E-03 -1.796225E-02 -1.867762E-04 -2.500575E-01 -3.399577E-02 -2.773690E-01 -3.591173E-02 -1.805687E-01 -1.682597E-02 -2.000235E-01 -2.326675E-02 -1.392489E-01 -6.559818E-03 -7.549772E-01 -1.676529E-01 -7.060644E-01 -1.743673E-01 -8.058118E-01 -2.813447E-01 -4.231245E-01 -6.474373E-02 -1.296487E-02 -1.680878E-04 -6.363948E-03 -4.049983E-05 -3.776758E-02 -1.124903E-03 -1.638174E-02 -2.683614E-04 -4.231982E-03 -1.790967E-05 -5.098742E-02 -1.326815E-03 -1.909233E-01 -1.640214E-02 -2.126367E-01 -1.609441E-02 -3.843095E-01 -8.542147E-02 -1.156625E-02 -6.274892E-05 -9.148553E-02 -3.520727E-03 -5.974176E-01 -1.529417E-01 -3.615961E-01 -4.335834E-02 -2.083963E-01 -1.447201E-02 -0.000000E+00 -0.000000E+00 -1.706793E-01 -1.567394E-02 -4.061529E-01 -5.625387E-02 -6.831757E-01 -1.921612E-01 -4.061388E-01 -4.915675E-02 -7.817234E-02 -3.239000E-03 -1.276897E-01 -7.068786E-03 -3.439888E-01 -3.009075E-02 -4.917005E-01 -9.598551E-02 -2.505637E-01 -3.052234E-02 -1.012580E-01 -3.512005E-03 -8.694033E-02 -3.888202E-03 -4.532457E-01 -1.306139E-01 -5.125240E-01 -1.341966E-01 -2.948195E-01 -5.482499E-02 -3.624902E-02 -7.508096E-04 -5.267973E-03 -2.775154E-05 -2.680717E-02 -4.494477E-04 -3.781548E-02 -1.430011E-03 -6.093125E-02 -3.265771E-03 -6.537957E-03 -3.480947E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.052521E-02 -2.552797E-03 -6.366843E-02 -4.053669E-03 -5.584543E-02 -3.118712E-03 -5.260513E-03 -2.767300E-05 -1.561392E-02 -2.437944E-04 -1.060723E-01 -1.125133E-02 -1.260207E-01 -1.588121E-02 -2.123434E-02 -4.508974E-04 -7.247317E-02 -5.252360E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.123486E-01 -1.262220E-02 -1.001916E-01 -1.003836E-02 -1.365382E-01 -1.864269E-02 -5.905816E-02 -3.487866E-03 -3.585125E-03 -1.285312E-05 -0.000000E+00 -0.000000E+00 -2.010958E-01 -2.380672E-02 -2.300029E-01 -4.223133E-02 -3.158008E-02 -9.697567E-04 -3.941864E-02 -1.491640E-03 -1.018795E-01 -5.737457E-03 -7.404522E-01 -2.753307E-01 -3.876823E-01 -7.542264E-02 -3.136245E-01 -6.137180E-02 -2.469068E-01 -4.024613E-02 -3.986846E-01 -9.373937E-02 -3.763834E-01 -7.465653E-02 -4.504989E-01 -1.065055E-01 -3.665060E-01 -7.760850E-02 -2.193902E-01 -2.951258E-02 -4.781216E-02 -2.286003E-03 -2.202397E-01 -4.850551E-02 -1.767166E-01 -3.122875E-02 -4.736785E-02 -2.243713E-03 -7.027373E-02 -4.938397E-03 -0.000000E+00 -0.000000E+00 -1.196671E-02 -1.432021E-04 -1.035600E-01 -1.072467E-02 -3.438061E-02 -1.182026E-03 -0.000000E+00 -0.000000E+00 -1.671151E-01 -1.372626E-02 -3.895971E-01 -7.334028E-02 -3.496464E-01 -5.295532E-02 -3.701678E-01 -6.284342E-02 -1.082802E-01 -5.004071E-03 -1.021035E-01 -5.418111E-03 -3.287526E-01 -6.027052E-02 -7.227837E-01 -2.121855E-01 -3.815141E-01 -6.531564E-02 -6.535246E-02 -1.675612E-03 -2.163211E-01 -1.690100E-02 -5.009361E-01 -1.070866E-01 -7.448207E-01 -1.928387E-01 -3.496441E-01 -5.779330E-02 -1.920319E-01 -1.278333E-02 -1.741641E-01 -1.172464E-02 -6.842020E-01 -1.550861E-01 -6.141334E-01 -1.510617E-01 -4.525725E-01 -6.358762E-02 -2.132168E-01 -2.585479E-02 -1.245358E-01 -9.953467E-03 -2.306883E-01 -2.577748E-02 -4.692996E-01 -1.102387E-01 -4.368682E-01 -1.229075E-01 -1.001881E-01 -1.003766E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.598969E-02 -6.754641E-04 -1.947989E-01 -3.794660E-02 -2.389312E-02 -5.708810E-04 -2.161317E-02 -4.671292E-04 -1.694900E-02 -2.872686E-04 -1.748334E-01 -1.071107E-02 -6.475933E-01 -1.916446E-01 -5.269398E-01 -7.572050E-02 -2.078749E-01 -1.010486E-02 -7.856562E-02 -2.754145E-03 -3.231145E-01 -2.728292E-02 -9.551460E-01 -1.897020E-01 -9.998041E-01 -2.301423E-01 -8.040751E-01 -1.662941E-01 -3.493832E-01 -5.034209E-02 -7.957969E-04 -6.332927E-07 -6.440266E-03 -4.147702E-05 -5.077525E-02 -1.622275E-03 -1.424936E-03 -2.030442E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.610051E-03 -5.005488E-05 -4.838132E-02 -1.174361E-03 -7.867771E-02 -4.497312E-03 -1.155890E-01 -5.286198E-03 -1.371030E-02 -1.295059E-04 -1.108586E-01 -9.612284E-03 -4.826639E-01 -6.792237E-02 -8.138342E-01 -2.277442E-01 -7.166175E-01 -1.728010E-01 -2.805134E-01 -6.615031E-02 -3.994467E-02 -1.225601E-03 -1.952619E-01 -1.970875E-02 -2.998948E-01 -3.021082E-02 -5.099949E-01 -1.027077E-01 -2.921758E-01 -3.570411E-02 -4.147186E-02 -1.719915E-03 -5.058919E-02 -2.559267E-03 -5.015711E-02 -2.515736E-03 -2.693791E-02 -7.256511E-04 -2.147581E-02 -4.612104E-04 -0.000000E+00 -0.000000E+00 -6.387684E-02 -4.080251E-03 -1.094971E-01 -1.198962E-02 -9.427537E-02 -8.887845E-03 -2.923151E-02 -8.544813E-04 -2.624381E-02 -6.887377E-04 -4.355175E-02 -1.896755E-03 -0.000000E+00 -0.000000E+00 -1.421529E-02 -2.020745E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.138850E-01 -1.296980E-02 -1.172963E-01 -1.177552E-02 -2.924843E-02 -8.554706E-04 -8.344730E-02 -6.963452E-03 -1.790908E-02 -3.207351E-04 -2.040429E-01 -1.744156E-02 -1.211707E-01 -5.550660E-03 -1.701424E-01 -2.481600E-02 -1.002444E-01 -5.042870E-03 -2.021413E-02 -2.328403E-04 -6.084830E-02 -2.277218E-03 -1.413276E-01 -8.366252E-03 -4.405590E-01 -7.188019E-02 -1.487591E-01 -1.009388E-02 -6.017484E-02 -1.257458E-03 -3.004237E-01 -2.446519E-02 -5.279204E-01 -1.081350E-01 -8.465321E-01 -2.103958E-01 -1.552158E-01 -1.298814E-02 -0.000000E+00 -0.000000E+00 -2.888777E-02 -8.345031E-04 -2.329054E-02 -5.424494E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.081901E-01 -9.386530E-03 -8.332276E-02 -3.925875E-03 -8.296972E-02 -2.891331E-03 -1.032723E-01 -1.066517E-02 -9.772983E-03 -9.551120E-05 -1.219378E-01 -6.969079E-03 -9.915707E-01 -4.393682E-01 -9.272640E-01 -2.840601E-01 -3.397731E-01 -3.599673E-02 -8.532717E-02 -5.629784E-03 -6.002200E-02 -3.602641E-03 -1.818609E-01 -2.816973E-02 -6.101278E-02 -1.779898E-03 -2.443820E-01 -4.179131E-02 -1.093240E-02 -1.195173E-04 -6.876526E-02 -4.728661E-03 -8.316908E-02 -6.917096E-03 -1.081239E-01 -1.169078E-02 -1.278570E-01 -1.634740E-02 -9.675530E-03 -9.361588E-05 -9.856127E-02 -9.450352E-03 -2.776843E-01 -2.251458E-02 -2.729358E-01 -2.241731E-02 -3.224249E-01 -3.902131E-02 -1.914486E-01 -1.415525E-02 -9.185279E-02 -2.506762E-03 -4.830178E-01 -8.863933E-02 -4.101232E-01 -4.592759E-02 -3.403773E-01 -3.821650E-02 -6.239298E-02 -3.080815E-03 -2.334112E-01 -2.816844E-02 -1.739766E-01 -9.302684E-03 -2.487991E-01 -2.194966E-02 -3.181942E-01 -4.445972E-02 -2.217247E-01 -2.828637E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.135048E-02 -1.286237E-03 -9.931438E-02 -3.987034E-03 -2.564604E-01 -2.381251E-02 -1.181685E-01 -1.098800E-02 -2.613830E-02 -6.832108E-04 -1.349020E-01 -9.203532E-03 -3.697105E-01 -5.338092E-02 -2.499389E-01 -2.180370E-02 -4.074931E-01 -1.098694E-01 -1.693429E-01 -2.787369E-02 -2.308936E-02 -5.331186E-04 -2.306473E-02 -5.319816E-04 -3.265979E-02 -1.066662E-03 -4.652999E-02 -1.123132E-03 -1.320619E-02 -1.744035E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.505900E-03 -1.229134E-05 -9.693909E-03 -9.397187E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.671218E-03 -4.450515E-05 -1.690165E-02 -2.856656E-04 -4.535546E-02 -2.057118E-03 -2.502937E-02 -6.264694E-04 -0.000000E+00 -0.000000E+00 -1.407189E-01 -8.385178E-03 -6.553520E-01 -1.368142E-01 -7.364116E-01 -2.092852E-01 -2.883891E-01 -3.909406E-02 -1.093246E-01 -4.852421E-03 -2.293298E-01 -4.898244E-02 -4.270630E-01 -6.379483E-02 -9.527555E-01 -2.965419E-01 -6.135966E-01 -1.129598E-01 -2.074613E-01 -1.387546E-02 -1.218120E-01 -8.320365E-03 -3.540331E-01 -4.277873E-02 -4.247827E-01 -1.151498E-01 -1.813918E-01 -1.241482E-02 -1.844365E-01 -1.258527E-02 -3.413147E-02 -1.164957E-03 -7.037565E-02 -4.952732E-03 -5.331322E-02 -2.842300E-03 -3.452221E-02 -1.191783E-03 -7.549480E-03 -5.699464E-05 -0.000000E+00 -0.000000E+00 -2.420999E-03 -5.861235E-06 -1.304317E-02 -1.701243E-04 -1.026300E-02 -1.053291E-04 -3.834849E-03 -1.470607E-05 -0.000000E+00 -0.000000E+00 -1.821153E-02 -3.082330E-04 -4.939295E-02 -2.418298E-03 -6.791796E-02 -2.397124E-03 -2.399913E-02 -3.987283E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.597861E-02 -4.091941E-04 -2.242527E-01 -2.514564E-02 -5.206791E-01 -1.362375E-01 -4.278034E-01 -1.072683E-01 -9.357104E-02 -5.085882E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.342225E-01 -5.486020E-02 -5.223619E-02 -2.728620E-03 -0.000000E+00 -0.000000E+00 -1.984032E-02 -1.969113E-04 -2.869380E-01 -4.229853E-02 -3.629156E-01 -7.722199E-02 -2.502239E-01 -4.462235E-02 -8.444045E-02 -5.785634E-03 -1.620300E-02 -2.625372E-04 -6.997979E-02 -4.897171E-03 -3.530199E-01 -1.165189E-01 -1.378799E-01 -1.449576E-02 -1.074160E-02 -1.153821E-04 -0.000000E+00 -0.000000E+00 -7.188581E-03 -5.167569E-05 -6.117296E-02 -3.742131E-03 -0.000000E+00 -0.000000E+00 -3.202160E-02 -1.025383E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.967116E-02 -5.487836E-03 -1.829027E-01 -1.387718E-02 -1.993434E-01 -2.068827E-02 -2.310943E-01 -3.674924E-02 -3.608376E-02 -7.095323E-04 -2.648305E-01 -2.560867E-02 -6.774169E-01 -1.235927E-01 -1.037935E+00 -2.855546E-01 -5.833780E-01 -8.095663E-02 -1.891854E-01 -1.421043E-02 -6.099779E-02 -3.720731E-03 -5.099107E-02 -2.600089E-03 -1.065628E-01 -5.688451E-03 -9.118831E-02 -5.498265E-03 -7.642950E-02 -5.841468E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.981344E-02 -4.696907E-04 -1.681761E-01 -1.587875E-02 -1.460569E-02 -2.133262E-04 -1.890566E-02 -3.574241E-04 -3.936450E-02 -1.549564E-03 -1.319270E-01 -1.740475E-02 -1.611774E-01 -2.597816E-02 -4.975424E-04 -2.475484E-07 -0.000000E+00 -0.000000E+00 -1.454593E-02 -2.115842E-04 -1.328306E-02 -1.764397E-04 -2.997538E-03 -8.985237E-06 -0.000000E+00 -0.000000E+00 -1.281814E-04 -1.643047E-08 -5.988861E-03 -3.586645E-05 -5.614799E-02 -3.152596E-03 -1.644952E-02 -2.705866E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.309090E-02 -2.818643E-03 -1.002246E-01 -1.004498E-02 -1.453451E-01 -2.112519E-02 -4.547262E-03 -2.067759E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.735945E+00 +1.730332E+00 +1.183844E+01 +3.019848E+01 +1.124996E+01 +2.695006E+01 +8.666721E+00 +1.565510E+01 +3.208395E+00 +2.224532E+00 +9.142422E+00 +1.836800E+01 +2.737713E+01 +1.616026E+02 +3.109025E+01 +2.077063E+02 +2.441723E+01 +1.239858E+02 +8.961378E+00 +1.734852E+01 +3.366946E+00 +2.679164E+00 +1.036680E+01 +2.303250E+01 +1.164055E+01 +2.901348E+01 +8.779036E+00 +1.631915E+01 +4.067773E+00 +3.740384E+00 +3.614413E+00 +3.328712E+00 +1.075780E+01 +2.407723E+01 +1.347969E+01 +3.978344E+01 +1.117709E+01 +2.720682E+01 +3.469883E+00 +2.806129E+00 diff --git a/tests/test_filter_polar/tallies.xml b/tests/test_filter_polar/tallies.xml index 0dfa24f272..5da81f518a 100644 --- a/tests/test_filter_polar/tallies.xml +++ b/tests/test_filter_polar/tallies.xml @@ -5,7 +5,7 @@ regular -182.07 -182.07 182.07 182.07 - 17 17 + 2 2
From a07300d53d5f1bffb325b177002876156a693579 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 5 Oct 2015 09:50:44 -0400 Subject: [PATCH 299/519] added delayedgroup filter and delayed-nu-fission tests and updated relaxng schema --- openmc/filter.py | 4 +- src/input_xml.F90 | 13 + src/relaxng/tallies.rnc | 6 +- src/relaxng/tallies.rng | 2 + tests/test_filter_delayedgroup/geometry.xml | 181 ++++++++++++ tests/test_filter_delayedgroup/materials.xml | 272 ++++++++++++++++++ .../test_filter_delayedgroup/results_true.dat | 15 + tests/test_filter_delayedgroup/settings.xml | 19 ++ tests/test_filter_delayedgroup/tallies.xml | 10 + .../test_filter_delayedgroup.py | 10 + tests/test_many_scores/results_true.dat | 2 + tests/test_many_scores/tallies.xml | 2 +- .../test_score_delayed_nufission/geometry.xml | 181 ++++++++++++ .../materials.xml | 272 ++++++++++++++++++ .../results_true.dat | 29 ++ .../test_score_delayed_nufission/settings.xml | 19 ++ .../test_score_delayed_nufission/tallies.xml | 21 ++ .../test_score_delayed_nufission.py | 10 + 18 files changed, 1063 insertions(+), 5 deletions(-) create mode 100644 tests/test_filter_delayedgroup/geometry.xml create mode 100644 tests/test_filter_delayedgroup/materials.xml create mode 100644 tests/test_filter_delayedgroup/results_true.dat create mode 100644 tests/test_filter_delayedgroup/settings.xml create mode 100644 tests/test_filter_delayedgroup/tallies.xml create mode 100644 tests/test_filter_delayedgroup/test_filter_delayedgroup.py create mode 100644 tests/test_score_delayed_nufission/geometry.xml create mode 100644 tests/test_score_delayed_nufission/materials.xml create mode 100644 tests/test_score_delayed_nufission/results_true.dat create mode 100644 tests/test_score_delayed_nufission/settings.xml create mode 100644 tests/test_score_delayed_nufission/tallies.xml create mode 100644 tests/test_score_delayed_nufission/test_score_delayed_nufission.py diff --git a/openmc/filter.py b/openmc/filter.py index 6dd4bdaff6..fc217a4108 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -9,7 +9,7 @@ from openmc.checkvalue import check_type, check_iterable_type, \ check_greater_than, _isinstance _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', - 'mesh', 'energy', 'energyout', 'distribcell'] + 'mesh', 'energy', 'energyout', 'distribcell', 'delayedgroup'] class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally @@ -136,7 +136,7 @@ class Filter(object): bins = list(bins) if self.type in ['cell', 'cellborn', 'surface', 'material', - 'universe', 'distribcell']: + 'universe', 'distribcell', 'delayedgroup']: check_iterable_type('filter bins', bins, Integral) for edge in bins: check_greater_than('filter bin', edge, 0, equality=True) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 6cc41ad461..3d5d1f9a91 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2634,6 +2634,19 @@ contains allocate(t % nuclide_bins(1)) t % nuclide_bins(1) = -1 t % n_nuclide_bins = 1 + + ! Check if a delayedgroup filter is present for this tally + do l = 1, t % n_filters + if (t % filters(l) % type == FILTER_DELAYEDGROUP) then + call warning("A delayedgroup filter was used on a total nuclide & + &tally. Cross section libraries are not guaranteed to have the& + & same delayed group structure across all isotopes. In & + &particular, ENDF/B-VII.1 does not have a consistent delayed & + &group structure across all isotopes while the JEFF 3.1.1 & + &library has the same delayed group structure across all & + &isotopes. Use with caution!") + end if + end do end if ! ======================================================================= diff --git a/src/relaxng/tallies.rnc b/src/relaxng/tallies.rnc index ee93d273cb..155f379d88 100644 --- a/src/relaxng/tallies.rnc +++ b/src/relaxng/tallies.rnc @@ -23,9 +23,11 @@ element tallies { attribute estimator { ( "analog" | "tracklength" ) })? & element filter { (element type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" ) } | + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | + "delayedgroup" ) } | attribute type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" ) }) & + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | + "delayedgroup" ) }) & (element bins { list { xsd:double+ } } | attribute bins { list { xsd:double+ } }) }* & diff --git a/src/relaxng/tallies.rng b/src/relaxng/tallies.rng index 76973e8556..d2cd9271ee 100644 --- a/src/relaxng/tallies.rng +++ b/src/relaxng/tallies.rng @@ -145,6 +145,7 @@ mesh energy energyout + delayedgroup @@ -158,6 +159,7 @@ mesh energy energyout + delayedgroup diff --git a/tests/test_filter_delayedgroup/geometry.xml b/tests/test_filter_delayedgroup/geometry.xml new file mode 100644 index 0000000000..b85dd04df9 --- /dev/null +++ b/tests/test_filter_delayedgroup/geometry.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + + + diff --git a/tests/test_filter_delayedgroup/materials.xml b/tests/test_filter_delayedgroup/materials.xml new file mode 100644 index 0000000000..9c0b74f3f1 --- /dev/null +++ b/tests/test_filter_delayedgroup/materials.xml @@ -0,0 +1,272 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_filter_delayedgroup/results_true.dat b/tests/test_filter_delayedgroup/results_true.dat new file mode 100644 index 0000000000..d6ba0cb6c8 --- /dev/null +++ b/tests/test_filter_delayedgroup/results_true.dat @@ -0,0 +1,15 @@ +k-combined: +1.005983E+00 2.248579E-02 +tally 1: +6.113115E-04 +7.519723E-08 +3.155402E-03 +2.003485E-06 +3.012421E-03 +1.826030E-06 +6.754096E-03 +9.179334E-06 +2.769084E-03 +1.542940E-06 +1.159960E-03 +2.707463E-07 diff --git a/tests/test_filter_delayedgroup/settings.xml b/tests/test_filter_delayedgroup/settings.xml new file mode 100644 index 0000000000..517637a59f --- /dev/null +++ b/tests/test_filter_delayedgroup/settings.xml @@ -0,0 +1,19 @@ + + + + + 10 + 5 + 100 + + + + + + -160 -160 -183 + 160 160 183 + + + + + diff --git a/tests/test_filter_delayedgroup/tallies.xml b/tests/test_filter_delayedgroup/tallies.xml new file mode 100644 index 0000000000..b3649b4697 --- /dev/null +++ b/tests/test_filter_delayedgroup/tallies.xml @@ -0,0 +1,10 @@ + + + + + + delayed-nu-fission + U-235 + + + diff --git a/tests/test_filter_delayedgroup/test_filter_delayedgroup.py b/tests/test_filter_delayedgroup/test_filter_delayedgroup.py new file mode 100644 index 0000000000..1777db993e --- /dev/null +++ b/tests/test_filter_delayedgroup/test_filter_delayedgroup.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index bb151ae0e8..a71706b632 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -109,3 +109,5 @@ tally 1: 7.673412E-04 1.014000E+01 3.427342E+01 +7.652723E-03 +3.578992E-05 \ No newline at end of file diff --git a/tests/test_many_scores/tallies.xml b/tests/test_many_scores/tallies.xml index 1832acf67a..2df5597d04 100644 --- a/tests/test_many_scores/tallies.xml +++ b/tests/test_many_scores/tallies.xml @@ -6,7 +6,7 @@ flux total scatter nu-scatter scatter-2 scatter-p2 nu-scatter-2 nu-scatter-p2 transport n1n absorption nu-fission kappa-fission - flux-y2 total-y2 scatter-y2 nu-scatter-y2 events + flux-y2 total-y2 scatter-y2 nu-scatter-y2 events delayed-nu-fission diff --git a/tests/test_score_delayed_nufission/geometry.xml b/tests/test_score_delayed_nufission/geometry.xml new file mode 100644 index 0000000000..b85dd04df9 --- /dev/null +++ b/tests/test_score_delayed_nufission/geometry.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 + 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + + + + 17 17 + -10.71 -10.71 + 1.26 1.26 + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 + 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 + 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 + 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 + 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + + + + + + 21 21 + -224.91 -224.91 + 21.42 21.42 + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 + 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 + 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 + 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + + + diff --git a/tests/test_score_delayed_nufission/materials.xml b/tests/test_score_delayed_nufission/materials.xml new file mode 100644 index 0000000000..9c0b74f3f1 --- /dev/null +++ b/tests/test_score_delayed_nufission/materials.xml @@ -0,0 +1,272 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_score_delayed_nufission/results_true.dat b/tests/test_score_delayed_nufission/results_true.dat new file mode 100644 index 0000000000..4af4a49616 --- /dev/null +++ b/tests/test_score_delayed_nufission/results_true.dat @@ -0,0 +1,29 @@ +k-combined: +1.005983E+00 2.248579E-02 +tally 1: +1.432287E-02 +4.518735E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.531355E-02 +5.079890E-05 +tally 2: +1.576415E-02 +2.485084E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +tally 3: +1.365224E-02 +3.952118E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.442838E-02 +4.559807E-05 diff --git a/tests/test_score_delayed_nufission/settings.xml b/tests/test_score_delayed_nufission/settings.xml new file mode 100644 index 0000000000..517637a59f --- /dev/null +++ b/tests/test_score_delayed_nufission/settings.xml @@ -0,0 +1,19 @@ + + + + + 10 + 5 + 100 + + + + + + -160 -160 -183 + 160 160 183 + + + + + diff --git a/tests/test_score_delayed_nufission/tallies.xml b/tests/test_score_delayed_nufission/tallies.xml new file mode 100644 index 0000000000..5ca1409859 --- /dev/null +++ b/tests/test_score_delayed_nufission/tallies.xml @@ -0,0 +1,21 @@ + + + + + + delayed-nu-fission + + + + + delayed-nu-fission + analog + + + + + delayed-nu-fission + collision + + + diff --git a/tests/test_score_delayed_nufission/test_score_delayed_nufission.py b/tests/test_score_delayed_nufission/test_score_delayed_nufission.py new file mode 100644 index 0000000000..1777db993e --- /dev/null +++ b/tests/test_score_delayed_nufission/test_score_delayed_nufission.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() From c20eda4f9e0109fc701912b139b502ef0aed714f Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 5 Oct 2015 10:01:05 -0400 Subject: [PATCH 300/519] added delayedgroup filter case to state point file --- src/state_point.F90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/state_point.F90 b/src/state_point.F90 index dc2710df99..d5267c4160 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -258,6 +258,8 @@ contains call write_dataset(filter_group, "type", "energyout") case(FILTER_DISTRIBCELL) call write_dataset(filter_group, "type", "distribcell") + case(FILTER_DELAYEDGROUP) + call write_dataset(filter_group, "type", "delayedgroup") end select call write_dataset(filter_group, "offset", tally%filters(j)%offset) From 66ee8358d66d030689fd98b3f64da9861715713b Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 5 Oct 2015 10:12:04 -0400 Subject: [PATCH 301/519] added new line to end of test many scores results file --- tests/test_many_scores/results_true.dat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index a71706b632..6209bd6a2d 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -110,4 +110,4 @@ tally 1: 1.014000E+01 3.427342E+01 7.652723E-03 -3.578992E-05 \ No newline at end of file +3.578992E-05 From d462a1717e5f4e4cef313e81b360881c29fc9446 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 6 Oct 2015 20:30:34 -0400 Subject: [PATCH 302/519] Updating tests to ue new Python API test suite --- tests/test_filter_azimuthal/geometry.xml | 181 -- tests/test_filter_azimuthal/inputs_true.dat | 1 + tests/test_filter_azimuthal/materials.xml | 272 --- tests/test_filter_azimuthal/results_true.dat | 142 +- tests/test_filter_azimuthal/settings.xml | 19 - tests/test_filter_azimuthal/tallies.xml | 34 - .../test_filter_azimuthal.py | 55 +- tests/test_filter_mu/geometry.xml | 181 -- tests/test_filter_mu/inputs_true.dat | 1 + tests/test_filter_mu/materials.xml | 272 --- tests/test_filter_mu/results_true.dat | 214 +- tests/test_filter_mu/settings.xml | 19 - tests/test_filter_mu/tallies.xml | 27 - tests/test_filter_mu/test_filter_mu.py | 49 +- tests/test_filter_polar/geometry.xml | 181 -- tests/test_filter_polar/inputs_true.dat | 1 + tests/test_filter_polar/materials.xml | 272 --- tests/test_filter_polar/results_true.dat | 142 +- tests/test_filter_polar/settings.xml | 19 - tests/test_filter_polar/tallies.xml | 34 - tests/test_filter_polar/test_filter_polar.py | 55 +- tests/test_score_flux_yn/results_true.dat | 1944 ++++++++--------- .../test_score_nuscatter_yn/results_true.dat | 16 +- tests/test_score_scatter_yn/results_true.dat | 24 +- tests/test_score_total_yn/results_true.dat | 288 +-- 25 files changed, 1548 insertions(+), 2895 deletions(-) delete mode 100644 tests/test_filter_azimuthal/geometry.xml create mode 100644 tests/test_filter_azimuthal/inputs_true.dat delete mode 100644 tests/test_filter_azimuthal/materials.xml delete mode 100644 tests/test_filter_azimuthal/settings.xml delete mode 100644 tests/test_filter_azimuthal/tallies.xml delete mode 100644 tests/test_filter_mu/geometry.xml create mode 100644 tests/test_filter_mu/inputs_true.dat delete mode 100644 tests/test_filter_mu/materials.xml delete mode 100644 tests/test_filter_mu/settings.xml delete mode 100644 tests/test_filter_mu/tallies.xml delete mode 100644 tests/test_filter_polar/geometry.xml create mode 100644 tests/test_filter_polar/inputs_true.dat delete mode 100644 tests/test_filter_polar/materials.xml delete mode 100644 tests/test_filter_polar/settings.xml delete mode 100644 tests/test_filter_polar/tallies.xml diff --git a/tests/test_filter_azimuthal/geometry.xml b/tests/test_filter_azimuthal/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_azimuthal/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_azimuthal/inputs_true.dat b/tests/test_filter_azimuthal/inputs_true.dat new file mode 100644 index 0000000000..42b6e820be --- /dev/null +++ b/tests/test_filter_azimuthal/inputs_true.dat @@ -0,0 +1 @@ +1d5f81d12f607f4a8436dfb65167e2a2be55dbf86fbc2cc465cec274671be5eaff517d781a4d40e264bb695e3c66c7ff61a650217c99de2ca8c15ca747fe6b80 \ No newline at end of file diff --git a/tests/test_filter_azimuthal/materials.xml b/tests/test_filter_azimuthal/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_azimuthal/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_azimuthal/results_true.dat b/tests/test_filter_azimuthal/results_true.dat index 1141e186cd..7883a730d4 100644 --- a/tests/test_filter_azimuthal/results_true.dat +++ b/tests/test_filter_azimuthal/results_true.dat @@ -1,76 +1,76 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -4.425771E+01 -3.941365E+02 -4.568410E+01 -4.186261E+02 -4.331348E+01 -3.761395E+02 -4.303935E+01 -3.722809E+02 -4.442206E+01 -3.973876E+02 +4.215917E+01 +3.561920E+02 +4.174788E+01 +3.505184E+02 +4.603223E+01 +4.242918E+02 +4.496760E+01 +4.075599E+02 +4.088099E+01 +3.376516E+02 tally 2: -4.465691E+01 -4.000577E+02 -4.493676E+01 -4.042794E+02 -4.526714E+01 -4.105857E+02 -4.187211E+01 -3.514841E+02 -4.448687E+01 -3.969539E+02 +4.157239E+01 +3.482158E+02 +4.227810E+01 +3.613293E+02 +4.376107E+01 +3.835007E+02 +4.644205E+01 +4.327195E+02 +4.191554E+01 +3.522147E+02 tally 3: -4.425771E+01 -3.941365E+02 -4.568410E+01 -4.186261E+02 -4.333417E+01 -3.764991E+02 -4.301865E+01 -3.719138E+02 -4.442206E+01 -3.973876E+02 +4.215917E+01 +3.561920E+02 +4.174788E+01 +3.505184E+02 +4.603223E+01 +4.242918E+02 +4.496402E+01 +4.075053E+02 +4.088458E+01 +3.377000E+02 tally 4: -7.168838E+00 -1.042163E+01 -7.971487E+00 -1.403081E+01 -7.476834E+00 -1.127244E+01 -7.777042E+00 -1.297721E+01 -7.305258E+00 -1.147474E+01 -2.136566E+01 -1.013300E+02 -2.111266E+01 -9.951975E+01 -1.879003E+01 -7.275943E+01 -1.902839E+01 -7.679731E+01 -2.069167E+01 -8.887050E+01 -7.056683E+00 -1.113235E+01 -8.240024E+00 -1.529926E+01 -7.945092E+00 -1.293685E+01 -7.537498E+00 -1.182572E+01 -7.441808E+00 -1.244441E+01 -8.434401E+00 -1.529856E+01 -8.211747E+00 -1.474916E+01 -8.883874E+00 -1.644290E+01 -8.356120E+00 -1.491287E+01 -8.612737E+00 -1.659522E+01 +1.531988E+01 +4.816326E+01 +9.274393E+00 +1.821174E+01 +1.595868E+01 +5.124238E+01 +1.299895E+00 +6.417145E-01 +1.510024E+01 +4.604170E+01 +8.533361E+00 +1.462765E+01 +1.658141E+01 +5.595629E+01 +1.427417E+00 +6.621807E-01 +1.683102E+01 +5.741400E+01 +9.845257E+00 +2.028406E+01 +1.773179E+01 +6.477077E+01 +1.536972E+00 +6.111079E-01 +1.586070E+01 +5.360975E+01 +9.928220E+00 +2.089005E+01 +1.737609E+01 +6.161847E+01 +1.700608E+00 +8.439708E-01 +1.607027E+01 +5.490113E+01 +7.569336E+00 +1.280955E+01 +1.606086E+01 +5.308665E+01 +9.898901E-01 +3.143027E-01 diff --git a/tests/test_filter_azimuthal/settings.xml b/tests/test_filter_azimuthal/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_azimuthal/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_azimuthal/tallies.xml b/tests/test_filter_azimuthal/tallies.xml deleted file mode 100644 index 6ca5413879..0000000000 --- a/tests/test_filter_azimuthal/tallies.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - regular - -182.07 -182.07 - 182.07 182.07 - 2 2 - - - - - flux - - - - - flux - analog - - - - - - flux - - - - - - flux - - - diff --git a/tests/test_filter_azimuthal/test_filter_azimuthal.py b/tests/test_filter_azimuthal/test_filter_azimuthal.py index 1777db993e..f0fff52047 100644 --- a/tests/test_filter_azimuthal/test_filter_azimuthal.py +++ b/tests/test_filter_azimuthal/test_filter_azimuthal.py @@ -1,10 +1,59 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + +class FilterAzimuthalTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='azimuthal', + bins=(-3.1416, -1.8850, -0.6283, 0.6283, 1.8850, + 3.1416)) + tally1 = openmc.Tally(tally_id=1) + tally1.add_filter(filt1) + tally1.add_score('flux') + tally1.estimator = 'tracklength' + + tally2 = openmc.Tally(tally_id=2) + tally2.add_filter(filt1) + tally2.add_score('flux') + tally2.estimator = 'analog' + + filt3 = openmc.Filter(type='azimuthal', bins=(5)) + tally3 = openmc.Tally(tally_id=3) + tally3.add_filter(filt3) + tally3.add_score('flux') + tally3.estimator = 'tracklength' + + mesh = openmc.Mesh(mesh_id=1) + mesh.lower_left = [-182.07, -182.07] + mesh.upper_right = [182.07, 182.07] + mesh.dimension = [2, 2] + filt_mesh = openmc.Filter(type='mesh', bins=(1)) + tally4 = openmc.Tally(tally_id=4) + tally4.add_filter(filt3) + tally4.add_filter(filt_mesh) + tally4.add_score('flux') + tally4.estimator = 'tracklength' + + + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally1) + self._input_set.tallies.add_tally(tally2) + self._input_set.tallies.add_tally(tally3) + self._input_set.tallies.add_tally(tally4) + self._input_set.tallies.add_mesh(mesh) + + super(FilterAzimuthalTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterAzimuthalTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterAzimuthalTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_mu/geometry.xml b/tests/test_filter_mu/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_mu/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_mu/inputs_true.dat b/tests/test_filter_mu/inputs_true.dat new file mode 100644 index 0000000000..b0a607ad34 --- /dev/null +++ b/tests/test_filter_mu/inputs_true.dat @@ -0,0 +1 @@ +cd2aeb24baafe9a904e697955990f6cffb5f25618fdf8c972775715bfe6e92bc259e36fd2b5addff8181439de58ad6f530972ec391e827f46146a2aaace34358 \ No newline at end of file diff --git a/tests/test_filter_mu/materials.xml b/tests/test_filter_mu/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_mu/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_mu/results_true.dat b/tests/test_filter_mu/results_true.dat index c3fbf729bb..e647a46ec0 100644 --- a/tests/test_filter_mu/results_true.dat +++ b/tests/test_filter_mu/results_true.dat @@ -1,101 +1,121 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.238000E+01 -3.065560E+01 -1.239000E+01 -3.070450E+01 -1.397000E+01 -3.913670E+01 -1.397000E+01 -3.913670E+01 -3.167000E+01 -2.010715E+02 -3.167000E+01 -2.010715E+02 -7.216000E+01 -1.042565E+03 -7.216000E+01 -1.042565E+03 +1.241000E+01 +3.088870E+01 +1.241000E+01 +3.088870E+01 +1.364000E+01 +3.727140E+01 +1.364000E+01 +3.727140E+01 +3.251000E+01 +2.118597E+02 +3.251000E+01 +2.118597E+02 +7.297000E+01 +1.066904E+03 +7.297000E+01 +1.066904E+03 tally 2: -1.238000E+01 -3.065560E+01 -1.239000E+01 -3.070450E+01 -1.397000E+01 -3.913670E+01 -1.397000E+01 -3.913670E+01 -3.167000E+01 -2.010715E+02 -3.167000E+01 -2.010715E+02 -7.216000E+01 -1.042565E+03 -7.216000E+01 -1.042565E+03 +9.880000E+00 +1.964520E+01 +9.880000E+00 +1.964520E+01 +1.022000E+01 +2.099620E+01 +1.022000E+01 +2.099620E+01 +1.479000E+01 +4.397670E+01 +1.479000E+01 +4.397670E+01 +3.470000E+01 +2.412094E+02 +3.470000E+01 +2.412094E+02 +6.194000E+01 +7.687326E+02 +6.194000E+01 +7.687326E+02 tally 3: -2.010000E+00 -8.185000E-01 -2.010000E+00 -8.185000E-01 -2.290000E+00 -1.101500E+00 -2.290000E+00 -1.101500E+00 -5.210000E+00 -5.469700E+00 -5.210000E+00 -5.469700E+00 -1.169000E+01 -2.756770E+01 -1.169000E+01 -2.756770E+01 -5.660000E+00 -6.866200E+00 -5.670000E+00 -6.881500E+00 -6.210000E+00 -8.343100E+00 -6.210000E+00 -8.343100E+00 -1.394000E+01 -4.207080E+01 -1.394000E+01 -4.207080E+01 -3.175000E+01 -2.109401E+02 -3.175000E+01 -2.109401E+02 -2.190000E+00 -1.105100E+00 -2.190000E+00 -1.105100E+00 -2.630000E+00 -1.495100E+00 -2.630000E+00 -1.495100E+00 -6.190000E+00 -8.277300E+00 -6.190000E+00 -8.277300E+00 -1.383000E+01 -4.204150E+01 -1.383000E+01 -4.204150E+01 -2.450000E+00 -1.331100E+00 -2.450000E+00 -1.331100E+00 -2.660000E+00 -1.566400E+00 -2.660000E+00 -1.566400E+00 -5.980000E+00 -7.883200E+00 -5.980000E+00 -7.883200E+00 -1.413000E+01 -4.213850E+01 -1.413000E+01 -4.213850E+01 +3.560000E+00 +2.681800E+00 +3.560000E+00 +2.681800E+00 +1.930000E+00 +7.915000E-01 +1.930000E+00 +7.915000E-01 +3.870000E+00 +3.109100E+00 +3.870000E+00 +3.109100E+00 +3.500000E-01 +3.630000E-02 +3.500000E-01 +3.630000E-02 +3.680000E+00 +2.840200E+00 +3.680000E+00 +2.840200E+00 +2.050000E+00 +8.735000E-01 +2.050000E+00 +8.735000E-01 +3.910000E+00 +3.085100E+00 +3.910000E+00 +3.085100E+00 +3.900000E-01 +3.610000E-02 +3.900000E-01 +3.610000E-02 +5.130000E+00 +5.422100E+00 +5.130000E+00 +5.422100E+00 +3.100000E+00 +1.959200E+00 +3.100000E+00 +1.959200E+00 +5.840000E+00 +6.914600E+00 +5.840000E+00 +6.914600E+00 +5.400000E-01 +8.980000E-02 +5.400000E-01 +8.980000E-02 +1.215000E+01 +3.061010E+01 +1.215000E+01 +3.061010E+01 +7.220000E+00 +1.081680E+01 +7.220000E+00 +1.081680E+01 +1.355000E+01 +3.699090E+01 +1.355000E+01 +3.699090E+01 +1.360000E+00 +5.098000E-01 +1.360000E+00 +5.098000E-01 +2.199000E+01 +9.837430E+01 +2.199000E+01 +9.837430E+01 +1.243000E+01 +3.167470E+01 +1.243000E+01 +3.167470E+01 +2.451000E+01 +1.233915E+02 +2.451000E+01 +1.233915E+02 +2.460000E+00 +1.687000E+00 +2.460000E+00 +1.687000E+00 diff --git a/tests/test_filter_mu/settings.xml b/tests/test_filter_mu/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_mu/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_mu/tallies.xml b/tests/test_filter_mu/tallies.xml deleted file mode 100644 index 095b75548b..0000000000 --- a/tests/test_filter_mu/tallies.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - regular - -182.07 -182.07 - 182.07 182.07 - 2 2 - - - - - scatter nu-scatter - - - - - scatter nu-scatter - - - - - - scatter nu-scatter - - - diff --git a/tests/test_filter_mu/test_filter_mu.py b/tests/test_filter_mu/test_filter_mu.py index 1777db993e..cb9f9b86d8 100644 --- a/tests/test_filter_mu/test_filter_mu.py +++ b/tests/test_filter_mu/test_filter_mu.py @@ -1,10 +1,53 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterMuTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='mu', + bins=(-1.0, -0.5, 0.0, 0.5, 1.0)) + tally1 = openmc.Tally(tally_id=1) + tally1.add_filter(filt1) + tally1.add_score('scatter') + tally1.add_score('nu-scatter') + + filt2 = openmc.Filter(type='mu', bins=(5)) + tally2 = openmc.Tally(tally_id=2) + tally2.add_filter(filt2) + tally2.add_score('scatter') + tally2.add_score('nu-scatter') + + mesh = openmc.Mesh(mesh_id=1) + mesh.lower_left = [-182.07, -182.07] + mesh.upper_right = [182.07, 182.07] + mesh.dimension = [2, 2] + filt_mesh = openmc.Filter(type='mesh', bins=(1)) + tally3 = openmc.Tally(tally_id=3) + tally3.add_filter(filt2) + tally3.add_filter(filt_mesh) + tally3.add_score('scatter') + tally3.add_score('nu-scatter') + + + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally1) + self._input_set.tallies.add_tally(tally2) + self._input_set.tallies.add_tally(tally3) + self._input_set.tallies.add_mesh(mesh) + + super(FilterMuTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterMuTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterMuTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_polar/geometry.xml b/tests/test_filter_polar/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_polar/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_polar/inputs_true.dat b/tests/test_filter_polar/inputs_true.dat new file mode 100644 index 0000000000..db67a890f1 --- /dev/null +++ b/tests/test_filter_polar/inputs_true.dat @@ -0,0 +1 @@ +2de29e0a083af0722039ebc246469f26e260d604ab8b76314b2ac472bbd23004e031aec7afe3dbfc4c6112428846cd0cf0c1430e878832b9dab36463d026dee6 \ No newline at end of file diff --git a/tests/test_filter_polar/materials.xml b/tests/test_filter_polar/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_polar/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_polar/results_true.dat b/tests/test_filter_polar/results_true.dat index 0d59076a5f..2d822630e5 100644 --- a/tests/test_filter_polar/results_true.dat +++ b/tests/test_filter_polar/results_true.dat @@ -1,76 +1,76 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.910392E+01 -7.630892E+01 -6.069713E+01 -7.418935E+02 -6.770107E+01 -9.184032E+02 -5.337004E+01 -5.705965E+02 -1.984454E+01 -7.925660E+01 +2.127061E+01 +9.220793E+01 +5.602776E+01 +6.373945E+02 +6.367492E+01 +8.138443E+02 +5.529942E+01 +6.140264E+02 +1.951517E+01 +7.668661E+01 tally 2: -1.921411E+01 -7.459156E+01 -5.766370E+01 -6.673586E+02 -6.859495E+01 -9.423025E+02 -5.508385E+01 -6.074301E+02 -2.066319E+01 -8.572734E+01 +2.075936E+01 +8.757254E+01 +5.524881E+01 +6.153139E+02 +6.475252E+01 +8.402281E+02 +5.446664E+01 +5.961174E+02 +2.074180E+01 +8.681580E+01 tally 3: -1.910392E+01 -7.630892E+01 -6.069713E+01 -7.418935E+02 -6.770107E+01 -9.184032E+02 -5.337004E+01 -5.705965E+02 -1.984454E+01 -7.925660E+01 +2.128073E+01 +9.230382E+01 +5.601764E+01 +6.371703E+02 +6.367492E+01 +8.138443E+02 +5.529942E+01 +6.140264E+02 +1.951517E+01 +7.668661E+01 tally 4: -2.735945E+00 -1.730332E+00 -1.183844E+01 -3.019848E+01 -1.124996E+01 -2.695006E+01 -8.666721E+00 -1.565510E+01 -3.208395E+00 -2.224532E+00 -9.142422E+00 -1.836800E+01 -2.737713E+01 -1.616026E+02 -3.109025E+01 -2.077063E+02 -2.441723E+01 -1.239858E+02 -8.961378E+00 -1.734852E+01 -3.366946E+00 -2.679164E+00 -1.036680E+01 -2.303250E+01 -1.164055E+01 -2.901348E+01 -8.779036E+00 -1.631915E+01 -4.067773E+00 -3.740384E+00 -3.614413E+00 -3.328712E+00 -1.075780E+01 -2.407723E+01 -1.347969E+01 -3.978344E+01 -1.117709E+01 -2.720682E+01 -3.469883E+00 -2.806129E+00 +8.088647E+00 +1.396899E+01 +3.960907E+00 +3.249150E+00 +8.430714E+00 +1.435355E+01 +7.192159E-01 +1.641710E-01 +1.974619E+01 +8.105078E+01 +1.212452E+01 +3.016420E+01 +2.228348E+01 +1.050847E+02 +1.748809E+00 +9.501796E-01 +2.257423E+01 +1.038902E+02 +1.351331E+01 +3.969787E+01 +2.507638E+01 +1.283664E+02 +2.193118E+00 +1.424580E+00 +2.192232E+01 +9.859711E+01 +1.096779E+01 +2.506373E+01 +2.074138E+01 +8.670015E+01 +1.469145E+00 +8.072204E-01 +6.850719E+00 +9.425536E+00 +4.584038E+00 +4.399762E+00 +7.176883E+00 +1.090693E+01 +8.244944E-01 +1.794291E-01 diff --git a/tests/test_filter_polar/settings.xml b/tests/test_filter_polar/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_polar/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_polar/tallies.xml b/tests/test_filter_polar/tallies.xml deleted file mode 100644 index 5da81f518a..0000000000 --- a/tests/test_filter_polar/tallies.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - regular - -182.07 -182.07 - 182.07 182.07 - 2 2 - - - - - flux - - - - - flux - analog - - - - - - flux - - - - - - flux - - - diff --git a/tests/test_filter_polar/test_filter_polar.py b/tests/test_filter_polar/test_filter_polar.py index 1777db993e..74489a3498 100644 --- a/tests/test_filter_polar/test_filter_polar.py +++ b/tests/test_filter_polar/test_filter_polar.py @@ -1,10 +1,59 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + +class FilterPolarTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='polar', + bins=(0.0, 0.6283, 1.2566, 1.8850, 2.5132, + 3.1416)) + tally1 = openmc.Tally(tally_id=1) + tally1.add_filter(filt1) + tally1.add_score('flux') + tally1.estimator = 'tracklength' + + tally2 = openmc.Tally(tally_id=2) + tally2.add_filter(filt1) + tally2.add_score('flux') + tally2.estimator = 'analog' + + filt3 = openmc.Filter(type='polar', bins=(5)) + tally3 = openmc.Tally(tally_id=3) + tally3.add_filter(filt3) + tally3.add_score('flux') + tally3.estimator = 'tracklength' + + mesh = openmc.Mesh(mesh_id=1) + mesh.lower_left = [-182.07, -182.07] + mesh.upper_right = [182.07, 182.07] + mesh.dimension = [2, 2] + filt_mesh = openmc.Filter(type='mesh', bins=(1)) + tally4 = openmc.Tally(tally_id=4) + tally4.add_filter(filt3) + tally4.add_filter(filt_mesh) + tally4.add_score('flux') + tally4.estimator = 'tracklength' + + + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally1) + self._input_set.tallies.add_tally(tally2) + self._input_set.tallies.add_tally(tally3) + self._input_set.tallies.add_tally(tally4) + self._input_set.tallies.add_mesh(mesh) + + super(FilterPolarTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterPolarTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterPolarTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index fd4f61f7ae..28a1babb04 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -16,1299 +16,1299 @@ tally 1: tally 2: 3.890713E+01 3.046363E+02 -1.623579E-01 +-1.623579E-01 4.602199E-02 4.860074E-01 5.999399E-01 -7.895692E-01 +-7.895692E-01 2.803790E-01 2.525526E-01 8.261176E-02 --9.103525E-02 +9.103525E-02 2.246700E-01 4.583205E-01 8.444556E-02 -1.246553E-01 +-1.246553E-01 2.351010E-01 -3.534581E-01 1.247916E-01 -3.700473E-01 +-3.700473E-01 5.215562E-02 -1.831625E-01 1.927381E-01 -1.540114E-01 +-1.540114E-01 1.918221E-02 -1.266458E-01 1.455875E-01 -6.796869E-01 +-6.796869E-01 3.911926E-01 1.987931E-02 4.966442E-02 --4.443797E-01 +4.443797E-01 8.842717E-02 -1.073855E-01 4.912428E-02 -3.999416E-02 +-3.999416E-02 4.440138E-02 2.857919E-01 6.935717E-02 --4.174851E-01 +4.174851E-01 5.485570E-02 -2.178958E-01 8.052149E-02 -1.179644E-02 +-1.179644E-02 6.709330E-02 8.843286E-01 2.749681E-01 --2.935079E-01 +2.935079E-01 3.032897E-02 -1.809434E-01 1.902413E-01 -2.091991E-01 +-2.091991E-01 1.061912E-01 -7.137275E-02 4.397656E-02 --2.311558E-01 +2.311558E-01 4.680679E-02 9.927573E-02 1.844111E-01 -2.821437E-02 +-2.821437E-02 7.293762E-02 6.224251E-01 1.028351E-01 --4.136440E-01 +4.136440E-01 5.198207E-02 -7.833133E-02 1.192960E-02 --1.041586E-01 +1.041586E-01 1.587417E-01 -3.595677E-01 3.086335E-01 -2.096284E-01 +-2.096284E-01 7.881012E-02 1.366220E+01 3.758161E+01 --1.461402E-02 +1.461402E-02 3.260482E-03 8.325893E-02 6.248769E-02 -2.785736E-01 +-2.785736E-01 3.698417E-02 1.932396E-03 1.561742E-02 --8.063397E-02 +8.063397E-02 3.598680E-02 8.565555E-02 5.344369E-03 -3.899905E-02 +-3.899905E-02 2.422867E-02 -1.215439E-01 9.193858E-03 -1.982614E-01 +-1.982614E-01 1.045860E-02 -7.712629E-02 2.199979E-02 --3.626484E-02 +3.626484E-02 9.872078E-04 -6.305159E-02 1.645879E-02 -3.052155E-01 +-3.052155E-01 5.620564E-02 3.507115E-02 1.056383E-02 --1.297490E-02 +1.297490E-02 5.889958E-03 -1.208752E-02 7.323602E-03 -3.441007E-03 +-3.441007E-03 1.841496E-02 5.543442E-02 1.186636E-02 --8.000436E-02 +8.000436E-02 3.703835E-03 -3.636792E-02 1.490603E-02 --8.753196E-02 +8.753196E-02 7.958027E-03 2.066727E-01 1.414130E-02 --3.652482E-02 +3.652482E-02 8.380395E-04 -1.652432E-01 1.878732E-02 -1.375567E-01 +-1.375567E-01 1.302400E-02 3.692057E-03 6.312506E-03 --9.016211E-02 +9.016211E-02 6.699735E-03 -5.875401E-02 1.731945E-02 -3.960008E-02 +-3.960008E-02 3.595906E-03 1.653510E-01 9.277293E-03 --4.064973E-02 +4.064973E-02 2.794606E-03 -1.729061E-02 3.219772E-03 --5.764808E-02 +5.764808E-02 1.861051E-02 -5.970583E-02 2.070164E-02 -6.739411E-02 +-6.739411E-02 1.063341E-02 6.561669E+01 8.680729E+02 -7.938430E-01 +-7.938430E-01 2.994198E-01 9.278084E-01 1.861899E+00 -1.432236E+00 +-1.432236E+00 7.429647E-01 7.460836E-02 5.946808E-01 --6.140731E-02 +6.140731E-02 3.175177E-01 1.212677E+00 5.125288E-01 --1.952865E-02 +1.952865E-02 5.468421E-01 -2.965796E-01 1.123288E-01 -5.334195E-01 +-5.334195E-01 1.589612E-01 -6.340814E-01 4.874650E-01 -4.264003E-02 +-4.264003E-02 9.109571E-03 -4.323424E-01 3.370329E-01 -1.186876E+00 +-1.186876E+00 9.854644E-01 -2.420825E-01 1.699455E-01 --2.920627E-02 +2.920627E-02 6.816643E-02 -2.684345E-01 9.799236E-02 --1.281596E-01 +1.281596E-01 3.092987E-01 3.746150E-01 1.242044E-01 --1.035056E+00 +1.035056E+00 2.589772E-01 2.005450E-01 2.074622E-01 --5.412719E-01 +5.412719E-01 3.193584E-01 1.070173E+00 3.266747E-01 --2.657850E-01 +2.657850E-01 1.599950E-01 -4.694853E-01 2.738937E-01 -7.761977E-01 +-7.761977E-01 2.561652E-01 3.673179E-02 9.486916E-02 --3.309909E-01 +3.309909E-01 1.095243E-01 1.623761E-01 2.874582E-01 --2.846296E-01 +2.846296E-01 2.430397E-01 7.384842E-01 2.556480E-01 --3.577508E-01 +3.577508E-01 1.763210E-01 -2.917525E-01 1.875646E-01 --1.634324E-01 +1.634324E-01 2.952144E-01 -4.329582E-01 3.418652E-01 -2.719362E-01 +-2.719362E-01 2.278925E-01 2.382728E+01 1.170590E+02 -4.718326E-01 +-4.718326E-01 1.961501E-01 1.612551E-02 2.815245E-02 -6.390587E-01 +-6.390587E-01 1.902968E-01 2.290989E-01 3.758858E-02 -1.568179E-01 +-1.568179E-01 1.509162E-01 -2.363058E-01 6.671396E-02 --4.350800E-02 +4.350800E-02 1.031680E-01 -2.956828E-01 2.515141E-02 --4.835878E-01 +4.835878E-01 8.614200E-02 -5.365970E-02 8.404087E-02 --6.079969E-02 +6.079969E-02 3.684343E-02 -1.313088E-02 1.488843E-02 -2.603258E-02 +-2.603258E-02 2.900625E-02 1.249213E-01 2.737277E-02 -4.491422E-01 +-4.491422E-01 9.482600E-02 -1.095589E-01 3.711500E-02 --2.248159E-01 +2.248159E-01 2.815827E-02 -5.976009E-02 5.887828E-03 --6.097208E-02 +6.097208E-02 5.393315E-02 3.449714E-02 4.332442E-02 --1.030757E-01 +1.030757E-01 2.839453E-02 -4.399117E-01 8.887569E-02 -4.564910E-01 +-4.564910E-01 1.172398E-01 -2.528382E-01 1.217655E-01 -3.443316E-01 +-3.443316E-01 4.275616E-02 5.437008E-02 2.355567E-02 --5.505588E-02 +5.505588E-02 5.479129E-02 -8.326640E-02 3.095858E-02 --1.888781E-01 +1.888781E-01 2.884542E-02 1.981251E-01 1.520694E-02 --5.279866E-02 +5.279866E-02 1.020641E-01 -1.465368E-01 3.070686E-02 --2.356940E-01 +2.356940E-01 7.899657E-02 4.109278E-01 5.291082E-02 -2.572510E-01 +-2.572510E-01 3.420895E-02 8.047875E+00 1.334796E+01 -1.707535E-01 +-1.707535E-01 3.290927E-02 1.024687E-01 1.308811E-02 -1.805451E-01 +-1.805451E-01 1.696222E-02 3.519587E-02 7.546726E-03 -1.034933E-01 +-1.034933E-01 2.224207E-02 -1.580512E-01 2.369625E-02 -4.302961E-02 +-4.302961E-02 1.635623E-02 -2.992903E-02 5.190220E-03 --2.130862E-01 +2.130862E-01 1.186351E-02 -3.321696E-02 7.972404E-03 --4.992040E-02 +4.992040E-02 5.667098E-03 1.261320E-02 2.436872E-03 --8.314024E-04 +8.314024E-04 5.360616E-03 -6.318247E-02 1.644558E-03 -1.373600E-01 +-1.373600E-01 1.030707E-02 1.511677E-03 3.467685E-03 --1.923485E-02 +1.923485E-02 8.106508E-04 -1.180094E-01 4.381376E-03 -2.798056E-02 +-2.798056E-02 4.871288E-03 -7.689499E-02 7.079493E-03 -5.842586E-02 +-5.842586E-02 1.380713E-03 -9.946341E-02 7.085062E-03 -8.061825E-02 +-8.061825E-02 8.679468E-03 -9.229524E-03 9.187483E-03 -1.048310E-01 +-1.048310E-01 3.506026E-03 3.666209E-02 3.259203E-03 --1.190727E-01 +1.190727E-01 4.935341E-03 -7.391655E-02 2.805554E-03 --2.029126E-02 +2.029126E-02 2.497736E-03 2.787185E-02 5.677987E-04 --6.873108E-02 +6.873108E-02 1.287727E-02 -5.262840E-02 3.190440E-03 --3.910911E-02 +3.910911E-02 8.661121E-03 1.076197E-01 5.456176E-03 -7.476066E-02 +-7.476066E-02 2.693605E-03 4.056568E+01 3.389623E+02 -6.428633E-01 +-6.428633E-01 6.128893E-01 4.878518E-01 2.130257E-01 -9.548044E-01 +-9.548044E-01 4.556949E-01 2.234940E-01 1.006817E-01 --1.080276E-01 +1.080276E-01 5.980158E-01 -3.639229E-01 3.120105E-01 --3.237506E-01 +3.237506E-01 3.451548E-01 1.143081E-01 7.924550E-02 --6.456733E-01 +6.456733E-01 2.424413E-01 1.478136E-01 1.458665E-01 --2.134798E-02 +2.134798E-02 9.102875E-02 3.633264E-01 7.386463E-02 -2.213946E-01 +-2.213946E-01 1.253249E-01 -3.153847E-01 1.094273E-01 -7.161113E-01 +-7.161113E-01 2.275500E-01 -2.461979E-01 1.484452E-01 --2.332886E-01 +2.332886E-01 9.715521E-02 -7.029988E-02 1.835254E-02 -1.982842E-01 +-1.982842E-01 9.722998E-02 -2.089693E-01 2.271404E-01 --7.316104E-02 +7.316104E-02 3.974665E-02 -3.266640E-01 8.054809E-02 -5.126088E-01 +-5.126088E-01 3.234942E-01 -3.048753E-01 3.439501E-01 -4.872647E-01 +-4.872647E-01 9.473730E-02 1.590200E-01 3.613462E-02 --4.641787E-01 +4.641787E-01 1.671339E-01 -1.391114E-01 3.581561E-02 --2.209343E-01 +2.209343E-01 1.489367E-02 3.015665E-01 4.265694E-02 --1.334716E-01 +1.334716E-01 2.321929E-01 -3.702914E-01 1.699549E-01 --8.891532E-02 +8.891532E-02 1.708595E-01 6.123686E-01 1.429184E-01 -5.891300E-01 +-5.891300E-01 1.085467E-01 tally 3: -3.077754E+01 -2.017424E+02 --4.040800E-01 -5.606719E-01 --5.238239E-01 -4.460714E-01 -1.155164E-01 -1.686786E-01 --1.972294E-01 -2.912851E-01 -4.908524E-01 -1.374195E-01 --1.467088E-02 -1.080839E-01 -6.749037E-02 -1.397361E-01 -4.136479E-03 -9.237632E-02 --3.742305E-01 -9.917374E-02 -5.374208E-01 -2.530961E-01 -2.270996E-01 -9.415721E-02 --4.568867E-02 -1.277446E-01 -1.581716E-01 -6.217155E-02 -4.667840E-01 -1.143380E-01 -9.684270E-02 -7.302998E-02 -8.366629E-01 -1.797483E-01 --5.657893E-01 -2.553910E-01 --2.351441E-02 -4.395513E-02 -7.843306E-01 -1.466478E-01 -4.617856E-02 -1.154681E-02 -1.431343E-01 -3.531062E-02 -4.625825E-01 -6.235642E-02 --8.837342E-02 -6.231694E-02 --3.766755E-01 -6.412261E-02 -1.995226E-01 -1.743990E-01 --2.498625E-02 -8.897536E-02 --1.039315E-01 -1.868672E-01 -6.712910E-01 -2.084042E-01 -5.805639E-02 -4.049580E-02 -1.603677E-01 -4.280033E-02 -3.909878E-01 -7.726018E-02 -9.878354E-02 -4.630595E-02 --2.389983E-01 -3.528604E-02 -1.641046E-01 -1.669859E-01 --2.351986E-02 -1.048794E-02 -1.172238E+01 -3.139127E+01 --1.057733E+00 -2.820672E-01 -5.708838E-02 -6.224675E-02 -2.492981E-02 -1.827498E-01 --1.339268E-01 -1.968929E-02 -2.363867E-01 -3.028587E-02 --2.867841E-01 -2.680318E-02 --2.352784E-01 -1.895006E-02 -4.365572E-01 -1.883240E-01 --3.388837E-01 -7.209932E-02 -3.488374E-01 -6.640137E-02 --3.343893E-01 -4.149634E-02 --4.575314E-01 -7.461614E-02 -4.436881E-01 -1.325092E-01 -3.394853E-01 -2.987173E-02 --2.633936E-02 -6.171428E-02 -9.994191E-02 -6.447641E-02 --1.618840E-01 -3.497845E-02 --1.290678E-01 -3.735394E-02 -9.852126E-03 -2.963925E-02 --1.656539E-01 -4.190396E-02 --2.292763E-01 -7.045480E-02 --4.616824E-03 -1.926690E-02 --1.960839E-01 -1.396042E-02 --2.133526E-02 -5.189823E-02 -2.933136E-01 -5.721356E-02 --1.084914E-01 -2.448532E-02 --4.778583E-01 -7.644033E-02 -1.736901E-01 -6.630467E-02 --5.460801E-02 -1.510381E-02 -1.106093E-01 -1.590306E-02 -1.659501E-01 -5.983218E-02 -1.343781E-02 -2.751294E-02 -2.052693E-01 -3.478581E-02 --1.006298E-01 -1.815313E-02 --2.563766E-01 -3.045246E-02 -5.231699E+01 -5.870469E+02 --6.102587E-01 -5.930968E-01 -1.184182E+00 -1.364433E+00 --6.362263E-02 -8.852514E-01 --4.844978E-01 -1.751923E-01 -8.223413E-01 -2.436206E-01 --9.656506E-01 -3.513566E-01 -2.710494E-01 -7.170772E-01 -4.792482E-01 -2.551569E-01 --1.266077E-01 -2.824778E-01 -6.389964E-01 -2.501483E-01 -8.915816E-01 -3.557431E-01 --1.007448E+00 -5.743018E-01 -3.528444E-01 -2.428078E-01 --5.833000E-01 -3.733648E-01 --4.660289E-01 -6.567263E-02 -5.856088E-01 -2.336146E-01 -3.836351E-02 -7.665403E-02 --6.721211E-01 -2.651780E-01 -5.725993E-01 -2.101026E-01 --2.130594E-01 -1.855350E-02 -2.607168E-01 -1.564288E-01 --3.399382E-02 -3.067656E-02 --1.228976E+00 -6.554836E-01 --2.962235E-01 -1.808511E-01 -5.521675E-01 -1.722073E-01 --1.658751E-01 -1.994119E-02 --2.671896E-01 -1.343320E-01 --2.325282E-01 -4.677656E-02 --3.380310E-01 -1.703532E-01 --3.571853E-01 -1.140525E-01 -3.836770E-02 -8.586429E-02 -7.328263E-01 -1.567227E-01 -4.840110E-02 -2.718471E-02 -5.654783E-01 -3.645579E-01 --3.027585E-01 -1.407867E-01 -3.259142E+01 -2.336719E+02 -3.053294E-01 -2.086257E-01 --7.563597E-01 -2.816768E-01 --3.039288E-01 -2.855043E-01 --2.648323E-01 -1.883784E-01 -2.665933E-01 -1.782353E-01 -1.978960E-01 -1.419567E-01 -1.228712E-01 -1.913946E-01 --9.152681E-03 -1.324681E-01 --5.707326E-01 -1.092067E-01 -2.326858E-01 -6.731743E-02 --5.170241E-01 -1.353439E-01 --4.064026E-01 -9.715030E-02 --1.142031E-01 -7.748788E-02 -2.928039E-01 -2.716157E-01 --1.721186E-01 -1.447738E-01 -6.452116E-01 -1.821975E-01 --5.697276E-01 -1.047333E-01 --9.640967E-02 -1.139327E-01 --4.509832E-01 -2.079493E-01 --2.134684E-02 -2.907667E-01 --2.434868E-01 -1.235397E-01 -2.550330E-01 -2.979627E-01 -9.598615E-01 -3.140885E-01 -1.218430E-01 -6.283872E-02 -2.412915E-01 -1.907292E-02 --2.236667E-01 -4.379414E-02 -2.844474E-01 -2.965692E-02 -1.618860E-01 -8.293785E-03 --1.265583E-01 -4.515449E-02 -6.356127E-02 -1.358134E-02 --3.844886E-01 -8.600010E-02 --1.942739E-01 -7.516022E-02 -1.765511E-01 -3.522611E-02 --3.433188E-01 -3.456066E-02 --1.501983E-01 -5.633844E-02 -1.040924E+01 -2.432332E+01 --4.138270E-01 -1.309129E-01 --3.151106E-01 -1.286964E-01 -9.213222E-02 -6.189454E-02 --2.746107E-01 -8.103949E-02 --9.781742E-02 -3.783736E-02 --1.178371E-01 -3.242332E-02 --5.837932E-01 -2.059491E-01 --7.338223E-03 -8.012203E-02 -5.628994E-02 -2.190669E-02 -8.155585E-02 -1.039007E-01 -6.052048E-02 -4.339463E-02 --1.157646E-02 -1.839000E-02 --2.641673E-01 -4.737589E-02 --8.531135E-02 -5.432766E-02 -6.036555E-01 -1.190329E-01 --3.149976E-01 -5.735264E-02 --8.456340E-02 -4.563143E-03 -2.224065E-01 -6.600030E-02 -9.562392E-03 -1.843524E-02 --2.400599E-01 -3.182217E-02 --6.534941E-01 -1.180315E-01 -4.371157E-01 -9.076666E-02 -3.257455E-02 -2.936184E-02 --8.788428E-02 -1.923293E-02 --2.604776E-01 -3.660313E-02 --6.315350E-02 -1.503534E-02 -5.609294E-01 -8.783528E-02 --7.363672E-01 -1.789210E-01 -2.883575E-01 -6.478578E-02 --3.302954E-02 -1.517946E-02 --3.234157E-01 -4.418920E-02 -2.846318E-01 -2.712085E-02 --3.227536E-01 -5.062832E-02 -4.391474E-01 -5.548002E-02 -1.322988E-01 -2.995854E-02 -5.709679E+01 -6.978668E+02 -2.859201E-02 -1.094507E+00 -6.058587E-01 -6.079927E-01 -7.553798E-02 -1.131607E+00 --5.851206E-01 -1.215663E+00 -8.266012E-02 -9.031287E-01 --7.088368E-01 -3.984608E-01 --4.414986E-01 -1.502417E-01 -2.241998E-01 -3.228823E-01 --7.328574E-01 -2.430448E-01 --8.070160E-01 -1.767265E-01 --1.154449E-01 -8.739303E-03 --3.787161E-01 -4.728756E-01 --1.743577E-01 -1.091245E-01 -2.878137E-01 -2.724285E-01 -2.128994E-01 -4.440539E-01 -9.495567E-01 -3.622719E-01 -1.422950E-01 -5.309223E-02 -1.323659E-01 -1.911979E-01 --1.303752E-01 -5.710728E-01 --4.611294E-02 -4.086632E-02 -5.937879E-01 -1.006156E-01 --3.558925E-01 -2.998983E-01 -1.175971E+00 -5.323321E-01 -2.426485E-01 -1.497265E-01 -7.805090E-02 -5.060214E-02 --2.914577E-01 -2.233355E-01 -1.053098E-01 -6.693123E-02 -4.541315E-01 -1.328340E-01 --6.290732E-02 -8.910616E-02 -7.371592E-01 -1.980732E-01 -5.804701E-01 -1.711949E-01 --6.642202E-01 -1.131866E-01 -1.779818E-01 -6.530190E-02 --5.224739E-01 -2.534102E-01 --1.824905E-01 -2.910309E-02 +3.862543E+01 +2.993190E+02 +-5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +-6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +-1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +-1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +-5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +-3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +-2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +-6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +-4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +-1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +-8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +-1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +-2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +-1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +-1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +-1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +-1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +-3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +-1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +-4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +-3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +-4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +-1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +-3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +-2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +-9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +-3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +-6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +-1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +-1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +-2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +-3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +-4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +-1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +-8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +-6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +-3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +-1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +-2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +-3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +-2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +-1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +-4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +-7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +-7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +-9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +-1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +-1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +-7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +-1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +-8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +-1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +-2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +-3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +-8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +-1.062149E-01 +5.400365E-02 tally 4: -3.077754E+01 -2.017424E+02 --4.040800E-01 -5.606719E-01 --5.238239E-01 -4.460714E-01 -1.155164E-01 -1.686786E-01 --1.972294E-01 -2.912851E-01 -4.908524E-01 -1.374195E-01 --1.467088E-02 -1.080839E-01 -6.749037E-02 -1.397361E-01 -4.136479E-03 -9.237632E-02 --3.742305E-01 -9.917374E-02 -5.374208E-01 -2.530961E-01 -2.270996E-01 -9.415721E-02 --4.568867E-02 -1.277446E-01 -1.581716E-01 -6.217155E-02 -4.667840E-01 -1.143380E-01 -9.684270E-02 -7.302998E-02 -8.366629E-01 -1.797483E-01 --5.657893E-01 -2.553910E-01 --2.351441E-02 -4.395513E-02 -7.843306E-01 -1.466478E-01 -4.617856E-02 -1.154681E-02 -1.431343E-01 -3.531062E-02 -4.625825E-01 -6.235642E-02 --8.837342E-02 -6.231694E-02 --3.766755E-01 -6.412261E-02 -1.995226E-01 -1.743990E-01 --2.498625E-02 -8.897536E-02 --1.039315E-01 -1.868672E-01 -6.712910E-01 -2.084042E-01 -5.805639E-02 -4.049580E-02 -1.603677E-01 -4.280033E-02 -3.909878E-01 -7.726018E-02 -9.878354E-02 -4.630595E-02 --2.389983E-01 -3.528604E-02 -1.641046E-01 -1.669859E-01 --2.351986E-02 -1.048794E-02 -1.172238E+01 -3.139127E+01 --1.057733E+00 -2.820672E-01 -5.708838E-02 -6.224675E-02 -2.492981E-02 -1.827498E-01 --1.339268E-01 -1.968929E-02 -2.363867E-01 -3.028587E-02 --2.867841E-01 -2.680318E-02 --2.352784E-01 -1.895006E-02 -4.365572E-01 -1.883240E-01 --3.388837E-01 -7.209932E-02 -3.488374E-01 -6.640137E-02 --3.343893E-01 -4.149634E-02 --4.575314E-01 -7.461614E-02 -4.436881E-01 -1.325092E-01 -3.394853E-01 -2.987173E-02 --2.633936E-02 -6.171428E-02 -9.994191E-02 -6.447641E-02 --1.618840E-01 -3.497845E-02 --1.290678E-01 -3.735394E-02 -9.852126E-03 -2.963925E-02 --1.656539E-01 -4.190396E-02 --2.292763E-01 -7.045480E-02 --4.616824E-03 -1.926690E-02 --1.960839E-01 -1.396042E-02 --2.133526E-02 -5.189823E-02 -2.933136E-01 -5.721356E-02 --1.084914E-01 -2.448532E-02 --4.778583E-01 -7.644033E-02 -1.736901E-01 -6.630467E-02 --5.460801E-02 -1.510381E-02 -1.106093E-01 -1.590306E-02 -1.659501E-01 -5.983218E-02 -1.343781E-02 -2.751294E-02 -2.052693E-01 -3.478581E-02 --1.006298E-01 -1.815313E-02 --2.563766E-01 -3.045246E-02 -5.231699E+01 -5.870469E+02 --6.102587E-01 -5.930968E-01 -1.184182E+00 -1.364433E+00 --6.362263E-02 -8.852514E-01 --4.844978E-01 -1.751923E-01 -8.223413E-01 -2.436206E-01 --9.656506E-01 -3.513566E-01 -2.710494E-01 -7.170772E-01 -4.792482E-01 -2.551569E-01 --1.266077E-01 -2.824778E-01 -6.389964E-01 -2.501483E-01 -8.915816E-01 -3.557431E-01 --1.007448E+00 -5.743018E-01 -3.528444E-01 -2.428078E-01 --5.833000E-01 -3.733648E-01 --4.660289E-01 -6.567263E-02 -5.856088E-01 -2.336146E-01 -3.836351E-02 -7.665403E-02 --6.721211E-01 -2.651780E-01 -5.725993E-01 -2.101026E-01 --2.130594E-01 -1.855350E-02 -2.607168E-01 -1.564288E-01 --3.399382E-02 -3.067656E-02 --1.228976E+00 -6.554836E-01 --2.962235E-01 -1.808511E-01 -5.521675E-01 -1.722073E-01 --1.658751E-01 -1.994119E-02 --2.671896E-01 -1.343320E-01 --2.325282E-01 -4.677656E-02 --3.380310E-01 -1.703532E-01 --3.571853E-01 -1.140525E-01 -3.836770E-02 -8.586429E-02 -7.328263E-01 -1.567227E-01 -4.840110E-02 -2.718471E-02 -5.654783E-01 -3.645579E-01 --3.027585E-01 -1.407867E-01 -3.259142E+01 -2.336719E+02 -3.053294E-01 -2.086257E-01 --7.563597E-01 -2.816768E-01 --3.039288E-01 -2.855043E-01 --2.648323E-01 -1.883784E-01 -2.665933E-01 -1.782353E-01 -1.978960E-01 -1.419567E-01 -1.228712E-01 -1.913946E-01 --9.152681E-03 -1.324681E-01 --5.707326E-01 -1.092067E-01 -2.326858E-01 -6.731743E-02 --5.170241E-01 -1.353439E-01 --4.064026E-01 -9.715030E-02 --1.142031E-01 -7.748788E-02 -2.928039E-01 -2.716157E-01 --1.721186E-01 -1.447738E-01 -6.452116E-01 -1.821975E-01 --5.697276E-01 -1.047333E-01 --9.640967E-02 -1.139327E-01 --4.509832E-01 -2.079493E-01 --2.134684E-02 -2.907667E-01 --2.434868E-01 -1.235397E-01 -2.550330E-01 -2.979627E-01 -9.598615E-01 -3.140885E-01 -1.218430E-01 -6.283872E-02 -2.412915E-01 -1.907292E-02 --2.236667E-01 -4.379414E-02 -2.844474E-01 -2.965692E-02 -1.618860E-01 -8.293785E-03 --1.265583E-01 -4.515449E-02 -6.356127E-02 -1.358134E-02 --3.844886E-01 -8.600010E-02 --1.942739E-01 -7.516022E-02 -1.765511E-01 -3.522611E-02 --3.433188E-01 -3.456066E-02 --1.501983E-01 -5.633844E-02 -1.040924E+01 -2.432332E+01 --4.138270E-01 -1.309129E-01 --3.151106E-01 -1.286964E-01 -9.213222E-02 -6.189454E-02 --2.746107E-01 -8.103949E-02 --9.781742E-02 -3.783736E-02 --1.178371E-01 -3.242332E-02 --5.837932E-01 -2.059491E-01 --7.338223E-03 -8.012203E-02 -5.628994E-02 -2.190669E-02 -8.155585E-02 -1.039007E-01 -6.052048E-02 -4.339463E-02 --1.157646E-02 -1.839000E-02 --2.641673E-01 -4.737589E-02 --8.531135E-02 -5.432766E-02 -6.036555E-01 -1.190329E-01 --3.149976E-01 -5.735264E-02 --8.456340E-02 -4.563143E-03 -2.224065E-01 -6.600030E-02 -9.562392E-03 -1.843524E-02 --2.400599E-01 -3.182217E-02 --6.534941E-01 -1.180315E-01 -4.371157E-01 -9.076666E-02 -3.257455E-02 -2.936184E-02 --8.788428E-02 -1.923293E-02 --2.604776E-01 -3.660313E-02 --6.315350E-02 -1.503534E-02 -5.609294E-01 -8.783528E-02 --7.363672E-01 -1.789210E-01 -2.883575E-01 -6.478578E-02 --3.302954E-02 -1.517946E-02 --3.234157E-01 -4.418920E-02 -2.846318E-01 -2.712085E-02 --3.227536E-01 -5.062832E-02 -4.391474E-01 -5.548002E-02 -1.322988E-01 -2.995854E-02 -5.709679E+01 -6.978668E+02 -2.859201E-02 -1.094507E+00 -6.058587E-01 -6.079927E-01 -7.553798E-02 -1.131607E+00 --5.851206E-01 -1.215663E+00 -8.266012E-02 -9.031287E-01 --7.088368E-01 -3.984608E-01 --4.414986E-01 -1.502417E-01 -2.241998E-01 -3.228823E-01 --7.328574E-01 -2.430448E-01 --8.070160E-01 -1.767265E-01 --1.154449E-01 -8.739303E-03 --3.787161E-01 -4.728756E-01 --1.743577E-01 -1.091245E-01 -2.878137E-01 -2.724285E-01 -2.128994E-01 -4.440539E-01 -9.495567E-01 -3.622719E-01 -1.422950E-01 -5.309223E-02 -1.323659E-01 -1.911979E-01 --1.303752E-01 -5.710728E-01 --4.611294E-02 -4.086632E-02 -5.937879E-01 -1.006156E-01 --3.558925E-01 -2.998983E-01 -1.175971E+00 -5.323321E-01 -2.426485E-01 -1.497265E-01 -7.805090E-02 -5.060214E-02 --2.914577E-01 -2.233355E-01 -1.053098E-01 -6.693123E-02 -4.541315E-01 -1.328340E-01 --6.290732E-02 -8.910616E-02 -7.371592E-01 -1.980732E-01 -5.804701E-01 -1.711949E-01 --6.642202E-01 -1.131866E-01 -1.779818E-01 -6.530190E-02 --5.224739E-01 -2.534102E-01 --1.824905E-01 -2.910309E-02 +3.862543E+01 +2.993190E+02 +-5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +-6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +-1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +-1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +-5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +-3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +-2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +-6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +-4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +-1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +-8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +-1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +-2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +-1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +-1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +-1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +-1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +-3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +-1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +-4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +-3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +-4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +-1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +-3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +-2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +-9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +-3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +-6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +-1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +-1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +-2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +-3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +-4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +-1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +-8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +-6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +-3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +-1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +-2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +-3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +-2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +-1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +-4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +-7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +-7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +-9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +-1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +-1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +-7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +-1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +-8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +-1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +-2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +-3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +-8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +-1.062149E-01 +5.400365E-02 diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index 79c89b7708..2b14a72560 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -6,33 +6,33 @@ tally 1: tally 2: 2.514000E+01 6.511880E+01 --2.222467E-01 +2.222467E-01 2.881247E-02 3.019176E-01 3.014833E-02 -8.459006E-04 +-8.459006E-04 4.773570E-02 9.596964E-02 1.009754E-02 --4.314855E-02 +4.314855E-02 6.207871E-03 4.607677E-02 9.205573E-03 --2.345994E-03 +2.345994E-03 1.243004E-02 9.577397E-02 6.605519E-03 --2.821584E-02 +2.821584E-02 3.834286E-03 -1.077389E-01 6.570217E-03 --1.106443E-01 +1.106443E-01 1.006436E-02 1.322104E-01 7.721677E-03 -1.315548E-02 +-1.315548E-02 5.488918E-04 -2.792171E-02 5.816161E-03 --1.994370E-02 +1.994370E-02 1.169674E-03 diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 20b7672eb5..fb6b4749d1 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -6,51 +6,51 @@ tally 1: tally 2: 1.485000E+01 4.439790E+01 -8.440076E-02 +-8.440076E-02 1.135203E-02 8.198663E-02 3.887429E-02 -1.358080E-01 +-1.358080E-01 2.890416E-02 -3.544823E-02 9.843339E-04 -1.542072E-01 +-1.542072E-01 8.228126E-03 1.057111E-01 3.758100E-03 -1.647870E-02 +-1.647870E-02 4.827841E-03 1.378297E-01 1.566876E-02 --4.676778E-02 +4.676778E-02 4.809366E-03 1.966204E-02 7.447981E-04 --1.889258E-02 +1.889258E-02 6.841953E-04 1.337703E-02 1.250077E-03 -1.044684E-01 +-1.044684E-01 6.969498E-03 -1.177995E-02 8.208715E-03 -1.940058E-04 +-1.940058E-04 5.128759E-03 -2.165868E-02 1.335569E-03 -3.080886E-02 +-3.080886E-02 4.544434E-04 1.039856E-03 1.209631E-03 -1.317068E-02 +-1.317068E-02 1.469722E-03 -6.432758E-02 2.106736E-03 --3.323023E-02 +3.323023E-02 4.513838E-03 2.683700E-02 1.146747E-03 -3.494912E-02 +-3.494912E-02 1.006153E-03 6.289525E-02 3.700145E-03 diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index 81bef81d22..b416b05ec3 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -112,101 +112,101 @@ tally 2: 0.000000E+00 9.780506E-01 1.942072E-01 -4.170415E-02 +-4.170415E-02 7.581469E-04 -2.419728E-03 6.296241E-04 -8.163997E-03 +-8.163997E-03 4.785197E-04 3.971909E-03 1.363304E-04 --1.585497E-02 +1.585497E-02 1.295251E-04 -7.029875E-02 1.208194E-03 -1.524070E-02 +-1.524070E-02 2.828843E-04 -2.141105E-02 2.953327E-04 -2.147623E-02 +-2.147623E-02 2.390414E-04 5.592040E-04 1.720605E-04 --3.022066E-03 +3.022066E-03 1.843720E-04 1.489821E-02 9.193290E-05 -1.354668E-02 +-1.354668E-02 2.551940E-04 -5.692690E-04 3.013453E-04 --2.324582E-02 +2.324582E-02 2.170615E-04 1.883012E-02 1.045949E-04 -3.997107E-03 +-3.997107E-03 1.674058E-04 1.616443E-02 2.046286E-04 --1.625747E-02 +1.625747E-02 1.851351E-04 1.120209E-02 2.028649E-04 --4.240284E-03 +4.240284E-03 4.019011E-05 1.535379E-02 9.872559E-05 -8.973926E-03 +-8.973926E-03 1.448680E-04 -3.933227E-03 4.305328E-04 1.767552E+01 6.295417E+01 -1.458308E-01 +-1.458308E-01 8.239551E-03 1.976485E-01 7.360520E-02 -2.647182E-01 +-2.647182E-01 5.347815E-02 1.828025E-01 1.840743E-02 --1.865994E-01 +1.865994E-01 2.843407E-02 -6.438995E-02 8.898045E-03 -1.416445E-01 +-1.416445E-01 3.839856E-02 -3.298894E-01 2.672141E-02 -1.462639E-01 +-1.462639E-01 1.225250E-02 -6.410138E-02 3.766615E-02 --4.701705E-02 +4.701705E-02 1.968428E-03 2.953056E-02 2.358647E-02 -1.717672E-01 +-1.717672E-01 5.877351E-02 1.927497E-02 1.358953E-02 --1.708870E-01 +1.708870E-01 1.502033E-02 4.453803E-02 1.622532E-02 -2.076143E-02 +-2.076143E-02 1.850686E-03 1.111325E-01 8.415150E-03 --1.249594E-01 +1.249594E-01 7.491280E-03 1.381757E-02 1.537264E-02 -7.286234E-03 +-7.286234E-03 9.057874E-03 3.162973E-01 3.303388E-02 --1.012773E-01 +1.012773E-01 8.345375E-03 -5.238963E-02 3.920421E-02 @@ -262,51 +262,51 @@ tally 2: 0.000000E+00 3.863588E+00 3.013300E+00 --5.075749E-02 +5.075749E-02 1.018210E-03 3.445344E-02 5.778215E-03 -6.239642E-02 +-6.239642E-02 4.107408E-03 -1.475495E-02 7.971898E-04 --5.809323E-02 +5.809323E-02 3.039895E-03 -2.510339E-02 3.529134E-04 -9.731680E-03 +-9.731680E-03 1.221628E-03 -5.815144E-02 1.403261E-03 -4.936694E-02 +-4.936694E-02 6.481626E-04 5.141985E-03 1.343973E-03 --1.515105E-02 +1.515105E-02 3.044735E-04 4.474521E-03 1.155268E-03 -6.855877E-02 +-6.855877E-02 4.048417E-03 -2.701967E-05 1.279041E-03 --2.197636E-02 +2.197636E-02 2.843662E-04 -1.780381E-02 8.441574E-04 --2.916634E-02 +2.916634E-02 2.530602E-03 2.289834E-02 2.201375E-03 --3.283424E-02 +3.283424E-02 7.615219E-04 9.623726E-03 7.614092E-04 --2.808239E-02 +2.808239E-02 1.500381E-03 4.835419E-02 6.933678E-04 -2.636221E-02 +-2.636221E-02 2.230834E-04 -4.957463E-02 1.939266E-03 @@ -362,51 +362,51 @@ tally 2: 0.000000E+00 5.356594E+01 5.839391E+02 -1.198882E+00 +-1.198882E+00 3.391100E-01 3.952398E-01 5.729760E-01 -1.045726E+00 +-1.045726E+00 4.419194E-01 2.683170E-01 1.872580E-01 --5.059349E-01 +5.059349E-01 2.592209E-01 4.561651E-01 1.253696E-01 -4.273775E-01 +-4.273775E-01 3.509266E-01 -6.300496E-01 2.102051E-01 -3.094705E-01 +-3.094705E-01 1.410278E-01 -6.840225E-01 1.971765E-01 --4.123355E-02 +4.123355E-02 3.962538E-02 -1.554557E-01 2.784362E-02 -4.698631E-01 +-4.698631E-01 1.867413E-01 -7.016026E-02 3.059344E-02 --2.922284E-01 +2.922284E-01 8.680517E-02 -1.252431E-01 3.180591E-02 --1.825937E-01 +1.825937E-01 8.626653E-02 1.637960E-01 1.329538E-01 --6.662867E-01 +6.662867E-01 1.497985E-01 4.662585E-01 7.552145E-02 --1.198254E-03 +1.198254E-03 2.020899E-01 5.281410E-01 9.615758E-02 --6.396211E-02 +6.396211E-02 1.806992E-01 -1.898620E-01 1.113751E-01 @@ -513,101 +513,101 @@ tally 3: 0.000000E+00 9.300000E-01 1.839000E-01 --4.056201E-03 +4.056201E-03 8.670884E-04 -2.262959E-02 2.263780E-03 -4.568371E-02 +-4.568371E-02 4.078305E-03 6.023055E-02 1.099458E-03 -2.468374E-02 +-2.468374E-02 3.403931E-03 -8.676202E-02 2.444658E-03 --2.075016E-02 +2.075016E-02 5.432442E-03 1.101095E-02 3.129947E-04 --8.689134E-03 +8.689134E-03 2.422445E-03 -1.097503E-02 4.670673E-04 --4.979355E-02 +4.979355E-02 1.791811E-03 1.769845E-02 6.074665E-04 -1.473469E-02 +-1.473469E-02 1.257671E-03 -1.133757E-02 1.555143E-03 --1.730195E-02 +1.730195E-02 1.841949E-03 -1.191492E-02 1.859105E-03 --9.038577E-03 +9.038577E-03 4.401577E-04 1.770047E-02 4.158291E-04 --1.492809E-02 +1.492809E-02 5.488168E-04 7.970152E-02 1.597910E-03 --3.741348E-02 +3.741348E-02 5.704935E-04 2.078478E-02 5.379832E-04 -1.355930E-02 +-1.355930E-02 6.747758E-04 3.416200E-02 8.262470E-04 1.739000E+01 6.083290E+01 -2.434171E-01 +-2.434171E-01 3.049063E-02 -1.278707E-01 9.585267E-02 -2.597328E-01 +-2.597328E-01 8.692607E-02 2.496700E-01 3.750933E-02 -1.309937E-01 +-1.309937E-01 4.217907E-02 -1.863241E-01 1.738581E-02 --1.292679E-01 +1.292679E-01 1.799004E-02 -3.543191E-01 3.682107E-02 --1.904413E-01 +1.904413E-01 1.455250E-02 -7.093238E-02 1.473997E-02 --1.920412E-01 +1.920412E-01 1.308864E-02 1.566093E-01 1.913492E-02 -2.499642E-01 +-2.499642E-01 3.036874E-02 -2.323022E-01 3.794368E-02 --6.361729E-02 +6.361729E-02 3.266166E-02 4.688479E-02 2.806712E-02 --9.796563E-02 +9.796563E-02 1.419748E-02 1.000847E-02 3.233262E-02 --7.570231E-02 +7.570231E-02 4.626536E-03 1.489091E-01 1.159345E-02 --2.236285E-01 +2.236285E-01 1.480084E-02 2.461305E-01 1.643844E-02 --1.773523E-02 +1.773523E-02 1.626036E-03 6.570774E-02 1.069893E-02 @@ -663,51 +663,51 @@ tally 3: 0.000000E+00 4.160000E+00 3.501000E+00 -9.464171E-02 +-9.464171E-02 8.682833E-03 8.467800E-02 1.402624E-02 --1.283471E-02 +1.283471E-02 2.630439E-02 1.859869E-01 1.189528E-02 --1.910311E-02 +1.910311E-02 2.907370E-03 -2.542253E-01 2.143851E-02 -4.021473E-02 +-4.021473E-02 5.812599E-03 -1.242140E-01 1.017873E-02 -2.934198E-02 +-2.934198E-02 2.409920E-03 5.719767E-02 2.211520E-03 --3.023903E-02 +3.023903E-02 2.870625E-03 1.092479E-01 6.089989E-03 --1.604743E-02 +1.604743E-02 1.110224E-02 3.811062E-03 5.234112E-03 --5.446762E-02 +5.446762E-02 5.323411E-03 -3.868978E-02 4.949255E-03 --1.384260E-01 +1.384260E-01 4.903532E-03 -3.761889E-02 2.524889E-03 -6.079772E-02 +-6.079772E-02 2.328339E-03 1.956623E-03 4.096814E-03 --1.716402E-03 +1.716402E-03 2.022751E-03 -1.108600E-01 3.227014E-03 -2.447622E-03 +-2.447622E-03 4.075421E-03 1.582493E-02 4.847858E-03 @@ -763,51 +763,51 @@ tally 3: 0.000000E+00 5.213000E+01 5.552351E+02 -6.019876E-01 +-6.019876E-01 2.938936E-01 2.126970E-01 3.363271E-01 -6.928646E-01 +-6.928646E-01 3.077152E-01 -2.976474E-01 5.830705E-02 --7.804821E-01 +7.804821E-01 3.967156E-01 5.737502E-01 1.090147E-01 -2.867929E-01 +-2.867929E-01 1.312720E-01 -4.735578E-01 6.714577E-02 -6.340442E-02 +-6.340442E-02 4.240623E-02 -1.594570E-01 1.167021E-01 -5.403124E-02 +-5.403124E-02 6.452745E-02 -2.670969E-01 5.822561E-02 -3.033558E-01 +-3.033558E-01 4.890487E-02 -3.515557E-01 5.069681E-02 --2.257462E-01 +2.257462E-01 4.682933E-02 -1.449924E-02 1.625521E-02 --2.809498E-01 +2.809498E-01 6.883451E-02 1.904808E-01 1.004755E-01 --2.570005E-01 +2.570005E-01 4.301248E-02 9.493600E-02 7.708499E-02 -2.804222E-01 +-2.804222E-01 4.455703E-02 3.199914E-01 7.435651E-02 -2.818069E-04 +-2.818069E-04 7.231318E-02 3.689494E-01 1.349712E-01 @@ -914,101 +914,101 @@ tally 4: 0.000000E+00 9.453374E-01 1.815824E-01 -4.552571E-02 +-4.552571E-02 8.689847E-04 4.192526E-03 6.095248E-04 -4.085060E-03 +-4.085060E-03 3.488081E-04 3.074303E-02 3.709785E-04 --1.949067E-02 +1.949067E-02 1.995057E-04 -7.372260E-02 1.709765E-03 -5.140901E-03 +-5.140901E-03 6.268082E-05 -2.589014E-02 1.616678E-04 --1.683116E-02 +1.683116E-02 2.122512E-04 -1.074659E-02 1.087471E-04 --3.762844E-03 +3.762844E-03 3.439135E-05 1.365793E-02 5.255161E-05 --5.869374E-05 +5.869374E-05 4.060049E-04 -7.715004E-03 3.629588E-04 --8.240120E-03 +8.240120E-03 5.192031E-04 1.662861E-02 5.038262E-04 -2.845811E-03 +-2.845811E-03 2.843348E-04 1.826833E-03 1.104947E-05 -5.596885E-04 +-5.596885E-04 1.922661E-05 1.398723E-02 1.025178E-04 --1.733988E-02 +1.733988E-02 1.184228E-04 1.250057E-02 1.447801E-04 -5.450018E-03 +-5.450018E-03 3.725923E-05 2.390947E-02 6.837656E-04 1.739000E+01 6.083290E+01 -2.434171E-01 +-2.434171E-01 3.049063E-02 -1.278707E-01 9.585267E-02 -2.597328E-01 +-2.597328E-01 8.692607E-02 2.496700E-01 3.750933E-02 -1.309937E-01 +-1.309937E-01 4.217907E-02 -1.863241E-01 1.738581E-02 --1.292679E-01 +1.292679E-01 1.799004E-02 -3.543191E-01 3.682107E-02 --1.904413E-01 +1.904413E-01 1.455250E-02 -7.093238E-02 1.473997E-02 --1.920412E-01 +1.920412E-01 1.308864E-02 1.566093E-01 1.913492E-02 -2.499642E-01 +-2.499642E-01 3.036874E-02 -2.323022E-01 3.794368E-02 --6.361729E-02 +6.361729E-02 3.266166E-02 4.688479E-02 2.806712E-02 --9.796563E-02 +9.796563E-02 1.419748E-02 1.000847E-02 3.233262E-02 --7.570231E-02 +7.570231E-02 4.626536E-03 1.489091E-01 1.159345E-02 --2.236285E-01 +2.236285E-01 1.480084E-02 2.461305E-01 1.643844E-02 --1.773523E-02 +1.773523E-02 1.626036E-03 6.570774E-02 1.069893E-02 @@ -1064,51 +1064,51 @@ tally 4: 0.000000E+00 4.160000E+00 3.501000E+00 -9.464171E-02 +-9.464171E-02 8.682833E-03 8.467800E-02 1.402624E-02 --1.283471E-02 +1.283471E-02 2.630439E-02 1.859869E-01 1.189528E-02 --1.910311E-02 +1.910311E-02 2.907370E-03 -2.542253E-01 2.143851E-02 -4.021473E-02 +-4.021473E-02 5.812599E-03 -1.242140E-01 1.017873E-02 -2.934198E-02 +-2.934198E-02 2.409920E-03 5.719767E-02 2.211520E-03 --3.023903E-02 +3.023903E-02 2.870625E-03 1.092479E-01 6.089989E-03 --1.604743E-02 +1.604743E-02 1.110224E-02 3.811062E-03 5.234112E-03 --5.446762E-02 +5.446762E-02 5.323411E-03 -3.868978E-02 4.949255E-03 --1.384260E-01 +1.384260E-01 4.903532E-03 -3.761889E-02 2.524889E-03 -6.079772E-02 +-6.079772E-02 2.328339E-03 1.956623E-03 4.096814E-03 --1.716402E-03 +1.716402E-03 2.022751E-03 -1.108600E-01 3.227014E-03 -2.447622E-03 +-2.447622E-03 4.075421E-03 1.582493E-02 4.847858E-03 @@ -1164,51 +1164,51 @@ tally 4: 0.000000E+00 5.213000E+01 5.552351E+02 -6.019876E-01 +-6.019876E-01 2.938936E-01 2.126970E-01 3.363271E-01 -6.928646E-01 +-6.928646E-01 3.077152E-01 -2.976474E-01 5.830705E-02 --7.804821E-01 +7.804821E-01 3.967156E-01 5.737502E-01 1.090147E-01 -2.867929E-01 +-2.867929E-01 1.312720E-01 -4.735578E-01 6.714577E-02 -6.340442E-02 +-6.340442E-02 4.240623E-02 -1.594570E-01 1.167021E-01 -5.403124E-02 +-5.403124E-02 6.452745E-02 -2.670969E-01 5.822561E-02 -3.033558E-01 +-3.033558E-01 4.890487E-02 -3.515557E-01 5.069681E-02 --2.257462E-01 +2.257462E-01 4.682933E-02 -1.449924E-02 1.625521E-02 --2.809498E-01 +2.809498E-01 6.883451E-02 1.904808E-01 1.004755E-01 --2.570005E-01 +2.570005E-01 4.301248E-02 9.493600E-02 7.708499E-02 -2.804222E-01 +-2.804222E-01 4.455703E-02 3.199914E-01 7.435651E-02 -2.818069E-04 +-2.818069E-04 7.231318E-02 3.689494E-01 1.349712E-01 From 01cf738f1244f1d82fef7102352ac323c53b1e42 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 7 Oct 2015 20:06:44 -0400 Subject: [PATCH 303/519] Addressed PR comments --- docs/source/usersguide/input.rst | 57 +++++++++++-------- openmc/tallies.py | 6 +- src/input_xml.F90 | 10 ++-- src/physics.F90 | 7 --- .../test_filter_azimuthal.py | 4 +- tests/test_filter_mu/test_filter_mu.py | 4 +- tests/test_filter_polar/test_filter_polar.py | 4 +- 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index fad9574ab3..8df3bbc2ea 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1266,58 +1266,65 @@ The ```` element accepts the following sub-elements: :mu: A monotonically increasing list of bounding **post-collision** - cosines of the change in a particle's angle (i.e., :math:`\mu`), - which represents a portion of the possible values of :math:`\[-1,1\]`. - For example, spanning all of :math:`\[-1,1\]` with five equi-width + cosines of the change in a particle's angle (i.e., + :math:`\mu = \cos(\Omega \cdot \Omega')`), + which represents a portion of the possible values of :math:`[-1,1]`. + For example, spanning all of :math:`[-1,1]` with five equi-width bins can be specified as: - .. code-block :: xml - ```` + .. code-block:: xml + + Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:`\[-1,1\]` should + interpret this to mean the complete range of :math:`[-1,1]` should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:`\[-1,1\]` can be instead written as: + :math:`[-1,1]` can be instead written as: - .. code-block :: xml - ````. + .. code-block:: xml + + :polar: A monotonically increasing list of bounding particle polar angles - which represents a portion of the possible values of :math:`\[0,\pi\]`. - For example, spanning all of :math:`\[0,\pi\]` with five equi-width + which represents a portion of the possible values of :math:`[0,\pi]`. + For example, spanning all of :math:`[0,\pi]` with five equi-width bins can be specified as: - .. code-block :: xml - ```` + .. code-block:: xml + + Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:`\[0,\pi\]` should + interpret this to mean the complete range of :math:`[0,\pi]` should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:`\[0,\pi\]` can be instead written as: + :math:`[0,\pi]` can be instead written as: - .. code-block :: xml - ````. + .. code-block:: xml + + :azimuthal: A monotonically increasing list of bounding particle azimuthal angles - which represents a portion of the possible values of :math:`\[-\pi,\pi\)`. - For example, spanning all of :math:`\[-\pi,\pi\)` with two equi-width + which represents a portion of the possible values of :math:`[-\pi,\pi)`. + For example, spanning all of :math:`[-\pi,\pi)` with two equi-width bins can be specified as: - .. code-block :: xml - ```` + .. code-block:: xml + + Alternatively, if only one value is provided as a bin, OpenMC will - interpret this to mean the complete range of :math:`\[-\pi,\pi\)` should + interpret this to mean the complete range of :math:`[-\pi,\pi)` should be automatically subdivided in to the provided value for the bin. That is, the above example of five equi-width bins spanning - :math:`\[-\pi,\pi\)` can be instead written as: + :math:`[-\pi,\pi)` can be instead written as: - .. code-block :: xml - ````. + .. code-block:: xml + + :mesh: The ``id`` of a structured mesh to be tallied over. diff --git a/openmc/tallies.py b/openmc/tallies.py index 075125f4e6..a0f617d08c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1268,7 +1268,7 @@ class Tally(object): elif 'energy' in filter.type: bins = filter.bins - # Create strings for + # Create strings for dataFrame rows template = '{0:.1e} - {1:.1e}' filter_bins = [] for i in range(filter.num_bins): @@ -1284,13 +1284,13 @@ class Tally(object): elif filter.type in ['mu', 'polar', 'azimuthal']: bins = filter.bins - # Create strings for + # Create strings for dataFrame rows template = '{0:1.2f} - {1:1.2f}' filter_bins = [] for i in range(filter.num_bins): filter_bins.append(template.format(bins[i], bins[i+1])) - # Tile the mu bins into a DataFrame column + # Tile the bins into a DataFrame column filter_bins = np.repeat(filter_bins, filter.stride) tile_factor = data_size / len(filter_bins) filter_bins = np.tile(filter_bins, tile_factor) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 901123bf3f..14c2ea5c98 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2434,10 +2434,9 @@ contains ! Determine number of bins if (check_for_node(node_filt, "bins")) then - if ((temp_str == 'energy' .or. & - temp_str == 'energyout') .or. & - (temp_str == 'mu' .or. temp_str == 'polar') .or. & - (temp_str == 'azimuthal')) then + if (temp_str == 'energy' .or. temp_str == 'energyout' .or. & + temp_str == 'mu' .or. temp_str == 'polar' .or. & + temp_str == 'azimuthal') then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2650,7 +2649,8 @@ contains call get_node_array(node_filt, "bins", t % filters(j) % real_bins) ! Allow a user to input a lone number which will mean that - ! you subivide [0,2pi] evenly with the input being the number of bins + ! you sub-divide [-pi,pi) evenly with the input being the number of + ! bins if (n_words == 1) then Nangle = int(t % filters(j) % real_bins(1)) if (Nangle > 1) then diff --git a/src/physics.F90 b/src/physics.F90 index da5763a034..889126d7d5 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -387,13 +387,6 @@ contains end if - ! ! Check p % mu to ensure it falls within the expected range - ! if (p % mu < -ONE) then - ! p % mu = -ONE - ! else if (p % mu > ONE) then - ! p % mu = ONE - ! end if - ! Set event component p % event = EVENT_SCATTER diff --git a/tests/test_filter_azimuthal/test_filter_azimuthal.py b/tests/test_filter_azimuthal/test_filter_azimuthal.py index f0fff52047..248ba00120 100644 --- a/tests/test_filter_azimuthal/test_filter_azimuthal.py +++ b/tests/test_filter_azimuthal/test_filter_azimuthal.py @@ -21,7 +21,7 @@ class FilterAzimuthalTestHarness(PyAPITestHarness): tally2.add_score('flux') tally2.estimator = 'analog' - filt3 = openmc.Filter(type='azimuthal', bins=(5)) + filt3 = openmc.Filter(type='azimuthal', bins=(5,)) tally3 = openmc.Tally(tally_id=3) tally3.add_filter(filt3) tally3.add_score('flux') @@ -31,7 +31,7 @@ class FilterAzimuthalTestHarness(PyAPITestHarness): mesh.lower_left = [-182.07, -182.07] mesh.upper_right = [182.07, 182.07] mesh.dimension = [2, 2] - filt_mesh = openmc.Filter(type='mesh', bins=(1)) + filt_mesh = openmc.Filter(type='mesh', bins=(1,)) tally4 = openmc.Tally(tally_id=4) tally4.add_filter(filt3) tally4.add_filter(filt_mesh) diff --git a/tests/test_filter_mu/test_filter_mu.py b/tests/test_filter_mu/test_filter_mu.py index cb9f9b86d8..f59f8c63fd 100644 --- a/tests/test_filter_mu/test_filter_mu.py +++ b/tests/test_filter_mu/test_filter_mu.py @@ -16,7 +16,7 @@ class FilterMuTestHarness(PyAPITestHarness): tally1.add_score('scatter') tally1.add_score('nu-scatter') - filt2 = openmc.Filter(type='mu', bins=(5)) + filt2 = openmc.Filter(type='mu', bins=(5,)) tally2 = openmc.Tally(tally_id=2) tally2.add_filter(filt2) tally2.add_score('scatter') @@ -26,7 +26,7 @@ class FilterMuTestHarness(PyAPITestHarness): mesh.lower_left = [-182.07, -182.07] mesh.upper_right = [182.07, 182.07] mesh.dimension = [2, 2] - filt_mesh = openmc.Filter(type='mesh', bins=(1)) + filt_mesh = openmc.Filter(type='mesh', bins=(1,)) tally3 = openmc.Tally(tally_id=3) tally3.add_filter(filt2) tally3.add_filter(filt_mesh) diff --git a/tests/test_filter_polar/test_filter_polar.py b/tests/test_filter_polar/test_filter_polar.py index 74489a3498..db7ed4f6d8 100644 --- a/tests/test_filter_polar/test_filter_polar.py +++ b/tests/test_filter_polar/test_filter_polar.py @@ -21,7 +21,7 @@ class FilterPolarTestHarness(PyAPITestHarness): tally2.add_score('flux') tally2.estimator = 'analog' - filt3 = openmc.Filter(type='polar', bins=(5)) + filt3 = openmc.Filter(type='polar', bins=(5,)) tally3 = openmc.Tally(tally_id=3) tally3.add_filter(filt3) tally3.add_score('flux') @@ -31,7 +31,7 @@ class FilterPolarTestHarness(PyAPITestHarness): mesh.lower_left = [-182.07, -182.07] mesh.upper_right = [182.07, 182.07] mesh.dimension = [2, 2] - filt_mesh = openmc.Filter(type='mesh', bins=(1)) + filt_mesh = openmc.Filter(type='mesh', bins=(1,)) tally4 = openmc.Tally(tally_id=4) tally4.add_filter(filt3) tally4.add_filter(filt_mesh) From 9b4bdec17d8719645debff41c838f3656efd577f Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 7 Oct 2015 20:09:02 -0400 Subject: [PATCH 304/519] Source formatting issue --- src/input_xml.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 14c2ea5c98..6d15f0d204 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2435,8 +2435,8 @@ contains ! Determine number of bins if (check_for_node(node_filt, "bins")) then if (temp_str == 'energy' .or. temp_str == 'energyout' .or. & - temp_str == 'mu' .or. temp_str == 'polar' .or. & - temp_str == 'azimuthal') then + temp_str == 'mu' .or. temp_str == 'polar' .or. & + temp_str == 'azimuthal') then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") From 3ffc466083ee999bdc64ba9b2ae6ba379cc163a7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 8 Oct 2015 11:02:51 +0700 Subject: [PATCH 305/519] Fix documentation of mu, energy, energyout filters --- docs/source/usersguide/input.rst | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 8df3bbc2ea..44db252079 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1253,24 +1253,32 @@ The ```` element accepts the following sub-elements: :energy: A monotonically increasing list of bounding **pre-collision** energies for a number of groups. For example, if this filter is specified as - ````, then two energy bins - will be created, one with energies between 0 and 1 MeV and the other - with energies between 1 and 20 MeV. + + .. code-block:: xml + + + + then two energy bins will be created, one with energies between 0 and + 1 MeV and the other with energies between 1 and 20 MeV. :energyout: A monotonically increasing list of bounding **post-collision** energies for a number of groups. For example, if this filter is - specified as ````, then - two post-collision energy bins will be created, one with energies + specified as + + .. code-block:: xml + + + + then two post-collision energy bins will be created, one with energies between 0 and 1 MeV and the other with energies between 1 and 20 MeV. :mu: - A monotonically increasing list of bounding **post-collision** - cosines of the change in a particle's angle (i.e., - :math:`\mu = \cos(\Omega \cdot \Omega')`), - which represents a portion of the possible values of :math:`[-1,1]`. - For example, spanning all of :math:`[-1,1]` with five equi-width - bins can be specified as: + A monotonically increasing list of bounding **post-collision** cosines + of the change in a particle's angle (i.e., :math:`\mu = \hat{\Omega} + \cdot \hat{\Omega}'`), which represents a portion of the possible + values of :math:`[-1,1]`. For example, spanning all of :math:`[-1,1]` + with five equi-width bins can be specified as: .. code-block:: xml From 54f40eed32b66794c23aa1e5655f781852bcdf4a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 8 Oct 2015 14:23:19 -0400 Subject: [PATCH 306/519] Moved Python builtin routines to beginning of each Python API class --- .../examples/multi-group-cross-sections.ipynb | 651 ++++++++++-------- openmc/cross.py | 94 ++- openmc/element.py | 15 +- openmc/filter.py | 16 +- openmc/material.py | 64 +- openmc/nuclide.py | 19 +- openmc/region.py | 18 +- openmc/surface.py | 32 +- openmc/tallies.py | 52 +- openmc/trigger.py | 14 +- openmc/universe.py | 192 +++--- 11 files changed, 609 insertions(+), 558 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index e7820bca85..5e15337815 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -150,9 +150,20 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Instantiate a Cell\n", "cell = openmc.Cell(cell_id=1, name='cell')\n", @@ -451,8 +462,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 12:56:30\n", + " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", + " Date/Time: 2015-10-08 14:20:33\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -465,11 +476,11 @@ " Reading materials XML file...\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 40090.71c\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", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -478,56 +489,56 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.14249 \n", - " 2/1 1.18016 \n", - " 3/1 1.16083 \n", - " 4/1 1.09124 \n", - " 5/1 1.15214 \n", - " 6/1 1.13453 \n", - " 7/1 1.15552 \n", - " 8/1 1.18149 \n", - " 9/1 1.10404 \n", - " 10/1 1.15703 \n", - " 11/1 1.21224 \n", - " 12/1 1.14147 1.17686 +/- 0.03538\n", - " 13/1 1.12601 1.15991 +/- 0.02655\n", - " 14/1 1.11972 1.14986 +/- 0.02129\n", - " 15/1 1.15683 1.15125 +/- 0.01655\n", - " 16/1 1.15236 1.15144 +/- 0.01351\n", - " 17/1 1.17833 1.15528 +/- 0.01205\n", - " 18/1 1.13229 1.15241 +/- 0.01082\n", - " 19/1 1.22394 1.16035 +/- 0.01242\n", - " 20/1 1.15867 1.16019 +/- 0.01111\n", - " 21/1 1.13611 1.15800 +/- 0.01029\n", - " 22/1 1.14101 1.15658 +/- 0.00950\n", - " 23/1 1.20864 1.16059 +/- 0.00961\n", - " 24/1 1.13475 1.15874 +/- 0.00909\n", - " 25/1 1.10697 1.15529 +/- 0.00914\n", - " 26/1 1.20824 1.15860 +/- 0.00916\n", - " 27/1 1.16775 1.15914 +/- 0.00863\n", - " 28/1 1.15904 1.15913 +/- 0.00813\n", - " 29/1 1.16967 1.15969 +/- 0.00771\n", - " 30/1 1.12574 1.15799 +/- 0.00751\n", - " 31/1 1.16177 1.15817 +/- 0.00715\n", - " 32/1 1.18082 1.15920 +/- 0.00689\n", - " 33/1 1.19549 1.16078 +/- 0.00677\n", - " 34/1 1.18508 1.16179 +/- 0.00656\n", - " 35/1 1.17697 1.16240 +/- 0.00632\n", - " 36/1 1.16342 1.16244 +/- 0.00607\n", - " 37/1 1.17400 1.16286 +/- 0.00586\n", - " 38/1 1.19281 1.16393 +/- 0.00575\n", - " 39/1 1.15669 1.16368 +/- 0.00555\n", - " 40/1 1.17987 1.16422 +/- 0.00539\n", - " 41/1 1.14129 1.16348 +/- 0.00527\n", - " 42/1 1.18323 1.16410 +/- 0.00514\n", - " 43/1 1.13885 1.16334 +/- 0.00504\n", - " 44/1 1.17943 1.16381 +/- 0.00491\n", - " 45/1 1.20014 1.16485 +/- 0.00488\n", - " 46/1 1.16056 1.16473 +/- 0.00474\n", - " 47/1 1.20077 1.16570 +/- 0.00471\n", - " 48/1 1.15469 1.16541 +/- 0.00460\n", - " 49/1 1.18862 1.16601 +/- 0.00452\n", - " 50/1 1.18755 1.16655 +/- 0.00444\n", + " 1/1 1.19804 \n", + " 2/1 1.12945 \n", + " 3/1 1.15573 \n", + " 4/1 1.13929 \n", + " 5/1 1.16300 \n", + " 6/1 1.22117 \n", + " 7/1 1.19012 \n", + " 8/1 1.11299 \n", + " 9/1 1.16066 \n", + " 10/1 1.12566 \n", + " 11/1 1.20854 \n", + " 12/1 1.14691 1.17773 +/- 0.03082\n", + " 13/1 1.17204 1.17583 +/- 0.01789\n", + " 14/1 1.14148 1.16724 +/- 0.01529\n", + " 15/1 1.17272 1.16834 +/- 0.01189\n", + " 16/1 1.18575 1.17124 +/- 0.01014\n", + " 17/1 1.20498 1.17606 +/- 0.00983\n", + " 18/1 1.14754 1.17249 +/- 0.00923\n", + " 19/1 1.18141 1.17348 +/- 0.00820\n", + " 20/1 1.15074 1.17121 +/- 0.00768\n", + " 21/1 1.15914 1.17011 +/- 0.00703\n", + " 22/1 1.14586 1.16809 +/- 0.00673\n", + " 23/1 1.18999 1.16978 +/- 0.00642\n", + " 24/1 1.15101 1.16844 +/- 0.00609\n", + " 25/1 1.13791 1.16640 +/- 0.00602\n", + " 26/1 1.19791 1.16837 +/- 0.00597\n", + " 27/1 1.19818 1.17012 +/- 0.00587\n", + " 28/1 1.14160 1.16854 +/- 0.00576\n", + " 29/1 1.11487 1.16571 +/- 0.00614\n", + " 30/1 1.17538 1.16620 +/- 0.00584\n", + " 31/1 1.20210 1.16791 +/- 0.00581\n", + " 32/1 1.20078 1.16940 +/- 0.00574\n", + " 33/1 1.14624 1.16839 +/- 0.00558\n", + " 34/1 1.14618 1.16747 +/- 0.00542\n", + " 35/1 1.16866 1.16752 +/- 0.00520\n", + " 36/1 1.18565 1.16821 +/- 0.00504\n", + " 37/1 1.16824 1.16821 +/- 0.00485\n", + " 38/1 1.18299 1.16874 +/- 0.00471\n", + " 39/1 1.21418 1.17031 +/- 0.00480\n", + " 40/1 1.11167 1.16835 +/- 0.00504\n", + " 41/1 1.11545 1.16665 +/- 0.00516\n", + " 42/1 1.11114 1.16491 +/- 0.00529\n", + " 43/1 1.14227 1.16423 +/- 0.00517\n", + " 44/1 1.14104 1.16355 +/- 0.00506\n", + " 45/1 1.16756 1.16366 +/- 0.00492\n", + " 46/1 1.13065 1.16274 +/- 0.00487\n", + " 47/1 1.11251 1.16139 +/- 0.00492\n", + " 48/1 1.14731 1.16101 +/- 0.00481\n", + " 49/1 1.16691 1.16117 +/- 0.00469\n", + " 50/1 1.19679 1.16206 +/- 0.00465\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -537,27 +548,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.4800E-01 seconds\n", - " Reading cross sections = 1.5500E-01 seconds\n", - " Total time in simulation = 1.6951E+01 seconds\n", - " Time in transport only = 1.6927E+01 seconds\n", - " Time in inactive batches = 3.1560E+00 seconds\n", - " Time in active batches = 1.3795E+01 seconds\n", - " Time synchronizing fission bank = 7.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 1.7614E+01 seconds\n", - " Calculation Rate (inactive) = 7921.42 neutrons/second\n", - " Calculation Rate (active) = 7249.00 neutrons/second\n", + " Total time for initialization = 4.5400E-01 seconds\n", + " Reading cross sections = 1.0100E-01 seconds\n", + " Total time in simulation = 1.4106E+01 seconds\n", + " Time in transport only = 1.4092E+01 seconds\n", + " Time in inactive batches = 2.1000E+00 seconds\n", + " Time in active batches = 1.2006E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 3.0000E-03 seconds\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.4572E+01 seconds\n", + " Calculation Rate (inactive) = 11904.8 neutrons/second\n", + " Calculation Rate (active) = 8329.17 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.16600 +/- 0.00432\n", - " k-effective (Track-length) = 1.16655 +/- 0.00444\n", - " k-effective (Absorption) = 1.16281 +/- 0.00314\n", - " Combined k-effective = 1.16367 +/- 0.00307\n", + " k-effective (Collision) = 1.16131 +/- 0.00453\n", + " k-effective (Track-length) = 1.16206 +/- 0.00465\n", + " k-effective (Absorption) = 1.16096 +/- 0.00364\n", + " Combined k-effective = 1.16120 +/- 0.00325\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -665,7 +676,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1485: RuntimeWarning: invalid value encountered in divide\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1486: RuntimeWarning: invalid value encountered in divide\n" ] } ], @@ -713,14 +724,14 @@ "\tDomain Type =\tcell\n", "\tDomain ID =\t1\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 5.93e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t6.60e-04 +/- 3.04e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t9.00e-03 +/- 4.10e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.44e-02 +/- 6.58e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.72e-02 +/- 9.80e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.59e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 7.92e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t2.39e-01 +/- 6.90e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 7.69e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t6.59e-04 +/- 2.97e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t8.95e-03 +/- 5.12e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.45e-02 +/- 7.10e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.71e-02 +/- 1.02e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.86e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 6.67e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t2.38e-01 +/- 7.71e-01%\n", "\n", "\n", "\n" @@ -768,8 +779,8 @@ " 1\n", " 1\n", " total\n", - " 0.077460\n", - " 0.000890\n", + " 0.076970\n", + " 0.001012\n", " \n", " \n", " 62\n", @@ -777,8 +788,8 @@ " 1\n", " 2\n", " total\n", - " 0.087276\n", - " 0.000331\n", + " 0.087876\n", + " 0.000344\n", " \n", " \n", " 61\n", @@ -786,8 +797,8 @@ " 1\n", " 3\n", " total\n", - " 0.000450\n", - " 0.000026\n", + " 0.000418\n", + " 0.000023\n", " \n", " \n", " 60\n", @@ -849,8 +860,8 @@ " 2\n", " 2\n", " total\n", - " 0.266651\n", - " 0.001340\n", + " 0.266499\n", + " 0.001265\n", " \n", " \n", "\n", @@ -858,16 +869,16 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "63 1 1 1 total 0.077460 0.000890\n", - "62 1 1 2 total 0.087276 0.000331\n", - "61 1 1 3 total 0.000450 0.000026\n", + "63 1 1 1 total 0.076970 0.001012\n", + "62 1 1 2 total 0.087876 0.000344\n", + "61 1 1 3 total 0.000418 0.000023\n", "60 1 1 4 total 0.000000 0.000000\n", "59 1 1 5 total 0.000000 0.000000\n", "58 1 1 6 total 0.000000 0.000000\n", "57 1 1 7 total 0.000000 0.000000\n", "56 1 1 8 total 0.000000 0.000000\n", "55 1 2 1 total 0.000000 0.000000\n", - "54 1 2 2 total 0.266651 0.001340" + "54 1 2 2 total 0.266499 0.001265" ] }, "execution_count": 21, @@ -1020,133 +1031,133 @@ "[ NORMAL ] Ray tracing for track segmentation...\n", "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685180\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.785704\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750352\tres = 1.467E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.729115\tres = 4.499E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.696059\tres = 2.830E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663970\tres = 4.534E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.633141\tres = 4.610E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.605167\tres = 4.643E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.580592\tres = 4.418E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.559758\tres = 4.061E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.542846\tres = 3.588E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.529901\tres = 3.021E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.520893\tres = 2.385E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.515699\tres = 1.700E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.514152\tres = 9.971E-03\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.516033\tres = 2.999E-03\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.521086\tres = 3.657E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.529034\tres = 9.792E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.539585\tres = 1.525E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.552436\tres = 1.994E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.567286\tres = 2.382E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.583843\tres = 2.688E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.601819\tres = 2.918E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.620946\tres = 3.079E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.640969\tres = 3.178E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.661654\tres = 3.225E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.682785\tres = 3.227E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.704168\tres = 3.194E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.725628\tres = 3.132E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.747011\tres = 3.048E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.768182\tres = 2.947E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.789024\tres = 2.834E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.809439\tres = 2.713E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.829342\tres = 2.587E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.848666\tres = 2.459E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.867356\tres = 2.330E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.885370\tres = 2.202E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.902676\tres = 2.077E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.919253\tres = 1.955E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.935087\tres = 1.836E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.950174\tres = 1.723E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.964514\tres = 1.613E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.978114\tres = 1.509E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.990987\tres = 1.410E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 1.003145\tres = 1.316E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.014610\tres = 1.227E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.025401\tres = 1.143E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.035542\tres = 1.064E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.045058\tres = 9.890E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 1.053973\tres = 9.189E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.062316\tres = 8.531E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.070112\tres = 7.915E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.077389\tres = 7.339E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.084173\tres = 6.800E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.090490\tres = 6.297E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.096368\tres = 5.827E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.101830\tres = 5.390E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.106902\tres = 4.982E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.111608\tres = 4.603E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.115969\tres = 4.251E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.120009\tres = 3.924E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.123747\tres = 3.620E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.127204\tres = 3.338E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.130399\tres = 3.076E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.133349\tres = 2.834E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.136072\tres = 2.610E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.138584\tres = 2.403E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.140899\tres = 2.211E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.143032\tres = 2.033E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.144996\tres = 1.869E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.146803\tres = 1.718E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.148466\tres = 1.579E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.149995\tres = 1.450E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.151399\tres = 1.331E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.152690\tres = 1.222E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.153875\tres = 1.121E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.154963\tres = 1.028E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.155961\tres = 9.428E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.156876\tres = 8.642E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.157716\tres = 7.920E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.158485\tres = 7.256E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.159190\tres = 6.646E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.159836\tres = 6.085E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.160427\tres = 5.571E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.160969\tres = 5.098E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.161464\tres = 4.665E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.161917\tres = 4.268E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.162332\tres = 3.903E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.162711\tres = 3.570E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.163058\tres = 3.264E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.163375\tres = 2.982E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.163664\tres = 2.725E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.163929\tres = 2.490E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.164171\tres = 2.275E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.164392\tres = 2.077E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.164593\tres = 1.897E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.164777\tres = 1.733E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.164946\tres = 1.581E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.165099\tres = 1.444E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.165239\tres = 1.317E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.165367\tres = 1.202E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.165483\tres = 1.096E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.165590\tres = 1.000E-04\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.165687\tres = 9.126E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.165775\tres = 8.326E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.165856\tres = 7.590E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.165929\tres = 6.924E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.165996\tres = 6.304E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.166057\tres = 5.745E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.166113\tres = 5.243E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.166164\tres = 4.776E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.166210\tres = 4.355E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.166252\tres = 3.962E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.166291\tres = 3.624E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.166326\tres = 3.295E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.166358\tres = 3.003E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.166387\tres = 2.737E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.166413\tres = 2.486E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.166437\tres = 2.267E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.166459\tres = 2.061E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.166479\tres = 1.883E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.166497\tres = 1.711E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.166514\tres = 1.563E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.166529\tres = 1.418E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.166543\tres = 1.300E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.166555\tres = 1.176E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.166567\tres = 1.074E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.728847\tres = 4.513E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.695633\tres = 2.844E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.701456\tres = 3.194E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.722831\tres = 3.132E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.085609\tres = 6.273E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.091436\tres = 5.804E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.101877\tres = 4.961E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.110860\tres = 4.231E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.114861\tres = 3.905E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.118563\tres = 3.602E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.121986\tres = 3.321E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.125149\tres = 3.060E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.128069\tres = 2.819E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.133248\tres = 2.389E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.135538\tres = 2.197E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.137648\tres = 2.021E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.139590\tres = 1.858E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.141377\tres = 1.707E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.144531\tres = 1.440E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.147195\tres = 1.213E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.148365\tres = 1.113E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.150425\tres = 9.356E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.151329\tres = 8.574E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.152157\tres = 7.856E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.152916\tres = 7.196E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.153612\tres = 6.590E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.154249\tres = 6.033E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.154832\tres = 5.522E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.155366\tres = 5.053E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.155855\tres = 4.623E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.156302\tres = 4.229E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.156710\tres = 3.866E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.157084\tres = 3.535E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.157426\tres = 3.230E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.157738\tres = 2.952E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158023\tres = 2.697E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.158284\tres = 2.464E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.158522\tres = 2.251E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.158739\tres = 2.055E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.158937\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.159119\tres = 1.713E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.159284\tres = 1.564E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.159435\tres = 1.428E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.159573\tres = 1.301E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.159813\tres = 1.083E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.159917\tres = 9.880E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.160013\tres = 9.009E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.160100\tres = 8.222E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.160179\tres = 7.487E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.160251\tres = 6.824E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.160317\tres = 6.223E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.160376\tres = 5.675E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.160431\tres = 5.174E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.160481\tres = 4.715E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.160527\tres = 4.298E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.160568\tres = 3.910E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.160605\tres = 3.561E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.160640\tres = 3.242E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.160671\tres = 2.960E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.160699\tres = 2.689E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.160725\tres = 2.452E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.160749\tres = 2.232E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.160770\tres = 2.034E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.160790\tres = 1.855E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.160807\tres = 1.687E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.160824\tres = 1.538E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.160838\tres = 1.399E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.160852\tres = 1.280E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.160864\tres = 1.149E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.160875\tres = 1.061E-05\n" ] } ], @@ -1179,9 +1190,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.163673\n", - "openmoc keff = 1.166567\n", - "bias [pcm]: 289.4\n" + "openmc keff = 1.161200\n", + "openmoc keff = 1.160875\n", + "bias [pcm]: -32.5\n" ] } ], @@ -1324,9 +1335,20 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -1364,7 +1386,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", @@ -1600,25 +1633,25 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU-235\n", "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 6.20e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 3.40e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.51e+01 +/- 5.07e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.79e+01 +/- 7.27e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.90e+02 +/- 1.13e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.11e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.88e+02 +/- 9.03e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 6.88e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 5.91e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 4.03e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.48e+01 +/- 5.56e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.84e+01 +/- 8.48e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 1.25e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 7.98e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 5.73e-01%\n", "\n", "\tNuclide =\tU-238\n", "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.07e+00 +/- 6.51e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 6.61e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t6.15e-04 +/- 9.95e+00%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 6.29e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.08e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.11e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 9.03e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 6.86e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 6.74e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 8.28e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t4.75e-04 +/- 7.97e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 7.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.22e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 7.97e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 5.72e-01%\n", "\n", "\n", "\n" @@ -1653,14 +1686,14 @@ "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t2.54e-02 +/- 6.20e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 3.34e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t2.07e-02 +/- 5.07e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.30e-02 +/- 7.26e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.13e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.11e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 9.03e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 6.88e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 6.42e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.52e-03 +/- 3.96e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 5.56e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.32e-02 +/- 8.48e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.25e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 7.98e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 5.73e-01%\n", "\n", "\n", "\n" @@ -1709,8 +1742,8 @@ " 1\n", " 1\n", " O-16\n", - " 1.570467\n", - " 0.018506\n", + " 1.560098\n", + " 0.017801\n", " \n", " \n", " 127\n", @@ -1718,8 +1751,8 @@ " 1\n", " 1\n", " H-1\n", - " 0.235674\n", - " 0.009063\n", + " 0.234877\n", + " 0.010096\n", " \n", " \n", " 124\n", @@ -1727,8 +1760,8 @@ " 1\n", " 2\n", " O-16\n", - " 0.288333\n", - " 0.003932\n", + " 0.288236\n", + " 0.004397\n", " \n", " \n", " 125\n", @@ -1736,8 +1769,8 @@ " 1\n", " 2\n", " H-1\n", - " 1.581295\n", - " 0.008248\n", + " 1.587815\n", + " 0.007847\n", " \n", " \n", " 122\n", @@ -1754,8 +1787,8 @@ " 1\n", " 3\n", " H-1\n", - " 0.010828\n", - " 0.000616\n", + " 0.010122\n", + " 0.000513\n", " \n", " \n", " 120\n", @@ -1799,12 +1832,12 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 O-16 1.570467 0.018506\n", - "127 10002 1 1 H-1 0.235674 0.009063\n", - "124 10002 1 2 O-16 0.288333 0.003932\n", - "125 10002 1 2 H-1 1.581295 0.008248\n", + "126 10002 1 1 O-16 1.560098 0.017801\n", + "127 10002 1 1 H-1 0.234877 0.010096\n", + "124 10002 1 2 O-16 0.288236 0.004397\n", + "125 10002 1 2 H-1 1.587815 0.007847\n", "122 10002 1 3 O-16 0.000000 0.000000\n", - "123 10002 1 3 H-1 0.010828 0.000616\n", + "123 10002 1 3 H-1 0.010122 0.000513\n", "120 10002 1 4 O-16 0.000000 0.000000\n", "121 10002 1 4 H-1 0.000000 0.000000\n", "118 10002 1 5 O-16 0.000000 0.000000\n", @@ -1866,9 +1899,9 @@ "outputs": [ { "data": { - "image/png": "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\nAAAASUVORK5CYII=\n", + "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1936,18 +1969,18 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU-238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t2.16e-01 +/- 3.77e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t2.54e-01 +/- 6.46e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 5.85e-01%\n", "\n", "\tNuclide =\tO-16\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.03e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 7.83e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", "\n", "\tNuclide =\tU-235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.72e-03 +/- 1.13e+00%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 5.18e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", "\n", "\n", "\n" @@ -1986,48 +2019,48 @@ " 10000\n", " 1\n", " U-238\n", - " 9.566947\n", - " 0.036112\n", + " 9.589323\n", + " 0.038756\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " O-16\n", - " 3.146780\n", - " 0.012666\n", + " 3.159101\n", + " 0.012939\n", " \n", " \n", " 5\n", " 10000\n", " 1\n", " U-235\n", - " 20.591253\n", - " 0.232675\n", + " 21.095256\n", + " 0.257787\n", " \n", " \n", " 0\n", " 10000\n", " 2\n", " U-238\n", - " 11.204912\n", - " 0.072348\n", + " 11.178844\n", + " 0.065428\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " O-16\n", - " 3.798407\n", - " 0.029742\n", + " 3.800027\n", + " 0.024538\n", " \n", " \n", " 2\n", " 10000\n", " 2\n", " U-235\n", - " 484.529684\n", - " 2.510940\n", + " 485.513530\n", + " 2.418761\n", " \n", " \n", "\n", @@ -2035,12 +2068,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-238 9.566947 0.036112\n", - "4 10000 1 O-16 3.146780 0.012666\n", - "5 10000 1 U-235 20.591253 0.232675\n", - "0 10000 2 U-238 11.204912 0.072348\n", - "1 10000 2 O-16 3.798407 0.029742\n", - "2 10000 2 U-235 484.529684 2.510940" + "3 10000 1 U-238 9.589323 0.038756\n", + "4 10000 1 O-16 3.159101 0.012939\n", + "5 10000 1 U-235 21.095256 0.257787\n", + "0 10000 2 U-238 11.178844 0.065428\n", + "1 10000 2 O-16 3.800027 0.024538\n", + "2 10000 2 U-235 485.513530 2.418761" ] }, "execution_count": 46, @@ -2176,9 +2209,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.231090\n", - "openmoc keff = 1.229390\n", - "bias [pcm]: -170.1\n" + "openmc keff = 1.227616\n", + "openmoc keff = 1.225325\n", + "bias [pcm]: -229.1\n" ] } ], @@ -2206,7 +2239,23 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n" + ] + } + ], "source": [ "su.make_opencg_geometry()\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", @@ -2270,9 +2319,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.231090\n", - "openmoc keff = 1.232146\n", - "bias [pcm]: 105.6\n" + "openmc keff = 1.227616\n", + "openmoc keff = 1.227096\n", + "bias [pcm]: -52.0\n" ] } ], diff --git a/openmc/cross.py b/openmc/cross.py index 9b8a1d240d..b91344671a 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -9,7 +9,7 @@ if sys.version_info[0] >= 3: basestring = str # Acceptable tally arithmetic binary operations -TALLY_ARITHMETIC_OPS = ['+', '-', '*', '/', '^'] +_TALLY_ARITHMETIC_OPS = ['+', '-', '*', '/', '^'] class CrossScore(object): @@ -78,6 +78,11 @@ class CrossScore(object): else: return existing + def __repr__(self): + string = '({0} {1} {2})'.format(self.left_score, + self.binary_op, self.right_score) + return string + @property def left_score(self): return self._left_score @@ -103,14 +108,9 @@ class CrossScore(object): @binary_op.setter def binary_op(self, binary_op): cv.check_type('binary_op', binary_op, (basestring, CrossScore)) - cv.check_value('binary_op', binary_op, TALLY_ARITHMETIC_OPS) + cv.check_value('binary_op', binary_op, _TALLY_ARITHMETIC_OPS) self._binary_op = binary_op - def __repr__(self): - string = '({0} {1} {2})'.format(self.left_score, - self.binary_op, self.right_score) - return string - class CrossNuclide(object): """A special-purpose nuclide used to encapsulate all combinations of two @@ -178,6 +178,28 @@ class CrossNuclide(object): else: return existing + def __repr__(self): + + string = '' + + # If the Summary was linked, the left nuclide is a Nuclide object + if isinstance(self.left_nuclide, Nuclide): + string += '(' + self.left_nuclide.name + # If the Summary was not linked, the left nuclide is the ZAID + else: + string += '(' + str(self.left_nuclide) + + string += ' ' + self.binary_op + ' ' + + # If the Summary was linked, the right nuclide is a Nuclide object + if isinstance(self.right_nuclide, Nuclide): + string += self.right_nuclide.name + ')' + # If the Summary was not linked, the right nuclide is the ZAID + else: + string += str(self.right_nuclide) + ')' + + return string + @property def left_nuclide(self): return self._left_nuclide @@ -203,34 +225,9 @@ class CrossNuclide(object): @binary_op.setter def binary_op(self, binary_op): cv.check_type('binary_op', binary_op, basestring) - cv.check_value('binary_op', binary_op, TALLY_ARITHMETIC_OPS) + cv.check_value('binary_op', binary_op, _TALLY_ARITHMETIC_OPS) self._binary_op = binary_op - def __eq__(self, other): - return str(other) == str(self) - - def __repr__(self): - - string = '' - - # If the Summary was linked, the left nuclide is a Nuclide object - if isinstance(self.left_nuclide, Nuclide): - string += '(' + self.left_nuclide.name - # If the Summary was not linked, the left nuclide is the ZAID - else: - string += '(' + str(self.left_nuclide) - - string += ' ' + self.binary_op + ' ' - - # If the Summary was linked, the right nuclide is a Nuclide object - if isinstance(self.right_nuclide, Nuclide): - string += self.right_nuclide.name + ')' - # If the Summary was not linked, the right nuclide is the ZAID - else: - string += str(self.right_nuclide) + ')' - - return string - class CrossFilter(object): """A special-purpose filter used to encapsulate all combinations of two @@ -289,6 +286,18 @@ class CrossFilter(object): def __ne__(self, other): return not self == other + def __repr__(self): + + string = 'CrossFilter\n' + filter_type = '({0} {1} {2})'.format(self.left_filter.type, + self.binary_op, + self.right_filter.type) + filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, + self.binary_op, + self.right_filter.bins) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) + return string def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -366,7 +375,7 @@ class CrossFilter(object): @binary_op.setter def binary_op(self, binary_op): cv.check_type('binary_op', binary_op, basestring) - cv.check_value('binary_op', binary_op, TALLY_ARITHMETIC_OPS) + cv.check_value('binary_op', binary_op, _TALLY_ARITHMETIC_OPS) self._binary_op = binary_op @stride.setter @@ -415,7 +424,7 @@ class CrossFilter(object): Parameters ---------- - data_size : Integral + datasize : Integral The total number of bins in the tally corresponding to this filter summary : None or Summary An optional Summary object to be used to construct columns for @@ -452,17 +461,4 @@ class CrossFilter(object): right_df = right_df.astype(str) df = '(' + left_df + ' ' + self.binary_op + ' ' + right_df + ')' - return df - - def __repr__(self): - - string = 'CrossFilter\n' - filter_type = '({0} {1} {2})'.format(self.left_filter.type, - self.binary_op, - self.right_filter.type) - filter_bins = '({0} {1} {2})'.format(self.left_filter.bins, - self.binary_op, - self.right_filter.bins) - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) - string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) - return string \ No newline at end of file + return df \ No newline at end of file diff --git a/openmc/element.py b/openmc/element.py index a99d471271..56821b5d2f 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -51,9 +51,17 @@ class Element(object): else: return False + def __ne__(self, other): + return not self == other + def __hash__(self): return hash((self._name, self._xs)) + def __repr__(self): + string = 'Element - {0}\n'.format(self._name) + string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) + return string + @property def xs(self): return self._xs @@ -70,9 +78,4 @@ class Element(object): @name.setter def name(self, name): check_type('name', name, basestring) - self._name = name - - def __repr__(self): - string = 'Element - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) - return string + self._name = name \ No newline at end of file diff --git a/openmc/filter.py b/openmc/filter.py index 385ba20cf2..63034fe57e 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -104,6 +104,13 @@ class Filter(object): else: return existing + def __repr__(self): + string = 'Filter\n' + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type) + string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins) + string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self.offset) + return string + @property def type(self): return self._type @@ -741,11 +748,4 @@ class Filter(object): filter_bins = filter_bins df = pd.concat([df, pd.DataFrame({self.type : filter_bins})]) - return df - - def __repr__(self): - string = 'Filter\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type) - string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins) - string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self.offset) - return string + return df \ No newline at end of file diff --git a/openmc/material.py b/openmc/material.py index 3ca8f24130..92c77858d5 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -83,6 +83,38 @@ class Material(object): # If specified, this file will be used instead of composition values self._distrib_otf_file = None + def __repr__(self): + string = 'Material\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + + string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) + string += ' [{0}]\n'.format(self._density_units) + + string += '{0: <16}\n'.format('\tS(a,b) Tables') + + for sab in self._sab: + string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t', + sab[0], sab[1]) + + string += '{0: <16}\n'.format('\tNuclides') + + for nuclide in self._nuclides: + percent = self._nuclides[nuclide][1] + percent_type = self._nuclides[nuclide][2] + string += '{0: <16}'.format('\t{0}'.format(nuclide)) + string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + + string += '{0: <16}\n'.format('\tElements') + + for element in self._elements: + percent = self._nuclides[element][1] + percent_type = self._nuclides[element][2] + string += '{0: >16}'.format('\t{0}'.format(element)) + string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + + return string + @property def id(self): return self._id @@ -335,38 +367,6 @@ class Material(object): return nuclides - def __repr__(self): - string = 'Material\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - - string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) - string += ' [{0}]\n'.format(self._density_units) - - string += '{0: <16}\n'.format('\tS(a,b) Tables') - - for sab in self._sab: - string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t', - sab[0], sab[1]) - - string += '{0: <16}\n'.format('\tNuclides') - - for nuclide in self._nuclides: - percent = self._nuclides[nuclide][1] - percent_type = self._nuclides[nuclide][2] - string += '{0: <16}'.format('\t{0}'.format(nuclide)) - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) - - string += '{0: <16}\n'.format('\tElements') - - for element in self._elements: - percent = self._nuclides[element][1] - percent_type = self._nuclides[element][2] - string += '{0: >16}'.format('\t{0}'.format(element)) - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) - - return string - def _get_nuclide_xml(self, nuclide, distrib=False): xml_element = ET.Element("nuclide") xml_element.set("name", nuclide[0]._name) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index a616edac94..f24e62a482 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -54,9 +54,19 @@ class Nuclide(object): else: return False + def __ne__(self, other): + return not self == other + def __hash__(self): return hash((self._name, self._xs)) + def __repr__(self): + string = 'Nuclide - {0}\n'.format(self._name) + string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) + if self._zaid is not None: + string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) + return string + @property def name(self): return self._name @@ -82,11 +92,4 @@ class Nuclide(object): @zaid.setter def zaid(self, zaid): check_type('zaid', zaid, Integral) - self._zaid = zaid - - def __repr__(self): - string = 'Nuclide - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) - if self._zaid is not None: - string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) - return string + self._zaid = zaid \ No newline at end of file diff --git a/openmc/region.py b/openmc/region.py index 5baac22dd2..f8f3a73781 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -213,6 +213,9 @@ class Intersection(Region): def __init__(self, *nodes): self.nodes = list(nodes) + def __str__(self): + return '(' + ' '.join(map(str, self.nodes)) + ')' + @property def nodes(self): return self._nodes @@ -222,9 +225,6 @@ class Intersection(Region): check_type('nodes', nodes, Iterable, Region) self._nodes = nodes - def __str__(self): - return '(' + ' '.join(map(str, self.nodes)) + ')' - class Union(Region): """Union of two or more regions. @@ -252,6 +252,9 @@ class Union(Region): def __init__(self, *nodes): self.nodes = list(nodes) + def __str__(self): + return '(' + ' | '.join(map(str, self.nodes)) + ')' + @property def nodes(self): return self._nodes @@ -261,9 +264,6 @@ class Union(Region): check_type('nodes', nodes, Iterable, Region) self._nodes = nodes - def __str__(self): - return '(' + ' | '.join(map(str, self.nodes)) + ')' - class Complement(Region): """Complement of a region. @@ -295,6 +295,9 @@ class Complement(Region): def __init__(self, node): self.node = node + def __str__(self): + return '~' + str(self.node) + @property def node(self): return self._node @@ -303,6 +306,3 @@ class Complement(Region): def node(self, node): check_type('node', node, Region) self._node = node - - def __str__(self): - return '~' + str(self.node) diff --git a/openmc/surface.py b/openmc/surface.py index afa426fa3b..ae2e222ac5 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -75,6 +75,22 @@ class Surface(object): def __pos__(self): return Halfspace(self, '+') + def __repr__(self): + string = 'Surface\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) + string += '{0: <16}{1}{2}\n'.format('\tBoundary', '=\t', self._boundary_type) + + coeffs = '{0: <16}'.format('\tCoefficients') + '\n' + + for coeff in self._coeffs: + coeffs += '{0: <16}{1}{2}\n'.format(coeff, '=\t', self._coeffs[coeff]) + + string += coeffs + + return string + @property def id(self): return self._id @@ -120,22 +136,6 @@ class Surface(object): check_value('boundary type', boundary_type, _BC_TYPES) self._boundary_type = boundary_type - def __repr__(self): - string = 'Surface\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type) - string += '{0: <16}{1}{2}\n'.format('\tBoundary', '=\t', self._boundary_type) - - coeffs = '{0: <16}'.format('\tCoefficients') + '\n' - - for coeff in self._coeffs: - coeffs += '{0: <16}{1}{2}\n'.format(coeff, '=\t', self._coeffs[coeff]) - - string += coeffs - - return string - def create_xml_subelement(self): element = ET.Element("surface") element.set("id", str(self._id)) diff --git a/openmc/tallies.py b/openmc/tallies.py index a25004ff91..f990572e57 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -204,6 +204,32 @@ class Tally(object): return hash(tuple(hashable)) + def __repr__(self): + string = 'Tally\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self.id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self.name) + + string += '{0: <16}{1}\n'.format('\tFilters', '=\t') + + for filter in self.filters: + string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type, + filter.bins) + + string += '{0: <16}{1}'.format('\tNuclides', '=\t') + + for nuclide in self.nuclides: + if isinstance(nuclide, Nuclide): + string += '{0} '.format(nuclide.name) + else: + string += '{0} '.format(nuclide) + + string += '\n' + + string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self.scores) + string += '{0: <16}{1}{2}\n'.format('\tEstimator', '=\t', self.estimator) + + return string + @property def id(self): return self._id @@ -518,32 +544,6 @@ class Tally(object): self._nuclides.remove(nuclide) - def __repr__(self): - string = 'Tally\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self.id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self.name) - - string += '{0: <16}{1}\n'.format('\tFilters', '=\t') - - for filter in self.filters: - string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type, - filter.bins) - - string += '{0: <16}{1}'.format('\tNuclides', '=\t') - - for nuclide in self.nuclides: - if isinstance(nuclide, Nuclide): - string += '{0} '.format(nuclide.name) - else: - string += '{0} '.format(nuclide) - - string += '\n' - - string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self.scores) - string += '{0: <16}{1}{2}\n'.format('\tEstimator', '=\t', self.estimator) - - return string - def can_merge(self, tally): """Determine if another tally can be merged with this one diff --git a/openmc/trigger.py b/openmc/trigger.py index e695defde2..5af477edd1 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -58,6 +58,13 @@ class Trigger(object): else: return existing + def __repr__(self): + string = 'Trigger\n' + string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type) + string += '{0: <16}{1}{2}\n'.format('\tThreshold', '=\t', self._threshold) + string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self._scores) + return string + @property def trigger_type(self): return self._trigger_type @@ -102,13 +109,6 @@ class Trigger(object): else: self._scores.append(score) - def __repr__(self): - string = 'Trigger\n' - string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type) - string += '{0: <16}{1}{2}\n'.format('\tThreshold', '=\t', self._threshold) - string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self._scores) - return string - def get_trigger_xml(self, element): """Return XML representation of the trigger diff --git a/openmc/universe.py b/openmc/universe.py index e9f7f3284c..a4ea38de9c 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -73,6 +73,30 @@ class Cell(object): self._translation = None self._offsets = None + 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) + + if isinstance(self._fill, openmc.Material): + string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t', + self._fill._id) + elif isinstance(self._fill, (Universe, Lattice)): + string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', + self._fill._id) + else: + string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill) + + string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region) + + string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t', + self._rotation) + string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t', + self._translation) + string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets) + + return string + @property def id(self): return self._id @@ -298,30 +322,6 @@ class Cell(object): return universes - 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) - - if isinstance(self._fill, openmc.Material): - string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t', - self._fill._id) - elif isinstance(self._fill, (Universe, Lattice)): - string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', - self._fill._id) - else: - string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill) - - string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region) - - string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t', - self._rotation) - string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t', - self._translation) - string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets) - - return string - def create_xml_subelement(self, xml_element): element = ET.Element("cell") element.set("id", str(self._id)) @@ -836,6 +836,50 @@ class RectLattice(Lattice): self._lower_left = None self._offsets = None + def __repr__(self): + string = 'RectLattice\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + string += '{0: <16}{1}{2}\n'.format('\tDimension', '=\t', + self._dimension) + string += '{0: <16}{1}{2}\n'.format('\tLower Left', '=\t', + self._lower_left) + string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) + + if self._outer is not None: + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + self._outer._id) + else: + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + self._outer) + + string += '{0: <16}\n'.format('\tUniverses') + + # Lattice nested Universe IDs - column major for Fortran + for i, universe in enumerate(np.ravel(self._universes)): + string += '{0} '.format(universe._id) + + # Add a newline character every time we reach end of row of cells + if (i+1) % self._dimension[-1] == 0: + string += '\n' + + string = string.rstrip('\n') + + if self._offsets is not None: + string += '{0: <16}\n'.format('\tOffsets') + + # Lattice cell offsets + for i, offset in enumerate(np.ravel(self._offsets)): + string += '{0} '.format(offset) + + # Add a newline character when we reach end of row of cells + if (i+1) % self._dimension[-1] == 0: + string += '\n' + + string = string.rstrip('\n') + + return string + @property def dimension(self): return self._dimension @@ -893,50 +937,6 @@ class RectLattice(Lattice): return offset - def __repr__(self): - string = 'RectLattice\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}\n'.format('\tDimension', '=\t', - self._dimension) - string += '{0: <16}{1}{2}\n'.format('\tLower Left', '=\t', - self._lower_left) - string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) - - if self._outer is not None: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', - self._outer._id) - else: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', - self._outer) - - string += '{0: <16}\n'.format('\tUniverses') - - # Lattice nested Universe IDs - column major for Fortran - for i, universe in enumerate(np.ravel(self._universes)): - string += '{0} '.format(universe._id) - - # Add a newline character every time we reach end of row of cells - if (i+1) % self._dimension[-1] == 0: - string += '\n' - - string = string.rstrip('\n') - - if self._offsets is not None: - string += '{0: <16}\n'.format('\tOffsets') - - # Lattice cell offsets - for i, offset in enumerate(np.ravel(self._offsets)): - string += '{0} '.format(offset) - - # Add a newline character when we reach end of row of cells - if (i+1) % self._dimension[-1] == 0: - string += '\n' - - string = string.rstrip('\n') - - return string - def create_xml_subelement(self, xml_element): # Determine if XML element already contains subelement for this Lattice path = './lattice[@id=\'{0}\']'.format(self._id) @@ -1052,6 +1052,34 @@ class HexLattice(Lattice): self._num_axial = None self._center = None + def __repr__(self): + string = 'HexLattice\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + string += '{0: <16}{1}{2}\n'.format('\t# Rings', '=\t', self._num_rings) + string += '{0: <16}{1}{2}\n'.format('\t# Axial', '=\t', self._num_axial) + string += '{0: <16}{1}{2}\n'.format('\tCenter', '=\t', + self._center) + string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) + + if self._outer is not None: + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + self._outer._id) + else: + string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', + self._outer) + + string += '{0: <16}\n'.format('\tUniverses') + + if self._num_axial is not None: + slices = [self._repr_axial_slice(x) for x in self._universes] + string += '\n'.join(slices) + + else: + string += self._repr_axial_slice(self._universes) + + return string + @property def num_rings(self): return self._num_rings @@ -1172,34 +1200,6 @@ class HexLattice(Lattice): 6*(self._num_rings - 1 - r)) raise ValueError(msg) - def __repr__(self): - string = 'HexLattice\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}\n'.format('\t# Rings', '=\t', self._num_rings) - string += '{0: <16}{1}{2}\n'.format('\t# Axial', '=\t', self._num_axial) - string += '{0: <16}{1}{2}\n'.format('\tCenter', '=\t', - self._center) - string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch) - - if self._outer is not None: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', - self._outer._id) - else: - string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t', - self._outer) - - string += '{0: <16}\n'.format('\tUniverses') - - if self._num_axial is not None: - slices = [self._repr_axial_slice(x) for x in self._universes] - string += '\n'.join(slices) - - else: - string += self._repr_axial_slice(self._universes) - - return string - def create_xml_subelement(self, xml_element): # Determine if XML element already contains subelement for this Lattice path = './hex_lattice[@id=\'{0}\']'.format(self._id) From 1e63829dfd7d3b7bdc4706de8b6f04aea8a59e61 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 8 Oct 2015 16:04:23 -0400 Subject: [PATCH 307/519] Revised EnergyGroups class per comments from @paulromano --- .../examples/multi-group-cross-sections.ipynb | 127 ++-- .../examples/pandas-dataframes.ipynb | 672 ++++++++--------- .../pythonapi/examples/tally-arithmetic.ipynb | 676 ++++++++++++++++-- openmc/filter.py | 6 +- openmc/mgxs/groups.py | 63 +- 5 files changed, 1044 insertions(+), 500 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 5e15337815..7c7ad7bbb8 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -330,7 +330,7 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -463,7 +463,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 14:20:33\n", + " Date/Time: 2015-10-08 16:01:19\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -548,20 +548,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.5400E-01 seconds\n", - " Reading cross sections = 1.0100E-01 seconds\n", - " Total time in simulation = 1.4106E+01 seconds\n", - " Time in transport only = 1.4092E+01 seconds\n", - " Time in inactive batches = 2.1000E+00 seconds\n", - " Time in active batches = 1.2006E+01 seconds\n", + " Total time for initialization = 3.9700E-01 seconds\n", + " Reading cross sections = 9.1000E-02 seconds\n", + " Total time in simulation = 1.2622E+01 seconds\n", + " Time in transport only = 1.2608E+01 seconds\n", + " Time in inactive batches = 1.8770E+00 seconds\n", + " Time in active batches = 1.0745E+01 seconds\n", " Time synchronizing fission bank = 4.0000E-03 seconds\n", " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 3.0000E-03 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.4572E+01 seconds\n", - " Calculation Rate (inactive) = 11904.8 neutrons/second\n", - " Calculation Rate (active) = 8329.17 neutrons/second\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 1.3030E+01 seconds\n", + " Calculation Rate (inactive) = 13319.1 neutrons/second\n", + " Calculation Rate (active) = 9306.65 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -579,7 +579,7 @@ "0" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -606,7 +606,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -625,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -645,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -667,7 +667,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -710,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -751,7 +751,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -881,7 +881,7 @@ "54 1 2 2 total 0.266499 0.001265" ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -900,7 +900,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": { "collapsed": true }, @@ -918,7 +918,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": { "collapsed": true }, @@ -946,7 +946,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -985,7 +985,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": { "collapsed": true }, @@ -1019,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -1181,7 +1181,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -1244,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -1278,7 +1278,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": { "collapsed": true }, @@ -1304,7 +1304,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": { "collapsed": true }, @@ -1333,7 +1333,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1382,7 +1382,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1423,7 +1423,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": { "collapsed": true }, @@ -1450,7 +1450,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1480,7 +1480,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1520,7 +1520,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1531,7 +1531,7 @@ "0" ] }, - "execution_count": 36, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1561,7 +1561,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1582,7 +1582,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1618,7 +1618,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "metadata": { "collapsed": false }, @@ -1672,7 +1672,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -1714,7 +1714,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1844,7 +1844,7 @@ "119 10002 1 5 H-1 0.000000 0.000000" ] }, - "execution_count": 41, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1864,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -1892,7 +1892,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 44, "metadata": { "collapsed": false }, @@ -1901,7 +1901,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1932,7 +1932,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 45, "metadata": { "collapsed": true }, @@ -1954,7 +1954,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -1993,7 +1993,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -2076,7 +2076,7 @@ "2 10000 2 U-235 485.513530 2.418761" ] }, - "execution_count": 46, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -2102,7 +2102,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 48, "metadata": { "collapsed": true }, @@ -2124,7 +2124,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -2172,7 +2172,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -2200,7 +2200,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2235,7 +2235,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -2292,7 +2292,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 53, "metadata": { "collapsed": false }, @@ -2310,7 +2310,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 54, "metadata": { "collapsed": false }, @@ -2346,6 +2346,15 @@ "* Spatial discretization of OpenMOC's mesh\n", "* Constant-in-angle multi-group cross sections" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index c7da78a6ed..cc2bd3b11b 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -164,7 +164,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -225,7 +236,20 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", @@ -385,7 +409,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDEzOjAz\nOjU5LTA0OjAwMu4u/QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QxMzowMzo1OS0wNDow\nMEOzlkEAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA4VDE0OjIx\nOjU1LTA0OjAwjn8AkAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQxNDoyMTo1NS0wNDow\nMP8iuCwAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -574,8 +598,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 13:03:59\n", + " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", + " Date/Time: 2015-10-08 14:21:55\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -588,11 +612,11 @@ " Reading materials XML file...\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", " Loading ACE cross section table: 92238.71c\n", " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 40090.71c\n", " Initializing source particles...\n", "\n", @@ -602,39 +626,35 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 0.59998 \n", - " 2/1 0.65473 \n", - " 3/1 0.67452 \n", - " 4/1 0.66458 \n", - " 5/1 0.70093 \n", - " 6/1 0.70726 \n", - " 7/1 0.65977 0.68351 +/- 0.02375\n", - " 8/1 0.68457 0.68387 +/- 0.01372\n", - " 9/1 0.70024 0.68796 +/- 0.01053\n", - " 10/1 0.64895 0.68016 +/- 0.01128\n", - " 11/1 0.68744 0.68137 +/- 0.00929\n", - " 12/1 0.68037 0.68123 +/- 0.00786\n", - " 13/1 0.64865 0.67715 +/- 0.00793\n", - " 14/1 0.71415 0.68127 +/- 0.00811\n", - " 15/1 0.65717 0.67886 +/- 0.00764\n", - " 16/1 0.71598 0.68223 +/- 0.00769\n", - " 17/1 0.67285 0.68145 +/- 0.00707\n", - " 18/1 0.69329 0.68236 +/- 0.00656\n", - " 19/1 0.65696 0.68055 +/- 0.00634\n", - " 20/1 0.65500 0.67884 +/- 0.00615\n", - " Triggers unsatisfied, max unc./thresh. is 1.21110 for absorption in tally 10002\n", - " The estimated number of batches is 28\n", + " 1/1 0.54958 \n", + " 2/1 0.67628 \n", + " 3/1 0.70618 \n", + " 4/1 0.66601 \n", + " 5/1 0.70876 \n", + " 6/1 0.69708 \n", + " 7/1 0.68623 0.69166 +/- 0.00543\n", + " 8/1 0.69159 0.69163 +/- 0.00313\n", + " 9/1 0.69908 0.69349 +/- 0.00289\n", + " 10/1 0.63865 0.68253 +/- 0.01120\n", + " 11/1 0.65439 0.67784 +/- 0.01027\n", + " 12/1 0.68518 0.67889 +/- 0.00875\n", + " 13/1 0.69507 0.68091 +/- 0.00784\n", + " 14/1 0.70129 0.68317 +/- 0.00728\n", + " 15/1 0.71336 0.68619 +/- 0.00717\n", + " 16/1 0.68725 0.68629 +/- 0.00649\n", + " 17/1 0.72579 0.68958 +/- 0.00678\n", + " 18/1 0.67149 0.68819 +/- 0.00639\n", + " 19/1 0.67771 0.68744 +/- 0.00596\n", + " 20/1 0.68035 0.68697 +/- 0.00557\n", + " Triggers unsatisfied, max unc./thresh. is 1.09851 for absorption in tally 10002\n", + " The estimated number of batches is 24\n", " Creating state point statepoint.020.h5...\n", - " 21/1 0.67090 0.67835 +/- 0.00577\n", - " 22/1 0.69025 0.67905 +/- 0.00546\n", - " 23/1 0.66113 0.67805 +/- 0.00525\n", - " 24/1 0.67934 0.67812 +/- 0.00496\n", - " 25/1 0.67203 0.67781 +/- 0.00472\n", - " 26/1 0.66928 0.67741 +/- 0.00451\n", - " 27/1 0.70271 0.67856 +/- 0.00445\n", - " 28/1 0.70233 0.67959 +/- 0.00437\n", - " Triggers satisfied for batch 28\n", - " Creating state point statepoint.028.h5...\n", + " 21/1 0.68105 0.68660 +/- 0.00522\n", + " 22/1 0.67168 0.68572 +/- 0.00498\n", + " 23/1 0.67520 0.68514 +/- 0.00473\n", + " 24/1 0.67940 0.68483 +/- 0.00449\n", + " Triggers satisfied for batch 24\n", + " Creating state point statepoint.024.h5...\n", "\n", " ===========================================================================\n", " ======================> SIMULATION FINISHED <======================\n", @@ -643,28 +663,28 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9400E-01 seconds\n", - " Reading cross sections = 8.8000E-02 seconds\n", - " Total time in simulation = 1.0755E+01 seconds\n", - " Time in transport only = 1.0746E+01 seconds\n", - " Time in inactive batches = 1.2680E+00 seconds\n", - " Time in active batches = 9.4870E+00 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", + " Total time for initialization = 4.3800E-01 seconds\n", + " Reading cross sections = 9.7000E-02 seconds\n", + " Total time in simulation = 9.7830E+00 seconds\n", + " Time in transport only = 9.7730E+00 seconds\n", + " Time in inactive batches = 1.4030E+00 seconds\n", + " Time in active batches = 8.3800E+00 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.1159E+01 seconds\n", - " Calculation Rate (inactive) = 9858.04 neutrons/second\n", - " Calculation Rate (active) = 3952.78 neutrons/second\n", + " Total time elapsed = 1.0230E+01 seconds\n", + " Calculation Rate (inactive) = 8909.48 neutrons/second\n", + " Calculation Rate (active) = 4474.94 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 0.68196 +/- 0.00427\n", - " k-effective (Track-length) = 0.67959 +/- 0.00437\n", - " k-effective (Absorption) = 0.67957 +/- 0.00402\n", - " Combined k-effective = 0.67943 +/- 0.00295\n", - " Leakage Fraction = 0.34370 +/- 0.00201\n", + " k-effective (Collision) = 0.68264 +/- 0.00405\n", + " k-effective (Track-length) = 0.68483 +/- 0.00449\n", + " k-effective (Absorption) = 0.68225 +/- 0.00336\n", + " Combined k-effective = 0.68275 +/- 0.00346\n", + " Leakage Fraction = 0.34345 +/- 0.00167\n", "\n" ] }, @@ -781,13 +801,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.1127471 ]]\n", + "[[[ 0.18257268]]\n", "\n", - " [[ 0.06599162]]\n", + " [[ 0.07111957]]\n", "\n", - " [[ 0.25310075]]\n", + " [[ 0.40880276]]\n", "\n", - " [[ 0.10150973]]]\n" + " [[ 0.16407535]]]\n" ] } ], @@ -840,8 +860,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000224\n", - " 0.000025\n", + " 0.000202\n", + " 0.000037\n", " \n", " \n", " 1\n", @@ -850,8 +870,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.000546\n", - " 0.000062\n", + " 0.000492\n", + " 0.000090\n", " \n", " \n", " 2\n", @@ -860,7 +880,7 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000071\n", + " 0.000076\n", " 0.000004\n", " \n", " \n", @@ -870,7 +890,7 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000187\n", + " 0.000204\n", " 0.000010\n", " \n", " \n", @@ -880,8 +900,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000392\n", - " 0.000045\n", + " 0.000375\n", + " 0.000039\n", " \n", " \n", " 5\n", @@ -890,8 +910,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.000955\n", - " 0.000110\n", + " 0.000914\n", + " 0.000094\n", " \n", " \n", " 6\n", @@ -900,8 +920,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000096\n", - " 0.000005\n", + " 0.000107\n", + " 0.000013\n", " \n", " \n", " 7\n", @@ -910,8 +930,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000252\n", - " 0.000014\n", + " 0.000278\n", + " 0.000032\n", " \n", " \n", " 8\n", @@ -920,8 +940,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000551\n", - " 0.000053\n", + " 0.000564\n", + " 0.000056\n", " \n", " \n", " 9\n", @@ -930,8 +950,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001343\n", - " 0.000130\n", + " 0.001374\n", + " 0.000137\n", " \n", " \n", " 10\n", @@ -940,8 +960,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000131\n", - " 0.000008\n", + " 0.000149\n", + " 0.000007\n", " \n", " \n", " 11\n", @@ -950,8 +970,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000343\n", - " 0.000019\n", + " 0.000388\n", + " 0.000018\n", " \n", " \n", " 12\n", @@ -960,8 +980,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000688\n", - " 0.000063\n", + " 0.000669\n", + " 0.000044\n", " \n", " \n", " 13\n", @@ -970,8 +990,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001676\n", - " 0.000153\n", + " 0.001631\n", + " 0.000108\n", " \n", " \n", " 14\n", @@ -980,8 +1000,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000151\n", - " 0.000007\n", + " 0.000165\n", + " 0.000011\n", " \n", " \n", " 15\n", @@ -990,8 +1010,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000395\n", - " 0.000019\n", + " 0.000433\n", + " 0.000029\n", " \n", " \n", " 16\n", @@ -1000,8 +1020,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " fission\n", - " 0.000785\n", - " 0.000065\n", + " 0.000932\n", + " 0.000069\n", " \n", " \n", " 17\n", @@ -1010,8 +1030,8 @@ " 1\n", " (0.0e+00 - 6.3e-07)\n", " nu-fission\n", - " 0.001914\n", - " 0.000158\n", + " 0.002270\n", + " 0.000168\n", " \n", " \n", " 18\n", @@ -1020,8 +1040,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " fission\n", - " 0.000187\n", - " 0.000008\n", + " 0.000183\n", + " 0.000011\n", " \n", " \n", " 19\n", @@ -1030,8 +1050,8 @@ " 1\n", " (6.3e-07 - 2.0e+01)\n", " nu-fission\n", - " 0.000487\n", - " 0.000019\n", + " 0.000477\n", + " 0.000028\n", " \n", " \n", "\n", @@ -1040,26 +1060,26 @@ "text/plain": [ " mesh 1 energy [MeV] score mean std. dev.\n", " x y z \n", - "0 1 1 1 (0.0e+00 - 6.3e-07) fission 0.000224 0.000025\n", - "1 1 1 1 (0.0e+00 - 6.3e-07) nu-fission 0.000546 0.000062\n", - "2 1 1 1 (6.3e-07 - 2.0e+01) fission 0.000071 0.000004\n", - "3 1 1 1 (6.3e-07 - 2.0e+01) nu-fission 0.000187 0.000010\n", - "4 1 2 1 (0.0e+00 - 6.3e-07) fission 0.000392 0.000045\n", - "5 1 2 1 (0.0e+00 - 6.3e-07) nu-fission 0.000955 0.000110\n", - "6 1 2 1 (6.3e-07 - 2.0e+01) fission 0.000096 0.000005\n", - "7 1 2 1 (6.3e-07 - 2.0e+01) nu-fission 0.000252 0.000014\n", - "8 1 3 1 (0.0e+00 - 6.3e-07) fission 0.000551 0.000053\n", - "9 1 3 1 (0.0e+00 - 6.3e-07) nu-fission 0.001343 0.000130\n", - "10 1 3 1 (6.3e-07 - 2.0e+01) fission 0.000131 0.000008\n", - "11 1 3 1 (6.3e-07 - 2.0e+01) nu-fission 0.000343 0.000019\n", - "12 1 4 1 (0.0e+00 - 6.3e-07) fission 0.000688 0.000063\n", - "13 1 4 1 (0.0e+00 - 6.3e-07) nu-fission 0.001676 0.000153\n", - "14 1 4 1 (6.3e-07 - 2.0e+01) fission 0.000151 0.000007\n", - "15 1 4 1 (6.3e-07 - 2.0e+01) nu-fission 0.000395 0.000019\n", - "16 1 5 1 (0.0e+00 - 6.3e-07) fission 0.000785 0.000065\n", - "17 1 5 1 (0.0e+00 - 6.3e-07) nu-fission 0.001914 0.000158\n", - "18 1 5 1 (6.3e-07 - 2.0e+01) fission 0.000187 0.000008\n", - "19 1 5 1 (6.3e-07 - 2.0e+01) nu-fission 0.000487 0.000019" + "0 1 1 1 (0.0e+00 - 6.3e-07) fission 0.000202 0.000037\n", + "1 1 1 1 (0.0e+00 - 6.3e-07) nu-fission 0.000492 0.000090\n", + "2 1 1 1 (6.3e-07 - 2.0e+01) fission 0.000076 0.000004\n", + "3 1 1 1 (6.3e-07 - 2.0e+01) nu-fission 0.000204 0.000010\n", + "4 1 2 1 (0.0e+00 - 6.3e-07) fission 0.000375 0.000039\n", + "5 1 2 1 (0.0e+00 - 6.3e-07) nu-fission 0.000914 0.000094\n", + "6 1 2 1 (6.3e-07 - 2.0e+01) fission 0.000107 0.000013\n", + "7 1 2 1 (6.3e-07 - 2.0e+01) nu-fission 0.000278 0.000032\n", + "8 1 3 1 (0.0e+00 - 6.3e-07) fission 0.000564 0.000056\n", + "9 1 3 1 (0.0e+00 - 6.3e-07) nu-fission 0.001374 0.000137\n", + "10 1 3 1 (6.3e-07 - 2.0e+01) fission 0.000149 0.000007\n", + "11 1 3 1 (6.3e-07 - 2.0e+01) nu-fission 0.000388 0.000018\n", + "12 1 4 1 (0.0e+00 - 6.3e-07) fission 0.000669 0.000044\n", + "13 1 4 1 (0.0e+00 - 6.3e-07) nu-fission 0.001631 0.000108\n", + "14 1 4 1 (6.3e-07 - 2.0e+01) fission 0.000165 0.000011\n", + "15 1 4 1 (6.3e-07 - 2.0e+01) nu-fission 0.000433 0.000029\n", + "16 1 5 1 (0.0e+00 - 6.3e-07) fission 0.000932 0.000069\n", + "17 1 5 1 (0.0e+00 - 6.3e-07) nu-fission 0.002270 0.000168\n", + "18 1 5 1 (6.3e-07 - 2.0e+01) fission 0.000183 0.000011\n", + "19 1 5 1 (6.3e-07 - 2.0e+01) nu-fission 0.000477 0.000028" ] }, "execution_count": 25, @@ -1084,9 +1104,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEaCAYAAADtxAsqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xu4nVV94PHvIQnqCPUYoUIuurlpiRdO7EwMo4XjYDHE\nllitUtuhHJwZGC21DjgCYptEx4JabZ7IJGJLITMdoNjBy4xouJQttGpiyQWqBEjK0VxqEAktRhQC\np3/81t77Pfvsc953n8u+nPP9PM9mv++719p7bfKed+21futdCyRJkiRJkiRJkiRJkiRJkiRJHeJZ\nYCuwDbgXOHWS378f+H85aU6fgs9thUFgboPjP2lxOTTDzW53ATSj/BRYnLbPBK4kLvSt9CbgSeBb\n48zfk56HJqc4hY32ea0ux1gOA55rdyE0tQ5rdwE0Y70IeDxt9wCfAu4H7gPelY6vAf4wbb8F+EZK\nez3wOeA7wIPAWxu8/1zgS8B2ooJ4DVACLgT+G9HieWNdnqOB24F/AP6M2q/7UvqcDamMC0cpbz/D\nWzpXA+el7UHgEyn9JuCEzGf+NbA5Pf59Ov4S4LZMWSqVVSOfSenuAI5K731v5vWT6vYr3g98l/h/\ndGM6dgRwXSrnduA30vF3p2P3A1dl3uMnwJ8QrcdTgf+Yvt9W4t/Ia4ykcTtEXEweAJ6g1up4B3GB\n7AF+Efg+8FLgBcTF8E3ADuC4lP564Na0fSKwG3gewy/an6VW4bwpfS7ASuDiUcp3NXBp2n4L8au5\nUmk8CywZo7zHMLLS+Czwu2n7EeDytH1uJt0NwBvS9suA76XttcBH0vbyTFnqPUdc0Enf97Np+2+A\nU9L2HwO/1yDvXmBO2v6F9PwJohKq6AXmpe/4EmAWcCewIvP5v5m2Twa+ktIArEvfVZLG5cnM9lKi\nQgD4U2Ag89r/An49bZ9KVDbZi951dem/QVwg+6ldjLcQF/uKHwBHEpXGJaOUbyvw8sz+j6lVGv+Y\nOf6ZUcp7OmNXGpXyzAEeS9uPps+tPHYDL0zb2fJXylLvELVf88dRqxx/m2ipHQbsBF7cIO/XgC8A\nv5M+E+DvqbWCKlYQFXXFe4BPp+1nqLWCLiIqosp32QH8UYPPVRczpqF2+TbRlXI00S+f7X7podZX\n/1rgR8D8nPdr1Jc+VpfOaEbLczAn3RDDL+AQLaXRVL5fD/B64OkmyjKa7P+3W4gK8m+IiuBAg/Rv\nBU4jKrwriC68Rp871r/PzxgeV9kAfLjJcquL2N+odvkl4vx7DLgHOCftHw38CtG//3KiK2kxcBa1\n7qEe4J3p+QTgeCLmkHUP8QsaogXyI6Kl8yTR4mjk76jFJ86k8a/zyntny3taKu8PgEXA4US3zn+o\ny3dO5vmbafs2IrZQUelSuptoLUB899HKchjx/4KU/p60/TNgI7CeaJnV6yG6w8rAZUSM6QgippNt\n1fWm73Y6te6p3yJad/XuJLqqjk77c9NnSNK4VGIalWG3Z2Ve+yS1wHLlIng78Gtp+3XptecRF8H1\n1ALhy1Oa04k+dYiL7BeJYO43gVen4yelY1upxRIqjiaCyfcDnwf2EV1JpfTZWY3KCxETeIi4YP81\nw7unrkqfvYmo6CAuxDel498l4gAQF9yNRBfe51P+Rt1TTxJdRfensr8k89pSorurUYtlNlHBVILb\nH0rHX0h0Rd1P/Bu9LR3/rUzaKzPv8y917/su4v/tdqKFswRJarPrgLdPwfseTi2IeyoRF5kso130\np9IHgdUt/kxNc8Y0pJqXATcTXT5PA/9lEt+71fdTfJEIjNd3kUmSJEnqJINEd899RBzhWuJekq8B\n/0zEX3pT2qVEHOUAERc4PfM+5xP3YvwLsAu4IPNaP7CHCP7vJ2IqA5P/VSRJU+0RoiI4mrjZbT8R\n8ziFCM7fSdyTMJ8YEbYs5Xtz2q8EqJdTu0nxNGIob+Umx37ivodVRGzlrPT6i6bkG0mSpswj1O68\nhhgZ9T8z+xcRcYQPETf7ZX2d2iiqel+kNuS2n5ifKzsUfj+OQFIH8T4Nqbj9me2n6vZ/Rtzn8HJi\nCO6BzOMNxDQjEK2HbxN3eB8gWh7ZYbI/ZviNij9N7yt1BEdPSeOXvf+hMjpqN/C/GR6rqHge8H+J\nSf2+TMxn9UXGd+e61Ba2NKTJUbnw/yUxLceZRFzi+US303ziPpDDiRjHc0Sr48xWF1SaCCsNafyG\n6raHiNFPK4j5lx4lpha5hKhUniTiFzcT08K/m2hxjPaeUldaRsxW+TC1aaPrrU2vb6c2EqRI3ksY\nPuVziegrrkw1sa5BHklSh5pFTKtcIubg2UbMmZ+1nNraBq8ngnxF8i4kRpVkp1coEXPbSJI6UF73\n1BLiwj9IjB+/idriKxVnE9MhQ0zE1kuMFMnL+xlqk6RJkrpAXqUxnxgNUrGHkesajJZm3hh5V6T9\n+plDobaQTJmRy3FKktoob8ht0aBcM0MGX0AECX+1Qf59RLfVAWIq7C8Br2L4im+SpDbJqzT2Ehfx\nioVEC2GsNAtSmjmj5D2BiF1sz6S/l+jOepTaCmZbiLl5TqJuiuoTTjhhaNeuXTlFlyRNwHagr9lM\ns4kLd4kYX54XCF9KLRBeJC8MD4QfRW09g+OJSqa3QZ4hTb6VK1e2uwhSUzxnpw6j9DTltTQOEXPq\nbEwX82uBB4AL0+vXpApjORH0PkjM4jlW3hEVQGb7NOCjROD8ufQ5T+SUUZLUIkWmEflaemRdU7d/\nURN56x2f2b4lPdQGg4OD7S6C1BTP2dbzjnBV9fU13X0ptdURR3jOtpqVhqo+8IEPtLsIUlOOOspz\nttWsNCRJhTk1uqrK5TL9/f3tLoY0pnI5HgCrV5eJSYShvz8emlpWGpK6SrZyGByEVavaV5aZyO4p\nVdnKULcplfrbXYQZx0pDUtfyd07rWWmoqlzpKJa6RrndBZhxrDQkSYV164L2aWoUSdJU6OnpgQZ1\nhC0NSV3LHtXWs9JQlTENdZvrry+3uwgzjpWGpK71wx+2uwQzjzENSV1l+B3hsHJlbHtH+OQaLaZh\npSGpa5VKcVe4Jt9EAuHLgB3Aw8Clo6RZm17fDixuIu8lxGJLczPHLk/pdwBnFiifJokxDXWDcjmm\nDlm1Cr7//XJ129O3NfIqjVnA1cTFfxHwbhov93oisZb3BcD6gnkXAr8KfD9zbBFwTnpeBqwrUEZJ\nUovkdU+dCqwkLuAAl6XnqzJpPgfcBfxV2t9BTDt5XE7eLwAfA74M/DLwONHKeA74RErzdWAVtXXH\nK+yekkRfH2zb1u5STE/j7Z6aD+zO7O9Jx4qkmTdG3hVp/76695qXjo/1eZKkNsmrNIr+nG8moP4C\n4MNEK6RIfpsULWJMQ93m8MPL7S7CjJO3nsZeIvZQsZDhLYFGaRakNHNGyXsCUCKC5pX09wKvH+W9\n9jYq2MDAAKVSCYDe3l76+vqqU3tXLn7uN7df0Snlcd/9Rvtr1pTZti2mRf/Od2BgIF4fGOinv7/9\n5evW/cr2YM5wtLwWwmzgQeAMYB+wmQhoP5BJsxy4KD0vBdak5yJ5AR6hFtNYBNwALCG6pe4gguz1\nrQ1jGpKMaUyh0WIaeS2NQ0SFsJEYDXUtcdG/ML1+DXArUWHsBA4C5+fkrZe9+n8PuDk9HwLeh91T\nkjKyN/dt315buc+b+1rDm/tUVXaNcHWZ+fPL7N3b3+5iTEvjbWlIUkfJtjT27bOl0Wq2NCR1rWOO\ncdLCqWJLQ9K0kG1p7N9vS6PVnKJDVdmhd1J3KLe7ADOO3VOqMhCubjN3bpnHH+9vdzGmJadGlzQt\nuJ5Ga1hpSJp2vLlv6hgIVy67p9QNht/cV2bVqn7Alkar2NJQlZWGOlX61dvApdRWUhjJ68T42T0l\nadqJCQrbXYrpaSLLvUpSR6rco6HWsdJQlfdpqPuU212AGcdKQ5JUmDENSdIIxjQkSRNWpNJYBuwA\nHibGtzWyNr2+HVhcIO/HUtptwJ3UlngtAU8BW9NjXYHyaZIY01C3qSz1qtbJqzRmAVcTF/9FxHKt\nJ9elWU4syXoScAGwvkDeTwKnAH3Al4CVmffbSVQ8i4mV+ySpoQ0b2l2CmSev0lhCXMQHgWeAm4AV\ndWnOBir/dJuAXuCYnLxPZvIfATw2nsJrcnljn7pPf7sLMOPkVRrzgd2Z/T3pWJE083Lyfhz4AXAe\ncFXm+HFE11QZeGNO+SRJLZRXaRQdojSeUVhXAC8Drgf+NB3bR8Q3FgMXAzcAR47jvTUOxjTUfcrt\nLsCMkzdh4V5qQWrS9p6cNAtSmjkF8kJUDLem7afTA2ALsIuIlWypzzQwMECpVAKgt7eXvr6+avdK\n5eLnfnP7FZ1SHvfdd7+1f//lcpnBwUHGktdCmA08CJxBtAI2EwHtBzJplgMXpeelwJr0PFbek4gR\nVQC/T8Q/zgWOAg4AzwLHA3cDrwaeqCuX92lIYtUqpxKZKuOdGv0QUSFsJEZDXUtc9C9Mr19DtBKW\nE0Hvg8D5OXkBrgReSVQOu4D3puOnAR8lAufPpc+przAkCbDCaAfvCFdV2anR1WU8Z6eOd4RLkibM\nloYkaQRbGpKkCbPSUFV26J3UDZx7qvWsNCR1Leeeaj1jGpK6Vk8PeCmYGsY0JEkTZqWhKmMa6j7l\ndhdgxrHSkCQVZqWhKu+sVbdZubK/3UWYcQyES5JGMBCuXMY01G08Z1vPSkOSVJjdU5KkEeyekiRN\nWJFKYxmwg1hp79JR0qxNr28n1vfOy/uxlHYbcCfDl4W9PKXfAZxZoHyaJPYPq9s491Tr5VUas4Cr\niYv/ImK51pPr0iwHTiSWcL0AWF8g7yeBU4A+4EvAynR8EXBOel4GrCtQRkkzlHNPtV7eBXkJsYzr\nILEE603Airo0ZwOVf7pNQC9wTE7eJzP5jwAeS9srgBtT+sGUf0nhb6MJ8T4NdZ/+dhdgxslbI3w+\nsDuzvwd4fYE084F5OXk/DpwLPEWtYpgHfLvBe0mSOkBeS6PoEKXxjMK6AngZcB2wZhLKoAkypqHu\nU253AWacvJbGXoYHqRcSv/7HSrMgpZlTIC/ADcCtY7zX3kYFGxgYoFQqAdDb20tfX1+1e6Vy8XO/\nuf2KTimP++6739q//3K5zODgIGPJayHMBh4EzgD2AZuJgPYDmTTLgYvS81Ki1bA0J+9JxAgpgN8n\nuqfOJQLgN6T9+cAdRJC9vrXhfRqSWLUqHpp8o92nkdfSOERUCBuJ0VDXEhf9C9Pr1xCthOVE0Pog\ncH5OXoArgVcCzwK7gPem498Dbk7Ph4D3YfeUpFFYYbSed4SrqlwuV5usUjfwnJ063hEuSZowWxqS\npBFsaUiSJsxKQ1XZoXdSN3Duqdaz0pDUtZx7qvWMaUjqWj094KVgahjTkCRNmJWGqoxpqPuU212A\nGcdKQ5JUmJWGqryzVt1m5cr+dhdhxjEQLkkawUC4chnTULfxnG09Kw1JUmF2T0mSRrB7SpI0YUUq\njWXADmKlvUtHSbM2vb4dWFwg76eIBZm2A7cAL0rHS8BTwNb0WFegfJok9g+r2zj3VOvlVRqzgKuJ\ni/8iYrnWk+vSLCeWZD0JuABYXyDvbcCrgFOAh4DLM++3k6h4FhMr90lSQ8491Xp5lcYS4iI+CDwD\n3ASsqEtzNlD5p9sE9ALH5OS9HXguk2fBOMuvSeR9Guo+/e0uwIyTV2nMB3Zn9vekY0XSzCuQF+A9\nxDrjFccRXVNl4I055ZMktVBepVF0iNJ4R2FdATwN3JD29wELia6pi9PxI8f53mqSMQ11n3K7CzDj\nzM55fS9xEa9YSLQYxkqzIKWZk5N3gIiHnJE59nR6AGwBdhGxki31BRsYGKBUKgHQ29tLX19ftXul\ncvFzv7n9ik4pj/vuu9/av/9yuczg4CBjyWshzAYeJC7s+4DNRED7gUya5cBF6XkpsCY9j5V3GfBp\n4HTgscx7HQUcAJ4FjgfuBl4NPFFXLu/TkMSqVfHQ5BvtPo0i3UpnERXBLOBa4ErgwvTaNem5Mkrq\nIHA+tZZBo7wQQ3APBx5P+98iRkq9A1hNBM6fA/4I+GqDMllpSNIUmkil0YmsNKZAuVyuNlmlbuA5\nO3W8I1ySNGG2NCRJI9jSkCRNmJWGqrJD76Ru4NxTrWelIalrOfdU6xnTkNS1enrAS8HUMKYhSZow\nKw1VGdNQ9ym3uwAzjpWGJKkwKw1VeWetus3Klf3tLsKMYyBckjSCgXDlMqahbuM523pWGpKkwuye\nkiSNYPeUJGnCilQay4AdxMJJl46SZm16fTuxvnde3k8RK/htB24BXpR57fKUfgdwZoHyaZLYP6xu\n49xTrZdXacyitirfImK51pPr0iwHTiTW8r4AWF8g723Aq4BTgIeIioKU7pz0vAxYV6CMkmYo555q\nvbwL8hJgJzBILMF6E7CiLs3ZQOWfbhPQCxyTk/d2YjnXSp4FaXsFcGNKP5jyL2nmC2n8vE9D3ae/\n3QWYcfIqjfnA7sz+nnSsSJp5BfICvAe4NW3PS+ny8kiS2iCv0ig6RGm8o7CuAJ4GbpiEMmiCjGmo\n+5TbXYAZZ3bO63uBhZn9hQxvCTRKsyClmZOTd4CIh5yR8157GxVsYGCAUqkEQG9vL319fdXulcrF\nz/3m9is6pTzuu+9+a//+y+Uyg4ODjCWvhTAbeJC4sO8DNhMB7QcyaZYDF6XnpcCa9DxW3mXAp4HT\ngccy77WIaHUsIbql7iCC7PWtDe/TkMSqVfHQ5BvtPo0i3UpnERXBLOBa4ErgwvTaNem5MkrqIHA+\nsGWMvBBDag8HHk/73wLel7Y/TMQ5DgF/AGxsUCYrDUmaQhOpNDqRlcYUKJfL1Sar1A08Z6eOd4RL\nkibMloYkaQRbGpKkCbPSUNWaNeV2F0FqinNPtZ6Vhqq2bWt3CaTmOPdU61lpqKpU6m93EaQm9be7\nADNO3h3hmubK5XgArF5dO97fHw9JynL0lKqWLSvz9a/3t7sYUmE9PWWGhvrbXYxpydFTyrVzZ7tL\nIKnTWWkoo7/dBdAMNncu9PQ094D+pvPMndvub9rdjGnMcNmYxq5dtcnfjGmo1Q4cgFb0Ovd0a6d8\nh7CloYxyuwsgNSU7rbdaw0pDklSYlYYy+ttdAKkpznDbelYakqTCilQay4AdxMJJl46SZm16fTuw\nuEDedwLfBZ4FXpc5XgKeAramx7oC5dOkKbe7AFJTjGm0Xt7oqVnEqnxvJtbq/g7wFUYu93oicBLw\nemA9sdzrWHnvB36D2sp/WTsZXvFoCm3bVhs9BbXt3l5HT0kaKa/SWEJcxAfT/k3ACoZXGmcDlWnD\nNgG9wDHAcWPk3TGxYmuy9PXBE0/E9je+0V+tKPr62lYkqTBjGq2XV2nMB3Zn9vcQrYm8NPOBeQXy\nNnIc0TX1z8BHgL8tkEdN6Bl1oPo/sXr1scDweagqnLpFUl5Mo+hVYrJul9kHLCS6py4GbgCOnKT3\nVjI0NNTwATtGfc0KQ53ImEbr5bU09hIX8YqFRIthrDQLUpo5BfLWezo9ALYAu4hYyZb6hAMDA5RK\nJQB6e3vp6+urNlUrJ5L7ze1XdEp53J9Z+5Uh31P9eVCmXG7/9+20/cr24OAgY8lrIcwGHgTOIFoB\nm4F3MzIQflF6XgqsSc9F8t4FfBC4N+0fBRwgRlUdD9wNvBp4oq5cznI7BXp6WjONg9RIq84/z/Ni\nRpvlNq+lcYioEDYSo6GuJS76F6bXrwFuJSqMncBB4PycvBAjp9YSlcRXiRjGWcDpwGrgGeC59Dn1\nFYamyMqV7S6BpE7XrVN32dKYAuVyOdOEl1prPC2A8ZyztjSKcT0NSdKE2dKQ1BGMaXQWWxqSpAmz\n0lBVduid1A08Z1vPSkNV11/f7hJI6nTGNFRlX6/ayZhGZzGmIUmaMCsNZZTbXQCpKcY0Ws9KQ5JU\nmDENVdnXq3YyptFZjGkol3NPScpjpaGq/v5yu4sgNcWYRutZaUiSCjOmIakjGNPoLMY0JEkTVqTS\nWAbsAB4GLh0lzdr0+nZife+8vO8Evkus0Pe6uve6PKXfAZxZoHyaJPYPq9t4zrZeXqUxC7iauPgv\nIpZrPbkuzXLgRGIt7wuA9QXy3k+s3nd33XstAs5Jz8uAdQXKqEni3FOS8uRdkJcQy7gOEkuw3gSs\nqEtzNrAhbW8CeoFjcvLuAB5q8HkrgBtT+sGUf0mxr6KJ2rChv91FkJriSpOtl1dpzAd2Z/b3pGNF\n0swrkLfevJSumTySpBbJqzSKjjGYylFYjnNomXK7CyA1xZhG683OeX0vsDCzv5DhLYFGaRakNHMK\n5M37vAXp2AgDAwOUSiUAent76evrqzZVKyeS+83tV3RKedyfWfvQms+DMuVy+79vp+1XtgcHBxlL\nXgthNvAgcAawD9hMBLQfyKRZDlyUnpcCa9Jzkbx3AR8E7k37i4AbiDjGfOAOIshe39rwPo0p4Ph1\ntZP3aXSW0e7TyGtpHCIqhI3EaKhriYv+hen1a4BbiQpjJ3AQOD8nL8TIqbXAUcBXga3AWcD3gJvT\n8yHgfdg91TLOPSUpj3eEq6pcLmea8FJrjacFMJ5z1pZGMd4RLkmaMFsakjqCMY3OYktDkjRhVhqq\nyg69k7qB52zrWWmoyrmnJOUxpqEq+3rVTsY0OosxDUnShFlpKKPc7gJITTGm0XpWGpKkwoxpqMq+\nXrVVTwsvR57oucY795S61Ny5cOBA8/ma/bt98Yvh8ceb/xypXg9DrQuET/3HTFt2T01TBw7Ej6lm\nHnfdVW46z3gqJmmyGNNoPSsNSVJhxjSmKce8q9t4znYW79OQJE1YkUpjGbADeBi4dJQ0a9Pr24HF\nBfLOBW4HHgJuA3rT8RLwFLEo01ZgXYHyaZLYP6xu4znbenmVxizgauLiv4hYrvXkujTLiSVZTwIu\nANYXyHsZUWm8Argz7VfsJCqexcTKfZKkDpFXaSwhLuKDwDPATcCKujRnAxvS9iai1XBMTt5sng3A\n28ZZfk0iV+1Tt/Gcbb28SmM+sDuzvycdK5Jm3hh5XwrsT9v7037FcUTXVBl4Y075JEktlFdpFB1j\nUGQUVs8o7zeUOb4PWEh0TV0M3AAcWbAMmiD7h9VtPGdbL++O8L3ERbxiIdFiGCvNgpRmToPje9P2\nfqIL64fAscCj6fjT6QGwBdhFxEq21BdsYGCAUqkEQG9vL319fdWmauVEmun70Gx6Oqr87s+s/WbP\n1/HuQ5lyuf3ft9P2K9uDg4OMJa+FMBt4EDiDaAVsJgLaD2TSLAcuSs9LgTXpeay8nwR+DHyCCIL3\npuejgAPAs8DxwN3Aq4En6srlfRo5HPOubuM521nGO/fUIaJC2EiMhrqWuOhfmF6/BriVqDB2AgeB\n83PyAlwF3Az8JyJQ/q50/DTgo0Tg/Ln0OfUVhiSpTbwjfJoaz6+pcrmcacJP3edIjXjOdhbvCJck\nTZgtjWnK/mF1m1Ytp+F0/sW4noakjjaeHx/+aGk9u6dUlR16J3WHcrsLMONYaUiSCjOmMU0Z09BM\n4Pk3dYxpzDBD9LTkJ8FQ5r+Spj+7p6apHppc7HtoiPJddzWdp8cKQ2103nnldhdhxrHSkNS1Bgba\nXYKZx5jGNGVMQ9JEeEe4JGnCrDRU5X0a6jaes61npSFJKswht9NY83P59Df9GS9+cdNZpElTLvfj\nMuGtZSBcVQa11W08Z6fORALhy4AdwMPApaOkWZte306s752Xdy5wO/AQcBuxcl/F5Sn9DuDMAuXT\npCm3uwBSk8rtLsCMk1dpzAKuJi7+i4jlWk+uS7McOJFYy/sCYH2BvJcRlcYrgDvTPindOel5GbCu\nQBk1aba1uwBSkzxnWy3vgryEWMZ1kFiC9SZgRV2as4ENaXsT0Wo4JidvNs8G4G1pewVwY0o/mPIv\naeYLaSJcWVfdxnO21fIqjfnA7sz+nnSsSJp5Y+R9KbA/be9P+6Q8e3I+T9IM09PT0/ABq0d9radV\nqzrNMHmVRtEQU5F/nZ5R3m8o53MMc00y/wDVbYaGhho+zjvvvFFfc7DM1MgbcrsXWJjZX8jwlkCj\nNAtSmjkNju9N2/uJLqwfAscCj47xXnsZaXtPT88pOWXXJLPiUCfasGFDfiKNx/bxZJoN7AJKwOFE\n1KlRIPzWtL0U+HaBvJ+kNprqMuCqtL0opTscOC7l90olSV3kLOBBIih9eTp2YXpUXJ1e3w68Licv\nxJDbO2g85PbDKf0O4C2T9SUkSZIkSRP0fuB7wOPAh8aR/+8mtzjShPwS0W19L3A84zs/VwNnTGah\npOnkAWL4sjQdXAZc0e5CSNPV54CfA/cBHwA+m46/E7if+MX2jXTsVcQNmVuJeNQJ6fhP0nMP8KmU\n7z7gXel4PzF/wxeICuovp+KLaNooEefJ54F/ADYCzyfOoV9OaY4CHmmQdznwT8SIzDvTscr5eSxw\nN3H+3g+8gbiN4Hpq5+wfpLTXA+9I22cAW9Lr1xIDbyBuKF5FtGjuA17Z7BeVutUjxGCD84h5wSD+\nCI5N27+QntcCv522ZxN/yABPpud3EAMVeoBfBL5PDJXuJ27FnZde+ybxBys1UiJmeXht2v8r4HeA\nu6gNnBmt0gBYCVyc2a+cn5cQA2cgzsMjiErotkzayrl+HfB24hz/ATH1EcSMFJWK5RHg99L2e4E/\ny/tiM5HzOk1fPZkHRD/wBuA/U7s/51vEH92HiD/sn9W9xxuBG4gbLB8lWij/Lu1vBval7W0pvzSa\nR4gfLhC/5EtN5m809H4zcD5RqbyWaIHsIuIea4nRl09m0vcQrYdHiBGaEH8Tp2XS3JKet4yjjDOC\nlcb0lr0l9r3AR4ibJ+8lWiI3Ar8OPEXca/OmBvnr/1gr7/nzzLFncW0Wja3R+XKImNgUaq1ciFbB\nVuD/57znPcCvEDcAXw+cS7SATyG6vv4r8Od1eepvE6+fqaJSTs/pUVhpTG/ZC/4JxC+zlcCPiLvt\njyP6cT8LfBl4TV3+e4hZhw8DjiZ+kW3GGy41OQapxTR+M3P8fGKJhV/Lyf8y4lz+8/R4HfASoiK6\nBfhDhi9EFZRgAAABvklEQVTVMETcN1aiFr87l1qMTwVYk05PQ3UPiLvwTyIu+HcQXQWXEn80zxDB\nxo9n8gN8ETiVCJIPAf+d6KY6mZG/2JzoR2NpdL78CXAzsaTCVxukGS1/ZftNwAeJ8/dJ4HeJCU6v\no/aD+DKG+zlRKX2BuP5tJgaPNPoMz2lJkiRJkiRJkiRJkiRJkiRJkiRJmqa8wVaSprkXEncwbyOm\n4H4XMZHjN9OxTSnN84m7k+8jJsDrT/kHgK8QU33fBfwb4C9Svi3A2S35FpKklngHsTZExS8Qs6tW\n5lE6gpj/6BJqE+a9kpha/nlEpbEb6E2v/TExVTjp2INERSJJmgZOIqbXvoqYPv41wN82SHcLtdYF\nxIJBryHWOfmLzPG/J1osW9NjEBcAUoeyP1Vq3sPE7KlvBf4H0cU0mtFmBD5Yt//29L5SR3NqdKl5\nxxILVv0fYqbWJcSKhv82vX4k0T11D7Vup1cQU3nvYGRFshF4f2Z/MVKHsqUhNe81xNrpzwFPEwtc\nHUasS/IC4KfAm4F1wHoiEH6I6JZ6hpHTbn8MWJPSHQb8IwbDJUmSJEmSJEmSJEmSJEmSJEmSJEmS\nBPCvjMC6bD6xSh4AAAAASUVORK5CYII=\n", + "image/png": "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\nkiRJEsA/A3sng0v+IomuAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1109,7 +1129,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1118,9 +1138,9 @@ }, { "data": { - "image/png": "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\nefX/AdmeWI23zkQnAAAAAElFTkSuQmCC\n", + "image/png": "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\n/wfC21DgNNvIcQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1208,144 +1228,144 @@ " 10000\n", " U-235\n", " scatter-Y0,0\n", - " 0.038330\n", - " 0.001119\n", + " 0.037095\n", + " 0.001150\n", " \n", " \n", " 1\n", " 10000\n", " U-235\n", " scatter-Y1,-1\n", - " 0.000008\n", - " 0.000341\n", + " 0.000266\n", + " 0.000323\n", " \n", " \n", " 2\n", " 10000\n", " U-235\n", " scatter-Y1,0\n", - " -0.000342\n", - " 0.000342\n", + " -0.000417\n", + " 0.000274\n", " \n", " \n", " 3\n", " 10000\n", " U-235\n", " scatter-Y1,1\n", - " 0.000201\n", - " 0.000262\n", + " -0.000228\n", + " 0.000237\n", " \n", " \n", " 4\n", " 10000\n", " U-235\n", " scatter-Y2,-2\n", - " 0.000136\n", - " 0.000152\n", + " 0.000026\n", + " 0.000199\n", " \n", " \n", " 5\n", " 10000\n", " U-235\n", " scatter-Y2,-1\n", - " 0.000042\n", - " 0.000131\n", + " -0.000115\n", + " 0.000185\n", " \n", " \n", " 6\n", " 10000\n", " U-235\n", " scatter-Y2,0\n", - " 0.000303\n", - " 0.000185\n", + " 0.000151\n", + " 0.000159\n", " \n", " \n", " 7\n", " 10000\n", " U-235\n", " scatter-Y2,1\n", - " -0.000407\n", - " 0.000184\n", + " -0.000122\n", + " 0.000280\n", " \n", " \n", " 8\n", " 10000\n", " U-235\n", " scatter-Y2,2\n", - " -0.000145\n", - " 0.000120\n", + " 0.000008\n", + " 0.000181\n", " \n", " \n", " 9\n", " 10000\n", " U-238\n", " scatter-Y0,0\n", - " 2.319322\n", - " 0.006166\n", + " 2.328632\n", + " 0.013107\n", " \n", " \n", " 10\n", " 10000\n", " U-238\n", " scatter-Y1,-1\n", - " -0.023638\n", - " 0.001940\n", + " 0.024530\n", + " 0.002272\n", " \n", " \n", " 11\n", " 10000\n", " U-238\n", " scatter-Y1,0\n", - " -0.003463\n", - " 0.001892\n", + " -0.000059\n", + " 0.002804\n", " \n", " \n", " 12\n", " 10000\n", " U-238\n", " scatter-Y1,1\n", - " 0.025099\n", - " 0.002270\n", + " -0.027990\n", + " 0.002536\n", " \n", " \n", " 13\n", " 10000\n", " U-238\n", " scatter-Y2,-2\n", - " -0.000617\n", - " 0.001197\n", + " -0.004861\n", + " 0.001575\n", " \n", " \n", " 14\n", " 10000\n", " U-238\n", " scatter-Y2,-1\n", - " 0.002549\n", - " 0.001187\n", + " 0.000557\n", + " 0.002018\n", " \n", " \n", " 15\n", " 10000\n", " U-238\n", " scatter-Y2,0\n", - " 0.007121\n", - " 0.001646\n", + " 0.006236\n", + " 0.001627\n", " \n", " \n", " 16\n", " 10000\n", " U-238\n", " scatter-Y2,1\n", - " -0.000058\n", - " 0.001323\n", + " -0.000648\n", + " 0.001551\n", " \n", " \n", " 17\n", " 10000\n", " U-238\n", " scatter-Y2,2\n", - " -0.002235\n", - " 0.000867\n", + " -0.001031\n", + " 0.001310\n", " \n", " \n", "\n", @@ -1353,24 +1373,24 @@ ], "text/plain": [ " cell nuclide score mean std. dev.\n", - "0 10000 U-235 scatter-Y0,0 0.038330 0.001119\n", - "1 10000 U-235 scatter-Y1,-1 0.000008 0.000341\n", - "2 10000 U-235 scatter-Y1,0 -0.000342 0.000342\n", - "3 10000 U-235 scatter-Y1,1 0.000201 0.000262\n", - "4 10000 U-235 scatter-Y2,-2 0.000136 0.000152\n", - "5 10000 U-235 scatter-Y2,-1 0.000042 0.000131\n", - "6 10000 U-235 scatter-Y2,0 0.000303 0.000185\n", - "7 10000 U-235 scatter-Y2,1 -0.000407 0.000184\n", - "8 10000 U-235 scatter-Y2,2 -0.000145 0.000120\n", - "9 10000 U-238 scatter-Y0,0 2.319322 0.006166\n", - "10 10000 U-238 scatter-Y1,-1 -0.023638 0.001940\n", - "11 10000 U-238 scatter-Y1,0 -0.003463 0.001892\n", - "12 10000 U-238 scatter-Y1,1 0.025099 0.002270\n", - "13 10000 U-238 scatter-Y2,-2 -0.000617 0.001197\n", - "14 10000 U-238 scatter-Y2,-1 0.002549 0.001187\n", - "15 10000 U-238 scatter-Y2,0 0.007121 0.001646\n", - "16 10000 U-238 scatter-Y2,1 -0.000058 0.001323\n", - "17 10000 U-238 scatter-Y2,2 -0.002235 0.000867" + "0 10000 U-235 scatter-Y0,0 0.037095 0.001150\n", + "1 10000 U-235 scatter-Y1,-1 0.000266 0.000323\n", + "2 10000 U-235 scatter-Y1,0 -0.000417 0.000274\n", + "3 10000 U-235 scatter-Y1,1 -0.000228 0.000237\n", + "4 10000 U-235 scatter-Y2,-2 0.000026 0.000199\n", + "5 10000 U-235 scatter-Y2,-1 -0.000115 0.000185\n", + "6 10000 U-235 scatter-Y2,0 0.000151 0.000159\n", + "7 10000 U-235 scatter-Y2,1 -0.000122 0.000280\n", + "8 10000 U-235 scatter-Y2,2 0.000008 0.000181\n", + "9 10000 U-238 scatter-Y0,0 2.328632 0.013107\n", + "10 10000 U-238 scatter-Y1,-1 0.024530 0.002272\n", + "11 10000 U-238 scatter-Y1,0 -0.000059 0.002804\n", + "12 10000 U-238 scatter-Y1,1 -0.027990 0.002536\n", + "13 10000 U-238 scatter-Y2,-2 -0.004861 0.001575\n", + "14 10000 U-238 scatter-Y2,-1 0.000557 0.002018\n", + "15 10000 U-238 scatter-Y2,0 0.006236 0.001627\n", + "16 10000 U-238 scatter-Y2,1 -0.000648 0.001551\n", + "17 10000 U-238 scatter-Y2,2 -0.001031 0.001310" ] }, "execution_count": 29, @@ -1404,8 +1424,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00086668 0.0061658 ]\n", - " [ 0.00011981 0.00111862]]]\n" + "[[[ 0.00131009 0.01310707]\n", + " [ 0.00018089 0.00114976]]]\n" ] } ], @@ -1473,7 +1493,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.03658762]]]\n" + "[[[ 0.04537029]]]\n" ] } ], @@ -1518,141 +1538,141 @@ " 558\n", " 279\n", " absorption\n", - " 0.000081\n", - " 0.000008\n", + " 0.000093\n", + " 0.000013\n", " \n", " \n", " 559\n", " 279\n", " scatter\n", - " 0.013109\n", - " 0.000358\n", + " 0.013504\n", + " 0.000805\n", " \n", " \n", " 560\n", " 280\n", " absorption\n", - " 0.000088\n", + " 0.000084\n", " 0.000010\n", " \n", " \n", " 561\n", " 280\n", " scatter\n", - " 0.014395\n", - " 0.000586\n", + " 0.014215\n", + " 0.000612\n", " \n", " \n", " 562\n", " 281\n", " absorption\n", - " 0.000097\n", - " 0.000010\n", + " 0.000091\n", + " 0.000008\n", " \n", " \n", " 563\n", " 281\n", " scatter\n", - " 0.014637\n", - " 0.000427\n", + " 0.014545\n", + " 0.000590\n", " \n", " \n", " 564\n", " 282\n", " absorption\n", - " 0.000107\n", - " 0.000009\n", + " 0.000112\n", + " 0.000012\n", " \n", " \n", " 565\n", " 282\n", " scatter\n", - " 0.015683\n", - " 0.000552\n", + " 0.016321\n", + " 0.000729\n", " \n", " \n", " 566\n", " 283\n", " absorption\n", - " 0.000110\n", - " 0.000009\n", + " 0.000092\n", + " 0.000007\n", " \n", " \n", " 567\n", " 283\n", " scatter\n", - " 0.016293\n", - " 0.000627\n", + " 0.016163\n", + " 0.000661\n", " \n", " \n", " 568\n", " 284\n", " absorption\n", - " 0.000111\n", - " 0.000007\n", + " 0.000104\n", + " 0.000011\n", " \n", " \n", " 569\n", " 284\n", " scatter\n", - " 0.017032\n", - " 0.000445\n", + " 0.017384\n", + " 0.000599\n", " \n", " \n", " 570\n", " 285\n", " absorption\n", - " 0.000112\n", - " 0.000006\n", + " 0.000111\n", + " 0.000011\n", " \n", " \n", " 571\n", " 285\n", " scatter\n", - " 0.017666\n", - " 0.000425\n", + " 0.018015\n", + " 0.000774\n", " \n", " \n", " 572\n", " 286\n", " absorption\n", - " 0.000123\n", - " 0.000011\n", + " 0.000125\n", + " 0.000012\n", " \n", " \n", " 573\n", " 286\n", " scatter\n", - " 0.017706\n", - " 0.000597\n", + " 0.018294\n", + " 0.000828\n", " \n", " \n", " 574\n", " 287\n", " absorption\n", - " 0.000108\n", - " 0.000011\n", + " 0.000119\n", + " 0.000013\n", " \n", " \n", " 575\n", " 287\n", " scatter\n", - " 0.017339\n", - " 0.000664\n", + " 0.017483\n", + " 0.000757\n", " \n", " \n", " 576\n", " 288\n", " absorption\n", - " 0.000129\n", - " 0.000011\n", + " 0.000113\n", + " 0.000014\n", " \n", " \n", " 577\n", " 288\n", " scatter\n", - " 0.018452\n", - " 0.000523\n", + " 0.018248\n", + " 0.000782\n", " \n", " \n", "\n", @@ -1660,26 +1680,26 @@ ], "text/plain": [ " distribcell score mean std. dev.\n", - "558 279 absorption 0.000081 0.000008\n", - "559 279 scatter 0.013109 0.000358\n", - "560 280 absorption 0.000088 0.000010\n", - "561 280 scatter 0.014395 0.000586\n", - "562 281 absorption 0.000097 0.000010\n", - "563 281 scatter 0.014637 0.000427\n", - "564 282 absorption 0.000107 0.000009\n", - "565 282 scatter 0.015683 0.000552\n", - "566 283 absorption 0.000110 0.000009\n", - "567 283 scatter 0.016293 0.000627\n", - "568 284 absorption 0.000111 0.000007\n", - "569 284 scatter 0.017032 0.000445\n", - "570 285 absorption 0.000112 0.000006\n", - "571 285 scatter 0.017666 0.000425\n", - "572 286 absorption 0.000123 0.000011\n", - "573 286 scatter 0.017706 0.000597\n", - "574 287 absorption 0.000108 0.000011\n", - "575 287 scatter 0.017339 0.000664\n", - "576 288 absorption 0.000129 0.000011\n", - "577 288 scatter 0.018452 0.000523" + "558 279 absorption 0.000093 0.000013\n", + "559 279 scatter 0.013504 0.000805\n", + "560 280 absorption 0.000084 0.000010\n", + "561 280 scatter 0.014215 0.000612\n", + "562 281 absorption 0.000091 0.000008\n", + "563 281 scatter 0.014545 0.000590\n", + "564 282 absorption 0.000112 0.000012\n", + "565 282 scatter 0.016321 0.000729\n", + "566 283 absorption 0.000092 0.000007\n", + "567 283 scatter 0.016163 0.000661\n", + "568 284 absorption 0.000104 0.000011\n", + "569 284 scatter 0.017384 0.000599\n", + "570 285 absorption 0.000111 0.000011\n", + "571 285 scatter 0.018015 0.000774\n", + "572 286 absorption 0.000125 0.000012\n", + "573 286 scatter 0.018294 0.000828\n", + "574 287 absorption 0.000119 0.000013\n", + "575 287 scatter 0.017483 0.000757\n", + "576 288 absorption 0.000113 0.000014\n", + "577 288 scatter 0.018248 0.000782" ] }, "execution_count": 33, @@ -1766,8 +1786,8 @@ " 10000\n", " 0\n", " absorption\n", - " 0.000131\n", - " 0.000014\n", + " 0.000123\n", + " 0.000012\n", " \n", " \n", " 1\n", @@ -1781,8 +1801,8 @@ " 10000\n", " 0\n", " scatter\n", - " 0.018582\n", - " 0.000680\n", + " 0.017805\n", + " 0.000808\n", " \n", " \n", " 2\n", @@ -1796,8 +1816,8 @@ " 10000\n", " 1\n", " absorption\n", - " 0.000220\n", - " 0.000023\n", + " 0.000217\n", + " 0.000020\n", " \n", " \n", " 3\n", @@ -1811,8 +1831,8 @@ " 10000\n", " 1\n", " scatter\n", - " 0.028711\n", - " 0.001186\n", + " 0.028867\n", + " 0.001263\n", " \n", " \n", " 4\n", @@ -1826,8 +1846,8 @@ " 10000\n", " 2\n", " absorption\n", - " 0.000295\n", - " 0.000022\n", + " 0.000318\n", + " 0.000020\n", " \n", " \n", " 5\n", @@ -1841,8 +1861,8 @@ " 10000\n", " 2\n", " scatter\n", - " 0.038782\n", - " 0.001084\n", + " 0.040493\n", + " 0.001269\n", " \n", " \n", " 6\n", @@ -1856,8 +1876,8 @@ " 10000\n", " 3\n", " absorption\n", - " 0.000331\n", - " 0.000022\n", + " 0.000386\n", + " 0.000018\n", " \n", " \n", " 7\n", @@ -1871,8 +1891,8 @@ " 10000\n", " 3\n", " scatter\n", - " 0.045772\n", - " 0.001084\n", + " 0.048576\n", + " 0.001337\n", " \n", " \n", " 8\n", @@ -1886,7 +1906,7 @@ " 10000\n", " 4\n", " absorption\n", - " 0.000419\n", + " 0.000501\n", " 0.000026\n", " \n", " \n", @@ -1901,8 +1921,8 @@ " 10000\n", " 4\n", " scatter\n", - " 0.055975\n", - " 0.001344\n", + " 0.057063\n", + " 0.001715\n", " \n", " \n", " 10\n", @@ -1916,8 +1936,8 @@ " 10000\n", " 5\n", " absorption\n", - " 0.000514\n", - " 0.000024\n", + " 0.000484\n", + " 0.000026\n", " \n", " \n", " 11\n", @@ -1931,8 +1951,8 @@ " 10000\n", " 5\n", " scatter\n", - " 0.063289\n", - " 0.001605\n", + " 0.060822\n", + " 0.001581\n", " \n", " \n", " 12\n", @@ -1946,8 +1966,8 @@ " 10000\n", " 6\n", " absorption\n", - " 0.000591\n", - " 0.000027\n", + " 0.000532\n", + " 0.000039\n", " \n", " \n", " 13\n", @@ -1961,8 +1981,8 @@ " 10000\n", " 6\n", " scatter\n", - " 0.071011\n", - " 0.002058\n", + " 0.069101\n", + " 0.002249\n", " \n", " \n", " 14\n", @@ -1976,8 +1996,8 @@ " 10000\n", " 7\n", " absorption\n", - " 0.000671\n", - " 0.000036\n", + " 0.000577\n", + " 0.000039\n", " \n", " \n", " 15\n", @@ -1991,8 +2011,8 @@ " 10000\n", " 7\n", " scatter\n", - " 0.077891\n", - " 0.001952\n", + " 0.076722\n", + " 0.002335\n", " \n", " \n", " 16\n", @@ -2006,8 +2026,8 @@ " 10000\n", " 8\n", " absorption\n", - " 0.000721\n", - " 0.000031\n", + " 0.000649\n", + " 0.000039\n", " \n", " \n", " 17\n", @@ -2021,8 +2041,8 @@ " 10000\n", " 8\n", " scatter\n", - " 0.086393\n", - " 0.001722\n", + " 0.081564\n", + " 0.001610\n", " \n", " \n", " 18\n", @@ -2036,8 +2056,8 @@ " 10000\n", " 9\n", " absorption\n", - " 0.000748\n", - " 0.000033\n", + " 0.000680\n", + " 0.000032\n", " \n", " \n", " 19\n", @@ -2051,8 +2071,8 @@ " 10000\n", " 9\n", " scatter\n", - " 0.090861\n", - " 0.001669\n", + " 0.087715\n", + " 0.001959\n", " \n", " \n", "\n", @@ -2086,26 +2106,26 @@ " mean std. dev. \n", " \n", " \n", - "0 0.000131 0.000014 \n", - "1 0.018582 0.000680 \n", - "2 0.000220 0.000023 \n", - "3 0.028711 0.001186 \n", - "4 0.000295 0.000022 \n", - "5 0.038782 0.001084 \n", - "6 0.000331 0.000022 \n", - "7 0.045772 0.001084 \n", - "8 0.000419 0.000026 \n", - "9 0.055975 0.001344 \n", - "10 0.000514 0.000024 \n", - "11 0.063289 0.001605 \n", - "12 0.000591 0.000027 \n", - "13 0.071011 0.002058 \n", - "14 0.000671 0.000036 \n", - "15 0.077891 0.001952 \n", - "16 0.000721 0.000031 \n", - "17 0.086393 0.001722 \n", - "18 0.000748 0.000033 \n", - "19 0.090861 0.001669 " + "0 0.000123 0.000012 \n", + "1 0.017805 0.000808 \n", + "2 0.000217 0.000020 \n", + "3 0.028867 0.001263 \n", + "4 0.000318 0.000020 \n", + "5 0.040493 0.001269 \n", + "6 0.000386 0.000018 \n", + "7 0.048576 0.001337 \n", + "8 0.000501 0.000026 \n", + "9 0.057063 0.001715 \n", + "10 0.000484 0.000026 \n", + "11 0.060822 0.001581 \n", + "12 0.000532 0.000039 \n", + "13 0.069101 0.002249 \n", + "14 0.000577 0.000039 \n", + "15 0.076722 0.002335 \n", + "16 0.000649 0.000039 \n", + "17 0.081564 0.001610 \n", + "18 0.000680 0.000032 \n", + "19 0.087715 0.001959 " ] }, "execution_count": 34, @@ -2158,38 +2178,38 @@ " \n", " \n", " mean\n", - " 0.000417\n", - " 0.000020\n", + " 0.000418\n", + " 0.000022\n", " \n", " \n", " std\n", - " 0.000238\n", - " 0.000008\n", + " 0.000239\n", + " 0.000009\n", " \n", " \n", " min\n", - " 0.000020\n", - " 0.000003\n", + " 0.000018\n", + " 0.000004\n", " \n", " \n", " 25%\n", - " 0.000214\n", - " 0.000014\n", + " 0.000202\n", + " 0.000015\n", " \n", " \n", " 50%\n", - " 0.000394\n", - " 0.000019\n", + " 0.000402\n", + " 0.000021\n", " \n", " \n", " 75%\n", - " 0.000627\n", - " 0.000025\n", + " 0.000615\n", + " 0.000027\n", " \n", " \n", " max\n", - " 0.000915\n", - " 0.000049\n", + " 0.000892\n", + " 0.000044\n", " \n", " \n", "\n", @@ -2200,13 +2220,13 @@ " \n", " \n", "count 289.000000 289.000000\n", - "mean 0.000417 0.000020\n", - "std 0.000238 0.000008\n", - "min 0.000020 0.000003\n", - "25% 0.000214 0.000014\n", - "50% 0.000394 0.000019\n", - "75% 0.000627 0.000025\n", - "max 0.000915 0.000049" + "mean 0.000418 0.000022\n", + "std 0.000239 0.000009\n", + "min 0.000018 0.000004\n", + "25% 0.000202 0.000015\n", + "50% 0.000402 0.000021\n", + "75% 0.000615 0.000027\n", + "max 0.000892 0.000044" ] }, "execution_count": 35, @@ -2241,7 +2261,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 0.498462484897\n" + "Mann-Whitney Test p-value: 0.414863173548\n" ] } ], @@ -2279,7 +2299,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Mann-Whitney Test p-value: 1.61253828675e-41\n" + "Mann-Whitney Test p-value: 3.28554363741e-42\n" ] } ], @@ -2325,7 +2345,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2334,9 +2354,9 @@ }, { "data": { - "image/png": "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\norlkyRKeP3+erVp1IWCgqI78DIFVDAuLossVo41pQ4rqwy2ZmHgjbbYuFKvqVlBVI1i3bnMajRMo\nZofbaLNF+F0sBAtI4yGNR2kSSvozMzO5Zs0aLlmyxFtp9Vr1d+p0K4HV9ATQgXrU6XoQeJ6KUpuT\nJz9T+EEoTugNG7amw5FIp7Mbw8NjvUUbe/S4g6Jib87VvO+Vty8e/WFh0QS20RPstdsT+eGHH+bZ\nfvPmzbTbI+l01qfVGsYFCxbx6aefZnh4RZrN5Vi/fjMeOnTIu/2MGTNoMPhWEn6Fwp1zG1W1OgcO\nHMLGjdvSZqtB4f6qR1Ep+B1GR1fzHmfQoH9RBNQ9x9nJ6OjqHDz4Ier1U7TnXtBmEdna1buFgIF3\n331/ntldcnIyq1evR5OpEnW6kVTVBD722JMFjvfp06dpt0dSuKNI4FM6nVH866+/Cv1fpaamagH5\ntfQ013I6b+XUqVO928yf/xLNZjtVNZ7h4bHctWuX9n/0XTDxGZs06cixY59gtWpN2Lx5F37zzTdM\nSUlhixadaTCYGB5eievWrStUUyCANB6hbTwkocWQIcNpNI7TTgbrKPzkHjdOCo1Ga5FWy0yfPkOr\ntOqpwjuPN97YgyS5ePF/tF7tRyiqurbnlCkFNzM6cuQIq1Spr13lhtFqrcpu3frmWVKbkZGhXUF7\nakMdpF7vok7XjqKrYWMCbVmhQrw3nrN//35tietSAl9RUdry3nvv56pVq7h161a63W5mZmZy8uTJ\ntFq7Myf/xU293uTN5J816wXabN00N46bJtNY3nrrXdoJdixFwPlhiuCzZzx3sly52AI/d3Z2Nleu\nXMlp06YV2nHw66+/ptOZ6HMiJ53O+oW23RVFJQdTLCvvps3Q3qaiVMxTBTctLY0HDx70xnPuvXeY\nj2EkdboF7Nbt9qu+V0kCaTyk8ZCUHCdOnGB0dDXa7T1osTQh0NXnhJRJo9FapFav9933EP0bS33P\nuLi6JMVJZOLEKbTZXLRY7HzwwVFXNUgJCU1pMEzTTtxfetu65ubo0aNUlGif9/yGQGXm5FecI+Ck\n3d6aGzdu9O63fft2tmnTnbVrt+SkSc/kuxJo69atVNUqFKu1xFV2eHis94R45coVdu9+G222GNrt\nNVizZmOePHmSnTr1pEgMbEaxuEClwdCLOt0TVJQYLl/+Zp73uh6OHDmi9WPxFMg8SoslLE/9sNx8\n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\nRCKRSCSB5/8ByMyfADZGvh4AAAAASUVORK5CYII=\n", + "image/png": "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\niUSS+/w/t3PPI3Lev3cAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2363,7 +2383,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2372,9 +2392,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index bbd900fdd6..7059465372 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -179,10 +179,10 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" ] } ], @@ -228,12 +228,12 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" ] } ], @@ -393,7 +393,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTM6NDI6MDYtMDQ6MDCJhmNxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDEzOjQyOjA2LTA0OjAw+NvbzQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTQ6MjI6MjEtMDQ6MDCbwpaZAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDE0OjIyOjIxLTA0OjAw6p8uJQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -587,7 +587,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "rm: cannot remove ‘statepoint.*’: No such file or directory\n", "\n", " .d88888b. 888b d888 .d8888b.\n", " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", @@ -605,7 +604,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 13:42:07\n", + " Date/Time: 2015-10-08 14:22:21\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -661,20 +660,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.6000E-01 seconds\n", - " Reading cross sections = 1.3900E-01 seconds\n", - " Total time in simulation = 1.6630E+01 seconds\n", - " Time in transport only = 1.6613E+01 seconds\n", - " Time in inactive batches = 2.1710E+00 seconds\n", - " Time in active batches = 1.4459E+01 seconds\n", + " Total time for initialization = 4.3800E-01 seconds\n", + " Reading cross sections = 1.0100E-01 seconds\n", + " Total time in simulation = 1.5663E+01 seconds\n", + " Time in transport only = 1.5651E+01 seconds\n", + " Time in inactive batches = 2.2110E+00 seconds\n", + " Time in active batches = 1.3452E+01 seconds\n", " Time synchronizing fission bank = 2.0000E-03 seconds\n", " Sampling 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 = 1.0000E-03 seconds\n", - " Total time elapsed = 1.7100E+01 seconds\n", - " Calculation Rate (inactive) = 5757.72 neutrons/second\n", - " Calculation Rate (active) = 2593.54 neutrons/second\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 1.6114E+01 seconds\n", + " Calculation Rate (inactive) = 5653.55 neutrons/second\n", + " Calculation Rate (active) = 2787.69 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -721,7 +720,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 24, "metadata": { "collapsed": false, "scrolled": true @@ -741,7 +740,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 25, "metadata": { "collapsed": false, "scrolled": true @@ -764,24 +763,45 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { - "ename": "AttributeError", - "evalue": "'CrossScore' object has no attribute 'strip'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mfiss_rate\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_tally\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'fiss. rate'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mabs_rate\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_tally\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'abs. rate'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mkeff\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfiss_rate\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mabs_rate\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mkeff\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_pandas_dataframe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36m__div__\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m 2051\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2052\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mTally\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2053\u001b[1;33m \u001b[0mnew_tally\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_outer_product\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbinary_op\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'/'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2054\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2055\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mReal\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36m_outer_product\u001b[1;34m(self, other, binary_op)\u001b[0m\n\u001b[0;32m 1548\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mself_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother_score\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mitertools\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mproduct\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mall_scores\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1549\u001b[0m \u001b[0mnew_score\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mCrossScore\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbinary_op\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1550\u001b[1;33m \u001b[0mnew_tally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_score\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnew_score\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1551\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1552\u001b[0m \u001b[1;31m# Generate nuclide \"outer products\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36madd_score\u001b[1;34m(self, score)\u001b[0m\n\u001b[0;32m 434\u001b[0m \u001b[1;32mreturn\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 435\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 436\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_scores\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mscore\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 437\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 438\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mnum_score_bins\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msetter\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mAttributeError\u001b[0m: 'CrossScore' object has no attribute 'strip'" - ] + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nuclidescoremeanstd. dev.
0total(nu-fission / absorption)1.0401660.009069
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "0 total (nu-fission / absorption) 1.040166 0.009069" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -803,11 +823,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)totalabsorption0.959380.008187
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total absorption 0.95938 0.008187" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", @@ -825,11 +883,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nuclidescoremeanstd. dev.
0totalnu-fission1.0908990.010602
\n", + "
" + ], + "text/plain": [ + " nuclide score mean std. dev.\n", + "0 total nu-fission 1.090899 0.010602" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", @@ -848,11 +942,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]cellnuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8034130.007031
\n", + "
" + ], + "text/plain": [ + " energy [MeV] cell nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803413 0.007031" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", @@ -869,11 +1003,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2370530.011765
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.237053 0.011765" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", "eta = therm_fiss_rate / fuel_therm_abs_rate\n", @@ -889,11 +1061,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0401660.019018
\n", + "
" + ], + "text/plain": [ + " energy [MeV] nuclide \\\n", + "0 (0.0e+00 - 6.2e-01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption * nu-fission) * absorption) * (n... 1.040166 0.019018 " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "keff = res_esc * fast_fiss * therm_util * eta\n", "keff.get_pandas_dataframe()" @@ -910,7 +1123,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false, "scrolled": true @@ -926,11 +1139,131 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.657029e-077.377419e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099891e-012.303838e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.564204e-013.951669e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.555330e-036.101004e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.154887e-038.053460e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.277701e-011.079289e-03
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.066738e-035.254797e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.366802e-031.647058e-05
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", + "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", + "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", + "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", + "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", + "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", + "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", + "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", + "\n", + " mean std. dev. \n", + "0 6.657029e-07 7.377419e-09 \n", + "1 2.099891e-01 2.303838e-03 \n", + "2 3.564204e-01 3.951669e-03 \n", + "3 5.555330e-03 6.101004e-05 \n", + "4 7.154887e-03 8.053460e-05 \n", + "5 2.277701e-01 1.079289e-03 \n", + "6 8.066738e-03 5.254797e-05 \n", + "7 3.366802e-03 1.647058e-05 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "fuel_xs = fuel_rxn_rates / flux\n", "fuel_xs.get_pandas_dataframe()" @@ -945,11 +1278,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 6.65702880e-07]\n", + " [ 3.56420449e-01]]\n", + "\n", + " [[ 7.15488656e-03]\n", + " [ 8.06673774e-03]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore\n", "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", @@ -965,11 +1310,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.00555533]]\n", + "\n", + " [[ 0.0033668 ]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", @@ -979,11 +1334,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[ 0.22777006]\n", + " [ 0.0033668 ]]]\n" + ] + } + ], "source": [ "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", @@ -1001,11 +1365,81 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.283958e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8685536.880390e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0821498.837250e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0926185.195308e-04
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.283958e-08\n", + "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.868553 6.880390e-03\n", + "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082149 8.837250e-04\n", + "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092618 5.195308e-04" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# \"Slice\" the nu-fission data into a new derived Tally\n", "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", @@ -1014,11 +1448,131 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
010002(1.0e-08 - 1.1e-07)H-1scatter4.6193980.040124
110002(1.1e-07 - 1.2e-06)H-1scatter2.0307570.011239
210002(1.2e-06 - 1.3e-05)H-1scatter1.6584880.009777
310002(1.3e-05 - 1.4e-04)H-1scatter1.8530020.007378
410002(1.4e-04 - 1.5e-03)H-1scatter2.0507730.012484
510002(1.5e-03 - 1.6e-02)H-1scatter2.1317590.007821
610002(1.6e-02 - 1.7e-01)H-1scatter2.2137100.015159
710002(1.7e-01 - 1.9e+00)H-1scatter2.0119250.009406
810002(1.9e+00 - 2.0e+01)H-1scatter0.3712800.003949
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score mean std. dev.\n", + "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.619398 0.040124\n", + "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.030757 0.011239\n", + "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.658488 0.009777\n", + "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.853002 0.007378\n", + "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.050773 0.012484\n", + "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.131759 0.007821\n", + "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.213710 0.015159\n", + "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.011925 0.009406\n", + "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.371280 0.003949" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", "need_to_slice = sp.get_tally(name='need-to-slice')\n", diff --git a/openmc/filter.py b/openmc/filter.py index 63034fe57e..bff1c62f0c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -161,7 +161,7 @@ class Filter(object): raise ValueError(msg) # If the bin edge is a single value, it is a Cell, Material, etc. ID - if not cv._isinstance(bins, Iterable): + if not isinstance(bins, Iterable): bins = [bins] # If the bins are in a collection, convert it to a list @@ -200,7 +200,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) @@ -443,7 +443,7 @@ class Filter(object): if self.type == 'mesh': # Construct 3-tuple of x,y,z cell indices for a 3D mesh - if (len(self.mesh.dimension) == 3): + if len(self.mesh.dimension) == 3: nx, ny, nz = self.mesh.dimension x = bin_index / (ny * nz) y = (bin_index - (x * ny * nz)) / nz diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index f0adc5101a..dfaca9be93 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -17,28 +17,21 @@ class EnergyGroups(object): Parameters ---------- - group_edges : ndarray + group_edges : Iterable of Real The energy group boundaries [MeV] - num_groups : Integral - The number of energy groups Attributes ---------- - group_edges : ndarray + group_edges : Iterable of Real The energy group boundaries [MeV] - num_groups : Integral - The number of energy groups """ - def __init__(self, group_edges=None, num_groups=None): + def __init__(self, group_edges=None): self._group_edges = None - self._num_groups = None if group_edges is not None: self.group_edges = group_edges - if num_groups is not None: - self.num_groups = num_groups def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -47,7 +40,6 @@ class EnergyGroups(object): if existing is None: clone = type(self).__new__(type(self)) clone._group_edges = copy.deepcopy(self.group_edges, memo) - clone._num_groups = self.num_groups memo[id(self)] = clone @@ -77,47 +69,13 @@ class EnergyGroups(object): @property def num_groups(self): - return self._num_groups + return len(self.group_edges) - 1 @group_edges.setter def group_edges(self, edges): cv.check_type('group edges', edges, Iterable, Real) cv.check_greater_than('number of group edges', len(edges), 1) self._group_edges = np.array(edges) - self._num_groups = len(edges)-1 - - def generate_bin_edges(self, start, stop, num_groups, spacing='linear'): - """Generate equally or logarithmically-spaced energy group boundaries. - - Parameters - ---------- - start : Real - The lowest energy in MeV - stop : Real - The highest energy in MeV - num_groups : Integral - The number of energy groups - spacing : {'linear', 'logarithmic'} - The spacing between groups - - """ - - cv.check_type('first edge', start, Real) - cv.check_type('last edge', stop, Real) - cv.check_type('number of groups', num_groups, Integral) - cv.check_type('spacing', spacing, basestring) - cv.check_greater_than('first edge', start, 0, True) - cv.check_greater_than('last edge', stop, start, False) - cv.check_greater_than('number of groups', num_groups, 0) - cv.check_value('spacing', spacing, ('linear', 'logarithmic')) - - if spacing == 'linear': - self.group_edges = np.linspace(start, stop, num_groups + 1) - elif spacing == 'logarithmic': - self.group_edges = \ - np.logspace(np.log10(start), np.log10(stop), num_groups + 1) - - self._num_groups = num_groups def get_group(self, energy): """Returns the energy group in which the given energy resides. @@ -144,7 +102,7 @@ class EnergyGroups(object): 'the group edges have not yet been set'.format(energy) raise ValueError(msg) - index = np.where(self.group_edges > energy)[0] + index = np.where(self.group_edges > energy)[0][0] group = self.num_groups - index return group @@ -173,6 +131,9 @@ class EnergyGroups(object): 'the group edges have not yet been set'.format(group) raise ValueError(msg) + cv.check_greater_than('group', group, 0) + cv.check_less_than('group', group, self.num_groups, equality=True) + lower = self.group_edges[self.num_groups-group] upper = self.group_edges[self.num_groups-group+1] return lower, upper @@ -205,7 +166,7 @@ class EnergyGroups(object): raise ValueError(msg) if groups == 'all': - indices = np.arange(self.num_groups) + return np.arange(self.num_groups) else: indices = np.zeros(len(groups), dtype=np.int) @@ -229,7 +190,7 @@ class EnergyGroups(object): The energy groups of interest - a list of 2-tuples, each directly corresponding to one of the new coarse groups. The values in the 2-tuples are upper/lower energy groups used to construct a new - coarse group. For example, if [(1,2), (2,4)] was used as the coarse + coarse group. For example, if [(1,2), (3,4)] was used as the coarse groups, fine groups 1 and 2 would be merged into coarse group 1 while fine groups 3 and 4 would be merged into coarse group 2. @@ -255,8 +216,8 @@ class EnergyGroups(object): cv.check_less_than('lower group', group[0], group[1], False) # Compute the group indices into the coarse group - group_bounds = [group[0] for group in coarse_groups] - group_bounds.append(coarse_groups[-1][1]) + group_bounds = [group[1] for group in coarse_groups] + group_bounds.insert(0, coarse_groups[0][0]) # Determine the indices mapping the fine-to-coarse energy groups group_bounds = np.asarray(group_bounds) From a83de39efb455a31f63a0a95896a4bfd37cae09f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 8 Oct 2015 16:36:00 -0400 Subject: [PATCH 308/519] Now using Python ternary operator to shorten StatePoint property getters --- .../examples/multi-group-cross-sections.ipynb | 116 +++++++++--------- .../examples/pandas-dataframes.ipynb | 42 +++---- .../pythonapi/examples/tally-arithmetic.ipynb | 28 ++--- openmc/statepoint.py | 36 ++---- 4 files changed, 100 insertions(+), 122 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 7c7ad7bbb8..09a48a7272 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -437,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -463,7 +463,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 16:01:19\n", + " Date/Time: 2015-10-08 16:26:35\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -548,20 +548,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9700E-01 seconds\n", - " Reading cross sections = 9.1000E-02 seconds\n", - " Total time in simulation = 1.2622E+01 seconds\n", - " Time in transport only = 1.2608E+01 seconds\n", - " Time in inactive batches = 1.8770E+00 seconds\n", - " Time in active batches = 1.0745E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 3.9300E-01 seconds\n", + " Reading cross sections = 9.0000E-02 seconds\n", + " Total time in simulation = 1.2399E+01 seconds\n", + " Time in transport only = 1.2391E+01 seconds\n", + " Time in inactive batches = 1.8730E+00 seconds\n", + " Time in active batches = 1.0526E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 1.3030E+01 seconds\n", - " Calculation Rate (inactive) = 13319.1 neutrons/second\n", - " Calculation Rate (active) = 9306.65 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.2802E+01 seconds\n", + " Calculation Rate (inactive) = 13347.6 neutrons/second\n", + " Calculation Rate (active) = 9500.28 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -579,7 +579,7 @@ "0" ] }, - "execution_count": 16, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -606,7 +606,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -625,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -645,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -667,7 +667,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -710,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -751,7 +751,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -881,7 +881,7 @@ "54 1 2 2 total 0.266499 0.001265" ] }, - "execution_count": 22, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -900,7 +900,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -918,7 +918,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": { "collapsed": true }, @@ -946,7 +946,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": { "collapsed": false }, @@ -985,7 +985,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "metadata": { "collapsed": true }, @@ -1019,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "metadata": { "collapsed": false }, @@ -1181,7 +1181,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -1244,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -1278,7 +1278,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "metadata": { "collapsed": true }, @@ -1304,7 +1304,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "metadata": { "collapsed": true }, @@ -1333,7 +1333,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -1382,7 +1382,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1423,7 +1423,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "metadata": { "collapsed": true }, @@ -1450,7 +1450,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1480,7 +1480,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1520,7 +1520,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1531,7 +1531,7 @@ "0" ] }, - "execution_count": 37, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1561,7 +1561,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1582,7 +1582,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1618,7 +1618,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1672,7 +1672,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 40, "metadata": { "collapsed": false }, @@ -1714,7 +1714,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -1844,7 +1844,7 @@ "119 10002 1 5 H-1 0.000000 0.000000" ] }, - "execution_count": 42, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1864,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1892,7 +1892,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -1901,7 +1901,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1932,7 +1932,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 44, "metadata": { "collapsed": true }, @@ -1954,7 +1954,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 45, "metadata": { "collapsed": false }, @@ -1993,7 +1993,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -2076,7 +2076,7 @@ "2 10000 2 U-235 485.513530 2.418761" ] }, - "execution_count": 47, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -2102,7 +2102,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 47, "metadata": { "collapsed": true }, @@ -2124,7 +2124,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -2172,7 +2172,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -2200,7 +2200,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -2235,7 +2235,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2292,7 +2292,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -2310,7 +2310,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 53, "metadata": { "collapsed": false }, diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index cc2bd3b11b..1a6d99fd71 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -409,7 +409,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA4VDE0OjIx\nOjU1LTA0OjAwjn8AkAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQxNDoyMTo1NS0wNDow\nMP8iuCwAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA4VDE2OjEw\nOjMyLTA0OjAwm8uP7QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQxNjoxMDozMi0wNDow\nMOqWN1EAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -599,7 +599,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 14:21:55\n", + " Date/Time: 2015-10-08 16:10:32\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -663,20 +663,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3800E-01 seconds\n", - " Reading cross sections = 9.7000E-02 seconds\n", - " Total time in simulation = 9.7830E+00 seconds\n", - " Time in transport only = 9.7730E+00 seconds\n", - " Time in inactive batches = 1.4030E+00 seconds\n", - " Time in active batches = 8.3800E+00 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 4.1200E-01 seconds\n", + " Reading cross sections = 9.5000E-02 seconds\n", + " Total time in simulation = 8.7750E+00 seconds\n", + " Time in transport only = 8.7640E+00 seconds\n", + " Time in inactive batches = 1.3210E+00 seconds\n", + " Time in active batches = 7.4540E+00 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.0230E+01 seconds\n", - " Calculation Rate (inactive) = 8909.48 neutrons/second\n", - " Calculation Rate (active) = 4474.94 neutrons/second\n", + " Total time elapsed = 9.1960E+00 seconds\n", + " Calculation Rate (inactive) = 9462.53 neutrons/second\n", + " Calculation Rate (active) = 5030.86 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1106,7 +1106,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEaCAYAAADtxAsqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xu4nVV94PHvIYmXEfQYocZc9HDTEi8c7EyMI4XDYDHE\nNrFapbZDOTgzMFrqWHAEpJ2QOlbEavOEDBErJZnpAGIH0RnRcClbmFqTloRAhXCTrbmMQRSmiCgE\nTv/4rb33m529z/vuc9mXs7+f59ns9333WnuvHd7zrr3Wb71rgSRJkiRJkiRJkiRJkiRJkiSpSzwH\nbAPuAu4E3jrF7z8C/O+cNCdOw+e2QxmY2+D4T9tcDvW52Z0ugPrKz4Dj0vYpwKeIC307nQQ8Cfzd\nBPMPpOexqSlOYc0+r93lGM9BwPOdLoSm10GdLoD61suAn6TtAeAzwD3A3cD70vE1wB+n7XcA30pp\nNwCfB/4euB94Z4P3nwvcAGwnKog3AkPA2cAfEi2e4+vyHAbcDPwj8BfUft0Ppc/ZmMq4qEl5R9i/\npbMOOCNtl4FPp/SbgSMzn/nXwJb0+Nfp+CuAmzJlqVRWjXwupbsFODS9952Z14+u26/4MPBd4t/o\nmnTsYOCqVM7twG+m4+9Px+4BLsm8x0+BPyNaj28F/m36ftuI/0deYyRN2D7iYnIf8AS1Vsd7iAvk\nAPBLwPeBVwIvJi6GJwE7gMNT+g3AjWn7KGAn8EL2v2hfRq3COSl9LsAq4Nwm5VsHnJ+230H8aq5U\nGs8BS8Yp7zwOrDQuA34vbT8CXJi2T8+kuxp4W9p+NXBv2l4L/FHaXp4pS73niQs66ftelrb/Bjg2\nbf8p8PsN8u4G5qTtl6bnTxOVUMUgMD99x1cAs4BbgZWZz/+ttH0M8LWUBuDy9F0laUKezGwvJSoE\ngD8HRjOv/XfgN9L2W4nKJnvRu6ou/beIC+QItYvxVuJiX/ED4BCi0jivSfm2Aa/J7P+YWqXxvczx\nzzUp74mMX2lUyjMHeCxtP5o+t/LYCbwkbWfLXylLvX3Ufs0fTq1y/B2ipXYQ8BDw8gZ5vwF8Gfjd\n9JkA/0CtFVSxkqioKz4AfDZtP0utFXQOURFVvssO4L80+Fz1MGMa6pTvEF0phxH98tnulwFqffVv\nAn4ELMh5v0Z96eN16TTTLM9TOenG2P8CDtFSaqby/QaAtwDPtFCWZrL/btcTFeTfEBXB4w3SvxM4\ngajwLiK68Bp97nj/f37O/nGVjcDHWyy3eoj9jeqUXybOv8eAO4DT0v5hwK8S/fuvIbqSjgNOpdY9\nNAC8Nz0fCRxBxByy7iB+QUO0QH5EtHSeJFocjfwttfjEKTT+dV5572x5T0jl/QGwGHgB0a3zb+ry\nnZZ5/nbavomILVRUupRuJ1oLEN+9WVkOIv4tSOnvSNs/BzYB64mWWb0BojusBFxAxJgOJmI62Vbd\nYPpuJ1LrnvptonVX71aiq+qwtD83fYYkTUglplEZdntq5rVLqQWWKxfBm4FfT9tvTq+9kLgIrqcW\nCF+e0pxI9KlDXGS/QgRzvw28IR0/Oh3bRi2WUHEYEUy+B/gCsIfoShpKn53VqLwQMYEHiAv2X7N/\n99Ql6bM3ExUdxIX42nT8u0QcAOKCu4nowvtCyt+oe+pJoqvonlT2V2ReW0p0dzVqscwmKphKcPtj\n6fhLiK6oe4j/R+9Kx387k/ZTmff5p7r3fR/xb7udaOEsQZI67Crg3dPwvi+gFsR9KxEXmSrNLvrT\n6aPA6jZ/pmY4YxpSzauB64gun2eA/zCF793u+ym+QgTG67vIJEmSJHWTMtHdczcRR7iSuJfkG8D/\nJ+IvgyntUiKO8jgRFzgx8z5nEvdi/BPwMHBW5rURYBcR/N9LxFRGp/6rSJKm2yNERXAYcbPbXiLm\ncSwRnL+VuCdhATEibFnK9/a0XwlQL6d2k+IJxFDeyk2OI8R9DxcTsZVT0+svm5ZvJEmaNo9Qu/Ma\nYmTUf8vsn0PEET5G3OyX9U1qo6jqfYXakNsRYn6u7FD4vTgCSV3E+zSk4vZmtp+u2/85cZ/Da4gh\nuI9nHm8jphmBaD18h7jD+3Gi5ZEdJvtj9r9R8WfpfaWu4OgpaeKy9z9URkftBP4H+8cqKl4I/C9i\nUr+vEvNZfYWJ3bkudYQtDWlqVC78f0VMy3EKEZd4EdHttIC4D+QFRIzjeaLVcUq7CypNhpWGNHFj\nddtjxOinlcT8S48SU4ucR1QqTxLxi+uIaeHfT7Q4mr2n1JOWEbNVPkht2uh6a9Pr26mNBCmS9zz2\nn/J5iOgrrkw1cXmDPJKkLjWLmFZ5iJiD5y5izvys5dTWNngLEeQrkncRMaokO73CEDG3jSSpC+V1\nTy0hLvxlYvz4tdQWX6lYQUyHDDER2yAxUiQv7+eoTZImSeoBeZXGAmI0SMUuDlzXoFma+ePkXZn2\n62cOhdpCMiUOXI5TktRBeUNuiwblWhky+GIiSPhrDfLvIbqtHiemwr4BeD37r/gmSeqQvEpjN3ER\nr1hEtBDGS7MwpZnTJO+RROxieyb9nUR31qPUVjDbSszNczR1U1QfeeSRYw8//HBO0SVJk7AdGG41\n02ziwj1EjC/PC4QvpRYIL5IX9g+EH0ptPYMjiEpmsEGeMU29VatWdboIUks8Z6cPTXqa8loa+4g5\ndTali/mVwH3A2en1K1KFsZwIej9FzOI5Xt4DKoDM9gnAnxCB8+fT5zyRU0ZJUpsUmUbkG+mRdUXd\n/jkt5K13RGb7+vRQB5TL5U4XQWqJ52z7eUe4qoaHW+6+lDrKc7b9enWitNTlJkmaDgMDA9CgjrCl\nIUkqzEpDVaVSqdNFkFriOdt+VhqSpMKMaUiSDmBMQ5I0aVYaqrJ/WL3Gc7b9rDQkSYUZ05AkHcCY\nhiRp0qw0VGX/sHrNmjWlTheh71hpSOpZd93V6RL0HysNVY2MjHS6CFJLhoZGOl2EvlNkanRJ6hql\nUjwAVq+uHR8ZiYemV5HRU8uANcRCSl8EPt0gzVrgVOBnwCiwrWDe84DPECv2/SQduxD4APAc8GHg\npgaf5+ipaVAqlWxtqKccdVSJhx4a6XQxZqSJjp6aBawjLv6LgffTeLnXo4i1vM8C1hfMuwj4NeD7\nmWOLgdPS8zLg8gJllNSnfvrTTpeg/+R1Ty0hlnEtp/1rgZXsv2zrCmBj2t5MrOk9Dzg8J+/ngI8B\nX82810rgGmK513LKv4TauuOaRrYy1Auy3VN7945w8cWxbfdUe+T9il8A7Mzs70rHiqSZP07elWn/\n7rr3mp+Oj/d5kqQOyWtpFA0ctHJn+YuBjxNdU0XyG7xoE2Ma6gXZFsXnP1/i4otHOlia/pNXaewm\nYg8Vi9i/JdAozcKUZk6TvEcCQ8D2TPo7gbc0ea/djQo2OjrK0NAQAIODgwwPD1cveJWb1Nxvbb+i\nW8rjvvt5+wcf3F3l6eX9yna5XGY8eS2E2cD9wMnAHmALEdDOxjSWA+ek56XEaKmlBfMCPAL8CjF6\najFwNRHHWADcQgTZ61sbjp6S+lT9kNtVq2LbmMbUajZ6Kq+lsY+oEDYRo6GuJC76Z6fXrwBuJCqM\nh4CngDNz8tbLXv3vBa5Lz/uAD2H3lKSM+sqhEghXezjLrapKxjTUpdKv3gbOoDZ480BeJybOWW4l\n9ayxsbGGDxht+poVxvSwpSGpZw0MgJeC6WFLQ5I0aVYaqsoOvZN6Q6nTBeg7VhqSetYZZ3S6BP3H\nmIYk6QDGNCRJk2aloSpjGuo1nrPtZ6UhSSrMmIYk6QDGNCTNOM471X5WGqqyf1i9ZvXqUqeL0Hes\nNCRJhRnTkNSznHtq+hjTkCRNWpFKYxmwA3gQOL9JmrXp9e3AcQXyfiKlvQu4ldoSr0PA08C29Li8\nQPk0RYxpqPeUOl2AvpNXacwC1hEX/8XEcq3H1KVZTizJejRwFrC+QN5LgWOBYeAGYFXm/R4iKp7j\niJX7JKkh555qv7xKYwlxES8DzwLXAivr0qygtnTWZmAQmJeT98lM/oOBxyZSeE0tV+1Tr9mwYaTT\nReg7eZXGAmBnZn9XOlYkzfycvJ8EfkCs13hJ5vjhRNdUCTg+p3ySpDbKqzSKjkuYyCisi4BXAxuA\nP0/H9hDxjeOAc4GrgUMm8N6aAGMa6jWes+03O+f13dSC1KTtXTlpFqY0cwrkhagYbkzbz6QHwFbg\nYSJWsrU+0+joKENDQwAMDg4yPDxc7V6pnEjut7Zf0S3lcd9999v7918qlSiXy4wnr4UwG7gfOJlo\nBWwhAtr3ZdIsB85Jz0uBNel5vLxHEyOqAP6AiH+cDhwKPA48BxwB3A68AXiirlzepyFJ02ii92ns\nIyqETcC9wJeIi/7Z6QHRSvgeEfS+gtqIp2Z5AT4F3EMMuR0BzkvHTyCG4m4Dvpw+o77CkCTAuac6\nwTvCVVUqlapNVqkXDAyUGBsb6XQxZiTvCJckTZotDUk9y7mnpo8tDUnSpFlpqCo79E7qDaVOF6Dv\nWGlI6lnOPdV+xjQkSQcwpiFJmjQrDVUZ01Cv8ZxtPysNSVJhxjQkSQcwpiFpxnHuqfaz0lCV/cPq\nNatXlzpdhL5jpSFJKsyYhqSe5dxT08eYhiRp0opUGsuAHcRKe+c3SbM2vb6dWN87L+8nUtq7gFvZ\nf1nYC1P6HcApBcqnKWJMQ72n1OkC9J28SmMWsI64+C8mlms9pi7NcuAoYgnXs4D1BfJeChwLDAM3\nAKvS8cXAael5GXB5gTJK6lPOPdV+eRfkJcQyrmXgWeBaYGVdmhXAxrS9GRgE5uXkfTKT/2DgsbS9\nErgmpS+n/EsKfxtNiqv2qdds2DDS6SL0ndk5ry8Admb2dwFvKZBmATA/J+8ngdOBp6lVDPOB7zR4\nL0lSF8hraRQdlzCRUVgXAa8GrgLWTEEZNEnGNNRrPGfbL6+lsZv9g9SLiF//46VZmNLMKZAX4Grg\nxnHea3ejgo2OjjI0NATA4OAgw8PD1e6Vyonkfmv7Fd1SHvfdd7+9f/+lUolyucx48loIs4H7gZOB\nPcAWIqB9XybNcuCc9LyUaDUszcl7NDFCCuAPiO6p04kA+NVpfwFwCxFkr29teJ+GJE2jZvdp5LU0\n9hEVwiZiNNSVxEX/7PT6FUQrYTkRtH4KODMnL8CngNcBzwEPAx9Mx+8FrkvP+4APYfeUpCYuvtj5\np9rNO8JVVSqVqk1WqRcMDJQYGxvpdDFmJO8IlyRNmi0NST3Luaemjy0NSdKkWWmoKjv0TuoNpU4X\noO9YaUjqWc491X7GNCRJBzCmIUmaNCsNVRnTUK/xnG0/Kw1JUmHGNCRJBzCmIWnGcd6p9rPSUJX9\nw+o1q1eXOl2EvmOlIUkqzJiGpJ7l3FPTx5iGJGnSilQay4AdxEp75zdJsza9vh04rkDezxALMm0H\nrgdelo4PAU8D29Lj8gLl0xQxpqHeU+p0AfpOXqUxC1hHXPwXE8u1HlOXZjmxJOvRwFnA+gJ5bwJe\nDxwLPABcmHm/h4iK5zhi5T5Jasi5p9ovr9JYQlzEy8CzwLXAyro0K4CNaXszMAjMy8l7M/B8Js/C\nCZZfU8hV+9RrNmwY6XQR+k5epbEA2JnZ35WOFUkzv0BegA8Q64xXHE50TZWA43PKJ0lqo7xKo+i4\nhImOwroIeAa4Ou3vARYRXVPnpuOHTPC91SJjGuo1nrPtNzvn9d3ERbxiEdFiGC/NwpRmTk7eUSIe\ncnLm2DPpAbAVeJiIlWytL9jo6ChDQ0MADA4OMjw8XO1eqZxI7re2X9Et5XHffffb+/dfKpUol8uM\nJ6+FMBu4n7iw7wG2EAHt+zJplgPnpOelwJr0PF7eZcBngROBxzLvdSjwOPAccARwO/AG4Im6cnmf\nhiRNo4nep7GPqBA2AfcCXyIu+menB0Q84ntE0PsKaiOemuUFuAw4mAiIZ4fWnkgMw90GfDl9Rn2F\nIUmAc091gneEq6pUKlWbrFIvGBgoMTY20ulizEjeES5JmjRbGpJ6lnNPTR9bGpKkSbPSUFV26J3U\nG0qdLkDfsdKQ1LOce6r9jGlIkg5gTEOSNGlWGqoypqFe4znbflYakqTCjGlIkg5gTEPSjOPcU+1n\npaEq+4fVa1avLnW6CH3HSkOSVJgxDUk9y7mnpo8xDUnSpBWpNJYBO4AHgfObpFmbXt9OrO+dl/cz\nxIJM24HrgZdlXrswpd8BnFKgfJoixjTUe0qdLkDfyas0ZgHriIv/YmK51mPq0iwHjiLW8j4LWF8g\n703A64FjgQeIioKU7rT0vIxY0c/WkKSGnHuq/fIuyEuIZVzLwLPAtcDKujQrgI1pezMwCMzLyXsz\n8Hwmz8K0vRK4JqUvp/xLWvlCmjhX7VOv2bBhpNNF6Dt5lcYCYGdmf1c6ViTN/AJ5AT5ArDNOyrOr\nQB5JUgfkVRpFxyVMdBTWRcAzwNVTUAZNkjEN9RrP2fabnfP6bmBRZn8R+7cEGqVZmNLMyck7SsRD\nTs55r92NCjY6OsrQ0BAAg4ODDA8PV7tXKieS+63tV3RLedx33/32/v2XSiXK5TLjyWshzAbuJy7s\ne4AtRED7vkya5cA56XkpsCY9j5d3GfBZ4ETgscx7LSZaHUuIbqlbiCB7fWvD+zQkaRpN9D6NfUSF\nsAm4F/gScdE/Oz0g4hHfI4LWVwAfyskLcBlwMBEQ30aMkiKluy49fyO9l7WDpIace6r9vCNcVaVS\nqdpklXrBwECJsbGRThdjRvKOcEnSpNnSkNSznHtq+tjSkCRNmpWGqrJD76TeUOp0AfqOlYakrjB3\nbnQ3tfKA1vPMndvZ79nrjGlI6grtik8YBynGmIYkadKsNFS1Zk2p00WQWmIcrv2sNFR1112dLoGk\nbmdMQ1XLlsE3v9npUqhfGdPoLs1iGnmz3GqGK5XiAbBpU20un5GReEhSli0NVc2bV+KHPxzpdDHU\npybSApjIfGm2NIqxpaGG1qyBG26I7b17a62Ld70LPvKRjhVLUpeypaGq4WGD4eocYxrdxZaGqgYG\nmv1WuI2BgZOa5rOillRkyO0yYAfwIHB+kzRr0+vbgeMK5H0v8F3gOeDNmeNDwNPEwkzZxZk0hcbG\nxho+xnvNCkPdyPs02i+vpTELWAe8nVir+++Br3Hgcq9HAUcDbwHWE8u9jpf3HuA3iZX+6j3E/hWP\nJKlL5LU0lhAX8TLwLHAtsLIuzQpgY9reDAwC83Ly7gAemFTJNQ1GOl0AqSWuNNl+eZXGAmBnZn9X\nOlYkzfwCeRs5nOiaKgHHF0gvSWqTvEqjaEf2VI3C2gMsIrqnzgWuBg6ZovdWrlKnCyC1xJhG++XF\nNHYTF/GKRUSLYbw0C1OaOQXy1nsmPQC2Ag8TsZKt9QlHR0cZGhoCYHBwkOHh4WpTtXIiud/a/hln\n0FXlcb+/9ivdo9P9eVCiVOr89+22/cp2uVxmPHkthNnA/cDJRCtgC/B+DgyEn5OelwJr0nORvLcB\nHwXuTPuHAo8To6qOAG4H3gA8UVcu79OQZhjv0+guE71PYx9RIWwiRkNdSVz0z06vXwHcSFQYDwFP\nAWfm5IUYObWWqCS+TsQwTgVOBFYTgfPn0+fUVxiSpA7xjnBVlSYwj480VZx7qru4cp8kadJsaUjq\nCsY0uostDeWqrKUhSc1Yaahq9epSp4sgtSQ7XFTtYaUhSSrMmIaq7OtVJxnT6C7GNCRJk2aloYxS\npwsgtcSYRvtZaaiqMveUJDVjTENSVzCm0V2MaUiSJs1KQ1X2D6vXeM62n5WGJKkwYxqSuoIxje5i\nTEO5nHtKUp4ilcYyYAfwIHB+kzRr0+vbifW98/K+F/gusULfm+ve68KUfgdwSoHyaYo495R6jTGN\n9surNGYB64iL/2JiudZj6tIsB44i1vI+C1hfIO89xOp9t9e912LgtPS8DLi8QBklSW2Sd0FeQizj\nWiaWYL0WWFmXZgWwMW1vBgaBeTl5dwAPNPi8lcA1KX055V9S7Kto8kY6XQCpJa402X55lcYCYGdm\nf1c6ViTN/AJ5681P6VrJI0lqk7xKo+gYg+kcheU4h7YpdboAUkuMabTf7JzXdwOLMvuL2L8l0CjN\nwpRmToG8eZ+3MB07wOjoKENDQwAMDg4yPDxcbapWTiT3W9uvzD3VLeVxv7/2K92j0/15UKJU6vz3\n7bb9yna5XGY8eS2E2cD9wMnAHmALEdC+L5NmOXBOel4KrEnPRfLeBnwUuDPtLwauJuIYC4BbiCB7\nfWvD+zSkGcb7NLpLs/s08loa+4gKYRMxGupK4qJ/dnr9CuBGosJ4CHgKODMnL8TIqbXAocDXgW3A\nqcC9wHXpeR/wIeyekqSu4R3hqiqVSpkmvNReE2kBTOSctaVRjHeES5ImzZaGpK5gTKO72NJQLuee\nkpTHSkNVzj2lXpMdLqr2sNKQJBVmTENV9vWqk4xpdBdjGpKkSbPSUEap0wWQWmJMo/2sNGaouXOj\nGd7KA1rPM3duZ7+npPYypjFD2T+snjPQxsuRJ22uic49JUltMcBY+37oTP/HzFh2T6nK/mH1Gs/Z\n9rPSkCQVZkxjhjKmoV7jOdtdvE9DkjRpRSqNZcAO4EHg/CZp1qbXtwPHFcg7F7gZeAC4CRhMx4eA\np4lFmbYBlxcon6aI/cPqNZ6z7ZdXacwC1hEX/8XEcq3H1KVZTizJejRwFrC+QN4LiErjtcCtab/i\nIaLiOY5YuU+S1CXyKo0lxEW8DDwLXAusrEuzAtiYtjcTrYZ5OXmzeTYC75pg+TWFXLVPvcZztv3y\nKo0FwM7M/q50rEia+ePkfSWwN23vTfsVhxNdUyXg+JzySZLaKK/SKDrGoMgorIEm7zeWOb4HWER0\nTZ0LXA0cUrAMmiT7h9VrPGfbL++O8N3ERbxiEdFiGC/NwpRmToPju9P2XqIL64fAq4BH0/Fn0gNg\nK/AwESvZWl+w0dFRhoaGABgcHGR4eLjaVK2cSP2+D62mp6vK735/7bd6vk50H0qUSp3/vt22X9ku\nl8uMJ6+FMBu4HziZaAVsIQLa92XSLAfOSc9LgTXpeby8lwI/Bj5NBMEH0/OhwOPAc8ARwO3AG4An\n6srlfRo5HPOuXuM5210mOvfUPqJC2ESMhrqSuOifnV6/AriRqDAeAp4CzszJC3AJcB3w74hA+fvS\n8ROAPyEC58+nz6mvMCRJHeId4TPURH5NlUqlTBN++j5HasRztrt4R7gkadJsacxQ9g+r17RrOY2X\nvxx+8pP2fFYvcz0NSV1tIj8+/NHSfnZPqSo79E7qDaVOF6DvWGlIkgozpjFDGdNQP/D8mz7GNPrM\nGANt+UkwlvmvpJnP7qkZaoCx+AnWwqN0220t5xmwwlAHnXFGqdNF6DtWGpJ61uhop0vQf4xpzFDG\nNCRNhneES5ImzUpDVd6noV7jOdt+VhqSpMIccjuDtT6Xz0jLn/Hyl7ecRZoypdIILhPeXgbCVWVQ\nW73Gc3b6TCYQvgzYATwInN8kzdr0+nZife+8vHOBm4EHgJuIlfsqLkzpdwCnFCifpkyp0wWQWlTq\ndAH6Tl6lMQtYR1z8FxPLtR5Tl2Y5cBSxlvdZwPoCeS8gKo3XAremfVK609LzMuDyAmXUlLmr0wWQ\nWuQ52255F+QlxDKuZWIJ1muBlXVpVgAb0/ZmotUwLydvNs9G4F1peyVwTUpfTvmXtPKFNBmurKvu\nNDAw0PABf9j0tYF2LdDRZ/IqjQXAzsz+rnSsSJr54+R9JbA3be9N+6Q8u3I+T1KfGRsba/hYtWpV\n09eMe06PvNFTRf/Vi1TpA03ebyznc/w/P8XG+wU2MLC66Wv+EarblMvlTheh7+RVGruBRZn9Rezf\nEmiUZmFKM6fB8d1pey/RhfVD4FXAo+O8124OtH1gYODYnLJritncVzfauHFjfiJNxPaJZJoNPAwM\nAS8gok6NAuE3pu2lwHcK5L2U2miqC4BL0vbilO4FwOEpv1cqSeohpwL3E0HpC9Oxs9OjYl16fTvw\n5py8EENub6HxkNuPp/Q7gHdM1ZeQJEmSJE3Sh4F7gZ8AH5tA/r+d2uJIk/LLRLf1ncARTOz8XA2c\nPJWFkmaS+4jhy9JMcAFwUacLIc1Unwd+AdwNfAS4LB1/L3AP8YvtW+nY64kbMrcR8agj0/GfpucB\n4DMp393A+9LxEWL+hi8TFdRfTccX0YwxRJwnXwD+EdgEvIg4h34lpTkUeKRB3uXA/yNGZN6ajlXO\nz1cBtxPn7z3A24h7zzZQO2f/U0q7AXhP2j4Z2Jpev5IYeANxQ/HFRIvmbuB1rX5RqVc9Qgw2OIOY\nFwzij+BVaful6Xkt8DtpezbxhwzwZHp+DzFQYQD4JeD7xFDpEeL28fnptW8Tf7BSI0PELA9vSvtf\nAn4XuI3awJlmlQbAKuDczH7l/DyPGDgDcR4eTFRCN2XSVs71q4B3E+f4D4ipjyBmpKhULI8Av5+2\nPwj8Rd4X60fO6zRzDWQeEP3AG4F/T+3+nL8j/ug+Rvxh/7zuPY4HriZusHyUaKH8q7S/BdiTtu9K\n+aVmHiF+uED8kh9qMX+jofdbgDOJSuVNRAvkYSLusZYYfflkJv0A0Xp4hBihCfE3cUImzfXpeesE\nytgXrDRmtuwt3B8E/oi4efJOoiVyDfAbwNPEvTYnNchf/8daec9fZI49h2uzaHyNzpd9xMSmUGvl\nQrQKtgH/J+c97wB+lbgBeANwOtECPpbo+vqPwBfr8tRPa1A/U0WlnJ7TTVhpzGzZC/6RxC+zVcCP\niLvtDyf6cS8Dvgq8sS7/HcSswwcBhxG/yLbgDZeaGmVqMY3fyhw/k1hi4ddz8r+aOJe/mB5vBl5B\nVETXA3/M/ks1jBH3jQ1Ri9+dTi3GpwKsSWemsboHxF34RxMX/FuIroLziT+aZ4lg4ycz+QG+AryV\nCJKPAf+Z6KY6hgN/sTkxlcbT6Hz5M+A6YkmFrzdI0yx/Zfsk4KPE+fsk8HvEBKdXUftBfAH7+wVR\nKX2ZuP5tIQaPNPoMz2lJkiRJkiRJkiRJkiRJkiRJkiRJmqG8wVaSZriXEHcw30VMwf0+YiLHb6dj\nm1OaFxFiTxIpAAABF0lEQVR3J99NTIA3kvKPAl8jpvq+DfgXwF+mfFuBFW35FpKktngPsTZExUuJ\n2VUr8ygdTMx/dB61CfNeR0wt/0Ki0tgJDKbX/pSYKpx07H6iIpEkzQBHE9NrX0JMH/9G4P82SHc9\ntdYFxIJBbyTWOfnLzPF/IFos29KjjAsAqUvZnyq17kFi9tR3Av+V6GJqptmMwE/V7b87va/U1Zwa\nXWrdq4gFq/4nMVPrEmJFw3+ZXj+E6J66g1q302uJqbx3cGBFsgn4cGb/OKQuZUtDat0bibXTnwee\nIRa4OohYl+TFwM+AtwOXA+uJQPg+olvqWQ6cdvsTwJqU7iDgexgMlyRJkiRJkiRJkiRJkiRJkiRJ\nkiRJEsA/A3sng0v+IomuAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1129,7 +1129,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1140,7 +1140,7 @@ "data": { "image/png": "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\n/wfC21DgNNvIcQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2345,7 +2345,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2356,7 +2356,7 @@ "data": { "image/png": "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\niUSS+/w/t3PPI3Lev3cAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2383,7 +2383,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2394,7 +2394,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 7059465372..2687c13267 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -393,7 +393,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTQ6MjI6MjEtMDQ6MDCbwpaZAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDE0OjIyOjIxLTA0OjAw6p8uJQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTY6MDk6NTgtMDQ6MDDETy0uAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDE2OjA5OjU4LTA0OjAwtRKVkgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -604,7 +604,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 14:22:21\n", + " Date/Time: 2015-10-08 16:09:59\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -660,20 +660,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3800E-01 seconds\n", - " Reading cross sections = 1.0100E-01 seconds\n", - " Total time in simulation = 1.5663E+01 seconds\n", - " Time in transport only = 1.5651E+01 seconds\n", - " Time in inactive batches = 2.2110E+00 seconds\n", - " Time in active batches = 1.3452E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 4.0200E-01 seconds\n", + " Reading cross sections = 9.5000E-02 seconds\n", + " Total time in simulation = 1.5664E+01 seconds\n", + " Time in transport only = 1.5652E+01 seconds\n", + " Time in inactive batches = 2.3940E+00 seconds\n", + " Time in active batches = 1.3270E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 1.6114E+01 seconds\n", - " Calculation Rate (inactive) = 5653.55 neutrons/second\n", - " Calculation Rate (active) = 2787.69 neutrons/second\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.6076E+01 seconds\n", + " Calculation Rate (inactive) = 5221.39 neutrons/second\n", + " Calculation Rate (active) = 2825.92 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 55abf010a2..c816d1caaf 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -1,4 +1,3 @@ -import copy import sys import numpy as np @@ -116,31 +115,19 @@ class StatePoint(object): @property def cmfd_balance(self): - if self.cmfd_on: - return self._f['cmfd/cmfd_balance'].value - else: - return None + return self._f['cmfd/cmfd_balance'].value if self.cmfd_on else None @property def cmfd_dominance(self): - if self.cmfd_on: - return self._f['cmfd/cmfd_dominance'].value - else: - return None + return self._f['cmfd/cmfd_dominance'].value if self.cmfd_on else None @property def cmfd_entropy(self): - if self.cmfd_on: - return self._f['cmfd/cmfd_entropy'].value - else: - return None + return self._f['cmfd/cmfd_entropy'].value if self.cmfd_on else None @property def cmfd_indices(self): - if self.cmfd_on: - return self._f['cmfd/indices'].value - else: - return None + return self._f['cmfd/indices'].value if self.cmfd_on else None @property def cmfd_src(self): @@ -152,10 +139,7 @@ class StatePoint(object): @property def cmfd_srccmp(self): - if self.cmfd_on: - return self._f['cmfd/cmfd_srccmp'].value - else: - return None + return self._f['cmfd/cmfd_srccmp'].value if self.cmfd_on else None @property def current_batch(self): @@ -323,10 +307,7 @@ class StatePoint(object): @property def source(self): - if self.source_present: - return self._f['source_bank'].value - else: - return None + return self._f['source bank'].value if self.source_present else None @property def source_present(self): @@ -463,10 +444,7 @@ class StatePoint(object): @property def with_summary(self): - if self.summary is None: - return False - else: - return True + return False if self.summary is None else True def get_tally(self, scores=[], filters=[], nuclides=[], name=None, id=None, estimator=None): From 514eb2d40bbf10a204040797d8d6ed16bcdf4099 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 8 Oct 2015 19:17:41 -0400 Subject: [PATCH 309/519] Fixed bug in StatePoint.source property getter --- openmc/mgxs/mgxs.py | 22 +++++++++++----------- openmc/statepoint.py | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index a41dcb5b26..c997381f7c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -479,7 +479,7 @@ class MultiGroupXS(object): special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Return the macro or micro cross section in units of cm^-1 or barns order_groups: {'increasing', 'decreasing'} Return the cross section indexed according to increasing (default) @@ -743,7 +743,7 @@ class MultiGroupXS(object): The special string 'all' (default) will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Return the macro or micro cross section in units of cm^-1 or barns """ @@ -836,7 +836,7 @@ class MultiGroupXS(object): Filename for the HDF5 file (default is 'mgxs') directory : str Directory for the HDF5 file (default is 'mgxs') - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Store the macro or micro cross section in units of cm^-1 or barns append : boolean If true, appends to an existing HDF5 file with the same filename @@ -868,7 +868,7 @@ class MultiGroupXS(object): if not os.path.exists(directory): os.makedirs(directory) - filename = directory + '/' + filename + '.h5' + filename = os.path.join(directory, filename + '.h5') filename = filename.replace(' ', '-') if append and os.path.isfile(filename): @@ -958,7 +958,7 @@ class MultiGroupXS(object): The format for the exported data file groups : Iterable of Integral or 'all' Energy groups of interest - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Store the macro or micro cross section in units of cm^-1 or barns """ @@ -972,7 +972,7 @@ class MultiGroupXS(object): if not os.path.exists(directory): os.makedirs(directory) - filename = directory + '/' + filename + filename = os.path.join(directory, filename) filename = filename.replace(' ', '-') # Get a Pandas DataFrame for the data @@ -1028,7 +1028,7 @@ class MultiGroupXS(object): The special string 'all' (default) will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Return macro or micro cross section in units of cm^-1 or barns summary : None or Summary An optional Summary object to be used to construct columns for @@ -1559,7 +1559,7 @@ class ScatterMatrixXS(MultiGroupXS): special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Return the macro or micro cross section in units of cm^-1 or barns order_groups: {'increasing', 'decreasing'} Return the cross section indexed according to increasing (default) @@ -1684,7 +1684,7 @@ class ScatterMatrixXS(MultiGroupXS): The special string 'all' (default) will report the cross sections for all nuclides in the spatial domain. The special string 'sum' will report the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Return the macro or micro cross section in units of cm^-1 or barns """ @@ -1881,7 +1881,7 @@ class Chi(MultiGroupXS): special string 'all' (default) will return the cross sections for all nuclides in the spatial domain. The special string 'sum' will return the cross section summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} This parameter is not relevant for chi but is included here to mirror the parent MultiGroupXS.get_xs(...) class method order_groups: {'increasing', 'decreasing'} @@ -2010,7 +2010,7 @@ class Chi(MultiGroupXS): The special string 'all' (default) will include the cross sections for all nuclides in the spatial domain. The special string 'sum' will include the cross sections summed over all nuclides. - xs_type: {'macro' or 'micro'} + xs_type: {'macro', 'micro'} Return macro or micro cross section in units of cm^-1 or barns summary : None or Summary An optional Summary object to be used to construct columns for diff --git a/openmc/statepoint.py b/openmc/statepoint.py index c816d1caaf..3a6f7ed568 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -307,7 +307,7 @@ class StatePoint(object): @property def source(self): - return self._f['source bank'].value if self.source_present else None + return self._f['source_bank'].value if self.source_present else None @property def source_present(self): From 3445b4aceefd27b81b80066b5748ac751de4501c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 8 Oct 2015 19:26:16 -0400 Subject: [PATCH 310/519] Renamed MultiGroupXS as MGXS --- .../examples/multi-group-cross-sections.ipynb | 871 ++---------------- openmc/mgxs/mgxs.py | 46 +- 2 files changed, 85 insertions(+), 832 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 09a48a7272..70fdbfe117 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -287,7 +287,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MultiGroupXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of generic and abstract `MultiGroupXS` class:\n", + "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of generic and abstract `MGXS` class:\n", "\n", "* `TotalXS`\n", "* `TransportXS`\n", @@ -323,7 +323,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we must instruct our multi-group cross section objects to generate the tallies needed to calculate each of them in OpenMC. This can be done with the `MultiGroupXS.create_tallies()` routine." + "Next, we must instruct our multi-group cross section objects to generate the tallies needed to calculate each of them in OpenMC. This can be done with the `MGXS.create_tallies()` routine." ] }, { @@ -437,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": { "collapsed": false }, @@ -463,7 +463,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 16:26:35\n", + " Date/Time: 2015-10-08 19:25:10\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -533,55 +533,8 @@ " 42/1 1.11114 1.16491 +/- 0.00529\n", " 43/1 1.14227 1.16423 +/- 0.00517\n", " 44/1 1.14104 1.16355 +/- 0.00506\n", - " 45/1 1.16756 1.16366 +/- 0.00492\n", - " 46/1 1.13065 1.16274 +/- 0.00487\n", - " 47/1 1.11251 1.16139 +/- 0.00492\n", - " 48/1 1.14731 1.16101 +/- 0.00481\n", - " 49/1 1.16691 1.16117 +/- 0.00469\n", - " 50/1 1.19679 1.16206 +/- 0.00465\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 3.9300E-01 seconds\n", - " Reading cross sections = 9.0000E-02 seconds\n", - " Total time in simulation = 1.2399E+01 seconds\n", - " Time in transport only = 1.2391E+01 seconds\n", - " Time in inactive batches = 1.8730E+00 seconds\n", - " Time in active batches = 1.0526E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.2802E+01 seconds\n", - " Calculation Rate (inactive) = 13347.6 neutrons/second\n", - " Calculation Rate (active) = 9500.28 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.16131 +/- 0.00453\n", - " k-effective (Track-length) = 1.16206 +/- 0.00465\n", - " k-effective (Absorption) = 1.16096 +/- 0.00364\n", - " Combined k-effective = 1.16120 +/- 0.00325\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" + " 45/1 1.16756 1.16366 +/- 0.00492\n" ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -606,7 +559,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "collapsed": false }, @@ -625,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "collapsed": false }, @@ -645,13 +598,13 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "# Load the tallies from the statepoint into each MultiGroupXS object\n", + "# Load the tallies from the statepoint into each MGXS object\n", "transport.load_from_statepoint(sp)\n", "nufission.load_from_statepoint(sp)\n", "nuscatter.load_from_statepoint(sp)\n", @@ -667,19 +620,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1486: RuntimeWarning: invalid value encountered in divide\n" - ] - } - ], + "outputs": [], "source": [ "transport.compute_xs()\n", "nufission.compute_xs()\n", @@ -710,34 +655,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 7.69e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t6.59e-04 +/- 2.97e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t8.95e-03 +/- 5.12e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.45e-02 +/- 7.10e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.71e-02 +/- 1.02e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.86e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 6.67e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t2.38e-01 +/- 7.71e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "nufission.print_xs()" ] @@ -751,141 +673,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
63111total0.0769700.001012
62112total0.0878760.000344
61113total0.0004180.000023
60114total0.0000000.000000
59115total0.0000000.000000
58116total0.0000000.000000
57117total0.0000000.000000
56118total0.0000000.000000
55121total0.0000000.000000
54122total0.2664990.001265
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "63 1 1 1 total 0.076970 0.001012\n", - "62 1 1 2 total 0.087876 0.000344\n", - "61 1 1 3 total 0.000418 0.000023\n", - "60 1 1 4 total 0.000000 0.000000\n", - "59 1 1 5 total 0.000000 0.000000\n", - "58 1 1 6 total 0.000000 0.000000\n", - "57 1 1 7 total 0.000000 0.000000\n", - "56 1 1 8 total 0.000000 0.000000\n", - "55 1 2 1 total 0.000000 0.000000\n", - "54 1 2 2 total 0.266499 0.001265" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = nuscatter.get_pandas_dataframe()\n", "df.head(10)" @@ -900,7 +692,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": true }, @@ -918,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": true }, @@ -946,24 +738,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", - "because the backend has already been chosen;\n", - "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", - "or matplotlib.backends is imported for the first time.\n", - "\n", - " warnings.warn(_use_error_msg)\n" - ] - } - ], + "outputs": [], "source": [ "# Import OpenMOC and the OpenMOC/OpenCG compatibility module\n", "import openmoc\n", @@ -985,7 +764,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1019,148 +798,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728847\tres = 4.513E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.695633\tres = 2.844E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.701456\tres = 3.194E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.722831\tres = 3.132E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.085609\tres = 6.273E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.091436\tres = 5.804E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.101877\tres = 4.961E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.110860\tres = 4.231E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.114861\tres = 3.905E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.118563\tres = 3.602E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.121986\tres = 3.321E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.125149\tres = 3.060E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.128069\tres = 2.819E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.133248\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.135538\tres = 2.197E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.137648\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.139590\tres = 1.858E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.141377\tres = 1.707E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.144531\tres = 1.440E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.147195\tres = 1.213E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.148365\tres = 1.113E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.150425\tres = 9.356E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.151329\tres = 8.574E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.152157\tres = 7.856E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.152916\tres = 7.196E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.153612\tres = 6.590E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.154249\tres = 6.033E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.154832\tres = 5.522E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.155366\tres = 5.053E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.155855\tres = 4.623E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.156302\tres = 4.229E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.156710\tres = 3.866E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.157084\tres = 3.535E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.157426\tres = 3.230E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.157738\tres = 2.952E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158023\tres = 2.697E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.158284\tres = 2.464E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.158522\tres = 2.251E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.158739\tres = 2.055E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.158937\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.159119\tres = 1.713E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.159284\tres = 1.564E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.159435\tres = 1.428E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.159573\tres = 1.301E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.159813\tres = 1.083E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.159917\tres = 9.880E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.160013\tres = 9.009E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.160100\tres = 8.222E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.160179\tres = 7.487E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.160251\tres = 6.824E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.160317\tres = 6.223E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.160376\tres = 5.675E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.160431\tres = 5.174E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.160481\tres = 4.715E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.160527\tres = 4.298E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.160568\tres = 3.910E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.160605\tres = 3.561E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.160640\tres = 3.242E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.160671\tres = 2.960E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.160699\tres = 2.689E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.160725\tres = 2.452E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.160749\tres = 2.232E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.160770\tres = 2.034E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.160790\tres = 1.855E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.160807\tres = 1.687E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.160824\tres = 1.538E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.160838\tres = 1.399E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.160852\tres = 1.280E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.160864\tres = 1.149E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.160875\tres = 1.061E-05\n" - ] - } - ], + "outputs": [], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", @@ -1181,21 +823,11 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.161200\n", - "openmoc keff = 1.160875\n", - "bias [pcm]: -32.5\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1244,7 +876,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1278,7 +910,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1304,7 +936,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1333,22 +965,11 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -1382,22 +1003,11 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", @@ -1423,7 +1033,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1450,7 +1060,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1480,7 +1090,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1520,22 +1130,11 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Delete old HDF5 files\n", "!rm *.h5\n", @@ -1561,7 +1160,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1582,7 +1181,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1618,46 +1217,11 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 5.91e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 4.03e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.48e+01 +/- 5.56e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.84e+01 +/- 8.48e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 1.25e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 7.98e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 5.73e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 6.74e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 8.28e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t4.75e-04 +/- 7.97e+00%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 7.56e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.22e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 7.97e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 5.72e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" @@ -1672,34 +1236,11 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 6.42e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.52e-03 +/- 3.96e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 5.56e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.32e-02 +/- 8.48e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.25e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 7.98e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 5.73e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='macro', nuclides='sum')" @@ -1714,141 +1255,11 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211O-161.5600980.017801
1271000211H-10.2348770.010096
1241000212O-160.2882360.004397
1251000212H-11.5878150.007847
1221000213O-160.0000000.000000
1231000213H-10.0101220.000513
1201000214O-160.0000000.000000
1211000214H-10.0000000.000000
1181000215O-160.0000000.000000
1191000215H-10.0000000.000000
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 O-16 1.560098 0.017801\n", - "127 10002 1 1 H-1 0.234877 0.010096\n", - "124 10002 1 2 O-16 0.288236 0.004397\n", - "125 10002 1 2 H-1 1.587815 0.007847\n", - "122 10002 1 3 O-16 0.000000 0.000000\n", - "123 10002 1 3 H-1 0.010122 0.000513\n", - "120 10002 1 4 O-16 0.000000 0.000000\n", - "121 10002 1 4 H-1 0.000000 0.000000\n", - "118 10002 1 5 O-16 0.000000 0.000000\n", - "119 10002 1 5 H-1 0.000000 0.000000" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", @@ -1864,7 +1275,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1892,22 +1303,11 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create plot of the H-1 scattering matrix\n", "fig = plt.subplot(121)\n", @@ -1932,7 +1332,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1954,133 +1354,22 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttransport\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 5.85e-01%\n", - "\n", - "\tNuclide =\tO-16\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", - "\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "condense_xs.print_xs()" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
3100001U-2389.5893230.038756
4100001O-163.1591010.012939
5100001U-23521.0952560.257787
0100002U-23811.1788440.065428
1100002O-163.8000270.024538
2100002U-235485.5135302.418761
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-238 9.589323 0.038756\n", - "4 10000 1 O-16 3.159101 0.012939\n", - "5 10000 1 U-235 21.095256 0.257787\n", - "0 10000 2 U-238 11.178844 0.065428\n", - "1 10000 2 O-16 3.800027 0.024538\n", - "2 10000 2 U-235 485.513530 2.418761" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", "df" @@ -2102,7 +1391,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": { "collapsed": true }, @@ -2124,7 +1413,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": { "collapsed": false }, @@ -2172,7 +1461,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": { "collapsed": false }, @@ -2200,21 +1489,11 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.227616\n", - "openmoc keff = 1.225325\n", - "bias [pcm]: -229.1\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -2235,27 +1514,11 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:633: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n" - ] - } - ], + "outputs": [], "source": [ "su.make_opencg_geometry()\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", @@ -2292,7 +1555,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": { "collapsed": false }, @@ -2310,21 +1573,11 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.227616\n", - "openmoc keff = 1.227096\n", - "bias [pcm]: -52.0\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index c997381f7c..579557ae83 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -30,7 +30,7 @@ DOMAINS = [openmc.Cell, openmc.Material] -class MultiGroupXS(object): +class MGXS(object): """A multi-group cross section for some energy group structure within some spatial domain. @@ -322,7 +322,7 @@ class MultiGroupXS(object): def create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross section. - This is a helper method for MultiGroupXS subclasses to create tallies + This is a helper method for MGXS subclasses to create tallies for input file generation. The tallies are stored in the tallies dict. This method is called by each subclass' create_tallies(...) method which define the parameters given to this parent class method. @@ -585,8 +585,8 @@ class MultiGroupXS(object): Returns ------- - MultiGroupXS - A new MultiGroupXS condensed to the group structure of interest + MGXS + A new MGXS condensed to the group structure of interest """ @@ -603,7 +603,7 @@ class MultiGroupXS(object): cv.check_value('lower coarse energy', coarse_groups.group_edges[0], [self.energy_groups.group_edges[0]]) - # Clone this MultiGroupXS to initialize the condensed version + # Clone this MGXS to initialize the condensed version condensed_xs = copy.deepcopy(self) condensed_xs.energy_groups = coarse_groups @@ -664,8 +664,8 @@ class MultiGroupXS(object): Returns ------- - MultiGroupXS - A new MultiGroupXS averaged across the subdomains of interest + MGXS + A new MGXS averaged across the subdomains of interest Raises ------ @@ -688,7 +688,7 @@ class MultiGroupXS(object): else: subdomains = [0] - # Clone this MultiGroupXS to initialize the subdomain-averaged version + # Clone this MGXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) avg_xs.domain_type = 'cell' @@ -931,13 +931,13 @@ class MultiGroupXS(object): average = average.squeeze() std_dev = std_dev.squeeze() - # Add MultiGroupXS results data to the HDF5 group + # Add MGXS results data to the HDF5 group nuclide_group.require_dataset('average', dtype=np.float64, shape=average.shape, data=average) nuclide_group.require_dataset('std. dev.', dtype=np.float64, shape=std_dev.shape, data=std_dev) - # Close the MultiGroup results HDF5 file + # Close the results HDF5 file xs_results.close() def export_xs_data(self, filename='mgxs', directory='mgxs', @@ -1013,7 +1013,7 @@ class MultiGroupXS(object): def get_pandas_dataframe(self, groups='all', nuclides='all', xs_type='macro', summary=None): - """Build a Pandas DataFrame for the MultiGroupXS data. + """Build a Pandas DataFrame for the MGXS data. This method leverages the Tally.get_pandas_dataframe(...) method, but renames the columns with terminology appropriate for cross section data. @@ -1129,7 +1129,7 @@ class MultiGroupXS(object): return df -class TotalXS(MultiGroupXS): +class TotalXS(MGXS): """A total multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1169,7 +1169,7 @@ class TotalXS(MultiGroupXS): super(TotalXS, self).compute_xs() -class TransportXS(MultiGroupXS): +class TransportXS(MGXS): """A transport-corrected total multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1241,7 +1241,7 @@ class TransportXS(MultiGroupXS): super(TransportXS, self).compute_xs() -class AbsorptionXS(MultiGroupXS): +class AbsorptionXS(MGXS): """An absorption multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1281,7 +1281,7 @@ class AbsorptionXS(MultiGroupXS): super(AbsorptionXS, self).compute_xs() -class CaptureXS(MultiGroupXS): +class CaptureXS(MGXS): """A capture multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1321,7 +1321,7 @@ class CaptureXS(MultiGroupXS): super(CaptureXS, self).compute_xs() -class FissionXS(MultiGroupXS): +class FissionXS(MGXS): """A fission multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1360,7 +1360,7 @@ class FissionXS(MultiGroupXS): super(FissionXS, self).compute_xs() -class NuFissionXS(MultiGroupXS): +class NuFissionXS(MGXS): """A fission production multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1400,7 +1400,7 @@ class NuFissionXS(MultiGroupXS): super(NuFissionXS, self).compute_xs() -class ScatterXS(MultiGroupXS): +class ScatterXS(MGXS): """A scatter multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1439,7 +1439,7 @@ class ScatterXS(MultiGroupXS): super(ScatterXS, self).compute_xs() -class NuScatterXS(MultiGroupXS): +class NuScatterXS(MGXS): """A nu-scatter multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1479,7 +1479,7 @@ class NuScatterXS(MultiGroupXS): super(NuScatterXS, self).compute_xs() -class ScatterMatrixXS(MultiGroupXS): +class ScatterMatrixXS(MGXS): """A scattering matrix multi-group cross section.""" def __init__(self, domain=None, domain_type=None, @@ -1813,7 +1813,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): super(ScatterMatrixXS, self).create_tallies(scores, filters, keys, estimator) -class Chi(MultiGroupXS): +class Chi(MGXS): """The fission spectrum.""" def __init__(self, domain=None, domain_type=None, @@ -1883,7 +1883,7 @@ class Chi(MultiGroupXS): return the cross section summed over all nuclides. xs_type: {'macro', 'micro'} This parameter is not relevant for chi but is included here to - mirror the parent MultiGroupXS.get_xs(...) class method + mirror the parent MGXS.get_xs(...) class method order_groups: {'increasing', 'decreasing'} Return the cross section indexed according to increasing (default) or decreasing energy groups (decreasing or increasing energies) @@ -1995,7 +1995,7 @@ class Chi(MultiGroupXS): def get_pandas_dataframe(self, groups='all', nuclides='all', xs_type='macro', summary=None): - """Build a Pandas DataFrame for the MultiGroupXS data. + """Build a Pandas DataFrame for the MGXS data. This method leverages the Tally.get_pandas_dataframe(...) method, but renames the columns with terminology appropriate for cross section data. From 41a9ede62765630b9d10685f1c119a4612dc8941 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 8 Oct 2015 19:58:39 -0400 Subject: [PATCH 311/519] Implemented new static factory MGXS.get_mgxs(...) method --- .../examples/multi-group-cross-sections.ipynb | 450 ++++++++++++++++-- openmc/mgxs/mgxs.py | 92 +++- 2 files changed, 505 insertions(+), 37 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 70fdbfe117..652c21a116 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -437,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -463,7 +463,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 19:25:10\n", + " Date/Time: 2015-10-08 19:56:45\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -533,8 +533,55 @@ " 42/1 1.11114 1.16491 +/- 0.00529\n", " 43/1 1.14227 1.16423 +/- 0.00517\n", " 44/1 1.14104 1.16355 +/- 0.00506\n", - " 45/1 1.16756 1.16366 +/- 0.00492\n" + " 45/1 1.16756 1.16366 +/- 0.00492\n", + " 46/1 1.13065 1.16274 +/- 0.00487\n", + " 47/1 1.11251 1.16139 +/- 0.00492\n", + " 48/1 1.14731 1.16101 +/- 0.00481\n", + " 49/1 1.16691 1.16117 +/- 0.00469\n", + " 50/1 1.19679 1.16206 +/- 0.00465\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.5500E-01 seconds\n", + " Reading cross sections = 9.0000E-02 seconds\n", + " Total time in simulation = 1.3254E+01 seconds\n", + " Time in transport only = 1.3238E+01 seconds\n", + " Time in inactive batches = 1.8670E+00 seconds\n", + " Time in active batches = 1.1387E+01 seconds\n", + " Time synchronizing fission bank = 8.0000E-03 seconds\n", + " Sampling source sites = 7.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.3719E+01 seconds\n", + " Calculation Rate (inactive) = 13390.5 neutrons/second\n", + " Calculation Rate (active) = 8781.94 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.16131 +/- 0.00453\n", + " k-effective (Track-length) = 1.16206 +/- 0.00465\n", + " k-effective (Absorption) = 1.16096 +/- 0.00364\n", + " Combined k-effective = 1.16120 +/- 0.00325\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -559,7 +606,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -578,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -598,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -620,11 +667,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1486: RuntimeWarning: invalid value encountered in divide\n" + ] + } + ], "source": [ "transport.compute_xs()\n", "nufission.compute_xs()\n", @@ -655,11 +710,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 7.69e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t6.59e-04 +/- 2.97e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t8.95e-03 +/- 5.12e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.45e-02 +/- 7.10e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.71e-02 +/- 1.02e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.86e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 6.67e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t2.38e-01 +/- 7.71e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "nufission.print_xs()" ] @@ -673,11 +751,141 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
63111total0.0769700.001012
62112total0.0878760.000344
61113total0.0004180.000023
60114total0.0000000.000000
59115total0.0000000.000000
58116total0.0000000.000000
57117total0.0000000.000000
56118total0.0000000.000000
55121total0.0000000.000000
54122total0.2664990.001265
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "63 1 1 1 total 0.076970 0.001012\n", + "62 1 1 2 total 0.087876 0.000344\n", + "61 1 1 3 total 0.000418 0.000023\n", + "60 1 1 4 total 0.000000 0.000000\n", + "59 1 1 5 total 0.000000 0.000000\n", + "58 1 1 6 total 0.000000 0.000000\n", + "57 1 1 7 total 0.000000 0.000000\n", + "56 1 1 8 total 0.000000 0.000000\n", + "55 1 2 1 total 0.000000 0.000000\n", + "54 1 2 2 total 0.266499 0.001265" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = nuscatter.get_pandas_dataframe()\n", "df.head(10)" @@ -692,7 +900,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -710,7 +918,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": true }, @@ -738,11 +946,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n" + ] + } + ], "source": [ "# Import OpenMOC and the OpenMOC/OpenCG compatibility module\n", "import openmoc\n", @@ -764,7 +985,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": true }, @@ -798,11 +1019,148 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.728847\tres = 4.513E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.695633\tres = 2.844E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.701456\tres = 3.194E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.722831\tres = 3.132E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.085609\tres = 6.273E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.091436\tres = 5.804E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.101877\tres = 4.961E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.110860\tres = 4.231E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.114861\tres = 3.905E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.118563\tres = 3.602E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.121986\tres = 3.321E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.125149\tres = 3.060E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.128069\tres = 2.819E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.133248\tres = 2.389E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.135538\tres = 2.197E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.137648\tres = 2.021E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.139590\tres = 1.858E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.141377\tres = 1.707E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.144531\tres = 1.440E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.147195\tres = 1.213E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.148365\tres = 1.113E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.150425\tres = 9.356E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.151329\tres = 8.574E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.152157\tres = 7.856E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.152916\tres = 7.196E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.153612\tres = 6.590E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.154249\tres = 6.033E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.154832\tres = 5.522E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.155366\tres = 5.053E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.155855\tres = 4.623E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.156302\tres = 4.229E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.156710\tres = 3.866E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.157084\tres = 3.535E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.157426\tres = 3.230E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.157738\tres = 2.952E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158023\tres = 2.697E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.158284\tres = 2.464E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.158522\tres = 2.251E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.158739\tres = 2.055E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.158937\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.159119\tres = 1.713E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.159284\tres = 1.564E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.159435\tres = 1.428E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.159573\tres = 1.301E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.159813\tres = 1.083E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.159917\tres = 9.880E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.160013\tres = 9.009E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.160100\tres = 8.222E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.160179\tres = 7.487E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.160251\tres = 6.824E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.160317\tres = 6.223E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.160376\tres = 5.675E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.160431\tres = 5.174E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.160481\tres = 4.715E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.160527\tres = 4.298E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.160568\tres = 3.910E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.160605\tres = 3.561E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.160640\tres = 3.242E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.160671\tres = 2.960E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.160699\tres = 2.689E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.160725\tres = 2.452E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.160749\tres = 2.232E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.160770\tres = 2.034E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.160790\tres = 1.855E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.160807\tres = 1.687E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.160824\tres = 1.538E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.160838\tres = 1.399E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.160852\tres = 1.280E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.160864\tres = 1.149E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.160875\tres = 1.061E-05\n" + ] + } + ], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", @@ -823,11 +1181,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.161200\n", + "openmoc keff = 1.160875\n", + "bias [pcm]: -32.5\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -876,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -910,7 +1278,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": true }, @@ -936,7 +1304,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": true }, @@ -965,11 +1333,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -1003,11 +1382,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", @@ -1033,7 +1423,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": true }, @@ -1060,7 +1450,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": false }, diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 579557ae83..5659ec4d3b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -16,16 +16,30 @@ if sys.version_info[0] >= 3: basestring = str +# Supported cross section types +MGXS_TYPES = ['total', + 'transport', + 'absorption', + 'capture', + 'fission', + 'nu-fission', + 'scatter', + 'nu-scatter', + 'scatter matrix', + 'nu-scatter matrix', + 'chi'] + + # Supported domain types # TODO: Implement Mesh domains -DOMAIN_TYPES = ['cell', +_DOMAIN_TYPES = ['cell', 'distribcell', 'universe', 'material'] # Supported domain classes # TODO: Implement Mesh domains -DOMAINS = [openmc.Cell, +_DOMAINS = [openmc.Cell, openmc.Universe, openmc.Material] @@ -47,7 +61,7 @@ class MGXS(object): energy_groups : EnergyGroups The energy group structure for energy condensation by_nuclide : bool - If true, computes multi-group cross sections for each nuclide in domain + If true, computes cross sections for each nuclide in domain name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC 'tallies.xml' file. @@ -59,7 +73,7 @@ class MGXS(object): rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool - If true, computes multi-group cross sections for each nuclide in domain + If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe Domain for spatial homogenization domain_type : {'material', 'cell', 'distribcell', 'universe'} @@ -197,12 +211,12 @@ class MGXS(object): @domain.setter def domain(self, domain): - cv.check_type('domain', domain, tuple(DOMAINS)) + cv.check_type('domain', domain, tuple(_DOMAINS)) self._domain = domain @domain_type.setter def domain_type(self, domain_type): - cv.check_value('domain type', domain_type, tuple(DOMAIN_TYPES)) + cv.check_value('domain type', domain_type, tuple(_DOMAIN_TYPES)) self._domain_type = domain_type @energy_groups.setter @@ -211,6 +225,70 @@ class MGXS(object): self._energy_groups = energy_groups self._num_groups = energy_groups.num_groups + @staticmethod + def get_mgxs(mgxs_type, domain=None, domain_type=None, + energy_groups=None, by_nuclide=False, name=''): + """Return a MGXS subclass object for some energy group structure within + some spatial domain for some reaction type. + + This is a factory method which can be used to quickly create MGXS + subclass objects for various reaction types. + + Parameters + ---------- + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', + 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', + 'nu-scatter matrix', 'chi'} + The type of multi-group cross section object to return + domain : Material or Cell or Universe + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe'} + The domain type for spatial homogenization + energy_groups : EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + + Returns + ------- + MGXS + A subclass of the abstract MGXS class for the multi-group cross + section type requeted by the user + + """ + + cv.check_value('mgxs_type', mgxs_type, MGXS_TYPES) + + if mgxs_type == 'total': + mgxs = TotalXS(domain, domain_type, energy_groups) + elif mgxs_type == 'transport': + mgxs = TransportXS(domain, domain_type, energy_groups) + elif mgxs_type == 'absorption': + mgxs = AbsorptionXS(domain, domain_type, energy_groups) + elif mgxs_type == 'capture': + mgxs = CaptureXS(domain, domain_type, energy_groups) + elif mgxs_type == 'fission': + mgxs = FissionXS(domain, domain_type, energy_groups) + elif mgxs_type == 'nu-fission': + mgxs = NuFissionXS(domain, domain_type, energy_groups) + elif mgxs_type == 'scatter': + mgxs = ScatterXS(domain, domain_type, energy_groups) + elif mgxs_type == 'nu-scatter': + mgxs = NuScatterXS(domain, domain_type, energy_groups) + elif mgxs_type == 'scatter matrix': + mgxs = ScatterMatrixXS(domain, domain_type, energy_groups) + elif mgxs_type == 'nu-scatter matrix': + mgxs = NuScatterMatrixXS(domain, domain_type, energy_groups) + elif mgxs_type == 'chi': + mgxs = Chi(domain, domain_type, energy_groups) + + mgxs.by_nuclide = by_nuclide + mgxs.name = name + return mgxs + def get_all_nuclides(self): """Get all nuclides in the cross section's spatial domain. @@ -1459,7 +1537,7 @@ class NuScatterXS(MGXS): # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] - estimator = 'tracklength' + estimator = 'analog' keys = scores # Create the non-domain specific Filters for the Tallies From c4fd2855e6ff9252003d7b2607570ce6884938c4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Oct 2015 09:20:15 +0700 Subject: [PATCH 312/519] Add support for general quadric surfaces --- docs/source/methods/geometry.rst | 4 + docs/source/usersguide/input.rst | 8 +- docs/source/usersguide/output/summary.rst | 3 +- src/input_xml.F90 | 14 +++ src/summary.F90 | 5 ++ src/surface_header.F90 | 102 +++++++++++++++++++++- 6 files changed, 131 insertions(+), 5 deletions(-) diff --git a/docs/source/methods/geometry.rst b/docs/source/methods/geometry.rst index 9eece1e919..6592909298 100644 --- a/docs/source/methods/geometry.rst +++ b/docs/source/methods/geometry.rst @@ -117,6 +117,10 @@ to fully define the surface. | Cone parallel to the | z-cone | :math:`(x-x_0)^2 + (y-y_0)^2 | :math:`x_0 \; y_0 \; | | :math:`z`-axis | | = R^2(z-z_0)^2` | z_0 \; R^2` | +----------------------+------------+------------------------------+-------------------------+ + | General quadric | quadric | :math:`Ax^2 + By^2 + Cz^2 + | :math:`A \; B \; C \; D | + | surface | | Dxy + Eyz + Fxz + Gx + Hy + | \; E \; F \; G \; H \; | + | | | Jz + K` | J \; K` | + +----------------------+------------+------------------------------+-------------------------+ .. _universes: diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 44db252079..87b613a453 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -787,7 +787,7 @@ Each ```` element can have the following attributes or sub-elements: :type: The type of the surfaces. This can be "x-plane", "y-plane", "z-plane", "plane", "x-cylinder", "y-cylinder", "z-cylinder", "sphere", "x-cone", - "y-cone", or "z-cone". + "y-cone", "z-cone", or "quadric". *Default*: None @@ -855,6 +855,12 @@ The following quadratic surfaces can be modeled: R^2 (z - z_0)^2`. The coefficients specified are ":math:`x_0 \: y_0 \: z_0 \: R^2`". + :quadric: + A general quadric surface of the form :math:`Ax^2 + By^2 + Cz^2 + Dxy + + Eyz + Fxz + Gx + Hy + Jz + K = 0` The coefficients specified are ":math:`A + \: B \: C \: D \: E \: F \: G \: H \: J \: K`". + + ```` Element ------------------ diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index d37b2172fa..f87f60c4a0 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -132,7 +132,8 @@ The current revision of the summary file format is 1. **/geometry/surfaces/surface /type** (*char[]*) Type of the surface. Can be 'x-plane', 'y-plane', 'z-plane', 'plane', - 'x-cylinder', 'y-cylinder', 'sphere', 'x-cone', 'y-cone', or 'z-cone'. + 'x-cylinder', 'y-cylinder', 'sphere', 'x-cone', 'y-cone', 'z-cone', or + 'quadric'. **/geometry/surfaces/surface /coefficients** (*double[]*) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 6d15f0d204..40e0583daf 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1294,6 +1294,9 @@ contains case ('z-cone') coeffs_reqd = 4 allocate(SurfaceZCone :: surfaces(i)%obj) + case ('quadric') + coeffs_reqd = 10 + allocate(SurfaceQuadric :: surfaces(i)%obj) case default call fatal_error("Invalid surface type: " // trim(word)) end select @@ -1378,6 +1381,17 @@ contains s%y0 = coeffs(2) s%z0 = coeffs(3) s%r2 = coeffs(4) + type is (SurfaceQuadric) + s%A = coeffs(1) + s%B = coeffs(2) + s%C = coeffs(3) + s%D = coeffs(4) + s%E = coeffs(5) + s%F = coeffs(6) + s%G = coeffs(7) + s%H = coeffs(8) + s%J = coeffs(9) + s%K = coeffs(10) end select ! No longer need coefficients diff --git a/src/summary.F90 b/src/summary.F90 index 1bf57cc93f..d8ac1e3fa8 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -276,6 +276,11 @@ contains allocate(coeffs(4)) coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + type is (SurfaceQuadric) + call write_dataset(surface_group, "type", "quadric") + allocate(coeffs(10)) + coeffs(:) = [s%A, s%B, s%C, s%D, s%E, s%F, s%G, s%H, s%J, s%K] + end select call write_dataset(surface_group, "coefficients", coeffs) deallocate(coeffs) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 6fc1bbc237..a927ce4d40 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -1,6 +1,6 @@ module surface_header - use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT + use constants, only: ONE, TWO, ZERO, HALF, INFINITY, FP_COINCIDENT implicit none @@ -183,6 +183,15 @@ module surface_header procedure :: normal => z_cone_normal end type SurfaceZCone + type, extends(Surface) :: SurfaceQuadric + ! Ax^2 + By^2 + Cz^2 + Dxy + Eyz + Fxz + Gx + Hy + Jz + K = 0 + real(8) :: A, B, C, D, E, F, G, H, J, K + contains + procedure :: evaluate => quadric_evaluate + procedure :: distance => quadric_distance + procedure :: normal => quadric_normal + end type SurfaceQuadric + contains !=============================================================================== @@ -640,7 +649,7 @@ contains end function z_cylinder_normal !=============================================================================== -! SphereImplementation +! SurfaceSphere Implementation !=============================================================================== pure function sphere_evaluate(this, xyz) result(f) @@ -874,7 +883,7 @@ contains end function y_cone_normal !=============================================================================== -! SurfaceZConeImplementation +! SurfaceZCone Implementation !=============================================================================== pure function z_cone_evaluate(this, xyz) result(f) @@ -953,4 +962,91 @@ contains uvw(3) = -TWO*this%r2*(xyz(3) - this%z0) end function z_cone_normal +!=============================================================================== +! SurfaceQuadric Implementation +!=============================================================================== + + pure function quadric_evaluate(this, xyz) result(f) + class(SurfaceQuadric), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + associate (x => xyz(1), y => xyz(2), z => xyz(3)) + f = x*(this%A*x + this%D*y + this%G) + & + y*(this%B*y + this%E*z + this%H) + & + z*(this%C*z + this%F*x + this%J) + this%K + end associate + end function quadric_evaluate + + pure function quadric_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceQuadric), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: a, k, c + real(8) :: quad, b + + associate (x => xyz(1), y => xyz(2), z => xyz(3), & + u => uvw(1), v => uvw(2), w => uvw(3)) + + a = this%A*u*u + this%B*v*v + this%C*w*w + this%D*u*v + this%E*v*w + & + this%F*u*w + k = (this%A*u*x + this%B*v*y + this%C*w*z + HALF*(this%D*(u*y + v*x) + & + this%E*(v*z + w*y) + this%F*(w*x + u*z) + this%G*u + this%H*v + & + this%J*w)) + c = this%A*x*x + this%B*y*y + this%C*z*z + this%D*x*y + this%E*y*z + & + this%F*y*z + this%G*x + this%H*y + this%J*z + K + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + end associate + end function quadric_distance + + pure function quadric_normal(this, xyz) result(uvw) + class(SurfaceQuadric), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + associate (x => xyz(1), y => xyz(2), z => xyz(3)) + uvw(1) = TWO*this%A*x + this%D*y + this%F*z + this%G + uvw(2) = TWO*this%B*y + this%D*x + this%E*z + this%H + uvw(3) = TWO*this%C*z + this%E*y + this%F*x + this%J + end associate + end function quadric_normal + end module surface_header From 80b0a1ad251090159a4f8465511ed01ddfca8ec7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Oct 2015 09:36:00 +0700 Subject: [PATCH 313/519] Add support in Python API for quadric surfaces --- openmc/summary.py | 5 ++ openmc/surface.py | 146 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) diff --git a/openmc/summary.py b/openmc/summary.py index 75f2a0f2a2..2c704557c8 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -179,6 +179,11 @@ class Summary(object): if surf_type == 'z-cone': surface = openmc.ZCone(surface_id, bc, x0, y0, z0, R2, name) + elif surf_type == 'quadric': + a, b, c, d, e, f, g, h, j, k = coeffs + surface = openmc.Quadric(surface_id, bc, a, b, c, d, e, f, + g, h, j, k, name) + # Add Surface to global dictionary of all Surfaces self.surfaces[index] = surface diff --git a/openmc/surface.py b/openmc/surface.py index afa426fa3b..92f047b66d 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -949,6 +949,152 @@ class ZCone(Cone): self._type = 'z-cone' +class Quadric(Surface): + """A sphere of the form :math:`Ax^2 + By^2 + Cz^2 + Dxy + Eyz + Fxz + Gx + Hy + + Jz + K`. + + Parameters + ---------- + surface_id : int + Unique identifier for the surface. If not specified, an identifier will + automatically be assigned. + boundary_type : {'transmission, 'vacuum', 'reflective', 'periodic'} + Boundary condition that defines the behavior for particles hitting the + surface. Defaults to transmissive boundary condition where particles + freely pass through the surface. + a, b, c, d, e, f, g, h, j, k : float + coefficients for the surface + name : str + Name of the sphere. If not specified, the name will be the empty string. + + Attributes + ---------- + a, b, c, d, e, f, g, h, j, k : float + coefficients for the surface + + """ + + def __init__(self, surface_id=None, boundary_type='transmission', + a=None, b=None, c=None, d=None, e=None, f=None, g=None, + h=None, j=None, k=None, name=''): + # Initialize Quadric class attributes + super(Quadric, self).__init__(surface_id, boundary_type, name=name) + + self._type = 'quadric' + self._coeff_keys = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k'] + + if a is not None: + self.a = a + if b is not None: + self.b = b + if c is not None: + self.c = c + if d is not None: + self.d = d + if e is not None: + self.e = e + if f is not None: + self.f = f + if g is not None: + self.g = g + if h is not None: + self.h = h + if j is not None: + self.j = j + if k is not None: + self.k = k + + @property + def a(self): + return self.coeffs['a'] + + @property + def b(self): + return self.coeffs['b'] + + @property + def c(self): + return self.coeffs['c'] + + @property + def d(self): + return self.coeffs['d'] + + @property + def e(self): + return self.coeffs['e'] + + @property + def f(self): + return self.coeffs['f'] + + @property + def g(self): + return self.coeffs['g'] + + @property + def h(self): + return self.coeffs['h'] + + @property + def j(self): + return self.coeffs['j'] + + @property + def k(self): + return self.coeffs['k'] + + @a.setter + def a(self, a): + check_type('a coefficient', a, Real) + self._coeffs['a'] = a + + @b.setter + def b(self, b): + check_type('b coefficient', b, Real) + self._coeffs['b'] = b + + @c.setter + def c(self, c): + check_type('c coefficient', c, Real) + self._coeffs['c'] = c + + @d.setter + def d(self, d): + check_type('d coefficient', d, Real) + self._coeffs['d'] = d + + @e.setter + def e(self, e): + check_type('e coefficient', e, Real) + self._coeffs['e'] = e + + @f.setter + def f(self, f): + check_type('f coefficient', f, Real) + self._coeffs['f'] = f + + @g.setter + def g(self, g): + check_type('g coefficient', g, Real) + self._coeffs['g'] = g + + @h.setter + def h(self, h): + check_type('h coefficient', h, Real) + self._coeffs['h'] = h + + @j.setter + def j(self, j): + check_type('j coefficient', j, Real) + self._coeffs['j'] = j + + @k.setter + def k(self, k): + check_type('k coefficient', k, Real) + self._coeffs['k'] = k + + class Halfspace(Region): """A positive or negative half-space region. From 32f67d3d0abfb5e6d0f626251c0d64536791e44b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 9 Oct 2015 00:15:09 -0400 Subject: [PATCH 314/519] Implemented new openmc.mgxs.Library class --- .../examples/multi-group-cross-sections.ipynb | 415 ++++++++++++++++-- openmc/mgxs/__init__.py | 3 +- openmc/mgxs/groups.py | 2 +- openmc/mgxs/library.py | 286 ++++++++++++ openmc/mgxs/mgxs.py | 39 +- 5 files changed, 692 insertions(+), 53 deletions(-) create mode 100644 openmc/mgxs/library.py diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 652c21a116..3996543e11 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -1480,7 +1480,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1520,11 +1520,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Delete old HDF5 files\n", "!rm *.h5\n", @@ -1550,7 +1561,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1571,7 +1582,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1607,11 +1618,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 5.91e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 4.03e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.48e+01 +/- 5.56e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.84e+01 +/- 8.48e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 1.25e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 7.98e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 5.73e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 6.74e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 8.28e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t4.75e-04 +/- 7.97e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 7.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.22e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 7.97e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 5.72e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" @@ -1626,11 +1672,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 6.42e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.52e-03 +/- 3.96e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 5.56e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.32e-02 +/- 8.48e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.25e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 7.98e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 5.73e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='macro', nuclides='sum')" @@ -1645,11 +1714,141 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211O-161.5600980.017801
1271000211H-10.2348770.010096
1241000212O-160.2882360.004397
1251000212H-11.5878150.007847
1221000213O-160.0000000.000000
1231000213H-10.0101220.000513
1201000214O-160.0000000.000000
1211000214H-10.0000000.000000
1181000215O-160.0000000.000000
1191000215H-10.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "126 10002 1 1 O-16 1.560098 0.017801\n", + "127 10002 1 1 H-1 0.234877 0.010096\n", + "124 10002 1 2 O-16 0.288236 0.004397\n", + "125 10002 1 2 H-1 1.587815 0.007847\n", + "122 10002 1 3 O-16 0.000000 0.000000\n", + "123 10002 1 3 H-1 0.010122 0.000513\n", + "120 10002 1 4 O-16 0.000000 0.000000\n", + "121 10002 1 4 H-1 0.000000 0.000000\n", + "118 10002 1 5 O-16 0.000000 0.000000\n", + "119 10002 1 5 H-1 0.000000 0.000000" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", @@ -1665,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1693,11 +1892,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create plot of the H-1 scattering matrix\n", "fig = plt.subplot(121)\n", @@ -1722,7 +1932,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": { "collapsed": true }, @@ -1744,22 +1954,133 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttransport\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 5.85e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", + "\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "condense_xs.print_xs()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2389.5893230.038756
4100001O-163.1591010.012939
5100001U-23521.0952560.257787
0100002U-23811.1788440.065428
1100002O-163.8000270.024538
2100002U-235485.5135302.418761
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-238 9.589323 0.038756\n", + "4 10000 1 O-16 3.159101 0.012939\n", + "5 10000 1 U-235 21.095256 0.257787\n", + "0 10000 2 U-238 11.178844 0.065428\n", + "1 10000 2 O-16 3.800027 0.024538\n", + "2 10000 2 U-235 485.513530 2.418761" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", "df" @@ -1781,7 +2102,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": { "collapsed": true }, @@ -1803,7 +2124,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -1851,7 +2172,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -1879,11 +2200,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.227616\n", + "openmoc keff = 1.225325\n", + "bias [pcm]: -229.1\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1904,11 +2235,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n" + ] + } + ], "source": [ "su.make_opencg_geometry()\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", @@ -1945,7 +2292,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -1963,11 +2310,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.227616\n", + "openmoc keff = 1.227096\n", + "bias [pcm]: -52.0\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py index b6f928b091..91eb811f46 100644 --- a/openmc/mgxs/__init__.py +++ b/openmc/mgxs/__init__.py @@ -1,2 +1,3 @@ from groups import EnergyGroups -from mgxs import * \ No newline at end of file +from library import Library +from mgxs import * diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index dfaca9be93..53f032f51a 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -1,5 +1,5 @@ from collections import Iterable -from numbers import Real, Integral +from numbers import Real import copy import sys diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py new file mode 100644 index 0000000000..6f9d40a55e --- /dev/null +++ b/openmc/mgxs/library.py @@ -0,0 +1,286 @@ +import sys +import copy +from numbers import Integral + +import openmc +import openmc.mgxs +import openmc.checkvalue as cv + + +if sys.version_info[0] >= 3: + basestring = str + + +class Library(object): + + def __init__(self, openmc_geometry, by_nuclide=False, + mgxs_types=None, name=''): + + self._name = '' + self._openmc_geometry = None + self._by_nuclide = None + self._mgxs_types = [] + self._domain_type = None + self._energy_groups = None + self._all_mgxs = {} + + self.name = name + self.openmc_geometry = openmc_geometry + self.by_nuclide = by_nuclide + + if mgxs_types is not None: + self.mgxs_types = mgxs_types + + def __deepcopy__(self, memo): + existing = memo.get(id(self)) + + # If this is the first time we have tried to copy this object, copy it + if existing is None: + clone = type(self).__new__(type(self)) + clone._name = self.name + clone._openmc_geometry = self.openmc_geometry + clone._by_nuclide = self.by_nuclide + clone._mgxs_types = self.mgxs_types + clone._domain_type = self.domain_type + clone._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._all_mgxs = self.all_mgxs + + clone._all_mgxs = {} + for domain in self.domains: + clone.all_mgxs[domain.id] = {} + for mgxs_type in self.mgxs_types: + mgxs = copy.deepcopy(self.all_mgxs[domain.id][mgxs_type]) + clone.all_mgxs[domain.id][mgxs_type] = mgxs + + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + + @property + def openmc_geometry(self): + return self._openmc_geometry + + @property + def name(self): + return self._name + + @property + def mgxs_types(self): + return self._mgxs_types + + @property + def by_nuclide(self): + return self._by_nuclide + + @property + def domains(self): + if self.domain_type is None: + raise ValueError('Unable to get all domains without a domain type') + + if self.domain_type == 'material': + return self.openmc_geometry.get_all_materials() + elif self.domain_type == 'cell' or self.domain_type == 'distribcell': + return self.openmc_geometry.get_all_material_cells() + elif self.domain_type == 'universe': + return self.openmc_geometry.get_all_universes() + + @property + def domain_type(self): + return self._domain_type + + @property + def energy_groups(self): + return self._energy_groups + + @property + def num_groups(self): + return self.energy_groups.num_groups + + @property + def all_mgxs(self): + return self._all_mgxs + + @openmc_geometry.setter + def openmc_geometry(self, openmc_geometry): + cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) + self._openmc_geometry = openmc_geometry + + @name.setter + def name(self, name): + cv.check_type('name', name, basestring) + self._name = name + + @mgxs_types.setter + def mgxs_types(self, mgxs_types): + if mgxs_types == 'all': + self._mgxs_types = openmc.mgxs.MGXS_TYPES + else: + cv.check_iterable_type('mgxs_types', mgxs_types, basestring) + for mgxs_type in mgxs_types: + cv.check_value('mgxs_type', mgxs_type, openmc.mgxs.MGXS_TYPES) + self._mgxs_types = mgxs_types + + @by_nuclide.setter + def by_nuclide(self, by_nuclide): + cv.check_type('by_nuclide', by_nuclide, bool) + self._by_nuclide = by_nuclide + + @domain_type.setter + def domain_type(self, domain_type): + cv.check_value('domain type', domain_type, tuple(openmc.mgxs.DOMAIN_TYPES)) + self._domain_type = domain_type + + @energy_groups.setter + def energy_groups(self, energy_groups): + cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) + self._energy_groups = energy_groups + + def build_library(self): + """ + """ + + # Initialize MGXS for each domain and mgxs type and store in dictionary + for domain in self.domains: + self.all_mgxs[domain.id] = {} + for mgxs_type in self.mgxs_types: + mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name) + mgxs.domain = domain + mgxs.domain_type = self.domain_type + mgxs.energy_groups = self.energy_groups + mgxs.by_nuclide = self.by_nuclide + mgxs.create_tallies() + self.all_mgxs[domain.id][mgxs_type] = mgxs + + def add_to_tallies_file(self, tallies_file): + """ + + NOTE: This assumes that build_library() has been called + + :param tallies_file: + :return: + """ + + cv.check_type('tallies_file', tallies_file, openmc.TalliesFile) + + # Add tallies from each MGXS for each domain and mgxs type + for domain in self.domains: + for mgxs_type in self.mgxs_types: + mgxs = self.get_mgxs(domain, mgxs_type) + for tally_id, tally in mgxs.tallies.items(): + tallies_file.add_tally(tally, merge=True) + + def load_from_statepoint(self, statepoint): + """ + + :param statepoint: + :return: + """ + + cv.check_type('statepoint', statepoint, openmc.StatePoint) + + # Load tallies for each MGXS for each domain and mgxs type + for domain in self.domains: + for mgxs_type in self.mgxs_types: + mgxs = self.get_mgxs(domain, mgxs_type) + mgxs.load_from_statepoint(statepoint) + mgxs.compute_xs() + + def get_mgxs(self, domain, mgxs_type): + """ + + :param domain: + :param mgxs_type: + :return: + """ + + if self.domain_type == 'material': + cv.check_type('domain', domain, (openmc.Material, Integral)) + elif self.domain_type == 'cell' or self.domain_type == 'distribcell': + cv.check_type('domain', domain, (openmc.Cell, Integral)) + elif self.domain_type == 'universe': + cv.check_type('domain', domain, (openmc.Universe, Integral)) + + # Check that requested domain is included in library + if cv._isinstance(domain, Integral): + domain_id = domain + for domain in self.domains: + if domain_id == domain.id: + break + else: + msg = 'Unable to find MGXS for {0} "{1}" in ' \ + 'library'.format(self.domain_type, domain) + raise ValueError(msg) + else: + domain_id = domain.id + + # Check that requested domain is included in library + if mgxs_type not in self.mgxs_types: + msg = 'Unable to find MGXS type "{0}"'.format(mgxs_type) + raise ValueError(msg) + + return self.all_mgxs[domain_id][mgxs_type] + + def get_condensed_library(self, coarse_groups): + """ + + :param coarse_groups: + :return: + """ + + if self.energy_groups is None: + msg = 'Unable to get a condensed coarse group cross section ' \ + 'library since the fine energy groups have not yet been set' + raise ValueError(msg) + + cv.check_type('coarse_groups', coarse_groups, openmc.mgxs.EnergyGroups) + cv.check_less_than('coarse groups', coarse_groups.num_groups, + self.num_groups, equality=True) + cv.check_value('upper coarse energy', coarse_groups.group_edges[-1], + [self.energy_groups.group_edges[-1]]) + cv.check_value('lower coarse energy', coarse_groups.group_edges[0], + [self.energy_groups.group_edges[0]]) + + # Clone this Library to initialize the condensed version + condensed_library = copy.deepcopy(self) + condensed_library.energy_groups = coarse_groups + + # Condense the MGXS for each domain and mgxs type + for domain in self.domains: + for mgxs_type in self.mgxs_types: + mgxs = condensed_library.get_mgxs(domain, mgxs_type) + condensed_mgxs = mgxs.get_condensed_xs(coarse_groups) + condensed_library.all_mgxs[domain.id][mgxs_type] = condensed_mgxs + + return condensed_library + + def build_hdf5_store(self, filename='mgxs', directory='mgxs', xs_type='macro'): + """Export the multi-group cross section library to an HDF5 binary file. + + This method constructs an HDF5 file which stores the multi-group + cross section data. The data is stored in a hierarchy of HDF5 groups + from the domain type, domain id, subdomain id (for distribcell domains), + nuclides and cross section types. Two datasets for the mean and standard + deviation are stored for each subdomain entry in the HDF5 file. + + NOTE: This requires the h5py Python package. + + Parameters + ---------- + filename : str + Filename for the HDF5 file (default is 'mgxs') + directory : str + Directory for the HDF5 file (default is 'mgxs') + xs_type: {'macro', 'micro'} + Store the macro or micro cross section in units of cm^-1 or barns + + """ + + # Load tallies for each MGXS for each domain and mgxs type + for domain in self.domains: + for mgxs_type in self.mgxs_types: + mgxs = self.all_mgxs[domain.id][mgxs_type] + mgxs.build_hdf5_store(filename, directory, xs_type) \ No newline at end of file diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 5659ec4d3b..07d0e10ab2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -32,7 +32,7 @@ MGXS_TYPES = ['total', # Supported domain types # TODO: Implement Mesh domains -_DOMAIN_TYPES = ['cell', +DOMAIN_TYPES = ['cell', 'distribcell', 'universe', 'material'] @@ -80,8 +80,6 @@ class MGXS(object): Domain type for spatial homogenization energy_groups : EnergyGroups Energy group structure for energy condensation - num_groups : Integral - Number of energy groups tallies : dict OpenMC tallies needed to compute the multi-group cross section xs_tally : Tally @@ -102,8 +100,7 @@ class MGXS(object): self._domain = None self._domain_type = None self._energy_groups = None - self._num_groups = None - self._tallies = dict() + self._tallies = {} self._xs_tally = None self.name = name @@ -128,10 +125,9 @@ class MGXS(object): clone._domain = self.domain clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) - clone._num_groups = self.num_groups clone._xs_tally = copy.deepcopy(self.xs_tally, memo) - clone._tallies = dict() + clone._tallies = {} for tally_type, tally in self.tallies.items(): clone.tallies[tally_type] = copy.deepcopy(tally, memo) @@ -169,7 +165,7 @@ class MGXS(object): @property def num_groups(self): - return self._num_groups + return self.energy_groups.num_groups @property def tallies(self): @@ -185,16 +181,6 @@ class MGXS(object): domain_filter = tally.find_filter(self.domain_type) return domain_filter.num_bins - @name.setter - def name(self, name): - cv.check_type('name', name, basestring) - self._name = name - - @by_nuclide.setter - def by_nuclide(self, by_nuclide): - cv.check_type('by_nuclide', by_nuclide, bool) - self._by_nuclide = by_nuclide - @property def num_nuclides(self): if self.by_nuclide: @@ -209,6 +195,16 @@ class MGXS(object): else: return 'sum' + @name.setter + def name(self, name): + cv.check_type('name', name, basestring) + self._name = name + + @by_nuclide.setter + def by_nuclide(self, by_nuclide): + cv.check_type('by_nuclide', by_nuclide, bool) + self._by_nuclide = by_nuclide + @domain.setter def domain(self, domain): cv.check_type('domain', domain, tuple(_DOMAINS)) @@ -216,14 +212,13 @@ class MGXS(object): @domain_type.setter def domain_type(self, domain_type): - cv.check_value('domain type', domain_type, tuple(_DOMAIN_TYPES)) + cv.check_value('domain type', domain_type, tuple(DOMAIN_TYPES)) self._domain_type = domain_type @energy_groups.setter def energy_groups(self, energy_groups): cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) self._energy_groups = energy_groups - self._num_groups = energy_groups.num_groups @staticmethod def get_mgxs(mgxs_type, domain=None, domain_type=None, @@ -295,7 +290,7 @@ class MGXS(object): Returns ------- list of str - A list of the string names for each nuclide in the problem domain + A list of the string names for each nuclide in the spatial domain (e.g., ['U-235', 'U-238', 'O-16']) Raises @@ -362,7 +357,7 @@ class MGXS(object): ------- ndarray of Real An array of the atomic number densities (atom/b-cm) for each of the - nuclides in the problem domain + nuclides in the spatial domain Raises ------ From 3b9c61a6d8df13b6fee1b02b0cb2083608793655 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 9 Oct 2015 00:47:06 -0400 Subject: [PATCH 315/519] No longer using deprecated NumPy elementwise comparison for MGXS.get_condensed_xs(...) routine --- .../examples/multi-group-cross-sections.ipynb | 504 +++--------------- openmc/mgxs/mgxs.py | 8 +- 2 files changed, 71 insertions(+), 441 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 3996543e11..0c0250437c 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -13,15 +13,30 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n" + ] + } + ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "import openmc\n", "import openmc.mgxs as mgxs\n", + "import openmoc\n", + "from openmoc.compatible import get_openmoc_geometry\n", "\n", "%matplotlib inline" ] @@ -463,7 +478,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 19:56:45\n", + " Date/Time: 2015-10-09 00:44:07\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -548,20 +563,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.5500E-01 seconds\n", - " Reading cross sections = 9.0000E-02 seconds\n", - " Total time in simulation = 1.3254E+01 seconds\n", - " Time in transport only = 1.3238E+01 seconds\n", - " Time in inactive batches = 1.8670E+00 seconds\n", - " Time in active batches = 1.1387E+01 seconds\n", - " Time synchronizing fission bank = 8.0000E-03 seconds\n", - " Sampling source sites = 7.0000E-03 seconds\n", + " Total time for initialization = 4.1300E-01 seconds\n", + " Reading cross sections = 1.0500E-01 seconds\n", + " Total time in simulation = 1.3459E+01 seconds\n", + " Time in transport only = 1.3445E+01 seconds\n", + " Time in inactive batches = 2.1740E+00 seconds\n", + " Time in active batches = 1.1285E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.3719E+01 seconds\n", - " Calculation Rate (inactive) = 13390.5 neutrons/second\n", - " Calculation Rate (active) = 8781.94 neutrons/second\n", + " Total time elapsed = 1.3882E+01 seconds\n", + " Calculation Rate (inactive) = 11499.5 neutrons/second\n", + " Calculation Rate (active) = 8861.32 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -950,25 +965,8 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", - "because the backend has already been chosen;\n", - "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", - "or matplotlib.backends is imported for the first time.\n", - "\n", - " warnings.warn(_use_error_msg)\n" - ] - } - ], + "outputs": [], "source": [ - "# Import OpenMOC and the OpenMOC/OpenCG compatibility module\n", - "import openmoc\n", - "from openmoc.compatible import get_openmoc_geometry\n", - "\n", "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", "su.make_opencg_geometry()\n", "\n", @@ -1028,8 +1026,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", @@ -1386,29 +1383,13 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y\n", "root_cell.fill = pin_cell_universe\n", "\n", - "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", "root_universe.add_cell(root_cell)" @@ -1480,7 +1461,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1520,22 +1501,11 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Delete old HDF5 files\n", "!rm *.h5\n", @@ -1561,7 +1531,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1582,7 +1552,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1618,46 +1588,11 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 5.91e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 4.03e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.48e+01 +/- 5.56e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.84e+01 +/- 8.48e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 1.25e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 7.98e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 5.73e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 6.74e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 8.28e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t4.75e-04 +/- 7.97e+00%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 7.56e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.22e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 7.97e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 5.72e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" @@ -1672,34 +1607,11 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 6.42e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.52e-03 +/- 3.96e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 5.56e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.32e-02 +/- 8.48e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.25e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 7.98e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 5.73e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='macro', nuclides='sum')" @@ -1714,141 +1626,11 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211O-161.5600980.017801
1271000211H-10.2348770.010096
1241000212O-160.2882360.004397
1251000212H-11.5878150.007847
1221000213O-160.0000000.000000
1231000213H-10.0101220.000513
1201000214O-160.0000000.000000
1211000214H-10.0000000.000000
1181000215O-160.0000000.000000
1191000215H-10.0000000.000000
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 O-16 1.560098 0.017801\n", - "127 10002 1 1 H-1 0.234877 0.010096\n", - "124 10002 1 2 O-16 0.288236 0.004397\n", - "125 10002 1 2 H-1 1.587815 0.007847\n", - "122 10002 1 3 O-16 0.000000 0.000000\n", - "123 10002 1 3 H-1 0.010122 0.000513\n", - "120 10002 1 4 O-16 0.000000 0.000000\n", - "121 10002 1 4 H-1 0.000000 0.000000\n", - "118 10002 1 5 O-16 0.000000 0.000000\n", - "119 10002 1 5 H-1 0.000000 0.000000" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", @@ -1864,7 +1646,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1892,22 +1674,11 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create plot of the H-1 scattering matrix\n", "fig = plt.subplot(121)\n", @@ -1932,7 +1703,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1954,133 +1725,22 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttransport\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 5.85e-01%\n", - "\n", - "\tNuclide =\tO-16\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", - "\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "condense_xs.print_xs()" ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
3100001U-2389.5893230.038756
4100001O-163.1591010.012939
5100001U-23521.0952560.257787
0100002U-23811.1788440.065428
1100002O-163.8000270.024538
2100002U-235485.5135302.418761
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-238 9.589323 0.038756\n", - "4 10000 1 O-16 3.159101 0.012939\n", - "5 10000 1 U-235 21.095256 0.257787\n", - "0 10000 2 U-238 11.178844 0.065428\n", - "1 10000 2 O-16 3.800027 0.024538\n", - "2 10000 2 U-235 485.513530 2.418761" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", "df" @@ -2102,9 +1762,9 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -2124,7 +1784,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": { "collapsed": false }, @@ -2172,7 +1832,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": { "collapsed": false }, @@ -2200,21 +1860,11 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.227616\n", - "openmoc keff = 1.225325\n", - "bias [pcm]: -229.1\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -2235,27 +1885,11 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:711: DeprecationWarning: elementwise comparison failed; this will raise the error in the future.\n" - ] - } - ], + "outputs": [], "source": [ "su.make_opencg_geometry()\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", @@ -2292,7 +1926,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": { "collapsed": false }, @@ -2310,21 +1944,11 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.227616\n", - "openmoc keff = 1.227096\n", - "bias [pcm]: -52.0\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 07d0e10ab2..940586f321 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -703,7 +703,13 @@ class MGXS(object): # Sum across all applicable fine energy group filters for i, filter in enumerate(tally.filters): - if 'energy' in filter.type and np.all(filter.bins == fine_edges): + if 'energy' not in filter.type: + continue + elif len(filter.bins) != len(fine_edges): + continue + elif not np.allclose(filter.bins, fine_edges): + continue + else: filter.bins = coarse_groups.group_edges mean = np.add.reduceat(mean, energy_indices, axis=i) std_dev = np.add.reduceat(std_dev**2, energy_indices, axis=i) From 8fdc5fbba1eea407f9f919980c6456e6cf768591 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Oct 2015 15:05:55 +0700 Subject: [PATCH 316/519] Add test for quadric surface and fix bug in distance calculation. Also remove reflective cone, cylinder, and sphere tests since they are covered in the new test here. --- src/geometry.F90 | 2 +- src/surface_header.F90 | 2 +- tests/test_quadric_surfaces/geometry.xml | 14 ++++++++++++++ .../materials.xml | 3 ++- tests/test_quadric_surfaces/results_true.dat | 2 ++ .../settings.xml | 2 +- .../test_quadric_surfaces.py} | 0 tests/test_reflective_cone/geometry.xml | 7 ------- tests/test_reflective_cone/materials.xml | 9 --------- tests/test_reflective_cone/results_true.dat | 2 -- tests/test_reflective_cylinder/geometry.xml | 8 -------- tests/test_reflective_cylinder/materials.xml | 9 --------- tests/test_reflective_cylinder/results_true.dat | 2 -- tests/test_reflective_cylinder/settings.xml | 16 ---------------- .../test_reflective_cylinder.py | 11 ----------- tests/test_reflective_sphere/geometry.xml | 8 -------- tests/test_reflective_sphere/results_true.dat | 2 -- tests/test_reflective_sphere/settings.xml | 16 ---------------- .../test_reflective_sphere.py | 11 ----------- 19 files changed, 21 insertions(+), 105 deletions(-) create mode 100644 tests/test_quadric_surfaces/geometry.xml rename tests/{test_reflective_sphere => test_quadric_surfaces}/materials.xml (56%) create mode 100644 tests/test_quadric_surfaces/results_true.dat rename tests/{test_reflective_cone => test_quadric_surfaces}/settings.xml (79%) rename tests/{test_reflective_cone/test_reflective_cone.py => test_quadric_surfaces/test_quadric_surfaces.py} (100%) mode change 100644 => 100755 delete mode 100644 tests/test_reflective_cone/geometry.xml delete mode 100644 tests/test_reflective_cone/materials.xml delete mode 100644 tests/test_reflective_cone/results_true.dat delete mode 100644 tests/test_reflective_cylinder/geometry.xml delete mode 100644 tests/test_reflective_cylinder/materials.xml delete mode 100644 tests/test_reflective_cylinder/results_true.dat delete mode 100644 tests/test_reflective_cylinder/settings.xml delete mode 100644 tests/test_reflective_cylinder/test_reflective_cylinder.py delete mode 100644 tests/test_reflective_sphere/geometry.xml delete mode 100644 tests/test_reflective_sphere/results_true.dat delete mode 100644 tests/test_reflective_sphere/settings.xml delete mode 100644 tests/test_reflective_sphere/test_reflective_sphere.py diff --git a/src/geometry.F90 b/src/geometry.F90 index e1e1b1f44e..e922479b1d 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -430,7 +430,7 @@ contains call find_cell(p, found) if (.not. found) then call handle_lost_particle(p, "Couldn't find particle after reflecting& - & from surface.") + & from surface " // trim(to_str(surf%id)) // ".") return end if diff --git a/src/surface_header.F90 b/src/surface_header.F90 index a927ce4d40..257cdbc1a1 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -997,7 +997,7 @@ contains this%E*(v*z + w*y) + this%F*(w*x + u*z) + this%G*u + this%H*v + & this%J*w)) c = this%A*x*x + this%B*y*y + this%C*z*z + this%D*x*y + this%E*y*z + & - this%F*y*z + this%G*x + this%H*y + this%J*z + K + this%F*x*z + this%G*x + this%H*y + this%J*z + this%K quad = k*k - a*c if (quad < ZERO) then diff --git a/tests/test_quadric_surfaces/geometry.xml b/tests/test_quadric_surfaces/geometry.xml new file mode 100644 index 0000000000..98d647a4f6 --- /dev/null +++ b/tests/test_quadric_surfaces/geometry.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/test_reflective_sphere/materials.xml b/tests/test_quadric_surfaces/materials.xml similarity index 56% rename from tests/test_reflective_sphere/materials.xml rename to tests/test_quadric_surfaces/materials.xml index 315c0fa848..0150332b3c 100644 --- a/tests/test_reflective_sphere/materials.xml +++ b/tests/test_quadric_surfaces/materials.xml @@ -3,7 +3,8 @@ - + + diff --git a/tests/test_quadric_surfaces/results_true.dat b/tests/test_quadric_surfaces/results_true.dat new file mode 100644 index 0000000000..b2e02fdbb7 --- /dev/null +++ b/tests/test_quadric_surfaces/results_true.dat @@ -0,0 +1,2 @@ +k-combined: +9.706301E-01 4.351374E-02 diff --git a/tests/test_reflective_cone/settings.xml b/tests/test_quadric_surfaces/settings.xml similarity index 79% rename from tests/test_reflective_cone/settings.xml rename to tests/test_quadric_surfaces/settings.xml index af56f56368..9f0e8ed05f 100644 --- a/tests/test_reflective_cone/settings.xml +++ b/tests/test_quadric_surfaces/settings.xml @@ -8,7 +8,7 @@ - +
diff --git a/tests/test_reflective_cone/test_reflective_cone.py b/tests/test_quadric_surfaces/test_quadric_surfaces.py old mode 100644 new mode 100755 similarity index 100% rename from tests/test_reflective_cone/test_reflective_cone.py rename to tests/test_quadric_surfaces/test_quadric_surfaces.py diff --git a/tests/test_reflective_cone/geometry.xml b/tests/test_reflective_cone/geometry.xml deleted file mode 100644 index f5499fbb61..0000000000 --- a/tests/test_reflective_cone/geometry.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tests/test_reflective_cone/materials.xml b/tests/test_reflective_cone/materials.xml deleted file mode 100644 index 315c0fa848..0000000000 --- a/tests/test_reflective_cone/materials.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/test_reflective_cone/results_true.dat b/tests/test_reflective_cone/results_true.dat deleted file mode 100644 index c8b833bff4..0000000000 --- a/tests/test_reflective_cone/results_true.dat +++ /dev/null @@ -1,2 +0,0 @@ -k-combined: -2.269987E+00 4.469683E-03 diff --git a/tests/test_reflective_cylinder/geometry.xml b/tests/test_reflective_cylinder/geometry.xml deleted file mode 100644 index e6aed65daf..0000000000 --- a/tests/test_reflective_cylinder/geometry.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/test_reflective_cylinder/materials.xml b/tests/test_reflective_cylinder/materials.xml deleted file mode 100644 index 315c0fa848..0000000000 --- a/tests/test_reflective_cylinder/materials.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/test_reflective_cylinder/results_true.dat b/tests/test_reflective_cylinder/results_true.dat deleted file mode 100644 index 0a11f3ef31..0000000000 --- a/tests/test_reflective_cylinder/results_true.dat +++ /dev/null @@ -1,2 +0,0 @@ -k-combined: -2.272436E+00 7.831006E-04 diff --git a/tests/test_reflective_cylinder/settings.xml b/tests/test_reflective_cylinder/settings.xml deleted file mode 100644 index a6fd5da19e..0000000000 --- a/tests/test_reflective_cylinder/settings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 10 - 5 - 1000 - - - - - -4 -4 -4 4 4 4 - - - - diff --git a/tests/test_reflective_cylinder/test_reflective_cylinder.py b/tests/test_reflective_cylinder/test_reflective_cylinder.py deleted file mode 100644 index 2a595f3e66..0000000000 --- a/tests/test_reflective_cylinder/test_reflective_cylinder.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -sys.path.insert(0, os.pardir) -from testing_harness import TestHarness - - -if __name__ == '__main__': - harness = TestHarness('statepoint.10.*') - harness.main() diff --git a/tests/test_reflective_sphere/geometry.xml b/tests/test_reflective_sphere/geometry.xml deleted file mode 100644 index 0dc98eba69..0000000000 --- a/tests/test_reflective_sphere/geometry.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/test_reflective_sphere/results_true.dat b/tests/test_reflective_sphere/results_true.dat deleted file mode 100644 index 91dd20fba8..0000000000 --- a/tests/test_reflective_sphere/results_true.dat +++ /dev/null @@ -1,2 +0,0 @@ -k-combined: -2.271012E+00 3.466351E-03 diff --git a/tests/test_reflective_sphere/settings.xml b/tests/test_reflective_sphere/settings.xml deleted file mode 100644 index a6fd5da19e..0000000000 --- a/tests/test_reflective_sphere/settings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 10 - 5 - 1000 - - - - - -4 -4 -4 4 4 4 - - - - diff --git a/tests/test_reflective_sphere/test_reflective_sphere.py b/tests/test_reflective_sphere/test_reflective_sphere.py deleted file mode 100644 index 2a595f3e66..0000000000 --- a/tests/test_reflective_sphere/test_reflective_sphere.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -sys.path.insert(0, os.pardir) -from testing_harness import TestHarness - - -if __name__ == '__main__': - harness = TestHarness('statepoint.10.*') - harness.main() From d61424218f9580053e89a7301e0acebb1b8537f8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Oct 2015 15:22:50 +0700 Subject: [PATCH 317/519] Clarify geometry methods documentation --- docs/source/methods/geometry.rst | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/source/methods/geometry.rst b/docs/source/methods/geometry.rst index 6592909298..c1be68f72e 100644 --- a/docs/source/methods/geometry.rst +++ b/docs/source/methods/geometry.rst @@ -10,7 +10,7 @@ Constructive Solid Geometry OpenMC uses a technique known as `constructive solid geometry`_ (CSG) to build arbitrarily complex three-dimensional models in Euclidean space. In a CSG model, -every unique object is described as the union, intersection, or difference of +every unique object is described as the union and/or intersection of *half-spaces* created by bounding `surfaces`_. Every surface divides all of space into exactly two half-spaces. We can mathematically define a surface as a collection of points that satisfy an equation of the form :math:`f(x,y,z) = 0` @@ -54,13 +54,12 @@ dividing space into two half-spaces. Example of an ellipse and its associated half-spaces. References to half-spaces created by surfaces are used to define regions of -space of uniform composition, known as *cells*. While some codes allow regions -to be defined by intersections, unions, and differences or half-spaces, OpenMC -is currently limited to cells defined only as intersections of -half-spaces. Thus, the specification of the cell must include a list of -half-space references whose intersection defines the region. The region is then -assigned a material defined elsewhere. Figure :num:`fig-union` shows an -example of a cell defined as the intersection of an ellipse and two planes. +space of uniform composition, which are then assigned to *cells*. OpenMC allows +regions to be defined using union, intersection, and complement operators. As in +MCNP_, the intersection operator is implicit as doesn't need to be written in a +region specification. A defined region is then associated with a material +composition in a cell. Figure :num:`fig-union` shows an example of a cell region +defined as the intersection of an ellipse and two planes. .. _fig-union: From 7adde6fcb3c7744e8bd6104c09ea04bfd5316efd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 9 Oct 2015 21:35:55 +0700 Subject: [PATCH 318/519] Fix comments in quadric_distance --- src/surface_header.F90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 257cdbc1a1..8b4ed00919 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -1001,14 +1001,14 @@ contains quad = k*k - a*c if (quad < ZERO) then - ! no intersection with cone + ! no intersection with surface d = INFINITY elseif (coincident .or. abs(c) < FP_COINCIDENT) then - ! particle is on the cone, thus one distance is positive/negative and the - ! other is zero. The sign of k determines which distance is zero and which - ! is not. + ! particle is on the surface, thus one distance is positive/negative and + ! the other is zero. The sign of k determines which distance is zero and + ! which is not. if (k >= ZERO) then d = (-k - sqrt(quad))/a From a508c3b42073a0219ba5e1bfd77302407366f7db Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 9 Oct 2015 16:07:42 -0400 Subject: [PATCH 319/519] Added docstrings to MGXS Library object --- .../examples/multi-group-cross-sections.ipynb | 426 ++++++++++++++++-- openmc/mgxs/library.py | 202 +++++++-- openmc/mgxs/mgxs.py | 143 +++--- 3 files changed, 638 insertions(+), 133 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 0c0250437c..cbd81f1544 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -478,7 +478,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-09 00:44:07\n", + " Date/Time: 2015-10-09 16:04:33\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -563,20 +563,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1300E-01 seconds\n", - " Reading cross sections = 1.0500E-01 seconds\n", - " Total time in simulation = 1.3459E+01 seconds\n", - " Time in transport only = 1.3445E+01 seconds\n", - " Time in inactive batches = 2.1740E+00 seconds\n", - " Time in active batches = 1.1285E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 4.3000E-01 seconds\n", + " Reading cross sections = 9.0000E-02 seconds\n", + " Total time in simulation = 1.5218E+01 seconds\n", + " Time in transport only = 1.5180E+01 seconds\n", + " Time in inactive batches = 1.8800E+00 seconds\n", + " Time in active batches = 1.3338E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.3882E+01 seconds\n", - " Calculation Rate (inactive) = 11499.5 neutrons/second\n", - " Calculation Rate (active) = 8861.32 neutrons/second\n", + " Total time for finalization = 8.0000E-03 seconds\n", + " Total time elapsed = 1.5664E+01 seconds\n", + " Calculation Rate (inactive) = 13297.9 neutrons/second\n", + " Calculation Rate (active) = 7497.38 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1026,7 +1026,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Importing ray tracing data from file...\n", + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", @@ -1461,7 +1462,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1501,11 +1502,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Delete old HDF5 files\n", "!rm *.h5\n", @@ -1531,7 +1543,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1552,7 +1564,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1588,11 +1600,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 5.91e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 4.03e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.48e+01 +/- 5.56e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.84e+01 +/- 8.48e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 1.25e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 7.98e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 5.73e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 6.74e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 8.28e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t4.75e-04 +/- 7.97e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 7.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.22e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 7.97e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 5.72e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" @@ -1607,11 +1654,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 6.42e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.52e-03 +/- 3.96e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 5.56e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.32e-02 +/- 8.48e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.25e+00%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.09e+00%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 7.98e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 5.73e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "nufission = xs_library[fuel_cell.id]['nu-fission']\n", "nufission.print_xs(xs_type='macro', nuclides='sum')" @@ -1626,11 +1696,141 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211O-161.5600980.017801
1271000211H-10.2348770.010096
1241000212O-160.2882360.004397
1251000212H-11.5878150.007847
1221000213O-160.0000000.000000
1231000213H-10.0101220.000513
1201000214O-160.0000000.000000
1211000214H-10.0000000.000000
1181000215O-160.0000000.000000
1191000215H-10.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "126 10002 1 1 O-16 1.560098 0.017801\n", + "127 10002 1 1 H-1 0.234877 0.010096\n", + "124 10002 1 2 O-16 0.288236 0.004397\n", + "125 10002 1 2 H-1 1.587815 0.007847\n", + "122 10002 1 3 O-16 0.000000 0.000000\n", + "123 10002 1 3 H-1 0.010122 0.000513\n", + "120 10002 1 4 O-16 0.000000 0.000000\n", + "121 10002 1 4 H-1 0.000000 0.000000\n", + "118 10002 1 5 O-16 0.000000 0.000000\n", + "119 10002 1 5 H-1 0.000000 0.000000" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", @@ -1646,7 +1846,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1674,11 +1874,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAADDCAYAAACxgLv/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFxZJREFUeJzt3XmYVNWZx/FvAyIKCijGBRiaxA0VRVTcpROX4BLNzKhR\n46jEOMZldOIel9gkJsRM4q6joxFxJRHRcVc0NGpcEVAEdVzoCAooi7iAcaHmj/cUVV3Ucqrq3KrT\nze/zPPV01/bWuVXvfe+5596qAyIiIiIiIiIiIiIiIiIiIiIiIiIiNfHfwIX1bkQAHWU5JDl7Am/U\nuxEBdJTlaKMV2DvntuOAp4s8ZxvgMeAjYIXHaxwCTAeWuuc8CTSW18xVNAO35dzWAhxfZdykNGLv\n1dSc2/sAXwKzPeMcR/HPZnV3HDAD+ByYB1wH9CzxnMOBZ91zJuW5vzNwCfA+8An2GRaK2Q+4B8vz\nj11bji1nAfJoxHKnU9ZtxxF3HrRgbd425/Z73e17ecZZAXw7XLPK16n0QxKRcpdyfAmMw68IbgqM\nBX6OJfNA4FrgmzJf00e5y5GrFp/BWsDWWdePAt6l+rZnq1cu1duZwO/c33WBXYABwERgjSLPWwRc\n5p6bzygXaxcX92jgiwKPvQ34O/BPwHrAvwELylmIIhoCxQHoEjBWPingTeCYrNvWB3YFPiwzVrHl\nTno56mY28L2c247Fb2u8KaV7zIcC04rc3wk4H3gb641MAfq6+64E3sN62lOAPdztI4B/YBuIT7He\n+CXA18Byd9tV7rFbYivmImx357Cs174F2+V/GPgM23O4Bfi1u78JmAucga1cH2A9lbT1gQdc+150\nbSj0vjVi79X5wO+zbn/J3ZbdYz4v6/2YCfzQ3T7ILd/XbhkXey7HucDzWM8P4CTgNaBrgba2R+ti\n78mhObd3xwrBSI8YP2XVHnNvF3egZzs+ZdVeYrY9sN75Eiy3073pA7H1ZKm7/eKs57yH5c6nWE7s\ngm0YcvNgTeAP2IZhPpYT3dx9TVgun4PtSYx1t83Jep1WbKP2CtbbH+dipp2DrQNzsfeqWG92EnCR\ni58urKdiezBzyPSYhwHPuffjA+BqMhvRp9xrfOaW8zCP5fgOtq5v765vgu29+PbQozGb8ocy0nwK\n80CsmFyGvYE9cu4/G3gV2MxdH4z1NAB+jK0YnbDiOI9MMbkYuDUn1iTgJ1nXu2Mf2LEuxhDsQxrk\n7r8FS8Bd3fU1gTHAr9z1JuArbNikM7A/trub3o0dB9yJJf8gbAV6Ku+7kCnMA9zjGoCtgNex9z+7\nMB8KbOT+PxxLzA3d9XwbzVLL0QBMxt6zzbAVebsC7WyvRmCfVb69hVuwz6mUfIV5L6xopAvBm8DJ\nRWJMBJ4BfoT1mrMNwArrj7B8Wo/M5zCczJ7UYKywHpL1vNyhjHx5cDlwH9ALW8/uB37r7mvC3p/R\nWOHrxqqFeTa2Ad8IW+9mASe6+0Zgyz8I2+u7HdvrLVaYj8eGPEe4217ANirZhXkoVpw7ueWcBZye\nFSe3+Pssx0+xDs1a7vWzO0Jlq9fuZwP2YS7JulxLuF3r2dgb1xf4C1YYx2BFE+zDuwB4y12fQaYH\ncIdrzwqssK8JbJHV7ny7ONm3HeRef6yLMR2YQNte833YFhusF54b4yuswH0DPIIVyS2wFetfsGL3\nBVZgxxZoU7a52Mq9L7abl7txARiPrZhg79lbwM552paWKrEcKfdapwH/C1yK9Yo6kj7AQvJ3FOa7\n+yvRD9sQb4ZtXA/FNtT7FHj8YVjBvAgbopoG7OjuOwor3H/G8mkxmc9hMlZMwNaBcVixhtJ5nr5+\nAtaB+RjL09HAEVmPWYHl61cUHoq5Cnu/lmB7g0Pc7YcDN2N5vtzF8RlauRXLvS2xDcbzOfdPxfY2\nV2A9/f8hs9yFlFqOm7A9zhexDs0FHu0sqJ5jzIdgW8j05WQyb/qPsd2IT4GHKnyNF7BewrewI6h7\nkXmz+gPvFHjeWdgW9GMsUXpSegXL3qAMwApa9kbnKDK9zxRtt7T5LKLtyr4M641sgI1vZT9/bolY\n6de8Fdu1PgIbk8xN8GOwFTrd5m2wYZNiSi3H37EDMgOwDW9HsxDLjXzr0cZYhwDgejL5fJ5H3OXu\n76+wDV66aB5Q4PEfA7/APrMNsc7Afe6+/lixzmdnrJf5oYtxIqU/82wbAGsDL5PJm0dou758hA3/\nFTM/6//lZDpQG1NZrk/AhkpPIX8nZHPgQaw3vhT4DaWX22c5bsL2QK7GCnjFYjpgk10o7gDWcZcD\nA8Segh2ZTe+2zcGGRHLtiQ1zHIZtaXtjH1x2LzBX7m3vYT2R7I3OOliSFOOzt/ARNsbXP+u2/gUe\nm2sCtmK/w6oJPgDrNZyC7er2xsaDiy23jwOx3cgnsXHIjuY5rHD+a87tPbBd6Sfd9Z+Ryefcg335\n3ttXC7yez+ewCPgjNs65HpaP3ynw2DuxAt4Py/frydQEn1xfiBXSrcjkei9s7L2cNhcyj8pyfTm2\ngfgZq55FBTYOPgurAT2xDlupWlhqOXoAV2DFeRT2XlQspsLsoxuZ8d41aXuQINvu2JjPBu76lsAP\nyOzS3IQdpNoUKz7bYkncAyt8C93r/JK2STYf27XM3ogsoG3iP4htkY/GxqPWAHZybYDCu4g+u2jf\nYAW2GRvL2hI7Au+T/J8D38Xel1zdXYyFWE6MxHpfaQuwlTf7LINSu7p9gBuxYaPjsPd/f492tidL\nsZXwauD72PvTiA0FzSF/UUjrhOXzGu7/Ncm8v+9gQxMXYHk4CNv7e7BArEuxTkcXrPifhA1FLcaK\n7z5YZ6ML1jNMjzH3wHq5X2JjrkeRyaX0aanZuT2ftnmwAvuMryCzrvUF9iuy3D7SefQXLBe3xHrm\nF5UR43xseOK9PPf1wPZelrnYJ+Xcn7tO+7gSG8b4d2wv//oyn99GTIW51Cl0jdgb+Zp73HJs7Cmf\nj4GDsV3AT7Gt5wQyA/KXYR/649jKdSO2kjwGPAr8H3a0eDltP9i73d9FWC8c7AM5FFsJrsDG2fbD\nhgzex7b6o8lsUPItZ+5txd6HU7Gt/HxsfPkuiu9iZceaStsDfun7ZmG9rOdc3G2wg0lpT2JjkfPJ\nnHZUajluwHpjj2LvzfHYBrGqnkSE/gsrAn/Acul5bAhnb4rvzh6D5fN12J7acuw9SzsS25NZhBXk\nC8l/vjPYRvperMi+g/UsD3b3vYftKZ3pYk0jcwbHydhwySdY0ftzVsxl2C7+31zcYcBfWTUPzsXG\nVp93yz8R65ik+fS8c+9L3/8oNv48CVsnc49nFDMPOxMln7OwjdAn2J7iuJw2NWPr1hJs3S5Um9K3\nHYKt8+kCfwZ2gPFIj3ZKB3UpdmBTpKMbhO3RxtShFAHs7Ixtsd29Ydgu58FFnyHSfv0zNszTGzsV\nb0J9myOS347Y+OHn2NH2c+vbHJFEPYINTS7Cvna+YfGHi4iIiIiIlDZ0ePqIpS66JHPZbniKOug5\nfHD9l12XDnwZkKKAEL8clWJKwfgZNzTDic1FH/LtHWYWvT9tcfO1rNdc/Psa707euuj9K41phpHF\n2+VNsZKJ1dQAYX/lzFdqeOqRkg9qbb6dxuajiz5mcoPvabFXYd9iL+YOz1gt2C8ThKBY4WONggJ5\nrdNOREQio8IsIhKZ2hXmHZqChVqraadgsRjSpFgdIVYd9Woq9lPI5dq59EO8NSpWO43lM243Avuq\ncWfsK7WX5tzvN8bswXeM2Yf3GLPEL7kx5pK57TPG7MN/jNmH7xizxK3yMebOwDVYAm+Fffd7UNFn\niLQPym2JVqnCPAz7gZJW7AdZxpGZ4UCkPVNuS7RKFea+rPpD1X0LPFakPVFuS7RKzfbqN3h8Q3Pm\n/x2aYMemCpsjAkxrgektSb+KV263Nt++8v9eTdsGPtAnq5dWdymtVGF+n1VnEFh1epcSXxwRKcv2\nTXZJGzsqiVfxyu1SXxwR8ddI27M1Jhd8ZKmhjClkJoTsis2icH81TROJhHJbolWqx/w1NmPGY9hR\n7D9ReNYQkfZEuS3RKlWYwX4PNczJnCJxUW5LlPSVbBGRyKgwi4hERoVZRCQyKswiIpHxOfhX2mdB\norAOn4YJBOwxfGKwWADPTN43aDxpHyY3PB8kzsXsHyQOwCj+GCwWfBIwloSiHrOISGRUmEVEIqPC\nLCISGRVmEZHIqDCLiETGpzDfDCwAZiTcFpFaU25LlHwK8xhs+h2Rjka5LVHyKcxPA0uSbohIHSi3\nJUoaYxYRiUyYb/6Nac78P6Sp7ewTIuWqzdRSnlqy/m+k7QwUIuVoJdTUUn5GNgcJIwLUamopT011\nfG3pWBoJNbWUiIjUmE9hvgt4Ftgcm+59ZKItEqkd5bZEyWco48jEWyFSH8ptiZKGMkREIqPCLCIS\nGRVmEZHIqDCLiEQmzHnMgbwyeZdgsX49/KxgsQC+HN41WKwXXx4eLBZfhAslyRnFxcFi/Y4zg8U6\njyuDxYLFAWOt3tRjFhGJjAqziEhkVJhFRCKjwiwiEhkVZhGRyPgU5v7AJGAm8BpwWqItEqkd5bZE\nyed0ua+AnwPTgR7Ay8BE4PUE2yVSC8ptiZJPj3k+lrgAn2FJu0liLRKpHeW2RKncMeZGYHvghfBN\nEamrRpTbEolyvvnXAxgPnI71LjI0tZSENLXFppeqncK5ramlJJhWQk8ttQZwD3A7cN8q92pqKQlp\naJNd0sYkOrVU8dzW1FISTCMhp5ZqAP4EzAKuqKJVIrFRbkuUfArz7sDRwHeBae4yIslGidSIclui\n5DOU8Qz6Iop0TMptiZKSUkQkMirMIiKRUWEWEYmMCrOISGQaAsRI0ZIKECZy14QLdd/d3w8W67ec\nHyzW299sGiwWwOL564cJ1G8tCJOr5UoRcEqoGD1NuHPE9+SVYLHMhMDxYjMKCuS1eswiIpFRYRYR\niYwKs4hIZFSYRUQio8IsIhIZn8LcDfuN2unYj72MTrRFIrWhvJZo+fxWxhfYj7wsc49/BtjD/RVp\nr5TXEi3foYxl7m9XoDOwOJnmiNSU8lqi5FuYO2G7fAuwWYVnJdYikdpRXkuUfGcwWQEMAXoCj2HT\nOrSsvFdTS0lIzz4Fzz1Vi1cqnteAppaScFoJPbVU2lLgIWBHsjNWU0tJSLvtZZe0y3+T9Cvmz2tA\nU0tJOI2EnFqqD9DL/b8WsC8204NIe6a8lmj59Jg3BsZiRbwTcBvwZJKNEqkB5bVEy6cwzwCGJt0Q\nkRpTXku09M0/EZHIqDCLiERGhVlEJDIqzCIikVFhFhGJTLlfMFl9/We4UD9s2DVYrNSCpmCxRn8r\n4EICT/TdO0icvwaJIvnsySXBYqUO2C5YLICGdwPOJfpGc7hYNaAes4hIZFSYRUQio8IsIhIZFWYR\nkcj4FubO2A+8PJBgW0TqQbkt0fEtzKdjPyIe8DCpSBSU2xIdn8LcDzgAuAloSLY5IjWl3JYo+RTm\ny4GzsdkeRDoS5bZEqdQXTA4CPsTG4JoKPkpTS0lAS1pmsKRlRtIv45fbmlpKgmkl1NRSuwEHY7t7\n3YB1gVuBY9o8SlNLSUC9mwbTu2nwyuuto+5K4mX8cltTS0kwjYSaWup8oD8wEDgC+3bsMUWfIdI+\nKLclWuWex6wj19JRKbclGuX8iNFkivW9Rdov5bZERd/8ExGJjAqziEhkVJhFRCKjwiwiEhkVZhGR\nyGhqKV9fB4w1pTlYqIYN1wsWK3XN6cFiAWx6yttB4mhqqSR9FSxSw8NjgsUCSF0T7udLGt4IeDbk\nNc3hYhWgHrOISGRUmEVEIqPCLCISGRVmEZHI+B78awU+Ab7BjhYMS6pBIjXUivJaIuRbmFPY7x8u\nTq4pIjWnvJYolTOUoal3pCNSXkt0fAtzCngCmAKckFxzRGpKeS1R8h3K2B2YB2wATATeAJ5eea+m\nlpKAZrYsZGbLolq8VPG8BjS1lITTSqippdLmub8fAfdiB0kyCayppSSgrZv6sHVTn5XXx496K6mX\nKp7XgKaWknAaCTW1FMDawDru/+7AfkDiM2WKJEx5LdHy6TFviPUm0o+/A3g8sRaJ1IbyWqLlU5hn\nA0OSbohIjSmvJVr65p+ISGRUmEVEIqPCLCISGRVmEZHIqDCLiEQmxO8EpGgJOG2LlKXbkHC/v/PF\nNeGmqQJI3R7mZyga3rA/QYKVJwUX1+FlxQwNFil1ziHBYjXMClTvHmyAAnmtHrOISGRUmEVEIqPC\nLCISGRVmEZHI+BTmXsB44HVgFrBLoi0SqR3ltkTJ57cyrgQeBg51j++eaItEake5LVEqVZh7AnsC\nx7rrXwNLE22RSG0otyVapYYyBmI/Ij4GmArciP2OrUh7p9yWaJXqMXfBzvI+FXgJuAI4D/hlm0dp\naikJqOVzaFmW+Mv45bamlpJQFrbAohavh5YqzHPd5SV3fTyWvG1paikJqKm7XdJGJTP9n19ua2op\nCaVPk13S3hpV8KGlhjLmA3OAzd31fYCZ1bRNJBLKbYmWz1kZ/4FNu9MVeAcYmWiLRGpHuS1R8inM\nrwA7Jd0QkTpQbkuU9M0/EZHIqDCLiERGhVlEJDIqzCIikVFhFhGJjM9ZGRKxL94ONx1UywU7B4sF\n0Hxh0HCy2pkaLFLD778MFuvxQLOc7VfkPvWYRUQio8IsIhIZFWYRkcioMIuIRManMG8BTMu6LAVO\nS7JRIjWgvJZo+ZyV8Sawvfu/E/A+cG9iLRKpDeW1RKvcoYx9sF/hmpNAW0TqRXktUSm3MB8B3JlE\nQ0TqSHktUSnnCyZdgR8A565yj6aWkoBa3aVGCuc1oKmlJJRX3MVHOYV5f+BlbALLtjS1lATUSNvy\nNznZlyuc14CmlpJQtnOXtNuLPLacoYwjgbsqapFIvJTXEh3fwtwdO0AyIcG2iNSa8lqi5DuU8TnQ\nJ8mGiNSB8lqipG/+iYhEpnaFeVqLYtUr1pRwsaa1fBIsVmuwSPXWqlgdIla4w8y+Z18UUrvCPL1F\nseoV6+VwsaarMOfRqlgdItbqWJhFRMSLCrOISGRCzJHSAgwPEEekkMnU55seLSi3JTn1ymsRERER\nERERkfZoBPAG8BYFf8XLy83AAmBGgDb1ByYBM4HXqG72im7AC8B0YBYwusq2dcZm1Xigyjhg5xO9\n6uK9WGWsXsB44HVsOXepME5HmT1EeV2+ULndivK6Kp2Bt7EfDFsD+5AHVRhrT2zWiRAJvBEwxP3f\nA5vRotJ2Aazt/nYBngf2qCLWGcAdwP1VxEibDawXIA7AWOAn7v8uQM8AMTsB87CC0p4orysTKrc7\ndF7X4nS5YVgCtwJfAeOAQyqM9TSwJEyzmI+tTACfYVvLTaqIt8z97YqttIsrjNMPOAC4iTBnzRAo\nTk+sgNzsrn+N9Qiq1V5nD1Fely90bnfYvK5FYe5L28bNdbfFpBHrsbxQRYxO2AqxANuVnFVhnMuB\ns4EVVbQlWwp4ApgCnFBFnIHYbxaPAaYCN5LpTVWjvc4eorwuX8jc7tB5XYvCnKrBa1SjBza+dDrW\nw6jUCmwXsh+wF5Wdn3gQ8CE2PhWqt7w7tnLuD5yC9Q4q0QUYClzn/n4OnFdl29Kzh9xdZZx6UF6X\nJ3Rud+i8rkVhfp+24yz9sd5FDNYA7sEmE7gvUMylwEPAjhU8dzfgYGz87C7ge8CtVbZnnvv7ETYL\n9LAK48x1l5fc9fFYIlejxOwhUVNelyd0biuvq9QFG2tpxLYk1RwkwcUJcZCkAUuMywPE6oMd2QVY\nC3gK2LvKmMOp/sj12sA67v/uwN+A/aqI9xSwufu/Gbi0ilhg47LHVhmjXpTXlas2t5XXgeyPHR1+\nG/hFFXHuAj4A/oGN742sItYe2G7adDKnt4yoMNZgbHxqOnYKz9lVtCttONUfuR6ItWk6dupUNe89\n2JRlL2E/njWB6o5edwcWklnB2iPldWWqzW3ltYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHRs/w9e\ned7lsJ91IAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create plot of the H-1 scattering matrix\n", "fig = plt.subplot(121)\n", @@ -1703,7 +1914,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": { "collapsed": true }, @@ -1725,22 +1936,133 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttransport\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 5.85e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", + "\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "condense_xs.print_xs()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2389.5893230.038756
4100001O-163.1591010.012939
5100001U-23521.0952560.257787
0100002U-23811.1788440.065428
1100002O-163.8000270.024538
2100002U-235485.5135302.418761
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-238 9.589323 0.038756\n", + "4 10000 1 O-16 3.159101 0.012939\n", + "5 10000 1 U-235 21.095256 0.257787\n", + "0 10000 2 U-238 11.178844 0.065428\n", + "1 10000 2 O-16 3.800027 0.024538\n", + "2 10000 2 U-235 485.513530 2.418761" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", "df" @@ -1762,7 +2084,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -1784,7 +2106,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -1832,7 +2154,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -1860,11 +2182,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.227616\n", + "openmoc keff = 1.225325\n", + "bias [pcm]: -229.1\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1885,7 +2217,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -1926,7 +2258,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -1944,11 +2276,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.227616\n", + "openmoc keff = 1.227096\n", + "bias [pcm]: -52.0\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 6f9d40a55e..a7276bc9ea 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -12,6 +12,51 @@ if sys.version_info[0] >= 3: class Library(object): + """A multi-group cross section library for some energy group structure. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross sections for deterministic neutronics calculations. + + This class helps automate the generation of MGXS objects for some energy + group structure and domain type. The Library serves as a collection for + MGXS objects with routines to automate the initialization of tallies for + input files, the loading of tally data from statepoint files, data storage, + energy group condensation and more. + + Parameters + ---------- + openmc_geometry : openmc.Geometry + An geometry which has been initialized with a root universe + by_nuclide : bool + If true, computes cross sections for each nuclide in each domain + mgxs_types : Iterable of str + The types of cross sections in the library (e.g., ['total', 'scatter']) + name : str, optional + Name of the multi-group cross section. library Used as a label to + identify tallies in OpenMC 'tallies.xml' file. + + Attributes + ---------- + openmc_geometry : openmc.Geometry + An geometry which has been initialized with a root universe + by_nuclide : bool + If true, computes cross sections for each nuclide in each domain + mgxs_types : Iterable of str + The types of cross sections in the library (e.g., ['total', 'scatter']) + domain_type : {'material', 'cell', 'distribcell', 'universe'} + Domain type for spatial homogenization + energy_groups : EnergyGroups + Energy group structure for energy condensation + all_mgxs : dict + MGXS objects keyed by domain ID and cross section type + statepoint : openmc.StatePoint + The statepoint with tally data used to the compute cross sections + name : str, optional + Name of the multi-group cross section library. Used as a label to + identify tallies in OpenMC 'tallies.xml' file. + + """ def __init__(self, openmc_geometry, by_nuclide=False, mgxs_types=None, name=''): @@ -23,6 +68,7 @@ class Library(object): self._domain_type = None self._energy_groups = None self._all_mgxs = {} + self._statepoint = None self.name = name self.openmc_geometry = openmc_geometry @@ -104,6 +150,10 @@ class Library(object): def all_mgxs(self): return self._all_mgxs + @property + def statepoint(self): + return self._statepoint + @openmc_geometry.setter def openmc_geometry(self, openmc_geometry): cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) @@ -140,7 +190,13 @@ class Library(object): self._energy_groups = energy_groups def build_library(self): - """ + """Initialize MGXS objects in each domain and for each reaction type + in the library. + + This routine will populate the all_mgxs instance attribute dictionary + with MGXS subclass objects keyed by each domain ID (e.g., Material IDs) + and cross section type (e.g., 'nu-fission', 'total', etc.). + """ # Initialize MGXS for each domain and mgxs type and store in dictionary @@ -155,13 +211,20 @@ class Library(object): mgxs.create_tallies() self.all_mgxs[domain.id][mgxs_type] = mgxs - def add_to_tallies_file(self, tallies_file): - """ + def add_to_tallies_file(self, tallies_file, merge=True): + """Add all tallies from all MGXS objects to a tallies file. NOTE: This assumes that build_library() has been called - :param tallies_file: - :return: + Parameters + ---------- + tallies_file : openmc.TalliesFile + A TalliesFile object to add each MGXS' tallies to generate a + "tallies.xml" input file for OpenMC + merge : bool + Indicate whether tallies should be merged when possible. Defaults + to True. + """ cv.check_type('tallies_file', tallies_file, openmc.TalliesFile) @@ -171,17 +234,39 @@ class Library(object): for mgxs_type in self.mgxs_types: mgxs = self.get_mgxs(domain, mgxs_type) for tally_id, tally in mgxs.tallies.items(): - tallies_file.add_tally(tally, merge=True) + tallies_file.add_tally(tally, merge=merge) def load_from_statepoint(self, statepoint): - """ + """Extracts tallies in an OpenMC StatePoint with the data needed to + compute multi-group cross sections. + + This method is needed to compute cross section data from tallies + in an OpenMC StatePoint object. + + NOTE: The statepoint must first be linked with an OpenMC Summary object. + + Parameters + ---------- + statepoint : openmc.StatePoint + An OpenMC StatePoint object with tally data + + Raises + ------ + ValueError + When this method is called with a statepoint that has not been + linked with a summary object. - :param statepoint: - :return: """ cv.check_type('statepoint', statepoint, openmc.StatePoint) + if not statepoint.with_summary: + msg = 'Unable to load data from a statepoint which has not been ' \ + 'linked with a summary file' + raise ValueError(msg) + + self._statepoint = statepoint + # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: for mgxs_type in self.mgxs_types: @@ -190,11 +275,33 @@ class Library(object): mgxs.compute_xs() def get_mgxs(self, domain, mgxs_type): - """ + """Return the MGXS object for some domain and reaction rate type. + + This routine searches the library for an MGXS object for the spatial + domain and reaction rate type requ + + NOTE: This routine must be called after the build_library() routine. + + Parameters + ---------- + domain : Material or Cell or Universe or Integral + The material, cell, or universe object of interest (or its ID) + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', + 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', + 'nu-scatter matrix', 'chi'} + The type of multi-group cross section object to return + + Returns + ------- + openmc.mgxs.MGXS + The MGXS object for the requested domain and reaction rate type + + Raises + ------ + ValueError + If no MGXS object can be found for the requested domain or + multi-group cross section type - :param domain: - :param mgxs_type: - :return: """ if self.domain_type == 'material': @@ -225,15 +332,38 @@ class Library(object): return self.all_mgxs[domain_id][mgxs_type] def get_condensed_library(self, coarse_groups): + """Construct an energy-condensed version of this library. + + This routine condense each of the multi-group cross sections in the + library to a coarse energy group structure. NOTE: This routine must + be called after the load_from_statepoint(...) routine loads the tallies + from the statepoint into each of the cross sections. + + Parameters + ---------- + coarse_groups : openmc.mgxs.EnergyGroups + The coarse energy group structure of interest + + Returns + ------- + Library + A new multi-group cross section library condensed to the group + structure of interest + + Raises + ------ + ValueError + When this method is called before a statepoint has been loaded + + See also + -------- + MGXS.get_condensed_xs(coarse_groups) + """ - :param coarse_groups: - :return: - """ - - if self.energy_groups is None: + if self.statepoint is None: msg = 'Unable to get a condensed coarse group cross section ' \ - 'library since the fine energy groups have not yet been set' + 'library since the statepoint has not yet been loaded' raise ValueError(msg) cv.check_type('coarse_groups', coarse_groups, openmc.mgxs.EnergyGroups) @@ -260,26 +390,42 @@ class Library(object): def build_hdf5_store(self, filename='mgxs', directory='mgxs', xs_type='macro'): """Export the multi-group cross section library to an HDF5 binary file. - This method constructs an HDF5 file which stores the multi-group - cross section data. The data is stored in a hierarchy of HDF5 groups - from the domain type, domain id, subdomain id (for distribcell domains), - nuclides and cross section types. Two datasets for the mean and standard - deviation are stored for each subdomain entry in the HDF5 file. + This method constructs an HDF5 file which stores the library's + multi-group cross section data. The data is stored in a hierarchy of + HDF5 groups from the domain type, domain id, subdomain id (for + distribcell domains), nuclides and cross section types. Two datasets for + the mean and standard deviation are stored for each subdomain entry in + the HDF5 file. NOTE: This requires the h5py Python package. Parameters ---------- filename : str - Filename for the HDF5 file (default is 'mgxs') + Filename for the HDF5 file. Defaults to 'mgxs'. directory : str - Directory for the HDF5 file (default is 'mgxs') + Directory for the HDF5 file. Defaults to 'mgxs'. xs_type: {'macro', 'micro'} - Store the macro or micro cross section in units of cm^-1 or barns + Store the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + + Raises + ------ + ValueError + When this method is called before a statepoint has been loaded + + See also + -------- + MGXS.build_hdf5_store(filename, directory, xs_type) """ - # Load tallies for each MGXS for each domain and mgxs type + if self.statepoint is None: + msg = 'Unable to get a condensed coarse group cross section ' \ + 'library since a statepoint has not yet been loaded' + raise ValueError(msg) + + # Export MGXS for each domain and mgxs type to an HDF5 file for domain in self.domains: for mgxs_type in self.mgxs_types: mgxs = self.all_mgxs[domain.id][mgxs_type] diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 940586f321..20a9f3d6b2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -242,10 +242,11 @@ class MGXS(object): energy_groups : EnergyGroups The energy group structure for energy condensation by_nuclide : bool - If true, computes cross sections for each nuclide in domain + If true, computes cross sections for each nuclide in domain. + Defaults to False name : str, optional Name of the multi-group cross section. Used as a label to identify - tallies in OpenMC 'tallies.xml' file. + tallies in OpenMC 'tallies.xml' file. Defaults to the empty string. Returns ------- @@ -351,7 +352,8 @@ class MGXS(object): A list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' will return the atom densities for all nuclides in the spatial domain. The special string 'sum' will return the atom - density summed across all nuclides in the spatial domain. + density summed across all nuclides in the spatial domain. Defaults + to 'all'. Returns ------- @@ -544,22 +546,24 @@ class MGXS(object): Parameters ---------- groups : Iterable of Integral or 'all' - Energy groups of interest + Energy groups of interest. Defaults to 'all'. subdomains : Iterable of Integral or 'all' - Subdomain IDs of interest + Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The - special string 'all' (default) will return the cross sections for - all nuclides in the spatial domain. The special string 'sum' will - return the cross section summed over all nuclides. + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. order_groups: {'increasing', 'decreasing'} - Return the cross section indexed according to increasing (default) - or decreasing energy groups (decreasing or increasing energies) + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. value : str - A string for the type of value to return - 'mean' (default), - 'std_dev' or 'rel_err' are accepted + A string for the type of value to return - 'mean', 'std_dev' or + 'rel_err' are accepted. Defaults to 'mean'. Returns ------- @@ -739,7 +743,7 @@ class MGXS(object): Parameters ---------- subdomains : Iterable of Integral or 'all' - The subdomain IDs to average across + The subdomain IDs to average across. Defaults to 'all'. Returns ------- @@ -815,15 +819,17 @@ class MGXS(object): Parameters ---------- subdomains : Iterable of Integral or 'all' - The subdomain IDs of the cross sections to include in the report + The subdomain IDs of the cross sections to include in the report. + Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). - The special string 'all' (default) will report the cross sections - for all nuclides in the spatial domain. The special string 'sum' - will report the cross sections summed over all nuclides. + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will report + the cross sections summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. """ @@ -912,14 +918,15 @@ class MGXS(object): Parameters ---------- filename : str - Filename for the HDF5 file (default is 'mgxs') + Filename for the HDF5 file. Defaults to 'mgxs'. directory : str - Directory for the HDF5 file (default is 'mgxs') + Directory for the HDF5 file. Defaults to 'mgxs'. xs_type: {'macro', 'micro'} - Store the macro or micro cross section in units of cm^-1 or barns + Store the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. append : boolean If true, appends to an existing HDF5 file with the same filename - directory (if one exists) + directory (if one exists). Defaults to True. Raises ------ @@ -1030,15 +1037,16 @@ class MGXS(object): Parameters ---------- filename : str - Filename for the exported file (default is 'mgxs') + Filename for the exported file. Defaults to 'mgxs'. directory : str - Directory for the exported file (default is 'mgxs') + Directory for the exported file. Defaults to 'mgxs'. format : {'csv', 'excel', 'pickle', 'latex'} - The format for the exported data file + The format for the exported data file. Defaults to 'csv'. groups : Iterable of Integral or 'all' - Energy groups of interest + Energy groups of interest. Defaults to 'all'. xs_type: {'macro', 'micro'} - Store the macro or micro cross section in units of cm^-1 or barns + Store the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. """ @@ -1100,15 +1108,17 @@ class MGXS(object): Parameters ---------- groups : Iterable of Integral or 'all' - Energy groups of interest + Energy groups of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). - The special string 'all' (default) will include the cross sections - for all nuclides in the spatial domain. The special string 'sum' - will include the cross sections summed over all nuclides. + The special string 'all' will include the cross sections for all + nuclides in the spatial domain. The special string 'sum' will + include the cross sections summed over all nuclides. Defaults + to 'all'. xs_type: {'macro', 'micro'} - Return macro or micro cross section in units of cm^-1 or barns + Return macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric @@ -1628,24 +1638,26 @@ class ScatterMatrixXS(MGXS): Parameters ---------- in_groups : Iterable of Integral or 'all' - Incoming energy groups of interest + Incoming energy groups of interest. Defaults to 'all'. out_groups : Iterable of Integral or 'all' - Outgoing energy groups of interest + Outgoing energy groups of interest. Defaults to 'all'. subdomains : Iterable of Integral or 'all' - Subdomain IDs of interest + Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The - special string 'all' (default) will return the cross sections for - all nuclides in the spatial domain. The special string 'sum' will - return the cross section summed over all nuclides. + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. order_groups: {'increasing', 'decreasing'} - Return the cross section indexed according to increasing (default) - or decreasing energy groups (decreasing or increasing energies) + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. value : str - A string for the type of value to return - 'mean' (default), - 'std_dev' or 'rel_err' are accepted + A string for the type of value to return - 'mean', 'std_dev', or + 'rel_err' are accepted. Defaults to the empty string. Returns ------- @@ -1756,15 +1768,17 @@ class ScatterMatrixXS(MGXS): Parameters ---------- subdomains : Iterable of Integral or 'all' - The subdomain IDs of the cross sections to include in the report + The subdomain IDs of the cross sections to include in the report. + Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the report. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). - The special string 'all' (default) will report the cross sections - for all nuclides in the spatial domain. The special string 'sum' - will report the cross sections summed over all nuclides. + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will report + the cross sections summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. """ @@ -1952,23 +1966,24 @@ class Chi(MGXS): Parameters ---------- groups : Iterable of Integral or 'all' - Energy groups of interest + Energy groups of interest. Defaults to 'all'. subdomains : Iterable of Integral or 'all' - Subdomain IDs of interest + Subdomain IDs of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The - special string 'all' (default) will return the cross sections for - all nuclides in the spatial domain. The special string 'sum' will - return the cross section summed over all nuclides. + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} This parameter is not relevant for chi but is included here to mirror the parent MGXS.get_xs(...) class method order_groups: {'increasing', 'decreasing'} - Return the cross section indexed according to increasing (default) - or decreasing energy groups (decreasing or increasing energies) + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. value : str - A string for the type of value to return - 'mean' (default), - 'std_dev' or 'rel_err' are accepted + A string for the type of value to return - 'mean', 'std_dev', or + 'rel_err' are accepted. Defaults to 'mean'. Returns ------- @@ -2082,15 +2097,17 @@ class Chi(MGXS): Parameters ---------- groups : Iterable of Integral or 'all' - Energy groups of interest + Energy groups of interest. Defaults to 'all'. nuclides : Iterable of str or 'all' or 'sum' The nuclides of the cross-sections to include in the dataframe. This may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). - The special string 'all' (default) will include the cross sections - for all nuclides in the spatial domain. The special string 'sum' - will include the cross sections summed over all nuclides. + The special string 'all' will include the cross sections for all + nuclides in the spatial domain. The special string 'sum' will + include the cross sections summed over all nuclides. Defaults to + 'all'. xs_type: {'macro', 'micro'} - Return macro or micro cross section in units of cm^-1 or barns + Return macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. summary : None or Summary An optional Summary object to be used to construct columns for distribcell tally filters (default is None). The geometric From 8e536f80953a9f59d67b644f2dc55c20638d79b8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 9 Oct 2015 20:29:09 -0400 Subject: [PATCH 320/519] The MGXS Library.build_hdf5_store(...) can now export by nuclide and subdomain --- .../examples/multi-group-cross-sections.ipynb | 39 ++++++--------- openmc/mgxs/library.py | 16 +++++- openmc/mgxs/mgxs.py | 50 +++++++++++++++---- 3 files changed, 71 insertions(+), 34 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index cbd81f1544..67f43b1719 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -478,7 +478,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-09 16:04:33\n", + " Date/Time: 2015-10-09 20:27:11\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -563,20 +563,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3000E-01 seconds\n", - " Reading cross sections = 9.0000E-02 seconds\n", - " Total time in simulation = 1.5218E+01 seconds\n", - " Time in transport only = 1.5180E+01 seconds\n", - " Time in inactive batches = 1.8800E+00 seconds\n", - " Time in active batches = 1.3338E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Total time for initialization = 3.9000E-01 seconds\n", + " Reading cross sections = 8.8000E-02 seconds\n", + " Total time in simulation = 1.2262E+01 seconds\n", + " Time in transport only = 1.2254E+01 seconds\n", + " Time in inactive batches = 1.8120E+00 seconds\n", + " Time in active batches = 1.0450E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 8.0000E-03 seconds\n", - " Total time elapsed = 1.5664E+01 seconds\n", - " Calculation Rate (inactive) = 13297.9 neutrons/second\n", - " Calculation Rate (active) = 7497.38 neutrons/second\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.2662E+01 seconds\n", + " Calculation Rate (inactive) = 13796.9 neutrons/second\n", + " Calculation Rate (active) = 9569.38 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1883,7 +1883,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2312,15 +2312,6 @@ "* Spatial discretization of OpenMOC's mesh\n", "* Constant-in-angle multi-group cross sections" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index a7276bc9ea..48288ad248 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -387,7 +387,8 @@ class Library(object): return condensed_library - def build_hdf5_store(self, filename='mgxs', directory='mgxs', xs_type='macro'): + def build_hdf5_store(self, filename='mgxs', directory='mgxs', + subdomains='all', nuclides='all', xs_type='macro'): """Export the multi-group cross section library to an HDF5 binary file. This method constructs an HDF5 file which stores the library's @@ -405,6 +406,15 @@ class Library(object): Filename for the HDF5 file. Defaults to 'mgxs'. directory : str Directory for the HDF5 file. Defaults to 'mgxs'. + subdomains : {'all', 'avg'} + Report all subdomains or the average of all subdomain cross sections + in the report. Defaults to 'all'. + nuclides : {'all', 'sum'} + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will report + the cross sections summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} Store the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. @@ -429,4 +439,8 @@ class Library(object): for domain in self.domains: for mgxs_type in self.mgxs_types: mgxs = self.all_mgxs[domain.id][mgxs_type] + + if subdomains == 'avg': + mgxs = mgxs.get_subdomain_avg_xs() + mgxs.build_hdf5_store(filename, directory, xs_type) \ No newline at end of file diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 20a9f3d6b2..e1df3eef36 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -903,8 +903,8 @@ class MGXS(object): print(string) - def build_hdf5_store(self, filename='mgxs', directory='mgxs', - xs_type='macro', append=True): + def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True, + subdomains='all', nuclides='all', xs_type='macro'): """Export the multi-group cross section data to an HDF5 binary file. This method constructs an HDF5 file which stores the multi-group @@ -921,12 +921,21 @@ class MGXS(object): Filename for the HDF5 file. Defaults to 'mgxs'. directory : str Directory for the HDF5 file. Defaults to 'mgxs'. - xs_type: {'macro', 'micro'} - Store the macro or micro cross section in units of cm^-1 or barns. - Defaults to 'macro'. append : boolean If true, appends to an existing HDF5 file with the same filename directory (if one exists). Defaults to True. + subdomains : Iterable of Integral or 'all' + The subdomain IDs of the cross sections to include in the report. + Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will report + the cross sections summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + Store the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. Raises ------ @@ -962,8 +971,29 @@ class MGXS(object): else: xs_results = h5py.File(filename, 'w') + # Construct a collection of the subdomains to report + if subdomains != 'all': + cv.check_iterable_type('subdomains', subdomains, Integral) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + else: + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_all_nuclides() + densities = np.zeros(len(nuclides), dtype=np.float) + elif nuclides == 'sum': + nuclides = ['sum'] + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = ['sum'] + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + ''' if self.by_nuclide: nuclides = self.domain.get_all_nuclides() densities = np.zeros(len(nuclides), dtype=np.float) @@ -971,16 +1001,18 @@ class MGXS(object): densities[i] = nuclides[nuclide][1] else: nuclides = ['sum'] + ''' # Create an HDF5 group within the file for the domain domain_type_group = xs_results.require_group(self.domain_type) - group_name = '{0} {1}'.format(self.domain_type, self.domain.id) - domain_group = domain_type_group.require_group(group_name) + domain_group = domain_type_group.require_group(str(self.domain.id)) - if self.domain_type == 'distribcell': + ''' + if subdomains == 'all' and self.domain_type == 'distribcell': subdomains = np.arange(self.num_subdomains, dtype=np.int) else: subdomains = [self.domain.id] + ''' # Determine number of digits to pad subdomain group keys num_digits = len(str(self.num_subdomains)) @@ -990,7 +1022,7 @@ class MGXS(object): # Create an HDF5 group for the subdomain if self.domain_type == 'distribcell': - group_name = str(subdomain).zfill(num_digits) + group_name = ''.zfill(num_digits) subdomain_group = domain_group.require_group(group_name) else: subdomain_group = domain_group From 769ff64107f05c81b7bcdb136401356399ca18e7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 10 Oct 2015 18:08:47 -0400 Subject: [PATCH 321/519] Fixed bug in statepoint instance attribute for openmc.mgxs.Library --- .../examples/multi-group-cross-sections.ipynb | 34 +++++++------- openmc/mgxs/library.py | 20 ++++++++- openmc/mgxs/mgxs.py | 45 +++++++------------ 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 67f43b1719..fedf7ea950 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -478,7 +478,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-09 20:27:11\n", + " Date/Time: 2015-10-10 17:36:39\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -563,20 +563,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9000E-01 seconds\n", - " Reading cross sections = 8.8000E-02 seconds\n", - " Total time in simulation = 1.2262E+01 seconds\n", - " Time in transport only = 1.2254E+01 seconds\n", - " Time in inactive batches = 1.8120E+00 seconds\n", - " Time in active batches = 1.0450E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 6.3500E-01 seconds\n", + " Reading cross sections = 1.4900E-01 seconds\n", + " Total time in simulation = 1.5217E+01 seconds\n", + " Time in transport only = 1.5201E+01 seconds\n", + " Time in inactive batches = 2.2480E+00 seconds\n", + " Time in active batches = 1.2969E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.2662E+01 seconds\n", - " Calculation Rate (inactive) = 13796.9 neutrons/second\n", - " Calculation Rate (active) = 9569.38 neutrons/second\n", + " Total time elapsed = 1.5866E+01 seconds\n", + " Calculation Rate (inactive) = 11121.0 neutrons/second\n", + " Calculation Rate (active) = 7710.69 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1883,7 +1883,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAADDCAYAAACxgLv/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFxZJREFUeJzt3XmYVNWZx/FvAyIKCijGBRiaxA0VRVTcpROX4BLNzKhR\n46jEOMZldOIel9gkJsRM4q6joxFxJRHRcVc0NGpcEVAEdVzoCAooi7iAcaHmj/cUVV3Ucqrq3KrT\nze/zPPV01/bWuVXvfe+5596qAyIiIiIiIiIiIiIiIiIiIiIiIiIiNfHfwIX1bkQAHWU5JDl7Am/U\nuxEBdJTlaKMV2DvntuOAp4s8ZxvgMeAjYIXHaxwCTAeWuuc8CTSW18xVNAO35dzWAhxfZdykNGLv\n1dSc2/sAXwKzPeMcR/HPZnV3HDAD+ByYB1wH9CzxnMOBZ91zJuW5vzNwCfA+8An2GRaK2Q+4B8vz\nj11bji1nAfJoxHKnU9ZtxxF3HrRgbd425/Z73e17ecZZAXw7XLPK16n0QxKRcpdyfAmMw68IbgqM\nBX6OJfNA4FrgmzJf00e5y5GrFp/BWsDWWdePAt6l+rZnq1cu1duZwO/c33WBXYABwERgjSLPWwRc\n5p6bzygXaxcX92jgiwKPvQ34O/BPwHrAvwELylmIIhoCxQHoEjBWPingTeCYrNvWB3YFPiwzVrHl\nTno56mY28L2c247Fb2u8KaV7zIcC04rc3wk4H3gb641MAfq6+64E3sN62lOAPdztI4B/YBuIT7He\n+CXA18Byd9tV7rFbYivmImx357Cs174F2+V/GPgM23O4Bfi1u78JmAucga1cH2A9lbT1gQdc+150\nbSj0vjVi79X5wO+zbn/J3ZbdYz4v6/2YCfzQ3T7ILd/XbhkXey7HucDzWM8P4CTgNaBrgba2R+ti\n78mhObd3xwrBSI8YP2XVHnNvF3egZzs+ZdVeYrY9sN75Eiy3073pA7H1ZKm7/eKs57yH5c6nWE7s\ngm0YcvNgTeAP2IZhPpYT3dx9TVgun4PtSYx1t83Jep1WbKP2CtbbH+dipp2DrQNzsfeqWG92EnCR\ni58urKdiezBzyPSYhwHPuffjA+BqMhvRp9xrfOaW8zCP5fgOtq5v765vgu29+PbQozGb8ocy0nwK\n80CsmFyGvYE9cu4/G3gV2MxdH4z1NAB+jK0YnbDiOI9MMbkYuDUn1iTgJ1nXu2Mf2LEuxhDsQxrk\n7r8FS8Bd3fU1gTHAr9z1JuArbNikM7A/trub3o0dB9yJJf8gbAV6Ku+7kCnMA9zjGoCtgNex9z+7\nMB8KbOT+PxxLzA3d9XwbzVLL0QBMxt6zzbAVebsC7WyvRmCfVb69hVuwz6mUfIV5L6xopAvBm8DJ\nRWJMBJ4BfoT1mrMNwArrj7B8Wo/M5zCczJ7UYKywHpL1vNyhjHx5cDlwH9ALW8/uB37r7mvC3p/R\nWOHrxqqFeTa2Ad8IW+9mASe6+0Zgyz8I2+u7HdvrLVaYj8eGPEe4217ANirZhXkoVpw7ueWcBZye\nFSe3+Pssx0+xDs1a7vWzO0Jlq9fuZwP2YS7JulxLuF3r2dgb1xf4C1YYx2BFE+zDuwB4y12fQaYH\ncIdrzwqssK8JbJHV7ny7ONm3HeRef6yLMR2YQNte833YFhusF54b4yuswH0DPIIVyS2wFetfsGL3\nBVZgxxZoU7a52Mq9L7abl7txARiPrZhg79lbwM552paWKrEcKfdapwH/C1yK9Yo6kj7AQvJ3FOa7\n+yvRD9sQb4ZtXA/FNtT7FHj8YVjBvAgbopoG7OjuOwor3H/G8mkxmc9hMlZMwNaBcVixhtJ5nr5+\nAtaB+RjL09HAEVmPWYHl61cUHoq5Cnu/lmB7g0Pc7YcDN2N5vtzF8RlauRXLvS2xDcbzOfdPxfY2\nV2A9/f8hs9yFlFqOm7A9zhexDs0FHu0sqJ5jzIdgW8j05WQyb/qPsd2IT4GHKnyNF7BewrewI6h7\nkXmz+gPvFHjeWdgW9GMsUXpSegXL3qAMwApa9kbnKDK9zxRtt7T5LKLtyr4M641sgI1vZT9/bolY\n6de8Fdu1PgIbk8xN8GOwFTrd5m2wYZNiSi3H37EDMgOwDW9HsxDLjXzr0cZYhwDgejL5fJ5H3OXu\n76+wDV66aB5Q4PEfA7/APrMNsc7Afe6+/lixzmdnrJf5oYtxIqU/82wbAGsDL5PJm0dou758hA3/\nFTM/6//lZDpQG1NZrk/AhkpPIX8nZHPgQaw3vhT4DaWX22c5bsL2QK7GCnjFYjpgk10o7gDWcZcD\nA8Segh2ZTe+2zcGGRHLtiQ1zHIZtaXtjH1x2LzBX7m3vYT2R7I3OOliSFOOzt/ARNsbXP+u2/gUe\nm2sCtmK/w6oJPgDrNZyC7er2xsaDiy23jwOx3cgnsXHIjuY5rHD+a87tPbBd6Sfd9Z+Ryefcg335\n3ttXC7yez+ewCPgjNs65HpaP3ynw2DuxAt4Py/frydQEn1xfiBXSrcjkei9s7L2cNhcyj8pyfTm2\ngfgZq55FBTYOPgurAT2xDlupWlhqOXoAV2DFeRT2XlQspsLsoxuZ8d41aXuQINvu2JjPBu76lsAP\nyOzS3IQdpNoUKz7bYkncAyt8C93r/JK2STYf27XM3ogsoG3iP4htkY/GxqPWAHZybYDCu4g+u2jf\nYAW2GRvL2hI7Au+T/J8D38Xel1zdXYyFWE6MxHpfaQuwlTf7LINSu7p9gBuxYaPjsPd/f492tidL\nsZXwauD72PvTiA0FzSF/UUjrhOXzGu7/Ncm8v+9gQxMXYHk4CNv7e7BArEuxTkcXrPifhA1FLcaK\n7z5YZ6ML1jNMjzH3wHq5X2JjrkeRyaX0aanZuT2ftnmwAvuMryCzrvUF9iuy3D7SefQXLBe3xHrm\nF5UR43xseOK9PPf1wPZelrnYJ+Xcn7tO+7gSG8b4d2wv//oyn99GTIW51Cl0jdgb+Zp73HJs7Cmf\nj4GDsV3AT7Gt5wQyA/KXYR/649jKdSO2kjwGPAr8H3a0eDltP9i73d9FWC8c7AM5FFsJrsDG2fbD\nhgzex7b6o8lsUPItZ+5txd6HU7Gt/HxsfPkuiu9iZceaStsDfun7ZmG9rOdc3G2wg0lpT2JjkfPJ\nnHZUajluwHpjj2LvzfHYBrGqnkSE/gsrAn/Acul5bAhnb4rvzh6D5fN12J7acuw9SzsS25NZhBXk\nC8l/vjPYRvperMi+g/UsD3b3vYftKZ3pYk0jcwbHydhwySdY0ftzVsxl2C7+31zcYcBfWTUPzsXG\nVp93yz8R65ik+fS8c+9L3/8oNv48CVsnc49nFDMPOxMln7OwjdAn2J7iuJw2NWPr1hJs3S5Um9K3\nHYKt8+kCfwZ2gPFIj3ZKB3UpdmBTpKMbhO3RxtShFAHs7Ixtsd29Ydgu58FFnyHSfv0zNszTGzsV\nb0J9myOS347Y+OHn2NH2c+vbHJFEPYINTS7Cvna+YfGHi4iIiIiIlDZ0ePqIpS66JHPZbniKOug5\nfHD9l12XDnwZkKKAEL8clWJKwfgZNzTDic1FH/LtHWYWvT9tcfO1rNdc/Psa707euuj9K41phpHF\n2+VNsZKJ1dQAYX/lzFdqeOqRkg9qbb6dxuajiz5mcoPvabFXYd9iL+YOz1gt2C8ThKBY4WONggJ5\nrdNOREQio8IsIhKZ2hXmHZqChVqraadgsRjSpFgdIVYd9Woq9lPI5dq59EO8NSpWO43lM243Avuq\ncWfsK7WX5tzvN8bswXeM2Yf3GLPEL7kx5pK57TPG7MN/jNmH7xizxK3yMebOwDVYAm+Fffd7UNFn\niLQPym2JVqnCPAz7gZJW7AdZxpGZ4UCkPVNuS7RKFea+rPpD1X0LPFakPVFuS7RKzfbqN3h8Q3Pm\n/x2aYMemCpsjAkxrgektSb+KV263Nt++8v9eTdsGPtAnq5dWdymtVGF+n1VnEFh1epcSXxwRKcv2\nTXZJGzsqiVfxyu1SXxwR8ddI27M1Jhd8ZKmhjClkJoTsis2icH81TROJhHJbolWqx/w1NmPGY9hR\n7D9ReNYQkfZEuS3RKlWYwX4PNczJnCJxUW5LlPSVbBGRyKgwi4hERoVZRCQyKswiIpHxOfhX2mdB\norAOn4YJBOwxfGKwWADPTN43aDxpHyY3PB8kzsXsHyQOwCj+GCwWfBIwloSiHrOISGRUmEVEIqPC\nLCISGRVmEZHIqDCLiETGpzDfDCwAZiTcFpFaU25LlHwK8xhs+h2Rjka5LVHyKcxPA0uSbohIHSi3\nJUoaYxYRiUyYb/6Nac78P6Sp7ewTIuWqzdRSnlqy/m+k7QwUIuVoJdTUUn5GNgcJIwLUamopT011\nfG3pWBoJNbWUiIjUmE9hvgt4Ftgcm+59ZKItEqkd5bZEyWco48jEWyFSH8ptiZKGMkREIqPCLCIS\nGRVmEZHIqDCLiEQmzHnMgbwyeZdgsX49/KxgsQC+HN41WKwXXx4eLBZfhAslyRnFxcFi/Y4zg8U6\njyuDxYLFAWOt3tRjFhGJjAqziEhkVJhFRCKjwiwiEhkVZhGRyPgU5v7AJGAm8BpwWqItEqkd5bZE\nyed0ua+AnwPTgR7Ay8BE4PUE2yVSC8ptiZJPj3k+lrgAn2FJu0liLRKpHeW2RKncMeZGYHvghfBN\nEamrRpTbEolyvvnXAxgPnI71LjI0tZSENLXFppeqncK5ramlJJhWQk8ttQZwD3A7cN8q92pqKQlp\naJNd0sYkOrVU8dzW1FISTCMhp5ZqAP4EzAKuqKJVIrFRbkuUfArz7sDRwHeBae4yIslGidSIclui\n5DOU8Qz6Iop0TMptiZKSUkQkMirMIiKRUWEWEYmMCrOISGQaAsRI0ZIKECZy14QLdd/d3w8W67ec\nHyzW299sGiwWwOL564cJ1G8tCJOr5UoRcEqoGD1NuHPE9+SVYLHMhMDxYjMKCuS1eswiIpFRYRYR\niYwKs4hIZFSYRUQio8IsIhIZn8LcDfuN2unYj72MTrRFIrWhvJZo+fxWxhfYj7wsc49/BtjD/RVp\nr5TXEi3foYxl7m9XoDOwOJnmiNSU8lqi5FuYO2G7fAuwWYVnJdYikdpRXkuUfGcwWQEMAXoCj2HT\nOrSsvFdTS0lIzz4Fzz1Vi1cqnteAppaScFoJPbVU2lLgIWBHsjNWU0tJSLvtZZe0y3+T9Cvmz2tA\nU0tJOI2EnFqqD9DL/b8WsC8204NIe6a8lmj59Jg3BsZiRbwTcBvwZJKNEqkB5bVEy6cwzwCGJt0Q\nkRpTXku09M0/EZHIqDCLiERGhVlEJDIqzCIikVFhFhGJTLlfMFl9/We4UD9s2DVYrNSCpmCxRn8r\n4EICT/TdO0icvwaJIvnsySXBYqUO2C5YLICGdwPOJfpGc7hYNaAes4hIZFSYRUQio8IsIhIZFWYR\nkcj4FubO2A+8PJBgW0TqQbkt0fEtzKdjPyIe8DCpSBSU2xIdn8LcDzgAuAloSLY5IjWl3JYo+RTm\ny4GzsdkeRDoS5bZEqdQXTA4CPsTG4JoKPkpTS0lAS1pmsKRlRtIv45fbmlpKgmkl1NRSuwEHY7t7\n3YB1gVuBY9o8SlNLSUC9mwbTu2nwyuuto+5K4mX8cltTS0kwjYSaWup8oD8wEDgC+3bsMUWfIdI+\nKLclWuWex6wj19JRKbclGuX8iNFkivW9Rdov5bZERd/8ExGJjAqziEhkVJhFRCKjwiwiEhkVZhGR\nyGhqKV9fB4w1pTlYqIYN1wsWK3XN6cFiAWx6yttB4mhqqSR9FSxSw8NjgsUCSF0T7udLGt4IeDbk\nNc3hYhWgHrOISGRUmEVEIqPCLCISGRVmEZHI+B78awU+Ab7BjhYMS6pBIjXUivJaIuRbmFPY7x8u\nTq4pIjWnvJYolTOUoal3pCNSXkt0fAtzCngCmAKckFxzRGpKeS1R8h3K2B2YB2wATATeAJ5eea+m\nlpKAZrYsZGbLolq8VPG8BjS1lITTSqippdLmub8fAfdiB0kyCayppSSgrZv6sHVTn5XXx496K6mX\nKp7XgKaWknAaCTW1FMDawDru/+7AfkDiM2WKJEx5LdHy6TFviPUm0o+/A3g8sRaJ1IbyWqLlU5hn\nA0OSbohIjSmvJVr65p+ISGRUmEVEIqPCLCISGRVmEZHIqDCLiEQmxO8EpGgJOG2LlKXbkHC/v/PF\nNeGmqQJI3R7mZyga3rA/QYKVJwUX1+FlxQwNFil1ziHBYjXMClTvHmyAAnmtHrOISGRUmEVEIqPC\nLCISGRVmEZHI+BTmXsB44HVgFrBLoi0SqR3ltkTJ57cyrgQeBg51j++eaItEake5LVEqVZh7AnsC\nx7rrXwNLE22RSG0otyVapYYyBmI/Ij4GmArciP2OrUh7p9yWaJXqMXfBzvI+FXgJuAI4D/hlm0dp\naikJqOVzaFmW+Mv45bamlpJQFrbAohavh5YqzHPd5SV3fTyWvG1paikJqKm7XdJGJTP9n19ua2op\nCaVPk13S3hpV8KGlhjLmA3OAzd31fYCZ1bRNJBLKbYmWz1kZ/4FNu9MVeAcYmWiLRGpHuS1R8inM\nrwA7Jd0QkTpQbkuU9M0/EZHIqDCLiERGhVlEJDIqzCIikVFhFhGJjM9ZGRKxL94ONx1UywU7B4sF\n0Hxh0HCy2pkaLFLD778MFuvxQLOc7VfkPvWYRUQio8IsIhIZFWYRkcioMIuIRManMG8BTMu6LAVO\nS7JRIjWgvJZo+ZyV8Sawvfu/E/A+cG9iLRKpDeW1RKvcoYx9sF/hmpNAW0TqRXktUSm3MB8B3JlE\nQ0TqSHktUSnnCyZdgR8A565yj6aWkoBa3aVGCuc1oKmlJJRX3MVHOYV5f+BlbALLtjS1lATUSNvy\nNznZlyuc14CmlpJQtnOXtNuLPLacoYwjgbsqapFIvJTXEh3fwtwdO0AyIcG2iNSa8lqi5DuU8TnQ\nJ8mGiNSB8lqipG/+iYhEpnaFeVqLYtUr1pRwsaa1fBIsVmuwSPXWqlgdIla4w8y+Z18UUrvCPL1F\nseoV6+VwsaarMOfRqlgdItbqWJhFRMSLCrOISGRCzJHSAgwPEEekkMnU55seLSi3JTn1ymsRERER\nERERkfZoBPAG8BYFf8XLy83AAmBGgDb1ByYBM4HXqG72im7AC8B0YBYwusq2dcZm1Xigyjhg5xO9\n6uK9WGWsXsB44HVsOXepME5HmT1EeV2+ULndivK6Kp2Bt7EfDFsD+5AHVRhrT2zWiRAJvBEwxP3f\nA5vRotJ2Aazt/nYBngf2qCLWGcAdwP1VxEibDawXIA7AWOAn7v8uQM8AMTsB87CC0p4orysTKrc7\ndF7X4nS5YVgCtwJfAeOAQyqM9TSwJEyzmI+tTACfYVvLTaqIt8z97YqttIsrjNMPOAC4iTBnzRAo\nTk+sgNzsrn+N9Qiq1V5nD1Fely90bnfYvK5FYe5L28bNdbfFpBHrsbxQRYxO2AqxANuVnFVhnMuB\ns4EVVbQlWwp4ApgCnFBFnIHYbxaPAaYCN5LpTVWjvc4eorwuX8jc7tB5XYvCnKrBa1SjBza+dDrW\nw6jUCmwXsh+wF5Wdn3gQ8CE2PhWqt7w7tnLuD5yC9Q4q0QUYClzn/n4OnFdl29Kzh9xdZZx6UF6X\nJ3Rud+i8rkVhfp+24yz9sd5FDNYA7sEmE7gvUMylwEPAjhU8dzfgYGz87C7ge8CtVbZnnvv7ETYL\n9LAK48x1l5fc9fFYIlejxOwhUVNelyd0biuvq9QFG2tpxLYk1RwkwcUJcZCkAUuMywPE6oMd2QVY\nC3gK2LvKmMOp/sj12sA67v/uwN+A/aqI9xSwufu/Gbi0ilhg47LHVhmjXpTXlas2t5XXgeyPHR1+\nG/hFFXHuAj4A/oGN742sItYe2G7adDKnt4yoMNZgbHxqOnYKz9lVtCttONUfuR6ItWk6dupUNe89\n2JRlL2E/njWB6o5edwcWklnB2iPldWWqzW3ltYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHRs/w9e\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2192,8 +2192,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.227616\n", - "openmoc keff = 1.225325\n", - "bias [pcm]: -229.1\n" + "openmoc keff = -1501548191911247872.000000\n", + "bias [pcm]: -150154819191124787200000.0\n" ] } ], @@ -2286,8 +2286,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.227616\n", - "openmoc keff = 1.227096\n", - "bias [pcm]: -52.0\n" + "openmoc keff = -1678021319997784064.000000\n", + "bias [pcm]: -167802131999778406400000.0\n" ] } ], diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 48288ad248..c87483a420 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -1,4 +1,5 @@ import sys +import os import copy from numbers import Integral @@ -90,6 +91,7 @@ class Library(object): clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._all_mgxs = self.all_mgxs + clone._statepoint = self._statepoint clone._all_mgxs = {} for domain in self.domains: @@ -396,7 +398,7 @@ class Library(object): HDF5 groups from the domain type, domain id, subdomain id (for distribcell domains), nuclides and cross section types. Two datasets for the mean and standard deviation are stored for each subdomain entry in - the HDF5 file. + the HDF5 file. The number of groups is stored as a file attribute. NOTE: This requires the h5py Python package. @@ -435,6 +437,19 @@ class Library(object): 'library since a statepoint has not yet been loaded' raise ValueError(msg) + import h5py + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + # Add an attribute for the number of energy groups to the HDF5 file + full_filename = os.path.join(directory, filename + '.h5') + full_filename = full_filename.replace(' ', '-') + f = h5py.File(full_filename, 'w') + f.attrs["# groups"] = self.num_groups + f.close() + # Export MGXS for each domain and mgxs type to an HDF5 file for domain in self.domains: for mgxs_type in self.mgxs_types: @@ -443,4 +458,5 @@ class Library(object): if subdomains == 'avg': mgxs = mgxs.get_subdomain_avg_xs() - mgxs.build_hdf5_store(filename, directory, xs_type) \ No newline at end of file + mgxs.build_hdf5_store(filename, directory, + xs_type=xs_type, nuclides=nuclides) \ No newline at end of file diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e1df3eef36..f424916a03 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -903,8 +903,9 @@ class MGXS(object): print(string) - def build_hdf5_store(self, filename='mgxs', directory='mgxs', append=True, - subdomains='all', nuclides='all', xs_type='macro'): + def build_hdf5_store(self, filename='mgxs', directory='mgxs', + subdomains='all', nuclides='all', + xs_type='macro', append=True): """Export the multi-group cross section data to an HDF5 binary file. This method constructs an HDF5 file which stores the multi-group @@ -921,9 +922,6 @@ class MGXS(object): Filename for the HDF5 file. Defaults to 'mgxs'. directory : str Directory for the HDF5 file. Defaults to 'mgxs'. - append : boolean - If true, appends to an existing HDF5 file with the same filename - directory (if one exists). Defaults to True. subdomains : Iterable of Integral or 'all' The subdomain IDs of the cross sections to include in the report. Defaults to 'all'. @@ -936,6 +934,9 @@ class MGXS(object): xs_type: {'macro', 'micro'} Store the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + append : boolean + If true, appends to an existing HDF5 file with the same filename + directory (if one exists). Defaults to True. Raises ------ @@ -952,12 +953,7 @@ class MGXS(object): 'cross section has not been computed' raise ValueError(msg) - # Attempt to import h5py - try: - import h5py - except ImportError: - msg = 'The h5py Python package must be installed on your system' - raise ImportError(msg) + import h5py # Make directory if it does not exist if not os.path.exists(directory): @@ -993,27 +989,10 @@ class MGXS(object): cv.check_value('xs_type', xs_type, ['macro', 'micro']) - ''' - if self.by_nuclide: - nuclides = self.domain.get_all_nuclides() - densities = np.zeros(len(nuclides), dtype=np.float) - for i, nuclide in enumerate(nuclides): - densities[i] = nuclides[nuclide][1] - else: - nuclides = ['sum'] - ''' - # Create an HDF5 group within the file for the domain domain_type_group = xs_results.require_group(self.domain_type) domain_group = domain_type_group.require_group(str(self.domain.id)) - ''' - if subdomains == 'all' and self.domain_type == 'distribcell': - subdomains = np.arange(self.num_subdomains, dtype=np.int) - else: - subdomains = [self.domain.id] - ''' - # Determine number of digits to pad subdomain group keys num_digits = len(str(self.num_subdomains)) @@ -1976,7 +1955,7 @@ class Chi(MGXS): nu_fission_in = self.tallies['nu-fission-in'] nu_fission_out = self.tallies['nu-fission-out'] - # Remove the coarse energy filter to keep it out of tally arithmetic + # Remove coarse energy filter to keep it out of tally arithmetic energy_filter = nu_fission_in.find_filter('energy') nu_fission_in.remove_filter(energy_filter) @@ -2071,9 +2050,17 @@ class Chi(MGXS): nu_fission_in = nu_fission_in.summation(nuclides=nuclides) nu_fission_out = nu_fission_out.summation(nuclides=nuclides) + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = nu_fission_in.find_filter('energy') + nu_fission_in.remove_filter(energy_filter) + # Compute chi and store it as the xs_tally attribute so we can # use the generic get_xs(...) method xs_tally = nu_fission_out / nu_fission_in + + # Add the coarse energy filter back to the nu-fission tally + nu_fission_in.add_filter(energy_filter) + xs = xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) From 4f28c69d70be2eb16340721b7c83046e3c3f66c2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 10 Oct 2015 20:07:25 -0400 Subject: [PATCH 322/519] Fixed bug in MGXS.get_subdomain_avg(...) with material domain tyeps --- openmc/mgxs/mgxs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index f424916a03..7e7b88f8c1 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -773,7 +773,10 @@ class MGXS(object): # Clone this MGXS to initialize the subdomain-averaged version avg_xs = copy.deepcopy(self) - avg_xs.domain_type = 'cell' + + # If domain is distribcell, make the new domain 'cell' + if self.domain_type == 'distribcell': + avg_xs.domain_type = 'cell' # Average each of the tallies across subdomains for tally_type, tally in avg_xs.tallies.items(): From bfdcc1eabd836de37f2e750c517ab13ca4517448 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 11 Oct 2015 02:07:29 -0400 Subject: [PATCH 323/519] Now using all OrderedDicts in Python API for input reproducibility. Added tests for MGXS Library with/without nuclides --- openmc/geometry.py | 9 ++- openmc/material.py | 2 +- openmc/mgxs/library.py | 9 ++- openmc/mgxs/mgxs.py | 6 +- openmc/universe.py | 22 +++--- .../inputs_true.dat | 1 + .../results_true.dat | 1 + .../test_mgxs_library_no_nuclides.py | 79 +++++++++++++++++++ .../inputs_true.dat | 1 + .../results_true.dat | 1 + .../test_mgxs_library_nuclides.py | 79 +++++++++++++++++++ tests/testing_harness.py | 1 + 12 files changed, 188 insertions(+), 23 deletions(-) create mode 100644 tests/test_mgxs_library_no_nuclides/inputs_true.dat create mode 100644 tests/test_mgxs_library_no_nuclides/results_true.dat create mode 100644 tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py create mode 100644 tests/test_mgxs_library_nuclides/inputs_true.dat create mode 100644 tests/test_mgxs_library_nuclides/results_true.dat create mode 100644 tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py diff --git a/openmc/geometry.py b/openmc/geometry.py index 18fa698b50..5d0d8f53f5 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -1,3 +1,4 @@ +from collections import OrderedDict from xml.etree import ElementTree as ET import openmc @@ -110,7 +111,7 @@ class Geometry(object): """ - nuclides = {} + nuclides = OrderedDict() materials = self.get_all_materials() for material in materials: @@ -134,7 +135,7 @@ class Geometry(object): for cell in material_cells: materials.add(cell._fill) - return list(materials) + return sorted(list(materials)) def get_all_material_cells(self): all_cells = self.get_all_cells() @@ -144,7 +145,7 @@ class Geometry(object): if cell._type == 'normal': material_cells.add(cell) - return list(material_cells) + return sorted(list(material_cells)) def get_all_material_universes(self): """Return all universes composed of at least one non-fill cell @@ -165,7 +166,7 @@ class Geometry(object): if cell._type == 'normal': material_universes.add(universe) - return list(material_universes) + return sorted(list(material_universes)) class GeometryFile(object): diff --git a/openmc/material.py b/openmc/material.py index 92c77858d5..b4a553e66a 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -358,7 +358,7 @@ class Material(object): """ - nuclides = {} + nuclides = OrderedDict() for nuclide_name, nuclide_tuple in self._nuclides.items(): nuclide = nuclide_tuple[0] diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index c87483a420..ba6268802e 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -2,6 +2,7 @@ import sys import os import copy from numbers import Integral +from collections import OrderedDict import openmc import openmc.mgxs @@ -68,7 +69,7 @@ class Library(object): self._mgxs_types = [] self._domain_type = None self._energy_groups = None - self._all_mgxs = {} + self._all_mgxs = OrderedDict() self._statepoint = None self.name = name @@ -93,9 +94,9 @@ class Library(object): clone._all_mgxs = self.all_mgxs clone._statepoint = self._statepoint - clone._all_mgxs = {} + clone._all_mgxs = OrderedDict() for domain in self.domains: - clone.all_mgxs[domain.id] = {} + clone.all_mgxs[domain.id] = OrderedDict() for mgxs_type in self.mgxs_types: mgxs = copy.deepcopy(self.all_mgxs[domain.id][mgxs_type]) clone.all_mgxs[domain.id][mgxs_type] = mgxs @@ -203,7 +204,7 @@ class Library(object): # Initialize MGXS for each domain and mgxs type and store in dictionary for domain in self.domains: - self.all_mgxs[domain.id] = {} + self.all_mgxs[domain.id] = OrderedDict() for mgxs_type in self.mgxs_types: mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name) mgxs.domain = domain diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7e7b88f8c1..222f55e972 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1,4 +1,4 @@ -from collections import Iterable +from collections import Iterable, OrderedDict from numbers import Integral import os import sys @@ -100,7 +100,7 @@ class MGXS(object): self._domain = None self._domain_type = None self._energy_groups = None - self._tallies = {} + self._tallies = OrderedDict() self._xs_tally = None self.name = name @@ -127,7 +127,7 @@ class MGXS(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._xs_tally = copy.deepcopy(self.xs_tally, memo) - clone._tallies = {} + clone._tallies = OrderedDict() for tally_type, tally in self.tallies.items(): clone.tallies[tally_type] = copy.deepcopy(tally, memo) diff --git a/openmc/universe.py b/openmc/universe.py index a4ea38de9c..bc1e98652b 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -275,7 +275,7 @@ class Cell(object): """ - nuclides = {} + nuclides = OrderedDict() if self._type != 'void': nuclides.update(self._fill.get_all_nuclides()) @@ -293,7 +293,7 @@ class Cell(object): """ - cells = {} + cells = OrderedDict() if self._type == 'fill' or self._type == 'lattice': cells.update(self._fill.get_all_cells()) @@ -312,7 +312,7 @@ class Cell(object): """ - universes = {} + universes = OrderedDict() if self._type == 'fill': universes[self._fill._id] = self._fill @@ -415,7 +415,7 @@ class Universe(object): # Keys - Cell IDs # Values - Cells - self._cells = {} + self._cells = OrderedDict() # Keys - Cell IDs # Values - Offsets @@ -541,7 +541,7 @@ class Universe(object): """ - nuclides = {} + nuclides = OrderedDict() # Append all Nuclides in each Cell in the Universe to the dictionary for cell_id, cell in self._cells.items(): @@ -559,7 +559,7 @@ class Universe(object): """ - cells = {} + cells = OrderedDict() # Add this Universe's cells to the dictionary cells.update(self._cells) @@ -584,7 +584,7 @@ class Universe(object): # Get all Cells in this Universe cells = self.get_all_cells() - universes = {} + universes = OrderedDict() # Append all Universes containing each Cell to the dictionary for cell_id, cell in cells.items(): @@ -717,7 +717,7 @@ class Lattice(object): """ - univs = dict() + univs = OrderedDict() for k in range(len(self._universes)): for j in range(len(self._universes[k])): if isinstance(self._universes[k][j], Universe): @@ -745,7 +745,7 @@ class Lattice(object): """ - nuclides = {} + nuclides = OrderedDict() # Get all unique Universes contained in each of the lattice cells unique_universes = self.get_unique_universes() @@ -766,7 +766,7 @@ class Lattice(object): """ - cells = {} + cells = OrderedDict() unique_universes = self.get_unique_universes() for universe_id, universe in unique_universes.items(): @@ -787,7 +787,7 @@ class Lattice(object): # Initialize a dictionary of all Universes contained by the Lattice # in each nested Universe level - all_universes = {} + all_universes = OrderedDict() # Get all unique Universes contained in each of the lattice cells unique_universes = self.get_unique_universes() diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat new file mode 100644 index 0000000000..fe91376d57 --- /dev/null +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -0,0 +1 @@ +ff4b31da88312d526bebb8819aaaa75f737b9aaff4660557009c8277c1e8c5f2515d256de9ffc9bdc07bce42719fae27aeb8d0a3d3b61552dd4b1eddd48e6ff2 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat new file mode 100644 index 0000000000..54b73efb3f --- /dev/null +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -0,0 +1 @@ +f882fc13affc45ed4ce833c17b719c10a371b3c086022a846014e0ce46337971850d55c7634a9bfc740709c696aef8ec9cdad19253f62aeb77af6baed35f9fda \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py new file mode 100644 index 0000000000..5fe44f9525 --- /dev/null +++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc +import openmc.mgxs + + +class MGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + + # The openmc.mgxs module needs a summary.h5 file + self._input_set.settings.output = {'summary': True} + + # Generate inputs using parent class routine + super(MGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry) + self.mgxs_lib.by_nuclide = False + self.mgxs_lib.mgxs_types = ['transport', 'nu-fission', + 'nu-scatter matrix', 'chi'] + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.TalliesFile() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=True): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Read the summary file. + summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0] + su = openmc.Summary(summary) + sp.link_with_summary(su) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a string from Pandas Dataframe for each MGXS + outstr = '' + for domain in sorted(self.mgxs_lib.domains): + for mgxs_type in self.mgxs_lib.mgxs_types: + mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat new file mode 100644 index 0000000000..b40fb91b39 --- /dev/null +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -0,0 +1 @@ +06e2f794c78d312491a87074b2e725d6f395fc250e004c125b50c1057b725ef1dbf3fd943629fd01b5a26ed018a1292712fc3425c925661ddadbf83194eb66df \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat new file mode 100644 index 0000000000..278e7da84d --- /dev/null +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -0,0 +1 @@ +2c3d1524788449afd2124a9cfa9e6032077598639bddfa4d5e5c48962e789ca133e537b7207e200a79a6d01dc703b6f43f4ba4916323aab90c9ccaf335c640f1 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py new file mode 100644 index 0000000000..637afc0b64 --- /dev/null +++ b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc +import openmc.mgxs + + +class MGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + + # The openmc.mgxs module needs a summary.h5 file + self._input_set.settings.output = {'summary': True} + + # Generate inputs using parent class routine + super(MGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry) + self.mgxs_lib.by_nuclide = True + self.mgxs_lib.mgxs_types = ['transport', 'nu-fission', + 'nu-scatter matrix', 'chi'] + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.TalliesFile() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=True): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Read the summary file. + summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0] + su = openmc.Summary(summary) + sp.link_with_summary(su) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a string from Pandas Dataframe for each MGXS + outstr = '' + for domain in sorted(self.mgxs_lib.domains): + for mgxs_type in self.mgxs_lib.mgxs_types: + mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 828fc3a094..9435ccbbcc 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -349,6 +349,7 @@ class PyAPITestHarness(TestHarness): output.append(os.path.join(os.getcwd(), 'geometry.xml')) output.append(os.path.join(os.getcwd(), 'settings.xml')) output.append(os.path.join(os.getcwd(), 'inputs_test.dat')) + output.append(os.path.join(os.getcwd(), 'summary.h5')) for f in output: if os.path.exists(f): os.remove(f) From 60fdbd6b1b68b52d6b3e27219f9a3555978b60d8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 11 Oct 2015 02:12:57 -0400 Subject: [PATCH 324/519] Added Pandas to .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7af617f857..efdc457a11 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_install: - conda config --set always_yes yes --set changeps1 no - conda update -q conda - conda info -a - - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy h5py + - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy h5py pandas - source activate test-environment # Install GCC, MPICH, HDF5, PHDF5 From 178fb2bff5b4f1c5ea85ea85c35e5498c1138b17 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 11 Oct 2015 02:46:27 -0400 Subject: [PATCH 325/519] Added tests for MGXS Library HDF5 export and energy group condensation --- .../inputs_true.dat | 1 + .../results_true.dat | 1 + .../test_mgxs_library_condense.py | 83 +++++++++++++++++ tests/test_mgxs_library_hdf5/inputs_true.dat | 1 + tests/test_mgxs_library_hdf5/results_true.dat | 1 + .../test_mgxs_library_hdf5.py | 92 +++++++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 tests/test_mgxs_library_condense/inputs_true.dat create mode 100644 tests/test_mgxs_library_condense/results_true.dat create mode 100644 tests/test_mgxs_library_condense/test_mgxs_library_condense.py create mode 100644 tests/test_mgxs_library_hdf5/inputs_true.dat create mode 100644 tests/test_mgxs_library_hdf5/results_true.dat create mode 100644 tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat new file mode 100644 index 0000000000..b40fb91b39 --- /dev/null +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -0,0 +1 @@ +06e2f794c78d312491a87074b2e725d6f395fc250e004c125b50c1057b725ef1dbf3fd943629fd01b5a26ed018a1292712fc3425c925661ddadbf83194eb66df \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat new file mode 100644 index 0000000000..9cfa49a263 --- /dev/null +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -0,0 +1 @@ +a14024dfa41c9b9e90db79574f4d3f9eeeffb1c8c6fd7d26a234bf3fe1c3268316ee9f1de01211583246d0968b148870086469548a7c8ca424b8ff4111db0c8d \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py new file mode 100644 index 0000000000..8482c4ae38 --- /dev/null +++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc +import openmc.mgxs + + +class MGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + + # The openmc.mgxs module needs a summary.h5 file + self._input_set.settings.output = {'summary': True} + + # Generate inputs using parent class routine + super(MGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry) + self.mgxs_lib.by_nuclide = True + self.mgxs_lib.mgxs_types = ['transport', 'nu-fission', + 'nu-scatter matrix', 'chi'] + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.TalliesFile() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=True): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Read the summary file. + summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0] + su = openmc.Summary(summary) + sp.link_with_summary(su) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a condensed 1-group MGXS Library + one_group = openmc.mgxs.EnergyGroups([0., 20.]) + condense_lib = self.mgxs_lib.get_condensed_library(one_group) + + # Build a string from Pandas Dataframe for each 1-group MGXS + outstr = '' + for domain in sorted(condense_lib.domains): + for mgxs_type in condense_lib.mgxs_types: + mgxs = condense_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat new file mode 100644 index 0000000000..fe91376d57 --- /dev/null +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -0,0 +1 @@ +ff4b31da88312d526bebb8819aaaa75f737b9aaff4660557009c8277c1e8c5f2515d256de9ffc9bdc07bce42719fae27aeb8d0a3d3b61552dd4b1eddd48e6ff2 \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/results_true.dat b/tests/test_mgxs_library_hdf5/results_true.dat new file mode 100644 index 0000000000..62913b363c --- /dev/null +++ b/tests/test_mgxs_library_hdf5/results_true.dat @@ -0,0 +1 @@ +290551338cc3a6c5fcf965d5f0ee0d14bb68a9fa3f4066bd59c65d2673bf659547be0674961631f5fd03bc06d991ff1dafb974938222a8e87c4d232f1212bd4a \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py new file mode 100644 index 0000000000..26f4154a8b --- /dev/null +++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +import h5py +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc +import openmc.mgxs + + +class MGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + + # The openmc.mgxs module needs a summary.h5 file + self._input_set.settings.output = {'summary': True} + + # Generate inputs using parent class routine + super(MGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry) + self.mgxs_lib.by_nuclide = False + self.mgxs_lib.mgxs_types = ['transport', 'nu-fission', + 'nu-scatter matrix', 'chi'] + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.TalliesFile() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=True): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Read the summary file. + summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0] + su = openmc.Summary(summary) + sp.link_with_summary(su) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Export the MGXS Library to an HDF5 file + self.mgxs_lib.build_hdf5_store(filename='mgxs', directory='.') + + # Open the MGXS HDF5 file + f = h5py.File('mgxs.h5', 'r') + + # Build a string from the datasets in the HDF5 file + outstr = '' + for domain in sorted(self.mgxs_lib.domains): + for mgxs_type in self.mgxs_lib.mgxs_types: + key = 'material/{0}/{1}/average'.format(domain.id, mgxs_type) + outstr += str(f[key]) + key = 'material/{0}/{1}/std. dev.'.format(domain.id, mgxs_type) + outstr += str(f[key]) + + # Close the MGXS HDF5 file + f.close() + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + f = os.path.join(os.getcwd(), 'mgxs.h5') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MGXSTestHarness('statepoint.10.*', True) + harness.main() From 582d988ff335b9005329e32e06c56ec17ff5d25f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 11 Oct 2015 10:06:12 -0400 Subject: [PATCH 326/519] Cleaned up msg string formatting in openmc.mgxs --- openmc/mgxs/mgxs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 222f55e972..3a72b42329 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -509,7 +509,7 @@ class MGXS(object): elif self.domain_type == 'material': self.domain = statepoint.summary.get_material_by_id(self.domain.id) else: - msg = 'Unable to load data from a statepoint for domain type {} ' \ + msg = 'Unable to load data from a statepoint for domain type {0} ' \ 'which is not yet supported'.format(self.domain_type) raise ValueError(msg) From 52559aca3db559b9011ff6ad6148de001f47d29a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 11 Oct 2015 10:07:18 -0400 Subject: [PATCH 327/519] Fixed typo in docstring in openmc.mgxs.library per comment from @nelsonag --- openmc/mgxs/library.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ba6268802e..533ca507d4 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -281,7 +281,7 @@ class Library(object): """Return the MGXS object for some domain and reaction rate type. This routine searches the library for an MGXS object for the spatial - domain and reaction rate type requ + domain and reaction rate type requested by the user. NOTE: This routine must be called after the build_library() routine. From c984ffd8c0d6d7e18d807f7fb758db6bf53810d6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 11 Oct 2015 11:18:52 -0400 Subject: [PATCH 328/519] Added resturctured text files for openmc.mgxs documentation --- docs/source/pythonapi/energy_groups.rst | 8 + .../examples/multi-group-cross-sections.ipynb | 198 +++++++++--------- docs/source/pythonapi/index.rst | 9 + docs/source/pythonapi/mgxs.rst | 8 + docs/source/pythonapi/mgxs_library.rst | 8 + docs/source/pythonapi/opencg_compatible.rst | 10 +- openmc/mgxs/mgxs.py | 4 +- 7 files changed, 140 insertions(+), 105 deletions(-) create mode 100644 docs/source/pythonapi/energy_groups.rst create mode 100644 docs/source/pythonapi/mgxs.rst create mode 100644 docs/source/pythonapi/mgxs_library.rst diff --git a/docs/source/pythonapi/energy_groups.rst b/docs/source/pythonapi/energy_groups.rst new file mode 100644 index 0000000000..28ca6f3fe2 --- /dev/null +++ b/docs/source/pythonapi/energy_groups.rst @@ -0,0 +1,8 @@ +.. _pythonapi_energy_groups: + +============= +Energy Groups +============= + +.. automodule:: openmc.mgxs.groups + :members: diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index fedf7ea950..e66dd47648 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -373,27 +373,29 @@ { "data": { "text/plain": [ - "{'flux': Tally\n", - " \tID =\t10003\n", - " \tName =\t\n", - " \tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - " \tNuclides =\ttotal \n", - " \tScores =\t['flux']\n", - " \tEstimator =\ttracklength, 'nu-fission': Tally\n", - " \tID =\t10004\n", - " \tName =\t\n", - " \tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - " \tNuclides =\ttotal \n", - " \tScores =\t['nu-fission']\n", - " \tEstimator =\ttracklength}" + "OrderedDict([('flux', Tally\n", + "\tID =\t10003\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", + " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", + " 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['flux']\n", + "\tEstimator =\ttracklength\n", + "), ('nu-fission', Tally\n", + "\tID =\t10004\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", + " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", + " 2.00000000e+01]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t['nu-fission']\n", + "\tEstimator =\ttracklength\n", + ")])" ] }, "execution_count": 13, @@ -478,7 +480,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-10 17:36:39\n", + " Date/Time: 2015-10-11 11:02:44\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -563,20 +565,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.3500E-01 seconds\n", - " Reading cross sections = 1.4900E-01 seconds\n", - " Total time in simulation = 1.5217E+01 seconds\n", - " Time in transport only = 1.5201E+01 seconds\n", - " Time in inactive batches = 2.2480E+00 seconds\n", - " Time in active batches = 1.2969E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", + " Total time for initialization = 3.9700E-01 seconds\n", + " Reading cross sections = 8.9000E-02 seconds\n", + " Total time in simulation = 1.2140E+01 seconds\n", + " Time in transport only = 1.2131E+01 seconds\n", + " Time in inactive batches = 1.8560E+00 seconds\n", + " Time in active batches = 1.0284E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.5866E+01 seconds\n", - " Calculation Rate (inactive) = 11121.0 neutrons/second\n", - " Calculation Rate (active) = 7710.69 neutrons/second\n", + " Total time elapsed = 1.2547E+01 seconds\n", + " Calculation Rate (inactive) = 13469.8 neutrons/second\n", + " Calculation Rate (active) = 9723.84 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1723,48 +1725,39 @@ " 10002\n", " 1\n", " 1\n", - " O-16\n", - " 1.560098\n", - " 0.017801\n", + " H-1\n", + " 0.234877\n", + " 0.010096\n", " \n", " \n", " 127\n", " 10002\n", " 1\n", " 1\n", - " H-1\n", - " 0.234877\n", - " 0.010096\n", + " O-16\n", + " 1.560098\n", + " 0.017801\n", " \n", " \n", " 124\n", " 10002\n", " 1\n", " 2\n", - " O-16\n", - " 0.288236\n", - " 0.004397\n", - " \n", - " \n", - " 125\n", - " 10002\n", - " 1\n", - " 2\n", " H-1\n", " 1.587815\n", " 0.007847\n", " \n", " \n", - " 122\n", + " 125\n", " 10002\n", " 1\n", - " 3\n", + " 2\n", " O-16\n", - " 0.000000\n", - " 0.000000\n", + " 0.288236\n", + " 0.004397\n", " \n", " \n", - " 123\n", + " 122\n", " 10002\n", " 1\n", " 3\n", @@ -1773,11 +1766,20 @@ " 0.000513\n", " \n", " \n", + " 123\n", + " 10002\n", + " 1\n", + " 3\n", + " O-16\n", + " 0.000000\n", + " 0.000000\n", + " \n", + " \n", " 120\n", " 10002\n", " 1\n", " 4\n", - " O-16\n", + " H-1\n", " 0.000000\n", " 0.000000\n", " \n", @@ -1786,7 +1788,7 @@ " 10002\n", " 1\n", " 4\n", - " H-1\n", + " O-16\n", " 0.000000\n", " 0.000000\n", " \n", @@ -1795,7 +1797,7 @@ " 10002\n", " 1\n", " 5\n", - " O-16\n", + " H-1\n", " 0.000000\n", " 0.000000\n", " \n", @@ -1804,7 +1806,7 @@ " 10002\n", " 1\n", " 5\n", - " H-1\n", + " O-16\n", " 0.000000\n", " 0.000000\n", " \n", @@ -1814,16 +1816,16 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 O-16 1.560098 0.017801\n", - "127 10002 1 1 H-1 0.234877 0.010096\n", - "124 10002 1 2 O-16 0.288236 0.004397\n", - "125 10002 1 2 H-1 1.587815 0.007847\n", - "122 10002 1 3 O-16 0.000000 0.000000\n", - "123 10002 1 3 H-1 0.010122 0.000513\n", - "120 10002 1 4 O-16 0.000000 0.000000\n", - "121 10002 1 4 H-1 0.000000 0.000000\n", - "118 10002 1 5 O-16 0.000000 0.000000\n", - "119 10002 1 5 H-1 0.000000 0.000000" + "126 10002 1 1 H-1 0.234877 0.010096\n", + "127 10002 1 1 O-16 1.560098 0.017801\n", + "124 10002 1 2 H-1 1.587815 0.007847\n", + "125 10002 1 2 O-16 0.288236 0.004397\n", + "122 10002 1 3 H-1 0.010122 0.000513\n", + "123 10002 1 3 O-16 0.000000 0.000000\n", + "120 10002 1 4 H-1 0.000000 0.000000\n", + "121 10002 1 4 O-16 0.000000 0.000000\n", + "118 10002 1 5 H-1 0.000000 0.000000\n", + "119 10002 1 5 O-16 0.000000 0.000000" ] }, "execution_count": 41, @@ -1883,7 +1885,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1949,6 +1951,11 @@ "\tReaction Type =\ttransport\n", "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", + "\n", "\tNuclide =\tU-238\n", "\tCross Sections [cm^-1]:\n", " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", @@ -1959,11 +1966,6 @@ " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", "\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", - "\n", "\n", "\n" ] @@ -2000,12 +2002,20 @@ " 3\n", " 10000\n", " 1\n", + " U-235\n", + " 21.095256\n", + " 0.257787\n", + " \n", + " \n", + " 4\n", + " 10000\n", + " 1\n", " U-238\n", " 9.589323\n", " 0.038756\n", " \n", " \n", - " 4\n", + " 5\n", " 10000\n", " 1\n", " O-16\n", @@ -2013,15 +2023,15 @@ " 0.012939\n", " \n", " \n", - " 5\n", + " 0\n", " 10000\n", - " 1\n", + " 2\n", " U-235\n", - " 21.095256\n", - " 0.257787\n", + " 485.513530\n", + " 2.418761\n", " \n", " \n", - " 0\n", + " 1\n", " 10000\n", " 2\n", " U-238\n", @@ -2029,33 +2039,25 @@ " 0.065428\n", " \n", " \n", - " 1\n", + " 2\n", " 10000\n", " 2\n", " O-16\n", " 3.800027\n", " 0.024538\n", " \n", - " \n", - " 2\n", - " 10000\n", - " 2\n", - " U-235\n", - " 485.513530\n", - " 2.418761\n", - " \n", " \n", "\n", "" ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-238 9.589323 0.038756\n", - "4 10000 1 O-16 3.159101 0.012939\n", - "5 10000 1 U-235 21.095256 0.257787\n", - "0 10000 2 U-238 11.178844 0.065428\n", - "1 10000 2 O-16 3.800027 0.024538\n", - "2 10000 2 U-235 485.513530 2.418761" + "3 10000 1 U-235 21.095256 0.257787\n", + "4 10000 1 U-238 9.589323 0.038756\n", + "5 10000 1 O-16 3.159101 0.012939\n", + "0 10000 2 U-235 485.513530 2.418761\n", + "1 10000 2 U-238 11.178844 0.065428\n", + "2 10000 2 O-16 3.800027 0.024538" ] }, "execution_count": 46, @@ -2192,8 +2194,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.227616\n", - "openmoc keff = -1501548191911247872.000000\n", - "bias [pcm]: -150154819191124787200000.0\n" + "openmoc keff = 1.225325\n", + "bias [pcm]: -229.1\n" ] } ], @@ -2286,8 +2288,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.227616\n", - "openmoc keff = -1678021319997784064.000000\n", - "bias [pcm]: -167802131999778406400000.0\n" + "openmoc keff = 1.227096\n", + "bias [pcm]: -52.0\n" ] } ], diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 09fbb3ac96..465ea8923e 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -57,6 +57,15 @@ on a given module or class. summary tallies +**Multi-Group Cross Section Generation** + +.. toctree:: + :maxdepth: 1 + + mgxs + energy_groups + mgxs_library + **Example Jupyter Notebooks:** .. toctree:: diff --git a/docs/source/pythonapi/mgxs.rst b/docs/source/pythonapi/mgxs.rst new file mode 100644 index 0000000000..04e2a99de3 --- /dev/null +++ b/docs/source/pythonapi/mgxs.rst @@ -0,0 +1,8 @@ +.. _pythonapi_mgxs: + +========================== +Multi-Group Cross Sections +========================== + +.. automodule:: openmc.mgxs.mgxs + :members: MGXS diff --git a/docs/source/pythonapi/mgxs_library.rst b/docs/source/pythonapi/mgxs_library.rst new file mode 100644 index 0000000000..8ac5457004 --- /dev/null +++ b/docs/source/pythonapi/mgxs_library.rst @@ -0,0 +1,8 @@ +.. _pythonapi_mgxs_library: + +============ +MGXS Library +============ + +.. automodule:: openmc.mgxs.library + :members: diff --git a/docs/source/pythonapi/opencg_compatible.rst b/docs/source/pythonapi/opencg_compatible.rst index c807e19cc6..c8ba82e8cc 100644 --- a/docs/source/pythonapi/opencg_compatible.rst +++ b/docs/source/pythonapi/opencg_compatible.rst @@ -1,8 +1,8 @@ -.. _pythonapi_opencg_compatible: +.. _pythonapi_openmc_mgxs: -==================== -OpenCG Compatibility -==================== +========================== +Multi-Group Cross Sections +========================== -.. automodule:: openmc.opencg_compatible +.. automodule:: openmc.mgxs.mgxs :members: diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 3a72b42329..79f86b0804 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -252,7 +252,7 @@ class MGXS(object): ------- MGXS A subclass of the abstract MGXS class for the multi-group cross - section type requeted by the user + section type requested by the user """ @@ -322,7 +322,7 @@ class MGXS(object): The atomic number density (atom/b-cm) for the nuclide of interest Raises - ------ + ------- ValueError When the density is requested for a nuclide which is not found in the spatial domain. From 3e436eb2d2500c76279776e1c8d1588375b356e6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 10:17:33 -0400 Subject: [PATCH 329/519] Added option to print the logfile for failing tests per @smharper recommendation --- tests/run_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/run_tests.py b/tests/run_tests.py index 338732c142..e62629401a 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -470,6 +470,7 @@ for key in iter(tests): logfilename = os.path.splitext(logfilename)[0] logfilename = logfilename + '_{0}.log'.format(test.name) shutil.copy(logfile[0], logfilename) + with open(logfilename) as fh: print(fh.read()) # Clear build directory and remove binary and hdf5 files shutil.rmtree('build', ignore_errors=True) From 9bc0e8e843592b12dafd5698289c99c8dac57eb8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 11:11:15 -0400 Subject: [PATCH 330/519] Made the GeometryFile.create_xml_file() clear the WRITTEN_IDS global dict --- openmc/geometry.py | 5 ++++- openmc/universe.py | 2 ++ tests/run_tests.py | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/openmc/geometry.py b/openmc/geometry.py index 5d0d8f53f5..bb98be2fea 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -199,7 +199,10 @@ class GeometryFile(object): """ - root_universe = self._geometry._root_universe + # Clear OpenMC written IDs used to optimize XML generation + openmc.universe.WRITTEN_IDS = {} + + root_universe = self.geometry.root_universe root_universe.create_xml_subelement(self._geometry_file) # Clean the indentation in the file to be user-readable diff --git a/openmc/universe.py b/openmc/universe.py index bc1e98652b..f8ecb535c7 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -603,6 +603,7 @@ class Universe(object): return string def create_xml_subelement(self, xml_element): + # Iterate over all Cells for cell_id, cell in self._cells.items(): @@ -938,6 +939,7 @@ class RectLattice(Lattice): return offset def create_xml_subelement(self, xml_element): + # Determine if XML element already contains subelement for this Lattice path = './lattice[@id=\'{0}\']'.format(self._id) test = xml_element.find(path) diff --git a/tests/run_tests.py b/tests/run_tests.py index e62629401a..6974dff339 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -470,7 +470,8 @@ for key in iter(tests): logfilename = os.path.splitext(logfilename)[0] logfilename = logfilename + '_{0}.log'.format(test.name) shutil.copy(logfile[0], logfilename) - with open(logfilename) as fh: print(fh.read()) + + with open(logfilename) as fh: print(fh.read()) # Clear build directory and remove binary and hdf5 files shutil.rmtree('build', ignore_errors=True) From 8624c784f2bc094ff45724463028559c5b816abe Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 13:37:20 -0400 Subject: [PATCH 331/519] Lengthened string names for cells, materials and tallies to 104 for BEAVRS compatibility --- src/geometry_header.F90 | 4 ++-- src/material_header.F90 | 2 +- src/tally_header.F90 | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 20e437cac7..6ca13740ba 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -24,7 +24,7 @@ module geometry_header type, abstract :: Lattice integer :: id ! Universe number for lattice - character(len=52) :: name = "" ! User-defined name + character(len=104) :: name = "" ! User-defined name real(8), allocatable :: pitch(:) ! Pitch along each axis integer, allocatable :: universes(:,:,:) ! Specified universes integer :: outside ! Material to fill area outside @@ -119,7 +119,7 @@ module geometry_header type Cell integer :: id ! Unique ID - character(len=52) :: name = "" ! User-defined name + character(len=104) :: name = "" ! User-defined name integer :: type ! Type of cell (normal, universe, ! lattice) integer :: universe ! universe # this cell is in diff --git a/src/material_header.F90 b/src/material_header.F90 index a10382abd9..c2f4b51bc0 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -8,7 +8,7 @@ module material_header type Material integer :: id ! unique identifier - character(len=52) :: name = "" ! User-defined name + character(len=104) :: name = "" ! User-defined name integer :: n_nuclides ! number of nuclides integer, allocatable :: nuclide(:) ! index in nuclides array real(8) :: density ! total atom density in atom/b-cm diff --git a/src/tally_header.F90 b/src/tally_header.F90 index ca4e25fd86..01dcd9bdb5 100644 --- a/src/tally_header.F90 +++ b/src/tally_header.F90 @@ -74,7 +74,7 @@ module tally_header ! Basic data integer :: id ! user-defined identifier - character(len=52) :: name = "" ! user-defined name + character(len=104) :: name = "" ! user-defined name integer :: type ! volume, surface current integer :: estimator ! collision, track-length real(8) :: volume ! volume of region From c82f6946f4b6011e472ed16c6241f469383978ae Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 12 Oct 2015 14:06:20 -0400 Subject: [PATCH 332/519] removed macroscopic delayed nu fission cross section --- docs/source/usersguide/input.rst | 7 +- src/ace_header.F90 | 14 ++-- src/bank_header.F90 | 2 +- src/cross_section.F90 | 13 ---- src/fission.F90 | 16 ++--- src/initialize.F90 | 4 +- src/input_xml.F90 | 109 ++++--------------------------- src/particle_header.F90 | 29 ++++---- src/physics.F90 | 12 ++-- src/tally.F90 | 53 ++++++++++----- src/tracking.F90 | 5 +- 11 files changed, 89 insertions(+), 175 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 49cf5dcec9..232e9bfe46 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1279,8 +1279,11 @@ The ```` element accepts the following sub-elements: :delayedgroup: A list of delayed neutron precursor groups for which the tally should be accumulated. For instance, to tally to all 6 delayed groups in the - ENDF/B-VII.1 library the filter is specified as ````. + ENDF/B-VII.1 library the filter is specified as: + + .. code-block:: xml + + :nuclides: If specified, the scores listed will be for particular nuclides, not the diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 613cc44a43..8acefba106 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -285,14 +285,12 @@ module ace_header !=============================================================================== type MaterialMacroXS - real(8) :: total ! macroscopic total xs - real(8) :: elastic ! macroscopic elastic scattering xs - real(8) :: absorption ! macroscopic absorption xs - real(8) :: fission ! macroscopic fission xs - real(8) :: nu_fission ! macroscopic production xs - real(8) :: kappa_fission ! macroscopic energy-released from fission - real(8) :: delayed_nu_fission(MAX_DELAYED_GROUPS) ! macroscopic delayed - ! production xs + real(8) :: total ! macroscopic total xs + real(8) :: elastic ! macroscopic elastic scattering xs + real(8) :: absorption ! macroscopic absorption xs + real(8) :: fission ! macroscopic fission xs + real(8) :: nu_fission ! macroscopic production xs + real(8) :: kappa_fission ! macroscopic energy-released from fission end type MaterialMacroXS contains diff --git a/src/bank_header.F90 b/src/bank_header.F90 index 34c7efc3fb..0cb49af35d 100644 --- a/src/bank_header.F90 +++ b/src/bank_header.F90 @@ -15,7 +15,7 @@ module bank_header real(C_DOUBLE) :: xyz(3) ! location of bank particle real(C_DOUBLE) :: uvw(3) ! diretional cosines real(C_DOUBLE) :: E ! energy - integer :: delayed_group ! delayed group + integer(C_INT) :: delayed_group ! delayed group end type Bank end module bank_header diff --git a/src/cross_section.F90 b/src/cross_section.F90 index d2885f1501..1b94a1049f 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -49,10 +49,6 @@ contains material_xs % nu_fission = ZERO material_xs % kappa_fission = ZERO - do d = 1, MAX_DELAYED_GROUPS - material_xs % delayed_nu_fission(d) = ZERO - end do - ! Exit subroutine if material is void if (p % material == MATERIAL_VOID) return @@ -142,15 +138,6 @@ contains ! Add contributions to material macroscopic energy release from fission material_xs % kappa_fission = material_xs % kappa_fission + & atom_density * micro_xs(i_nuclide) % kappa_fission - - ! Add contributions to material macroscopic delayed-nu-fission cross - ! section - do d = 1, nuclides(i_nuclide) % n_precursor - yield = yield_delayed(nuc, p % E, d) - material_xs % delayed_nu_fission(d) = & - material_xs % delayed_nu_fission(d) +& - atom_density * micro_xs(i_nuclide) % delayed_nu_fission * yield - end do end do end subroutine calculate_xs diff --git a/src/fission.F90 b/src/fission.F90 index 5b5b05a588..2624672d17 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -113,14 +113,14 @@ contains function yield_delayed(nuc, E, g) result(yield) - type(Nuclide), pointer :: nuc ! nuclide from which to find nu - real(8), intent(in) :: E ! energy of incoming neutron - real(8) :: yield ! delayed neutron precursor yield - integer :: g ! the delayed neutron precursor group - integer :: d ! precursor group - integer :: lc ! index before start of energies/nu values - integer :: NR ! number of interpolation regions - integer :: NE ! number of energies tabulated + type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu + real(8), intent(in) :: E ! energy of incoming neutron + real(8) :: yield ! delayed neutron precursor yield + integer, intent(in) :: g ! the delayed neutron precursor group + integer :: d ! precursor group + integer :: lc ! index before start of energies/nu values + integer :: NR ! number of interpolation regions + integer :: NE ! number of energies tabulated yield = ZERO diff --git a/src/initialize.F90 b/src/initialize.F90 index b1bae554e1..9d63eb4e93 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -234,7 +234,7 @@ contains ! Define MPI_BANK for fission sites bank_blocks = (/ 1, 3, 3, 1, 1 /) - bank_types = (/ MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8 /) + bank_types = (/ MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_INTEGER /) call MPI_TYPE_CREATE_STRUCT(5, bank_blocks, bank_disp, & bank_types, MPI_BANK, mpi_err) call MPI_TYPE_COMMIT(MPI_BANK, mpi_err) @@ -308,7 +308,7 @@ contains call h5tinsert_f(hdf5_bank_t, "E", h5offsetof(c_loc(tmpb(1)), & c_loc(tmpb(1)%E)), H5T_NATIVE_DOUBLE, hdf5_err) call h5tinsert_f(hdf5_bank_t, "delayed_group", h5offsetof(c_loc(tmpb(1)), & - c_loc(tmpb(1)%delayed_group)), H5T_NATIVE_DOUBLE, hdf5_err) + c_loc(tmpb(1)%delayed_group)), H5T_NATIVE_INTEGER, hdf5_err) ! Determine type for integer(8) hdf5_integer8_t = h5kind_to_type(8, H5_INTEGER_KIND) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 8092d5bf5d..dd9220ebd0 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2585,9 +2585,9 @@ contains if (t % filters(j) % int_bins(d) < 1 .or. & t % filters(j) % int_bins(d) > MAX_DELAYED_GROUPS) then call fatal_error("Encountered delayedgroup bin with index " & - &// trim(to_str(t % filters(j) % int_bins(d))) & - &//" that is outside the range of 1 to MAX_DELAYED_GROUPS"& - &// " (" // trim(to_str(MAX_DELAYED_GROUPS)) // ")") + // trim(to_str(t % filters(j) % int_bins(d))) // " that is& + & outside the range of 1 to MAX_DELAYED_GROUPS ( " & + // trim(to_str(MAX_DELAYED_GROUPS)) // ")") end if end do @@ -2833,6 +2833,14 @@ contains end do end if + ! Check if delayed group filter is used with any score besides + ! delayed-nu-fission + if (trim(score_name) /= 'delayed-nu-fission' .and. & + t % find_filter(FILTER_DELAYEDGROUP) > 0) then + call fatal_error("Cannot tally " // trim(score_name) // " with a & + &delayedgroup filter.") + end if + select case (trim(score_name)) case ('flux') ! Prohibit user from tallying flux for an individual nuclide @@ -2847,11 +2855,6 @@ contains &filter.") end if - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally flux with a & - &delayedgroup energy filter.") - end if - case ('flux-yn') ! Prohibit user from tallying flux for an individual nuclide if (.not. (t % n_nuclide_bins == 1 .and. & @@ -2864,11 +2867,6 @@ contains &filter.") end if - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally flux with a & - &delayedgroup energy filter.") - end if - t % score_bins(j : j + n_bins - 1) = SCORE_FLUX_YN t % moment_order(j : j + n_bins - 1) = n_order j = j + n_bins - 1 @@ -2880,53 +2878,28 @@ contains &outgoing energy filter.") end if - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally total reaction rate with a & - &delayedgroup energy filter.") - end if - case ('total-yn') if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally total reaction rate with an & &outgoing energy filter.") end if - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally total reaction rate with a & - &delayedgroup energy filter.") - end if - t % score_bins(j : j + n_bins - 1) = SCORE_TOTAL_YN t % moment_order(j : j + n_bins - 1) = n_order j = j + n_bins - 1 case ('scatter') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally scatter with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_SCATTER case ('nu-scatter') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally nu scatter with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_NU_SCATTER ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG case ('scatter-n') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally scatter n with a & - &delayedgroup energy filter.") - end if - if (n_order == 0) then t % score_bins(j) = SCORE_SCATTER else @@ -2938,11 +2911,6 @@ contains case ('nu-scatter-n') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally nu scatter n with a & - &delayedgroup energy filter.") - end if - ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG if (n_order == 0) then @@ -2954,11 +2922,6 @@ contains case ('scatter-pn') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally scatter pn with a & - &delayedgroup energy filter.") - end if - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_PN @@ -2967,11 +2930,6 @@ contains case ('nu-scatter-pn') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally nu scatter pn with a & - &delayedgroup energy filter.") - end if - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_PN @@ -2980,11 +2938,6 @@ contains case ('scatter-yn') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally scatter yn with a & - &delayedgroup energy filter.") - end if - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_YN @@ -2993,11 +2946,6 @@ contains case ('nu-scatter-yn') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally nu scatter yn with a & - &delayedgroup energy filter.") - end if - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_YN @@ -3006,11 +2954,6 @@ contains case('transport') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally transport reaction rate with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_TRANSPORT ! Set tally estimator to analog @@ -3020,11 +2963,6 @@ contains &please remove") case ('n1n') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally n1n with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_N_1N ! Set tally estimator to analog @@ -3040,11 +2978,6 @@ contains case ('absorption') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally absorption rate with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_ABSORPTION if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally absorption rate with an outgoing & @@ -3052,11 +2985,6 @@ contains end if case ('fission') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally fission rate with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally fission rate with an outgoing & @@ -3064,11 +2992,6 @@ contains end if case ('nu-fission') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally nu fission rate with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_NU_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then ! Set tally estimator to analog @@ -3083,19 +3006,9 @@ contains end if case ('kappa-fission') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally kappa fission with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_KAPPA_FISSION case ('current') - if (t % find_filter(FILTER_DELAYEDGROUP) > 0) then - call fatal_error("Cannot tally current with a & - &delayedgroup energy filter.") - end if - t % score_bins(j) = SCORE_CURRENT t % type = TALLY_SURFACE_CURRENT diff --git a/src/particle_header.F90 b/src/particle_header.F90 index 4770317579..b2f6c579e0 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -116,22 +116,19 @@ contains this % alive = .true. ! clear attributes - this % surface = NONE - this % cell_born = NONE - this % material = NONE - this % last_material = NONE - this % wgt = ONE - this % last_wgt = ONE - this % absorb_wgt = ZERO - this % n_bank = 0 - this % wgt_bank = ZERO - this % n_collision = 0 - this % fission = .false. - this % delayed_group = 0 - - do d = 1, MAX_DELAYED_GROUPS - this % n_delayed_bank(d) = 0 - end do + this % surface = NONE + this % cell_born = NONE + this % material = NONE + this % last_material = NONE + this % wgt = ONE + this % last_wgt = ONE + this % absorb_wgt = ZERO + this % n_bank = 0 + this % wgt_bank = ZERO + this % n_collision = 0 + this % fission = .false. + this % delayed_group = 0 + this % n_delayed_bank(:) = 0 ! Set up base level coordinates this % coord(1) % universe = BASE_UNIVERSE diff --git a/src/physics.F90 b/src/physics.F90 index da46be8518..5e9675b175 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1052,7 +1052,7 @@ contains integer, intent(in) :: i_reaction integer :: d ! delayed group index - integer :: nu_delayed(MAX_DELAYED_GROUPS) ! number of delayed neutrons born + integer :: nu_d(MAX_DELAYED_GROUPS) ! number of delayed neutrons born integer :: i ! loop index integer :: nu ! actual number of neutrons produced integer :: ijk(3) ! indices in ufs mesh @@ -1113,9 +1113,7 @@ contains ! Initialize counter of delayed neutrons encountered for each delayed group ! to zero. - do d = 1, MAX_DELAYED_GROUPS - nu_delayed(d) = 0 - end do + nu_d(:) = 0 p % fission = .true. ! Fission neutrons will be banked do i = int(n_bank,4) + 1, int(min(n_bank + nu, int(size(fission_bank),8)),4) @@ -1146,7 +1144,7 @@ contains ! Increment the number of neutrons born delayed if (p % delayed_group > 0) then - nu_delayed(p % delayed_group) = nu_delayed(p % delayed_group) + 1 + nu_d(p % delayed_group) = nu_d(p % delayed_group) + 1 end if end do @@ -1156,9 +1154,7 @@ contains ! Store total and delayed weight banked for analog fission tallies p % n_bank = nu p % wgt_bank = nu/weight - do d = 1, MAX_DELAYED_GROUPS - p % n_delayed_bank(d) = nu_delayed(d) - end do + p % n_delayed_bank(:) = nu_d(:) end subroutine create_fission_sites diff --git a/src/tally.F90 b/src/tally.F90 index 9a4b70ab84..d93b721bfc 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -485,7 +485,7 @@ contains end if else - ! Check if material XS are present + ! Check if tally is on a single nuclide if (i_nuclide > 0) then ! Check if the delayed group filter is present @@ -505,22 +505,45 @@ contains score = micro_xs(i_nuclide) % delayed_nu_fission & * atom_density * flux end if + + ! Tally is on total nuclides else - score = ZERO + ! Get pointer to current material + mat => materials(p % material) ! Check if the delayed group filter is present if (dg_filter > 0) then - ! Loop over all delayed group bins and tally to them individually - do d_bin = 1, t % filters(dg_filter) % n_bins - d = t % filters(dg_filter) % int_bins(d_bin) - score = score + material_xs % delayed_nu_fission(d) * flux - call score_fission_delayed_dg(t, d_bin, score, score_index) + + do l = 1, mat % n_nuclides + ! Get atom density + atom_density_ = mat % atom_density(l) + ! Get index in nuclides array + i_nuc = mat % nuclide(l) + + ! Loop over all delayed group bins and tally to them individually + do d_bin = 1, t % filters(dg_filter) % n_bins + d = t % filters(dg_filter) % int_bins(d_bin) + nuc => nuclides(i_nuc) + yield = yield_delayed(nuc, p % E, d) + score = micro_xs(i_nuc) % delayed_nu_fission * yield & + * atom_density_ * flux + call score_fission_delayed_dg(t, d_bin, score, score_index) + end do end do cycle SCORE_LOOP else - do d = 1, MAX_DELAYED_GROUPS - score = score + material_xs % delayed_nu_fission(d) * flux + + score = ZERO + + do l = 1, mat % n_nuclides + ! Get atom density + atom_density_ = mat % atom_density(l) + ! Get index in nuclides array + i_nuc = mat % nuclide(l) + + score = score + micro_xs(i_nuc) % delayed_nu_fission & + * atom_density_ * flux end do end if end if @@ -985,9 +1008,9 @@ contains subroutine score_fission_delayed_eout(p, t, i_score) - type(Particle), intent(in) :: p - type(TallyObject), pointer :: t - integer, intent(in) :: i_score ! index for score + type(Particle), intent(in) :: p + type(TallyObject), intent(in) :: t + integer, intent(in) :: i_score ! index for score integer :: i ! index of outgoing energy filter integer :: j ! index of delayedgroup filter @@ -1070,9 +1093,9 @@ contains subroutine score_fission_delayed_dg(t, d_bin, score, score_index) - type(TallyObject), pointer :: t - integer, intent(in) :: score_index ! index for score - integer, intent(in) :: d_bin ! delayed group bin index + type(TallyObject) :: t + integer, intent(in) :: score_index ! index for score + integer, intent(in) :: d_bin ! delayed group bin index integer :: bin_original ! original bin index integer :: filter_index ! index for matching filter bin combination diff --git a/src/tracking.F90 b/src/tracking.F90 index e49b554cee..d02df8d093 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -165,10 +165,7 @@ contains ! Reset banked weight during collision p % n_bank = 0 p % wgt_bank = ZERO - - do d = 1, MAX_DELAYED_GROUPS - p % n_delayed_bank = 0 - end do + p % n_delayed_bank(:) = 0 ! Reset fission logical p % fission = .false. From c8c2593a84f4c85b9e8cd700f0a63df474546cea Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 12 Oct 2015 14:23:12 -0400 Subject: [PATCH 333/519] fixed source code style issues --- src/input_xml.F90 | 2 +- src/tally.F90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 62aad18f22..477013c820 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2940,7 +2940,7 @@ contains if (trim(score_name) /= 'delayed-nu-fission' .and. & t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally " // trim(score_name) // " with a & - &delayedgroup filter.") + &delayedgroup filter.") end if ! Check to see if the mu filter is applied and if that makes sense. diff --git a/src/tally.F90 b/src/tally.F90 index 69ccd07d2a..5477159d5a 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -527,7 +527,7 @@ contains nuc => nuclides(i_nuc) yield = yield_delayed(nuc, p % E, d) score = micro_xs(i_nuc) % delayed_nu_fission * yield & - * atom_density_ * flux + * atom_density_ * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do end do From 62ed2f1e41a00e50bb5d7cce59d178adaf4302f3 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 12 Oct 2015 15:01:21 -0400 Subject: [PATCH 334/519] updatd score delayed nu fission test --- src/input_xml.F90 | 17 ----------------- .../results_true.dat | 8 ++++---- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 477013c820..528ea40f51 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2973,7 +2973,6 @@ contains call fatal_error("Cannot tally flux with an outgoing energy & &filter.") end if - case ('flux-yn') ! Prohibit user from tallying flux for an individual nuclide if (.not. (t % n_nuclide_bins == 1 .and. & @@ -3008,17 +3007,14 @@ contains j = j + n_bins - 1 case ('scatter') - t % score_bins(j) = SCORE_SCATTER case ('nu-scatter') - t % score_bins(j) = SCORE_NU_SCATTER ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG case ('scatter-n') - if (n_order == 0) then t % score_bins(j) = SCORE_SCATTER else @@ -3029,7 +3025,6 @@ contains t % moment_order(j) = n_order case ('nu-scatter-n') - ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG if (n_order == 0) then @@ -3040,7 +3035,6 @@ contains t % moment_order(j) = n_order case ('scatter-pn') - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_PN @@ -3048,7 +3042,6 @@ contains j = j + n_bins - 1 case ('nu-scatter-pn') - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_PN @@ -3056,7 +3049,6 @@ contains j = j + n_bins - 1 case ('scatter-yn') - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_YN @@ -3064,7 +3056,6 @@ contains j = j + n_bins - 1 case ('nu-scatter-yn') - t % estimator = ESTIMATOR_ANALOG ! Setup P0:Pn t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_YN @@ -3072,7 +3063,6 @@ contains j = j + n_bins - 1 case('transport') - t % score_bins(j) = SCORE_TRANSPORT ! Set tally estimator to analog @@ -3081,7 +3071,6 @@ contains call fatal_error("Diffusion score no longer supported for tallies, & &please remove") case ('n1n') - t % score_bins(j) = SCORE_N_1N ! Set tally estimator to analog @@ -3096,38 +3085,32 @@ contains t % score_bins(j) = N_4N case ('absorption') - t % score_bins(j) = SCORE_ABSORPTION if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally absorption rate with an outgoing & &energy filter.") end if case ('fission') - t % score_bins(j) = SCORE_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then call fatal_error("Cannot tally fission rate with an outgoing & &energy filter.") end if case ('nu-fission') - t % score_bins(j) = SCORE_NU_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG end if case ('delayed-nu-fission') - t % score_bins(j) = SCORE_DELAYED_NU_FISSION if (t % find_filter(FILTER_ENERGYOUT) > 0) then ! Set tally estimator to analog t % estimator = ESTIMATOR_ANALOG end if case ('kappa-fission') - t % score_bins(j) = SCORE_KAPPA_FISSION case ('current') - t % score_bins(j) = SCORE_CURRENT t % type = TALLY_SURFACE_CURRENT diff --git a/tests/test_score_delayed_nufission/results_true.dat b/tests/test_score_delayed_nufission/results_true.dat index 4af4a49616..88dd5435e4 100644 --- a/tests/test_score_delayed_nufission/results_true.dat +++ b/tests/test_score_delayed_nufission/results_true.dat @@ -2,13 +2,13 @@ k-combined: 1.005983E+00 2.248579E-02 tally 1: 1.432287E-02 -4.518735E-05 +4.518736E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 1.531355E-02 -5.079890E-05 +5.079891E-05 tally 2: 1.576415E-02 2.485084E-04 @@ -20,10 +20,10 @@ tally 2: 0.000000E+00 tally 3: 1.365224E-02 -3.952118E-05 +3.952119E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 1.442838E-02 -4.559807E-05 +4.559808E-05 From 129ca7b46c91977e9d6c44c701d014021b84608f Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 12 Oct 2015 16:12:25 -0400 Subject: [PATCH 335/519] fixed errors in comments --- src/ace.F90 | 2 +- src/cross_section.F90 | 2 -- src/fission.F90 | 6 +++--- src/physics.F90 | 22 +++++++++++----------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 91653195b5..47f7c008b9 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -1417,7 +1417,7 @@ contains ! determine energy E = nuc % energy(i) - ! determine total nu at given energy + ! determine nu delayed at given energy nu_d = nu_delayed(nuc, E) ! determine delayed-nu-fission microscopic cross section diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 1b94a1049f..24f48c5701 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -70,7 +70,6 @@ contains ! Add contribution from each nuclide in material do i = 1, mat % n_nuclides - ! ======================================================================== ! CHECK FOR S(A,B) TABLE @@ -259,7 +258,6 @@ contains micro_xs(i_nuclide) % delayed_nu_fission = (ONE - f) * & nuc % delayed_nu_fission(i_grid) + f * & nuc % delayed_nu_fission(i_grid+1) - end if ! If there is S(a,b) data for this nuclide, we need to do a few diff --git a/src/fission.F90 b/src/fission.F90 index 2624672d17..c91d595e26 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -63,7 +63,7 @@ contains ! since no prompt or delayed data is present, this means all neutron ! emission is prompt -- WARNING: This currently returns zero. The calling ! routine needs to know this situation is occurring since we don't want - ! to call nu_total unnecessarily if it's already been called. + ! to call nu_total unnecessarily if it has already been called. nu = ZERO elseif (nuc % nu_p_type == NU_POLYNOMIAL) then ! determine number of coefficients @@ -97,7 +97,7 @@ contains ! since no prompt or delayed data is present, this means all neutron ! emission is prompt -- WARNING: This currently returns zero. The calling ! routine needs to know this situation is occurring since we don't want - ! to call nu_delayed unnecessarily if it's already been called. + ! to call nu_delayed unnecessarily if it has already been called. nu = ZERO elseif (nuc % nu_d_type == NU_TABULAR) then ! use ENDF interpolation laws to determine nu @@ -132,7 +132,7 @@ contains ! since no prompt or delayed data is present, this means all neutron ! emission is prompt -- WARNING: This currently returns zero. The calling ! routine needs to know this situation is occurring since we don't want - ! to call yield unnecessarily if it's already been called. + ! to call yield unnecessarily if it has already been called. yield = ZERO else if (nuc % nu_d_type == NU_TABULAR) then diff --git a/src/physics.F90 b/src/physics.F90 index 3bf0a43661..569b89bb09 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1063,16 +1063,16 @@ contains integer, intent(in) :: i_nuclide integer, intent(in) :: i_reaction - integer :: d ! delayed group index - integer :: nu_d(MAX_DELAYED_GROUPS) ! number of delayed neutrons born - integer :: i ! loop index - integer :: nu ! actual number of neutrons produced - integer :: ijk(3) ! indices in ufs mesh - real(8) :: nu_t ! total nu - real(8) :: mu ! fission neutron angular cosine - real(8) :: phi ! fission neutron azimuthal angle - real(8) :: weight ! weight adjustment for ufs method - logical :: in_mesh ! source site in ufs mesh? + integer :: d ! delayed group index + integer :: nu_d(MAX_DELAYED_GROUPS) ! number of delayed neutrons born + integer :: i ! loop index + integer :: nu ! actual number of neutrons produced + integer :: ijk(3) ! indices in ufs mesh + real(8) :: nu_t ! total nu + real(8) :: mu ! fission neutron angular cosine + real(8) :: phi ! fission neutron azimuthal angle + real(8) :: weight ! weight adjustment for ufs method + logical :: in_mesh ! source site in ufs mesh? type(Nuclide), pointer :: nuc type(Reaction), pointer :: rxn @@ -1178,7 +1178,7 @@ contains type(Nuclide), pointer :: nuc type(Reaction), pointer :: rxn - type(Particle), intent(inout) :: p ! Particle caussing fission + type(Particle), intent(inout) :: p ! Particle causing fission real(8) :: E_out ! outgoing energy of fission neutron integer :: j ! index on nu energy grid / precursor group From 46e012de9b50249daf444e267111c0274c65f2ab Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 17:00:26 -0400 Subject: [PATCH 336/519] Added get_all_materials to Cell, Universe and Lattice classes --- openmc/universe.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/openmc/universe.py b/openmc/universe.py index f8ecb535c7..61e48f79d7 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -300,6 +300,27 @@ class Cell(object): return cells + def get_all_materials(self): + """Return all materials that are contained within the cell + + Returns + ------- + materials : dict + Dictionary whose keys are material IDs and values are Material instances + + """ + + materials = OrderedDict() + if self.fill_type == 'material': + materials[self.fill.id] = self.fill + + # Append all Cells in each Cell in the Universe to the dictionary + cells = self.get_all_cells() + for cell_id, cell in cells.items(): + materials.update(cell.get_all_materials()) + + return materials + def get_all_universes(self): """Return all universes that are contained within this one if any of its cells are filled with a universe or lattice. @@ -570,6 +591,25 @@ class Universe(object): return cells + def get_all_materials(self): + """Return all materials that are contained within the universe + + Returns + ------- + materials : dict + Dictionary whose keys are material IDs and values are Material instances + + """ + + materials = OrderedDict() + + # Append all Cells in each Cell in the Universe to the dictionary + cells = self.get_all_cells() + for cell_id, cell in cells.items(): + materials.update(cell.get_all_materials()) + + return materials + def get_all_universes(self): """Return all universes that are contained within this one. @@ -775,6 +815,25 @@ class Lattice(object): return cells + def get_all_materials(self): + """Return all materials that are contained within the lattice + + Returns + ------- + materials : dict + Dictionary whose keys are material IDs and values are Material instances + + """ + + materials = OrderedDict() + + # Append all Cells in each Cell in the Universe to the dictionary + cells = self.get_all_cells() + for cell_id, cell in cells.items(): + materials.update(cell.get_all_materials()) + + return materials + def get_all_universes(self): """Return all universes that are contained within the lattice From b9a439da11233b1569d8eb3629c543c5f0136818 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 23:16:45 -0400 Subject: [PATCH 337/519] Python API now allows IDs to be greater than or equal to zer --- openmc/material.py | 2 +- openmc/mesh.py | 2 +- openmc/plots.py | 2 +- openmc/surface.py | 2 +- openmc/tallies.py | 2 +- openmc/universe.py | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index b4a553e66a..4c3a636965 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -157,7 +157,7 @@ class Material(object): msg = 'Unable to set Material ID to "{0}" since a Material with ' \ 'this ID was already initialized'.format(material_id) raise ValueError(msg) - check_greater_than('material ID', material_id, 0) + check_greater_than('material ID', material_id, 0, equality=True) self._id = material_id MATERIAL_IDS.append(material_id) diff --git a/openmc/mesh.py b/openmc/mesh.py index e410c99100..822370c019 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -145,7 +145,7 @@ class Mesh(object): AUTO_MESH_ID += 1 else: cv.check_type('mesh ID', mesh_id, Integral) - cv.check_greater_than('mesh ID', mesh_id, 0) + cv.check_greater_than('mesh ID', mesh_id, 0, equality=True) self._id = mesh_id @name.setter diff --git a/openmc/plots.py b/openmc/plots.py index 66419a6ffc..07da4d8550 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -144,7 +144,7 @@ class Plot(object): AUTO_PLOT_ID += 1 else: check_type('plot ID', plot_id, Integral) - check_greater_than('plot ID', plot_id, 0) + check_greater_than('plot ID', plot_id, 0, equality=True) self._id = plot_id @name.setter diff --git a/openmc/surface.py b/openmc/surface.py index ae2e222ac5..155219a4df 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -119,7 +119,7 @@ class Surface(object): AUTO_SURFACE_ID += 1 else: check_type('surface ID', surface_id, Integral) - check_greater_than('surface ID', surface_id, 0) + check_greater_than('surface ID', surface_id, 0, equality=True) self._id = surface_id @name.setter diff --git a/openmc/tallies.py b/openmc/tallies.py index f990572e57..5baebd087c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -400,7 +400,7 @@ class Tally(object): AUTO_TALLY_ID += 1 else: cv.check_type('tally ID', tally_id, Integral) - cv.check_greater_than('tally ID', tally_id, 0) + cv.check_greater_than('tally ID', tally_id, 0, equality=True) self._id = tally_id @name.setter diff --git a/openmc/universe.py b/openmc/universe.py index f8ecb535c7..1504a3cb65 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -144,7 +144,7 @@ class Cell(object): AUTO_CELL_ID += 1 else: cv.check_type('cell ID', cell_id, Integral) - cv.check_greater_than('cell ID', cell_id, 0) + cv.check_greater_than('cell ID', cell_id, 0, equality=True) self._id = cell_id @name.setter @@ -442,7 +442,7 @@ class Universe(object): AUTO_UNIVERSE_ID += 1 else: cv.check_type('universe ID', universe_id, Integral) - cv.check_greater_than('universe ID', universe_id, 0, True) + cv.check_greater_than('universe ID', universe_id, 0, equality=True) self._id = universe_id @name.setter @@ -685,7 +685,7 @@ class Lattice(object): AUTO_UNIVERSE_ID += 1 else: cv.check_type('lattice ID', lattice_id, Integral) - cv.check_greater_than('lattice ID', lattice_id, 0) + cv.check_greater_than('lattice ID', lattice_id, 0, equality=True) self._id = lattice_id @name.setter From bb9c0ea40cae0cbe6e1169c935474ed88ca17b83 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 23:41:42 -0400 Subject: [PATCH 338/519] Made surface name 104 characters --- src/surface_header.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface_header.F90 b/src/surface_header.F90 index 6fc1bbc237..29dcddb4e0 100644 --- a/src/surface_header.F90 +++ b/src/surface_header.F90 @@ -15,7 +15,7 @@ module surface_header neighbor_pos(:), & ! List of cells on positive side neighbor_neg(:) ! List of cells on negative side integer :: bc ! Boundary condition - character(len=52) :: name = "" ! User-defined name + character(len=104) :: name = "" ! User-defined name contains procedure :: sense procedure :: reflect From ebe8ac3902a5f8e393b5436c01f4910db1d6cede Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 12 Oct 2015 23:56:13 -0400 Subject: [PATCH 339/519] Updated IPython Notebook examples to use new Python API Region abstraction --- .../examples/multi-group-cross-sections.ipynb | 73 +++++----------- .../examples/pandas-dataframes.ipynb | 86 ++++++------------- .../pythonapi/examples/post-processing.ipynb | 74 +++------------- .../pythonapi/examples/tally-arithmetic.ipynb | 74 +++++----------- 4 files changed, 83 insertions(+), 224 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index e66dd47648..511328d25b 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -167,27 +167,13 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Instantiate a Cell\n", "cell = openmc.Cell(cell_id=1, name='cell')\n", "\n", "# Register bounding Surfaces with the Cell\n", - "cell.add_surface(surface=min_x, halfspace=+1)\n", - "cell.add_surface(surface=max_x, halfspace=-1)\n", - "cell.add_surface(surface=min_y, halfspace=+1)\n", - "cell.add_surface(surface=max_y, halfspace=-1)\n", + "cell.region = +min_x & -max_x & +min_y & -max_y\n", "\n", "# Fill the Cell with the Material\n", "cell.fill = inf_medium" @@ -479,8 +465,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-11 11:02:44\n", + " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", + " Date/Time: 2015-10-12 23:49:21\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -565,20 +551,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9700E-01 seconds\n", - " Reading cross sections = 8.9000E-02 seconds\n", - " Total time in simulation = 1.2140E+01 seconds\n", - " Time in transport only = 1.2131E+01 seconds\n", - " Time in inactive batches = 1.8560E+00 seconds\n", - " Time in active batches = 1.0284E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for initialization = 4.2400E-01 seconds\n", + " Reading cross sections = 9.5000E-02 seconds\n", + " Total time in simulation = 1.3063E+01 seconds\n", + " Time in transport only = 1.3047E+01 seconds\n", + " Time in inactive batches = 2.0150E+00 seconds\n", + " Time in active batches = 1.1048E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.2547E+01 seconds\n", - " Calculation Rate (inactive) = 13469.8 neutrons/second\n", - " Calculation Rate (active) = 9723.84 neutrons/second\n", + " Total time elapsed = 1.3498E+01 seconds\n", + " Calculation Rate (inactive) = 12406.9 neutrons/second\n", + " Calculation Rate (active) = 9051.41 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1028,8 +1014,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", @@ -1337,18 +1322,7 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -1356,20 +1330,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -1885,7 +1858,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 1a6d99fd71..294c35ba0c 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -164,18 +164,7 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -183,20 +172,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -236,32 +224,14 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", "root_cell.fill = assembly\n", "\n", "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "root_cell.add_surface(min_z, halfspace=+1)\n", - "root_cell.add_surface(max_z, halfspace=-1)\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", @@ -409,7 +379,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTA4VDE2OjEw\nOjMyLTA0OjAwm8uP7QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQxNjoxMDozMi0wNDow\nMOqWN1EAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTEyVDIzOjQ5\nOjA0LTA0OjAw6Y3dGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0xMlQyMzo0OTowNC0wNDow\nMJjQZacAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -598,8 +568,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 16:10:32\n", + " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", + " Date/Time: 2015-10-12 23:49:04\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -663,20 +633,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1200E-01 seconds\n", - " Reading cross sections = 9.5000E-02 seconds\n", - " Total time in simulation = 8.7750E+00 seconds\n", - " Time in transport only = 8.7640E+00 seconds\n", - " Time in inactive batches = 1.3210E+00 seconds\n", - " Time in active batches = 7.4540E+00 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", + " Total time for initialization = 4.0100E-01 seconds\n", + " Reading cross sections = 8.9000E-02 seconds\n", + " Total time in simulation = 9.1400E+00 seconds\n", + " Time in transport only = 9.1280E+00 seconds\n", + " Time in inactive batches = 1.3230E+00 seconds\n", + " Time in active batches = 7.8170E+00 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", + " Time accumulating tallies = 3.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 9.1960E+00 seconds\n", - " Calculation Rate (inactive) = 9462.53 neutrons/second\n", - " Calculation Rate (active) = 5030.86 neutrons/second\n", + " Total time elapsed = 9.5500E+00 seconds\n", + " Calculation Rate (inactive) = 9448.22 neutrons/second\n", + " Calculation Rate (active) = 4797.24 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1106,7 +1076,7 @@ "data": { "image/png": "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\nkiRJEsA/A3sng0v+IomuAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1129,7 +1099,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1140,7 +1110,7 @@ "data": { "image/png": "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\n/wfC21DgNNvIcQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2345,7 +2315,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2356,7 +2326,7 @@ "data": { "image/png": "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\niUSS+/w/t3PPI3Lev3cAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2383,7 +2353,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2394,7 +2364,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index fbaa3b5159..ecf027fda5 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -159,18 +159,7 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -178,20 +167,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -208,32 +196,14 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", "root_cell.fill = pin_cell_universe\n", "\n", "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "root_cell.add_surface(min_z, halfspace=+1)\n", - "root_cell.add_surface(max_z, halfspace=-1)\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", @@ -377,7 +347,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTM6NDI6MjAtMDQ6MDCoc1E2AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDEzOjQyOjIwLTA0OjAw2S7pigAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMTJUMjM6NTE6MDAtMDQ6MDDPm2Y8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTEy\nVDIzOjUxOjAwLTA0OjAwvsbegAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -488,8 +458,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 13:42:20\n", + " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", + " Date/Time: 2015-10-12 23:51:01\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -537,31 +507,7 @@ " 19/1 1.00071 1.04214 +/- 0.00800\n", " 20/1 1.05587 1.04351 +/- 0.00729\n", " 21/1 1.03886 1.04309 +/- 0.00660\n", - " 22/1 1.04335 1.04311 +/- 0.00603\n", - " 23/1 1.04057 1.04292 +/- 0.00555\n", - " 24/1 1.01976 1.04126 +/- 0.00540\n", - " 25/1 1.05811 1.04238 +/- 0.00515\n", - " 26/1 1.02351 1.04120 +/- 0.00496\n", - " 27/1 1.05261 1.04188 +/- 0.00471\n", - " 28/1 1.03355 1.04141 +/- 0.00446\n", - " 29/1 1.02797 1.04071 +/- 0.00428\n", - " 30/1 1.03758 1.04055 +/- 0.00406\n", - " 31/1 1.04883 1.04094 +/- 0.00388\n", - " 32/1 1.03557 1.04070 +/- 0.00371\n", - " 33/1 1.02947 1.04021 +/- 0.00358\n", - " 34/1 1.03651 1.04006 +/- 0.00343\n", - " 35/1 1.03331 1.03979 +/- 0.00330\n", - " 36/1 1.05947 1.04054 +/- 0.00326\n", - " 37/1 1.05093 1.04093 +/- 0.00316\n", - " 38/1 1.06787 1.04189 +/- 0.00319\n", - " 39/1 1.01451 1.04095 +/- 0.00322\n", - " 40/1 1.02351 1.04037 +/- 0.00317\n", - " 41/1 1.04826 1.04062 +/- 0.00307\n", - " 42/1 1.04228 1.04067 +/- 0.00298\n", - " 43/1 1.03214 1.04041 +/- 0.00290\n", - " 44/1 1.04950 1.04068 +/- 0.00282\n", - " 45/1 1.06616 1.04141 +/- 0.00284\n", - " 46/1 1.07039 1.04221 +/- 0.00287\n" + " 22/1 1.04335 1.04311 +/- 0.00603\n" ] } ], diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 2687c13267..0c98697677 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -174,18 +174,7 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -193,20 +182,19 @@ "# Create fuel Cell\n", "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", "fuel_cell.fill = fuel\n", - "fuel_cell.add_surface(fuel_outer_radius, halfspace=-1)\n", + "fuel_cell.region = -fuel_outer_radius\n", "pin_cell_universe.add_cell(fuel_cell)\n", "\n", "# Create a clad Cell\n", "clad_cell = openmc.Cell(name='1.6% Clad')\n", "clad_cell.fill = zircaloy\n", - "clad_cell.add_surface(fuel_outer_radius, halfspace=+1)\n", - "clad_cell.add_surface(clad_outer_radius, halfspace=-1)\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", "pin_cell_universe.add_cell(clad_cell)\n", "\n", "# Create a moderator Cell\n", "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", "moderator_cell.fill = water\n", - "moderator_cell.add_surface(clad_outer_radius, halfspace=+1)\n", + "moderator_cell.region = +clad_outer_radius\n", "pin_cell_universe.add_cell(moderator_cell)" ] }, @@ -223,32 +211,14 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:223: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" - ] - } - ], + "outputs": [], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", "root_cell.fill = pin_cell_universe\n", "\n", "# Add boundary planes\n", - "root_cell.add_surface(min_x, halfspace=+1)\n", - "root_cell.add_surface(max_x, halfspace=-1)\n", - "root_cell.add_surface(min_y, halfspace=+1)\n", - "root_cell.add_surface(max_y, halfspace=-1)\n", - "root_cell.add_surface(min_z, halfspace=+1)\n", - "root_cell.add_surface(max_z, halfspace=-1)\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", "\n", "# Create root Universe\n", "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", @@ -393,7 +363,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTY6MDk6NTgtMDQ6MDDETy0uAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDE2OjA5OjU4LTA0OjAwtRKVkgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMTJUMjM6NTI6MDgtMDQ6MDAXQ5NYAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTEy\nVDIzOjUyOjA4LTA0OjAwZh4r5AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -603,8 +573,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", - " Date/Time: 2015-10-08 16:09:59\n", + " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", + " Date/Time: 2015-10-12 23:52:08\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -660,20 +630,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.0200E-01 seconds\n", - " Reading cross sections = 9.5000E-02 seconds\n", - " Total time in simulation = 1.5664E+01 seconds\n", - " Time in transport only = 1.5652E+01 seconds\n", - " Time in inactive batches = 2.3940E+00 seconds\n", - " Time in active batches = 1.3270E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 4.1300E-01 seconds\n", + " Reading cross sections = 9.6000E-02 seconds\n", + " Total time in simulation = 1.6248E+01 seconds\n", + " Time in transport only = 1.6236E+01 seconds\n", + " Time in inactive batches = 2.3150E+00 seconds\n", + " Time in active batches = 1.3933E+01 seconds\n", + " Time synchronizing fission bank = 0.0000E+00 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.6076E+01 seconds\n", - " Calculation Rate (inactive) = 5221.39 neutrons/second\n", - " Calculation Rate (active) = 2825.92 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.6672E+01 seconds\n", + " Calculation Rate (inactive) = 5399.57 neutrons/second\n", + " Calculation Rate (active) = 2691.45 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", From 23f64bf3301341d393bfc9d9bfc1e05528845e57 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 13 Oct 2015 00:59:41 -0400 Subject: [PATCH 340/519] MGXS and Library classes now accept tally triggers --- .../examples/multi-group-cross-sections.ipynb | 238 ++++++++++++++---- openmc/mgxs/library.py | 19 ++ openmc/mgxs/mgxs.py | 20 ++ openmc/tallies.py | 3 +- openmc/trigger.py | 9 + 5 files changed, 246 insertions(+), 43 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 511328d25b..ada6989b4b 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -466,7 +466,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-12 23:49:21\n", + " Date/Time: 2015-10-13 00:55:08\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -551,20 +551,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2400E-01 seconds\n", - " Reading cross sections = 9.5000E-02 seconds\n", - " Total time in simulation = 1.3063E+01 seconds\n", - " Time in transport only = 1.3047E+01 seconds\n", - " Time in inactive batches = 2.0150E+00 seconds\n", - " Time in active batches = 1.1048E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.3498E+01 seconds\n", - " Calculation Rate (inactive) = 12406.9 neutrons/second\n", - " Calculation Rate (active) = 9051.41 neutrons/second\n", + " Total time for initialization = 3.9300E-01 seconds\n", + " Reading cross sections = 9.1000E-02 seconds\n", + " Total time in simulation = 1.2182E+01 seconds\n", + " Time in transport only = 1.2171E+01 seconds\n", + " Time in inactive batches = 1.7420E+00 seconds\n", + " Time in active batches = 1.0440E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.2585E+01 seconds\n", + " Calculation Rate (inactive) = 14351.3 neutrons/second\n", + " Calculation Rate (active) = 9578.54 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -679,7 +679,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1486: RuntimeWarning: invalid value encountered in divide\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1487: RuntimeWarning: invalid value encountered in divide\n" ] } ], @@ -1407,7 +1407,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1428,6 +1428,28 @@ " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" ] }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a tally trigger set to 10% on the relative error\n", + "tally_trigger = openmc.Trigger('variance', 1E-5)\n", + "\n", + "# Add the tally trigger to each of the multi-group cross section tallies\n", + "for cell in openmc_cells:\n", + " for mgxs_type in xs_library[cell.id].keys():\n", + " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger\n", + " \n", + "# Set the trigger to active in the \"settings.xml\" file\n", + "settings_file.trigger_active = True\n", + "settings_file.trigger_max_batches = settings_file.batches * 2\n", + "settings_file.export_to_xml()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1437,7 +1459,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1477,18 +1499,150 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", + " Date/Time: 2015-10-13 00:55:22\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.27747 \n", + " 2/1 1.24641 \n", + " 3/1 1.23998 \n", + " 4/1 1.22236 \n", + " 5/1 1.22609 \n", + " 6/1 1.14473 \n", + " 7/1 1.21385 \n", + " 8/1 1.17205 \n", + " 9/1 1.18419 \n", + " 10/1 1.22500 \n", + " 11/1 1.24778 \n", + " 12/1 1.23680 1.24229 +/- 0.00549\n", + " 13/1 1.23752 1.24070 +/- 0.00355\n", + " 14/1 1.26918 1.24782 +/- 0.00755\n", + " 15/1 1.23346 1.24495 +/- 0.00651\n", + " 16/1 1.23687 1.24360 +/- 0.00549\n", + " 17/1 1.22006 1.24024 +/- 0.00573\n", + " 18/1 1.23162 1.23916 +/- 0.00508\n", + " 19/1 1.22456 1.23754 +/- 0.00476\n", + " 20/1 1.21237 1.23502 +/- 0.00495\n", + " 21/1 1.24915 1.23631 +/- 0.00466\n", + " 22/1 1.17014 1.23079 +/- 0.00696\n", + " 23/1 1.18388 1.22718 +/- 0.00735\n", + " 24/1 1.20614 1.22568 +/- 0.00697\n", + " 25/1 1.22888 1.22589 +/- 0.00649\n", + " 26/1 1.20734 1.22473 +/- 0.00618\n", + " 27/1 1.28731 1.22841 +/- 0.00688\n", + " 28/1 1.16533 1.22491 +/- 0.00737\n", + " 29/1 1.23361 1.22537 +/- 0.00699\n", + " 30/1 1.22054 1.22513 +/- 0.00663\n", + " 31/1 1.26417 1.22699 +/- 0.00658\n", + " 32/1 1.23181 1.22720 +/- 0.00627\n", + " 33/1 1.21074 1.22649 +/- 0.00604\n", + " 34/1 1.21642 1.22607 +/- 0.00580\n", + " 35/1 1.26934 1.22780 +/- 0.00582\n", + " 36/1 1.24095 1.22831 +/- 0.00562\n", + " 37/1 1.22300 1.22811 +/- 0.00541\n", + " 38/1 1.20875 1.22742 +/- 0.00526\n", + " 39/1 1.21748 1.22708 +/- 0.00508\n", + " 40/1 1.24938 1.22782 +/- 0.00497\n", + " 41/1 1.21652 1.22745 +/- 0.00482\n", + " 42/1 1.22642 1.22742 +/- 0.00467\n", + " 43/1 1.20158 1.22664 +/- 0.00459\n", + " 44/1 1.22475 1.22658 +/- 0.00445\n", + " 45/1 1.25199 1.22731 +/- 0.00438\n", + " 46/1 1.25905 1.22819 +/- 0.00435\n", + " 47/1 1.20490 1.22756 +/- 0.00428\n", + " 48/1 1.20016 1.22684 +/- 0.00423\n", + " 49/1 1.21094 1.22643 +/- 0.00414\n", + " 50/1 1.22919 1.22650 +/- 0.00403\n", + " Triggers satisfied for batch 50\n", + " Creating state point statepoint.050.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 3.9200E-01 seconds\n", + " Reading cross sections = 8.7000E-02 seconds\n", + " Total time in simulation = 3.2711E+01 seconds\n", + " Time in transport only = 3.2694E+01 seconds\n", + " Time in inactive batches = 3.2750E+00 seconds\n", + " Time in active batches = 2.9436E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 8.0000E-03 seconds\n", + " Total time elapsed = 3.3120E+01 seconds\n", + " Calculation Rate (inactive) = 7633.59 neutrons/second\n", + " Calculation Rate (active) = 3397.20 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.22693 +/- 0.00341\n", + " k-effective (Track-length) = 1.22650 +/- 0.00403\n", + " k-effective (Absorption) = 1.22829 +/- 0.00354\n", + " Combined k-effective = 1.22762 +/- 0.00298\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, { "data": { "text/plain": [ "0" ] }, - "execution_count": 36, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1499,7 +1653,7 @@ "\n", "# Run OpenMC with the output throttled!\n", "executor = openmc.Executor()\n", - "executor.run_simulation(output=False)" + "executor.run_simulation(output=True)" ] }, { @@ -1518,14 +1672,14 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Load the last statepoint and summary files\n", - "sp = openmc.StatePoint('statepoint.50.h5')\n", + "sp = openmc.StatePoint('statepoint.050.h5')\n", "su = openmc.Summary('summary.h5')\n", "sp.link_with_summary(su)" ] @@ -1539,7 +1693,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1575,7 +1729,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "metadata": { "collapsed": false }, @@ -1629,7 +1783,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -1671,7 +1825,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1801,7 +1955,7 @@ "119 10002 1 5 O-16 0.000000 0.000000" ] }, - "execution_count": 41, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1821,7 +1975,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -1849,7 +2003,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 44, "metadata": { "collapsed": false }, @@ -1858,7 +2012,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1889,7 +2043,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 45, "metadata": { "collapsed": true }, @@ -1911,7 +2065,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -1950,7 +2104,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -2033,7 +2187,7 @@ "2 10000 2 O-16 3.800027 0.024538" ] }, - "execution_count": 46, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -2059,7 +2213,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -2081,7 +2235,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -2129,7 +2283,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -2157,7 +2311,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2192,7 +2346,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -2233,7 +2387,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 53, "metadata": { "collapsed": false }, @@ -2251,7 +2405,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 54, "metadata": { "collapsed": false }, diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 533ca507d4..1159dbe563 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -50,6 +50,9 @@ class Library(object): Domain type for spatial homogenization energy_groups : EnergyGroups Energy group structure for energy condensation + tally_trigger : Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section all_mgxs : dict MGXS objects keyed by domain ID and cross section type statepoint : openmc.StatePoint @@ -69,6 +72,7 @@ class Library(object): self._mgxs_types = [] self._domain_type = None self._energy_groups = None + self._tally_trigger = None self._all_mgxs = OrderedDict() self._statepoint = None @@ -91,6 +95,7 @@ class Library(object): clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._all_mgxs = self.all_mgxs clone._statepoint = self._statepoint @@ -145,6 +150,10 @@ class Library(object): def energy_groups(self): return self._energy_groups + @property + def tally_trigger(self): + return self._tally_trigger + @property def num_groups(self): return self.energy_groups.num_groups @@ -192,6 +201,11 @@ class Library(object): cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) self._energy_groups = energy_groups + @tally_trigger.setter + def tally_trigger(self, tally_trigger): + cv.check_type('tally trigger', tally_trigger, openmc.Trigger) + self._tally_trigger = tally_trigger + def build_library(self): """Initialize MGXS objects in each domain and for each reaction type in the library. @@ -211,6 +225,11 @@ class Library(object): mgxs.domain_type = self.domain_type mgxs.energy_groups = self.energy_groups mgxs.by_nuclide = self.by_nuclide + + # If a tally trigger was specified, add it to the MGXS + if self.tally_trigger: + mgxs.tally_trigger = self.tally_trigger + mgxs.create_tallies() self.all_mgxs[domain.id][mgxs_type] = mgxs diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 79f86b0804..6ef313c446 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -80,6 +80,9 @@ class MGXS(object): Domain type for spatial homogenization energy_groups : EnergyGroups Energy group structure for energy condensation + tally_trigger : Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section tallies : dict OpenMC tallies needed to compute the multi-group cross section xs_tally : Tally @@ -100,6 +103,7 @@ class MGXS(object): self._domain = None self._domain_type = None self._energy_groups = None + self._tally_trigger = None self._tallies = OrderedDict() self._xs_tally = None @@ -125,6 +129,7 @@ class MGXS(object): clone._domain = self.domain clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._xs_tally = copy.deepcopy(self.xs_tally, memo) clone._tallies = OrderedDict() @@ -163,6 +168,10 @@ class MGXS(object): def energy_groups(self): return self._energy_groups + @property + def tally_trigger(self): + return self._tally_trigger + @property def num_groups(self): return self.energy_groups.num_groups @@ -220,6 +229,11 @@ class MGXS(object): cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) self._energy_groups = energy_groups + @tally_trigger.setter + def tally_trigger(self, tally_trigger): + cv.check_type('tally trigger', tally_trigger, openmc.Trigger) + self._tally_trigger = tally_trigger + @staticmethod def get_mgxs(mgxs_type, domain=None, domain_type=None, energy_groups=None, by_nuclide=False, name=''): @@ -431,6 +445,12 @@ class MGXS(object): self.tallies[key].estimator = estimator self.tallies[key].add_filter(domain_filter) + # If a tally trigger was specified, add it to each tally + if self.tally_trigger: + trigger_clone = copy.deepcopy(self.tally_trigger) + trigger_clone.add_score(score) + self.tallies[key].add_trigger(trigger_clone) + # Add all non-domain specific Filters (e.g., 'energy') to the Tally for filter in filters: self.tallies[key].add_filter(filter) diff --git a/openmc/tallies.py b/openmc/tallies.py index 5baebd087c..78e247cdc5 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -390,7 +390,8 @@ class Tally(object): 'since "{1}" is not a Trigger'.format(self.id, trigger) raise ValueError(msg) - self._triggers.append(trigger) + if trigger not in self.triggers: + self.triggers.append(trigger) @id.setter def id(self, tally_id): diff --git a/openmc/trigger.py b/openmc/trigger.py index 5af477edd1..bcac8c31c6 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -58,6 +58,15 @@ class Trigger(object): else: return existing + def __eq__(self, other): + if str(self) == str(other): + return True + else: + return False + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'Trigger\n' string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type) From 26a51943e5bb1ae53a056b51971c5cffbb61ac56 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 13 Oct 2015 01:07:25 -0400 Subject: [PATCH 341/519] Added Library.correction attribute with default P0 setting --- .../examples/multi-group-cross-sections.ipynb | 70 +++++++++---------- openmc/mgxs/library.py | 19 ++++- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index ada6989b4b..62b22474d6 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -466,7 +466,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-13 00:55:08\n", + " Date/Time: 2015-10-13 01:03:58\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -551,20 +551,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9300E-01 seconds\n", - " Reading cross sections = 9.1000E-02 seconds\n", - " Total time in simulation = 1.2182E+01 seconds\n", - " Time in transport only = 1.2171E+01 seconds\n", - " Time in inactive batches = 1.7420E+00 seconds\n", - " Time in active batches = 1.0440E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 4.5700E-01 seconds\n", + " Reading cross sections = 9.9000E-02 seconds\n", + " Total time in simulation = 1.2109E+01 seconds\n", + " Time in transport only = 1.2098E+01 seconds\n", + " Time in inactive batches = 1.8860E+00 seconds\n", + " Time in active batches = 1.0223E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.2585E+01 seconds\n", - " Calculation Rate (inactive) = 14351.3 neutrons/second\n", - " Calculation Rate (active) = 9578.54 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.2577E+01 seconds\n", + " Calculation Rate (inactive) = 13255.6 neutrons/second\n", + " Calculation Rate (active) = 9781.86 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1407,7 +1407,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1430,14 +1430,14 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Create a tally trigger set to 10% on the relative error\n", - "tally_trigger = openmc.Trigger('variance', 1E-5)\n", + "tally_trigger = openmc.Trigger('rel_err', 1E-1)\n", "\n", "# Add the tally trigger to each of the multi-group cross section tallies\n", "for cell in openmc_cells:\n", @@ -1459,7 +1459,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1499,7 +1499,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1525,7 +1525,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-13 00:55:22\n", + " Date/Time: 2015-10-13 01:04:11\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1611,20 +1611,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9200E-01 seconds\n", - " Reading cross sections = 8.7000E-02 seconds\n", - " Total time in simulation = 3.2711E+01 seconds\n", - " Time in transport only = 3.2694E+01 seconds\n", - " Time in inactive batches = 3.2750E+00 seconds\n", - " Time in active batches = 2.9436E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for initialization = 3.8500E-01 seconds\n", + " Reading cross sections = 8.8000E-02 seconds\n", + " Total time in simulation = 3.2702E+01 seconds\n", + " Time in transport only = 3.2685E+01 seconds\n", + " Time in inactive batches = 3.3740E+00 seconds\n", + " Time in active batches = 2.9328E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 2.0000E-03 seconds\n", " Total time for finalization = 8.0000E-03 seconds\n", - " Total time elapsed = 3.3120E+01 seconds\n", - " Calculation Rate (inactive) = 7633.59 neutrons/second\n", - " Calculation Rate (active) = 3397.20 neutrons/second\n", + " Total time elapsed = 3.3103E+01 seconds\n", + " Calculation Rate (inactive) = 7409.60 neutrons/second\n", + " Calculation Rate (active) = 3409.71 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1642,7 +1642,7 @@ "0" ] }, - "execution_count": 38, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -2012,7 +2012,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 1159dbe563..0c4c360792 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -48,6 +48,8 @@ class Library(object): The types of cross sections in the library (e.g., ['total', 'scatter']) domain_type : {'material', 'cell', 'distribcell', 'universe'} Domain type for spatial homogenization + correction : 'P0' or None + Apply the P0 correction to scattering matrices if set to 'P0' energy_groups : EnergyGroups Energy group structure for energy condensation tally_trigger : Trigger @@ -71,6 +73,7 @@ class Library(object): self._by_nuclide = None self._mgxs_types = [] self._domain_type = None + self._correction = 'P0' self._energy_groups = None self._tally_trigger = None self._all_mgxs = OrderedDict() @@ -94,6 +97,7 @@ class Library(object): clone._by_nuclide = self.by_nuclide clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type + clone._correction = self.correction clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._all_mgxs = self.all_mgxs @@ -146,6 +150,10 @@ class Library(object): def domain_type(self): return self._domain_type + @property + def correction(self): + return self._correction + @property def energy_groups(self): return self._energy_groups @@ -196,6 +204,11 @@ class Library(object): cv.check_value('domain type', domain_type, tuple(openmc.mgxs.DOMAIN_TYPES)) self._domain_type = domain_type + @correction.setter + def correction(self, correction): + cv.check_value('correction', correction, ('P0', None)) + self._correction = correction + @energy_groups.setter def energy_groups(self, energy_groups): cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) @@ -294,7 +307,11 @@ class Library(object): for mgxs_type in self.mgxs_types: mgxs = self.get_mgxs(domain, mgxs_type) mgxs.load_from_statepoint(statepoint) - mgxs.compute_xs() + + if isinstance(mgxs, openmc.mgxs.ScatterMatrixXS): + mgxs.compute_xs(correction=self.correction) + else: + mgxs.compute_xs() def get_mgxs(self, domain, mgxs_type): """Return the MGXS object for some domain and reaction rate type. From 61f2fb6e6738b69350135eae2d93376ab39d60f1 Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 13 Oct 2015 14:22:43 +0000 Subject: [PATCH 342/519] removed computation of delayed-nu-fission in cross_section.F90 --- examples/xml/lattice/simple/settings.xml | 2 +- src/ace.F90 | 32 +----------------------- src/ace_header.F90 | 7 ++---- src/cross_section.F90 | 15 ++--------- src/tally.F90 | 32 +++++++++++++----------- 5 files changed, 24 insertions(+), 64 deletions(-) diff --git a/examples/xml/lattice/simple/settings.xml b/examples/xml/lattice/simple/settings.xml index 2a6aaaf426..d1c9fd5b60 100644 --- a/examples/xml/lattice/simple/settings.xml +++ b/examples/xml/lattice/simple/settings.xml @@ -5,7 +5,7 @@ 20 10 - 10000 + 1000000 diff --git a/src/ace.F90 b/src/ace.F90 index 91653195b5..d70c50259f 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -5,7 +5,7 @@ module ace use constants use endf, only: reaction_name, is_fission, is_disappearance use error, only: fatal_error, warning - use fission, only: nu_total, nu_delayed + use fission, only: nu_total use global use list_header, only: ListInt use material_header, only: Material @@ -375,7 +375,6 @@ contains if (nuc % fissionable .and. .not. data_0K) then call generate_nu_fission(nuc) - call generate_delayed_nu_fission(nuc) end if case (ACE_THERMAL) @@ -462,7 +461,6 @@ contains allocate(nuc % fission(NE)) allocate(nuc % nu_fission(NE)) allocate(nuc % absorption(NE)) - allocate(nuc % delayed_nu_fission(NE)) ! initialize cross sections nuc % total = ZERO @@ -470,7 +468,6 @@ contains nuc % fission = ZERO nuc % nu_fission = ZERO nuc % absorption = ZERO - nuc % delayed_nu_fission = ZERO ! Read data from XSS -- only the energy grid, elastic scattering and heating ! cross section values are actually read from here. The total and absorption @@ -1399,33 +1396,6 @@ contains end subroutine generate_nu_fission -!=============================================================================== -! GENERATE_DELAYED_NU_FISSION precalculates the microscopic delayed-nu-fission -! cross section for a given nuclide. This is done so that the nu_delayed -! function does not need to be called during cross section lookups. -!=============================================================================== - - subroutine generate_delayed_nu_fission(nuc) - - type(Nuclide), pointer :: nuc - - integer :: i ! index on nuclide energy grid - real(8) :: E ! energy - real(8) :: nu_d ! # of neutrons per fission - - do i = 1, nuc % n_grid - ! determine energy - E = nuc % energy(i) - - ! determine total nu at given energy - nu_d = nu_delayed(nuc, E) - - ! determine delayed-nu-fission microscopic cross section - nuc % delayed_nu_fission(i) = nu_d * nuc % fission(i) - end do - - end subroutine generate_delayed_nu_fission - !=============================================================================== ! READ_THERMAL_DATA reads elastic and inelastic cross sections and corresponding ! secondary energy/angle distributions derived from experimental S(a,b) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 8acefba106..97c598161b 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -1,6 +1,6 @@ module ace_header - use constants, only: MAX_FILE_LEN, ZERO, MAX_DELAYED_GROUPS + use constants, only: MAX_FILE_LEN, ZERO use endf_header, only: Tab1 use list_header, only: ListInt @@ -113,7 +113,6 @@ module ace_header real(8), allocatable :: nu_fission(:) ! neutron production real(8), allocatable :: absorption(:) ! absorption (MT > 100) real(8), allocatable :: heating(:) ! heating - real(8), allocatable :: delayed_nu_fission(:) ! delayed neutron production ! Resonance scattering info logical :: resonant = .false. ! resonant scatterer? @@ -267,7 +266,6 @@ module ace_header real(8) :: fission ! microscopic fission xs real(8) :: nu_fission ! microscopic production xs real(8) :: kappa_fission ! microscopic energy-released from fission - real(8) :: delayed_nu_fission ! microscopic delayed production xs ! Information for S(a,b) use integer :: index_sab ! index in sab_tables (zero means no table) @@ -376,8 +374,7 @@ module ace_header if (allocated(this % energy)) & deallocate(this % energy, this % total, this % elastic, & - & this % fission, this % nu_fission, this % absorption, & - this % delayed_nu_fission) + & this % fission, this % nu_fission, this % absorption) if (allocated(this % energy_0K)) & deallocate(this % energy_0K) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 1b94a1049f..c5aa621506 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -4,7 +4,7 @@ module cross_section use constants use energy_grid, only: grid_method, log_spacing use error, only: fatal_error - use fission, only: nu_total, nu_delayed, yield_delayed + use fission, only: nu_total use global use list_header, only: ListElemInt use material_header, only: Material @@ -33,10 +33,8 @@ contains integer :: i_nuclide ! index into nuclides array integer :: i_sab ! index into sab_tables array integer :: j ! index in mat % i_sab_nuclides - integer :: d ! index for delayed precursor groups integer :: u ! index into logarithmic mapping array real(8) :: atom_density ! atom density of a nuclide - real(8) :: yield ! delayed neutron yield logical :: check_sab ! should we check for S(a,b) table? type(Material), pointer :: mat ! current material type(Nuclide), pointer :: nuc ! current nuclide @@ -225,7 +223,6 @@ contains micro_xs(i_nuclide) % fission = ZERO micro_xs(i_nuclide) % nu_fission = ZERO micro_xs(i_nuclide) % kappa_fission = ZERO - micro_xs(i_nuclide) % delayed_nu_fission = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * nuc % total(i_grid) & @@ -254,12 +251,6 @@ contains micro_xs(i_nuclide) % kappa_fission = & nuc % reactions(nuc % index_fission(1)) % Q_value * & micro_xs(i_nuclide) % fission - - ! Calculate microscopic nuclide delayed nu-fission cross section - micro_xs(i_nuclide) % delayed_nu_fission = (ONE - f) * & - nuc % delayed_nu_fission(i_grid) + f * & - nuc % delayed_nu_fission(i_grid+1) - end if ! If there is S(a,b) data for this nuclide, we need to do a few @@ -525,12 +516,10 @@ contains micro_xs(i_nuclide) % fission = fission micro_xs(i_nuclide) % total = elastic + inelastic + capture + fission - ! Determine nu-fission and delayed nu-fission cross section + ! Determine nu-fission cross section if (nuc % fissionable) then micro_xs(i_nuclide) % nu_fission = nu_total(nuc, E) * & micro_xs(i_nuclide) % fission - micro_xs(i_nuclide) % delayed_nu_fission = nu_delayed(nuc, E) * & - micro_xs(i_nuclide) % fission end if end subroutine calculate_urr_xs diff --git a/src/tally.F90 b/src/tally.F90 index 5477159d5a..5311e767ef 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -432,6 +432,9 @@ contains ! nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then + ! Get the event nuclide + nuc => nuclides(p % event_nuclide) + ! Check if the delayed group filter is present if (dg_filter > 0) then @@ -439,18 +442,17 @@ contains ! individually do d_bin = 1, n_bins d = t % filters(dg_filter) % int_bins(d_bin) - nuc => nuclides(p % event_nuclide) yield = yield_delayed(nuc, p % E, d) score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & - % delayed_nu_fission / micro_xs(p % event_nuclide) & - % absorption + % fission * nu_delayed(nuc, p % E) / & + micro_xs(p % event_nuclide) % absorption call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP else score = p % absorb_wgt * micro_xs(p % event_nuclide) & - % delayed_nu_fission / micro_xs(p % event_nuclide) & - % absorption + % fission * nu_delayed(nuc, p % E) / & + micro_xs(p % event_nuclide) % absorption end if end if else @@ -488,21 +490,23 @@ contains ! Check if tally is on a single nuclide if (i_nuclide > 0) then + ! Get the nuclide of interest + nuc => nuclides(i_nuclide) + ! Check if the delayed group filter is present if (dg_filter > 0) then ! Loop over all delayed group bins and tally to them individually do d_bin = 1, t % filters(dg_filter) % n_bins d = t % filters(dg_filter) % int_bins(d_bin) - nuc => nuclides(i_nuclide) yield = yield_delayed(nuc, p % E, d) - score = micro_xs(i_nuclide) % delayed_nu_fission * yield & - * atom_density * flux + score = micro_xs(i_nuclide) % fission * yield & + * nu_delayed(nuc, p % E) * atom_density * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP else - score = micro_xs(i_nuclide) % delayed_nu_fission & + score = micro_xs(i_nuclide) % fission * nu_delayed(nuc, p % E)& * atom_density * flux end if @@ -526,8 +530,8 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) nuc => nuclides(i_nuc) yield = yield_delayed(nuc, p % E, d) - score = micro_xs(i_nuc) % delayed_nu_fission * yield & - * atom_density_ * flux + score = micro_xs(i_nuc) % fission * yield & + * nu_delayed(nuc, p % E) * atom_density_ * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do end do @@ -541,9 +545,9 @@ contains atom_density_ = mat % atom_density(l) ! Get index in nuclides array i_nuc = mat % nuclide(l) - - score = score + micro_xs(i_nuc) % delayed_nu_fission & - * atom_density_ * flux + nuc => nuclides(i_nuc) + score = score + micro_xs(i_nuc) % fission & + * nu_delayed(nuc, p % E) * atom_density_ * flux end do end if end if From 2473011734fa31279a2ae73afd1cf7e3a560c0c3 Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 13 Oct 2015 14:36:09 +0000 Subject: [PATCH 343/519] reverted simple lattice settings.xml to version in develop --- examples/xml/lattice/simple/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xml/lattice/simple/settings.xml b/examples/xml/lattice/simple/settings.xml index d1c9fd5b60..2a6aaaf426 100644 --- a/examples/xml/lattice/simple/settings.xml +++ b/examples/xml/lattice/simple/settings.xml @@ -5,7 +5,7 @@ 20 10 - 1000000 + 10000 From f9340464bb667fc4fa32f3790939804928157c3a Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 13 Oct 2015 14:40:21 +0000 Subject: [PATCH 344/519] reverted ace_header.F90 and cross_section.F90 to versions in develop --- src/ace_header.F90 | 32 ++++++++++++++++---------------- src/cross_section.F90 | 2 -- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 97c598161b..467887c193 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -107,12 +107,12 @@ module ace_header real(8), allocatable :: energy(:) ! energy values corresponding to xs ! Microscopic cross sections - real(8), allocatable :: total(:) ! total cross section - real(8), allocatable :: elastic(:) ! elastic scattering - real(8), allocatable :: fission(:) ! fission - real(8), allocatable :: nu_fission(:) ! neutron production - real(8), allocatable :: absorption(:) ! absorption (MT > 100) - real(8), allocatable :: heating(:) ! heating + real(8), allocatable :: total(:) ! total cross section + real(8), allocatable :: elastic(:) ! elastic scattering + real(8), allocatable :: fission(:) ! fission + real(8), allocatable :: nu_fission(:) ! neutron production + real(8), allocatable :: absorption(:) ! absorption (MT > 100) + real(8), allocatable :: heating(:) ! heating ! Resonance scattering info logical :: resonant = .false. ! resonant scatterer? @@ -256,16 +256,16 @@ module ace_header !=============================================================================== type NuclideMicroXS - integer :: index_grid ! index on nuclide energy grid - integer :: index_temp ! temperature index for nuclide - real(8) :: last_E = ZERO ! last evaluated energy - real(8) :: interp_factor ! interpolation factor on nuc. energy grid - real(8) :: total ! microscropic total xs - real(8) :: elastic ! microscopic elastic scattering xs - real(8) :: absorption ! microscopic absorption xs - real(8) :: fission ! microscopic fission xs - real(8) :: nu_fission ! microscopic production xs - real(8) :: kappa_fission ! microscopic energy-released from fission + integer :: index_grid ! index on nuclide energy grid + integer :: index_temp ! temperature index for nuclide + real(8) :: last_E = ZERO ! last evaluated energy + real(8) :: interp_factor ! interpolation factor on nuc. energy grid + real(8) :: total ! microscropic total xs + real(8) :: elastic ! microscopic elastic scattering xs + real(8) :: absorption ! microscopic absorption xs + real(8) :: fission ! microscopic fission xs + real(8) :: nu_fission ! microscopic production xs + real(8) :: kappa_fission ! microscopic energy-released from fission ! Information for S(a,b) use integer :: index_sab ! index in sab_tables (zero means no table) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 2d001934cd..4d8fb2f0fb 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -37,7 +37,6 @@ contains real(8) :: atom_density ! atom density of a nuclide logical :: check_sab ! should we check for S(a,b) table? type(Material), pointer :: mat ! current material - type(Nuclide), pointer :: nuc ! current nuclide ! Set all material macroscopic cross sections to zero material_xs % total = ZERO @@ -97,7 +96,6 @@ contains ! Determine microscopic cross sections for this nuclide i_nuclide = mat % nuclide(i) - nuc => nuclides(i_nuclide) ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E) then From a0a07e2550a82f2a69d5ec2b5760bf150808df73 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 13 Oct 2015 11:13:20 -0400 Subject: [PATCH 345/519] Fixed bug with triggers on tallies with multiple filters. Fixed bug when using triggers with tally score moments --- openmc/trigger.py | 15 +++++++++++++++ src/trigger.F90 | 23 +---------------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/openmc/trigger.py b/openmc/trigger.py index e695defde2..0652834b83 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -1,6 +1,7 @@ from numbers import Real from xml.etree import ElementTree as ET import sys +import re from openmc.checkvalue import check_type, check_value @@ -96,6 +97,20 @@ class Trigger(object): 'it is not a string'.format(score) raise ValueError(msg) + # If this is a scattering moment, use generic moment order + regexp = re.compile(r'-[0-9]') + if regexp.search(score) is not None: + score = score.strip(regexp.findall(score)[0]) + score += '-n' + regexp = re.compile(r'-[p|P][0-9]') + if regexp.search(score) is not None: + score = score.strip(regexp.findall(score)[0]) + score += '-pn' + regexp = re.compile(r'-[y|Y][0-9]') + if regexp.search(score) is not None: + score = score.strip(regexp.findall(score)[0]) + score += '-yn' + # If the score is already in the Tally, don't add it again if score in self._scores: return diff --git a/src/trigger.F90 b/src/trigger.F90 index a74a64be0a..73cb0c7efe 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -92,7 +92,6 @@ contains character(len=52), intent(inout) :: name ! "eigenvalue" or tally score integer :: i ! index in tallies array - integer :: j ! level in tally hierarchy integer :: n ! loop index for nuclides integer :: s ! loop index for triggers integer :: filter_index ! index in results array for filters @@ -167,28 +166,8 @@ contains ! Initialize bins, filter level matching_bins(1:t % n_filters) = 0 - j = 1 - ! Find filter index - FILTER_LOOP: do - find_bin: do - if (t % n_filters == 0) exit find_bin - matching_bins(j) = matching_bins(j) + 1 - if (matching_bins(j) > t % filters(j) % n_bins) then - if (j == 1) exit FILTER_LOOP - matching_bins(j) = 0 - j = j - 1 - else - if (j == t % n_filters) exit find_bin - end if - end do find_bin - - if (t % n_filters > 0) then - filter_index = sum((max(matching_bins(1:t%n_filters),1) - 1) * & - t % stride) + 1 - else - filter_index = 1 - end if + FILTER_LOOP: do filter_index = 1, t % total_filter_bins ! Initialize score index score_index = trigger % score_index From 0b7ee32a88d0de0f0ece2c99fc8aa566aca42b5c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 13 Oct 2015 11:13:40 -0400 Subject: [PATCH 346/519] fixed values id delayedgroup and delayed-nu-fission tests --- tests/test_filter_delayedgroup/results_true.dat | 10 +++++----- .../results_true.dat | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/test_filter_delayedgroup/results_true.dat b/tests/test_filter_delayedgroup/results_true.dat index d6ba0cb6c8..f44821a238 100644 --- a/tests/test_filter_delayedgroup/results_true.dat +++ b/tests/test_filter_delayedgroup/results_true.dat @@ -1,14 +1,14 @@ k-combined: 1.005983E+00 2.248579E-02 tally 1: -6.113115E-04 -7.519723E-08 +6.113116E-04 +7.519725E-08 3.155402E-03 2.003485E-06 3.012421E-03 -1.826030E-06 -6.754096E-03 -9.179334E-06 +1.826031E-06 +6.754097E-03 +9.179336E-06 2.769084E-03 1.542940E-06 1.159960E-03 diff --git a/tests/test_score_delayed_nufission/results_true.dat b/tests/test_score_delayed_nufission/results_true.dat index 88dd5435e4..6818f88e49 100644 --- a/tests/test_score_delayed_nufission/results_true.dat +++ b/tests/test_score_delayed_nufission/results_true.dat @@ -1,14 +1,14 @@ k-combined: 1.005983E+00 2.248579E-02 tally 1: -1.432287E-02 -4.518736E-05 +1.432292E-02 +4.518762E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.531355E-02 -5.079891E-05 +1.531359E-02 +5.079909E-05 tally 2: 1.576415E-02 2.485084E-04 @@ -19,11 +19,11 @@ tally 2: 0.000000E+00 0.000000E+00 tally 3: -1.365224E-02 -3.952119E-05 +1.369800E-02 +3.974018E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.442838E-02 -4.559808E-05 +1.447073E-02 +4.579588E-05 From 0b9976d721bb1d4bebbfff1c2bf49db0cef36dc6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 14 Oct 2015 22:52:50 -0400 Subject: [PATCH 347/519] Fixed bug in EnergyGroups.get_group(...) --- openmc/mgxs/groups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index 53f032f51a..db01e61255 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -103,7 +103,7 @@ class EnergyGroups(object): raise ValueError(msg) index = np.where(self.group_edges > energy)[0][0] - group = self.num_groups - index + group = self.num_groups - index + 1 return group def get_group_bounds(self, group): From 8acab8ce8c0743412184a8420ff48c48146597dd Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 15 Oct 2015 11:32:22 -0400 Subject: [PATCH 348/519] The MGXS.get_xs(...) routine now calls numpy.squeeze(...) to eliminate trivial dimensions --- openmc/mgxs/mgxs.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 6ef313c446..9939465475 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -667,8 +667,10 @@ class MGXS(object): xs = xs[:, ::-1, :] # Reshape array to original axes (filters, nuclides, scores) - new_shape = (num_subdomains * num_groups,) + xs.shape[2:] - xs = np.reshape(xs, new_shape) +# new_shape = (num_subdomains * num_groups,) + xs.shape[2:] +# xs = np.reshape(xs, new_shape) + + xs = np.squeeze(xs) return xs @@ -1790,9 +1792,11 @@ class ScatterMatrixXS(MGXS): xs = xs[:, ::-1, ::-1, :] # Reshape array to original axes (filters, nuclides, scores) - new_shape = (num_subdomains * num_in_groups * num_out_groups,) - new_shape += xs.shape[3:] - xs = np.reshape(xs, new_shape) + #new_shape = (num_subdomains * num_in_groups * num_out_groups,) + #new_shape += xs.shape[3:] + #xs = np.reshape(xs, new_shape) + + xs = np.squeeze(xs) return xs From f35a68a2c7812777e308e4f6ecbc5b969030f39e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 15 Oct 2015 11:33:52 -0400 Subject: [PATCH 349/519] Removed uncommented code from previous commit --- openmc/mgxs/mgxs.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 9939465475..57a8aa0466 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -666,10 +666,7 @@ class MGXS(object): # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, :] - # Reshape array to original axes (filters, nuclides, scores) -# new_shape = (num_subdomains * num_groups,) + xs.shape[2:] -# xs = np.reshape(xs, new_shape) - + # Eliminate trivial dimensions xs = np.squeeze(xs) return xs @@ -1791,11 +1788,7 @@ class ScatterMatrixXS(MGXS): # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, ::-1, :] - # Reshape array to original axes (filters, nuclides, scores) - #new_shape = (num_subdomains * num_in_groups * num_out_groups,) - #new_shape += xs.shape[3:] - #xs = np.reshape(xs, new_shape) - + # Eliminate trivial dimensions xs = np.squeeze(xs) return xs @@ -2126,9 +2119,8 @@ class Chi(MGXS): # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, :] - # Reshape array to original axes (filters, nuclides, scores) - new_shape = (num_subdomains * num_groups,) + new_shape[2:] - xs = np.reshape(xs, new_shape) + # Eliminate trivial dimensions + xs = np.squeeze(xs) xs = np.nan_to_num(xs) return xs From 1aaf24bc4d69baefb68298d1aa2b1caa0fcca8e8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 15 Oct 2015 16:06:32 -0400 Subject: [PATCH 350/519] MGXS.get_xs(...) routine now ensures that return value is at least a 1D numpy array --- openmc/mgxs/mgxs.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 57a8aa0466..d4e368af5d 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -668,6 +668,7 @@ class MGXS(object): # Eliminate trivial dimensions xs = np.squeeze(xs) + xs = np.atleast_1d(xs) return xs @@ -1790,6 +1791,7 @@ class ScatterMatrixXS(MGXS): # Eliminate trivial dimensions xs = np.squeeze(xs) + xs = np.atleast_2d(xs) return xs @@ -2121,6 +2123,7 @@ class Chi(MGXS): # Eliminate trivial dimensions xs = np.squeeze(xs) + xs = np.atleast_1d(xs) xs = np.nan_to_num(xs) return xs From 4847cbd38d26711ff1e391656da022ea1f27490b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 15 Oct 2015 22:07:54 -0400 Subject: [PATCH 351/519] Added a new openmc.mgxs.Library.get_subdomain_avg_library(...) routine --- .../examples/multi-group-cross-sections.ipynb | 213 +++++++++--------- openmc/mgxs/library.py | 50 +++- 2 files changed, 156 insertions(+), 107 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 62b22474d6..de7d3c2a92 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -466,7 +466,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-13 01:03:58\n", + " Date/Time: 2015-10-15 16:52:26\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -551,20 +551,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.5700E-01 seconds\n", - " Reading cross sections = 9.9000E-02 seconds\n", - " Total time in simulation = 1.2109E+01 seconds\n", - " Time in transport only = 1.2098E+01 seconds\n", - " Time in inactive batches = 1.8860E+00 seconds\n", - " Time in active batches = 1.0223E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 4.0800E-01 seconds\n", + " Reading cross sections = 9.4000E-02 seconds\n", + " Total time in simulation = 2.4001E+01 seconds\n", + " Time in transport only = 2.3960E+01 seconds\n", + " Time in inactive batches = 2.0780E+00 seconds\n", + " Time in active batches = 2.1923E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.2577E+01 seconds\n", - " Calculation Rate (inactive) = 13255.6 neutrons/second\n", - " Calculation Rate (active) = 9781.86 neutrons/second\n", + " Total time for finalization = 1.0000E-02 seconds\n", + " Total time elapsed = 2.4427E+01 seconds\n", + " Calculation Rate (inactive) = 12030.8 neutrons/second\n", + " Calculation Rate (active) = 4561.42 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1014,13 +1014,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Importing ray tracing data from file...\n", + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685185\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.498E-316\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728847\tres = 4.513E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.695633\tres = 2.844E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.695632\tres = 2.844E-02\n", "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", @@ -1043,8 +1044,8 @@ "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.701456\tres = 3.194E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.722831\tres = 3.132E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.701457\tres = 3.194E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.722832\tres = 3.132E-02\n", "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", @@ -1070,79 +1071,79 @@ "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.085609\tres = 6.273E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.091436\tres = 5.804E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.085610\tres = 6.273E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.091437\tres = 5.804E-03\n", "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.101877\tres = 4.961E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.101878\tres = 4.961E-03\n", "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.110860\tres = 4.231E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.114861\tres = 3.905E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.118563\tres = 3.602E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.121986\tres = 3.321E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.125149\tres = 3.060E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.128069\tres = 2.819E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.110861\tres = 4.231E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.114862\tres = 3.905E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.118564\tres = 3.602E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.121987\tres = 3.321E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.125150\tres = 3.060E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.128070\tres = 2.819E-03\n", "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.133248\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.135538\tres = 2.197E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.137648\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.139590\tres = 1.858E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.141377\tres = 1.707E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.133249\tres = 2.389E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.135539\tres = 2.197E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.137649\tres = 2.021E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.139591\tres = 1.858E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.141378\tres = 1.707E-03\n", "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.144531\tres = 1.440E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.144532\tres = 1.440E-03\n", "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.147195\tres = 1.213E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.148365\tres = 1.113E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.147196\tres = 1.213E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.148366\tres = 1.113E-03\n", "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.150425\tres = 9.356E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.151329\tres = 8.574E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.152157\tres = 7.856E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.152916\tres = 7.196E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.153612\tres = 6.590E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.154249\tres = 6.033E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.154832\tres = 5.522E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.155366\tres = 5.053E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.155855\tres = 4.623E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.156302\tres = 4.229E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.156710\tres = 3.866E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.157084\tres = 3.535E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.157426\tres = 3.230E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.157738\tres = 2.952E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158023\tres = 2.697E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.158284\tres = 2.464E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.158522\tres = 2.251E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.158739\tres = 2.055E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.158937\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.159119\tres = 1.713E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.159284\tres = 1.564E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.159435\tres = 1.428E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.159573\tres = 1.301E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.150426\tres = 9.355E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.151330\tres = 8.574E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.152158\tres = 7.856E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.152918\tres = 7.196E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.153613\tres = 6.590E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.154250\tres = 6.033E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.154833\tres = 5.522E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.155367\tres = 5.053E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.155856\tres = 4.623E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.156303\tres = 4.228E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.156711\tres = 3.866E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.157085\tres = 3.535E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.157427\tres = 3.231E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.157739\tres = 2.952E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158024\tres = 2.697E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.158285\tres = 2.464E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.158523\tres = 2.251E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.158740\tres = 2.055E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.158939\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.159120\tres = 1.713E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.159285\tres = 1.563E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.159436\tres = 1.427E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.159574\tres = 1.302E-04\n", "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.159813\tres = 1.083E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.159917\tres = 9.880E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.160013\tres = 9.009E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.160100\tres = 8.222E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.160179\tres = 7.487E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.160251\tres = 6.824E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.160317\tres = 6.223E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.160376\tres = 5.675E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.160431\tres = 5.174E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.160481\tres = 4.715E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.160527\tres = 4.298E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.160568\tres = 3.910E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.160605\tres = 3.561E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.160640\tres = 3.242E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.160671\tres = 2.960E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.160699\tres = 2.689E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.160725\tres = 2.452E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.160749\tres = 2.232E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.160770\tres = 2.034E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.160790\tres = 1.855E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.160807\tres = 1.687E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.160824\tres = 1.538E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.160838\tres = 1.399E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.160852\tres = 1.280E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.160864\tres = 1.149E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.160875\tres = 1.061E-05\n" + "[ NORMAL ] Iteration 101:\tk_eff = 1.159814\tres = 1.083E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.159918\tres = 9.880E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.160014\tres = 9.009E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.160101\tres = 8.215E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.160180\tres = 7.490E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.160252\tres = 6.827E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.160318\tres = 6.223E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.160378\tres = 5.672E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.160432\tres = 5.169E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.160482\tres = 4.710E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.160528\tres = 4.291E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.160569\tres = 3.909E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.160607\tres = 3.561E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.160641\tres = 3.244E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.160672\tres = 2.954E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.160700\tres = 2.691E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.160726\tres = 2.450E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.160750\tres = 2.231E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.160771\tres = 2.031E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.160791\tres = 1.849E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.160809\tres = 1.684E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.160825\tres = 1.533E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.160840\tres = 1.395E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.160853\tres = 1.270E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.160865\tres = 1.156E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.160876\tres = 1.052E-05\n" ] } ], @@ -1176,8 +1177,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.161200\n", - "openmoc keff = 1.160875\n", - "bias [pcm]: -32.5\n" + "openmoc keff = 1.160876\n", + "bias [pcm]: -32.4\n" ] } ], @@ -1525,7 +1526,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-13 01:04:11\n", + " Date/Time: 2015-10-15 16:52:53\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1611,20 +1612,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.8500E-01 seconds\n", - " Reading cross sections = 8.8000E-02 seconds\n", - " Total time in simulation = 3.2702E+01 seconds\n", - " Time in transport only = 3.2685E+01 seconds\n", - " Time in inactive batches = 3.3740E+00 seconds\n", - " Time in active batches = 2.9328E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 1.1640E+00 seconds\n", + " Reading cross sections = 2.4900E-01 seconds\n", + " Total time in simulation = 1.2029E+02 seconds\n", + " Time in transport only = 1.2022E+02 seconds\n", + " Time in inactive batches = 1.1199E+01 seconds\n", + " Time in active batches = 1.0909E+02 seconds\n", + " Time synchronizing fission bank = 1.2000E-02 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 5.0000E-03 seconds\n", " Time accumulating tallies = 2.0000E-03 seconds\n", - " Total time for finalization = 8.0000E-03 seconds\n", - " Total time elapsed = 3.3103E+01 seconds\n", - " Calculation Rate (inactive) = 7409.60 neutrons/second\n", - " Calculation Rate (active) = 3409.71 neutrons/second\n", + " Total time for finalization = 2.8000E-02 seconds\n", + " Total time elapsed = 1.2151E+02 seconds\n", + " Calculation Rate (inactive) = 2232.34 neutrons/second\n", + " Calculation Rate (active) = 916.683 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -2012,7 +2013,7 @@ "data": { "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2321,8 +2322,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.227616\n", - "openmoc keff = 1.225325\n", - "bias [pcm]: -229.1\n" + "openmoc keff = 1.225322\n", + "bias [pcm]: -229.3\n" ] } ], @@ -2415,8 +2416,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.227616\n", - "openmoc keff = 1.227096\n", - "bias [pcm]: -52.0\n" + "openmoc keff = 1.227093\n", + "bias [pcm]: -52.3\n" ] } ], diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 0c4c360792..483f9d5438 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -373,7 +373,7 @@ class Library(object): def get_condensed_library(self, coarse_groups): """Construct an energy-condensed version of this library. - This routine condense each of the multi-group cross sections in the + This routine condenses each of the multi-group cross sections in the library to a coarse energy group structure. NOTE: This routine must be called after the load_from_statepoint(...) routine loads the tallies from the statepoint into each of the cross sections. @@ -426,6 +426,54 @@ class Library(object): return condensed_library + def get_subdomain_avg_library(self): + """Construct a subdomain-averaged version of this library. + + This routine averages each multi-group cross section across distribcell + instances. The method performs spatial homogenization to compute the + scalar flux-weighted average cross section across the subdomains. + + NOTE: This method is only relevant for distribcell domain types and + simplys returns a deep copy of the library for all other domains types. + + Returns + ------- + Library + A new multi-group cross section library averaged across subdomains + + Raises + ------ + ValueError + When this method is called before a statepoint has been loaded + + See also + -------- + MGXS.get_subdomain_avg_xs(subdomains) + + """ + + if self.statepoint is None: + msg = 'Unable to get a subdomain-averaged cross section ' \ + 'library since the statepoint has not yet been loaded' + raise ValueError(msg) + + # Clone this Library to initialize the subdomain-averaged version + subdomain_avg_library = copy.deepcopy(self) + + if subdomain_avg_library.domain_type == 'distribcell': + subdomain_avg_library.domain_type = 'cell' + else: + return subdomain_avg_library + + # Subdomain average the MGXS for each domain and mgxs type + for domain in self.domains: + for mgxs_type in self.mgxs_types: + mgxs = subdomain_avg_library.get_mgxs(domain, mgxs_type) + avg_mgxs = mgxs.get_subdomain_avg_xs() + subdomain_avg_library.all_mgxs[domain.id][mgxs_type] = avg_mgxs + + return subdomain_avg_library + def build_hdf5_store(self, filename='mgxs', directory='mgxs', subdomains='all', nuclides='all', xs_type='macro'): """Export the multi-group cross section library to an HDF5 binary file. From 133bbb510b08f84f84758e2c12c292e0a2264246 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 16 Oct 2015 08:41:32 -0400 Subject: [PATCH 352/519] added comments to delayed-nu-fission tally --- src/fission.F90 | 17 +++++++++------- src/tally.F90 | 54 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/fission.F90 b/src/fission.F90 index c91d595e26..f69ffc9628 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -132,25 +132,28 @@ contains ! since no prompt or delayed data is present, this means all neutron ! emission is prompt -- WARNING: This currently returns zero. The calling ! routine needs to know this situation is occurring since we don't want - ! to call yield unnecessarily if it has already been called. + ! to call yield_delayed unnecessarily if it has already been called. yield = ZERO else if (nuc % nu_d_type == NU_TABULAR) then lc = 1 - ! determine the yield for this group + ! loop over delayed groups and determine the yield for the desired group do d = 1, nuc % n_precursor ! determine number of interpolation regions and energies NR = int(nuc % nu_d_precursor_data(lc + 1)) NE = int(nuc % nu_d_precursor_data(lc + 2 + 2*NR)) - ! determine delayed neutron precursor yield for group d - yield = interpolate_tab1(nuc % nu_d_precursor_data( & - lc+1:lc+2+2*NR+2*NE), E) + ! check if this is the desired group + if (d == g) then - ! Check if this group is the requested group - if (d == g) exit + ! determine delayed neutron precursor yield for group g + yield = interpolate_tab1(nuc % nu_d_precursor_data( & + lc+1:lc+2+2*NR+2*NE), E) + + exit + end if ! advance pointer lc = lc + 2 + 2*NR + 2*NE + 1 diff --git a/src/tally.F90 b/src/tally.F90 index 5311e767ef..87102d224a 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -57,7 +57,6 @@ contains integer :: score_index ! scoring bin index integer :: d ! delayed neutron index integer :: d_bin ! delayed group bin index - integer :: n_bins ! number of delayed group bins integer :: i_filter ! filter index integer :: dg_filter ! index of delayed group filter real(8) :: yield ! delayed neutron yield @@ -408,11 +407,6 @@ contains ! Set the delayedgroup filter index and the number of delayed group bins dg_filter = t % find_filter(FILTER_DELAYEDGROUP) - n_bins = 0 - - if (dg_filter > 0) then - n_bins = t % filters(dg_filter) % n_bins - end if if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing .or. p % fission) then @@ -429,7 +423,7 @@ contains if (survival_biasing) then ! No fission events occur if survival biasing is on -- need to ! calculate fraction of absorptions that would have resulted in - ! nu-fission + ! delayed-nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then ! Get the event nuclide @@ -440,9 +434,15 @@ contains ! Loop over all delayed group bins and tally to them ! individually - do d_bin = 1, n_bins + do d_bin = 1, t % filters(dg_filter) % n_bins + + ! Get the delayed group for this bin d = t % filters(dg_filter) % int_bins(d_bin) + + ! Compute the yield for this delayed group yield = yield_delayed(nuc, p % E, d) + + ! Compute the score and tally to bin score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & % fission * nu_delayed(nuc, p % E) / & micro_xs(p % event_nuclide) % absorption @@ -450,6 +450,9 @@ contains end do cycle SCORE_LOOP else + ! If the delayed group filter is not present, compute the score + ! by multiplying the absorbed weight by the fraction of the + ! delayed-nu-fission xs to the absorption xs score = p % absorb_wgt * micro_xs(p % event_nuclide) & % fission * nu_delayed(nuc, p % E) / & micro_xs(p % event_nuclide) % absorption @@ -472,13 +475,21 @@ contains ! Loop over all delayed group bins and tally to them individually do d_bin = 1, t % filters(dg_filter) % n_bins + + ! Get the delayed group for this bin d = t % filters(dg_filter) % int_bins(d_bin) + + ! Compute the score and tally to bin score = keff * p % wgt_bank / p % n_bank * p % n_delayed_bank(d) call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP else + score = ZERO + + ! Loop over all delayed groups and accumulate the contribution + ! from each group do d = 1, nuclides(p % event_nuclide) % n_precursor score = score + keff * p % wgt_bank / p % n_bank * & p % n_delayed_bank(d) @@ -498,14 +509,23 @@ contains ! Loop over all delayed group bins and tally to them individually do d_bin = 1, t % filters(dg_filter) % n_bins + + ! Get the delayed group for this bin d = t % filters(dg_filter) % int_bins(d_bin) + + ! Compute the yield for this delayed group yield = yield_delayed(nuc, p % E, d) + + ! Compute the score and tally to bin score = micro_xs(i_nuclide) % fission * yield & * nu_delayed(nuc, p % E) * atom_density * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP else + + ! If the delayed group filter is not present, compute the score + ! by multiplying the delayed-nu-fission macro xs by the flux score = micro_xs(i_nuclide) % fission * nu_delayed(nuc, p % E)& * atom_density * flux end if @@ -519,17 +539,28 @@ contains ! Check if the delayed group filter is present if (dg_filter > 0) then + ! Loop over all nuclides in the current material do l = 1, mat % n_nuclides + ! Get atom density atom_density_ = mat % atom_density(l) + ! Get index in nuclides array i_nuc = mat % nuclide(l) ! Loop over all delayed group bins and tally to them individually do d_bin = 1, t % filters(dg_filter) % n_bins + + ! Get the delayed group for this bin d = t % filters(dg_filter) % int_bins(d_bin) + + ! Get the current nuclide nuc => nuclides(i_nuc) + + ! Get the yield for the desired nuclide and delayed group yield = yield_delayed(nuc, p % E, d) + + ! Compute the score and tally to bin score = micro_xs(i_nuc) % fission * yield & * nu_delayed(nuc, p % E) * atom_density_ * flux call score_fission_delayed_dg(t, d_bin, score, score_index) @@ -540,12 +571,19 @@ contains score = ZERO + ! Loop over all nuclides in the current material do l = 1, mat % n_nuclides + ! Get atom density atom_density_ = mat % atom_density(l) + ! Get index in nuclides array i_nuc = mat % nuclide(l) + + ! Get the current nuclide nuc => nuclides(i_nuc) + + ! Accumulate the contribution from each nuclide score = score + micro_xs(i_nuc) % fission & * nu_delayed(nuc, p % E) * atom_density_ * flux end do From 3dd1292111e708cdffaecbfa1211f38f898d9440 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 16 Oct 2015 08:45:31 -0400 Subject: [PATCH 353/519] fixed syntax error in documentation --- docs/source/usersguide/input.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 4f8e4b6c0c..0c10756ba1 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1387,7 +1387,7 @@ The ```` element accepts the following sub-elements: "nu-fission", "delayed-nu-fission", "kappa-fission", "nu-scatter", "scatter-N", "scatter-PN", "scatter-YN", "nu-scatter-N", "nu-scatter-PN", "nu-scatter-YN", "flux-YN", "total-YN", "current", and "events". These - corresponding to the following physical quantities: + correspond to the following physical quantities: :flux: Total flux in particle-cm per source particle. Note: The ``analog`` From 4e75a2e15cf16c5dbfeb22ccd8bf95a6ca37fde3 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 16 Oct 2015 10:55:00 -0400 Subject: [PATCH 354/519] removed unnecessary variables and includes in tally and tracking --- src/tally.F90 | 5 +---- src/tracking.F90 | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index 87102d224a..7ad174c9bc 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -57,7 +57,6 @@ contains integer :: score_index ! scoring bin index integer :: d ! delayed neutron index integer :: d_bin ! delayed group bin index - integer :: i_filter ! filter index integer :: dg_filter ! index of delayed group filter real(8) :: yield ! delayed neutron yield real(8) :: atom_density_ ! atom/b-cm @@ -1058,12 +1057,10 @@ contains integer :: j ! index of delayedgroup filter integer :: d ! delayed group integer :: g ! another delayed group - integer :: d_bin = 1 ! delayed group bin index + integer :: d_bin ! delayed group bin index integer :: n ! number of energies on filter integer :: k ! loop index for bank sites integer :: bin_energyout ! original outgoing energy bin - integer :: bin_delayedgroup ! original delayedgroup bin - integer :: i_filter ! index for matching filter bin combination real(8) :: score ! actual score real(8) :: E_out ! energy of fission bank site logical :: d_found = .FALSE. ! bool to inidicate if delayed group was found diff --git a/src/tracking.F90 b/src/tracking.F90 index d02df8d093..391199bc08 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -16,7 +16,6 @@ module tracking score_collision_tally, score_surface_current use track_output, only: initialize_particle_track, write_particle_track, & add_particle_track, finalize_particle_track - use constants, only: MAX_DELAYED_GROUPS implicit none From 50e006dea908093834f02bad7aae4ea88b6b7cce Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 19 Oct 2015 09:19:40 -0400 Subject: [PATCH 355/519] Now only store StatePoint filename string in Tally class --- openmc/statepoint.py | 2 +- openmc/tallies.py | 29 +++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 133bd766c4..f34de86d79 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -358,7 +358,7 @@ class StatePoint(object): # Create Tally object and assign basic properties tally = openmc.Tally(tally_id=tally_key) - tally._statepoint = self + tally._sp_filename = self._f.filename tally.estimator = self._f['{0}{1}/estimator'.format( base, tally_key)].value.decode() tally.num_realizations = n_realizations diff --git a/openmc/tallies.py b/openmc/tallies.py index a0f617d08c..5b69371072 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -8,6 +8,7 @@ from xml.etree import ElementTree as ET import sys import numpy as np +import h5py from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter @@ -103,7 +104,7 @@ class Tally(object): self._with_batch_statistics = False self._derived = False - self._statepoint = None + self._sp_filename = None self._results_read = False def __deepcopy__(self, memo): @@ -124,7 +125,7 @@ class Tally(object): clone._with_summary = self.with_summary clone._with_batch_statistics = self.with_batch_statistics clone._derived = self.derived - clone._statepoint = self._statepoint + clone._sp_filename = self._sp_filename clone._results_read = self._results_read clone._filters = [] @@ -264,12 +265,16 @@ class Tally(object): @property def sum(self): - if not self._statepoint: + if not self._sp_filename: return None if not self._results_read: + + # Open the HDF5 statepoint file + f = h5py.File(self._sp_filename, 'r') + # Extract Tally data from the file - data = self._statepoint._f['tallies/tally {0}/results'.format( + data = f['tallies/tally {0}/results'.format( self.id)].value sum = data['sum'] sum_sq = data['sum_sq'] @@ -293,11 +298,14 @@ class Tally(object): # Indicate that Tally results have been read self._results_read = True + # Close the HDF5 statepoint file + f.close() + return self._sum @property def sum_sq(self): - if not self._statepoint: + if not self._sp_filename: return None if not self._results_read: @@ -309,7 +317,7 @@ class Tally(object): @property def mean(self): if self._mean is None: - if not self._statepoint: + if not self._sp_filename: return None self._mean = self.sum / self.num_realizations @@ -318,7 +326,7 @@ class Tally(object): @property def std_dev(self): if self._std_dev is None: - if not self._statepoint: + if not self._sp_filename: return None n = self.num_realizations @@ -426,8 +434,13 @@ class Tally(object): # If the score is already in the Tally, don't add it again if score in self.scores: return - else: + + # Normal score strings + if isinstance(score, basestring): self._scores.append(score.strip()) + # CrossScores + else: + self._scores.append(score) @num_score_bins.setter def num_score_bins(self, num_score_bins): From 5b8c683c499f8f5c5e399669cbd3944abb77f1c6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 19 Oct 2015 09:50:09 -0400 Subject: [PATCH 356/519] Added openmc.mgxs.Library.dump_to_file and load_from_file for pickled binary stores --- openmc/mgxs/library.py | 78 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 483f9d5438..8680e726ac 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -1,6 +1,7 @@ import sys import os import copy +import pickle from numbers import Integral from collections import OrderedDict @@ -77,7 +78,7 @@ class Library(object): self._energy_groups = None self._tally_trigger = None self._all_mgxs = OrderedDict() - self._statepoint = None + self._sp_filename = None self.name = name self.openmc_geometry = openmc_geometry @@ -101,7 +102,7 @@ class Library(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._all_mgxs = self.all_mgxs - clone._statepoint = self._statepoint + clone._sp_filename = self._sp_filename clone._all_mgxs = OrderedDict() for domain in self.domains: @@ -172,7 +173,7 @@ class Library(object): @property def statepoint(self): - return self._statepoint + return self._sp_filename @openmc_geometry.setter def openmc_geometry(self, openmc_geometry): @@ -300,7 +301,7 @@ class Library(object): 'linked with a summary file' raise ValueError(msg) - self._statepoint = statepoint + self._sp_filename = statepoint._f.filename # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: @@ -522,6 +523,9 @@ class Library(object): 'library since a statepoint has not yet been loaded' raise ValueError(msg) + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + import h5py # Make directory if it does not exist @@ -544,4 +548,68 @@ class Library(object): mgxs = mgxs.get_subdomain_avg_xs() mgxs.build_hdf5_store(filename, directory, - xs_type=xs_type, nuclides=nuclides) \ No newline at end of file + xs_type=xs_type, nuclides=nuclides) + + def dump_to_file(self, filename='mgxs', directory='mgxs'): + """Store this Library object in a pickle binary file. + + Parameters + ---------- + filename : str + Filename for the pickle file. Defaults to 'mgxs'. + directory : str + Directory for the pickle file. Defaults to 'mgxs'. + + See also + -------- + Library.load_from_file(filename, directory) + + """ + + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + full_filename = os.path.join(directory, filename + '.pkl') + full_filename = full_filename.replace(' ', '-') + + # Load and return pickled Library object + pickle.dump(self, open(full_filename, 'wb')) + + @staticmethod + def load_from_file(filename='mgxs', directory='mgxs'): + """Load a Library object from a pickle binary file. + + Parameters + ---------- + filename : str + Filename for the pickle file. Defaults to 'mgxs'. + directory : str + Directory for the pickle file. Defaults to 'mgxs'. + + Returns + ------- + Library + A Library object loaded from the pickle binary file + + See also + -------- + Library.dump_to_file(mgxs_lib, filename, directory) + + """ + + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + full_filename = os.path.join(directory, filename + '.pkl') + full_filename = full_filename.replace(' ', '-') + + # Load and return pickled Library object + return pickle.load(open(full_filename, 'rb')) \ No newline at end of file From f72eda7f282f2d79de8466090a6d1bb342a99105 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 19 Oct 2015 10:25:45 -0400 Subject: [PATCH 357/519] The ScatterMatrixXS now optionally creates tallies for P0 transport correction --- openmc/mgxs/library.py | 4 ++++ openmc/mgxs/mgxs.py | 52 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 8680e726ac..85cfaad3b0 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -244,6 +244,10 @@ class Library(object): if self.tally_trigger: mgxs.tally_trigger = self.tally_trigger + # Specify whether to use a transport ('P0') correction + if isinstance(mgxs, openmc.mgxs.ScatterMatrixXS): + mgxs.correction = self.correction + mgxs.create_tallies() self.all_mgxs[domain.id][mgxs_type] = mgxs diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d4e368af5d..aa2abb0de5 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1603,13 +1603,35 @@ class NuScatterXS(MGXS): class ScatterMatrixXS(MGXS): - """A scattering matrix multi-group cross section.""" + """A scattering matrix multi-group cross section. + + Attributes + ---------- + correction : 'P0' or None + Apply the P0 correction to scattering matrices if set to 'P0' + + """ def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'scatter matrix' + self._correction = 'P0' + + def __deepcopy__(self, memo): + clone = super(ScatterMatrixXS, self).__deepcopy__(memo) + clone._correction = self.correction + return clone + + @property + def correction(self): + return self._correction + + @correction.setter + def correction(self, correction): + cv.check_value('correction', correction, ('P0', None)) + self._correction = correction def create_tallies(self): """Construct the OpenMC tallies needed to compute this cross section. @@ -1625,8 +1647,12 @@ class ScatterMatrixXS(MGXS): energyout = openmc.Filter('energyout', group_edges) # Create a list of scores for each Tally to be created - scores = ['flux', 'scatter', 'scatter-P1'] - filters = [[energy], [energy, energyout], [energyout]] + if self.correction == 'P0': + scores = ['flux', 'scatter', 'scatter-P1'] + filters = [[energy], [energy, energyout], [energyout]] + else: + scores = ['flux', 'scatter'] + filters = [[energy], [energy, energyout]] estimator = 'analog' keys = scores @@ -1648,7 +1674,7 @@ class ScatterMatrixXS(MGXS): """ # If using P0 correction subtract scatter-P1 from the diagonal - if correction == 'P0': + if self.correction == 'P0': scatter_p1 = self.tallies['scatter-P1'] scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1']) energy_filter = openmc.Filter(type='energy') @@ -1924,16 +1950,22 @@ class NuScatterMatrixXS(ScatterMatrixXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'nu-scatter', 'scatter-P1'] - estimator = 'analog' - keys = ['flux', 'scatter', 'scatter-P1'] - # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) energyout = openmc.Filter('energyout', group_edges) - filters = [[energy], [energy, energyout], [energyout]] + + # Create a list of scores for each Tally to be created + if self.correction == 'P0': + scores = ['flux', 'nu-scatter', 'scatter-P1'] + estimator = 'analog' + keys = ['flux', 'scatter', 'scatter-P1'] + filters = [[energy], [energy, energyout], [energyout]] + else: + scores = ['flux', 'nu-scatter'] + estimator = 'analog' + keys = ['flux', 'scatter'] + filters = [[energy], [energy, energyout]] # Intialize the Tallies super(ScatterMatrixXS, self).create_tallies(scores, filters, From 37c4d9fa897cc661678fdfbfc9c5adb9148371dd Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 20 Oct 2015 15:35:14 +0000 Subject: [PATCH 358/519] fixed issue with statepoint.py modifying delayed-nu-fission score --- openmc/statepoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 133bd766c4..4279133e97 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -431,7 +431,7 @@ class StatePoint(object): for j, score in enumerate(scores): score = score.decode() # If this is a scattering moment, insert the scattering order - if '-n' in score: + if '-n' in score and 'delayed' not in score: score = score.replace('-n', '-' + moments[j].decode()) elif '-pn' in score: score = score.replace('-pn', '-' + moments[j].decode()) From 4fcdd7f0d67d80cf1306fa674a2505ae71a99b4b Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 20 Oct 2015 17:55:17 +0000 Subject: [PATCH 359/519] added summary output of delayedgroup filter type --- src/summary.F90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/summary.F90 b/src/summary.F90 index f3edbe7199..f088cb7bbf 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -575,6 +575,8 @@ contains call write_dataset(filter_group, "type", "polar") case(FILTER_AZIMUTHAL) call write_dataset(filter_group, "type", "azimuthal") + case(FILTER_DELAYEDGROUP) + call write_dataset(filter_group, "type", "delayedgroup") end select call close_group(filter_group) From 82483b64901618639ec3929b08557315e6b72db1 Mon Sep 17 00:00:00 2001 From: samuel shaner Date: Tue, 20 Oct 2015 19:46:59 +0000 Subject: [PATCH 360/519] generalized the insertion of the momemt order in statepoint.py --- openmc/statepoint.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 4279133e97..c551346da6 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -1,6 +1,6 @@ import copy import sys - +import re import numpy as np import openmc @@ -429,14 +429,12 @@ class StatePoint(object): # Add the scores to the Tally for j, score in enumerate(scores): - score = score.decode() - # If this is a scattering moment, insert the scattering order - if '-n' in score and 'delayed' not in score: - score = score.replace('-n', '-' + moments[j].decode()) - elif '-pn' in score: - score = score.replace('-pn', '-' + moments[j].decode()) - elif '-yn' in score: - score = score.replace('-yn', '-' + moments[j].decode()) + + # If this is a moment, use generic moment order + regexp = re.compile(r'-n$|-pn$|-yn$') + if regexp.search(score) is not None: + score = score.strip(regexp.findall(score)[0]) + score += '-' + moments[j] tally.add_score(score) From 7173431d6bae3015fe8dc20e17cf425950e01f09 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 20 Oct 2015 23:33:26 -0400 Subject: [PATCH 361/519] Fixed comment in trigger.py for scattering moment regular expressions --- openmc/trigger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/trigger.py b/openmc/trigger.py index 0652834b83..4019d5d468 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -97,7 +97,7 @@ class Trigger(object): 'it is not a string'.format(score) raise ValueError(msg) - # If this is a scattering moment, use generic moment order + # If this is a total/flux/scattering moment, use generic moment order regexp = re.compile(r'-[0-9]') if regexp.search(score) is not None: score = score.strip(regexp.findall(score)[0]) From b92aaf5d10d9f520ae2404b5a211196414f0a112 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 21 Oct 2015 00:28:41 -0400 Subject: [PATCH 362/519] All sorting of materials/cells/universes is now done by ID in Python API --- openmc/geometry.py | 12 +- openmc/mgxs/library.py | 2 +- openmc/mgxs/mgxs.py | 2 +- tests/run_tests.py | 4 +- .../inputs_true.dat | 2 +- .../results_true.dat | 50 +- .../test_mgxs_library_condense.py | 10 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/results_true.dat | 169 +- .../test_mgxs_library_hdf5.py | 11 +- .../inputs_true.dat | 2 +- .../results_true.dat | 122 +- .../test_mgxs_library_no_nuclides.py | 6 +- .../inputs_true.dat | 2 +- .../results_true.dat | 1972 ++++++++++++++++- .../test_mgxs_library_nuclides.py | 6 +- tests/testing_harness.py | 6 + 17 files changed, 2350 insertions(+), 30 deletions(-) diff --git a/openmc/geometry.py b/openmc/geometry.py index bb98be2fea..b57ac5623b 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -135,7 +135,9 @@ class Geometry(object): for cell in material_cells: materials.add(cell._fill) - return sorted(list(materials)) + materials = list(materials) + materials.sort(key=lambda x: x.id) + return materials def get_all_material_cells(self): all_cells = self.get_all_cells() @@ -145,7 +147,9 @@ class Geometry(object): if cell._type == 'normal': material_cells.add(cell) - return sorted(list(material_cells)) + material_cells = list(material_cells) + material_cells.sort(key=lambda x: x.id) + return material_cells def get_all_material_universes(self): """Return all universes composed of at least one non-fill cell @@ -166,7 +170,9 @@ class Geometry(object): if cell._type == 'normal': material_universes.add(universe) - return sorted(list(material_universes)) + material_universes = list(material_universes) + material_universes.sort(key=lambda x: x.id) + return material_universes class GeometryFile(object): diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 85cfaad3b0..0178745efe 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -56,7 +56,7 @@ class Library(object): tally_trigger : Trigger An (optional) tally precision trigger given to each tally used to compute the cross section - all_mgxs : dict + all_mgxs : OrderedDict MGXS objects keyed by domain ID and cross section type statepoint : openmc.StatePoint The statepoint with tally data used to the compute cross sections diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index aa2abb0de5..83b85bf507 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -83,7 +83,7 @@ class MGXS(object): tally_trigger : Trigger An (optional) tally precision trigger given to each tally used to compute the cross section - tallies : dict + tallies : OrderedDict OpenMC tallies needed to compute the multi-group cross section xs_tally : Tally Derived tally for the multi-group cross section. This attribute diff --git a/tests/run_tests.py b/tests/run_tests.py index 6974dff339..1377c966c1 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -470,8 +470,8 @@ for key in iter(tests): logfilename = os.path.splitext(logfilename)[0] logfilename = logfilename + '_{0}.log'.format(test.name) shutil.copy(logfile[0], logfilename) - - with open(logfilename) as fh: print(fh.read()) + print(logfilename) + with open(logfilename) as fh: print(fh.read()) # Clear build directory and remove binary and hdf5 files shutil.rmtree('build', ignore_errors=True) diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index b40fb91b39..37397c5947 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -06e2f794c78d312491a87074b2e725d6f395fc250e004c125b50c1057b725ef1dbf3fd943629fd01b5a26ed018a1292712fc3425c925661ddadbf83194eb66df \ No newline at end of file +35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index 9cfa49a263..9549f16c86 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1 +1,49 @@ -a14024dfa41c9b9e90db79574f4d3f9eeeffb1c8c6fd7d26a234bf3fe1c3268316ee9f1de01211583246d0968b148870086469548a7c8ca424b8ff4111db0c8d \ No newline at end of file + material group in nuclide mean std. dev. +0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. +0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. +0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. +0 1 1 total 1 0.119622 material group in nuclide mean std. dev. +0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. +0 2 1 total 0 0 material group in group out nuclide mean std. dev. +0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. +0 2 1 total 0 0 material group in nuclide mean std. dev. +0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. +0 3 1 total 0 0 material group in group out nuclide mean std. dev. +0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. +0 3 1 total 0 0 material group in nuclide mean std. dev. +0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. +0 4 1 total 0 0 material group in group out nuclide mean std. dev. +0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. +0 4 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in group out nuclide mean std. dev. +0 5 1 1 total 0 0 material group out nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in group out nuclide mean std. dev. +0 6 1 1 total 0 0 material group out nuclide mean std. dev. +0 6 1 total 0 0 material group in nuclide mean std. dev. +0 7 1 total 0 0 material group in nuclide mean std. dev. +0 7 1 total 0 0 material group in group out nuclide mean std. dev. +0 7 1 1 total 0 0 material group out nuclide mean std. dev. +0 7 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in group out nuclide mean std. dev. +0 8 1 1 total 0 0 material group out nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. +0 9 1 total 0 0 material group in group out nuclide mean std. dev. +0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. +0 9 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in group out nuclide mean std. dev. +0 10 1 1 total 0 0 material group out nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. +0 11 1 total 0 0 material group in group out nuclide mean std. dev. +0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. +0 11 1 total 0 0 material group in nuclide mean std. dev. +0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. +0 12 1 total 0 0 material group in group out nuclide mean std. dev. +0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. +0 12 1 total 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py index 8482c4ae38..4c84de2bf6 100644 --- a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py +++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py @@ -24,7 +24,7 @@ class MGXSTestHarness(PyAPITestHarness): # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry) - self.mgxs_lib.by_nuclide = True + self.mgxs_lib.by_nuclide = False self.mgxs_lib.mgxs_types = ['transport', 'nu-fission', 'nu-scatter matrix', 'chi'] self.mgxs_lib.energy_groups = energy_groups @@ -33,10 +33,10 @@ class MGXSTestHarness(PyAPITestHarness): # Initialize a tallies file self._input_set.tallies = openmc.TalliesFile() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) self._input_set.tallies.export_to_xml() - def _get_results(self, hash_output=True): + def _get_results(self, hash_output=False): """Digest info in the statepoint and return as a string.""" # Read the statepoint file. @@ -57,12 +57,14 @@ class MGXSTestHarness(PyAPITestHarness): # Build a string from Pandas Dataframe for each 1-group MGXS outstr = '' - for domain in sorted(condense_lib.domains): + for domain in condense_lib.domains: for mgxs_type in condense_lib.mgxs_types: mgxs = condense_lib.get_mgxs(domain, mgxs_type) df = mgxs.get_pandas_dataframe() outstr += df.to_string() + print(outstr) + # Hash the results if necessary if hash_output: sha512 = hashlib.sha512() diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index fe91376d57..37397c5947 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -ff4b31da88312d526bebb8819aaaa75f737b9aaff4660557009c8277c1e8c5f2515d256de9ffc9bdc07bce42719fae27aeb8d0a3d3b61552dd4b1eddd48e6ff2 \ No newline at end of file +35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/results_true.dat b/tests/test_mgxs_library_hdf5/results_true.dat index 62913b363c..eec581046d 100644 --- a/tests/test_mgxs_library_hdf5/results_true.dat +++ b/tests/test_mgxs_library_hdf5/results_true.dat @@ -1 +1,168 @@ -290551338cc3a6c5fcf965d5f0ee0d14bb68a9fa3f4066bd59c65d2673bf659547be0674961631f5fd03bc06d991ff1dafb974938222a8e87c4d232f1212bd4a \ No newline at end of file +domain=1 type=transport +[ 0.38437891 0.81208747] +[ 0.01648997 0.07418959] +domain=1 type=nu-fission +[ 0.02127008 0.69604034] +[ 0.0008939 0.05345764] +domain=1 type=nu-scatter matrix +[[ 3.49923892e-01 1.73140769e-04] + [ 1.94810926e-03 3.79607212e-01]] +[[ 0.01664928 0.0001732 ] + [ 0.00195193 0.04007819]] +domain=1 type=chi +[ 1. 0.] +[ 0.11962178 0. ] +domain=2 type=transport +[ 0.24504295 0.26645769] +[ 0.00882749 0.05220872] +domain=2 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=2 type=nu-scatter matrix +[[ 0.24365718 0. ] + [ 0. 0.25478661]] +[[ 0.00908307 0. ] + [ 0. 0.05556256]] +domain=2 type=chi +[ 0. 0.] +[ 0. 0.] +domain=3 type=transport +[ 0.28227749 1.42731974] +[ 0.03724175 0.24712746] +domain=3 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=3 type=nu-scatter matrix +[[ 0.25396726 0.02727268] + [ 0. 1.37652669]] +[[ 0.03617307 0.00180698] + [ 0. 0.2402569 ]] +domain=3 type=chi +[ 0. 0.] +[ 0. 0.] +domain=4 type=transport +[ 0.25572316 1.17976682] +[ 0.05191655 0.22938034] +domain=4 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=4 type=nu-scatter matrix +[[ 0.23297756 0.02228141] + [ 0. 1.14680862]] +[[ 0.04977114 0.00262525] + [ 0. 0.22219839]] +domain=4 type=chi +[ 0. 0.] +[ 0. 0.] +domain=5 type=transport +[ 0. 0.] +[ 0. 0.] +domain=5 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=5 type=nu-scatter matrix +[[ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.]] +domain=5 type=chi +[ 0. 0.] +[ 0. 0.] +domain=6 type=transport +[ 0. 0.] +[ 0. 0.] +domain=6 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=6 type=nu-scatter matrix +[[ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.]] +domain=6 type=chi +[ 0. 0.] +[ 0. 0.] +domain=7 type=transport +[ 0. 0.] +[ 0. 0.] +domain=7 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=7 type=nu-scatter matrix +[[ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.]] +domain=7 type=chi +[ 0. 0.] +[ 0. 0.] +domain=8 type=transport +[ 0. 0.] +[ 0. 0.] +domain=8 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=8 type=nu-scatter matrix +[[ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.]] +domain=8 type=chi +[ 0. 0.] +[ 0. 0.] +domain=9 type=transport +[ 0.50403601 1.68709544] +[ 0.37962374 2.53662237] +domain=9 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=9 type=nu-scatter matrix +[[ 0.50403601 0. ] + [ 0. 1.41795483]] +[[ 0.37962374 0. ] + [ 0. 2.15802716]] +domain=9 type=chi +[ 0. 0.] +[ 0. 0.] +domain=10 type=transport +[ 0. 0.] +[ 0. 0.] +domain=10 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=10 type=nu-scatter matrix +[[ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.]] +domain=10 type=chi +[ 0. 0.] +[ 0. 0.] +domain=11 type=transport +[ 0.30282618 1.00614519] +[ 0.40131081 1.09163785] +domain=11 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=11 type=nu-scatter matrix +[[ 0.27567871 0.02714747] + [ 0. 0.95792921]] +[[ 0.38567601 0.02000859] + [ 0. 1.05195936]] +domain=11 type=chi +[ 0. 0.] +[ 0. 0.] +domain=12 type=transport +[ 0.25593293 1.11334475] +[ 0.26842571 0.98867569] +domain=12 type=nu-fission +[ 0. 0.] +[ 0. 0.] +domain=12 type=nu-scatter matrix +[[ 0.22631045 0.02962248] + [ 0. 1.07168976]] +[[ 0.25487194 0.0177599 ] + [ 0. 0.95829029]] +domain=12 type=chi +[ 0. 0.] +[ 0. 0.] diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py index 26f4154a8b..c54be05e9c 100644 --- a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py +++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py @@ -34,10 +34,10 @@ class MGXSTestHarness(PyAPITestHarness): # Initialize a tallies file self._input_set.tallies = openmc.TalliesFile() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) self._input_set.tallies.export_to_xml() - def _get_results(self, hash_output=True): + def _get_results(self, hash_output=False): """Digest info in the statepoint and return as a string.""" # Read the statepoint file. @@ -60,12 +60,13 @@ class MGXSTestHarness(PyAPITestHarness): # Build a string from the datasets in the HDF5 file outstr = '' - for domain in sorted(self.mgxs_lib.domains): + for domain in self.mgxs_lib.domains: for mgxs_type in self.mgxs_lib.mgxs_types: + outstr += 'domain={0} type={1}\n'.format(domain.id, mgxs_type) key = 'material/{0}/{1}/average'.format(domain.id, mgxs_type) - outstr += str(f[key]) + outstr += str(f[key][...]) + '\n' key = 'material/{0}/{1}/std. dev.'.format(domain.id, mgxs_type) - outstr += str(f[key]) + outstr += str(f[key][...]) + '\n' # Close the MGXS HDF5 file f.close() diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index fe91376d57..37397c5947 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -ff4b31da88312d526bebb8819aaaa75f737b9aaff4660557009c8277c1e8c5f2515d256de9ffc9bdc07bce42719fae27aeb8d0a3d3b61552dd4b1eddd48e6ff2 \ No newline at end of file +35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index 54b73efb3f..bbcb28375d 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1 +1,121 @@ -f882fc13affc45ed4ce833c17b719c10a371b3c086022a846014e0ce46337971850d55c7634a9bfc740709c696aef8ec9cdad19253f62aeb77af6baed35f9fda \ No newline at end of file + material group in nuclide mean std. dev. +1 1 1 total 0.384379 0.01649 +0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. +1 1 1 total 0.02127 0.000894 +0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. +3 1 1 1 total 0.349924 0.016649 +2 1 1 2 total 0.000173 0.000173 +1 1 2 1 total 0.001948 0.001952 +0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. +1 1 1 total 1 0.119622 +0 1 2 total 0 0.000000 material group in nuclide mean std. dev. +1 2 1 total 0.245043 0.008827 +0 2 2 total 0.266458 0.052209 material group in nuclide mean std. dev. +1 2 1 total 0 0 +0 2 2 total 0 0 material group in group out nuclide mean std. dev. +3 2 1 1 total 0.243657 0.009083 +2 2 1 2 total 0.000000 0.000000 +1 2 2 1 total 0.000000 0.000000 +0 2 2 2 total 0.254787 0.055563 material group out nuclide mean std. dev. +1 2 1 total 0 0 +0 2 2 total 0 0 material group in nuclide mean std. dev. +1 3 1 total 0.282277 0.037242 +0 3 2 total 1.427320 0.247127 material group in nuclide mean std. dev. +1 3 1 total 0 0 +0 3 2 total 0 0 material group in group out nuclide mean std. dev. +3 3 1 1 total 0.253967 0.036173 +2 3 1 2 total 0.027273 0.001807 +1 3 2 1 total 0.000000 0.000000 +0 3 2 2 total 1.376527 0.240257 material group out nuclide mean std. dev. +1 3 1 total 0 0 +0 3 2 total 0 0 material group in nuclide mean std. dev. +1 4 1 total 0.255723 0.051917 +0 4 2 total 1.179767 0.229380 material group in nuclide mean std. dev. +1 4 1 total 0 0 +0 4 2 total 0 0 material group in group out nuclide mean std. dev. +3 4 1 1 total 0.232978 0.049771 +2 4 1 2 total 0.022281 0.002625 +1 4 2 1 total 0.000000 0.000000 +0 4 2 2 total 1.146809 0.222198 material group out nuclide mean std. dev. +1 4 1 total 0 0 +0 4 2 total 0 0 material group in nuclide mean std. dev. +1 5 1 total 0 0 +0 5 2 total 0 0 material group in nuclide mean std. dev. +1 5 1 total 0 0 +0 5 2 total 0 0 material group in group out nuclide mean std. dev. +3 5 1 1 total 0 0 +2 5 1 2 total 0 0 +1 5 2 1 total 0 0 +0 5 2 2 total 0 0 material group out nuclide mean std. dev. +1 5 1 total 0 0 +0 5 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in group out nuclide mean std. dev. +3 6 1 1 total 0 0 +2 6 1 2 total 0 0 +1 6 2 1 total 0 0 +0 6 2 2 total 0 0 material group out nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in nuclide mean std. dev. +1 7 1 total 0 0 +0 7 2 total 0 0 material group in nuclide mean std. dev. +1 7 1 total 0 0 +0 7 2 total 0 0 material group in group out nuclide mean std. dev. +3 7 1 1 total 0 0 +2 7 1 2 total 0 0 +1 7 2 1 total 0 0 +0 7 2 2 total 0 0 material group out nuclide mean std. dev. +1 7 1 total 0 0 +0 7 2 total 0 0 material group in nuclide mean std. dev. +1 8 1 total 0 0 +0 8 2 total 0 0 material group in nuclide mean std. dev. +1 8 1 total 0 0 +0 8 2 total 0 0 material group in group out nuclide mean std. dev. +3 8 1 1 total 0 0 +2 8 1 2 total 0 0 +1 8 2 1 total 0 0 +0 8 2 2 total 0 0 material group out nuclide mean std. dev. +1 8 1 total 0 0 +0 8 2 total 0 0 material group in nuclide mean std. dev. +1 9 1 total 0.504036 0.379624 +0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. +1 9 1 total 0 0 +0 9 2 total 0 0 material group in group out nuclide mean std. dev. +3 9 1 1 total 0.504036 0.379624 +2 9 1 2 total 0.000000 0.000000 +1 9 2 1 total 0.000000 0.000000 +0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +1 9 1 total 0 0 +0 9 2 total 0 0 material group in nuclide mean std. dev. +1 10 1 total 0 0 +0 10 2 total 0 0 material group in nuclide mean std. dev. +1 10 1 total 0 0 +0 10 2 total 0 0 material group in group out nuclide mean std. dev. +3 10 1 1 total 0 0 +2 10 1 2 total 0 0 +1 10 2 1 total 0 0 +0 10 2 2 total 0 0 material group out nuclide mean std. dev. +1 10 1 total 0 0 +0 10 2 total 0 0 material group in nuclide mean std. dev. +1 11 1 total 0.302826 0.401311 +0 11 2 total 1.006145 1.091638 material group in nuclide mean std. dev. +1 11 1 total 0 0 +0 11 2 total 0 0 material group in group out nuclide mean std. dev. +3 11 1 1 total 0.275679 0.385676 +2 11 1 2 total 0.027147 0.020009 +1 11 2 1 total 0.000000 0.000000 +0 11 2 2 total 0.957929 1.051959 material group out nuclide mean std. dev. +1 11 1 total 0 0 +0 11 2 total 0 0 material group in nuclide mean std. dev. +1 12 1 total 0.255933 0.268426 +0 12 2 total 1.113345 0.988676 material group in nuclide mean std. dev. +1 12 1 total 0 0 +0 12 2 total 0 0 material group in group out nuclide mean std. dev. +3 12 1 1 total 0.226310 0.254872 +2 12 1 2 total 0.029622 0.017760 +1 12 2 1 total 0.000000 0.000000 +0 12 2 2 total 1.071690 0.958290 material group out nuclide mean std. dev. +1 12 1 total 0 0 +0 12 2 total 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py index 5fe44f9525..2afa9039e8 100644 --- a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py +++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py @@ -33,10 +33,10 @@ class MGXSTestHarness(PyAPITestHarness): # Initialize a tallies file self._input_set.tallies = openmc.TalliesFile() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) self._input_set.tallies.export_to_xml() - def _get_results(self, hash_output=True): + def _get_results(self, hash_output=False): """Digest info in the statepoint and return as a string.""" # Read the statepoint file. @@ -53,7 +53,7 @@ class MGXSTestHarness(PyAPITestHarness): # Build a string from Pandas Dataframe for each MGXS outstr = '' - for domain in sorted(self.mgxs_lib.domains): + for domain in self.mgxs_lib.domains: for mgxs_type in self.mgxs_lib.mgxs_types: mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) df = mgxs.get_pandas_dataframe() diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index b40fb91b39..2e299773a3 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -06e2f794c78d312491a87074b2e725d6f395fc250e004c125b50c1057b725ef1dbf3fd943629fd01b5a26ed018a1292712fc3425c925661ddadbf83194eb66df \ No newline at end of file +7c1deb8a54fbe1a1ce6ef27cea4a11995210ad3e5ecf32bd83d7c80041edf0793378a7325ffe7ebf9c537e9c278fd4545642fec6c1e46b9c5418118f035d5e95 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 278e7da84d..f8e5baac55 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1,1971 @@ -2c3d1524788449afd2124a9cfa9e6032077598639bddfa4d5e5c48962e789ca133e537b7207e200a79a6d01dc703b6f43f4ba4916323aab90c9ccaf335c640f1 \ No newline at end of file + material group in nuclide mean std. dev. +34 1 1 U-234 0.000000 0.000000 +35 1 1 U-235 0.008559 0.001742 +36 1 1 U-236 0.002643 0.000794 +37 1 1 U-238 0.213622 0.010911 +38 1 1 Np-237 0.000000 0.000000 +39 1 1 Pu-238 0.000000 0.000000 +40 1 1 Pu-239 0.005787 0.001050 +41 1 1 Pu-240 0.005702 0.000850 +42 1 1 Pu-241 0.000869 0.000366 +43 1 1 Pu-242 0.000655 0.000537 +44 1 1 Am-241 0.000000 0.000000 +45 1 1 Am-242m 0.000000 0.000000 +46 1 1 Am-243 0.000000 0.000000 +47 1 1 Cm-242 0.000000 0.000000 +48 1 1 Cm-243 0.000000 0.000000 +49 1 1 Cm-244 0.000000 0.000000 +50 1 1 Cm-245 0.000000 0.000000 +51 1 1 Mo-95 0.000302 0.000216 +52 1 1 Tc-99 0.000782 0.000434 +53 1 1 Ru-101 0.000346 0.000212 +54 1 1 Ru-103 0.000000 0.000000 +55 1 1 Ag-109 0.000000 0.000000 +56 1 1 Xe-135 0.000000 0.000000 +57 1 1 Cs-133 0.000189 0.000264 +58 1 1 Nd-143 0.000721 0.000364 +59 1 1 Nd-145 0.000637 0.000253 +60 1 1 Sm-147 0.000009 0.000238 +61 1 1 Sm-149 0.000000 0.000000 +62 1 1 Sm-150 0.000003 0.000243 +63 1 1 Sm-151 0.000000 0.000000 +64 1 1 Sm-152 0.000874 0.000388 +65 1 1 Eu-153 0.000173 0.000173 +66 1 1 Gd-155 0.000000 0.000000 +67 1 1 O-16 0.142506 0.008222 +0 1 2 U-234 0.001948 0.001952 +1 1 2 U-235 0.179956 0.028209 +2 1 2 U-236 0.000000 0.000000 +3 1 2 U-238 0.239279 0.039048 +4 1 2 Np-237 0.000000 0.000000 +5 1 2 Pu-238 0.000000 0.000000 +6 1 2 Pu-239 0.159745 0.015751 +7 1 2 Pu-240 0.007792 0.003677 +8 1 2 Pu-241 0.017533 0.003806 +9 1 2 Pu-242 0.000000 0.000000 +10 1 2 Am-241 0.000000 0.000000 +11 1 2 Am-242m 0.000000 0.000000 +12 1 2 Am-243 0.000000 0.000000 +13 1 2 Cm-242 0.000000 0.000000 +14 1 2 Cm-243 0.000000 0.000000 +15 1 2 Cm-244 0.000000 0.000000 +16 1 2 Cm-245 0.000000 0.000000 +17 1 2 Mo-95 0.002250 0.004232 +18 1 2 Tc-99 0.003544 0.002528 +19 1 2 Ru-101 0.000000 0.000000 +20 1 2 Ru-103 0.000000 0.000000 +21 1 2 Ag-109 0.000000 0.000000 +22 1 2 Xe-135 0.027274 0.004025 +23 1 2 Cs-133 0.000000 0.000000 +24 1 2 Nd-143 0.006532 0.002517 +25 1 2 Nd-145 0.001948 0.001952 +26 1 2 Sm-147 0.000000 0.000000 +27 1 2 Sm-149 0.007792 0.005701 +28 1 2 Sm-150 0.000000 0.000000 +29 1 2 Sm-151 0.000000 0.000000 +30 1 2 Sm-152 0.000000 0.000000 +31 1 2 Eu-153 0.001686 0.001968 +32 1 2 Gd-155 0.000000 0.000000 +33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. +34 1 1 U-234 6.771527e-06 2.982583e-07 +35 1 1 U-235 9.687933e-03 4.305720e-04 +36 1 1 U-236 6.279974e-05 3.653120e-06 +37 1 1 U-238 6.335930e-03 4.715525e-04 +38 1 1 Np-237 1.237030e-05 6.333955e-07 +39 1 1 Pu-238 7.369063e-06 5.017525e-07 +40 1 1 Pu-239 4.007893e-03 2.607619e-04 +41 1 1 Pu-240 6.479096e-05 3.728060e-06 +42 1 1 Pu-241 1.074454e-03 4.688479e-05 +43 1 1 Pu-242 5.512610e-06 2.976651e-07 +44 1 1 Am-241 1.088373e-06 8.489934e-08 +45 1 1 Am-242m 1.143307e-06 9.912400e-08 +46 1 1 Am-243 7.745526e-07 5.413923e-08 +47 1 1 Cm-242 4.311566e-07 1.922427e-08 +48 1 1 Cm-243 2.363328e-07 2.235666e-08 +49 1 1 Cm-244 2.840125e-07 2.412051e-08 +50 1 1 Cm-245 3.017505e-07 1.594090e-08 +51 1 1 Mo-95 0.000000e+00 0.000000e+00 +52 1 1 Tc-99 0.000000e+00 0.000000e+00 +53 1 1 Ru-101 0.000000e+00 0.000000e+00 +54 1 1 Ru-103 0.000000e+00 0.000000e+00 +55 1 1 Ag-109 0.000000e+00 0.000000e+00 +56 1 1 Xe-135 0.000000e+00 0.000000e+00 +57 1 1 Cs-133 0.000000e+00 0.000000e+00 +58 1 1 Nd-143 0.000000e+00 0.000000e+00 +59 1 1 Nd-145 0.000000e+00 0.000000e+00 +60 1 1 Sm-147 0.000000e+00 0.000000e+00 +61 1 1 Sm-149 0.000000e+00 0.000000e+00 +62 1 1 Sm-150 0.000000e+00 0.000000e+00 +63 1 1 Sm-151 0.000000e+00 0.000000e+00 +64 1 1 Sm-152 0.000000e+00 0.000000e+00 +65 1 1 Eu-153 0.000000e+00 0.000000e+00 +66 1 1 Gd-155 0.000000e+00 0.000000e+00 +67 1 1 O-16 0.000000e+00 0.000000e+00 +0 1 2 U-234 4.267300e-07 3.529845e-08 +1 1 2 U-235 3.629246e-01 2.964548e-02 +2 1 2 U-236 5.921657e-06 4.881464e-07 +3 1 2 U-238 5.196256e-07 4.286610e-08 +4 1 2 Np-237 2.424211e-07 1.741823e-08 +5 1 2 Pu-238 3.255627e-05 2.692686e-06 +6 1 2 Pu-239 2.868384e-01 2.056896e-02 +7 1 2 Pu-240 4.398266e-06 3.658267e-07 +8 1 2 Pu-241 4.607239e-02 3.797176e-03 +9 1 2 Pu-242 8.451967e-08 6.979002e-09 +10 1 2 Am-241 4.678607e-06 3.253889e-07 +11 1 2 Am-242m 1.417675e-04 1.218350e-05 +12 1 2 Am-243 7.648834e-08 6.303843e-09 +13 1 2 Cm-242 9.433314e-07 7.794362e-08 +14 1 2 Cm-243 1.767995e-06 1.454123e-07 +15 1 2 Cm-244 1.533962e-07 1.266951e-08 +16 1 2 Cm-245 1.145063e-05 9.419051e-07 +17 1 2 Mo-95 0.000000e+00 0.000000e+00 +18 1 2 Tc-99 0.000000e+00 0.000000e+00 +19 1 2 Ru-101 0.000000e+00 0.000000e+00 +20 1 2 Ru-103 0.000000e+00 0.000000e+00 +21 1 2 Ag-109 0.000000e+00 0.000000e+00 +22 1 2 Xe-135 0.000000e+00 0.000000e+00 +23 1 2 Cs-133 0.000000e+00 0.000000e+00 +24 1 2 Nd-143 0.000000e+00 0.000000e+00 +25 1 2 Nd-145 0.000000e+00 0.000000e+00 +26 1 2 Sm-147 0.000000e+00 0.000000e+00 +27 1 2 Sm-149 0.000000e+00 0.000000e+00 +28 1 2 Sm-150 0.000000e+00 0.000000e+00 +29 1 2 Sm-151 0.000000e+00 0.000000e+00 +30 1 2 Sm-152 0.000000e+00 0.000000e+00 +31 1 2 Eu-153 0.000000e+00 0.000000e+00 +32 1 2 Gd-155 0.000000e+00 0.000000e+00 +33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. +102 1 1 1 U-234 0.000000 0.000000 +103 1 1 1 U-235 0.002846 0.001185 +104 1 1 1 U-236 0.001951 0.000829 +105 1 1 1 U-238 0.197520 0.011618 +106 1 1 1 Np-237 0.000000 0.000000 +107 1 1 1 Pu-238 0.000000 0.000000 +108 1 1 1 Pu-239 0.001285 0.000461 +109 1 1 1 Pu-240 0.001027 0.000635 +110 1 1 1 Pu-241 0.000004 0.000242 +111 1 1 1 Pu-242 0.000481 0.000372 +112 1 1 1 Am-241 0.000000 0.000000 +113 1 1 1 Am-242m 0.000000 0.000000 +114 1 1 1 Am-243 0.000000 0.000000 +115 1 1 1 Cm-242 0.000000 0.000000 +116 1 1 1 Cm-243 0.000000 0.000000 +117 1 1 1 Cm-244 0.000000 0.000000 +118 1 1 1 Cm-245 0.000000 0.000000 +119 1 1 1 Mo-95 0.000302 0.000216 +120 1 1 1 Tc-99 0.000262 0.000195 +121 1 1 1 Ru-101 0.000000 0.000000 +122 1 1 1 Ru-103 0.000000 0.000000 +123 1 1 1 Ag-109 0.000000 0.000000 +124 1 1 1 Xe-135 0.000000 0.000000 +125 1 1 1 Cs-133 0.000016 0.000234 +126 1 1 1 Nd-143 0.000721 0.000364 +127 1 1 1 Nd-145 0.000463 0.000281 +128 1 1 1 Sm-147 0.000009 0.000238 +129 1 1 1 Sm-149 0.000000 0.000000 +130 1 1 1 Sm-150 0.000003 0.000243 +131 1 1 1 Sm-151 0.000000 0.000000 +132 1 1 1 Sm-152 0.000700 0.000424 +133 1 1 1 Eu-153 0.000000 0.000000 +134 1 1 1 Gd-155 0.000000 0.000000 +135 1 1 1 O-16 0.142333 0.008156 +68 1 1 2 U-234 0.000000 0.000000 +69 1 1 2 U-235 0.000000 0.000000 +70 1 1 2 U-236 0.000000 0.000000 +71 1 1 2 U-238 0.000000 0.000000 +72 1 1 2 Np-237 0.000000 0.000000 +73 1 1 2 Pu-238 0.000000 0.000000 +74 1 1 2 Pu-239 0.000000 0.000000 +75 1 1 2 Pu-240 0.000000 0.000000 +76 1 1 2 Pu-241 0.000000 0.000000 +77 1 1 2 Pu-242 0.000000 0.000000 +78 1 1 2 Am-241 0.000000 0.000000 +79 1 1 2 Am-242m 0.000000 0.000000 +80 1 1 2 Am-243 0.000000 0.000000 +81 1 1 2 Cm-242 0.000000 0.000000 +82 1 1 2 Cm-243 0.000000 0.000000 +83 1 1 2 Cm-244 0.000000 0.000000 +84 1 1 2 Cm-245 0.000000 0.000000 +85 1 1 2 Mo-95 0.000000 0.000000 +86 1 1 2 Tc-99 0.000000 0.000000 +87 1 1 2 Ru-101 0.000000 0.000000 +88 1 1 2 Ru-103 0.000000 0.000000 +89 1 1 2 Ag-109 0.000000 0.000000 +90 1 1 2 Xe-135 0.000000 0.000000 +91 1 1 2 Cs-133 0.000000 0.000000 +92 1 1 2 Nd-143 0.000000 0.000000 +93 1 1 2 Nd-145 0.000000 0.000000 +94 1 1 2 Sm-147 0.000000 0.000000 +95 1 1 2 Sm-149 0.000000 0.000000 +96 1 1 2 Sm-150 0.000000 0.000000 +97 1 1 2 Sm-151 0.000000 0.000000 +98 1 1 2 Sm-152 0.000000 0.000000 +99 1 1 2 Eu-153 0.000000 0.000000 +100 1 1 2 Gd-155 0.000000 0.000000 +101 1 1 2 O-16 0.000173 0.000173 +34 1 2 1 U-234 0.000000 0.000000 +35 1 2 1 U-235 0.000000 0.000000 +36 1 2 1 U-236 0.000000 0.000000 +37 1 2 1 U-238 0.000000 0.000000 +38 1 2 1 Np-237 0.000000 0.000000 +39 1 2 1 Pu-238 0.000000 0.000000 +40 1 2 1 Pu-239 0.000000 0.000000 +41 1 2 1 Pu-240 0.000000 0.000000 +42 1 2 1 Pu-241 0.000000 0.000000 +43 1 2 1 Pu-242 0.000000 0.000000 +44 1 2 1 Am-241 0.000000 0.000000 +45 1 2 1 Am-242m 0.000000 0.000000 +46 1 2 1 Am-243 0.000000 0.000000 +47 1 2 1 Cm-242 0.000000 0.000000 +48 1 2 1 Cm-243 0.000000 0.000000 +49 1 2 1 Cm-244 0.000000 0.000000 +50 1 2 1 Cm-245 0.000000 0.000000 +51 1 2 1 Mo-95 0.000000 0.000000 +52 1 2 1 Tc-99 0.000000 0.000000 +53 1 2 1 Ru-101 0.000000 0.000000 +54 1 2 1 Ru-103 0.000000 0.000000 +55 1 2 1 Ag-109 0.000000 0.000000 +56 1 2 1 Xe-135 0.000000 0.000000 +57 1 2 1 Cs-133 0.000000 0.000000 +58 1 2 1 Nd-143 0.000000 0.000000 +59 1 2 1 Nd-145 0.000000 0.000000 +60 1 2 1 Sm-147 0.000000 0.000000 +61 1 2 1 Sm-149 0.000000 0.000000 +62 1 2 1 Sm-150 0.000000 0.000000 +63 1 2 1 Sm-151 0.000000 0.000000 +64 1 2 1 Sm-152 0.000000 0.000000 +65 1 2 1 Eu-153 0.000000 0.000000 +66 1 2 1 Gd-155 0.000000 0.000000 +67 1 2 1 O-16 0.001948 0.001952 +0 1 2 2 U-234 0.000000 0.000000 +1 1 2 2 U-235 0.010470 0.006106 +2 1 2 2 U-236 0.000000 0.000000 +3 1 2 2 U-238 0.208109 0.039197 +4 1 2 2 Np-237 0.000000 0.000000 +5 1 2 2 Pu-238 0.000000 0.000000 +6 1 2 2 Pu-239 0.000000 0.000000 +7 1 2 2 Pu-240 0.000000 0.000000 +8 1 2 2 Pu-241 0.000000 0.000000 +9 1 2 2 Pu-242 0.000000 0.000000 +10 1 2 2 Am-241 0.000000 0.000000 +11 1 2 2 Am-242m 0.000000 0.000000 +12 1 2 2 Am-243 0.000000 0.000000 +13 1 2 2 Cm-242 0.000000 0.000000 +14 1 2 2 Cm-243 0.000000 0.000000 +15 1 2 2 Cm-244 0.000000 0.000000 +16 1 2 2 Cm-245 0.000000 0.000000 +17 1 2 2 Mo-95 0.000302 0.002551 +18 1 2 2 Tc-99 0.003544 0.002528 +19 1 2 2 Ru-101 0.000000 0.000000 +20 1 2 2 Ru-103 0.000000 0.000000 +21 1 2 2 Ag-109 0.000000 0.000000 +22 1 2 2 Xe-135 0.000000 0.000000 +23 1 2 2 Cs-133 0.000000 0.000000 +24 1 2 2 Nd-143 0.002636 0.002073 +25 1 2 2 Nd-145 0.000000 0.000000 +26 1 2 2 Sm-147 0.000000 0.000000 +27 1 2 2 Sm-149 0.000000 0.000000 +28 1 2 2 Sm-150 0.000000 0.000000 +29 1 2 2 Sm-151 0.000000 0.000000 +30 1 2 2 Sm-152 0.000000 0.000000 +31 1 2 2 Eu-153 0.001686 0.001968 +32 1 2 2 Gd-155 0.000000 0.000000 +33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. +34 1 1 U-234 0 0.000000 +35 1 1 U-235 1 0.127079 +36 1 1 U-236 0 0.000000 +37 1 1 U-238 1 0.153215 +38 1 1 Np-237 0 0.000000 +39 1 1 Pu-238 0 0.000000 +40 1 1 Pu-239 1 0.150979 +41 1 1 Pu-240 0 0.000000 +42 1 1 Pu-241 1 0.203534 +43 1 1 Pu-242 0 0.000000 +44 1 1 Am-241 0 0.000000 +45 1 1 Am-242m 0 0.000000 +46 1 1 Am-243 0 0.000000 +47 1 1 Cm-242 0 0.000000 +48 1 1 Cm-243 0 0.000000 +49 1 1 Cm-244 0 0.000000 +50 1 1 Cm-245 0 0.000000 +51 1 1 Mo-95 0 0.000000 +52 1 1 Tc-99 0 0.000000 +53 1 1 Ru-101 0 0.000000 +54 1 1 Ru-103 0 0.000000 +55 1 1 Ag-109 0 0.000000 +56 1 1 Xe-135 0 0.000000 +57 1 1 Cs-133 0 0.000000 +58 1 1 Nd-143 0 0.000000 +59 1 1 Nd-145 0 0.000000 +60 1 1 Sm-147 0 0.000000 +61 1 1 Sm-149 0 0.000000 +62 1 1 Sm-150 0 0.000000 +63 1 1 Sm-151 0 0.000000 +64 1 1 Sm-152 0 0.000000 +65 1 1 Eu-153 0 0.000000 +66 1 1 Gd-155 0 0.000000 +67 1 1 O-16 0 0.000000 +0 1 2 U-234 0 0.000000 +1 1 2 U-235 0 0.000000 +2 1 2 U-236 0 0.000000 +3 1 2 U-238 0 0.000000 +4 1 2 Np-237 0 0.000000 +5 1 2 Pu-238 0 0.000000 +6 1 2 Pu-239 0 0.000000 +7 1 2 Pu-240 0 0.000000 +8 1 2 Pu-241 0 0.000000 +9 1 2 Pu-242 0 0.000000 +10 1 2 Am-241 0 0.000000 +11 1 2 Am-242m 0 0.000000 +12 1 2 Am-243 0 0.000000 +13 1 2 Cm-242 0 0.000000 +14 1 2 Cm-243 0 0.000000 +15 1 2 Cm-244 0 0.000000 +16 1 2 Cm-245 0 0.000000 +17 1 2 Mo-95 0 0.000000 +18 1 2 Tc-99 0 0.000000 +19 1 2 Ru-101 0 0.000000 +20 1 2 Ru-103 0 0.000000 +21 1 2 Ag-109 0 0.000000 +22 1 2 Xe-135 0 0.000000 +23 1 2 Cs-133 0 0.000000 +24 1 2 Nd-143 0 0.000000 +25 1 2 Nd-145 0 0.000000 +26 1 2 Sm-147 0 0.000000 +27 1 2 Sm-149 0 0.000000 +28 1 2 Sm-150 0 0.000000 +29 1 2 Sm-151 0 0.000000 +30 1 2 Sm-152 0 0.000000 +31 1 2 Eu-153 0 0.000000 +32 1 2 Gd-155 0 0.000000 +33 1 2 O-16 0 0.000000 material group in nuclide mean std. dev. +5 2 1 Zr-90 0.118578 0.008347 +6 2 1 Zr-91 0.040887 0.002988 +7 2 1 Zr-92 0.033882 0.004365 +8 2 1 Zr-94 0.046281 0.005422 +9 2 1 Zr-96 0.005415 0.002113 +0 2 2 Zr-90 0.122479 0.032627 +1 2 2 Zr-91 0.035669 0.009683 +2 2 2 Zr-92 0.049331 0.021936 +3 2 2 Zr-94 0.058978 0.020081 +4 2 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. +5 2 1 Zr-90 0 0 +6 2 1 Zr-91 0 0 +7 2 1 Zr-92 0 0 +8 2 1 Zr-94 0 0 +9 2 1 Zr-96 0 0 +0 2 2 Zr-90 0 0 +1 2 2 Zr-91 0 0 +2 2 2 Zr-92 0 0 +3 2 2 Zr-94 0 0 +4 2 2 Zr-96 0 0 material group in group out nuclide mean std. dev. +15 2 1 1 Zr-90 0.118578 0.008347 +16 2 1 1 Zr-91 0.039963 0.003053 +17 2 1 1 Zr-92 0.033882 0.004365 +18 2 1 1 Zr-94 0.046281 0.005422 +19 2 1 1 Zr-96 0.004953 0.002087 +10 2 1 2 Zr-90 0.000000 0.000000 +11 2 1 2 Zr-91 0.000000 0.000000 +12 2 1 2 Zr-92 0.000000 0.000000 +13 2 1 2 Zr-94 0.000000 0.000000 +14 2 1 2 Zr-96 0.000000 0.000000 +5 2 2 1 Zr-90 0.000000 0.000000 +6 2 2 1 Zr-91 0.000000 0.000000 +7 2 2 1 Zr-92 0.000000 0.000000 +8 2 2 1 Zr-94 0.000000 0.000000 +9 2 2 1 Zr-96 0.000000 0.000000 +0 2 2 2 Zr-90 0.122479 0.032627 +1 2 2 2 Zr-91 0.023998 0.011915 +2 2 2 2 Zr-92 0.049331 0.021936 +3 2 2 2 Zr-94 0.058978 0.020081 +4 2 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +5 2 1 Zr-90 0 0 +6 2 1 Zr-91 0 0 +7 2 1 Zr-92 0 0 +8 2 1 Zr-94 0 0 +9 2 1 Zr-96 0 0 +0 2 2 Zr-90 0 0 +1 2 2 Zr-91 0 0 +2 2 2 Zr-92 0 0 +3 2 2 Zr-94 0 0 +4 2 2 Zr-96 0 0 material group in nuclide mean std. dev. +4 3 1 H-1 0.206179 0.034791 +5 3 1 O-16 0.075190 0.004750 +6 3 1 B-10 0.000741 0.000470 +7 3 1 B-11 0.000167 0.000208 +0 3 2 H-1 1.323003 0.239067 +1 3 2 O-16 0.071243 0.013291 +2 3 2 B-10 0.033075 0.004283 +3 3 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev. +4 3 1 H-1 0 0 +5 3 1 O-16 0 0 +6 3 1 B-10 0 0 +7 3 1 B-11 0 0 +0 3 2 H-1 0 0 +1 3 2 O-16 0 0 +2 3 2 B-10 0 0 +3 3 2 B-11 0 0 material group in group out nuclide mean std. dev. +12 3 1 1 H-1 0.178758 0.033618 +13 3 1 1 O-16 0.075042 0.004782 +14 3 1 1 B-10 0.000000 0.000000 +15 3 1 1 B-11 0.000167 0.000208 +8 3 1 2 H-1 0.027124 0.001806 +9 3 1 2 O-16 0.000148 0.000148 +10 3 1 2 B-10 0.000000 0.000000 +11 3 1 2 B-11 0.000000 0.000000 +4 3 2 1 H-1 0.000000 0.000000 +5 3 2 1 O-16 0.000000 0.000000 +6 3 2 1 B-10 0.000000 0.000000 +7 3 2 1 B-11 0.000000 0.000000 +0 3 2 2 H-1 1.305284 0.235145 +1 3 2 2 O-16 0.071243 0.013291 +2 3 2 2 B-10 0.000000 0.000000 +3 3 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev. +4 3 1 H-1 0 0 +5 3 1 O-16 0 0 +6 3 1 B-10 0 0 +7 3 1 B-11 0 0 +0 3 2 H-1 0 0 +1 3 2 O-16 0 0 +2 3 2 B-10 0 0 +3 3 2 B-11 0 0 material group in nuclide mean std. dev. +4 4 1 H-1 0.188813 0.045599 +5 4 1 O-16 0.066636 0.008217 +6 4 1 B-10 0.000232 0.000233 +7 4 1 B-11 0.000042 0.000300 +0 4 2 H-1 1.088920 0.221595 +1 4 2 O-16 0.064481 0.014318 +2 4 2 B-10 0.026367 0.010478 +3 4 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev. +4 4 1 H-1 0 0 +5 4 1 O-16 0 0 +6 4 1 B-10 0 0 +7 4 1 B-11 0 0 +0 4 2 H-1 0 0 +1 4 2 O-16 0 0 +2 4 2 B-10 0 0 +3 4 2 B-11 0 0 material group in group out nuclide mean std. dev. +12 4 1 1 H-1 0.166764 0.043861 +13 4 1 1 O-16 0.066172 0.007943 +14 4 1 1 B-10 0.000000 0.000000 +15 4 1 1 B-11 0.000042 0.000300 +8 4 1 2 H-1 0.021817 0.002327 +9 4 1 2 O-16 0.000464 0.000466 +10 4 1 2 B-10 0.000000 0.000000 +11 4 1 2 B-11 0.000000 0.000000 +4 4 2 1 H-1 0.000000 0.000000 +5 4 2 1 O-16 0.000000 0.000000 +6 4 2 1 B-10 0.000000 0.000000 +7 4 2 1 B-11 0.000000 0.000000 +0 4 2 2 H-1 1.082328 0.222438 +1 4 2 2 O-16 0.064481 0.014318 +2 4 2 2 B-10 0.000000 0.000000 +3 4 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev. +4 4 1 H-1 0 0 +5 4 1 O-16 0 0 +6 4 1 B-10 0 0 +7 4 1 B-11 0 0 +0 4 2 H-1 0 0 +1 4 2 O-16 0 0 +2 4 2 B-10 0 0 +3 4 2 B-11 0 0 material group in nuclide mean std. dev. +27 5 1 Fe-54 0 0 +28 5 1 Fe-56 0 0 +29 5 1 Fe-57 0 0 +30 5 1 Fe-58 0 0 +31 5 1 Ni-58 0 0 +32 5 1 Ni-60 0 0 +33 5 1 Ni-61 0 0 +34 5 1 Ni-62 0 0 +35 5 1 Ni-64 0 0 +36 5 1 Mn-55 0 0 +37 5 1 Mo-92 0 0 +38 5 1 Mo-94 0 0 +39 5 1 Mo-95 0 0 +40 5 1 Mo-96 0 0 +41 5 1 Mo-97 0 0 +42 5 1 Mo-98 0 0 +43 5 1 Mo-100 0 0 +44 5 1 Si-28 0 0 +45 5 1 Si-29 0 0 +46 5 1 Si-30 0 0 +47 5 1 Cr-50 0 0 +48 5 1 Cr-52 0 0 +49 5 1 Cr-53 0 0 +50 5 1 Cr-54 0 0 +51 5 1 C-Nat 0 0 +52 5 1 Cu-63 0 0 +53 5 1 Cu-65 0 0 +0 5 2 Fe-54 0 0 +1 5 2 Fe-56 0 0 +2 5 2 Fe-57 0 0 +3 5 2 Fe-58 0 0 +4 5 2 Ni-58 0 0 +5 5 2 Ni-60 0 0 +6 5 2 Ni-61 0 0 +7 5 2 Ni-62 0 0 +8 5 2 Ni-64 0 0 +9 5 2 Mn-55 0 0 +10 5 2 Mo-92 0 0 +11 5 2 Mo-94 0 0 +12 5 2 Mo-95 0 0 +13 5 2 Mo-96 0 0 +14 5 2 Mo-97 0 0 +15 5 2 Mo-98 0 0 +16 5 2 Mo-100 0 0 +17 5 2 Si-28 0 0 +18 5 2 Si-29 0 0 +19 5 2 Si-30 0 0 +20 5 2 Cr-50 0 0 +21 5 2 Cr-52 0 0 +22 5 2 Cr-53 0 0 +23 5 2 Cr-54 0 0 +24 5 2 C-Nat 0 0 +25 5 2 Cu-63 0 0 +26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. +27 5 1 Fe-54 0 0 +28 5 1 Fe-56 0 0 +29 5 1 Fe-57 0 0 +30 5 1 Fe-58 0 0 +31 5 1 Ni-58 0 0 +32 5 1 Ni-60 0 0 +33 5 1 Ni-61 0 0 +34 5 1 Ni-62 0 0 +35 5 1 Ni-64 0 0 +36 5 1 Mn-55 0 0 +37 5 1 Mo-92 0 0 +38 5 1 Mo-94 0 0 +39 5 1 Mo-95 0 0 +40 5 1 Mo-96 0 0 +41 5 1 Mo-97 0 0 +42 5 1 Mo-98 0 0 +43 5 1 Mo-100 0 0 +44 5 1 Si-28 0 0 +45 5 1 Si-29 0 0 +46 5 1 Si-30 0 0 +47 5 1 Cr-50 0 0 +48 5 1 Cr-52 0 0 +49 5 1 Cr-53 0 0 +50 5 1 Cr-54 0 0 +51 5 1 C-Nat 0 0 +52 5 1 Cu-63 0 0 +53 5 1 Cu-65 0 0 +0 5 2 Fe-54 0 0 +1 5 2 Fe-56 0 0 +2 5 2 Fe-57 0 0 +3 5 2 Fe-58 0 0 +4 5 2 Ni-58 0 0 +5 5 2 Ni-60 0 0 +6 5 2 Ni-61 0 0 +7 5 2 Ni-62 0 0 +8 5 2 Ni-64 0 0 +9 5 2 Mn-55 0 0 +10 5 2 Mo-92 0 0 +11 5 2 Mo-94 0 0 +12 5 2 Mo-95 0 0 +13 5 2 Mo-96 0 0 +14 5 2 Mo-97 0 0 +15 5 2 Mo-98 0 0 +16 5 2 Mo-100 0 0 +17 5 2 Si-28 0 0 +18 5 2 Si-29 0 0 +19 5 2 Si-30 0 0 +20 5 2 Cr-50 0 0 +21 5 2 Cr-52 0 0 +22 5 2 Cr-53 0 0 +23 5 2 Cr-54 0 0 +24 5 2 C-Nat 0 0 +25 5 2 Cu-63 0 0 +26 5 2 Cu-65 0 0 material group in group out nuclide mean std. dev. +81 5 1 1 Fe-54 0 0 +82 5 1 1 Fe-56 0 0 +83 5 1 1 Fe-57 0 0 +84 5 1 1 Fe-58 0 0 +85 5 1 1 Ni-58 0 0 +86 5 1 1 Ni-60 0 0 +87 5 1 1 Ni-61 0 0 +88 5 1 1 Ni-62 0 0 +89 5 1 1 Ni-64 0 0 +90 5 1 1 Mn-55 0 0 +91 5 1 1 Mo-92 0 0 +92 5 1 1 Mo-94 0 0 +93 5 1 1 Mo-95 0 0 +94 5 1 1 Mo-96 0 0 +95 5 1 1 Mo-97 0 0 +96 5 1 1 Mo-98 0 0 +97 5 1 1 Mo-100 0 0 +98 5 1 1 Si-28 0 0 +99 5 1 1 Si-29 0 0 +100 5 1 1 Si-30 0 0 +101 5 1 1 Cr-50 0 0 +102 5 1 1 Cr-52 0 0 +103 5 1 1 Cr-53 0 0 +104 5 1 1 Cr-54 0 0 +105 5 1 1 C-Nat 0 0 +106 5 1 1 Cu-63 0 0 +107 5 1 1 Cu-65 0 0 +54 5 1 2 Fe-54 0 0 +55 5 1 2 Fe-56 0 0 +56 5 1 2 Fe-57 0 0 +57 5 1 2 Fe-58 0 0 +58 5 1 2 Ni-58 0 0 +59 5 1 2 Ni-60 0 0 +60 5 1 2 Ni-61 0 0 +61 5 1 2 Ni-62 0 0 +62 5 1 2 Ni-64 0 0 +63 5 1 2 Mn-55 0 0 +64 5 1 2 Mo-92 0 0 +65 5 1 2 Mo-94 0 0 +66 5 1 2 Mo-95 0 0 +67 5 1 2 Mo-96 0 0 +68 5 1 2 Mo-97 0 0 +69 5 1 2 Mo-98 0 0 +70 5 1 2 Mo-100 0 0 +71 5 1 2 Si-28 0 0 +72 5 1 2 Si-29 0 0 +73 5 1 2 Si-30 0 0 +74 5 1 2 Cr-50 0 0 +75 5 1 2 Cr-52 0 0 +76 5 1 2 Cr-53 0 0 +77 5 1 2 Cr-54 0 0 +78 5 1 2 C-Nat 0 0 +79 5 1 2 Cu-63 0 0 +80 5 1 2 Cu-65 0 0 +27 5 2 1 Fe-54 0 0 +28 5 2 1 Fe-56 0 0 +29 5 2 1 Fe-57 0 0 +30 5 2 1 Fe-58 0 0 +31 5 2 1 Ni-58 0 0 +32 5 2 1 Ni-60 0 0 +33 5 2 1 Ni-61 0 0 +34 5 2 1 Ni-62 0 0 +35 5 2 1 Ni-64 0 0 +36 5 2 1 Mn-55 0 0 +37 5 2 1 Mo-92 0 0 +38 5 2 1 Mo-94 0 0 +39 5 2 1 Mo-95 0 0 +40 5 2 1 Mo-96 0 0 +41 5 2 1 Mo-97 0 0 +42 5 2 1 Mo-98 0 0 +43 5 2 1 Mo-100 0 0 +44 5 2 1 Si-28 0 0 +45 5 2 1 Si-29 0 0 +46 5 2 1 Si-30 0 0 +47 5 2 1 Cr-50 0 0 +48 5 2 1 Cr-52 0 0 +49 5 2 1 Cr-53 0 0 +50 5 2 1 Cr-54 0 0 +51 5 2 1 C-Nat 0 0 +52 5 2 1 Cu-63 0 0 +53 5 2 1 Cu-65 0 0 +0 5 2 2 Fe-54 0 0 +1 5 2 2 Fe-56 0 0 +2 5 2 2 Fe-57 0 0 +3 5 2 2 Fe-58 0 0 +4 5 2 2 Ni-58 0 0 +5 5 2 2 Ni-60 0 0 +6 5 2 2 Ni-61 0 0 +7 5 2 2 Ni-62 0 0 +8 5 2 2 Ni-64 0 0 +9 5 2 2 Mn-55 0 0 +10 5 2 2 Mo-92 0 0 +11 5 2 2 Mo-94 0 0 +12 5 2 2 Mo-95 0 0 +13 5 2 2 Mo-96 0 0 +14 5 2 2 Mo-97 0 0 +15 5 2 2 Mo-98 0 0 +16 5 2 2 Mo-100 0 0 +17 5 2 2 Si-28 0 0 +18 5 2 2 Si-29 0 0 +19 5 2 2 Si-30 0 0 +20 5 2 2 Cr-50 0 0 +21 5 2 2 Cr-52 0 0 +22 5 2 2 Cr-53 0 0 +23 5 2 2 Cr-54 0 0 +24 5 2 2 C-Nat 0 0 +25 5 2 2 Cu-63 0 0 +26 5 2 2 Cu-65 0 0 material group out nuclide mean std. dev. +27 5 1 Fe-54 0 0 +28 5 1 Fe-56 0 0 +29 5 1 Fe-57 0 0 +30 5 1 Fe-58 0 0 +31 5 1 Ni-58 0 0 +32 5 1 Ni-60 0 0 +33 5 1 Ni-61 0 0 +34 5 1 Ni-62 0 0 +35 5 1 Ni-64 0 0 +36 5 1 Mn-55 0 0 +37 5 1 Mo-92 0 0 +38 5 1 Mo-94 0 0 +39 5 1 Mo-95 0 0 +40 5 1 Mo-96 0 0 +41 5 1 Mo-97 0 0 +42 5 1 Mo-98 0 0 +43 5 1 Mo-100 0 0 +44 5 1 Si-28 0 0 +45 5 1 Si-29 0 0 +46 5 1 Si-30 0 0 +47 5 1 Cr-50 0 0 +48 5 1 Cr-52 0 0 +49 5 1 Cr-53 0 0 +50 5 1 Cr-54 0 0 +51 5 1 C-Nat 0 0 +52 5 1 Cu-63 0 0 +53 5 1 Cu-65 0 0 +0 5 2 Fe-54 0 0 +1 5 2 Fe-56 0 0 +2 5 2 Fe-57 0 0 +3 5 2 Fe-58 0 0 +4 5 2 Ni-58 0 0 +5 5 2 Ni-60 0 0 +6 5 2 Ni-61 0 0 +7 5 2 Ni-62 0 0 +8 5 2 Ni-64 0 0 +9 5 2 Mn-55 0 0 +10 5 2 Mo-92 0 0 +11 5 2 Mo-94 0 0 +12 5 2 Mo-95 0 0 +13 5 2 Mo-96 0 0 +14 5 2 Mo-97 0 0 +15 5 2 Mo-98 0 0 +16 5 2 Mo-100 0 0 +17 5 2 Si-28 0 0 +18 5 2 Si-29 0 0 +19 5 2 Si-30 0 0 +20 5 2 Cr-50 0 0 +21 5 2 Cr-52 0 0 +22 5 2 Cr-53 0 0 +23 5 2 Cr-54 0 0 +24 5 2 C-Nat 0 0 +25 5 2 Cu-63 0 0 +26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 6 1 1 H-1 0 0 +64 6 1 1 O-16 0 0 +65 6 1 1 B-10 0 0 +66 6 1 1 B-11 0 0 +67 6 1 1 Fe-54 0 0 +68 6 1 1 Fe-56 0 0 +69 6 1 1 Fe-57 0 0 +70 6 1 1 Fe-58 0 0 +71 6 1 1 Ni-58 0 0 +72 6 1 1 Ni-60 0 0 +73 6 1 1 Ni-61 0 0 +74 6 1 1 Ni-62 0 0 +75 6 1 1 Ni-64 0 0 +76 6 1 1 Mn-55 0 0 +77 6 1 1 Si-28 0 0 +78 6 1 1 Si-29 0 0 +79 6 1 1 Si-30 0 0 +80 6 1 1 Cr-50 0 0 +81 6 1 1 Cr-52 0 0 +82 6 1 1 Cr-53 0 0 +83 6 1 1 Cr-54 0 0 +42 6 1 2 H-1 0 0 +43 6 1 2 O-16 0 0 +44 6 1 2 B-10 0 0 +45 6 1 2 B-11 0 0 +46 6 1 2 Fe-54 0 0 +47 6 1 2 Fe-56 0 0 +48 6 1 2 Fe-57 0 0 +49 6 1 2 Fe-58 0 0 +50 6 1 2 Ni-58 0 0 +51 6 1 2 Ni-60 0 0 +52 6 1 2 Ni-61 0 0 +53 6 1 2 Ni-62 0 0 +54 6 1 2 Ni-64 0 0 +55 6 1 2 Mn-55 0 0 +56 6 1 2 Si-28 0 0 +57 6 1 2 Si-29 0 0 +58 6 1 2 Si-30 0 0 +59 6 1 2 Cr-50 0 0 +60 6 1 2 Cr-52 0 0 +61 6 1 2 Cr-53 0 0 +62 6 1 2 Cr-54 0 0 +21 6 2 1 H-1 0 0 +22 6 2 1 O-16 0 0 +23 6 2 1 B-10 0 0 +24 6 2 1 B-11 0 0 +25 6 2 1 Fe-54 0 0 +26 6 2 1 Fe-56 0 0 +27 6 2 1 Fe-57 0 0 +28 6 2 1 Fe-58 0 0 +29 6 2 1 Ni-58 0 0 +30 6 2 1 Ni-60 0 0 +31 6 2 1 Ni-61 0 0 +32 6 2 1 Ni-62 0 0 +33 6 2 1 Ni-64 0 0 +34 6 2 1 Mn-55 0 0 +35 6 2 1 Si-28 0 0 +36 6 2 1 Si-29 0 0 +37 6 2 1 Si-30 0 0 +38 6 2 1 Cr-50 0 0 +39 6 2 1 Cr-52 0 0 +40 6 2 1 Cr-53 0 0 +41 6 2 1 Cr-54 0 0 +0 6 2 2 H-1 0 0 +1 6 2 2 O-16 0 0 +2 6 2 2 B-10 0 0 +3 6 2 2 B-11 0 0 +4 6 2 2 Fe-54 0 0 +5 6 2 2 Fe-56 0 0 +6 6 2 2 Fe-57 0 0 +7 6 2 2 Fe-58 0 0 +8 6 2 2 Ni-58 0 0 +9 6 2 2 Ni-60 0 0 +10 6 2 2 Ni-61 0 0 +11 6 2 2 Ni-62 0 0 +12 6 2 2 Ni-64 0 0 +13 6 2 2 Mn-55 0 0 +14 6 2 2 Si-28 0 0 +15 6 2 2 Si-29 0 0 +16 6 2 2 Si-30 0 0 +17 6 2 2 Cr-50 0 0 +18 6 2 2 Cr-52 0 0 +19 6 2 2 Cr-53 0 0 +20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 7 1 H-1 0 0 +22 7 1 O-16 0 0 +23 7 1 B-10 0 0 +24 7 1 B-11 0 0 +25 7 1 Fe-54 0 0 +26 7 1 Fe-56 0 0 +27 7 1 Fe-57 0 0 +28 7 1 Fe-58 0 0 +29 7 1 Ni-58 0 0 +30 7 1 Ni-60 0 0 +31 7 1 Ni-61 0 0 +32 7 1 Ni-62 0 0 +33 7 1 Ni-64 0 0 +34 7 1 Mn-55 0 0 +35 7 1 Si-28 0 0 +36 7 1 Si-29 0 0 +37 7 1 Si-30 0 0 +38 7 1 Cr-50 0 0 +39 7 1 Cr-52 0 0 +40 7 1 Cr-53 0 0 +41 7 1 Cr-54 0 0 +0 7 2 H-1 0 0 +1 7 2 O-16 0 0 +2 7 2 B-10 0 0 +3 7 2 B-11 0 0 +4 7 2 Fe-54 0 0 +5 7 2 Fe-56 0 0 +6 7 2 Fe-57 0 0 +7 7 2 Fe-58 0 0 +8 7 2 Ni-58 0 0 +9 7 2 Ni-60 0 0 +10 7 2 Ni-61 0 0 +11 7 2 Ni-62 0 0 +12 7 2 Ni-64 0 0 +13 7 2 Mn-55 0 0 +14 7 2 Si-28 0 0 +15 7 2 Si-29 0 0 +16 7 2 Si-30 0 0 +17 7 2 Cr-50 0 0 +18 7 2 Cr-52 0 0 +19 7 2 Cr-53 0 0 +20 7 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 7 1 H-1 0 0 +22 7 1 O-16 0 0 +23 7 1 B-10 0 0 +24 7 1 B-11 0 0 +25 7 1 Fe-54 0 0 +26 7 1 Fe-56 0 0 +27 7 1 Fe-57 0 0 +28 7 1 Fe-58 0 0 +29 7 1 Ni-58 0 0 +30 7 1 Ni-60 0 0 +31 7 1 Ni-61 0 0 +32 7 1 Ni-62 0 0 +33 7 1 Ni-64 0 0 +34 7 1 Mn-55 0 0 +35 7 1 Si-28 0 0 +36 7 1 Si-29 0 0 +37 7 1 Si-30 0 0 +38 7 1 Cr-50 0 0 +39 7 1 Cr-52 0 0 +40 7 1 Cr-53 0 0 +41 7 1 Cr-54 0 0 +0 7 2 H-1 0 0 +1 7 2 O-16 0 0 +2 7 2 B-10 0 0 +3 7 2 B-11 0 0 +4 7 2 Fe-54 0 0 +5 7 2 Fe-56 0 0 +6 7 2 Fe-57 0 0 +7 7 2 Fe-58 0 0 +8 7 2 Ni-58 0 0 +9 7 2 Ni-60 0 0 +10 7 2 Ni-61 0 0 +11 7 2 Ni-62 0 0 +12 7 2 Ni-64 0 0 +13 7 2 Mn-55 0 0 +14 7 2 Si-28 0 0 +15 7 2 Si-29 0 0 +16 7 2 Si-30 0 0 +17 7 2 Cr-50 0 0 +18 7 2 Cr-52 0 0 +19 7 2 Cr-53 0 0 +20 7 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 7 1 1 H-1 0 0 +64 7 1 1 O-16 0 0 +65 7 1 1 B-10 0 0 +66 7 1 1 B-11 0 0 +67 7 1 1 Fe-54 0 0 +68 7 1 1 Fe-56 0 0 +69 7 1 1 Fe-57 0 0 +70 7 1 1 Fe-58 0 0 +71 7 1 1 Ni-58 0 0 +72 7 1 1 Ni-60 0 0 +73 7 1 1 Ni-61 0 0 +74 7 1 1 Ni-62 0 0 +75 7 1 1 Ni-64 0 0 +76 7 1 1 Mn-55 0 0 +77 7 1 1 Si-28 0 0 +78 7 1 1 Si-29 0 0 +79 7 1 1 Si-30 0 0 +80 7 1 1 Cr-50 0 0 +81 7 1 1 Cr-52 0 0 +82 7 1 1 Cr-53 0 0 +83 7 1 1 Cr-54 0 0 +42 7 1 2 H-1 0 0 +43 7 1 2 O-16 0 0 +44 7 1 2 B-10 0 0 +45 7 1 2 B-11 0 0 +46 7 1 2 Fe-54 0 0 +47 7 1 2 Fe-56 0 0 +48 7 1 2 Fe-57 0 0 +49 7 1 2 Fe-58 0 0 +50 7 1 2 Ni-58 0 0 +51 7 1 2 Ni-60 0 0 +52 7 1 2 Ni-61 0 0 +53 7 1 2 Ni-62 0 0 +54 7 1 2 Ni-64 0 0 +55 7 1 2 Mn-55 0 0 +56 7 1 2 Si-28 0 0 +57 7 1 2 Si-29 0 0 +58 7 1 2 Si-30 0 0 +59 7 1 2 Cr-50 0 0 +60 7 1 2 Cr-52 0 0 +61 7 1 2 Cr-53 0 0 +62 7 1 2 Cr-54 0 0 +21 7 2 1 H-1 0 0 +22 7 2 1 O-16 0 0 +23 7 2 1 B-10 0 0 +24 7 2 1 B-11 0 0 +25 7 2 1 Fe-54 0 0 +26 7 2 1 Fe-56 0 0 +27 7 2 1 Fe-57 0 0 +28 7 2 1 Fe-58 0 0 +29 7 2 1 Ni-58 0 0 +30 7 2 1 Ni-60 0 0 +31 7 2 1 Ni-61 0 0 +32 7 2 1 Ni-62 0 0 +33 7 2 1 Ni-64 0 0 +34 7 2 1 Mn-55 0 0 +35 7 2 1 Si-28 0 0 +36 7 2 1 Si-29 0 0 +37 7 2 1 Si-30 0 0 +38 7 2 1 Cr-50 0 0 +39 7 2 1 Cr-52 0 0 +40 7 2 1 Cr-53 0 0 +41 7 2 1 Cr-54 0 0 +0 7 2 2 H-1 0 0 +1 7 2 2 O-16 0 0 +2 7 2 2 B-10 0 0 +3 7 2 2 B-11 0 0 +4 7 2 2 Fe-54 0 0 +5 7 2 2 Fe-56 0 0 +6 7 2 2 Fe-57 0 0 +7 7 2 2 Fe-58 0 0 +8 7 2 2 Ni-58 0 0 +9 7 2 2 Ni-60 0 0 +10 7 2 2 Ni-61 0 0 +11 7 2 2 Ni-62 0 0 +12 7 2 2 Ni-64 0 0 +13 7 2 2 Mn-55 0 0 +14 7 2 2 Si-28 0 0 +15 7 2 2 Si-29 0 0 +16 7 2 2 Si-30 0 0 +17 7 2 2 Cr-50 0 0 +18 7 2 2 Cr-52 0 0 +19 7 2 2 Cr-53 0 0 +20 7 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 7 1 H-1 0 0 +22 7 1 O-16 0 0 +23 7 1 B-10 0 0 +24 7 1 B-11 0 0 +25 7 1 Fe-54 0 0 +26 7 1 Fe-56 0 0 +27 7 1 Fe-57 0 0 +28 7 1 Fe-58 0 0 +29 7 1 Ni-58 0 0 +30 7 1 Ni-60 0 0 +31 7 1 Ni-61 0 0 +32 7 1 Ni-62 0 0 +33 7 1 Ni-64 0 0 +34 7 1 Mn-55 0 0 +35 7 1 Si-28 0 0 +36 7 1 Si-29 0 0 +37 7 1 Si-30 0 0 +38 7 1 Cr-50 0 0 +39 7 1 Cr-52 0 0 +40 7 1 Cr-53 0 0 +41 7 1 Cr-54 0 0 +0 7 2 H-1 0 0 +1 7 2 O-16 0 0 +2 7 2 B-10 0 0 +3 7 2 B-11 0 0 +4 7 2 Fe-54 0 0 +5 7 2 Fe-56 0 0 +6 7 2 Fe-57 0 0 +7 7 2 Fe-58 0 0 +8 7 2 Ni-58 0 0 +9 7 2 Ni-60 0 0 +10 7 2 Ni-61 0 0 +11 7 2 Ni-62 0 0 +12 7 2 Ni-64 0 0 +13 7 2 Mn-55 0 0 +14 7 2 Si-28 0 0 +15 7 2 Si-29 0 0 +16 7 2 Si-30 0 0 +17 7 2 Cr-50 0 0 +18 7 2 Cr-52 0 0 +19 7 2 Cr-53 0 0 +20 7 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 8 1 H-1 0 0 +22 8 1 O-16 0 0 +23 8 1 B-10 0 0 +24 8 1 B-11 0 0 +25 8 1 Fe-54 0 0 +26 8 1 Fe-56 0 0 +27 8 1 Fe-57 0 0 +28 8 1 Fe-58 0 0 +29 8 1 Ni-58 0 0 +30 8 1 Ni-60 0 0 +31 8 1 Ni-61 0 0 +32 8 1 Ni-62 0 0 +33 8 1 Ni-64 0 0 +34 8 1 Mn-55 0 0 +35 8 1 Si-28 0 0 +36 8 1 Si-29 0 0 +37 8 1 Si-30 0 0 +38 8 1 Cr-50 0 0 +39 8 1 Cr-52 0 0 +40 8 1 Cr-53 0 0 +41 8 1 Cr-54 0 0 +0 8 2 H-1 0 0 +1 8 2 O-16 0 0 +2 8 2 B-10 0 0 +3 8 2 B-11 0 0 +4 8 2 Fe-54 0 0 +5 8 2 Fe-56 0 0 +6 8 2 Fe-57 0 0 +7 8 2 Fe-58 0 0 +8 8 2 Ni-58 0 0 +9 8 2 Ni-60 0 0 +10 8 2 Ni-61 0 0 +11 8 2 Ni-62 0 0 +12 8 2 Ni-64 0 0 +13 8 2 Mn-55 0 0 +14 8 2 Si-28 0 0 +15 8 2 Si-29 0 0 +16 8 2 Si-30 0 0 +17 8 2 Cr-50 0 0 +18 8 2 Cr-52 0 0 +19 8 2 Cr-53 0 0 +20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 8 1 H-1 0 0 +22 8 1 O-16 0 0 +23 8 1 B-10 0 0 +24 8 1 B-11 0 0 +25 8 1 Fe-54 0 0 +26 8 1 Fe-56 0 0 +27 8 1 Fe-57 0 0 +28 8 1 Fe-58 0 0 +29 8 1 Ni-58 0 0 +30 8 1 Ni-60 0 0 +31 8 1 Ni-61 0 0 +32 8 1 Ni-62 0 0 +33 8 1 Ni-64 0 0 +34 8 1 Mn-55 0 0 +35 8 1 Si-28 0 0 +36 8 1 Si-29 0 0 +37 8 1 Si-30 0 0 +38 8 1 Cr-50 0 0 +39 8 1 Cr-52 0 0 +40 8 1 Cr-53 0 0 +41 8 1 Cr-54 0 0 +0 8 2 H-1 0 0 +1 8 2 O-16 0 0 +2 8 2 B-10 0 0 +3 8 2 B-11 0 0 +4 8 2 Fe-54 0 0 +5 8 2 Fe-56 0 0 +6 8 2 Fe-57 0 0 +7 8 2 Fe-58 0 0 +8 8 2 Ni-58 0 0 +9 8 2 Ni-60 0 0 +10 8 2 Ni-61 0 0 +11 8 2 Ni-62 0 0 +12 8 2 Ni-64 0 0 +13 8 2 Mn-55 0 0 +14 8 2 Si-28 0 0 +15 8 2 Si-29 0 0 +16 8 2 Si-30 0 0 +17 8 2 Cr-50 0 0 +18 8 2 Cr-52 0 0 +19 8 2 Cr-53 0 0 +20 8 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 8 1 1 H-1 0 0 +64 8 1 1 O-16 0 0 +65 8 1 1 B-10 0 0 +66 8 1 1 B-11 0 0 +67 8 1 1 Fe-54 0 0 +68 8 1 1 Fe-56 0 0 +69 8 1 1 Fe-57 0 0 +70 8 1 1 Fe-58 0 0 +71 8 1 1 Ni-58 0 0 +72 8 1 1 Ni-60 0 0 +73 8 1 1 Ni-61 0 0 +74 8 1 1 Ni-62 0 0 +75 8 1 1 Ni-64 0 0 +76 8 1 1 Mn-55 0 0 +77 8 1 1 Si-28 0 0 +78 8 1 1 Si-29 0 0 +79 8 1 1 Si-30 0 0 +80 8 1 1 Cr-50 0 0 +81 8 1 1 Cr-52 0 0 +82 8 1 1 Cr-53 0 0 +83 8 1 1 Cr-54 0 0 +42 8 1 2 H-1 0 0 +43 8 1 2 O-16 0 0 +44 8 1 2 B-10 0 0 +45 8 1 2 B-11 0 0 +46 8 1 2 Fe-54 0 0 +47 8 1 2 Fe-56 0 0 +48 8 1 2 Fe-57 0 0 +49 8 1 2 Fe-58 0 0 +50 8 1 2 Ni-58 0 0 +51 8 1 2 Ni-60 0 0 +52 8 1 2 Ni-61 0 0 +53 8 1 2 Ni-62 0 0 +54 8 1 2 Ni-64 0 0 +55 8 1 2 Mn-55 0 0 +56 8 1 2 Si-28 0 0 +57 8 1 2 Si-29 0 0 +58 8 1 2 Si-30 0 0 +59 8 1 2 Cr-50 0 0 +60 8 1 2 Cr-52 0 0 +61 8 1 2 Cr-53 0 0 +62 8 1 2 Cr-54 0 0 +21 8 2 1 H-1 0 0 +22 8 2 1 O-16 0 0 +23 8 2 1 B-10 0 0 +24 8 2 1 B-11 0 0 +25 8 2 1 Fe-54 0 0 +26 8 2 1 Fe-56 0 0 +27 8 2 1 Fe-57 0 0 +28 8 2 1 Fe-58 0 0 +29 8 2 1 Ni-58 0 0 +30 8 2 1 Ni-60 0 0 +31 8 2 1 Ni-61 0 0 +32 8 2 1 Ni-62 0 0 +33 8 2 1 Ni-64 0 0 +34 8 2 1 Mn-55 0 0 +35 8 2 1 Si-28 0 0 +36 8 2 1 Si-29 0 0 +37 8 2 1 Si-30 0 0 +38 8 2 1 Cr-50 0 0 +39 8 2 1 Cr-52 0 0 +40 8 2 1 Cr-53 0 0 +41 8 2 1 Cr-54 0 0 +0 8 2 2 H-1 0 0 +1 8 2 2 O-16 0 0 +2 8 2 2 B-10 0 0 +3 8 2 2 B-11 0 0 +4 8 2 2 Fe-54 0 0 +5 8 2 2 Fe-56 0 0 +6 8 2 2 Fe-57 0 0 +7 8 2 2 Fe-58 0 0 +8 8 2 2 Ni-58 0 0 +9 8 2 2 Ni-60 0 0 +10 8 2 2 Ni-61 0 0 +11 8 2 2 Ni-62 0 0 +12 8 2 2 Ni-64 0 0 +13 8 2 2 Mn-55 0 0 +14 8 2 2 Si-28 0 0 +15 8 2 2 Si-29 0 0 +16 8 2 2 Si-30 0 0 +17 8 2 2 Cr-50 0 0 +18 8 2 2 Cr-52 0 0 +19 8 2 2 Cr-53 0 0 +20 8 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 8 1 H-1 0 0 +22 8 1 O-16 0 0 +23 8 1 B-10 0 0 +24 8 1 B-11 0 0 +25 8 1 Fe-54 0 0 +26 8 1 Fe-56 0 0 +27 8 1 Fe-57 0 0 +28 8 1 Fe-58 0 0 +29 8 1 Ni-58 0 0 +30 8 1 Ni-60 0 0 +31 8 1 Ni-61 0 0 +32 8 1 Ni-62 0 0 +33 8 1 Ni-64 0 0 +34 8 1 Mn-55 0 0 +35 8 1 Si-28 0 0 +36 8 1 Si-29 0 0 +37 8 1 Si-30 0 0 +38 8 1 Cr-50 0 0 +39 8 1 Cr-52 0 0 +40 8 1 Cr-53 0 0 +41 8 1 Cr-54 0 0 +0 8 2 H-1 0 0 +1 8 2 O-16 0 0 +2 8 2 B-10 0 0 +3 8 2 B-11 0 0 +4 8 2 Fe-54 0 0 +5 8 2 Fe-56 0 0 +6 8 2 Fe-57 0 0 +7 8 2 Fe-58 0 0 +8 8 2 Ni-58 0 0 +9 8 2 Ni-60 0 0 +10 8 2 Ni-61 0 0 +11 8 2 Ni-62 0 0 +12 8 2 Ni-64 0 0 +13 8 2 Mn-55 0 0 +14 8 2 Si-28 0 0 +15 8 2 Si-29 0 0 +16 8 2 Si-30 0 0 +17 8 2 Cr-50 0 0 +18 8 2 Cr-52 0 0 +19 8 2 Cr-53 0 0 +20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 9 1 H-1 0.106160 0.179178 +22 9 1 O-16 0.272020 0.171699 +23 9 1 B-10 0.000000 0.000000 +24 9 1 B-11 0.000000 0.000000 +25 9 1 Fe-54 0.000000 0.000000 +26 9 1 Fe-56 0.000000 0.000000 +27 9 1 Fe-57 0.000000 0.000000 +28 9 1 Fe-58 0.000000 0.000000 +29 9 1 Ni-58 0.000000 0.000000 +30 9 1 Ni-60 0.000000 0.000000 +31 9 1 Ni-61 0.000000 0.000000 +32 9 1 Ni-62 0.000000 0.000000 +33 9 1 Ni-64 0.000000 0.000000 +34 9 1 Mn-55 0.085133 0.082479 +35 9 1 Si-28 0.000000 0.000000 +36 9 1 Si-29 0.000000 0.000000 +37 9 1 Si-30 0.000000 0.000000 +38 9 1 Cr-50 0.000000 0.000000 +39 9 1 Cr-52 0.000000 0.000000 +40 9 1 Cr-53 0.040723 0.079827 +41 9 1 Cr-54 0.000000 0.000000 +0 9 2 H-1 1.417955 2.158027 +1 9 2 O-16 0.000000 0.000000 +2 9 2 B-10 0.269141 0.380622 +3 9 2 B-11 0.000000 0.000000 +4 9 2 Fe-54 0.000000 0.000000 +5 9 2 Fe-56 0.000000 0.000000 +6 9 2 Fe-57 0.000000 0.000000 +7 9 2 Fe-58 0.000000 0.000000 +8 9 2 Ni-58 0.000000 0.000000 +9 9 2 Ni-60 0.000000 0.000000 +10 9 2 Ni-61 0.000000 0.000000 +11 9 2 Ni-62 0.000000 0.000000 +12 9 2 Ni-64 0.000000 0.000000 +13 9 2 Mn-55 0.000000 0.000000 +14 9 2 Si-28 0.000000 0.000000 +15 9 2 Si-29 0.000000 0.000000 +16 9 2 Si-30 0.000000 0.000000 +17 9 2 Cr-50 0.000000 0.000000 +18 9 2 Cr-52 0.000000 0.000000 +19 9 2 Cr-53 0.000000 0.000000 +20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. +21 9 1 H-1 0 0 +22 9 1 O-16 0 0 +23 9 1 B-10 0 0 +24 9 1 B-11 0 0 +25 9 1 Fe-54 0 0 +26 9 1 Fe-56 0 0 +27 9 1 Fe-57 0 0 +28 9 1 Fe-58 0 0 +29 9 1 Ni-58 0 0 +30 9 1 Ni-60 0 0 +31 9 1 Ni-61 0 0 +32 9 1 Ni-62 0 0 +33 9 1 Ni-64 0 0 +34 9 1 Mn-55 0 0 +35 9 1 Si-28 0 0 +36 9 1 Si-29 0 0 +37 9 1 Si-30 0 0 +38 9 1 Cr-50 0 0 +39 9 1 Cr-52 0 0 +40 9 1 Cr-53 0 0 +41 9 1 Cr-54 0 0 +0 9 2 H-1 0 0 +1 9 2 O-16 0 0 +2 9 2 B-10 0 0 +3 9 2 B-11 0 0 +4 9 2 Fe-54 0 0 +5 9 2 Fe-56 0 0 +6 9 2 Fe-57 0 0 +7 9 2 Fe-58 0 0 +8 9 2 Ni-58 0 0 +9 9 2 Ni-60 0 0 +10 9 2 Ni-61 0 0 +11 9 2 Ni-62 0 0 +12 9 2 Ni-64 0 0 +13 9 2 Mn-55 0 0 +14 9 2 Si-28 0 0 +15 9 2 Si-29 0 0 +16 9 2 Si-30 0 0 +17 9 2 Cr-50 0 0 +18 9 2 Cr-52 0 0 +19 9 2 Cr-53 0 0 +20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 9 1 1 H-1 0.106160 0.179178 +64 9 1 1 O-16 0.272020 0.171699 +65 9 1 1 B-10 0.000000 0.000000 +66 9 1 1 B-11 0.000000 0.000000 +67 9 1 1 Fe-54 0.000000 0.000000 +68 9 1 1 Fe-56 0.000000 0.000000 +69 9 1 1 Fe-57 0.000000 0.000000 +70 9 1 1 Fe-58 0.000000 0.000000 +71 9 1 1 Ni-58 0.000000 0.000000 +72 9 1 1 Ni-60 0.000000 0.000000 +73 9 1 1 Ni-61 0.000000 0.000000 +74 9 1 1 Ni-62 0.000000 0.000000 +75 9 1 1 Ni-64 0.000000 0.000000 +76 9 1 1 Mn-55 0.085133 0.082479 +77 9 1 1 Si-28 0.000000 0.000000 +78 9 1 1 Si-29 0.000000 0.000000 +79 9 1 1 Si-30 0.000000 0.000000 +80 9 1 1 Cr-50 0.000000 0.000000 +81 9 1 1 Cr-52 0.000000 0.000000 +82 9 1 1 Cr-53 0.040723 0.079827 +83 9 1 1 Cr-54 0.000000 0.000000 +42 9 1 2 H-1 0.000000 0.000000 +43 9 1 2 O-16 0.000000 0.000000 +44 9 1 2 B-10 0.000000 0.000000 +45 9 1 2 B-11 0.000000 0.000000 +46 9 1 2 Fe-54 0.000000 0.000000 +47 9 1 2 Fe-56 0.000000 0.000000 +48 9 1 2 Fe-57 0.000000 0.000000 +49 9 1 2 Fe-58 0.000000 0.000000 +50 9 1 2 Ni-58 0.000000 0.000000 +51 9 1 2 Ni-60 0.000000 0.000000 +52 9 1 2 Ni-61 0.000000 0.000000 +53 9 1 2 Ni-62 0.000000 0.000000 +54 9 1 2 Ni-64 0.000000 0.000000 +55 9 1 2 Mn-55 0.000000 0.000000 +56 9 1 2 Si-28 0.000000 0.000000 +57 9 1 2 Si-29 0.000000 0.000000 +58 9 1 2 Si-30 0.000000 0.000000 +59 9 1 2 Cr-50 0.000000 0.000000 +60 9 1 2 Cr-52 0.000000 0.000000 +61 9 1 2 Cr-53 0.000000 0.000000 +62 9 1 2 Cr-54 0.000000 0.000000 +21 9 2 1 H-1 0.000000 0.000000 +22 9 2 1 O-16 0.000000 0.000000 +23 9 2 1 B-10 0.000000 0.000000 +24 9 2 1 B-11 0.000000 0.000000 +25 9 2 1 Fe-54 0.000000 0.000000 +26 9 2 1 Fe-56 0.000000 0.000000 +27 9 2 1 Fe-57 0.000000 0.000000 +28 9 2 1 Fe-58 0.000000 0.000000 +29 9 2 1 Ni-58 0.000000 0.000000 +30 9 2 1 Ni-60 0.000000 0.000000 +31 9 2 1 Ni-61 0.000000 0.000000 +32 9 2 1 Ni-62 0.000000 0.000000 +33 9 2 1 Ni-64 0.000000 0.000000 +34 9 2 1 Mn-55 0.000000 0.000000 +35 9 2 1 Si-28 0.000000 0.000000 +36 9 2 1 Si-29 0.000000 0.000000 +37 9 2 1 Si-30 0.000000 0.000000 +38 9 2 1 Cr-50 0.000000 0.000000 +39 9 2 1 Cr-52 0.000000 0.000000 +40 9 2 1 Cr-53 0.000000 0.000000 +41 9 2 1 Cr-54 0.000000 0.000000 +0 9 2 2 H-1 1.417955 2.158027 +1 9 2 2 O-16 0.000000 0.000000 +2 9 2 2 B-10 0.000000 0.000000 +3 9 2 2 B-11 0.000000 0.000000 +4 9 2 2 Fe-54 0.000000 0.000000 +5 9 2 2 Fe-56 0.000000 0.000000 +6 9 2 2 Fe-57 0.000000 0.000000 +7 9 2 2 Fe-58 0.000000 0.000000 +8 9 2 2 Ni-58 0.000000 0.000000 +9 9 2 2 Ni-60 0.000000 0.000000 +10 9 2 2 Ni-61 0.000000 0.000000 +11 9 2 2 Ni-62 0.000000 0.000000 +12 9 2 2 Ni-64 0.000000 0.000000 +13 9 2 2 Mn-55 0.000000 0.000000 +14 9 2 2 Si-28 0.000000 0.000000 +15 9 2 2 Si-29 0.000000 0.000000 +16 9 2 2 Si-30 0.000000 0.000000 +17 9 2 2 Cr-50 0.000000 0.000000 +18 9 2 2 Cr-52 0.000000 0.000000 +19 9 2 2 Cr-53 0.000000 0.000000 +20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +21 9 1 H-1 0 0 +22 9 1 O-16 0 0 +23 9 1 B-10 0 0 +24 9 1 B-11 0 0 +25 9 1 Fe-54 0 0 +26 9 1 Fe-56 0 0 +27 9 1 Fe-57 0 0 +28 9 1 Fe-58 0 0 +29 9 1 Ni-58 0 0 +30 9 1 Ni-60 0 0 +31 9 1 Ni-61 0 0 +32 9 1 Ni-62 0 0 +33 9 1 Ni-64 0 0 +34 9 1 Mn-55 0 0 +35 9 1 Si-28 0 0 +36 9 1 Si-29 0 0 +37 9 1 Si-30 0 0 +38 9 1 Cr-50 0 0 +39 9 1 Cr-52 0 0 +40 9 1 Cr-53 0 0 +41 9 1 Cr-54 0 0 +0 9 2 H-1 0 0 +1 9 2 O-16 0 0 +2 9 2 B-10 0 0 +3 9 2 B-11 0 0 +4 9 2 Fe-54 0 0 +5 9 2 Fe-56 0 0 +6 9 2 Fe-57 0 0 +7 9 2 Fe-58 0 0 +8 9 2 Ni-58 0 0 +9 9 2 Ni-60 0 0 +10 9 2 Ni-61 0 0 +11 9 2 Ni-62 0 0 +12 9 2 Ni-64 0 0 +13 9 2 Mn-55 0 0 +14 9 2 Si-28 0 0 +15 9 2 Si-29 0 0 +16 9 2 Si-30 0 0 +17 9 2 Cr-50 0 0 +18 9 2 Cr-52 0 0 +19 9 2 Cr-53 0 0 +20 9 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 10 1 H-1 0 0 +22 10 1 O-16 0 0 +23 10 1 B-10 0 0 +24 10 1 B-11 0 0 +25 10 1 Fe-54 0 0 +26 10 1 Fe-56 0 0 +27 10 1 Fe-57 0 0 +28 10 1 Fe-58 0 0 +29 10 1 Ni-58 0 0 +30 10 1 Ni-60 0 0 +31 10 1 Ni-61 0 0 +32 10 1 Ni-62 0 0 +33 10 1 Ni-64 0 0 +34 10 1 Mn-55 0 0 +35 10 1 Si-28 0 0 +36 10 1 Si-29 0 0 +37 10 1 Si-30 0 0 +38 10 1 Cr-50 0 0 +39 10 1 Cr-52 0 0 +40 10 1 Cr-53 0 0 +41 10 1 Cr-54 0 0 +0 10 2 H-1 0 0 +1 10 2 O-16 0 0 +2 10 2 B-10 0 0 +3 10 2 B-11 0 0 +4 10 2 Fe-54 0 0 +5 10 2 Fe-56 0 0 +6 10 2 Fe-57 0 0 +7 10 2 Fe-58 0 0 +8 10 2 Ni-58 0 0 +9 10 2 Ni-60 0 0 +10 10 2 Ni-61 0 0 +11 10 2 Ni-62 0 0 +12 10 2 Ni-64 0 0 +13 10 2 Mn-55 0 0 +14 10 2 Si-28 0 0 +15 10 2 Si-29 0 0 +16 10 2 Si-30 0 0 +17 10 2 Cr-50 0 0 +18 10 2 Cr-52 0 0 +19 10 2 Cr-53 0 0 +20 10 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 10 1 H-1 0 0 +22 10 1 O-16 0 0 +23 10 1 B-10 0 0 +24 10 1 B-11 0 0 +25 10 1 Fe-54 0 0 +26 10 1 Fe-56 0 0 +27 10 1 Fe-57 0 0 +28 10 1 Fe-58 0 0 +29 10 1 Ni-58 0 0 +30 10 1 Ni-60 0 0 +31 10 1 Ni-61 0 0 +32 10 1 Ni-62 0 0 +33 10 1 Ni-64 0 0 +34 10 1 Mn-55 0 0 +35 10 1 Si-28 0 0 +36 10 1 Si-29 0 0 +37 10 1 Si-30 0 0 +38 10 1 Cr-50 0 0 +39 10 1 Cr-52 0 0 +40 10 1 Cr-53 0 0 +41 10 1 Cr-54 0 0 +0 10 2 H-1 0 0 +1 10 2 O-16 0 0 +2 10 2 B-10 0 0 +3 10 2 B-11 0 0 +4 10 2 Fe-54 0 0 +5 10 2 Fe-56 0 0 +6 10 2 Fe-57 0 0 +7 10 2 Fe-58 0 0 +8 10 2 Ni-58 0 0 +9 10 2 Ni-60 0 0 +10 10 2 Ni-61 0 0 +11 10 2 Ni-62 0 0 +12 10 2 Ni-64 0 0 +13 10 2 Mn-55 0 0 +14 10 2 Si-28 0 0 +15 10 2 Si-29 0 0 +16 10 2 Si-30 0 0 +17 10 2 Cr-50 0 0 +18 10 2 Cr-52 0 0 +19 10 2 Cr-53 0 0 +20 10 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 10 1 1 H-1 0 0 +64 10 1 1 O-16 0 0 +65 10 1 1 B-10 0 0 +66 10 1 1 B-11 0 0 +67 10 1 1 Fe-54 0 0 +68 10 1 1 Fe-56 0 0 +69 10 1 1 Fe-57 0 0 +70 10 1 1 Fe-58 0 0 +71 10 1 1 Ni-58 0 0 +72 10 1 1 Ni-60 0 0 +73 10 1 1 Ni-61 0 0 +74 10 1 1 Ni-62 0 0 +75 10 1 1 Ni-64 0 0 +76 10 1 1 Mn-55 0 0 +77 10 1 1 Si-28 0 0 +78 10 1 1 Si-29 0 0 +79 10 1 1 Si-30 0 0 +80 10 1 1 Cr-50 0 0 +81 10 1 1 Cr-52 0 0 +82 10 1 1 Cr-53 0 0 +83 10 1 1 Cr-54 0 0 +42 10 1 2 H-1 0 0 +43 10 1 2 O-16 0 0 +44 10 1 2 B-10 0 0 +45 10 1 2 B-11 0 0 +46 10 1 2 Fe-54 0 0 +47 10 1 2 Fe-56 0 0 +48 10 1 2 Fe-57 0 0 +49 10 1 2 Fe-58 0 0 +50 10 1 2 Ni-58 0 0 +51 10 1 2 Ni-60 0 0 +52 10 1 2 Ni-61 0 0 +53 10 1 2 Ni-62 0 0 +54 10 1 2 Ni-64 0 0 +55 10 1 2 Mn-55 0 0 +56 10 1 2 Si-28 0 0 +57 10 1 2 Si-29 0 0 +58 10 1 2 Si-30 0 0 +59 10 1 2 Cr-50 0 0 +60 10 1 2 Cr-52 0 0 +61 10 1 2 Cr-53 0 0 +62 10 1 2 Cr-54 0 0 +21 10 2 1 H-1 0 0 +22 10 2 1 O-16 0 0 +23 10 2 1 B-10 0 0 +24 10 2 1 B-11 0 0 +25 10 2 1 Fe-54 0 0 +26 10 2 1 Fe-56 0 0 +27 10 2 1 Fe-57 0 0 +28 10 2 1 Fe-58 0 0 +29 10 2 1 Ni-58 0 0 +30 10 2 1 Ni-60 0 0 +31 10 2 1 Ni-61 0 0 +32 10 2 1 Ni-62 0 0 +33 10 2 1 Ni-64 0 0 +34 10 2 1 Mn-55 0 0 +35 10 2 1 Si-28 0 0 +36 10 2 1 Si-29 0 0 +37 10 2 1 Si-30 0 0 +38 10 2 1 Cr-50 0 0 +39 10 2 1 Cr-52 0 0 +40 10 2 1 Cr-53 0 0 +41 10 2 1 Cr-54 0 0 +0 10 2 2 H-1 0 0 +1 10 2 2 O-16 0 0 +2 10 2 2 B-10 0 0 +3 10 2 2 B-11 0 0 +4 10 2 2 Fe-54 0 0 +5 10 2 2 Fe-56 0 0 +6 10 2 2 Fe-57 0 0 +7 10 2 2 Fe-58 0 0 +8 10 2 2 Ni-58 0 0 +9 10 2 2 Ni-60 0 0 +10 10 2 2 Ni-61 0 0 +11 10 2 2 Ni-62 0 0 +12 10 2 2 Ni-64 0 0 +13 10 2 2 Mn-55 0 0 +14 10 2 2 Si-28 0 0 +15 10 2 2 Si-29 0 0 +16 10 2 2 Si-30 0 0 +17 10 2 2 Cr-50 0 0 +18 10 2 2 Cr-52 0 0 +19 10 2 2 Cr-53 0 0 +20 10 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 10 1 H-1 0 0 +22 10 1 O-16 0 0 +23 10 1 B-10 0 0 +24 10 1 B-11 0 0 +25 10 1 Fe-54 0 0 +26 10 1 Fe-56 0 0 +27 10 1 Fe-57 0 0 +28 10 1 Fe-58 0 0 +29 10 1 Ni-58 0 0 +30 10 1 Ni-60 0 0 +31 10 1 Ni-61 0 0 +32 10 1 Ni-62 0 0 +33 10 1 Ni-64 0 0 +34 10 1 Mn-55 0 0 +35 10 1 Si-28 0 0 +36 10 1 Si-29 0 0 +37 10 1 Si-30 0 0 +38 10 1 Cr-50 0 0 +39 10 1 Cr-52 0 0 +40 10 1 Cr-53 0 0 +41 10 1 Cr-54 0 0 +0 10 2 H-1 0 0 +1 10 2 O-16 0 0 +2 10 2 B-10 0 0 +3 10 2 B-11 0 0 +4 10 2 Fe-54 0 0 +5 10 2 Fe-56 0 0 +6 10 2 Fe-57 0 0 +7 10 2 Fe-58 0 0 +8 10 2 Ni-58 0 0 +9 10 2 Ni-60 0 0 +10 10 2 Ni-61 0 0 +11 10 2 Ni-62 0 0 +12 10 2 Ni-64 0 0 +13 10 2 Mn-55 0 0 +14 10 2 Si-28 0 0 +15 10 2 Si-29 0 0 +16 10 2 Si-30 0 0 +17 10 2 Cr-50 0 0 +18 10 2 Cr-52 0 0 +19 10 2 Cr-53 0 0 +20 10 2 Cr-54 0 0 material group in nuclide mean std. dev. +9 11 1 H-1 0.138558 0.260695 +10 11 1 O-16 0.042575 0.049271 +11 11 1 B-10 0.000000 0.000000 +12 11 1 B-11 0.000000 0.000000 +13 11 1 Zr-90 0.041034 0.049102 +14 11 1 Zr-91 0.027328 0.021092 +15 11 1 Zr-92 0.009788 0.009282 +16 11 1 Zr-94 0.043543 0.036697 +17 11 1 Zr-96 0.000000 0.000000 +0 11 2 H-1 0.824153 0.917955 +1 11 2 O-16 0.041986 0.060727 +2 11 2 B-10 0.048216 0.042726 +3 11 2 B-11 0.000000 0.000000 +4 11 2 Zr-90 0.048596 0.067712 +5 11 2 Zr-91 0.000000 0.000000 +6 11 2 Zr-92 0.000000 0.000000 +7 11 2 Zr-94 0.043195 0.041363 +8 11 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. +9 11 1 H-1 0 0 +10 11 1 O-16 0 0 +11 11 1 B-10 0 0 +12 11 1 B-11 0 0 +13 11 1 Zr-90 0 0 +14 11 1 Zr-91 0 0 +15 11 1 Zr-92 0 0 +16 11 1 Zr-94 0 0 +17 11 1 Zr-96 0 0 +0 11 2 H-1 0 0 +1 11 2 O-16 0 0 +2 11 2 B-10 0 0 +3 11 2 B-11 0 0 +4 11 2 Zr-90 0 0 +5 11 2 Zr-91 0 0 +6 11 2 Zr-92 0 0 +7 11 2 Zr-94 0 0 +8 11 2 Zr-96 0 0 material group in group out nuclide mean std. dev. +27 11 1 1 H-1 0.111411 0.247294 +28 11 1 1 O-16 0.042575 0.049271 +29 11 1 1 B-10 0.000000 0.000000 +30 11 1 1 B-11 0.000000 0.000000 +31 11 1 1 Zr-90 0.041034 0.049102 +32 11 1 1 Zr-91 0.027328 0.021092 +33 11 1 1 Zr-92 0.009788 0.009282 +34 11 1 1 Zr-94 0.043543 0.036697 +35 11 1 1 Zr-96 0.000000 0.000000 +18 11 1 2 H-1 0.027147 0.020009 +19 11 1 2 O-16 0.000000 0.000000 +20 11 1 2 B-10 0.000000 0.000000 +21 11 1 2 B-11 0.000000 0.000000 +22 11 1 2 Zr-90 0.000000 0.000000 +23 11 1 2 Zr-91 0.000000 0.000000 +24 11 1 2 Zr-92 0.000000 0.000000 +25 11 1 2 Zr-94 0.000000 0.000000 +26 11 1 2 Zr-96 0.000000 0.000000 +9 11 2 1 H-1 0.000000 0.000000 +10 11 2 1 O-16 0.000000 0.000000 +11 11 2 1 B-10 0.000000 0.000000 +12 11 2 1 B-11 0.000000 0.000000 +13 11 2 1 Zr-90 0.000000 0.000000 +14 11 2 1 Zr-91 0.000000 0.000000 +15 11 2 1 Zr-92 0.000000 0.000000 +16 11 2 1 Zr-94 0.000000 0.000000 +17 11 2 1 Zr-96 0.000000 0.000000 +0 11 2 2 H-1 0.824153 0.917955 +1 11 2 2 O-16 0.041986 0.060727 +2 11 2 2 B-10 0.000000 0.000000 +3 11 2 2 B-11 0.000000 0.000000 +4 11 2 2 Zr-90 0.048596 0.067712 +5 11 2 2 Zr-91 0.000000 0.000000 +6 11 2 2 Zr-92 0.000000 0.000000 +7 11 2 2 Zr-94 0.043195 0.041363 +8 11 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +9 11 1 H-1 0 0 +10 11 1 O-16 0 0 +11 11 1 B-10 0 0 +12 11 1 B-11 0 0 +13 11 1 Zr-90 0 0 +14 11 1 Zr-91 0 0 +15 11 1 Zr-92 0 0 +16 11 1 Zr-94 0 0 +17 11 1 Zr-96 0 0 +0 11 2 H-1 0 0 +1 11 2 O-16 0 0 +2 11 2 B-10 0 0 +3 11 2 B-11 0 0 +4 11 2 Zr-90 0 0 +5 11 2 Zr-91 0 0 +6 11 2 Zr-92 0 0 +7 11 2 Zr-94 0 0 +8 11 2 Zr-96 0 0 material group in nuclide mean std. dev. +9 12 1 H-1 0.151924 0.200147 +10 12 1 O-16 0.039280 0.026086 +11 12 1 B-10 0.000000 0.000000 +12 12 1 B-11 0.000000 0.000000 +13 12 1 Zr-90 0.017578 0.022079 +14 12 1 Zr-91 0.039984 0.025285 +15 12 1 Zr-92 0.001172 0.006230 +16 12 1 Zr-94 0.001668 0.005966 +17 12 1 Zr-96 0.004328 0.005325 +0 12 2 H-1 0.942412 0.866849 +1 12 2 O-16 0.047438 0.048161 +2 12 2 B-10 0.041655 0.031202 +3 12 2 B-11 0.000000 0.000000 +4 12 2 Zr-90 0.021193 0.017456 +5 12 2 Zr-91 0.007901 0.009268 +6 12 2 Zr-92 0.009422 0.012802 +7 12 2 Zr-94 0.043324 0.027551 +8 12 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. +9 12 1 H-1 0 0 +10 12 1 O-16 0 0 +11 12 1 B-10 0 0 +12 12 1 B-11 0 0 +13 12 1 Zr-90 0 0 +14 12 1 Zr-91 0 0 +15 12 1 Zr-92 0 0 +16 12 1 Zr-94 0 0 +17 12 1 Zr-96 0 0 +0 12 2 H-1 0 0 +1 12 2 O-16 0 0 +2 12 2 B-10 0 0 +3 12 2 B-11 0 0 +4 12 2 Zr-90 0 0 +5 12 2 Zr-91 0 0 +6 12 2 Zr-92 0 0 +7 12 2 Zr-94 0 0 +8 12 2 Zr-96 0 0 material group in group out nuclide mean std. dev. +27 12 1 1 H-1 0.122301 0.187298 +28 12 1 1 O-16 0.039280 0.026086 +29 12 1 1 B-10 0.000000 0.000000 +30 12 1 1 B-11 0.000000 0.000000 +31 12 1 1 Zr-90 0.017578 0.022079 +32 12 1 1 Zr-91 0.039984 0.025285 +33 12 1 1 Zr-92 0.001172 0.006230 +34 12 1 1 Zr-94 0.001668 0.005966 +35 12 1 1 Zr-96 0.004328 0.005325 +18 12 1 2 H-1 0.029622 0.017760 +19 12 1 2 O-16 0.000000 0.000000 +20 12 1 2 B-10 0.000000 0.000000 +21 12 1 2 B-11 0.000000 0.000000 +22 12 1 2 Zr-90 0.000000 0.000000 +23 12 1 2 Zr-91 0.000000 0.000000 +24 12 1 2 Zr-92 0.000000 0.000000 +25 12 1 2 Zr-94 0.000000 0.000000 +26 12 1 2 Zr-96 0.000000 0.000000 +9 12 2 1 H-1 0.000000 0.000000 +10 12 2 1 O-16 0.000000 0.000000 +11 12 2 1 B-10 0.000000 0.000000 +12 12 2 1 B-11 0.000000 0.000000 +13 12 2 1 Zr-90 0.000000 0.000000 +14 12 2 1 Zr-91 0.000000 0.000000 +15 12 2 1 Zr-92 0.000000 0.000000 +16 12 2 1 Zr-94 0.000000 0.000000 +17 12 2 1 Zr-96 0.000000 0.000000 +0 12 2 2 H-1 0.942412 0.866849 +1 12 2 2 O-16 0.047438 0.048161 +2 12 2 2 B-10 0.000000 0.000000 +3 12 2 2 B-11 0.000000 0.000000 +4 12 2 2 Zr-90 0.021193 0.017456 +5 12 2 2 Zr-91 0.007901 0.009268 +6 12 2 2 Zr-92 0.009422 0.012802 +7 12 2 2 Zr-94 0.043324 0.027551 +8 12 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +9 12 1 H-1 0 0 +10 12 1 O-16 0 0 +11 12 1 B-10 0 0 +12 12 1 B-11 0 0 +13 12 1 Zr-90 0 0 +14 12 1 Zr-91 0 0 +15 12 1 Zr-92 0 0 +16 12 1 Zr-94 0 0 +17 12 1 Zr-96 0 0 +0 12 2 H-1 0 0 +1 12 2 O-16 0 0 +2 12 2 B-10 0 0 +3 12 2 B-11 0 0 +4 12 2 Zr-90 0 0 +5 12 2 Zr-91 0 0 +6 12 2 Zr-92 0 0 +7 12 2 Zr-94 0 0 +8 12 2 Zr-96 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py index 637afc0b64..173043cf04 100644 --- a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py +++ b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py @@ -33,10 +33,10 @@ class MGXSTestHarness(PyAPITestHarness): # Initialize a tallies file self._input_set.tallies = openmc.TalliesFile() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=True) + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) self._input_set.tallies.export_to_xml() - def _get_results(self, hash_output=True): + def _get_results(self, hash_output=False): """Digest info in the statepoint and return as a string.""" # Read the statepoint file. @@ -53,7 +53,7 @@ class MGXSTestHarness(PyAPITestHarness): # Build a string from Pandas Dataframe for each MGXS outstr = '' - for domain in sorted(self.mgxs_lib.domains): + for domain in self.mgxs_lib.domains: for mgxs_type in self.mgxs_lib.mgxs_types: mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) df = mgxs.get_pandas_dataframe() diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 9435ccbbcc..79d884cf11 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -320,6 +320,9 @@ class PyAPITestHarness(TestHarness): outstr = '\n'.join([open(fname).read() for fname in xmls if os.path.exists(fname)]) + if 'MGXSTestHarness' in str(type(self)): + print(outstr) + sha512 = hashlib.sha512() sha512.update(outstr.encode('utf-8')) outstr = sha512.hexdigest() @@ -339,6 +342,9 @@ class PyAPITestHarness(TestHarness): """Make sure the current inputs agree with the _true standard.""" compare = filecmp.cmp('inputs_test.dat', 'inputs_true.dat') if not compare: + f = open('inputs_test.dat') + for line in f.readlines(): print(line) + f.close() os.rename('inputs_test.dat', 'inputs_error.dat') assert compare, 'Input files are broken.' From c8ec70946dbf1c7473c14b340b8232eb4c8176d7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 21 Oct 2015 08:31:05 -0400 Subject: [PATCH 363/519] Removed print debug statements from test suite --- tests/run_tests.py | 2 -- tests/test_track_output/results_test.dat | 9 +++++++++ tests/testing_harness.py | 3 --- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 tests/test_track_output/results_test.dat diff --git a/tests/run_tests.py b/tests/run_tests.py index 1377c966c1..338732c142 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -470,8 +470,6 @@ for key in iter(tests): logfilename = os.path.splitext(logfilename)[0] logfilename = logfilename + '_{0}.log'.format(test.name) shutil.copy(logfile[0], logfilename) - print(logfilename) - with open(logfilename) as fh: print(fh.read()) # Clear build directory and remove binary and hdf5 files shutil.rmtree('build', ignore_errors=True) diff --git a/tests/test_track_output/results_test.dat b/tests/test_track_output/results_test.dat new file mode 100644 index 0000000000..6ded87a0ec --- /dev/null +++ b/tests/test_track_output/results_test.dat @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 79d884cf11..ed89f76946 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -320,9 +320,6 @@ class PyAPITestHarness(TestHarness): outstr = '\n'.join([open(fname).read() for fname in xmls if os.path.exists(fname)]) - if 'MGXSTestHarness' in str(type(self)): - print(outstr) - sha512 = hashlib.sha512() sha512.update(outstr.encode('utf-8')) outstr = sha512.hexdigest() From 2f23814fa6f29c2ecbb32d5ebb045b2159ca785e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 21 Oct 2015 09:29:01 -0400 Subject: [PATCH 364/519] Revised __init__.py for openmc.mgxs to be Python 3 compatible --- openmc/mgxs/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py index 91eb811f46..4fcf8b6aed 100644 --- a/openmc/mgxs/__init__.py +++ b/openmc/mgxs/__init__.py @@ -1,3 +1,3 @@ -from groups import EnergyGroups -from library import Library -from mgxs import * +from openmc.mgxs.groups import EnergyGroups +from openmc.mgxs.library import Library +from openmc.mgxs.mgxs import * From 13f3045e886f7ce9e15ee8a1e18eee45e56a3a43 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 21 Oct 2015 10:44:36 -0400 Subject: [PATCH 365/519] Made tally division Python 3 compatible --- openmc/tallies.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 3f964e102b..67ea53c32b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1,3 +1,5 @@ +from __future__ import division + from collections import Iterable, defaultdict import copy import os @@ -2020,7 +2022,7 @@ class Tally(object): return new_tally - def __div__(self, other): + def __truediv__(self, other): """Divides this tally by another tally or scalar value. This method builds a new tally with data that is the dividend of @@ -2525,7 +2527,7 @@ class Tally(object): # by which the "base" indices should be repeated to account for all # other filter bins in the diagonalized tally indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1) - diag_factor = self.num_filter_bins / new_filter.num_bins + diag_factor = int(self.num_filter_bins / new_filter.num_bins) diag_indices = np.zeros(self.num_filter_bins, dtype=np.int) # Determine the filter indices along the new "diagonal" From 7670e3847e0cd4f9586a636291584a9717aff6e7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 21 Oct 2015 11:59:04 -0400 Subject: [PATCH 366/519] modified regular expression code to be python 3 compatible --- openmc/statepoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index c551346da6..014830d58f 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -434,7 +434,7 @@ class StatePoint(object): regexp = re.compile(r'-n$|-pn$|-yn$') if regexp.search(score) is not None: score = score.strip(regexp.findall(score)[0]) - score += '-' + moments[j] + score += '-' + moments[j].decode() tally.add_score(score) From 370a0f2677d0dae641901491ccda04fd138d4760 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 21 Oct 2015 12:04:54 -0400 Subject: [PATCH 367/519] added decoding of score in statepoint.py --- openmc/statepoint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 014830d58f..e7e8d8e089 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -429,6 +429,7 @@ class StatePoint(object): # Add the scores to the Tally for j, score in enumerate(scores): + score = score.decode() # If this is a moment, use generic moment order regexp = re.compile(r'-n$|-pn$|-yn$') From f9aa2b4904429ea0d9aa116bdaf0cc39f8507dad Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 21 Oct 2015 12:10:04 -0400 Subject: [PATCH 368/519] Now import division from __future__ in mgxs.py --- openmc/mgxs/mgxs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 83b85bf507..485d7cf42a 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1,3 +1,5 @@ +from __future__ import division + from collections import Iterable, OrderedDict from numbers import Integral import os @@ -2216,4 +2218,4 @@ class Chi(MGXS): df['mean'] *= np.tile(densities, tile_factor) df['std. dev.'] *= np.tile(densities, tile_factor) - return df \ No newline at end of file + return df From 02296cbd7785fcface071ac91a6620fe7c4ff48e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 21 Oct 2015 12:59:07 -0400 Subject: [PATCH 369/519] Now properly indexing ValuesView in MGXS.num_subdomains --- openmc/mgxs/library.py | 2 +- openmc/mgxs/mgxs.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 0178745efe..32f9c937a3 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -616,4 +616,4 @@ class Library(object): full_filename = full_filename.replace(' ', '-') # Load and return pickled Library object - return pickle.load(open(full_filename, 'rb')) \ No newline at end of file + return pickle.load(open(full_filename, 'rb')) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 485d7cf42a..775c519411 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -188,7 +188,7 @@ class MGXS(object): @property def num_subdomains(self): - tally = self.tallies.values()[0] + tally = list(self.tallies.values())[0] domain_filter = tally.find_filter(self.domain_type) return domain_filter.num_bins From 0965e20c08cca4a98edb914c88d759af9a81b5b9 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 22 Oct 2015 13:38:44 -0400 Subject: [PATCH 370/519] Made Filter.is_subset and Filter.get_bin_index routines use value thresholding for energy bins --- openmc/filter.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index bff1c62f0c..3787e67053 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -331,7 +331,10 @@ class Filter(object): elif self.type != other.type: return False elif self.type in ['energy', 'energyout']: - return np.all(self.bins == other.bins) + if len(self.bins) != len(other.bins): + return False + else: + return np.allclose(self.bins, other.bins) for bin in other.bins: if bin not in self.bins: @@ -383,8 +386,12 @@ class Filter(object): # Use lower energy bound to find index for energy Filters elif self.type in ['energy', 'energyout']: - val = np.where(self.bins == filter_bin[0])[0][0] - filter_index = val + deltas = np.abs(self.bins - filter_bin[0]) / filter_bin[0] + min_delta = np.min(deltas) + if min_delta < 1E-5: + filter_index = deltas.argmin() + else: + raise ValueError # Filter bins for distribcells are "IDs" of each unique placement # of the Cell in the Geometry (integers starting at 0) @@ -748,4 +755,4 @@ class Filter(object): filter_bins = filter_bins df = pd.concat([df, pd.DataFrame({self.type : filter_bins})]) - return df \ No newline at end of file + return df From ff89950e9d302914be859d72ee0d6d403acd288f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 22 Oct 2015 13:46:41 -0400 Subject: [PATCH 371/519] Fixed bug in Filter.get_bin_index(...) for energy bins with 0.0 as the lower energy --- openmc/filter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 3787e67053..8c1b6500b6 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -386,10 +386,10 @@ class Filter(object): # Use lower energy bound to find index for energy Filters elif self.type in ['energy', 'energyout']: - deltas = np.abs(self.bins - filter_bin[0]) / filter_bin[0] + deltas = np.abs(self.bins - filter_bin[1]) / filter_bin[1] min_delta = np.min(deltas) - if min_delta < 1E-5: - filter_index = deltas.argmin() + if min_delta < 1E-3: + filter_index = deltas.argmin() - 1 else: raise ValueError From b13061b5c079007e9755ca028c31c70ba14de255 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 22 Oct 2015 18:39:49 -0400 Subject: [PATCH 372/519] added inverse-velocity score and accompanying tests --- docs/source/usersguide/input.rst | 9 ++++-- src/constants.F90 | 7 ++-- src/input_xml.F90 | 2 ++ src/output.F90 | 1 + src/state_point.F90 | 2 ++ src/summary.F90 | 2 ++ src/tally.F90 | 21 ++++++++++++ .../inputs_true.dat | 1 + .../results_true.dat | 29 +++++++++++++++++ .../test_score_inversevelocity.py | 32 +++++++++++++++++++ 10 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 tests/test_score_inverse_velocity/inputs_true.dat create mode 100644 tests/test_score_inverse_velocity/results_true.dat create mode 100644 tests/test_score_inverse_velocity/test_score_inversevelocity.py diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 0c10756ba1..8ddf7082c5 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1386,8 +1386,8 @@ The ```` element accepts the following sub-elements: options are "flux", "total", "scatter", "absorption", "fission", "nu-fission", "delayed-nu-fission", "kappa-fission", "nu-scatter", "scatter-N", "scatter-PN", "scatter-YN", "nu-scatter-N", "nu-scatter-PN", - "nu-scatter-YN", "flux-YN", "total-YN", "current", and "events". These - correspond to the following physical quantities: + "nu-scatter-YN", "flux-YN", "total-YN", "current", "inverse-velocity" and + "events". These correspond to the following physical quantities: :flux: Total flux in particle-cm per source particle. Note: The ``analog`` @@ -1478,6 +1478,11 @@ The ```` element accepts the following sub-elements: specified. Furthermore, it may not be used in conjunction with any other score. + :inverse-velocity: + The flux-weighted inverse velocity where the velocity is in units of + meters per second. Note: The ``analog`` estimator is actually identical + to the ``collision`` estimator for the inverse-velocity score. + :events: Number of scoring events. Units are events per source particle. diff --git a/src/constants.F90 b/src/constants.F90 index 9e973f24af..7c8bc8fc5d 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -65,6 +65,8 @@ module constants MASS_NEUTRON = 1.008664916_8, & ! mass of a neutron in amu MASS_PROTON = 1.007276466812_8, & ! mass of a proton in amu AMU = 1.660538921e-27_8, & ! 1 amu in kg + AMU_MEV = 931.494061_8, & ! 1 amu in MeV/c^2 + C_LIGHT = 2.99792458e8_8, & ! speed of light in a vacuum N_AVOGADRO = 0.602214129_8, & ! Avogadro's number in 10^24/mol K_BOLTZMANN = 8.6173324e-11_8, & ! Boltzmann constant in MeV/K INFINITY = huge(0.0_8), & ! positive infinity @@ -257,7 +259,7 @@ module constants EVENT_ABSORB = 2 ! Tally score type - integer, parameter :: N_SCORE_TYPES = 21 + integer, parameter :: N_SCORE_TYPES = 22 integer, parameter :: & SCORE_FLUX = -1, & ! flux SCORE_TOTAL = -2, & ! total reaction rate @@ -279,7 +281,8 @@ module constants SCORE_SCATTER_YN = -18, & ! angular flux-weighted scattering moment (0:N) SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N) SCORE_EVENTS = -20, & ! number of events - SCORE_DELAYED_NU_FISSION = -21 ! delayed neutron production rate + SCORE_DELAYED_NU_FISSION = -21, & ! delayed neutron production rate + SCORE_INVERSE_VELOCITY = -22 ! flux weighted inverse velocity ! Maximum scattering order supported integer, parameter :: MAX_ANG_ORDER = 10 diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 528ea40f51..3fe344ed92 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3110,6 +3110,8 @@ contains end if case ('kappa-fission') t % score_bins(j) = SCORE_KAPPA_FISSION + case ('inverse-velocity') + t % score_bins(j) = SCORE_INVERSE_VELOCITY case ('current') t % score_bins(j) = SCORE_CURRENT t % type = TALLY_SURFACE_CURRENT diff --git a/src/output.F90 b/src/output.F90 index 3463244e31..55cd5b2a5b 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -985,6 +985,7 @@ contains score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment" score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" score_names(abs(SCORE_DELAYED_NU_FISSION)) = "Delayed-Nu-Fission Rate" + score_names(abs(SCORE_INVERSE_VELOCITY)) = "Flux-Weighted Inverse Velocity" ! Create filename for tally output filename = trim(path_output) // "tallies.out" diff --git a/src/state_point.F90 b/src/state_point.F90 index 6d1c6f3129..046e7e6669 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -353,6 +353,8 @@ contains str_array(j) = "nu-scatter-yn" case (SCORE_EVENTS) str_array(j) = "events" + case (SCORE_INVERSE_VELOCITY) + str_array(j) = "inverse-velocity" case default str_array(j) = reaction_name(tally%score_bins(j)) end select diff --git a/src/summary.F90 b/src/summary.F90 index f088cb7bbf..bf7621880b 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -649,6 +649,8 @@ contains str_array(j) = "nu-scatter-yn" case (SCORE_EVENTS) str_array(j) = "events" + case (SCORE_INVERSE_VELOCITY) + str_array(j) = "inverse-velocity" case default str_array(j) = reaction_name(t%score_bins(j)) end select diff --git a/src/tally.F90 b/src/tally.F90 index 7ad174c9bc..6e2e279120 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -127,6 +127,27 @@ contains end if + case (SCORE_INVERSE_VELOCITY) + if (t % estimator == ESTIMATOR_ANALOG) then + ! All events score to a inverse velocity bin. We actually use a + ! collision estimator in place of an analog one since there is no way + ! to count 'events' exactly for the inverse velocity + if (survival_biasing) then + ! We need to account for the fact that some weight was already + ! absorbed + score = p % last_wgt + p % absorb_wgt + else + score = p % last_wgt + end if + score = score / material_xs % total & + / (sqrt(2 * p % E / (MASS_NEUTRON * AMU_MEV)) * C_LIGHT) + + else + ! For inverse velocity, we need no cross section + score = flux / (sqrt(2 * p % E / (MASS_NEUTRON * AMU_MEV)) * C_LIGHT) + end if + + case (SCORE_SCATTER, SCORE_SCATTER_N) if (t % estimator == ESTIMATOR_ANALOG) then ! Skip any event where the particle didn't scatter diff --git a/tests/test_score_inverse_velocity/inputs_true.dat b/tests/test_score_inverse_velocity/inputs_true.dat new file mode 100644 index 0000000000..0546cf828f --- /dev/null +++ b/tests/test_score_inverse_velocity/inputs_true.dat @@ -0,0 +1 @@ +ba1010f940c50314d61aae9f729b7bb476a6b35c5556fbc689ba3fde70ff50b0ba5dad0db3b38349a1562d67817047090ac450a64d895c8f3393163fe7914763 \ No newline at end of file diff --git a/tests/test_score_inverse_velocity/results_true.dat b/tests/test_score_inverse_velocity/results_true.dat new file mode 100644 index 0000000000..f86a8beb5b --- /dev/null +++ b/tests/test_score_inverse_velocity/results_true.dat @@ -0,0 +1,29 @@ +k-combined: +9.903196E-01 4.279617E-02 +tally 1: +1.049628E-03 +2.261930E-07 +4.056389E-04 +3.411247E-08 +2.243766E-03 +1.069671E-06 +6.354432E-04 +8.370608E-08 +tally 2: +1.048031E-03 +2.263789E-07 +4.276093E-04 +4.136358E-08 +2.667795E-03 +1.528407E-06 +6.199140E-04 +7.840402E-08 +tally 3: +1.048031E-03 +2.263789E-07 +4.276093E-04 +4.136358E-08 +2.667795E-03 +1.528407E-06 +6.199140E-04 +7.840402E-08 diff --git a/tests/test_score_inverse_velocity/test_score_inversevelocity.py b/tests/test_score_inverse_velocity/test_score_inversevelocity.py new file mode 100644 index 0000000000..787e9df091 --- /dev/null +++ b/tests/test_score_inverse_velocity/test_score_inversevelocity.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreInverseVelocityTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('inverse-velocity') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreInverseVelocityTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreInverseVelocityTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = ScoreInverseVelocityTestHarness('statepoint.10.*', True) + harness.main() From deccc6a82d18943bacd614b0f3a3d7954579c8fb Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 22 Oct 2015 21:00:45 -0400 Subject: [PATCH 373/519] updated tests so input files are generated with openmc API --- tests/test_filter_delayedgroup/geometry.xml | 181 ------------ .../test_filter_delayedgroup/inputs_true.dat | 1 + tests/test_filter_delayedgroup/materials.xml | 272 ------------------ .../test_filter_delayedgroup/results_true.dat | 26 +- tests/test_filter_delayedgroup/settings.xml | 19 -- tests/test_filter_delayedgroup/tallies.xml | 10 - .../test_filter_delayedgroup.py | 26 +- .../test_score_delayed_nufission/geometry.xml | 181 ------------ .../inputs_true.dat | 1 + .../materials.xml | 272 ------------------ .../results_true.dat | 22 +- .../test_score_delayed_nufission/settings.xml | 19 -- .../test_score_delayed_nufission/tallies.xml | 21 -- .../test_score_delayed_nufission.py | 28 +- 14 files changed, 74 insertions(+), 1005 deletions(-) delete mode 100644 tests/test_filter_delayedgroup/geometry.xml create mode 100644 tests/test_filter_delayedgroup/inputs_true.dat delete mode 100644 tests/test_filter_delayedgroup/materials.xml delete mode 100644 tests/test_filter_delayedgroup/settings.xml delete mode 100644 tests/test_filter_delayedgroup/tallies.xml delete mode 100644 tests/test_score_delayed_nufission/geometry.xml create mode 100644 tests/test_score_delayed_nufission/inputs_true.dat delete mode 100644 tests/test_score_delayed_nufission/materials.xml delete mode 100644 tests/test_score_delayed_nufission/settings.xml delete mode 100644 tests/test_score_delayed_nufission/tallies.xml diff --git a/tests/test_filter_delayedgroup/geometry.xml b/tests/test_filter_delayedgroup/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_filter_delayedgroup/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_delayedgroup/inputs_true.dat b/tests/test_filter_delayedgroup/inputs_true.dat new file mode 100644 index 0000000000..21bce00fd2 --- /dev/null +++ b/tests/test_filter_delayedgroup/inputs_true.dat @@ -0,0 +1 @@ +e771470681d3b4af57a70d148f5eb728df57f1fd7bdb5d6f76ac556b69f10bf0cdd5645fe488f1e17f07cbb72e9fb34af2fd7ede95c8e39c5ffa6ea9b6c5810e \ No newline at end of file diff --git a/tests/test_filter_delayedgroup/materials.xml b/tests/test_filter_delayedgroup/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_filter_delayedgroup/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_delayedgroup/results_true.dat b/tests/test_filter_delayedgroup/results_true.dat index f44821a238..9db6de2562 100644 --- a/tests/test_filter_delayedgroup/results_true.dat +++ b/tests/test_filter_delayedgroup/results_true.dat @@ -1,15 +1,15 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -6.113116E-04 -7.519725E-08 -3.155402E-03 -2.003485E-06 -3.012421E-03 -1.826031E-06 -6.754097E-03 -9.179336E-06 -2.769084E-03 -1.542940E-06 -1.159960E-03 -2.707463E-07 +8.141852E-04 +1.337187E-07 +4.849156E-03 +4.744020E-06 +4.460252E-03 +4.015453E-06 +1.028479E-02 +2.136252E-05 +5.002274E-03 +5.056965E-06 +1.974747E-03 +7.882970E-07 diff --git a/tests/test_filter_delayedgroup/settings.xml b/tests/test_filter_delayedgroup/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_filter_delayedgroup/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_delayedgroup/tallies.xml b/tests/test_filter_delayedgroup/tallies.xml deleted file mode 100644 index b3649b4697..0000000000 --- a/tests/test_filter_delayedgroup/tallies.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - delayed-nu-fission - U-235 - - - diff --git a/tests/test_filter_delayedgroup/test_filter_delayedgroup.py b/tests/test_filter_delayedgroup/test_filter_delayedgroup.py index 1777db993e..bdad3cc958 100644 --- a/tests/test_filter_delayedgroup/test_filter_delayedgroup.py +++ b/tests/test_filter_delayedgroup/test_filter_delayedgroup.py @@ -1,10 +1,30 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterDelayedgroupTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='delayedgroup', + bins=(1, 2, 3, 4, 5, 6)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('delayed-nu-fission') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterDelayedgroupTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterDelayedgroupTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterDelayedgroupTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_delayed_nufission/geometry.xml b/tests/test_score_delayed_nufission/geometry.xml deleted file mode 100644 index b85dd04df9..0000000000 --- a/tests/test_score_delayed_nufission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_delayed_nufission/inputs_true.dat b/tests/test_score_delayed_nufission/inputs_true.dat new file mode 100644 index 0000000000..5a0ec8a211 --- /dev/null +++ b/tests/test_score_delayed_nufission/inputs_true.dat @@ -0,0 +1 @@ +f3c246a1c83b1283163b22069f78231e3f6623fa3c2eb664ce400d0fff07105b6106d0fa8c6dfd49512a7eb676c80e4ee602e19063a9fc453394fe07a94a1bdd \ No newline at end of file diff --git a/tests/test_score_delayed_nufission/materials.xml b/tests/test_score_delayed_nufission/materials.xml deleted file mode 100644 index 9c0b74f3f1..0000000000 --- a/tests/test_score_delayed_nufission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_delayed_nufission/results_true.dat b/tests/test_score_delayed_nufission/results_true.dat index 6818f88e49..d797baf18c 100644 --- a/tests/test_score_delayed_nufission/results_true.dat +++ b/tests/test_score_delayed_nufission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.432292E-02 -4.518762E-05 +1.711611E-02 +5.967549E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.531359E-02 -5.079909E-05 +1.026930E-02 +2.198717E-05 tally 2: -1.576415E-02 -2.485084E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.976462E-02 +1.953328E-04 tally 3: -1.369800E-02 -3.974018E-05 +1.687894E-02 +5.776176E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.447073E-02 -4.579588E-05 +1.061803E-02 +2.308636E-05 diff --git a/tests/test_score_delayed_nufission/settings.xml b/tests/test_score_delayed_nufission/settings.xml deleted file mode 100644 index 517637a59f..0000000000 --- a/tests/test_score_delayed_nufission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_delayed_nufission/tallies.xml b/tests/test_score_delayed_nufission/tallies.xml deleted file mode 100644 index 5ca1409859..0000000000 --- a/tests/test_score_delayed_nufission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - delayed-nu-fission - - - - - delayed-nu-fission - analog - - - - - delayed-nu-fission - collision - - - diff --git a/tests/test_score_delayed_nufission/test_score_delayed_nufission.py b/tests/test_score_delayed_nufission/test_score_delayed_nufission.py index 1777db993e..0738520e29 100644 --- a/tests/test_score_delayed_nufission/test_score_delayed_nufission.py +++ b/tests/test_score_delayed_nufission/test_score_delayed_nufission.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreDelayedNuFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('delayed-nu-fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreDelayedNuFissionTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreDelayedNuFissionTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreDelayedNuFissionTestHarness('statepoint.10.*', True) harness.main() From 9828b34ec182ca1e3c210cb1edbd76eb5668a614 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 22 Oct 2015 21:28:28 -0400 Subject: [PATCH 374/519] added dash in comment for score inverse velocity --- src/constants.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants.F90 b/src/constants.F90 index 7c8bc8fc5d..2aceea15cf 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -282,7 +282,7 @@ module constants SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N) SCORE_EVENTS = -20, & ! number of events SCORE_DELAYED_NU_FISSION = -21, & ! delayed neutron production rate - SCORE_INVERSE_VELOCITY = -22 ! flux weighted inverse velocity + SCORE_INVERSE_VELOCITY = -22 ! flux-weighted inverse velocity ! Maximum scattering order supported integer, parameter :: MAX_ANG_ORDER = 10 From 65bd95fea09e1c0e01dac631003822f9e70e7fd0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 23 Oct 2015 13:56:52 -0500 Subject: [PATCH 375/519] Show maximum neutron transport energy and corresponding nuclide --- src/ace.F90 | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 69ad2f1a9a..a10af729c7 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -215,6 +215,16 @@ contains end do MATERIAL_LOOP3 + ! Show which nuclide results in lowest energy for neutron transport + do i = 1, n_nuclides_total + if (nuclides(i)%energy(nuclides(i)%n_grid) == energy_max_neutron) then + call write_message("Maximum neutron transport energy: " // & + trim(to_str(energy_max_neutron)) // " MeV for " // & + trim(adjustl(nuclides(i)%name)), 6) + exit + end if + end do + end subroutine read_xs !=============================================================================== @@ -486,11 +496,6 @@ contains ! than the previous energy_min_neutron = max(energy_min_neutron, nuc%energy(1)) energy_max_neutron = min(energy_max_neutron, nuc%energy(NE)) - if (nuc%energy(NE) < 20.0_8) then - call warning("Maximum energy for " // trim(adjustl(nuc%name)) // & - " is " // trim(to_str(nuc%energy(NE))) // " MeV. Neutrons will & - ¬ be allowed to go above this energy.") - end if end if end subroutine read_esz From a0193b13a5c7409f5231a4457a996d28d3d4d5b2 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 23 Oct 2015 17:27:28 -0400 Subject: [PATCH 376/519] fixed merging of tallies with delayedgroup filters in python API and other small issues --- docs/source/usersguide/input.rst | 2 +- openmc/filter.py | 2 +- openmc/statepoint.py | 6 ++---- openmc/tallies.py | 15 +++++++++++++++ src/ace.F90 | 6 +++--- src/fission.F90 | 6 +++--- src/input_xml.F90 | 2 +- src/particle_header.F90 | 1 - src/physics.F90 | 1 - src/tally.F90 | 29 ++++++++++------------------- src/tracking.F90 | 1 - 11 files changed, 36 insertions(+), 35 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 0c10756ba1..f89e951576 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1355,7 +1355,7 @@ The ```` element accepts the following sub-elements: -:nuclides: + :nuclides: If specified, the scores listed will be for particular nuclides, not the summation of reactions from all nuclides. The format for nuclides should be [Atomic symbol]-[Mass number], e.g. "U-235". The reaction rate for all diff --git a/openmc/filter.py b/openmc/filter.py index bd42039ed8..6c4377ff34 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -271,7 +271,7 @@ class Filter(object): merged_filter = copy.deepcopy(self) # Merge unique filter bins - merged_bins = list(set(self.bins + filter.bins)) + merged_bins = list(set(np.concatenate((self.bins, filter.bins)))) merged_filter.bins = merged_bins merged_filter.num_bins = len(merged_bins) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index e7e8d8e089..56b6eaf348 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -432,10 +432,8 @@ class StatePoint(object): score = score.decode() # If this is a moment, use generic moment order - regexp = re.compile(r'-n$|-pn$|-yn$') - if regexp.search(score) is not None: - score = score.strip(regexp.findall(score)[0]) - score += '-' + moments[j].decode() + pattern = r'-n$|-pn$|-yn$' + score = re.sub(pattern, '-' + moments[j].decode(), score) tally.add_score(score) diff --git a/openmc/tallies.py b/openmc/tallies.py index a0f617d08c..610b6689ce 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -565,6 +565,21 @@ class Tally(object): if len(self.filters) != len(tally.filters): return False + # Check if only one tally contains a delayed group filter + tally1_dg = False + for filter1 in self.filters: + if filter1.type == 'delayedgroup': + tally1_dg = True + + tally2_dg = False + for filter2 in tally.filters: + if filter2.type == 'delayedgroup': + tally2_dg = True + + # Return False if only one tally has a delayed group filter + if (tally1_dg or tally2_dg) and not (tally1_dg and tally2_dg): + return False + # Look to see if all filters are the same, or one or more can be merged for filter1 in self.filters: mergeable_filter = False diff --git a/src/ace.F90 b/src/ace.F90 index d70c50259f..f7d4bec69f 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -640,8 +640,8 @@ contains ! of delayed groups if (NPCR > MAX_DELAYED_GROUPS) then call fatal_error("Encountered nuclide with " // trim(to_str(NPCR)) & - &// " delayed groups while the maximum number of delayed groups " & - &// "set in constants.F90 is " // trim(to_str(MAX_DELAYED_GROUPS))) + // " delayed groups while the maximum number of delayed groups & + &set in constants.F90 is " // trim(to_str(MAX_DELAYED_GROUPS))) end if nuc % n_precursor = NPCR @@ -681,7 +681,7 @@ contains else nuc % nu_d_type = NU_NONE - nuc % n_precursor = ZERO + nuc % n_precursor = 0 end if end subroutine read_nu_data diff --git a/src/fission.F90 b/src/fission.F90 index f69ffc9628..7b2911997b 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -89,9 +89,9 @@ contains function nu_delayed(nuc, E) result(nu) - type(Nuclide), pointer :: nuc ! nuclide from which to find nu - real(8), intent(in) :: E ! energy of incoming neutron - real(8) :: nu ! number of delayed neutrons emitted per fission + type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu + real(8), intent(in) :: E ! energy of incoming neutron + real(8) :: nu ! number of delayed neutrons emitted per fission if (nuc % nu_d_type == NU_NONE) then ! since no prompt or delayed data is present, this means all neutron diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 528ea40f51..e36dc60213 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2937,7 +2937,7 @@ contains ! Check if delayed group filter is used with any score besides ! delayed-nu-fission - if (trim(score_name) /= 'delayed-nu-fission' .and. & + if (score_name /= 'delayed-nu-fission' .and. & t % find_filter(FILTER_DELAYEDGROUP) > 0) then call fatal_error("Cannot tally " // trim(score_name) // " with a & &delayedgroup filter.") diff --git a/src/particle_header.F90 b/src/particle_header.F90 index b2f6c579e0..0b9b251ee5 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -106,7 +106,6 @@ contains subroutine initialize_particle(this) class(Particle) :: this - integer :: d ! Clear coordinate lists call this % clear() diff --git a/src/physics.F90 b/src/physics.F90 index 569b89bb09..52e65a4c5b 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1063,7 +1063,6 @@ contains integer, intent(in) :: i_nuclide integer, intent(in) :: i_reaction - integer :: d ! delayed group index integer :: nu_d(MAX_DELAYED_GROUPS) ! number of delayed neutrons born integer :: i ! loop index integer :: nu ! actual number of neutrons produced diff --git a/src/tally.F90 b/src/tally.F90 index 7ad174c9bc..c997d3e371 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -485,14 +485,8 @@ contains cycle SCORE_LOOP else - score = ZERO - - ! Loop over all delayed groups and accumulate the contribution - ! from each group - do d = 1, nuclides(p % event_nuclide) % n_precursor - score = score + keff * p % wgt_bank / p % n_bank * & - p % n_delayed_bank(d) - end do + ! Add the contribution from all delayed groups + score = keff * p % wgt_bank / p % n_bank * sum(p % n_delayed_bank) end if end if else @@ -579,12 +573,9 @@ contains ! Get index in nuclides array i_nuc = mat % nuclide(l) - ! Get the current nuclide - nuc => nuclides(i_nuc) - ! Accumulate the contribution from each nuclide score = score + micro_xs(i_nuc) % fission & - * nu_delayed(nuc, p % E) * atom_density_ * flux + * nu_delayed(nuclides(i_nuc), p % E) * atom_density_ * flux end do end if end if @@ -1049,9 +1040,9 @@ contains subroutine score_fission_delayed_eout(p, t, i_score) - type(Particle), intent(in) :: p - type(TallyObject), intent(in) :: t - integer, intent(in) :: i_score ! index for score + type(Particle), intent(in) :: p + type(TallyObject), intent(inout) :: t + integer, intent(in) :: i_score ! index for score integer :: i ! index of outgoing energy filter integer :: j ! index of delayedgroup filter @@ -1063,7 +1054,7 @@ contains integer :: bin_energyout ! original outgoing energy bin real(8) :: score ! actual score real(8) :: E_out ! energy of fission bank site - logical :: d_found = .FALSE. ! bool to inidicate if delayed group was found + logical :: d_found = .false. ! bool to inidicate if delayed group was found ! save original outgoing energy and delayed group bins i = t % find_filter(FILTER_ENERGYOUT) @@ -1132,9 +1123,9 @@ contains subroutine score_fission_delayed_dg(t, d_bin, score, score_index) - type(TallyObject) :: t - integer, intent(in) :: score_index ! index for score - integer, intent(in) :: d_bin ! delayed group bin index + type(TallyObject), intent(inout) :: t + integer, intent(in) :: score_index ! index for score + integer, intent(in) :: d_bin ! delayed group bin index integer :: bin_original ! original bin index integer :: filter_index ! index for matching filter bin combination diff --git a/src/tracking.F90 b/src/tracking.F90 index 391199bc08..2e4503e139 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -29,7 +29,6 @@ contains type(Particle), intent(inout) :: p - integer :: d ! delayed group index integer :: j ! coordinate level integer :: next_level ! next coordinate level to check integer :: surface_crossed ! surface which particle is on From 6038733a2234d8889503846fdda2e4a5aea1eceb Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 23 Oct 2015 18:54:36 -0400 Subject: [PATCH 377/519] changed constant for mass of neutron in MeV/c^2 and modified inverse-velocity documentation --- docs/source/usersguide/input.rst | 15 ++++++++++----- src/constants.F90 | 32 ++++++++++++++++---------------- src/tally.F90 | 4 ++-- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 8e52813bc2..726624cc85 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1390,9 +1390,11 @@ The ```` element accepts the following sub-elements: "events". These correspond to the following physical quantities: :flux: - Total flux in particle-cm per source particle. Note: The ``analog`` - estimator is actually identical to the ``collision`` estimator for the - flux score. + Total flux in particle-cm per source particle. + + .. note:: + The ``analog`` estimator is actually identical to the ``collision`` + estimator for the flux score. :total: Total reaction rate in reactions per source particle. @@ -1480,8 +1482,11 @@ The ```` element accepts the following sub-elements: :inverse-velocity: The flux-weighted inverse velocity where the velocity is in units of - meters per second. Note: The ``analog`` estimator is actually identical - to the ``collision`` estimator for the inverse-velocity score. + meters per second. + + .. note:: + The ``analog`` estimator is actually identical to the ``collision`` + estimator for the inverse-velocity score. :events: Number of scoring events. Units are events per source particle. diff --git a/src/constants.F90 b/src/constants.F90 index 2aceea15cf..19fccf2677 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -60,22 +60,22 @@ module constants ! Values here are from the Committee on Data for Science and Technology ! (CODATA) 2010 recommendation (doi:10.1103/RevModPhys.84.1527). - real(8), parameter :: & - PI = 3.1415926535898_8, & ! pi - MASS_NEUTRON = 1.008664916_8, & ! mass of a neutron in amu - MASS_PROTON = 1.007276466812_8, & ! mass of a proton in amu - AMU = 1.660538921e-27_8, & ! 1 amu in kg - AMU_MEV = 931.494061_8, & ! 1 amu in MeV/c^2 - C_LIGHT = 2.99792458e8_8, & ! speed of light in a vacuum - N_AVOGADRO = 0.602214129_8, & ! Avogadro's number in 10^24/mol - K_BOLTZMANN = 8.6173324e-11_8, & ! Boltzmann constant in MeV/K - INFINITY = huge(0.0_8), & ! positive infinity - ZERO = 0.0_8, & - HALF = 0.5_8, & - ONE = 1.0_8, & - TWO = 2.0_8, & - THREE = 3.0_8, & - FOUR = 4.0_8 + real(8), parameter :: & + PI = 3.1415926535898_8, & ! pi + MASS_NEUTRON = 1.008664916_8, & ! mass of a neutron in amu + MASS_NEUTRON_MEV = 939.565379_8, & ! mass of a neutron in MeV/c^2 + MASS_PROTON = 1.007276466812_8, & ! mass of a proton in amu + AMU = 1.660538921e-27_8, & ! 1 amu in kg + C_LIGHT = 2.99792458e8_8, & ! speed of light in a vacuum + N_AVOGADRO = 0.602214129_8, & ! Avogadro's number in 10^24/mol + K_BOLTZMANN = 8.6173324e-11_8, & ! Boltzmann constant in MeV/K + INFINITY = huge(0.0_8), & ! positive infinity + ZERO = 0.0_8, & + HALF = 0.5_8, & + ONE = 1.0_8, & + TWO = 2.0_8, & + THREE = 3.0_8, & + FOUR = 4.0_8 ! ============================================================================ ! GEOMETRY-RELATED CONSTANTS diff --git a/src/tally.F90 b/src/tally.F90 index 475cc09b10..ee07db56c1 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -140,11 +140,11 @@ contains score = p % last_wgt end if score = score / material_xs % total & - / (sqrt(2 * p % E / (MASS_NEUTRON * AMU_MEV)) * C_LIGHT) + / (sqrt(TWO * p % E / (MASS_NEUTRON_MEV)) * C_LIGHT) else ! For inverse velocity, we need no cross section - score = flux / (sqrt(2 * p % E / (MASS_NEUTRON * AMU_MEV)) * C_LIGHT) + score = flux / (sqrt(TWO * p % E / (MASS_NEUTRON_MEV)) * C_LIGHT) end if From 4089d6fb38c86179ebda9bfc6761b06d2df16454 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 24 Oct 2015 09:12:44 -0400 Subject: [PATCH 378/519] Put h5py import in Tally.sum property getter to make it an optional dependency for Python API --- openmc/tallies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 5b69371072..5c78b9d86b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -8,7 +8,6 @@ from xml.etree import ElementTree as ET import sys import numpy as np -import h5py from openmc import Mesh, Filter, Trigger, Nuclide from openmc.cross import CrossScore, CrossNuclide, CrossFilter @@ -269,6 +268,7 @@ class Tally(object): return None if not self._results_read: + import h5py # Open the HDF5 statepoint file f = h5py.File(self._sp_filename, 'r') From 0fa75f293bb848c81dea309272720d780a5a4ef0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 24 Oct 2015 10:04:19 -0400 Subject: [PATCH 379/519] Updated tally trigger score name key dictionary storage per recommendation by @paulromano --- openmc/trigger.py | 14 - src/input_xml.F90 | 9 +- tests/test_score_nuscatter_yn/geometry.xml | 148 +++++++++++ tests/test_score_nuscatter_yn/inputs_test.dat | 1 + tests/test_score_nuscatter_yn/materials.xml | 246 ++++++++++++++++++ tests/test_score_nuscatter_yn/settings.xml | 13 + tests/test_score_nuscatter_yn/tallies.xml | 11 + 7 files changed, 424 insertions(+), 18 deletions(-) create mode 100644 tests/test_score_nuscatter_yn/geometry.xml create mode 100644 tests/test_score_nuscatter_yn/inputs_test.dat create mode 100644 tests/test_score_nuscatter_yn/materials.xml create mode 100644 tests/test_score_nuscatter_yn/settings.xml create mode 100644 tests/test_score_nuscatter_yn/tallies.xml diff --git a/openmc/trigger.py b/openmc/trigger.py index 4019d5d468..9c7c660340 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -97,20 +97,6 @@ class Trigger(object): 'it is not a string'.format(score) raise ValueError(msg) - # If this is a total/flux/scattering moment, use generic moment order - regexp = re.compile(r'-[0-9]') - if regexp.search(score) is not None: - score = score.strip(regexp.findall(score)[0]) - score += '-n' - regexp = re.compile(r'-[p|P][0-9]') - if regexp.search(score) is not None: - score = score.strip(regexp.findall(score)[0]) - score += '-pn' - regexp = re.compile(r'-[y|Y][0-9]') - if regexp.search(score) is not None: - score = score.strip(regexp.findall(score)[0]) - score += '-yn' - # If the score is already in the Tally, don't add it again if score in self._scores: return diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 6d15f0d204..debe1309a2 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2796,6 +2796,10 @@ contains ! MOMENT_STRS(:) ! If so, check the order, store if OK, then reset the number to 'n' score_name = trim(sarray(j)) + + ! Append the score to the list of possible trigger scores + if (trigger_on) call trigger_scores % add_key(trim(score_name), j) + do imomstr = 1, size(MOMENT_STRS) if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then n_order_pos = scan(score_name,'0123456789') @@ -3196,11 +3200,8 @@ contains end if end select - - ! Append the score to the list of possible trigger scores - if (trigger_on) call trigger_scores % add_key(trim(score_name), l) - end do + t % n_score_bins = n_scores t % n_user_score_bins = n_words diff --git a/tests/test_score_nuscatter_yn/geometry.xml b/tests/test_score_nuscatter_yn/geometry.xml new file mode 100644 index 0000000000..ed66ef8e6b --- /dev/null +++ b/tests/test_score_nuscatter_yn/geometry.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 +1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 +1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + + + 1.26 1.26 + 17 17 + -10.71 -10.71 + +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 +3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 +3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 +5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 +5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 +5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 +5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 +5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 +5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 +5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 +5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 +5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 + + + 21.42 21.42 + 21 21 + -224.91 -224.91 + +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 +7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 +7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 +7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 +7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 +7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 +7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 +7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 +7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 +7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 +7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_score_nuscatter_yn/inputs_test.dat b/tests/test_score_nuscatter_yn/inputs_test.dat new file mode 100644 index 0000000000..632a144031 --- /dev/null +++ b/tests/test_score_nuscatter_yn/inputs_test.dat @@ -0,0 +1 @@ +205e5cac8129797b815f0e79dad6c41a1876157ba69fcffecf67c3603dc36ded5f0168f9961d51fcb7dc7db6d732e7a3e8f82d04947aa0309df56bb8333d4bc9 \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/materials.xml b/tests/test_score_nuscatter_yn/materials.xml new file mode 100644 index 0000000000..9454c0d8e6 --- /dev/null +++ b/tests/test_score_nuscatter_yn/materials.xml @@ -0,0 +1,246 @@ + + + 71c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_score_nuscatter_yn/settings.xml b/tests/test_score_nuscatter_yn/settings.xml new file mode 100644 index 0000000000..9e514829e6 --- /dev/null +++ b/tests/test_score_nuscatter_yn/settings.xml @@ -0,0 +1,13 @@ + + + + 100 + 10 + 0 + + + + -160 -160 -183 160 160 183 + + + diff --git a/tests/test_score_nuscatter_yn/tallies.xml b/tests/test_score_nuscatter_yn/tallies.xml new file mode 100644 index 0000000000..eeaad08291 --- /dev/null +++ b/tests/test_score_nuscatter_yn/tallies.xml @@ -0,0 +1,11 @@ + + + + + nu-scatter-0 + + + + nu-scatter-y3 + + From f44dccca26413d2a21745c8f3ee59797659e9657 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 24 Oct 2015 10:07:36 -0400 Subject: [PATCH 380/519] Removed extraneous test inputs added by last commit --- tests/test_score_nuscatter_yn/geometry.xml | 148 ----------- tests/test_score_nuscatter_yn/inputs_test.dat | 1 - tests/test_score_nuscatter_yn/materials.xml | 246 ------------------ tests/test_score_nuscatter_yn/settings.xml | 13 - tests/test_score_nuscatter_yn/tallies.xml | 11 - 5 files changed, 419 deletions(-) delete mode 100644 tests/test_score_nuscatter_yn/geometry.xml delete mode 100644 tests/test_score_nuscatter_yn/inputs_test.dat delete mode 100644 tests/test_score_nuscatter_yn/materials.xml delete mode 100644 tests/test_score_nuscatter_yn/settings.xml delete mode 100644 tests/test_score_nuscatter_yn/tallies.xml diff --git a/tests/test_score_nuscatter_yn/geometry.xml b/tests/test_score_nuscatter_yn/geometry.xml deleted file mode 100644 index ed66ef8e6b..0000000000 --- a/tests/test_score_nuscatter_yn/geometry.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 -1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 -1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - 1.26 1.26 - 17 17 - -10.71 -10.71 - -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 -3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 -3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - -5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 -5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 -5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 -5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 -5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 -5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 -5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 -5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 -5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 -5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 -5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 -5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 -5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 -5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - 21.42 21.42 - 21 21 - -224.91 -224.91 - -7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 -7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 -7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 -7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 -7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 -7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 -7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 -7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 -7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 -7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 -7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 -7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 -7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 -7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_yn/inputs_test.dat b/tests/test_score_nuscatter_yn/inputs_test.dat deleted file mode 100644 index 632a144031..0000000000 --- a/tests/test_score_nuscatter_yn/inputs_test.dat +++ /dev/null @@ -1 +0,0 @@ -205e5cac8129797b815f0e79dad6c41a1876157ba69fcffecf67c3603dc36ded5f0168f9961d51fcb7dc7db6d732e7a3e8f82d04947aa0309df56bb8333d4bc9 \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/materials.xml b/tests/test_score_nuscatter_yn/materials.xml deleted file mode 100644 index 9454c0d8e6..0000000000 --- a/tests/test_score_nuscatter_yn/materials.xml +++ /dev/null @@ -1,246 +0,0 @@ - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_yn/settings.xml b/tests/test_score_nuscatter_yn/settings.xml deleted file mode 100644 index 9e514829e6..0000000000 --- a/tests/test_score_nuscatter_yn/settings.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - 100 - 10 - 0 - - - - -160 -160 -183 160 160 183 - - - diff --git a/tests/test_score_nuscatter_yn/tallies.xml b/tests/test_score_nuscatter_yn/tallies.xml deleted file mode 100644 index eeaad08291..0000000000 --- a/tests/test_score_nuscatter_yn/tallies.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - nu-scatter-0 - - - - nu-scatter-y3 - - From fa9d874dff85627be942b4dd28f7e60012ecf145 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 24 Oct 2015 10:08:18 -0400 Subject: [PATCH 381/519] Removed unused import for re in trigger.py --- openmc/trigger.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openmc/trigger.py b/openmc/trigger.py index 9c7c660340..e695defde2 100644 --- a/openmc/trigger.py +++ b/openmc/trigger.py @@ -1,7 +1,6 @@ from numbers import Real from xml.etree import ElementTree as ET import sys -import re from openmc.checkvalue import check_type, check_value From 2ddc445cba9a079c9efde49c13ae7ecb2655e0c2 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 25 Oct 2015 10:25:02 -0400 Subject: [PATCH 382/519] modified score_fission_delayed_eout to provide more clarity --- src/tally.F90 | 54 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index c997d3e371..4d4d6bf938 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1052,29 +1052,29 @@ contains integer :: n ! number of energies on filter integer :: k ! loop index for bank sites integer :: bin_energyout ! original outgoing energy bin + integer :: i_filter ! index for matching filter bin combination real(8) :: score ! actual score real(8) :: E_out ! energy of fission bank site - logical :: d_found = .false. ! bool to inidicate if delayed group was found - ! save original outgoing energy and delayed group bins + ! Save original outgoing energy bin i = t % find_filter(FILTER_ENERGYOUT) - j = t % find_filter(FILTER_DELAYEDGROUP) bin_energyout = matching_bins(i) + ! Get the index of delayed group filter + j = t % find_filter(FILTER_DELAYEDGROUP) + ! Get number of energies on filter n = size(t % filters(i) % real_bins) ! Since the creation of fission sites is weighted such that it is ! expected to create n_particles sites, we need to multiply the - ! score by keff to get the true nu-fission rate. Otherwise, the sum - ! of all nu-fission rates would be ~1.0. + ! score by keff to get the true delayed-nu-fission rate. ! loop over number of particles banked do k = 1, p % n_bank ! get the delayed group g = fission_bank(n_bank - p % n_bank + k) % delayed_group - d_found = .FALSE. ! check if the particle was born delayed if (g /= 0) then @@ -1089,25 +1089,35 @@ contains if (E_out < t % filters(i) % real_bins(1) .or. & E_out > t % filters(i) % real_bins(n)) cycle - ! check if delayed group is in delayed group bins - if (j > 0) then - do d_bin = 1, t % filters(j) % n_bins - d = t % filters(j) % int_bins(d_bin) - if (d == g) then - d_found = .TRUE. - exit - end if - end do - - ! if the delayedgroup filter is present and the delayed group is not - ! one of the delayedgroup bins, go to next particle in bank. - if (d_found .eqv. .FALSE.) cycle - end if - ! change outgoing energy bin matching_bins(i) = binary_search(t % filters(i) % real_bins, n, E_out) - call score_fission_delayed_dg(t, d_bin, score, i_score) + ! if the delayed group filter is present, tally to corresponding + ! delayed group bin if it exists + if (j > 0) then + + ! loop over delayed group bins until the corresponding bin is found + do d_bin = 1, t % filters(j) % n_bins + d = t % filters(j) % int_bins(d_bin) + + ! check whether the delayed group of the particle is equal to the + ! delayed group of this bin + if (d == g) then + call score_fission_delayed_dg(t, d_bin, score, i_score) + end if + end do + + ! if the delayed group filter is not present, add score to tally + else + + ! determine scoring index + i_filter = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 + + ! Add score to tally +!$omp atomic + t % results(i_score, i_filter) % value = & + t % results(i_score, i_filter) % value + score + end if end if end do From 5799c05be4deba453ce3c24c22586c4f0fdadc7b Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 25 Oct 2015 17:54:15 -0400 Subject: [PATCH 383/519] added units to speed of light constant --- src/constants.F90 | 2 +- src/tally.F90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 19fccf2677..375c517e76 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -66,7 +66,7 @@ module constants MASS_NEUTRON_MEV = 939.565379_8, & ! mass of a neutron in MeV/c^2 MASS_PROTON = 1.007276466812_8, & ! mass of a proton in amu AMU = 1.660538921e-27_8, & ! 1 amu in kg - C_LIGHT = 2.99792458e8_8, & ! speed of light in a vacuum + C_LIGHT = 2.99792458e8_8, & ! speed of light in m/s N_AVOGADRO = 0.602214129_8, & ! Avogadro's number in 10^24/mol K_BOLTZMANN = 8.6173324e-11_8, & ! Boltzmann constant in MeV/K INFINITY = huge(0.0_8), & ! positive infinity diff --git a/src/tally.F90 b/src/tally.F90 index fa1c13965a..0586860191 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -129,7 +129,7 @@ contains case (SCORE_INVERSE_VELOCITY) if (t % estimator == ESTIMATOR_ANALOG) then - ! All events score to a inverse velocity bin. We actually use a + ! All events score to an inverse velocity bin. We actually use a ! collision estimator in place of an analog one since there is no way ! to count 'events' exactly for the inverse velocity if (survival_biasing) then From c2a53495cbc33d81ec056044258f13f9ef9d95e6 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 26 Oct 2015 05:29:25 -0500 Subject: [PATCH 384/519] Fix check when opening statepoint and fix documentation. Closes #464. --- docs/source/usersguide/output/statepoint.rst | 2 +- openmc/statepoint.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/source/usersguide/output/statepoint.rst b/docs/source/usersguide/output/statepoint.rst index d1ebc72312..d3c1729af6 100644 --- a/docs/source/usersguide/output/statepoint.rst +++ b/docs/source/usersguide/output/statepoint.rst @@ -4,7 +4,7 @@ State Point File Format ======================= -The current revision of the statepoint file format is 13. +The current revision of the statepoint file format is 14. **/filetype** (*char[]*) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 9e8177ba09..e64693746b 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -92,9 +92,14 @@ class StatePoint(object): self._f = h5py.File(filename, 'r') # Ensure filetype and revision are correct - if 'filetype' not in self._f or self._f[ - 'filetype'].value.decode() != 'statepoint': - raise IOError('{} is not a statepoint file.'.format(filename)) + try: + if 'filetype' not in self._f or self._f[ + 'filetype'].value.decode() != 'statepoint': + raise IOError('{} is not a statepoint file.'.format(filename)) + except AttributeError: + raise IOError('Could not read statepoint file. This most likely ' + 'means the statepoint file was produced by a different ' + 'version of OpenMC than the one you are using.') if self._f['revision'].value != 14: raise IOError('Statepoint file has a file revision of {} ' 'which is not consistent with the revision this ' From 19d821106c2c65f4e4909c6e14e7257960ca1516 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 26 Oct 2015 09:37:59 -0400 Subject: [PATCH 385/519] Fixed merge conflict with Filter.merge(...) routine --- openmc/filter.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 51c60caf86..8a5525233c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -302,11 +302,7 @@ class Filter(object): merged_filter = copy.deepcopy(self) # Merge unique filter bins -<<<<<<< HEAD - merged_bins = list(set(list(self.bins) + list(filter.bins))) -======= merged_bins = list(set(np.concatenate((self.bins, filter.bins)))) ->>>>>>> upstream/develop merged_filter.bins = merged_bins merged_filter.num_bins = len(merged_bins) From c2a29a607dbc053f766f200e8f1de701c5536c13 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 27 Oct 2015 17:36:24 -0400 Subject: [PATCH 386/519] Python API now clears xml element trees before exporting to xml --- .../examples/multi-group-cross-sections.ipynb | 366 ++++++++++-------- openmc/geometry.py | 3 + openmc/material.py | 3 + openmc/plots.py | 3 + openmc/settings.py | 8 + openmc/tallies.py | 3 + 6 files changed, 219 insertions(+), 167 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index de7d3c2a92..cfbc68d39c 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -465,8 +465,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-15 16:52:26\n", + " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", + " Date/Time: 2015-10-27 17:26:51\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -484,6 +484,7 @@ " 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", @@ -551,20 +552,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.0800E-01 seconds\n", - " Reading cross sections = 9.4000E-02 seconds\n", - " Total time in simulation = 2.4001E+01 seconds\n", - " Time in transport only = 2.3960E+01 seconds\n", - " Time in inactive batches = 2.0780E+00 seconds\n", - " Time in active batches = 2.1923E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 1.0480E+00 seconds\n", + " Reading cross sections = 3.3600E-01 seconds\n", + " Total time in simulation = 2.8493E+01 seconds\n", + " Time in transport only = 2.8402E+01 seconds\n", + " Time in inactive batches = 3.3050E+00 seconds\n", + " Time in active batches = 2.5188E+01 seconds\n", + " Time synchronizing fission bank = 6.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-02 seconds\n", - " Total time elapsed = 2.4427E+01 seconds\n", - " Calculation Rate (inactive) = 12030.8 neutrons/second\n", - " Calculation Rate (active) = 4561.42 neutrons/second\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 2.9569E+01 seconds\n", + " Calculation Rate (inactive) = 7564.30 neutrons/second\n", + " Calculation Rate (active) = 3970.14 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -679,7 +680,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1487: RuntimeWarning: invalid value encountered in divide\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide\n" ] } ], @@ -762,7 +763,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1014,10 +1015,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.498E-316\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 8.020E-317\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", @@ -1437,8 +1437,9 @@ }, "outputs": [], "source": [ - "# Create a tally trigger set to 10% on the relative error\n", - "tally_trigger = openmc.Trigger('rel_err', 1E-1)\n", + "# Create a tally trigger set to +/- 0.01 for each tally\n", + "# used to compute the multi-group cross sections\n", + "tally_trigger = openmc.Trigger('std_dev', 1E-2)\n", "\n", "# Add the tally trigger to each of the multi-group cross section tallies\n", "for cell in openmc_cells:\n", @@ -1447,7 +1448,8 @@ " \n", "# Set the trigger to active in the \"settings.xml\" file\n", "settings_file.trigger_active = True\n", - "settings_file.trigger_max_batches = settings_file.batches * 2\n", + "settings_file.particles *= 4\n", + "settings_file.trigger_max_batches = settings_file.batches * 4\n", "settings_file.export_to_xml()" ] }, @@ -1525,8 +1527,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-15 16:52:53\n", + " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", + " Date/Time: 2015-10-27 17:27:22\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1544,6 +1546,7 @@ " Loading ACE cross section table: 8016.71c\n", " Loading ACE cross section table: 1001.71c\n", " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -1552,58 +1555,78 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.27747 \n", - " 2/1 1.24641 \n", - " 3/1 1.23998 \n", - " 4/1 1.22236 \n", - " 5/1 1.22609 \n", - " 6/1 1.14473 \n", - " 7/1 1.21385 \n", - " 8/1 1.17205 \n", - " 9/1 1.18419 \n", - " 10/1 1.22500 \n", - " 11/1 1.24778 \n", - " 12/1 1.23680 1.24229 +/- 0.00549\n", - " 13/1 1.23752 1.24070 +/- 0.00355\n", - " 14/1 1.26918 1.24782 +/- 0.00755\n", - " 15/1 1.23346 1.24495 +/- 0.00651\n", - " 16/1 1.23687 1.24360 +/- 0.00549\n", - " 17/1 1.22006 1.24024 +/- 0.00573\n", - " 18/1 1.23162 1.23916 +/- 0.00508\n", - " 19/1 1.22456 1.23754 +/- 0.00476\n", - " 20/1 1.21237 1.23502 +/- 0.00495\n", - " 21/1 1.24915 1.23631 +/- 0.00466\n", - " 22/1 1.17014 1.23079 +/- 0.00696\n", - " 23/1 1.18388 1.22718 +/- 0.00735\n", - " 24/1 1.20614 1.22568 +/- 0.00697\n", - " 25/1 1.22888 1.22589 +/- 0.00649\n", - " 26/1 1.20734 1.22473 +/- 0.00618\n", - " 27/1 1.28731 1.22841 +/- 0.00688\n", - " 28/1 1.16533 1.22491 +/- 0.00737\n", - " 29/1 1.23361 1.22537 +/- 0.00699\n", - " 30/1 1.22054 1.22513 +/- 0.00663\n", - " 31/1 1.26417 1.22699 +/- 0.00658\n", - " 32/1 1.23181 1.22720 +/- 0.00627\n", - " 33/1 1.21074 1.22649 +/- 0.00604\n", - " 34/1 1.21642 1.22607 +/- 0.00580\n", - " 35/1 1.26934 1.22780 +/- 0.00582\n", - " 36/1 1.24095 1.22831 +/- 0.00562\n", - " 37/1 1.22300 1.22811 +/- 0.00541\n", - " 38/1 1.20875 1.22742 +/- 0.00526\n", - " 39/1 1.21748 1.22708 +/- 0.00508\n", - " 40/1 1.24938 1.22782 +/- 0.00497\n", - " 41/1 1.21652 1.22745 +/- 0.00482\n", - " 42/1 1.22642 1.22742 +/- 0.00467\n", - " 43/1 1.20158 1.22664 +/- 0.00459\n", - " 44/1 1.22475 1.22658 +/- 0.00445\n", - " 45/1 1.25199 1.22731 +/- 0.00438\n", - " 46/1 1.25905 1.22819 +/- 0.00435\n", - " 47/1 1.20490 1.22756 +/- 0.00428\n", - " 48/1 1.20016 1.22684 +/- 0.00423\n", - " 49/1 1.21094 1.22643 +/- 0.00414\n", - " 50/1 1.22919 1.22650 +/- 0.00403\n", - " Triggers satisfied for batch 50\n", + " 1/1 1.23985 \n", + " 2/1 1.24082 \n", + " 3/1 1.22031 \n", + " 4/1 1.21649 \n", + " 5/1 1.23229 \n", + " 6/1 1.21957 \n", + " 7/1 1.22515 \n", + " 8/1 1.21309 \n", + " 9/1 1.23939 \n", + " 10/1 1.23865 \n", + " 11/1 1.22776 \n", + " 12/1 1.21661 1.22219 +/- 0.00558\n", + " 13/1 1.22202 1.22213 +/- 0.00322\n", + " 14/1 1.23251 1.22473 +/- 0.00345\n", + " 15/1 1.23965 1.22771 +/- 0.00401\n", + " 16/1 1.21441 1.22549 +/- 0.00395\n", + " 17/1 1.23348 1.22663 +/- 0.00353\n", + " 18/1 1.21121 1.22471 +/- 0.00361\n", + " 19/1 1.20506 1.22252 +/- 0.00386\n", + " 20/1 1.22275 1.22255 +/- 0.00346\n", + " 21/1 1.21700 1.22204 +/- 0.00317\n", + " 22/1 1.20841 1.22091 +/- 0.00311\n", + " 23/1 1.21302 1.22030 +/- 0.00292\n", + " 24/1 1.22504 1.22064 +/- 0.00272\n", + " 25/1 1.22325 1.22081 +/- 0.00254\n", + " 26/1 1.22988 1.22138 +/- 0.00244\n", + " 27/1 1.21374 1.22093 +/- 0.00234\n", + " 28/1 1.21434 1.22056 +/- 0.00224\n", + " 29/1 1.24678 1.22194 +/- 0.00253\n", + " 30/1 1.22600 1.22215 +/- 0.00240\n", + " 31/1 1.22783 1.22242 +/- 0.00230\n", + " 32/1 1.23107 1.22281 +/- 0.00223\n", + " 33/1 1.23041 1.22314 +/- 0.00216\n", + " 34/1 1.21147 1.22266 +/- 0.00212\n", + " 35/1 1.23184 1.22302 +/- 0.00207\n", + " 36/1 1.22513 1.22310 +/- 0.00199\n", + " 37/1 1.22969 1.22335 +/- 0.00193\n", + " 38/1 1.21288 1.22297 +/- 0.00190\n", + " 39/1 1.23967 1.22355 +/- 0.00192\n", + " 40/1 1.21419 1.22324 +/- 0.00188\n", + " 41/1 1.23212 1.22352 +/- 0.00184\n", + " 42/1 1.20703 1.22301 +/- 0.00185\n", + " 43/1 1.24153 1.22357 +/- 0.00188\n", + " 44/1 1.23561 1.22392 +/- 0.00186\n", + " 45/1 1.20369 1.22335 +/- 0.00190\n", + " 46/1 1.24517 1.22395 +/- 0.00194\n", + " 47/1 1.22985 1.22411 +/- 0.00189\n", + " 48/1 1.23570 1.22442 +/- 0.00187\n", + " 49/1 1.22288 1.22438 +/- 0.00182\n", + " 50/1 1.20470 1.22389 +/- 0.00184\n", + " Triggers unsatisfied, max unc./thresh. is 1.18932 for flux in tally 10090\n", + " The estimated number of batches is 67\n", " Creating state point statepoint.050.h5...\n", + " 51/1 1.24158 1.22432 +/- 0.00185\n", + " 52/1 1.24407 1.22479 +/- 0.00186\n", + " 53/1 1.23412 1.22500 +/- 0.00183\n", + " 54/1 1.25172 1.22561 +/- 0.00189\n", + " 55/1 1.22653 1.22563 +/- 0.00185\n", + " 56/1 1.24741 1.22610 +/- 0.00187\n", + " 57/1 1.24342 1.22647 +/- 0.00186\n", + " 58/1 1.20365 1.22600 +/- 0.00189\n", + " 59/1 1.23576 1.22620 +/- 0.00186\n", + " 60/1 1.21398 1.22595 +/- 0.00184\n", + " 61/1 1.22186 1.22587 +/- 0.00180\n", + " 62/1 1.23502 1.22605 +/- 0.00178\n", + " 63/1 1.23328 1.22618 +/- 0.00175\n", + " 64/1 1.23990 1.22644 +/- 0.00173\n", + " 65/1 1.23283 1.22655 +/- 0.00171\n", + " 66/1 1.21605 1.22637 +/- 0.00169\n", + " 67/1 1.22322 1.22631 +/- 0.00166\n", + " Triggers satisfied for batch 67\n", + " Creating state point statepoint.067.h5...\n", "\n", " ===========================================================================\n", " ======================> SIMULATION FINISHED <======================\n", @@ -1612,27 +1635,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.1640E+00 seconds\n", - " Reading cross sections = 2.4900E-01 seconds\n", - " Total time in simulation = 1.2029E+02 seconds\n", - " Time in transport only = 1.2022E+02 seconds\n", - " Time in inactive batches = 1.1199E+01 seconds\n", - " Time in active batches = 1.0909E+02 seconds\n", - " Time synchronizing fission bank = 1.2000E-02 seconds\n", - " Sampling source sites = 6.0000E-03 seconds\n", - " SEND/RECV source sites = 5.0000E-03 seconds\n", + " Total time for initialization = 1.2520E+00 seconds\n", + " Reading cross sections = 2.9400E-01 seconds\n", + " Total time in simulation = 3.6113E+02 seconds\n", + " Time in transport only = 3.6098E+02 seconds\n", + " Time in inactive batches = 2.7487E+01 seconds\n", + " Time in active batches = 3.3365E+02 seconds\n", + " Time synchronizing fission bank = 3.4000E-02 seconds\n", + " Sampling source sites = 2.2000E-02 seconds\n", + " SEND/RECV source sites = 1.2000E-02 seconds\n", " Time accumulating tallies = 2.0000E-03 seconds\n", - " Total time for finalization = 2.8000E-02 seconds\n", - " Total time elapsed = 1.2151E+02 seconds\n", - " Calculation Rate (inactive) = 2232.34 neutrons/second\n", - " Calculation Rate (active) = 916.683 neutrons/second\n", + " Total time for finalization = 1.5000E-02 seconds\n", + " Total time elapsed = 3.6247E+02 seconds\n", + " Calculation Rate (inactive) = 3638.08 neutrons/second\n", + " Calculation Rate (active) = 1198.88 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.22693 +/- 0.00341\n", - " k-effective (Track-length) = 1.22650 +/- 0.00403\n", - " k-effective (Absorption) = 1.22829 +/- 0.00354\n", - " Combined k-effective = 1.22762 +/- 0.00298\n", + " k-effective (Collision) = 1.22548 +/- 0.00143\n", + " k-effective (Track-length) = 1.22631 +/- 0.00166\n", + " k-effective (Absorption) = 1.22204 +/- 0.00138\n", + " Combined k-effective = 1.22386 +/- 0.00114\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -1680,7 +1703,7 @@ "outputs": [], "source": [ "# Load the last statepoint and summary files\n", - "sp = openmc.StatePoint('statepoint.050.h5')\n", + "sp = openmc.StatePoint('statepoint.067.h5')\n", "su = openmc.Summary('summary.h5')\n", "sp.link_with_summary(su)" ] @@ -1745,25 +1768,25 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU-235\n", "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t3.30e+00 +/- 5.91e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 4.03e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.48e+01 +/- 5.56e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.84e+01 +/- 8.48e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 1.25e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 7.98e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 5.73e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 2.13e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 1.54e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.51e+01 +/- 2.36e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.76e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 4.10e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.94e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 3.44e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.37e-01%\n", "\n", "\tNuclide =\tU-238\n", "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 6.74e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.22e-03 +/- 8.28e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t4.75e-04 +/- 7.97e+00%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.53e-06 +/- 7.56e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 1.22e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 7.97e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t4.25e-05 +/- 5.72e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.47e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 3.07e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.72e-04 +/- 3.47e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.29e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.20e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.94e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 3.44e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.37e-01%\n", "\n", "\n", "\n" @@ -1798,14 +1821,14 @@ "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 6.42e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.52e-03 +/- 3.96e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 5.56e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.32e-02 +/- 8.48e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 1.25e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 1.09e+00%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 7.98e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t5.41e-01 +/- 5.73e-01%\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.53e-02 +/- 2.35e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.51e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.07e-02 +/- 2.36e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.76e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.10e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.94e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 3.44e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.37e-01%\n", "\n", "\n", "\n" @@ -1834,7 +1857,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1854,8 +1877,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1863,8 +1886,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1872,8 +1895,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1881,8 +1904,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1890,8 +1913,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1944,11 +1967,11 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 H-1 0.234877 0.010096\n", - "127 10002 1 1 O-16 1.560098 0.017801\n", - "124 10002 1 2 H-1 1.587815 0.007847\n", - "125 10002 1 2 O-16 0.288236 0.004397\n", - "122 10002 1 3 H-1 0.010122 0.000513\n", + "126 10002 1 1 H-1 0.233896 0.004410\n", + "127 10002 1 1 O-16 1.564488 0.007478\n", + "124 10002 1 2 H-1 1.589975 0.003196\n", + "125 10002 1 2 O-16 0.283697 0.001986\n", + "122 10002 1 3 H-1 0.010846 0.000225\n", "123 10002 1 3 O-16 0.000000 0.000000\n", "120 10002 1 4 H-1 0.000000 0.000000\n", "121 10002 1 4 O-16 0.000000 0.000000\n", @@ -2011,9 +2034,9 @@ "outputs": [ { "data": { - "image/png": "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\ned7lsJ91IAAAAABJRU5ErkJggg==\n", + "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2081,18 +2104,18 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU-235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.91e-03 +/- 1.22e+00%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 4.98e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.81e-03 +/- 4.72e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 2.09e-01%\n", "\n", "\tNuclide =\tU-238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 4.04e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 5.85e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.58e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.54e-01 +/- 2.46e-01%\n", "\n", "\tNuclide =\tO-16\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 4.10e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 6.46e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.73e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 2.64e-01%\n", "\n", "\n", "\n" @@ -2113,7 +2136,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
11H-10.2348770.0100960.2338960.004410
12711O-161.5600980.0178011.5644880.007478
12412H-11.5878150.0078471.5899750.003196
12512O-160.2882360.0043970.2836970.001986
12213H-10.0101220.0005130.0108460.000225
123
\n", " \n", " \n", @@ -2131,48 +2154,48 @@ " \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", + " \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", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
100001U-23521.0952560.25778720.8327040.098310
4100001U-2389.5893230.0387569.5744350.015117
5100001O-163.1591010.0129393.1619190.005466
0100002U-235485.5135302.418761484.1335131.011870
1100002U-23811.1788440.06542811.2151520.027565
2100002O-163.8000270.0245383.7988330.010031
\n", @@ -2180,12 +2203,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 21.095256 0.257787\n", - "4 10000 1 U-238 9.589323 0.038756\n", - "5 10000 1 O-16 3.159101 0.012939\n", - "0 10000 2 U-235 485.513530 2.418761\n", - "1 10000 2 U-238 11.178844 0.065428\n", - "2 10000 2 O-16 3.800027 0.024538" + "3 10000 1 U-235 20.832704 0.098310\n", + "4 10000 1 U-238 9.574435 0.015117\n", + "5 10000 1 O-16 3.161919 0.005466\n", + "0 10000 2 U-235 484.133513 1.011870\n", + "1 10000 2 U-238 11.215152 0.027565\n", + "2 10000 2 O-16 3.798833 0.010031" ] }, "execution_count": 47, @@ -2321,9 +2344,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.227616\n", - "openmoc keff = 1.225322\n", - "bias [pcm]: -229.3\n" + "openmc keff = 1.223863\n", + "openmoc keff = 1.222517\n", + "bias [pcm]: -134.7\n" ] } ], @@ -2415,9 +2438,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.227616\n", - "openmoc keff = 1.227093\n", - "bias [pcm]: -52.3\n" + "openmc keff = 1.223863\n", + "openmoc keff = 1.225691\n", + "bias [pcm]: 182.7\n" ] } ], @@ -2442,6 +2465,15 @@ "* Spatial discretization of OpenMOC's mesh\n", "* Constant-in-angle multi-group cross sections" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/openmc/geometry.py b/openmc/geometry.py index b57ac5623b..e848e0cddf 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -208,6 +208,9 @@ class GeometryFile(object): # Clear OpenMC written IDs used to optimize XML generation openmc.universe.WRITTEN_IDS = {} + # Reset xml element tree + self._geometry_file.clear() + root_universe = self.geometry.root_universe root_universe.create_xml_subelement(self._geometry_file) diff --git a/openmc/material.py b/openmc/material.py index 4c3a636965..41a67f6b70 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -581,6 +581,9 @@ class MaterialsFile(object): """ + # Reset xml element tree + self._materials_file.clear() + self._create_material_subelements() # Clean the indentation in the file to be user-readable diff --git a/openmc/plots.py b/openmc/plots.py index 07da4d8550..6cff095ec0 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -363,6 +363,9 @@ class PlotsFile(object): """ + # Reset xml element tree + self._plots_file.clear() + self._create_plot_subelements() # Clean the indentation in the file to be user-readable diff --git a/openmc/settings.py b/openmc/settings.py index 981166af51..dbf031e28c 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1178,6 +1178,14 @@ class SettingsFile(object): """ + # Reset xml element tree + self._settings_file.clear() + self._source_subelement = None + self._trigger_subelement = None + self._eigenvalue_subelement = None + self._source_element = None + + self._create_eigenvalue_subelement() self._create_source_subelement() self._create_output_subelement() diff --git a/openmc/tallies.py b/openmc/tallies.py index b2ae4b0001..03aa8e3a7c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2715,6 +2715,9 @@ class TalliesFile(object): """ + # Reset xml element tree + self._tallies_file.clear() + self._create_mesh_subelements() self._create_tally_subelements() From 93b692d2ddfdca786b21d5a375a2eb1804e286e6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 27 Oct 2015 17:37:22 -0400 Subject: [PATCH 387/519] Added newline to CrossFilter.__repr__() routine --- openmc/cross.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openmc/cross.py b/openmc/cross.py index b91344671a..435557ede7 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -298,6 +298,7 @@ class CrossFilter(object): string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type) string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins) return string + def __deepcopy__(self, memo): existing = memo.get(id(self)) @@ -461,4 +462,4 @@ class CrossFilter(object): right_df = right_df.astype(str) df = '(' + left_df + ' ' + self.binary_op + ' ' + right_df + ')' - return df \ No newline at end of file + return df From 31c1d39078b8320028128a33f5b83dc01e7c3379 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 08:22:16 -0400 Subject: [PATCH 388/519] Updated ipython notebook for mgxs per comments from @paulromano --- .../examples/multi-group-cross-sections.ipynb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index cfbc68d39c..a6dda13d61 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -288,7 +288,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of generic and abstract `MGXS` class:\n", + "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", "\n", "* `TotalXS`\n", "* `TransportXS`\n", @@ -666,7 +666,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The multi-group cross section objects can now use OpenMC's [tally arithmetic](http://mit-crpg.github.io/openmc/pythonapi/examples/pandas-dataframes.html) to compute cross sections from the tally data." + "The multi-group cross section objects can now use OpenMC's [tally arithmetic](http://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) to compute cross sections from the tally data." ] }, { @@ -1443,7 +1443,7 @@ "\n", "# Add the tally trigger to each of the multi-group cross section tallies\n", "for cell in openmc_cells:\n", - " for mgxs_type in xs_library[cell.id].keys():\n", + " for mgxs_type in xs_library[cell.id]:\n", " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger\n", " \n", "# Set the trigger to active in the \"settings.xml\" file\n", @@ -1473,7 +1473,7 @@ "\n", "# Iterate over all cells and cross section types\n", "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id].keys():\n", + " for rxn_type in xs_library[cell.id]:\n", "\n", " # Set the cross sections domain type to the cell\n", " xs_library[cell.id][rxn_type].domain = cell\n", @@ -1725,7 +1725,7 @@ "source": [ "# Iterate over all cells and cross section types\n", "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id].keys():\n", + " for rxn_type in xs_library[cell.id]:\n", " xs_library[cell.id][rxn_type].load_from_statepoint(sp)\n", " xs_library[cell.id][rxn_type].compute_xs()" ] From e57ca85a7c99e2fc571d1bedc2832104cc3a513f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 08:24:23 -0400 Subject: [PATCH 389/519] Added num_groups to the docstring for openmc.mgxs.EnergyGroups --- openmc/mgxs/groups.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index db01e61255..3436c0e037 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -24,6 +24,8 @@ class EnergyGroups(object): ---------- group_edges : Iterable of Real The energy group boundaries [MeV] + num_group : Integral + The number of energy groups """ @@ -233,4 +235,4 @@ class EnergyGroups(object): condensed_groups = EnergyGroups() condensed_groups.group_edges = group_edges - return condensed_groups \ No newline at end of file + return condensed_groups From 0862adfcb7724c5a459029c5f13e01540c72d837 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 28 Oct 2015 08:25:21 -0500 Subject: [PATCH 390/519] Fix MGXS documentation problems --- docs/source/pythonapi/mgxs.rst | 2 +- docs/source/pythonapi/opencg_compatible.rst | 10 +++++----- openmc/filter.py | 5 +++-- openmc/mgxs/library.py | 4 +--- openmc/mgxs/mgxs.py | 12 +++++------- openmc/tallies.py | 2 +- 6 files changed, 16 insertions(+), 19 deletions(-) diff --git a/docs/source/pythonapi/mgxs.rst b/docs/source/pythonapi/mgxs.rst index 04e2a99de3..28f125a527 100644 --- a/docs/source/pythonapi/mgxs.rst +++ b/docs/source/pythonapi/mgxs.rst @@ -5,4 +5,4 @@ Multi-Group Cross Sections ========================== .. automodule:: openmc.mgxs.mgxs - :members: MGXS + :members: diff --git a/docs/source/pythonapi/opencg_compatible.rst b/docs/source/pythonapi/opencg_compatible.rst index c8ba82e8cc..c807e19cc6 100644 --- a/docs/source/pythonapi/opencg_compatible.rst +++ b/docs/source/pythonapi/opencg_compatible.rst @@ -1,8 +1,8 @@ -.. _pythonapi_openmc_mgxs: +.. _pythonapi_opencg_compatible: -========================== -Multi-Group Cross Sections -========================== +==================== +OpenCG Compatibility +==================== -.. automodule:: openmc.mgxs.mgxs +.. automodule:: openmc.opencg_compatible :members: diff --git a/openmc/filter.py b/openmc/filter.py index 8a5525233c..5c0343df75 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -511,8 +511,9 @@ class Filter(object): surface, material or universe ID corresponding to each filter bin. For 'distribcell' filters, the DataFrame either includes: - 1) a single column with the cell instance IDs (without summary info) - 2) separate columns for the cell IDs, universe IDs, and lattice IDs + + 1. a single column with the cell instance IDs (without summary info) + 2. separate columns for the cell IDs, universe IDs, and lattice IDs and x,y,z cell indices corresponding to each (with summary info). For 'energy' and 'energyout' filters, the DataFrame include a single diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 32f9c937a3..c6206c2d62 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -330,9 +330,7 @@ class Library(object): ---------- domain : Material or Cell or Universe or Integral The material, cell, or universe object of interest (or its ID) - mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', - 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', - 'nu-scatter matrix', 'chi'} + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'} The type of multi-group cross section object to return Returns diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 775c519411..eb600f046f 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -247,9 +247,7 @@ class MGXS(object): Parameters ---------- - mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', - 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', - 'nu-scatter matrix', 'chi'} + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'} The type of multi-group cross section object to return domain : Material or Cell or Universe The domain for spatial homogenization @@ -327,8 +325,8 @@ class MGXS(object): """Get the atomic number density in units of atoms/b-cm for a nuclide in the cross section's spatial domain. - Paramters - --------- + Parameters + ---------- nuclide : str A nuclide name string (e.g., 'U-235') @@ -362,8 +360,8 @@ class MGXS(object): """Get an array of atomic number densities in units of atom/b-cm for all nuclides in the cross section's spatial domain. - Paramters - --------- + Parameters + ---------- nuclides : Iterable of str or 'all' or 'sum' A list of nuclide name strings (e.g., ['U-235', 'U-238']). The special string 'all' will return the atom densities for all nuclides diff --git a/openmc/tallies.py b/openmc/tallies.py index 03aa8e3a7c..c9e4854e29 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1269,7 +1269,7 @@ class Tally(object): correspond directly to the two filters with two and four bins. Parameters - --------- + ---------- value : str A string for the type of value to return - 'mean' (default), 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted From b52fe4505540346d4647c8ebb7c043cacb86be1d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 28 Oct 2015 08:41:05 -0500 Subject: [PATCH 391/519] Make sure MGXS appears first in documentation --- docs/source/pythonapi/mgxs.rst | 35 +++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/source/pythonapi/mgxs.rst b/docs/source/pythonapi/mgxs.rst index 28f125a527..82bfdd2751 100644 --- a/docs/source/pythonapi/mgxs.rst +++ b/docs/source/pythonapi/mgxs.rst @@ -4,5 +4,38 @@ Multi-Group Cross Sections ========================== -.. automodule:: openmc.mgxs.mgxs +.. autoclass:: openmc.mgxs.mgxs.MGXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.AbsorptionXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.CaptureXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.Chi + :members: + +.. autoclass:: openmc.mgxs.mgxs.FissionXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.NuFissionXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.NuScatterXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.NuScatterMatrixXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.ScatterXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.ScatterMatrixXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.TotalXS + :members: + +.. autoclass:: openmc.mgxs.mgxs.TransportXS :members: From 0cc1e6c09357321505052e3ea61456c9de9a4878 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 28 Oct 2015 09:09:28 -0500 Subject: [PATCH 392/519] Add summary of classes available in openmc.mgxs.mgxs module --- docs/source/conf.py | 1 + docs/source/pythonapi/mgxs.rst | 49 +++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 4a18f14de5..05559aab08 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -27,6 +27,7 @@ sys.path.insert(0, os.path.abspath('../..')) extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.pngmath', + 'sphinx.ext.autosummary', 'sphinxcontrib.tikz', 'sphinx_numfig', 'notebook_sphinxext'] diff --git a/docs/source/pythonapi/mgxs.rst b/docs/source/pythonapi/mgxs.rst index 82bfdd2751..c7084e5653 100644 --- a/docs/source/pythonapi/mgxs.rst +++ b/docs/source/pythonapi/mgxs.rst @@ -4,38 +4,63 @@ Multi-Group Cross Sections ========================== -.. autoclass:: openmc.mgxs.mgxs.MGXS +.. currentmodule:: openmc.mgxs.mgxs + +---------------------------- +Summary of Available Classes +---------------------------- + +.. autosummary:: + + MGXS + AbsorptionXS + CaptureXS + Chi + FissionXS + NuFissionXS + NuScatterXS + NuScatterMatrixXS + ScatterXS + ScatterMatrixXS + TotalXS + TransportXS + +------------------- +Class Documentation +------------------- + +.. autoclass:: MGXS :members: -.. autoclass:: openmc.mgxs.mgxs.AbsorptionXS +.. autoclass:: AbsorptionXS :members: -.. autoclass:: openmc.mgxs.mgxs.CaptureXS +.. autoclass:: CaptureXS :members: -.. autoclass:: openmc.mgxs.mgxs.Chi +.. autoclass:: Chi :members: -.. autoclass:: openmc.mgxs.mgxs.FissionXS +.. autoclass:: FissionXS :members: -.. autoclass:: openmc.mgxs.mgxs.NuFissionXS +.. autoclass:: NuFissionXS :members: -.. autoclass:: openmc.mgxs.mgxs.NuScatterXS +.. autoclass:: NuScatterXS :members: -.. autoclass:: openmc.mgxs.mgxs.NuScatterMatrixXS +.. autoclass:: NuScatterMatrixXS :members: -.. autoclass:: openmc.mgxs.mgxs.ScatterXS +.. autoclass:: ScatterXS :members: -.. autoclass:: openmc.mgxs.mgxs.ScatterMatrixXS +.. autoclass:: ScatterMatrixXS :members: -.. autoclass:: openmc.mgxs.mgxs.TotalXS +.. autoclass:: TotalXS :members: -.. autoclass:: openmc.mgxs.mgxs.TransportXS +.. autoclass:: TransportXS :members: From 370c942977166a434a2f21c07a68f0f0b3ebfbcc Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 10:36:43 -0400 Subject: [PATCH 393/519] Removed MGXS subclass create_tallies routines in place of tallies property getters --- .../examples/multi-group-cross-sections.ipynb | 199 +++++----- openmc/mgxs/library.py | 1 - openmc/mgxs/mgxs.py | 370 +++++++++++------- 3 files changed, 310 insertions(+), 260 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index a6dda13d61..845c71118c 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -309,7 +309,7 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -324,7 +324,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we must instruct our multi-group cross section objects to generate the tallies needed to calculate each of them in OpenMC. This can be done with the `MGXS.create_tallies()` routine." + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " ] }, { @@ -333,34 +333,12 @@ "metadata": { "collapsed": false }, - "outputs": [], - "source": [ - "# Instruct each multi-group cross section to generate tallies\n", - "transport.create_tallies()\n", - "nufission.create_tallies()\n", - "nuscatter.create_tallies()\n", - "chi.create_tallies()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, "outputs": [ { "data": { "text/plain": [ "OrderedDict([('flux', Tally\n", - "\tID =\t10003\n", + "\tID =\t10000\n", "\tName =\t\n", "\tFilters =\t\n", " \t\tcell\t[1]\n", @@ -371,7 +349,7 @@ "\tScores =\t['flux']\n", "\tEstimator =\ttracklength\n", "), ('nu-fission', Tally\n", - "\tID =\t10004\n", + "\tID =\t10001\n", "\tName =\t\n", "\tFilters =\t\n", " \t\tcell\t[1]\n", @@ -384,7 +362,7 @@ ")])" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -402,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -440,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -466,7 +444,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-27 17:26:51\n", + " Date/Time: 2015-10-28 10:30:50\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -552,20 +530,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.0480E+00 seconds\n", - " Reading cross sections = 3.3600E-01 seconds\n", - " Total time in simulation = 2.8493E+01 seconds\n", - " Time in transport only = 2.8402E+01 seconds\n", - " Time in inactive batches = 3.3050E+00 seconds\n", - " Time in active batches = 2.5188E+01 seconds\n", - " Time synchronizing fission bank = 6.0000E-03 seconds\n", + " Total time for initialization = 3.9900E-01 seconds\n", + " Reading cross sections = 9.3000E-02 seconds\n", + " Total time in simulation = 1.3697E+01 seconds\n", + " Time in transport only = 1.3685E+01 seconds\n", + " Time in inactive batches = 1.8610E+00 seconds\n", + " Time in active batches = 1.1836E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 4.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 2.9569E+01 seconds\n", - " Calculation Rate (inactive) = 7564.30 neutrons/second\n", - " Calculation Rate (active) = 3970.14 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.4106E+01 seconds\n", + " Calculation Rate (inactive) = 13433.6 neutrons/second\n", + " Calculation Rate (active) = 8448.80 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -583,7 +561,7 @@ "0" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -610,7 +588,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -629,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -649,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -671,7 +649,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -714,7 +692,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -755,11 +733,18 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1250: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" + ] + }, { "data": { "text/html": [ @@ -885,7 +870,7 @@ "54 1 2 2 total 0.266499 0.001265" ] }, - "execution_count": 21, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -904,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": { "collapsed": true }, @@ -922,7 +907,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -950,7 +935,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -972,7 +957,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": { "collapsed": true }, @@ -1006,7 +991,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -1015,9 +1000,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Importing ray tracing data from file...\n", + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 8.020E-317\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.350E-316\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", @@ -1167,7 +1153,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "metadata": { "collapsed": false }, @@ -1230,7 +1216,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -1264,7 +1250,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "metadata": { "collapsed": true }, @@ -1290,7 +1276,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "metadata": { "collapsed": true }, @@ -1319,7 +1305,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -1356,7 +1342,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -1381,7 +1367,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "metadata": { "collapsed": true }, @@ -1408,7 +1394,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1431,7 +1417,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1462,7 +1448,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1481,9 +1467,6 @@ " \n", " # Tally cross sections by nuclide (e.g., micro cross sections)\n", " xs_library[cell.id][rxn_type].by_nuclide = True\n", - " \n", - " # Create OpenMC tallies for this cross section\n", - " xs_library[cell.id][rxn_type].create_tallies()\n", " \n", " # Add OpenMC tallies to the tallies file for XML generation\n", " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", @@ -1502,7 +1485,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1528,7 +1511,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-27 17:27:22\n", + " Date/Time: 2015-10-28 10:31:06\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1605,7 +1588,7 @@ " 48/1 1.23570 1.22442 +/- 0.00187\n", " 49/1 1.22288 1.22438 +/- 0.00182\n", " 50/1 1.20470 1.22389 +/- 0.00184\n", - " Triggers unsatisfied, max unc./thresh. is 1.18932 for flux in tally 10090\n", + " Triggers unsatisfied, max unc./thresh. is 1.18932 for flux in tally 10080\n", " The estimated number of batches is 67\n", " Creating state point statepoint.050.h5...\n", " 51/1 1.24158 1.22432 +/- 0.00185\n", @@ -1635,20 +1618,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.2520E+00 seconds\n", - " Reading cross sections = 2.9400E-01 seconds\n", - " Total time in simulation = 3.6113E+02 seconds\n", - " Time in transport only = 3.6098E+02 seconds\n", - " Time in inactive batches = 2.7487E+01 seconds\n", - " Time in active batches = 3.3365E+02 seconds\n", - " Time synchronizing fission bank = 3.4000E-02 seconds\n", - " Sampling source sites = 2.2000E-02 seconds\n", - " SEND/RECV source sites = 1.2000E-02 seconds\n", - " Time accumulating tallies = 2.0000E-03 seconds\n", - " Total time for finalization = 1.5000E-02 seconds\n", - " Total time elapsed = 3.6247E+02 seconds\n", - " Calculation Rate (inactive) = 3638.08 neutrons/second\n", - " Calculation Rate (active) = 1198.88 neutrons/second\n", + " Total time for initialization = 3.8900E-01 seconds\n", + " Reading cross sections = 8.4000E-02 seconds\n", + " Total time in simulation = 2.2985E+02 seconds\n", + " Time in transport only = 2.2979E+02 seconds\n", + " Time in inactive batches = 1.3571E+01 seconds\n", + " Time in active batches = 2.1628E+02 seconds\n", + " Time synchronizing fission bank = 1.5000E-02 seconds\n", + " Sampling source sites = 1.0000E-02 seconds\n", + " SEND/RECV source sites = 5.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 8.0000E-03 seconds\n", + " Total time elapsed = 2.3028E+02 seconds\n", + " Calculation Rate (inactive) = 7368.65 neutrons/second\n", + " Calculation Rate (active) = 1849.45 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1666,7 +1649,7 @@ "0" ] }, - "execution_count": 37, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1696,7 +1679,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1717,7 +1700,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1753,7 +1736,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1807,7 +1790,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 40, "metadata": { "collapsed": false }, @@ -1849,7 +1832,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -1979,7 +1962,7 @@ "119 10002 1 5 O-16 0.000000 0.000000" ] }, - "execution_count": 42, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1999,7 +1982,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -2027,7 +2010,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -2036,7 +2019,7 @@ "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2067,7 +2050,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 44, "metadata": { "collapsed": true }, @@ -2089,7 +2072,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 45, "metadata": { "collapsed": false }, @@ -2128,7 +2111,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -2211,7 +2194,7 @@ "2 10000 2 O-16 3.798833 0.010031" ] }, - "execution_count": 47, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -2237,7 +2220,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -2259,7 +2242,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -2307,7 +2290,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -2335,7 +2318,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -2370,7 +2353,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2411,7 +2394,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 52, "metadata": { "collapsed": false }, @@ -2429,7 +2412,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 53, "metadata": { "collapsed": false }, diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 32f9c937a3..c135eeea7b 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -248,7 +248,6 @@ class Library(object): if isinstance(mgxs, openmc.mgxs.ScatterMatrixXS): mgxs.correction = self.correction - mgxs.create_tallies() self.all_mgxs[domain.id][mgxs_type] = mgxs def add_to_tallies_file(self, tallies_file, merge=True): diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 775c519411..65e80f0d33 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -41,7 +41,7 @@ DOMAIN_TYPES = ['cell', # Supported domain classes # TODO: Implement Mesh domains -_DOMAINS = [openmc.Cell, +DOMAINS = [openmc.Cell, openmc.Universe, openmc.Material] @@ -106,7 +106,7 @@ class MGXS(object): self._domain_type = None self._energy_groups = None self._tally_trigger = None - self._tallies = OrderedDict() + self._tallies = None self._xs_tally = None self.name = name @@ -409,7 +409,6 @@ class MGXS(object): return densities - @abc.abstractmethod def create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross section. @@ -437,6 +436,8 @@ class MGXS(object): cv.check_type('keys', keys, Iterable, basestring) cv.check_value('estimator', estimator, ['analog', 'tracklength']) + self._tallies = OrderedDict() + # Create a domain Filter object domain_filter = openmc.Filter(self.domain_type, self.domain.id) @@ -535,9 +536,6 @@ class MGXS(object): 'which is not yet supported'.format(self.domain_type) raise ValueError(msg) - # Create Tallies to search for in StatePoint - self.create_tallies() - # Use tally "slicing" to ensure that tallies correspond to our domain # NOTE: This is important if tally merging was used if self.domain_type != 'distribcell': @@ -1263,7 +1261,8 @@ class TotalXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'total' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two tracklength tallies to compute the 'flux' @@ -1272,18 +1271,24 @@ class TotalXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'total'] - estimator = 'tracklength' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'total'] + estimator = 'tracklength' + keys = scores - # Initialize the Tallies - super(TotalXS, self).create_tallies(scores, filters, keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Initialize the Tallies + super(TotalXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(TotalXS, self).tallies def compute_xs(self): """Computes the multi-group total cross sections using OpenMC @@ -1303,7 +1308,8 @@ class TransportXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'transport' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs three analog tallies to compute the 'flux', @@ -1312,20 +1318,25 @@ class TransportXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'total', 'scatter-P1'] - estimator = 'analog' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - energyout_filter = openmc.Filter('energyout', group_edges) - filters = [[energy_filter], [energy_filter], [energyout_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'total', 'scatter-P1'] + estimator = 'analog' + keys = scores - # Initialize the Tallies - super(TransportXS, self).create_tallies(scores, filters, - keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + energyout_filter = openmc.Filter('energyout', group_edges) + filters = [[energy_filter], [energy_filter], [energyout_filter]] + + # Initialize the Tallies + super(TransportXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(TransportXS, self).tallies def load_from_statepoint(self, statepoint): """Extracts tallies in an OpenMC StatePoint with the data needed to @@ -1375,7 +1386,8 @@ class AbsorptionXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'absorption' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two tracklength tallies to compute the 'flux' @@ -1384,19 +1396,24 @@ class AbsorptionXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'absorption'] - estimator = 'tracklength' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'absorption'] + estimator = 'tracklength' + keys = scores - # Initialize the Tallies - super(AbsorptionXS, self).create_tallies(scores, filters, - keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Initialize the Tallies + super(AbsorptionXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(AbsorptionXS, self).tallies def compute_xs(self): """Computes the multi-group absorption cross sections using OpenMC @@ -1415,7 +1432,8 @@ class CaptureXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'capture' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two tracklength tallies to compute the 'flux' @@ -1424,18 +1442,24 @@ class CaptureXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'absorption', 'fission'] - estimator = 'tracklength' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'absorption', 'fission'] + estimator = 'tracklength' + keys = scores - # Initialize the Tallies - super(CaptureXS, self).create_tallies(scores, filters, keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter], [energy_filter]] + + # Initialize the Tallies + super(CaptureXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(CaptureXS, self).tallies def compute_xs(self): """Computes the multi-group capture cross sections using OpenMC @@ -1455,7 +1479,8 @@ class FissionXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'fission' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two tracklength tallies to compute the 'flux' @@ -1464,18 +1489,24 @@ class FissionXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'fission'] - estimator = 'tracklength' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'fission'] + estimator = 'tracklength' + keys = scores - # Initialize the Tallies - super(FissionXS, self).create_tallies(scores, filters, keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Initialize the Tallies + super(FissionXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(FissionXS, self).tallies def compute_xs(self): """Computes the multi-group fission cross sections using OpenMC @@ -1494,7 +1525,8 @@ class NuFissionXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'nu-fission' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two tracklength tallies to compute the 'flux' @@ -1503,19 +1535,24 @@ class NuFissionXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'nu-fission'] - estimator = 'tracklength' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'nu-fission'] + estimator = 'tracklength' + keys = scores - # Initialize the Tallies - super(NuFissionXS, self).create_tallies(scores, filters, - keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Initialize the Tallies + super(NuFissionXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(NuFissionXS, self).tallies def compute_xs(self): """Computes the multi-group nu-fission cross sections using OpenMC @@ -1534,7 +1571,8 @@ class ScatterXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'scatter' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two tracklength tallies to compute the 'flux' @@ -1543,18 +1581,24 @@ class ScatterXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'scatter'] - estimator = 'tracklength' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'scatter'] + estimator = 'tracklength' + keys = scores - # Intialize the Tallies - super(ScatterXS, self).create_tallies(scores, filters, keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Intialize the Tallies + super(ScatterXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(ScatterXS, self).tallies def compute_xs(self): """Computes the scattering multi-group cross sections using @@ -1573,7 +1617,8 @@ class NuScatterXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'nu-scatter' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two analog tallies to compute the 'flux' @@ -1582,19 +1627,24 @@ class NuScatterXS(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['flux', 'nu-scatter'] - estimator = 'analog' - keys = scores + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy_filter = openmc.Filter('energy', group_edges) - filters = [[energy_filter], [energy_filter]] + # Create a list of scores for each Tally to be created + scores = ['flux', 'nu-scatter'] + estimator = 'analog' + keys = scores - # Initialize the Tallies - super(NuScatterXS, self).create_tallies(scores, filters, - keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + filters = [[energy_filter], [energy_filter]] + + # Initialize the Tallies + super(NuScatterXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(NuScatterXS, self).tallies def compute_xs(self): """Computes the nu-scattering multi-group cross section using OpenMC @@ -1630,12 +1680,8 @@ class ScatterMatrixXS(MGXS): def correction(self): return self._correction - @correction.setter - def correction(self, correction): - cv.check_value('correction', correction, ('P0', None)) - self._correction = correction - - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs three analog tallies to compute the 'flux', @@ -1644,24 +1690,34 @@ class ScatterMatrixXS(MGXS): """ - group_edges = self.energy_groups.group_edges - energy = openmc.Filter('energy', group_edges) - energyout = openmc.Filter('energyout', group_edges) + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create a list of scores for each Tally to be created - if self.correction == 'P0': - scores = ['flux', 'scatter', 'scatter-P1'] - filters = [[energy], [energy, energyout], [energyout]] - else: - scores = ['flux', 'scatter'] - filters = [[energy], [energy, energyout]] + group_edges = self.energy_groups.group_edges + energy = openmc.Filter('energy', group_edges) + energyout = openmc.Filter('energyout', group_edges) - estimator = 'analog' - keys = scores + # Create a list of scores for each Tally to be created + if self.correction == 'P0': + scores = ['flux', 'scatter', 'scatter-P1'] + filters = [[energy], [energy, energyout], [energyout]] + else: + scores = ['flux', 'scatter'] + filters = [[energy], [energy, energyout]] - # Initialize the Tallies - super(ScatterMatrixXS, self).create_tallies(scores, filters, - keys, estimator) + estimator = 'analog' + keys = scores + + # Initialize the Tallies + super(ScatterMatrixXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(ScatterMatrixXS, self).tallies + + @correction.setter + def correction(self, correction): + cv.check_value('correction', correction, ('P0', None)) + self._correction = correction def compute_xs(self, correction='P0'): """Computes the multi-group scattering matrix using OpenMC @@ -1943,7 +1999,8 @@ class NuScatterMatrixXS(ScatterMatrixXS): groups, by_nuclide, name) self._rxn_type = 'nu-scatter matrix' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs three analog tallies to compute the 'flux', @@ -1952,26 +2009,31 @@ class NuScatterMatrixXS(ScatterMatrixXS): """ - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energy = openmc.Filter('energy', group_edges) - energyout = openmc.Filter('energyout', group_edges) + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create a list of scores for each Tally to be created - if self.correction == 'P0': - scores = ['flux', 'nu-scatter', 'scatter-P1'] - estimator = 'analog' - keys = ['flux', 'scatter', 'scatter-P1'] - filters = [[energy], [energy, energyout], [energyout]] - else: - scores = ['flux', 'nu-scatter'] - estimator = 'analog' - keys = ['flux', 'scatter'] - filters = [[energy], [energy, energyout]] + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy = openmc.Filter('energy', group_edges) + energyout = openmc.Filter('energyout', group_edges) - # Intialize the Tallies - super(ScatterMatrixXS, self).create_tallies(scores, filters, - keys, estimator) + # Create a list of scores for each Tally to be created + if self.correction == 'P0': + scores = ['flux', 'nu-scatter', 'scatter-P1'] + estimator = 'analog' + keys = ['flux', 'scatter', 'scatter-P1'] + filters = [[energy], [energy, energyout], [energyout]] + else: + scores = ['flux', 'nu-scatter'] + estimator = 'analog' + keys = ['flux', 'scatter'] + filters = [[energy], [energy, energyout]] + + # Intialize the Tallies + super(ScatterMatrixXS, self).create_tallies(scores, filters, + keys, estimator) + + return super(ScatterMatrixXS, self).tallies class Chi(MGXS): """The fission spectrum.""" @@ -1981,7 +2043,8 @@ class Chi(MGXS): super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'chi' - def create_tallies(self): + @property + def tallies(self): """Construct the OpenMC tallies needed to compute this cross section. This method constructs two analog tallies to compute 'nu-fission' @@ -1990,19 +2053,24 @@ class Chi(MGXS): """ - # Create a list of scores for each Tally to be created - scores = ['nu-fission', 'nu-fission'] - estimator = 'analog' - keys = ['nu-fission-in', 'nu-fission-out'] + # Instantiate tallies if they do not exist + if self._tallies is None: - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energyout = openmc.Filter('energyout', group_edges) - energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) - filters = [[energyin], [energyout]] + # Create a list of scores for each Tally to be created + scores = ['nu-fission', 'nu-fission'] + estimator = 'analog' + keys = ['nu-fission-in', 'nu-fission-out'] - # Intialize the Tallies - super(Chi, self).create_tallies(scores, filters, keys, estimator) + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energyout = openmc.Filter('energyout', group_edges) + energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) + filters = [[energyin], [energyout]] + + # Intialize the Tallies + super(Chi, self).create_tallies(scores, filters, keys, estimator) + + return super(Chi, self).tallies def compute_xs(self): """Computes chi fission spectrum using OpenMC tally arithmetic.""" From 4c18f5b826dd673046029694cd354f7fec709a08 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 11:42:19 -0400 Subject: [PATCH 394/519] Made MGXS subclasses call compute_xs from load_from_statepint --- .../examples/multi-group-cross-sections.ipynb | 181 ++++++++---------- openmc/mgxs/library.py | 11 +- openmc/mgxs/mgxs.py | 64 +++---- openmc/settings.py | 1 - tests/test_track_output/results_test.dat | 9 - 5 files changed, 109 insertions(+), 157 deletions(-) delete mode 100644 tests/test_track_output/results_test.dat diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 845c71118c..99ab3b26f7 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -444,7 +444,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 10:30:50\n", + " Date/Time: 2015-10-28 11:38:06\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -530,20 +530,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9900E-01 seconds\n", - " Reading cross sections = 9.3000E-02 seconds\n", - " Total time in simulation = 1.3697E+01 seconds\n", - " Time in transport only = 1.3685E+01 seconds\n", - " Time in inactive batches = 1.8610E+00 seconds\n", - " Time in active batches = 1.1836E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 3.9500E-01 seconds\n", + " Reading cross sections = 9.0000E-02 seconds\n", + " Total time in simulation = 1.3404E+01 seconds\n", + " Time in transport only = 1.3392E+01 seconds\n", + " Time in inactive batches = 1.9690E+00 seconds\n", + " Time in active batches = 1.1435E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", + " Sampling source sites = 2.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.4106E+01 seconds\n", - " Calculation Rate (inactive) = 13433.6 neutrons/second\n", - " Calculation Rate (active) = 8448.80 neutrons/second\n", + " Total time elapsed = 1.3810E+01 seconds\n", + " Calculation Rate (inactive) = 12696.8 neutrons/second\n", + " Calculation Rate (active) = 8745.08 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -622,7 +622,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. The first step is to load the tallies from the statepoint into each object." + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." ] }, { @@ -631,28 +631,6 @@ "metadata": { "collapsed": false }, - "outputs": [], - "source": [ - "# Load the tallies from the statepoint into each MGXS object\n", - "transport.load_from_statepoint(sp)\n", - "nufission.load_from_statepoint(sp)\n", - "nuscatter.load_from_statepoint(sp)\n", - "chi.load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The multi-group cross section objects can now use OpenMC's [tally arithmetic](http://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) to compute cross sections from the tally data." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, "outputs": [ { "name": "stderr", @@ -663,10 +641,11 @@ } ], "source": [ - "transport.compute_xs()\n", - "nufission.compute_xs()\n", - "nuscatter.compute_xs()\n", - "chi.compute_xs()" + "# Load the tallies from the statepoint into each MGXS object\n", + "transport.load_from_statepoint(sp)\n", + "nufission.load_from_statepoint(sp)\n", + "nuscatter.load_from_statepoint(sp)\n", + "chi.load_from_statepoint(sp)" ] }, { @@ -692,7 +671,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -733,18 +712,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1250: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, { "data": { "text/html": [ @@ -870,7 +842,7 @@ "54 1 2 2 total 0.266499 0.001265" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -889,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": { "collapsed": true }, @@ -907,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": { "collapsed": true }, @@ -935,7 +907,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -957,7 +929,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": { "collapsed": true }, @@ -991,7 +963,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": { "collapsed": false }, @@ -1003,7 +975,7 @@ "[ NORMAL ] Ray tracing for track segmentation...\n", "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.350E-316\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 2.023E-316\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", @@ -1153,7 +1125,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -1216,7 +1188,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "metadata": { "collapsed": false }, @@ -1250,7 +1222,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "metadata": { "collapsed": true }, @@ -1276,7 +1248,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "metadata": { "collapsed": true }, @@ -1305,7 +1277,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -1342,7 +1314,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -1367,7 +1339,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "metadata": { "collapsed": true }, @@ -1394,7 +1366,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1417,7 +1389,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1448,7 +1420,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1485,7 +1457,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1511,7 +1483,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 10:31:06\n", + " Date/Time: 2015-10-28 11:38:21\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1618,20 +1590,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.8900E-01 seconds\n", - " Reading cross sections = 8.4000E-02 seconds\n", - " Total time in simulation = 2.2985E+02 seconds\n", - " Time in transport only = 2.2979E+02 seconds\n", - " Time in inactive batches = 1.3571E+01 seconds\n", - " Time in active batches = 2.1628E+02 seconds\n", - " Time synchronizing fission bank = 1.5000E-02 seconds\n", - " Sampling source sites = 1.0000E-02 seconds\n", - " SEND/RECV source sites = 5.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 8.0000E-03 seconds\n", - " Total time elapsed = 2.3028E+02 seconds\n", - " Calculation Rate (inactive) = 7368.65 neutrons/second\n", - " Calculation Rate (active) = 1849.45 neutrons/second\n", + " Total time for initialization = 4.2400E-01 seconds\n", + " Reading cross sections = 8.5000E-02 seconds\n", + " Total time in simulation = 1.9319E+02 seconds\n", + " Time in transport only = 1.9314E+02 seconds\n", + " Time in inactive batches = 1.3511E+01 seconds\n", + " Time in active batches = 1.7968E+02 seconds\n", + " Time synchronizing fission bank = 1.9000E-02 seconds\n", + " Sampling source sites = 1.1000E-02 seconds\n", + " SEND/RECV source sites = 7.0000E-03 seconds\n", + " Time accumulating tallies = 3.0000E-03 seconds\n", + " Total time for finalization = 9.0000E-03 seconds\n", + " Total time elapsed = 1.9366E+02 seconds\n", + " Calculation Rate (inactive) = 7401.38 neutrons/second\n", + " Calculation Rate (active) = 2226.18 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1649,7 +1621,7 @@ "0" ] }, - "execution_count": 36, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1679,7 +1651,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1700,7 +1672,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1709,8 +1681,7 @@ "# Iterate over all cells and cross section types\n", "for cell in openmc_cells:\n", " for rxn_type in xs_library[cell.id]:\n", - " xs_library[cell.id][rxn_type].load_from_statepoint(sp)\n", - " xs_library[cell.id][rxn_type].compute_xs()" + " xs_library[cell.id][rxn_type].load_from_statepoint(sp)" ] }, { @@ -1736,7 +1707,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1790,7 +1761,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1832,7 +1803,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 40, "metadata": { "collapsed": false }, @@ -1962,7 +1933,7 @@ "119 10002 1 5 O-16 0.000000 0.000000" ] }, - "execution_count": 41, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1982,7 +1953,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -2010,7 +1981,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -2019,7 +1990,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAADDCAYAAACxgLv/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFw9JREFUeJzt3XmYVNWZx/Fvs4mCgohxAYYmccMFcSOoaHfUEFCjmRk0\nahyVqGNcRicu0WASmsRxmTGKcXQ0GhFXYhAZl7gF6VYTQRFQBHGU0AoKKLsCKkrPH+8pqrq6lltV\n51adbn6f56mnu7a3zq1673vPPfdWHRARERERERERERERERERERERERERKYv/AX5R6UZ40FaWQ+Jz\nBDC/0o3woK0sRzONwNFpt50FvJTjOfsCzwKfAJsivMaJwGxgjXvOFKC6sGa2UAfcn3ZbPXB2iXHj\nUo29VzPTbu8JfAksjBjnLHJ/Nlu6s4A5wDpgCXA70C3Pc04G/uaeMzXD/e2Ba4APgbXYZ5gtZm/g\nUSzPV7u2nFnIAmRQjeVOu5TbziLsPKjH2jwg7fbH3O1HRoyzCfimv2YVrl3+h8SiyV0K8SUwgWhF\ncDdgPPBTLJn7AbcBXxf4mlEUuhzpyvEZbA3sk3L9NODvlN72VJXKpUq7DLje/d0OGAz0BZ4HOuZ4\n3grgJvfcTMa4WINd3NOBz7M89n7gfeAfgB7AvwDLClmIHKo8xQHo4DFWJk3AO8AZKbftABwKfFxg\nrFzLHfdyVMxC4Ki0284k2tZ4N/L3mEcAs3Lc3w4YBbyH9UZmAL3cfbcAH2A97RnAEHf7MOALbAPx\nKdYbvwb4Ctjgbvude+xe2Iq5AtvdOSnlte/Fdvn/DHyG7TncC/zG3V8LLAYuxVauj7CeSsIOwBOu\nfa+6NmR736qx92oU8J8pt7/mbkvtMV+V8n7MBX7gbu/vlu8rt4wrIy7HlcA0rOcHcD7wFtApS1tb\no+2w92RE2u1dsEIwMkKMc2jZY97exe0XsR2f0rKXmGoI1jtfheV2ojd9HLaerHG3j055zgdY7nyK\n5cRgbMOQngdbATdiG4alWE50dvfVYrn8M2xPYry7bVHK6zRiG7U3sN7+BBcz4WfYOrAYe69y9Wan\nAr908ROF9SJsD2YRyR7zIOAV9358BNxKciP6onuNz9xynhRhOb6FresHuOu7YnsvUXvowVhI4UMZ\nCVEKcz+smNyEvYFd0+6/AngT2N1d3w/raQD8CFsx2mHFcQnJYjIauC8t1lTgxynXu2Af2JkuxkDs\nQ+rv7r8XS8BD3fWtgHHAr931WmAjNmzSHhiO7e4mdmMnAA9hyd8fW4FezPguJAtzX/e4KmBv4G3s\n/U8tzCOAnd3/J2OJuZO7nmmjmW85qoAG7D3bHVuR98/SztZqGPZZZdpbuBf7nPLJVJiPxIpGohC8\nA1yQI8bzwMvAD7Fec6q+WGH9IZZPPUh+DjUk96T2wwrriSnPSx/KyJQHNwOTge7YevY4cK27rxZ7\nf67DCl9nWhbmhdgGfGdsvZsHnOfuG4Ytf39sr+8BbK83V2E+GxvyHOZum45tVFIL84FYcW7nlnMe\ncElKnPTiH2U5zsE6NFu710/tCBWsUrufVdiHuSrlchv+dq0XYm9cL+ARrDCOw4om2Id3NfCuuz6H\nZA/gQdeeTVhh3wrYM6XdmXZxUm873r3+eBdjNjCJ5r3mydgWG6wXnh5jI1bgvgaexorkntiK9U9Y\nsfscK7Djs7Qp1WJs5f4utpuXvnEBmIitmGDv2bvAtzO0LaEpz3I0ude6GPhf4AasV9SW9ASWk7mj\nsNTdX4ze2IZ4d2zjOgLbUB+T5fEnYQXzl9gQ1SzgYHffaVjh/iOWTytJfg4NWDEBWwcmYMUa8ud5\n4vq5WAdmNZan1wGnpDxmE5avG8k+FPM77P1ahe0NDnS3nwzcg+X5BhcnytDKfVju7YVtMKal3T8T\n29vchPX0f09yubPJtxx3Y3ucr2IdmqsjtDOrSo4xn4htIROXC0i+6T/CdiM+BZ4q8jWmY72Eb2BH\nUI8k+Wb1ARZked7l2BZ0NZYo3ci/gqVuUPpiBS11o3Mayd5nE823tJmsoPnKvh7rjeyIjW+lPn9x\nnliJ17wP27U+BRuTTE/wM7AVOtHmfbFhk1zyLcf72AGZvtiGt61ZjuVGpvVoF6xDAHAHyXy+KkLc\nDe7vr7ENXqJoHpvl8auBn2Of2U5YZ2Cyu68PVqwz+TbWy/zYxTiP/J95qh2BbYDXSebN0zRfXz7B\nhv9yWZry/waSHahdKC7XJ2FDpReSuROyB/Ak1htfA/wH+Zc7ynLcje2B3IoV8KKFdMAmtVA8CGzr\nLsd5iD0DOzKb2G1bhA2JpDsCG+Y4CdvSbo99cKm9wHTpt32A9URSNzrbYkmSS5S9hU+wMb4+Kbf1\nyfLYdJOwFXsBLRO8L9ZruBDb1d0eGw/OtdxRHIftRk7BxiHbmlewwvnPabd3xXalp7jrPyGZz+kH\n+zK9t29meb0on8MK4LfYOGcPLB+/leWxD2EFvDeW73eQrAlRcn05Vkj3Jpnr3bGx90LanM0Sisv1\nDdgG4ie0PIsKbBx8HlYDumEdtny1MN9ydAXGYsV5DPZeFC2kwhxFZ5LjvVvR/CBBqsOxMZ8d3fW9\ngO+T3KW5GztItRtWfAZgSdwVK3zL3ev8iuZJthTbtUzdiCyjeeI/iW2RT8fGozoCh7g2QPZdxCi7\naF9jBbYOG8vaCzsCHyX51wHfwd6XdF1cjOVYTozEel8Jy7CVN/Usg3y7uj2Bu7Bho7Ow9394hHa2\nJmuwlfBW4HvY+1ONDQUtInNRSGiH5XNH9/9WJN/fBdjQxNVYHvbH9v6ezBLrBqzT0QEr/udjQ1Er\nseJ7DNbZ6ID1DBNjzF2xXu6X2JjraSRzKXFaampuL6V5HmzCPuOxJNe1XsDQHMsdRSKPHsFycS+s\nZ/7LAmKMwoYnPshwX1ds72W9i31+2v3p63QUt2DDGP+K7eXfUeDzmwmpMOc7ha4aeyPfco/bgI09\nZbIaOAHbBfwU23pOIjkgfxP2oT+HrVx3YSvJs8AzwP9hR4s30PyD/ZP7uwLrhYN9ICOwlWAsNs42\nFBsy+BDb6l9HcoOSaTnTb8v1PlyEbeWXYuPLD5N7Fys11kyaH/BL3DcP62W94uLuix1MSpiCjUUu\nJXnaUb7luBPrjT2DvTdnYxvEknoSAfovrAjciOXSNGwI52hy786egeXz7die2gbsPUs4FduTWYEV\n5F+Q+XxnsI30Y1iRXYD1LE9w932A7Sld5mLNInkGxwXYcMlarOj9MSXmemwX/68u7iDgBVrmwZXY\n2Oo0t/zPYx2ThCg97/T7Evc/g40/T8XWyfTjGbkswc5EyeRybCO0FttTnJDWpjps3VqFrdvZalPi\nthOxdT5R4C/FDjCeGqGd0kbdgB3YFGnr+mN7tCF1KEUAOztjALa7Nwjb5Twh5zNEWq9/xIZ5tsdO\nxZtU2eaIZHYwNn64DjvafmVlmyMSq6exockV2NfOd8r9cBERERERkfwOrEkcsdRFl3gu+9c0UQHd\navar/LLr0oYvfZvIwscvRzUxI2v8pDvr4Ly6nA/55kFzc96fsLLuNnrU5f6+xt8b9sl5/2bj6mBk\n7nZFpljxxKqtAr+/chZVU03T03kf1Fj3ANV1p+d8TENV+k9YZHMb+b+L9EjEWPXYLxP4oFj+Y42B\nLHmt005ERAKjwiwiEpjyFeaDar2F2rr2EG+xGFirWG0hVgV1r831U8iF8pjbJU/Yo1iVihVl3G4Y\n9lXj9thXam9Iuz/aGHMEUceYo4g8xizhi2+MOW9uRxljjiL6GHMUUceYJWzFjzG3B/4bS+C9se9+\n98/5DJHWQbktwcpXmAdhP1DSiP0gywSSMxyItGbKbQlWvsLci5Y/VN0ry2NFWhPltgQr32yv0QaP\n76xL/n9QLRxcW2RzRIBZ9TC7Pu5XiZTbjXUPbP6/e+0Azwf6ZMvS6C755SvMH9JyBoGW07vk+eKI\nSEEOqLVLwvgxcbxKpNzO98URkeiqaX62RkPWR+YbyphBckLITtgsCo+X0jSRQCi3JVj5esxfYTNm\nPIsdxf4D2WcNEWlNlNsSrHyFGez3UP2czCkSFuW2BElfyRYRCYwKs4hIYFSYRUQCo8IsIhKYKAf/\n8vvMSxS2Yb2fQMChNS94iwXwSsNRXuNJ69BQNc1LnNEM9xIHYAy/9RYL1nqMJb6oxywiEhgVZhGR\nwKgwi4gERoVZRCQwKswiIoGJUpjvAZYBc2Jui0i5KbclSFEK8zhs+h2Rtka5LUGKUphfAlbF3RCR\nClBuS5A0xiwiEhg/3/wbV5f8f2Bt89knRApVnqmlIqpP+b+a5jNQiBSiEV9TS0Uzss5LGBGgXFNL\nRVRbwdeWtqUaX1NLiYhImUUpzA8DfwP2wKZ7Hxlri0TKR7ktQYoylHFq7K0QqQzltgRJQxkiIoFR\nYRYRCYwKs4hIYFSYRUQC4+c8Zk/eajjEW6zf1FzuLRbAFzWdvMWaOX2It1h85S+U11jSzBhGe4t1\nPZd5i3WVpqkKknrMIiKBUWEWEQmMCrOISGBUmEVEAqPCLCISmCiFuQ8wFZgLvAVcHGuLRMpHuS1B\ninK63Ebgp8BsoCvwOvA88HaM7RIpB+W2BClKj3kplrgAn2FJu2tsLRIpH+W2BKnQMeZq4ABguv+m\niFRUNcptCUQh3/zrCkwELsF6F0maWkp8Kv/UUtlzW1NLiTeN+J5aqiPwKPAAMLnFvZpaSnwq79RS\nuXNbU0uJN9X4nFqqCvgDMA8YW0KrREKj3JYgRSnMhwOnA98BZrnLsDgbJVImym0JUpShjJfRF1Gk\nbVJuS5CUlCIigVFhFhEJjAqziEhgVJhFRAJT5SFGE/VNHsIEzuPJVJMf+563WNcyylus977ezVss\ngJWLv+EnUHUn8JOrhWrC45RQIXoOf+eID2Wat1jmac/xQjMGsuS1eswiIoFRYRYRCYwKs4hIYFSY\nRUQCo8IsIhKYKIW5M/YbtbOxH3u5LtYWiZSH8lqCFeW3Mj7HfuRlvXv8y8AQ91ektVJeS7CiDmWs\nd387Ae2BlfE0R6SslNcSpKiFuR22y7cMm1V4XmwtEikf5bUEKeoMJpuAgUA34FlsWof6zfdqainx\n6ZUGmJZ9dgePcuc1oKmlxJ9GfE8tlbAGeAo4mNSM1dRS4tOhNXZJuOWauF8xc14DmlpK/KnG59RS\nPYHu7v+tge9iMz2ItGbKawlWlB7zLsB4rIi3A+4HpsTZKJEyUF5LsKIU5jnAgXE3RKTMlNcSLH3z\nT0QkMCrMIiKBUWEWEQmMCrOISGBUmEVEAlPoF0y2XP/uL9QPqg71FuvL1bXeYt3YzeNCAs/29TO3\nYVm+A7iFGsr13mI11Qz2FgugaoHHuUQX1/mLVQbqMYuIBEaFWUQkMCrMIiKBUWEWEQlM1MLcHvuB\nlydibItIJSi3JThRC/Ml2I+IezxMKhIE5bYEJ0ph7g0cC9wNVMXbHJGyUm5LkKIU5puBK7DZHkTa\nEuW2BCnfF0yOBz7GxuBqsz5KU0uJR6vr32R1/Ztxv0y03NbUUuJNI76mljoMOAHb3esMbAfcB5zR\n7FGaWko86l47gO61AzZff3/Mg3G8TLTc1tRS4k01vqaWGgX0AfoBpwAv0CJxRVol5bYEq9DzmHXk\nWtoq5bYEo5AfMWpAvycjbZNyW4Kib/6JiARGhVlEJDAqzCIigVFhFhEJjAqziEhgNLVUJcyo8xaq\nU/ftvMVquusyb7EAdjvnPS9xdLpEnDZ4i1TV8HtvsQCaxvr7+ZKq+R7Phryjzl+sLNRjFhEJjAqz\niEhgVJhFRAKjwiwiEpioB/8agbXA18BGYFBcDRIpo0aU1xKgqIW5Cfv9w5XxNUWk7JTXEqRChjI0\n9Y60RcprCU7UwtwE/AWYAZwbX3NEykp5LUGKOpRxOLAE2BF4HpgPvLT5Xk0tJR7NrV/O3PoV5Xip\n3HkNaGop8acRX1NLJSxxfz8BHsMOkiQTWFNLiUf71PZkn9qem69PHPNuXC+VO68BTS0l/lTja2op\ngG2Abd3/XYChwJziGiYSDOW1BCtKj3knrDeRePyDwHOxtUikPJTXEqwohXkhMDDuhoiUmfJagqVv\n/omIBEaFWUQkMCrMIiKBUWEWEQmMCrOISGB8/E5AE/Uep22RgnQe6O/3dz4f28NbLICmCX5+hqJq\nvv3xEqwwTTC6Ai8rZj9vkZpGjfAWq2qmp3r3TBVkyWv1mEVEAqPCLCISGBVmEZHAqDCLiAQmSmHu\nDkwE3gbmAYNjbZFI+Si3JUhRfivjFuDPwAj3+C6xtkikfJTbEqR8hbkbcARwprv+FbAm1haJlIdy\nW4KVbyijH/Yj4uOAmcBd2O/YirR2ym0JVr4ecwfgQOAi4DVgLHAV8Ktmj9LUUuJR/TqoXx/7y0TL\nbU0tJb6sqIeV9ZEemq8wL3aX19z1iVjyNqeppcSj2i52SRgTz/R/0XJbU0uJLzvU2iVhwZisD803\nlLEUWATs4a4fA8wtpW0igVBuS7CinJXxb9i0O52ABcDIWFskUj7KbQlSlML8BnBI3A0RqQDltgRJ\n3/wTEQmMCrOISGBUmEVEAqPCLCISGBVmEZHARDkrQwL2+Xx/00FNGX2Yt1gAdXVew8kWZ463SFXX\nfukt1kueZjk7Isd96jGLiARGhVlEJDAqzCIigVFhFhEJTJTCvCcwK+WyBrg4zkaJlIHyWoIV5ayM\nd4AD3P/tgA+Bx2JrkUh5KK8lWIUOZRyD/QrXohjaIlIpymsJSqGF+RTgoTgaIlJBymsJSiFfMOkE\nfB+4ssU9mlpKPGp0lzLJnteAppYSXxIHM6IopDAPB17HJrBsTlNLiUfVNC9/DfG+XPa8BjS1lPhy\nAMmDGmCzAGdTyFDGqcDDRbVIJFzKawlO1MLcBTtAMinGtoiUm/JaghR1KGMd0DPOhohUgPJagqRv\n/omIBKZ8hXlWvWJVKtbr/mLNrl/jLVajt0iV1qhYbSKWv8PMUc++yKZ8hXl2vWJVKtZMf7HeqF/r\nLVajt0iV1qhYbSLWlliYRUQkEhVmEZHA+JgjpR6o8RBHJJsGKvNNj3qU2xKfSuW1iIiIiIiIiEhr\nNAyYD7xL1l/xiuQeYBl+5jXvA0wF5gJvUdrsFZ2B6cBsYB5wXYlta4+dcfNEiXHAzid608V7tcRY\n3YGJwNvYcg4uMk5bmT1EeV04X7ndiPK6JO2B97AfDOuIfcj9i4x1BPYDTT4SeGdgoPu/KzajRbHt\nAtjG/e0ATAOGlBDrUuBB4PESYiQsBHp4iAMwHvix+78D0M1DzHbAEqygtCbK6+L4yu02ndflOF1u\nEJbAjcBGYAJwYpGxXgJW+WkWS7GVCeAzbGu5awnx1ru/nbCVdmWRcXoDxwJ34+esGTzF6YYVkHvc\n9a+wHkGpWuvsIcrrwvnO7Tab1+UozL1o3rjF7raQVGM9luklxGiHrRDLsF3JeUXGuRm4AthUQltS\nNQF/AWYA55YQpx/2m8XjgJnAXSR7U6VorbOHKK8L5zO323Rel6MwN5XhNUrRFRtfugTrYRRrE7YL\n2Rs4kuLOTzwe+Bgbn/LVWz4cWzmHAxdivYNidAAOBG53f9cBV5XYtsTsIX8qMU4lKK8L4zu323Re\nl6Mwf0jzcZY+WO8iBB2BR4EHgMmeYq4BngIOLuK5hwEnYONnDwNHAfeV2J4l7u8n2CzQg4qMs9hd\nXnPXJ2KJXIo8s4cETXldGN+5rbwuUQdsrKUa25KUcpAEF8fHQZIqLDFu9hCrJ3ZkF2Br4EXg6BJj\n1lD6kettgG3d/12AvwJDS4j3IrCH+78OuKGEWGDjsmeWGKNSlNfFKzW3ldeeDMeODr8H/LyEOA8D\nHwFfYON7I0uINQTbTZtN8vSWYUXG2g8bn5qNncJzRQntSqih9CPX/bA2zcZOnSrlvQfYH+tZvIHN\n+lHK0esuwHKSK1hrpLwuTqm5rbwWERERERERERERERERERERERERERERERGRtu3/AZvD3wdjaiUx\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2050,7 +2021,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 43, "metadata": { "collapsed": true }, @@ -2072,7 +2043,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 44, "metadata": { "collapsed": false }, @@ -2111,7 +2082,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 45, "metadata": { "collapsed": false }, @@ -2194,7 +2165,7 @@ "2 10000 2 O-16 3.798833 0.010031" ] }, - "execution_count": 46, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -2220,7 +2191,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -2242,7 +2213,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -2290,7 +2261,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -2318,7 +2289,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -2353,7 +2324,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -2394,7 +2365,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -2412,7 +2383,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 52, "metadata": { "collapsed": false }, diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index c135eeea7b..215b4f12ed 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -312,11 +312,6 @@ class Library(object): mgxs = self.get_mgxs(domain, mgxs_type) mgxs.load_from_statepoint(statepoint) - if isinstance(mgxs, openmc.mgxs.ScatterMatrixXS): - mgxs.compute_xs(correction=self.correction) - else: - mgxs.compute_xs() - def get_mgxs(self, domain, mgxs_type): """Return the MGXS object for some domain and reaction rate type. @@ -478,7 +473,7 @@ class Library(object): return subdomain_avg_library - def build_hdf5_store(self, filename='mgxs', directory='mgxs', + def build_hdf5_store(self, filename='mgxs.h5', directory='mgxs', subdomains='all', nuclides='all', xs_type='macro'): """Export the multi-group cross section library to an HDF5 binary file. @@ -494,7 +489,7 @@ class Library(object): Parameters ---------- filename : str - Filename for the HDF5 file. Defaults to 'mgxs'. + Filename for the HDF5 file. Defaults to 'mgxs.h5'. directory : str Directory for the HDF5 file. Defaults to 'mgxs'. subdomains : {'all', 'avg'} @@ -536,7 +531,7 @@ class Library(object): os.makedirs(directory) # Add an attribute for the number of energy groups to the HDF5 file - full_filename = os.path.join(directory, filename + '.h5') + full_filename = os.path.join(directory, filename) full_filename = full_filename.replace(' ', '-') f = h5py.File(full_filename, 'w') f.attrs["# groups"] = self.num_groups diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 65e80f0d33..f0aa9d618a 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -41,7 +41,7 @@ DOMAIN_TYPES = ['cell', # Supported domain classes # TODO: Implement Mesh domains -DOMAINS = [openmc.Cell, +_DOMAINS = [openmc.Cell, openmc.Universe, openmc.Material] @@ -90,6 +90,17 @@ class MGXS(object): xs_tally : Tally Derived tally for the multi-group cross section. This attribute is None unless the multi-group cross section has been computed. + num_sumbdomains : Integral + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : Integral + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : list of str or 'sum' + A list of nuclide string names (e.g., 'U-238', 'O-16') when by_nuclide + is True and 'sum' when by_nuclide is False. """ @@ -556,6 +567,9 @@ class MGXS(object): filter_bins, tally.nuclides) self.tallies[tally_type] = sp_tally + # Compute the cross section from the tallies + self.compute_xs() + def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', value='mean'): """Returns an array of multi-group cross sections. @@ -926,7 +940,7 @@ class MGXS(object): print(string) - def build_hdf5_store(self, filename='mgxs', directory='mgxs', + def build_hdf5_store(self, filename='mgxs.h5', directory='mgxs', subdomains='all', nuclides='all', xs_type='macro', append=True): """Export the multi-group cross section data to an HDF5 binary file. @@ -942,7 +956,7 @@ class MGXS(object): Parameters ---------- filename : str - Filename for the HDF5 file. Defaults to 'mgxs'. + Filename for the HDF5 file. Defaults to 'mgxs.h5'. directory : str Directory for the HDF5 file. Defaults to 'mgxs'. subdomains : Iterable of Integral or 'all' @@ -957,7 +971,7 @@ class MGXS(object): xs_type: {'macro', 'micro'} Store the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. - append : boolean + append : bool If true, appends to an existing HDF5 file with the same filename directory (if one exists). Defaults to True. @@ -982,7 +996,7 @@ class MGXS(object): if not os.path.exists(directory): os.makedirs(directory) - filename = os.path.join(directory, filename + '.h5') + filename = os.path.join(directory, filename) filename = filename.replace(' ', '-') if append and os.path.isfile(filename): @@ -1338,40 +1352,15 @@ class TransportXS(MGXS): return super(TransportXS, self).tallies - def load_from_statepoint(self, statepoint): - """Extracts tallies in an OpenMC StatePoint with the data needed to - compute multi-group cross sections. - - This method is needed to compute cross section data from tallies - in an OpenMC StatePoint object. - - NOTE: The statepoint must first be linked with an OpenMC Summary object. - - Parameters - ---------- - statepoint : openmc.StatePoint - An OpenMC StatePoint object with tally data - - Raises - ------ - ValueError - When this method is called with a statepoint that has not been - linked with a summary object. - - """ - - # Load the tallies from the statepoint using the parent class method - super(TransportXS, self).load_from_statepoint(statepoint) + def compute_xs(self): + """Computes the multi-group transport cross sections using OpenMC + tally arithmetic.""" # Use tally slicing to remove scatter-P0 data from scatter-P1 tally scatter_p1 = self.tallies['scatter-P1'] self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1']) self.tallies['scatter-P1'].filters[-1].type = 'energy' - def compute_xs(self): - """Computes the multi-group transport cross sections using OpenMC - tally arithmetic.""" - self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1'] self._xs_tally /= self.tallies['flux'] super(TransportXS, self).compute_xs() @@ -1424,7 +1413,14 @@ class AbsorptionXS(MGXS): class CaptureXS(MGXS): - """A capture multi-group cross section.""" + """A capture multi-group cross section. + + The Neutron capture reaction rate is defined as the difference between + OpenMC's 'absorption' and 'fission' reaction rate score types. This includes + not only radiative capture, but all forms of neutron disappearance aside + from fission (e.g., MT > 100). + + """ def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): diff --git a/openmc/settings.py b/openmc/settings.py index dbf031e28c..519b5c7cf2 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1185,7 +1185,6 @@ class SettingsFile(object): self._eigenvalue_subelement = None self._source_element = None - self._create_eigenvalue_subelement() self._create_source_subelement() self._create_output_subelement() diff --git a/tests/test_track_output/results_test.dat b/tests/test_track_output/results_test.dat deleted file mode 100644 index 6ded87a0ec..0000000000 --- a/tests/test_track_output/results_test.dat +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - From e1283c7bf0558926754e492efe03b3c35ade86f6 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 11:50:56 -0400 Subject: [PATCH 395/519] Clarified the MGXS docstring as an abstract base class --- openmc/mgxs/mgxs.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7c2156c196..7f34f8856f 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -47,13 +47,15 @@ _DOMAINS = [openmc.Cell, class MGXS(object): - """A multi-group cross section for some energy group structure within - some spatial domain. + """An abstract multi-group cross section for some energy group structure + within some spatial domain. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated multi-group cross sections for deterministic neutronics calculations. + NOTE: Users should instantiate the subclasses of this abstract class. + Parameters ---------- domain : Material or Cell or Universe From 046f80c30941972cf6fe3fad0e8849e2e87c9812 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 12:24:38 -0400 Subject: [PATCH 396/519] Updated test suite for new tally ordering in MGXS module --- .../examples/multi-group-cross-sections.ipynb | 351 +++++++++--------- openmc/mgxs/mgxs.py | 22 +- .../inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- .../test_mgxs_library_hdf5.py | 2 +- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- 7 files changed, 195 insertions(+), 188 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 99ab3b26f7..4b0d2022bf 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -444,7 +444,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 11:38:06\n", + " Date/Time: 2015-10-28 12:11:50\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -530,20 +530,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.9500E-01 seconds\n", - " Reading cross sections = 9.0000E-02 seconds\n", - " Total time in simulation = 1.3404E+01 seconds\n", - " Time in transport only = 1.3392E+01 seconds\n", - " Time in inactive batches = 1.9690E+00 seconds\n", - " Time in active batches = 1.1435E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.3810E+01 seconds\n", - " Calculation Rate (inactive) = 12696.8 neutrons/second\n", - " Calculation Rate (active) = 8745.08 neutrons/second\n", + " Total time for initialization = 1.7630E+00 seconds\n", + " Reading cross sections = 4.0800E-01 seconds\n", + " Total time in simulation = 4.1757E+01 seconds\n", + " Time in transport only = 4.1713E+01 seconds\n", + " Time in inactive batches = 6.5950E+00 seconds\n", + " Time in active batches = 3.5162E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-02 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 5.0000E-03 seconds\n", + " Total time elapsed = 4.3566E+01 seconds\n", + " Calculation Rate (inactive) = 3790.75 neutrons/second\n", + " Calculation Rate (active) = 2843.98 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -717,6 +717,13 @@ "collapsed": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1264: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" + ] + }, { "data": { "text/html": [ @@ -740,8 +747,8 @@ " 1\n", " 1\n", " total\n", - " 0.076970\n", - " 0.001012\n", + " 0.076913\n", + " 0.001013\n", " \n", " \n", " 62\n", @@ -749,8 +756,8 @@ " 1\n", " 2\n", " total\n", - " 0.087876\n", - " 0.000344\n", + " 0.087715\n", + " 0.000343\n", " \n", " \n", " 61\n", @@ -758,7 +765,7 @@ " 1\n", " 3\n", " total\n", - " 0.000418\n", + " 0.000417\n", " 0.000023\n", " \n", " \n", @@ -830,9 +837,9 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "63 1 1 1 total 0.076970 0.001012\n", - "62 1 1 2 total 0.087876 0.000344\n", - "61 1 1 3 total 0.000418 0.000023\n", + "63 1 1 1 total 0.076913 0.001013\n", + "62 1 1 2 total 0.087715 0.000343\n", + "61 1 1 3 total 0.000417 0.000023\n", "60 1 1 4 total 0.000000 0.000000\n", "59 1 1 5 total 0.000000 0.000000\n", "58 1 1 6 total 0.000000 0.000000\n", @@ -975,133 +982,133 @@ "[ NORMAL ] Ray tracing for track segmentation...\n", "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 2.023E-316\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.695632\tres = 2.844E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.701457\tres = 3.194E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.722832\tres = 3.132E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.085610\tres = 6.273E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.091437\tres = 5.804E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.101878\tres = 4.961E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.110861\tres = 4.231E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.114862\tres = 3.905E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.118564\tres = 3.602E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.121987\tres = 3.321E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.125150\tres = 3.060E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.128070\tres = 2.819E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.133249\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.135539\tres = 2.197E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.137649\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.139591\tres = 1.858E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.141378\tres = 1.707E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.144532\tres = 1.440E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.147196\tres = 1.213E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.148366\tres = 1.113E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.150426\tres = 9.355E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.151330\tres = 8.574E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.152158\tres = 7.856E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.152918\tres = 7.196E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.153613\tres = 6.590E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.154250\tres = 6.033E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.154833\tres = 5.522E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.155367\tres = 5.053E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.155856\tres = 4.623E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.156303\tres = 4.228E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.156711\tres = 3.866E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.157085\tres = 3.535E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.157427\tres = 3.231E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.157739\tres = 2.952E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158024\tres = 2.697E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.158285\tres = 2.464E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.158523\tres = 2.251E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.158740\tres = 2.055E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.158939\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.159120\tres = 1.713E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.159285\tres = 1.563E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.159436\tres = 1.427E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.159574\tres = 1.302E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.159814\tres = 1.083E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.159918\tres = 9.880E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.160014\tres = 9.009E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.160101\tres = 8.215E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.160180\tres = 7.490E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.160252\tres = 6.827E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.160318\tres = 6.223E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.160378\tres = 5.672E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.160432\tres = 5.169E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.160482\tres = 4.710E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.160528\tres = 4.291E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.160569\tres = 3.909E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.160607\tres = 3.561E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.160641\tres = 3.244E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.160672\tres = 2.954E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.160700\tres = 2.691E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.160726\tres = 2.450E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.160750\tres = 2.231E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.160771\tres = 2.031E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.160791\tres = 1.849E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.160809\tres = 1.684E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.160825\tres = 1.533E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.160840\tres = 1.395E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.160853\tres = 1.270E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.160865\tres = 1.156E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.160876\tres = 1.052E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.685182\tres = 9.665E-317\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.785638\tres = 3.148E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.750178\tres = 1.466E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.728835\tres = 4.513E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.695616\tres = 2.845E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.663332\tres = 4.558E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.632306\tres = 4.641E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.604144\tres = 4.677E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.579394\tres = 4.454E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.558403\tres = 4.097E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.541346\tres = 3.623E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.528269\tres = 3.055E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.519137\tres = 2.416E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.513827\tres = 1.729E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.512169\tres = 1.023E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.513941\tres = 3.227E-03\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.518887\tres = 3.460E-03\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.526728\tres = 9.623E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.537170\tres = 1.511E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.549909\tres = 1.982E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.564646\tres = 2.372E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.581084\tres = 2.680E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.598939\tres = 2.911E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.617940\tres = 3.073E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.637834\tres = 3.172E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.658386\tres = 3.219E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.679382\tres = 3.222E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.700626\tres = 3.189E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.721946\tres = 3.127E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.743187\tres = 3.043E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.764215\tres = 2.942E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.784913\tres = 2.829E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.805184\tres = 2.708E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.824944\tres = 2.583E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.844126\tres = 2.454E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.862675\tres = 2.325E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.880550\tres = 2.197E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.897720\tres = 2.072E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.914163\tres = 1.950E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.929867\tres = 1.832E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.944826\tres = 1.718E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.959043\tres = 1.609E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.972524\tres = 1.505E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.985280\tres = 1.406E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.997328\tres = 1.312E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 1.008685\tres = 1.223E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 1.019373\tres = 1.139E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 1.029415\tres = 1.060E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 1.038836\tres = 9.851E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 1.047661\tres = 9.152E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.055917\tres = 8.495E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 1.063631\tres = 7.881E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 1.070830\tres = 7.306E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 1.077540\tres = 6.768E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.083788\tres = 6.266E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.089599\tres = 5.798E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.094999\tres = 5.362E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.100012\tres = 4.956E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.104662\tres = 4.578E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.108971\tres = 4.227E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.112961\tres = 3.901E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.116653\tres = 3.598E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.120066\tres = 3.317E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.123220\tres = 3.057E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.126132\tres = 2.816E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.128819\tres = 2.593E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.131297\tres = 2.386E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.133581\tres = 2.195E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.135684\tres = 2.019E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.137621\tres = 1.856E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.139403\tres = 1.705E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.141042\tres = 1.566E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.142549\tres = 1.438E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.143933\tres = 1.320E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.145204\tres = 1.212E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.146372\tres = 1.111E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.147443\tres = 1.019E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.148426\tres = 9.345E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.149327\tres = 8.564E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.150153\tres = 7.847E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.150910\tres = 7.188E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.151604\tres = 6.582E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.152239\tres = 6.026E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.152820\tres = 5.516E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.153353\tres = 5.047E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.153840\tres = 4.617E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.154285\tres = 4.223E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.154693\tres = 3.862E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.155065\tres = 3.530E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.155406\tres = 3.227E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.155717\tres = 2.949E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.156002\tres = 2.694E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.156262\tres = 2.461E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.156499\tres = 2.248E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.156716\tres = 2.053E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.156914\tres = 1.874E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.157094\tres = 1.711E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.157259\tres = 1.561E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.157409\tres = 1.425E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.157547\tres = 1.300E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.157672\tres = 1.186E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.157786\tres = 1.082E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.157890\tres = 9.868E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.157985\tres = 8.998E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.158072\tres = 8.205E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.158151\tres = 7.480E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.158223\tres = 6.819E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.158289\tres = 6.216E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.158348\tres = 5.665E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.158403\tres = 5.162E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.158453\tres = 4.704E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.158498\tres = 4.286E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.158539\tres = 3.904E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.158577\tres = 3.557E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.158611\tres = 3.240E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.158642\tres = 2.951E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.158670\tres = 2.687E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.158696\tres = 2.447E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.158720\tres = 2.228E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.158741\tres = 2.029E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.158760\tres = 1.847E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.158778\tres = 1.682E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.158794\tres = 1.531E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.158809\tres = 1.393E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.158822\tres = 1.268E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.158835\tres = 1.154E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.158846\tres = 1.051E-05\n" ] } ], @@ -1135,8 +1142,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.161200\n", - "openmoc keff = 1.160876\n", - "bias [pcm]: -32.4\n" + "openmoc keff = 1.158846\n", + "bias [pcm]: -235.5\n" ] } ], @@ -1483,7 +1490,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 11:38:21\n", + " Date/Time: 2015-10-28 12:12:36\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1590,20 +1597,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2400E-01 seconds\n", - " Reading cross sections = 8.5000E-02 seconds\n", - " Total time in simulation = 1.9319E+02 seconds\n", - " Time in transport only = 1.9314E+02 seconds\n", - " Time in inactive batches = 1.3511E+01 seconds\n", - " Time in active batches = 1.7968E+02 seconds\n", - " Time synchronizing fission bank = 1.9000E-02 seconds\n", - " Sampling source sites = 1.1000E-02 seconds\n", - " SEND/RECV source sites = 7.0000E-03 seconds\n", - " Time accumulating tallies = 3.0000E-03 seconds\n", - " Total time for finalization = 9.0000E-03 seconds\n", - " Total time elapsed = 1.9366E+02 seconds\n", - " Calculation Rate (inactive) = 7401.38 neutrons/second\n", - " Calculation Rate (active) = 2226.18 neutrons/second\n", + " Total time for initialization = 1.2980E+00 seconds\n", + " Reading cross sections = 3.1700E-01 seconds\n", + " Total time in simulation = 6.3378E+02 seconds\n", + " Time in transport only = 6.3364E+02 seconds\n", + " Time in inactive batches = 4.2049E+01 seconds\n", + " Time in active batches = 5.9173E+02 seconds\n", + " Time synchronizing fission bank = 5.4000E-02 seconds\n", + " Sampling source sites = 3.9000E-02 seconds\n", + " SEND/RECV source sites = 1.5000E-02 seconds\n", + " Time accumulating tallies = 4.0000E-03 seconds\n", + " Total time for finalization = 2.5000E-02 seconds\n", + " Total time elapsed = 6.3523E+02 seconds\n", + " Calculation Rate (inactive) = 2378.18 neutrons/second\n", + " Calculation Rate (active) = 675.978 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1990,7 +1997,7 @@ "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2299,8 +2306,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223863\n", - "openmoc keff = 1.222517\n", - "bias [pcm]: -134.7\n" + "openmoc keff = 1.220753\n", + "bias [pcm]: -311.0\n" ] } ], @@ -2393,8 +2400,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223863\n", - "openmoc keff = 1.225691\n", - "bias [pcm]: 182.7\n" + "openmoc keff = 1.223860\n", + "bias [pcm]: -0.3\n" ] } ], diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7f34f8856f..880b838ccf 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1286,7 +1286,7 @@ class TotalXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(TotalXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'total'] @@ -1333,7 +1333,7 @@ class TransportXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(TransportXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'total', 'scatter-P1'] @@ -1386,7 +1386,7 @@ class AbsorptionXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(AbsorptionXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'absorption'] @@ -1439,7 +1439,7 @@ class CaptureXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(CaptureXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'absorption', 'fission'] @@ -1486,7 +1486,7 @@ class FissionXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(FissionXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'fission'] @@ -1532,7 +1532,7 @@ class NuFissionXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(NuFissionXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'nu-fission'] @@ -1578,7 +1578,7 @@ class ScatterXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(ScatterXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'scatter'] @@ -1624,7 +1624,7 @@ class NuScatterXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(NuScatterXS, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] @@ -1687,7 +1687,7 @@ class ScatterMatrixXS(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(ScatterMatrixXS, self).tallies is None: group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) @@ -2006,7 +2006,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(NuScatterMatrixXS, self).tallies is None: # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges @@ -2050,7 +2050,7 @@ class Chi(MGXS): """ # Instantiate tallies if they do not exist - if self._tallies is None: + if super(Chi, self).tallies is None: # Create a list of scores for each Tally to be created scores = ['nu-fission', 'nu-fission'] diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index 37397c5947..f681e5ff76 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file +7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7 \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index 37397c5947..f681e5ff76 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file +7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7 \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py index c54be05e9c..642073104b 100644 --- a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py +++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py @@ -53,7 +53,7 @@ class MGXSTestHarness(PyAPITestHarness): self.mgxs_lib.load_from_statepoint(sp) # Export the MGXS Library to an HDF5 file - self.mgxs_lib.build_hdf5_store(filename='mgxs', directory='.') + self.mgxs_lib.build_hdf5_store(directory='.') # Open the MGXS HDF5 file f = h5py.File('mgxs.h5', 'r') diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index 37397c5947..f681e5ff76 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file +7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 2e299773a3..7c064c3c1d 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -7c1deb8a54fbe1a1ce6ef27cea4a11995210ad3e5ecf32bd83d7c80041edf0793378a7325ffe7ebf9c537e9c278fd4545642fec6c1e46b9c5418118f035d5e95 \ No newline at end of file +04dcfca7d68981d7ec19d428c541acd6345ec2d608c581d56ce21d23548f52977fe713b5cdd7434bebf62067444d6562ef322175736a6a63e3985e5e48718081 \ No newline at end of file From 6e3deb8f3c6cd48b822ee0c7ef68df93396a67da Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 12:27:28 -0400 Subject: [PATCH 397/519] Removed no unused correction parameter to ScatterMatrixXS.compute_xs(...) routine --- openmc/mgxs/mgxs.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 880b838ccf..9e2fcbf00f 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1715,17 +1715,9 @@ class ScatterMatrixXS(MGXS): cv.check_value('correction', correction, ('P0', None)) self._correction = correction - def compute_xs(self, correction='P0'): + def compute_xs(self): """Computes the multi-group scattering matrix using OpenMC - tally arithmetic. - - Parameters - ---------- - correction : {'P0' or None} - If 'P0', applies the P0 transport correction to the diagonal of the - scattering matrix. - - """ + tally arithmetic.""" # If using P0 correction subtract scatter-P1 from the diagonal if self.correction == 'P0': From a6a007e7f7f3c5fbfb2073dc005b98ecfc1b4f56 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 28 Oct 2015 21:16:01 -0400 Subject: [PATCH 398/519] Fix material filter bug --- src/tally.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tally.F90 b/src/tally.F90 index 0586860191..fcd6dfdd9b 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1728,7 +1728,9 @@ contains p % coord(p % n_coord) % universe, i_tally) case (FILTER_MATERIAL) - if (p % material /= MATERIAL_VOID) then + if (p % material == MATERIAL_VOID) then + matching_bins(i) = NO_BIN_FOUND + else matching_bins(i) = get_next_bin(FILTER_MATERIAL, & p % material, i_tally) endif From 8184b3a0f2c1098e7d66ba610ba8d588ae3e2b8b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 28 Oct 2015 21:22:22 -0400 Subject: [PATCH 399/519] Removed Summary.make_opencg_geometry() in place of openmc_geometry and opencg_geometry properties --- .../examples/multi-group-cross-sections.ipynb | 240 +++++++++--------- .../examples/pandas-dataframes.ipynb | 57 +++-- .../pythonapi/examples/post-processing.ipynb | 21 +- .../pythonapi/examples/tally-arithmetic.ipynb | 53 ++-- openmc/filter.py | 3 +- openmc/summary.py | 50 ++-- openmc/tallies.py | 3 + 7 files changed, 223 insertions(+), 204 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 4b0d2022bf..32f39a6fcc 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -444,7 +444,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 12:11:50\n", + " Date/Time: 2015-10-28 21:15:49\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -530,20 +530,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.7630E+00 seconds\n", - " Reading cross sections = 4.0800E-01 seconds\n", - " Total time in simulation = 4.1757E+01 seconds\n", - " Time in transport only = 4.1713E+01 seconds\n", - " Time in inactive batches = 6.5950E+00 seconds\n", - " Time in active batches = 3.5162E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-02 seconds\n", - " Sampling source sites = 6.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 5.0000E-03 seconds\n", - " Total time elapsed = 4.3566E+01 seconds\n", - " Calculation Rate (inactive) = 3790.75 neutrons/second\n", - " Calculation Rate (active) = 2843.98 neutrons/second\n", + " Total time for initialization = 7.4700E-01 seconds\n", + " Reading cross sections = 1.5400E-01 seconds\n", + " Total time in simulation = 2.0496E+01 seconds\n", + " Time in transport only = 2.0451E+01 seconds\n", + " Time in inactive batches = 3.1940E+00 seconds\n", + " Time in active batches = 1.7302E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 2.1260E+01 seconds\n", + " Calculation Rate (inactive) = 7827.18 neutrons/second\n", + " Calculation Rate (active) = 5779.68 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -909,7 +909,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. First, we will use OpenCG to reconstruct our OpenMC geometry from the summary file into a equivalent OpenMOC geometry." + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." ] }, { @@ -920,9 +920,6 @@ }, "outputs": [], "source": [ - "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", - "su.make_opencg_geometry()\n", - "\n", "# Create an OpenMOC Geometry from the OpenCG Geometry\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" ] @@ -979,29 +976,28 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685182\tres = 9.665E-317\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.685183\tres = 0.000E+00\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.785638\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750178\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728835\tres = 4.513E-02\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.750179\tres = 1.466E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.728836\tres = 4.513E-02\n", "[ NORMAL ] Iteration 4:\tk_eff = 0.695616\tres = 2.845E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663332\tres = 4.558E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.663333\tres = 4.558E-02\n", "[ NORMAL ] Iteration 6:\tk_eff = 0.632306\tres = 4.641E-02\n", "[ NORMAL ] Iteration 7:\tk_eff = 0.604144\tres = 4.677E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.579394\tres = 4.454E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.579395\tres = 4.454E-02\n", "[ NORMAL ] Iteration 9:\tk_eff = 0.558403\tres = 4.097E-02\n", "[ NORMAL ] Iteration 10:\tk_eff = 0.541346\tres = 3.623E-02\n", "[ NORMAL ] Iteration 11:\tk_eff = 0.528269\tres = 3.055E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.519137\tres = 2.416E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.513827\tres = 1.729E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.512169\tres = 1.023E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.513941\tres = 3.227E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.519138\tres = 2.416E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.513828\tres = 1.729E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.512170\tres = 1.023E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.513942\tres = 3.227E-03\n", "[ NORMAL ] Iteration 16:\tk_eff = 0.518887\tres = 3.460E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.526728\tres = 9.623E-03\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.526729\tres = 9.623E-03\n", "[ NORMAL ] Iteration 18:\tk_eff = 0.537170\tres = 1.511E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.549909\tres = 1.982E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.549910\tres = 1.982E-02\n", "[ NORMAL ] Iteration 20:\tk_eff = 0.564646\tres = 2.372E-02\n", "[ NORMAL ] Iteration 21:\tk_eff = 0.581084\tres = 2.680E-02\n", "[ NORMAL ] Iteration 22:\tk_eff = 0.598939\tres = 2.911E-02\n", @@ -1021,18 +1017,18 @@ "[ NORMAL ] Iteration 36:\tk_eff = 0.880550\tres = 2.197E-02\n", "[ NORMAL ] Iteration 37:\tk_eff = 0.897720\tres = 2.072E-02\n", "[ NORMAL ] Iteration 38:\tk_eff = 0.914163\tres = 1.950E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.929867\tres = 1.832E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.929866\tres = 1.832E-02\n", "[ NORMAL ] Iteration 40:\tk_eff = 0.944826\tres = 1.718E-02\n", "[ NORMAL ] Iteration 41:\tk_eff = 0.959043\tres = 1.609E-02\n", "[ NORMAL ] Iteration 42:\tk_eff = 0.972524\tres = 1.505E-02\n", "[ NORMAL ] Iteration 43:\tk_eff = 0.985280\tres = 1.406E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.997328\tres = 1.312E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.008685\tres = 1.223E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.019373\tres = 1.139E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.029415\tres = 1.060E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.038836\tres = 9.851E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.997327\tres = 1.312E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 1.008684\tres = 1.223E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 1.019372\tres = 1.139E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 1.029414\tres = 1.060E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 1.038835\tres = 9.851E-03\n", "[ NORMAL ] Iteration 49:\tk_eff = 1.047661\tres = 9.152E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.055917\tres = 8.495E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.055917\tres = 8.496E-03\n", "[ NORMAL ] Iteration 51:\tk_eff = 1.063631\tres = 7.881E-03\n", "[ NORMAL ] Iteration 52:\tk_eff = 1.070830\tres = 7.306E-03\n", "[ NORMAL ] Iteration 53:\tk_eff = 1.077540\tres = 6.768E-03\n", @@ -1040,75 +1036,75 @@ "[ NORMAL ] Iteration 55:\tk_eff = 1.089599\tres = 5.798E-03\n", "[ NORMAL ] Iteration 56:\tk_eff = 1.094999\tres = 5.362E-03\n", "[ NORMAL ] Iteration 57:\tk_eff = 1.100012\tres = 4.956E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.104662\tres = 4.578E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.108971\tres = 4.227E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.112961\tres = 3.901E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.116653\tres = 3.598E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.104661\tres = 4.578E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.108970\tres = 4.227E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.112960\tres = 3.901E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.116652\tres = 3.598E-03\n", "[ NORMAL ] Iteration 62:\tk_eff = 1.120066\tres = 3.317E-03\n", "[ NORMAL ] Iteration 63:\tk_eff = 1.123220\tres = 3.057E-03\n", "[ NORMAL ] Iteration 64:\tk_eff = 1.126132\tres = 2.816E-03\n", "[ NORMAL ] Iteration 65:\tk_eff = 1.128819\tres = 2.593E-03\n", "[ NORMAL ] Iteration 66:\tk_eff = 1.131297\tres = 2.386E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.133581\tres = 2.195E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.133580\tres = 2.195E-03\n", "[ NORMAL ] Iteration 68:\tk_eff = 1.135684\tres = 2.019E-03\n", "[ NORMAL ] Iteration 69:\tk_eff = 1.137621\tres = 1.856E-03\n", "[ NORMAL ] Iteration 70:\tk_eff = 1.139403\tres = 1.705E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.141042\tres = 1.566E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.142549\tres = 1.438E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.143933\tres = 1.320E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.141041\tres = 1.566E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.142548\tres = 1.438E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.143932\tres = 1.320E-03\n", "[ NORMAL ] Iteration 74:\tk_eff = 1.145204\tres = 1.212E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.146372\tres = 1.111E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.147443\tres = 1.019E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.148426\tres = 9.345E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.149327\tres = 8.564E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.150153\tres = 7.847E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.150910\tres = 7.188E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.151604\tres = 6.582E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.152239\tres = 6.026E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.146371\tres = 1.111E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.147442\tres = 1.019E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.148425\tres = 9.345E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.149326\tres = 8.564E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.150152\tres = 7.847E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.150909\tres = 7.188E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.151603\tres = 6.583E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.152238\tres = 6.027E-04\n", "[ NORMAL ] Iteration 83:\tk_eff = 1.152820\tres = 5.516E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.153353\tres = 5.047E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.153840\tres = 4.617E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.154285\tres = 4.223E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.154693\tres = 3.862E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.155065\tres = 3.530E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.155406\tres = 3.227E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.155717\tres = 2.949E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.156002\tres = 2.694E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.156262\tres = 2.461E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.156499\tres = 2.248E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.156716\tres = 2.053E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.156914\tres = 1.874E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.157094\tres = 1.711E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.157259\tres = 1.561E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.157409\tres = 1.425E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.157547\tres = 1.300E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.157672\tres = 1.186E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.157786\tres = 1.082E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.157890\tres = 9.868E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.157985\tres = 8.998E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.158072\tres = 8.205E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.158151\tres = 7.480E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.158223\tres = 6.819E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.158289\tres = 6.216E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.158348\tres = 5.665E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.158403\tres = 5.162E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.158453\tres = 4.704E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.158498\tres = 4.286E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.158539\tres = 3.904E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.158577\tres = 3.557E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.158611\tres = 3.240E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.158642\tres = 2.951E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.158670\tres = 2.687E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.158696\tres = 2.447E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.158720\tres = 2.228E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.158741\tres = 2.029E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.158760\tres = 1.847E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.158778\tres = 1.682E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.158794\tres = 1.531E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.158809\tres = 1.393E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.158822\tres = 1.268E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.158835\tres = 1.154E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.158846\tres = 1.051E-05\n" + "[ NORMAL ] Iteration 84:\tk_eff = 1.153352\tres = 5.047E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.153839\tres = 4.617E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.154284\tres = 4.223E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.154692\tres = 3.862E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.155064\tres = 3.531E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.155405\tres = 3.227E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.155716\tres = 2.949E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.156001\tres = 2.694E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.156260\tres = 2.462E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.156498\tres = 2.248E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.156715\tres = 2.053E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.156913\tres = 1.875E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.157093\tres = 1.711E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.157258\tres = 1.562E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.157408\tres = 1.424E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.157546\tres = 1.300E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.157671\tres = 1.186E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.157785\tres = 1.082E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.157889\tres = 9.868E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.157984\tres = 9.000E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.158071\tres = 8.204E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.158150\tres = 7.488E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.158222\tres = 6.819E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.158288\tres = 6.216E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.158347\tres = 5.666E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.158402\tres = 5.167E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.158451\tres = 4.703E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.158496\tres = 4.284E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.158538\tres = 3.909E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.158575\tres = 3.559E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.158609\tres = 3.235E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.158640\tres = 2.955E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.158669\tres = 2.693E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.158695\tres = 2.446E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.158718\tres = 2.227E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.158739\tres = 2.034E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.158759\tres = 1.852E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.158777\tres = 1.694E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.158793\tres = 1.533E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.158808\tres = 1.401E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.158821\tres = 1.271E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.158833\tres = 1.159E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.158844\tres = 1.054E-05\n" ] } ], @@ -1142,8 +1138,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.161200\n", - "openmoc keff = 1.158846\n", - "bias [pcm]: -235.5\n" + "openmoc keff = 1.158844\n", + "bias [pcm]: -235.6\n" ] } ], @@ -1490,7 +1486,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 12:12:36\n", + " Date/Time: 2015-10-28 21:16:11\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1597,20 +1593,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.2980E+00 seconds\n", - " Reading cross sections = 3.1700E-01 seconds\n", - " Total time in simulation = 6.3378E+02 seconds\n", - " Time in transport only = 6.3364E+02 seconds\n", - " Time in inactive batches = 4.2049E+01 seconds\n", - " Time in active batches = 5.9173E+02 seconds\n", - " Time synchronizing fission bank = 5.4000E-02 seconds\n", - " Sampling source sites = 3.9000E-02 seconds\n", - " SEND/RECV source sites = 1.5000E-02 seconds\n", - " Time accumulating tallies = 4.0000E-03 seconds\n", - " Total time for finalization = 2.5000E-02 seconds\n", - " Total time elapsed = 6.3523E+02 seconds\n", - " Calculation Rate (inactive) = 2378.18 neutrons/second\n", - " Calculation Rate (active) = 675.978 neutrons/second\n", + " Total time for initialization = 6.1100E-01 seconds\n", + " Reading cross sections = 1.2200E-01 seconds\n", + " Total time in simulation = 2.4424E+02 seconds\n", + " Time in transport only = 2.4418E+02 seconds\n", + " Time in inactive batches = 1.8776E+01 seconds\n", + " Time in active batches = 2.2547E+02 seconds\n", + " Time synchronizing fission bank = 2.1000E-02 seconds\n", + " Sampling source sites = 1.5000E-02 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 7.0000E-03 seconds\n", + " Total time for finalization = 1.3000E-02 seconds\n", + " Total time elapsed = 2.4492E+02 seconds\n", + " Calculation Rate (inactive) = 5325.95 neutrons/second\n", + " Calculation Rate (active) = 1774.08 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1997,7 +1993,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAADDCAYAAACxgLv/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFw9JREFUeJzt3XmYVNWZx/Fvs4mCgohxAYYmccMFcSOoaHfUEFCjmRk0\nahyVqGNcRicu0WASmsRxmTGKcXQ0GhFXYhAZl7gF6VYTQRFQBHGU0AoKKLsCKkrPH+8pqrq6lltV\n51adbn6f56mnu7a3zq1673vPPfdWHRARERERERERERERERERERERERERKYv/AX5R6UZ40FaWQ+Jz\nBDC/0o3woK0sRzONwNFpt50FvJTjOfsCzwKfAJsivMaJwGxgjXvOFKC6sGa2UAfcn3ZbPXB2iXHj\nUo29VzPTbu8JfAksjBjnLHJ/Nlu6s4A5wDpgCXA70C3Pc04G/uaeMzXD/e2Ba4APgbXYZ5gtZm/g\nUSzPV7u2nFnIAmRQjeVOu5TbziLsPKjH2jwg7fbH3O1HRoyzCfimv2YVrl3+h8SiyV0K8SUwgWhF\ncDdgPPBTLJn7AbcBXxf4mlEUuhzpyvEZbA3sk3L9NODvlN72VJXKpUq7DLje/d0OGAz0BZ4HOuZ4\n3grgJvfcTMa4WINd3NOBz7M89n7gfeAfgB7AvwDLClmIHKo8xQHo4DFWJk3AO8AZKbftABwKfFxg\nrFzLHfdyVMxC4Ki0284k2tZ4N/L3mEcAs3Lc3w4YBbyH9UZmAL3cfbcAH2A97RnAEHf7MOALbAPx\nKdYbvwb4Ctjgbvude+xe2Iq5AtvdOSnlte/Fdvn/DHyG7TncC/zG3V8LLAYuxVauj7CeSsIOwBOu\nfa+6NmR736qx92oU8J8pt7/mbkvtMV+V8n7MBX7gbu/vlu8rt4wrIy7HlcA0rOcHcD7wFtApS1tb\no+2w92RE2u1dsEIwMkKMc2jZY97exe0XsR2f0rKXmGoI1jtfheV2ojd9HLaerHG3j055zgdY7nyK\n5cRgbMOQngdbATdiG4alWE50dvfVYrn8M2xPYry7bVHK6zRiG7U3sN7+BBcz4WfYOrAYe69y9Wan\nAr908ROF9SJsD2YRyR7zIOAV9358BNxKciP6onuNz9xynhRhOb6FresHuOu7YnsvUXvowVhI4UMZ\nCVEKcz+smNyEvYFd0+6/AngT2N1d3w/raQD8CFsx2mHFcQnJYjIauC8t1lTgxynXu2Af2JkuxkDs\nQ+rv7r8XS8BD3fWtgHHAr931WmAjNmzSHhiO7e4mdmMnAA9hyd8fW4FezPguJAtzX/e4KmBv4G3s\n/U8tzCOAnd3/J2OJuZO7nmmjmW85qoAG7D3bHVuR98/SztZqGPZZZdpbuBf7nPLJVJiPxIpGohC8\nA1yQI8bzwMvAD7Fec6q+WGH9IZZPPUh+DjUk96T2wwrriSnPSx/KyJQHNwOTge7YevY4cK27rxZ7\nf67DCl9nWhbmhdgGfGdsvZsHnOfuG4Ytf39sr+8BbK83V2E+GxvyHOZum45tVFIL84FYcW7nlnMe\ncElKnPTiH2U5zsE6NFu710/tCBWsUrufVdiHuSrlchv+dq0XYm9cL+ARrDCOw4om2Id3NfCuuz6H\nZA/gQdeeTVhh3wrYM6XdmXZxUm873r3+eBdjNjCJ5r3mydgWG6wXnh5jI1bgvgaexorkntiK9U9Y\nsfscK7Djs7Qp1WJs5f4utpuXvnEBmIitmGDv2bvAtzO0LaEpz3I0ude6GPhf4AasV9SW9ASWk7mj\nsNTdX4ze2IZ4d2zjOgLbUB+T5fEnYQXzl9gQ1SzgYHffaVjh/iOWTytJfg4NWDEBWwcmYMUa8ud5\n4vq5WAdmNZan1wGnpDxmE5avG8k+FPM77P1ahe0NDnS3nwzcg+X5BhcnytDKfVju7YVtMKal3T8T\n29vchPX0f09yubPJtxx3Y3ucr2IdmqsjtDOrSo4xn4htIROXC0i+6T/CdiM+BZ4q8jWmY72Eb2BH\nUI8k+Wb1ARZked7l2BZ0NZYo3ci/gqVuUPpiBS11o3Mayd5nE823tJmsoPnKvh7rjeyIjW+lPn9x\nnliJ17wP27U+BRuTTE/wM7AVOtHmfbFhk1zyLcf72AGZvtiGt61ZjuVGpvVoF6xDAHAHyXy+KkLc\nDe7vr7ENXqJoHpvl8auBn2Of2U5YZ2Cyu68PVqwz+TbWy/zYxTiP/J95qh2BbYDXSebN0zRfXz7B\nhv9yWZry/waSHahdKC7XJ2FDpReSuROyB/Ak1htfA/wH+Zc7ynLcje2B3IoV8KKFdMAmtVA8CGzr\nLsd5iD0DOzKb2G1bhA2JpDsCG+Y4CdvSbo99cKm9wHTpt32A9URSNzrbYkmSS5S9hU+wMb4+Kbf1\nyfLYdJOwFXsBLRO8L9ZruBDb1d0eGw/OtdxRHIftRk7BxiHbmlewwvnPabd3xXalp7jrPyGZz+kH\n+zK9t29meb0on8MK4LfYOGcPLB+/leWxD2EFvDeW73eQrAlRcn05Vkj3Jpnr3bGx90LanM0Sisv1\nDdgG4ie0PIsKbBx8HlYDumEdtny1MN9ydAXGYsV5DPZeFC2kwhxFZ5LjvVvR/CBBqsOxMZ8d3fW9\ngO+T3KW5GztItRtWfAZgSdwVK3zL3ev8iuZJthTbtUzdiCyjeeI/iW2RT8fGozoCh7g2QPZdxCi7\naF9jBbYOG8vaCzsCHyX51wHfwd6XdF1cjOVYTozEel8Jy7CVN/Usg3y7uj2Bu7Bho7Ow9394hHa2\nJmuwlfBW4HvY+1ONDQUtInNRSGiH5XNH9/9WJN/fBdjQxNVYHvbH9v6ezBLrBqzT0QEr/udjQ1Er\nseJ7DNbZ6ID1DBNjzF2xXu6X2JjraSRzKXFaampuL6V5HmzCPuOxJNe1XsDQHMsdRSKPHsFycS+s\nZ/7LAmKMwoYnPshwX1ds72W9i31+2v3p63QUt2DDGP+K7eXfUeDzmwmpMOc7ha4aeyPfco/bgI09\nZbIaOAHbBfwU23pOIjkgfxP2oT+HrVx3YSvJs8AzwP9hR4s30PyD/ZP7uwLrhYN9ICOwlWAsNs42\nFBsy+BDb6l9HcoOSaTnTb8v1PlyEbeWXYuPLD5N7Fys11kyaH/BL3DcP62W94uLuix1MSpiCjUUu\nJXnaUb7luBPrjT2DvTdnYxvEknoSAfovrAjciOXSNGwI52hy786egeXz7die2gbsPUs4FduTWYEV\n5F+Q+XxnsI30Y1iRXYD1LE9w932A7Sld5mLNInkGxwXYcMlarOj9MSXmemwX/68u7iDgBVrmwZXY\n2Oo0t/zPYx2ThCg97/T7Evc/g40/T8XWyfTjGbkswc5EyeRybCO0FttTnJDWpjps3VqFrdvZalPi\nthOxdT5R4C/FDjCeGqGd0kbdgB3YFGnr+mN7tCF1KEUAOztjALa7Nwjb5Twh5zNEWq9/xIZ5tsdO\nxZtU2eaIZHYwNn64DjvafmVlmyMSq6exockV2NfOd8r9cBERERERkfwOrEkcsdRFl3gu+9c0UQHd\navar/LLr0oYvfZvIwscvRzUxI2v8pDvr4Ly6nA/55kFzc96fsLLuNnrU5f6+xt8b9sl5/2bj6mBk\n7nZFpljxxKqtAr+/chZVU03T03kf1Fj3ANV1p+d8TENV+k9YZHMb+b+L9EjEWPXYLxP4oFj+Y42B\nLHmt005ERAKjwiwiEpjyFeaDar2F2rr2EG+xGFirWG0hVgV1r831U8iF8pjbJU/Yo1iVihVl3G4Y\n9lXj9thXam9Iuz/aGHMEUceYo4g8xizhi2+MOW9uRxljjiL6GHMUUceYJWzFjzG3B/4bS+C9se9+\n98/5DJHWQbktwcpXmAdhP1DSiP0gywSSMxyItGbKbQlWvsLci5Y/VN0ry2NFWhPltgQr32yv0QaP\n76xL/n9QLRxcW2RzRIBZ9TC7Pu5XiZTbjXUPbP6/e+0Azwf6ZMvS6C755SvMH9JyBoGW07vk+eKI\nSEEOqLVLwvgxcbxKpNzO98URkeiqaX62RkPWR+YbyphBckLITtgsCo+X0jSRQCi3JVj5esxfYTNm\nPIsdxf4D2WcNEWlNlNsSrHyFGez3UP2czCkSFuW2BElfyRYRCYwKs4hIYFSYRUQCo8IsIhKYKAf/\n8vvMSxS2Yb2fQMChNS94iwXwSsNRXuNJ69BQNc1LnNEM9xIHYAy/9RYL1nqMJb6oxywiEhgVZhGR\nwKgwi4gERoVZRCQwKswiIoGJUpjvAZYBc2Jui0i5KbclSFEK8zhs+h2Rtka5LUGKUphfAlbF3RCR\nClBuS5A0xiwiEhg/3/wbV5f8f2Bt89knRApVnqmlIqpP+b+a5jNQiBSiEV9TS0Uzss5LGBGgXFNL\nRVRbwdeWtqUaX1NLiYhImUUpzA8DfwP2wKZ7Hxlri0TKR7ktQYoylHFq7K0QqQzltgRJQxkiIoFR\nYRYRCYwKs4hIYFSYRUQC4+c8Zk/eajjEW6zf1FzuLRbAFzWdvMWaOX2It1h85S+U11jSzBhGe4t1\nPZd5i3WVpqkKknrMIiKBUWEWEQmMCrOISGBUmEVEAqPCLCISmCiFuQ8wFZgLvAVcHGuLRMpHuS1B\ninK63Ebgp8BsoCvwOvA88HaM7RIpB+W2BClKj3kplrgAn2FJu2tsLRIpH+W2BKnQMeZq4ABguv+m\niFRUNcptCUQh3/zrCkwELsF6F0maWkp8Kv/UUtlzW1NLiTeN+J5aqiPwKPAAMLnFvZpaSnwq79RS\nuXNbU0uJN9X4nFqqCvgDMA8YW0KrREKj3JYgRSnMhwOnA98BZrnLsDgbJVImym0JUpShjJfRF1Gk\nbVJuS5CUlCIigVFhFhEJjAqziEhgVJhFRAJT5SFGE/VNHsIEzuPJVJMf+563WNcyylus977ezVss\ngJWLv+EnUHUn8JOrhWrC45RQIXoOf+eID2Wat1jmac/xQjMGsuS1eswiIoFRYRYRCYwKs4hIYFSY\nRUQCo8IsIhKYKIW5M/YbtbOxH3u5LtYWiZSH8lqCFeW3Mj7HfuRlvXv8y8AQ91ektVJeS7CiDmWs\nd387Ae2BlfE0R6SslNcSpKiFuR22y7cMm1V4XmwtEikf5bUEKeoMJpuAgUA34FlsWof6zfdqainx\n6ZUGmJZ9dgePcuc1oKmlxJ9GfE8tlbAGeAo4mNSM1dRS4tOhNXZJuOWauF8xc14DmlpK/KnG59RS\nPYHu7v+tge9iMz2ItGbKawlWlB7zLsB4rIi3A+4HpsTZKJEyUF5LsKIU5jnAgXE3RKTMlNcSLH3z\nT0QkMCrMIiKBUWEWEQmMCrOISGBUmEVEAlPoF0y2XP/uL9QPqg71FuvL1bXeYt3YzeNCAs/29TO3\nYVm+A7iFGsr13mI11Qz2FgugaoHHuUQX1/mLVQbqMYuIBEaFWUQkMCrMIiKBUWEWEQlM1MLcHvuB\nlydibItIJSi3JThRC/Ml2I+IezxMKhIE5bYEJ0ph7g0cC9wNVMXbHJGyUm5LkKIU5puBK7DZHkTa\nEuW2BCnfF0yOBz7GxuBqsz5KU0uJR6vr32R1/Ztxv0y03NbUUuJNI76mljoMOAHb3esMbAfcB5zR\n7FGaWko86l47gO61AzZff3/Mg3G8TLTc1tRS4k01vqaWGgX0AfoBpwAv0CJxRVol5bYEq9DzmHXk\nWtoq5bYEo5AfMWpAvycjbZNyW4Kib/6JiARGhVlEJDAqzCIigVFhFhEJjAqziEhgNLVUJcyo8xaq\nU/ftvMVquusyb7EAdjvnPS9xdLpEnDZ4i1TV8HtvsQCaxvr7+ZKq+R7Phryjzl+sLNRjFhEJjAqz\niEhgVJhFRAKjwiwiEpioB/8agbXA18BGYFBcDRIpo0aU1xKgqIW5Cfv9w5XxNUWk7JTXEqRChjI0\n9Y60RcprCU7UwtwE/AWYAZwbX3NEykp5LUGKOpRxOLAE2BF4HpgPvLT5Xk0tJR7NrV/O3PoV5Xip\n3HkNaGop8acRX1NLJSxxfz8BHsMOkiQTWFNLiUf71PZkn9qem69PHPNuXC+VO68BTS0l/lTja2op\ngG2Abd3/XYChwJziGiYSDOW1BCtKj3knrDeRePyDwHOxtUikPJTXEqwohXkhMDDuhoiUmfJagqVv\n/omIBEaFWUQkMCrMIiKBUWEWEQmMCrOISGB8/E5AE/Uep22RgnQe6O/3dz4f28NbLICmCX5+hqJq\nvv3xEqwwTTC6Ai8rZj9vkZpGjfAWq2qmp3r3TBVkyWv1mEVEAqPCLCISGBVmEZHAqDCLiAQmSmHu\nDkwE3gbmAYNjbZFI+Si3JUhRfivjFuDPwAj3+C6xtkikfJTbEqR8hbkbcARwprv+FbAm1haJlIdy\nW4KVbyijH/Yj4uOAmcBd2O/YirR2ym0JVr4ecwfgQOAi4DVgLHAV8Ktmj9LUUuJR/TqoXx/7y0TL\nbU0tJb6sqIeV9ZEemq8wL3aX19z1iVjyNqeppcSj2i52SRgTz/R/0XJbU0uJLzvU2iVhwZisD803\nlLEUWATs4a4fA8wtpW0igVBuS7CinJXxb9i0O52ABcDIWFskUj7KbQlSlML8BnBI3A0RqQDltgRJ\n3/wTEQmMCrOISGBUmEVEAqPCLCISGBVmEZHARDkrQwL2+Xx/00FNGX2Yt1gAdXVew8kWZ463SFXX\nfukt1kueZjk7Isd96jGLiARGhVlEJDAqzCIigVFhFhEJTJTCvCcwK+WyBrg4zkaJlIHyWoIV5ayM\nd4AD3P/tgA+Bx2JrkUh5KK8lWIUOZRyD/QrXohjaIlIpymsJSqGF+RTgoTgaIlJBymsJSiFfMOkE\nfB+4ssU9mlpKPGp0lzLJnteAppYSXxIHM6IopDAPB17HJrBsTlNLiUfVNC9/DfG+XPa8BjS1lPhy\nAMmDGmCzAGdTyFDGqcDDRbVIJFzKawlO1MLcBTtAMinGtoiUm/JaghR1KGMd0DPOhohUgPJagqRv\n/omIBKZ8hXlWvWJVKtbr/mLNrl/jLVajt0iV1qhYbSKWv8PMUc++yKZ8hXl2vWJVKtZMf7HeqF/r\nLVajt0iV1qhYbSLWlliYRUQkEhVmEZHA+JgjpR6o8RBHJJsGKvNNj3qU2xKfSuW1iIiIiIiIiEhr\nNAyYD7xL1l/xiuQeYBl+5jXvA0wF5gJvUdrsFZ2B6cBsYB5wXYlta4+dcfNEiXHAzid608V7tcRY\n3YGJwNvYcg4uMk5bmT1EeV04X7ndiPK6JO2B97AfDOuIfcj9i4x1BPYDTT4SeGdgoPu/KzajRbHt\nAtjG/e0ATAOGlBDrUuBB4PESYiQsBHp4iAMwHvix+78D0M1DzHbAEqygtCbK6+L4yu02ndflOF1u\nEJbAjcBGYAJwYpGxXgJW+WkWS7GVCeAzbGu5awnx1ru/nbCVdmWRcXoDxwJ34+esGTzF6YYVkHvc\n9a+wHkGpWuvsIcrrwvnO7Tab1+UozL1o3rjF7raQVGM9luklxGiHrRDLsF3JeUXGuRm4AthUQltS\nNQF/AWYA55YQpx/2m8XjgJnAXSR7U6VorbOHKK8L5zO323Rel6MwN5XhNUrRFRtfugTrYRRrE7YL\n2Rs4kuLOTzwe+Bgbn/LVWz4cWzmHAxdivYNidAAOBG53f9cBV5XYtsTsIX8qMU4lKK8L4zu323Re\nl6Mwf0jzcZY+WO8iBB2BR4EHgMmeYq4BngIOLuK5hwEnYONnDwNHAfeV2J4l7u8n2CzQg4qMs9hd\nXnPXJ2KJXIo8s4cETXldGN+5rbwuUQdsrKUa25KUcpAEF8fHQZIqLDFu9hCrJ3ZkF2Br4EXg6BJj\n1lD6kettgG3d/12AvwJDS4j3IrCH+78OuKGEWGDjsmeWGKNSlNfFKzW3ldeeDMeODr8H/LyEOA8D\nHwFfYON7I0uINQTbTZtN8vSWYUXG2g8bn5qNncJzRQntSqih9CPX/bA2zcZOnSrlvQfYH+tZvIHN\n+lHK0esuwHKSK1hrpLwuTqm5rbwWERERERERERERERERERERERERERERERGRtu3/AZvD3wdjaiUx\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2204,9 +2200,6 @@ }, "outputs": [], "source": [ - "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n", - "su.make_opencg_geometry()\n", - "\n", "# Create an OpenMOC Geometry from the OpenCG Geometry\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" ] @@ -2306,8 +2299,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223863\n", - "openmoc keff = 1.220753\n", - "bias [pcm]: -311.0\n" + "openmoc keff = 1.220767\n", + "bias [pcm]: -309.6\n" ] } ], @@ -2337,7 +2330,6 @@ }, "outputs": [], "source": [ - "su.make_opencg_geometry()\n", "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", "\n", @@ -2400,8 +2392,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223863\n", - "openmoc keff = 1.223860\n", - "bias [pcm]: -0.3\n" + "openmoc keff = 1.223848\n", + "bias [pcm]: -1.5\n" ] } ], diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 294c35ba0c..1e4c3c9cd0 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -379,7 +379,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTEyVDIzOjQ5\nOjA0LTA0OjAw6Y3dGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0xMlQyMzo0OTowNC0wNDow\nMJjQZacAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTI4VDIwOjU1\nOjE4LTA0OjAwI9YF2QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0yOFQyMDo1NToxOC0wNDow\nMFKLvWUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -568,8 +568,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-12 23:49:04\n", + " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", + " Date/Time: 2015-10-28 20:55:18\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -588,6 +588,7 @@ " Loading ACE cross section table: 1001.71c\n", " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -633,20 +634,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.0100E-01 seconds\n", - " Reading cross sections = 8.9000E-02 seconds\n", - " Total time in simulation = 9.1400E+00 seconds\n", - " Time in transport only = 9.1280E+00 seconds\n", - " Time in inactive batches = 1.3230E+00 seconds\n", - " Time in active batches = 7.8170E+00 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Total time for initialization = 7.3800E-01 seconds\n", + " Reading cross sections = 1.5600E-01 seconds\n", + " Total time in simulation = 1.5998E+01 seconds\n", + " Time in transport only = 1.5965E+01 seconds\n", + " Time in inactive batches = 2.3990E+00 seconds\n", + " Time in active batches = 1.3599E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", " Time accumulating tallies = 3.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 9.5500E+00 seconds\n", - " Calculation Rate (inactive) = 9448.22 neutrons/second\n", - " Calculation Rate (active) = 4797.24 neutrons/second\n", + " Total time elapsed = 1.6754E+01 seconds\n", + " Calculation Rate (inactive) = 5210.50 neutrons/second\n", + " Calculation Rate (active) = 2757.56 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -800,7 +801,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1076,7 +1077,7 @@ "data": { "image/png": "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\nkiRJEsA/A3sng0v+IomuAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1099,7 +1100,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 27, @@ -1110,7 +1111,7 @@ "data": { "image/png": "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\n/wfC21DgNNvIcQAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1180,7 +1181,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1492,7 +1493,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1702,7 +1703,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -2121,7 +2122,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -2315,7 +2316,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 38, @@ -2324,9 +2325,9 @@ }, { "data": { - "image/png": "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\niUSS+/w/t3PPI3Lev3cAAAAASUVORK5CYII=\n", + "image/png": "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\nTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2353,7 +2354,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 39, @@ -2362,9 +2363,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index ecf027fda5..87ae42b41e 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -347,7 +347,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMTJUMjM6NTE6MDAtMDQ6MDDPm2Y8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTEy\nVDIzOjUxOjAwLTA0OjAwvsbegAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMjhUMjE6MDQ6NDItMDQ6MDCMRUoKAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTI4\nVDIxOjA0OjQyLTA0OjAw/RjytgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -458,8 +458,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-12 23:51:01\n", + " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", + " Date/Time: 2015-10-28 21:04:43\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -478,6 +478,7 @@ " Loading ACE cross section table: 1001.71c\n", " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -507,7 +508,19 @@ " 19/1 1.00071 1.04214 +/- 0.00800\n", " 20/1 1.05587 1.04351 +/- 0.00729\n", " 21/1 1.03886 1.04309 +/- 0.00660\n", - " 22/1 1.04335 1.04311 +/- 0.00603\n" + " 22/1 1.04335 1.04311 +/- 0.00603\n", + " 23/1 1.04057 1.04292 +/- 0.00555\n", + " 24/1 1.01976 1.04126 +/- 0.00540\n", + " 25/1 1.05811 1.04238 +/- 0.00515\n", + " 26/1 1.02351 1.04120 +/- 0.00496\n", + " 27/1 1.05261 1.04188 +/- 0.00471\n", + " 28/1 1.03355 1.04141 +/- 0.00446\n", + " 29/1 1.02797 1.04071 +/- 0.00428\n", + " 30/1 1.03758 1.04055 +/- 0.00406\n", + " 31/1 1.04883 1.04094 +/- 0.00388\n", + " 32/1 1.03557 1.04070 +/- 0.00371\n", + " 33/1 1.02947 1.04021 +/- 0.00358\n", + " 34/1 1.03651 1.04006 +/- 0.00343\n" ] } ], diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 0c98697677..fce805f183 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -363,7 +363,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMTJUMjM6NTI6MDgtMDQ6MDAXQ5NYAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTEy\nVDIzOjUyOjA4LTA0OjAwZh4r5AAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMjhUMjE6MTU6MDYtMDQ6MDDSDNQdAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTI4\nVDIxOjE1OjA2LTA0OjAwo1FsoQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -573,8 +573,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n", - " Date/Time: 2015-10-12 23:52:08\n", + " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", + " Date/Time: 2015-10-28 21:15:07\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -593,6 +593,7 @@ " Loading ACE cross section table: 1001.71c\n", " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -630,20 +631,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1300E-01 seconds\n", - " Reading cross sections = 9.6000E-02 seconds\n", - " Total time in simulation = 1.6248E+01 seconds\n", - " Time in transport only = 1.6236E+01 seconds\n", - " Time in inactive batches = 2.3150E+00 seconds\n", - " Time in active batches = 1.3933E+01 seconds\n", - " Time synchronizing fission bank = 0.0000E+00 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 1.6672E+01 seconds\n", - " Calculation Rate (inactive) = 5399.57 neutrons/second\n", - " Calculation Rate (active) = 2691.45 neutrons/second\n", + " Total time for initialization = 6.3800E-01 seconds\n", + " Reading cross sections = 1.3500E-01 seconds\n", + " Total time in simulation = 2.3556E+01 seconds\n", + " Time in transport only = 2.3532E+01 seconds\n", + " Time in inactive batches = 3.1100E+00 seconds\n", + " Time in active batches = 2.0446E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 2.4210E+01 seconds\n", + " Calculation Rate (inactive) = 4019.29 neutrons/second\n", + " Calculation Rate (active) = 1834.10 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -741,7 +742,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -801,7 +802,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -861,7 +862,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -920,7 +921,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -981,7 +982,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1039,7 +1040,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1117,7 +1118,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1343,7 +1344,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", @@ -1426,7 +1427,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
\n", " \n", " \n", diff --git a/openmc/filter.py b/openmc/filter.py index 5c0343df75..92677709db 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -601,8 +601,7 @@ class Filter(object): 'to use a Summary for distribcell dataframes' raise ImportError(msg) - # Create and extract the OpenCG geometry the Summary - summary.make_opencg_geometry() + # Extract the OpenCG geometry from the Summary opencg_geometry = summary.opencg_geometry openmc_geometry = summary.openmc_geometry diff --git a/openmc/summary.py b/openmc/summary.py index b38e6d7597..981cec794f 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -8,6 +8,15 @@ class Summary(object): """Information summarizing the geometry, materials, and tallies used in a simulation. + Attributes + ---------- + openmc_geometry : openmc.Geometry + An OpenMC geometry object reconstructed from the summary file + opencg_geometry : opencg.Geometry + An OpenCG geometry object equivalent to the OpenMC geometry + encapsulated by the summary file. Use of this attribute requires + installation of the OpenCG Python module. + """ def __init__(self, filename): @@ -23,13 +32,30 @@ class Summary(object): raise ValueError(msg) self._f = h5py.File(filename, 'r') - self.openmc_geometry = None - self.opencg_geometry = None + self._openmc_geometry = None + self._opencg_geometry = None self._read_metadata() self._read_geometry() self._read_tallies() + @property + def openmc_geometry(self): + return self._openmc_geometry + + @property + def opencg_geometry(self): + try: + from openmc.opencg_compatible import get_opencg_geometry + except ImportError: + msg = 'Unable to import OpenCG.' + raise ImportError(msg) + + if self._opencg_geometry is None: + self._opencg_geometry = get_opencg_geometry(self._openmc_geometry) + + return self._opencg_geometry + def _read_metadata(self): # Read OpenMC version self.version = [self._f['version_major'].value, @@ -444,7 +470,7 @@ class Summary(object): def _finalize_geometry(self): # Initialize Geometry object - self.openmc_geometry = openmc.Geometry() + self._openmc_geometry = openmc.Geometry() # Iterate over all Cells and add fill Materials, Universes and Lattices for cell_key in self._cell_fills.keys(): @@ -468,7 +494,7 @@ class Summary(object): # Set the root universe for the Geometry root_universe = self.get_universe_by_id(0) - self.openmc_geometry.root_universe = root_universe + self._openmc_geometry.root_universe = root_universe def _read_tallies(self): # Initialize dictionaries for the Tallies @@ -531,22 +557,6 @@ class Summary(object): # Add Tally to the global dictionary of all Tallies self.tallies[tally_id] = tally - def make_opencg_geometry(self): - """Create OpenCG geometry based on the information contained in the summary - file. The geometry is stored as the 'opencg_geometry' attribute. - - """ - - try: - from openmc.opencg_compatible import get_opencg_geometry - except ImportError: - msg = 'Unable to import opencg which is needed ' \ - 'by Summary.make_opencg_geometry()' - raise ImportError(msg) - - if self.opencg_geometry is None: - self.opencg_geometry = get_opencg_geometry(self.openmc_geometry) - def get_material_by_id(self, material_id): """Return a Material object given the material id diff --git a/openmc/tallies.py b/openmc/tallies.py index c9e4854e29..5755187346 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2107,6 +2107,9 @@ class Tally(object): return new_tally + def __div__(self, other): + return self.__truediv__(other) + def __pow__(self, power): """Raises this tally to another tally or scalar value power. From f735b6e40f35ce117d9518d31c29e6e9d8bcd4f7 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 28 Oct 2015 21:22:40 -0400 Subject: [PATCH 400/519] Use numpy-aware isinstance in PyAPI filter --- openmc/filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/filter.py b/openmc/filter.py index 5c0343df75..76cd68523c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -200,7 +200,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 isinstance(bins[0], Integral): + elif not cv._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) From 0c3811ab8d46e6c7ae0f24c43ea4781209e68d37 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 29 Oct 2015 10:59:44 -0400 Subject: [PATCH 401/519] Removed unnecessary try-except for OpenCG import in summary.py --- openmc/summary.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/openmc/summary.py b/openmc/summary.py index 981cec794f..5f14fbc03e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -45,15 +45,8 @@ class Summary(object): @property def opencg_geometry(self): - try: - from openmc.opencg_compatible import get_opencg_geometry - except ImportError: - msg = 'Unable to import OpenCG.' - raise ImportError(msg) - if self._opencg_geometry is None: self._opencg_geometry = get_opencg_geometry(self._openmc_geometry) - return self._opencg_geometry def _read_metadata(self): From e44ac1341d567e5870a45ae4709ba02ac68c124e Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 29 Oct 2015 15:50:38 -0400 Subject: [PATCH 402/519] Added openmc.opencg_compatible import to Summary.opencg_geometry property --- openmc/summary.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openmc/summary.py b/openmc/summary.py index 5f14fbc03e..7c8a71a87c 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -46,6 +46,7 @@ class Summary(object): @property def opencg_geometry(self): if self._opencg_geometry is None: + from openmc.opencg_compatible import get_opencg_geometry self._opencg_geometry = get_opencg_geometry(self._openmc_geometry) return self._opencg_geometry From 8adde7d396bdaf529f5b2a8771cd0da81d3fcc20 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 29 Oct 2015 19:55:40 -0400 Subject: [PATCH 403/519] Added new opencg_geometry property to openmc.mgxs.Library --- openmc/mgxs/library.py | 17 +++++++++++++++++ openmc/summary.py | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 13537848e1..805c1922a6 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -43,6 +43,10 @@ class Library(object): ---------- openmc_geometry : openmc.Geometry An geometry which has been initialized with a root universe + opencg_geometry : opencg.Geometry + An OpenCG geometry object equivalent to the OpenMC geometry + encapsulated by the summary file. Use of this attribute requires + installation of the OpenCG Python module. by_nuclide : bool If true, computes cross sections for each nuclide in each domain mgxs_types : Iterable of str @@ -71,6 +75,7 @@ class Library(object): self._name = '' self._openmc_geometry = None + self._opencg_geometry = None self._by_nuclide = None self._mgxs_types = [] self._domain_type = None @@ -95,6 +100,7 @@ class Library(object): clone = type(self).__new__(type(self)) clone._name = self.name clone._openmc_geometry = self.openmc_geometry + clone._opencg_geometry = self.opencg_geometry clone._by_nuclide = self.by_nuclide clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type @@ -123,6 +129,17 @@ class Library(object): def openmc_geometry(self): return self._openmc_geometry + @property + def openmc_geometry(self): + return self._openmc_geometry + + @property + def opencg_geometry(self): + if self._opencg_geometry is None: + from openmc.opencg_compatible import get_opencg_geometry + self._opencg_geometry = get_opencg_geometry(self._openmc_geometry) + return self._opencg_geometry + @property def name(self): return self._name diff --git a/openmc/summary.py b/openmc/summary.py index 7c8a71a87c..4b1088e827 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -47,7 +47,7 @@ class Summary(object): def opencg_geometry(self): if self._opencg_geometry is None: from openmc.opencg_compatible import get_opencg_geometry - self._opencg_geometry = get_opencg_geometry(self._openmc_geometry) + self._opencg_geometry = get_opencg_geometry(self.openmc_geometry) return self._opencg_geometry def _read_metadata(self): @@ -488,7 +488,7 @@ class Summary(object): # Set the root universe for the Geometry root_universe = self.get_universe_by_id(0) - self._openmc_geometry.root_universe = root_universe + self.openmc_geometry.root_universe = root_universe def _read_tallies(self): # Initialize dictionaries for the Tallies From 0beb5c7aa59f128443829d6b0bbbf82e66543fb4 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 29 Oct 2015 20:25:32 -0400 Subject: [PATCH 404/519] Removed OpenCG geometry reference in openmc.mgxs.Library.__deepcopy__ routine --- openmc/mgxs/library.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 805c1922a6..34db5d9c83 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -100,7 +100,7 @@ class Library(object): clone = type(self).__new__(type(self)) clone._name = self.name clone._openmc_geometry = self.openmc_geometry - clone._opencg_geometry = self.opencg_geometry + clone._opencg_geometry = None clone._by_nuclide = self.by_nuclide clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type From 70b4bf3118c3e1143612096f73bfcd4b41b6dac7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 6 Oct 2015 09:19:06 +0700 Subject: [PATCH 405/519] Allow + in region specification --- openmc/region.py | 2 +- src/string.F90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index f8f3a73781..97069d797b 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -84,7 +84,7 @@ class Region(object): i_start = -1 else: # Check for invalid characters - if expression[i] not in '-0123456789': + if expression[i] not in '-+0123456789': raise SyntaxError("Invalid character '{}' in expression" .format(expression[i])) diff --git a/src/string.F90 b/src/string.F90 index 45db59c875..9ca630e295 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -136,7 +136,7 @@ contains i_start = 0 else ! Check for invalid characters - if (index('-0123456789', string_(i:i)) == 0) then + if (index('-+0123456789', string_(i:i)) == 0) then call fatal_error("Invalid character '" // string_(i:i) // "' in & ®ion specification.") end if From 50c411acfab3aae535c183e38d5b1b72184f2cfc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 30 Oct 2015 07:20:37 -0500 Subject: [PATCH 406/519] Add Material.__deepcopy__ method --- openmc/material.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/openmc/material.py b/openmc/material.py index 41a67f6b70..4100c26ecf 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -115,6 +115,30 @@ class Material(object): return string + def __deepcopy__(self, memo): + existing = memo.get(id(self)) + + if existing is None: + # If this is the first time we have tried to copy this object, create a copy + clone = type(self).__new__(type(self)) + clone._id = self._id + clone._name = self._name + clone._density = self._density + clone._density_units = self._density_units + clone._nuclides = deepcopy(self._nuclides, memo) + clone._elements = deepcopy(self._elements, memo) + clone._sab = deepcopy(self._sab, memo) + clone._convert_to_distrib_comps = self._convert_to_distrib_comps + clone._distrib_otf_file = self._distrib_otf_file + + memo[id(self)] = clone + + return clone + + else: + # If this object has been copied before, return the first copy made + return existing + @property def id(self): return self._id From 9709edcfad299240ed074c0895eaa1173566a555 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 1 Nov 2015 21:25:12 -0500 Subject: [PATCH 407/519] Fixed super call in NuScatterMatrix.tallies property --- openmc/mgxs/library.py | 9 ++++++--- openmc/mgxs/mgxs.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 34db5d9c83..b41b985f1d 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -62,8 +62,9 @@ class Library(object): compute the cross section all_mgxs : OrderedDict MGXS objects keyed by domain ID and cross section type - statepoint : openmc.StatePoint - The statepoint with tally data used to the compute cross sections + sp_filename : str + The filename of the statepoint with tally data used to the + compute cross sections name : str, optional Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. @@ -341,7 +342,9 @@ class Library(object): ---------- domain : Material or Cell or Universe or Integral The material, cell, or universe object of interest (or its ID) - mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'} + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', + 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', + 'nu-scatter matrix', 'chi'} The type of multi-group cross section object to return Returns diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 9e2fcbf00f..2ad5c6234b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1998,7 +1998,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): """ # Instantiate tallies if they do not exist - if super(NuScatterMatrixXS, self).tallies is None: + if super(ScatterMatrixXS, self).tallies is None: # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges From 64d152c0b6f5ef5145a2bd993269b1b6a5066b51 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 1 Nov 2015 22:00:47 -0500 Subject: [PATCH 408/519] Updated test suite with correct nu-scatter matrix results for openmc.mgxs module --- .../examples/multi-group-cross-sections.ipynb | 347 +++++++++--------- openmc/mgxs/library.py | 12 +- .../inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- 6 files changed, 184 insertions(+), 183 deletions(-) diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb index 32f39a6fcc..f4e4b59eff 100644 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb @@ -444,7 +444,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 21:15:49\n", + " Date/Time: 2015-11-01 21:28:30\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -530,20 +530,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.4700E-01 seconds\n", - " Reading cross sections = 1.5400E-01 seconds\n", - " Total time in simulation = 2.0496E+01 seconds\n", - " Time in transport only = 2.0451E+01 seconds\n", - " Time in inactive batches = 3.1940E+00 seconds\n", - " Time in active batches = 1.7302E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 2.1260E+01 seconds\n", - " Calculation Rate (inactive) = 7827.18 neutrons/second\n", - " Calculation Rate (active) = 5779.68 neutrons/second\n", + " Total time for initialization = 1.9120E+00 seconds\n", + " Reading cross sections = 4.8600E-01 seconds\n", + " Total time in simulation = 6.1145E+01 seconds\n", + " Time in transport only = 6.0977E+01 seconds\n", + " Time in inactive batches = 8.1390E+00 seconds\n", + " Time in active batches = 5.3006E+01 seconds\n", + " Time synchronizing fission bank = 1.6000E-02 seconds\n", + " Sampling source sites = 1.2000E-02 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 1.0000E-02 seconds\n", + " Total time elapsed = 6.3104E+01 seconds\n", + " Calculation Rate (inactive) = 3071.63 neutrons/second\n", + " Calculation Rate (active) = 1886.58 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -747,8 +747,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -756,8 +756,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -765,7 +765,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -837,9 +837,9 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "63 1 1 1 total 0.076913 0.001013\n", - "62 1 1 2 total 0.087715 0.000343\n", - "61 1 1 3 total 0.000417 0.000023\n", + "63 1 1 1 total 0.076970 0.001012\n", + "62 1 1 2 total 0.087876 0.000344\n", + "61 1 1 3 total 0.000418 0.000023\n", "60 1 1 4 total 0.000000 0.000000\n", "59 1 1 5 total 0.000000 0.000000\n", "58 1 1 6 total 0.000000 0.000000\n", @@ -976,135 +976,136 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Importing ray tracing data from file...\n", + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685183\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.785638\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750179\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728836\tres = 4.513E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.695616\tres = 2.845E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663333\tres = 4.558E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.632306\tres = 4.641E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.604144\tres = 4.677E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.579395\tres = 4.454E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.558403\tres = 4.097E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.541346\tres = 3.623E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.528269\tres = 3.055E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.519138\tres = 2.416E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.513828\tres = 1.729E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.512170\tres = 1.023E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.513942\tres = 3.227E-03\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.518887\tres = 3.460E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.526729\tres = 9.623E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.537170\tres = 1.511E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.549910\tres = 1.982E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.564646\tres = 2.372E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.581084\tres = 2.680E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.598939\tres = 2.911E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.617940\tres = 3.073E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.637834\tres = 3.172E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.658386\tres = 3.219E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.679382\tres = 3.222E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.700626\tres = 3.189E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.721946\tres = 3.127E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.743187\tres = 3.043E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.764215\tres = 2.942E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.784913\tres = 2.829E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.805184\tres = 2.708E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.824944\tres = 2.583E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.844126\tres = 2.454E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.862675\tres = 2.325E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.880550\tres = 2.197E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.897720\tres = 2.072E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.914163\tres = 1.950E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.929866\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.944826\tres = 1.718E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.959043\tres = 1.609E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.972524\tres = 1.505E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.985280\tres = 1.406E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.997327\tres = 1.312E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.008684\tres = 1.223E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.019372\tres = 1.139E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.029414\tres = 1.060E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.038835\tres = 9.851E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 1.047661\tres = 9.152E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.055917\tres = 8.496E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.063631\tres = 7.881E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.070830\tres = 7.306E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.077540\tres = 6.768E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.083788\tres = 6.266E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.089599\tres = 5.798E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.094999\tres = 5.362E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.100012\tres = 4.956E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.104661\tres = 4.578E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.108970\tres = 4.227E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.112960\tres = 3.901E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.116652\tres = 3.598E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.120066\tres = 3.317E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.123220\tres = 3.057E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.126132\tres = 2.816E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.128819\tres = 2.593E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.131297\tres = 2.386E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.133580\tres = 2.195E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.135684\tres = 2.019E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.137621\tres = 1.856E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.139403\tres = 1.705E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.141041\tres = 1.566E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.142548\tres = 1.438E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.143932\tres = 1.320E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.145204\tres = 1.212E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.146371\tres = 1.111E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.147442\tres = 1.019E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.148425\tres = 9.345E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.149326\tres = 8.564E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.150152\tres = 7.847E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.150909\tres = 7.188E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.151603\tres = 6.583E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.152238\tres = 6.027E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.152820\tres = 5.516E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.153352\tres = 5.047E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.153839\tres = 4.617E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.154284\tres = 4.223E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.154692\tres = 3.862E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.155064\tres = 3.531E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.155405\tres = 3.227E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.155716\tres = 2.949E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.156001\tres = 2.694E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.156260\tres = 2.462E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.156498\tres = 2.248E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.156715\tres = 2.053E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.156913\tres = 1.875E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.157093\tres = 1.711E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.157258\tres = 1.562E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.157408\tres = 1.424E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.157546\tres = 1.300E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.157671\tres = 1.186E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.157785\tres = 1.082E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.157889\tres = 9.868E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.157984\tres = 9.000E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.158071\tres = 8.204E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.158150\tres = 7.488E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.158222\tres = 6.819E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.158288\tres = 6.216E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.158347\tres = 5.666E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.158402\tres = 5.167E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.158451\tres = 4.703E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.158496\tres = 4.284E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.158538\tres = 3.909E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.158575\tres = 3.559E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.158609\tres = 3.235E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.158640\tres = 2.955E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.158669\tres = 2.693E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.158695\tres = 2.446E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.158718\tres = 2.227E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.158739\tres = 2.034E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.158759\tres = 1.852E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.158777\tres = 1.694E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.158793\tres = 1.533E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.158808\tres = 1.401E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.158821\tres = 1.271E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.158833\tres = 1.159E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.158844\tres = 1.054E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.483E-316\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.695632\tres = 2.844E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.701457\tres = 3.194E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.722832\tres = 3.132E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.085610\tres = 6.273E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.091437\tres = 5.804E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.101878\tres = 4.961E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.110861\tres = 4.231E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.114862\tres = 3.905E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.118564\tres = 3.602E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.121987\tres = 3.321E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.125150\tres = 3.060E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.128070\tres = 2.819E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.133249\tres = 2.389E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.135539\tres = 2.197E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.137649\tres = 2.021E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.139591\tres = 1.858E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.141378\tres = 1.707E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.144532\tres = 1.440E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.147196\tres = 1.213E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.148366\tres = 1.113E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.150426\tres = 9.355E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.151330\tres = 8.574E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.152158\tres = 7.856E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.152918\tres = 7.196E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.153613\tres = 6.590E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.154250\tres = 6.033E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.154833\tres = 5.522E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.155367\tres = 5.053E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.155856\tres = 4.623E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.156303\tres = 4.228E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.156711\tres = 3.866E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.157085\tres = 3.535E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.157427\tres = 3.231E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.157739\tres = 2.952E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158024\tres = 2.697E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.158285\tres = 2.464E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.158523\tres = 2.251E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.158740\tres = 2.055E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.158939\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.159120\tres = 1.713E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.159285\tres = 1.563E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.159436\tres = 1.427E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.159574\tres = 1.302E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.159814\tres = 1.083E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.159918\tres = 9.880E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.160014\tres = 9.009E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.160101\tres = 8.215E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.160180\tres = 7.490E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.160252\tres = 6.827E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.160318\tres = 6.223E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.160378\tres = 5.672E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.160432\tres = 5.169E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.160482\tres = 4.710E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.160528\tres = 4.291E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.160569\tres = 3.909E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.160607\tres = 3.561E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.160641\tres = 3.244E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.160672\tres = 2.954E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.160700\tres = 2.691E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.160726\tres = 2.450E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.160750\tres = 2.231E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.160771\tres = 2.031E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.160791\tres = 1.849E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.160809\tres = 1.684E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.160825\tres = 1.533E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.160840\tres = 1.395E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.160853\tres = 1.270E-05\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.160865\tres = 1.156E-05\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.160876\tres = 1.052E-05\n" ] } ], @@ -1138,8 +1139,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.161200\n", - "openmoc keff = 1.158844\n", - "bias [pcm]: -235.6\n" + "openmoc keff = 1.160876\n", + "bias [pcm]: -32.4\n" ] } ], @@ -1486,7 +1487,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 21:16:11\n", + " Date/Time: 2015-11-01 21:29:37\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -1593,20 +1594,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.1100E-01 seconds\n", - " Reading cross sections = 1.2200E-01 seconds\n", - " Total time in simulation = 2.4424E+02 seconds\n", - " Time in transport only = 2.4418E+02 seconds\n", - " Time in inactive batches = 1.8776E+01 seconds\n", - " Time in active batches = 2.2547E+02 seconds\n", - " Time synchronizing fission bank = 2.1000E-02 seconds\n", - " Sampling source sites = 1.5000E-02 seconds\n", - " SEND/RECV source sites = 4.0000E-03 seconds\n", - " Time accumulating tallies = 7.0000E-03 seconds\n", - " Total time for finalization = 1.3000E-02 seconds\n", - " Total time elapsed = 2.4492E+02 seconds\n", - " Calculation Rate (inactive) = 5325.95 neutrons/second\n", - " Calculation Rate (active) = 1774.08 neutrons/second\n", + " Total time for initialization = 2.0080E+00 seconds\n", + " Reading cross sections = 4.3400E-01 seconds\n", + " Total time in simulation = 9.0060E+02 seconds\n", + " Time in transport only = 9.0020E+02 seconds\n", + " Time in inactive batches = 7.3259E+01 seconds\n", + " Time in active batches = 8.2734E+02 seconds\n", + " Time synchronizing fission bank = 6.9000E-02 seconds\n", + " Sampling source sites = 4.7000E-02 seconds\n", + " SEND/RECV source sites = 2.2000E-02 seconds\n", + " Time accumulating tallies = 5.0000E-03 seconds\n", + " Total time for finalization = 7.7000E-02 seconds\n", + " Total time elapsed = 9.0285E+02 seconds\n", + " Calculation Rate (inactive) = 1365.02 neutrons/second\n", + " Calculation Rate (active) = 483.479 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1993,7 +1994,7 @@ "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2299,8 +2300,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223863\n", - "openmoc keff = 1.220767\n", - "bias [pcm]: -309.6\n" + "openmoc keff = 1.222517\n", + "bias [pcm]: -134.7\n" ] } ], @@ -2392,8 +2393,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223863\n", - "openmoc keff = 1.223848\n", - "bias [pcm]: -1.5\n" + "openmoc keff = 1.225691\n", + "bias [pcm]: 182.7\n" ] } ], diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index b41b985f1d..4c173f81a9 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -190,7 +190,7 @@ class Library(object): return self._all_mgxs @property - def statepoint(self): + def sp_filename(self): return self._sp_filename @openmc_geometry.setter @@ -417,7 +417,7 @@ class Library(object): """ - if self.statepoint is None: + if self.sp_filename is None: msg = 'Unable to get a condensed coarse group cross section ' \ 'library since the statepoint has not yet been loaded' raise ValueError(msg) @@ -469,7 +469,7 @@ class Library(object): """ - if self.statepoint is None: + if self.sp_filename is None: msg = 'Unable to get a subdomain-averaged cross section ' \ 'library since the statepoint has not yet been loaded' raise ValueError(msg) @@ -534,9 +534,9 @@ class Library(object): """ - if self.statepoint is None: - msg = 'Unable to get a condensed coarse group cross section ' \ - 'library since a statepoint has not yet been loaded' + if self.sp_filename is None: + msg = 'Unable to export multi-group cross section library ' \ + 'since a statepoint has not yet been loaded' raise ValueError(msg) cv.check_type('filename', filename, basestring) diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index f681e5ff76..37397c5947 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7 \ No newline at end of file +35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index f681e5ff76..37397c5947 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7 \ No newline at end of file +35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index f681e5ff76..37397c5947 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7 \ No newline at end of file +35f99f1973b3bf3efcec6c2dddf56d6679a15dab8582ab5336e86e4fdf90967ce91036e5c30c345decb994ab9133a906b82dc8fad0cdd3398a612d9aa05c1c77 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 7c064c3c1d..2e299773a3 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -04dcfca7d68981d7ec19d428c541acd6345ec2d608c581d56ce21d23548f52977fe713b5cdd7434bebf62067444d6562ef322175736a6a63e3985e5e48718081 \ No newline at end of file +7c1deb8a54fbe1a1ce6ef27cea4a11995210ad3e5ecf32bd83d7c80041edf0793378a7325ffe7ebf9c537e9c278fd4545642fec6c1e46b9c5418118f035d5e95 \ No newline at end of file From 8104704b1f33b26b464edfce061b786c2e8eeea0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 2 Nov 2015 06:53:42 -0600 Subject: [PATCH 409/519] Remove old instance of getIds --- openmc/universe.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/openmc/universe.py b/openmc/universe.py index cd12405b29..b38ff2c4ba 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -527,11 +527,9 @@ class Universe(object): 'not a Cell'.format(self._id, cell) raise ValueError(msg) - cell_id = cell.getId() - # If the Cell is in the Universe's list of Cells, delete it - if cell_id in self._cells: - del self._cells[cell_id] + if cell.id in self._cells: + del self._cells[cell.id] def clear_cells(self): """Remove all cells from the universe.""" From 90de395f5331c2d7c3de55974c13f418d9542bb5 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 2 Nov 2015 13:21:50 -0500 Subject: [PATCH 410/519] Removed use of super to call create_tallies in openmc.mgxs --- openmc/mgxs/mgxs.py | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 2ad5c6234b..058fe5a1d7 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1299,8 +1299,7 @@ class TotalXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(TotalXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(TotalXS, self).tallies @@ -1347,8 +1346,7 @@ class TransportXS(MGXS): filters = [[energy_filter], [energy_filter], [energyout_filter]] # Initialize the Tallies - super(TransportXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(TransportXS, self).tallies @@ -1399,8 +1397,7 @@ class AbsorptionXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(AbsorptionXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(AbsorptionXS, self).tallies @@ -1452,8 +1449,7 @@ class CaptureXS(MGXS): filters = [[energy_filter], [energy_filter], [energy_filter]] # Initialize the Tallies - super(CaptureXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(CaptureXS, self).tallies @@ -1499,8 +1495,7 @@ class FissionXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(FissionXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(FissionXS, self).tallies @@ -1545,8 +1540,7 @@ class NuFissionXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(NuFissionXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(NuFissionXS, self).tallies @@ -1591,8 +1585,7 @@ class ScatterXS(MGXS): filters = [[energy_filter], [energy_filter]] # Intialize the Tallies - super(ScatterXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(ScatterXS, self).tallies @@ -1637,8 +1630,7 @@ class NuScatterXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - super(NuScatterXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(NuScatterXS, self).tallies @@ -1705,8 +1697,7 @@ class ScatterMatrixXS(MGXS): keys = scores # Initialize the Tallies - super(ScatterMatrixXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(ScatterMatrixXS, self).tallies @@ -2018,8 +2009,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): filters = [[energy], [energy, energyout]] # Intialize the Tallies - super(ScatterMatrixXS, self).create_tallies(scores, filters, - keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(ScatterMatrixXS, self).tallies @@ -2056,7 +2046,7 @@ class Chi(MGXS): filters = [[energyin], [energyout]] # Intialize the Tallies - super(Chi, self).create_tallies(scores, filters, keys, estimator) + self.create_tallies(scores, filters, keys, estimator) return super(Chi, self).tallies From c4009ee294406251e82a20de05c94ce3211bb093 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 2 Nov 2015 16:48:41 -0500 Subject: [PATCH 411/519] Now use MGXS._tallies attribute directly instead of using super to call it in base MGXS class --- openmc/mgxs/mgxs.py | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 058fe5a1d7..c629d9ca7e 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1286,7 +1286,7 @@ class TotalXS(MGXS): """ # Instantiate tallies if they do not exist - if super(TotalXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'total'] @@ -1301,7 +1301,7 @@ class TotalXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(TotalXS, self).tallies + return self._tallies def compute_xs(self): """Computes the multi-group total cross sections using OpenMC @@ -1332,7 +1332,7 @@ class TransportXS(MGXS): """ # Instantiate tallies if they do not exist - if super(TransportXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'total', 'scatter-P1'] @@ -1348,7 +1348,7 @@ class TransportXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(TransportXS, self).tallies + return self._tallies def compute_xs(self): """Computes the multi-group transport cross sections using OpenMC @@ -1384,7 +1384,7 @@ class AbsorptionXS(MGXS): """ # Instantiate tallies if they do not exist - if super(AbsorptionXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'absorption'] @@ -1399,7 +1399,7 @@ class AbsorptionXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(AbsorptionXS, self).tallies + return self._tallies def compute_xs(self): """Computes the multi-group absorption cross sections using OpenMC @@ -1436,7 +1436,7 @@ class CaptureXS(MGXS): """ # Instantiate tallies if they do not exist - if super(CaptureXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'absorption', 'fission'] @@ -1451,7 +1451,7 @@ class CaptureXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(CaptureXS, self).tallies + return self._tallies def compute_xs(self): """Computes the multi-group capture cross sections using OpenMC @@ -1482,7 +1482,7 @@ class FissionXS(MGXS): """ # Instantiate tallies if they do not exist - if super(FissionXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'fission'] @@ -1497,7 +1497,7 @@ class FissionXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(FissionXS, self).tallies + return self._tallies def compute_xs(self): """Computes the multi-group fission cross sections using OpenMC @@ -1527,7 +1527,7 @@ class NuFissionXS(MGXS): """ # Instantiate tallies if they do not exist - if super(NuFissionXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'nu-fission'] @@ -1542,7 +1542,7 @@ class NuFissionXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(NuFissionXS, self).tallies + return self._tallies def compute_xs(self): """Computes the multi-group nu-fission cross sections using OpenMC @@ -1572,7 +1572,7 @@ class ScatterXS(MGXS): """ # Instantiate tallies if they do not exist - if super(ScatterXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'scatter'] @@ -1587,7 +1587,7 @@ class ScatterXS(MGXS): # Intialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(ScatterXS, self).tallies + return self._tallies def compute_xs(self): """Computes the scattering multi-group cross sections using @@ -1617,7 +1617,7 @@ class NuScatterXS(MGXS): """ # Instantiate tallies if they do not exist - if super(NuScatterXS, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['flux', 'nu-scatter'] @@ -1632,7 +1632,7 @@ class NuScatterXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(NuScatterXS, self).tallies + return self._tallies def compute_xs(self): """Computes the nu-scattering multi-group cross section using OpenMC @@ -1679,7 +1679,7 @@ class ScatterMatrixXS(MGXS): """ # Instantiate tallies if they do not exist - if super(ScatterMatrixXS, self).tallies is None: + if self._tallies is None: group_edges = self.energy_groups.group_edges energy = openmc.Filter('energy', group_edges) @@ -1699,7 +1699,7 @@ class ScatterMatrixXS(MGXS): # Initialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(ScatterMatrixXS, self).tallies + return self._tallies @correction.setter def correction(self, correction): @@ -1989,7 +1989,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): """ # Instantiate tallies if they do not exist - if super(ScatterMatrixXS, self).tallies is None: + if self._tallies is None: # Create the non-domain specific Filters for the Tallies group_edges = self.energy_groups.group_edges @@ -2011,7 +2011,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): # Intialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(ScatterMatrixXS, self).tallies + return self._tallies class Chi(MGXS): """The fission spectrum.""" @@ -2032,7 +2032,7 @@ class Chi(MGXS): """ # Instantiate tallies if they do not exist - if super(Chi, self).tallies is None: + if self._tallies is None: # Create a list of scores for each Tally to be created scores = ['nu-fission', 'nu-fission'] @@ -2048,7 +2048,7 @@ class Chi(MGXS): # Intialize the Tallies self.create_tallies(scores, filters, keys, estimator) - return super(Chi, self).tallies + return self._tallies def compute_xs(self): """Computes chi fission spectrum using OpenMC tally arithmetic.""" From bb309a43b73374f53d94d32bf8fd2030f2f65c23 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 2 Nov 2015 16:50:31 -0500 Subject: [PATCH 412/519] Made MGXS.create_tallies a private _create_tallies routine --- openmc/mgxs/mgxs.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index c629d9ca7e..d20ad2acf8 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -420,12 +420,12 @@ class MGXS(object): return densities - def create_tallies(self, scores, all_filters, keys, estimator): + def _create_tallies(self, scores, all_filters, keys, estimator): """Instantiates tallies needed to compute the multi-group cross section. This is a helper method for MGXS subclasses to create tallies for input file generation. The tallies are stored in the tallies dict. - This method is called by each subclass' create_tallies(...) method + This method is called by each subclass' tallies property getter which define the parameters given to this parent class method. Parameters @@ -1299,7 +1299,7 @@ class TotalXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1346,7 +1346,7 @@ class TransportXS(MGXS): filters = [[energy_filter], [energy_filter], [energyout_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1397,7 +1397,7 @@ class AbsorptionXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1449,7 +1449,7 @@ class CaptureXS(MGXS): filters = [[energy_filter], [energy_filter], [energy_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1495,7 +1495,7 @@ class FissionXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1540,7 +1540,7 @@ class NuFissionXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1585,7 +1585,7 @@ class ScatterXS(MGXS): filters = [[energy_filter], [energy_filter]] # Intialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1630,7 +1630,7 @@ class NuScatterXS(MGXS): filters = [[energy_filter], [energy_filter]] # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -1697,7 +1697,7 @@ class ScatterMatrixXS(MGXS): keys = scores # Initialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -2009,7 +2009,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): filters = [[energy], [energy, energyout]] # Intialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies @@ -2046,7 +2046,7 @@ class Chi(MGXS): filters = [[energyin], [energyout]] # Intialize the Tallies - self.create_tallies(scores, filters, keys, estimator) + self._create_tallies(scores, filters, keys, estimator) return self._tallies From 857a2c5734dfdc709885c2892bbc3038c5ab9eec Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 3 Nov 2015 10:19:42 -0500 Subject: [PATCH 413/519] All object names in Python API now initialized to an empty string --- openmc/material.py | 2 +- openmc/mesh.py | 2 +- openmc/surface.py | 2 +- openmc/tallies.py | 2 +- openmc/universe.py | 6 +++--- tests/test_track_output/results_test.dat | 9 +++++++++ 6 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 tests/test_track_output/results_test.dat diff --git a/openmc/material.py b/openmc/material.py index 4100c26ecf..9fc99c26a8 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -193,7 +193,7 @@ class Material(object): name, basestring) self._name = name else: - self._name = None + self._name = '' def set_density(self, units, density=NO_DENSITY): """Set the density of the material diff --git a/openmc/mesh.py b/openmc/mesh.py index 822370c019..3b66076b79 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -155,7 +155,7 @@ class Mesh(object): name, basestring) self._name = name else: - self._name = None + self._name = '' @type.setter def type(self, meshtype): diff --git a/openmc/surface.py b/openmc/surface.py index ed446c3749..279246b029 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -128,7 +128,7 @@ class Surface(object): check_type('surface name', name, basestring) self._name = name else: - self._name = None + self._name = '' @boundary_type.setter def boundary_type(self, boundary_type): diff --git a/openmc/tallies.py b/openmc/tallies.py index 5755187346..0661ab67b1 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -420,7 +420,7 @@ class Tally(object): cv.check_type('tally name', name, basestring) self._name = name else: - self._name = None + self._name = '' def add_filter(self, filter): """Add a filter to the tally diff --git a/openmc/universe.py b/openmc/universe.py index b38ff2c4ba..b74dde656d 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -153,7 +153,7 @@ class Cell(object): cv.check_type('cell name', name, basestring) self._name = name else: - self._name = None + self._name = '' @fill.setter def fill(self, fill): @@ -472,7 +472,7 @@ class Universe(object): cv.check_type('universe name', name, basestring) self._name = name else: - self._name = None + self._name = '' def add_cell(self, cell): """Add a cell to the universe. @@ -732,7 +732,7 @@ class Lattice(object): cv.check_type('lattice name', name, basestring) self._name = name else: - self._name = None + self._name = '' @outer.setter def outer(self, outer): diff --git a/tests/test_track_output/results_test.dat b/tests/test_track_output/results_test.dat new file mode 100644 index 0000000000..6ded87a0ec --- /dev/null +++ b/tests/test_track_output/results_test.dat @@ -0,0 +1,9 @@ + + + + + + + + + From 664a2a0e83b53fd53e77d576f1ef635c17b78cd2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 3 Nov 2015 10:24:17 -0500 Subject: [PATCH 414/519] Now cast number of subdomains used in MGXS.get_xs(...) to an int --- openmc/mgxs/mgxs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d20ad2acf8..599078519b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -673,7 +673,7 @@ class MGXS(object): num_groups = len(groups) # Reshape tally data array with separate axes for domain and energy - num_subdomains = xs.shape[0] / num_groups + num_subdomains = int(xs.shape[0] / num_groups) new_shape = (num_subdomains, num_groups) + xs.shape[1:] xs = np.reshape(xs, new_shape) @@ -1844,7 +1844,7 @@ class ScatterMatrixXS(MGXS): num_out_groups = len(out_groups) # Reshape tally data array with separate axes for domain and energy - num_subdomains = xs.shape[0] / (num_in_groups * num_out_groups) + num_subdomains = int(xs.shape[0] / (num_in_groups * num_out_groups)) new_shape = (num_subdomains, num_in_groups, num_out_groups) new_shape += xs.shape[1:] xs = np.reshape(xs, new_shape) @@ -2194,7 +2194,7 @@ class Chi(MGXS): num_groups = self.num_groups else: num_groups = len(groups) - num_subdomains = xs.shape[0] / num_groups + num_subdomains = int(xs.shape[0] / num_groups) new_shape = (num_subdomains, num_groups) + xs.shape[1:] xs = np.reshape(xs, new_shape) From c34f668a3f0a614ba981236fe66d0228cf3dd6bc Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 3 Nov 2015 10:30:30 -0500 Subject: [PATCH 415/519] Removed test_track_output/results_test.dat --- tests/test_track_output/results_test.dat | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 tests/test_track_output/results_test.dat diff --git a/tests/test_track_output/results_test.dat b/tests/test_track_output/results_test.dat deleted file mode 100644 index 6ded87a0ec..0000000000 --- a/tests/test_track_output/results_test.dat +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - From a11ccce8a3d8224413ce31fc2e2e0773bb00c50b Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 16:06:34 -0500 Subject: [PATCH 416/519] Changed isotropic in lab scattering tag to iso-in-lab --- docs/source/usersguide/input.rst | 12 ++++++------ openmc/nuclide.py | 4 ++-- src/input_xml.F90 | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 7815d8810f..a20ceda187 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1138,12 +1138,12 @@ Each ``material`` element can have the following attributes or sub-elements: An optional attribute/sub-element for each nuclide is ``scattering``. This attribute may be set to "ace" to use the scattering laws specified in the - ACE files (default). Alternatively, when set to "lab", the ACE scattering - laws are used to sample the outgoing energy but an isotropic-in-lab - distribution is used to sample the outgoing angle at each scattering - interaction. The ``scattering`` attribute may be most useful when using - OpenMC to compute multi-group cross-sections for deterministic transport - codes and to quantify the effects of anisotropic scattering. + ACE files (default). Alternatively, when set to "iso-in-lab", the ACE + scattering laws are used to sample the outgoing energy but an + isotropic-in-lab distribution is used to sample the outgoing angle at each + scattering interaction. The ``scattering`` attribute may be most useful + when using OpenMC to compute multi-group cross-sections for deterministic + transport codes and to quantify the effects of anisotropic scattering. *Default*: None diff --git a/openmc/nuclide.py b/openmc/nuclide.py index c2a4d84551..84ad112bc2 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -102,9 +102,9 @@ class Nuclide(object): @scattering.setter def scattering(self, scattering): - if not scattering in ['ace', 'lab']: + if not scattering in ['ace', 'iso-in-lab']: msg = 'Unable to set scattering for Nuclide to {0} ' \ - 'which is not "ace" or "lab"'.format(scattering) + 'which is not "ace" or "iso-in-lab"'.format(scattering) raise ValueError(msg) self._scattering = scattering diff --git a/src/input_xml.F90 b/src/input_xml.F90 index b498b4ca7e..70b9302df8 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1938,7 +1938,7 @@ contains ! Check enforced isotropic lab scattering if (check_for_node(node_nuc, "scattering")) then call get_node_value(node_nuc, "scattering", temp_str) - if (trim(adjustl(to_lower(temp_str))) == "lab") then + if (trim(adjustl(to_lower(temp_str))) == "iso-in-lab") then call list_iso_lab % append(1) else if (trim(adjustl(to_lower(temp_str))) == "ace") then call list_iso_lab % append(0) From 0360983ecd335ef924f8f0df1aaefd4304a411d0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 16:11:15 -0500 Subject: [PATCH 417/519] Removed unnecessary whitespace --- src/list_header.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/list_header.F90 b/src/list_header.F90 index 27721a7a67..8020b96b17 100644 --- a/src/list_header.F90 +++ b/src/list_header.F90 @@ -34,7 +34,6 @@ module list_header type(ListElemChar), pointer :: prev => null() end type ListElemChar - !=============================================================================== ! LIST* types contain the linked list with convenience methods. We originally ! considered using unlimited polymorphism to provide a single type, but compiler From 151fa4d47942a642ed8962d3904f326850233fe9 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 16:57:29 -0500 Subject: [PATCH 418/519] Refactored iso-in-lab scattering in physics.F90 to consolidate within scattering routine --- openmc/material.py | 4 +- src/physics.F90 | 135 ++++++++++++++++++--------------------------- 2 files changed, 57 insertions(+), 82 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 8ef4c8c1bd..e100b7539e 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -373,7 +373,7 @@ class Material(object): def make_isotropic_in_lab(self): for nuclide_name in self._nuclides: - self._nuclides[nuclide_name][0].make_isotropic_in_lab() + self._nuclides[nuclide_name][0].scattering = 'iso-in-lab' def get_all_nuclides(self): """Returns all nuclides in the material @@ -599,7 +599,7 @@ class MaterialsFile(object): def make_isotropic_in_lab(self): for material in self._materials: - materials.make_isotropic_in_lab() + material.make_isotropic_in_lab() def _create_material_subelements(self): subelement = ET.SubElement(self._materials_file, "default_xs") diff --git a/src/physics.F90 b/src/physics.F90 index 54528b5baa..03fc8a2def 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -314,6 +314,13 @@ contains real(8) :: cutoff type(Nuclide), pointer :: nuc type(Reaction), pointer :: rxn + real(8) :: uvw_new(3) ! outgoing uvw for iso-in-lab scattering + real(8) :: uvw_old(3) ! incoming uvw for iso-in-lab scattering + real(8) :: mu_lab ! polar angle cosine for iso-in-lab scattering + real(8) :: phi ! azimuthal angle for iso-in-lab scattering + + ! copy incoming direction + uvw_old(:) = p % coord(1) % uvw ! Get pointer to nuclide and grid index/interpolation factor nuc => nuclides(i_nuclide) @@ -332,11 +339,9 @@ contains ! ELASTIC SCATTERING if (micro_xs(i_nuclide) % index_sab /= NONE) then - ! S(a,b) scattering call sab_scatter(i_nuclide, micro_xs(i_nuclide) % index_sab, & - p % E, p % coord(1) % uvw, p % mu, & - materials(p % material) % p0(i_nuc_mat)) + p % E, p % coord(1) % uvw, p % mu) else ! get pointer to elastic scattering reaction @@ -344,8 +349,7 @@ contains ! Perform collision physics for elastic scattering call elastic_scatter(i_nuclide, rxn, & - p % E, p % coord(1) % uvw, p % mu, p % wgt, & - materials(p % material) % p0(i_nuc_mat)) + p % E, p % coord(1) % uvw, p % mu, p % wgt) end if p % event_MT = ELASTIC @@ -387,7 +391,7 @@ contains end do ! Perform collision physics for inelastic scattering - call inelastic_scatter(nuc, rxn, p, materials(p % material) % p0(i_nuc_mat)) + call inelastic_scatter(nuc, rxn, p) p % event_MT = rxn % MT end if @@ -395,6 +399,20 @@ contains ! Set event component p % event = EVENT_SCATTER + ! sample new outgoing angle for isotropic in lab scattering + if (materials(p % material) % p0(i_nuc_mat)) then + + ! sample isotropic-in-lab outgoing direction + uvw_new(1) = TWO * prn() - ONE + phi = TWO * PI * prn() + uvw_new(2) = cos(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) + uvw_new(3) = sin(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) + mu_lab = dot_product(uvw_old, uvw_new) + + ! change direction of particle + p % coord(1) % uvw = rotate_angle(uvw_new, mu_lab) + end if + end subroutine scatter !=============================================================================== @@ -402,24 +420,21 @@ contains ! target. !=============================================================================== - subroutine elastic_scatter(i_nuclide, rxn, E, uvw, mu_lab, wgt, iso_lab) + subroutine elastic_scatter(i_nuclide, rxn, E, uvw, mu_lab, wgt) integer, intent(in) :: i_nuclide type(Reaction), pointer :: rxn real(8), intent(inout) :: E real(8), intent(inout) :: uvw(3) + real(8), intent(out) :: mu_lab real(8), intent(inout) :: wgt - real(8), intent(out) :: mu_lab ! cosine of polar angle in lab system - logical, intent(in) :: iso_lab real(8) :: awr ! atomic weight ratio of target real(8) :: mu_cm ! cosine of polar angle in center-of-mass - real(8) :: phi ! azimuthal angle real(8) :: vel ! magnitude of velocity real(8) :: v_n(3) ! velocity of neutron real(8) :: v_cm(3) ! velocity of center-of-mass real(8) :: v_t(3) ! velocity of target nucleus - real(8) :: uvw_in(3) ! incoming direction real(8) :: uvw_cm(3) ! directional cosines in center-of-mass type(Nuclide), pointer :: nuc @@ -432,9 +447,6 @@ contains ! Neutron velocity in LAB v_n = vel * uvw - ! incoming direction - uvw_in(:) = uvw(:) - ! Sample velocity of target nucleus if (.not. micro_xs(i_nuclide) % use_ptable) then call sample_target_velocity(nuc, v_t, E, uvw, v_n, wgt, & @@ -470,17 +482,11 @@ contains vel = sqrt(E) ! compute cosine of scattering angle in LAB frame by taking dot product of - ! neutron's pre- and post-collision unit vectors - if (iso_lab) then - uvw(1) = TWO * prn() - ONE - phi = TWO * PI * prn() - uvw(2) = cos(phi) * sqrt(ONE - uvw(1)*uvw(1)) - uvw(3) = sin(phi) * sqrt(ONE - uvw(1)*uvw(1)) - else - uvw = v_n / vel - end if + ! neutron's pre- and post-collision angle + mu_lab = dot_product(uvw, v_n) / vel - mu_lab = dot_product(uvw_in, uvw) + ! Set energy and direction of particle in LAB frame + uvw = v_n / vel ! Because of floating-point roundoff, it may be possible for mu_lab to be ! outside of the range [-1,1). In these cases, we just set mu_lab to exactly @@ -495,15 +501,13 @@ contains ! according to a specified S(a,b) table. !=============================================================================== - subroutine sab_scatter(i_nuclide, i_sab, E, uvw, mu_lab, iso_lab) + subroutine sab_scatter(i_nuclide, i_sab, E, uvw, mu) integer, intent(in) :: i_nuclide ! index in micro_xs integer, intent(in) :: i_sab ! index in sab_tables real(8), intent(inout) :: E ! incoming/outgoing energy real(8), intent(inout) :: uvw(3) ! directional cosines - real(8) :: uvw_in(3) ! incoming direction - real(8), intent(out) :: mu_lab ! cosine of polar angle in lab system - logical, intent(in) :: iso_lab + real(8), intent(out) :: mu ! scattering cosine integer :: i ! incoming energy bin integer :: j ! outgoing energy bin @@ -527,14 +531,10 @@ contains real(8) :: c_j, c_j1 ! cumulative probability real(8) :: frac ! interpolation factor on outgoing energy real(8) :: r1 ! RNG for outgoing energy - real(8) :: phi ! azimuthal angle ! Get pointer to S(a,b) table sab => sab_tables(i_sab) - ! incoming direction - uvw_in(:) = uvw(:) - ! Determine whether inelastic or elastic scattering will occur if (prn() < micro_xs(i_nuclide) % elastic_sab / & micro_xs(i_nuclide) % elastic) then @@ -564,7 +564,7 @@ contains mu_i1jk = sab % elastic_mu(k,i+1) ! Cosine of angle between incoming and outgoing neutron - mu_lab = (1 - f)*mu_ijk + f*mu_i1jk + mu = (1 - f)*mu_ijk + f*mu_i1jk elseif (sab % elastic_mode == SAB_ELASTIC_EXACT) then ! This treatment is used for data derived in the coherent @@ -580,7 +580,7 @@ contains end if ! Characteristic scattering cosine for this Bragg edge - mu_lab = ONE - TWO*sab % elastic_e_in(k) / E + mu = ONE - TWO*sab % elastic_e_in(k) / E end if @@ -655,7 +655,7 @@ contains mu_i1jk = sab % inelastic_mu(k,j,i+1) ! Cosine of angle between incoming and outgoing neutron - mu_lab = (1 - f)*mu_ijk + f*mu_i1jk + mu = (1 - f)*mu_ijk + f*mu_i1jk else if (sab % secondary_mode == SAB_SECONDARY_CONT) then ! Continuous secondary energy - this is to be similar to @@ -732,7 +732,7 @@ contains ! Will use mu from the randomly chosen incoming and closest outgoing ! energy bins - mu_lab = sab % inelastic_data(l) % mu(k, j) + mu = sab % inelastic_data(l) % mu(k, j) else call fatal_error("Invalid secondary energy mode on S(a,b) table " & @@ -744,20 +744,10 @@ contains ! outside of the range [-1,1). In these cases, we just set mu to exactly ! -1 or 1 - if (abs(mu_lab) > ONE) mu_lab = sign(ONE,mu_lab) + if (abs(mu) > ONE) mu = sign(ONE,mu) - ! compute cosine of scattering angle in LAB frame by taking dot product of - ! neutron's pre- and post-collision unit vectors - if (iso_lab) then - uvw(1) = TWO * prn() - ONE - phi = TWO * PI * prn() - uvw(2) = cos(phi) * sqrt(ONE - uvw(1)*uvw(1)) - uvw(3) = sin(phi) * sqrt(ONE - uvw(1)*uvw(1)) - mu_lab = dot_product(uvw_in, uvw) - else - ! change direction of particle - uvw = rotate_angle(uvw, mu_lab) - end if + ! change direction of particle + uvw = rotate_angle(uvw, mu) end subroutine sab_scatter @@ -1333,28 +1323,23 @@ contains ! than fission), i.e. level scattering, (n,np), (n,na), etc. !=============================================================================== - subroutine inelastic_scatter(nuc, rxn, p, iso_lab) - - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn + subroutine inelastic_scatter(nuc, rxn, p) + type(Nuclide), pointer :: nuc + type(Reaction), pointer :: rxn type(Particle), intent(inout) :: p - logical, intent(in) :: iso_lab integer :: i ! loop index - integer :: law ! secondary energy distribution law - real(8) :: mu ! cosine of scattering angle in lab - real(8) :: A ! atomic weight ratio of nuclide + integer :: law ! secondary energy distribution law real(8) :: E ! energy in lab (incoming/outgoing) - real(8) :: E_in ! incoming energy - real(8) :: E_cm ! outgoing energy in center-of-mass - real(8) :: Q ! Q-value of reaction - real(8) :: yield ! neutron yield - real(8) :: uvw_in(3) ! incoming direction - real(8) :: phi ! azimuthal angle + real(8) :: mu ! cosine of scattering angle in lab + real(8) :: A ! atomic weight ratio of nuclide + real(8) :: E_in ! incoming energy + real(8) :: E_cm ! outgoing energy in center-of-mass + real(8) :: Q ! Q-value of reaction + real(8) :: yield ! neutron yield - ! copy energy, direction of neutron + ! copy energy of neutron E_in = p % E - uvw_in(:) = p % coord(1) % uvw(:) ! determine A and Q A = nuc % awr @@ -1399,22 +1384,12 @@ contains if (abs(mu) > ONE) mu = sign(ONE,mu) end if - ! compute cosine of scattering angle in LAB frame by taking dot product of - ! neutron's pre- and post-collision unit vectors - if (iso_lab) then - p % coord(1) % uvw(1) = TWO * prn() - ONE - phi = TWO * PI * prn() - p % coord(1) % uvw(2) = cos(phi) * sqrt(ONE - uvw_in(1) * uvw_in(1)) - p % coord(1) % uvw(3) = sin(phi) * sqrt(ONE - uvw_in(1) * uvw_in(1)) - mu = dot_product(uvw_in, p % coord(1) % uvw) - else - ! Set outgoing energy and scattering angle - p % E = E - p % mu = mu + ! Set outgoing energy and scattering angle + p % E = E + p % mu = mu - ! change direction of particle - p % coord(1) % uvw = rotate_angle(p % coord(1) % uvw, mu) - end if + ! change direction of particle + p % coord(1) % uvw = rotate_angle(p % coord(1) % uvw, mu) ! change weight of particle based on yield if (rxn % multiplicity_with_E) then From 6e827c25e7333893e100c7b5dd276ccfca9a6a10 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 17:02:55 -0500 Subject: [PATCH 419/519] Removed unnecessary trailing whitespace from physics.F90 --- src/physics.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/physics.F90 b/src/physics.F90 index 03fc8a2def..00db08950c 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -316,7 +316,7 @@ contains type(Reaction), pointer :: rxn real(8) :: uvw_new(3) ! outgoing uvw for iso-in-lab scattering real(8) :: uvw_old(3) ! incoming uvw for iso-in-lab scattering - real(8) :: mu_lab ! polar angle cosine for iso-in-lab scattering + real(8) :: mu_lab ! polar angle cosine for iso-in-lab scattering real(8) :: phi ! azimuthal angle for iso-in-lab scattering ! copy incoming direction From 81116a20496689a53de9ec60546f17b76a885c65 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 17:34:04 -0500 Subject: [PATCH 420/519] Elements can now use iso-in-lab scattering in adddition to Nuclides --- openmc/element.py | 23 ++++++++++++++++++++++- openmc/material.py | 13 +++++++++---- openmc/nuclide.py | 2 ++ src/input_xml.F90 | 29 ++++++++++++++++++++++++++++- 4 files changed, 61 insertions(+), 6 deletions(-) diff --git a/openmc/element.py b/openmc/element.py index 56821b5d2f..f39bcbfefd 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -24,6 +24,8 @@ class Element(object): Chemical symbol of the element, e.g. Pu xs : str Cross section identifier, e.g. 71c + scattering : 'ace' or 'iso-in-lab' or None + The type of angular scattering distribution to use """ @@ -31,6 +33,7 @@ class Element(object): # Initialize class attributes self._name = '' self._xs = None + self._scattering = None # Set class attributes self.name = name @@ -60,6 +63,10 @@ class Element(object): 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 @@ -70,6 +77,10 @@ class Element(object): def name(self): return self._name + @property + def scattering(self): + return self._scattering + @xs.setter def xs(self, xs): check_type('cross section identifier', xs, basestring) @@ -78,4 +89,14 @@ class Element(object): @name.setter def name(self, name): check_type('name', name, basestring) - self._name = name \ No newline at end of file + self._name = name + + @scattering.setter + def scattering(self, scattering): + + if not scattering in ['ace', 'iso-in-lab']: + msg = 'Unable to set scattering for Element to {0} ' \ + 'which is not "ace" or "iso-in-lab"'.format(scattering) + raise ValueError(msg) + + self._scattering = scattering diff --git a/openmc/material.py b/openmc/material.py index e100b7539e..98d0d3f878 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -374,6 +374,8 @@ class Material(object): def make_isotropic_in_lab(self): for nuclide_name in self._nuclides: self._nuclides[nuclide_name][0].scattering = 'iso-in-lab' + for element_name in self._elements: + self._element[element_name][0].scattering = 'iso-in-lab' def get_all_nuclides(self): """Returns all nuclides in the material @@ -405,11 +407,11 @@ class Material(object): else: xml_element.set("wo", str(nuclide[1])) - if nuclide[0]._xs is not None: - xml_element.set("xs", nuclide[0]._xs) + if nuclide[0].xs is not None: + xml_element.set("xs", nuclide[0].xs) - if not nuclide[0]._scattering is None: - xml_element.set("scattering", nuclide[0]._scattering) + if not nuclide[0].scattering is None: + xml_element.set("scattering", nuclide[0].scattering) return xml_element @@ -423,6 +425,9 @@ class Material(object): else: xml_element.set("wo", str(element[1])) + if not element[0].scattering is None: + xml_element.set("scattering", element[0].scattering) + return xml_element def _get_nuclides_xml(self, nuclides, distrib=False): diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 84ad112bc2..1c926dc3d8 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -26,6 +26,8 @@ class Nuclide(object): zaid : int 1000*(atomic number) + mass number. As an example, the zaid of U-235 would be 92235. + scattering : 'ace' or 'iso-in-lab' or None + The type of angular scattering distribution to use """ diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 70b9302df8..1e1492efcc 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1759,8 +1759,10 @@ contains integer :: i ! loop index for materials integer :: j ! loop index for nuclides + integer :: k ! llop index for elements integer :: n ! number of nuclides integer :: n_sab ! number of sab tables for a material + integer :: n_nuc_ele ! number of nuclides in an element integer :: index_list ! index in xs_listings array integer :: index_nuclide ! index in nuclides integer :: index_sab ! index in sab_tables @@ -2021,6 +2023,9 @@ contains &element: " // trim(name)) end if + ! Get current number of nuclides + n_nuc_ele = list_names % size() + ! Expand element into naturally-occurring isotopes if (check_for_node(node_ele, "ao")) then call get_node_value(node_ele, "ao", temp_dble) @@ -2030,6 +2035,29 @@ contains call fatal_error("The ability to expand a natural element based on & &weight percentage is not yet supported.") end if + + ! Compute number of new nuclides from the natural element expansion + n_nuc_ele = list_names % size() - n_nuc_ele + + ! Check enforced isotropic lab scattering + if (check_for_node(node_ele, "scattering")) then + call get_node_value(node_ele, "scattering", temp_str) + else + temp_str = "ace" + end if + + ! Set ace or iso-in-lab scattering for each nuclide in element + do k = 1, n_nuc_ele + if (trim(adjustl(to_lower(temp_str))) == "iso-in-lab") then + call list_iso_lab % append(1) + else if (trim(adjustl(to_lower(temp_str))) == "ace") then + call list_iso_lab % append(0) + else + call fatal_error("Scattering must be isotropic in lab or follow& + & the ACE file data") + end if + end do + end do NATURAL_ELEMENTS ! ======================================================================== @@ -4213,7 +4241,6 @@ contains call list_density % append(density * 0.999885_8) call list_names % append('1002.' // xs) call list_density % append(density * 0.000115_8) - case ('he') call list_names % append('2003.' // xs) call list_density % append(density * 0.00000134_8) From 96578a515a63f23d220d2839e968e56de7de1cdd Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 17:35:22 -0500 Subject: [PATCH 421/519] Updated docs with iso-in-lab scattering for elements --- docs/source/usersguide/input.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index a20ceda187..ce1d07ca00 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1141,7 +1141,7 @@ Each ``material`` element can have the following attributes or sub-elements: ACE files (default). Alternatively, when set to "iso-in-lab", the ACE scattering laws are used to sample the outgoing energy but an isotropic-in-lab distribution is used to sample the outgoing angle at each - scattering interaction. The ``scattering`` attribute may be most useful + scattering interaction. The ``scattering`` attribute may be most useful when using OpenMC to compute multi-group cross-sections for deterministic transport codes and to quantify the effects of anisotropic scattering. @@ -1171,6 +1171,16 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: None + An optional attribute/sub-element for each element is ``scattering``. This + attribute may be set to "ace" to use the scattering laws specified in the + ACE files (default). Alternatively, when set to "iso-in-lab", the ACE + scattering laws are used to sample the outgoing energy but an + isotropic-in-lab distribution is used to sample the outgoing angle at each + scattering interaction. The ``scattering`` attribute may be most useful + when using OpenMC to compute multi-group cross-sections for deterministic + transport codes and to quantify the effects of anisotropic scattering. + + *Default*: None :sab: Associates an S(a,b) table with the material. This element has From 3e34c5882c79ada0552a2492937fda149e39c6af Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 17:36:59 -0500 Subject: [PATCH 422/519] Now using property getters in Nuclide and Element __repr__ routines --- openmc/element.py | 4 ++-- openmc/nuclide.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openmc/element.py b/openmc/element.py index f39bcbfefd..3a15a8f638 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -63,9 +63,9 @@ class Element(object): 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: + if self.scattering is not None: string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t', - self._scattering) + self.scattering) return string diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 1c926dc3d8..c5bc4e078f 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -113,10 +113,10 @@ class Nuclide(object): def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) - if self._zaid is not None: - string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid) - if self._scattering is not None: + string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self.xs) + if self.zaid is not None: + string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self.zaid) + if self.scattering is not None: string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t', - self._scattering) + self.scattering) return string From 3bbefb7169ac07c9e5129600f271e999be68add7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 17:39:13 -0500 Subject: [PATCH 423/519] Fixed mis-spelled comment in physics.F90 --- src/input_xml.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 1e1492efcc..1ee2a060e9 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1759,7 +1759,7 @@ contains integer :: i ! loop index for materials integer :: j ! loop index for nuclides - integer :: k ! llop index for elements + integer :: k ! loop index for elements integer :: n ! number of nuclides integer :: n_sab ! number of sab tables for a material integer :: n_nuc_ele ! number of nuclides in an element From 4b70c4abc16714ecb1fe1cfff70912a1c0b93f16 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 17:56:42 -0500 Subject: [PATCH 424/519] Removed trailing whitespace in input_xml.F90 --- src/input_xml.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 1ee2a060e9..df10d0f70e 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2047,7 +2047,7 @@ contains end if ! Set ace or iso-in-lab scattering for each nuclide in element - do k = 1, n_nuc_ele + do k = 1, n_nuc_ele if (trim(adjustl(to_lower(temp_str))) == "iso-in-lab") then call list_iso_lab % append(1) else if (trim(adjustl(to_lower(temp_str))) == "ace") then From 4db72c90af2dd62d52a199f4e86ef26676abab53 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sun, 8 Nov 2015 20:53:18 -0500 Subject: [PATCH 425/519] Fixed issues in iso-in-lab scattering in physics.F90 per comments by @walshjon --- src/physics.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/physics.F90 b/src/physics.F90 index 00db08950c..9f8fb535b1 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -316,7 +316,6 @@ contains type(Reaction), pointer :: rxn real(8) :: uvw_new(3) ! outgoing uvw for iso-in-lab scattering real(8) :: uvw_old(3) ! incoming uvw for iso-in-lab scattering - real(8) :: mu_lab ! polar angle cosine for iso-in-lab scattering real(8) :: phi ! azimuthal angle for iso-in-lab scattering ! copy incoming direction @@ -407,10 +406,10 @@ contains phi = TWO * PI * prn() uvw_new(2) = cos(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) uvw_new(3) = sin(phi) * sqrt(ONE - uvw_new(1)*uvw_new(1)) - mu_lab = dot_product(uvw_old, uvw_new) + p % mu = dot_product(uvw_old, uvw_new) ! change direction of particle - p % coord(1) % uvw = rotate_angle(uvw_new, mu_lab) + p % coord(1) % uvw = uvw_new end if end subroutine scatter From d03272867fbb4a908e74290fad04943517a26014 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 9 Nov 2015 00:11:50 -0500 Subject: [PATCH 426/519] Made MGXS subdomain averaging use scalar flux weighting --- openmc/mgxs/mgxs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 599078519b..1296f195cc 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -824,9 +824,9 @@ class MGXS(object): mean = tally.get_reshaped_data(value='mean') std_dev = tally.get_reshaped_data(value='std_dev') - # Get the mean of the mean, std. dev. across requested subdomains - mean = np.mean(mean[subdomains, ...], axis=0) - std_dev = np.mean(std_dev[subdomains, ...]**2, axis=0) + # Get the mean, std. dev. across requested subdomains + mean = np.sum(mean[subdomains, ...], axis=0) + std_dev = np.sum(std_dev[subdomains, ...]**2, axis=0) std_dev = np.sqrt(std_dev) # If domain is distribcell, make subdomain-averaged a 'cell' domain From baa0b4c10cba06e174bec57fc41f73682642a5f2 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 9 Nov 2015 09:26:48 -0500 Subject: [PATCH 427/519] Now using a "data" descriptor rather than "ace" for the nuclide/element scattering XML tag --- docs/source/usersguide/input.rst | 12 ++++++------ openmc/element.py | 6 +++--- openmc/material.py | 4 ++-- openmc/nuclide.py | 6 +++--- src/input_xml.F90 | 10 +++++----- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index ce1d07ca00..04a6406dc8 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1137,9 +1137,9 @@ Each ``material`` element can have the following attributes or sub-elements: be given in atom percent. The same applies for weight percentages. An optional attribute/sub-element for each nuclide is ``scattering``. This - attribute may be set to "ace" to use the scattering laws specified in the - ACE files (default). Alternatively, when set to "iso-in-lab", the ACE - scattering laws are used to sample the outgoing energy but an + attribute may be set to "data" to use the scattering laws specified by the + cross section library (default). Alternatively, when set to "iso-in-lab", + the scattering laws are used to sample the outgoing energy but an isotropic-in-lab distribution is used to sample the outgoing angle at each scattering interaction. The ``scattering`` attribute may be most useful when using OpenMC to compute multi-group cross-sections for deterministic @@ -1172,9 +1172,9 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: None An optional attribute/sub-element for each element is ``scattering``. This - attribute may be set to "ace" to use the scattering laws specified in the - ACE files (default). Alternatively, when set to "iso-in-lab", the ACE - scattering laws are used to sample the outgoing energy but an + attribute may be set to "data" to use the scattering laws specified by the + cross section library (default). Alternatively, when set to "iso-in-lab", + the scattering laws are used to sample the outgoing energy but an isotropic-in-lab distribution is used to sample the outgoing angle at each scattering interaction. The ``scattering`` attribute may be most useful when using OpenMC to compute multi-group cross-sections for deterministic diff --git a/openmc/element.py b/openmc/element.py index 3a15a8f638..d395b434f7 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -24,7 +24,7 @@ class Element(object): Chemical symbol of the element, e.g. Pu xs : str Cross section identifier, e.g. 71c - scattering : 'ace' or 'iso-in-lab' or None + scattering : 'data' or 'iso-in-lab' or None The type of angular scattering distribution to use """ @@ -94,9 +94,9 @@ class Element(object): @scattering.setter def scattering(self, scattering): - if not scattering in ['ace', 'iso-in-lab']: + if not scattering in ['data', 'iso-in-lab']: msg = 'Unable to set scattering for Element to {0} ' \ - 'which is not "ace" or "iso-in-lab"'.format(scattering) + 'which is not "data" or "iso-in-lab"'.format(scattering) raise ValueError(msg) self._scattering = scattering diff --git a/openmc/material.py b/openmc/material.py index 98d0d3f878..292fc82ca7 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -33,8 +33,8 @@ NO_DENSITY = 99999. class Material(object): - """A material composed of a collection of nuclides/elements that can be assigned - to a region of space. + """A material composed of a collection of nuclides/elements that can be + assigned to a region of space. Parameters ---------- diff --git a/openmc/nuclide.py b/openmc/nuclide.py index c5bc4e078f..2dd8eb1534 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -26,7 +26,7 @@ class Nuclide(object): zaid : int 1000*(atomic number) + mass number. As an example, the zaid of U-235 would be 92235. - scattering : 'ace' or 'iso-in-lab' or None + scattering : 'data' or 'iso-in-lab' or None The type of angular scattering distribution to use """ @@ -104,9 +104,9 @@ class Nuclide(object): @scattering.setter def scattering(self, scattering): - if not scattering in ['ace', 'iso-in-lab']: + if not scattering in ['data', 'iso-in-lab']: msg = 'Unable to set scattering for Nuclide to {0} ' \ - 'which is not "ace" or "iso-in-lab"'.format(scattering) + 'which is not "data" or "iso-in-lab"'.format(scattering) raise ValueError(msg) self._scattering = scattering diff --git a/src/input_xml.F90 b/src/input_xml.F90 index df10d0f70e..ae01b0b5cc 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1940,9 +1940,9 @@ contains ! Check enforced isotropic lab scattering if (check_for_node(node_nuc, "scattering")) then call get_node_value(node_nuc, "scattering", temp_str) - if (trim(adjustl(to_lower(temp_str))) == "iso-in-lab") then + if (adjustl(to_lower(temp_str)) == "iso-in-lab") then call list_iso_lab % append(1) - else if (trim(adjustl(to_lower(temp_str))) == "ace") then + else if (adjustl(to_lower(temp_str)) == "data") then call list_iso_lab % append(0) else call fatal_error("Scattering must be isotropic in lab or follow& @@ -2043,14 +2043,14 @@ contains if (check_for_node(node_ele, "scattering")) then call get_node_value(node_ele, "scattering", temp_str) else - temp_str = "ace" + temp_str = "data" end if ! Set ace or iso-in-lab scattering for each nuclide in element do k = 1, n_nuc_ele - if (trim(adjustl(to_lower(temp_str))) == "iso-in-lab") then + if (adjustl(to_lower(temp_str)) == "iso-in-lab") then call list_iso_lab % append(1) - else if (trim(adjustl(to_lower(temp_str))) == "ace") then + else if (adjustl(to_lower(temp_str)) == "data") then call list_iso_lab % append(0) else call fatal_error("Scattering must be isotropic in lab or follow& From a21cb9d003ebf98374ea20cf7872dd6dbc75caea Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 9 Nov 2015 09:54:11 -0500 Subject: [PATCH 428/519] Updated relaxng schema for nuclide/element scattering tag --- src/relaxng/materials.rnc | 4 ++++ src/relaxng/materials.rng | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index ae85654972..da68ebf9ea 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -15,6 +15,8 @@ element materials { attribute name { xsd:string { maxLength = "7" } }) & (element xs { xsd:string { maxLength = "3" } } | attribute xs { xsd:string { maxLength = "3" } })? & + (element scattering { ( "data" | "iso-in-lab" ) } | + attribute scattering { ( "data" | "iso-in-lab" ) })? & ( (element ao { xsd:double } | attribute ao { xsd:double }) | (element wo { xsd:double } | attribute wo { xsd:double }) @@ -26,6 +28,8 @@ element materials { attribute name { xsd:string { maxLength = "2" } }) & (element xs { xsd:string { maxLength = "3" } } | attribute xs { xsd:string { maxLength = "3" } })? & + (element scattering { ( "data" | "iso-in-lab" ) } | + attribute scattering { ( "data" | "iso-in-lab" ) })? & ( (element ao { xsd:double } | attribute ao { xsd:double }) | (element wo { xsd:double } | attribute wo { xsd:double }) diff --git a/src/relaxng/materials.rng b/src/relaxng/materials.rng index 4c9496eae4..7aba5f7382 100644 --- a/src/relaxng/materials.rng +++ b/src/relaxng/materials.rng @@ -12,6 +12,20 @@ + + + + + 52 + + + + + 52 + + + + @@ -67,6 +81,22 @@ + + + + + data + iso-in-lab + + + + + data + iso-in-lab + + + + @@ -117,6 +147,22 @@ + + + + + data + iso-in-lab + + + + + data + iso-in-lab + + + + From 4d51fb6e5bdb9a4c05d5960d479a6994adfdef57 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 10 Nov 2015 10:00:52 -0500 Subject: [PATCH 429/519] changed p % E to p % last_E for collision and analog tallies and changed neutron velocity to cm/s --- docs/source/usersguide/input.rst | 2 +- src/constants.F90 | 2 +- src/tally.F90 | 40 ++++++++++++++++++++++---------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 04a6406dc8..0b132275bb 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1507,7 +1507,7 @@ The ```` element accepts the following sub-elements: :inverse-velocity: The flux-weighted inverse velocity where the velocity is in units of - meters per second. + centimeters per second. .. note:: The ``analog`` estimator is actually identical to the ``collision`` diff --git a/src/constants.F90 b/src/constants.F90 index 375c517e76..1ca896c3f9 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -66,7 +66,7 @@ module constants MASS_NEUTRON_MEV = 939.565379_8, & ! mass of a neutron in MeV/c^2 MASS_PROTON = 1.007276466812_8, & ! mass of a proton in amu AMU = 1.660538921e-27_8, & ! 1 amu in kg - C_LIGHT = 2.99792458e8_8, & ! speed of light in m/s + C_LIGHT = 2.99792458e10_8, & ! speed of light in cm/s N_AVOGADRO = 0.602214129_8, & ! Avogadro's number in 10^24/mol K_BOLTZMANN = 8.6173324e-11_8, & ! Boltzmann constant in MeV/K INFINITY = huge(0.0_8), & ! positive infinity diff --git a/src/tally.F90 b/src/tally.F90 index fcd6dfdd9b..31bce232a0 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -65,6 +65,7 @@ contains real(8) :: macro_total ! material macro total xs real(8) :: macro_scatt ! material macro scatt xs real(8) :: uvw(3) ! particle direction + real(8) :: E ! particle energy type(Material), pointer :: mat type(Reaction), pointer :: rxn type(Nuclide), pointer :: nuc @@ -128,6 +129,14 @@ contains case (SCORE_INVERSE_VELOCITY) + + ! make sure the correct energy is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + E = p % E + else + E = p % last_E + end if + if (t % estimator == ESTIMATOR_ANALOG) then ! All events score to an inverse velocity bin. We actually use a ! collision estimator in place of an analog one since there is no way @@ -140,11 +149,11 @@ contains score = p % last_wgt end if score = score / material_xs % total & - / (sqrt(TWO * p % E / (MASS_NEUTRON_MEV)) * C_LIGHT) + / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT) else - ! For inverse velocity, we need no cross section - score = flux / (sqrt(TWO * p % E / (MASS_NEUTRON_MEV)) * C_LIGHT) + ! For inverse velocity, we don't need a cross section + score = flux / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT) end if @@ -425,6 +434,13 @@ contains case (SCORE_DELAYED_NU_FISSION) + ! make sure the correct energy is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + E = p % E + else + E = p % last_E + end if + ! Set the delayedgroup filter index and the number of delayed group bins dg_filter = t % find_filter(FILTER_DELAYEDGROUP) @@ -460,11 +476,11 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) ! Compute the yield for this delayed group - yield = yield_delayed(nuc, p % E, d) + yield = yield_delayed(nuc, E, d) ! Compute the score and tally to bin score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & - % fission * nu_delayed(nuc, p % E) / & + % fission * nu_delayed(nuc, E) / & micro_xs(p % event_nuclide) % absorption call score_fission_delayed_dg(t, d_bin, score, score_index) end do @@ -474,7 +490,7 @@ contains ! by multiplying the absorbed weight by the fraction of the ! delayed-nu-fission xs to the absorption xs score = p % absorb_wgt * micro_xs(p % event_nuclide) & - % fission * nu_delayed(nuc, p % E) / & + % fission * nu_delayed(nuc, E) / & micro_xs(p % event_nuclide) % absorption end if end if @@ -528,11 +544,11 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) ! Compute the yield for this delayed group - yield = yield_delayed(nuc, p % E, d) + yield = yield_delayed(nuc, E, d) ! Compute the score and tally to bin score = micro_xs(i_nuclide) % fission * yield & - * nu_delayed(nuc, p % E) * atom_density * flux + * nu_delayed(nuc, E) * atom_density * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP @@ -540,7 +556,7 @@ contains ! If the delayed group filter is not present, compute the score ! by multiplying the delayed-nu-fission macro xs by the flux - score = micro_xs(i_nuclide) % fission * nu_delayed(nuc, p % E)& + score = micro_xs(i_nuclide) % fission * nu_delayed(nuc, E)& * atom_density * flux end if @@ -572,11 +588,11 @@ contains nuc => nuclides(i_nuc) ! Get the yield for the desired nuclide and delayed group - yield = yield_delayed(nuc, p % E, d) + yield = yield_delayed(nuc, E, d) ! Compute the score and tally to bin score = micro_xs(i_nuc) % fission * yield & - * nu_delayed(nuc, p % E) * atom_density_ * flux + * nu_delayed(nuc, E) * atom_density_ * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do end do @@ -596,7 +612,7 @@ contains ! Accumulate the contribution from each nuclide score = score + micro_xs(i_nuc) % fission & - * nu_delayed(nuclides(i_nuc), p % E) * atom_density_ * flux + * nu_delayed(nuclides(i_nuc), E) * atom_density_ * flux end do end if end if From c16c43d8667efd6b10ea3ff949e4253d624107fe Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 10 Nov 2015 10:17:14 -0500 Subject: [PATCH 430/519] changed C_LIGHT back to m/s and changed velocity units in tally.F90 --- src/constants.F90 | 2 +- src/tally.F90 | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 1ca896c3f9..375c517e76 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -66,7 +66,7 @@ module constants MASS_NEUTRON_MEV = 939.565379_8, & ! mass of a neutron in MeV/c^2 MASS_PROTON = 1.007276466812_8, & ! mass of a proton in amu AMU = 1.660538921e-27_8, & ! 1 amu in kg - C_LIGHT = 2.99792458e10_8, & ! speed of light in cm/s + C_LIGHT = 2.99792458e8_8, & ! speed of light in m/s N_AVOGADRO = 0.602214129_8, & ! Avogadro's number in 10^24/mol K_BOLTZMANN = 8.6173324e-11_8, & ! Boltzmann constant in MeV/K INFINITY = huge(0.0_8), & ! positive infinity diff --git a/src/tally.F90 b/src/tally.F90 index 31bce232a0..a5d7f3f0de 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -148,12 +148,16 @@ contains else score = p % last_wgt end if + + ! Score the flux weighted inverse velocity with velocity in units of + ! cm/s score = score / material_xs % total & - / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT) + / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT * 100.0) else - ! For inverse velocity, we don't need a cross section - score = flux / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT) + ! For inverse velocity, we don't need a cross section. The velocity is + ! in units of cm/s. + score = flux / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT * 100.0) end if From 92e2a16b01568c61876d9c5b9b8142bdbb403d95 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 10 Nov 2015 11:50:17 -0500 Subject: [PATCH 431/519] fixed inverse velocity and delayed nu fission score tests --- src/tally.F90 | 4 +-- .../results_true.dat | 8 ++--- .../results_true.dat | 32 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index a5d7f3f0de..da4e828003 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -152,12 +152,12 @@ contains ! Score the flux weighted inverse velocity with velocity in units of ! cm/s score = score / material_xs % total & - / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT * 100.0) + / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT * 100.0_8) else ! For inverse velocity, we don't need a cross section. The velocity is ! in units of cm/s. - score = flux / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT * 100.0) + score = flux / (sqrt(TWO * E / (MASS_NEUTRON_MEV)) * C_LIGHT * 100.0_8) end if diff --git a/tests/test_score_delayed_nufission/results_true.dat b/tests/test_score_delayed_nufission/results_true.dat index d797baf18c..bc2b8e8a7f 100644 --- a/tests/test_score_delayed_nufission/results_true.dat +++ b/tests/test_score_delayed_nufission/results_true.dat @@ -19,11 +19,11 @@ tally 2: 1.976462E-02 1.953328E-04 tally 3: -1.687894E-02 -5.776176E-05 +1.686299E-02 +5.765477E-05 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.061803E-02 -2.308636E-05 +1.061240E-02 +2.305936E-05 diff --git a/tests/test_score_inverse_velocity/results_true.dat b/tests/test_score_inverse_velocity/results_true.dat index f86a8beb5b..8f2f84cc62 100644 --- a/tests/test_score_inverse_velocity/results_true.dat +++ b/tests/test_score_inverse_velocity/results_true.dat @@ -10,20 +10,20 @@ tally 1: 6.354432E-04 8.370608E-08 tally 2: -1.048031E-03 -2.263789E-07 -4.276093E-04 -4.136358E-08 -2.667795E-03 -1.528407E-06 -6.199140E-04 -7.840402E-08 +1.029200E-03 +2.180706E-07 +4.353200E-04 +4.363747E-08 +2.211790E-03 +1.055892E-06 +6.086777E-04 +7.589579E-08 tally 3: -1.048031E-03 -2.263789E-07 -4.276093E-04 -4.136358E-08 -2.667795E-03 -1.528407E-06 -6.199140E-04 -7.840402E-08 +1.029200E-03 +2.180706E-07 +4.353200E-04 +4.363747E-08 +2.211790E-03 +1.055892E-06 +6.086777E-04 +7.589579E-08 From cfae3d2c2c81e11b98a827615cc6946d1c6b3278 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 10 Nov 2015 13:50:42 -0500 Subject: [PATCH 432/519] fixed output of inverse velocity test --- .../results_true.dat | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/tests/test_score_inverse_velocity/results_true.dat b/tests/test_score_inverse_velocity/results_true.dat index 8f2f84cc62..740d31f16b 100644 --- a/tests/test_score_inverse_velocity/results_true.dat +++ b/tests/test_score_inverse_velocity/results_true.dat @@ -1,29 +1,29 @@ k-combined: 9.903196E-01 4.279617E-02 tally 1: -1.049628E-03 -2.261930E-07 -4.056389E-04 -3.411247E-08 -2.243766E-03 -1.069671E-06 -6.354432E-04 -8.370608E-08 +1.049628E-05 +2.261930E-11 +4.056389E-06 +3.411247E-12 +2.243766E-05 +1.069671E-10 +6.354432E-06 +8.370608E-12 tally 2: -1.029200E-03 -2.180706E-07 -4.353200E-04 -4.363747E-08 -2.211790E-03 -1.055892E-06 -6.086777E-04 -7.589579E-08 +1.029200E-05 +2.180706E-11 +4.353200E-06 +4.363747E-12 +2.211790E-05 +1.055892E-10 +6.086777E-06 +7.589579E-12 tally 3: -1.029200E-03 -2.180706E-07 -4.353200E-04 -4.363747E-08 -2.211790E-03 -1.055892E-06 -6.086777E-04 -7.589579E-08 +1.029200E-05 +2.180706E-11 +4.353200E-06 +4.363747E-12 +2.211790E-05 +1.055892E-10 +6.086777E-06 +7.589579E-12 From 0df9aef3b9e21e436a06d3370512d4e78f68978c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 11 Nov 2015 09:26:04 -0500 Subject: [PATCH 433/519] Hotfix for group indices in MGXS Pandas DataFrames --- openmc/mgxs/mgxs.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 1296f195cc..4a5ca74035 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1234,13 +1234,11 @@ class MGXS(object): columns.append('group out') # Loop over all energy groups and override the bounds with indices - template = '({0:.1e} - {1:.1e})' - bins = self.energy_groups.group_edges + groups = np.arange(self.num_groups, 0, -1, dtype=np.int) + groups = np.repeat(groups, self.num_nuclides) + groups = np.tile(groups, self.num_subdomains) for column in columns: - for i in range(self.num_groups): - group = template.format(bins[i], bins[i+1]) - row_indices = df[column] == group - df.loc[row_indices, column] = self.num_groups - i + df[column] = groups # Select out those groups the user requested if groups != 'all': From bb02e301020145443b321373899e4b7a1a91d359 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 6 Oct 2015 16:46:07 +0700 Subject: [PATCH 434/519] Fix various nitpicky things Make procedures pure where possible. Pass argments as intent(in) instead of pointer unless pointer semantics actually needed (never?). Don't initialize local pointers. --- src/ace.F90 | 66 +++++++++++++------------------- src/cross_section.F90 | 12 +++--- src/endf.F90 | 2 +- src/fission.F90 | 19 ++++------ src/interpolation.F90 | 32 +++++++--------- src/math.F90 | 6 +-- src/mesh.F90 | 38 ++++++++----------- src/output.F90 | 53 ++++++++++++-------------- src/physics.F90 | 26 +++++-------- src/search.F90 | 27 +++++++------ src/source.F90 | 3 +- src/string.F90 | 82 +++++++++++++++++++--------------------- src/tally.F90 | 25 ++++++------ src/tally_initialize.F90 | 4 +- src/timer_header.F90 | 12 +----- src/trigger_header.F90 | 10 ++--- src/xml_interface.F90 | 2 +- 17 files changed, 183 insertions(+), 236 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 22fcc6b3d5..622d6d7b73 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -45,9 +45,9 @@ contains integer :: temp_table ! temporary value for sorting character(12) :: name ! name of isotope, e.g. 92235.03c character(12) :: alias ! alias of nuclide, e.g. U-235.03c - type(Material), pointer :: mat => null() - type(Nuclide), pointer :: nuc => null() - type(SAlphaBeta), pointer :: sab => null() + type(Material), pointer :: mat + type(Nuclide), pointer :: nuc + type(SAlphaBeta), pointer :: sab type(SetChar) :: already_read ! allocate arrays for ACE table storage and cross section cache @@ -234,7 +234,6 @@ contains !=============================================================================== subroutine read_ace_table(i_table, i_listing) - integer, intent(in) :: i_table ! index in nuclides/sab_tables integer, intent(in) :: i_listing ! index in xs_listings @@ -258,9 +257,9 @@ contains character(10) :: mat ! material identifier character(70) :: comment ! comment for ACE table character(MAX_FILE_LEN) :: filename ! path to ACE cross section library - type(Nuclide), pointer :: nuc => null() - type(SAlphaBeta), pointer :: sab => null() - type(XsListing), pointer :: listing => null() + type(Nuclide), pointer :: nuc + type(SAlphaBeta), pointer :: sab + type(XsListing), pointer :: listing ! determine path, record length, and location of table listing => xs_listings(i_listing) @@ -406,8 +405,6 @@ contains end select deallocate(XSS) - if(associated(nuc)) nullify(nuc) - if(associated(sab)) nullify(sab) end subroutine read_ace_table @@ -417,10 +414,8 @@ contains !=============================================================================== subroutine read_esz(nuc, data_0K) - - type(Nuclide), pointer :: nuc - - logical :: data_0K ! are we reading 0K data? + type(Nuclide), intent(inout) :: nuc + logical, intent(in) :: data_0K ! are we reading 0K data? integer :: NE ! number of energy points for total and elastic cross sections integer :: i ! index in 0K elastic xs array for this nuclide @@ -507,8 +502,7 @@ contains !=============================================================================== subroutine read_nu_data(nuc) - - type(Nuclide), pointer :: nuc + type(Nuclide), intent(inout) :: nuc integer :: i ! loop index integer :: JXS2 ! location for fission nu data @@ -524,7 +518,7 @@ contains integer :: LOCC ! location of energy distributions for given MT integer :: lc ! locator integer :: length ! length of data to allocate - type(DistEnergy), pointer :: edist => null() + type(DistEnergy), pointer :: edist JXS2 = JXS(2) JXS24 = JXS(24) @@ -707,8 +701,7 @@ contains !=============================================================================== subroutine read_reactions(nuc) - - type(Nuclide), pointer :: nuc + type(Nuclide), intent(inout) :: nuc integer :: i ! loop indices integer :: i_fission ! index in nuc % index_fission @@ -722,7 +715,7 @@ contains integer :: IE ! reaction's starting index on energy grid integer :: NE ! number of energies integer :: NR ! number of interpolation regions - type(Reaction), pointer :: rxn => null() + type(Reaction), pointer :: rxn type(ListInt) :: MTs LMT = JXS(3) @@ -890,8 +883,7 @@ contains !=============================================================================== subroutine read_angular_dist(nuc) - - type(Nuclide), pointer :: nuc + type(Nuclide), intent(inout) :: nuc integer :: JXS8 ! location of angular distribution locators integer :: JXS9 ! location of angular distributions @@ -902,7 +894,7 @@ contains integer :: i ! index in reactions array integer :: j ! index over incoming energies integer :: length ! length of data array to allocate - type(Reaction), pointer :: rxn => null() + type(Reaction), pointer :: rxn JXS8 = JXS(8) JXS9 = JXS(9) @@ -985,13 +977,12 @@ contains !=============================================================================== subroutine read_energy_dist(nuc) - - type(Nuclide), pointer :: nuc + type(Nuclide), intent(inout) :: nuc integer :: LED ! location of energy distribution locators integer :: LOCC ! location of energy distributions for given MT integer :: i ! loop index - type(Reaction), pointer :: rxn => null() + type(Reaction), pointer :: rxn LED = JXS(10) @@ -1019,10 +1010,9 @@ contains !=============================================================================== recursive subroutine get_energy_dist(edist, loc_law, delayed_n) - - type(DistEnergy), pointer :: edist ! energy distribution - integer, intent(in) :: loc_law ! locator for data - logical, optional :: delayed_n ! is this for delayed neutrons? + type(DistEnergy), intent(inout) :: edist ! energy distribution + integer, intent(in) :: loc_law ! locator for data + logical, intent(in), optional :: delayed_n ! is this for delayed neutrons? integer :: LDIS ! location of all energy distributions integer :: LNW ! location of next energy distribution if multiple @@ -1102,7 +1092,6 @@ contains !=============================================================================== function length_energy_dist(lc, law, LOCC, lid) result(length) - integer, intent(in) :: lc ! location in XSS array integer, intent(in) :: law ! energy distribution law integer, intent(in) :: LOCC ! location of energy distribution @@ -1146,7 +1135,7 @@ contains NR = int(XSS(lc + 1)) NE = int(XSS(lc + 2 + 2*NR)) allocate(L(NE)) - L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) + L(:) = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) ! Continue with finding data length length = length + 2 + 2*NR + 2*NE @@ -1204,7 +1193,7 @@ contains NR = int(XSS(lc + 1)) NE = int(XSS(lc + 2 + 2*NR)) allocate(L(NE)) - L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) + L(:) = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) ! Continue with finding data length length = length + 2 + 2*NR + 2*NE @@ -1234,7 +1223,7 @@ contains NR = int(XSS(lc + 1)) NE = int(XSS(lc + 2 + 2*NR)) allocate(L(NE)) - L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) + L(:) = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) ! Continue with finding data length length = length + 2 + 2*NR + 2*NE @@ -1285,7 +1274,7 @@ contains ! in a way inconsistent with the current form of the ACE Format Guide ! (MCNP5 Manual, Vol 3) allocate(L(NE)) - L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) + L(:) = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1)) ! Don't currently do anything with L deallocate(L) ! Continue with finding data length @@ -1301,8 +1290,7 @@ contains !=============================================================================== subroutine read_unr_res(nuc) - - type(Nuclide), pointer :: nuc + type(Nuclide), intent(inout) :: nuc integer :: JXS23 ! location of URR data integer :: lc ! locator @@ -1390,8 +1378,7 @@ contains !=============================================================================== subroutine generate_nu_fission(nuc) - - type(Nuclide), pointer :: nuc + type(Nuclide), intent(inout) :: nuc integer :: i ! index on nuclide energy grid real(8) :: E ! energy @@ -1417,8 +1404,7 @@ contains !=============================================================================== subroutine read_thermal_data(table) - - type(SAlphaBeta), pointer :: table + type(SAlphaBeta), intent(inout) :: table integer :: i ! index for incoming energies integer :: j ! index for outgoing energies diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 1c56d961e1..287077c465 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -551,13 +551,13 @@ contains ! for a given nuclide at the trial relative energy used in resonance scattering !=============================================================================== - function elastic_xs_0K(E, nuc) result(xs_out) + pure function elastic_xs_0K(E, nuc) result(xs_out) + real(8), intent(inout) :: E ! trial energy + type(Nuclide), intent(in) :: nuc ! target nuclide at temperature + real(8) :: xs_out ! 0K xs at trial energy - type(Nuclide), pointer :: nuc ! target nuclide at temperature - integer :: i_grid ! index on nuclide energy grid - real(8) :: f ! interp factor on nuclide energy grid - real(8), intent(inout) :: E ! trial energy - real(8) :: xs_out ! 0K xs at trial energy + integer :: i_grid ! index on nuclide energy grid + real(8) :: f ! interp factor on nuclide energy grid ! Determine index on nuclide energy grid if (E < nuc % energy_0K(1)) then diff --git a/src/endf.F90 b/src/endf.F90 index fb85262b20..ba324722c3 100644 --- a/src/endf.F90 +++ b/src/endf.F90 @@ -11,7 +11,7 @@ contains ! REACTION_NAME gives the name of the reaction for a given MT value !=============================================================================== - function reaction_name(MT) result(string) + pure function reaction_name(MT) result(string) integer, intent(in) :: MT character(20) :: string diff --git a/src/fission.F90 b/src/fission.F90 index 7b2911997b..3188138f25 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -15,9 +15,8 @@ contains ! given nuclide and incoming neutron energy !=============================================================================== - function nu_total(nuc, E) result(nu) - - type(Nuclide), pointer :: nuc ! nuclide from which to find nu + pure function nu_total(nuc, E) result(nu) + type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu real(8), intent(in) :: E ! energy of incoming neutron real(8) :: nu ! number of total neutrons emitted per fission @@ -26,7 +25,7 @@ contains real(8) :: c ! polynomial coefficient if (nuc % nu_t_type == NU_NONE) then - call fatal_error("No neutron emission data for table: " // nuc % name) + nu = ERROR_REAL elseif (nuc % nu_t_type == NU_POLYNOMIAL) then ! determine number of coefficients NC = int(nuc % nu_t_data(1)) @@ -49,11 +48,10 @@ contains ! for a given nuclide and incoming neutron energy !=============================================================================== - function nu_prompt(nuc, E) result(nu) - - type(Nuclide), pointer :: nuc ! nuclide from which to find nu - real(8), intent(in) :: E ! energy of incoming neutron - real(8) :: nu ! number of prompt neutrons emitted per fission + pure function nu_prompt(nuc, E) result(nu) + type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu + real(8), intent(in) :: E ! energy of incoming neutron + real(8) :: nu ! number of prompt neutrons emitted per fission integer :: i ! loop index integer :: NC ! number of polynomial coefficients @@ -87,8 +85,7 @@ contains ! for a given nuclide and incoming neutron energy !=============================================================================== - function nu_delayed(nuc, E) result(nu) - + pure function nu_delayed(nuc, E) result(nu) type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu real(8), intent(in) :: E ! energy of incoming neutron real(8) :: nu ! number of delayed neutrons emitted per fission diff --git a/src/interpolation.F90 b/src/interpolation.F90 index 5c44ed7c3d..9e28bc086e 100644 --- a/src/interpolation.F90 +++ b/src/interpolation.F90 @@ -21,7 +21,7 @@ contains ! tabulated x's and y's. !=============================================================================== - function interpolate_tab1_array(data, x, loc_start) result(y) + pure function interpolate_tab1_array(data, x, loc_start) result(y) real(8), intent(in) :: data(:) ! array of data real(8), intent(in) :: x ! x value to find y at @@ -106,18 +106,16 @@ contains select case (interp) case (LINEAR_LINEAR) r = (x - x0)/(x1 - x0) - y = (1 - r)*y0 + r*y1 + y = y0 + r*(y1 - y0) case (LINEAR_LOG) - r = (log(x) - log(x0))/(log(x1) - log(x0)) - y = (1 - r)*y0 + r*y1 + r = log(x/x0)/log(x1/x0) + y = y0 + r*(y1 - y0) case (LOG_LINEAR) r = (x - x0)/(x1 - x0) - y = exp((1-r)*log(y0) + r*log(y1)) + y = y0*exp(r*log(y1/y0)) case (LOG_LOG) - r = (log(x) - log(x0))/(log(x1) - log(x0)) - y = exp((1-r)*log(y0) + r*log(y1)) - case default - call fatal_error("Unsupported interpolation scheme: " // to_str(interp)) + r = log(x/x0)/log(x1/x0) + y = y0*exp(r*log(y1/y0)) end select end function interpolate_tab1_array @@ -129,7 +127,7 @@ contains ! tabulated x's and y's. !=============================================================================== - function interpolate_tab1_object(obj, x) result(y) + pure function interpolate_tab1_object(obj, x) result(y) type(Tab1), intent(in) :: obj ! ENDF Tab1 interpolable function real(8), intent(in) :: x ! x value to find y at @@ -191,18 +189,16 @@ contains select case (interp) case (LINEAR_LINEAR) r = (x - x0)/(x1 - x0) - y = (1 - r)*y0 + r*y1 + y = y0 + r*(y1 - y0) case (LINEAR_LOG) - r = (log(x) - log(x0))/(log(x1) - log(x0)) - y = (1 - r)*y0 + r*y1 + r = log(x/x0)/log(x1/x0) + y = y0 + r*(y1 - y0) case (LOG_LINEAR) r = (x - x0)/(x1 - x0) - y = exp((1-r)*log(y0) + r*log(y1)) + y = y0*exp(r*log(y1/y0)) case (LOG_LOG) - r = (log(x) - log(x0))/(log(x1) - log(x0)) - y = exp((1-r)*log(y0) + r*log(y1)) - case default - call fatal_error("Unsupported interpolation scheme: " // to_str(interp)) + r = log(x/x0)/log(x1/x0) + y = y0*exp(r*log(y1/y0)) end select end function interpolate_tab1_object diff --git a/src/math.F90 b/src/math.F90 index 6b96baa0d9..15aa672e15 100644 --- a/src/math.F90 +++ b/src/math.F90 @@ -12,7 +12,7 @@ contains ! distribution with a specified probability level !=============================================================================== - function normal_percentile(p) result(z) + elemental function normal_percentile(p) result(z) real(8), intent(in) :: p ! probability level real(8) :: z ! corresponding z-value @@ -71,7 +71,7 @@ contains ! specified probability level and number of degrees of freedom !=============================================================================== - function t_percentile(p, df) result(t) + elemental function t_percentile(p, df) result(t) real(8), intent(in) :: p ! probability level integer, intent(in) :: df ! degrees of freedom @@ -123,7 +123,7 @@ contains ! the return value will be 1.0. !=============================================================================== - pure function calc_pn(n,x) result(pnx) + elemental function calc_pn(n,x) result(pnx) integer, intent(in) :: n ! Legendre order requested real(8), intent(in) :: x ! Independent variable the Legendre is to be diff --git a/src/mesh.F90 b/src/mesh.F90 index 3d0235d189..905772eb05 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -18,9 +18,8 @@ contains ! GET_MESH_BIN determines the tally bin for a particle in a structured mesh !=============================================================================== - subroutine get_mesh_bin(m, xyz, bin) - - type(RegularMesh), pointer :: m ! mesh pointer + pure subroutine get_mesh_bin(m, xyz, bin) + type(RegularMesh), intent(in) :: m ! mesh pointer real(8), intent(in) :: xyz(:) ! coordinates integer, intent(out) :: bin ! tally bin @@ -71,9 +70,8 @@ contains ! GET_MESH_INDICES determines the indices of a particle in a structured mesh !=============================================================================== - subroutine get_mesh_indices(m, xyz, ijk, in_mesh) - - type(RegularMesh), pointer :: m + pure subroutine get_mesh_indices(m, xyz, ijk, in_mesh) + type(RegularMesh), intent(in) :: m real(8), intent(in) :: xyz(:) ! coordinates to check integer, intent(out) :: ijk(:) ! indices in mesh logical, intent(out) :: in_mesh ! were given coords in mesh? @@ -96,11 +94,10 @@ contains ! use in a TallyObject results array !=============================================================================== - function mesh_indices_to_bin(m, ijk, surface_current) result(bin) - - type(RegularMesh), pointer :: m + pure function mesh_indices_to_bin(m, ijk, surface_current) result(bin) + type(RegularMesh), intent(in) :: m integer, intent(in) :: ijk(:) - logical, optional :: surface_current + logical, intent(in), optional :: surface_current integer :: bin integer :: n_y ! number of mesh cells in y direction @@ -130,9 +127,8 @@ contains ! (i,j) or (i,j,k) indices !=============================================================================== - subroutine bin_to_mesh_indices(m, bin, ijk) - - type(RegularMesh), pointer :: m + pure subroutine bin_to_mesh_indices(m, bin, ijk) + type(RegularMesh), intent(in) :: m integer, intent(in) :: bin integer, intent(out) :: ijk(:) @@ -167,9 +163,9 @@ contains type(Bank), intent(in) :: bank_array(:) ! fission or source bank real(8), intent(out) :: cnt(:,:,:,:) ! weight of sites in each ! cell and energy group - real(8), optional :: energies(:) ! energy grid to search - integer(8), optional :: size_bank ! # of bank sites (on each proc) - logical, optional :: sites_outside ! were there sites outside mesh? + real(8), intent(in), optional :: energies(:) ! energy grid to search + integer(8), intent(in), optional :: size_bank ! # of bank sites (on each proc) + logical, intent(inout), optional :: sites_outside ! were there sites outside mesh? integer :: i ! loop index for local fission sites integer :: n_sites ! size of bank array @@ -262,9 +258,8 @@ contains ! track will score to a mesh tally. !=============================================================================== - function mesh_intersects_2d(m, xyz0, xyz1) result(intersects) - - type(RegularMesh), pointer :: m + pure function mesh_intersects_2d(m, xyz0, xyz1) result(intersects) + type(RegularMesh), intent(in) :: m real(8), intent(in) :: xyz0(2) real(8), intent(in) :: xyz1(2) logical :: intersects @@ -328,9 +323,8 @@ contains end function mesh_intersects_2d - function mesh_intersects_3d(m, xyz0, xyz1) result(intersects) - - type(RegularMesh), pointer :: m + pure function mesh_intersects_3d(m, xyz0, xyz1) result(intersects) + type(RegularMesh), intent(in) :: m real(8), intent(in) :: xyz0(3) real(8), intent(in) :: xyz1(3) logical :: intersects diff --git a/src/output.F90 b/src/output.F90 index 55cd5b2a5b..2aa90985a7 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -100,10 +100,9 @@ contains !=============================================================================== subroutine header(msg, unit, level) - character(*), intent(in) :: msg ! header message - integer, optional :: unit ! unit to write to - integer, optional :: level ! specified header level + integer, intent(in), optional :: unit ! unit to write to + integer, intent(in), optional :: level ! specified header level integer :: n ! number of = signs on left integer :: m ! number of = signs on right @@ -195,9 +194,8 @@ contains !=============================================================================== subroutine write_message(message, level) - - character(*) :: message - integer, optional :: level ! verbosity level + character(*), intent(in) :: message + integer, intent(in), optional :: level ! verbosity level integer :: i_start ! starting position integer :: i_end ! ending position @@ -250,7 +248,6 @@ contains !=============================================================================== subroutine print_particle(p) - type(Particle), intent(in) :: p integer :: i ! index for coordinate levels @@ -320,9 +317,8 @@ contains !=============================================================================== subroutine print_nuclide(nuc, unit) - - type(Nuclide), pointer :: nuc - integer, optional :: unit + type(Nuclide), intent(in) :: nuc + integer, intent(in), optional :: unit integer :: i ! loop index over nuclides integer :: unit_ ! unit to write to @@ -334,8 +330,8 @@ contains integer :: size_energy ! memory used for a energy distributions (bytes) integer :: size_urr ! memory used for probability tables (bytes) character(11) :: law ! secondary energy distribution law - type(Reaction), pointer :: rxn => null() - type(UrrData), pointer :: urr => null() + type(Reaction), pointer :: rxn + type(UrrData), pointer :: urr ! set default unit for writing information if (present(unit)) then @@ -438,9 +434,8 @@ contains !=============================================================================== subroutine print_sab_table(sab, unit) - - type(SAlphaBeta), pointer :: sab - integer, optional :: unit + type(SAlphaBeta), intent(in) :: sab + integer, intent(in), optional :: unit integer :: size_sab ! memory used by S(a,b) table integer :: unit_ ! unit to write to @@ -526,8 +521,8 @@ contains integer :: i ! loop index integer :: unit_xs ! cross_sections.out file unit character(MAX_FILE_LEN) :: path ! path of summary file - type(Nuclide), pointer :: nuc => null() - type(SAlphaBeta), pointer :: sab => null() + type(Nuclide), pointer :: nuc + type(SAlphaBeta), pointer :: sab ! Create filename for log file path = trim(path_output) // "cross_sections.out" @@ -681,7 +676,7 @@ contains subroutine print_plot() integer :: i ! loop index for plots - type(ObjectPlot), pointer :: pl => null() + type(ObjectPlot), pointer :: pl ! Display header for plotting call header("PLOTTING SUMMARY") @@ -1183,7 +1178,7 @@ contains !=============================================================================== subroutine write_surface_current(t, unit_tally) - type(TallyObject), pointer :: t + type(TallyObject), intent(in) :: t integer, intent(in) :: unit_tally integer :: i ! mesh index for x @@ -1356,9 +1351,9 @@ contains function get_label(t, i_filter) result(label) - type(TallyObject), pointer :: t ! tally object - integer, intent(in) :: i_filter ! index in filters array - character(100) :: label ! user-specified identifier + type(TallyObject), intent(in) :: t ! tally object + integer, intent(in) :: i_filter ! index in filters array + character(100) :: label ! user-specified identifier integer :: i ! index in cells/surfaces/etc array integer :: bin @@ -1422,12 +1417,12 @@ contains recursive subroutine find_offset(map, goal, univ, final, offset, path) - integer, intent(in) :: map ! Index in maps vector - integer, intent(in) :: goal ! The target cell ID - type(Universe), pointer, intent(in) :: univ ! Universe to begin search - integer, intent(in) :: final ! Target offset - integer, intent(inout) :: offset ! Current offset - character(100) :: path ! Path to offset + integer, intent(in) :: map ! Index in maps vector + integer, intent(in) :: goal ! The target cell ID + type(Universe), intent(in) :: univ ! Universe to begin search + integer, intent(in) :: final ! Target offset + integer, intent(inout) :: offset ! Current offset + character(*), intent(inout) :: path ! Path to offset integer :: i, j ! Index over cells integer :: k, l, m ! Indices in lattice @@ -1439,7 +1434,7 @@ contains integer :: temp_offset ! Looped sum of offsets logical :: this_cell = .false. ! Advance in this cell? logical :: later_cell = .false. ! Fill cells after this one? - type(Cell), pointer:: c ! Pointer to current cell + type(Cell), pointer :: c ! Pointer to current cell type(Universe), pointer :: next_univ ! Next universe to loop through class(Lattice), pointer :: lat ! Pointer to current lattice diff --git a/src/physics.F90 b/src/physics.F90 index 9f8fb535b1..c06919758a 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -420,9 +420,8 @@ contains !=============================================================================== subroutine elastic_scatter(i_nuclide, rxn, E, uvw, mu_lab, wgt) - integer, intent(in) :: i_nuclide - type(Reaction), pointer :: rxn + type(Reaction), intent(in) :: rxn real(8), intent(inout) :: E real(8), intent(inout) :: uvw(3) real(8), intent(out) :: mu_lab @@ -759,9 +758,7 @@ contains !=============================================================================== subroutine sample_target_velocity(nuc, v_target, E, uvw, v_neut, wgt, xs_eff) - - type(Nuclide), pointer :: nuc ! target nuclide at temperature T - + type(Nuclide), intent(in) :: nuc ! target nuclide at temperature T real(8), intent(out) :: v_target(3) ! target velocity real(8), intent(in) :: v_neut(3) ! neutron velocity real(8), intent(in) :: E ! particle energy @@ -1006,8 +1003,7 @@ contains !=============================================================================== subroutine sample_cxs_target_velocity(nuc, v_target, E, uvw) - - type(Nuclide), pointer :: nuc ! target nuclide at temperature + type(Nuclide), intent(in) :: nuc ! target nuclide at temperature real(8), intent(out) :: v_target(3) real(8), intent(in) :: E real(8), intent(in) :: uvw(3) @@ -1080,7 +1076,6 @@ contains !=============================================================================== subroutine create_fission_sites(p, i_nuclide, i_reaction) - type(Particle), intent(inout) :: p integer, intent(in) :: i_nuclide integer, intent(in) :: i_reaction @@ -1197,8 +1192,8 @@ contains function sample_fission_energy(nuc, rxn, p) result(E_out) - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn + type(Nuclide), intent(in) :: nuc + type(Reaction), intent(in) :: rxn type(Particle), intent(inout) :: p ! Particle causing fission real(8) :: E_out ! outgoing energy of fission neutron @@ -1323,8 +1318,8 @@ contains !=============================================================================== subroutine inelastic_scatter(nuc, rxn, p) - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn + type(Nuclide), intent(in) :: nuc + type(Reaction), intent(in) :: rxn type(Particle), intent(inout) :: p integer :: i ! loop index @@ -1409,8 +1404,7 @@ contains !=============================================================================== function sample_angle(rxn, E) result(mu) - - type(Reaction), pointer :: rxn ! reaction + type(Reaction), intent(in) :: rxn ! reaction real(8), intent(in) :: E ! incoming energy real(8) :: xi ! random number on [0,1) @@ -1536,7 +1530,6 @@ contains !=============================================================================== function rotate_angle(uvw0, mu) result(uvw) - real(8), intent(in) :: uvw0(3) ! directional cosine real(8), intent(in) :: mu ! cosine of angle in lab or CM real(8) :: uvw(3) ! rotated directional cosine @@ -1585,8 +1578,7 @@ contains !=============================================================================== recursive subroutine sample_energy(edist, E_in, E_out, mu_out, A, Q) - - type(DistEnergy), pointer :: edist + type(DistEnergy), intent(in) :: edist real(8), intent(in) :: E_in ! incoming energy of neutron real(8), intent(out) :: E_out ! outgoing energy real(8), intent(inout), optional :: mu_out ! outgoing cosine of angle diff --git a/src/search.F90 b/src/search.F90 index d38dfb986e..0c345471c2 100644 --- a/src/search.F90 +++ b/src/search.F90 @@ -18,7 +18,7 @@ contains ! value lies in the array. This is used extensively for energy grid searching !=============================================================================== - function binary_search_real(array, n, val) result(array_index) + pure function binary_search_real(array, n, val) result(array_index) integer, intent(in) :: n real(8), intent(in) :: array(n) @@ -33,7 +33,8 @@ contains R = n if (val < array(L) .or. val > array(R)) then - call fatal_error("Value outside of array during binary search") + array_index = -1 + return end if n_iteration = 0 @@ -49,8 +50,8 @@ contains ! check for large number of iterations n_iteration = n_iteration + 1 if (n_iteration == MAX_ITERATION) then - call fatal_error("Reached maximum number of iterations on binary & - &search.") + array_index = -2 + return end if end do @@ -58,7 +59,7 @@ contains end function binary_search_real - function binary_search_int4(array, n, val) result(array_index) + pure function binary_search_int4(array, n, val) result(array_index) integer, intent(in) :: n integer, intent(in) :: array(n) @@ -73,7 +74,8 @@ contains R = n if (val < array(L) .or. val > array(R)) then - call fatal_error("Value outside of array during binary search") + array_index = -1 + return end if n_iteration = 0 @@ -89,8 +91,8 @@ contains ! check for large number of iterations n_iteration = n_iteration + 1 if (n_iteration == MAX_ITERATION) then - call fatal_error("Reached maximum number of iterations on binary & - &search.") + array_index = -2 + return end if end do @@ -98,7 +100,7 @@ contains end function binary_search_int4 - function binary_search_int8(array, n, val) result(array_index) + pure function binary_search_int8(array, n, val) result(array_index) integer, intent(in) :: n integer(8), intent(in) :: array(n) @@ -113,7 +115,8 @@ contains R = n if (val < array(L) .or. val > array(R)) then - call fatal_error("Value outside of array during binary search") + array_index = -1 + return end if n_iteration = 0 @@ -129,8 +132,8 @@ contains ! check for large number of iterations n_iteration = n_iteration + 1 if (n_iteration == MAX_ITERATION) then - call fatal_error("Reached maximum number of iterations on binary & - &search.") + array_index = -2 + return end if end do diff --git a/src/source.F90 b/src/source.F90 index 6226517f3e..a16eb245d0 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -96,8 +96,7 @@ contains !=============================================================================== subroutine sample_external_source(site) - - type(Bank), pointer :: site ! source site + type(Bank), intent(inout) :: site ! source site integer :: i ! dummy loop index real(8) :: r(3) ! sampled coordinates diff --git a/src/string.F90 b/src/string.F90 index 9ca630e295..ce130a212d 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -25,7 +25,6 @@ contains !=============================================================================== subroutine split_string(string, words, n) - character(*), intent(in) :: string character(*), intent(out) :: words(MAX_WORDS) integer, intent(out) :: n @@ -166,7 +165,7 @@ contains ! string = concatenated string !=============================================================================== - function concatenate(words, n_words) result(string) + pure function concatenate(words, n_words) result(string) integer, intent(in) :: n_words character(*), intent(in) :: words(n_words) @@ -186,8 +185,7 @@ contains ! TO_LOWER converts a string to all lower case characters !=============================================================================== - function to_lower(word) result(word_lower) - + pure function to_lower(word) result(word_lower) character(*), intent(in) :: word character(len=len(word)) :: word_lower @@ -209,8 +207,7 @@ contains ! TO_UPPER converts a string to all upper case characters !=============================================================================== - function to_upper(word) result(word_upper) - + pure function to_upper(word) result(word_upper) character(*), intent(in) :: word character(len=len(word)) :: word_upper @@ -234,39 +231,38 @@ contains ! integers. !=============================================================================== -function zero_padded(num, n_digits) result(str) - integer, intent(in) :: num - integer, intent(in) :: n_digits - character(11) :: str + function zero_padded(num, n_digits) result(str) + integer, intent(in) :: num + integer, intent(in) :: n_digits + character(11) :: str - character(8) :: zp_form + character(8) :: zp_form - ! Make sure n_digits is reasonable. 10 digits is the maximum needed for the - ! largest integer(4). - if (n_digits > 10) then - call fatal_error('zero_padded called with an unreasonably large & - &n_digits (>10)') - end if + ! Make sure n_digits is reasonable. 10 digits is the maximum needed for the + ! largest integer(4). + if (n_digits > 10) then + call fatal_error('zero_padded called with an unreasonably large & + &n_digits (>10)') + end if - ! Write a format string of the form '(In.m)' where n is the max width and - ! m is the min width. If a sign is present, then n must be one greater - ! than m. - if (num < 0) then - write(zp_form, '("(I", I0, ".", I0, ")")') n_digits+1, n_digits - else - write(zp_form, '("(I", I0, ".", I0, ")")') n_digits, n_digits - end if + ! Write a format string of the form '(In.m)' where n is the max width and + ! m is the min width. If a sign is present, then n must be one greater + ! than m. + if (num < 0) then + write(zp_form, '("(I", I0, ".", I0, ")")') n_digits+1, n_digits + else + write(zp_form, '("(I", I0, ".", I0, ")")') n_digits, n_digits + end if - ! Format the number. - write(str, zp_form) num -end function zero_padded + ! Format the number. + write(str, zp_form) num + end function zero_padded !=============================================================================== ! IS_NUMBER determines whether a string of characters is all 0-9 characters !=============================================================================== - function is_number(word) result(number) - + pure function is_number(word) result(number) character(*), intent(in) :: word logical :: number @@ -286,10 +282,9 @@ end function zero_padded ! sequence of characters !=============================================================================== - logical function starts_with(str, seq) - - character(*) :: str ! string to check - character(*) :: seq ! sequence of characters + pure logical function starts_with(str, seq) + character(*), intent(in) :: str ! string to check + character(*), intent(in) :: seq ! sequence of characters integer :: i integer :: i_start @@ -321,10 +316,9 @@ end function zero_padded ! of characters !=============================================================================== - logical function ends_with(str, seq) - - character(*) :: str ! string to check - character(*) :: seq ! sequence of characters + pure logical function ends_with(str, seq) + character(*), intent(in) :: str ! string to check + character(*), intent(in) :: seq ! sequence of characters integer :: i_start integer :: str_len @@ -350,7 +344,7 @@ end function zero_padded ! integer. !=============================================================================== - function count_digits(num) result(n_digits) + pure function count_digits(num) result(n_digits) integer, intent(in) :: num integer :: n_digits @@ -368,7 +362,7 @@ end function zero_padded ! INT4_TO_STR converts an integer(4) to a string. !=============================================================================== - function int4_to_str(num) result(str) + pure function int4_to_str(num) result(str) integer, intent(in) :: num character(11) :: str @@ -382,7 +376,7 @@ end function zero_padded ! INT8_TO_STR converts an integer(8) to a string. !=============================================================================== - function int8_to_str(num) result(str) + pure function int8_to_str(num) result(str) integer(8), intent(in) :: num character(21) :: str @@ -396,7 +390,7 @@ end function zero_padded ! STR_TO_INT converts a string to an integer. !=============================================================================== - function str_to_int(str) result(num) + pure function str_to_int(str) result(num) character(*), intent(in) :: str integer(8) :: num @@ -421,7 +415,7 @@ end function zero_padded ! STR_TO_REAL converts an arbitrary string to a real(8) !=============================================================================== - function str_to_real(string) result(num) + pure function str_to_real(string) result(num) character(*), intent(in) :: string real(8) :: num @@ -440,7 +434,7 @@ end function zero_padded ! are used. !=============================================================================== - function real_to_str(num, sig_digits) result(string) + pure function real_to_str(num, sig_digits) result(string) real(8), intent(in) :: num ! number to convert integer, optional, intent(in) :: sig_digits ! # of significant digits diff --git a/src/tally.F90 b/src/tally.F90 index da4e828003..56fff7e627 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -37,13 +37,13 @@ contains subroutine score_general(p, t, start_index, filter_index, i_nuclide, & atom_density, flux) - type(Particle), intent(in) :: p - type(TallyObject), pointer, intent(inout) :: t - integer, intent(in) :: start_index - integer, intent(in) :: i_nuclide - integer, intent(in) :: filter_index ! for % results - real(8), intent(in) :: flux ! flux estimate - real(8), intent(in) :: atom_density ! atom/b-cm + type(Particle), intent(in) :: p + type(TallyObject), intent(inout) :: t + integer, intent(in) :: start_index + integer, intent(in) :: i_nuclide + integer, intent(in) :: filter_index ! for % results + real(8), intent(in) :: flux ! flux estimate + real(8), intent(in) :: atom_density ! atom/b-cm integer :: i ! loop index for scoring bins integer :: l ! loop index for nuclides in material @@ -1018,9 +1018,8 @@ contains !=============================================================================== subroutine score_fission_eout(p, t, i_score) - type(Particle), intent(in) :: p - type(TallyObject), pointer :: t + type(TallyObject), intent(inout) :: t integer, intent(in) :: i_score ! index for score integer :: i ! index of outgoing energy filter @@ -1348,9 +1347,9 @@ contains logical :: end_in_mesh ! ending coordinates inside mesh? real(8) :: theta real(8) :: phi - type(TallyObject), pointer :: t + type(TallyObject), pointer :: t type(RegularMesh), pointer :: m - type(Material), pointer :: mat + type(Material), pointer :: mat t => tallies(i_tally) matching_bins(1:t%n_filters) = 1 @@ -1724,7 +1723,7 @@ contains integer :: offset ! offset for distribcell real(8) :: E ! particle energy real(8) :: theta, phi ! Polar and Azimuthal Angles, respectively - type(TallyObject), pointer :: t + type(TallyObject), pointer :: t type(RegularMesh), pointer :: m found_bin = .true. @@ -1948,7 +1947,7 @@ contains logical :: x_same ! same starting/ending x index (i) logical :: y_same ! same starting/ending y index (j) logical :: z_same ! same starting/ending z index (k) - type(TallyObject), pointer :: t + type(TallyObject), pointer :: t type(RegularMesh), pointer :: m TALLY_LOOP: do i = 1, active_current_tallies % size() diff --git a/src/tally_initialize.F90 b/src/tally_initialize.F90 index b7dc5ed98a..73aa18c60c 100644 --- a/src/tally_initialize.F90 +++ b/src/tally_initialize.F90 @@ -38,7 +38,7 @@ contains integer :: j ! loop index for filters integer :: n ! temporary stride integer :: max_n_filters = 0 ! maximum number of filters - type(TallyObject), pointer :: t => null() + type(TallyObject), pointer :: t TALLY_LOOP: do i = 1, n_tallies ! Get pointer to tally @@ -88,7 +88,7 @@ contains integer :: k ! loop index for bins integer :: bin ! filter bin entries integer :: type ! type of tally filter - type(TallyObject), pointer :: t => null() + type(TallyObject), pointer :: t ! allocate tally map array -- note that we don't need a tally map for the ! energy_in and energy_out filters diff --git a/src/timer_header.F90 b/src/timer_header.F90 index 0bf1b7aef5..6b0580f427 100644 --- a/src/timer_header.F90 +++ b/src/timer_header.F90 @@ -29,13 +29,11 @@ contains !=============================================================================== subroutine timer_start(self) - class(Timer), intent(inout) :: self ! Turn timer on and measure starting time self % running = .true. call system_clock(self % start_counts) - end subroutine timer_start !=============================================================================== @@ -43,7 +41,6 @@ contains !=============================================================================== function timer_get_value(self) result(elapsed) - class(Timer), intent(in) :: self ! the timer real(8) :: elapsed ! total elapsed time @@ -58,7 +55,6 @@ contains else elapsed = self % elapsed end if - end function timer_get_value !=============================================================================== @@ -66,30 +62,26 @@ contains !=============================================================================== subroutine timer_stop(self) - class(Timer), intent(inout) :: self ! Check to make sure timer was running if (.not. self % running) return ! Stop timer and add time - self % elapsed = timer_get_value(self) + self % elapsed = self % get_value() self % running = .false. - end subroutine timer_stop !=============================================================================== ! TIMER_RESET resets a timer to have a zero value !=============================================================================== - subroutine timer_reset(self) - + pure subroutine timer_reset(self) class(Timer), intent(inout) :: self self % running = .false. self % start_counts = 0 self % elapsed = ZERO - end subroutine timer_reset end module timer_header diff --git a/src/trigger_header.F90 b/src/trigger_header.F90 index e137829bd0..96421314cd 100644 --- a/src/trigger_header.F90 +++ b/src/trigger_header.F90 @@ -1,6 +1,6 @@ module trigger_header - use constants, only: NONE, N_FILTER_TYPES + use constants, only: NONE, N_FILTER_TYPES, ZERO implicit none @@ -13,9 +13,9 @@ module trigger_header real(8) :: threshold ! a convergence threshold character(len=52) :: score_name ! the name of the score integer :: score_index ! the index of the score - real(8) :: variance=0.0 ! temp variance container - real(8) :: std_dev =0.0 ! temp std. dev. container - real(8) :: rel_err =0.0 ! temp rel. err. container + real(8) :: variance = ZERO ! temp variance container + real(8) :: std_dev = ZERO ! temp std. dev. container + real(8) :: rel_err = ZERO ! temp rel. err. container end type TriggerObject !=============================================================================== @@ -23,7 +23,7 @@ module trigger_header !=============================================================================== type KTrigger integer :: trigger_type = 0 - real(8) :: threshold = 0 + real(8) :: threshold = ZERO end type KTrigger end module trigger_header diff --git a/src/xml_interface.F90 b/src/xml_interface.F90 index 4ae05ee281..8f0370b152 100644 --- a/src/xml_interface.F90 +++ b/src/xml_interface.F90 @@ -117,7 +117,7 @@ contains type(Node), pointer, intent(out) :: out_ptr logical :: found_ - type(NodeList), pointer :: elem_list => null() + type(NodeList), pointer :: elem_list ! Set found to false found_ = .false. From 3386191764293ac2176d0afd56d9683b58bd3d41 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 6 Oct 2015 21:18:11 +0700 Subject: [PATCH 435/519] Get rid of union_grid_index module variable. --- src/cross_section.F90 | 54 +++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 287077c465..9e084e1709 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -13,10 +13,6 @@ module cross_section use search, only: binary_search implicit none - save - - integer :: union_grid_index -!$omp threadprivate(union_grid_index) contains @@ -33,7 +29,8 @@ contains integer :: i_nuclide ! index into nuclides array integer :: i_sab ! index into sab_tables array integer :: j ! index in mat % i_sab_nuclides - integer :: u ! index into logarithmic mapping array + integer :: i_grid ! index into logarithmic mapping array or material + ! union grid real(8) :: atom_density ! atom density of a nuclide logical :: check_sab ! should we check for S(a,b) table? type(Material), pointer :: mat ! current material @@ -52,11 +49,10 @@ contains mat => materials(p % material) ! Find energy index on energy grid - u = 0 if (grid_method == GRID_MAT_UNION) then - call find_energy_index(p % E, p % material) + i_grid = find_energy_index(mat, p % E) else if (grid_method == GRID_LOGARITHM) then - u = int(log(p % E/energy_min_neutron)/log_spacing) + i_grid = int(log(p % E/energy_min_neutron)/log_spacing) end if ! Determine if this material has S(a,b) tables @@ -99,9 +95,9 @@ contains ! Calculate microscopic cross section for this nuclide if (p % E /= micro_xs(i_nuclide) % last_E) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, u) + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, i_grid) else if (i_sab /= micro_xs(i_nuclide) % last_index_sab) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, u) + call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, i_grid) end if ! ======================================================================== @@ -142,18 +138,19 @@ contains ! given index in the nuclides array at the energy of the given particle !=============================================================================== - subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_mat, i_nuc_mat, u) - + subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_mat, i_nuc_mat, i_log_union) integer, intent(in) :: i_nuclide ! index into nuclides array integer, intent(in) :: i_sab ! index into sab_tables array + real(8), intent(in) :: E ! energy integer, intent(in) :: i_mat ! index into materials array integer, intent(in) :: i_nuc_mat ! index into nuclides array for a material - integer, intent(in) :: u ! index into logarithmic mapping array + integer, intent(in) :: i_log_union ! index into logarithmic mapping array or + ! material union energy grid + integer :: i_grid ! index on nuclide energy grid integer :: i_low ! lower logarithmic mapping index integer :: i_high ! upper logarithmic mapping index - real(8), intent(in) :: E ! energy - real(8) :: f ! interp factor on nuclide energy grid + real(8) :: f ! interp factor on nuclide energy grid type(Nuclide), pointer :: nuc type(Material), pointer :: mat @@ -165,7 +162,7 @@ contains select case (grid_method) case (GRID_MAT_UNION) - i_grid = mat % nuclide_grid_index(i_nuc_mat, union_grid_index) + i_grid = mat % nuclide_grid_index(i_nuc_mat, i_log_union) case (GRID_LOGARITHM) ! Determine the energy grid index using a logarithmic mapping to reduce @@ -178,8 +175,8 @@ contains else ! Determine bounding indices based on which equal log-spaced interval ! the energy is in - i_low = nuc % grid_index(u) - i_high = nuc % grid_index(u + 1) + 1 + i_low = nuc % grid_index(i_log_union) + i_high = nuc % grid_index(i_log_union + 1) + 1 ! Perform binary search over reduced range i_grid = binary_search(nuc % energy(i_low:i_high), & @@ -526,25 +523,22 @@ contains ! energy !=============================================================================== - subroutine find_energy_index(E, i_mat) - - real(8), intent(in) :: E ! energy of particle - integer, intent(in) :: i_mat ! material index - type(Material), pointer :: mat ! pointer to current material - - mat => materials(i_mat) + pure function find_energy_index(mat, E) result(i) + type(Material), intent(in) :: mat ! pointer to current material + real(8), intent(in) :: E ! energy of particle + integer :: i ! energy grid index ! if the energy is outside of energy grid range, set to first or last ! index. Otherwise, do a binary search through the union energy grid. if (E <= mat % e_grid(1)) then - union_grid_index = 1 + i = 1 elseif (E > mat % e_grid(mat % n_grid)) then - union_grid_index = mat % n_grid - 1 + i = mat % n_grid - 1 else - union_grid_index = binary_search(mat % e_grid, mat % n_grid, E) + i = binary_search(mat % e_grid, mat % n_grid, E) end if - end subroutine find_energy_index + end function find_energy_index !=============================================================================== ! 0K_ELASTIC_XS determines the microscopic 0K elastic cross section @@ -552,7 +546,7 @@ contains !=============================================================================== pure function elastic_xs_0K(E, nuc) result(xs_out) - real(8), intent(inout) :: E ! trial energy + real(8), intent(in) :: E ! trial energy type(Nuclide), intent(in) :: nuc ! target nuclide at temperature real(8) :: xs_out ! 0K xs at trial energy From e6eb35bae8e95a2a29208749a37f500fa4453c89 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 16:25:29 +0700 Subject: [PATCH 436/519] Create dictionary on Nuclide type mapping MT -> index in reactions This dictionary is used to speed up tallying when a user requests a tally of a specific reaction, e.g. (n,gamma). --- src/ace.F90 | 1 + src/ace_header.F90 | 10 +++++--- src/tally.F90 | 62 +++++++++++++++++++--------------------------- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 622d6d7b73..c0c4395cfa 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -816,6 +816,7 @@ contains ! Create set of MT values do i = 1, size(nuc % reactions) call MTs % append(nuc % reactions(i) % MT) + call nuc%reaction_index%add_key(nuc%reactions(i)%MT, i) end do ! Create total, absorption, and fission cross sections diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 467887c193..1221ee81dc 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -1,8 +1,9 @@ module ace_header - use constants, only: MAX_FILE_LEN, ZERO - use endf_header, only: Tab1 - use list_header, only: ListInt + use constants, only: MAX_FILE_LEN, ZERO + use dict_header, only: DictIntInt + use endf_header, only: Tab1 + use list_header, only: ListInt implicit none @@ -154,6 +155,8 @@ module ace_header ! Reactions integer :: n_reaction ! # of reactions type(Reaction), pointer :: reactions(:) => null() + type(DictIntInt) :: reaction_index ! map MT values to index in reactions + ! array; used at tally-time ! Type-Bound procedures contains @@ -417,6 +420,7 @@ module ace_header end if call this % nuc_list % clear() + call this % reaction_index % clear() end subroutine nuclide_clear diff --git a/src/tally.F90 b/src/tally.F90 index 56fff7e627..2f178fe464 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -691,26 +691,20 @@ contains score = ZERO if (i_nuclide > 0) then - ! TODO: The following search for the matching reaction could - ! be replaced by adding a dictionary on each Nuclide instance - ! of the form {MT: i_reaction, ...} - REACTION_LOOP: do m = 1, nuclides(i_nuclide) % n_reaction - ! Get pointer to reaction + if (nuclides(i_nuclide)%reaction_index%has_key(score_bin)) then + m = nuclides(i_nuclide)%reaction_index%get_key(score_bin) rxn => nuclides(i_nuclide) % reactions(m) - ! Check if this is the desired MT - if (score_bin == rxn % MT) then - ! Retrieve index on nuclide energy grid and interpolation - ! factor - i_energy = micro_xs(i_nuclide) % index_grid - f = micro_xs(i_nuclide) % interp_factor - if (i_energy >= rxn % threshold) then - score = ((ONE - f) * rxn % sigma(i_energy - & - rxn%threshold + 1) + f * rxn % sigma(i_energy - & - rxn%threshold + 2)) * atom_density * flux - end if - exit REACTION_LOOP + + ! Retrieve index on nuclide energy grid and interpolation + ! factor + i_energy = micro_xs(i_nuclide) % index_grid + f = micro_xs(i_nuclide) % interp_factor + if (i_energy >= rxn % threshold) then + score = ((ONE - f) * rxn % sigma(i_energy - & + rxn%threshold + 1) + f * rxn % sigma(i_energy - & + rxn%threshold + 2)) * atom_density * flux end if - end do REACTION_LOOP + end if else ! Get pointer to current material @@ -718,28 +712,24 @@ contains do l = 1, mat % n_nuclides ! Get atom density atom_density_ = mat % atom_density(l) + ! Get index in nuclides array i_nuc = mat % nuclide(l) - ! TODO: The following search for the matching reaction could - ! be replaced by adding a dictionary on each Nuclide - ! instance of the form {MT: i_reaction, ...} - do m = 1, nuclides(i_nuc) % n_reaction - ! Get pointer to reaction + + if (nuclides(i_nuc)%reaction_index%has_key(score_bin)) then + m = nuclides(i_nuc)%reaction_index%get_key(score_bin) rxn => nuclides(i_nuc) % reactions(m) - ! Check if this is the desired MT - if (score_bin == rxn % MT) then - ! Retrieve index on nuclide energy grid and interpolation - ! factor - i_energy = micro_xs(i_nuc) % index_grid - f = micro_xs(i_nuc) % interp_factor - if (i_energy >= rxn % threshold) then - score = score + ((ONE - f) * rxn % sigma(i_energy - & - rxn%threshold + 1) + f * rxn % sigma(i_energy - & - rxn%threshold + 2)) * atom_density_ * flux - end if - exit + + ! Retrieve index on nuclide energy grid and interpolation + ! factor + i_energy = micro_xs(i_nuc) % index_grid + f = micro_xs(i_nuc) % interp_factor + if (i_energy >= rxn % threshold) then + score = score + ((ONE - f) * rxn % sigma(i_energy - & + rxn%threshold + 1) + f * rxn % sigma(i_energy - & + rxn%threshold + 2)) * atom_density_ * flux end if - end do + end if end do end if From 8d36d577e0391d68a361b71fae951d0b239c60d3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 17:07:41 +0700 Subject: [PATCH 437/519] Make Nuclide%nuc_list a type(VectorInt) instead of type(ListInt) --- src/ace.F90 | 2 +- src/ace_header.F90 | 5 ++--- src/cross_section.F90 | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index c0c4395cfa..dbed667570 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -1587,7 +1587,7 @@ contains do i = 1, n_nuclides_total do j = 1, n_nuclides_total if (nuclides(i) % zaid == nuclides(j) % zaid) then - call nuclides(i) % nuc_list % append(j) + call nuclides(i) % nuc_list % push_back(j) end if end do end do diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 1221ee81dc..c5e9e14799 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -3,7 +3,7 @@ module ace_header use constants, only: MAX_FILE_LEN, ZERO use dict_header, only: DictIntInt use endf_header, only: Tab1 - use list_header, only: ListInt + use stl_vector, only: VectorInt implicit none @@ -100,7 +100,7 @@ module ace_header real(8) :: kT ! temperature in MeV (k*T) ! Linked list of indices in nuclides array of instances of this same nuclide - type(ListInt) :: nuc_list + type(VectorInt) :: nuc_list ! Energy grid information integer :: n_grid ! # of nuclide grid points @@ -419,7 +419,6 @@ module ace_header deallocate(this % reactions) end if - call this % nuc_list % clear() call this % reaction_index % clear() end subroutine nuclide_clear diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 9e084e1709..b9c76b503c 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -405,7 +405,7 @@ contains ! preserve correlation of temperature in probability tables same_nuc = .false. do i = 1, nuc % nuc_list % size() - if (E /= ZERO .and. E == micro_xs(nuc % nuc_list % get_item(i)) % last_E) then + if (E /= ZERO .and. E == micro_xs(nuc % nuc_list % data(i)) % last_E) then same_nuc = .true. same_nuc_idx = i exit @@ -413,7 +413,7 @@ contains end do if (same_nuc) then - r = micro_xs(nuc % nuc_list % get_item(same_nuc_idx)) % last_prn + r = micro_xs(nuc % nuc_list % data(same_nuc_idx)) % last_prn else r = prn() micro_xs(i_nuclide) % last_prn = r From f3b1de3b0d4c73beb0259a80451adf67903dc235 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 20:51:41 +0700 Subject: [PATCH 438/519] Get rid of some unnecessary deallocates --- src/ace_header.F90 | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index c5e9e14799..950a998a33 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -375,31 +375,6 @@ module ace_header integer :: i ! Loop counter - if (allocated(this % energy)) & - deallocate(this % energy, this % total, this % elastic, & - & this % fission, this % nu_fission, this % absorption) - - if (allocated(this % energy_0K)) & - deallocate(this % energy_0K) - - if (allocated(this % elastic_0K)) & - deallocate(this % elastic_0K) - - if (allocated(this % xs_cdf)) & - deallocate(this % xs_cdf) - - if (allocated(this % heating)) & - deallocate(this % heating) - - if (allocated(this % index_fission)) deallocate(this % index_fission) - - if (allocated(this % nu_t_data)) deallocate(this % nu_t_data) - if (allocated(this % nu_p_data)) deallocate(this % nu_p_data) - if (allocated(this % nu_d_data)) deallocate(this % nu_d_data) - - if (allocated(this % nu_d_precursor_data)) & - deallocate(this % nu_d_precursor_data) - if (associated(this % nu_d_edist)) then do i = 1, size(this % nu_d_edist) call this % nu_d_edist(i) % clear() From ceea23d01aa76645ee2d0bce4c4aebb66ba06fc9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 21:24:14 +0700 Subject: [PATCH 439/519] Remove a bunch of clear methods. Make multiplicity_E allocatable. --- src/ace_header.F90 | 44 +------------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 950a998a33..a10c6fe87c 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -18,10 +18,6 @@ module ace_header integer, allocatable :: type(:) ! type of distribution integer, allocatable :: location(:) ! location of each table real(8), allocatable :: data(:) ! angular distribution data - - ! Type-Bound procedures - contains - procedure :: clear => distangle_clear ! Deallocates DistAngle end type DistAngle !=============================================================================== @@ -52,7 +48,7 @@ module ace_header integer :: MT ! ENDF MT value real(8) :: Q_value ! Reaction Q value integer :: multiplicity ! Number of secondary particles released - type(Tab1), pointer :: multiplicity_E => null() ! Energy-dependent neutron yield + type(Tab1), allocatable :: multiplicity_E ! Energy-dependent neutron yield integer :: threshold ! Energy grid index of threshold logical :: scatter_in_cm ! scattering system in center-of-mass? logical :: multiplicity_with_E = .false. ! Flag to indicate E-dependent multiplicity @@ -80,10 +76,6 @@ module ace_header logical :: multiply_smooth ! multiply by smooth cross section? real(8), allocatable :: energy(:) ! incident energies real(8), allocatable :: prob(:,:,:) ! actual probabibility tables - - ! Type-Bound procedures - contains - procedure :: clear => urrdata_clear ! Deallocates UrrData end type UrrData !=============================================================================== @@ -169,14 +161,12 @@ module ace_header !=============================================================================== type Nuclide0K - character(10) :: nuclide ! name of nuclide, e.g. U-238 character(16) :: scheme = 'ares' ! target velocity sampling scheme character(10) :: name ! name of nuclide, e.g. 92235.03c character(10) :: name_0K ! name of 0K nuclide, e.g. 92235.00c real(8) :: E_min = 0.01e-6_8 ! lower cutoff energy for res scattering real(8) :: E_max = 1000.0e-6_8 ! upper cutoff energy for res scattering - end type Nuclide0K !=============================================================================== @@ -296,19 +286,6 @@ module ace_header contains -!=============================================================================== -! DISTANGLE_CLEAR resets and deallocates data in Reaction. -!=============================================================================== - - subroutine distangle_clear(this) - - class(DistAngle), intent(inout) :: this ! The DistAngle object to clear - - if (allocated(this % energy)) & - deallocate(this % energy, this % type, this % location, this % data) - - end subroutine distangle_clear - !=============================================================================== ! DISTENERGY_CLEAR resets and deallocates data in DistEnergy. !=============================================================================== @@ -339,32 +316,13 @@ module ace_header class(Reaction), intent(inout) :: this ! The Reaction object to clear - if (allocated(this % sigma)) deallocate(this % sigma) - - if (associated(this % multiplicity_E)) deallocate(this % multiplicity_E) - if (associated(this % edist)) then call this % edist % clear() deallocate(this % edist) end if - call this % adist % clear() - end subroutine reaction_clear -!=============================================================================== -! URRDATA_CLEAR resets and deallocates data in Reaction. -!=============================================================================== - - subroutine urrdata_clear(this) - - class(UrrData), intent(inout) :: this ! The UrrData object to clear - - if (allocated(this % energy)) & - deallocate(this % energy, this % prob) - - end subroutine urrdata_clear - !=============================================================================== ! NUCLIDE_CLEAR resets and deallocates data in Nuclide. !=============================================================================== From 5751ce4a6688b646d56fc5018457ba9d2cc111a5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 21:30:02 +0700 Subject: [PATCH 440/519] Get rid of tally clearing routines --- src/global.F90 | 9 +---- src/tally_header.F90 | 79 -------------------------------------------- 2 files changed, 1 insertion(+), 87 deletions(-) diff --git a/src/global.F90 b/src/global.F90 index a4c80daa79..1d8099630c 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -463,14 +463,7 @@ contains ! Deallocate tally-related arrays if (allocated(global_tallies)) deallocate(global_tallies) if (allocated(meshes)) deallocate(meshes) - if (allocated(tallies)) then - ! First call the clear routines - do i = 1, size(tallies) - call tallies(i) % clear() - end do - ! Now deallocate the tally array - deallocate(tallies) - end if + if (allocated(tallies)) deallocate(tallies) if (allocated(matching_bins)) deallocate(matching_bins) if (allocated(tally_maps)) deallocate(tally_maps) diff --git a/src/tally_header.F90 b/src/tally_header.F90 index 01dcd9bdb5..18b9219522 100644 --- a/src/tally_header.F90 +++ b/src/tally_header.F90 @@ -58,10 +58,6 @@ module tally_header integer :: offset = 0 ! Only used for distribcell filters integer, allocatable :: int_bins(:) real(8), allocatable :: real_bins(:) ! Only used for energy filters - - ! Type-Bound procedures - contains - procedure :: clear => tallyfilter_clear ! Deallocates TallyFilter end type TallyFilter !=============================================================================== @@ -129,81 +125,6 @@ module tally_header ! Tally precision triggers integer :: n_triggers = 0 ! # of triggers type(TriggerObject), allocatable :: triggers(:) ! Array of triggers - - ! Type-Bound procedures - contains - procedure :: clear => tallyobject_clear ! Deallocates TallyObject end type TallyObject - contains - -!=============================================================================== -! TALLYFILTER_CLEAR deallocates a TallyFilter element and sets it to its as -! initialized state. -!=============================================================================== - - subroutine tallyfilter_clear(this) - class(TallyFilter), intent(inout) :: this ! The TallyFilter to be cleared - - this % type = NONE - this % n_bins = 0 - if (allocated(this % int_bins)) & - deallocate(this % int_bins) - if (allocated(this % real_bins)) & - deallocate(this % real_bins) - - end subroutine tallyfilter_clear - -!=============================================================================== -! TALLYOBJECT_CLEAR deallocates a TallyObject element and sets it to its as -! initialized state. -!=============================================================================== - - subroutine tallyobject_clear(this) - class(TallyObject), intent(inout) :: this ! The TallyObject to be cleared - - integer :: i ! Loop Index - - ! This routine will go through each item in TallyObject and set the value - ! to its default, as-initialized values, including deallocations. - this % name = "" - - if (allocated(this % filters)) then - do i = 1, size(this % filters) - call this % filters(i) % clear() - end do - deallocate(this % filters) - end if - - if (allocated(this % stride)) & - deallocate(this % stride) - - this % find_filter = 0 - - this % n_nuclide_bins = 0 - if (allocated(this % nuclide_bins)) & - deallocate(this % nuclide_bins) - this % all_nuclides = .false. - - this % n_score_bins = 0 - if (allocated(this % score_bins)) & - deallocate(this % score_bins) - if (allocated(this % moment_order)) & - deallocate(this % moment_order) - this % n_user_score_bins = 0 - - if (allocated(this % results)) & - deallocate(this % results) - - this % reset = .false. - - this % n_realizations = 0 - - if (allocated(this % triggers)) & - deallocate (this % triggers) - - this % n_triggers = 0 - - end subroutine tallyobject_clear - end module tally_header From 9b87c1b77dfb1d5fc55d8c0de6d14941c0ae6c30 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 21:45:36 +0700 Subject: [PATCH 441/519] Rewrite neighbor_lists using type(VectorInt) --- src/geometry.F90 | 88 +++++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 61 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index e922479b1d..75165158bf 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -9,6 +9,7 @@ module geometry use particle_header, only: LocalCoord, Particle use particle_restart_write, only: write_particle_restart use surface_header + use stl_vector, only: VectorInt use string, only: to_str use tally, only: score_surface_current @@ -871,81 +872,46 @@ contains subroutine neighbor_lists() - integer :: i ! index in cells/surfaces array - integer :: j ! index of surface in cell - integer :: i_surface ! index in count arrays - integer, allocatable :: count_positive(:) ! # of cells on positive side - integer, allocatable :: count_negative(:) ! # of cells on negative side - logical :: positive ! positive side specified in surface list - type(Cell), pointer :: c + integer :: i ! index in cells/surfaces array + integer :: j ! index in region specification + integer :: k ! surface half-space spec + type(VectorInt), allocatable :: neighbor_pos(:) + type(VectorInt), allocatable :: neighbor_neg(:) call write_message("Building neighboring cells lists for each surface...", & - &4) + 4) - allocate(count_positive(n_surfaces)) - allocate(count_negative(n_surfaces)) - count_positive = 0 - count_negative = 0 + allocate(neighbor_pos(n_surfaces)) + allocate(neighbor_neg(n_surfaces)) do i = 1, n_cells - c => cells(i) + do j = 1, size(cells(i)%region) + ! Get token from region specification and skip any tokens that + ! correspond to operators rather than regions + k = cells(i)%region(j) + if (abs(k) >= OP_UNION) cycle - ! loop over each region specification - do j = 1, size(c%region) - i_surface = c % region(j) - positive = (i_surface > 0) - - ! Skip any tokens that correspond to operators rather than regions - i_surface = abs(i_surface) - if (i_surface >= OP_UNION) cycle - - if (positive) then - count_positive(i_surface) = count_positive(i_surface) + 1 + ! Add this cell ID to neighbor list for k-th surface + if (k > 0) then + call neighbor_pos(abs(k))%push_back(i) else - count_negative(i_surface) = count_negative(i_surface) + 1 + call neighbor_neg(abs(k))%push_back(i) end if end do end do - ! allocate neighbor lists for each surface do i = 1, n_surfaces - if (count_positive(i) > 0) then - allocate(surfaces(i)%obj%neighbor_pos(count_positive(i))) - end if - if (count_negative(i) > 0) then - allocate(surfaces(i)%obj%neighbor_neg(count_negative(i))) - end if + ! Copy positive neighbors to Surface instance + j = neighbor_pos(i)%size() + allocate(surfaces(i)%obj%neighbor_pos(j)) + surfaces(i)%obj%neighbor_pos(:) = neighbor_pos(i)%data(1:j) + + ! Copy negative neighbors to Surface instance + j = neighbor_neg(i)%size() + allocate(surfaces(i)%obj%neighbor_neg(j)) + surfaces(i)%obj%neighbor_neg(:) = neighbor_neg(i)%data(1:j) end do - count_positive = 0 - count_negative = 0 - - ! loop over all cells - do i = 1, n_cells - c => cells(i) - - ! loop through the region specification - do j = 1, size(c%region) - i_surface = c % region(j) - positive = (i_surface > 0) - - ! Skip any tokens that correspond to operators rather than regions - i_surface = abs(i_surface) - if (i_surface >= OP_UNION) cycle - - if (positive) then - count_positive(i_surface) = count_positive(i_surface) + 1 - surfaces(i_surface)%obj%neighbor_pos(count_positive(i_surface)) = i - else - count_negative(i_surface) = count_negative(i_surface) + 1 - surfaces(i_surface)%obj%neighbor_neg(count_negative(i_surface)) = i - end if - end do - end do - - deallocate(count_positive) - deallocate(count_negative) - end subroutine neighbor_lists !=============================================================================== From a3199df9d96d338d245458fed947e41a016ff26d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 7 Oct 2015 22:21:02 +0700 Subject: [PATCH 442/519] Make Nuclide%reactions allocatable by using associate constructs --- src/ace.F90 | 341 +++++++++++++++++++++--------------------- src/ace_header.F90 | 5 +- src/cross_section.F90 | 14 +- src/output.F90 | 47 +++--- src/physics.F90 | 60 ++++---- src/tally.F90 | 197 ++++++++++++------------ 6 files changed, 324 insertions(+), 340 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index dbed667570..4cd53a2519 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -715,7 +715,6 @@ contains integer :: IE ! reaction's starting index on energy grid integer :: NE ! number of energies integer :: NR ! number of interpolation regions - type(Reaction), pointer :: rxn type(ListInt) :: MTs LMT = JXS(3) @@ -733,14 +732,15 @@ contains ! Store elastic scattering cross-section on reaction one -- note that the ! sigma array is not allocated or stored for elastic scattering since it is ! already stored in nuc % elastic - rxn => nuc % reactions(1) - rxn % MT = 2 - rxn % Q_value = ZERO - rxn % multiplicity = 1 - rxn % threshold = 1 - rxn % scatter_in_cm = .true. - rxn % has_angle_dist = .false. - rxn % has_energy_dist = .false. + associate (rxn => nuc % reactions(1)) + rxn % MT = 2 + rxn % Q_value = ZERO + rxn % multiplicity = 1 + rxn % threshold = 1 + rxn % scatter_in_cm = .true. + rxn % has_angle_dist = .false. + rxn % has_energy_dist = .false. + end associate ! Add contribution of elastic scattering to total cross section nuc % total = nuc % total + nuc % elastic @@ -753,64 +753,64 @@ contains i_fission = 0 do i = 1, NMT - rxn => nuc % reactions(i+1) + associate (rxn => nuc % reactions(i+1)) + ! set defaults + rxn % has_angle_dist = .false. + rxn % has_energy_dist = .false. - ! set defaults - rxn % has_angle_dist = .false. - rxn % has_energy_dist = .false. + ! read MT number, Q-value, and neutrons produced + rxn % MT = int(XSS(LMT + i - 1)) + rxn % Q_value = XSS(JXS4 + i - 1) + rxn % multiplicity = abs(nint(XSS(JXS5 + i - 1))) + rxn % scatter_in_cm = (nint(XSS(JXS5 + i - 1)) < 0) - ! read MT number, Q-value, and neutrons produced - rxn % MT = int(XSS(LMT + i - 1)) - rxn % Q_value = XSS(JXS4 + i - 1) - rxn % multiplicity = abs(nint(XSS(JXS5 + i - 1))) - rxn % scatter_in_cm = (nint(XSS(JXS5 + i - 1)) < 0) + ! Read energy-dependent multiplicities + if (rxn % multiplicity > 100) then + ! Set flag and allocate space for Tab1 to store yield + rxn % multiplicity_with_E = .true. + allocate(rxn % multiplicity_E) - ! Read energy-dependent multiplicities - if (rxn % multiplicity > 100) then - ! Set flag and allocate space for Tab1 to store yield - rxn % multiplicity_with_E = .true. - allocate(rxn % multiplicity_E) + XSS_index = JXS(11) + rxn % multiplicity - 101 + NR = nint(XSS(XSS_index)) + rxn % multiplicity_E % n_regions = NR - XSS_index = JXS(11) + rxn % multiplicity - 101 - NR = nint(XSS(XSS_index)) - rxn % multiplicity_E % n_regions = NR + ! allocate space for ENDF interpolation parameters + if (NR > 0) then + allocate(rxn % multiplicity_E % nbt(NR)) + allocate(rxn % multiplicity_E % int(NR)) + end if - ! allocate space for ENDF interpolation parameters - if (NR > 0) then - allocate(rxn % multiplicity_E % nbt(NR)) - allocate(rxn % multiplicity_E % int(NR)) + ! read ENDF interpolation parameters + XSS_index = XSS_index + 1 + if (NR > 0) then + rxn % multiplicity_E % nbt = get_int(NR) + rxn % multiplicity_E % int = get_int(NR) + end if + + ! allocate space for yield data + XSS_index = XSS_index + 2*NR + NE = nint(XSS(XSS_index)) + rxn % multiplicity_E % n_pairs = NE + allocate(rxn % multiplicity_E % x(NE)) + allocate(rxn % multiplicity_E % y(NE)) + + ! read yield data + XSS_index = XSS_index + 1 + rxn % multiplicity_E % x = get_real(NE) + rxn % multiplicity_E % y = get_real(NE) end if - ! read ENDF interpolation parameters - XSS_index = XSS_index + 1 - if (NR > 0) then - rxn % multiplicity_E % nbt = get_int(NR) - rxn % multiplicity_E % int = get_int(NR) - end if + ! read starting energy index + LOCA = int(XSS(LXS + i - 1)) + IE = int(XSS(JXS7 + LOCA - 1)) + rxn % threshold = IE - ! allocate space for yield data - XSS_index = XSS_index + 2*NR - NE = nint(XSS(XSS_index)) - rxn % multiplicity_E % n_pairs = NE - allocate(rxn % multiplicity_E % x(NE)) - allocate(rxn % multiplicity_E % y(NE)) - - ! read yield data - XSS_index = XSS_index + 1 - rxn % multiplicity_E % x = get_real(NE) - rxn % multiplicity_E % y = get_real(NE) - end if - - ! read starting energy index - LOCA = int(XSS(LXS + i - 1)) - IE = int(XSS(JXS7 + LOCA - 1)) - rxn % threshold = IE - - ! read number of energies cross section values - NE = int(XSS(JXS7 + LOCA)) - allocate(rxn % sigma(NE)) - XSS_index = JXS7 + LOCA + 1 - rxn % sigma = get_real(NE) + ! read number of energies cross section values + NE = int(XSS(JXS7 + LOCA)) + allocate(rxn % sigma(NE)) + XSS_index = JXS7 + LOCA + 1 + rxn % sigma = get_real(NE) + end associate end do ! Create set of MT values @@ -821,56 +821,57 @@ contains ! Create total, absorption, and fission cross sections do i = 2, size(nuc % reactions) - rxn => nuc % reactions(i) - IE = rxn % threshold - NE = size(rxn % sigma) + associate (rxn => nuc % reactions(i)) + IE = rxn % threshold + NE = size(rxn % sigma) - ! Skip total inelastic level scattering, gas production cross sections - ! (MT=200+), etc. - if (rxn % MT == N_LEVEL) cycle - if (rxn % MT > N_5N2P .and. rxn % MT < N_P0) cycle + ! Skip total inelastic level scattering, gas production cross sections + ! (MT=200+), etc. + if (rxn % MT == N_LEVEL) cycle + if (rxn % MT > N_5N2P .and. rxn % MT < N_P0) cycle - ! Skip level cross sections if total is available - if (rxn % MT >= N_P0 .and. rxn % MT <= N_PC .and. MTs % contains(N_P)) cycle - if (rxn % MT >= N_D0 .and. rxn % MT <= N_DC .and. MTs % contains(N_D)) cycle - if (rxn % MT >= N_T0 .and. rxn % MT <= N_TC .and. MTs % contains(N_T)) cycle - if (rxn % MT >= N_3HE0 .and. rxn % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle - if (rxn % MT >= N_A0 .and. rxn % MT <= N_AC .and. MTs % contains(N_A)) cycle - if (rxn % MT >= N_2N0 .and. rxn % MT <= N_2NC .and. MTs % contains(N_2N)) cycle + ! Skip level cross sections if total is available + if (rxn % MT >= N_P0 .and. rxn % MT <= N_PC .and. MTs % contains(N_P)) cycle + if (rxn % MT >= N_D0 .and. rxn % MT <= N_DC .and. MTs % contains(N_D)) cycle + if (rxn % MT >= N_T0 .and. rxn % MT <= N_TC .and. MTs % contains(N_T)) cycle + if (rxn % MT >= N_3HE0 .and. rxn % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle + if (rxn % MT >= N_A0 .and. rxn % MT <= N_AC .and. MTs % contains(N_A)) cycle + if (rxn % MT >= N_2N0 .and. rxn % MT <= N_2NC .and. MTs % contains(N_2N)) cycle - ! Add contribution to total cross section - nuc % total(IE:IE+NE-1) = nuc % total(IE:IE+NE-1) + rxn % sigma + ! Add contribution to total cross section + nuc % total(IE:IE+NE-1) = nuc % total(IE:IE+NE-1) + rxn % sigma - ! Add contribution to absorption cross section - if (is_disappearance(rxn % MT)) then - nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma - end if + ! Add contribution to absorption cross section + if (is_disappearance(rxn % MT)) then + nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma + end if - ! Information about fission reactions - if (rxn % MT == N_FISSION) then - allocate(nuc % index_fission(1)) - elseif (rxn % MT == N_F) then - allocate(nuc % index_fission(PARTIAL_FISSION_MAX)) - nuc % has_partial_fission = .true. - end if + ! Information about fission reactions + if (rxn % MT == N_FISSION) then + allocate(nuc % index_fission(1)) + elseif (rxn % MT == N_F) then + allocate(nuc % index_fission(PARTIAL_FISSION_MAX)) + nuc % has_partial_fission = .true. + end if - ! Add contribution to fission cross section - if (is_fission(rxn % MT)) then - nuc % fissionable = .true. - nuc % fission(IE:IE+NE-1) = nuc % fission(IE:IE+NE-1) + rxn % sigma + ! Add contribution to fission cross section + if (is_fission(rxn % MT)) then + nuc % fissionable = .true. + nuc % fission(IE:IE+NE-1) = nuc % fission(IE:IE+NE-1) + rxn % sigma - ! Also need to add fission cross sections to absorption - nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma + ! Also need to add fission cross sections to absorption + nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma - ! If total fission reaction is present, there's no need to store the - ! reaction cross-section since it was copied to nuc % fission - if (rxn % MT == N_FISSION) deallocate(rxn % sigma) + ! If total fission reaction is present, there's no need to store the + ! reaction cross-section since it was copied to nuc % fission + if (rxn % MT == N_FISSION) deallocate(rxn % sigma) - ! Keep track of this reaction for easy searching later - i_fission = i_fission + 1 - nuc % index_fission(i_fission) = i - nuc % n_fission = nuc % n_fission + 1 - end if + ! Keep track of this reaction for easy searching later + i_fission = i_fission + 1 + nuc % index_fission(i_fission) = i + nuc % n_fission = nuc % n_fission + 1 + end if + end associate end do ! Clear MTs set @@ -895,7 +896,6 @@ contains integer :: i ! index in reactions array integer :: j ! index over incoming energies integer :: length ! length of data array to allocate - type(Reaction), pointer :: rxn JXS8 = JXS(8) JXS9 = JXS(9) @@ -903,71 +903,72 @@ contains ! loop over all reactions with secondary neutrons -- NXS(5) does not include ! elastic scattering do i = 1, NXS(5) + 1 - rxn => nuc%reactions(i) + associate (rxn => nuc%reactions(i)) - ! find location of angular distribution - LOCB = int(XSS(JXS8 + i - 1)) - if (LOCB == -1) then - ! Angular distribution data are specified through LAWi = 44 in the DLW - ! block - cycle - elseif (LOCB == 0) then - ! No angular distribution data are given for this reaction, isotropic - ! scattering is asssumed (in CM if TY < 0 and in LAB if TY > 0) - cycle - end if - rxn % has_angle_dist = .true. - - ! allocate space for incoming energies and locations - NE = int(XSS(JXS9 + LOCB - 1)) - rxn % adist % n_energy = NE - allocate(rxn % adist % energy(NE)) - allocate(rxn % adist % type(NE)) - allocate(rxn % adist % location(NE)) - - ! read incoming energy grid and location of nucs - XSS_index = JXS9 + LOCB - rxn % adist % energy = get_real(NE) - rxn % adist % location = get_int(NE) - - ! determine dize of data block - length = 0 - do j = 1, NE - LC = rxn % adist % location(j) - if (LC == 0) then - ! isotropic - rxn % adist % type(j) = ANGLE_ISOTROPIC - elseif (LC > 0) then - ! 32 equiprobable bins - rxn % adist % type(j) = ANGLE_32_EQUI - length = length + 33 - elseif (LC < 0) then - ! tabular distribution - rxn % adist % type(j) = ANGLE_TABULAR - NP = int(XSS(JXS9 + abs(LC))) - length = length + 2 + 3*NP + ! find location of angular distribution + LOCB = int(XSS(JXS8 + i - 1)) + if (LOCB == -1) then + ! Angular distribution data are specified through LAWi = 44 in the DLW + ! block + cycle + elseif (LOCB == 0) then + ! No angular distribution data are given for this reaction, isotropic + ! scattering is asssumed (in CM if TY < 0 and in LAB if TY > 0) + cycle end if - end do + rxn % has_angle_dist = .true. - ! allocate angular distribution data and read - allocate(rxn % adist % data(length)) + ! allocate space for incoming energies and locations + NE = int(XSS(JXS9 + LOCB - 1)) + rxn % adist % n_energy = NE + allocate(rxn % adist % energy(NE)) + allocate(rxn % adist % type(NE)) + allocate(rxn % adist % location(NE)) - ! read angular distribution -- currently this does not actually parse the - ! angular distribution tables for each incoming energy, that must be done - ! on-the-fly - XSS_index = JXS9 + LOCB + 2 * NE - rxn % adist % data = get_real(length) + ! read incoming energy grid and location of nucs + XSS_index = JXS9 + LOCB + rxn % adist % energy = get_real(NE) + rxn % adist % location = get_int(NE) - ! change location pointers since they are currently relative to JXS(9) - LC = LOCB + 2 * NE + 1 - do j = 1, NE - ! For consistency, leave location as 0 if type is isotropic. - ! This is not necessary for current correctness, but can avoid - ! future issues - if (rxn % adist % location(j) /= 0) then - rxn % adist % location(j) = abs(rxn % adist % location(j)) - LC - end if - end do + ! determine dize of data block + length = 0 + do j = 1, NE + LC = rxn % adist % location(j) + if (LC == 0) then + ! isotropic + rxn % adist % type(j) = ANGLE_ISOTROPIC + elseif (LC > 0) then + ! 32 equiprobable bins + rxn % adist % type(j) = ANGLE_32_EQUI + length = length + 33 + elseif (LC < 0) then + ! tabular distribution + rxn % adist % type(j) = ANGLE_TABULAR + NP = int(XSS(JXS9 + abs(LC))) + length = length + 2 + 3*NP + end if + end do + + ! allocate angular distribution data and read + allocate(rxn % adist % data(length)) + + ! read angular distribution -- currently this does not actually parse the + ! angular distribution tables for each incoming energy, that must be done + ! on-the-fly + XSS_index = JXS9 + LOCB + 2 * NE + rxn % adist % data = get_real(length) + + ! change location pointers since they are currently relative to JXS(9) + LC = LOCB + 2 * NE + 1 + do j = 1, NE + ! For consistency, leave location as 0 if type is isotropic. + ! This is not necessary for current correctness, but can avoid + ! future issues + if (rxn % adist % location(j) /= 0) then + rxn % adist % location(j) = abs(rxn % adist % location(j)) - LC + end if + end do + end associate end do end subroutine read_angular_dist @@ -983,23 +984,23 @@ contains integer :: LED ! location of energy distribution locators integer :: LOCC ! location of energy distributions for given MT integer :: i ! loop index - type(Reaction), pointer :: rxn LED = JXS(10) ! Loop over all reactions do i = 1, NXS(5) - rxn => nuc % reactions(i+1) ! skip over elastic scattering - rxn % has_energy_dist = .true. + associate (rxn => nuc % reactions(i+1)) ! skip over elastic scattering + rxn % has_energy_dist = .true. - ! find location of energy distribution data - LOCC = int(XSS(LED + i - 1)) + ! find location of energy distribution data + LOCC = int(XSS(LED + i - 1)) - ! allocate energy distribution - allocate(rxn % edist) + ! allocate energy distribution + allocate(rxn % edist) - ! read data for energy distribution - call get_energy_dist(rxn % edist, LOCC) + ! read data for energy distribution + call get_energy_dist(rxn % edist, LOCC) + end associate end do end subroutine read_energy_dist diff --git a/src/ace_header.F90 b/src/ace_header.F90 index a10c6fe87c..9eadca594b 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -146,7 +146,7 @@ module ace_header ! Reactions integer :: n_reaction ! # of reactions - type(Reaction), pointer :: reactions(:) => null() + type(Reaction), allocatable :: reactions(:) type(DictIntInt) :: reaction_index ! map MT values to index in reactions ! array; used at tally-time @@ -341,11 +341,10 @@ module ace_header end if if (associated(this % urr_data)) then - call this % urr_data % clear() deallocate(this % urr_data) end if - if (associated(this % reactions)) then + if (allocated(this % reactions)) then do i = 1, size(this % reactions) call this % reactions(i) % clear() end do diff --git a/src/cross_section.F90 b/src/cross_section.F90 index b9c76b503c..03bcefca8f 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -379,7 +379,6 @@ contains logical :: same_nuc ! do we know the xs for this nuclide at this energy? type(UrrData), pointer :: urr type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn micro_xs(i_nuclide) % use_ptable = .true. @@ -475,18 +474,17 @@ contains ! Determine treatment of inelastic scattering inelastic = ZERO if (urr % inelastic_flag > 0) then - ! Get pointer to inelastic scattering reaction - rxn => nuc % reactions(nuc % urr_inelastic) - ! Get index on energy grid and interpolation factor i_energy = micro_xs(i_nuclide) % index_grid f = micro_xs(i_nuclide) % interp_factor ! Determine inelastic scattering cross section - if (i_energy >= rxn % threshold) then - inelastic = (ONE - f) * rxn % sigma(i_energy - rxn%threshold + 1) + & - f * rxn % sigma(i_energy - rxn%threshold + 2) - end if + associate (rxn => nuc % reactions(nuc % urr_inelastic)) + if (i_energy >= rxn % threshold) then + inelastic = (ONE - f) * rxn % sigma(i_energy - rxn%threshold + 1) + & + f * rxn % sigma(i_energy - rxn%threshold + 2) + end if + end associate end if ! Multiply by smooth cross-section if needed diff --git a/src/output.F90 b/src/output.F90 index 2aa90985a7..19ae6268be 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -330,7 +330,6 @@ contains integer :: size_energy ! memory used for a energy distributions (bytes) integer :: size_urr ! memory used for probability tables (bytes) character(11) :: law ! secondary energy distribution law - type(Reaction), pointer :: rxn type(UrrData), pointer :: urr ! set default unit for writing information @@ -359,32 +358,32 @@ contains ! Information on each reaction write(unit_,*) ' Reaction Q-value COM Law IE size(angle) size(energy)' do i = 1, nuc % n_reaction - rxn => nuc % reactions(i) + associate (rxn => nuc % reactions(i)) + ! Determine size of angle distribution + if (rxn % has_angle_dist) then + size_angle = rxn % adist % n_energy * 16 + size(rxn % adist % data) * 8 + else + size_angle = 0 + end if - ! Determine size of angle distribution - if (rxn % has_angle_dist) then - size_angle = rxn % adist % n_energy * 16 + size(rxn % adist % data) * 8 - else - size_angle = 0 - end if + ! Determine size of energy distribution and law + if (rxn % has_energy_dist) then + size_energy = size(rxn % edist % data) * 8 + law = to_str(rxn % edist % law) + else + size_energy = 0 + law = 'None' + end if - ! Determine size of energy distribution and law - if (rxn % has_energy_dist) then - size_energy = size(rxn % edist % data) * 8 - law = to_str(rxn % edist % law) - else - size_energy = 0 - law = 'None' - end if + write(unit_,'(3X,A11,1X,F8.3,3X,L1,3X,A4,1X,I6,1X,I11,1X,I11)') & + reaction_name(rxn % MT), rxn % Q_value, rxn % scatter_in_cm, & + law(1:4), rxn % threshold, size_angle, size_energy - write(unit_,'(3X,A11,1X,F8.3,3X,L1,3X,A4,1X,I6,1X,I11,1X,I11)') & - reaction_name(rxn % MT), rxn % Q_value, rxn % scatter_in_cm, & - law(1:4), rxn % threshold, size_angle, size_energy - - ! Accumulate data size - size_xs = size_xs + (nuc % n_grid - rxn%threshold + 1) * 8 - size_angle_total = size_angle_total + size_angle - size_energy_total = size_energy_total + size_energy + ! Accumulate data size + size_xs = size_xs + (nuc % n_grid - rxn%threshold + 1) * 8 + size_angle_total = size_angle_total + size_angle + size_energy_total = size_energy_total + size_energy + end associate end do ! Add memory required for summary reactions (total, absorption, fission, diff --git a/src/physics.F90 b/src/physics.F90 index c06919758a..a01a3a30cb 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -185,7 +185,6 @@ contains !=============================================================================== subroutine sample_fission(i_nuclide, i_reaction) - integer, intent(in) :: i_nuclide ! index in nuclides array integer, intent(out) :: i_reaction ! index in nuc % reactions array @@ -195,7 +194,6 @@ contains real(8) :: prob real(8) :: cutoff type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn ! Get pointer to nuclide nuc => nuclides(i_nuclide) @@ -220,14 +218,15 @@ contains FISSION_REACTION_LOOP: do i = 1, nuc % n_fission i_reaction = nuc % index_fission(i) - rxn => nuc % reactions(i_reaction) - ! if energy is below threshold for this reaction, skip it - if (i_grid < rxn % threshold) cycle + associate (rxn => nuc % reactions(i_reaction)) + ! if energy is below threshold for this reaction, skip it + if (i_grid < rxn % threshold) cycle - ! add to cumulative probability - prob = prob + ((ONE - f)*rxn%sigma(i_grid - rxn%threshold + 1) & - + f*(rxn%sigma(i_grid - rxn%threshold + 2))) + ! add to cumulative probability + prob = prob + ((ONE - f)*rxn%sigma(i_grid - rxn%threshold + 1) & + + f*(rxn%sigma(i_grid - rxn%threshold + 2))) + end associate ! Create fission bank sites if fission occurs if (prob > cutoff) exit FISSION_REACTION_LOOP @@ -312,11 +311,10 @@ contains real(8) :: f real(8) :: prob real(8) :: cutoff - type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn real(8) :: uvw_new(3) ! outgoing uvw for iso-in-lab scattering real(8) :: uvw_old(3) ! incoming uvw for iso-in-lab scattering real(8) :: phi ! azimuthal angle for iso-in-lab scattering + type(Nuclide), pointer :: nuc ! copy incoming direction uvw_old(:) = p % coord(1) % uvw @@ -343,11 +341,8 @@ contains p % E, p % coord(1) % uvw, p % mu) else - ! get pointer to elastic scattering reaction - rxn => nuc % reactions(1) - ! Perform collision physics for elastic scattering - call elastic_scatter(i_nuclide, rxn, & + call elastic_scatter(i_nuclide, nuc % reactions(1), & p % E, p % coord(1) % uvw, p % mu, p % wgt) end if @@ -370,28 +365,28 @@ contains &// trim(nuc % name)) end if - rxn => nuc % reactions(i) + associate (rxn => nuc % reactions(i)) + ! Skip fission reactions + if (rxn % MT == N_FISSION .or. rxn % MT == N_F .or. rxn % MT == N_NF & + .or. rxn % MT == N_2NF .or. rxn % MT == N_3NF) cycle - ! Skip fission reactions - if (rxn % MT == N_FISSION .or. rxn % MT == N_F .or. rxn % MT == N_NF & - .or. rxn % MT == N_2NF .or. rxn % MT == N_3NF) cycle + ! some materials have gas production cross sections with MT > 200 that + ! are duplicates. Also MT=4 is total level inelastic scattering which + ! should be skipped + if (rxn % MT >= 200 .or. rxn % MT == N_LEVEL) cycle - ! some materials have gas production cross sections with MT > 200 that - ! are duplicates. Also MT=4 is total level inelastic scattering which - ! should be skipped - if (rxn % MT >= 200 .or. rxn % MT == N_LEVEL) cycle + ! if energy is below threshold for this reaction, skip it + if (i_grid < rxn % threshold) cycle - ! if energy is below threshold for this reaction, skip it - if (i_grid < rxn % threshold) cycle - - ! add to cumulative probability - prob = prob + ((ONE - f)*rxn%sigma(i_grid - rxn%threshold + 1) & - + f*(rxn%sigma(i_grid - rxn%threshold + 2))) + ! add to cumulative probability + prob = prob + ((ONE - f)*rxn%sigma(i_grid - rxn%threshold + 1) & + + f*(rxn%sigma(i_grid - rxn%threshold + 2))) + end associate end do ! Perform collision physics for inelastic scattering - call inelastic_scatter(nuc, rxn, p) - p % event_MT = rxn % MT + call inelastic_scatter(nuc, nuc%reactions(i), p) + p % event_MT = nuc%reactions(i)%MT end if @@ -1090,11 +1085,9 @@ contains real(8) :: weight ! weight adjustment for ufs method logical :: in_mesh ! source site in ufs mesh? type(Nuclide), pointer :: nuc - type(Reaction), pointer :: rxn ! Get pointers nuc => nuclides(i_nuclide) - rxn => nuc % reactions(i_reaction) ! TODO: Heat generation from fission @@ -1165,7 +1158,8 @@ contains ! Sample secondary energy distribution for fission reaction and set energy ! in fission bank - fission_bank(i) % E = sample_fission_energy(nuc, rxn, p) + fission_bank(i) % E = sample_fission_energy(nuc, nuc%reactions(& + i_reaction), p) ! Set the delayed group of the neutron fission_bank(i) % delayed_group = p % delayed_group diff --git a/src/tally.F90 b/src/tally.F90 index 2f178fe464..4790a9900c 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -66,9 +66,6 @@ contains real(8) :: macro_scatt ! material macro scatt xs real(8) :: uvw(3) ! particle direction real(8) :: E ! particle energy - type(Material), pointer :: mat - type(Reaction), pointer :: rxn - type(Nuclide), pointer :: nuc i = 0 SCORE_LOOP: do q = 1, t % n_user_score_bins @@ -220,24 +217,20 @@ contains ! of one. score = p % last_wgt else - do m = 1, nuclides(p % event_nuclide) % n_reaction - ! Check if this is the desired MT - if (p % event_MT == nuclides(p % event_nuclide) % reactions(m) % MT) then - ! Found the reaction, set our pointer and move on with life - rxn => nuclides(p % event_nuclide) % reactions(m) - exit - end if - end do + m = nuclides(p%event_nuclide)%reaction_index% & + get_key(p % event_MT) ! Get multiplicity and apply to score - if (rxn % multiplicity_with_E) then - ! Then the multiplicity was already incorporated in to p % wgt - ! per the scattering routine, - score = p % wgt - else - ! Grab the multiplicity from the rxn - score = p % last_wgt * rxn % multiplicity - end if + associate (rxn => nuclides(p%event_nuclide)%reactions(m)) + if (rxn % multiplicity_with_E) then + ! Then the multiplicity was already incorporated in to p % wgt + ! per the scattering routine, + score = p % wgt + else + ! Grab the multiplicity from the rxn + score = p % last_wgt * rxn % multiplicity + end if + end associate end if @@ -257,24 +250,20 @@ contains ! of one. score = p % last_wgt else - do m = 1, nuclides(p % event_nuclide) % n_reaction - ! Check if this is the desired MT - if (p % event_MT == nuclides(p % event_nuclide) % reactions(m) % MT) then - ! Found the reaction, set our pointer and move on with life - rxn => nuclides(p % event_nuclide) % reactions(m) - exit - end if - end do + m = nuclides(p%event_nuclide)%reaction_index% & + get_key(p % event_MT) ! Get multiplicity and apply to score - if (rxn % multiplicity_with_E) then - ! Then the multiplicity was already incorporated in to p % wgt - ! per the scattering routine, - score = p % wgt - else - ! Grab the multiplicity from the rxn - score = p % last_wgt * rxn % multiplicity - end if + associate (rxn => nuclides(p%event_nuclide)%reactions(m)) + if (rxn % multiplicity_with_E) then + ! Then the multiplicity was already incorporated in to p % wgt + ! per the scattering routine, + score = p % wgt + else + ! Grab the multiplicity from the rxn + score = p % last_wgt * rxn % multiplicity + end if + end associate end if @@ -294,24 +283,20 @@ contains ! of one. score = p % last_wgt else - do m = 1, nuclides(p % event_nuclide) % n_reaction - ! Check if this is the desired MT - if (p % event_MT == nuclides(p % event_nuclide) % reactions(m) % MT) then - ! Found the reaction, set our pointer and move on with life - rxn => nuclides(p % event_nuclide) % reactions(m) - exit - end if - end do + m = nuclides(p%event_nuclide)%reaction_index% & + get_key(p % event_MT) ! Get multiplicity and apply to score - if (rxn % multiplicity_with_E) then - ! Then the multiplicity was already incorporated in to p % wgt - ! per the scattering routine, - score = p % wgt - else - ! Grab the multiplicity from the rxn - score = p % last_wgt * rxn % multiplicity - end if + associate (rxn => nuclides(p%event_nuclide)%reactions(m)) + if (rxn % multiplicity_with_E) then + ! Then the multiplicity was already incorporated in to p % wgt + ! per the scattering routine, + score = p % wgt + else + ! Grab the multiplicity from the rxn + score = p % last_wgt * rxn % multiplicity + end if + end associate end if @@ -466,9 +451,6 @@ contains ! delayed-nu-fission if (micro_xs(p % event_nuclide) % absorption > ZERO) then - ! Get the event nuclide - nuc => nuclides(p % event_nuclide) - ! Check if the delayed group filter is present if (dg_filter > 0) then @@ -480,11 +462,11 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) ! Compute the yield for this delayed group - yield = yield_delayed(nuc, E, d) + yield = yield_delayed(nuclides(p % event_nuclide), E, d) ! Compute the score and tally to bin score = p % absorb_wgt * yield * micro_xs(p % event_nuclide) & - % fission * nu_delayed(nuc, E) / & + % fission * nu_delayed(nuclides(p % event_nuclide), E) / & micro_xs(p % event_nuclide) % absorption call score_fission_delayed_dg(t, d_bin, score, score_index) end do @@ -494,7 +476,7 @@ contains ! by multiplying the absorbed weight by the fraction of the ! delayed-nu-fission xs to the absorption xs score = p % absorb_wgt * micro_xs(p % event_nuclide) & - % fission * nu_delayed(nuc, E) / & + % fission * nu_delayed(nuclides(p % event_nuclide), E) / & micro_xs(p % event_nuclide) % absorption end if end if @@ -535,9 +517,6 @@ contains ! Check if tally is on a single nuclide if (i_nuclide > 0) then - ! Get the nuclide of interest - nuc => nuclides(i_nuclide) - ! Check if the delayed group filter is present if (dg_filter > 0) then @@ -548,11 +527,19 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) ! Compute the yield for this delayed group +<<<<<<< HEAD yield = yield_delayed(nuc, E, d) ! Compute the score and tally to bin score = micro_xs(i_nuclide) % fission * yield & * nu_delayed(nuc, E) * atom_density * flux +======= + yield = yield_delayed(nuclides(i_nuclide), p % E, d) + + ! Compute the score and tally to bin + score = micro_xs(i_nuclide) % fission * yield & + * nu_delayed(nuclides(i_nuclide), p % E) * atom_density * flux +>>>>>>> Make Nuclide%reactions allocatable by using associate constructs call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP @@ -560,27 +547,29 @@ contains ! If the delayed group filter is not present, compute the score ! by multiplying the delayed-nu-fission macro xs by the flux +<<<<<<< HEAD score = micro_xs(i_nuclide) % fission * nu_delayed(nuc, E)& * atom_density * flux +======= + score = micro_xs(i_nuclide) % fission * & + nu_delayed(nuclides(i_nuclide), p % E) * atom_density * flux +>>>>>>> Make Nuclide%reactions allocatable by using associate constructs end if ! Tally is on total nuclides else - ! Get pointer to current material - mat => materials(p % material) - ! Check if the delayed group filter is present if (dg_filter > 0) then ! Loop over all nuclides in the current material - do l = 1, mat % n_nuclides + do l = 1, materials(p % material) % n_nuclides ! Get atom density - atom_density_ = mat % atom_density(l) + atom_density_ = materials(p % material) % atom_density(l) ! Get index in nuclides array - i_nuc = mat % nuclide(l) + i_nuc = materials(p % material) % nuclide(l) ! Loop over all delayed group bins and tally to them individually do d_bin = 1, t % filters(dg_filter) % n_bins @@ -588,15 +577,20 @@ contains ! Get the delayed group for this bin d = t % filters(dg_filter) % int_bins(d_bin) - ! Get the current nuclide - nuc => nuclides(i_nuc) - ! Get the yield for the desired nuclide and delayed group +<<<<<<< HEAD yield = yield_delayed(nuc, E, d) ! Compute the score and tally to bin score = micro_xs(i_nuc) % fission * yield & * nu_delayed(nuc, E) * atom_density_ * flux +======= + yield = yield_delayed(nuclides(i_nuc), p % E, d) + + ! Compute the score and tally to bin + score = micro_xs(i_nuc) % fission * yield & + * nu_delayed(nuclides(i_nuc), p % E) * atom_density_ * flux +>>>>>>> Make Nuclide%reactions allocatable by using associate constructs call score_fission_delayed_dg(t, d_bin, score, score_index) end do end do @@ -606,13 +600,13 @@ contains score = ZERO ! Loop over all nuclides in the current material - do l = 1, mat % n_nuclides + do l = 1, materials(p % material) % n_nuclides ! Get atom density - atom_density_ = mat % atom_density(l) + atom_density_ = materials(p % material) % atom_density(l) ! Get index in nuclides array - i_nuc = mat % nuclide(l) + i_nuc = materials(p % material) % nuclide(l) ! Accumulate the contribution from each nuclide score = score + micro_xs(i_nuc) % fission & @@ -693,42 +687,41 @@ contains if (i_nuclide > 0) then if (nuclides(i_nuclide)%reaction_index%has_key(score_bin)) then m = nuclides(i_nuclide)%reaction_index%get_key(score_bin) - rxn => nuclides(i_nuclide) % reactions(m) - - ! Retrieve index on nuclide energy grid and interpolation - ! factor - i_energy = micro_xs(i_nuclide) % index_grid - f = micro_xs(i_nuclide) % interp_factor - if (i_energy >= rxn % threshold) then - score = ((ONE - f) * rxn % sigma(i_energy - & - rxn%threshold + 1) + f * rxn % sigma(i_energy - & - rxn%threshold + 2)) * atom_density * flux - end if - end if - - else - ! Get pointer to current material - mat => materials(p % material) - do l = 1, mat % n_nuclides - ! Get atom density - atom_density_ = mat % atom_density(l) - - ! Get index in nuclides array - i_nuc = mat % nuclide(l) - - if (nuclides(i_nuc)%reaction_index%has_key(score_bin)) then - m = nuclides(i_nuc)%reaction_index%get_key(score_bin) - rxn => nuclides(i_nuc) % reactions(m) + associate (rxn => nuclides(i_nuclide) % reactions(m)) ! Retrieve index on nuclide energy grid and interpolation ! factor - i_energy = micro_xs(i_nuc) % index_grid - f = micro_xs(i_nuc) % interp_factor + i_energy = micro_xs(i_nuclide) % index_grid + f = micro_xs(i_nuclide) % interp_factor if (i_energy >= rxn % threshold) then - score = score + ((ONE - f) * rxn % sigma(i_energy - & + score = ((ONE - f) * rxn % sigma(i_energy - & rxn%threshold + 1) + f * rxn % sigma(i_energy - & - rxn%threshold + 2)) * atom_density_ * flux + rxn%threshold + 2)) * atom_density * flux end if + end associate + end if + + else + do l = 1, materials(p % material) % n_nuclides + ! Get atom density + atom_density_ = materials(p % material) % atom_density(l) + + ! Get index in nuclides array + i_nuc = materials(p % material) % nuclide(l) + + if (nuclides(i_nuc)%reaction_index%has_key(score_bin)) then + m = nuclides(i_nuc)%reaction_index%get_key(score_bin) + associate (rxn => nuclides(i_nuc) % reactions(m)) + ! Retrieve index on nuclide energy grid and interpolation + ! factor + i_energy = micro_xs(i_nuc) % index_grid + f = micro_xs(i_nuc) % interp_factor + if (i_energy >= rxn % threshold) then + score = score + ((ONE - f) * rxn % sigma(i_energy - & + rxn%threshold + 1) + f * rxn % sigma(i_energy - & + rxn%threshold + 2)) * atom_density_ * flux + end if + end associate end if end do end if From 441fd4f00dfb3cd6f79abc0ad2887b04dd5dbfd8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 30 Oct 2015 15:47:01 -0500 Subject: [PATCH 443/519] Don't pre-compute kappa-fission cross sections. This also fixes a bug in the kappa-fission score. Before, kappa-fission was computed as Q*fission, but this was done before URR cross sections were determined. Thus, if fission changed in calculate_urr_xs, this wasn't reflected in the kappa-fission score. Now, since it is all done at tally-time, there is no inconsistency. --- src/ace_header.F90 | 2 - src/cross_section.F90 | 13 --- src/tally.F90 | 86 ++++++++++--------- tests/test_many_scores/results_true.dat | 4 +- .../test_score_kappafission/results_true.dat | 20 ++--- 5 files changed, 59 insertions(+), 66 deletions(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 9eadca594b..6c27747d8a 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -258,7 +258,6 @@ module ace_header real(8) :: absorption ! microscopic absorption xs real(8) :: fission ! microscopic fission xs real(8) :: nu_fission ! microscopic production xs - real(8) :: kappa_fission ! microscopic energy-released from fission ! Information for S(a,b) use integer :: index_sab ! index in sab_tables (zero means no table) @@ -281,7 +280,6 @@ module ace_header real(8) :: absorption ! macroscopic absorption xs real(8) :: fission ! macroscopic fission xs real(8) :: nu_fission ! macroscopic production xs - real(8) :: kappa_fission ! macroscopic energy-released from fission end type MaterialMacroXS contains diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 03bcefca8f..969a397f02 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -41,7 +41,6 @@ contains material_xs % absorption = ZERO material_xs % fission = ZERO material_xs % nu_fission = ZERO - material_xs % kappa_fission = ZERO ! Exit subroutine if material is void if (p % material == MATERIAL_VOID) return @@ -125,10 +124,6 @@ contains ! Add contributions to material macroscopic nu-fission cross section material_xs % nu_fission = material_xs % nu_fission + & atom_density * micro_xs(i_nuclide) % nu_fission - - ! Add contributions to material macroscopic energy release from fission - material_xs % kappa_fission = material_xs % kappa_fission + & - atom_density * micro_xs(i_nuclide) % kappa_fission end do end subroutine calculate_xs @@ -216,7 +211,6 @@ contains ! Initialize nuclide cross-sections to zero micro_xs(i_nuclide) % fission = ZERO micro_xs(i_nuclide) % nu_fission = ZERO - micro_xs(i_nuclide) % kappa_fission = ZERO ! Calculate microscopic nuclide total cross section micro_xs(i_nuclide) % total = (ONE - f) * nuc % total(i_grid) & @@ -238,13 +232,6 @@ contains ! Calculate microscopic nuclide nu-fission cross section micro_xs(i_nuclide) % nu_fission = (ONE - f) * nuc % nu_fission( & i_grid) + f * nuc % nu_fission(i_grid+1) - - ! Calculate microscopic nuclide kappa-fission cross section - ! The ENDF standard (ENDF-102) states that MT 18 stores - ! the fission energy as the Q_value (fission(1)) - micro_xs(i_nuclide) % kappa_fission = & - nuc % reactions(nuc % index_fission(1)) % Q_value * & - micro_xs(i_nuclide) % fission end if ! If there is S(a,b) data for this nuclide, we need to do a few diff --git a/src/tally.F90 b/src/tally.F90 index 4790a9900c..c4ca2028bd 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -527,19 +527,11 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) ! Compute the yield for this delayed group -<<<<<<< HEAD - yield = yield_delayed(nuc, E, d) + yield = yield_delayed(nuclides(i_nuclide), E, d) ! Compute the score and tally to bin score = micro_xs(i_nuclide) % fission * yield & - * nu_delayed(nuc, E) * atom_density * flux -======= - yield = yield_delayed(nuclides(i_nuclide), p % E, d) - - ! Compute the score and tally to bin - score = micro_xs(i_nuclide) % fission * yield & - * nu_delayed(nuclides(i_nuclide), p % E) * atom_density * flux ->>>>>>> Make Nuclide%reactions allocatable by using associate constructs + * nu_delayed(nuclides(i_nuclide), E) * atom_density * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do cycle SCORE_LOOP @@ -547,13 +539,8 @@ contains ! If the delayed group filter is not present, compute the score ! by multiplying the delayed-nu-fission macro xs by the flux -<<<<<<< HEAD - score = micro_xs(i_nuclide) % fission * nu_delayed(nuc, E)& - * atom_density * flux -======= score = micro_xs(i_nuclide) % fission * & - nu_delayed(nuclides(i_nuclide), p % E) * atom_density * flux ->>>>>>> Make Nuclide%reactions allocatable by using associate constructs + nu_delayed(nuclides(i_nuclide), E) * atom_density * flux end if ! Tally is on total nuclides @@ -578,19 +565,11 @@ contains d = t % filters(dg_filter) % int_bins(d_bin) ! Get the yield for the desired nuclide and delayed group -<<<<<<< HEAD - yield = yield_delayed(nuc, E, d) + yield = yield_delayed(nuclides(i_nuc), E, d) ! Compute the score and tally to bin score = micro_xs(i_nuc) % fission * yield & - * nu_delayed(nuc, E) * atom_density_ * flux -======= - yield = yield_delayed(nuclides(i_nuc), p % E, d) - - ! Compute the score and tally to bin - score = micro_xs(i_nuc) % fission * yield & - * nu_delayed(nuclides(i_nuc), p % E) * atom_density_ * flux ->>>>>>> Make Nuclide%reactions allocatable by using associate constructs + * nu_delayed(nuclides(i_nuc), E) * atom_density_ * flux call score_fission_delayed_dg(t, d_bin, score, score_index) end do end do @@ -618,38 +597,67 @@ contains case (SCORE_KAPPA_FISSION) + ! Determine kappa-fission cross section on the fly. The ENDF standard + ! (ENDF-102) states that MT 18 stores the fission energy as the Q_value + ! (fission(1)) + + score = ZERO + if (t % estimator == ESTIMATOR_ANALOG) then if (survival_biasing) then ! No fission events occur if survival biasing is on -- need to ! calculate fraction of absorptions that would have resulted in ! fission scale by kappa-fission - if (micro_xs(p % event_nuclide) % absorption > ZERO) then - score = p % absorb_wgt * & - micro_xs(p % event_nuclide) % kappa_fission / & - micro_xs(p % event_nuclide) % absorption - else - score = ZERO - end if + associate (nuc => nuclides(p % event_nuclide)) + if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & + nuc % fissionable) then + score = p % absorb_wgt * & + nuc%reactions(nuc%index_fission(1))%Q_value * & + micro_xs(p % event_nuclide) % fission / & + micro_xs(p % event_nuclide) % absorption + end if + end associate else ! Skip any non-absorption events if (p % event == EVENT_SCATTER) cycle SCORE_LOOP ! All fission events will contribute, so again we can use ! particle's weight entering the collision as the estimate for ! the fission energy production rate - score = p % last_wgt * & - micro_xs(p % event_nuclide) % kappa_fission / & - micro_xs(p % event_nuclide) % absorption + associate (nuc => nuclides(p % event_nuclide)) + if (nuc % fissionable) then + score = p % last_wgt * & + nuc%reactions(nuc%index_fission(1))%Q_value * & + micro_xs(p % event_nuclide) % fission / & + micro_xs(p % event_nuclide) % absorption + end if + end associate end if else if (i_nuclide > 0) then - score = micro_xs(i_nuclide) % kappa_fission * atom_density * flux + associate (nuc => nuclides(i_nuclide)) + if (nuc % fissionable) then + score = nuc%reactions(nuc%index_fission(1))%Q_value * & + micro_xs(i_nuclide)%fission * atom_density * flux + end if + end associate else - score = material_xs % kappa_fission * flux + do l = 1, materials(p%material)%n_nuclides + ! Determine atom density and index of nuclide + atom_density_ = materials(p%material)%atom_density(l) + i_nuc = materials(p%material)%nuclide(l) + + ! If nuclide is fissionable, accumulate kappa fission + associate(nuc => nuclides(i_nuc)) + if (nuc % fissionable) then + score = score + nuc%reactions(nuc%index_fission(1))%Q_value * & + micro_xs(i_nuc)%fission * atom_density_ * flux + end if + end associate + end do end if end if - case (SCORE_EVENTS) ! Simply count number of scoring events score = ONE diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index 9309d0964f..0d5dd6e32e 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -33,8 +33,8 @@ tally 1: 7.620560E-01 1.816851E+00 1.102658E+00 -1.338067E+02 -5.986137E+03 +1.337996E+02 +5.985519E+03 2.247257E+01 1.683779E+02 1.512960E-01 diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index 75d37cd87e..976eefa36e 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -1,17 +1,17 @@ k-combined: 9.903196E-01 4.279617E-02 tally 1: -2.266048E+02 -1.049833E+04 +2.266169E+02 +1.049923E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.366139E+02 -3.859561E+03 +1.366590E+02 +3.861651E+03 tally 2: -2.402814E+02 -1.174003E+04 +2.403775E+02 +1.175130E+04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -19,11 +19,11 @@ tally 2: 1.270420E+02 3.297537E+03 tally 3: -2.217075E+02 -1.003168E+04 +2.217588E+02 +1.003581E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.375693E+02 -3.872389E+03 +1.376303E+02 +3.875598E+03 From f17a1f436a9e320910034b2699dabcb0287245e3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 11 Nov 2015 11:42:59 -0600 Subject: [PATCH 444/519] Damn you gfortran 4.6. Comment out a perfectly-legitimate deallocate. --- src/ace_header.F90 | 7 ------- src/endf_header.F90 | 22 ---------------------- src/global.F90 | 7 ++++++- 3 files changed, 6 insertions(+), 30 deletions(-) diff --git a/src/ace_header.F90 b/src/ace_header.F90 index 6c27747d8a..985371ff18 100644 --- a/src/ace_header.F90 +++ b/src/ace_header.F90 @@ -292,12 +292,6 @@ module ace_header class(DistEnergy), intent(inout) :: this ! The DistEnergy object to clear - ! Clear p_valid - call this % p_valid % clear() - - if (allocated(this % data)) & - deallocate(this % data) - if (associated(this % next)) then ! recursively clear this item call this % next % clear() @@ -346,7 +340,6 @@ module ace_header do i = 1, size(this % reactions) call this % reactions(i) % clear() end do - deallocate(this % reactions) end if call this % reaction_index % clear() diff --git a/src/endf_header.F90 b/src/endf_header.F90 index 54af0f7383..af62231a5d 100644 --- a/src/endf_header.F90 +++ b/src/endf_header.F90 @@ -13,28 +13,6 @@ module endf_header integer :: n_pairs ! # of pairs of (x,y) values real(8), allocatable :: x(:) ! values of abscissa real(8), allocatable :: y(:) ! values of ordinate - - ! Type-Bound procedures - contains - procedure :: clear => tab1_clear ! deallocates a Tab1 Object. end type Tab1 - contains - -!=============================================================================== -! TAB1_CLEAR deallocates the items in Tab1 -!=============================================================================== - - subroutine tab1_clear(this) - - class(Tab1), intent(inout) :: this ! The Tab1 to clear - - if (allocated(this % nbt)) & - deallocate(this % nbt, this % int) - - if (allocated(this % x)) & - deallocate(this % x, this % y) - - end subroutine tab1_clear - end module endf_header diff --git a/src/global.F90 b/src/global.F90 index 1d8099630c..88ace73b6d 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -436,7 +436,12 @@ contains do i = 1, size(nuclides) call nuclides(i) % clear() end do - deallocate(nuclides) + + ! WARNING: The following statement should work but doesn't under gfortran + ! 4.6 because of a bug. Technically, commenting this out leaves a memory + ! leak. + + ! deallocate(nuclides) end if if (allocated(nuclides_0K)) then From 3ff40987c029066767fbae408959c559f6f60b03 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 11 Nov 2015 14:07:31 -0500 Subject: [PATCH 445/519] Refactored MGXS.get_pandas_dataframe(...) group indices for energyout filters --- openmc/mgxs/mgxs.py | 36 +- .../results_true.dat | 98 +- .../results_true.dat | 220 +- .../results_true.dat | 3312 ++++++++--------- tests/test_track_output/results_test.dat | 9 + 5 files changed, 1847 insertions(+), 1828 deletions(-) create mode 100644 tests/test_track_output/results_test.dat diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 4a5ca74035..96fb6e07ee 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1224,21 +1224,31 @@ class MGXS(object): else: df = df.drop('score', axis=1) - # Rename energy(out) columns - columns = [] - if 'energy [MeV]' in df: - df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) - columns.append('group in') - if 'energyout [MeV]' in df: - df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) - columns.append('group out') - - # Loop over all energy groups and override the bounds with indices + # Override energy groups bounds with indices groups = np.arange(self.num_groups, 0, -1, dtype=np.int) groups = np.repeat(groups, self.num_nuclides) - groups = np.tile(groups, self.num_subdomains) - for column in columns: - df[column] = groups + if 'energy [MeV]' in df and 'energyout [MeV]' in df: + df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) + in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.repeat(in_groups, self.num_groups) + df['group in'] = in_groups + + df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) + out_groups = np.tile(groups, self.num_subdomains * self.num_groups) + df['group out'] = out_groups + columns = ['group in', 'group out'] + + elif 'energyout [MeV]' in df: + df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) + in_groups = np.tile(groups, self.num_subdomains) + df['group out'] = in_groups + columns = ['group out'] + + elif 'energy [MeV]' in df: + df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) + in_groups = np.tile(groups, self.num_subdomains) + df['group in'] = in_groups + columns = ['group in'] # Select out those groups the user requested if groups != 'all': diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index 9549f16c86..45891fc300 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,49 +1,49 @@ - material group in nuclide mean std. dev. -0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. -0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. -0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. -0 1 1 total 1 0.119622 material group in nuclide mean std. dev. -0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. -0 2 1 total 0 0 material group in group out nuclide mean std. dev. -0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. -0 2 1 total 0 0 material group in nuclide mean std. dev. -0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. -0 3 1 total 0 0 material group in group out nuclide mean std. dev. -0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. -0 3 1 total 0 0 material group in nuclide mean std. dev. -0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. -0 4 1 total 0 0 material group in group out nuclide mean std. dev. -0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. -0 4 1 total 0 0 material group in nuclide mean std. dev. -0 5 1 total 0 0 material group in nuclide mean std. dev. -0 5 1 total 0 0 material group in group out nuclide mean std. dev. -0 5 1 1 total 0 0 material group out nuclide mean std. dev. -0 5 1 total 0 0 material group in nuclide mean std. dev. -0 6 1 total 0 0 material group in nuclide mean std. dev. -0 6 1 total 0 0 material group in group out nuclide mean std. dev. -0 6 1 1 total 0 0 material group out nuclide mean std. dev. -0 6 1 total 0 0 material group in nuclide mean std. dev. -0 7 1 total 0 0 material group in nuclide mean std. dev. -0 7 1 total 0 0 material group in group out nuclide mean std. dev. -0 7 1 1 total 0 0 material group out nuclide mean std. dev. -0 7 1 total 0 0 material group in nuclide mean std. dev. -0 8 1 total 0 0 material group in nuclide mean std. dev. -0 8 1 total 0 0 material group in group out nuclide mean std. dev. -0 8 1 1 total 0 0 material group out nuclide mean std. dev. -0 8 1 total 0 0 material group in nuclide mean std. dev. -0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. -0 9 1 total 0 0 material group in group out nuclide mean std. dev. -0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. -0 9 1 total 0 0 material group in nuclide mean std. dev. -0 10 1 total 0 0 material group in nuclide mean std. dev. -0 10 1 total 0 0 material group in group out nuclide mean std. dev. -0 10 1 1 total 0 0 material group out nuclide mean std. dev. -0 10 1 total 0 0 material group in nuclide mean std. dev. -0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. -0 11 1 total 0 0 material group in group out nuclide mean std. dev. -0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. -0 11 1 total 0 0 material group in nuclide mean std. dev. -0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. -0 12 1 total 0 0 material group in group out nuclide mean std. dev. -0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. -0 12 1 total 0 0 \ No newline at end of file + material group in nuclide mean std. dev. +0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. +0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. +0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. +0 1 1 total 1 0.119622 material group in nuclide mean std. dev. +0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. +0 2 1 total 0 0 material group in group out nuclide mean std. dev. +0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. +0 2 1 total 0 0 material group in nuclide mean std. dev. +0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. +0 3 1 total 0 0 material group in group out nuclide mean std. dev. +0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. +0 3 1 total 0 0 material group in nuclide mean std. dev. +0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. +0 4 1 total 0 0 material group in group out nuclide mean std. dev. +0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. +0 4 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in group out nuclide mean std. dev. +0 5 1 1 total 0 0 material group out nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in group out nuclide mean std. dev. +0 6 1 1 total 0 0 material group out nuclide mean std. dev. +0 6 1 total 0 0 material group in nuclide mean std. dev. +0 7 1 total 0 0 material group in nuclide mean std. dev. +0 7 1 total 0 0 material group in group out nuclide mean std. dev. +0 7 1 1 total 0 0 material group out nuclide mean std. dev. +0 7 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in group out nuclide mean std. dev. +0 8 1 1 total 0 0 material group out nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. +0 9 1 total 0 0 material group in group out nuclide mean std. dev. +0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. +0 9 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in group out nuclide mean std. dev. +0 10 1 1 total 0 0 material group out nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. +0 11 1 total 0 0 material group in group out nuclide mean std. dev. +0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. +0 11 1 total 0 0 material group in nuclide mean std. dev. +0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. +0 12 1 total 0 0 material group in group out nuclide mean std. dev. +0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. +0 12 1 total 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index bbcb28375d..7618512689 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,121 +1,121 @@ - material group in nuclide mean std. dev. -1 1 1 total 0.384379 0.01649 -0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. -1 1 1 total 0.02127 0.000894 -0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. -3 1 1 1 total 0.349924 0.016649 -2 1 1 2 total 0.000173 0.000173 -1 1 2 1 total 0.001948 0.001952 -0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. -1 1 1 total 1 0.119622 -0 1 2 total 0 0.000000 material group in nuclide mean std. dev. -1 2 1 total 0.245043 0.008827 -0 2 2 total 0.266458 0.052209 material group in nuclide mean std. dev. -1 2 1 total 0 0 -0 2 2 total 0 0 material group in group out nuclide mean std. dev. -3 2 1 1 total 0.243657 0.009083 -2 2 1 2 total 0.000000 0.000000 -1 2 2 1 total 0.000000 0.000000 -0 2 2 2 total 0.254787 0.055563 material group out nuclide mean std. dev. + material group in nuclide mean std. dev. +1 1 1 total 0.384379 0.01649 +0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. +1 1 1 total 0.02127 0.000894 +0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. +3 1 1 1 total 0.349924 0.016649 +2 1 1 2 total 0.000173 0.000173 +1 1 2 1 total 0.001948 0.001952 +0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. +1 1 1 total 1 0.119622 +0 1 2 total 0 0.000000 material group in nuclide mean std. dev. +1 2 1 total 0.245043 0.008827 +0 2 2 total 0.266458 0.052209 material group in nuclide mean std. dev. 1 2 1 total 0 0 -0 2 2 total 0 0 material group in nuclide mean std. dev. -1 3 1 total 0.282277 0.037242 -0 3 2 total 1.427320 0.247127 material group in nuclide mean std. dev. -1 3 1 total 0 0 -0 3 2 total 0 0 material group in group out nuclide mean std. dev. -3 3 1 1 total 0.253967 0.036173 -2 3 1 2 total 0.027273 0.001807 -1 3 2 1 total 0.000000 0.000000 -0 3 2 2 total 1.376527 0.240257 material group out nuclide mean std. dev. +0 2 2 total 0 0 material group in group out nuclide mean std. dev. +3 2 1 1 total 0.243657 0.009083 +2 2 1 2 total 0.000000 0.000000 +1 2 2 1 total 0.000000 0.000000 +0 2 2 2 total 0.254787 0.055563 material group out nuclide mean std. dev. +1 2 1 total 0 0 +0 2 2 total 0 0 material group in nuclide mean std. dev. +1 3 1 total 0.282277 0.037242 +0 3 2 total 1.427320 0.247127 material group in nuclide mean std. dev. 1 3 1 total 0 0 -0 3 2 total 0 0 material group in nuclide mean std. dev. -1 4 1 total 0.255723 0.051917 -0 4 2 total 1.179767 0.229380 material group in nuclide mean std. dev. -1 4 1 total 0 0 -0 4 2 total 0 0 material group in group out nuclide mean std. dev. -3 4 1 1 total 0.232978 0.049771 -2 4 1 2 total 0.022281 0.002625 -1 4 2 1 total 0.000000 0.000000 -0 4 2 2 total 1.146809 0.222198 material group out nuclide mean std. dev. +0 3 2 total 0 0 material group in group out nuclide mean std. dev. +3 3 1 1 total 0.253967 0.036173 +2 3 1 2 total 0.027273 0.001807 +1 3 2 1 total 0.000000 0.000000 +0 3 2 2 total 1.376527 0.240257 material group out nuclide mean std. dev. +1 3 1 total 0 0 +0 3 2 total 0 0 material group in nuclide mean std. dev. +1 4 1 total 0.255723 0.051917 +0 4 2 total 1.179767 0.229380 material group in nuclide mean std. dev. 1 4 1 total 0 0 -0 4 2 total 0 0 material group in nuclide mean std. dev. -1 5 1 total 0 0 -0 5 2 total 0 0 material group in nuclide mean std. dev. -1 5 1 total 0 0 -0 5 2 total 0 0 material group in group out nuclide mean std. dev. -3 5 1 1 total 0 0 -2 5 1 2 total 0 0 -1 5 2 1 total 0 0 -0 5 2 2 total 0 0 material group out nuclide mean std. dev. +0 4 2 total 0 0 material group in group out nuclide mean std. dev. +3 4 1 1 total 0.232978 0.049771 +2 4 1 2 total 0.022281 0.002625 +1 4 2 1 total 0.000000 0.000000 +0 4 2 2 total 1.146809 0.222198 material group out nuclide mean std. dev. +1 4 1 total 0 0 +0 4 2 total 0 0 material group in nuclide mean std. dev. 1 5 1 total 0 0 -0 5 2 total 0 0 material group in nuclide mean std. dev. -1 6 1 total 0 0 -0 6 2 total 0 0 material group in nuclide mean std. dev. -1 6 1 total 0 0 -0 6 2 total 0 0 material group in group out nuclide mean std. dev. -3 6 1 1 total 0 0 -2 6 1 2 total 0 0 -1 6 2 1 total 0 0 -0 6 2 2 total 0 0 material group out nuclide mean std. dev. +0 5 2 total 0 0 material group in nuclide mean std. dev. +1 5 1 total 0 0 +0 5 2 total 0 0 material group in group out nuclide mean std. dev. +3 5 1 1 total 0 0 +2 5 1 2 total 0 0 +1 5 2 1 total 0 0 +0 5 2 2 total 0 0 material group out nuclide mean std. dev. +1 5 1 total 0 0 +0 5 2 total 0 0 material group in nuclide mean std. dev. 1 6 1 total 0 0 -0 6 2 total 0 0 material group in nuclide mean std. dev. -1 7 1 total 0 0 -0 7 2 total 0 0 material group in nuclide mean std. dev. -1 7 1 total 0 0 -0 7 2 total 0 0 material group in group out nuclide mean std. dev. -3 7 1 1 total 0 0 -2 7 1 2 total 0 0 -1 7 2 1 total 0 0 -0 7 2 2 total 0 0 material group out nuclide mean std. dev. +0 6 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in group out nuclide mean std. dev. +3 6 1 1 total 0 0 +2 6 1 2 total 0 0 +1 6 2 1 total 0 0 +0 6 2 2 total 0 0 material group out nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in nuclide mean std. dev. 1 7 1 total 0 0 -0 7 2 total 0 0 material group in nuclide mean std. dev. -1 8 1 total 0 0 -0 8 2 total 0 0 material group in nuclide mean std. dev. -1 8 1 total 0 0 -0 8 2 total 0 0 material group in group out nuclide mean std. dev. -3 8 1 1 total 0 0 -2 8 1 2 total 0 0 -1 8 2 1 total 0 0 -0 8 2 2 total 0 0 material group out nuclide mean std. dev. +0 7 2 total 0 0 material group in nuclide mean std. dev. +1 7 1 total 0 0 +0 7 2 total 0 0 material group in group out nuclide mean std. dev. +3 7 1 1 total 0 0 +2 7 1 2 total 0 0 +1 7 2 1 total 0 0 +0 7 2 2 total 0 0 material group out nuclide mean std. dev. +1 7 1 total 0 0 +0 7 2 total 0 0 material group in nuclide mean std. dev. 1 8 1 total 0 0 -0 8 2 total 0 0 material group in nuclide mean std. dev. -1 9 1 total 0.504036 0.379624 -0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. -1 9 1 total 0 0 -0 9 2 total 0 0 material group in group out nuclide mean std. dev. -3 9 1 1 total 0.504036 0.379624 -2 9 1 2 total 0.000000 0.000000 -1 9 2 1 total 0.000000 0.000000 -0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +0 8 2 total 0 0 material group in nuclide mean std. dev. +1 8 1 total 0 0 +0 8 2 total 0 0 material group in group out nuclide mean std. dev. +3 8 1 1 total 0 0 +2 8 1 2 total 0 0 +1 8 2 1 total 0 0 +0 8 2 2 total 0 0 material group out nuclide mean std. dev. +1 8 1 total 0 0 +0 8 2 total 0 0 material group in nuclide mean std. dev. +1 9 1 total 0.504036 0.379624 +0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. 1 9 1 total 0 0 -0 9 2 total 0 0 material group in nuclide mean std. dev. -1 10 1 total 0 0 -0 10 2 total 0 0 material group in nuclide mean std. dev. -1 10 1 total 0 0 -0 10 2 total 0 0 material group in group out nuclide mean std. dev. -3 10 1 1 total 0 0 -2 10 1 2 total 0 0 -1 10 2 1 total 0 0 -0 10 2 2 total 0 0 material group out nuclide mean std. dev. +0 9 2 total 0 0 material group in group out nuclide mean std. dev. +3 9 1 1 total 0.504036 0.379624 +2 9 1 2 total 0.000000 0.000000 +1 9 2 1 total 0.000000 0.000000 +0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +1 9 1 total 0 0 +0 9 2 total 0 0 material group in nuclide mean std. dev. 1 10 1 total 0 0 -0 10 2 total 0 0 material group in nuclide mean std. dev. -1 11 1 total 0.302826 0.401311 -0 11 2 total 1.006145 1.091638 material group in nuclide mean std. dev. -1 11 1 total 0 0 -0 11 2 total 0 0 material group in group out nuclide mean std. dev. -3 11 1 1 total 0.275679 0.385676 -2 11 1 2 total 0.027147 0.020009 -1 11 2 1 total 0.000000 0.000000 -0 11 2 2 total 0.957929 1.051959 material group out nuclide mean std. dev. +0 10 2 total 0 0 material group in nuclide mean std. dev. +1 10 1 total 0 0 +0 10 2 total 0 0 material group in group out nuclide mean std. dev. +3 10 1 1 total 0 0 +2 10 1 2 total 0 0 +1 10 2 1 total 0 0 +0 10 2 2 total 0 0 material group out nuclide mean std. dev. +1 10 1 total 0 0 +0 10 2 total 0 0 material group in nuclide mean std. dev. +1 11 1 total 0.302826 0.401311 +0 11 2 total 1.006145 1.091638 material group in nuclide mean std. dev. 1 11 1 total 0 0 -0 11 2 total 0 0 material group in nuclide mean std. dev. -1 12 1 total 0.255933 0.268426 -0 12 2 total 1.113345 0.988676 material group in nuclide mean std. dev. -1 12 1 total 0 0 -0 12 2 total 0 0 material group in group out nuclide mean std. dev. -3 12 1 1 total 0.226310 0.254872 -2 12 1 2 total 0.029622 0.017760 -1 12 2 1 total 0.000000 0.000000 -0 12 2 2 total 1.071690 0.958290 material group out nuclide mean std. dev. +0 11 2 total 0 0 material group in group out nuclide mean std. dev. +3 11 1 1 total 0.275679 0.385676 +2 11 1 2 total 0.027147 0.020009 +1 11 2 1 total 0.000000 0.000000 +0 11 2 2 total 0.957929 1.051959 material group out nuclide mean std. dev. +1 11 1 total 0 0 +0 11 2 total 0 0 material group in nuclide mean std. dev. +1 12 1 total 0.255933 0.268426 +0 12 2 total 1.113345 0.988676 material group in nuclide mean std. dev. 1 12 1 total 0 0 -0 12 2 total 0 0 \ No newline at end of file +0 12 2 total 0 0 material group in group out nuclide mean std. dev. +3 12 1 1 total 0.226310 0.254872 +2 12 1 2 total 0.029622 0.017760 +1 12 2 1 total 0.000000 0.000000 +0 12 2 2 total 1.071690 0.958290 material group out nuclide mean std. dev. +1 12 1 total 0 0 +0 12 2 total 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index f8e5baac55..23ac0e423d 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1,384 +1,354 @@ - material group in nuclide mean std. dev. -34 1 1 U-234 0.000000 0.000000 -35 1 1 U-235 0.008559 0.001742 -36 1 1 U-236 0.002643 0.000794 -37 1 1 U-238 0.213622 0.010911 -38 1 1 Np-237 0.000000 0.000000 -39 1 1 Pu-238 0.000000 0.000000 -40 1 1 Pu-239 0.005787 0.001050 -41 1 1 Pu-240 0.005702 0.000850 -42 1 1 Pu-241 0.000869 0.000366 -43 1 1 Pu-242 0.000655 0.000537 -44 1 1 Am-241 0.000000 0.000000 -45 1 1 Am-242m 0.000000 0.000000 -46 1 1 Am-243 0.000000 0.000000 -47 1 1 Cm-242 0.000000 0.000000 -48 1 1 Cm-243 0.000000 0.000000 -49 1 1 Cm-244 0.000000 0.000000 -50 1 1 Cm-245 0.000000 0.000000 -51 1 1 Mo-95 0.000302 0.000216 -52 1 1 Tc-99 0.000782 0.000434 -53 1 1 Ru-101 0.000346 0.000212 -54 1 1 Ru-103 0.000000 0.000000 -55 1 1 Ag-109 0.000000 0.000000 -56 1 1 Xe-135 0.000000 0.000000 -57 1 1 Cs-133 0.000189 0.000264 -58 1 1 Nd-143 0.000721 0.000364 -59 1 1 Nd-145 0.000637 0.000253 -60 1 1 Sm-147 0.000009 0.000238 -61 1 1 Sm-149 0.000000 0.000000 -62 1 1 Sm-150 0.000003 0.000243 -63 1 1 Sm-151 0.000000 0.000000 -64 1 1 Sm-152 0.000874 0.000388 -65 1 1 Eu-153 0.000173 0.000173 -66 1 1 Gd-155 0.000000 0.000000 -67 1 1 O-16 0.142506 0.008222 -0 1 2 U-234 0.001948 0.001952 -1 1 2 U-235 0.179956 0.028209 -2 1 2 U-236 0.000000 0.000000 -3 1 2 U-238 0.239279 0.039048 -4 1 2 Np-237 0.000000 0.000000 -5 1 2 Pu-238 0.000000 0.000000 -6 1 2 Pu-239 0.159745 0.015751 -7 1 2 Pu-240 0.007792 0.003677 -8 1 2 Pu-241 0.017533 0.003806 -9 1 2 Pu-242 0.000000 0.000000 -10 1 2 Am-241 0.000000 0.000000 -11 1 2 Am-242m 0.000000 0.000000 -12 1 2 Am-243 0.000000 0.000000 -13 1 2 Cm-242 0.000000 0.000000 -14 1 2 Cm-243 0.000000 0.000000 -15 1 2 Cm-244 0.000000 0.000000 -16 1 2 Cm-245 0.000000 0.000000 -17 1 2 Mo-95 0.002250 0.004232 -18 1 2 Tc-99 0.003544 0.002528 -19 1 2 Ru-101 0.000000 0.000000 -20 1 2 Ru-103 0.000000 0.000000 -21 1 2 Ag-109 0.000000 0.000000 -22 1 2 Xe-135 0.027274 0.004025 -23 1 2 Cs-133 0.000000 0.000000 -24 1 2 Nd-143 0.006532 0.002517 -25 1 2 Nd-145 0.001948 0.001952 -26 1 2 Sm-147 0.000000 0.000000 -27 1 2 Sm-149 0.007792 0.005701 -28 1 2 Sm-150 0.000000 0.000000 -29 1 2 Sm-151 0.000000 0.000000 -30 1 2 Sm-152 0.000000 0.000000 -31 1 2 Eu-153 0.001686 0.001968 -32 1 2 Gd-155 0.000000 0.000000 -33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. -34 1 1 U-234 6.771527e-06 2.982583e-07 -35 1 1 U-235 9.687933e-03 4.305720e-04 -36 1 1 U-236 6.279974e-05 3.653120e-06 -37 1 1 U-238 6.335930e-03 4.715525e-04 -38 1 1 Np-237 1.237030e-05 6.333955e-07 -39 1 1 Pu-238 7.369063e-06 5.017525e-07 -40 1 1 Pu-239 4.007893e-03 2.607619e-04 -41 1 1 Pu-240 6.479096e-05 3.728060e-06 -42 1 1 Pu-241 1.074454e-03 4.688479e-05 -43 1 1 Pu-242 5.512610e-06 2.976651e-07 -44 1 1 Am-241 1.088373e-06 8.489934e-08 -45 1 1 Am-242m 1.143307e-06 9.912400e-08 -46 1 1 Am-243 7.745526e-07 5.413923e-08 -47 1 1 Cm-242 4.311566e-07 1.922427e-08 -48 1 1 Cm-243 2.363328e-07 2.235666e-08 -49 1 1 Cm-244 2.840125e-07 2.412051e-08 -50 1 1 Cm-245 3.017505e-07 1.594090e-08 -51 1 1 Mo-95 0.000000e+00 0.000000e+00 -52 1 1 Tc-99 0.000000e+00 0.000000e+00 -53 1 1 Ru-101 0.000000e+00 0.000000e+00 -54 1 1 Ru-103 0.000000e+00 0.000000e+00 -55 1 1 Ag-109 0.000000e+00 0.000000e+00 -56 1 1 Xe-135 0.000000e+00 0.000000e+00 -57 1 1 Cs-133 0.000000e+00 0.000000e+00 -58 1 1 Nd-143 0.000000e+00 0.000000e+00 -59 1 1 Nd-145 0.000000e+00 0.000000e+00 -60 1 1 Sm-147 0.000000e+00 0.000000e+00 -61 1 1 Sm-149 0.000000e+00 0.000000e+00 -62 1 1 Sm-150 0.000000e+00 0.000000e+00 -63 1 1 Sm-151 0.000000e+00 0.000000e+00 -64 1 1 Sm-152 0.000000e+00 0.000000e+00 -65 1 1 Eu-153 0.000000e+00 0.000000e+00 -66 1 1 Gd-155 0.000000e+00 0.000000e+00 -67 1 1 O-16 0.000000e+00 0.000000e+00 -0 1 2 U-234 4.267300e-07 3.529845e-08 -1 1 2 U-235 3.629246e-01 2.964548e-02 -2 1 2 U-236 5.921657e-06 4.881464e-07 -3 1 2 U-238 5.196256e-07 4.286610e-08 -4 1 2 Np-237 2.424211e-07 1.741823e-08 -5 1 2 Pu-238 3.255627e-05 2.692686e-06 -6 1 2 Pu-239 2.868384e-01 2.056896e-02 -7 1 2 Pu-240 4.398266e-06 3.658267e-07 -8 1 2 Pu-241 4.607239e-02 3.797176e-03 -9 1 2 Pu-242 8.451967e-08 6.979002e-09 -10 1 2 Am-241 4.678607e-06 3.253889e-07 -11 1 2 Am-242m 1.417675e-04 1.218350e-05 -12 1 2 Am-243 7.648834e-08 6.303843e-09 -13 1 2 Cm-242 9.433314e-07 7.794362e-08 -14 1 2 Cm-243 1.767995e-06 1.454123e-07 -15 1 2 Cm-244 1.533962e-07 1.266951e-08 -16 1 2 Cm-245 1.145063e-05 9.419051e-07 -17 1 2 Mo-95 0.000000e+00 0.000000e+00 -18 1 2 Tc-99 0.000000e+00 0.000000e+00 -19 1 2 Ru-101 0.000000e+00 0.000000e+00 -20 1 2 Ru-103 0.000000e+00 0.000000e+00 -21 1 2 Ag-109 0.000000e+00 0.000000e+00 -22 1 2 Xe-135 0.000000e+00 0.000000e+00 -23 1 2 Cs-133 0.000000e+00 0.000000e+00 -24 1 2 Nd-143 0.000000e+00 0.000000e+00 -25 1 2 Nd-145 0.000000e+00 0.000000e+00 -26 1 2 Sm-147 0.000000e+00 0.000000e+00 -27 1 2 Sm-149 0.000000e+00 0.000000e+00 -28 1 2 Sm-150 0.000000e+00 0.000000e+00 -29 1 2 Sm-151 0.000000e+00 0.000000e+00 -30 1 2 Sm-152 0.000000e+00 0.000000e+00 -31 1 2 Eu-153 0.000000e+00 0.000000e+00 -32 1 2 Gd-155 0.000000e+00 0.000000e+00 -33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. -102 1 1 1 U-234 0.000000 0.000000 -103 1 1 1 U-235 0.002846 0.001185 -104 1 1 1 U-236 0.001951 0.000829 -105 1 1 1 U-238 0.197520 0.011618 -106 1 1 1 Np-237 0.000000 0.000000 -107 1 1 1 Pu-238 0.000000 0.000000 -108 1 1 1 Pu-239 0.001285 0.000461 -109 1 1 1 Pu-240 0.001027 0.000635 -110 1 1 1 Pu-241 0.000004 0.000242 -111 1 1 1 Pu-242 0.000481 0.000372 -112 1 1 1 Am-241 0.000000 0.000000 -113 1 1 1 Am-242m 0.000000 0.000000 -114 1 1 1 Am-243 0.000000 0.000000 -115 1 1 1 Cm-242 0.000000 0.000000 -116 1 1 1 Cm-243 0.000000 0.000000 -117 1 1 1 Cm-244 0.000000 0.000000 -118 1 1 1 Cm-245 0.000000 0.000000 -119 1 1 1 Mo-95 0.000302 0.000216 -120 1 1 1 Tc-99 0.000262 0.000195 -121 1 1 1 Ru-101 0.000000 0.000000 -122 1 1 1 Ru-103 0.000000 0.000000 -123 1 1 1 Ag-109 0.000000 0.000000 -124 1 1 1 Xe-135 0.000000 0.000000 -125 1 1 1 Cs-133 0.000016 0.000234 -126 1 1 1 Nd-143 0.000721 0.000364 -127 1 1 1 Nd-145 0.000463 0.000281 -128 1 1 1 Sm-147 0.000009 0.000238 -129 1 1 1 Sm-149 0.000000 0.000000 -130 1 1 1 Sm-150 0.000003 0.000243 -131 1 1 1 Sm-151 0.000000 0.000000 -132 1 1 1 Sm-152 0.000700 0.000424 -133 1 1 1 Eu-153 0.000000 0.000000 -134 1 1 1 Gd-155 0.000000 0.000000 -135 1 1 1 O-16 0.142333 0.008156 -68 1 1 2 U-234 0.000000 0.000000 -69 1 1 2 U-235 0.000000 0.000000 -70 1 1 2 U-236 0.000000 0.000000 -71 1 1 2 U-238 0.000000 0.000000 -72 1 1 2 Np-237 0.000000 0.000000 -73 1 1 2 Pu-238 0.000000 0.000000 -74 1 1 2 Pu-239 0.000000 0.000000 -75 1 1 2 Pu-240 0.000000 0.000000 -76 1 1 2 Pu-241 0.000000 0.000000 -77 1 1 2 Pu-242 0.000000 0.000000 -78 1 1 2 Am-241 0.000000 0.000000 -79 1 1 2 Am-242m 0.000000 0.000000 -80 1 1 2 Am-243 0.000000 0.000000 -81 1 1 2 Cm-242 0.000000 0.000000 -82 1 1 2 Cm-243 0.000000 0.000000 -83 1 1 2 Cm-244 0.000000 0.000000 -84 1 1 2 Cm-245 0.000000 0.000000 -85 1 1 2 Mo-95 0.000000 0.000000 -86 1 1 2 Tc-99 0.000000 0.000000 -87 1 1 2 Ru-101 0.000000 0.000000 -88 1 1 2 Ru-103 0.000000 0.000000 -89 1 1 2 Ag-109 0.000000 0.000000 -90 1 1 2 Xe-135 0.000000 0.000000 -91 1 1 2 Cs-133 0.000000 0.000000 -92 1 1 2 Nd-143 0.000000 0.000000 -93 1 1 2 Nd-145 0.000000 0.000000 -94 1 1 2 Sm-147 0.000000 0.000000 -95 1 1 2 Sm-149 0.000000 0.000000 -96 1 1 2 Sm-150 0.000000 0.000000 -97 1 1 2 Sm-151 0.000000 0.000000 -98 1 1 2 Sm-152 0.000000 0.000000 -99 1 1 2 Eu-153 0.000000 0.000000 -100 1 1 2 Gd-155 0.000000 0.000000 -101 1 1 2 O-16 0.000173 0.000173 -34 1 2 1 U-234 0.000000 0.000000 -35 1 2 1 U-235 0.000000 0.000000 -36 1 2 1 U-236 0.000000 0.000000 -37 1 2 1 U-238 0.000000 0.000000 -38 1 2 1 Np-237 0.000000 0.000000 -39 1 2 1 Pu-238 0.000000 0.000000 -40 1 2 1 Pu-239 0.000000 0.000000 -41 1 2 1 Pu-240 0.000000 0.000000 -42 1 2 1 Pu-241 0.000000 0.000000 -43 1 2 1 Pu-242 0.000000 0.000000 -44 1 2 1 Am-241 0.000000 0.000000 -45 1 2 1 Am-242m 0.000000 0.000000 -46 1 2 1 Am-243 0.000000 0.000000 -47 1 2 1 Cm-242 0.000000 0.000000 -48 1 2 1 Cm-243 0.000000 0.000000 -49 1 2 1 Cm-244 0.000000 0.000000 -50 1 2 1 Cm-245 0.000000 0.000000 -51 1 2 1 Mo-95 0.000000 0.000000 -52 1 2 1 Tc-99 0.000000 0.000000 -53 1 2 1 Ru-101 0.000000 0.000000 -54 1 2 1 Ru-103 0.000000 0.000000 -55 1 2 1 Ag-109 0.000000 0.000000 -56 1 2 1 Xe-135 0.000000 0.000000 -57 1 2 1 Cs-133 0.000000 0.000000 -58 1 2 1 Nd-143 0.000000 0.000000 -59 1 2 1 Nd-145 0.000000 0.000000 -60 1 2 1 Sm-147 0.000000 0.000000 -61 1 2 1 Sm-149 0.000000 0.000000 -62 1 2 1 Sm-150 0.000000 0.000000 -63 1 2 1 Sm-151 0.000000 0.000000 -64 1 2 1 Sm-152 0.000000 0.000000 -65 1 2 1 Eu-153 0.000000 0.000000 -66 1 2 1 Gd-155 0.000000 0.000000 -67 1 2 1 O-16 0.001948 0.001952 -0 1 2 2 U-234 0.000000 0.000000 -1 1 2 2 U-235 0.010470 0.006106 -2 1 2 2 U-236 0.000000 0.000000 -3 1 2 2 U-238 0.208109 0.039197 -4 1 2 2 Np-237 0.000000 0.000000 -5 1 2 2 Pu-238 0.000000 0.000000 -6 1 2 2 Pu-239 0.000000 0.000000 -7 1 2 2 Pu-240 0.000000 0.000000 -8 1 2 2 Pu-241 0.000000 0.000000 -9 1 2 2 Pu-242 0.000000 0.000000 -10 1 2 2 Am-241 0.000000 0.000000 -11 1 2 2 Am-242m 0.000000 0.000000 -12 1 2 2 Am-243 0.000000 0.000000 -13 1 2 2 Cm-242 0.000000 0.000000 -14 1 2 2 Cm-243 0.000000 0.000000 -15 1 2 2 Cm-244 0.000000 0.000000 -16 1 2 2 Cm-245 0.000000 0.000000 -17 1 2 2 Mo-95 0.000302 0.002551 -18 1 2 2 Tc-99 0.003544 0.002528 -19 1 2 2 Ru-101 0.000000 0.000000 -20 1 2 2 Ru-103 0.000000 0.000000 -21 1 2 2 Ag-109 0.000000 0.000000 -22 1 2 2 Xe-135 0.000000 0.000000 -23 1 2 2 Cs-133 0.000000 0.000000 -24 1 2 2 Nd-143 0.002636 0.002073 -25 1 2 2 Nd-145 0.000000 0.000000 -26 1 2 2 Sm-147 0.000000 0.000000 -27 1 2 2 Sm-149 0.000000 0.000000 -28 1 2 2 Sm-150 0.000000 0.000000 -29 1 2 2 Sm-151 0.000000 0.000000 -30 1 2 2 Sm-152 0.000000 0.000000 -31 1 2 2 Eu-153 0.001686 0.001968 -32 1 2 2 Gd-155 0.000000 0.000000 -33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. -34 1 1 U-234 0 0.000000 -35 1 1 U-235 1 0.127079 -36 1 1 U-236 0 0.000000 -37 1 1 U-238 1 0.153215 -38 1 1 Np-237 0 0.000000 -39 1 1 Pu-238 0 0.000000 -40 1 1 Pu-239 1 0.150979 -41 1 1 Pu-240 0 0.000000 -42 1 1 Pu-241 1 0.203534 -43 1 1 Pu-242 0 0.000000 -44 1 1 Am-241 0 0.000000 -45 1 1 Am-242m 0 0.000000 -46 1 1 Am-243 0 0.000000 -47 1 1 Cm-242 0 0.000000 -48 1 1 Cm-243 0 0.000000 -49 1 1 Cm-244 0 0.000000 -50 1 1 Cm-245 0 0.000000 -51 1 1 Mo-95 0 0.000000 -52 1 1 Tc-99 0 0.000000 -53 1 1 Ru-101 0 0.000000 -54 1 1 Ru-103 0 0.000000 -55 1 1 Ag-109 0 0.000000 -56 1 1 Xe-135 0 0.000000 -57 1 1 Cs-133 0 0.000000 -58 1 1 Nd-143 0 0.000000 -59 1 1 Nd-145 0 0.000000 -60 1 1 Sm-147 0 0.000000 -61 1 1 Sm-149 0 0.000000 -62 1 1 Sm-150 0 0.000000 -63 1 1 Sm-151 0 0.000000 -64 1 1 Sm-152 0 0.000000 -65 1 1 Eu-153 0 0.000000 -66 1 1 Gd-155 0 0.000000 -67 1 1 O-16 0 0.000000 -0 1 2 U-234 0 0.000000 -1 1 2 U-235 0 0.000000 -2 1 2 U-236 0 0.000000 -3 1 2 U-238 0 0.000000 -4 1 2 Np-237 0 0.000000 -5 1 2 Pu-238 0 0.000000 -6 1 2 Pu-239 0 0.000000 -7 1 2 Pu-240 0 0.000000 -8 1 2 Pu-241 0 0.000000 -9 1 2 Pu-242 0 0.000000 -10 1 2 Am-241 0 0.000000 -11 1 2 Am-242m 0 0.000000 -12 1 2 Am-243 0 0.000000 -13 1 2 Cm-242 0 0.000000 -14 1 2 Cm-243 0 0.000000 -15 1 2 Cm-244 0 0.000000 -16 1 2 Cm-245 0 0.000000 -17 1 2 Mo-95 0 0.000000 -18 1 2 Tc-99 0 0.000000 -19 1 2 Ru-101 0 0.000000 -20 1 2 Ru-103 0 0.000000 -21 1 2 Ag-109 0 0.000000 -22 1 2 Xe-135 0 0.000000 -23 1 2 Cs-133 0 0.000000 -24 1 2 Nd-143 0 0.000000 -25 1 2 Nd-145 0 0.000000 -26 1 2 Sm-147 0 0.000000 -27 1 2 Sm-149 0 0.000000 -28 1 2 Sm-150 0 0.000000 -29 1 2 Sm-151 0 0.000000 -30 1 2 Sm-152 0 0.000000 -31 1 2 Eu-153 0 0.000000 -32 1 2 Gd-155 0 0.000000 -33 1 2 O-16 0 0.000000 material group in nuclide mean std. dev. -5 2 1 Zr-90 0.118578 0.008347 -6 2 1 Zr-91 0.040887 0.002988 -7 2 1 Zr-92 0.033882 0.004365 -8 2 1 Zr-94 0.046281 0.005422 -9 2 1 Zr-96 0.005415 0.002113 -0 2 2 Zr-90 0.122479 0.032627 -1 2 2 Zr-91 0.035669 0.009683 -2 2 2 Zr-92 0.049331 0.021936 -3 2 2 Zr-94 0.058978 0.020081 -4 2 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. -5 2 1 Zr-90 0 0 -6 2 1 Zr-91 0 0 -7 2 1 Zr-92 0 0 -8 2 1 Zr-94 0 0 -9 2 1 Zr-96 0 0 -0 2 2 Zr-90 0 0 -1 2 2 Zr-91 0 0 -2 2 2 Zr-92 0 0 -3 2 2 Zr-94 0 0 -4 2 2 Zr-96 0 0 material group in group out nuclide mean std. dev. -15 2 1 1 Zr-90 0.118578 0.008347 -16 2 1 1 Zr-91 0.039963 0.003053 -17 2 1 1 Zr-92 0.033882 0.004365 -18 2 1 1 Zr-94 0.046281 0.005422 -19 2 1 1 Zr-96 0.004953 0.002087 -10 2 1 2 Zr-90 0.000000 0.000000 -11 2 1 2 Zr-91 0.000000 0.000000 -12 2 1 2 Zr-92 0.000000 0.000000 -13 2 1 2 Zr-94 0.000000 0.000000 -14 2 1 2 Zr-96 0.000000 0.000000 -5 2 2 1 Zr-90 0.000000 0.000000 -6 2 2 1 Zr-91 0.000000 0.000000 -7 2 2 1 Zr-92 0.000000 0.000000 -8 2 2 1 Zr-94 0.000000 0.000000 -9 2 2 1 Zr-96 0.000000 0.000000 -0 2 2 2 Zr-90 0.122479 0.032627 -1 2 2 2 Zr-91 0.023998 0.011915 -2 2 2 2 Zr-92 0.049331 0.021936 -3 2 2 2 Zr-94 0.058978 0.020081 -4 2 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. + material group in nuclide mean std. dev. +34 1 1 U-234 0.000000 0.000000 +35 1 1 U-235 0.008559 0.001742 +36 1 1 U-236 0.002643 0.000794 +37 1 1 U-238 0.213622 0.010911 +38 1 1 Np-237 0.000000 0.000000 +39 1 1 Pu-238 0.000000 0.000000 +40 1 1 Pu-239 0.005787 0.001050 +41 1 1 Pu-240 0.005702 0.000850 +42 1 1 Pu-241 0.000869 0.000366 +43 1 1 Pu-242 0.000655 0.000537 +44 1 1 Am-241 0.000000 0.000000 +45 1 1 Am-242m 0.000000 0.000000 +46 1 1 Am-243 0.000000 0.000000 +47 1 1 Cm-242 0.000000 0.000000 +48 1 1 Cm-243 0.000000 0.000000 +49 1 1 Cm-244 0.000000 0.000000 +50 1 1 Cm-245 0.000000 0.000000 +51 1 1 Mo-95 0.000302 0.000216 +52 1 1 Tc-99 0.000782 0.000434 +53 1 1 Ru-101 0.000346 0.000212 +54 1 1 Ru-103 0.000000 0.000000 +55 1 1 Ag-109 0.000000 0.000000 +56 1 1 Xe-135 0.000000 0.000000 +57 1 1 Cs-133 0.000189 0.000264 +58 1 1 Nd-143 0.000721 0.000364 +59 1 1 Nd-145 0.000637 0.000253 +60 1 1 Sm-147 0.000009 0.000238 +61 1 1 Sm-149 0.000000 0.000000 +62 1 1 Sm-150 0.000003 0.000243 +63 1 1 Sm-151 0.000000 0.000000 +64 1 1 Sm-152 0.000874 0.000388 +65 1 1 Eu-153 0.000173 0.000173 +66 1 1 Gd-155 0.000000 0.000000 +67 1 1 O-16 0.142506 0.008222 +0 1 2 U-234 0.001948 0.001952 +1 1 2 U-235 0.179956 0.028209 +2 1 2 U-236 0.000000 0.000000 +3 1 2 U-238 0.239279 0.039048 +4 1 2 Np-237 0.000000 0.000000 +5 1 2 Pu-238 0.000000 0.000000 +6 1 2 Pu-239 0.159745 0.015751 +7 1 2 Pu-240 0.007792 0.003677 +8 1 2 Pu-241 0.017533 0.003806 +9 1 2 Pu-242 0.000000 0.000000 +10 1 2 Am-241 0.000000 0.000000 +11 1 2 Am-242m 0.000000 0.000000 +12 1 2 Am-243 0.000000 0.000000 +13 1 2 Cm-242 0.000000 0.000000 +14 1 2 Cm-243 0.000000 0.000000 +15 1 2 Cm-244 0.000000 0.000000 +16 1 2 Cm-245 0.000000 0.000000 +17 1 2 Mo-95 0.002250 0.004232 +18 1 2 Tc-99 0.003544 0.002528 +19 1 2 Ru-101 0.000000 0.000000 +20 1 2 Ru-103 0.000000 0.000000 +21 1 2 Ag-109 0.000000 0.000000 +22 1 2 Xe-135 0.027274 0.004025 +23 1 2 Cs-133 0.000000 0.000000 +24 1 2 Nd-143 0.006532 0.002517 +25 1 2 Nd-145 0.001948 0.001952 +26 1 2 Sm-147 0.000000 0.000000 +27 1 2 Sm-149 0.007792 0.005701 +28 1 2 Sm-150 0.000000 0.000000 +29 1 2 Sm-151 0.000000 0.000000 +30 1 2 Sm-152 0.000000 0.000000 +31 1 2 Eu-153 0.001686 0.001968 +32 1 2 Gd-155 0.000000 0.000000 +33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. +34 1 1 U-234 6.771527e-06 2.982583e-07 +35 1 1 U-235 9.687933e-03 4.305720e-04 +36 1 1 U-236 6.279974e-05 3.653120e-06 +37 1 1 U-238 6.335930e-03 4.715525e-04 +38 1 1 Np-237 1.237030e-05 6.333955e-07 +39 1 1 Pu-238 7.369063e-06 5.017525e-07 +40 1 1 Pu-239 4.007893e-03 2.607619e-04 +41 1 1 Pu-240 6.479096e-05 3.728060e-06 +42 1 1 Pu-241 1.074454e-03 4.688479e-05 +43 1 1 Pu-242 5.512610e-06 2.976651e-07 +44 1 1 Am-241 1.088373e-06 8.489934e-08 +45 1 1 Am-242m 1.143307e-06 9.912400e-08 +46 1 1 Am-243 7.745526e-07 5.413923e-08 +47 1 1 Cm-242 4.311566e-07 1.922427e-08 +48 1 1 Cm-243 2.363328e-07 2.235666e-08 +49 1 1 Cm-244 2.840125e-07 2.412051e-08 +50 1 1 Cm-245 3.017505e-07 1.594090e-08 +51 1 1 Mo-95 0.000000e+00 0.000000e+00 +52 1 1 Tc-99 0.000000e+00 0.000000e+00 +53 1 1 Ru-101 0.000000e+00 0.000000e+00 +54 1 1 Ru-103 0.000000e+00 0.000000e+00 +55 1 1 Ag-109 0.000000e+00 0.000000e+00 +56 1 1 Xe-135 0.000000e+00 0.000000e+00 +57 1 1 Cs-133 0.000000e+00 0.000000e+00 +58 1 1 Nd-143 0.000000e+00 0.000000e+00 +59 1 1 Nd-145 0.000000e+00 0.000000e+00 +60 1 1 Sm-147 0.000000e+00 0.000000e+00 +61 1 1 Sm-149 0.000000e+00 0.000000e+00 +62 1 1 Sm-150 0.000000e+00 0.000000e+00 +63 1 1 Sm-151 0.000000e+00 0.000000e+00 +64 1 1 Sm-152 0.000000e+00 0.000000e+00 +65 1 1 Eu-153 0.000000e+00 0.000000e+00 +66 1 1 Gd-155 0.000000e+00 0.000000e+00 +67 1 1 O-16 0.000000e+00 0.000000e+00 +0 1 2 U-234 4.267300e-07 3.529845e-08 +1 1 2 U-235 3.629246e-01 2.964548e-02 +2 1 2 U-236 5.921657e-06 4.881464e-07 +3 1 2 U-238 5.196256e-07 4.286610e-08 +4 1 2 Np-237 2.424211e-07 1.741823e-08 +5 1 2 Pu-238 3.255627e-05 2.692686e-06 +6 1 2 Pu-239 2.868384e-01 2.056896e-02 +7 1 2 Pu-240 4.398266e-06 3.658267e-07 +8 1 2 Pu-241 4.607239e-02 3.797176e-03 +9 1 2 Pu-242 8.451967e-08 6.979002e-09 +10 1 2 Am-241 4.678607e-06 3.253889e-07 +11 1 2 Am-242m 1.417675e-04 1.218350e-05 +12 1 2 Am-243 7.648834e-08 6.303843e-09 +13 1 2 Cm-242 9.433314e-07 7.794362e-08 +14 1 2 Cm-243 1.767995e-06 1.454123e-07 +15 1 2 Cm-244 1.533962e-07 1.266951e-08 +16 1 2 Cm-245 1.145063e-05 9.419051e-07 +17 1 2 Mo-95 0.000000e+00 0.000000e+00 +18 1 2 Tc-99 0.000000e+00 0.000000e+00 +19 1 2 Ru-101 0.000000e+00 0.000000e+00 +20 1 2 Ru-103 0.000000e+00 0.000000e+00 +21 1 2 Ag-109 0.000000e+00 0.000000e+00 +22 1 2 Xe-135 0.000000e+00 0.000000e+00 +23 1 2 Cs-133 0.000000e+00 0.000000e+00 +24 1 2 Nd-143 0.000000e+00 0.000000e+00 +25 1 2 Nd-145 0.000000e+00 0.000000e+00 +26 1 2 Sm-147 0.000000e+00 0.000000e+00 +27 1 2 Sm-149 0.000000e+00 0.000000e+00 +28 1 2 Sm-150 0.000000e+00 0.000000e+00 +29 1 2 Sm-151 0.000000e+00 0.000000e+00 +30 1 2 Sm-152 0.000000e+00 0.000000e+00 +31 1 2 Eu-153 0.000000e+00 0.000000e+00 +32 1 2 Gd-155 0.000000e+00 0.000000e+00 +33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. +102 1 1 1 U-234 0.000000 0.000000 +103 1 1 1 U-235 0.002846 0.001185 +104 1 1 1 U-236 0.001951 0.000829 +105 1 1 1 U-238 0.197520 0.011618 +106 1 1 1 Np-237 0.000000 0.000000 +107 1 1 1 Pu-238 0.000000 0.000000 +108 1 1 1 Pu-239 0.001285 0.000461 +109 1 1 1 Pu-240 0.001027 0.000635 +110 1 1 1 Pu-241 0.000004 0.000242 +111 1 1 1 Pu-242 0.000481 0.000372 +112 1 1 1 Am-241 0.000000 0.000000 +113 1 1 1 Am-242m 0.000000 0.000000 +114 1 1 1 Am-243 0.000000 0.000000 +115 1 1 1 Cm-242 0.000000 0.000000 +116 1 1 1 Cm-243 0.000000 0.000000 +117 1 1 1 Cm-244 0.000000 0.000000 +118 1 1 1 Cm-245 0.000000 0.000000 +119 1 1 1 Mo-95 0.000302 0.000216 +120 1 1 1 Tc-99 0.000262 0.000195 +121 1 1 1 Ru-101 0.000000 0.000000 +122 1 1 1 Ru-103 0.000000 0.000000 +123 1 1 1 Ag-109 0.000000 0.000000 +124 1 1 1 Xe-135 0.000000 0.000000 +125 1 1 1 Cs-133 0.000016 0.000234 +126 1 1 1 Nd-143 0.000721 0.000364 +127 1 1 1 Nd-145 0.000463 0.000281 +128 1 1 1 Sm-147 0.000009 0.000238 +129 1 1 1 Sm-149 0.000000 0.000000 +130 1 1 1 Sm-150 0.000003 0.000243 +131 1 1 1 Sm-151 0.000000 0.000000 +132 1 1 1 Sm-152 0.000700 0.000424 +133 1 1 1 Eu-153 0.000000 0.000000 +134 1 1 1 Gd-155 0.000000 0.000000 +135 1 1 1 O-16 0.142333 0.008156 +68 1 1 2 U-234 0.000000 0.000000 +69 1 1 2 U-235 0.000000 0.000000 +70 1 1 2 U-236 0.000000 0.000000 +71 1 1 2 U-238 0.000000 0.000000 +72 1 1 2 Np-237 0.000000 0.000000 +73 1 1 2 Pu-238 0.000000 0.000000 +74 1 1 2 Pu-239 0.000000 0.000000 +75 1 1 2 Pu-240 0.000000 0.000000 +76 1 1 2 Pu-241 0.000000 0.000000 +77 1 1 2 Pu-242 0.000000 0.000000 +78 1 1 2 Am-241 0.000000 0.000000 +79 1 1 2 Am-242m 0.000000 0.000000 +80 1 1 2 Am-243 0.000000 0.000000 +81 1 1 2 Cm-242 0.000000 0.000000 +82 1 1 2 Cm-243 0.000000 0.000000 +83 1 1 2 Cm-244 0.000000 0.000000 +84 1 1 2 Cm-245 0.000000 0.000000 +85 1 1 2 Mo-95 0.000000 0.000000 +86 1 1 2 Tc-99 0.000000 0.000000 +87 1 1 2 Ru-101 0.000000 0.000000 +88 1 1 2 Ru-103 0.000000 0.000000 +89 1 1 2 Ag-109 0.000000 0.000000 +90 1 1 2 Xe-135 0.000000 0.000000 +91 1 1 2 Cs-133 0.000000 0.000000 +92 1 1 2 Nd-143 0.000000 0.000000 +93 1 1 2 Nd-145 0.000000 0.000000 +94 1 1 2 Sm-147 0.000000 0.000000 +95 1 1 2 Sm-149 0.000000 0.000000 +96 1 1 2 Sm-150 0.000000 0.000000 +97 1 1 2 Sm-151 0.000000 0.000000 +98 1 1 2 Sm-152 0.000000 0.000000 +99 1 1 2 Eu-153 0.000000 0.000000 +100 1 1 2 Gd-155 0.000000 0.000000 +101 1 1 2 O-16 0.000173 0.000173 +34 1 2 1 U-234 0.000000 0.000000 +35 1 2 1 U-235 0.000000 0.000000 +36 1 2 1 U-236 0.000000 0.000000 +37 1 2 1 U-238 0.000000 0.000000 +38 1 2 1 Np-237 0.000000 0.000000 +39 1 2 1 Pu-238 0.000000 0.000000 +40 1 2 1 Pu-239 0.000000 0.000000 +41 1 2 1 Pu-240 0.000000 0.000000 +42 1 2 1 Pu-241 0.000000 0.000000 +43 1 2 1 Pu-242 0.000000 0.000000 +44 1 2 1 Am-241 0.000000 0.000000 +45 1 2 1 Am-242m 0.000000 0.000000 +46 1 2 1 Am-243 0.000000 0.000000 +47 1 2 1 Cm-242 0.000000 0.000000 +48 1 2 1 Cm-243 0.000000 0.000000 +49 1 2 1 Cm-244 0.000000 0.000000 +50 1 2 1 Cm-245 0.000000 0.000000 +51 1 2 1 Mo-95 0.000000 0.000000 +52 1 2 1 Tc-99 0.000000 0.000000 +53 1 2 1 Ru-101 0.000000 0.000000 +54 1 2 1 Ru-103 0.000000 0.000000 +55 1 2 1 Ag-109 0.000000 0.000000 +56 1 2 1 Xe-135 0.000000 0.000000 +57 1 2 1 Cs-133 0.000000 0.000000 +58 1 2 1 Nd-143 0.000000 0.000000 +59 1 2 1 Nd-145 0.000000 0.000000 +60 1 2 1 Sm-147 0.000000 0.000000 +61 1 2 1 Sm-149 0.000000 0.000000 +62 1 2 1 Sm-150 0.000000 0.000000 +63 1 2 1 Sm-151 0.000000 0.000000 +64 1 2 1 Sm-152 0.000000 0.000000 +65 1 2 1 Eu-153 0.000000 0.000000 +66 1 2 1 Gd-155 0.000000 0.000000 +67 1 2 1 O-16 0.001948 0.001952 +0 1 2 2 U-234 0.000000 0.000000 +1 1 2 2 U-235 0.010470 0.006106 +2 1 2 2 U-236 0.000000 0.000000 +3 1 2 2 U-238 0.208109 0.039197 +4 1 2 2 Np-237 0.000000 0.000000 +5 1 2 2 Pu-238 0.000000 0.000000 +6 1 2 2 Pu-239 0.000000 0.000000 +7 1 2 2 Pu-240 0.000000 0.000000 +8 1 2 2 Pu-241 0.000000 0.000000 +9 1 2 2 Pu-242 0.000000 0.000000 +10 1 2 2 Am-241 0.000000 0.000000 +11 1 2 2 Am-242m 0.000000 0.000000 +12 1 2 2 Am-243 0.000000 0.000000 +13 1 2 2 Cm-242 0.000000 0.000000 +14 1 2 2 Cm-243 0.000000 0.000000 +15 1 2 2 Cm-244 0.000000 0.000000 +16 1 2 2 Cm-245 0.000000 0.000000 +17 1 2 2 Mo-95 0.000302 0.002551 +18 1 2 2 Tc-99 0.003544 0.002528 +19 1 2 2 Ru-101 0.000000 0.000000 +20 1 2 2 Ru-103 0.000000 0.000000 +21 1 2 2 Ag-109 0.000000 0.000000 +22 1 2 2 Xe-135 0.000000 0.000000 +23 1 2 2 Cs-133 0.000000 0.000000 +24 1 2 2 Nd-143 0.002636 0.002073 +25 1 2 2 Nd-145 0.000000 0.000000 +26 1 2 2 Sm-147 0.000000 0.000000 +27 1 2 2 Sm-149 0.000000 0.000000 +28 1 2 2 Sm-150 0.000000 0.000000 +29 1 2 2 Sm-151 0.000000 0.000000 +30 1 2 2 Sm-152 0.000000 0.000000 +31 1 2 2 Eu-153 0.001686 0.001968 +32 1 2 2 Gd-155 0.000000 0.000000 +33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. +34 1 1 U-234 0 0.000000 +35 1 1 U-235 1 0.127079 +36 1 1 U-236 0 0.000000 +37 1 1 U-238 1 0.153215 +38 1 1 Np-237 0 0.000000 +39 1 1 Pu-238 0 0.000000 +40 1 1 Pu-239 1 0.150979 +41 1 1 Pu-240 0 0.000000 +42 1 1 Pu-241 1 0.203534 +43 1 1 Pu-242 0 0.000000 +44 1 1 Am-241 0 0.000000 +45 1 1 Am-242m 0 0.000000 +46 1 1 Am-243 0 0.000000 +47 1 1 Cm-242 0 0.000000 +48 1 1 Cm-243 0 0.000000 +49 1 1 Cm-244 0 0.000000 +50 1 1 Cm-245 0 0.000000 +51 1 1 Mo-95 0 0.000000 +52 1 1 Tc-99 0 0.000000 +53 1 1 Ru-101 0 0.000000 +54 1 1 Ru-103 0 0.000000 +55 1 1 Ag-109 0 0.000000 +56 1 1 Xe-135 0 0.000000 +57 1 1 Cs-133 0 0.000000 +58 1 1 Nd-143 0 0.000000 +59 1 1 Nd-145 0 0.000000 +60 1 1 Sm-147 0 0.000000 +61 1 1 Sm-149 0 0.000000 +62 1 1 Sm-150 0 0.000000 +63 1 1 Sm-151 0 0.000000 +64 1 1 Sm-152 0 0.000000 +65 1 1 Eu-153 0 0.000000 +66 1 1 Gd-155 0 0.000000 +67 1 1 O-16 0 0.000000 +0 1 2 U-234 0 0.000000 +1 1 2 U-235 0 0.000000 +2 1 2 U-236 0 0.000000 +3 1 2 U-238 0 0.000000 +4 1 2 Np-237 0 0.000000 +5 1 2 Pu-238 0 0.000000 +6 1 2 Pu-239 0 0.000000 +7 1 2 Pu-240 0 0.000000 +8 1 2 Pu-241 0 0.000000 +9 1 2 Pu-242 0 0.000000 +10 1 2 Am-241 0 0.000000 +11 1 2 Am-242m 0 0.000000 +12 1 2 Am-243 0 0.000000 +13 1 2 Cm-242 0 0.000000 +14 1 2 Cm-243 0 0.000000 +15 1 2 Cm-244 0 0.000000 +16 1 2 Cm-245 0 0.000000 +17 1 2 Mo-95 0 0.000000 +18 1 2 Tc-99 0 0.000000 +19 1 2 Ru-101 0 0.000000 +20 1 2 Ru-103 0 0.000000 +21 1 2 Ag-109 0 0.000000 +22 1 2 Xe-135 0 0.000000 +23 1 2 Cs-133 0 0.000000 +24 1 2 Nd-143 0 0.000000 +25 1 2 Nd-145 0 0.000000 +26 1 2 Sm-147 0 0.000000 +27 1 2 Sm-149 0 0.000000 +28 1 2 Sm-150 0 0.000000 +29 1 2 Sm-151 0 0.000000 +30 1 2 Sm-152 0 0.000000 +31 1 2 Eu-153 0 0.000000 +32 1 2 Gd-155 0 0.000000 +33 1 2 O-16 0 0.000000 material group in nuclide mean std. dev. +5 2 1 Zr-90 0.118578 0.008347 +6 2 1 Zr-91 0.040887 0.002988 +7 2 1 Zr-92 0.033882 0.004365 +8 2 1 Zr-94 0.046281 0.005422 +9 2 1 Zr-96 0.005415 0.002113 +0 2 2 Zr-90 0.122479 0.032627 +1 2 2 Zr-91 0.035669 0.009683 +2 2 2 Zr-92 0.049331 0.021936 +3 2 2 Zr-94 0.058978 0.020081 +4 2 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. 5 2 1 Zr-90 0 0 6 2 1 Zr-91 0 0 7 2 1 Zr-92 0 0 @@ -388,39 +358,45 @@ 1 2 2 Zr-91 0 0 2 2 2 Zr-92 0 0 3 2 2 Zr-94 0 0 -4 2 2 Zr-96 0 0 material group in nuclide mean std. dev. -4 3 1 H-1 0.206179 0.034791 -5 3 1 O-16 0.075190 0.004750 -6 3 1 B-10 0.000741 0.000470 -7 3 1 B-11 0.000167 0.000208 -0 3 2 H-1 1.323003 0.239067 -1 3 2 O-16 0.071243 0.013291 -2 3 2 B-10 0.033075 0.004283 -3 3 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev. -4 3 1 H-1 0 0 -5 3 1 O-16 0 0 -6 3 1 B-10 0 0 -7 3 1 B-11 0 0 -0 3 2 H-1 0 0 -1 3 2 O-16 0 0 -2 3 2 B-10 0 0 -3 3 2 B-11 0 0 material group in group out nuclide mean std. dev. -12 3 1 1 H-1 0.178758 0.033618 -13 3 1 1 O-16 0.075042 0.004782 -14 3 1 1 B-10 0.000000 0.000000 -15 3 1 1 B-11 0.000167 0.000208 -8 3 1 2 H-1 0.027124 0.001806 -9 3 1 2 O-16 0.000148 0.000148 -10 3 1 2 B-10 0.000000 0.000000 -11 3 1 2 B-11 0.000000 0.000000 -4 3 2 1 H-1 0.000000 0.000000 -5 3 2 1 O-16 0.000000 0.000000 -6 3 2 1 B-10 0.000000 0.000000 -7 3 2 1 B-11 0.000000 0.000000 -0 3 2 2 H-1 1.305284 0.235145 -1 3 2 2 O-16 0.071243 0.013291 -2 3 2 2 B-10 0.000000 0.000000 -3 3 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev. +4 2 2 Zr-96 0 0 material group in group out nuclide mean std. dev. +15 2 1 1 Zr-90 0.118578 0.008347 +16 2 1 1 Zr-91 0.039963 0.003053 +17 2 1 1 Zr-92 0.033882 0.004365 +18 2 1 1 Zr-94 0.046281 0.005422 +19 2 1 1 Zr-96 0.004953 0.002087 +10 2 1 2 Zr-90 0.000000 0.000000 +11 2 1 2 Zr-91 0.000000 0.000000 +12 2 1 2 Zr-92 0.000000 0.000000 +13 2 1 2 Zr-94 0.000000 0.000000 +14 2 1 2 Zr-96 0.000000 0.000000 +5 2 2 1 Zr-90 0.000000 0.000000 +6 2 2 1 Zr-91 0.000000 0.000000 +7 2 2 1 Zr-92 0.000000 0.000000 +8 2 2 1 Zr-94 0.000000 0.000000 +9 2 2 1 Zr-96 0.000000 0.000000 +0 2 2 2 Zr-90 0.122479 0.032627 +1 2 2 2 Zr-91 0.023998 0.011915 +2 2 2 2 Zr-92 0.049331 0.021936 +3 2 2 2 Zr-94 0.058978 0.020081 +4 2 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +5 2 1 Zr-90 0 0 +6 2 1 Zr-91 0 0 +7 2 1 Zr-92 0 0 +8 2 1 Zr-94 0 0 +9 2 1 Zr-96 0 0 +0 2 2 Zr-90 0 0 +1 2 2 Zr-91 0 0 +2 2 2 Zr-92 0 0 +3 2 2 Zr-94 0 0 +4 2 2 Zr-96 0 0 material group in nuclide mean std. dev. +4 3 1 H-1 0.206179 0.034791 +5 3 1 O-16 0.075190 0.004750 +6 3 1 B-10 0.000741 0.000470 +7 3 1 B-11 0.000167 0.000208 +0 3 2 H-1 1.323003 0.239067 +1 3 2 O-16 0.071243 0.013291 +2 3 2 B-10 0.033075 0.004283 +3 3 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev. 4 3 1 H-1 0 0 5 3 1 O-16 0 0 6 3 1 B-10 0 0 @@ -428,39 +404,39 @@ 0 3 2 H-1 0 0 1 3 2 O-16 0 0 2 3 2 B-10 0 0 -3 3 2 B-11 0 0 material group in nuclide mean std. dev. -4 4 1 H-1 0.188813 0.045599 -5 4 1 O-16 0.066636 0.008217 -6 4 1 B-10 0.000232 0.000233 -7 4 1 B-11 0.000042 0.000300 -0 4 2 H-1 1.088920 0.221595 -1 4 2 O-16 0.064481 0.014318 -2 4 2 B-10 0.026367 0.010478 -3 4 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev. -4 4 1 H-1 0 0 -5 4 1 O-16 0 0 -6 4 1 B-10 0 0 -7 4 1 B-11 0 0 -0 4 2 H-1 0 0 -1 4 2 O-16 0 0 -2 4 2 B-10 0 0 -3 4 2 B-11 0 0 material group in group out nuclide mean std. dev. -12 4 1 1 H-1 0.166764 0.043861 -13 4 1 1 O-16 0.066172 0.007943 -14 4 1 1 B-10 0.000000 0.000000 -15 4 1 1 B-11 0.000042 0.000300 -8 4 1 2 H-1 0.021817 0.002327 -9 4 1 2 O-16 0.000464 0.000466 -10 4 1 2 B-10 0.000000 0.000000 -11 4 1 2 B-11 0.000000 0.000000 -4 4 2 1 H-1 0.000000 0.000000 -5 4 2 1 O-16 0.000000 0.000000 -6 4 2 1 B-10 0.000000 0.000000 -7 4 2 1 B-11 0.000000 0.000000 -0 4 2 2 H-1 1.082328 0.222438 -1 4 2 2 O-16 0.064481 0.014318 -2 4 2 2 B-10 0.000000 0.000000 -3 4 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev. +3 3 2 B-11 0 0 material group in group out nuclide mean std. dev. +12 3 1 1 H-1 0.178758 0.033618 +13 3 1 1 O-16 0.075042 0.004782 +14 3 1 1 B-10 0.000000 0.000000 +15 3 1 1 B-11 0.000167 0.000208 +8 3 1 2 H-1 0.027124 0.001806 +9 3 1 2 O-16 0.000148 0.000148 +10 3 1 2 B-10 0.000000 0.000000 +11 3 1 2 B-11 0.000000 0.000000 +4 3 2 1 H-1 0.000000 0.000000 +5 3 2 1 O-16 0.000000 0.000000 +6 3 2 1 B-10 0.000000 0.000000 +7 3 2 1 B-11 0.000000 0.000000 +0 3 2 2 H-1 1.305284 0.235145 +1 3 2 2 O-16 0.071243 0.013291 +2 3 2 2 B-10 0.000000 0.000000 +3 3 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev. +4 3 1 H-1 0 0 +5 3 1 O-16 0 0 +6 3 1 B-10 0 0 +7 3 1 B-11 0 0 +0 3 2 H-1 0 0 +1 3 2 O-16 0 0 +2 3 2 B-10 0 0 +3 3 2 B-11 0 0 material group in nuclide mean std. dev. +4 4 1 H-1 0.188813 0.045599 +5 4 1 O-16 0.066636 0.008217 +6 4 1 B-10 0.000232 0.000233 +7 4 1 B-11 0.000042 0.000300 +0 4 2 H-1 1.088920 0.221595 +1 4 2 O-16 0.064481 0.014318 +2 4 2 B-10 0.026367 0.010478 +3 4 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev. 4 4 1 H-1 0 0 5 4 1 O-16 0 0 6 4 1 B-10 0 0 @@ -468,223 +444,31 @@ 0 4 2 H-1 0 0 1 4 2 O-16 0 0 2 4 2 B-10 0 0 -3 4 2 B-11 0 0 material group in nuclide mean std. dev. -27 5 1 Fe-54 0 0 -28 5 1 Fe-56 0 0 -29 5 1 Fe-57 0 0 -30 5 1 Fe-58 0 0 -31 5 1 Ni-58 0 0 -32 5 1 Ni-60 0 0 -33 5 1 Ni-61 0 0 -34 5 1 Ni-62 0 0 -35 5 1 Ni-64 0 0 -36 5 1 Mn-55 0 0 -37 5 1 Mo-92 0 0 -38 5 1 Mo-94 0 0 -39 5 1 Mo-95 0 0 -40 5 1 Mo-96 0 0 -41 5 1 Mo-97 0 0 -42 5 1 Mo-98 0 0 -43 5 1 Mo-100 0 0 -44 5 1 Si-28 0 0 -45 5 1 Si-29 0 0 -46 5 1 Si-30 0 0 -47 5 1 Cr-50 0 0 -48 5 1 Cr-52 0 0 -49 5 1 Cr-53 0 0 -50 5 1 Cr-54 0 0 -51 5 1 C-Nat 0 0 -52 5 1 Cu-63 0 0 -53 5 1 Cu-65 0 0 -0 5 2 Fe-54 0 0 -1 5 2 Fe-56 0 0 -2 5 2 Fe-57 0 0 -3 5 2 Fe-58 0 0 -4 5 2 Ni-58 0 0 -5 5 2 Ni-60 0 0 -6 5 2 Ni-61 0 0 -7 5 2 Ni-62 0 0 -8 5 2 Ni-64 0 0 -9 5 2 Mn-55 0 0 -10 5 2 Mo-92 0 0 -11 5 2 Mo-94 0 0 -12 5 2 Mo-95 0 0 -13 5 2 Mo-96 0 0 -14 5 2 Mo-97 0 0 -15 5 2 Mo-98 0 0 -16 5 2 Mo-100 0 0 -17 5 2 Si-28 0 0 -18 5 2 Si-29 0 0 -19 5 2 Si-30 0 0 -20 5 2 Cr-50 0 0 -21 5 2 Cr-52 0 0 -22 5 2 Cr-53 0 0 -23 5 2 Cr-54 0 0 -24 5 2 C-Nat 0 0 -25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. -27 5 1 Fe-54 0 0 -28 5 1 Fe-56 0 0 -29 5 1 Fe-57 0 0 -30 5 1 Fe-58 0 0 -31 5 1 Ni-58 0 0 -32 5 1 Ni-60 0 0 -33 5 1 Ni-61 0 0 -34 5 1 Ni-62 0 0 -35 5 1 Ni-64 0 0 -36 5 1 Mn-55 0 0 -37 5 1 Mo-92 0 0 -38 5 1 Mo-94 0 0 -39 5 1 Mo-95 0 0 -40 5 1 Mo-96 0 0 -41 5 1 Mo-97 0 0 -42 5 1 Mo-98 0 0 -43 5 1 Mo-100 0 0 -44 5 1 Si-28 0 0 -45 5 1 Si-29 0 0 -46 5 1 Si-30 0 0 -47 5 1 Cr-50 0 0 -48 5 1 Cr-52 0 0 -49 5 1 Cr-53 0 0 -50 5 1 Cr-54 0 0 -51 5 1 C-Nat 0 0 -52 5 1 Cu-63 0 0 -53 5 1 Cu-65 0 0 -0 5 2 Fe-54 0 0 -1 5 2 Fe-56 0 0 -2 5 2 Fe-57 0 0 -3 5 2 Fe-58 0 0 -4 5 2 Ni-58 0 0 -5 5 2 Ni-60 0 0 -6 5 2 Ni-61 0 0 -7 5 2 Ni-62 0 0 -8 5 2 Ni-64 0 0 -9 5 2 Mn-55 0 0 -10 5 2 Mo-92 0 0 -11 5 2 Mo-94 0 0 -12 5 2 Mo-95 0 0 -13 5 2 Mo-96 0 0 -14 5 2 Mo-97 0 0 -15 5 2 Mo-98 0 0 -16 5 2 Mo-100 0 0 -17 5 2 Si-28 0 0 -18 5 2 Si-29 0 0 -19 5 2 Si-30 0 0 -20 5 2 Cr-50 0 0 -21 5 2 Cr-52 0 0 -22 5 2 Cr-53 0 0 -23 5 2 Cr-54 0 0 -24 5 2 C-Nat 0 0 -25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 material group in group out nuclide mean std. dev. -81 5 1 1 Fe-54 0 0 -82 5 1 1 Fe-56 0 0 -83 5 1 1 Fe-57 0 0 -84 5 1 1 Fe-58 0 0 -85 5 1 1 Ni-58 0 0 -86 5 1 1 Ni-60 0 0 -87 5 1 1 Ni-61 0 0 -88 5 1 1 Ni-62 0 0 -89 5 1 1 Ni-64 0 0 -90 5 1 1 Mn-55 0 0 -91 5 1 1 Mo-92 0 0 -92 5 1 1 Mo-94 0 0 -93 5 1 1 Mo-95 0 0 -94 5 1 1 Mo-96 0 0 -95 5 1 1 Mo-97 0 0 -96 5 1 1 Mo-98 0 0 -97 5 1 1 Mo-100 0 0 -98 5 1 1 Si-28 0 0 -99 5 1 1 Si-29 0 0 -100 5 1 1 Si-30 0 0 -101 5 1 1 Cr-50 0 0 -102 5 1 1 Cr-52 0 0 -103 5 1 1 Cr-53 0 0 -104 5 1 1 Cr-54 0 0 -105 5 1 1 C-Nat 0 0 -106 5 1 1 Cu-63 0 0 -107 5 1 1 Cu-65 0 0 -54 5 1 2 Fe-54 0 0 -55 5 1 2 Fe-56 0 0 -56 5 1 2 Fe-57 0 0 -57 5 1 2 Fe-58 0 0 -58 5 1 2 Ni-58 0 0 -59 5 1 2 Ni-60 0 0 -60 5 1 2 Ni-61 0 0 -61 5 1 2 Ni-62 0 0 -62 5 1 2 Ni-64 0 0 -63 5 1 2 Mn-55 0 0 -64 5 1 2 Mo-92 0 0 -65 5 1 2 Mo-94 0 0 -66 5 1 2 Mo-95 0 0 -67 5 1 2 Mo-96 0 0 -68 5 1 2 Mo-97 0 0 -69 5 1 2 Mo-98 0 0 -70 5 1 2 Mo-100 0 0 -71 5 1 2 Si-28 0 0 -72 5 1 2 Si-29 0 0 -73 5 1 2 Si-30 0 0 -74 5 1 2 Cr-50 0 0 -75 5 1 2 Cr-52 0 0 -76 5 1 2 Cr-53 0 0 -77 5 1 2 Cr-54 0 0 -78 5 1 2 C-Nat 0 0 -79 5 1 2 Cu-63 0 0 -80 5 1 2 Cu-65 0 0 -27 5 2 1 Fe-54 0 0 -28 5 2 1 Fe-56 0 0 -29 5 2 1 Fe-57 0 0 -30 5 2 1 Fe-58 0 0 -31 5 2 1 Ni-58 0 0 -32 5 2 1 Ni-60 0 0 -33 5 2 1 Ni-61 0 0 -34 5 2 1 Ni-62 0 0 -35 5 2 1 Ni-64 0 0 -36 5 2 1 Mn-55 0 0 -37 5 2 1 Mo-92 0 0 -38 5 2 1 Mo-94 0 0 -39 5 2 1 Mo-95 0 0 -40 5 2 1 Mo-96 0 0 -41 5 2 1 Mo-97 0 0 -42 5 2 1 Mo-98 0 0 -43 5 2 1 Mo-100 0 0 -44 5 2 1 Si-28 0 0 -45 5 2 1 Si-29 0 0 -46 5 2 1 Si-30 0 0 -47 5 2 1 Cr-50 0 0 -48 5 2 1 Cr-52 0 0 -49 5 2 1 Cr-53 0 0 -50 5 2 1 Cr-54 0 0 -51 5 2 1 C-Nat 0 0 -52 5 2 1 Cu-63 0 0 -53 5 2 1 Cu-65 0 0 -0 5 2 2 Fe-54 0 0 -1 5 2 2 Fe-56 0 0 -2 5 2 2 Fe-57 0 0 -3 5 2 2 Fe-58 0 0 -4 5 2 2 Ni-58 0 0 -5 5 2 2 Ni-60 0 0 -6 5 2 2 Ni-61 0 0 -7 5 2 2 Ni-62 0 0 -8 5 2 2 Ni-64 0 0 -9 5 2 2 Mn-55 0 0 -10 5 2 2 Mo-92 0 0 -11 5 2 2 Mo-94 0 0 -12 5 2 2 Mo-95 0 0 -13 5 2 2 Mo-96 0 0 -14 5 2 2 Mo-97 0 0 -15 5 2 2 Mo-98 0 0 -16 5 2 2 Mo-100 0 0 -17 5 2 2 Si-28 0 0 -18 5 2 2 Si-29 0 0 -19 5 2 2 Si-30 0 0 -20 5 2 2 Cr-50 0 0 -21 5 2 2 Cr-52 0 0 -22 5 2 2 Cr-53 0 0 -23 5 2 2 Cr-54 0 0 -24 5 2 2 C-Nat 0 0 -25 5 2 2 Cu-63 0 0 -26 5 2 2 Cu-65 0 0 material group out nuclide mean std. dev. +3 4 2 B-11 0 0 material group in group out nuclide mean std. dev. +12 4 1 1 H-1 0.166764 0.043861 +13 4 1 1 O-16 0.066172 0.007943 +14 4 1 1 B-10 0.000000 0.000000 +15 4 1 1 B-11 0.000042 0.000300 +8 4 1 2 H-1 0.021817 0.002327 +9 4 1 2 O-16 0.000464 0.000466 +10 4 1 2 B-10 0.000000 0.000000 +11 4 1 2 B-11 0.000000 0.000000 +4 4 2 1 H-1 0.000000 0.000000 +5 4 2 1 O-16 0.000000 0.000000 +6 4 2 1 B-10 0.000000 0.000000 +7 4 2 1 B-11 0.000000 0.000000 +0 4 2 2 H-1 1.082328 0.222438 +1 4 2 2 O-16 0.064481 0.014318 +2 4 2 2 B-10 0.000000 0.000000 +3 4 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev. +4 4 1 H-1 0 0 +5 4 1 O-16 0 0 +6 4 1 B-10 0 0 +7 4 1 B-11 0 0 +0 4 2 H-1 0 0 +1 4 2 O-16 0 0 +2 4 2 B-10 0 0 +3 4 2 B-11 0 0 material group in nuclide mean std. dev. 27 5 1 Fe-54 0 0 28 5 1 Fe-56 0 0 29 5 1 Fe-57 0 0 @@ -738,175 +522,223 @@ 23 5 2 Cr-54 0 0 24 5 2 C-Nat 0 0 25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. -21 6 1 H-1 0 0 -22 6 1 O-16 0 0 -23 6 1 B-10 0 0 -24 6 1 B-11 0 0 -25 6 1 Fe-54 0 0 -26 6 1 Fe-56 0 0 -27 6 1 Fe-57 0 0 -28 6 1 Fe-58 0 0 -29 6 1 Ni-58 0 0 -30 6 1 Ni-60 0 0 -31 6 1 Ni-61 0 0 -32 6 1 Ni-62 0 0 -33 6 1 Ni-64 0 0 -34 6 1 Mn-55 0 0 -35 6 1 Si-28 0 0 -36 6 1 Si-29 0 0 -37 6 1 Si-30 0 0 -38 6 1 Cr-50 0 0 -39 6 1 Cr-52 0 0 -40 6 1 Cr-53 0 0 -41 6 1 Cr-54 0 0 -0 6 2 H-1 0 0 -1 6 2 O-16 0 0 -2 6 2 B-10 0 0 -3 6 2 B-11 0 0 -4 6 2 Fe-54 0 0 -5 6 2 Fe-56 0 0 -6 6 2 Fe-57 0 0 -7 6 2 Fe-58 0 0 -8 6 2 Ni-58 0 0 -9 6 2 Ni-60 0 0 -10 6 2 Ni-61 0 0 -11 6 2 Ni-62 0 0 -12 6 2 Ni-64 0 0 -13 6 2 Mn-55 0 0 -14 6 2 Si-28 0 0 -15 6 2 Si-29 0 0 -16 6 2 Si-30 0 0 -17 6 2 Cr-50 0 0 -18 6 2 Cr-52 0 0 -19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 6 1 H-1 0 0 -22 6 1 O-16 0 0 -23 6 1 B-10 0 0 -24 6 1 B-11 0 0 -25 6 1 Fe-54 0 0 -26 6 1 Fe-56 0 0 -27 6 1 Fe-57 0 0 -28 6 1 Fe-58 0 0 -29 6 1 Ni-58 0 0 -30 6 1 Ni-60 0 0 -31 6 1 Ni-61 0 0 -32 6 1 Ni-62 0 0 -33 6 1 Ni-64 0 0 -34 6 1 Mn-55 0 0 -35 6 1 Si-28 0 0 -36 6 1 Si-29 0 0 -37 6 1 Si-30 0 0 -38 6 1 Cr-50 0 0 -39 6 1 Cr-52 0 0 -40 6 1 Cr-53 0 0 -41 6 1 Cr-54 0 0 -0 6 2 H-1 0 0 -1 6 2 O-16 0 0 -2 6 2 B-10 0 0 -3 6 2 B-11 0 0 -4 6 2 Fe-54 0 0 -5 6 2 Fe-56 0 0 -6 6 2 Fe-57 0 0 -7 6 2 Fe-58 0 0 -8 6 2 Ni-58 0 0 -9 6 2 Ni-60 0 0 -10 6 2 Ni-61 0 0 -11 6 2 Ni-62 0 0 -12 6 2 Ni-64 0 0 -13 6 2 Mn-55 0 0 -14 6 2 Si-28 0 0 -15 6 2 Si-29 0 0 -16 6 2 Si-30 0 0 -17 6 2 Cr-50 0 0 -18 6 2 Cr-52 0 0 -19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 6 1 1 H-1 0 0 -64 6 1 1 O-16 0 0 -65 6 1 1 B-10 0 0 -66 6 1 1 B-11 0 0 -67 6 1 1 Fe-54 0 0 -68 6 1 1 Fe-56 0 0 -69 6 1 1 Fe-57 0 0 -70 6 1 1 Fe-58 0 0 -71 6 1 1 Ni-58 0 0 -72 6 1 1 Ni-60 0 0 -73 6 1 1 Ni-61 0 0 -74 6 1 1 Ni-62 0 0 -75 6 1 1 Ni-64 0 0 -76 6 1 1 Mn-55 0 0 -77 6 1 1 Si-28 0 0 -78 6 1 1 Si-29 0 0 -79 6 1 1 Si-30 0 0 -80 6 1 1 Cr-50 0 0 -81 6 1 1 Cr-52 0 0 -82 6 1 1 Cr-53 0 0 -83 6 1 1 Cr-54 0 0 -42 6 1 2 H-1 0 0 -43 6 1 2 O-16 0 0 -44 6 1 2 B-10 0 0 -45 6 1 2 B-11 0 0 -46 6 1 2 Fe-54 0 0 -47 6 1 2 Fe-56 0 0 -48 6 1 2 Fe-57 0 0 -49 6 1 2 Fe-58 0 0 -50 6 1 2 Ni-58 0 0 -51 6 1 2 Ni-60 0 0 -52 6 1 2 Ni-61 0 0 -53 6 1 2 Ni-62 0 0 -54 6 1 2 Ni-64 0 0 -55 6 1 2 Mn-55 0 0 -56 6 1 2 Si-28 0 0 -57 6 1 2 Si-29 0 0 -58 6 1 2 Si-30 0 0 -59 6 1 2 Cr-50 0 0 -60 6 1 2 Cr-52 0 0 -61 6 1 2 Cr-53 0 0 -62 6 1 2 Cr-54 0 0 -21 6 2 1 H-1 0 0 -22 6 2 1 O-16 0 0 -23 6 2 1 B-10 0 0 -24 6 2 1 B-11 0 0 -25 6 2 1 Fe-54 0 0 -26 6 2 1 Fe-56 0 0 -27 6 2 1 Fe-57 0 0 -28 6 2 1 Fe-58 0 0 -29 6 2 1 Ni-58 0 0 -30 6 2 1 Ni-60 0 0 -31 6 2 1 Ni-61 0 0 -32 6 2 1 Ni-62 0 0 -33 6 2 1 Ni-64 0 0 -34 6 2 1 Mn-55 0 0 -35 6 2 1 Si-28 0 0 -36 6 2 1 Si-29 0 0 -37 6 2 1 Si-30 0 0 -38 6 2 1 Cr-50 0 0 -39 6 2 1 Cr-52 0 0 -40 6 2 1 Cr-53 0 0 -41 6 2 1 Cr-54 0 0 -0 6 2 2 H-1 0 0 -1 6 2 2 O-16 0 0 -2 6 2 2 B-10 0 0 -3 6 2 2 B-11 0 0 -4 6 2 2 Fe-54 0 0 -5 6 2 2 Fe-56 0 0 -6 6 2 2 Fe-57 0 0 -7 6 2 2 Fe-58 0 0 -8 6 2 2 Ni-58 0 0 -9 6 2 2 Ni-60 0 0 -10 6 2 2 Ni-61 0 0 -11 6 2 2 Ni-62 0 0 -12 6 2 2 Ni-64 0 0 -13 6 2 2 Mn-55 0 0 -14 6 2 2 Si-28 0 0 -15 6 2 2 Si-29 0 0 -16 6 2 2 Si-30 0 0 -17 6 2 2 Cr-50 0 0 -18 6 2 2 Cr-52 0 0 -19 6 2 2 Cr-53 0 0 -20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. +27 5 1 Fe-54 0 0 +28 5 1 Fe-56 0 0 +29 5 1 Fe-57 0 0 +30 5 1 Fe-58 0 0 +31 5 1 Ni-58 0 0 +32 5 1 Ni-60 0 0 +33 5 1 Ni-61 0 0 +34 5 1 Ni-62 0 0 +35 5 1 Ni-64 0 0 +36 5 1 Mn-55 0 0 +37 5 1 Mo-92 0 0 +38 5 1 Mo-94 0 0 +39 5 1 Mo-95 0 0 +40 5 1 Mo-96 0 0 +41 5 1 Mo-97 0 0 +42 5 1 Mo-98 0 0 +43 5 1 Mo-100 0 0 +44 5 1 Si-28 0 0 +45 5 1 Si-29 0 0 +46 5 1 Si-30 0 0 +47 5 1 Cr-50 0 0 +48 5 1 Cr-52 0 0 +49 5 1 Cr-53 0 0 +50 5 1 Cr-54 0 0 +51 5 1 C-Nat 0 0 +52 5 1 Cu-63 0 0 +53 5 1 Cu-65 0 0 +0 5 2 Fe-54 0 0 +1 5 2 Fe-56 0 0 +2 5 2 Fe-57 0 0 +3 5 2 Fe-58 0 0 +4 5 2 Ni-58 0 0 +5 5 2 Ni-60 0 0 +6 5 2 Ni-61 0 0 +7 5 2 Ni-62 0 0 +8 5 2 Ni-64 0 0 +9 5 2 Mn-55 0 0 +10 5 2 Mo-92 0 0 +11 5 2 Mo-94 0 0 +12 5 2 Mo-95 0 0 +13 5 2 Mo-96 0 0 +14 5 2 Mo-97 0 0 +15 5 2 Mo-98 0 0 +16 5 2 Mo-100 0 0 +17 5 2 Si-28 0 0 +18 5 2 Si-29 0 0 +19 5 2 Si-30 0 0 +20 5 2 Cr-50 0 0 +21 5 2 Cr-52 0 0 +22 5 2 Cr-53 0 0 +23 5 2 Cr-54 0 0 +24 5 2 C-Nat 0 0 +25 5 2 Cu-63 0 0 +26 5 2 Cu-65 0 0 material group in group out nuclide mean std. dev. +81 5 1 1 Fe-54 0 0 +82 5 1 1 Fe-56 0 0 +83 5 1 1 Fe-57 0 0 +84 5 1 1 Fe-58 0 0 +85 5 1 1 Ni-58 0 0 +86 5 1 1 Ni-60 0 0 +87 5 1 1 Ni-61 0 0 +88 5 1 1 Ni-62 0 0 +89 5 1 1 Ni-64 0 0 +90 5 1 1 Mn-55 0 0 +91 5 1 1 Mo-92 0 0 +92 5 1 1 Mo-94 0 0 +93 5 1 1 Mo-95 0 0 +94 5 1 1 Mo-96 0 0 +95 5 1 1 Mo-97 0 0 +96 5 1 1 Mo-98 0 0 +97 5 1 1 Mo-100 0 0 +98 5 1 1 Si-28 0 0 +99 5 1 1 Si-29 0 0 +100 5 1 1 Si-30 0 0 +101 5 1 1 Cr-50 0 0 +102 5 1 1 Cr-52 0 0 +103 5 1 1 Cr-53 0 0 +104 5 1 1 Cr-54 0 0 +105 5 1 1 C-Nat 0 0 +106 5 1 1 Cu-63 0 0 +107 5 1 1 Cu-65 0 0 +54 5 1 2 Fe-54 0 0 +55 5 1 2 Fe-56 0 0 +56 5 1 2 Fe-57 0 0 +57 5 1 2 Fe-58 0 0 +58 5 1 2 Ni-58 0 0 +59 5 1 2 Ni-60 0 0 +60 5 1 2 Ni-61 0 0 +61 5 1 2 Ni-62 0 0 +62 5 1 2 Ni-64 0 0 +63 5 1 2 Mn-55 0 0 +64 5 1 2 Mo-92 0 0 +65 5 1 2 Mo-94 0 0 +66 5 1 2 Mo-95 0 0 +67 5 1 2 Mo-96 0 0 +68 5 1 2 Mo-97 0 0 +69 5 1 2 Mo-98 0 0 +70 5 1 2 Mo-100 0 0 +71 5 1 2 Si-28 0 0 +72 5 1 2 Si-29 0 0 +73 5 1 2 Si-30 0 0 +74 5 1 2 Cr-50 0 0 +75 5 1 2 Cr-52 0 0 +76 5 1 2 Cr-53 0 0 +77 5 1 2 Cr-54 0 0 +78 5 1 2 C-Nat 0 0 +79 5 1 2 Cu-63 0 0 +80 5 1 2 Cu-65 0 0 +27 5 2 1 Fe-54 0 0 +28 5 2 1 Fe-56 0 0 +29 5 2 1 Fe-57 0 0 +30 5 2 1 Fe-58 0 0 +31 5 2 1 Ni-58 0 0 +32 5 2 1 Ni-60 0 0 +33 5 2 1 Ni-61 0 0 +34 5 2 1 Ni-62 0 0 +35 5 2 1 Ni-64 0 0 +36 5 2 1 Mn-55 0 0 +37 5 2 1 Mo-92 0 0 +38 5 2 1 Mo-94 0 0 +39 5 2 1 Mo-95 0 0 +40 5 2 1 Mo-96 0 0 +41 5 2 1 Mo-97 0 0 +42 5 2 1 Mo-98 0 0 +43 5 2 1 Mo-100 0 0 +44 5 2 1 Si-28 0 0 +45 5 2 1 Si-29 0 0 +46 5 2 1 Si-30 0 0 +47 5 2 1 Cr-50 0 0 +48 5 2 1 Cr-52 0 0 +49 5 2 1 Cr-53 0 0 +50 5 2 1 Cr-54 0 0 +51 5 2 1 C-Nat 0 0 +52 5 2 1 Cu-63 0 0 +53 5 2 1 Cu-65 0 0 +0 5 2 2 Fe-54 0 0 +1 5 2 2 Fe-56 0 0 +2 5 2 2 Fe-57 0 0 +3 5 2 2 Fe-58 0 0 +4 5 2 2 Ni-58 0 0 +5 5 2 2 Ni-60 0 0 +6 5 2 2 Ni-61 0 0 +7 5 2 2 Ni-62 0 0 +8 5 2 2 Ni-64 0 0 +9 5 2 2 Mn-55 0 0 +10 5 2 2 Mo-92 0 0 +11 5 2 2 Mo-94 0 0 +12 5 2 2 Mo-95 0 0 +13 5 2 2 Mo-96 0 0 +14 5 2 2 Mo-97 0 0 +15 5 2 2 Mo-98 0 0 +16 5 2 2 Mo-100 0 0 +17 5 2 2 Si-28 0 0 +18 5 2 2 Si-29 0 0 +19 5 2 2 Si-30 0 0 +20 5 2 2 Cr-50 0 0 +21 5 2 2 Cr-52 0 0 +22 5 2 2 Cr-53 0 0 +23 5 2 2 Cr-54 0 0 +24 5 2 2 C-Nat 0 0 +25 5 2 2 Cu-63 0 0 +26 5 2 2 Cu-65 0 0 material group out nuclide mean std. dev. +27 5 1 Fe-54 0 0 +28 5 1 Fe-56 0 0 +29 5 1 Fe-57 0 0 +30 5 1 Fe-58 0 0 +31 5 1 Ni-58 0 0 +32 5 1 Ni-60 0 0 +33 5 1 Ni-61 0 0 +34 5 1 Ni-62 0 0 +35 5 1 Ni-64 0 0 +36 5 1 Mn-55 0 0 +37 5 1 Mo-92 0 0 +38 5 1 Mo-94 0 0 +39 5 1 Mo-95 0 0 +40 5 1 Mo-96 0 0 +41 5 1 Mo-97 0 0 +42 5 1 Mo-98 0 0 +43 5 1 Mo-100 0 0 +44 5 1 Si-28 0 0 +45 5 1 Si-29 0 0 +46 5 1 Si-30 0 0 +47 5 1 Cr-50 0 0 +48 5 1 Cr-52 0 0 +49 5 1 Cr-53 0 0 +50 5 1 Cr-54 0 0 +51 5 1 C-Nat 0 0 +52 5 1 Cu-63 0 0 +53 5 1 Cu-65 0 0 +0 5 2 Fe-54 0 0 +1 5 2 Fe-56 0 0 +2 5 2 Fe-57 0 0 +3 5 2 Fe-58 0 0 +4 5 2 Ni-58 0 0 +5 5 2 Ni-60 0 0 +6 5 2 Ni-61 0 0 +7 5 2 Ni-62 0 0 +8 5 2 Ni-64 0 0 +9 5 2 Mn-55 0 0 +10 5 2 Mo-92 0 0 +11 5 2 Mo-94 0 0 +12 5 2 Mo-95 0 0 +13 5 2 Mo-96 0 0 +14 5 2 Mo-97 0 0 +15 5 2 Mo-98 0 0 +16 5 2 Mo-100 0 0 +17 5 2 Si-28 0 0 +18 5 2 Si-29 0 0 +19 5 2 Si-30 0 0 +20 5 2 Cr-50 0 0 +21 5 2 Cr-52 0 0 +22 5 2 Cr-53 0 0 +23 5 2 Cr-54 0 0 +24 5 2 C-Nat 0 0 +25 5 2 Cu-63 0 0 +26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. 21 6 1 H-1 0 0 22 6 1 O-16 0 0 23 6 1 B-10 0 0 @@ -948,175 +780,175 @@ 17 6 2 Cr-50 0 0 18 6 2 Cr-52 0 0 19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 7 1 H-1 0 0 -22 7 1 O-16 0 0 -23 7 1 B-10 0 0 -24 7 1 B-11 0 0 -25 7 1 Fe-54 0 0 -26 7 1 Fe-56 0 0 -27 7 1 Fe-57 0 0 -28 7 1 Fe-58 0 0 -29 7 1 Ni-58 0 0 -30 7 1 Ni-60 0 0 -31 7 1 Ni-61 0 0 -32 7 1 Ni-62 0 0 -33 7 1 Ni-64 0 0 -34 7 1 Mn-55 0 0 -35 7 1 Si-28 0 0 -36 7 1 Si-29 0 0 -37 7 1 Si-30 0 0 -38 7 1 Cr-50 0 0 -39 7 1 Cr-52 0 0 -40 7 1 Cr-53 0 0 -41 7 1 Cr-54 0 0 -0 7 2 H-1 0 0 -1 7 2 O-16 0 0 -2 7 2 B-10 0 0 -3 7 2 B-11 0 0 -4 7 2 Fe-54 0 0 -5 7 2 Fe-56 0 0 -6 7 2 Fe-57 0 0 -7 7 2 Fe-58 0 0 -8 7 2 Ni-58 0 0 -9 7 2 Ni-60 0 0 -10 7 2 Ni-61 0 0 -11 7 2 Ni-62 0 0 -12 7 2 Ni-64 0 0 -13 7 2 Mn-55 0 0 -14 7 2 Si-28 0 0 -15 7 2 Si-29 0 0 -16 7 2 Si-30 0 0 -17 7 2 Cr-50 0 0 -18 7 2 Cr-52 0 0 -19 7 2 Cr-53 0 0 -20 7 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 7 1 H-1 0 0 -22 7 1 O-16 0 0 -23 7 1 B-10 0 0 -24 7 1 B-11 0 0 -25 7 1 Fe-54 0 0 -26 7 1 Fe-56 0 0 -27 7 1 Fe-57 0 0 -28 7 1 Fe-58 0 0 -29 7 1 Ni-58 0 0 -30 7 1 Ni-60 0 0 -31 7 1 Ni-61 0 0 -32 7 1 Ni-62 0 0 -33 7 1 Ni-64 0 0 -34 7 1 Mn-55 0 0 -35 7 1 Si-28 0 0 -36 7 1 Si-29 0 0 -37 7 1 Si-30 0 0 -38 7 1 Cr-50 0 0 -39 7 1 Cr-52 0 0 -40 7 1 Cr-53 0 0 -41 7 1 Cr-54 0 0 -0 7 2 H-1 0 0 -1 7 2 O-16 0 0 -2 7 2 B-10 0 0 -3 7 2 B-11 0 0 -4 7 2 Fe-54 0 0 -5 7 2 Fe-56 0 0 -6 7 2 Fe-57 0 0 -7 7 2 Fe-58 0 0 -8 7 2 Ni-58 0 0 -9 7 2 Ni-60 0 0 -10 7 2 Ni-61 0 0 -11 7 2 Ni-62 0 0 -12 7 2 Ni-64 0 0 -13 7 2 Mn-55 0 0 -14 7 2 Si-28 0 0 -15 7 2 Si-29 0 0 -16 7 2 Si-30 0 0 -17 7 2 Cr-50 0 0 -18 7 2 Cr-52 0 0 -19 7 2 Cr-53 0 0 -20 7 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 7 1 1 H-1 0 0 -64 7 1 1 O-16 0 0 -65 7 1 1 B-10 0 0 -66 7 1 1 B-11 0 0 -67 7 1 1 Fe-54 0 0 -68 7 1 1 Fe-56 0 0 -69 7 1 1 Fe-57 0 0 -70 7 1 1 Fe-58 0 0 -71 7 1 1 Ni-58 0 0 -72 7 1 1 Ni-60 0 0 -73 7 1 1 Ni-61 0 0 -74 7 1 1 Ni-62 0 0 -75 7 1 1 Ni-64 0 0 -76 7 1 1 Mn-55 0 0 -77 7 1 1 Si-28 0 0 -78 7 1 1 Si-29 0 0 -79 7 1 1 Si-30 0 0 -80 7 1 1 Cr-50 0 0 -81 7 1 1 Cr-52 0 0 -82 7 1 1 Cr-53 0 0 -83 7 1 1 Cr-54 0 0 -42 7 1 2 H-1 0 0 -43 7 1 2 O-16 0 0 -44 7 1 2 B-10 0 0 -45 7 1 2 B-11 0 0 -46 7 1 2 Fe-54 0 0 -47 7 1 2 Fe-56 0 0 -48 7 1 2 Fe-57 0 0 -49 7 1 2 Fe-58 0 0 -50 7 1 2 Ni-58 0 0 -51 7 1 2 Ni-60 0 0 -52 7 1 2 Ni-61 0 0 -53 7 1 2 Ni-62 0 0 -54 7 1 2 Ni-64 0 0 -55 7 1 2 Mn-55 0 0 -56 7 1 2 Si-28 0 0 -57 7 1 2 Si-29 0 0 -58 7 1 2 Si-30 0 0 -59 7 1 2 Cr-50 0 0 -60 7 1 2 Cr-52 0 0 -61 7 1 2 Cr-53 0 0 -62 7 1 2 Cr-54 0 0 -21 7 2 1 H-1 0 0 -22 7 2 1 O-16 0 0 -23 7 2 1 B-10 0 0 -24 7 2 1 B-11 0 0 -25 7 2 1 Fe-54 0 0 -26 7 2 1 Fe-56 0 0 -27 7 2 1 Fe-57 0 0 -28 7 2 1 Fe-58 0 0 -29 7 2 1 Ni-58 0 0 -30 7 2 1 Ni-60 0 0 -31 7 2 1 Ni-61 0 0 -32 7 2 1 Ni-62 0 0 -33 7 2 1 Ni-64 0 0 -34 7 2 1 Mn-55 0 0 -35 7 2 1 Si-28 0 0 -36 7 2 1 Si-29 0 0 -37 7 2 1 Si-30 0 0 -38 7 2 1 Cr-50 0 0 -39 7 2 1 Cr-52 0 0 -40 7 2 1 Cr-53 0 0 -41 7 2 1 Cr-54 0 0 -0 7 2 2 H-1 0 0 -1 7 2 2 O-16 0 0 -2 7 2 2 B-10 0 0 -3 7 2 2 B-11 0 0 -4 7 2 2 Fe-54 0 0 -5 7 2 2 Fe-56 0 0 -6 7 2 2 Fe-57 0 0 -7 7 2 2 Fe-58 0 0 -8 7 2 2 Ni-58 0 0 -9 7 2 2 Ni-60 0 0 -10 7 2 2 Ni-61 0 0 -11 7 2 2 Ni-62 0 0 -12 7 2 2 Ni-64 0 0 -13 7 2 2 Mn-55 0 0 -14 7 2 2 Si-28 0 0 -15 7 2 2 Si-29 0 0 -16 7 2 2 Si-30 0 0 -17 7 2 2 Cr-50 0 0 -18 7 2 2 Cr-52 0 0 -19 7 2 2 Cr-53 0 0 -20 7 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 6 1 1 H-1 0 0 +64 6 1 1 O-16 0 0 +65 6 1 1 B-10 0 0 +66 6 1 1 B-11 0 0 +67 6 1 1 Fe-54 0 0 +68 6 1 1 Fe-56 0 0 +69 6 1 1 Fe-57 0 0 +70 6 1 1 Fe-58 0 0 +71 6 1 1 Ni-58 0 0 +72 6 1 1 Ni-60 0 0 +73 6 1 1 Ni-61 0 0 +74 6 1 1 Ni-62 0 0 +75 6 1 1 Ni-64 0 0 +76 6 1 1 Mn-55 0 0 +77 6 1 1 Si-28 0 0 +78 6 1 1 Si-29 0 0 +79 6 1 1 Si-30 0 0 +80 6 1 1 Cr-50 0 0 +81 6 1 1 Cr-52 0 0 +82 6 1 1 Cr-53 0 0 +83 6 1 1 Cr-54 0 0 +42 6 1 2 H-1 0 0 +43 6 1 2 O-16 0 0 +44 6 1 2 B-10 0 0 +45 6 1 2 B-11 0 0 +46 6 1 2 Fe-54 0 0 +47 6 1 2 Fe-56 0 0 +48 6 1 2 Fe-57 0 0 +49 6 1 2 Fe-58 0 0 +50 6 1 2 Ni-58 0 0 +51 6 1 2 Ni-60 0 0 +52 6 1 2 Ni-61 0 0 +53 6 1 2 Ni-62 0 0 +54 6 1 2 Ni-64 0 0 +55 6 1 2 Mn-55 0 0 +56 6 1 2 Si-28 0 0 +57 6 1 2 Si-29 0 0 +58 6 1 2 Si-30 0 0 +59 6 1 2 Cr-50 0 0 +60 6 1 2 Cr-52 0 0 +61 6 1 2 Cr-53 0 0 +62 6 1 2 Cr-54 0 0 +21 6 2 1 H-1 0 0 +22 6 2 1 O-16 0 0 +23 6 2 1 B-10 0 0 +24 6 2 1 B-11 0 0 +25 6 2 1 Fe-54 0 0 +26 6 2 1 Fe-56 0 0 +27 6 2 1 Fe-57 0 0 +28 6 2 1 Fe-58 0 0 +29 6 2 1 Ni-58 0 0 +30 6 2 1 Ni-60 0 0 +31 6 2 1 Ni-61 0 0 +32 6 2 1 Ni-62 0 0 +33 6 2 1 Ni-64 0 0 +34 6 2 1 Mn-55 0 0 +35 6 2 1 Si-28 0 0 +36 6 2 1 Si-29 0 0 +37 6 2 1 Si-30 0 0 +38 6 2 1 Cr-50 0 0 +39 6 2 1 Cr-52 0 0 +40 6 2 1 Cr-53 0 0 +41 6 2 1 Cr-54 0 0 +0 6 2 2 H-1 0 0 +1 6 2 2 O-16 0 0 +2 6 2 2 B-10 0 0 +3 6 2 2 B-11 0 0 +4 6 2 2 Fe-54 0 0 +5 6 2 2 Fe-56 0 0 +6 6 2 2 Fe-57 0 0 +7 6 2 2 Fe-58 0 0 +8 6 2 2 Ni-58 0 0 +9 6 2 2 Ni-60 0 0 +10 6 2 2 Ni-61 0 0 +11 6 2 2 Ni-62 0 0 +12 6 2 2 Ni-64 0 0 +13 6 2 2 Mn-55 0 0 +14 6 2 2 Si-28 0 0 +15 6 2 2 Si-29 0 0 +16 6 2 2 Si-30 0 0 +17 6 2 2 Cr-50 0 0 +18 6 2 2 Cr-52 0 0 +19 6 2 2 Cr-53 0 0 +20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. 21 7 1 H-1 0 0 22 7 1 O-16 0 0 23 7 1 B-10 0 0 @@ -1158,175 +990,175 @@ 17 7 2 Cr-50 0 0 18 7 2 Cr-52 0 0 19 7 2 Cr-53 0 0 -20 7 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 8 1 H-1 0 0 -22 8 1 O-16 0 0 -23 8 1 B-10 0 0 -24 8 1 B-11 0 0 -25 8 1 Fe-54 0 0 -26 8 1 Fe-56 0 0 -27 8 1 Fe-57 0 0 -28 8 1 Fe-58 0 0 -29 8 1 Ni-58 0 0 -30 8 1 Ni-60 0 0 -31 8 1 Ni-61 0 0 -32 8 1 Ni-62 0 0 -33 8 1 Ni-64 0 0 -34 8 1 Mn-55 0 0 -35 8 1 Si-28 0 0 -36 8 1 Si-29 0 0 -37 8 1 Si-30 0 0 -38 8 1 Cr-50 0 0 -39 8 1 Cr-52 0 0 -40 8 1 Cr-53 0 0 -41 8 1 Cr-54 0 0 -0 8 2 H-1 0 0 -1 8 2 O-16 0 0 -2 8 2 B-10 0 0 -3 8 2 B-11 0 0 -4 8 2 Fe-54 0 0 -5 8 2 Fe-56 0 0 -6 8 2 Fe-57 0 0 -7 8 2 Fe-58 0 0 -8 8 2 Ni-58 0 0 -9 8 2 Ni-60 0 0 -10 8 2 Ni-61 0 0 -11 8 2 Ni-62 0 0 -12 8 2 Ni-64 0 0 -13 8 2 Mn-55 0 0 -14 8 2 Si-28 0 0 -15 8 2 Si-29 0 0 -16 8 2 Si-30 0 0 -17 8 2 Cr-50 0 0 -18 8 2 Cr-52 0 0 -19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 8 1 H-1 0 0 -22 8 1 O-16 0 0 -23 8 1 B-10 0 0 -24 8 1 B-11 0 0 -25 8 1 Fe-54 0 0 -26 8 1 Fe-56 0 0 -27 8 1 Fe-57 0 0 -28 8 1 Fe-58 0 0 -29 8 1 Ni-58 0 0 -30 8 1 Ni-60 0 0 -31 8 1 Ni-61 0 0 -32 8 1 Ni-62 0 0 -33 8 1 Ni-64 0 0 -34 8 1 Mn-55 0 0 -35 8 1 Si-28 0 0 -36 8 1 Si-29 0 0 -37 8 1 Si-30 0 0 -38 8 1 Cr-50 0 0 -39 8 1 Cr-52 0 0 -40 8 1 Cr-53 0 0 -41 8 1 Cr-54 0 0 -0 8 2 H-1 0 0 -1 8 2 O-16 0 0 -2 8 2 B-10 0 0 -3 8 2 B-11 0 0 -4 8 2 Fe-54 0 0 -5 8 2 Fe-56 0 0 -6 8 2 Fe-57 0 0 -7 8 2 Fe-58 0 0 -8 8 2 Ni-58 0 0 -9 8 2 Ni-60 0 0 -10 8 2 Ni-61 0 0 -11 8 2 Ni-62 0 0 -12 8 2 Ni-64 0 0 -13 8 2 Mn-55 0 0 -14 8 2 Si-28 0 0 -15 8 2 Si-29 0 0 -16 8 2 Si-30 0 0 -17 8 2 Cr-50 0 0 -18 8 2 Cr-52 0 0 -19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 8 1 1 H-1 0 0 -64 8 1 1 O-16 0 0 -65 8 1 1 B-10 0 0 -66 8 1 1 B-11 0 0 -67 8 1 1 Fe-54 0 0 -68 8 1 1 Fe-56 0 0 -69 8 1 1 Fe-57 0 0 -70 8 1 1 Fe-58 0 0 -71 8 1 1 Ni-58 0 0 -72 8 1 1 Ni-60 0 0 -73 8 1 1 Ni-61 0 0 -74 8 1 1 Ni-62 0 0 -75 8 1 1 Ni-64 0 0 -76 8 1 1 Mn-55 0 0 -77 8 1 1 Si-28 0 0 -78 8 1 1 Si-29 0 0 -79 8 1 1 Si-30 0 0 -80 8 1 1 Cr-50 0 0 -81 8 1 1 Cr-52 0 0 -82 8 1 1 Cr-53 0 0 -83 8 1 1 Cr-54 0 0 -42 8 1 2 H-1 0 0 -43 8 1 2 O-16 0 0 -44 8 1 2 B-10 0 0 -45 8 1 2 B-11 0 0 -46 8 1 2 Fe-54 0 0 -47 8 1 2 Fe-56 0 0 -48 8 1 2 Fe-57 0 0 -49 8 1 2 Fe-58 0 0 -50 8 1 2 Ni-58 0 0 -51 8 1 2 Ni-60 0 0 -52 8 1 2 Ni-61 0 0 -53 8 1 2 Ni-62 0 0 -54 8 1 2 Ni-64 0 0 -55 8 1 2 Mn-55 0 0 -56 8 1 2 Si-28 0 0 -57 8 1 2 Si-29 0 0 -58 8 1 2 Si-30 0 0 -59 8 1 2 Cr-50 0 0 -60 8 1 2 Cr-52 0 0 -61 8 1 2 Cr-53 0 0 -62 8 1 2 Cr-54 0 0 -21 8 2 1 H-1 0 0 -22 8 2 1 O-16 0 0 -23 8 2 1 B-10 0 0 -24 8 2 1 B-11 0 0 -25 8 2 1 Fe-54 0 0 -26 8 2 1 Fe-56 0 0 -27 8 2 1 Fe-57 0 0 -28 8 2 1 Fe-58 0 0 -29 8 2 1 Ni-58 0 0 -30 8 2 1 Ni-60 0 0 -31 8 2 1 Ni-61 0 0 -32 8 2 1 Ni-62 0 0 -33 8 2 1 Ni-64 0 0 -34 8 2 1 Mn-55 0 0 -35 8 2 1 Si-28 0 0 -36 8 2 1 Si-29 0 0 -37 8 2 1 Si-30 0 0 -38 8 2 1 Cr-50 0 0 -39 8 2 1 Cr-52 0 0 -40 8 2 1 Cr-53 0 0 -41 8 2 1 Cr-54 0 0 -0 8 2 2 H-1 0 0 -1 8 2 2 O-16 0 0 -2 8 2 2 B-10 0 0 -3 8 2 2 B-11 0 0 -4 8 2 2 Fe-54 0 0 -5 8 2 2 Fe-56 0 0 -6 8 2 2 Fe-57 0 0 -7 8 2 2 Fe-58 0 0 -8 8 2 2 Ni-58 0 0 -9 8 2 2 Ni-60 0 0 -10 8 2 2 Ni-61 0 0 -11 8 2 2 Ni-62 0 0 -12 8 2 2 Ni-64 0 0 -13 8 2 2 Mn-55 0 0 -14 8 2 2 Si-28 0 0 -15 8 2 2 Si-29 0 0 -16 8 2 2 Si-30 0 0 -17 8 2 2 Cr-50 0 0 -18 8 2 2 Cr-52 0 0 -19 8 2 2 Cr-53 0 0 -20 8 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +20 7 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 7 1 H-1 0 0 +22 7 1 O-16 0 0 +23 7 1 B-10 0 0 +24 7 1 B-11 0 0 +25 7 1 Fe-54 0 0 +26 7 1 Fe-56 0 0 +27 7 1 Fe-57 0 0 +28 7 1 Fe-58 0 0 +29 7 1 Ni-58 0 0 +30 7 1 Ni-60 0 0 +31 7 1 Ni-61 0 0 +32 7 1 Ni-62 0 0 +33 7 1 Ni-64 0 0 +34 7 1 Mn-55 0 0 +35 7 1 Si-28 0 0 +36 7 1 Si-29 0 0 +37 7 1 Si-30 0 0 +38 7 1 Cr-50 0 0 +39 7 1 Cr-52 0 0 +40 7 1 Cr-53 0 0 +41 7 1 Cr-54 0 0 +0 7 2 H-1 0 0 +1 7 2 O-16 0 0 +2 7 2 B-10 0 0 +3 7 2 B-11 0 0 +4 7 2 Fe-54 0 0 +5 7 2 Fe-56 0 0 +6 7 2 Fe-57 0 0 +7 7 2 Fe-58 0 0 +8 7 2 Ni-58 0 0 +9 7 2 Ni-60 0 0 +10 7 2 Ni-61 0 0 +11 7 2 Ni-62 0 0 +12 7 2 Ni-64 0 0 +13 7 2 Mn-55 0 0 +14 7 2 Si-28 0 0 +15 7 2 Si-29 0 0 +16 7 2 Si-30 0 0 +17 7 2 Cr-50 0 0 +18 7 2 Cr-52 0 0 +19 7 2 Cr-53 0 0 +20 7 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 7 1 1 H-1 0 0 +64 7 1 1 O-16 0 0 +65 7 1 1 B-10 0 0 +66 7 1 1 B-11 0 0 +67 7 1 1 Fe-54 0 0 +68 7 1 1 Fe-56 0 0 +69 7 1 1 Fe-57 0 0 +70 7 1 1 Fe-58 0 0 +71 7 1 1 Ni-58 0 0 +72 7 1 1 Ni-60 0 0 +73 7 1 1 Ni-61 0 0 +74 7 1 1 Ni-62 0 0 +75 7 1 1 Ni-64 0 0 +76 7 1 1 Mn-55 0 0 +77 7 1 1 Si-28 0 0 +78 7 1 1 Si-29 0 0 +79 7 1 1 Si-30 0 0 +80 7 1 1 Cr-50 0 0 +81 7 1 1 Cr-52 0 0 +82 7 1 1 Cr-53 0 0 +83 7 1 1 Cr-54 0 0 +42 7 1 2 H-1 0 0 +43 7 1 2 O-16 0 0 +44 7 1 2 B-10 0 0 +45 7 1 2 B-11 0 0 +46 7 1 2 Fe-54 0 0 +47 7 1 2 Fe-56 0 0 +48 7 1 2 Fe-57 0 0 +49 7 1 2 Fe-58 0 0 +50 7 1 2 Ni-58 0 0 +51 7 1 2 Ni-60 0 0 +52 7 1 2 Ni-61 0 0 +53 7 1 2 Ni-62 0 0 +54 7 1 2 Ni-64 0 0 +55 7 1 2 Mn-55 0 0 +56 7 1 2 Si-28 0 0 +57 7 1 2 Si-29 0 0 +58 7 1 2 Si-30 0 0 +59 7 1 2 Cr-50 0 0 +60 7 1 2 Cr-52 0 0 +61 7 1 2 Cr-53 0 0 +62 7 1 2 Cr-54 0 0 +21 7 2 1 H-1 0 0 +22 7 2 1 O-16 0 0 +23 7 2 1 B-10 0 0 +24 7 2 1 B-11 0 0 +25 7 2 1 Fe-54 0 0 +26 7 2 1 Fe-56 0 0 +27 7 2 1 Fe-57 0 0 +28 7 2 1 Fe-58 0 0 +29 7 2 1 Ni-58 0 0 +30 7 2 1 Ni-60 0 0 +31 7 2 1 Ni-61 0 0 +32 7 2 1 Ni-62 0 0 +33 7 2 1 Ni-64 0 0 +34 7 2 1 Mn-55 0 0 +35 7 2 1 Si-28 0 0 +36 7 2 1 Si-29 0 0 +37 7 2 1 Si-30 0 0 +38 7 2 1 Cr-50 0 0 +39 7 2 1 Cr-52 0 0 +40 7 2 1 Cr-53 0 0 +41 7 2 1 Cr-54 0 0 +0 7 2 2 H-1 0 0 +1 7 2 2 O-16 0 0 +2 7 2 2 B-10 0 0 +3 7 2 2 B-11 0 0 +4 7 2 2 Fe-54 0 0 +5 7 2 2 Fe-56 0 0 +6 7 2 2 Fe-57 0 0 +7 7 2 2 Fe-58 0 0 +8 7 2 2 Ni-58 0 0 +9 7 2 2 Ni-60 0 0 +10 7 2 2 Ni-61 0 0 +11 7 2 2 Ni-62 0 0 +12 7 2 2 Ni-64 0 0 +13 7 2 2 Mn-55 0 0 +14 7 2 2 Si-28 0 0 +15 7 2 2 Si-29 0 0 +16 7 2 2 Si-30 0 0 +17 7 2 2 Cr-50 0 0 +18 7 2 2 Cr-52 0 0 +19 7 2 2 Cr-53 0 0 +20 7 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 7 1 H-1 0 0 +22 7 1 O-16 0 0 +23 7 1 B-10 0 0 +24 7 1 B-11 0 0 +25 7 1 Fe-54 0 0 +26 7 1 Fe-56 0 0 +27 7 1 Fe-57 0 0 +28 7 1 Fe-58 0 0 +29 7 1 Ni-58 0 0 +30 7 1 Ni-60 0 0 +31 7 1 Ni-61 0 0 +32 7 1 Ni-62 0 0 +33 7 1 Ni-64 0 0 +34 7 1 Mn-55 0 0 +35 7 1 Si-28 0 0 +36 7 1 Si-29 0 0 +37 7 1 Si-30 0 0 +38 7 1 Cr-50 0 0 +39 7 1 Cr-52 0 0 +40 7 1 Cr-53 0 0 +41 7 1 Cr-54 0 0 +0 7 2 H-1 0 0 +1 7 2 O-16 0 0 +2 7 2 B-10 0 0 +3 7 2 B-11 0 0 +4 7 2 Fe-54 0 0 +5 7 2 Fe-56 0 0 +6 7 2 Fe-57 0 0 +7 7 2 Fe-58 0 0 +8 7 2 Ni-58 0 0 +9 7 2 Ni-60 0 0 +10 7 2 Ni-61 0 0 +11 7 2 Ni-62 0 0 +12 7 2 Ni-64 0 0 +13 7 2 Mn-55 0 0 +14 7 2 Si-28 0 0 +15 7 2 Si-29 0 0 +16 7 2 Si-30 0 0 +17 7 2 Cr-50 0 0 +18 7 2 Cr-52 0 0 +19 7 2 Cr-53 0 0 +20 7 2 Cr-54 0 0 material group in nuclide mean std. dev. 21 8 1 H-1 0 0 22 8 1 O-16 0 0 23 8 1 B-10 0 0 @@ -1368,175 +1200,217 @@ 17 8 2 Cr-50 0 0 18 8 2 Cr-52 0 0 19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 9 1 H-1 0.106160 0.179178 -22 9 1 O-16 0.272020 0.171699 -23 9 1 B-10 0.000000 0.000000 -24 9 1 B-11 0.000000 0.000000 -25 9 1 Fe-54 0.000000 0.000000 -26 9 1 Fe-56 0.000000 0.000000 -27 9 1 Fe-57 0.000000 0.000000 -28 9 1 Fe-58 0.000000 0.000000 -29 9 1 Ni-58 0.000000 0.000000 -30 9 1 Ni-60 0.000000 0.000000 -31 9 1 Ni-61 0.000000 0.000000 -32 9 1 Ni-62 0.000000 0.000000 -33 9 1 Ni-64 0.000000 0.000000 -34 9 1 Mn-55 0.085133 0.082479 -35 9 1 Si-28 0.000000 0.000000 -36 9 1 Si-29 0.000000 0.000000 -37 9 1 Si-30 0.000000 0.000000 -38 9 1 Cr-50 0.000000 0.000000 -39 9 1 Cr-52 0.000000 0.000000 -40 9 1 Cr-53 0.040723 0.079827 -41 9 1 Cr-54 0.000000 0.000000 -0 9 2 H-1 1.417955 2.158027 -1 9 2 O-16 0.000000 0.000000 -2 9 2 B-10 0.269141 0.380622 -3 9 2 B-11 0.000000 0.000000 -4 9 2 Fe-54 0.000000 0.000000 -5 9 2 Fe-56 0.000000 0.000000 -6 9 2 Fe-57 0.000000 0.000000 -7 9 2 Fe-58 0.000000 0.000000 -8 9 2 Ni-58 0.000000 0.000000 -9 9 2 Ni-60 0.000000 0.000000 -10 9 2 Ni-61 0.000000 0.000000 -11 9 2 Ni-62 0.000000 0.000000 -12 9 2 Ni-64 0.000000 0.000000 -13 9 2 Mn-55 0.000000 0.000000 -14 9 2 Si-28 0.000000 0.000000 -15 9 2 Si-29 0.000000 0.000000 -16 9 2 Si-30 0.000000 0.000000 -17 9 2 Cr-50 0.000000 0.000000 -18 9 2 Cr-52 0.000000 0.000000 -19 9 2 Cr-53 0.000000 0.000000 -20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. -21 9 1 H-1 0 0 -22 9 1 O-16 0 0 -23 9 1 B-10 0 0 -24 9 1 B-11 0 0 -25 9 1 Fe-54 0 0 -26 9 1 Fe-56 0 0 -27 9 1 Fe-57 0 0 -28 9 1 Fe-58 0 0 -29 9 1 Ni-58 0 0 -30 9 1 Ni-60 0 0 -31 9 1 Ni-61 0 0 -32 9 1 Ni-62 0 0 -33 9 1 Ni-64 0 0 -34 9 1 Mn-55 0 0 -35 9 1 Si-28 0 0 -36 9 1 Si-29 0 0 -37 9 1 Si-30 0 0 -38 9 1 Cr-50 0 0 -39 9 1 Cr-52 0 0 -40 9 1 Cr-53 0 0 -41 9 1 Cr-54 0 0 -0 9 2 H-1 0 0 -1 9 2 O-16 0 0 -2 9 2 B-10 0 0 -3 9 2 B-11 0 0 -4 9 2 Fe-54 0 0 -5 9 2 Fe-56 0 0 -6 9 2 Fe-57 0 0 -7 9 2 Fe-58 0 0 -8 9 2 Ni-58 0 0 -9 9 2 Ni-60 0 0 -10 9 2 Ni-61 0 0 -11 9 2 Ni-62 0 0 -12 9 2 Ni-64 0 0 -13 9 2 Mn-55 0 0 -14 9 2 Si-28 0 0 -15 9 2 Si-29 0 0 -16 9 2 Si-30 0 0 -17 9 2 Cr-50 0 0 -18 9 2 Cr-52 0 0 -19 9 2 Cr-53 0 0 -20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 9 1 1 H-1 0.106160 0.179178 -64 9 1 1 O-16 0.272020 0.171699 -65 9 1 1 B-10 0.000000 0.000000 -66 9 1 1 B-11 0.000000 0.000000 -67 9 1 1 Fe-54 0.000000 0.000000 -68 9 1 1 Fe-56 0.000000 0.000000 -69 9 1 1 Fe-57 0.000000 0.000000 -70 9 1 1 Fe-58 0.000000 0.000000 -71 9 1 1 Ni-58 0.000000 0.000000 -72 9 1 1 Ni-60 0.000000 0.000000 -73 9 1 1 Ni-61 0.000000 0.000000 -74 9 1 1 Ni-62 0.000000 0.000000 -75 9 1 1 Ni-64 0.000000 0.000000 -76 9 1 1 Mn-55 0.085133 0.082479 -77 9 1 1 Si-28 0.000000 0.000000 -78 9 1 1 Si-29 0.000000 0.000000 -79 9 1 1 Si-30 0.000000 0.000000 -80 9 1 1 Cr-50 0.000000 0.000000 -81 9 1 1 Cr-52 0.000000 0.000000 -82 9 1 1 Cr-53 0.040723 0.079827 -83 9 1 1 Cr-54 0.000000 0.000000 -42 9 1 2 H-1 0.000000 0.000000 -43 9 1 2 O-16 0.000000 0.000000 -44 9 1 2 B-10 0.000000 0.000000 -45 9 1 2 B-11 0.000000 0.000000 -46 9 1 2 Fe-54 0.000000 0.000000 -47 9 1 2 Fe-56 0.000000 0.000000 -48 9 1 2 Fe-57 0.000000 0.000000 -49 9 1 2 Fe-58 0.000000 0.000000 -50 9 1 2 Ni-58 0.000000 0.000000 -51 9 1 2 Ni-60 0.000000 0.000000 -52 9 1 2 Ni-61 0.000000 0.000000 -53 9 1 2 Ni-62 0.000000 0.000000 -54 9 1 2 Ni-64 0.000000 0.000000 -55 9 1 2 Mn-55 0.000000 0.000000 -56 9 1 2 Si-28 0.000000 0.000000 -57 9 1 2 Si-29 0.000000 0.000000 -58 9 1 2 Si-30 0.000000 0.000000 -59 9 1 2 Cr-50 0.000000 0.000000 -60 9 1 2 Cr-52 0.000000 0.000000 -61 9 1 2 Cr-53 0.000000 0.000000 -62 9 1 2 Cr-54 0.000000 0.000000 -21 9 2 1 H-1 0.000000 0.000000 -22 9 2 1 O-16 0.000000 0.000000 -23 9 2 1 B-10 0.000000 0.000000 -24 9 2 1 B-11 0.000000 0.000000 -25 9 2 1 Fe-54 0.000000 0.000000 -26 9 2 1 Fe-56 0.000000 0.000000 -27 9 2 1 Fe-57 0.000000 0.000000 -28 9 2 1 Fe-58 0.000000 0.000000 -29 9 2 1 Ni-58 0.000000 0.000000 -30 9 2 1 Ni-60 0.000000 0.000000 -31 9 2 1 Ni-61 0.000000 0.000000 -32 9 2 1 Ni-62 0.000000 0.000000 -33 9 2 1 Ni-64 0.000000 0.000000 -34 9 2 1 Mn-55 0.000000 0.000000 -35 9 2 1 Si-28 0.000000 0.000000 -36 9 2 1 Si-29 0.000000 0.000000 -37 9 2 1 Si-30 0.000000 0.000000 -38 9 2 1 Cr-50 0.000000 0.000000 -39 9 2 1 Cr-52 0.000000 0.000000 -40 9 2 1 Cr-53 0.000000 0.000000 -41 9 2 1 Cr-54 0.000000 0.000000 -0 9 2 2 H-1 1.417955 2.158027 -1 9 2 2 O-16 0.000000 0.000000 -2 9 2 2 B-10 0.000000 0.000000 -3 9 2 2 B-11 0.000000 0.000000 -4 9 2 2 Fe-54 0.000000 0.000000 -5 9 2 2 Fe-56 0.000000 0.000000 -6 9 2 2 Fe-57 0.000000 0.000000 -7 9 2 2 Fe-58 0.000000 0.000000 -8 9 2 2 Ni-58 0.000000 0.000000 -9 9 2 2 Ni-60 0.000000 0.000000 -10 9 2 2 Ni-61 0.000000 0.000000 -11 9 2 2 Ni-62 0.000000 0.000000 -12 9 2 2 Ni-64 0.000000 0.000000 -13 9 2 2 Mn-55 0.000000 0.000000 -14 9 2 2 Si-28 0.000000 0.000000 -15 9 2 2 Si-29 0.000000 0.000000 -16 9 2 2 Si-30 0.000000 0.000000 -17 9 2 2 Cr-50 0.000000 0.000000 -18 9 2 2 Cr-52 0.000000 0.000000 -19 9 2 2 Cr-53 0.000000 0.000000 -20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 8 1 H-1 0 0 +22 8 1 O-16 0 0 +23 8 1 B-10 0 0 +24 8 1 B-11 0 0 +25 8 1 Fe-54 0 0 +26 8 1 Fe-56 0 0 +27 8 1 Fe-57 0 0 +28 8 1 Fe-58 0 0 +29 8 1 Ni-58 0 0 +30 8 1 Ni-60 0 0 +31 8 1 Ni-61 0 0 +32 8 1 Ni-62 0 0 +33 8 1 Ni-64 0 0 +34 8 1 Mn-55 0 0 +35 8 1 Si-28 0 0 +36 8 1 Si-29 0 0 +37 8 1 Si-30 0 0 +38 8 1 Cr-50 0 0 +39 8 1 Cr-52 0 0 +40 8 1 Cr-53 0 0 +41 8 1 Cr-54 0 0 +0 8 2 H-1 0 0 +1 8 2 O-16 0 0 +2 8 2 B-10 0 0 +3 8 2 B-11 0 0 +4 8 2 Fe-54 0 0 +5 8 2 Fe-56 0 0 +6 8 2 Fe-57 0 0 +7 8 2 Fe-58 0 0 +8 8 2 Ni-58 0 0 +9 8 2 Ni-60 0 0 +10 8 2 Ni-61 0 0 +11 8 2 Ni-62 0 0 +12 8 2 Ni-64 0 0 +13 8 2 Mn-55 0 0 +14 8 2 Si-28 0 0 +15 8 2 Si-29 0 0 +16 8 2 Si-30 0 0 +17 8 2 Cr-50 0 0 +18 8 2 Cr-52 0 0 +19 8 2 Cr-53 0 0 +20 8 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 8 1 1 H-1 0 0 +64 8 1 1 O-16 0 0 +65 8 1 1 B-10 0 0 +66 8 1 1 B-11 0 0 +67 8 1 1 Fe-54 0 0 +68 8 1 1 Fe-56 0 0 +69 8 1 1 Fe-57 0 0 +70 8 1 1 Fe-58 0 0 +71 8 1 1 Ni-58 0 0 +72 8 1 1 Ni-60 0 0 +73 8 1 1 Ni-61 0 0 +74 8 1 1 Ni-62 0 0 +75 8 1 1 Ni-64 0 0 +76 8 1 1 Mn-55 0 0 +77 8 1 1 Si-28 0 0 +78 8 1 1 Si-29 0 0 +79 8 1 1 Si-30 0 0 +80 8 1 1 Cr-50 0 0 +81 8 1 1 Cr-52 0 0 +82 8 1 1 Cr-53 0 0 +83 8 1 1 Cr-54 0 0 +42 8 1 2 H-1 0 0 +43 8 1 2 O-16 0 0 +44 8 1 2 B-10 0 0 +45 8 1 2 B-11 0 0 +46 8 1 2 Fe-54 0 0 +47 8 1 2 Fe-56 0 0 +48 8 1 2 Fe-57 0 0 +49 8 1 2 Fe-58 0 0 +50 8 1 2 Ni-58 0 0 +51 8 1 2 Ni-60 0 0 +52 8 1 2 Ni-61 0 0 +53 8 1 2 Ni-62 0 0 +54 8 1 2 Ni-64 0 0 +55 8 1 2 Mn-55 0 0 +56 8 1 2 Si-28 0 0 +57 8 1 2 Si-29 0 0 +58 8 1 2 Si-30 0 0 +59 8 1 2 Cr-50 0 0 +60 8 1 2 Cr-52 0 0 +61 8 1 2 Cr-53 0 0 +62 8 1 2 Cr-54 0 0 +21 8 2 1 H-1 0 0 +22 8 2 1 O-16 0 0 +23 8 2 1 B-10 0 0 +24 8 2 1 B-11 0 0 +25 8 2 1 Fe-54 0 0 +26 8 2 1 Fe-56 0 0 +27 8 2 1 Fe-57 0 0 +28 8 2 1 Fe-58 0 0 +29 8 2 1 Ni-58 0 0 +30 8 2 1 Ni-60 0 0 +31 8 2 1 Ni-61 0 0 +32 8 2 1 Ni-62 0 0 +33 8 2 1 Ni-64 0 0 +34 8 2 1 Mn-55 0 0 +35 8 2 1 Si-28 0 0 +36 8 2 1 Si-29 0 0 +37 8 2 1 Si-30 0 0 +38 8 2 1 Cr-50 0 0 +39 8 2 1 Cr-52 0 0 +40 8 2 1 Cr-53 0 0 +41 8 2 1 Cr-54 0 0 +0 8 2 2 H-1 0 0 +1 8 2 2 O-16 0 0 +2 8 2 2 B-10 0 0 +3 8 2 2 B-11 0 0 +4 8 2 2 Fe-54 0 0 +5 8 2 2 Fe-56 0 0 +6 8 2 2 Fe-57 0 0 +7 8 2 2 Fe-58 0 0 +8 8 2 2 Ni-58 0 0 +9 8 2 2 Ni-60 0 0 +10 8 2 2 Ni-61 0 0 +11 8 2 2 Ni-62 0 0 +12 8 2 2 Ni-64 0 0 +13 8 2 2 Mn-55 0 0 +14 8 2 2 Si-28 0 0 +15 8 2 2 Si-29 0 0 +16 8 2 2 Si-30 0 0 +17 8 2 2 Cr-50 0 0 +18 8 2 2 Cr-52 0 0 +19 8 2 2 Cr-53 0 0 +20 8 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 8 1 H-1 0 0 +22 8 1 O-16 0 0 +23 8 1 B-10 0 0 +24 8 1 B-11 0 0 +25 8 1 Fe-54 0 0 +26 8 1 Fe-56 0 0 +27 8 1 Fe-57 0 0 +28 8 1 Fe-58 0 0 +29 8 1 Ni-58 0 0 +30 8 1 Ni-60 0 0 +31 8 1 Ni-61 0 0 +32 8 1 Ni-62 0 0 +33 8 1 Ni-64 0 0 +34 8 1 Mn-55 0 0 +35 8 1 Si-28 0 0 +36 8 1 Si-29 0 0 +37 8 1 Si-30 0 0 +38 8 1 Cr-50 0 0 +39 8 1 Cr-52 0 0 +40 8 1 Cr-53 0 0 +41 8 1 Cr-54 0 0 +0 8 2 H-1 0 0 +1 8 2 O-16 0 0 +2 8 2 B-10 0 0 +3 8 2 B-11 0 0 +4 8 2 Fe-54 0 0 +5 8 2 Fe-56 0 0 +6 8 2 Fe-57 0 0 +7 8 2 Fe-58 0 0 +8 8 2 Ni-58 0 0 +9 8 2 Ni-60 0 0 +10 8 2 Ni-61 0 0 +11 8 2 Ni-62 0 0 +12 8 2 Ni-64 0 0 +13 8 2 Mn-55 0 0 +14 8 2 Si-28 0 0 +15 8 2 Si-29 0 0 +16 8 2 Si-30 0 0 +17 8 2 Cr-50 0 0 +18 8 2 Cr-52 0 0 +19 8 2 Cr-53 0 0 +20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 9 1 H-1 0.106160 0.179178 +22 9 1 O-16 0.272020 0.171699 +23 9 1 B-10 0.000000 0.000000 +24 9 1 B-11 0.000000 0.000000 +25 9 1 Fe-54 0.000000 0.000000 +26 9 1 Fe-56 0.000000 0.000000 +27 9 1 Fe-57 0.000000 0.000000 +28 9 1 Fe-58 0.000000 0.000000 +29 9 1 Ni-58 0.000000 0.000000 +30 9 1 Ni-60 0.000000 0.000000 +31 9 1 Ni-61 0.000000 0.000000 +32 9 1 Ni-62 0.000000 0.000000 +33 9 1 Ni-64 0.000000 0.000000 +34 9 1 Mn-55 0.085133 0.082479 +35 9 1 Si-28 0.000000 0.000000 +36 9 1 Si-29 0.000000 0.000000 +37 9 1 Si-30 0.000000 0.000000 +38 9 1 Cr-50 0.000000 0.000000 +39 9 1 Cr-52 0.000000 0.000000 +40 9 1 Cr-53 0.040723 0.079827 +41 9 1 Cr-54 0.000000 0.000000 +0 9 2 H-1 1.417955 2.158027 +1 9 2 O-16 0.000000 0.000000 +2 9 2 B-10 0.269141 0.380622 +3 9 2 B-11 0.000000 0.000000 +4 9 2 Fe-54 0.000000 0.000000 +5 9 2 Fe-56 0.000000 0.000000 +6 9 2 Fe-57 0.000000 0.000000 +7 9 2 Fe-58 0.000000 0.000000 +8 9 2 Ni-58 0.000000 0.000000 +9 9 2 Ni-60 0.000000 0.000000 +10 9 2 Ni-61 0.000000 0.000000 +11 9 2 Ni-62 0.000000 0.000000 +12 9 2 Ni-64 0.000000 0.000000 +13 9 2 Mn-55 0.000000 0.000000 +14 9 2 Si-28 0.000000 0.000000 +15 9 2 Si-29 0.000000 0.000000 +16 9 2 Si-30 0.000000 0.000000 +17 9 2 Cr-50 0.000000 0.000000 +18 9 2 Cr-52 0.000000 0.000000 +19 9 2 Cr-53 0.000000 0.000000 +20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. 21 9 1 H-1 0 0 22 9 1 O-16 0 0 23 9 1 B-10 0 0 @@ -1578,175 +1452,133 @@ 17 9 2 Cr-50 0 0 18 9 2 Cr-52 0 0 19 9 2 Cr-53 0 0 -20 9 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 10 1 H-1 0 0 -22 10 1 O-16 0 0 -23 10 1 B-10 0 0 -24 10 1 B-11 0 0 -25 10 1 Fe-54 0 0 -26 10 1 Fe-56 0 0 -27 10 1 Fe-57 0 0 -28 10 1 Fe-58 0 0 -29 10 1 Ni-58 0 0 -30 10 1 Ni-60 0 0 -31 10 1 Ni-61 0 0 -32 10 1 Ni-62 0 0 -33 10 1 Ni-64 0 0 -34 10 1 Mn-55 0 0 -35 10 1 Si-28 0 0 -36 10 1 Si-29 0 0 -37 10 1 Si-30 0 0 -38 10 1 Cr-50 0 0 -39 10 1 Cr-52 0 0 -40 10 1 Cr-53 0 0 -41 10 1 Cr-54 0 0 -0 10 2 H-1 0 0 -1 10 2 O-16 0 0 -2 10 2 B-10 0 0 -3 10 2 B-11 0 0 -4 10 2 Fe-54 0 0 -5 10 2 Fe-56 0 0 -6 10 2 Fe-57 0 0 -7 10 2 Fe-58 0 0 -8 10 2 Ni-58 0 0 -9 10 2 Ni-60 0 0 -10 10 2 Ni-61 0 0 -11 10 2 Ni-62 0 0 -12 10 2 Ni-64 0 0 -13 10 2 Mn-55 0 0 -14 10 2 Si-28 0 0 -15 10 2 Si-29 0 0 -16 10 2 Si-30 0 0 -17 10 2 Cr-50 0 0 -18 10 2 Cr-52 0 0 -19 10 2 Cr-53 0 0 -20 10 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 10 1 H-1 0 0 -22 10 1 O-16 0 0 -23 10 1 B-10 0 0 -24 10 1 B-11 0 0 -25 10 1 Fe-54 0 0 -26 10 1 Fe-56 0 0 -27 10 1 Fe-57 0 0 -28 10 1 Fe-58 0 0 -29 10 1 Ni-58 0 0 -30 10 1 Ni-60 0 0 -31 10 1 Ni-61 0 0 -32 10 1 Ni-62 0 0 -33 10 1 Ni-64 0 0 -34 10 1 Mn-55 0 0 -35 10 1 Si-28 0 0 -36 10 1 Si-29 0 0 -37 10 1 Si-30 0 0 -38 10 1 Cr-50 0 0 -39 10 1 Cr-52 0 0 -40 10 1 Cr-53 0 0 -41 10 1 Cr-54 0 0 -0 10 2 H-1 0 0 -1 10 2 O-16 0 0 -2 10 2 B-10 0 0 -3 10 2 B-11 0 0 -4 10 2 Fe-54 0 0 -5 10 2 Fe-56 0 0 -6 10 2 Fe-57 0 0 -7 10 2 Fe-58 0 0 -8 10 2 Ni-58 0 0 -9 10 2 Ni-60 0 0 -10 10 2 Ni-61 0 0 -11 10 2 Ni-62 0 0 -12 10 2 Ni-64 0 0 -13 10 2 Mn-55 0 0 -14 10 2 Si-28 0 0 -15 10 2 Si-29 0 0 -16 10 2 Si-30 0 0 -17 10 2 Cr-50 0 0 -18 10 2 Cr-52 0 0 -19 10 2 Cr-53 0 0 -20 10 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 10 1 1 H-1 0 0 -64 10 1 1 O-16 0 0 -65 10 1 1 B-10 0 0 -66 10 1 1 B-11 0 0 -67 10 1 1 Fe-54 0 0 -68 10 1 1 Fe-56 0 0 -69 10 1 1 Fe-57 0 0 -70 10 1 1 Fe-58 0 0 -71 10 1 1 Ni-58 0 0 -72 10 1 1 Ni-60 0 0 -73 10 1 1 Ni-61 0 0 -74 10 1 1 Ni-62 0 0 -75 10 1 1 Ni-64 0 0 -76 10 1 1 Mn-55 0 0 -77 10 1 1 Si-28 0 0 -78 10 1 1 Si-29 0 0 -79 10 1 1 Si-30 0 0 -80 10 1 1 Cr-50 0 0 -81 10 1 1 Cr-52 0 0 -82 10 1 1 Cr-53 0 0 -83 10 1 1 Cr-54 0 0 -42 10 1 2 H-1 0 0 -43 10 1 2 O-16 0 0 -44 10 1 2 B-10 0 0 -45 10 1 2 B-11 0 0 -46 10 1 2 Fe-54 0 0 -47 10 1 2 Fe-56 0 0 -48 10 1 2 Fe-57 0 0 -49 10 1 2 Fe-58 0 0 -50 10 1 2 Ni-58 0 0 -51 10 1 2 Ni-60 0 0 -52 10 1 2 Ni-61 0 0 -53 10 1 2 Ni-62 0 0 -54 10 1 2 Ni-64 0 0 -55 10 1 2 Mn-55 0 0 -56 10 1 2 Si-28 0 0 -57 10 1 2 Si-29 0 0 -58 10 1 2 Si-30 0 0 -59 10 1 2 Cr-50 0 0 -60 10 1 2 Cr-52 0 0 -61 10 1 2 Cr-53 0 0 -62 10 1 2 Cr-54 0 0 -21 10 2 1 H-1 0 0 -22 10 2 1 O-16 0 0 -23 10 2 1 B-10 0 0 -24 10 2 1 B-11 0 0 -25 10 2 1 Fe-54 0 0 -26 10 2 1 Fe-56 0 0 -27 10 2 1 Fe-57 0 0 -28 10 2 1 Fe-58 0 0 -29 10 2 1 Ni-58 0 0 -30 10 2 1 Ni-60 0 0 -31 10 2 1 Ni-61 0 0 -32 10 2 1 Ni-62 0 0 -33 10 2 1 Ni-64 0 0 -34 10 2 1 Mn-55 0 0 -35 10 2 1 Si-28 0 0 -36 10 2 1 Si-29 0 0 -37 10 2 1 Si-30 0 0 -38 10 2 1 Cr-50 0 0 -39 10 2 1 Cr-52 0 0 -40 10 2 1 Cr-53 0 0 -41 10 2 1 Cr-54 0 0 -0 10 2 2 H-1 0 0 -1 10 2 2 O-16 0 0 -2 10 2 2 B-10 0 0 -3 10 2 2 B-11 0 0 -4 10 2 2 Fe-54 0 0 -5 10 2 2 Fe-56 0 0 -6 10 2 2 Fe-57 0 0 -7 10 2 2 Fe-58 0 0 -8 10 2 2 Ni-58 0 0 -9 10 2 2 Ni-60 0 0 -10 10 2 2 Ni-61 0 0 -11 10 2 2 Ni-62 0 0 -12 10 2 2 Ni-64 0 0 -13 10 2 2 Mn-55 0 0 -14 10 2 2 Si-28 0 0 -15 10 2 2 Si-29 0 0 -16 10 2 2 Si-30 0 0 -17 10 2 2 Cr-50 0 0 -18 10 2 2 Cr-52 0 0 -19 10 2 2 Cr-53 0 0 -20 10 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 9 1 1 H-1 0.106160 0.179178 +64 9 1 1 O-16 0.272020 0.171699 +65 9 1 1 B-10 0.000000 0.000000 +66 9 1 1 B-11 0.000000 0.000000 +67 9 1 1 Fe-54 0.000000 0.000000 +68 9 1 1 Fe-56 0.000000 0.000000 +69 9 1 1 Fe-57 0.000000 0.000000 +70 9 1 1 Fe-58 0.000000 0.000000 +71 9 1 1 Ni-58 0.000000 0.000000 +72 9 1 1 Ni-60 0.000000 0.000000 +73 9 1 1 Ni-61 0.000000 0.000000 +74 9 1 1 Ni-62 0.000000 0.000000 +75 9 1 1 Ni-64 0.000000 0.000000 +76 9 1 1 Mn-55 0.085133 0.082479 +77 9 1 1 Si-28 0.000000 0.000000 +78 9 1 1 Si-29 0.000000 0.000000 +79 9 1 1 Si-30 0.000000 0.000000 +80 9 1 1 Cr-50 0.000000 0.000000 +81 9 1 1 Cr-52 0.000000 0.000000 +82 9 1 1 Cr-53 0.040723 0.079827 +83 9 1 1 Cr-54 0.000000 0.000000 +42 9 1 2 H-1 0.000000 0.000000 +43 9 1 2 O-16 0.000000 0.000000 +44 9 1 2 B-10 0.000000 0.000000 +45 9 1 2 B-11 0.000000 0.000000 +46 9 1 2 Fe-54 0.000000 0.000000 +47 9 1 2 Fe-56 0.000000 0.000000 +48 9 1 2 Fe-57 0.000000 0.000000 +49 9 1 2 Fe-58 0.000000 0.000000 +50 9 1 2 Ni-58 0.000000 0.000000 +51 9 1 2 Ni-60 0.000000 0.000000 +52 9 1 2 Ni-61 0.000000 0.000000 +53 9 1 2 Ni-62 0.000000 0.000000 +54 9 1 2 Ni-64 0.000000 0.000000 +55 9 1 2 Mn-55 0.000000 0.000000 +56 9 1 2 Si-28 0.000000 0.000000 +57 9 1 2 Si-29 0.000000 0.000000 +58 9 1 2 Si-30 0.000000 0.000000 +59 9 1 2 Cr-50 0.000000 0.000000 +60 9 1 2 Cr-52 0.000000 0.000000 +61 9 1 2 Cr-53 0.000000 0.000000 +62 9 1 2 Cr-54 0.000000 0.000000 +21 9 2 1 H-1 0.000000 0.000000 +22 9 2 1 O-16 0.000000 0.000000 +23 9 2 1 B-10 0.000000 0.000000 +24 9 2 1 B-11 0.000000 0.000000 +25 9 2 1 Fe-54 0.000000 0.000000 +26 9 2 1 Fe-56 0.000000 0.000000 +27 9 2 1 Fe-57 0.000000 0.000000 +28 9 2 1 Fe-58 0.000000 0.000000 +29 9 2 1 Ni-58 0.000000 0.000000 +30 9 2 1 Ni-60 0.000000 0.000000 +31 9 2 1 Ni-61 0.000000 0.000000 +32 9 2 1 Ni-62 0.000000 0.000000 +33 9 2 1 Ni-64 0.000000 0.000000 +34 9 2 1 Mn-55 0.000000 0.000000 +35 9 2 1 Si-28 0.000000 0.000000 +36 9 2 1 Si-29 0.000000 0.000000 +37 9 2 1 Si-30 0.000000 0.000000 +38 9 2 1 Cr-50 0.000000 0.000000 +39 9 2 1 Cr-52 0.000000 0.000000 +40 9 2 1 Cr-53 0.000000 0.000000 +41 9 2 1 Cr-54 0.000000 0.000000 +0 9 2 2 H-1 1.417955 2.158027 +1 9 2 2 O-16 0.000000 0.000000 +2 9 2 2 B-10 0.000000 0.000000 +3 9 2 2 B-11 0.000000 0.000000 +4 9 2 2 Fe-54 0.000000 0.000000 +5 9 2 2 Fe-56 0.000000 0.000000 +6 9 2 2 Fe-57 0.000000 0.000000 +7 9 2 2 Fe-58 0.000000 0.000000 +8 9 2 2 Ni-58 0.000000 0.000000 +9 9 2 2 Ni-60 0.000000 0.000000 +10 9 2 2 Ni-61 0.000000 0.000000 +11 9 2 2 Ni-62 0.000000 0.000000 +12 9 2 2 Ni-64 0.000000 0.000000 +13 9 2 2 Mn-55 0.000000 0.000000 +14 9 2 2 Si-28 0.000000 0.000000 +15 9 2 2 Si-29 0.000000 0.000000 +16 9 2 2 Si-30 0.000000 0.000000 +17 9 2 2 Cr-50 0.000000 0.000000 +18 9 2 2 Cr-52 0.000000 0.000000 +19 9 2 2 Cr-53 0.000000 0.000000 +20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +21 9 1 H-1 0 0 +22 9 1 O-16 0 0 +23 9 1 B-10 0 0 +24 9 1 B-11 0 0 +25 9 1 Fe-54 0 0 +26 9 1 Fe-56 0 0 +27 9 1 Fe-57 0 0 +28 9 1 Fe-58 0 0 +29 9 1 Ni-58 0 0 +30 9 1 Ni-60 0 0 +31 9 1 Ni-61 0 0 +32 9 1 Ni-62 0 0 +33 9 1 Ni-64 0 0 +34 9 1 Mn-55 0 0 +35 9 1 Si-28 0 0 +36 9 1 Si-29 0 0 +37 9 1 Si-30 0 0 +38 9 1 Cr-50 0 0 +39 9 1 Cr-52 0 0 +40 9 1 Cr-53 0 0 +41 9 1 Cr-54 0 0 +0 9 2 H-1 0 0 +1 9 2 O-16 0 0 +2 9 2 B-10 0 0 +3 9 2 B-11 0 0 +4 9 2 Fe-54 0 0 +5 9 2 Fe-56 0 0 +6 9 2 Fe-57 0 0 +7 9 2 Fe-58 0 0 +8 9 2 Ni-58 0 0 +9 9 2 Ni-60 0 0 +10 9 2 Ni-61 0 0 +11 9 2 Ni-62 0 0 +12 9 2 Ni-64 0 0 +13 9 2 Mn-55 0 0 +14 9 2 Si-28 0 0 +15 9 2 Si-29 0 0 +16 9 2 Si-30 0 0 +17 9 2 Cr-50 0 0 +18 9 2 Cr-52 0 0 +19 9 2 Cr-53 0 0 +20 9 2 Cr-54 0 0 material group in nuclide mean std. dev. 21 10 1 H-1 0 0 22 10 1 O-16 0 0 23 10 1 B-10 0 0 @@ -1788,79 +1620,193 @@ 17 10 2 Cr-50 0 0 18 10 2 Cr-52 0 0 19 10 2 Cr-53 0 0 -20 10 2 Cr-54 0 0 material group in nuclide mean std. dev. -9 11 1 H-1 0.138558 0.260695 -10 11 1 O-16 0.042575 0.049271 -11 11 1 B-10 0.000000 0.000000 -12 11 1 B-11 0.000000 0.000000 -13 11 1 Zr-90 0.041034 0.049102 -14 11 1 Zr-91 0.027328 0.021092 -15 11 1 Zr-92 0.009788 0.009282 -16 11 1 Zr-94 0.043543 0.036697 -17 11 1 Zr-96 0.000000 0.000000 -0 11 2 H-1 0.824153 0.917955 -1 11 2 O-16 0.041986 0.060727 -2 11 2 B-10 0.048216 0.042726 -3 11 2 B-11 0.000000 0.000000 -4 11 2 Zr-90 0.048596 0.067712 -5 11 2 Zr-91 0.000000 0.000000 -6 11 2 Zr-92 0.000000 0.000000 -7 11 2 Zr-94 0.043195 0.041363 -8 11 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. -9 11 1 H-1 0 0 -10 11 1 O-16 0 0 -11 11 1 B-10 0 0 -12 11 1 B-11 0 0 -13 11 1 Zr-90 0 0 -14 11 1 Zr-91 0 0 -15 11 1 Zr-92 0 0 -16 11 1 Zr-94 0 0 -17 11 1 Zr-96 0 0 -0 11 2 H-1 0 0 -1 11 2 O-16 0 0 -2 11 2 B-10 0 0 -3 11 2 B-11 0 0 -4 11 2 Zr-90 0 0 -5 11 2 Zr-91 0 0 -6 11 2 Zr-92 0 0 -7 11 2 Zr-94 0 0 -8 11 2 Zr-96 0 0 material group in group out nuclide mean std. dev. -27 11 1 1 H-1 0.111411 0.247294 -28 11 1 1 O-16 0.042575 0.049271 -29 11 1 1 B-10 0.000000 0.000000 -30 11 1 1 B-11 0.000000 0.000000 -31 11 1 1 Zr-90 0.041034 0.049102 -32 11 1 1 Zr-91 0.027328 0.021092 -33 11 1 1 Zr-92 0.009788 0.009282 -34 11 1 1 Zr-94 0.043543 0.036697 -35 11 1 1 Zr-96 0.000000 0.000000 -18 11 1 2 H-1 0.027147 0.020009 -19 11 1 2 O-16 0.000000 0.000000 -20 11 1 2 B-10 0.000000 0.000000 -21 11 1 2 B-11 0.000000 0.000000 -22 11 1 2 Zr-90 0.000000 0.000000 -23 11 1 2 Zr-91 0.000000 0.000000 -24 11 1 2 Zr-92 0.000000 0.000000 -25 11 1 2 Zr-94 0.000000 0.000000 -26 11 1 2 Zr-96 0.000000 0.000000 -9 11 2 1 H-1 0.000000 0.000000 -10 11 2 1 O-16 0.000000 0.000000 -11 11 2 1 B-10 0.000000 0.000000 -12 11 2 1 B-11 0.000000 0.000000 -13 11 2 1 Zr-90 0.000000 0.000000 -14 11 2 1 Zr-91 0.000000 0.000000 -15 11 2 1 Zr-92 0.000000 0.000000 -16 11 2 1 Zr-94 0.000000 0.000000 -17 11 2 1 Zr-96 0.000000 0.000000 -0 11 2 2 H-1 0.824153 0.917955 -1 11 2 2 O-16 0.041986 0.060727 -2 11 2 2 B-10 0.000000 0.000000 -3 11 2 2 B-11 0.000000 0.000000 -4 11 2 2 Zr-90 0.048596 0.067712 -5 11 2 2 Zr-91 0.000000 0.000000 -6 11 2 2 Zr-92 0.000000 0.000000 -7 11 2 2 Zr-94 0.043195 0.041363 -8 11 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +20 10 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 10 1 H-1 0 0 +22 10 1 O-16 0 0 +23 10 1 B-10 0 0 +24 10 1 B-11 0 0 +25 10 1 Fe-54 0 0 +26 10 1 Fe-56 0 0 +27 10 1 Fe-57 0 0 +28 10 1 Fe-58 0 0 +29 10 1 Ni-58 0 0 +30 10 1 Ni-60 0 0 +31 10 1 Ni-61 0 0 +32 10 1 Ni-62 0 0 +33 10 1 Ni-64 0 0 +34 10 1 Mn-55 0 0 +35 10 1 Si-28 0 0 +36 10 1 Si-29 0 0 +37 10 1 Si-30 0 0 +38 10 1 Cr-50 0 0 +39 10 1 Cr-52 0 0 +40 10 1 Cr-53 0 0 +41 10 1 Cr-54 0 0 +0 10 2 H-1 0 0 +1 10 2 O-16 0 0 +2 10 2 B-10 0 0 +3 10 2 B-11 0 0 +4 10 2 Fe-54 0 0 +5 10 2 Fe-56 0 0 +6 10 2 Fe-57 0 0 +7 10 2 Fe-58 0 0 +8 10 2 Ni-58 0 0 +9 10 2 Ni-60 0 0 +10 10 2 Ni-61 0 0 +11 10 2 Ni-62 0 0 +12 10 2 Ni-64 0 0 +13 10 2 Mn-55 0 0 +14 10 2 Si-28 0 0 +15 10 2 Si-29 0 0 +16 10 2 Si-30 0 0 +17 10 2 Cr-50 0 0 +18 10 2 Cr-52 0 0 +19 10 2 Cr-53 0 0 +20 10 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 10 1 1 H-1 0 0 +64 10 1 1 O-16 0 0 +65 10 1 1 B-10 0 0 +66 10 1 1 B-11 0 0 +67 10 1 1 Fe-54 0 0 +68 10 1 1 Fe-56 0 0 +69 10 1 1 Fe-57 0 0 +70 10 1 1 Fe-58 0 0 +71 10 1 1 Ni-58 0 0 +72 10 1 1 Ni-60 0 0 +73 10 1 1 Ni-61 0 0 +74 10 1 1 Ni-62 0 0 +75 10 1 1 Ni-64 0 0 +76 10 1 1 Mn-55 0 0 +77 10 1 1 Si-28 0 0 +78 10 1 1 Si-29 0 0 +79 10 1 1 Si-30 0 0 +80 10 1 1 Cr-50 0 0 +81 10 1 1 Cr-52 0 0 +82 10 1 1 Cr-53 0 0 +83 10 1 1 Cr-54 0 0 +42 10 1 2 H-1 0 0 +43 10 1 2 O-16 0 0 +44 10 1 2 B-10 0 0 +45 10 1 2 B-11 0 0 +46 10 1 2 Fe-54 0 0 +47 10 1 2 Fe-56 0 0 +48 10 1 2 Fe-57 0 0 +49 10 1 2 Fe-58 0 0 +50 10 1 2 Ni-58 0 0 +51 10 1 2 Ni-60 0 0 +52 10 1 2 Ni-61 0 0 +53 10 1 2 Ni-62 0 0 +54 10 1 2 Ni-64 0 0 +55 10 1 2 Mn-55 0 0 +56 10 1 2 Si-28 0 0 +57 10 1 2 Si-29 0 0 +58 10 1 2 Si-30 0 0 +59 10 1 2 Cr-50 0 0 +60 10 1 2 Cr-52 0 0 +61 10 1 2 Cr-53 0 0 +62 10 1 2 Cr-54 0 0 +21 10 2 1 H-1 0 0 +22 10 2 1 O-16 0 0 +23 10 2 1 B-10 0 0 +24 10 2 1 B-11 0 0 +25 10 2 1 Fe-54 0 0 +26 10 2 1 Fe-56 0 0 +27 10 2 1 Fe-57 0 0 +28 10 2 1 Fe-58 0 0 +29 10 2 1 Ni-58 0 0 +30 10 2 1 Ni-60 0 0 +31 10 2 1 Ni-61 0 0 +32 10 2 1 Ni-62 0 0 +33 10 2 1 Ni-64 0 0 +34 10 2 1 Mn-55 0 0 +35 10 2 1 Si-28 0 0 +36 10 2 1 Si-29 0 0 +37 10 2 1 Si-30 0 0 +38 10 2 1 Cr-50 0 0 +39 10 2 1 Cr-52 0 0 +40 10 2 1 Cr-53 0 0 +41 10 2 1 Cr-54 0 0 +0 10 2 2 H-1 0 0 +1 10 2 2 O-16 0 0 +2 10 2 2 B-10 0 0 +3 10 2 2 B-11 0 0 +4 10 2 2 Fe-54 0 0 +5 10 2 2 Fe-56 0 0 +6 10 2 2 Fe-57 0 0 +7 10 2 2 Fe-58 0 0 +8 10 2 2 Ni-58 0 0 +9 10 2 2 Ni-60 0 0 +10 10 2 2 Ni-61 0 0 +11 10 2 2 Ni-62 0 0 +12 10 2 2 Ni-64 0 0 +13 10 2 2 Mn-55 0 0 +14 10 2 2 Si-28 0 0 +15 10 2 2 Si-29 0 0 +16 10 2 2 Si-30 0 0 +17 10 2 2 Cr-50 0 0 +18 10 2 2 Cr-52 0 0 +19 10 2 2 Cr-53 0 0 +20 10 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +21 10 1 H-1 0 0 +22 10 1 O-16 0 0 +23 10 1 B-10 0 0 +24 10 1 B-11 0 0 +25 10 1 Fe-54 0 0 +26 10 1 Fe-56 0 0 +27 10 1 Fe-57 0 0 +28 10 1 Fe-58 0 0 +29 10 1 Ni-58 0 0 +30 10 1 Ni-60 0 0 +31 10 1 Ni-61 0 0 +32 10 1 Ni-62 0 0 +33 10 1 Ni-64 0 0 +34 10 1 Mn-55 0 0 +35 10 1 Si-28 0 0 +36 10 1 Si-29 0 0 +37 10 1 Si-30 0 0 +38 10 1 Cr-50 0 0 +39 10 1 Cr-52 0 0 +40 10 1 Cr-53 0 0 +41 10 1 Cr-54 0 0 +0 10 2 H-1 0 0 +1 10 2 O-16 0 0 +2 10 2 B-10 0 0 +3 10 2 B-11 0 0 +4 10 2 Fe-54 0 0 +5 10 2 Fe-56 0 0 +6 10 2 Fe-57 0 0 +7 10 2 Fe-58 0 0 +8 10 2 Ni-58 0 0 +9 10 2 Ni-60 0 0 +10 10 2 Ni-61 0 0 +11 10 2 Ni-62 0 0 +12 10 2 Ni-64 0 0 +13 10 2 Mn-55 0 0 +14 10 2 Si-28 0 0 +15 10 2 Si-29 0 0 +16 10 2 Si-30 0 0 +17 10 2 Cr-50 0 0 +18 10 2 Cr-52 0 0 +19 10 2 Cr-53 0 0 +20 10 2 Cr-54 0 0 material group in nuclide mean std. dev. +9 11 1 H-1 0.138558 0.260695 +10 11 1 O-16 0.042575 0.049271 +11 11 1 B-10 0.000000 0.000000 +12 11 1 B-11 0.000000 0.000000 +13 11 1 Zr-90 0.041034 0.049102 +14 11 1 Zr-91 0.027328 0.021092 +15 11 1 Zr-92 0.009788 0.009282 +16 11 1 Zr-94 0.043543 0.036697 +17 11 1 Zr-96 0.000000 0.000000 +0 11 2 H-1 0.824153 0.917955 +1 11 2 O-16 0.041986 0.060727 +2 11 2 B-10 0.048216 0.042726 +3 11 2 B-11 0.000000 0.000000 +4 11 2 Zr-90 0.048596 0.067712 +5 11 2 Zr-91 0.000000 0.000000 +6 11 2 Zr-92 0.000000 0.000000 +7 11 2 Zr-94 0.043195 0.041363 +8 11 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. 9 11 1 H-1 0 0 10 11 1 O-16 0 0 11 11 1 B-10 0 0 @@ -1878,79 +1824,79 @@ 5 11 2 Zr-91 0 0 6 11 2 Zr-92 0 0 7 11 2 Zr-94 0 0 -8 11 2 Zr-96 0 0 material group in nuclide mean std. dev. -9 12 1 H-1 0.151924 0.200147 -10 12 1 O-16 0.039280 0.026086 -11 12 1 B-10 0.000000 0.000000 -12 12 1 B-11 0.000000 0.000000 -13 12 1 Zr-90 0.017578 0.022079 -14 12 1 Zr-91 0.039984 0.025285 -15 12 1 Zr-92 0.001172 0.006230 -16 12 1 Zr-94 0.001668 0.005966 -17 12 1 Zr-96 0.004328 0.005325 -0 12 2 H-1 0.942412 0.866849 -1 12 2 O-16 0.047438 0.048161 -2 12 2 B-10 0.041655 0.031202 -3 12 2 B-11 0.000000 0.000000 -4 12 2 Zr-90 0.021193 0.017456 -5 12 2 Zr-91 0.007901 0.009268 -6 12 2 Zr-92 0.009422 0.012802 -7 12 2 Zr-94 0.043324 0.027551 -8 12 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. -9 12 1 H-1 0 0 -10 12 1 O-16 0 0 -11 12 1 B-10 0 0 -12 12 1 B-11 0 0 -13 12 1 Zr-90 0 0 -14 12 1 Zr-91 0 0 -15 12 1 Zr-92 0 0 -16 12 1 Zr-94 0 0 -17 12 1 Zr-96 0 0 -0 12 2 H-1 0 0 -1 12 2 O-16 0 0 -2 12 2 B-10 0 0 -3 12 2 B-11 0 0 -4 12 2 Zr-90 0 0 -5 12 2 Zr-91 0 0 -6 12 2 Zr-92 0 0 -7 12 2 Zr-94 0 0 -8 12 2 Zr-96 0 0 material group in group out nuclide mean std. dev. -27 12 1 1 H-1 0.122301 0.187298 -28 12 1 1 O-16 0.039280 0.026086 -29 12 1 1 B-10 0.000000 0.000000 -30 12 1 1 B-11 0.000000 0.000000 -31 12 1 1 Zr-90 0.017578 0.022079 -32 12 1 1 Zr-91 0.039984 0.025285 -33 12 1 1 Zr-92 0.001172 0.006230 -34 12 1 1 Zr-94 0.001668 0.005966 -35 12 1 1 Zr-96 0.004328 0.005325 -18 12 1 2 H-1 0.029622 0.017760 -19 12 1 2 O-16 0.000000 0.000000 -20 12 1 2 B-10 0.000000 0.000000 -21 12 1 2 B-11 0.000000 0.000000 -22 12 1 2 Zr-90 0.000000 0.000000 -23 12 1 2 Zr-91 0.000000 0.000000 -24 12 1 2 Zr-92 0.000000 0.000000 -25 12 1 2 Zr-94 0.000000 0.000000 -26 12 1 2 Zr-96 0.000000 0.000000 -9 12 2 1 H-1 0.000000 0.000000 -10 12 2 1 O-16 0.000000 0.000000 -11 12 2 1 B-10 0.000000 0.000000 -12 12 2 1 B-11 0.000000 0.000000 -13 12 2 1 Zr-90 0.000000 0.000000 -14 12 2 1 Zr-91 0.000000 0.000000 -15 12 2 1 Zr-92 0.000000 0.000000 -16 12 2 1 Zr-94 0.000000 0.000000 -17 12 2 1 Zr-96 0.000000 0.000000 -0 12 2 2 H-1 0.942412 0.866849 -1 12 2 2 O-16 0.047438 0.048161 -2 12 2 2 B-10 0.000000 0.000000 -3 12 2 2 B-11 0.000000 0.000000 -4 12 2 2 Zr-90 0.021193 0.017456 -5 12 2 2 Zr-91 0.007901 0.009268 -6 12 2 2 Zr-92 0.009422 0.012802 -7 12 2 2 Zr-94 0.043324 0.027551 -8 12 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +8 11 2 Zr-96 0 0 material group in group out nuclide mean std. dev. +27 11 1 1 H-1 0.111411 0.247294 +28 11 1 1 O-16 0.042575 0.049271 +29 11 1 1 B-10 0.000000 0.000000 +30 11 1 1 B-11 0.000000 0.000000 +31 11 1 1 Zr-90 0.041034 0.049102 +32 11 1 1 Zr-91 0.027328 0.021092 +33 11 1 1 Zr-92 0.009788 0.009282 +34 11 1 1 Zr-94 0.043543 0.036697 +35 11 1 1 Zr-96 0.000000 0.000000 +18 11 1 2 H-1 0.027147 0.020009 +19 11 1 2 O-16 0.000000 0.000000 +20 11 1 2 B-10 0.000000 0.000000 +21 11 1 2 B-11 0.000000 0.000000 +22 11 1 2 Zr-90 0.000000 0.000000 +23 11 1 2 Zr-91 0.000000 0.000000 +24 11 1 2 Zr-92 0.000000 0.000000 +25 11 1 2 Zr-94 0.000000 0.000000 +26 11 1 2 Zr-96 0.000000 0.000000 +9 11 2 1 H-1 0.000000 0.000000 +10 11 2 1 O-16 0.000000 0.000000 +11 11 2 1 B-10 0.000000 0.000000 +12 11 2 1 B-11 0.000000 0.000000 +13 11 2 1 Zr-90 0.000000 0.000000 +14 11 2 1 Zr-91 0.000000 0.000000 +15 11 2 1 Zr-92 0.000000 0.000000 +16 11 2 1 Zr-94 0.000000 0.000000 +17 11 2 1 Zr-96 0.000000 0.000000 +0 11 2 2 H-1 0.824153 0.917955 +1 11 2 2 O-16 0.041986 0.060727 +2 11 2 2 B-10 0.000000 0.000000 +3 11 2 2 B-11 0.000000 0.000000 +4 11 2 2 Zr-90 0.048596 0.067712 +5 11 2 2 Zr-91 0.000000 0.000000 +6 11 2 2 Zr-92 0.000000 0.000000 +7 11 2 2 Zr-94 0.043195 0.041363 +8 11 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +9 11 1 H-1 0 0 +10 11 1 O-16 0 0 +11 11 1 B-10 0 0 +12 11 1 B-11 0 0 +13 11 1 Zr-90 0 0 +14 11 1 Zr-91 0 0 +15 11 1 Zr-92 0 0 +16 11 1 Zr-94 0 0 +17 11 1 Zr-96 0 0 +0 11 2 H-1 0 0 +1 11 2 O-16 0 0 +2 11 2 B-10 0 0 +3 11 2 B-11 0 0 +4 11 2 Zr-90 0 0 +5 11 2 Zr-91 0 0 +6 11 2 Zr-92 0 0 +7 11 2 Zr-94 0 0 +8 11 2 Zr-96 0 0 material group in nuclide mean std. dev. +9 12 1 H-1 0.151924 0.200147 +10 12 1 O-16 0.039280 0.026086 +11 12 1 B-10 0.000000 0.000000 +12 12 1 B-11 0.000000 0.000000 +13 12 1 Zr-90 0.017578 0.022079 +14 12 1 Zr-91 0.039984 0.025285 +15 12 1 Zr-92 0.001172 0.006230 +16 12 1 Zr-94 0.001668 0.005966 +17 12 1 Zr-96 0.004328 0.005325 +0 12 2 H-1 0.942412 0.866849 +1 12 2 O-16 0.047438 0.048161 +2 12 2 B-10 0.041655 0.031202 +3 12 2 B-11 0.000000 0.000000 +4 12 2 Zr-90 0.021193 0.017456 +5 12 2 Zr-91 0.007901 0.009268 +6 12 2 Zr-92 0.009422 0.012802 +7 12 2 Zr-94 0.043324 0.027551 +8 12 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev. 9 12 1 H-1 0 0 10 12 1 O-16 0 0 11 12 1 B-10 0 0 @@ -1968,4 +1914,58 @@ 5 12 2 Zr-91 0 0 6 12 2 Zr-92 0 0 7 12 2 Zr-94 0 0 -8 12 2 Zr-96 0 0 \ No newline at end of file +8 12 2 Zr-96 0 0 material group in group out nuclide mean std. dev. +27 12 1 1 H-1 0.122301 0.187298 +28 12 1 1 O-16 0.039280 0.026086 +29 12 1 1 B-10 0.000000 0.000000 +30 12 1 1 B-11 0.000000 0.000000 +31 12 1 1 Zr-90 0.017578 0.022079 +32 12 1 1 Zr-91 0.039984 0.025285 +33 12 1 1 Zr-92 0.001172 0.006230 +34 12 1 1 Zr-94 0.001668 0.005966 +35 12 1 1 Zr-96 0.004328 0.005325 +18 12 1 2 H-1 0.029622 0.017760 +19 12 1 2 O-16 0.000000 0.000000 +20 12 1 2 B-10 0.000000 0.000000 +21 12 1 2 B-11 0.000000 0.000000 +22 12 1 2 Zr-90 0.000000 0.000000 +23 12 1 2 Zr-91 0.000000 0.000000 +24 12 1 2 Zr-92 0.000000 0.000000 +25 12 1 2 Zr-94 0.000000 0.000000 +26 12 1 2 Zr-96 0.000000 0.000000 +9 12 2 1 H-1 0.000000 0.000000 +10 12 2 1 O-16 0.000000 0.000000 +11 12 2 1 B-10 0.000000 0.000000 +12 12 2 1 B-11 0.000000 0.000000 +13 12 2 1 Zr-90 0.000000 0.000000 +14 12 2 1 Zr-91 0.000000 0.000000 +15 12 2 1 Zr-92 0.000000 0.000000 +16 12 2 1 Zr-94 0.000000 0.000000 +17 12 2 1 Zr-96 0.000000 0.000000 +0 12 2 2 H-1 0.942412 0.866849 +1 12 2 2 O-16 0.047438 0.048161 +2 12 2 2 B-10 0.000000 0.000000 +3 12 2 2 B-11 0.000000 0.000000 +4 12 2 2 Zr-90 0.021193 0.017456 +5 12 2 2 Zr-91 0.007901 0.009268 +6 12 2 2 Zr-92 0.009422 0.012802 +7 12 2 2 Zr-94 0.043324 0.027551 +8 12 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev. +9 12 1 H-1 0 0 +10 12 1 O-16 0 0 +11 12 1 B-10 0 0 +12 12 1 B-11 0 0 +13 12 1 Zr-90 0 0 +14 12 1 Zr-91 0 0 +15 12 1 Zr-92 0 0 +16 12 1 Zr-94 0 0 +17 12 1 Zr-96 0 0 +0 12 2 H-1 0 0 +1 12 2 O-16 0 0 +2 12 2 B-10 0 0 +3 12 2 B-11 0 0 +4 12 2 Zr-90 0 0 +5 12 2 Zr-91 0 0 +6 12 2 Zr-92 0 0 +7 12 2 Zr-94 0 0 +8 12 2 Zr-96 0 0 \ No newline at end of file diff --git a/tests/test_track_output/results_test.dat b/tests/test_track_output/results_test.dat new file mode 100644 index 0000000000..6ded87a0ec --- /dev/null +++ b/tests/test_track_output/results_test.dat @@ -0,0 +1,9 @@ + + + + + + + + + From b3646f871b0fec01af66590a08a53506eaabd108 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 12 Nov 2015 13:29:37 -0500 Subject: [PATCH 446/519] Removed test_track_output/results_test.dat and added to .gitignore --- .gitignore | 1 + tests/test_track_output/results_test.dat | 9 --------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 tests/test_track_output/results_test.dat diff --git a/.gitignore b/.gitignore index ef67316fb9..6ff974757a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ inputs_error.dat # Test build files tests/build/ tests/ctestscript.run +tests/test_track_output/results_test.dat # HDF5 files *.h5 diff --git a/tests/test_track_output/results_test.dat b/tests/test_track_output/results_test.dat deleted file mode 100644 index 6ded87a0ec..0000000000 --- a/tests/test_track_output/results_test.dat +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - From c9cf1c536a13e9141e684678c9e462a79f0215f8 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 12 Nov 2015 13:34:54 -0500 Subject: [PATCH 447/519] Added general results_test.dat to .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6ff974757a..b2bdeba7a1 100644 --- a/.gitignore +++ b/.gitignore @@ -37,11 +37,11 @@ src/xml-fortran/xmlreader # Test results error file results_error.dat inputs_error.dat +results_test.dat # Test build files tests/build/ tests/ctestscript.run -tests/test_track_output/results_test.dat # HDF5 files *.h5 From de27a944f5cad8e1e84de092ae23d33af1d9faba Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 14 Nov 2015 17:05:32 -0500 Subject: [PATCH 448/519] Fixed bug in OpenCG compatibility module with Lattice outside attribute --- openmc/opencg_compatible.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 019d2aabcf..c0f6c943cb 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -877,6 +877,7 @@ def get_opencg_lattice(openmc_lattice): pitch = openmc_lattice.pitch lower_left = openmc_lattice.lower_left universes = openmc_lattice.universes + outside = openmc_lattice.outside if len(pitch) == 2: new_pitch = np.ones(3, dtype=np.float64) @@ -909,6 +910,8 @@ def get_opencg_lattice(openmc_lattice): opencg_lattice.dimension = dimension opencg_lattice.width = pitch opencg_lattice.universes = universe_array + if outside: + opencg_lattice.outside = outside offset = np.array(lower_left, dtype=np.float64) - \ ((np.array(pitch, dtype=np.float64) * @@ -955,6 +958,7 @@ def get_openmc_lattice(opencg_lattice): width = opencg_lattice.width offset = opencg_lattice.offset universes = opencg_lattice.universes + outside = opencg_lattice.outside # Initialize an empty array for the OpenMC nested Universes in this Lattice universe_array = np.ndarray(tuple(np.array(dimension)), @@ -985,6 +989,8 @@ def get_openmc_lattice(opencg_lattice): openmc_lattice.pitch = width openmc_lattice.universes = universe_array openmc_lattice.lower_left = lower_left + if outside: + openmc_lattice.outside = outside # Add the OpenMC Lattice to the global collection of all OpenMC Lattices OPENMC_LATTICES[lattice_id] = openmc_lattice From 36d1b17e13f52ee5dfb59d22cfabeb36c35f7563 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 14 Nov 2015 17:12:30 -0500 Subject: [PATCH 449/519] OpenCG compatibility module now converts lattice outer/outside OpenMC/OpenCG appropriate version --- openmc/opencg_compatible.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index c0f6c943cb..6da21fa055 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -910,8 +910,8 @@ def get_opencg_lattice(openmc_lattice): opencg_lattice.dimension = dimension opencg_lattice.width = pitch opencg_lattice.universes = universe_array - if outside: - opencg_lattice.outside = outside + if outside != None: + opencg_lattice.outside = get_opencg_universe(outside) offset = np.array(lower_left, dtype=np.float64) - \ ((np.array(pitch, dtype=np.float64) * @@ -958,7 +958,7 @@ def get_openmc_lattice(opencg_lattice): width = opencg_lattice.width offset = opencg_lattice.offset universes = opencg_lattice.universes - outside = opencg_lattice.outside + outer = opencg_lattice.outside # Initialize an empty array for the OpenMC nested Universes in this Lattice universe_array = np.ndarray(tuple(np.array(dimension)), @@ -989,8 +989,8 @@ def get_openmc_lattice(opencg_lattice): openmc_lattice.pitch = width openmc_lattice.universes = universe_array openmc_lattice.lower_left = lower_left - if outside: - openmc_lattice.outside = outside + if outer != None: + openmc_lattice.outer = get_openmc_universe(outer) # Add the OpenMC Lattice to the global collection of all OpenMC Lattices OPENMC_LATTICES[lattice_id] = openmc_lattice From 179b32ca39e16486c5e3b1e07bd5591381b10e23 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 14 Nov 2015 22:01:53 -0500 Subject: [PATCH 450/519] Corrected outside to outer for OpenCG lattices --- openmc/opencg_compatible.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 6da21fa055..3164c97885 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -877,7 +877,7 @@ def get_opencg_lattice(openmc_lattice): pitch = openmc_lattice.pitch lower_left = openmc_lattice.lower_left universes = openmc_lattice.universes - outside = openmc_lattice.outside + outer = openmc_lattice.outer if len(pitch) == 2: new_pitch = np.ones(3, dtype=np.float64) @@ -910,8 +910,8 @@ def get_opencg_lattice(openmc_lattice): opencg_lattice.dimension = dimension opencg_lattice.width = pitch opencg_lattice.universes = universe_array - if outside != None: - opencg_lattice.outside = get_opencg_universe(outside) + if outer != None: + opencg_lattice.outside = get_opencg_universe(outer) offset = np.array(lower_left, dtype=np.float64) - \ ((np.array(pitch, dtype=np.float64) * From c8111b1e21f14b9519b9d78a0ec673dfa15eebef Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Sat, 14 Nov 2015 22:40:36 -0500 Subject: [PATCH 451/519] Fixed get_opencg_cell routine for cells without any surfaces --- openmc/opencg_compatible.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 3164c97885..2b5c76459d 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -486,20 +486,22 @@ def get_opencg_cell(openmc_cell): # works if the region is a single half-space or an intersection of # half-spaces, i.e., no complex cells. region = openmc_cell.region - if isinstance(region, Halfspace): - surface = region.surface - halfspace = -1 if region.side == '-' else 1 - opencg_cell.add_surface(get_opencg_surface(surface), halfspace) - elif isinstance(region, Intersection): - for node in region.nodes: - if not isinstance(node, Halfspace): - raise NotImplementedError("Complex cells not yet supported " - "in OpenCG.") - surface = node.surface - halfspace = -1 if node.side == '-' else 1 + if region != None: + if isinstance(region, Halfspace): + surface = region.surface + halfspace = -1 if region.side == '-' else 1 opencg_cell.add_surface(get_opencg_surface(surface), halfspace) - else: - raise NotImplementedError("Complex cells not yet supported in OpenCG.") + elif isinstance(region, Intersection): + for node in region.nodes: + if not isinstance(node, Halfspace): + raise NotImplementedError("Complex cells not yet " + "supported in OpenCG.") + surface = node.surface + halfspace = -1 if node.side == '-' else 1 + opencg_cell.add_surface(get_opencg_surface(surface), halfspace) + else: + raise NotImplementedError("Complex cells not yet supported " + "in OpenCG.") # Add the OpenMC Cell to the global collection of all OpenMC Cells OPENMC_CELLS[cell_id] = openmc_cell From 2c19aaae74c84d7ffe5c77946d3b854404459cb0 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 16 Nov 2015 08:03:52 -0500 Subject: [PATCH 452/519] Changed conditionals for lattice outer to be more Pythonic per comments by @paulromano --- openmc/opencg_compatible.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 2b5c76459d..8fc48bcf4c 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -912,7 +912,7 @@ def get_opencg_lattice(openmc_lattice): opencg_lattice.dimension = dimension opencg_lattice.width = pitch opencg_lattice.universes = universe_array - if outer != None: + if outer is not None: opencg_lattice.outside = get_opencg_universe(outer) offset = np.array(lower_left, dtype=np.float64) - \ @@ -991,7 +991,7 @@ def get_openmc_lattice(opencg_lattice): openmc_lattice.pitch = width openmc_lattice.universes = universe_array openmc_lattice.lower_left = lower_left - if outer != None: + if outer is not None: openmc_lattice.outer = get_openmc_universe(outer) # Add the OpenMC Lattice to the global collection of all OpenMC Lattices From c38fcdc073fd8c14d4fe96f49377ced65c28b41d Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Mon, 16 Nov 2015 08:06:43 -0500 Subject: [PATCH 453/519] Changed conditionals for cell region to be more Pythonic per comments by @paulromano --- openmc/opencg_compatible.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 8fc48bcf4c..93c0e5fae7 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -486,7 +486,7 @@ def get_opencg_cell(openmc_cell): # works if the region is a single half-space or an intersection of # half-spaces, i.e., no complex cells. region = openmc_cell.region - if region != None: + if region is not None: if isinstance(region, Halfspace): surface = region.surface halfspace = -1 if region.side == '-' else 1 From 7661c8902f1abc5f4f9a649f3f9808dfd0306ab7 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 17 Nov 2015 06:57:56 -0600 Subject: [PATCH 454/519] Purify yield_delayed and fix typo. --- src/ace.F90 | 2 +- src/fission.F90 | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index 4cd53a2519..c6d9b02214 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -913,7 +913,7 @@ contains cycle elseif (LOCB == 0) then ! No angular distribution data are given for this reaction, isotropic - ! scattering is asssumed (in CM if TY < 0 and in LAB if TY > 0) + ! scattering is assumed (in CM if TY < 0 and in LAB if TY > 0) cycle end if rxn % has_angle_dist = .true. diff --git a/src/fission.F90 b/src/fission.F90 index 3188138f25..4c7613db32 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -108,8 +108,7 @@ contains ! a given nuclide and incoming neutron energy in a given delayed group. !=============================================================================== - function yield_delayed(nuc, E, g) result(yield) - + pure function yield_delayed(nuc, E, g) result(yield) type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu real(8), intent(in) :: E ! energy of incoming neutron real(8) :: yield ! delayed neutron precursor yield From b8e9e25da8cbedc7af7e4826de19c65f7f0497ec Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 20:04:56 -0500 Subject: [PATCH 455/519] Added fine granularity control for MGXS Libraries --- openmc/mgxs/library.py | 52 ++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 4c173f81a9..2a293cb0ba 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -53,6 +53,8 @@ class Library(object): The types of cross sections in the library (e.g., ['total', 'scatter']) domain_type : {'material', 'cell', 'distribcell', 'universe'} Domain type for spatial homogenization + domains : Iterable of Material, Cell or Universe + The spatial domain(s) for which MGXS in the Library are computed correction : 'P0' or None Apply the P0 correction to scattering matrices if set to 'P0' energy_groups : EnergyGroups @@ -80,6 +82,7 @@ class Library(object): self._by_nuclide = None self._mgxs_types = [] self._domain_type = None + self._domains = 'all' self._correction = 'P0' self._energy_groups = None self._tally_trigger = None @@ -105,6 +108,7 @@ class Library(object): clone._by_nuclide = self.by_nuclide clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type + clone._domains = self.domains clone._correction = self.correction clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) @@ -153,22 +157,24 @@ class Library(object): def by_nuclide(self): return self._by_nuclide - @property - def domains(self): - if self.domain_type is None: - raise ValueError('Unable to get all domains without a domain type') - - if self.domain_type == 'material': - return self.openmc_geometry.get_all_materials() - elif self.domain_type == 'cell' or self.domain_type == 'distribcell': - return self.openmc_geometry.get_all_material_cells() - elif self.domain_type == 'universe': - return self.openmc_geometry.get_all_universes() - @property def domain_type(self): return self._domain_type + @property + def domains(self): + if self._domains == 'all': + if self.domain_type == 'material': + return self.openmc_geometry.get_all_materials() + elif self.domain_type == 'cell' or self.domain_type == 'distribcell': + return self.openmc_geometry.get_all_material_cells() + elif self.domain_type == 'universe': + return self.openmc_geometry.get_all_universes() + else: + raise ValueError('Unable to get domains without a domain type') + else: + return self._domains + @property def correction(self): return self._correction @@ -223,6 +229,28 @@ class Library(object): cv.check_value('domain type', domain_type, tuple(openmc.mgxs.DOMAIN_TYPES)) self._domain_type = domain_type + @domains.setter + def domains(self, domains): + + # Use all materials, cells or universes in the geometry as domains + if domains == 'all': + self._domains = domains + + # User specified a list of material, cell or universe domains + else: + if self.domain_type == 'material': + cv.check_iterable_type('domain', domains, openmc.Material) + elif self.domain_type == 'cell': + cv.check_iterable_type('domain', domains, openmc.Cell) + elif self.domain_type == 'universe': + cv.check_iterable_type('domain', domains, openmc.Universe) + else: + msg = 'Unable to set domains with ' \ + 'domain type "{}"'.format(self.domain_type) + raise ValueError(msg) + + self._domains = domains + @correction.setter def correction(self, correction): cv.check_value('correction', correction, ('P0', None)) From d74dc64bd01ece1fd85ddaf46b99d8df9409ce85 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 20:09:56 -0500 Subject: [PATCH 456/519] MGXS Library domains setter now works for distribcells --- openmc/mgxs/library.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 2a293cb0ba..ee9ffc4fa3 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -166,7 +166,7 @@ class Library(object): if self._domains == 'all': if self.domain_type == 'material': return self.openmc_geometry.get_all_materials() - elif self.domain_type == 'cell' or self.domain_type == 'distribcell': + elif self.domain_type in ['cell', 'distribcell']: return self.openmc_geometry.get_all_material_cells() elif self.domain_type == 'universe': return self.openmc_geometry.get_all_universes() @@ -240,7 +240,7 @@ class Library(object): else: if self.domain_type == 'material': cv.check_iterable_type('domain', domains, openmc.Material) - elif self.domain_type == 'cell': + elif self.domain_type in ['cell', 'distribcell']: cv.check_iterable_type('domain', domains, openmc.Cell) elif self.domain_type == 'universe': cv.check_iterable_type('domain', domains, openmc.Universe) From 698dba369b2655a7c1ce1d2117efcc642330e087 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 20:31:22 -0500 Subject: [PATCH 457/519] Added colorize routine to Python API Plot class to generate random color schemes --- openmc/plots.py | 97 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 30 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index 6cff095ec0..449374a3f4 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -5,9 +5,9 @@ import sys import numpy as np +import openmc +import openmc.checkvalue as cv from openmc.clean_xml import * -from openmc.checkvalue import (check_type, check_value, check_length, - check_greater_than, check_less_than) if sys.version_info[0] >= 3: basestring = str @@ -143,70 +143,70 @@ class Plot(object): self._id = AUTO_PLOT_ID AUTO_PLOT_ID += 1 else: - check_type('plot ID', plot_id, Integral) - check_greater_than('plot ID', plot_id, 0, equality=True) + cv.check_type('plot ID', plot_id, Integral) + cv.check_greater_than('plot ID', plot_id, 0, equality=True) self._id = plot_id @name.setter def name(self, name): - check_type('plot name', name, basestring) + cv.check_type('plot name', name, basestring) self._name = name @width.setter def width(self, width): - check_type('plot width', width, Iterable, Real) - check_length('plot width', width, 2, 3) + cv.check_type('plot width', width, Iterable, Real) + cv.check_length('plot width', width, 2, 3) self._width = width @origin.setter def origin(self, origin): - check_type('plot origin', origin, Iterable, Real) - check_length('plot origin', origin, 3) + cv.check_type('plot origin', origin, Iterable, Real) + cv.check_length('plot origin', origin, 3) self._origin = origin @pixels.setter def pixels(self, pixels): - check_type('plot pixels', pixels, Iterable, Integral) - check_length('plot pixels', pixels, 2, 3) + cv.check_type('plot pixels', pixels, Iterable, Integral) + cv.check_length('plot pixels', pixels, 2, 3) for dim in pixels: - check_greater_than('plot pixels', dim, 0) + cv.check_greater_than('plot pixels', dim, 0) self._pixels = pixels @filename.setter def filename(self, filename): - check_type('filename', filename, basestring) + cv.check_type('filename', filename, basestring) self._filename = filename @color.setter def color(self, color): - check_type('plot color', color, basestring) - check_value('plot color', color, ['cell', 'mat']) + cv.check_type('plot color', color, basestring) + cv.check_value('plot color', color, ['cell', 'mat']) self._color = color @type.setter def type(self, plottype): - check_type('plot type', plottype, basestring) - check_value('plot type', plottype, ['slice', 'voxel']) + cv.check_type('plot type', plottype, basestring) + cv.check_value('plot type', plottype, ['slice', 'voxel']) self._type = plottype @basis.setter def basis(self, basis): - check_type('plot basis', basis, basestring) - check_value('plot basis', basis, ['xy', 'xz', 'yz']) + cv.check_type('plot basis', basis, basestring) + cv.check_value('plot basis', basis, ['xy', 'xz', 'yz']) self._basis = basis @background.setter def background(self, background): - check_type('plot background', background, Iterable, Integral) - check_length('plot background', background, 3) + cv.check_type('plot background', background, Iterable, Integral) + cv.check_length('plot background', background, 3) for rgb in background: - check_greater_than('plot background',rgb, 0, True) - check_less_than('plot background', rgb, 256) + cv.check_greater_than('plot background',rgb, 0, True) + cv.check_less_than('plot background', rgb, 256) self._background = background @col_spec.setter def col_spec(self, col_spec): - check_type('plot col_spec parameter', col_spec, dict, Integral) + cv.check_type('plot col_spec parameter', col_spec, dict, Integral) for key in col_spec: if key < 0: @@ -229,18 +229,18 @@ class Plot(object): @mask_componenets.setter def mask_components(self, mask_components): - check_type('plot mask_components', mask_components, Iterable, Integral) + cv.check_type('plot mask_components', mask_components, Iterable, Integral) for component in mask_components: - check_greater_than('plot mask_components', component, 0, True) + cv.check_greater_than('plot mask_components', component, 0, True) self._mask_components = mask_components @mask_background.setter def mask_background(self, mask_background): - check_type('plot mask background', mask_background, Iterable, Integral) - check_length('plot mask background', mask_background, 3) + cv.check_type('plot mask background', mask_background, Iterable, Integral) + cv.check_length('plot mask background', mask_background, 3) for rgb in mask_background: - check_greater_than('plot mask background', rgb, 0, True) - check_less_than('plot mask background', rgb, 256) + cv.check_greater_than('plot mask background', rgb, 0, True) + cv.check_less_than('plot mask background', rgb, 256) self._mask_background = mask_background def __repr__(self): @@ -261,6 +261,43 @@ class Plot(object): string += '{0: <16}{1}{2}\n'.format('\tCol Spec', '=\t', self._col_spec) return string + def colorize(self, geometry, seed=1): + """Generate a color scheme for each domain in the plot. + + This routine may be used to generate random, reproducible color schemes. + The colors generated are based upon cell/material IDs in the geometry. + + Params + ------ + geometry : openmc.Geometry + The geometry for which the plot is created + seed : Integral + The random number seed used to generate the color scheme + + """ + + cv.check_type('geometry', geometry, openmc.Geometry) + cv.check_type('seed', seed, Integral) + cv.check_greater_than('seed', seed, 1, equality=True) + + # Get collections of the domains which will be plotted + if self.color is 'mat': + domains = geometry.get_all_materials() + else: + domains = geometry.get_all_materials() + + # Set the seed for the random number generator + np.random.seed(seed) + + # Generate random colors for each feature + self.col_spec = {} + for domain in domains: + r = np.random.randint(0, 255) + g = np.random.randint(0, 255) + b = np.random.randint(0, 255) + self.col_spec[domain.id] = (r, g, b) + + def get_plot_xml(self): """Return XML representation of the plot From 64a7cd960728407df4ea3f9376b362b1a7aa070f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 20:39:03 -0500 Subject: [PATCH 458/519] Added colorize routine to PlotsFile --- openmc/plots.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/openmc/plots.py b/openmc/plots.py index 449374a3f4..acc7d4d13c 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -386,6 +386,25 @@ class PlotsFile(object): self._plots.remove(plot) + def colorize(self, geometry, seed=1): + """Generate a consistent color scheme for each domain in each plot. + + This routine may be used to generate random, reproducible color schemes. + The colors generated are based upon cell/material IDs in the geometry. + The color schemes will be consistent for all plots in "plots.xml". + + Params + ------ + geometry : openmc.Geometry + The geometry for which the plots are defined + seed : Integral + The random number seed used to generate the color scheme + + """ + + for plot in self._plots: + plot.colorize(geometry, seed) + def _create_plot_subelements(self): for plot in self._plots: xml_element = plot.get_plot_xml() From 372d751fa64967443adcc655bed2bf3d89512822 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 21:18:26 -0500 Subject: [PATCH 459/519] Added alpha compositing scheme to Python API Plot class to highlight domains --- openmc/plots.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index acc7d4d13c..d04f9a036e 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -270,7 +270,7 @@ class Plot(object): Params ------ geometry : openmc.Geometry - The geometry for which the plot is created + The geometry for which the plot is defined seed : Integral The random number seed used to generate the color scheme @@ -284,7 +284,7 @@ class Plot(object): if self.color is 'mat': domains = geometry.get_all_materials() else: - domains = geometry.get_all_materials() + domains = geometry.get_all_cells() # Set the seed for the random number generator np.random.seed(seed) @@ -295,9 +295,63 @@ class Plot(object): r = np.random.randint(0, 255) g = np.random.randint(0, 255) b = np.random.randint(0, 255) - self.col_spec[domain.id] = (r, g, b) + self.col_spec[domain] = (r, g, b) + def highlight_domains(self, geometry, domains, seed=1, + alpha=0.5, background='grey'): + """Use alpha compositing to highlight one or more domains in the plot. + + This routine generates a color scheme and applies alpha compositing + to make all domains except the highlighted ones partially transparent. + + Params + ------ + geometry : openmc.Geometry + The geometry for which the plot is defined + domains : Iterable of Integral + A collection of the domain IDs to highlight in the plot + seed : Integral + The random number seed used to generate the color scheme + alpha : Real in [0,1] + The value to apply in alpha compisiting + background : 3-tuple of Integral or 'white' or 'black' or 'grey' + The background color to apply in alpha compisiting + + """ + + cv.check_iterable_type('domains', domains, Integral) + cv.check_type('alpha', alpha, Real) + cv.check_greater_than('alpha', alpha, 0., equality=True) + cv.check_less_than('alpha', alpha, 1., equality=True) + + # Get a background (R,G,B) tuple to apply in alpha compositing + if isinstance(background, basestring): + if background == 'white': + background = (255, 255, 255) + elif background == 'black': + background = (0, 0, 0) + elif background == 'grey': + background = (160, 160, 160) + else: + msg = 'The background "{}" is not defined'.format(background) + raise ValueError(msg) + + cv.check_iterable_type('background', background, Integral) + + # Generate a color scheme + self.colorize(geometry, seed) + + # Apply alpha compositing to the colors for all domains + # other than those the user wishes to highlight + for domain_id in self.col_spec: + if domain_id not in domains: + r, g, b = self.col_spec[domain_id] + r = int(((1-alpha) * background[0]) + (alpha * r)) + g = int(((1-alpha) * background[1]) + (alpha * g)) + b = int(((1-alpha) * background[2]) + (alpha * b)) + self._col_spec[domain_id] = (r, g, b) + def get_plot_xml(self): """Return XML representation of the plot From 0933cd7e8aa74d8a6f39bcc901de4e2bb2de9273 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 21:19:42 -0500 Subject: [PATCH 460/519] Added alpha compositing routine to PlotsFile in Python API --- openmc/plots.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/openmc/plots.py b/openmc/plots.py index d04f9a036e..aedc6ed41b 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -459,6 +459,32 @@ class PlotsFile(object): for plot in self._plots: plot.colorize(geometry, seed) + + def highlight_domains(self, geometry, domains, seed=1, + alpha=0.5, background='grey'): + """Use alpha compositing to highlight one or more domains in the plot. + + This routine generates a color scheme and applies alpha compositing + to make all domains except the highlighted ones partially transparent. + + Params + ------ + geometry : openmc.Geometry + The geometry for which the plot is defined + domains : Iterable of Integral + A collection of the domain IDs to highlight in the plot + seed : Integral + The random number seed used to generate the color scheme + alpha : Real in [0,1] + The value to apply in alpha compisiting + background : 3-tuple of Integral or 'white' or 'black' or 'grey' + The background color to apply in alpha compisiting + + """ + + for plot in self._plots: + plot.highlight_domains(geometry, domains, seed, alpha, background) + def _create_plot_subelements(self): for plot in self._plots: xml_element = plot.get_plot_xml() From 59f9b77333710b26300afddd32d556aa00536564 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 17 Nov 2015 21:21:14 -0500 Subject: [PATCH 461/519] Fixed bug in Plot.colorize() for cell plots --- openmc/plots.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index acc7d4d13c..e805e09d27 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -284,7 +284,7 @@ class Plot(object): if self.color is 'mat': domains = geometry.get_all_materials() else: - domains = geometry.get_all_materials() + domains = geometry.get_all_cells() # Set the seed for the random number generator np.random.seed(seed) @@ -295,7 +295,7 @@ class Plot(object): r = np.random.randint(0, 255) g = np.random.randint(0, 255) b = np.random.randint(0, 255) - self.col_spec[domain.id] = (r, g, b) + self.col_spec[domain] = (r, g, b) def get_plot_xml(self): From 17d50332b29d5b6c293a2fd784417800ef5247f2 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 17 Nov 2015 22:33:00 -0500 Subject: [PATCH 462/519] fixed issue in Python API tally arithmetic with tally multiplication --- openmc/tallies.py | 74 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 0661ab67b1..71c84a2801 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1487,10 +1487,16 @@ class Tally(object): other_filters = set(other.filters) filter_intersect = self_filters.intersection(other_filters) - # Align the shared filters to follow in each tally operand + # Align the shared filters in successive order for i, filter in enumerate(filter_intersect): - self_index = self.filters.index(filter) - other_filter = other.filters[self_index] + self_filter = self.filters[i] + other_filter = other.filters[i] + + # If necessary, swap self filter + if self_filter != filter: + self = self.swap_filters(filter, self_filter) + + # If necessary, swap other filter if other_filter != filter: other = other.swap_filters(filter, other_filter) @@ -1559,7 +1565,7 @@ class Tally(object): if len(self.filters) != match and len(other.filters) == match: for filter in cross_filters[0]: new_tally.add_filter(filter) - elif len(other.filters) == match and len(other.filters) != match: + elif len(self.filters) == match and len(other.filters) != match: for filter in cross_filters[1]: new_tally.add_filter(filter) else: @@ -1644,8 +1650,8 @@ class Tally(object): self_repeat_factor *= filter.num_bins # Tile / repeat the tally data for the tally outer product - self_shape = list(self.mean.shape) - other_shape = list(other.mean.shape) + self_shape = list(self_mean.shape) + other_shape = list(other_mean.shape) self_shape[0] *= self_repeat_factor self_mean = np.repeat(self_mean, self_repeat_factor) self_std_dev = np.repeat(self_std_dev, self_repeat_factor) @@ -1653,7 +1659,8 @@ class Tally(object): if self_repeat_factor == 1: other_shape[0] *= other_tile_factor other_mean = np.repeat(other_mean, other_tile_factor, axis=0) - other_std_dev = np.repeat(other_std_dev, other_tile_factor, axis=0) + other_std_dev = np.repeat(other_std_dev, other_tile_factor, + axis=0) else: other_mean = np.tile(other_mean, (other_tile_factor, 1, 1)) other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1)) @@ -1672,7 +1679,11 @@ class Tally(object): self_repeat_factor = other.num_nuclides other_tile_factor = self.num_nuclides - # Replicate the data + # Tile / repeat the tally data for the tally outer product + self_shape = list(self_mean.shape) + other_shape = list(other_mean.shape) + self_shape[1] *= self_repeat_factor + other_shape[1] *= other_tile_factor self_mean = np.repeat(self_mean, self_repeat_factor, axis=1) other_mean = np.tile(other_mean, (1, other_tile_factor, 1)) self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1) @@ -1680,10 +1691,10 @@ class Tally(object): # NumPy repeat and tile routines return 1D flattened arrays # Reshape arrays as 3D with filters, nuclides and scores axes - self_shape = list(self.mean.shape) - self_shape[1] *= self_repeat_factor self_mean.shape = tuple(self_shape) self_std_dev.shape = tuple(self_shape) + other_mean.shape = tuple(other_shape) + other_std_dev.shape = tuple(other_shape) if self.scores != other.scores: @@ -1692,7 +1703,11 @@ class Tally(object): self_repeat_factor = other.num_score_bins other_tile_factor = self.num_score_bins - # Replicate the data + # Tile / repeat the tally data for the tally outer product + self_shape = list(self_mean.shape) + other_shape = list(other_mean.shape) + self_shape[2] *= self_repeat_factor + other_shape[2] *= other_tile_factor self_mean = np.repeat(self_mean, self_repeat_factor, axis=2) other_mean = np.tile(other_mean, (1, 1, other_tile_factor)) self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2) @@ -1700,10 +1715,10 @@ class Tally(object): # NumPy repeat and tile routines return 1D flattened arrays # Reshape arrays as 3D with filters, nuclides and scores axes - self_shape = list(self.mean.shape) - self_shape[2] *= self_repeat_factor self_mean.shape = tuple(self_shape) self_std_dev.shape = tuple(self_shape) + other_mean.shape = tuple(other_shape) + other_std_dev.shape = tuple(other_shape) data = {} data['self'] = {} @@ -2451,6 +2466,13 @@ class Tally(object): A new tally which encapsulates the sum of data requested. """ + # If user input filter type but no bins, sum across all bins and + # remove the filter + if filter_type in _FILTER_TYPES and len(filter_bins) == 0: + remove_filter = True + else: + remove_filter = False + # If user did not specify any scores, do not sum across scores if len(scores) == 0: scores = [[]] @@ -2467,7 +2489,14 @@ class Tally(object): # Sum across any filter bins specified by the user if filter_type in _FILTER_TYPES: - filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] + + # If user did not specify filter bins, sum across all bins + if len(filter_bins) == 0: + filter = self.find_filter(filter_type) + filter_bins = [[(filter.get_bin(i),)] for i in range(filter.num_bins)] + else: + filter_bins = [[(filter_bin,)] for filter_bin in filter_bins] + filters = [[filter_type]] # If user did not specify a filter type, do not sum across filter bins else: @@ -2492,12 +2521,17 @@ class Tally(object): # Accumulate this Tally slice into the Tally sum tally_sum += tally_slice - # Add back the filter(s) which were summed across to derived tally - for filter_type in summed_filters: - filters = summed_filters[filter_type] - for i in range(1, len(filters)): - filters[i] = CrossFilter(filters[i-1], filters[i], '+') - tally_sum.add_filter(filters[-1]) + # Add back the filter(s) which were summed across to derived tally, + # if filter bins were input; otherwise, leave out summed filter(s) + if remove_filter: + # Rename tally sum indicating a summation over a particular filter + tally_sum.name = 'sum({0}, {1})'.format(self.name, filter_type) + else: + for summed_filter_type in summed_filters: + filters = summed_filters[summed_filter_type] + for i in range(1, len(filters)): + filters[i] = CrossFilter(filters[i-1], filters[i], '+') + tally_sum.add_filter(filters[-1]) return tally_sum From 0927f2530065f91ebf951d1f44f5596fc14460c6 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 18 Nov 2015 07:57:06 -0600 Subject: [PATCH 463/519] Fix bug in reimplementation of neighbor_lists. --- src/geometry.F90 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 75165158bf..3f8b43d4cb 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -903,13 +903,17 @@ contains do i = 1, n_surfaces ! Copy positive neighbors to Surface instance j = neighbor_pos(i)%size() - allocate(surfaces(i)%obj%neighbor_pos(j)) - surfaces(i)%obj%neighbor_pos(:) = neighbor_pos(i)%data(1:j) + if (j > 0) then + allocate(surfaces(i)%obj%neighbor_pos(j)) + surfaces(i)%obj%neighbor_pos(:) = neighbor_pos(i)%data(1:j) + end if ! Copy negative neighbors to Surface instance j = neighbor_neg(i)%size() - allocate(surfaces(i)%obj%neighbor_neg(j)) - surfaces(i)%obj%neighbor_neg(:) = neighbor_neg(i)%data(1:j) + if (j > 0) then + allocate(surfaces(i)%obj%neighbor_neg(j)) + surfaces(i)%obj%neighbor_neg(:) = neighbor_neg(i)%data(1:j) + end if end do end subroutine neighbor_lists From 4d3c97f6989ff385b09fbcc4d8e7f5e1bb70cdc4 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 18 Nov 2015 11:01:12 -0500 Subject: [PATCH 464/519] Made upper bound for random colors 256 per comments by @paulromano --- openmc/plots.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index e805e09d27..41254d832d 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -267,8 +267,8 @@ class Plot(object): This routine may be used to generate random, reproducible color schemes. The colors generated are based upon cell/material IDs in the geometry. - Params - ------ + Parameters + ---------- geometry : openmc.Geometry The geometry for which the plot is created seed : Integral @@ -292,9 +292,9 @@ class Plot(object): # Generate random colors for each feature self.col_spec = {} for domain in domains: - r = np.random.randint(0, 255) - g = np.random.randint(0, 255) - b = np.random.randint(0, 255) + r = np.random.randint(0, 256) + g = np.random.randint(0, 256) + b = np.random.randint(0, 256) self.col_spec[domain] = (r, g, b) @@ -393,8 +393,8 @@ class PlotsFile(object): The colors generated are based upon cell/material IDs in the geometry. The color schemes will be consistent for all plots in "plots.xml". - Params - ------ + Parameters + ---------- geometry : openmc.Geometry The geometry for which the plots are defined seed : Integral From 0c7d58457e2738c1373c1e9747462434721c68fe Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 18 Nov 2015 11:04:09 -0500 Subject: [PATCH 465/519] Now using American English for gray (not grey) in alpha transparency --- openmc/plots.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index e0237f525d..0f12c8a93a 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -298,7 +298,7 @@ class Plot(object): self.col_spec[domain] = (r, g, b) def highlight_domains(self, geometry, domains, seed=1, - alpha=0.5, background='grey'): + alpha=0.5, background='gray'): """Use alpha compositing to highlight one or more domains in the plot. This routine generates a color scheme and applies alpha compositing @@ -314,7 +314,7 @@ class Plot(object): The random number seed used to generate the color scheme alpha : Real in [0,1] The value to apply in alpha compisiting - background : 3-tuple of Integral or 'white' or 'black' or 'grey' + background : 3-tuple of Integral or 'white' or 'black' or 'gray' The background color to apply in alpha compisiting """ @@ -330,7 +330,7 @@ class Plot(object): background = (255, 255, 255) elif background == 'black': background = (0, 0, 0) - elif background == 'grey': + elif background == 'gray': background = (160, 160, 160) else: msg = 'The background "{}" is not defined'.format(background) @@ -460,7 +460,7 @@ class PlotsFile(object): def highlight_domains(self, geometry, domains, seed=1, - alpha=0.5, background='grey'): + alpha=0.5, background='gray'): """Use alpha compositing to highlight one or more domains in the plot. This routine generates a color scheme and applies alpha compositing @@ -476,7 +476,7 @@ class PlotsFile(object): The random number seed used to generate the color scheme alpha : Real in [0,1] The value to apply in alpha compisiting - background : 3-tuple of Integral or 'white' or 'black' or 'grey' + background : 3-tuple of Integral or 'white' or 'black' or 'gray' The background color to apply in alpha compisiting """ From 7abbee6df69a0c50e4167b07f3173a31c258a820 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 18 Nov 2015 11:05:10 -0500 Subject: [PATCH 466/519] Revised docstring Params -> Parameters for alpha transparency --- openmc/plots.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index 0f12c8a93a..636ca225cb 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -302,10 +302,11 @@ class Plot(object): """Use alpha compositing to highlight one or more domains in the plot. This routine generates a color scheme and applies alpha compositing - to make all domains except the highlighted ones partially transparent. + to make all domains except the highlighted ones appear partially + transparent. - Params - ------ + Parameters + ---------- geometry : openmc.Geometry The geometry for which the plot is defined domains : Iterable of Integral @@ -466,8 +467,8 @@ class PlotsFile(object): This routine generates a color scheme and applies alpha compositing to make all domains except the highlighted ones partially transparent. - Params - ------ + Parameters + ---------- geometry : openmc.Geometry The geometry for which the plot is defined domains : Iterable of Integral From cfe1f1dfcd420bc235432c3edef5848e45f6076f Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 18 Nov 2015 11:10:31 -0500 Subject: [PATCH 467/519] Added check to MGXS Library domains setter to compare with domains in geometry --- openmc/mgxs/library.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ee9ffc4fa3..9def79eeb2 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -240,15 +240,24 @@ class Library(object): else: if self.domain_type == 'material': cv.check_iterable_type('domain', domains, openmc.Material) + all_domains = self.openmc_geometry.get_all_materials() elif self.domain_type in ['cell', 'distribcell']: cv.check_iterable_type('domain', domains, openmc.Cell) + all_domains = self.openmc_geometry.get_all_material_cells() elif self.domain_type == 'universe': cv.check_iterable_type('domain', domains, openmc.Universe) + all_domains = self.openmc_geometry.get_all_universes() else: msg = 'Unable to set domains with ' \ 'domain type "{}"'.format(self.domain_type) raise ValueError(msg) + # Check that each domain can be found in the geometry + for domain in domains: + if domain not in all_domains: + msg = 'Domain "{}" could not be found in the geometry' + raise ValueError(msg) + self._domains = domains @correction.setter From 9e4cd5ae2b0c6d437efb6b574c703f41eaf40882 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 18 Nov 2015 11:57:36 -0500 Subject: [PATCH 468/519] Fixed typo in error checking in MGXS Library domains setter per comment by @nelsonag --- openmc/mgxs/library.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 9def79eeb2..87c6665b2d 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -255,7 +255,8 @@ class Library(object): # Check that each domain can be found in the geometry for domain in domains: if domain not in all_domains: - msg = 'Domain "{}" could not be found in the geometry' + msg = 'Domain "{}" could not be found in the ' \ + 'geometry.'.format(domain) raise ValueError(msg) self._domains = domains From a592f2ad1501aa8cb8c7f4e813ea335628ab70e0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 19 Nov 2015 07:16:48 -0600 Subject: [PATCH 469/519] Extend length of string for reading region specification to 1000 --- src/input_xml.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index ae01b0b5cc..5449b169dd 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -994,7 +994,7 @@ contains logical :: boundary_exists character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word - character(MAX_LINE_LEN) :: region_spec + character(1000) :: region_spec type(Cell), pointer :: c class(Surface), pointer :: s class(Lattice), pointer :: lat From df3b9ed017ccac91ee8331d24726aa80f4648658 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 19 Nov 2015 16:47:55 -0500 Subject: [PATCH 470/519] fixed error in cross.py and added remove_filter attribute to tally summation --- openmc/cross.py | 2 +- openmc/tallies.py | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 435557ede7..31006cbf7c 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -356,7 +356,7 @@ class CrossFilter(object): def type(self, filter_type): if filter_type not in _FILTER_TYPES.values(): msg = 'Unable to set Filter type to "{0}" since it is not one ' \ - 'of the supported types'.format(type) + 'of the supported types'.format(filter_type) raise ValueError(msg) self._type = filter_type diff --git a/openmc/tallies.py b/openmc/tallies.py index 71c84a2801..c8090fc176 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2430,7 +2430,7 @@ class Tally(object): return new_tally def summation(self, scores=[], filter_type=None, - filter_bins=[], nuclides=[]): + filter_bins=[], nuclides=[], remove_filter=False): """Vectorized sum of tally data across scores, filter bins and/or nuclides using tally addition. @@ -2459,6 +2459,9 @@ class Tally(object): nuclides : list of str A list of nuclide name strings to sum across (e.g., ['U-235', 'U-238']; default is []) + remove_filter : bool + If a filter is being summed over, this bool indicates whether to + remove that filter in the returned tally. Returns ------- @@ -2466,13 +2469,6 @@ class Tally(object): A new tally which encapsulates the sum of data requested. """ - # If user input filter type but no bins, sum across all bins and - # remove the filter - if filter_type in _FILTER_TYPES and len(filter_bins) == 0: - remove_filter = True - else: - remove_filter = False - # If user did not specify any scores, do not sum across scores if len(scores) == 0: scores = [[]] @@ -2523,7 +2519,7 @@ class Tally(object): # Add back the filter(s) which were summed across to derived tally, # if filter bins were input; otherwise, leave out summed filter(s) - if remove_filter: + if remove_filter and filter_type is not None: # Rename tally sum indicating a summation over a particular filter tally_sum.name = 'sum({0}, {1})'.format(self.name, filter_type) else: From 8c6d14ed23d4e3d4fc8ed349943215d76b95c41c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 19 Nov 2015 16:50:11 -0500 Subject: [PATCH 471/519] added default in doc string for tally summation remove_filter --- openmc/tallies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index c8090fc176..c24bc2d4d6 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2461,7 +2461,7 @@ class Tally(object): (e.g., ['U-235', 'U-238']; default is []) remove_filter : bool If a filter is being summed over, this bool indicates whether to - remove that filter in the returned tally. + remove that filter in the returned tally. Default is False. Returns ------- From 4d8015d11d5ad828f5e6ee1bab24bfe806b269af Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 19 Nov 2015 17:41:01 -0500 Subject: [PATCH 472/519] Implemented initial fixed source mode in Python API --- openmc/settings.py | 76 +++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/openmc/settings.py b/openmc/settings.py index 519b5c7cf2..8cb438a338 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -20,6 +20,8 @@ class SettingsFile(object): Attributes ---------- + run_mode : {'eigenvalue' or 'fixed source'} + The type of calculation to perform (default is 'eigenvalue') batches : int Number of batches to simulate generations_per_batch : int @@ -122,7 +124,9 @@ class SettingsFile(object): """ def __init__(self): - # Eigenvalue subelement + + # Run mode subelement (default is 'eigenvalue') + self._run_mode = 'eigenvalue' self._batches = None self._generations_per_batch = None self._inactive = None @@ -196,9 +200,13 @@ class SettingsFile(object): self._dd_count_interactions = False self._settings_file = ET.Element("settings") - self._eigenvalue_subelement = None + self._run_mode_subelement = None self._source_element = None + @property + def run_mode(self): + return self._run_mode + @property def batches(self): return self._batches @@ -399,6 +407,14 @@ class SettingsFile(object): def dd_count_interactions(self): return self._dd_count_interactions + @run_mode.setter + def run_mode(self, run_mode): + if not 'run_mode' in ['eigenvalue', 'fixed source']: + msg = 'Unable to set run mode to "{0}". Only "eigenvalue" ' \ + 'and "fixed source" are supported."'.format(run_mode) + raise ValueError(msg) + self._run_mode = run_mode + @batches.setter def batches(self, batches): check_type('batches', batches, Integral) @@ -861,57 +877,47 @@ class SettingsFile(object): self._dd_count_interactions = interactions - def _create_eigenvalue_subelement(self): - self._create_particles_subelement() - self._create_batches_subelement() - self._create_inactive_subelement() - self._create_generations_per_batch_subelement() - self._create_keff_trigger_subelement() + def _create_run_mode_subelement(self): + + if self.run_mode == 'eigenvalue': + self._run_mode_subelement = \ + ET.SubElement(self._settings_file, "eigenvalue") + self._create_batches_subelement() + self._create_generations_per_batch_subelement() + self._create_inactive_subelement() + self._create_particles_subelement() + self._create_keff_trigger_subelement() + else: + if self._run_mode_subelement is None: + self._run_mode_subelement = \ + ET.SubElement(self._settings_file, "fixed_source") + self._create_batches_subelement() + self._create_particles_subelement() def _create_batches_subelement(self): if self._batches is not None: - if self._eigenvalue_subelement is None: - self._eigenvalue_subelement = ET.SubElement(self._settings_file, - "eigenvalue") - - element = ET.SubElement(self._eigenvalue_subelement, "batches") + element = ET.SubElement(self._run_mode_subelement, "batches") element.text = str(self._batches) def _create_generations_per_batch_subelement(self): if self._generations_per_batch is not None: - if self._eigenvalue_subelement is None: - self._eigenvalue_subelement = ET.SubElement(self._settings_file, - "eigenvalue") - - element = ET.SubElement(self._eigenvalue_subelement, + element = ET.SubElement(self._run_mode_subelement, "generations_per_batch") element.text = str(self._generations_per_batch) def _create_inactive_subelement(self): if self._inactive is not None: - if self._eigenvalue_subelement is None: - self._eigenvalue_subelement = ET.SubElement(self._settings_file, - "eigenvalue") - - element = ET.SubElement(self._eigenvalue_subelement, "inactive") + element = ET.SubElement(self._run_mode_subelement, "inactive") element.text = str(self._inactive) def _create_particles_subelement(self): if self._particles is not None: - if self._eigenvalue_subelement is None: - self._eigenvalue_subelement = ET.SubElement(self._settings_file, - "eigenvalue") - - element = ET.SubElement(self._eigenvalue_subelement, "particles") + element = ET.SubElement(self._run_mode_subelement, "particles") element.text = str(self._particles) def _create_keff_trigger_subelement(self): if self._keff_trigger is not None: - if self._eigenvalue_subelement is None: - self._eigenvalue_subelement = ET.SubElement(self._settings_file, - "eigenvalue") - - element = ET.SubElement(self._eigenvalue_subelement, "keff_trigger") + element = ET.SubElement(self._run_mode_subelement, "keff_trigger") for key in self._keff_trigger: subelement = ET.SubElement(element, key) @@ -1182,10 +1188,10 @@ class SettingsFile(object): self._settings_file.clear() self._source_subelement = None self._trigger_subelement = None - self._eigenvalue_subelement = None + self._run_mode_subelement = None self._source_element = None - self._create_eigenvalue_subelement() + self._create_run_mode_subelement() self._create_source_subelement() self._create_output_subelement() self._create_statepoint_subelement() From fca18c7de454dc66deb33450ccd46c4eb0afbb38 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 19 Nov 2015 17:47:29 -0500 Subject: [PATCH 473/519] Reverted to original ordering for Python API Settings XML attribute creation --- openmc/settings.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openmc/settings.py b/openmc/settings.py index 8cb438a338..742442ba94 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -882,17 +882,17 @@ class SettingsFile(object): if self.run_mode == 'eigenvalue': self._run_mode_subelement = \ ET.SubElement(self._settings_file, "eigenvalue") - self._create_batches_subelement() - self._create_generations_per_batch_subelement() - self._create_inactive_subelement() self._create_particles_subelement() + self._create_batches_subelement() + self._create_inactive_subelement() + self._create_generations_per_batch_subelement() self._create_keff_trigger_subelement() else: if self._run_mode_subelement is None: self._run_mode_subelement = \ ET.SubElement(self._settings_file, "fixed_source") - self._create_batches_subelement() self._create_particles_subelement() + self._create_batches_subelement() def _create_batches_subelement(self): if self._batches is not None: From f458e825ce0c52b90dc8c647c4f3ae0b6b749d3a Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 19 Nov 2015 20:54:31 -0500 Subject: [PATCH 474/519] added inline option to swap tally method --- openmc/tallies.py | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index c24bc2d4d6..026d0992bd 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1494,11 +1494,11 @@ class Tally(object): # If necessary, swap self filter if self_filter != filter: - self = self.swap_filters(filter, self_filter) + self.swap_filters(filter, self_filter, inline=True) # If necessary, swap other filter if other_filter != filter: - other = other.swap_filters(filter, other_filter) + other.swap_filters(filter, other_filter, inline=True) data = self._align_tally_data(other) @@ -1729,7 +1729,7 @@ class Tally(object): data['other']['std. dev.'] = other_std_dev return data - def swap_filters(self, filter1, filter2): + def swap_filters(self, filter1, filter2, inline=False): """Reverse the ordering of two filters in this tally This is a helper method for tally arithmetic which helps align the data @@ -1744,10 +1744,14 @@ class Tally(object): filter2 : Filter The filter to swap with filter1 + inline : bool, optional + Whether to inline operator or return new tally with swapped filters. + Returns ------- swap_tally - A copy of this tally with the filters swapped + If inline is true, a copy of this tally with the filters swapped. + Otherwise, nothing is returned. Raises ------ @@ -1778,7 +1782,15 @@ class Tally(object): 'does not contain such a filter'.format(filter2.type, self.id) raise ValueError(msg) - swap_tally = copy.deepcopy(self) + # Create a copy of the tally that preserves the original data formatting + # throughout swapping process + tally_copy = copy.deepcopy(self) + + # Set the swap tally + if inline: + swap_tally = self + else: + swap_tally = copy.deepcopy(self) # Swap the filters in the copied version of this Tally filter1_index = swap_tally.filters.index(filter1) @@ -1808,8 +1820,8 @@ class Tally(object): if self.sum is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='sum') + data = tally_copy.get_values( + filters=filters, filter_bins=filter_bins, value='sum') indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally.sum[indices, :, :] = data @@ -1817,8 +1829,8 @@ class Tally(object): if self.sum_sq is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='sum_sq') + data = tally_copy.get_values( + filters=filters, filter_bins=filter_bins, value='sum_sq') indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally.sum_sq[indices, :, :] = data @@ -1826,8 +1838,8 @@ class Tally(object): if self.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='mean') + data = tally_copy.get_values( + filters=filters, filter_bins=filter_bins, value='mean') indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally._mean[indices, :, :] = data @@ -1835,12 +1847,13 @@ class Tally(object): if self.std_dev is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] - data = self.get_values(filters=filters, - filter_bins=filter_bins, value='std_dev') + data = tally_copy.get_values( + filters=filters, filter_bins=filter_bins, value='std_dev') indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally._std_dev[indices, :, :] = data - return swap_tally + if not inline: + return swap_tally def __add__(self, other): """Adds this tally to another tally or scalar value. From f61408fb21c5c5400f2fe08d29667f94e5249f48 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 19 Nov 2015 20:58:30 -0500 Subject: [PATCH 475/519] Changed Python API SettingsFile not run_mode in to more Pythonic run_mode not in --- openmc/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/settings.py b/openmc/settings.py index 742442ba94..9eb54b9eb6 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -409,7 +409,7 @@ class SettingsFile(object): @run_mode.setter def run_mode(self, run_mode): - if not 'run_mode' in ['eigenvalue', 'fixed source']: + if 'run_mode' not in ['eigenvalue', 'fixed source']: msg = 'Unable to set run mode to "{0}". Only "eigenvalue" ' \ 'and "fixed source" are supported."'.format(run_mode) raise ValueError(msg) From f9204ce66eef7a41944fede279e04d1f2ef3e2d9 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 20 Nov 2015 13:06:20 -0500 Subject: [PATCH 476/519] fixed bug in cross filter deepcopy and fixed bug in tally arithmetic --- openmc/cross.py | 2 +- openmc/tallies.py | 75 +- .../results_true.dat | 86 +- .../results_true.dat | 46 +- .../results_true.dat | 950 +++++++++--------- 5 files changed, 582 insertions(+), 577 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 31006cbf7c..57339e71cb 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -309,7 +309,7 @@ class CrossFilter(object): clone._right_filter = self.right_filter clone._binary_op = self.binary_op clone._type = self.type - clone._bins = self.bins + clone._bins = self._bins clone._num_bins = self.num_bins clone._stride = self.stride diff --git a/openmc/tallies.py b/openmc/tallies.py index 026d0992bd..f4b30d67f4 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1482,25 +1482,30 @@ class Tally(object): new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name) new_tally.name = new_name + # Create copies of self and other tallies to rearrange for tally + # arithmetic + self_copy = copy.deepcopy(self) + other_copy = copy.deepcopy(other) + # Find any shared filters between the two tallies - self_filters = set(self.filters) - other_filters = set(other.filters) + self_filters = set(self_copy.filters) + other_filters = set(other_copy.filters) filter_intersect = self_filters.intersection(other_filters) # Align the shared filters in successive order for i, filter in enumerate(filter_intersect): - self_filter = self.filters[i] - other_filter = other.filters[i] + self_index = self_copy.filters.index(filter) + other_index = other_copy.filters.index(filter) # If necessary, swap self filter - if self_filter != filter: - self.swap_filters(filter, self_filter, inline=True) + if self_index != i: + self_copy.swap_filters(filter, self_copy.filters[i], inline=True) # If necessary, swap other filter - if other_filter != filter: - other.swap_filters(filter, other_filter, inline=True) + if other_index != i: + other_copy.swap_filters(filter, other_copy.filters[i], inline=True) - data = self._align_tally_data(other) + data = self_copy._align_tally_data(other_copy) if binary_op == '+': new_tally._mean = data['self']['mean'] + data['other']['mean'] @@ -1531,16 +1536,16 @@ class Tally(object): new_tally._std_dev = np.abs(new_tally.mean) * \ np.sqrt(first_term**2 + second_term**2) - if self.estimator == other.estimator: - new_tally.estimator = self.estimator - if self.with_summary and other.with_summary: - new_tally.with_summary = self.with_summary - if self.num_realizations == other.num_realizations: - new_tally.num_realizations = self.num_realizations + if self_copy.estimator == other_copy.estimator: + new_tally.estimator = self_copy.estimator + if self_copy.with_summary and other_copy.with_summary: + new_tally.with_summary = self_copy.with_summary + if self_copy.num_realizations == other_copy.num_realizations: + new_tally.num_realizations = self_copy.num_realizations # If filters are identical, simply reuse them in derived tally - if self.filters == other.filters: - for self_filter in self.filters: + if self_copy.filters == other_copy.filters: + for self_filter in self_copy.filters: new_tally.add_filter(self_filter) # Generate filter "outer products" for non-identical filters @@ -1548,24 +1553,24 @@ class Tally(object): # Find the common longest sequence of shared filters match = 0 - for self_filter, other_filter in zip(self.filters, other.filters): + for self_filter, other_filter in zip(self_copy.filters, other_copy.filters): if self_filter == other_filter: match += 1 else: break - match_filters = self.filters[:match] - cross_filters = [self.filters[match:], other.filters[match:]] + match_filters = self_copy.filters[:match] + cross_filters = [self_copy.filters[match:], other_copy.filters[match:]] # Simply reuse shared filters in derived tally for filter in match_filters: new_tally.add_filter(filter) # Use cross filters to combine non-shared filters in derived tally - if len(self.filters) != match and len(other.filters) == match: + if len(self_copy.filters) != match and len(other_copy.filters) == match: for filter in cross_filters[0]: new_tally.add_filter(filter) - elif len(self.filters) == match and len(other.filters) != match: + elif len(self_copy.filters) == match and len(other_copy.filters) != match: for filter in cross_filters[1]: new_tally.add_filter(filter) else: @@ -1574,23 +1579,23 @@ class Tally(object): new_tally.add_filter(new_filter) # Generate score "outer products" - if self.scores == other.scores: - new_tally.num_score_bins = self.num_score_bins - for self_score in self.scores: + if self_copy.scores == other_copy.scores: + new_tally.num_score_bins = self_copy.num_score_bins + for self_score in self_copy.scores: new_tally.add_score(self_score) else: - new_tally.num_score_bins = self.num_score_bins * other.num_score_bins - all_scores = [self.scores, other.scores] + new_tally.num_score_bins = self_copy.num_score_bins * other_copy.num_score_bins + all_scores = [self_copy.scores, other_copy.scores] for self_score, other_score in itertools.product(*all_scores): new_score = CrossScore(self_score, other_score, binary_op) new_tally.add_score(new_score) # Generate nuclide "outer products" - if self.nuclides == other.nuclides: - for self_nuclide in self.nuclides: + if self_copy.nuclides == other_copy.nuclides: + for self_nuclide in self_copy.nuclides: new_tally.nuclides.append(self_nuclide) else: - all_nuclides = [self.nuclides, other.nuclides] + all_nuclides = [self_copy.nuclides, other_copy.nuclides] for self_nuclide, other_nuclide in itertools.product(*all_nuclides): new_nuclide = CrossNuclide(self_nuclide, other_nuclide, binary_op) new_tally.add_nuclide(new_nuclide) @@ -1750,7 +1755,7 @@ class Tally(object): Returns ------- swap_tally - If inline is true, a copy of this tally with the filters swapped. + If inline is false, a copy of this tally with the filters swapped. Otherwise, nothing is returned. Raises @@ -1817,7 +1822,7 @@ class Tally(object): filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)] # Adjust the sum data array to relect the new filter order - if self.sum is not None: + if swap_tally.sum is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = tally_copy.get_values( @@ -1826,7 +1831,7 @@ class Tally(object): swap_tally.sum[indices, :, :] = data # Adjust the sum_sq data array to relect the new filter order - if self.sum_sq is not None: + if swap_tally.sum_sq is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = tally_copy.get_values( @@ -1835,7 +1840,7 @@ class Tally(object): swap_tally.sum_sq[indices, :, :] = data # Adjust the mean data array to relect the new filter order - if self.mean is not None: + if swap_tally.mean is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = tally_copy.get_values( @@ -1844,7 +1849,7 @@ class Tally(object): swap_tally._mean[indices, :, :] = data # Adjust the std_dev data array to relect the new filter order - if self.std_dev is not None: + if swap_tally.std_dev is not None: for bin1, bin2 in itertools.product(filter1_bins, filter2_bins): filter_bins = [(bin1,), (bin2,)] data = tally_copy.get_values( diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index 45891fc300..58e0d14fcd 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,49 +1,49 @@ - material group in nuclide mean std. dev. -0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. -0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. + group in material nuclide mean std. dev. +0 1 1 total 0.419289 0.01638 group in material nuclide mean std. dev. +0 1 1 total 0.07774 0.003273 group in material group out nuclide mean std. dev. 0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. -0 1 1 total 1 0.119622 material group in nuclide mean std. dev. -0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. -0 2 1 total 0 0 material group in group out nuclide mean std. dev. -0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. -0 2 1 total 0 0 material group in nuclide mean std. dev. -0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. -0 3 1 total 0 0 material group in group out nuclide mean std. dev. -0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. -0 3 1 total 0 0 material group in nuclide mean std. dev. -0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. -0 4 1 total 0 0 material group in group out nuclide mean std. dev. -0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. -0 4 1 total 0 0 material group in nuclide mean std. dev. -0 5 1 total 0 0 material group in nuclide mean std. dev. -0 5 1 total 0 0 material group in group out nuclide mean std. dev. -0 5 1 1 total 0 0 material group out nuclide mean std. dev. -0 5 1 total 0 0 material group in nuclide mean std. dev. -0 6 1 total 0 0 material group in nuclide mean std. dev. -0 6 1 total 0 0 material group in group out nuclide mean std. dev. -0 6 1 1 total 0 0 material group out nuclide mean std. dev. +0 1 1 total 1 0.119622 group in material nuclide mean std. dev. +0 1 2 total 0.247316 0.009562 group in material nuclide mean std. dev. +0 1 2 total 0 0 group in material group out nuclide mean std. dev. +0 1 2 1 total 0.244838 0.009996 material group out nuclide mean std. dev. +0 2 1 total 0 0 group in material nuclide mean std. dev. +0 1 3 total 0.409938 0.042262 group in material nuclide mean std. dev. +0 1 3 total 0 0 group in material group out nuclide mean std. dev. +0 1 3 1 total 0.403354 0.041386 material group out nuclide mean std. dev. +0 3 1 total 0 0 group in material nuclide mean std. dev. +0 1 4 total 0.344007 0.05352 group in material nuclide mean std. dev. +0 1 4 total 0 0 group in material group out nuclide mean std. dev. +0 1 4 1 total 0.340438 0.052067 material group out nuclide mean std. dev. +0 4 1 total 0 0 group in material nuclide mean std. dev. +0 1 5 total 0 0 group in material nuclide mean std. dev. +0 1 5 total 0 0 group in material group out nuclide mean std. dev. +0 1 5 1 total 0 0 material group out nuclide mean std. dev. +0 5 1 total 0 0 group in material nuclide mean std. dev. +0 1 6 total 0 0 group in material nuclide mean std. dev. +0 1 6 total 0 0 group in material group out nuclide mean std. dev. +0 1 6 1 total 0 0 material group out nuclide mean std. dev. 0 6 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in group out nuclide mean std. dev. 0 7 1 1 total 0 0 material group out nuclide mean std. dev. -0 7 1 total 0 0 material group in nuclide mean std. dev. -0 8 1 total 0 0 material group in nuclide mean std. dev. -0 8 1 total 0 0 material group in group out nuclide mean std. dev. -0 8 1 1 total 0 0 material group out nuclide mean std. dev. -0 8 1 total 0 0 material group in nuclide mean std. dev. -0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. -0 9 1 total 0 0 material group in group out nuclide mean std. dev. -0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. -0 9 1 total 0 0 material group in nuclide mean std. dev. -0 10 1 total 0 0 material group in nuclide mean std. dev. -0 10 1 total 0 0 material group in group out nuclide mean std. dev. -0 10 1 1 total 0 0 material group out nuclide mean std. dev. -0 10 1 total 0 0 material group in nuclide mean std. dev. -0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. -0 11 1 total 0 0 material group in group out nuclide mean std. dev. -0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. -0 11 1 total 0 0 material group in nuclide mean std. dev. -0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. -0 12 1 total 0 0 material group in group out nuclide mean std. dev. -0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. +0 7 1 total 0 0 group in material nuclide mean std. dev. +0 1 8 total 0 0 group in material nuclide mean std. dev. +0 1 8 total 0 0 group in material group out nuclide mean std. dev. +0 1 8 1 total 0 0 material group out nuclide mean std. dev. +0 8 1 total 0 0 group in material nuclide mean std. dev. +0 1 9 total 0.751873 0.559701 group in material nuclide mean std. dev. +0 1 9 total 0 0 group in material group out nuclide mean std. dev. +0 1 9 1 total 0.695491 0.50757 material group out nuclide mean std. dev. +0 9 1 total 0 0 group in material nuclide mean std. dev. +0 1 10 total 0 0 group in material nuclide mean std. dev. +0 1 10 total 0 0 group in material group out nuclide mean std. dev. +0 1 10 1 total 0 0 material group out nuclide mean std. dev. +0 10 1 total 0 0 group in material nuclide mean std. dev. +0 1 11 total 0.457329 0.403578 group in material nuclide mean std. dev. +0 1 11 total 0 0 group in material group out nuclide mean std. dev. +0 1 11 1 total 0.446737 0.392775 material group out nuclide mean std. dev. +0 11 1 total 0 0 group in material nuclide mean std. dev. +0 1 12 total 0.574978 0.38864 group in material nuclide mean std. dev. +0 1 12 total 0 0 group in material group out nuclide mean std. dev. +0 1 12 1 total 0.559478 0.377512 material group out nuclide mean std. dev. 0 12 1 total 0 0 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index 7618512689..bd69a25a87 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,12 +1,12 @@ - material group in nuclide mean std. dev. + group in material nuclide mean std. dev. 1 1 1 total 0.384379 0.01649 -0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. +0 2 1 total 0.812087 0.07419 group in material nuclide mean std. dev. 1 1 1 total 0.02127 0.000894 -0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. +0 2 1 total 0.69604 0.053458 group in material group out nuclide mean std. dev. 3 1 1 1 total 0.349924 0.016649 2 1 1 2 total 0.000173 0.000173 -1 1 2 1 total 0.001948 0.001952 -0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. +1 2 1 1 total 0.001948 0.001952 +0 2 1 2 total 0.379607 0.040078 material group out nuclide mean std. dev. 1 1 1 total 1 0.119622 0 1 2 total 0 0.000000 material group in nuclide mean std. dev. 1 2 1 total 0.245043 0.008827 @@ -48,15 +48,15 @@ 1 5 2 1 total 0 0 0 5 2 2 total 0 0 material group out nuclide mean std. dev. 1 5 1 total 0 0 -0 5 2 total 0 0 material group in nuclide mean std. dev. -1 6 1 total 0 0 -0 6 2 total 0 0 material group in nuclide mean std. dev. -1 6 1 total 0 0 -0 6 2 total 0 0 material group in group out nuclide mean std. dev. -3 6 1 1 total 0 0 -2 6 1 2 total 0 0 -1 6 2 1 total 0 0 -0 6 2 2 total 0 0 material group out nuclide mean std. dev. +0 5 2 total 0 0 group in material nuclide mean std. dev. +1 1 6 total 0 0 +0 2 6 total 0 0 group in material nuclide mean std. dev. +1 1 6 total 0 0 +0 2 6 total 0 0 group in material group out nuclide mean std. dev. +3 1 6 1 total 0 0 +2 1 6 2 total 0 0 +1 2 6 1 total 0 0 +0 2 6 2 total 0 0 material group out nuclide mean std. dev. 1 6 1 total 0 0 0 6 2 total 0 0 material group in nuclide mean std. dev. 1 7 1 total 0 0 @@ -78,15 +78,15 @@ 1 8 2 1 total 0 0 0 8 2 2 total 0 0 material group out nuclide mean std. dev. 1 8 1 total 0 0 -0 8 2 total 0 0 material group in nuclide mean std. dev. -1 9 1 total 0.504036 0.379624 -0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. -1 9 1 total 0 0 -0 9 2 total 0 0 material group in group out nuclide mean std. dev. -3 9 1 1 total 0.504036 0.379624 -2 9 1 2 total 0.000000 0.000000 -1 9 2 1 total 0.000000 0.000000 -0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +0 8 2 total 0 0 group in material nuclide mean std. dev. +1 1 9 total 0.504036 0.379624 +0 2 9 total 1.687095 2.536622 group in material nuclide mean std. dev. +1 1 9 total 0 0 +0 2 9 total 0 0 group in material group out nuclide mean std. dev. +3 1 9 1 total 0.504036 0.379624 +2 1 9 2 total 0.000000 0.000000 +1 2 9 1 total 0.000000 0.000000 +0 2 9 2 total 1.417955 2.158027 material group out nuclide mean std. dev. 1 9 1 total 0 0 0 9 2 total 0 0 material group in nuclide mean std. dev. 1 10 1 total 0 0 diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 23ac0e423d..eba202d7da 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1,4 +1,4 @@ - material group in nuclide mean std. dev. + group in material nuclide mean std. dev. 34 1 1 U-234 0.000000 0.000000 35 1 1 U-235 0.008559 0.001742 36 1 1 U-236 0.002643 0.000794 @@ -33,40 +33,40 @@ 65 1 1 Eu-153 0.000173 0.000173 66 1 1 Gd-155 0.000000 0.000000 67 1 1 O-16 0.142506 0.008222 -0 1 2 U-234 0.001948 0.001952 -1 1 2 U-235 0.179956 0.028209 -2 1 2 U-236 0.000000 0.000000 -3 1 2 U-238 0.239279 0.039048 -4 1 2 Np-237 0.000000 0.000000 -5 1 2 Pu-238 0.000000 0.000000 -6 1 2 Pu-239 0.159745 0.015751 -7 1 2 Pu-240 0.007792 0.003677 -8 1 2 Pu-241 0.017533 0.003806 -9 1 2 Pu-242 0.000000 0.000000 -10 1 2 Am-241 0.000000 0.000000 -11 1 2 Am-242m 0.000000 0.000000 -12 1 2 Am-243 0.000000 0.000000 -13 1 2 Cm-242 0.000000 0.000000 -14 1 2 Cm-243 0.000000 0.000000 -15 1 2 Cm-244 0.000000 0.000000 -16 1 2 Cm-245 0.000000 0.000000 -17 1 2 Mo-95 0.002250 0.004232 -18 1 2 Tc-99 0.003544 0.002528 -19 1 2 Ru-101 0.000000 0.000000 -20 1 2 Ru-103 0.000000 0.000000 -21 1 2 Ag-109 0.000000 0.000000 -22 1 2 Xe-135 0.027274 0.004025 -23 1 2 Cs-133 0.000000 0.000000 -24 1 2 Nd-143 0.006532 0.002517 -25 1 2 Nd-145 0.001948 0.001952 -26 1 2 Sm-147 0.000000 0.000000 -27 1 2 Sm-149 0.007792 0.005701 -28 1 2 Sm-150 0.000000 0.000000 -29 1 2 Sm-151 0.000000 0.000000 -30 1 2 Sm-152 0.000000 0.000000 -31 1 2 Eu-153 0.001686 0.001968 -32 1 2 Gd-155 0.000000 0.000000 -33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. +0 2 1 U-234 0.001948 0.001952 +1 2 1 U-235 0.179956 0.028209 +2 2 1 U-236 0.000000 0.000000 +3 2 1 U-238 0.239279 0.039048 +4 2 1 Np-237 0.000000 0.000000 +5 2 1 Pu-238 0.000000 0.000000 +6 2 1 Pu-239 0.159745 0.015751 +7 2 1 Pu-240 0.007792 0.003677 +8 2 1 Pu-241 0.017533 0.003806 +9 2 1 Pu-242 0.000000 0.000000 +10 2 1 Am-241 0.000000 0.000000 +11 2 1 Am-242m 0.000000 0.000000 +12 2 1 Am-243 0.000000 0.000000 +13 2 1 Cm-242 0.000000 0.000000 +14 2 1 Cm-243 0.000000 0.000000 +15 2 1 Cm-244 0.000000 0.000000 +16 2 1 Cm-245 0.000000 0.000000 +17 2 1 Mo-95 0.002250 0.004232 +18 2 1 Tc-99 0.003544 0.002528 +19 2 1 Ru-101 0.000000 0.000000 +20 2 1 Ru-103 0.000000 0.000000 +21 2 1 Ag-109 0.000000 0.000000 +22 2 1 Xe-135 0.027274 0.004025 +23 2 1 Cs-133 0.000000 0.000000 +24 2 1 Nd-143 0.006532 0.002517 +25 2 1 Nd-145 0.001948 0.001952 +26 2 1 Sm-147 0.000000 0.000000 +27 2 1 Sm-149 0.007792 0.005701 +28 2 1 Sm-150 0.000000 0.000000 +29 2 1 Sm-151 0.000000 0.000000 +30 2 1 Sm-152 0.000000 0.000000 +31 2 1 Eu-153 0.001686 0.001968 +32 2 1 Gd-155 0.000000 0.000000 +33 2 1 O-16 0.154807 0.023798 group in material nuclide mean std. dev. 34 1 1 U-234 6.771527e-06 2.982583e-07 35 1 1 U-235 9.687933e-03 4.305720e-04 36 1 1 U-236 6.279974e-05 3.653120e-06 @@ -101,40 +101,40 @@ 65 1 1 Eu-153 0.000000e+00 0.000000e+00 66 1 1 Gd-155 0.000000e+00 0.000000e+00 67 1 1 O-16 0.000000e+00 0.000000e+00 -0 1 2 U-234 4.267300e-07 3.529845e-08 -1 1 2 U-235 3.629246e-01 2.964548e-02 -2 1 2 U-236 5.921657e-06 4.881464e-07 -3 1 2 U-238 5.196256e-07 4.286610e-08 -4 1 2 Np-237 2.424211e-07 1.741823e-08 -5 1 2 Pu-238 3.255627e-05 2.692686e-06 -6 1 2 Pu-239 2.868384e-01 2.056896e-02 -7 1 2 Pu-240 4.398266e-06 3.658267e-07 -8 1 2 Pu-241 4.607239e-02 3.797176e-03 -9 1 2 Pu-242 8.451967e-08 6.979002e-09 -10 1 2 Am-241 4.678607e-06 3.253889e-07 -11 1 2 Am-242m 1.417675e-04 1.218350e-05 -12 1 2 Am-243 7.648834e-08 6.303843e-09 -13 1 2 Cm-242 9.433314e-07 7.794362e-08 -14 1 2 Cm-243 1.767995e-06 1.454123e-07 -15 1 2 Cm-244 1.533962e-07 1.266951e-08 -16 1 2 Cm-245 1.145063e-05 9.419051e-07 -17 1 2 Mo-95 0.000000e+00 0.000000e+00 -18 1 2 Tc-99 0.000000e+00 0.000000e+00 -19 1 2 Ru-101 0.000000e+00 0.000000e+00 -20 1 2 Ru-103 0.000000e+00 0.000000e+00 -21 1 2 Ag-109 0.000000e+00 0.000000e+00 -22 1 2 Xe-135 0.000000e+00 0.000000e+00 -23 1 2 Cs-133 0.000000e+00 0.000000e+00 -24 1 2 Nd-143 0.000000e+00 0.000000e+00 -25 1 2 Nd-145 0.000000e+00 0.000000e+00 -26 1 2 Sm-147 0.000000e+00 0.000000e+00 -27 1 2 Sm-149 0.000000e+00 0.000000e+00 -28 1 2 Sm-150 0.000000e+00 0.000000e+00 -29 1 2 Sm-151 0.000000e+00 0.000000e+00 -30 1 2 Sm-152 0.000000e+00 0.000000e+00 -31 1 2 Eu-153 0.000000e+00 0.000000e+00 -32 1 2 Gd-155 0.000000e+00 0.000000e+00 -33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. +0 2 1 U-234 4.267300e-07 3.529845e-08 +1 2 1 U-235 3.629246e-01 2.964548e-02 +2 2 1 U-236 5.921657e-06 4.881464e-07 +3 2 1 U-238 5.196256e-07 4.286610e-08 +4 2 1 Np-237 2.424211e-07 1.741823e-08 +5 2 1 Pu-238 3.255627e-05 2.692686e-06 +6 2 1 Pu-239 2.868384e-01 2.056896e-02 +7 2 1 Pu-240 4.398266e-06 3.658267e-07 +8 2 1 Pu-241 4.607239e-02 3.797176e-03 +9 2 1 Pu-242 8.451967e-08 6.979002e-09 +10 2 1 Am-241 4.678607e-06 3.253889e-07 +11 2 1 Am-242m 1.417675e-04 1.218350e-05 +12 2 1 Am-243 7.648834e-08 6.303843e-09 +13 2 1 Cm-242 9.433314e-07 7.794362e-08 +14 2 1 Cm-243 1.767995e-06 1.454123e-07 +15 2 1 Cm-244 1.533962e-07 1.266951e-08 +16 2 1 Cm-245 1.145063e-05 9.419051e-07 +17 2 1 Mo-95 0.000000e+00 0.000000e+00 +18 2 1 Tc-99 0.000000e+00 0.000000e+00 +19 2 1 Ru-101 0.000000e+00 0.000000e+00 +20 2 1 Ru-103 0.000000e+00 0.000000e+00 +21 2 1 Ag-109 0.000000e+00 0.000000e+00 +22 2 1 Xe-135 0.000000e+00 0.000000e+00 +23 2 1 Cs-133 0.000000e+00 0.000000e+00 +24 2 1 Nd-143 0.000000e+00 0.000000e+00 +25 2 1 Nd-145 0.000000e+00 0.000000e+00 +26 2 1 Sm-147 0.000000e+00 0.000000e+00 +27 2 1 Sm-149 0.000000e+00 0.000000e+00 +28 2 1 Sm-150 0.000000e+00 0.000000e+00 +29 2 1 Sm-151 0.000000e+00 0.000000e+00 +30 2 1 Sm-152 0.000000e+00 0.000000e+00 +31 2 1 Eu-153 0.000000e+00 0.000000e+00 +32 2 1 Gd-155 0.000000e+00 0.000000e+00 +33 2 1 O-16 0.000000e+00 0.000000e+00 group in material group out nuclide mean std. dev. 102 1 1 1 U-234 0.000000 0.000000 103 1 1 1 U-235 0.002846 0.001185 104 1 1 1 U-236 0.001951 0.000829 @@ -203,74 +203,74 @@ 99 1 1 2 Eu-153 0.000000 0.000000 100 1 1 2 Gd-155 0.000000 0.000000 101 1 1 2 O-16 0.000173 0.000173 -34 1 2 1 U-234 0.000000 0.000000 -35 1 2 1 U-235 0.000000 0.000000 -36 1 2 1 U-236 0.000000 0.000000 -37 1 2 1 U-238 0.000000 0.000000 -38 1 2 1 Np-237 0.000000 0.000000 -39 1 2 1 Pu-238 0.000000 0.000000 -40 1 2 1 Pu-239 0.000000 0.000000 -41 1 2 1 Pu-240 0.000000 0.000000 -42 1 2 1 Pu-241 0.000000 0.000000 -43 1 2 1 Pu-242 0.000000 0.000000 -44 1 2 1 Am-241 0.000000 0.000000 -45 1 2 1 Am-242m 0.000000 0.000000 -46 1 2 1 Am-243 0.000000 0.000000 -47 1 2 1 Cm-242 0.000000 0.000000 -48 1 2 1 Cm-243 0.000000 0.000000 -49 1 2 1 Cm-244 0.000000 0.000000 -50 1 2 1 Cm-245 0.000000 0.000000 -51 1 2 1 Mo-95 0.000000 0.000000 -52 1 2 1 Tc-99 0.000000 0.000000 -53 1 2 1 Ru-101 0.000000 0.000000 -54 1 2 1 Ru-103 0.000000 0.000000 -55 1 2 1 Ag-109 0.000000 0.000000 -56 1 2 1 Xe-135 0.000000 0.000000 -57 1 2 1 Cs-133 0.000000 0.000000 -58 1 2 1 Nd-143 0.000000 0.000000 -59 1 2 1 Nd-145 0.000000 0.000000 -60 1 2 1 Sm-147 0.000000 0.000000 -61 1 2 1 Sm-149 0.000000 0.000000 -62 1 2 1 Sm-150 0.000000 0.000000 -63 1 2 1 Sm-151 0.000000 0.000000 -64 1 2 1 Sm-152 0.000000 0.000000 -65 1 2 1 Eu-153 0.000000 0.000000 -66 1 2 1 Gd-155 0.000000 0.000000 -67 1 2 1 O-16 0.001948 0.001952 -0 1 2 2 U-234 0.000000 0.000000 -1 1 2 2 U-235 0.010470 0.006106 -2 1 2 2 U-236 0.000000 0.000000 -3 1 2 2 U-238 0.208109 0.039197 -4 1 2 2 Np-237 0.000000 0.000000 -5 1 2 2 Pu-238 0.000000 0.000000 -6 1 2 2 Pu-239 0.000000 0.000000 -7 1 2 2 Pu-240 0.000000 0.000000 -8 1 2 2 Pu-241 0.000000 0.000000 -9 1 2 2 Pu-242 0.000000 0.000000 -10 1 2 2 Am-241 0.000000 0.000000 -11 1 2 2 Am-242m 0.000000 0.000000 -12 1 2 2 Am-243 0.000000 0.000000 -13 1 2 2 Cm-242 0.000000 0.000000 -14 1 2 2 Cm-243 0.000000 0.000000 -15 1 2 2 Cm-244 0.000000 0.000000 -16 1 2 2 Cm-245 0.000000 0.000000 -17 1 2 2 Mo-95 0.000302 0.002551 -18 1 2 2 Tc-99 0.003544 0.002528 -19 1 2 2 Ru-101 0.000000 0.000000 -20 1 2 2 Ru-103 0.000000 0.000000 -21 1 2 2 Ag-109 0.000000 0.000000 -22 1 2 2 Xe-135 0.000000 0.000000 -23 1 2 2 Cs-133 0.000000 0.000000 -24 1 2 2 Nd-143 0.002636 0.002073 -25 1 2 2 Nd-145 0.000000 0.000000 -26 1 2 2 Sm-147 0.000000 0.000000 -27 1 2 2 Sm-149 0.000000 0.000000 -28 1 2 2 Sm-150 0.000000 0.000000 -29 1 2 2 Sm-151 0.000000 0.000000 -30 1 2 2 Sm-152 0.000000 0.000000 -31 1 2 2 Eu-153 0.001686 0.001968 -32 1 2 2 Gd-155 0.000000 0.000000 -33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. +34 2 1 1 U-234 0.000000 0.000000 +35 2 1 1 U-235 0.000000 0.000000 +36 2 1 1 U-236 0.000000 0.000000 +37 2 1 1 U-238 0.000000 0.000000 +38 2 1 1 Np-237 0.000000 0.000000 +39 2 1 1 Pu-238 0.000000 0.000000 +40 2 1 1 Pu-239 0.000000 0.000000 +41 2 1 1 Pu-240 0.000000 0.000000 +42 2 1 1 Pu-241 0.000000 0.000000 +43 2 1 1 Pu-242 0.000000 0.000000 +44 2 1 1 Am-241 0.000000 0.000000 +45 2 1 1 Am-242m 0.000000 0.000000 +46 2 1 1 Am-243 0.000000 0.000000 +47 2 1 1 Cm-242 0.000000 0.000000 +48 2 1 1 Cm-243 0.000000 0.000000 +49 2 1 1 Cm-244 0.000000 0.000000 +50 2 1 1 Cm-245 0.000000 0.000000 +51 2 1 1 Mo-95 0.000000 0.000000 +52 2 1 1 Tc-99 0.000000 0.000000 +53 2 1 1 Ru-101 0.000000 0.000000 +54 2 1 1 Ru-103 0.000000 0.000000 +55 2 1 1 Ag-109 0.000000 0.000000 +56 2 1 1 Xe-135 0.000000 0.000000 +57 2 1 1 Cs-133 0.000000 0.000000 +58 2 1 1 Nd-143 0.000000 0.000000 +59 2 1 1 Nd-145 0.000000 0.000000 +60 2 1 1 Sm-147 0.000000 0.000000 +61 2 1 1 Sm-149 0.000000 0.000000 +62 2 1 1 Sm-150 0.000000 0.000000 +63 2 1 1 Sm-151 0.000000 0.000000 +64 2 1 1 Sm-152 0.000000 0.000000 +65 2 1 1 Eu-153 0.000000 0.000000 +66 2 1 1 Gd-155 0.000000 0.000000 +67 2 1 1 O-16 0.001948 0.001952 +0 2 1 2 U-234 0.000000 0.000000 +1 2 1 2 U-235 0.010470 0.006106 +2 2 1 2 U-236 0.000000 0.000000 +3 2 1 2 U-238 0.208109 0.039197 +4 2 1 2 Np-237 0.000000 0.000000 +5 2 1 2 Pu-238 0.000000 0.000000 +6 2 1 2 Pu-239 0.000000 0.000000 +7 2 1 2 Pu-240 0.000000 0.000000 +8 2 1 2 Pu-241 0.000000 0.000000 +9 2 1 2 Pu-242 0.000000 0.000000 +10 2 1 2 Am-241 0.000000 0.000000 +11 2 1 2 Am-242m 0.000000 0.000000 +12 2 1 2 Am-243 0.000000 0.000000 +13 2 1 2 Cm-242 0.000000 0.000000 +14 2 1 2 Cm-243 0.000000 0.000000 +15 2 1 2 Cm-244 0.000000 0.000000 +16 2 1 2 Cm-245 0.000000 0.000000 +17 2 1 2 Mo-95 0.000302 0.002551 +18 2 1 2 Tc-99 0.003544 0.002528 +19 2 1 2 Ru-101 0.000000 0.000000 +20 2 1 2 Ru-103 0.000000 0.000000 +21 2 1 2 Ag-109 0.000000 0.000000 +22 2 1 2 Xe-135 0.000000 0.000000 +23 2 1 2 Cs-133 0.000000 0.000000 +24 2 1 2 Nd-143 0.002636 0.002073 +25 2 1 2 Nd-145 0.000000 0.000000 +26 2 1 2 Sm-147 0.000000 0.000000 +27 2 1 2 Sm-149 0.000000 0.000000 +28 2 1 2 Sm-150 0.000000 0.000000 +29 2 1 2 Sm-151 0.000000 0.000000 +30 2 1 2 Sm-152 0.000000 0.000000 +31 2 1 2 Eu-153 0.001686 0.001968 +32 2 1 2 Gd-155 0.000000 0.000000 +33 2 1 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. 34 1 1 U-234 0 0.000000 35 1 1 U-235 1 0.127079 36 1 1 U-236 0 0.000000 @@ -738,175 +738,175 @@ 23 5 2 Cr-54 0 0 24 5 2 C-Nat 0 0 25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. -21 6 1 H-1 0 0 -22 6 1 O-16 0 0 -23 6 1 B-10 0 0 -24 6 1 B-11 0 0 -25 6 1 Fe-54 0 0 -26 6 1 Fe-56 0 0 -27 6 1 Fe-57 0 0 -28 6 1 Fe-58 0 0 -29 6 1 Ni-58 0 0 -30 6 1 Ni-60 0 0 -31 6 1 Ni-61 0 0 -32 6 1 Ni-62 0 0 -33 6 1 Ni-64 0 0 -34 6 1 Mn-55 0 0 -35 6 1 Si-28 0 0 -36 6 1 Si-29 0 0 -37 6 1 Si-30 0 0 -38 6 1 Cr-50 0 0 -39 6 1 Cr-52 0 0 -40 6 1 Cr-53 0 0 -41 6 1 Cr-54 0 0 -0 6 2 H-1 0 0 -1 6 2 O-16 0 0 -2 6 2 B-10 0 0 -3 6 2 B-11 0 0 -4 6 2 Fe-54 0 0 -5 6 2 Fe-56 0 0 -6 6 2 Fe-57 0 0 -7 6 2 Fe-58 0 0 -8 6 2 Ni-58 0 0 -9 6 2 Ni-60 0 0 -10 6 2 Ni-61 0 0 -11 6 2 Ni-62 0 0 -12 6 2 Ni-64 0 0 -13 6 2 Mn-55 0 0 -14 6 2 Si-28 0 0 -15 6 2 Si-29 0 0 -16 6 2 Si-30 0 0 -17 6 2 Cr-50 0 0 -18 6 2 Cr-52 0 0 -19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 6 1 H-1 0 0 -22 6 1 O-16 0 0 -23 6 1 B-10 0 0 -24 6 1 B-11 0 0 -25 6 1 Fe-54 0 0 -26 6 1 Fe-56 0 0 -27 6 1 Fe-57 0 0 -28 6 1 Fe-58 0 0 -29 6 1 Ni-58 0 0 -30 6 1 Ni-60 0 0 -31 6 1 Ni-61 0 0 -32 6 1 Ni-62 0 0 -33 6 1 Ni-64 0 0 -34 6 1 Mn-55 0 0 -35 6 1 Si-28 0 0 -36 6 1 Si-29 0 0 -37 6 1 Si-30 0 0 -38 6 1 Cr-50 0 0 -39 6 1 Cr-52 0 0 -40 6 1 Cr-53 0 0 -41 6 1 Cr-54 0 0 -0 6 2 H-1 0 0 -1 6 2 O-16 0 0 -2 6 2 B-10 0 0 -3 6 2 B-11 0 0 -4 6 2 Fe-54 0 0 -5 6 2 Fe-56 0 0 -6 6 2 Fe-57 0 0 -7 6 2 Fe-58 0 0 -8 6 2 Ni-58 0 0 -9 6 2 Ni-60 0 0 -10 6 2 Ni-61 0 0 -11 6 2 Ni-62 0 0 -12 6 2 Ni-64 0 0 -13 6 2 Mn-55 0 0 -14 6 2 Si-28 0 0 -15 6 2 Si-29 0 0 -16 6 2 Si-30 0 0 -17 6 2 Cr-50 0 0 -18 6 2 Cr-52 0 0 -19 6 2 Cr-53 0 0 -20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 6 1 1 H-1 0 0 -64 6 1 1 O-16 0 0 -65 6 1 1 B-10 0 0 -66 6 1 1 B-11 0 0 -67 6 1 1 Fe-54 0 0 -68 6 1 1 Fe-56 0 0 -69 6 1 1 Fe-57 0 0 -70 6 1 1 Fe-58 0 0 -71 6 1 1 Ni-58 0 0 -72 6 1 1 Ni-60 0 0 -73 6 1 1 Ni-61 0 0 -74 6 1 1 Ni-62 0 0 -75 6 1 1 Ni-64 0 0 -76 6 1 1 Mn-55 0 0 -77 6 1 1 Si-28 0 0 -78 6 1 1 Si-29 0 0 -79 6 1 1 Si-30 0 0 -80 6 1 1 Cr-50 0 0 -81 6 1 1 Cr-52 0 0 -82 6 1 1 Cr-53 0 0 -83 6 1 1 Cr-54 0 0 -42 6 1 2 H-1 0 0 -43 6 1 2 O-16 0 0 -44 6 1 2 B-10 0 0 -45 6 1 2 B-11 0 0 -46 6 1 2 Fe-54 0 0 -47 6 1 2 Fe-56 0 0 -48 6 1 2 Fe-57 0 0 -49 6 1 2 Fe-58 0 0 -50 6 1 2 Ni-58 0 0 -51 6 1 2 Ni-60 0 0 -52 6 1 2 Ni-61 0 0 -53 6 1 2 Ni-62 0 0 -54 6 1 2 Ni-64 0 0 -55 6 1 2 Mn-55 0 0 -56 6 1 2 Si-28 0 0 -57 6 1 2 Si-29 0 0 -58 6 1 2 Si-30 0 0 -59 6 1 2 Cr-50 0 0 -60 6 1 2 Cr-52 0 0 -61 6 1 2 Cr-53 0 0 -62 6 1 2 Cr-54 0 0 -21 6 2 1 H-1 0 0 -22 6 2 1 O-16 0 0 -23 6 2 1 B-10 0 0 -24 6 2 1 B-11 0 0 -25 6 2 1 Fe-54 0 0 -26 6 2 1 Fe-56 0 0 -27 6 2 1 Fe-57 0 0 -28 6 2 1 Fe-58 0 0 -29 6 2 1 Ni-58 0 0 -30 6 2 1 Ni-60 0 0 -31 6 2 1 Ni-61 0 0 -32 6 2 1 Ni-62 0 0 -33 6 2 1 Ni-64 0 0 -34 6 2 1 Mn-55 0 0 -35 6 2 1 Si-28 0 0 -36 6 2 1 Si-29 0 0 -37 6 2 1 Si-30 0 0 -38 6 2 1 Cr-50 0 0 -39 6 2 1 Cr-52 0 0 -40 6 2 1 Cr-53 0 0 -41 6 2 1 Cr-54 0 0 -0 6 2 2 H-1 0 0 -1 6 2 2 O-16 0 0 -2 6 2 2 B-10 0 0 -3 6 2 2 B-11 0 0 -4 6 2 2 Fe-54 0 0 -5 6 2 2 Fe-56 0 0 -6 6 2 2 Fe-57 0 0 -7 6 2 2 Fe-58 0 0 -8 6 2 2 Ni-58 0 0 -9 6 2 2 Ni-60 0 0 -10 6 2 2 Ni-61 0 0 -11 6 2 2 Ni-62 0 0 -12 6 2 2 Ni-64 0 0 -13 6 2 2 Mn-55 0 0 -14 6 2 2 Si-28 0 0 -15 6 2 2 Si-29 0 0 -16 6 2 2 Si-30 0 0 -17 6 2 2 Cr-50 0 0 -18 6 2 2 Cr-52 0 0 -19 6 2 2 Cr-53 0 0 -20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. +26 5 2 Cu-65 0 0 group in material nuclide mean std. dev. +21 1 6 H-1 0 0 +22 1 6 O-16 0 0 +23 1 6 B-10 0 0 +24 1 6 B-11 0 0 +25 1 6 Fe-54 0 0 +26 1 6 Fe-56 0 0 +27 1 6 Fe-57 0 0 +28 1 6 Fe-58 0 0 +29 1 6 Ni-58 0 0 +30 1 6 Ni-60 0 0 +31 1 6 Ni-61 0 0 +32 1 6 Ni-62 0 0 +33 1 6 Ni-64 0 0 +34 1 6 Mn-55 0 0 +35 1 6 Si-28 0 0 +36 1 6 Si-29 0 0 +37 1 6 Si-30 0 0 +38 1 6 Cr-50 0 0 +39 1 6 Cr-52 0 0 +40 1 6 Cr-53 0 0 +41 1 6 Cr-54 0 0 +0 2 6 H-1 0 0 +1 2 6 O-16 0 0 +2 2 6 B-10 0 0 +3 2 6 B-11 0 0 +4 2 6 Fe-54 0 0 +5 2 6 Fe-56 0 0 +6 2 6 Fe-57 0 0 +7 2 6 Fe-58 0 0 +8 2 6 Ni-58 0 0 +9 2 6 Ni-60 0 0 +10 2 6 Ni-61 0 0 +11 2 6 Ni-62 0 0 +12 2 6 Ni-64 0 0 +13 2 6 Mn-55 0 0 +14 2 6 Si-28 0 0 +15 2 6 Si-29 0 0 +16 2 6 Si-30 0 0 +17 2 6 Cr-50 0 0 +18 2 6 Cr-52 0 0 +19 2 6 Cr-53 0 0 +20 2 6 Cr-54 0 0 group in material nuclide mean std. dev. +21 1 6 H-1 0 0 +22 1 6 O-16 0 0 +23 1 6 B-10 0 0 +24 1 6 B-11 0 0 +25 1 6 Fe-54 0 0 +26 1 6 Fe-56 0 0 +27 1 6 Fe-57 0 0 +28 1 6 Fe-58 0 0 +29 1 6 Ni-58 0 0 +30 1 6 Ni-60 0 0 +31 1 6 Ni-61 0 0 +32 1 6 Ni-62 0 0 +33 1 6 Ni-64 0 0 +34 1 6 Mn-55 0 0 +35 1 6 Si-28 0 0 +36 1 6 Si-29 0 0 +37 1 6 Si-30 0 0 +38 1 6 Cr-50 0 0 +39 1 6 Cr-52 0 0 +40 1 6 Cr-53 0 0 +41 1 6 Cr-54 0 0 +0 2 6 H-1 0 0 +1 2 6 O-16 0 0 +2 2 6 B-10 0 0 +3 2 6 B-11 0 0 +4 2 6 Fe-54 0 0 +5 2 6 Fe-56 0 0 +6 2 6 Fe-57 0 0 +7 2 6 Fe-58 0 0 +8 2 6 Ni-58 0 0 +9 2 6 Ni-60 0 0 +10 2 6 Ni-61 0 0 +11 2 6 Ni-62 0 0 +12 2 6 Ni-64 0 0 +13 2 6 Mn-55 0 0 +14 2 6 Si-28 0 0 +15 2 6 Si-29 0 0 +16 2 6 Si-30 0 0 +17 2 6 Cr-50 0 0 +18 2 6 Cr-52 0 0 +19 2 6 Cr-53 0 0 +20 2 6 Cr-54 0 0 group in material group out nuclide mean std. dev. +63 1 6 1 H-1 0 0 +64 1 6 1 O-16 0 0 +65 1 6 1 B-10 0 0 +66 1 6 1 B-11 0 0 +67 1 6 1 Fe-54 0 0 +68 1 6 1 Fe-56 0 0 +69 1 6 1 Fe-57 0 0 +70 1 6 1 Fe-58 0 0 +71 1 6 1 Ni-58 0 0 +72 1 6 1 Ni-60 0 0 +73 1 6 1 Ni-61 0 0 +74 1 6 1 Ni-62 0 0 +75 1 6 1 Ni-64 0 0 +76 1 6 1 Mn-55 0 0 +77 1 6 1 Si-28 0 0 +78 1 6 1 Si-29 0 0 +79 1 6 1 Si-30 0 0 +80 1 6 1 Cr-50 0 0 +81 1 6 1 Cr-52 0 0 +82 1 6 1 Cr-53 0 0 +83 1 6 1 Cr-54 0 0 +42 1 6 2 H-1 0 0 +43 1 6 2 O-16 0 0 +44 1 6 2 B-10 0 0 +45 1 6 2 B-11 0 0 +46 1 6 2 Fe-54 0 0 +47 1 6 2 Fe-56 0 0 +48 1 6 2 Fe-57 0 0 +49 1 6 2 Fe-58 0 0 +50 1 6 2 Ni-58 0 0 +51 1 6 2 Ni-60 0 0 +52 1 6 2 Ni-61 0 0 +53 1 6 2 Ni-62 0 0 +54 1 6 2 Ni-64 0 0 +55 1 6 2 Mn-55 0 0 +56 1 6 2 Si-28 0 0 +57 1 6 2 Si-29 0 0 +58 1 6 2 Si-30 0 0 +59 1 6 2 Cr-50 0 0 +60 1 6 2 Cr-52 0 0 +61 1 6 2 Cr-53 0 0 +62 1 6 2 Cr-54 0 0 +21 2 6 1 H-1 0 0 +22 2 6 1 O-16 0 0 +23 2 6 1 B-10 0 0 +24 2 6 1 B-11 0 0 +25 2 6 1 Fe-54 0 0 +26 2 6 1 Fe-56 0 0 +27 2 6 1 Fe-57 0 0 +28 2 6 1 Fe-58 0 0 +29 2 6 1 Ni-58 0 0 +30 2 6 1 Ni-60 0 0 +31 2 6 1 Ni-61 0 0 +32 2 6 1 Ni-62 0 0 +33 2 6 1 Ni-64 0 0 +34 2 6 1 Mn-55 0 0 +35 2 6 1 Si-28 0 0 +36 2 6 1 Si-29 0 0 +37 2 6 1 Si-30 0 0 +38 2 6 1 Cr-50 0 0 +39 2 6 1 Cr-52 0 0 +40 2 6 1 Cr-53 0 0 +41 2 6 1 Cr-54 0 0 +0 2 6 2 H-1 0 0 +1 2 6 2 O-16 0 0 +2 2 6 2 B-10 0 0 +3 2 6 2 B-11 0 0 +4 2 6 2 Fe-54 0 0 +5 2 6 2 Fe-56 0 0 +6 2 6 2 Fe-57 0 0 +7 2 6 2 Fe-58 0 0 +8 2 6 2 Ni-58 0 0 +9 2 6 2 Ni-60 0 0 +10 2 6 2 Ni-61 0 0 +11 2 6 2 Ni-62 0 0 +12 2 6 2 Ni-64 0 0 +13 2 6 2 Mn-55 0 0 +14 2 6 2 Si-28 0 0 +15 2 6 2 Si-29 0 0 +16 2 6 2 Si-30 0 0 +17 2 6 2 Cr-50 0 0 +18 2 6 2 Cr-52 0 0 +19 2 6 2 Cr-53 0 0 +20 2 6 2 Cr-54 0 0 material group out nuclide mean std. dev. 21 6 1 H-1 0 0 22 6 1 O-16 0 0 23 6 1 B-10 0 0 @@ -1368,175 +1368,175 @@ 17 8 2 Cr-50 0 0 18 8 2 Cr-52 0 0 19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. -21 9 1 H-1 0.106160 0.179178 -22 9 1 O-16 0.272020 0.171699 -23 9 1 B-10 0.000000 0.000000 -24 9 1 B-11 0.000000 0.000000 -25 9 1 Fe-54 0.000000 0.000000 -26 9 1 Fe-56 0.000000 0.000000 -27 9 1 Fe-57 0.000000 0.000000 -28 9 1 Fe-58 0.000000 0.000000 -29 9 1 Ni-58 0.000000 0.000000 -30 9 1 Ni-60 0.000000 0.000000 -31 9 1 Ni-61 0.000000 0.000000 -32 9 1 Ni-62 0.000000 0.000000 -33 9 1 Ni-64 0.000000 0.000000 -34 9 1 Mn-55 0.085133 0.082479 -35 9 1 Si-28 0.000000 0.000000 -36 9 1 Si-29 0.000000 0.000000 -37 9 1 Si-30 0.000000 0.000000 -38 9 1 Cr-50 0.000000 0.000000 -39 9 1 Cr-52 0.000000 0.000000 -40 9 1 Cr-53 0.040723 0.079827 -41 9 1 Cr-54 0.000000 0.000000 -0 9 2 H-1 1.417955 2.158027 -1 9 2 O-16 0.000000 0.000000 -2 9 2 B-10 0.269141 0.380622 -3 9 2 B-11 0.000000 0.000000 -4 9 2 Fe-54 0.000000 0.000000 -5 9 2 Fe-56 0.000000 0.000000 -6 9 2 Fe-57 0.000000 0.000000 -7 9 2 Fe-58 0.000000 0.000000 -8 9 2 Ni-58 0.000000 0.000000 -9 9 2 Ni-60 0.000000 0.000000 -10 9 2 Ni-61 0.000000 0.000000 -11 9 2 Ni-62 0.000000 0.000000 -12 9 2 Ni-64 0.000000 0.000000 -13 9 2 Mn-55 0.000000 0.000000 -14 9 2 Si-28 0.000000 0.000000 -15 9 2 Si-29 0.000000 0.000000 -16 9 2 Si-30 0.000000 0.000000 -17 9 2 Cr-50 0.000000 0.000000 -18 9 2 Cr-52 0.000000 0.000000 -19 9 2 Cr-53 0.000000 0.000000 -20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. -21 9 1 H-1 0 0 -22 9 1 O-16 0 0 -23 9 1 B-10 0 0 -24 9 1 B-11 0 0 -25 9 1 Fe-54 0 0 -26 9 1 Fe-56 0 0 -27 9 1 Fe-57 0 0 -28 9 1 Fe-58 0 0 -29 9 1 Ni-58 0 0 -30 9 1 Ni-60 0 0 -31 9 1 Ni-61 0 0 -32 9 1 Ni-62 0 0 -33 9 1 Ni-64 0 0 -34 9 1 Mn-55 0 0 -35 9 1 Si-28 0 0 -36 9 1 Si-29 0 0 -37 9 1 Si-30 0 0 -38 9 1 Cr-50 0 0 -39 9 1 Cr-52 0 0 -40 9 1 Cr-53 0 0 -41 9 1 Cr-54 0 0 -0 9 2 H-1 0 0 -1 9 2 O-16 0 0 -2 9 2 B-10 0 0 -3 9 2 B-11 0 0 -4 9 2 Fe-54 0 0 -5 9 2 Fe-56 0 0 -6 9 2 Fe-57 0 0 -7 9 2 Fe-58 0 0 -8 9 2 Ni-58 0 0 -9 9 2 Ni-60 0 0 -10 9 2 Ni-61 0 0 -11 9 2 Ni-62 0 0 -12 9 2 Ni-64 0 0 -13 9 2 Mn-55 0 0 -14 9 2 Si-28 0 0 -15 9 2 Si-29 0 0 -16 9 2 Si-30 0 0 -17 9 2 Cr-50 0 0 -18 9 2 Cr-52 0 0 -19 9 2 Cr-53 0 0 -20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. -63 9 1 1 H-1 0.106160 0.179178 -64 9 1 1 O-16 0.272020 0.171699 -65 9 1 1 B-10 0.000000 0.000000 -66 9 1 1 B-11 0.000000 0.000000 -67 9 1 1 Fe-54 0.000000 0.000000 -68 9 1 1 Fe-56 0.000000 0.000000 -69 9 1 1 Fe-57 0.000000 0.000000 -70 9 1 1 Fe-58 0.000000 0.000000 -71 9 1 1 Ni-58 0.000000 0.000000 -72 9 1 1 Ni-60 0.000000 0.000000 -73 9 1 1 Ni-61 0.000000 0.000000 -74 9 1 1 Ni-62 0.000000 0.000000 -75 9 1 1 Ni-64 0.000000 0.000000 -76 9 1 1 Mn-55 0.085133 0.082479 -77 9 1 1 Si-28 0.000000 0.000000 -78 9 1 1 Si-29 0.000000 0.000000 -79 9 1 1 Si-30 0.000000 0.000000 -80 9 1 1 Cr-50 0.000000 0.000000 -81 9 1 1 Cr-52 0.000000 0.000000 -82 9 1 1 Cr-53 0.040723 0.079827 -83 9 1 1 Cr-54 0.000000 0.000000 -42 9 1 2 H-1 0.000000 0.000000 -43 9 1 2 O-16 0.000000 0.000000 -44 9 1 2 B-10 0.000000 0.000000 -45 9 1 2 B-11 0.000000 0.000000 -46 9 1 2 Fe-54 0.000000 0.000000 -47 9 1 2 Fe-56 0.000000 0.000000 -48 9 1 2 Fe-57 0.000000 0.000000 -49 9 1 2 Fe-58 0.000000 0.000000 -50 9 1 2 Ni-58 0.000000 0.000000 -51 9 1 2 Ni-60 0.000000 0.000000 -52 9 1 2 Ni-61 0.000000 0.000000 -53 9 1 2 Ni-62 0.000000 0.000000 -54 9 1 2 Ni-64 0.000000 0.000000 -55 9 1 2 Mn-55 0.000000 0.000000 -56 9 1 2 Si-28 0.000000 0.000000 -57 9 1 2 Si-29 0.000000 0.000000 -58 9 1 2 Si-30 0.000000 0.000000 -59 9 1 2 Cr-50 0.000000 0.000000 -60 9 1 2 Cr-52 0.000000 0.000000 -61 9 1 2 Cr-53 0.000000 0.000000 -62 9 1 2 Cr-54 0.000000 0.000000 -21 9 2 1 H-1 0.000000 0.000000 -22 9 2 1 O-16 0.000000 0.000000 -23 9 2 1 B-10 0.000000 0.000000 -24 9 2 1 B-11 0.000000 0.000000 -25 9 2 1 Fe-54 0.000000 0.000000 -26 9 2 1 Fe-56 0.000000 0.000000 -27 9 2 1 Fe-57 0.000000 0.000000 -28 9 2 1 Fe-58 0.000000 0.000000 -29 9 2 1 Ni-58 0.000000 0.000000 -30 9 2 1 Ni-60 0.000000 0.000000 -31 9 2 1 Ni-61 0.000000 0.000000 -32 9 2 1 Ni-62 0.000000 0.000000 -33 9 2 1 Ni-64 0.000000 0.000000 -34 9 2 1 Mn-55 0.000000 0.000000 -35 9 2 1 Si-28 0.000000 0.000000 -36 9 2 1 Si-29 0.000000 0.000000 -37 9 2 1 Si-30 0.000000 0.000000 -38 9 2 1 Cr-50 0.000000 0.000000 -39 9 2 1 Cr-52 0.000000 0.000000 -40 9 2 1 Cr-53 0.000000 0.000000 -41 9 2 1 Cr-54 0.000000 0.000000 -0 9 2 2 H-1 1.417955 2.158027 -1 9 2 2 O-16 0.000000 0.000000 -2 9 2 2 B-10 0.000000 0.000000 -3 9 2 2 B-11 0.000000 0.000000 -4 9 2 2 Fe-54 0.000000 0.000000 -5 9 2 2 Fe-56 0.000000 0.000000 -6 9 2 2 Fe-57 0.000000 0.000000 -7 9 2 2 Fe-58 0.000000 0.000000 -8 9 2 2 Ni-58 0.000000 0.000000 -9 9 2 2 Ni-60 0.000000 0.000000 -10 9 2 2 Ni-61 0.000000 0.000000 -11 9 2 2 Ni-62 0.000000 0.000000 -12 9 2 2 Ni-64 0.000000 0.000000 -13 9 2 2 Mn-55 0.000000 0.000000 -14 9 2 2 Si-28 0.000000 0.000000 -15 9 2 2 Si-29 0.000000 0.000000 -16 9 2 2 Si-30 0.000000 0.000000 -17 9 2 2 Cr-50 0.000000 0.000000 -18 9 2 2 Cr-52 0.000000 0.000000 -19 9 2 2 Cr-53 0.000000 0.000000 -20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +20 8 2 Cr-54 0 0 group in material nuclide mean std. dev. +21 1 9 H-1 0.106160 0.179178 +22 1 9 O-16 0.272020 0.171699 +23 1 9 B-10 0.000000 0.000000 +24 1 9 B-11 0.000000 0.000000 +25 1 9 Fe-54 0.000000 0.000000 +26 1 9 Fe-56 0.000000 0.000000 +27 1 9 Fe-57 0.000000 0.000000 +28 1 9 Fe-58 0.000000 0.000000 +29 1 9 Ni-58 0.000000 0.000000 +30 1 9 Ni-60 0.000000 0.000000 +31 1 9 Ni-61 0.000000 0.000000 +32 1 9 Ni-62 0.000000 0.000000 +33 1 9 Ni-64 0.000000 0.000000 +34 1 9 Mn-55 0.085133 0.082479 +35 1 9 Si-28 0.000000 0.000000 +36 1 9 Si-29 0.000000 0.000000 +37 1 9 Si-30 0.000000 0.000000 +38 1 9 Cr-50 0.000000 0.000000 +39 1 9 Cr-52 0.000000 0.000000 +40 1 9 Cr-53 0.040723 0.079827 +41 1 9 Cr-54 0.000000 0.000000 +0 2 9 H-1 1.417955 2.158027 +1 2 9 O-16 0.000000 0.000000 +2 2 9 B-10 0.269141 0.380622 +3 2 9 B-11 0.000000 0.000000 +4 2 9 Fe-54 0.000000 0.000000 +5 2 9 Fe-56 0.000000 0.000000 +6 2 9 Fe-57 0.000000 0.000000 +7 2 9 Fe-58 0.000000 0.000000 +8 2 9 Ni-58 0.000000 0.000000 +9 2 9 Ni-60 0.000000 0.000000 +10 2 9 Ni-61 0.000000 0.000000 +11 2 9 Ni-62 0.000000 0.000000 +12 2 9 Ni-64 0.000000 0.000000 +13 2 9 Mn-55 0.000000 0.000000 +14 2 9 Si-28 0.000000 0.000000 +15 2 9 Si-29 0.000000 0.000000 +16 2 9 Si-30 0.000000 0.000000 +17 2 9 Cr-50 0.000000 0.000000 +18 2 9 Cr-52 0.000000 0.000000 +19 2 9 Cr-53 0.000000 0.000000 +20 2 9 Cr-54 0.000000 0.000000 group in material nuclide mean std. dev. +21 1 9 H-1 0 0 +22 1 9 O-16 0 0 +23 1 9 B-10 0 0 +24 1 9 B-11 0 0 +25 1 9 Fe-54 0 0 +26 1 9 Fe-56 0 0 +27 1 9 Fe-57 0 0 +28 1 9 Fe-58 0 0 +29 1 9 Ni-58 0 0 +30 1 9 Ni-60 0 0 +31 1 9 Ni-61 0 0 +32 1 9 Ni-62 0 0 +33 1 9 Ni-64 0 0 +34 1 9 Mn-55 0 0 +35 1 9 Si-28 0 0 +36 1 9 Si-29 0 0 +37 1 9 Si-30 0 0 +38 1 9 Cr-50 0 0 +39 1 9 Cr-52 0 0 +40 1 9 Cr-53 0 0 +41 1 9 Cr-54 0 0 +0 2 9 H-1 0 0 +1 2 9 O-16 0 0 +2 2 9 B-10 0 0 +3 2 9 B-11 0 0 +4 2 9 Fe-54 0 0 +5 2 9 Fe-56 0 0 +6 2 9 Fe-57 0 0 +7 2 9 Fe-58 0 0 +8 2 9 Ni-58 0 0 +9 2 9 Ni-60 0 0 +10 2 9 Ni-61 0 0 +11 2 9 Ni-62 0 0 +12 2 9 Ni-64 0 0 +13 2 9 Mn-55 0 0 +14 2 9 Si-28 0 0 +15 2 9 Si-29 0 0 +16 2 9 Si-30 0 0 +17 2 9 Cr-50 0 0 +18 2 9 Cr-52 0 0 +19 2 9 Cr-53 0 0 +20 2 9 Cr-54 0 0 group in material group out nuclide mean std. dev. +63 1 9 1 H-1 0.106160 0.179178 +64 1 9 1 O-16 0.272020 0.171699 +65 1 9 1 B-10 0.000000 0.000000 +66 1 9 1 B-11 0.000000 0.000000 +67 1 9 1 Fe-54 0.000000 0.000000 +68 1 9 1 Fe-56 0.000000 0.000000 +69 1 9 1 Fe-57 0.000000 0.000000 +70 1 9 1 Fe-58 0.000000 0.000000 +71 1 9 1 Ni-58 0.000000 0.000000 +72 1 9 1 Ni-60 0.000000 0.000000 +73 1 9 1 Ni-61 0.000000 0.000000 +74 1 9 1 Ni-62 0.000000 0.000000 +75 1 9 1 Ni-64 0.000000 0.000000 +76 1 9 1 Mn-55 0.085133 0.082479 +77 1 9 1 Si-28 0.000000 0.000000 +78 1 9 1 Si-29 0.000000 0.000000 +79 1 9 1 Si-30 0.000000 0.000000 +80 1 9 1 Cr-50 0.000000 0.000000 +81 1 9 1 Cr-52 0.000000 0.000000 +82 1 9 1 Cr-53 0.040723 0.079827 +83 1 9 1 Cr-54 0.000000 0.000000 +42 1 9 2 H-1 0.000000 0.000000 +43 1 9 2 O-16 0.000000 0.000000 +44 1 9 2 B-10 0.000000 0.000000 +45 1 9 2 B-11 0.000000 0.000000 +46 1 9 2 Fe-54 0.000000 0.000000 +47 1 9 2 Fe-56 0.000000 0.000000 +48 1 9 2 Fe-57 0.000000 0.000000 +49 1 9 2 Fe-58 0.000000 0.000000 +50 1 9 2 Ni-58 0.000000 0.000000 +51 1 9 2 Ni-60 0.000000 0.000000 +52 1 9 2 Ni-61 0.000000 0.000000 +53 1 9 2 Ni-62 0.000000 0.000000 +54 1 9 2 Ni-64 0.000000 0.000000 +55 1 9 2 Mn-55 0.000000 0.000000 +56 1 9 2 Si-28 0.000000 0.000000 +57 1 9 2 Si-29 0.000000 0.000000 +58 1 9 2 Si-30 0.000000 0.000000 +59 1 9 2 Cr-50 0.000000 0.000000 +60 1 9 2 Cr-52 0.000000 0.000000 +61 1 9 2 Cr-53 0.000000 0.000000 +62 1 9 2 Cr-54 0.000000 0.000000 +21 2 9 1 H-1 0.000000 0.000000 +22 2 9 1 O-16 0.000000 0.000000 +23 2 9 1 B-10 0.000000 0.000000 +24 2 9 1 B-11 0.000000 0.000000 +25 2 9 1 Fe-54 0.000000 0.000000 +26 2 9 1 Fe-56 0.000000 0.000000 +27 2 9 1 Fe-57 0.000000 0.000000 +28 2 9 1 Fe-58 0.000000 0.000000 +29 2 9 1 Ni-58 0.000000 0.000000 +30 2 9 1 Ni-60 0.000000 0.000000 +31 2 9 1 Ni-61 0.000000 0.000000 +32 2 9 1 Ni-62 0.000000 0.000000 +33 2 9 1 Ni-64 0.000000 0.000000 +34 2 9 1 Mn-55 0.000000 0.000000 +35 2 9 1 Si-28 0.000000 0.000000 +36 2 9 1 Si-29 0.000000 0.000000 +37 2 9 1 Si-30 0.000000 0.000000 +38 2 9 1 Cr-50 0.000000 0.000000 +39 2 9 1 Cr-52 0.000000 0.000000 +40 2 9 1 Cr-53 0.000000 0.000000 +41 2 9 1 Cr-54 0.000000 0.000000 +0 2 9 2 H-1 1.417955 2.158027 +1 2 9 2 O-16 0.000000 0.000000 +2 2 9 2 B-10 0.000000 0.000000 +3 2 9 2 B-11 0.000000 0.000000 +4 2 9 2 Fe-54 0.000000 0.000000 +5 2 9 2 Fe-56 0.000000 0.000000 +6 2 9 2 Fe-57 0.000000 0.000000 +7 2 9 2 Fe-58 0.000000 0.000000 +8 2 9 2 Ni-58 0.000000 0.000000 +9 2 9 2 Ni-60 0.000000 0.000000 +10 2 9 2 Ni-61 0.000000 0.000000 +11 2 9 2 Ni-62 0.000000 0.000000 +12 2 9 2 Ni-64 0.000000 0.000000 +13 2 9 2 Mn-55 0.000000 0.000000 +14 2 9 2 Si-28 0.000000 0.000000 +15 2 9 2 Si-29 0.000000 0.000000 +16 2 9 2 Si-30 0.000000 0.000000 +17 2 9 2 Cr-50 0.000000 0.000000 +18 2 9 2 Cr-52 0.000000 0.000000 +19 2 9 2 Cr-53 0.000000 0.000000 +20 2 9 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. 21 9 1 H-1 0 0 22 9 1 O-16 0 0 23 9 1 B-10 0 0 From 088e8652440b78add7b23ef8c7f3cbfa978f96d9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 20 Nov 2015 19:45:55 -0600 Subject: [PATCH 477/519] Respond to comments by @wbinventor and @nelsonag on #500 --- src/ace.F90 | 18 +++++++++--------- src/cross_section.F90 | 10 +++++----- src/fission.F90 | 10 +++++----- src/geometry.F90 | 17 +++++++++-------- src/output.F90 | 9 ++++----- src/tally.F90 | 24 ++++++++++++------------ 6 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/ace.F90 b/src/ace.F90 index c6d9b02214..e97338b558 100644 --- a/src/ace.F90 +++ b/src/ace.F90 @@ -733,13 +733,13 @@ contains ! sigma array is not allocated or stored for elastic scattering since it is ! already stored in nuc % elastic associate (rxn => nuc % reactions(1)) - rxn % MT = 2 - rxn % Q_value = ZERO - rxn % multiplicity = 1 - rxn % threshold = 1 - rxn % scatter_in_cm = .true. - rxn % has_angle_dist = .false. - rxn % has_energy_dist = .false. + rxn%MT = 2 + rxn%Q_value = ZERO + rxn%multiplicity = 1 + rxn%threshold = 1 + rxn%scatter_in_cm = .true. + rxn%has_angle_dist = .false. + rxn%has_energy_dist = .false. end associate ! Add contribution of elastic scattering to total cross section @@ -1013,8 +1013,8 @@ contains recursive subroutine get_energy_dist(edist, loc_law, delayed_n) type(DistEnergy), intent(inout) :: edist ! energy distribution - integer, intent(in) :: loc_law ! locator for data - logical, intent(in), optional :: delayed_n ! is this for delayed neutrons? + integer, intent(in) :: loc_law ! locator for data + logical, intent(in), optional :: delayed_n ! is this for delayed neutrons? integer :: LDIS ! location of all energy distributions integer :: LNW ! location of next energy distribution if multiple diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 969a397f02..f874eb2a74 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -510,8 +510,8 @@ contains pure function find_energy_index(mat, E) result(i) type(Material), intent(in) :: mat ! pointer to current material - real(8), intent(in) :: E ! energy of particle - integer :: i ! energy grid index + real(8), intent(in) :: E ! energy of particle + integer :: i ! energy grid index ! if the energy is outside of energy grid range, set to first or last ! index. Otherwise, do a binary search through the union energy grid. @@ -531,9 +531,9 @@ contains !=============================================================================== pure function elastic_xs_0K(E, nuc) result(xs_out) - real(8), intent(in) :: E ! trial energy - type(Nuclide), intent(in) :: nuc ! target nuclide at temperature - real(8) :: xs_out ! 0K xs at trial energy + real(8), intent(in) :: E ! trial energy + type(Nuclide), intent(in) :: nuc ! target nuclide at temperature + real(8) :: xs_out ! 0K xs at trial energy integer :: i_grid ! index on nuclide energy grid real(8) :: f ! interp factor on nuclide energy grid diff --git a/src/fission.F90 b/src/fission.F90 index 4c7613db32..a005d9f5bc 100644 --- a/src/fission.F90 +++ b/src/fission.F90 @@ -17,8 +17,8 @@ contains pure function nu_total(nuc, E) result(nu) type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu - real(8), intent(in) :: E ! energy of incoming neutron - real(8) :: nu ! number of total neutrons emitted per fission + real(8), intent(in) :: E ! energy of incoming neutron + real(8) :: nu ! number of total neutrons emitted per fission integer :: i ! loop index integer :: NC ! number of polynomial coefficients @@ -50,8 +50,8 @@ contains pure function nu_prompt(nuc, E) result(nu) type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu - real(8), intent(in) :: E ! energy of incoming neutron - real(8) :: nu ! number of prompt neutrons emitted per fission + real(8), intent(in) :: E ! energy of incoming neutron + real(8) :: nu ! number of prompt neutrons emitted per fission integer :: i ! loop index integer :: NC ! number of polynomial coefficients @@ -87,7 +87,7 @@ contains pure function nu_delayed(nuc, E) result(nu) type(Nuclide), intent(in) :: nuc ! nuclide from which to find nu - real(8), intent(in) :: E ! energy of incoming neutron + real(8), intent(in) :: E ! energy of incoming neutron real(8) :: nu ! number of delayed neutrons emitted per fission if (nuc % nu_d_type == NU_NONE) then diff --git a/src/geometry.F90 b/src/geometry.F90 index 3f8b43d4cb..22f5c3a153 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -875,6 +875,7 @@ contains integer :: i ! index in cells/surfaces array integer :: j ! index in region specification integer :: k ! surface half-space spec + integer :: n ! size of vector type(VectorInt), allocatable :: neighbor_pos(:) type(VectorInt), allocatable :: neighbor_neg(:) @@ -902,17 +903,17 @@ contains do i = 1, n_surfaces ! Copy positive neighbors to Surface instance - j = neighbor_pos(i)%size() - if (j > 0) then - allocate(surfaces(i)%obj%neighbor_pos(j)) - surfaces(i)%obj%neighbor_pos(:) = neighbor_pos(i)%data(1:j) + n = neighbor_pos(i)%size() + if (n > 0) then + allocate(surfaces(i)%obj%neighbor_pos(n)) + surfaces(i)%obj%neighbor_pos(:) = neighbor_pos(i)%data(1:n) end if ! Copy negative neighbors to Surface instance - j = neighbor_neg(i)%size() - if (j > 0) then - allocate(surfaces(i)%obj%neighbor_neg(j)) - surfaces(i)%obj%neighbor_neg(:) = neighbor_neg(i)%data(1:j) + n = neighbor_neg(i)%size() + if (n > 0) then + allocate(surfaces(i)%obj%neighbor_neg(n)) + surfaces(i)%obj%neighbor_neg(:) = neighbor_neg(i)%data(1:n) end if end do diff --git a/src/output.F90 b/src/output.F90 index 19ae6268be..c31b20b70b 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -194,8 +194,8 @@ contains !=============================================================================== subroutine write_message(message, level) - character(*), intent(in) :: message - integer, intent(in), optional :: level ! verbosity level + character(*), intent(in) :: message ! message to write + integer, intent(in), optional :: level ! verbosity level integer :: i_start ! starting position integer :: i_end ! ending position @@ -1349,10 +1349,9 @@ contains !=============================================================================== function get_label(t, i_filter) result(label) - type(TallyObject), intent(in) :: t ! tally object - integer, intent(in) :: i_filter ! index in filters array - character(100) :: label ! user-specified identifier + integer, intent(in) :: i_filter ! index in filters array + character(100) :: label ! user-specified identifier integer :: i ! index in cells/surfaces/etc array integer :: bin diff --git a/src/tally.F90 b/src/tally.F90 index c4ca2028bd..09e30a2426 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -608,13 +608,13 @@ contains ! No fission events occur if survival biasing is on -- need to ! calculate fraction of absorptions that would have resulted in ! fission scale by kappa-fission - associate (nuc => nuclides(p % event_nuclide)) - if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & - nuc % fissionable) then - score = p % absorb_wgt * & + associate (nuc => nuclides(p%event_nuclide)) + if (micro_xs(p%event_nuclide)%absorption > ZERO .and. & + nuc%fissionable) then + score = p%absorb_wgt * & nuc%reactions(nuc%index_fission(1))%Q_value * & - micro_xs(p % event_nuclide) % fission / & - micro_xs(p % event_nuclide) % absorption + micro_xs(p%event_nuclide)%fission / & + micro_xs(p%event_nuclide)%absorption end if end associate else @@ -623,12 +623,12 @@ contains ! All fission events will contribute, so again we can use ! particle's weight entering the collision as the estimate for ! the fission energy production rate - associate (nuc => nuclides(p % event_nuclide)) - if (nuc % fissionable) then - score = p % last_wgt * & + associate (nuc => nuclides(p%event_nuclide)) + if (nuc%fissionable) then + score = p%last_wgt * & nuc%reactions(nuc%index_fission(1))%Q_value * & - micro_xs(p % event_nuclide) % fission / & - micro_xs(p % event_nuclide) % absorption + micro_xs(p%event_nuclide)%fission / & + micro_xs(p%event_nuclide)%absorption end if end associate end if @@ -636,7 +636,7 @@ contains else if (i_nuclide > 0) then associate (nuc => nuclides(i_nuclide)) - if (nuc % fissionable) then + if (nuc%fissionable) then score = nuc%reactions(nuc%index_fission(1))%Q_value * & micro_xs(i_nuclide)%fission * atom_density * flux end if From fb9e676bb7facdd2a4d6a3aba8766c5fc56b6648 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 23 Nov 2015 09:16:38 -0500 Subject: [PATCH 478/519] changed inline to inplace in tallies.py --- openmc/tallies.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index f4b30d67f4..77520750ce 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1499,11 +1499,11 @@ class Tally(object): # If necessary, swap self filter if self_index != i: - self_copy.swap_filters(filter, self_copy.filters[i], inline=True) + self_copy.swap_filters(filter, self_copy.filters[i], inplace=True) # If necessary, swap other filter if other_index != i: - other_copy.swap_filters(filter, other_copy.filters[i], inline=True) + other_copy.swap_filters(filter, other_copy.filters[i], inplace=True) data = self_copy._align_tally_data(other_copy) @@ -1734,7 +1734,7 @@ class Tally(object): data['other']['std. dev.'] = other_std_dev return data - def swap_filters(self, filter1, filter2, inline=False): + def swap_filters(self, filter1, filter2, inplace=False): """Reverse the ordering of two filters in this tally This is a helper method for tally arithmetic which helps align the data @@ -1749,13 +1749,14 @@ class Tally(object): filter2 : Filter The filter to swap with filter1 - inline : bool, optional - Whether to inline operator or return new tally with swapped filters. + inplace : bool, optional + Whether to perform operation inplace or return new tally with the + filters swapped. Returns ------- swap_tally - If inline is false, a copy of this tally with the filters swapped. + If inplace is false, a copy of this tally with the filters swapped. Otherwise, nothing is returned. Raises @@ -1792,7 +1793,7 @@ class Tally(object): tally_copy = copy.deepcopy(self) # Set the swap tally - if inline: + if inplace: swap_tally = self else: swap_tally = copy.deepcopy(self) @@ -1857,7 +1858,7 @@ class Tally(object): indices = swap_tally.get_filter_indices(filters, filter_bins) swap_tally._std_dev[indices, :, :] = data - if not inline: + if not inplace: return swap_tally def __add__(self, other): From db550a05370bc81189134f9cc2fb1cab1596cc3d Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 24 Nov 2015 21:08:54 -0500 Subject: [PATCH 479/519] Fixed bug casting OpenCG rotations to integers is now double --- openmc/opencg_compatible.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 93c0e5fae7..6430b24240 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -726,7 +726,7 @@ def get_openmc_cell(opencg_cell): openmc_cell.fill = get_openmc_material(fill) if opencg_cell.rotation: - rotation = np.asarray(opencg_cell.rotation, dtype=np.int) + rotation = np.asarray(opencg_cell.rotation, dtype=np.float64) openmc_cell.rotation = rotation if opencg_cell.translation: From a11950f94ae890f8c78b2be736ff006d71e19fc4 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 24 Nov 2015 22:01:12 -0500 Subject: [PATCH 480/519] Now over-riding openmc/opencg geometries in MGXS Library when loading from StatePoint --- openmc/mgxs/library.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 87c6665b2d..fa49d24e64 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -361,6 +361,8 @@ class Library(object): raise ValueError(msg) self._sp_filename = statepoint._f.filename + self._openmc_geometry = statepoint.summary.openmc_geometry + self._opencg_geometry = None # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From 70e7ce9b3bf27660055211296fe7d18fa2cf5ea2 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 25 Nov 2015 09:34:35 -0800 Subject: [PATCH 481/519] fixed issue with python 2 and 3 discrepancies for tally arithmetic tests --- openmc/tallies.py | 7 +- .../results_true.dat | 86 +++++++++---------- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 77520750ce..a97428565c 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -1488,9 +1488,10 @@ class Tally(object): other_copy = copy.deepcopy(other) # Find any shared filters between the two tallies - self_filters = set(self_copy.filters) - other_filters = set(other_copy.filters) - filter_intersect = self_filters.intersection(other_filters) + filter_intersect = [] + for filter in self_copy.filters: + if filter in other_copy.filters: + filter_intersect.append(filter) # Align the shared filters in successive order for i, filter in enumerate(filter_intersect): diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index 58e0d14fcd..45891fc300 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -1,49 +1,49 @@ - group in material nuclide mean std. dev. -0 1 1 total 0.419289 0.01638 group in material nuclide mean std. dev. -0 1 1 total 0.07774 0.003273 group in material group out nuclide mean std. dev. + material group in nuclide mean std. dev. +0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev. +0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev. 0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev. -0 1 1 total 1 0.119622 group in material nuclide mean std. dev. -0 1 2 total 0.247316 0.009562 group in material nuclide mean std. dev. -0 1 2 total 0 0 group in material group out nuclide mean std. dev. -0 1 2 1 total 0.244838 0.009996 material group out nuclide mean std. dev. -0 2 1 total 0 0 group in material nuclide mean std. dev. -0 1 3 total 0.409938 0.042262 group in material nuclide mean std. dev. -0 1 3 total 0 0 group in material group out nuclide mean std. dev. -0 1 3 1 total 0.403354 0.041386 material group out nuclide mean std. dev. -0 3 1 total 0 0 group in material nuclide mean std. dev. -0 1 4 total 0.344007 0.05352 group in material nuclide mean std. dev. -0 1 4 total 0 0 group in material group out nuclide mean std. dev. -0 1 4 1 total 0.340438 0.052067 material group out nuclide mean std. dev. -0 4 1 total 0 0 group in material nuclide mean std. dev. -0 1 5 total 0 0 group in material nuclide mean std. dev. -0 1 5 total 0 0 group in material group out nuclide mean std. dev. -0 1 5 1 total 0 0 material group out nuclide mean std. dev. -0 5 1 total 0 0 group in material nuclide mean std. dev. -0 1 6 total 0 0 group in material nuclide mean std. dev. -0 1 6 total 0 0 group in material group out nuclide mean std. dev. -0 1 6 1 total 0 0 material group out nuclide mean std. dev. +0 1 1 total 1 0.119622 material group in nuclide mean std. dev. +0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev. +0 2 1 total 0 0 material group in group out nuclide mean std. dev. +0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev. +0 2 1 total 0 0 material group in nuclide mean std. dev. +0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev. +0 3 1 total 0 0 material group in group out nuclide mean std. dev. +0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev. +0 3 1 total 0 0 material group in nuclide mean std. dev. +0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev. +0 4 1 total 0 0 material group in group out nuclide mean std. dev. +0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev. +0 4 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 5 1 total 0 0 material group in group out nuclide mean std. dev. +0 5 1 1 total 0 0 material group out nuclide mean std. dev. +0 5 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in nuclide mean std. dev. +0 6 1 total 0 0 material group in group out nuclide mean std. dev. +0 6 1 1 total 0 0 material group out nuclide mean std. dev. 0 6 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in nuclide mean std. dev. 0 7 1 total 0 0 material group in group out nuclide mean std. dev. 0 7 1 1 total 0 0 material group out nuclide mean std. dev. -0 7 1 total 0 0 group in material nuclide mean std. dev. -0 1 8 total 0 0 group in material nuclide mean std. dev. -0 1 8 total 0 0 group in material group out nuclide mean std. dev. -0 1 8 1 total 0 0 material group out nuclide mean std. dev. -0 8 1 total 0 0 group in material nuclide mean std. dev. -0 1 9 total 0.751873 0.559701 group in material nuclide mean std. dev. -0 1 9 total 0 0 group in material group out nuclide mean std. dev. -0 1 9 1 total 0.695491 0.50757 material group out nuclide mean std. dev. -0 9 1 total 0 0 group in material nuclide mean std. dev. -0 1 10 total 0 0 group in material nuclide mean std. dev. -0 1 10 total 0 0 group in material group out nuclide mean std. dev. -0 1 10 1 total 0 0 material group out nuclide mean std. dev. -0 10 1 total 0 0 group in material nuclide mean std. dev. -0 1 11 total 0.457329 0.403578 group in material nuclide mean std. dev. -0 1 11 total 0 0 group in material group out nuclide mean std. dev. -0 1 11 1 total 0.446737 0.392775 material group out nuclide mean std. dev. -0 11 1 total 0 0 group in material nuclide mean std. dev. -0 1 12 total 0.574978 0.38864 group in material nuclide mean std. dev. -0 1 12 total 0 0 group in material group out nuclide mean std. dev. -0 1 12 1 total 0.559478 0.377512 material group out nuclide mean std. dev. +0 7 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 8 1 total 0 0 material group in group out nuclide mean std. dev. +0 8 1 1 total 0 0 material group out nuclide mean std. dev. +0 8 1 total 0 0 material group in nuclide mean std. dev. +0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev. +0 9 1 total 0 0 material group in group out nuclide mean std. dev. +0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev. +0 9 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 10 1 total 0 0 material group in group out nuclide mean std. dev. +0 10 1 1 total 0 0 material group out nuclide mean std. dev. +0 10 1 total 0 0 material group in nuclide mean std. dev. +0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev. +0 11 1 total 0 0 material group in group out nuclide mean std. dev. +0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev. +0 11 1 total 0 0 material group in nuclide mean std. dev. +0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev. +0 12 1 total 0 0 material group in group out nuclide mean std. dev. +0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev. 0 12 1 total 0 0 \ No newline at end of file From 6de5e48186ef0d91a2d0eb75bcfb082d8884d4f9 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 25 Nov 2015 09:43:16 -0800 Subject: [PATCH 482/519] updated results_true.dat files for tests to reflect changes to tally arithmetic --- .../results_true.dat | 46 +- .../results_true.dat | 950 +++++++++--------- 2 files changed, 498 insertions(+), 498 deletions(-) diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index bd69a25a87..7618512689 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -1,12 +1,12 @@ - group in material nuclide mean std. dev. + material group in nuclide mean std. dev. 1 1 1 total 0.384379 0.01649 -0 2 1 total 0.812087 0.07419 group in material nuclide mean std. dev. +0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev. 1 1 1 total 0.02127 0.000894 -0 2 1 total 0.69604 0.053458 group in material group out nuclide mean std. dev. +0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev. 3 1 1 1 total 0.349924 0.016649 2 1 1 2 total 0.000173 0.000173 -1 2 1 1 total 0.001948 0.001952 -0 2 1 2 total 0.379607 0.040078 material group out nuclide mean std. dev. +1 1 2 1 total 0.001948 0.001952 +0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev. 1 1 1 total 1 0.119622 0 1 2 total 0 0.000000 material group in nuclide mean std. dev. 1 2 1 total 0.245043 0.008827 @@ -48,15 +48,15 @@ 1 5 2 1 total 0 0 0 5 2 2 total 0 0 material group out nuclide mean std. dev. 1 5 1 total 0 0 -0 5 2 total 0 0 group in material nuclide mean std. dev. -1 1 6 total 0 0 -0 2 6 total 0 0 group in material nuclide mean std. dev. -1 1 6 total 0 0 -0 2 6 total 0 0 group in material group out nuclide mean std. dev. -3 1 6 1 total 0 0 -2 1 6 2 total 0 0 -1 2 6 1 total 0 0 -0 2 6 2 total 0 0 material group out nuclide mean std. dev. +0 5 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in nuclide mean std. dev. +1 6 1 total 0 0 +0 6 2 total 0 0 material group in group out nuclide mean std. dev. +3 6 1 1 total 0 0 +2 6 1 2 total 0 0 +1 6 2 1 total 0 0 +0 6 2 2 total 0 0 material group out nuclide mean std. dev. 1 6 1 total 0 0 0 6 2 total 0 0 material group in nuclide mean std. dev. 1 7 1 total 0 0 @@ -78,15 +78,15 @@ 1 8 2 1 total 0 0 0 8 2 2 total 0 0 material group out nuclide mean std. dev. 1 8 1 total 0 0 -0 8 2 total 0 0 group in material nuclide mean std. dev. -1 1 9 total 0.504036 0.379624 -0 2 9 total 1.687095 2.536622 group in material nuclide mean std. dev. -1 1 9 total 0 0 -0 2 9 total 0 0 group in material group out nuclide mean std. dev. -3 1 9 1 total 0.504036 0.379624 -2 1 9 2 total 0.000000 0.000000 -1 2 9 1 total 0.000000 0.000000 -0 2 9 2 total 1.417955 2.158027 material group out nuclide mean std. dev. +0 8 2 total 0 0 material group in nuclide mean std. dev. +1 9 1 total 0.504036 0.379624 +0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev. +1 9 1 total 0 0 +0 9 2 total 0 0 material group in group out nuclide mean std. dev. +3 9 1 1 total 0.504036 0.379624 +2 9 1 2 total 0.000000 0.000000 +1 9 2 1 total 0.000000 0.000000 +0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev. 1 9 1 total 0 0 0 9 2 total 0 0 material group in nuclide mean std. dev. 1 10 1 total 0 0 diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index eba202d7da..23ac0e423d 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1,4 +1,4 @@ - group in material nuclide mean std. dev. + material group in nuclide mean std. dev. 34 1 1 U-234 0.000000 0.000000 35 1 1 U-235 0.008559 0.001742 36 1 1 U-236 0.002643 0.000794 @@ -33,40 +33,40 @@ 65 1 1 Eu-153 0.000173 0.000173 66 1 1 Gd-155 0.000000 0.000000 67 1 1 O-16 0.142506 0.008222 -0 2 1 U-234 0.001948 0.001952 -1 2 1 U-235 0.179956 0.028209 -2 2 1 U-236 0.000000 0.000000 -3 2 1 U-238 0.239279 0.039048 -4 2 1 Np-237 0.000000 0.000000 -5 2 1 Pu-238 0.000000 0.000000 -6 2 1 Pu-239 0.159745 0.015751 -7 2 1 Pu-240 0.007792 0.003677 -8 2 1 Pu-241 0.017533 0.003806 -9 2 1 Pu-242 0.000000 0.000000 -10 2 1 Am-241 0.000000 0.000000 -11 2 1 Am-242m 0.000000 0.000000 -12 2 1 Am-243 0.000000 0.000000 -13 2 1 Cm-242 0.000000 0.000000 -14 2 1 Cm-243 0.000000 0.000000 -15 2 1 Cm-244 0.000000 0.000000 -16 2 1 Cm-245 0.000000 0.000000 -17 2 1 Mo-95 0.002250 0.004232 -18 2 1 Tc-99 0.003544 0.002528 -19 2 1 Ru-101 0.000000 0.000000 -20 2 1 Ru-103 0.000000 0.000000 -21 2 1 Ag-109 0.000000 0.000000 -22 2 1 Xe-135 0.027274 0.004025 -23 2 1 Cs-133 0.000000 0.000000 -24 2 1 Nd-143 0.006532 0.002517 -25 2 1 Nd-145 0.001948 0.001952 -26 2 1 Sm-147 0.000000 0.000000 -27 2 1 Sm-149 0.007792 0.005701 -28 2 1 Sm-150 0.000000 0.000000 -29 2 1 Sm-151 0.000000 0.000000 -30 2 1 Sm-152 0.000000 0.000000 -31 2 1 Eu-153 0.001686 0.001968 -32 2 1 Gd-155 0.000000 0.000000 -33 2 1 O-16 0.154807 0.023798 group in material nuclide mean std. dev. +0 1 2 U-234 0.001948 0.001952 +1 1 2 U-235 0.179956 0.028209 +2 1 2 U-236 0.000000 0.000000 +3 1 2 U-238 0.239279 0.039048 +4 1 2 Np-237 0.000000 0.000000 +5 1 2 Pu-238 0.000000 0.000000 +6 1 2 Pu-239 0.159745 0.015751 +7 1 2 Pu-240 0.007792 0.003677 +8 1 2 Pu-241 0.017533 0.003806 +9 1 2 Pu-242 0.000000 0.000000 +10 1 2 Am-241 0.000000 0.000000 +11 1 2 Am-242m 0.000000 0.000000 +12 1 2 Am-243 0.000000 0.000000 +13 1 2 Cm-242 0.000000 0.000000 +14 1 2 Cm-243 0.000000 0.000000 +15 1 2 Cm-244 0.000000 0.000000 +16 1 2 Cm-245 0.000000 0.000000 +17 1 2 Mo-95 0.002250 0.004232 +18 1 2 Tc-99 0.003544 0.002528 +19 1 2 Ru-101 0.000000 0.000000 +20 1 2 Ru-103 0.000000 0.000000 +21 1 2 Ag-109 0.000000 0.000000 +22 1 2 Xe-135 0.027274 0.004025 +23 1 2 Cs-133 0.000000 0.000000 +24 1 2 Nd-143 0.006532 0.002517 +25 1 2 Nd-145 0.001948 0.001952 +26 1 2 Sm-147 0.000000 0.000000 +27 1 2 Sm-149 0.007792 0.005701 +28 1 2 Sm-150 0.000000 0.000000 +29 1 2 Sm-151 0.000000 0.000000 +30 1 2 Sm-152 0.000000 0.000000 +31 1 2 Eu-153 0.001686 0.001968 +32 1 2 Gd-155 0.000000 0.000000 +33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev. 34 1 1 U-234 6.771527e-06 2.982583e-07 35 1 1 U-235 9.687933e-03 4.305720e-04 36 1 1 U-236 6.279974e-05 3.653120e-06 @@ -101,40 +101,40 @@ 65 1 1 Eu-153 0.000000e+00 0.000000e+00 66 1 1 Gd-155 0.000000e+00 0.000000e+00 67 1 1 O-16 0.000000e+00 0.000000e+00 -0 2 1 U-234 4.267300e-07 3.529845e-08 -1 2 1 U-235 3.629246e-01 2.964548e-02 -2 2 1 U-236 5.921657e-06 4.881464e-07 -3 2 1 U-238 5.196256e-07 4.286610e-08 -4 2 1 Np-237 2.424211e-07 1.741823e-08 -5 2 1 Pu-238 3.255627e-05 2.692686e-06 -6 2 1 Pu-239 2.868384e-01 2.056896e-02 -7 2 1 Pu-240 4.398266e-06 3.658267e-07 -8 2 1 Pu-241 4.607239e-02 3.797176e-03 -9 2 1 Pu-242 8.451967e-08 6.979002e-09 -10 2 1 Am-241 4.678607e-06 3.253889e-07 -11 2 1 Am-242m 1.417675e-04 1.218350e-05 -12 2 1 Am-243 7.648834e-08 6.303843e-09 -13 2 1 Cm-242 9.433314e-07 7.794362e-08 -14 2 1 Cm-243 1.767995e-06 1.454123e-07 -15 2 1 Cm-244 1.533962e-07 1.266951e-08 -16 2 1 Cm-245 1.145063e-05 9.419051e-07 -17 2 1 Mo-95 0.000000e+00 0.000000e+00 -18 2 1 Tc-99 0.000000e+00 0.000000e+00 -19 2 1 Ru-101 0.000000e+00 0.000000e+00 -20 2 1 Ru-103 0.000000e+00 0.000000e+00 -21 2 1 Ag-109 0.000000e+00 0.000000e+00 -22 2 1 Xe-135 0.000000e+00 0.000000e+00 -23 2 1 Cs-133 0.000000e+00 0.000000e+00 -24 2 1 Nd-143 0.000000e+00 0.000000e+00 -25 2 1 Nd-145 0.000000e+00 0.000000e+00 -26 2 1 Sm-147 0.000000e+00 0.000000e+00 -27 2 1 Sm-149 0.000000e+00 0.000000e+00 -28 2 1 Sm-150 0.000000e+00 0.000000e+00 -29 2 1 Sm-151 0.000000e+00 0.000000e+00 -30 2 1 Sm-152 0.000000e+00 0.000000e+00 -31 2 1 Eu-153 0.000000e+00 0.000000e+00 -32 2 1 Gd-155 0.000000e+00 0.000000e+00 -33 2 1 O-16 0.000000e+00 0.000000e+00 group in material group out nuclide mean std. dev. +0 1 2 U-234 4.267300e-07 3.529845e-08 +1 1 2 U-235 3.629246e-01 2.964548e-02 +2 1 2 U-236 5.921657e-06 4.881464e-07 +3 1 2 U-238 5.196256e-07 4.286610e-08 +4 1 2 Np-237 2.424211e-07 1.741823e-08 +5 1 2 Pu-238 3.255627e-05 2.692686e-06 +6 1 2 Pu-239 2.868384e-01 2.056896e-02 +7 1 2 Pu-240 4.398266e-06 3.658267e-07 +8 1 2 Pu-241 4.607239e-02 3.797176e-03 +9 1 2 Pu-242 8.451967e-08 6.979002e-09 +10 1 2 Am-241 4.678607e-06 3.253889e-07 +11 1 2 Am-242m 1.417675e-04 1.218350e-05 +12 1 2 Am-243 7.648834e-08 6.303843e-09 +13 1 2 Cm-242 9.433314e-07 7.794362e-08 +14 1 2 Cm-243 1.767995e-06 1.454123e-07 +15 1 2 Cm-244 1.533962e-07 1.266951e-08 +16 1 2 Cm-245 1.145063e-05 9.419051e-07 +17 1 2 Mo-95 0.000000e+00 0.000000e+00 +18 1 2 Tc-99 0.000000e+00 0.000000e+00 +19 1 2 Ru-101 0.000000e+00 0.000000e+00 +20 1 2 Ru-103 0.000000e+00 0.000000e+00 +21 1 2 Ag-109 0.000000e+00 0.000000e+00 +22 1 2 Xe-135 0.000000e+00 0.000000e+00 +23 1 2 Cs-133 0.000000e+00 0.000000e+00 +24 1 2 Nd-143 0.000000e+00 0.000000e+00 +25 1 2 Nd-145 0.000000e+00 0.000000e+00 +26 1 2 Sm-147 0.000000e+00 0.000000e+00 +27 1 2 Sm-149 0.000000e+00 0.000000e+00 +28 1 2 Sm-150 0.000000e+00 0.000000e+00 +29 1 2 Sm-151 0.000000e+00 0.000000e+00 +30 1 2 Sm-152 0.000000e+00 0.000000e+00 +31 1 2 Eu-153 0.000000e+00 0.000000e+00 +32 1 2 Gd-155 0.000000e+00 0.000000e+00 +33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev. 102 1 1 1 U-234 0.000000 0.000000 103 1 1 1 U-235 0.002846 0.001185 104 1 1 1 U-236 0.001951 0.000829 @@ -203,74 +203,74 @@ 99 1 1 2 Eu-153 0.000000 0.000000 100 1 1 2 Gd-155 0.000000 0.000000 101 1 1 2 O-16 0.000173 0.000173 -34 2 1 1 U-234 0.000000 0.000000 -35 2 1 1 U-235 0.000000 0.000000 -36 2 1 1 U-236 0.000000 0.000000 -37 2 1 1 U-238 0.000000 0.000000 -38 2 1 1 Np-237 0.000000 0.000000 -39 2 1 1 Pu-238 0.000000 0.000000 -40 2 1 1 Pu-239 0.000000 0.000000 -41 2 1 1 Pu-240 0.000000 0.000000 -42 2 1 1 Pu-241 0.000000 0.000000 -43 2 1 1 Pu-242 0.000000 0.000000 -44 2 1 1 Am-241 0.000000 0.000000 -45 2 1 1 Am-242m 0.000000 0.000000 -46 2 1 1 Am-243 0.000000 0.000000 -47 2 1 1 Cm-242 0.000000 0.000000 -48 2 1 1 Cm-243 0.000000 0.000000 -49 2 1 1 Cm-244 0.000000 0.000000 -50 2 1 1 Cm-245 0.000000 0.000000 -51 2 1 1 Mo-95 0.000000 0.000000 -52 2 1 1 Tc-99 0.000000 0.000000 -53 2 1 1 Ru-101 0.000000 0.000000 -54 2 1 1 Ru-103 0.000000 0.000000 -55 2 1 1 Ag-109 0.000000 0.000000 -56 2 1 1 Xe-135 0.000000 0.000000 -57 2 1 1 Cs-133 0.000000 0.000000 -58 2 1 1 Nd-143 0.000000 0.000000 -59 2 1 1 Nd-145 0.000000 0.000000 -60 2 1 1 Sm-147 0.000000 0.000000 -61 2 1 1 Sm-149 0.000000 0.000000 -62 2 1 1 Sm-150 0.000000 0.000000 -63 2 1 1 Sm-151 0.000000 0.000000 -64 2 1 1 Sm-152 0.000000 0.000000 -65 2 1 1 Eu-153 0.000000 0.000000 -66 2 1 1 Gd-155 0.000000 0.000000 -67 2 1 1 O-16 0.001948 0.001952 -0 2 1 2 U-234 0.000000 0.000000 -1 2 1 2 U-235 0.010470 0.006106 -2 2 1 2 U-236 0.000000 0.000000 -3 2 1 2 U-238 0.208109 0.039197 -4 2 1 2 Np-237 0.000000 0.000000 -5 2 1 2 Pu-238 0.000000 0.000000 -6 2 1 2 Pu-239 0.000000 0.000000 -7 2 1 2 Pu-240 0.000000 0.000000 -8 2 1 2 Pu-241 0.000000 0.000000 -9 2 1 2 Pu-242 0.000000 0.000000 -10 2 1 2 Am-241 0.000000 0.000000 -11 2 1 2 Am-242m 0.000000 0.000000 -12 2 1 2 Am-243 0.000000 0.000000 -13 2 1 2 Cm-242 0.000000 0.000000 -14 2 1 2 Cm-243 0.000000 0.000000 -15 2 1 2 Cm-244 0.000000 0.000000 -16 2 1 2 Cm-245 0.000000 0.000000 -17 2 1 2 Mo-95 0.000302 0.002551 -18 2 1 2 Tc-99 0.003544 0.002528 -19 2 1 2 Ru-101 0.000000 0.000000 -20 2 1 2 Ru-103 0.000000 0.000000 -21 2 1 2 Ag-109 0.000000 0.000000 -22 2 1 2 Xe-135 0.000000 0.000000 -23 2 1 2 Cs-133 0.000000 0.000000 -24 2 1 2 Nd-143 0.002636 0.002073 -25 2 1 2 Nd-145 0.000000 0.000000 -26 2 1 2 Sm-147 0.000000 0.000000 -27 2 1 2 Sm-149 0.000000 0.000000 -28 2 1 2 Sm-150 0.000000 0.000000 -29 2 1 2 Sm-151 0.000000 0.000000 -30 2 1 2 Sm-152 0.000000 0.000000 -31 2 1 2 Eu-153 0.001686 0.001968 -32 2 1 2 Gd-155 0.000000 0.000000 -33 2 1 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. +34 1 2 1 U-234 0.000000 0.000000 +35 1 2 1 U-235 0.000000 0.000000 +36 1 2 1 U-236 0.000000 0.000000 +37 1 2 1 U-238 0.000000 0.000000 +38 1 2 1 Np-237 0.000000 0.000000 +39 1 2 1 Pu-238 0.000000 0.000000 +40 1 2 1 Pu-239 0.000000 0.000000 +41 1 2 1 Pu-240 0.000000 0.000000 +42 1 2 1 Pu-241 0.000000 0.000000 +43 1 2 1 Pu-242 0.000000 0.000000 +44 1 2 1 Am-241 0.000000 0.000000 +45 1 2 1 Am-242m 0.000000 0.000000 +46 1 2 1 Am-243 0.000000 0.000000 +47 1 2 1 Cm-242 0.000000 0.000000 +48 1 2 1 Cm-243 0.000000 0.000000 +49 1 2 1 Cm-244 0.000000 0.000000 +50 1 2 1 Cm-245 0.000000 0.000000 +51 1 2 1 Mo-95 0.000000 0.000000 +52 1 2 1 Tc-99 0.000000 0.000000 +53 1 2 1 Ru-101 0.000000 0.000000 +54 1 2 1 Ru-103 0.000000 0.000000 +55 1 2 1 Ag-109 0.000000 0.000000 +56 1 2 1 Xe-135 0.000000 0.000000 +57 1 2 1 Cs-133 0.000000 0.000000 +58 1 2 1 Nd-143 0.000000 0.000000 +59 1 2 1 Nd-145 0.000000 0.000000 +60 1 2 1 Sm-147 0.000000 0.000000 +61 1 2 1 Sm-149 0.000000 0.000000 +62 1 2 1 Sm-150 0.000000 0.000000 +63 1 2 1 Sm-151 0.000000 0.000000 +64 1 2 1 Sm-152 0.000000 0.000000 +65 1 2 1 Eu-153 0.000000 0.000000 +66 1 2 1 Gd-155 0.000000 0.000000 +67 1 2 1 O-16 0.001948 0.001952 +0 1 2 2 U-234 0.000000 0.000000 +1 1 2 2 U-235 0.010470 0.006106 +2 1 2 2 U-236 0.000000 0.000000 +3 1 2 2 U-238 0.208109 0.039197 +4 1 2 2 Np-237 0.000000 0.000000 +5 1 2 2 Pu-238 0.000000 0.000000 +6 1 2 2 Pu-239 0.000000 0.000000 +7 1 2 2 Pu-240 0.000000 0.000000 +8 1 2 2 Pu-241 0.000000 0.000000 +9 1 2 2 Pu-242 0.000000 0.000000 +10 1 2 2 Am-241 0.000000 0.000000 +11 1 2 2 Am-242m 0.000000 0.000000 +12 1 2 2 Am-243 0.000000 0.000000 +13 1 2 2 Cm-242 0.000000 0.000000 +14 1 2 2 Cm-243 0.000000 0.000000 +15 1 2 2 Cm-244 0.000000 0.000000 +16 1 2 2 Cm-245 0.000000 0.000000 +17 1 2 2 Mo-95 0.000302 0.002551 +18 1 2 2 Tc-99 0.003544 0.002528 +19 1 2 2 Ru-101 0.000000 0.000000 +20 1 2 2 Ru-103 0.000000 0.000000 +21 1 2 2 Ag-109 0.000000 0.000000 +22 1 2 2 Xe-135 0.000000 0.000000 +23 1 2 2 Cs-133 0.000000 0.000000 +24 1 2 2 Nd-143 0.002636 0.002073 +25 1 2 2 Nd-145 0.000000 0.000000 +26 1 2 2 Sm-147 0.000000 0.000000 +27 1 2 2 Sm-149 0.000000 0.000000 +28 1 2 2 Sm-150 0.000000 0.000000 +29 1 2 2 Sm-151 0.000000 0.000000 +30 1 2 2 Sm-152 0.000000 0.000000 +31 1 2 2 Eu-153 0.001686 0.001968 +32 1 2 2 Gd-155 0.000000 0.000000 +33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev. 34 1 1 U-234 0 0.000000 35 1 1 U-235 1 0.127079 36 1 1 U-236 0 0.000000 @@ -738,175 +738,175 @@ 23 5 2 Cr-54 0 0 24 5 2 C-Nat 0 0 25 5 2 Cu-63 0 0 -26 5 2 Cu-65 0 0 group in material nuclide mean std. dev. -21 1 6 H-1 0 0 -22 1 6 O-16 0 0 -23 1 6 B-10 0 0 -24 1 6 B-11 0 0 -25 1 6 Fe-54 0 0 -26 1 6 Fe-56 0 0 -27 1 6 Fe-57 0 0 -28 1 6 Fe-58 0 0 -29 1 6 Ni-58 0 0 -30 1 6 Ni-60 0 0 -31 1 6 Ni-61 0 0 -32 1 6 Ni-62 0 0 -33 1 6 Ni-64 0 0 -34 1 6 Mn-55 0 0 -35 1 6 Si-28 0 0 -36 1 6 Si-29 0 0 -37 1 6 Si-30 0 0 -38 1 6 Cr-50 0 0 -39 1 6 Cr-52 0 0 -40 1 6 Cr-53 0 0 -41 1 6 Cr-54 0 0 -0 2 6 H-1 0 0 -1 2 6 O-16 0 0 -2 2 6 B-10 0 0 -3 2 6 B-11 0 0 -4 2 6 Fe-54 0 0 -5 2 6 Fe-56 0 0 -6 2 6 Fe-57 0 0 -7 2 6 Fe-58 0 0 -8 2 6 Ni-58 0 0 -9 2 6 Ni-60 0 0 -10 2 6 Ni-61 0 0 -11 2 6 Ni-62 0 0 -12 2 6 Ni-64 0 0 -13 2 6 Mn-55 0 0 -14 2 6 Si-28 0 0 -15 2 6 Si-29 0 0 -16 2 6 Si-30 0 0 -17 2 6 Cr-50 0 0 -18 2 6 Cr-52 0 0 -19 2 6 Cr-53 0 0 -20 2 6 Cr-54 0 0 group in material nuclide mean std. dev. -21 1 6 H-1 0 0 -22 1 6 O-16 0 0 -23 1 6 B-10 0 0 -24 1 6 B-11 0 0 -25 1 6 Fe-54 0 0 -26 1 6 Fe-56 0 0 -27 1 6 Fe-57 0 0 -28 1 6 Fe-58 0 0 -29 1 6 Ni-58 0 0 -30 1 6 Ni-60 0 0 -31 1 6 Ni-61 0 0 -32 1 6 Ni-62 0 0 -33 1 6 Ni-64 0 0 -34 1 6 Mn-55 0 0 -35 1 6 Si-28 0 0 -36 1 6 Si-29 0 0 -37 1 6 Si-30 0 0 -38 1 6 Cr-50 0 0 -39 1 6 Cr-52 0 0 -40 1 6 Cr-53 0 0 -41 1 6 Cr-54 0 0 -0 2 6 H-1 0 0 -1 2 6 O-16 0 0 -2 2 6 B-10 0 0 -3 2 6 B-11 0 0 -4 2 6 Fe-54 0 0 -5 2 6 Fe-56 0 0 -6 2 6 Fe-57 0 0 -7 2 6 Fe-58 0 0 -8 2 6 Ni-58 0 0 -9 2 6 Ni-60 0 0 -10 2 6 Ni-61 0 0 -11 2 6 Ni-62 0 0 -12 2 6 Ni-64 0 0 -13 2 6 Mn-55 0 0 -14 2 6 Si-28 0 0 -15 2 6 Si-29 0 0 -16 2 6 Si-30 0 0 -17 2 6 Cr-50 0 0 -18 2 6 Cr-52 0 0 -19 2 6 Cr-53 0 0 -20 2 6 Cr-54 0 0 group in material group out nuclide mean std. dev. -63 1 6 1 H-1 0 0 -64 1 6 1 O-16 0 0 -65 1 6 1 B-10 0 0 -66 1 6 1 B-11 0 0 -67 1 6 1 Fe-54 0 0 -68 1 6 1 Fe-56 0 0 -69 1 6 1 Fe-57 0 0 -70 1 6 1 Fe-58 0 0 -71 1 6 1 Ni-58 0 0 -72 1 6 1 Ni-60 0 0 -73 1 6 1 Ni-61 0 0 -74 1 6 1 Ni-62 0 0 -75 1 6 1 Ni-64 0 0 -76 1 6 1 Mn-55 0 0 -77 1 6 1 Si-28 0 0 -78 1 6 1 Si-29 0 0 -79 1 6 1 Si-30 0 0 -80 1 6 1 Cr-50 0 0 -81 1 6 1 Cr-52 0 0 -82 1 6 1 Cr-53 0 0 -83 1 6 1 Cr-54 0 0 -42 1 6 2 H-1 0 0 -43 1 6 2 O-16 0 0 -44 1 6 2 B-10 0 0 -45 1 6 2 B-11 0 0 -46 1 6 2 Fe-54 0 0 -47 1 6 2 Fe-56 0 0 -48 1 6 2 Fe-57 0 0 -49 1 6 2 Fe-58 0 0 -50 1 6 2 Ni-58 0 0 -51 1 6 2 Ni-60 0 0 -52 1 6 2 Ni-61 0 0 -53 1 6 2 Ni-62 0 0 -54 1 6 2 Ni-64 0 0 -55 1 6 2 Mn-55 0 0 -56 1 6 2 Si-28 0 0 -57 1 6 2 Si-29 0 0 -58 1 6 2 Si-30 0 0 -59 1 6 2 Cr-50 0 0 -60 1 6 2 Cr-52 0 0 -61 1 6 2 Cr-53 0 0 -62 1 6 2 Cr-54 0 0 -21 2 6 1 H-1 0 0 -22 2 6 1 O-16 0 0 -23 2 6 1 B-10 0 0 -24 2 6 1 B-11 0 0 -25 2 6 1 Fe-54 0 0 -26 2 6 1 Fe-56 0 0 -27 2 6 1 Fe-57 0 0 -28 2 6 1 Fe-58 0 0 -29 2 6 1 Ni-58 0 0 -30 2 6 1 Ni-60 0 0 -31 2 6 1 Ni-61 0 0 -32 2 6 1 Ni-62 0 0 -33 2 6 1 Ni-64 0 0 -34 2 6 1 Mn-55 0 0 -35 2 6 1 Si-28 0 0 -36 2 6 1 Si-29 0 0 -37 2 6 1 Si-30 0 0 -38 2 6 1 Cr-50 0 0 -39 2 6 1 Cr-52 0 0 -40 2 6 1 Cr-53 0 0 -41 2 6 1 Cr-54 0 0 -0 2 6 2 H-1 0 0 -1 2 6 2 O-16 0 0 -2 2 6 2 B-10 0 0 -3 2 6 2 B-11 0 0 -4 2 6 2 Fe-54 0 0 -5 2 6 2 Fe-56 0 0 -6 2 6 2 Fe-57 0 0 -7 2 6 2 Fe-58 0 0 -8 2 6 2 Ni-58 0 0 -9 2 6 2 Ni-60 0 0 -10 2 6 2 Ni-61 0 0 -11 2 6 2 Ni-62 0 0 -12 2 6 2 Ni-64 0 0 -13 2 6 2 Mn-55 0 0 -14 2 6 2 Si-28 0 0 -15 2 6 2 Si-29 0 0 -16 2 6 2 Si-30 0 0 -17 2 6 2 Cr-50 0 0 -18 2 6 2 Cr-52 0 0 -19 2 6 2 Cr-53 0 0 -20 2 6 2 Cr-54 0 0 material group out nuclide mean std. dev. +26 5 2 Cu-65 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 6 1 H-1 0 0 +22 6 1 O-16 0 0 +23 6 1 B-10 0 0 +24 6 1 B-11 0 0 +25 6 1 Fe-54 0 0 +26 6 1 Fe-56 0 0 +27 6 1 Fe-57 0 0 +28 6 1 Fe-58 0 0 +29 6 1 Ni-58 0 0 +30 6 1 Ni-60 0 0 +31 6 1 Ni-61 0 0 +32 6 1 Ni-62 0 0 +33 6 1 Ni-64 0 0 +34 6 1 Mn-55 0 0 +35 6 1 Si-28 0 0 +36 6 1 Si-29 0 0 +37 6 1 Si-30 0 0 +38 6 1 Cr-50 0 0 +39 6 1 Cr-52 0 0 +40 6 1 Cr-53 0 0 +41 6 1 Cr-54 0 0 +0 6 2 H-1 0 0 +1 6 2 O-16 0 0 +2 6 2 B-10 0 0 +3 6 2 B-11 0 0 +4 6 2 Fe-54 0 0 +5 6 2 Fe-56 0 0 +6 6 2 Fe-57 0 0 +7 6 2 Fe-58 0 0 +8 6 2 Ni-58 0 0 +9 6 2 Ni-60 0 0 +10 6 2 Ni-61 0 0 +11 6 2 Ni-62 0 0 +12 6 2 Ni-64 0 0 +13 6 2 Mn-55 0 0 +14 6 2 Si-28 0 0 +15 6 2 Si-29 0 0 +16 6 2 Si-30 0 0 +17 6 2 Cr-50 0 0 +18 6 2 Cr-52 0 0 +19 6 2 Cr-53 0 0 +20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 6 1 1 H-1 0 0 +64 6 1 1 O-16 0 0 +65 6 1 1 B-10 0 0 +66 6 1 1 B-11 0 0 +67 6 1 1 Fe-54 0 0 +68 6 1 1 Fe-56 0 0 +69 6 1 1 Fe-57 0 0 +70 6 1 1 Fe-58 0 0 +71 6 1 1 Ni-58 0 0 +72 6 1 1 Ni-60 0 0 +73 6 1 1 Ni-61 0 0 +74 6 1 1 Ni-62 0 0 +75 6 1 1 Ni-64 0 0 +76 6 1 1 Mn-55 0 0 +77 6 1 1 Si-28 0 0 +78 6 1 1 Si-29 0 0 +79 6 1 1 Si-30 0 0 +80 6 1 1 Cr-50 0 0 +81 6 1 1 Cr-52 0 0 +82 6 1 1 Cr-53 0 0 +83 6 1 1 Cr-54 0 0 +42 6 1 2 H-1 0 0 +43 6 1 2 O-16 0 0 +44 6 1 2 B-10 0 0 +45 6 1 2 B-11 0 0 +46 6 1 2 Fe-54 0 0 +47 6 1 2 Fe-56 0 0 +48 6 1 2 Fe-57 0 0 +49 6 1 2 Fe-58 0 0 +50 6 1 2 Ni-58 0 0 +51 6 1 2 Ni-60 0 0 +52 6 1 2 Ni-61 0 0 +53 6 1 2 Ni-62 0 0 +54 6 1 2 Ni-64 0 0 +55 6 1 2 Mn-55 0 0 +56 6 1 2 Si-28 0 0 +57 6 1 2 Si-29 0 0 +58 6 1 2 Si-30 0 0 +59 6 1 2 Cr-50 0 0 +60 6 1 2 Cr-52 0 0 +61 6 1 2 Cr-53 0 0 +62 6 1 2 Cr-54 0 0 +21 6 2 1 H-1 0 0 +22 6 2 1 O-16 0 0 +23 6 2 1 B-10 0 0 +24 6 2 1 B-11 0 0 +25 6 2 1 Fe-54 0 0 +26 6 2 1 Fe-56 0 0 +27 6 2 1 Fe-57 0 0 +28 6 2 1 Fe-58 0 0 +29 6 2 1 Ni-58 0 0 +30 6 2 1 Ni-60 0 0 +31 6 2 1 Ni-61 0 0 +32 6 2 1 Ni-62 0 0 +33 6 2 1 Ni-64 0 0 +34 6 2 1 Mn-55 0 0 +35 6 2 1 Si-28 0 0 +36 6 2 1 Si-29 0 0 +37 6 2 1 Si-30 0 0 +38 6 2 1 Cr-50 0 0 +39 6 2 1 Cr-52 0 0 +40 6 2 1 Cr-53 0 0 +41 6 2 1 Cr-54 0 0 +0 6 2 2 H-1 0 0 +1 6 2 2 O-16 0 0 +2 6 2 2 B-10 0 0 +3 6 2 2 B-11 0 0 +4 6 2 2 Fe-54 0 0 +5 6 2 2 Fe-56 0 0 +6 6 2 2 Fe-57 0 0 +7 6 2 2 Fe-58 0 0 +8 6 2 2 Ni-58 0 0 +9 6 2 2 Ni-60 0 0 +10 6 2 2 Ni-61 0 0 +11 6 2 2 Ni-62 0 0 +12 6 2 2 Ni-64 0 0 +13 6 2 2 Mn-55 0 0 +14 6 2 2 Si-28 0 0 +15 6 2 2 Si-29 0 0 +16 6 2 2 Si-30 0 0 +17 6 2 2 Cr-50 0 0 +18 6 2 2 Cr-52 0 0 +19 6 2 2 Cr-53 0 0 +20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev. 21 6 1 H-1 0 0 22 6 1 O-16 0 0 23 6 1 B-10 0 0 @@ -1368,175 +1368,175 @@ 17 8 2 Cr-50 0 0 18 8 2 Cr-52 0 0 19 8 2 Cr-53 0 0 -20 8 2 Cr-54 0 0 group in material nuclide mean std. dev. -21 1 9 H-1 0.106160 0.179178 -22 1 9 O-16 0.272020 0.171699 -23 1 9 B-10 0.000000 0.000000 -24 1 9 B-11 0.000000 0.000000 -25 1 9 Fe-54 0.000000 0.000000 -26 1 9 Fe-56 0.000000 0.000000 -27 1 9 Fe-57 0.000000 0.000000 -28 1 9 Fe-58 0.000000 0.000000 -29 1 9 Ni-58 0.000000 0.000000 -30 1 9 Ni-60 0.000000 0.000000 -31 1 9 Ni-61 0.000000 0.000000 -32 1 9 Ni-62 0.000000 0.000000 -33 1 9 Ni-64 0.000000 0.000000 -34 1 9 Mn-55 0.085133 0.082479 -35 1 9 Si-28 0.000000 0.000000 -36 1 9 Si-29 0.000000 0.000000 -37 1 9 Si-30 0.000000 0.000000 -38 1 9 Cr-50 0.000000 0.000000 -39 1 9 Cr-52 0.000000 0.000000 -40 1 9 Cr-53 0.040723 0.079827 -41 1 9 Cr-54 0.000000 0.000000 -0 2 9 H-1 1.417955 2.158027 -1 2 9 O-16 0.000000 0.000000 -2 2 9 B-10 0.269141 0.380622 -3 2 9 B-11 0.000000 0.000000 -4 2 9 Fe-54 0.000000 0.000000 -5 2 9 Fe-56 0.000000 0.000000 -6 2 9 Fe-57 0.000000 0.000000 -7 2 9 Fe-58 0.000000 0.000000 -8 2 9 Ni-58 0.000000 0.000000 -9 2 9 Ni-60 0.000000 0.000000 -10 2 9 Ni-61 0.000000 0.000000 -11 2 9 Ni-62 0.000000 0.000000 -12 2 9 Ni-64 0.000000 0.000000 -13 2 9 Mn-55 0.000000 0.000000 -14 2 9 Si-28 0.000000 0.000000 -15 2 9 Si-29 0.000000 0.000000 -16 2 9 Si-30 0.000000 0.000000 -17 2 9 Cr-50 0.000000 0.000000 -18 2 9 Cr-52 0.000000 0.000000 -19 2 9 Cr-53 0.000000 0.000000 -20 2 9 Cr-54 0.000000 0.000000 group in material nuclide mean std. dev. -21 1 9 H-1 0 0 -22 1 9 O-16 0 0 -23 1 9 B-10 0 0 -24 1 9 B-11 0 0 -25 1 9 Fe-54 0 0 -26 1 9 Fe-56 0 0 -27 1 9 Fe-57 0 0 -28 1 9 Fe-58 0 0 -29 1 9 Ni-58 0 0 -30 1 9 Ni-60 0 0 -31 1 9 Ni-61 0 0 -32 1 9 Ni-62 0 0 -33 1 9 Ni-64 0 0 -34 1 9 Mn-55 0 0 -35 1 9 Si-28 0 0 -36 1 9 Si-29 0 0 -37 1 9 Si-30 0 0 -38 1 9 Cr-50 0 0 -39 1 9 Cr-52 0 0 -40 1 9 Cr-53 0 0 -41 1 9 Cr-54 0 0 -0 2 9 H-1 0 0 -1 2 9 O-16 0 0 -2 2 9 B-10 0 0 -3 2 9 B-11 0 0 -4 2 9 Fe-54 0 0 -5 2 9 Fe-56 0 0 -6 2 9 Fe-57 0 0 -7 2 9 Fe-58 0 0 -8 2 9 Ni-58 0 0 -9 2 9 Ni-60 0 0 -10 2 9 Ni-61 0 0 -11 2 9 Ni-62 0 0 -12 2 9 Ni-64 0 0 -13 2 9 Mn-55 0 0 -14 2 9 Si-28 0 0 -15 2 9 Si-29 0 0 -16 2 9 Si-30 0 0 -17 2 9 Cr-50 0 0 -18 2 9 Cr-52 0 0 -19 2 9 Cr-53 0 0 -20 2 9 Cr-54 0 0 group in material group out nuclide mean std. dev. -63 1 9 1 H-1 0.106160 0.179178 -64 1 9 1 O-16 0.272020 0.171699 -65 1 9 1 B-10 0.000000 0.000000 -66 1 9 1 B-11 0.000000 0.000000 -67 1 9 1 Fe-54 0.000000 0.000000 -68 1 9 1 Fe-56 0.000000 0.000000 -69 1 9 1 Fe-57 0.000000 0.000000 -70 1 9 1 Fe-58 0.000000 0.000000 -71 1 9 1 Ni-58 0.000000 0.000000 -72 1 9 1 Ni-60 0.000000 0.000000 -73 1 9 1 Ni-61 0.000000 0.000000 -74 1 9 1 Ni-62 0.000000 0.000000 -75 1 9 1 Ni-64 0.000000 0.000000 -76 1 9 1 Mn-55 0.085133 0.082479 -77 1 9 1 Si-28 0.000000 0.000000 -78 1 9 1 Si-29 0.000000 0.000000 -79 1 9 1 Si-30 0.000000 0.000000 -80 1 9 1 Cr-50 0.000000 0.000000 -81 1 9 1 Cr-52 0.000000 0.000000 -82 1 9 1 Cr-53 0.040723 0.079827 -83 1 9 1 Cr-54 0.000000 0.000000 -42 1 9 2 H-1 0.000000 0.000000 -43 1 9 2 O-16 0.000000 0.000000 -44 1 9 2 B-10 0.000000 0.000000 -45 1 9 2 B-11 0.000000 0.000000 -46 1 9 2 Fe-54 0.000000 0.000000 -47 1 9 2 Fe-56 0.000000 0.000000 -48 1 9 2 Fe-57 0.000000 0.000000 -49 1 9 2 Fe-58 0.000000 0.000000 -50 1 9 2 Ni-58 0.000000 0.000000 -51 1 9 2 Ni-60 0.000000 0.000000 -52 1 9 2 Ni-61 0.000000 0.000000 -53 1 9 2 Ni-62 0.000000 0.000000 -54 1 9 2 Ni-64 0.000000 0.000000 -55 1 9 2 Mn-55 0.000000 0.000000 -56 1 9 2 Si-28 0.000000 0.000000 -57 1 9 2 Si-29 0.000000 0.000000 -58 1 9 2 Si-30 0.000000 0.000000 -59 1 9 2 Cr-50 0.000000 0.000000 -60 1 9 2 Cr-52 0.000000 0.000000 -61 1 9 2 Cr-53 0.000000 0.000000 -62 1 9 2 Cr-54 0.000000 0.000000 -21 2 9 1 H-1 0.000000 0.000000 -22 2 9 1 O-16 0.000000 0.000000 -23 2 9 1 B-10 0.000000 0.000000 -24 2 9 1 B-11 0.000000 0.000000 -25 2 9 1 Fe-54 0.000000 0.000000 -26 2 9 1 Fe-56 0.000000 0.000000 -27 2 9 1 Fe-57 0.000000 0.000000 -28 2 9 1 Fe-58 0.000000 0.000000 -29 2 9 1 Ni-58 0.000000 0.000000 -30 2 9 1 Ni-60 0.000000 0.000000 -31 2 9 1 Ni-61 0.000000 0.000000 -32 2 9 1 Ni-62 0.000000 0.000000 -33 2 9 1 Ni-64 0.000000 0.000000 -34 2 9 1 Mn-55 0.000000 0.000000 -35 2 9 1 Si-28 0.000000 0.000000 -36 2 9 1 Si-29 0.000000 0.000000 -37 2 9 1 Si-30 0.000000 0.000000 -38 2 9 1 Cr-50 0.000000 0.000000 -39 2 9 1 Cr-52 0.000000 0.000000 -40 2 9 1 Cr-53 0.000000 0.000000 -41 2 9 1 Cr-54 0.000000 0.000000 -0 2 9 2 H-1 1.417955 2.158027 -1 2 9 2 O-16 0.000000 0.000000 -2 2 9 2 B-10 0.000000 0.000000 -3 2 9 2 B-11 0.000000 0.000000 -4 2 9 2 Fe-54 0.000000 0.000000 -5 2 9 2 Fe-56 0.000000 0.000000 -6 2 9 2 Fe-57 0.000000 0.000000 -7 2 9 2 Fe-58 0.000000 0.000000 -8 2 9 2 Ni-58 0.000000 0.000000 -9 2 9 2 Ni-60 0.000000 0.000000 -10 2 9 2 Ni-61 0.000000 0.000000 -11 2 9 2 Ni-62 0.000000 0.000000 -12 2 9 2 Ni-64 0.000000 0.000000 -13 2 9 2 Mn-55 0.000000 0.000000 -14 2 9 2 Si-28 0.000000 0.000000 -15 2 9 2 Si-29 0.000000 0.000000 -16 2 9 2 Si-30 0.000000 0.000000 -17 2 9 2 Cr-50 0.000000 0.000000 -18 2 9 2 Cr-52 0.000000 0.000000 -19 2 9 2 Cr-53 0.000000 0.000000 -20 2 9 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. +20 8 2 Cr-54 0 0 material group in nuclide mean std. dev. +21 9 1 H-1 0.106160 0.179178 +22 9 1 O-16 0.272020 0.171699 +23 9 1 B-10 0.000000 0.000000 +24 9 1 B-11 0.000000 0.000000 +25 9 1 Fe-54 0.000000 0.000000 +26 9 1 Fe-56 0.000000 0.000000 +27 9 1 Fe-57 0.000000 0.000000 +28 9 1 Fe-58 0.000000 0.000000 +29 9 1 Ni-58 0.000000 0.000000 +30 9 1 Ni-60 0.000000 0.000000 +31 9 1 Ni-61 0.000000 0.000000 +32 9 1 Ni-62 0.000000 0.000000 +33 9 1 Ni-64 0.000000 0.000000 +34 9 1 Mn-55 0.085133 0.082479 +35 9 1 Si-28 0.000000 0.000000 +36 9 1 Si-29 0.000000 0.000000 +37 9 1 Si-30 0.000000 0.000000 +38 9 1 Cr-50 0.000000 0.000000 +39 9 1 Cr-52 0.000000 0.000000 +40 9 1 Cr-53 0.040723 0.079827 +41 9 1 Cr-54 0.000000 0.000000 +0 9 2 H-1 1.417955 2.158027 +1 9 2 O-16 0.000000 0.000000 +2 9 2 B-10 0.269141 0.380622 +3 9 2 B-11 0.000000 0.000000 +4 9 2 Fe-54 0.000000 0.000000 +5 9 2 Fe-56 0.000000 0.000000 +6 9 2 Fe-57 0.000000 0.000000 +7 9 2 Fe-58 0.000000 0.000000 +8 9 2 Ni-58 0.000000 0.000000 +9 9 2 Ni-60 0.000000 0.000000 +10 9 2 Ni-61 0.000000 0.000000 +11 9 2 Ni-62 0.000000 0.000000 +12 9 2 Ni-64 0.000000 0.000000 +13 9 2 Mn-55 0.000000 0.000000 +14 9 2 Si-28 0.000000 0.000000 +15 9 2 Si-29 0.000000 0.000000 +16 9 2 Si-30 0.000000 0.000000 +17 9 2 Cr-50 0.000000 0.000000 +18 9 2 Cr-52 0.000000 0.000000 +19 9 2 Cr-53 0.000000 0.000000 +20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev. +21 9 1 H-1 0 0 +22 9 1 O-16 0 0 +23 9 1 B-10 0 0 +24 9 1 B-11 0 0 +25 9 1 Fe-54 0 0 +26 9 1 Fe-56 0 0 +27 9 1 Fe-57 0 0 +28 9 1 Fe-58 0 0 +29 9 1 Ni-58 0 0 +30 9 1 Ni-60 0 0 +31 9 1 Ni-61 0 0 +32 9 1 Ni-62 0 0 +33 9 1 Ni-64 0 0 +34 9 1 Mn-55 0 0 +35 9 1 Si-28 0 0 +36 9 1 Si-29 0 0 +37 9 1 Si-30 0 0 +38 9 1 Cr-50 0 0 +39 9 1 Cr-52 0 0 +40 9 1 Cr-53 0 0 +41 9 1 Cr-54 0 0 +0 9 2 H-1 0 0 +1 9 2 O-16 0 0 +2 9 2 B-10 0 0 +3 9 2 B-11 0 0 +4 9 2 Fe-54 0 0 +5 9 2 Fe-56 0 0 +6 9 2 Fe-57 0 0 +7 9 2 Fe-58 0 0 +8 9 2 Ni-58 0 0 +9 9 2 Ni-60 0 0 +10 9 2 Ni-61 0 0 +11 9 2 Ni-62 0 0 +12 9 2 Ni-64 0 0 +13 9 2 Mn-55 0 0 +14 9 2 Si-28 0 0 +15 9 2 Si-29 0 0 +16 9 2 Si-30 0 0 +17 9 2 Cr-50 0 0 +18 9 2 Cr-52 0 0 +19 9 2 Cr-53 0 0 +20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev. +63 9 1 1 H-1 0.106160 0.179178 +64 9 1 1 O-16 0.272020 0.171699 +65 9 1 1 B-10 0.000000 0.000000 +66 9 1 1 B-11 0.000000 0.000000 +67 9 1 1 Fe-54 0.000000 0.000000 +68 9 1 1 Fe-56 0.000000 0.000000 +69 9 1 1 Fe-57 0.000000 0.000000 +70 9 1 1 Fe-58 0.000000 0.000000 +71 9 1 1 Ni-58 0.000000 0.000000 +72 9 1 1 Ni-60 0.000000 0.000000 +73 9 1 1 Ni-61 0.000000 0.000000 +74 9 1 1 Ni-62 0.000000 0.000000 +75 9 1 1 Ni-64 0.000000 0.000000 +76 9 1 1 Mn-55 0.085133 0.082479 +77 9 1 1 Si-28 0.000000 0.000000 +78 9 1 1 Si-29 0.000000 0.000000 +79 9 1 1 Si-30 0.000000 0.000000 +80 9 1 1 Cr-50 0.000000 0.000000 +81 9 1 1 Cr-52 0.000000 0.000000 +82 9 1 1 Cr-53 0.040723 0.079827 +83 9 1 1 Cr-54 0.000000 0.000000 +42 9 1 2 H-1 0.000000 0.000000 +43 9 1 2 O-16 0.000000 0.000000 +44 9 1 2 B-10 0.000000 0.000000 +45 9 1 2 B-11 0.000000 0.000000 +46 9 1 2 Fe-54 0.000000 0.000000 +47 9 1 2 Fe-56 0.000000 0.000000 +48 9 1 2 Fe-57 0.000000 0.000000 +49 9 1 2 Fe-58 0.000000 0.000000 +50 9 1 2 Ni-58 0.000000 0.000000 +51 9 1 2 Ni-60 0.000000 0.000000 +52 9 1 2 Ni-61 0.000000 0.000000 +53 9 1 2 Ni-62 0.000000 0.000000 +54 9 1 2 Ni-64 0.000000 0.000000 +55 9 1 2 Mn-55 0.000000 0.000000 +56 9 1 2 Si-28 0.000000 0.000000 +57 9 1 2 Si-29 0.000000 0.000000 +58 9 1 2 Si-30 0.000000 0.000000 +59 9 1 2 Cr-50 0.000000 0.000000 +60 9 1 2 Cr-52 0.000000 0.000000 +61 9 1 2 Cr-53 0.000000 0.000000 +62 9 1 2 Cr-54 0.000000 0.000000 +21 9 2 1 H-1 0.000000 0.000000 +22 9 2 1 O-16 0.000000 0.000000 +23 9 2 1 B-10 0.000000 0.000000 +24 9 2 1 B-11 0.000000 0.000000 +25 9 2 1 Fe-54 0.000000 0.000000 +26 9 2 1 Fe-56 0.000000 0.000000 +27 9 2 1 Fe-57 0.000000 0.000000 +28 9 2 1 Fe-58 0.000000 0.000000 +29 9 2 1 Ni-58 0.000000 0.000000 +30 9 2 1 Ni-60 0.000000 0.000000 +31 9 2 1 Ni-61 0.000000 0.000000 +32 9 2 1 Ni-62 0.000000 0.000000 +33 9 2 1 Ni-64 0.000000 0.000000 +34 9 2 1 Mn-55 0.000000 0.000000 +35 9 2 1 Si-28 0.000000 0.000000 +36 9 2 1 Si-29 0.000000 0.000000 +37 9 2 1 Si-30 0.000000 0.000000 +38 9 2 1 Cr-50 0.000000 0.000000 +39 9 2 1 Cr-52 0.000000 0.000000 +40 9 2 1 Cr-53 0.000000 0.000000 +41 9 2 1 Cr-54 0.000000 0.000000 +0 9 2 2 H-1 1.417955 2.158027 +1 9 2 2 O-16 0.000000 0.000000 +2 9 2 2 B-10 0.000000 0.000000 +3 9 2 2 B-11 0.000000 0.000000 +4 9 2 2 Fe-54 0.000000 0.000000 +5 9 2 2 Fe-56 0.000000 0.000000 +6 9 2 2 Fe-57 0.000000 0.000000 +7 9 2 2 Fe-58 0.000000 0.000000 +8 9 2 2 Ni-58 0.000000 0.000000 +9 9 2 2 Ni-60 0.000000 0.000000 +10 9 2 2 Ni-61 0.000000 0.000000 +11 9 2 2 Ni-62 0.000000 0.000000 +12 9 2 2 Ni-64 0.000000 0.000000 +13 9 2 2 Mn-55 0.000000 0.000000 +14 9 2 2 Si-28 0.000000 0.000000 +15 9 2 2 Si-29 0.000000 0.000000 +16 9 2 2 Si-30 0.000000 0.000000 +17 9 2 2 Cr-50 0.000000 0.000000 +18 9 2 2 Cr-52 0.000000 0.000000 +19 9 2 2 Cr-53 0.000000 0.000000 +20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev. 21 9 1 H-1 0 0 22 9 1 O-16 0 0 23 9 1 B-10 0 0 From fca533e3d1ee24f12448e32feb049f3724e9411c Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 25 Nov 2015 12:45:57 -0500 Subject: [PATCH 483/519] Added __eq__ and __ne__ method to Cell, Universe, Lattice and Material classes in Python API --- openmc/material.py | 23 ++++++++++ openmc/region.py | 11 +++++ openmc/universe.py | 109 ++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 133 insertions(+), 10 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 292fc82ca7..caad3a1cd6 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -83,6 +83,29 @@ class Material(object): # If specified, this file will be used instead of composition values self._distrib_otf_file = None + def __eq__(self, other): + if not isinstance(other, Material): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + elif self.density != other.density: + return False + elif self.density_units != other.density_units: + return False + elif self._nuclides != other.nuclides: + return False + elif self._elements != other._elements: + return False + elif self._sab != other._sab: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'Material\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) diff --git a/openmc/region.py b/openmc/region.py index 97069d797b..936e6e5121 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -29,6 +29,17 @@ class Region(object): def __str__(self): return '' + def __eq__(self, other): + if not isinstance(other, type(self)): + return False + elif str(self) != str(other): + return False + else: + return True + + def __ne__(self, other): + return not self == other + @staticmethod def from_expression(expression, surfaces): """Generate a region given an infix expression. diff --git a/openmc/universe.py b/openmc/universe.py index b74dde656d..1fb29e2603 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -73,6 +73,29 @@ class Cell(object): self._translation = None self._offsets = None + def __eq__(self, other): + if not isinstance(other, Cell): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + # FIXME: This won't work for materials fills since OpenMC only outputs + # nuclide densities in units of atom/b-cm irregardless of input units + # elif self.fill != other.fill: + # return False + elif self.region != other.region: + return False + elif self.rotation != other.rotation: + return False + elif self.translation != other.translation: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'Cell\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -443,6 +466,31 @@ class Universe(object): self._cell_offsets = OrderedDict() self._num_regions = 0 + def __eq__(self, other): + if not isinstance(other, Universe): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + elif self.cells != other.cells: + return False + else: + return True + + def __ne__(self, other): + return not self == other + + def __repr__(self): + string = 'Universe\n' + string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + string += '{0: <16}{1}{2}\n'.format('\tCells', '=\t', + list(self._cells.keys())) + string += '{0: <16}{1}{2}\n'.format('\t# Regions', '=\t', + self._num_regions) + return string + @property def id(self): return self._id @@ -630,16 +678,6 @@ class Universe(object): return universes - def __repr__(self): - string = 'Universe\n' - string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}\n'.format('\tCells', '=\t', - list(self._cells.keys())) - string += '{0: <16}{1}{2}\n'.format('\t# Regions', '=\t', - self._num_regions) - return string - def create_xml_subelement(self, xml_element): # Iterate over all Cells @@ -695,6 +733,25 @@ class Lattice(object): self._outer = None self._universes = None + def __eq__(self, other): + if not isinstance(other, Lattice): + return False + elif self.id != other.id: + return False + elif self.name != other.name: + return False + elif self.pitch != other.pitch: + return False + elif self.outer != other.outer: + return False + elif self.universes != other.universes: + return False + else: + return True + + def __ne__(self, other): + return not self == other + @property def id(self): return self._id @@ -894,6 +951,21 @@ class RectLattice(Lattice): self._lower_left = None self._offsets = None + def __eq__(self, other): + if not isinstance(other, RectLattice): + return False + elif not super(RectLattice, self).__eq__(other): + return False + elif self.dimension != other.dimension: + return False + elif self.lower_left != other.lower_left: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'RectLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -1111,6 +1183,23 @@ class HexLattice(Lattice): self._num_axial = None self._center = None + def __eq__(self, other): + if not isinstance(other, HexLattice): + return False + elif not super(HexLattice, self).__eq__(other): + return False + elif self.num_rings != other.num_rings: + return False + elif self.num_axial != other.num_axial: + return False + elif self.center != other.center: + return False + else: + return True + + def __ne__(self, other): + return not self == other + def __repr__(self): string = 'HexLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) From 8c0d269843bb222a61e46e488a96b3b58c5def6e Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 25 Nov 2015 13:44:20 -0500 Subject: [PATCH 484/519] Commented out material density and nuclides comparision on __eq__ - need to confer with @paulromano on how to properly implement this --- openmc/material.py | 18 ++++++++++-------- openmc/universe.py | 6 ++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index caad3a1cd6..5138cc59e2 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -90,14 +90,16 @@ class Material(object): return False elif self.name != other.name: return False - elif self.density != other.density: - return False - elif self.density_units != other.density_units: - return False - elif self._nuclides != other.nuclides: - return False - elif self._elements != other._elements: - return False + # FIXME: This won't work since OpenMC only outputs densities in units + # of atom/b-cm in summary.h5 irregardless of input units, and it we + # cannot compute the sum percent in Python since we lack AWR + # elif self.density != other.density: + # return False + # FIXME: The nuclide densities are different in summary.h5??? + # elif self._nuclides != other._nuclides: + # return False + # elif self._elements != other._elements: + # return False elif self._sab != other._sab: return False else: diff --git a/openmc/universe.py b/openmc/universe.py index 1fb29e2603..0eb77cdf9a 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -80,10 +80,8 @@ class Cell(object): return False elif self.name != other.name: return False - # FIXME: This won't work for materials fills since OpenMC only outputs - # nuclide densities in units of atom/b-cm irregardless of input units - # elif self.fill != other.fill: - # return False + elif self.fill != other.fill: + return False elif self.region != other.region: return False elif self.rotation != other.rotation: From a7c923a82c8bfc6debc3042de9c886a7d8d52b7b Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 25 Nov 2015 14:15:54 -0500 Subject: [PATCH 485/519] The openmc geometry setter for the mgxs library now clears any old opencg geometry --- openmc/mgxs/library.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index fa49d24e64..0bf9732549 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -203,6 +203,7 @@ class Library(object): def openmc_geometry(self, openmc_geometry): cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) self._openmc_geometry = openmc_geometry + self._opencg_geometry = None @name.setter def name(self, name): @@ -362,7 +363,6 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry - self._opencg_geometry = None # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From d1bec8a814e22f2c396e21dad8baad4272948eb8 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 25 Nov 2015 14:22:28 -0800 Subject: [PATCH 486/519] updated tally-arithmetic.ipynb notebook based on updates to tally arithmetic --- .../pythonapi/examples/tally-arithmetic.ipynb | 508 +++++++++--------- 1 file changed, 268 insertions(+), 240 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index fce805f183..3ec974e057 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -363,7 +363,26 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMjhUMjE6MTU6MDYtMDQ6MDDSDNQdAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTI4\nVDIxOjE1OjA2LTA0OjAwo1FsoQAAAABJRU5ErkJggg==\n", + "image/png": [ + "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\n", + "AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\n", + "QYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98LGQ4UM+6dthcAAALKSURBVGje7dpLcqQwDAbgHHE2\n", + "YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n", + "+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\n", + "nl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n", + "/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n", + "6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\n", + "vjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\n", + "dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\n", + "ACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\n", + "vY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n", + "+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\n", + "QBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n", + "9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n", + "8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTEtMjVUMTQ6MjA6\n", + "NTEtMDg6MDDVsKLDAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTExLTI1VDE0OjIwOjUxLTA4OjAw\n", + "pO0afwAAAABJRU5ErkJggg==\n" + ], "text/plain": [ "" ] @@ -573,8 +592,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 21:15:07\n", + " Git SHA1: 74ffcb447521c968fb64fdaa63e40598783f2fba\n", + " Date/Time: 2015-11-25 14:20:51\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -615,13 +634,13 @@ " 11/1 1.07867 1.05536 +/- 0.01277\n", " 12/1 1.04203 1.05345 +/- 0.01096\n", " 13/1 1.04482 1.05237 +/- 0.00955\n", - " 14/1 1.04117 1.05113 +/- 0.00852\n", - " 15/1 1.07581 1.05360 +/- 0.00801\n", - " 16/1 1.04235 1.05257 +/- 0.00731\n", - " 17/1 1.02710 1.05045 +/- 0.00701\n", - " 18/1 1.01970 1.04809 +/- 0.00687\n", - " 19/1 1.01022 1.04538 +/- 0.00691\n", - " 20/1 1.01449 1.04332 +/- 0.00675\n", + " 14/1 1.04116 1.05113 +/- 0.00852\n", + " 15/1 1.07569 1.05358 +/- 0.00800\n", + " 16/1 1.04188 1.05252 +/- 0.00732\n", + " 17/1 1.03775 1.05129 +/- 0.00679\n", + " 18/1 0.98462 1.04616 +/- 0.00808\n", + " 19/1 1.08613 1.04902 +/- 0.00801\n", + " 20/1 1.00571 1.04613 +/- 0.00800\n", " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", @@ -631,27 +650,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.3800E-01 seconds\n", - " Reading cross sections = 1.3500E-01 seconds\n", - " Total time in simulation = 2.3556E+01 seconds\n", - " Time in transport only = 2.3532E+01 seconds\n", - " Time in inactive batches = 3.1100E+00 seconds\n", - " Time in active batches = 2.0446E+01 seconds\n", + " Total time for initialization = 7.9600E-01 seconds\n", + " Reading cross sections = 2.1200E-01 seconds\n", + " Total time in simulation = 1.8740E+01 seconds\n", + " Time in transport only = 1.8727E+01 seconds\n", + " Time in inactive batches = 2.5970E+00 seconds\n", + " Time in active batches = 1.6143E+01 seconds\n", " Time synchronizing fission bank = 2.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 2.4210E+01 seconds\n", - " Calculation Rate (inactive) = 4019.29 neutrons/second\n", - " Calculation Rate (active) = 1834.10 neutrons/second\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 1.9553E+01 seconds\n", + " Calculation Rate (inactive) = 4813.25 neutrons/second\n", + " Calculation Rate (active) = 2322.99 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.03935 +/- 0.00682\n", - " k-effective (Track-length) = 1.04332 +/- 0.00675\n", - " k-effective (Absorption) = 1.03845 +/- 0.00598\n", - " Combined k-effective = 1.04024 +/- 0.00523\n", + " k-effective (Collision) = 1.04597 +/- 0.00663\n", + " k-effective (Track-length) = 1.04613 +/- 0.00800\n", + " k-effective (Absorption) = 1.04087 +/- 0.00627\n", + " Combined k-effective = 1.04322 +/- 0.00570\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -742,7 +761,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "
11total0.0769130.0010130.0769700.001012
6212total0.0877150.0003430.0878760.000344
6113total0.0004170.0004180.000023
\n", " \n", " \n", @@ -756,10 +775,10 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
0total(nu-fission / absorption)1.0401660.009069 total (nu-fission / absorption) 1.040687 0.010913
\n", @@ -767,7 +786,7 @@ ], "text/plain": [ " nuclide score mean std. dev.\n", - "0 total (nu-fission / absorption) 1.040166 0.009069" + "0 total (nu-fission / absorption) 1.040687 0.010913" ] }, "execution_count": 26, @@ -802,7 +821,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -817,19 +836,19 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
0(0.0e+00 - 6.2e-01)totalabsorption0.959380.008187 (0.0e+00 - 6.2e-01) total absorption 0.959302 0.010033
\n", "
" ], "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total absorption 0.95938 0.008187" + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total absorption 0.959302 0.010033" ] }, "execution_count": 27, @@ -862,11 +881,12 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -876,18 +896,19 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
energy [MeV]nuclidescoremean
0totalnu-fission1.0908990.010602 (0.0e+00 - 6.2e-01) total nu-fission 1.09103 0.012491
\n", "
" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total nu-fission 1.090899 0.010602" + " energy [MeV] nuclide score mean std. dev.\n", + "0 (0.0e+00 - 6.2e-01) total nu-fission 1.09103 0.012491" ] }, "execution_count": 28, @@ -921,7 +942,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -937,12 +958,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8034130.007031 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803182 0.008664
\n", @@ -950,7 +971,7 @@ ], "text/plain": [ " energy [MeV] cell nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803413 0.007031" + "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803182 0.008664" ] }, "execution_count": 29, @@ -982,12 +1003,13 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -997,19 +1019,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
energy [MeV]cellnuclidescoremean
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2370530.011765 (0.0e+00 - 6.2e-01) 10000 total (nu-fission / absorption) 1.237982 0.014179
\n", "
" ], "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.237053 0.011765" + " energy [MeV] cell nuclide score mean \\\n", + "0 (0.0e+00 - 6.2e-01) 10000 total (nu-fission / absorption) 1.237982 \n", + "\n", + " std. dev. \n", + "0 0.014179 " ] }, "execution_count": 30, @@ -1040,12 +1066,13 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", @@ -1055,22 +1082,23 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
energy [MeV]cellnuclidescoremean
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0401660.019018 (0.0e+00 - 6.2e-01) 10000 total (((absorption * nu-fission) * absorption) * (n... 1.040687 0.022989
\n", "
" ], "text/plain": [ - " energy [MeV] nuclide \\\n", - "0 (0.0e+00 - 6.2e-01) total \n", + " energy [MeV] cell nuclide \\\n", + "0 (0.0e+00 - 6.2e-01) 10000 total \n", "\n", " score mean std. dev. \n", - "0 (((absorption * nu-fission) * absorption) * (n... 1.040166 0.019018 " + "0 (((absorption * nu-fission) * absorption) * (n... 1.040687 0.022989 " ] }, "execution_count": 31, @@ -1118,7 +1146,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1134,100 +1162,100 @@ " \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", + " \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", - " \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", " \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", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.657029e-077.377419e-09 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) 0.000001 8.078651e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099891e-012.303838e-03 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) 0.209990 2.449396e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.564204e-013.951669e-03 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) 0.356117 4.364366e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.555330e-036.101004e-05 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) 0.005555 6.495710e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.154887e-038.053460e-05 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) 0.007190 7.596666e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.277701e-011.079289e-03 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) 0.227843 1.024510e-03
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.066738e-035.254797e-05 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) 0.008086 6.251590e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.366802e-031.647058e-05 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) 0.003365 1.646663e-05
\n", "
" ], "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", - "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", - "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", - "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", - "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", - "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", - "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", - "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", + " cell energy [MeV] nuclide score mean \\\n", + "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) 0.000001 \n", + "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) 0.209990 \n", + "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) 0.356117 \n", + "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) 0.005555 \n", + "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) 0.007190 \n", + "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) 0.227843 \n", + "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) 0.008086 \n", + "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) 0.003365 \n", "\n", - " mean std. dev. \n", - "0 6.657029e-07 7.377419e-09 \n", - "1 2.099891e-01 2.303838e-03 \n", - "2 3.564204e-01 3.951669e-03 \n", - "3 5.555330e-03 6.101004e-05 \n", - "4 7.154887e-03 8.053460e-05 \n", - "5 2.277701e-01 1.079289e-03 \n", - "6 8.066738e-03 5.254797e-05 \n", - "7 3.366802e-03 1.647058e-05 " + " std. dev. \n", + "0 8.078651e-09 \n", + "1 2.449396e-03 \n", + "2 4.364366e-03 \n", + "3 6.495710e-05 \n", + "4 7.596666e-05 \n", + "5 1.024510e-03 \n", + "6 6.251590e-05 \n", + "7 1.646663e-05 " ] }, "execution_count": 33, @@ -1258,11 +1286,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 6.65702880e-07]\n", - " [ 3.56420449e-01]]\n", + "[[[ 6.65302296e-07]\n", + " [ 3.56116716e-01]]\n", "\n", - " [[ 7.15488656e-03]\n", - " [ 8.06673774e-03]]]\n" + " [[ 7.19004460e-03]\n", + " [ 8.08598751e-03]]]\n" ] } ], @@ -1290,9 +1318,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00555533]]\n", + "[[[ 0.00555516]]\n", "\n", - " [[ 0.0033668 ]]]\n" + " [[ 0.00336498]]]\n" ] } ], @@ -1314,8 +1342,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.22777006]\n", - " [ 0.0033668 ]]]\n" + "[[[ 0.22784316]\n", + " [ 0.00336498]]]\n" ] } ], @@ -1344,7 +1372,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1360,39 +1388,39 @@ " \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", + " \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", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.283958e-08 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.450189e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8685536.880390e-03 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.870882 7.895515e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0821498.837250e-04 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082484 8.253437e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0926185.195308e-04 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092762 6.444580e-04
\n", @@ -1400,10 +1428,10 @@ ], "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.283958e-08\n", - "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.868553 6.880390e-03\n", - "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082149 8.837250e-04\n", - "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092618 5.195308e-04" + "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.450189e-08\n", + "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.870882 7.895515e-03\n", + "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082484 8.253437e-04\n", + "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092762 6.444580e-04" ] }, "execution_count": 37, @@ -1427,7 +1455,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "\n", " \n", " \n", @@ -1443,84 +1471,84 @@ " \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", + " \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", - " \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", " \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", + " \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", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
010002(1.0e-08 - 1.1e-07)H-1scatter4.6193980.040124 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.630154 0.044512
110002(1.1e-07 - 1.2e-06)H-1scatter2.0307570.011239 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.042984 0.011429
210002(1.2e-06 - 1.3e-05)H-1scatter1.6584880.009777 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.657517 0.008617
310002(1.3e-05 - 1.4e-04)H-1scatter1.8530020.007378 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.863326 0.008848
410002(1.4e-04 - 1.5e-03)H-1scatter2.0507730.012484 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.043916 0.014195
510002(1.5e-03 - 1.6e-02)H-1scatter2.1317590.007821 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.134458 0.007561
610002(1.6e-02 - 1.7e-01)H-1scatter2.2137100.015159 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.209947 0.013848
710002(1.7e-01 - 1.9e+00)H-1scatter2.0119250.009406 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.006967 0.009368
810002(1.9e+00 - 2.0e+01)H-1scatter0.3712800.003949 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373895 0.002964
\n", @@ -1528,15 +1556,15 @@ ], "text/plain": [ " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.619398 0.040124\n", - "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.030757 0.011239\n", - "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.658488 0.009777\n", - "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.853002 0.007378\n", - "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.050773 0.012484\n", - "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.131759 0.007821\n", - "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.213710 0.015159\n", - "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.011925 0.009406\n", - "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.371280 0.003949" + "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.630154 0.044512\n", + "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.042984 0.011429\n", + "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.657517 0.008617\n", + "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.863326 0.008848\n", + "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.043916 0.014195\n", + "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.134458 0.007561\n", + "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.209947 0.013848\n", + "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.006967 0.009368\n", + "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373895 0.002964" ] }, "execution_count": 38, @@ -1569,7 +1597,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.10" } }, "nbformat": 4, From 4be3c64da91ac224c1f4ff2056cf68253589eed5 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 09:00:47 -0500 Subject: [PATCH 487/519] Added __hash__ routines to all Python classes based on __repr__ methods --- openmc/element.py | 2 +- openmc/filter.py | 2 +- openmc/geometry.py | 2 +- openmc/material.py | 3 +++ openmc/mesh.py | 3 +++ openmc/nuclide.py | 2 +- openmc/tallies.py | 16 +--------------- openmc/universe.py | 12 ++++++++++++ 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/openmc/element.py b/openmc/element.py index d395b434f7..cdc422ed2b 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -58,7 +58,7 @@ class Element(object): return not self == other def __hash__(self): - return hash((self._name, self._xs)) + return hash(str(self)) def __repr__(self): string = 'Element - {0}\n'.format(self._name) diff --git a/openmc/filter.py b/openmc/filter.py index 2c4915f511..4c058c0855 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -81,7 +81,7 @@ class Filter(object): return not self == other def __hash__(self): - return hash((self.type, tuple(self.bins))) + return hash(str(self)) def __deepcopy__(self, memo): existing = memo.get(id(self)) diff --git a/openmc/geometry.py b/openmc/geometry.py index e848e0cddf..c0b248780e 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -147,7 +147,7 @@ class Geometry(object): if cell._type == 'normal': material_cells.add(cell) - material_cells = list(material_cells) + material_cells = list(set(material_cells)) material_cells.sort(key=lambda x: x.id) return material_cells diff --git a/openmc/material.py b/openmc/material.py index 5138cc59e2..88c8443086 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -108,6 +108,9 @@ class Material(object): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Material\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) diff --git a/openmc/mesh.py b/openmc/mesh.py index 3b66076b79..b963a25a8e 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -189,6 +189,9 @@ class Mesh(object): cv.check_length('mesh width', width, 2, 3) self._width = width + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Mesh\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 2dd8eb1534..b95601bf7d 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -61,7 +61,7 @@ class Nuclide(object): return not self == other def __hash__(self): - return hash((self._name, self._xs)) + return hash(str(self)) def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) diff --git a/openmc/tallies.py b/openmc/tallies.py index 0661ab67b1..8498fbb5b5 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -190,21 +190,7 @@ class Tally(object): return not self == other def __hash__(self): - hashable = [] - - for filter in self.filters: - hashable.append((filter.type, tuple(filter.bins))) - - for nuclide in self.nuclides: - hashable.append(nuclide.name) - - for score in self.scores: - hashable.append(score) - - hashable.append(self.estimator) - hashable.append(self.name) - - return hash(tuple(hashable)) + return hash(str(self)) def __repr__(self): string = 'Tally\n' diff --git a/openmc/universe.py b/openmc/universe.py index 0eb77cdf9a..9a8262af39 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -94,6 +94,9 @@ class Cell(object): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Cell\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -479,6 +482,9 @@ class Universe(object): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'Universe\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -964,6 +970,9 @@ class RectLattice(Lattice): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'RectLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -1198,6 +1207,9 @@ class HexLattice(Lattice): def __ne__(self, other): return not self == other + def __hash__(self): + return hash(str(self)) + def __repr__(self): string = 'HexLattice\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) From f09ec9582b731500d19405957b88c998cfd77f5d Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 09:06:25 -0500 Subject: [PATCH 488/519] Shortened FIXME block in Material.__eq__ --- openmc/material.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 88c8443086..9e0a6b93b3 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -90,16 +90,15 @@ class Material(object): return False elif self.name != other.name: return False - # FIXME: This won't work since OpenMC only outputs densities in units - # of atom/b-cm in summary.h5 irregardless of input units, and it we + # FIXME: We cannot compare densities since OpenMC outputs densities + # in atom/b-cm in summary.h5 irregardless of input units, and we # cannot compute the sum percent in Python since we lack AWR - # elif self.density != other.density: + #elif self.density != other.density: # return False - # FIXME: The nuclide densities are different in summary.h5??? - # elif self._nuclides != other._nuclides: - # return False - # elif self._elements != other._elements: + #elif self._nuclides != other._nuclides: # return False + #elif self._elements != other._elements: + # return False elif self._sab != other._sab: return False else: From d26a86f5f1862c34ae4444a8dfca926471c6ccda Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 09:13:28 -0500 Subject: [PATCH 489/519] Reverted to set notation in Geometry.get_all_material_cells() now that __hash__ is implemented everywhere --- openmc/geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/geometry.py b/openmc/geometry.py index c0b248780e..e848e0cddf 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -147,7 +147,7 @@ class Geometry(object): if cell._type == 'normal': material_cells.add(cell) - material_cells = list(set(material_cells)) + material_cells = list(material_cells) material_cells.sort(key=lambda x: x.id) return material_cells From 061021cd4b5093e203b6376837fb1b89d7ed14c2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sun, 29 Nov 2015 16:20:25 -0600 Subject: [PATCH 490/519] Fix check for surface crossed when calculating distance to boundary for complex cells. --- src/geometry.F90 | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 22f5c3a153..5195054260 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -120,6 +120,7 @@ contains stack(i_stack) = (actual_sense .eqv. (token > 0)) end if end select + end do if (i_stack == 1) then @@ -598,8 +599,9 @@ contains real(8) :: d_lat ! distance to lattice boundary real(8) :: d_surf ! distance to surface real(8) :: x0,y0,z0 ! coefficients for surface + real(8) :: xyz_cross(3) logical :: coincident ! is particle on surface? - type(Cell), pointer :: cl + type(Cell), pointer :: c class(Surface), pointer :: surf class(Lattice), pointer :: lat @@ -615,7 +617,7 @@ contains LEVEL_LOOP: do j = 1, p % n_coord ! get pointer to cell on this level - cl => cells(p % coord(j) % cell) + c => cells(p % coord(j) % cell) ! copy directional cosines u = p % coord(j) % uvw(1) @@ -625,8 +627,8 @@ contains ! ======================================================================= ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL - SURFACE_LOOP: do i = 1, size(cl%region) - index_surf = cl%region(i) + SURFACE_LOOP: do i = 1, size(c % region) + index_surf = c % region(i) coincident = (index_surf == p % surface) ! ignore this token if it corresponds to an operator rather than a @@ -635,14 +637,14 @@ contains if (index_surf >= OP_UNION) cycle ! Calculate distance to surface - surf => surfaces(index_surf)%obj - d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw, coincident) + surf => surfaces(index_surf) % obj + d = surf % distance(p % coord(j) % xyz, p % coord(j) % uvw, coincident) ! Check if calculated distance is new minimum if (d < d_surf) then if (abs(d - d_surf)/d_surf >= FP_PRECISION) then d_surf = d - level_surf_cross = -cl % region(i) + level_surf_cross = -c % region(i) end if end if end do SURFACE_LOOP @@ -848,14 +850,31 @@ contains if (d_surf < d_lat) then if ((dist - d_surf)/dist >= FP_REL_PRECISION) then dist = d_surf - surface_crossed = level_surf_cross + + ! If the cell is not simple, it is possible that both the negative and + ! positive half-space were given in the region specification. Thus, we + ! have to explicitly check which half-space the particle would be + ! traveling into if the surface is crossed + if (.not. c % simple) then + xyz_cross(:) = p % coord(j) % xyz + d_surf*p % coord(j) % uvw + surf => surfaces(abs(level_surf_cross)) % obj + if (dot_product(p % coord(j) % uvw, & + surf % normal(xyz_cross)) > ZERO) then + surface_crossed = abs(level_surf_cross) + else + surface_crossed = -abs(level_surf_cross) + end if + else + surface_crossed = level_surf_cross + end if + lattice_translation(:) = [0, 0, 0] next_level = j end if else if ((dist - d_lat)/dist >= FP_REL_PRECISION) then dist = d_lat - surface_crossed = None + surface_crossed = NONE lattice_translation(:) = level_lat_trans next_level = j end if From 6f5cdf174f005a44d920eae8ebae3299af5547bd Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 29 Nov 2015 21:39:03 -0500 Subject: [PATCH 491/519] Initial implementation with trio of MGXS IPython Notebooks --- .gitignore | 4 +- .../pythonapi/examples/MGXS-Part-I.ipynb | 1091 ++++++++ .../pythonapi/examples/MGXS-Part-II.ipynb | 1972 +++++++++++++ .../pythonapi/examples/MGXS-Part-III.ipynb | 1633 +++++++++++ .../examples/multi-group-cross-sections.ipynb | 2454 ----------------- .../examples/pandas-dataframes.ipynb | 4 +- .../pythonapi/examples/post-processing.ipynb | 378 ++- openmc/opencg_compatible.py | 2 +- 8 files changed, 5052 insertions(+), 2486 deletions(-) create mode 100644 docs/source/pythonapi/examples/MGXS-Part-I.ipynb create mode 100644 docs/source/pythonapi/examples/MGXS-Part-II.ipynb create mode 100644 docs/source/pythonapi/examples/MGXS-Part-III.ipynb delete mode 100644 docs/source/pythonapi/examples/multi-group-cross-sections.ipynb diff --git a/.gitignore b/.gitignore index b2bdeba7a1..136491a4b8 100644 --- a/.gitignore +++ b/.gitignore @@ -71,4 +71,6 @@ docs/source/pythonapi/examples/*.xml docs/source/pythonapi/examples/*.png docs/source/pythonapi/examples/*.xls docs/source/pythonapi/examples/mgxs -docs/source/pythonapi/examples/tracks \ No newline at end of file +docs/source/pythonapi/examples/tracks +docs/source/pythonapi/examples/fission-rates +docs/source/pythonapi/examples/plots \ No newline at end of file diff --git a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb new file mode 100644 index 0000000000..0bba3bfe0e --- /dev/null +++ b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb @@ -0,0 +1,1091 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", + "\n", + "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", + "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", + "\n", + "**Note:** This Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "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')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.028999667)\n", + "inf_medium.add_nuclide(o16, 0.01450188)\n", + "inf_medium.add_nuclide(u235, 0.000114142)\n", + "inf_medium.add_nuclide(u238, 0.006886019)\n", + "inf_medium.add_nuclide(zr90, 0.002116053)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.default_xs = '71c'\n", + "materials_file.add_material(inf_medium)\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.region = +min_x & -max_x & +min_y & -max_y\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('fission', bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 2-group EnergyGroups object\n", + "groups = mgxs.EnergyGroups()\n", + "groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\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." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a few different sections\n", + "total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups)\n", + "absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups)\n", + "scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Absorption` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "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", + ")])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "absorption.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Add total tallies to the tallies file\n", + "for tally in total.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add absorption tallies to the tallies file\n", + "for tally in absorption.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add scattering tallies to the tallies file\n", + "for tally in scattering.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + " \n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 17:50:29\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\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", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.19804 \n", + " 2/1 1.12945 \n", + " 3/1 1.15573 \n", + " 4/1 1.13929 \n", + " 5/1 1.16300 \n", + " 6/1 1.22117 \n", + " 7/1 1.19012 \n", + " 8/1 1.11299 \n", + " 9/1 1.16066 \n", + " 10/1 1.12566 \n", + " 11/1 1.20854 \n", + " 12/1 1.14691 1.17773 +/- 0.03082\n", + " 13/1 1.17204 1.17583 +/- 0.01789\n", + " 14/1 1.14148 1.16724 +/- 0.01529\n", + " 15/1 1.17272 1.16834 +/- 0.01189\n", + " 16/1 1.18575 1.17124 +/- 0.01014\n", + " 17/1 1.20498 1.17606 +/- 0.00983\n", + " 18/1 1.14754 1.17249 +/- 0.00923\n", + " 19/1 1.18141 1.17348 +/- 0.00820\n", + " 20/1 1.15074 1.17121 +/- 0.00768\n", + " 21/1 1.15914 1.17011 +/- 0.00703\n", + " 22/1 1.14586 1.16809 +/- 0.00673\n", + " 23/1 1.18999 1.16978 +/- 0.00642\n", + " 24/1 1.15101 1.16844 +/- 0.00609\n", + " 25/1 1.13791 1.16640 +/- 0.00602\n", + " 26/1 1.19791 1.16837 +/- 0.00597\n", + " 27/1 1.19818 1.17012 +/- 0.00587\n", + " 28/1 1.14160 1.16854 +/- 0.00576\n", + " 29/1 1.11487 1.16571 +/- 0.00614\n", + " 30/1 1.17538 1.16620 +/- 0.00584\n", + " 31/1 1.20210 1.16791 +/- 0.00581\n", + " 32/1 1.20078 1.16940 +/- 0.00574\n", + " 33/1 1.14624 1.16839 +/- 0.00558\n", + " 34/1 1.14618 1.16747 +/- 0.00542\n", + " 35/1 1.16866 1.16752 +/- 0.00520\n", + " 36/1 1.18565 1.16821 +/- 0.00504\n", + " 37/1 1.16824 1.16821 +/- 0.00485\n", + " 38/1 1.18299 1.16874 +/- 0.00471\n", + " 39/1 1.21418 1.17031 +/- 0.00480\n", + " 40/1 1.11167 1.16835 +/- 0.00504\n", + " 41/1 1.11545 1.16665 +/- 0.00516\n", + " 42/1 1.11114 1.16491 +/- 0.00529\n", + " 43/1 1.14227 1.16423 +/- 0.00517\n", + " 44/1 1.14104 1.16355 +/- 0.00506\n", + " 45/1 1.16756 1.16366 +/- 0.00492\n", + " 46/1 1.13065 1.16274 +/- 0.00487\n", + " 47/1 1.11251 1.16139 +/- 0.00492\n", + " 48/1 1.14731 1.16101 +/- 0.00481\n", + " 49/1 1.16691 1.16117 +/- 0.00469\n", + " 50/1 1.19679 1.16206 +/- 0.00465\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.2800E-01 seconds\n", + " Reading cross sections = 8.9000E-02 seconds\n", + " Total time in simulation = 1.4506E+01 seconds\n", + " Time in transport only = 1.4496E+01 seconds\n", + " Time in inactive batches = 1.7910E+00 seconds\n", + " Time in active batches = 1.2715E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling 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.4943E+01 seconds\n", + " Calculation Rate (inactive) = 13958.7 neutrons/second\n", + " Calculation Rate (active) = 7864.73 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.16131 +/- 0.00453\n", + " k-effective (Track-length) = 1.16206 +/- 0.00465\n", + " k-effective (Absorption) = 1.16096 +/- 0.00364\n", + " Combined k-effective = 1.16120 +/- 0.00325\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remove old HDF5 (summary, statepoint) files\n", + "!rm statepoint.*\n", + "\n", + "# Run OpenMC\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the tallies from the statepoint into each MGXS object\n", + "total.load_from_statepoint(sp)\n", + "absorption.load_from_statepoint(sp)\n", + "scattering.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect our total cross section by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttotal\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 1.88e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.91e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "total.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "1 1 1 total 0.668323 0.001264\n", + "0 1 2 total 1.293258 0.007624" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = scattering.get_pandas_dataframe()\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "absorption.export_xs_data(filename='absorption-xs', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export all of three cross sections to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "total.build_hdf5_store(filename='mgxs', append=True)\n", + "absorption.build_hdf5_store(filename='mgxs', append=True)\n", + "scattering.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing MGXS with Tally Arithmetic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we illustrate how one can leverage OpenMC's tally arithmetic data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" tally based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((total / flux) - (absorption / flux)) - (sca... 4.884981e-15 0.011274 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... 1.221245e-15 0.001802 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", + "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", + "\n", + "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", + "difference.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can use tally arithmetic to compute the ratio of `AbsorptionXS` and `ScatterXS` to the `TotalXS`." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((absorption / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((absorption / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.076219 0.000651 \n", + "1 0.019319 0.000086 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", + "absorption_to_total = absorption.xs_tally / total.xs_tally\n", + "\n", + "# The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "absorption_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((scatter / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((scatter / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.923781 0.007714 \n", + "1 0.980681 0.002617 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", + "scattering_to_total = scattering.xs_tally / total.xs_tally\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "scattering_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption / flux) / (total / flux)) + ((sc... 1 0.007741 \n", + "1 (((absorption / flux) / (total / flux)) + ((sc... 1 0.002619 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", + "sum_ratio = absorption_to_total + scattering_to_total\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "sum_ratio.get_pandas_dataframe()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb new file mode 100644 index 0000000000..2976df22b5 --- /dev/null +++ b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb @@ -0,0 +1,1972 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook illustrates the use of the `openmc.mgxs` module to calculate multi-group cross sections for a heterogeneous fuel pin cell geometry. In particular, this Notebook illustrates the following features:\n", + "\n", + "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", + "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", + "* Built-in features for **energy condensation** in downstream data processing\n", + "* The use of **PyNE for plot** continuous energy vs. multi-group cross sections\n", + "* **Validation** of multi-group cross sections with **OpenMOC**\n", + "\n", + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n", + "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.rxname is not yet QA compliant.\n", + "/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.ace is not yet QA compliant.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "import openmoc\n", + "from openmoc.compatible import get_openmoc_geometry\n", + "import pyne.ace\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "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')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create three distinct materials for water, clad and fuel." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "# Use both reflective and vacuum boundaries to make life interesting\n", + "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.region = -fuel_outer_radius\n", + "pin_cell_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "pin_cell_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "pin_cell_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y\n", + "root_cell.fill = pin_cell_universe\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10000 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 10000\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('fission', bounds)\n", + "\n", + "# Activate tally precision triggers\n", + "settings_file.trigger_active = True\n", + "settings_file.trigger_max_batches = settings_file.batches * 4\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a \"fine\" 8-group EnergyGroups object\n", + "fine_groups = mgxs.EnergyGroups()\n", + "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", + " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", + "\n", + "# Instantiate a \"coarse\" 2-group EnergyGroups object\n", + "coarse_groups = mgxs.EnergyGroups()\n", + "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define transport, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Extract all Cells filled by Materials\n", + "openmc_cells = openmc_geometry.get_all_material_cells()\n", + "\n", + "# Create dictionary to store multi-group cross sections for all cells\n", + "xs_library = {}\n", + "\n", + "# Instantiate 8-group cross sections for each cell\n", + "for cell in openmc_cells:\n", + " xs_library[cell.id] = {}\n", + " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", + " xs_library[cell.id]['fission'] = mgxs.FissionXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", + " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", + " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we showcase the use of OpenMC's tally trigger feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a tally trigger for +/- 0.01 on each tally used to compute the multi-group cross sections\n", + "tally_trigger = openmc.Trigger('std_dev', 1E-2)\n", + "\n", + "# Add the tally trigger to each of the multi-group cross section tallies\n", + "for cell in openmc_cells:\n", + " for mgxs_type in xs_library[cell.id]:\n", + " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id]:\n", + "\n", + " # Set the cross sections domain type to the cell\n", + " xs_library[cell.id][rxn_type].domain = cell\n", + " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", + " \n", + " # Tally cross sections by nuclide (e.g., micro cross sections)\n", + " xs_library[cell.id][rxn_type].by_nuclide = True\n", + " \n", + " # Add OpenMC tallies to the tallies file for XML generation\n", + " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", + " tallies_file.add_tally(tally, merge=True)\n", + "\n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 21:22:25\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.22593 \n", + " 2/1 1.24245 \n", + " 3/1 1.24545 \n", + " 4/1 1.21868 \n", + " 5/1 1.22429 \n", + " 6/1 1.22607 \n", + " 7/1 1.21456 \n", + " 8/1 1.23816 \n", + " 9/1 1.25060 \n", + " 10/1 1.22806 \n", + " 11/1 1.19821 \n", + " 12/1 1.19897 1.19859 +/- 0.00038\n", + " 13/1 1.22119 1.20612 +/- 0.00754\n", + " 14/1 1.20701 1.20634 +/- 0.00533\n", + " 15/1 1.24784 1.21464 +/- 0.00927\n", + " 16/1 1.22413 1.21622 +/- 0.00773\n", + " 17/1 1.25050 1.22112 +/- 0.00817\n", + " 18/1 1.22006 1.22099 +/- 0.00707\n", + " 19/1 1.22813 1.22178 +/- 0.00629\n", + " 20/1 1.22791 1.22239 +/- 0.00566\n", + " 21/1 1.22729 1.22284 +/- 0.00514\n", + " 22/1 1.19867 1.22083 +/- 0.00510\n", + " 23/1 1.23796 1.22214 +/- 0.00488\n", + " 24/1 1.22412 1.22228 +/- 0.00452\n", + " 25/1 1.22638 1.22256 +/- 0.00421\n", + " 26/1 1.22181 1.22251 +/- 0.00394\n", + " 27/1 1.19055 1.22063 +/- 0.00415\n", + " 28/1 1.20683 1.21986 +/- 0.00399\n", + " 29/1 1.21689 1.21971 +/- 0.00378\n", + " 30/1 1.23670 1.22056 +/- 0.00368\n", + " 31/1 1.21396 1.22024 +/- 0.00352\n", + " 32/1 1.21389 1.21995 +/- 0.00337\n", + " 33/1 1.24649 1.22111 +/- 0.00342\n", + " 34/1 1.23204 1.22156 +/- 0.00330\n", + " 35/1 1.20768 1.22101 +/- 0.00322\n", + " 36/1 1.22271 1.22107 +/- 0.00309\n", + " 37/1 1.21796 1.22096 +/- 0.00298\n", + " 38/1 1.23842 1.22158 +/- 0.00293\n", + " 39/1 1.23080 1.22190 +/- 0.00285\n", + " 40/1 1.23572 1.22236 +/- 0.00279\n", + " 41/1 1.21691 1.22218 +/- 0.00271\n", + " 42/1 1.24616 1.22293 +/- 0.00272\n", + " 43/1 1.21903 1.22282 +/- 0.00264\n", + " 44/1 1.22967 1.22302 +/- 0.00257\n", + " 45/1 1.22053 1.22295 +/- 0.00250\n", + " 46/1 1.24087 1.22344 +/- 0.00248\n", + " 47/1 1.20251 1.22288 +/- 0.00248\n", + " 48/1 1.20331 1.22236 +/- 0.00246\n", + " 49/1 1.22724 1.22249 +/- 0.00240\n", + " 50/1 1.24798 1.22313 +/- 0.00243\n", + " Triggers unsatisfied, max unc./thresh. is 1.32110 for scatter-p1 in tally 10054\n", + " The estimated number of batches is 80\n", + " Creating state point statepoint.050.h5...\n", + " 51/1 1.22253 1.22311 +/- 0.00237\n", + " 52/1 1.24330 1.22359 +/- 0.00236\n", + " 53/1 1.23251 1.22380 +/- 0.00231\n", + " 54/1 1.21133 1.22352 +/- 0.00228\n", + " 55/1 1.24503 1.22399 +/- 0.00228\n", + " 56/1 1.22013 1.22391 +/- 0.00223\n", + " 57/1 1.23877 1.22423 +/- 0.00220\n", + " 58/1 1.23793 1.22451 +/- 0.00218\n", + " 59/1 1.21018 1.22422 +/- 0.00215\n", + " 60/1 1.22417 1.22422 +/- 0.00211\n", + " 61/1 1.23094 1.22435 +/- 0.00207\n", + " 62/1 1.23310 1.22452 +/- 0.00204\n", + " 63/1 1.22488 1.22453 +/- 0.00200\n", + " 64/1 1.22702 1.22457 +/- 0.00196\n", + " 65/1 1.18834 1.22391 +/- 0.00204\n", + " 66/1 1.23112 1.22404 +/- 0.00200\n", + " 67/1 1.21611 1.22390 +/- 0.00197\n", + " 68/1 1.22513 1.22392 +/- 0.00194\n", + " 69/1 1.21741 1.22381 +/- 0.00191\n", + " 70/1 1.22484 1.22383 +/- 0.00188\n", + " 71/1 1.19662 1.22338 +/- 0.00190\n", + " 72/1 1.23315 1.22354 +/- 0.00187\n", + " 73/1 1.22796 1.22361 +/- 0.00185\n", + " 74/1 1.21417 1.22346 +/- 0.00182\n", + " 75/1 1.21020 1.22326 +/- 0.00181\n", + " 76/1 1.23413 1.22343 +/- 0.00179\n", + " 77/1 1.22184 1.22340 +/- 0.00176\n", + " 78/1 1.20309 1.22310 +/- 0.00176\n", + " 79/1 1.23458 1.22327 +/- 0.00174\n", + " 80/1 1.20724 1.22304 +/- 0.00173\n", + " Triggers satisfied for batch 80\n", + " Creating state point statepoint.080.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.1800E-01 seconds\n", + " Reading cross sections = 8.7000E-02 seconds\n", + " Total time in simulation = 2.3349E+02 seconds\n", + " Time in transport only = 2.3343E+02 seconds\n", + " Time in inactive batches = 1.4263E+01 seconds\n", + " Time in active batches = 2.1923E+02 seconds\n", + " Time synchronizing fission bank = 2.5000E-02 seconds\n", + " Sampling source sites = 2.1000E-02 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 9.0000E-03 seconds\n", + " Total time elapsed = 2.3396E+02 seconds\n", + " Calculation Rate (inactive) = 7011.15 neutrons/second\n", + " Calculation Rate (active) = 1824.61 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.22327 +/- 0.00148\n", + " k-effective (Track-length) = 1.22304 +/- 0.00173\n", + " k-effective (Absorption) = 1.22407 +/- 0.00129\n", + " Combined k-effective = 1.22373 +/- 0.00113\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Delete old HDF5 files\n", + "!rm *.h5\n", + "\n", + "# Run OpenMC with the output throttled!\n", + "executor = openmc.Executor()\n", + "executor.run_simulation(output=True, mpi_procs=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.080.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object to compute the cross sections using tally arithmetic." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Iterate over all cells and cross section types\n", + "for cell in openmc_cells:\n", + " for rxn_type in xs_library[cell.id]:\n", + " xs_library[cell.id][rxn_type].load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's it! Our multi-group cross sections are now ready for the big spotlight. This time we have cross sections in three distinct spatial zones - fuel, clad and moderator - on a per-nuclide basis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect one of our cross sections by printing it to the screen as a microscopic cross section in units of barns." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 1.88e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 1.24e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.50e+01 +/- 2.02e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.90e+02 +/- 4.54e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.10e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 2.56e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.82e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [barns]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.30e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 2.25e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t5.82e-04 +/- 3.09e+00%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.27e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.39e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.12e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 2.57e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.81e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission = xs_library[fuel_cell.id]['nu-fission']\n", + "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our multi-group cross sections are capable of summing across all nuclides to provide us with macroscopic cross sections as well." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [0.821 - 20.0 MeV]:\t2.52e-02 +/- 2.19e-01%\n", + " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.22e-01%\n", + " Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 2.02e-01%\n", + " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.56e-01%\n", + " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.54e-01%\n", + " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.10e-01%\n", + " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 2.56e-01%\n", + " Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.82e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "nufission = xs_library[fuel_cell.id]['nu-fission']\n", + "nufission.print_xs(xs_type='macro', nuclides='sum')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211H-10.2340220.003645
1271000211O-161.5603050.006280
1241000212H-11.5880250.002815
1251000212O-160.2851470.001392
1221000213H-10.0107760.000186
1231000213O-160.0000000.000000
1201000214H-10.0000230.000010
1211000214O-160.0000000.000000
1181000215H-10.0000000.000000
1191000215O-160.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in group out nuclide mean std. dev.\n", + "126 10002 1 1 H-1 0.234022 0.003645\n", + "127 10002 1 1 O-16 1.560305 0.006280\n", + "124 10002 1 2 H-1 1.588025 0.002815\n", + "125 10002 1 2 O-16 0.285147 0.001392\n", + "122 10002 1 3 H-1 0.010776 0.000186\n", + "123 10002 1 3 O-16 0.000000 0.000000\n", + "120 10002 1 4 H-1 0.000023 0.000010\n", + "121 10002 1 4 O-16 0.000000 0.000000\n", + "118 10002 1 5 H-1 0.000000 0.000000\n", + "119 10002 1 5 O-16 0.000000 0.000000" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", + "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Extract the 16-group transport cross section for the fuel\n", + "fine_xs = xs_library[fuel_cell.id]['transport']\n", + "\n", + "# Condense to the 2-group structure\n", + "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttransport\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.81e-03 +/- 4.75e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 1.89e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.31e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 2.08e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.50e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.74e-01 +/- 2.66e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "condense_xs.print_xs()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-23520.8281270.098842
4100001U-2389.5822950.012550
5100001O-163.1573580.004725
0100002U-235485.2176490.916465
1100002U-23811.1760810.023196
2100002O-163.7881670.010090
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-235 20.828127 0.098842\n", + "4 10000 1 U-238 9.582295 0.012550\n", + "5 10000 1 O-16 3.157358 0.004725\n", + "0 10000 2 U-235 485.217649 0.916465\n", + "1 10000 2 U-238 11.176081 0.023196\n", + "2 10000 2 O-16 3.788167 0.010090" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Verification with OpenMOC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Get all OpenMOC cells in the gometry\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", + "# as is the case for a complicated geometry like BEAVRS\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Ignore the root cell\n", + " if cell.getName() == 'root cell':\n", + " continue\n", + " \n", + " # Get a reference to the Material filling this Cell\n", + " openmoc_material = cell.getFillMaterial()\n", + " \n", + " # Set the number of energy groups for the Material\n", + " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", + " \n", + " # Extract the appropriate cross section objects for this cell\n", + " transport = xs_library[cell_id]['transport']\n", + " nufission = xs_library[cell_id]['nu-fission']\n", + " nuscatter = xs_library[cell_id]['nu-scatter']\n", + " chi = xs_library[cell_id]['chi']\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " # NOTE: In each case we must sum across nuclides to get the\n", + " # macroscopic cross sections needed by OpenMOC\n", + " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.574633\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.679931\tres = 4.254E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.660910\tres = 1.832E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.798E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.927E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.625710\tres = 2.428E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.606521\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.587277\tres = 3.067E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.568777\tres = 3.173E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.551415\tres = 3.150E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.535708\tres = 3.052E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.521916\tres = 2.849E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.510222\tres = 2.575E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.500691\tres = 2.241E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.493392\tres = 1.868E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.488318\tres = 1.458E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.485438\tres = 1.028E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.484705\tres = 5.896E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.486046\tres = 1.510E-03\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.489362\tres = 2.766E-03\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.494546\tres = 6.824E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.501482\tres = 1.059E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.510042\tres = 1.402E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.520095\tres = 1.707E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.531508\tres = 1.971E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.544145\tres = 2.194E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.557872\tres = 2.378E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.572558\tres = 2.523E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.588073\tres = 2.632E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.604293\tres = 2.710E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.621101\tres = 2.758E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.638383\tres = 2.781E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.656033\tres = 2.782E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.673951\tres = 2.765E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.692044\tres = 2.731E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.710228\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.728423\tres = 2.628E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.746559\tres = 2.562E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.764569\tres = 2.490E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.782397\tres = 2.413E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.799990\tres = 2.332E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.817302\tres = 2.249E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.834293\tres = 2.164E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.850928\tres = 2.079E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.867178\tres = 1.994E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.883019\tres = 1.910E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.898428\tres = 1.827E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913391\tres = 1.745E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.927893\tres = 1.665E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.941926\tres = 1.588E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.955484\tres = 1.512E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.968564\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.981163\tres = 1.369E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.993284\tres = 1.301E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.004930\tres = 1.235E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.016106\tres = 1.172E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.026818\tres = 1.112E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.037075\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.046885\tres = 9.989E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.056259\tres = 9.459E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.065207\tres = 8.954E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.073742\tres = 8.471E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.081873\tres = 8.012E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.089615\tres = 7.573E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.096981\tres = 7.156E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.103982\tres = 6.760E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.110632\tres = 6.382E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.116945\tres = 6.024E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.122933\tres = 5.684E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.128609\tres = 5.361E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.133986\tres = 5.055E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.139077\tres = 4.764E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.143893\tres = 4.490E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.148448\tres = 4.228E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.152754\tres = 3.982E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.156821\tres = 3.749E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.160661\tres = 3.528E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.164285\tres = 3.319E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.167703\tres = 3.122E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.170925\tres = 2.936E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.173962\tres = 2.759E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.176824\tres = 2.594E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.179518\tres = 2.437E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.182054\tres = 2.289E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.184440\tres = 2.150E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.186684\tres = 2.018E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.188794\tres = 1.895E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.190777\tres = 1.778E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.192641\tres = 1.668E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.194391\tres = 1.565E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.196034\tres = 1.467E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.197577\tres = 1.376E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.199024\tres = 1.290E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.200382\tres = 1.209E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.201656\tres = 1.133E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.202850\tres = 1.061E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.203970\tres = 9.941E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.205018\tres = 9.307E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.206002\tres = 8.706E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.206923\tres = 8.158E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.207785\tres = 7.636E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.208592\tres = 7.144E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.209347\tres = 6.684E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.210055\tres = 6.249E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.210716\tres = 5.849E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.211335\tres = 5.465E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.211915\tres = 5.115E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.212455\tres = 4.782E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.212962\tres = 4.461E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.213435\tres = 4.176E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.213877\tres = 3.900E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.214290\tres = 3.643E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.214676\tres = 3.404E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.215038\tres = 3.181E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.215375\tres = 2.973E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.215689\tres = 2.771E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.215982\tres = 2.585E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.216257\tres = 2.416E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.216513\tres = 2.258E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.216752\tres = 2.105E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.216975\tres = 1.963E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.217183\tres = 1.834E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.217377\tres = 1.709E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.217558\tres = 1.594E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.217728\tres = 1.488E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.217885\tres = 1.388E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.218033\tres = 1.297E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.218170\tres = 1.206E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.218296\tres = 1.126E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.218416\tres = 1.041E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.218527\tres = 9.807E-05\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.218631\tres = 9.109E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.218727\tres = 8.502E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.218817\tres = 7.897E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.218901\tres = 7.364E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.218979\tres = 6.886E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.219051\tres = 6.353E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.219120\tres = 5.977E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.219183\tres = 5.590E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.219242\tres = 5.170E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.219296\tres = 4.832E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.219347\tres = 4.486E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.219395\tres = 4.185E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.219439\tres = 3.868E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.219480\tres = 3.650E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.219518\tres = 3.379E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.219554\tres = 3.107E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.219587\tres = 2.929E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.219618\tres = 2.709E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.219647\tres = 2.542E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.219674\tres = 2.362E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.219699\tres = 2.199E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.219722\tres = 2.070E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.219743\tres = 1.878E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.219763\tres = 1.770E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.219782\tres = 1.628E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.219799\tres = 1.526E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.219815\tres = 1.387E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.219830\tres = 1.319E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.219844\tres = 1.208E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.219857\tres = 1.150E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.219869\tres = 1.055E-05\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.219880\tres = 1.008E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.223729\n", + "openmoc keff = 1.219880\n", + "bias [pcm]: -384.9\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", + "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", + "\n", + "# Inject multi-group cross sections into OpenMOC Materials\n", + "for cell_id, cell in openmoc_cells.items():\n", + " \n", + " # Ignore the root cell\n", + " if cell.getName() == 'root cell':\n", + " continue\n", + " \n", + " openmoc_material = cell.getFillMaterial()\n", + " openmoc_material.setNumEnergyGroups(coarse_groups.num_groups)\n", + " \n", + " # Extract the appropriate cross section objects for this cell\n", + " transport = xs_library[cell_id]['transport']\n", + " nufission = xs_library[cell_id]['nu-fission']\n", + " nuscatter = xs_library[cell_id]['nu-scatter']\n", + " chi = xs_library[cell_id]['chi']\n", + " \n", + " # Perform group condensation\n", + " transport = transport.get_condensed_xs(coarse_groups)\n", + " nufission = nufission.get_condensed_xs(coarse_groups)\n", + " nuscatter = nuscatter.get_condensed_xs(coarse_groups)\n", + " chi = chi.get_condensed_xs(coarse_groups)\n", + " \n", + " # Inject NumPy arrays of cross section data into the Material\n", + " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", + " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.495594\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.557313\tres = 5.044E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.518115\tres = 1.245E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.509017\tres = 7.033E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.496280\tres = 1.756E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.488358\tres = 2.502E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.482660\tres = 1.596E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.479524\tres = 1.167E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.478569\tres = 6.497E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.479591\tres = 1.992E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.482389\tres = 2.136E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.486774\tres = 5.834E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.492576\tres = 9.091E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.499632\tres = 1.192E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.507800\tres = 1.433E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.516944\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.526943\tres = 1.801E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.537682\tres = 1.934E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.549061\tres = 2.038E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.560985\tres = 2.116E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.573368\tres = 2.172E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.586133\tres = 2.207E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599208\tres = 2.226E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.612528\tres = 2.231E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.626036\tres = 2.223E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.639676\tres = 2.205E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.653403\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.667171\tres = 2.146E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.680942\tres = 2.107E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.694682\tres = 2.064E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.708357\tres = 2.018E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.721941\tres = 1.969E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.735408\tres = 1.918E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.748735\tres = 1.865E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.761905\tres = 1.812E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.774898\tres = 1.759E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.787701\tres = 1.705E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.800300\tres = 1.652E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.599E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.824845\tres = 1.548E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.836773\tres = 1.496E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.848463\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.859909\tres = 1.397E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.871106\tres = 1.349E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.882052\tres = 1.302E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.892746\tres = 1.257E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.903184\tres = 1.212E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913368\tres = 1.169E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.923297\tres = 1.128E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.932973\tres = 1.087E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.942395\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.951568\tres = 1.010E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.960491\tres = 9.733E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.969169\tres = 9.378E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.977605\tres = 9.035E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.985801\tres = 8.704E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.993762\tres = 8.384E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.001492\tres = 8.075E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.008993\tres = 7.778E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.016272\tres = 7.490E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.214E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.030175\tres = 6.945E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.036810\tres = 6.689E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.043239\tres = 6.441E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.049467\tres = 6.200E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.055499\tres = 5.970E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.061339\tres = 5.748E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.066994\tres = 5.533E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.072466\tres = 5.328E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.077761\tres = 5.128E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.082883\tres = 4.937E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.087837\tres = 4.753E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.092628\tres = 4.575E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.097261\tres = 4.404E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.101738\tres = 4.240E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.106067\tres = 4.080E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.110248\tres = 3.929E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.114289\tres = 3.781E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.118192\tres = 3.639E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.121963\tres = 3.502E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.125604\tres = 3.372E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.129120\tres = 3.245E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.132515\tres = 3.124E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.135791\tres = 3.006E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.138955\tres = 2.893E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.142009\tres = 2.786E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.144955\tres = 2.681E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.147798\tres = 2.580E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.150540\tres = 2.483E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.153187\tres = 2.389E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.155740\tres = 2.300E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158202\tres = 2.214E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.160576\tres = 2.130E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.162866\tres = 2.050E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.165075\tres = 1.973E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.167203\tres = 1.899E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.169257\tres = 1.827E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.171236\tres = 1.759E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.173143\tres = 1.693E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.174982\tres = 1.629E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.176754\tres = 1.568E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.178463\tres = 1.508E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.180109\tres = 1.452E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.181695\tres = 1.397E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.183225\tres = 1.344E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.184698\tres = 1.294E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.186116\tres = 1.245E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.187483\tres = 1.198E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.188801\tres = 1.152E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.190070\tres = 1.110E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.191292\tres = 1.067E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.192470\tres = 1.026E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.193603\tres = 9.889E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.194696\tres = 9.502E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.195748\tres = 9.155E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.196760\tres = 8.807E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.197736\tres = 8.464E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.198675\tres = 8.155E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.199580\tres = 7.844E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.200452\tres = 7.551E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.201290\tres = 7.262E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.202098\tres = 6.981E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.202876\tres = 6.728E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.203624\tres = 6.471E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.204346\tres = 6.219E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.205039\tres = 5.993E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.205708\tres = 5.756E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.206351\tres = 5.551E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.206970\tres = 5.328E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.207566\tres = 5.132E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.208140\tres = 4.943E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.208691\tres = 4.749E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.209223\tres = 4.564E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.209734\tres = 4.396E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.210228\tres = 4.231E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.210702\tres = 4.076E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.211158\tres = 3.916E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.211597\tres = 3.767E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.212019\tres = 3.628E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.212425\tres = 3.484E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.212817\tres = 3.350E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.213193\tres = 3.227E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.213556\tres = 3.106E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.213904\tres = 2.989E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.214240\tres = 2.869E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.214563\tres = 2.770E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.214874\tres = 2.659E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.215172\tres = 2.557E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.215459\tres = 2.457E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.215737\tres = 2.361E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.216003\tres = 2.281E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.216260\tres = 2.194E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.216507\tres = 2.109E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.216744\tres = 2.028E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.216972\tres = 1.950E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.217193\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.217403\tres = 1.809E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.217607\tres = 1.733E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.217802\tres = 1.673E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.217990\tres = 1.603E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.218171\tres = 1.544E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.218346\tres = 1.486E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.218513\tres = 1.429E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.218674\tres = 1.376E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.218829\tres = 1.322E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.218979\tres = 1.274E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.219123\tres = 1.225E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.219261\tres = 1.181E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.219394\tres = 1.132E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.219522\tres = 1.090E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.219645\tres = 1.049E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.219763\tres = 1.008E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.219877\tres = 9.716E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.219986\tres = 9.353E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.220091\tres = 8.948E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.220192\tres = 8.598E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.220290\tres = 8.274E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.220384\tres = 7.979E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.220474\tres = 7.672E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.220561\tres = 7.406E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.220644\tres = 7.136E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.220725\tres = 6.812E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.220802\tres = 6.605E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.220877\tres = 6.346E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.220948\tres = 6.086E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.221016\tres = 5.825E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.221083\tres = 5.620E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.221146\tres = 5.433E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.221208\tres = 5.215E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.221267\tres = 5.031E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.221323\tres = 4.820E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.221377\tres = 4.623E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.221430\tres = 4.449E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.221480\tres = 4.287E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.221529\tres = 4.123E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.221575\tres = 3.993E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.221620\tres = 3.779E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.221663\tres = 3.667E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.221705\tres = 3.541E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.221744\tres = 3.378E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.221782\tres = 3.233E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.221820\tres = 3.127E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.221855\tres = 3.033E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.221889\tres = 2.911E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.221922\tres = 2.775E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.221954\tres = 2.682E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.221984\tres = 2.580E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.222013\tres = 2.467E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.222041\tres = 2.365E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.222068\tres = 2.298E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.222094\tres = 2.216E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.222119\tres = 2.115E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.222143\tres = 2.038E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.222166\tres = 1.954E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.222188\tres = 1.879E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.810E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.222230\tres = 1.741E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.222250\tres = 1.694E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.222269\tres = 1.617E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.574E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.222305\tres = 1.497E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.222322\tres = 1.452E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.222338\tres = 1.381E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.222354\tres = 1.330E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.222369\tres = 1.285E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.230E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.170E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.124E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.095E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.222436\tres = 1.047E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.222448\tres = 1.009E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.223729\n", + "openmoc keff = 1.222448\n", + "bias [pcm]: -128.1\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "\n", + "* Appropriate transport-corrected cross sections\n", + "* Spatial discretization of OpenMOC's mesh\n", + "* Constant-in-angle multi-group cross sections" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Visualizing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for MGXS visualization, only a few of which will be shown here for inspiration.\n", + "\n", + "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source PyNE library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a PyNE ACE continuous energy cross sections library\n", + "pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n", + "pyne_lib.read('92235.71c')\n", + "\n", + "# Extract the U-235 data from the library\n", + "u235 = pyne_lib.tables['92235.71c']\n", + "\n", + "# Extract the continuous energy fission U-235 cross section data\n", + "fission = u235.reactions[18]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we use matplotlib to plot the multi-group and continuous energy cross sections on a single plot." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a loglog plot of the U-235 continuous energy fission cross section \n", + "plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1)\n", + "\n", + "# Extract energy group bounds and MGXS values to plot\n", + "nufission = xs_library[fuel_cell.id]['fission']\n", + "energy_groups = nufission.energy_groups\n", + "x = energy_groups.group_edges\n", + "y = nufission.get_xs(nuclides=['U-235'], order_groups='decreasing', xs_type='micro')\n", + "\n", + "# Fix low energy bound to the value defined by the ACE library\n", + "x[0] = u235.energy[0]\n", + "\n", + "# Extend the mgxs values array for matplotlib's step plot\n", + "y = np.insert(y, 0, y[0])\n", + "\n", + "# Create a step plot for the MGXS\n", + "plt.plot(x, y, drawstyle='steps', color='r', linewidth=3)\n", + "\n", + "plt.title('U-235 Fission Cross Section')\n", + "plt.xlabel('Energy [MeV]')\n", + "plt.ylabel('Micro Fission XS')\n", + "plt.legend(['Continuous', 'Multi-Group'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another useful illustration are scattering matrix sparsity structures. First, we extract Pandas DataFrames for the H-1 and O-16 scattering matrices." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Construct a Pandas DataFrame for the microscopic nu-scattering matrix\n", + "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", + "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", + "\n", + "# Slice DataFrame in two for each nuclide's mean values\n", + "h1 = df[df['nuclide'] == 'H-1']['mean']\n", + "o16 = df[df['nuclide'] == 'O-16']['mean']\n", + "\n", + "# Cast DataFrames as NumPy arrays\n", + "h1 = h1.as_matrix()\n", + "o16 = o16.as_matrix()\n", + "\n", + "# Reshape arrays to 2D matrix for plotting\n", + "h1.shape = (fine_groups.num_groups, fine_groups.num_groups)\n", + "o16.shape = (fine_groups.num_groups, fine_groups.num_groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Matplotlib's `imshow` routine can be used to plot the matrices to illustrate their sparsity structures." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create plot of the H-1 scattering matrix\n", + "fig = plt.subplot(121)\n", + "fig.imshow(h1, interpolation='nearest')\n", + "plt.title('H-1 Scattering Matrix')\n", + "\n", + "# Create plot of the O-16 scattering matrix\n", + "fig2 = plt.subplot(122)\n", + "fig2.imshow(o16, interpolation='nearest')\n", + "plt.title('O-16 Scattering Matrix')\n", + "\n", + "# Show the plot on screen\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb new file mode 100644 index 0000000000..4a8cfbc6b5 --- /dev/null +++ b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb @@ -0,0 +1,1633 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to help automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", + "\n", + "* Calculation of multi-group cross sections for a **fuel assembly**\n", + "* Automated creation, manipulation and storage of `MGXS` with **`openmc.mgxs.Library`**\n", + "* **Validation** of multi-group cross sections with **OpenMOC**\n", + "* Steady-state pin-by-pin **fission rates comparison** between OpenMC and OpenMOC\n", + "\n", + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import math\n", + "import pickle\n", + "from IPython.display import Image\n", + "import matplotlib.pylab as pylab\n", + "import numpy as np\n", + "\n", + "import openmc\n", + "import openmc.mgxs\n", + "from openmc.statepoint import StatePoint\n", + "from openmc.summary import Summary\n", + "\n", + "import openmoc\n", + "import openmoc.process\n", + "from openmoc.compatible import get_openmoc_geometry\n", + "from openmoc.materialize import load_openmc_mgxs_lib\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H-1')\n", + "b10 = openmc.Nuclide('B-10')\n", + "o16 = openmc.Nuclide('O-16')\n", + "u235 = openmc.Nuclide('U-235')\n", + "u238 = openmc.Nuclide('U-238')\n", + "zr90 = openmc.Nuclide('Zr-90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create three materials for the fuel, water, and cladding of the fuel pins." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "water.add_nuclide(b10, 8.0042e-6)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our three materials, we can now create a materials file object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, add Materials\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.add_material(fuel)\n", + "materials_file.add_material(water)\n", + "materials_file.add_material(zircaloy)\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a square array of fuel pins and control rod guide tubes for which we can use OpenMC's lattice/universe feature. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "min_x = openmc.XPlane(x0=-10.71, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+10.71, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-10.71, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-10., boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+10., boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now construct a fuel pin cell from cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "fuel_pin_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.region = -fuel_outer_radius\n", + "fuel_pin_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "fuel_pin_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "fuel_pin_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Likewise, we can construct a control rod guide tube with the same surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a control rod guide tube\n", + "guide_tube_universe = openmc.Universe(name='Guide Tube')\n", + "\n", + "# Create fuel Cell\n", + "guide_tube_cell = openmc.Cell(name='Guide Tube Water')\n", + "guide_tube_cell.fill = water\n", + "guide_tube_cell.region = -fuel_outer_radius\n", + "guide_tube_universe.add_cell(guide_tube_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='Guide Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "guide_tube_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='Guide Tube Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "guide_tube_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26cm pitch." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create fuel assembly Lattice\n", + "assembly = openmc.RectLattice(name='1.6% Fuel Assembly')\n", + "assembly.dimension = (17, 17)\n", + "assembly.pitch = (1.26, 1.26)\n", + "assembly.lower_left = [-1.26 * 17. / 2.0] * 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we create a NumPy array of fuel pin and guide tube universes for the lattice." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create array indices for guide tube locations in lattice\n", + "template_x = np.array([5, 8, 11, 3, 13, 2, 5, 8, 11, 14, 2, 5, 8,\n", + " 11, 14, 2, 5, 8, 11, 14, 3, 13, 5, 8, 11])\n", + "template_y = np.array([2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 8, 8, 8, 8,\n", + " 8, 11, 11, 11, 11, 11, 13, 13, 14, 14, 14])\n", + "\n", + "# Initialize an empty 17x17 array of the lattice universes\n", + "universes = np.empty((17, 17), dtype=openmc.Universe)\n", + "\n", + "# Fill the array with the fuel pin and guide tube universes\n", + "universes[:,:] = fuel_pin_universe\n", + "universes[template_x, template_y] = guide_tube_universe\n", + "\n", + "# Store the array of universes in the lattice\n", + "assembly.universes = universes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = assembly\n", + "\n", + "# Add boundary planes\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "geometry = openmc.Geometry()\n", + "geometry.root_universe = root_universe" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the geometry and materials finished, we now just need to define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': False, 'summary': True}\n", + "source_bounds = [-10.71, -10.71, -10, 10.71, 10.71, 10.]\n", + "settings_file.set_source_space('fission', source_bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us also create a plot file that we can use to verify that our pin cell geometry was created successfully." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Plot\n", + "plot = openmc.Plot(plot_id=1)\n", + "plot.filename = 'materials-xy'\n", + "plot.origin = [0, 0, 0]\n", + "plot.width = [21.5, 21.5]\n", + "plot.pixels = [250, 250]\n", + "plot.color = 'mat'\n", + "\n", + "# Instantiate a PlotsFile, add Plot, and export to \"plots.xml\"\n", + "plot_file = openmc.PlotsFile()\n", + "plot_file.add_plot(plot)\n", + "plot_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the plots.xml file, we can now generate and view the plot. OpenMC outputs plots in .ppm format, which can be converted into a compressed format like .png with the convert utility." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run openmc in plotting mode\n", + "executor = openmc.Executor()\n", + "executor.plot_geometry(output=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTI5VDE3OjIwOjAxLTA1OjAwddLLfAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0yOVQxNzoyMDowMS0wNTowMASPc8AAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert OpenMC's funky ppm to png\n", + "!convert materials-xy.ppm materials-xy.png\n", + "\n", + "# Display the materials plot inline\n", + "Image(filename='materials-xy.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see from the plot, we have a nice array of pin cells with fuel, cladding, and water!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create an MGXS Library" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 2-group EnergyGroups object\n", + "groups = openmc.mgxs.EnergyGroups()\n", + "groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will instantiate an `openmc.mgxs.Library` for the energy groups with our the fuel assembly geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Initialize an 2-group MGXS Library for OpenMOC\n", + "mgxs_lib = openmc.mgxs.Library(geometry)\n", + "mgxs_lib.energy_groups = groups" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to type string codes mapped accepted by the `Library` class:\n", + "\n", + "* `TotalXS` (`\"total\"`)\n", + "* `TransportXS` (`\"transport\"`)\n", + "* `AbsorptionXS` (`\"absorption\"`)\n", + "* `CaptureXS` (`\"capture\"`)\n", + "* `FissionXS` (`\"fission\"`)\n", + "* `NuFissionXS` (`\"nu-fission\"`)\n", + "* `ScatterXS` (`\"scatter\"`)\n", + "* `NuScatterXS` (`\"nu-scatter\"`)\n", + "* `ScatterMatrixXS` (`\"scatter matrix\"`)\n", + "* `NuScatterMatrixXS` (`\"nu-scatter matrix\"`)\n", + "* `Chi` (`\"chi\"`)\n", + "\n", + "In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define `\"transport\"`, `\"nu-fission\"`, `\"nu-scatter matrix\"` and `\"chi\"` cross sections for our `Library`.\n", + "\n", + "**Note**: A variety of different approximate transport-corrected total multi-group cross sections (and corresponding scattering matrices) can be found in the literature. At the present time, the `openmc.mgxs` module only supports the \"P0\" transport correction. This correction can be turned on or off through the boolean `Library.correction` property which may take values of `\"P0\"` (default) or `None`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Specify multi-group cross section types to compute\n", + "mgxs_lib.mgxs_types = [\"transport\", \"nu-fission\", \"nu-scatter matrix\", \"chi\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells for our fuel and guide tube pin cells." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Specify a \"cell\" domain type for the cross section tally filters\n", + "mgxs_lib.domain_type = \"cell\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can easily instruct the `Library` to compute multi-group cross sections on a nuclide-by-nuclide basis as was first illustrated in MGXS: Part II with the boolean `Library.by_nuclide` property. By default, `by_nuclide` is set to `False`, but we will set it to `True` here." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Compute cross sections on a nuclide-by-nuclide basis\n", + "mgxs_lib.by_nuclide = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, we use the `Library` to construct all of the tallies needed to compute all of the requested multi-group cross sections in each domain and nuclide." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Construct all tallies needed for the multi-group cross section library\n", + "mgxs_lib.build_library()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The tallies can now be export to a \"tallies.xml\" input file for OpenMC. \n", + "\n", + "**NOTE**: At this point the `Library` has constructed nearly 100 distinct `Tally`. The overhead to tally in OpenMC scales as $O(N)$ for $N$ tallies, which can become a bottleneck for large tally datasets. To compensate for this, the Python API's `Tally`, `Filter` and `TalliesFile` classes allow for the smart *merging* of tallies when possible. The `Library` class supports this runtime optimization with the use of the optional `merge` paramter (`False` by default) for the `Library.add_to_tallies_file(...)` method, as shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a \"tallies.xml\" file for the MGXS Library\n", + "tallies_file = openmc.TalliesFile()\n", + "mgxs_lib.add_to_tallies_file(tallies_file, merge=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition, we instantiate a fission rate mesh tally to compare with OpenMOC." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a tally Mesh\n", + "mesh = openmc.Mesh(mesh_id=1)\n", + "mesh.type = 'regular'\n", + "mesh.dimension = [17, 17]\n", + "mesh.lower_left = [-10.71, -10.71]\n", + "mesh.width = [1.26, 1.26]\n", + "\n", + "# Instantiate tally Filter\n", + "mesh_filter = openmc.Filter()\n", + "mesh_filter.mesh = mesh\n", + "\n", + "# Instantiate the Tally\n", + "tally = openmc.Tally(name='mesh tally')\n", + "tally.add_filter(mesh_filter)\n", + "tally.add_score('fission')\n", + "tally.add_score('nu-fission')\n", + "\n", + "# Add mesh and Tally to TalliesFile\n", + "tallies_file.add_mesh(mesh)\n", + "tallies_file.add_tally(tally)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Export all tallies to a \"tallies.xml\" file\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 17:20:02\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", + " Loading ACE cross section table: 92238.71c\n", + " Loading ACE cross section table: 8016.71c\n", + " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 5010.71c\n", + " Loading ACE cross section table: 40090.71c\n", + " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.02650 \n", + " 2/1 1.01386 \n", + " 3/1 1.01045 \n", + " 4/1 1.05511 \n", + " 5/1 1.04873 \n", + " 6/1 1.04558 \n", + " 7/1 1.03840 \n", + " 8/1 1.02086 \n", + " 9/1 1.08845 \n", + " 10/1 1.03932 \n", + " 11/1 1.01271 \n", + " 12/1 1.03448 1.02360 +/- 0.01088\n", + " 13/1 1.04395 1.03038 +/- 0.00925\n", + " 14/1 1.05477 1.03648 +/- 0.00894\n", + " 15/1 1.00485 1.03015 +/- 0.00938\n", + " 16/1 1.04523 1.03267 +/- 0.00806\n", + " 17/1 1.01328 1.02990 +/- 0.00735\n", + " 18/1 1.01476 1.02800 +/- 0.00664\n", + " 19/1 1.01490 1.02655 +/- 0.00604\n", + " 20/1 1.00926 1.02482 +/- 0.00567\n", + " 21/1 0.98504 1.02120 +/- 0.00627\n", + " 22/1 1.00397 1.01977 +/- 0.00591\n", + " 23/1 1.02556 1.02021 +/- 0.00545\n", + " 24/1 0.99808 1.01863 +/- 0.00529\n", + " 25/1 0.99638 1.01715 +/- 0.00514\n", + " 26/1 0.99615 1.01584 +/- 0.00499\n", + " 27/1 1.01843 1.01599 +/- 0.00469\n", + " 28/1 1.00315 1.01528 +/- 0.00447\n", + " 29/1 1.00633 1.01480 +/- 0.00426\n", + " 30/1 1.02159 1.01514 +/- 0.00405\n", + " 31/1 1.03395 1.01604 +/- 0.00396\n", + " 32/1 1.02672 1.01652 +/- 0.00381\n", + " 33/1 1.03778 1.01745 +/- 0.00375\n", + " 34/1 1.03807 1.01831 +/- 0.00369\n", + " 35/1 1.07854 1.02072 +/- 0.00428\n", + " 36/1 1.03524 1.02128 +/- 0.00415\n", + " 37/1 1.03100 1.02164 +/- 0.00401\n", + " 38/1 1.03853 1.02224 +/- 0.00391\n", + " 39/1 1.04089 1.02288 +/- 0.00383\n", + " 40/1 1.02150 1.02284 +/- 0.00370\n", + " 41/1 0.98470 1.02161 +/- 0.00379\n", + " 42/1 1.00658 1.02114 +/- 0.00370\n", + " 43/1 0.98652 1.02009 +/- 0.00373\n", + " 44/1 1.02787 1.02032 +/- 0.00363\n", + " 45/1 0.98800 1.01939 +/- 0.00364\n", + " 46/1 1.00286 1.01893 +/- 0.00357\n", + " 47/1 1.02559 1.01911 +/- 0.00348\n", + " 48/1 1.03729 1.01959 +/- 0.00342\n", + " 49/1 1.02538 1.01974 +/- 0.00333\n", + " 50/1 1.01478 1.01962 +/- 0.00325\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.0000E-01 seconds\n", + " Reading cross sections = 8.4000E-02 seconds\n", + " Total time in simulation = 3.8366E+01 seconds\n", + " Time in transport only = 3.8351E+01 seconds\n", + " Time in inactive batches = 3.6930E+00 seconds\n", + " Time in active batches = 3.4673E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 3.8780E+01 seconds\n", + " Calculation Rate (inactive) = 6769.56 neutrons/second\n", + " Calculation Rate (active) = 2884.09 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.01805 +/- 0.00261\n", + " k-effective (Track-length) = 1.01962 +/- 0.00325\n", + " k-effective (Absorption) = 1.01554 +/- 0.00339\n", + " Combined k-effective = 1.01711 +/- 0.00235\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Remove old HDF5 (summary, statepoint) files\n", + "!rm statepoint.*\n", + "\n", + "# Run OpenMC\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by the `Library`. We simply have to load the tallies from the statepoint into the `Library` and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Initialize MGXS Library with OpenMC statepoint data\n", + "mgxs_lib.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Library` supports a rich API to automate a variety of tasks, including multi-group cross section data retrieval and storage. We will highlight a few of these features here. First, the `Library.get_mgxs(...)` method allows one to extract an `MGXS` object from the `Library` for a particular domain and cross section type. The following cell illustrates how one may extract the `NuFissionXS` object for the fuel cell." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Retrieve the NuFissionXS object for the fuel cell from the library\n", + "fuel_mgxs = mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `NuFissionXS` object supports all of the methods described previously the `openmc.mgxs` tutorials, such as Pandas DataFrames:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-235 8.063513e-03 4.062984e-05\n", + "4 10000 1 U-238 7.335515e-03 4.459335e-05\n", + "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", + "0 10000 2 U-235 3.613274e-01 1.902492e-03\n", + "1 10000 2 U-238 6.738424e-07 3.536787e-09\n", + "2 10000 2 O-16 0.000000e+00 0.000000e+00" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = fuel_mgxs.get_pandas_dataframe()\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can use the `MGXS.print_xs(...)` method to view a string representation of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 5.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.27e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 6.08e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.25e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "fuel_mgxs.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One can export the entire `Library` to HDF5 with the `Library.build_hdf5_store(...)` method as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Store the cross section data in an \"mgxs/mgxs.h5\" HDF5 binary file\n", + "mgxs_lib.build_hdf5_store(filename='mgxs.h5', directory='mgxs')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The HDF5 store will contain the numerical multi-group cross section data indexed by domain, nuclide and cross section type. Some data workflows may be optimized by storing and retrieving binary representations of the `MGXS` objects in the `Library`. This feature is supported through the `Library.dump_to_file(...)` and `Library.load_from_file(...)` routines which use Python's `pickle` module. This is illustrated as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Store a complete binary representation of the Library and\n", + "# its MGXS objects in a pickled binary file \"mgxs/mgxs.pkl\"\n", + "mgxs_lib.dump_to_file(filename='mgxs', directory='mgxs')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a new MGXS Library from the complete binary representation\n", + "# stored in the pickled binary file \"mgxs/mgxs.pkl\"\n", + "mgxs_lib = openmc.mgxs.Library.load_from_file(filename='mgxs', directory='mgxs')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Library` class may be used to leverage the energy condensation features supported by the `MGXS` class and illutrated in earlier tutorials on `openmc.mgxs`. In particular, one can use the `Library.get_condensed_library(...)` with a coarse group structure which is a subset of the original \"fine\" group structure as shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a 1-group structure\n", + "coarse_groups = openmc.mgxs.EnergyGroups(group_edges=[0., 20.])\n", + "\n", + "# Create a new MGXS Library on the coarse 1-group structure\n", + "coarse_mgxs_lib = mgxs_lib.get_condensed_library(coarse_groups)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "0 10000 1 U-235 0.074383 0.000280\n", + "1 10000 1 U-238 0.005959 0.000036\n", + "2 10000 1 O-16 0.000000 0.000000" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Retrieve the NuFissionXS object for the fuel cell from the 1-group library\n", + "coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')\n", + "\n", + "# Show the Pandas DataFrame for the 1-group MGXS\n", + "coarse_fuel_mgxs.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Verification with OpenMOC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "openmoc_geometry = get_openmoc_geometry(mgxs_lib.opencg_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can inject the multi-group cross sections into the equivalent fuel assembly OpenMOC geometry. The `openmoc.materialize` module is seamlessly integrated to support the loading of `Library` objects from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the library into the OpenMOC geometry\n", + "materials = load_openmc_mgxs_lib(mgxs_lib, openmoc_geometry)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.854316\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.801593\tres = 1.522E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.761131\tres = 6.380E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.731467\tres = 5.066E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.709897\tres = 3.910E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.695110\tres = 2.954E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.685966\tres = 2.085E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.681511\tres = 1.317E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.680926\tres = 6.520E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.683509\tres = 1.046E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.688659\tres = 3.848E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.695860\tres = 7.565E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.704674\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.714726\tres = 1.269E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.725700\tres = 1.428E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.737329\tres = 1.537E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.749388\tres = 1.604E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.761690\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.774081\tres = 1.643E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.786432\tres = 1.628E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.798638\tres = 1.597E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.810618\tres = 1.553E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.822303\tres = 1.501E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.833643\tres = 1.443E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.844598\tres = 1.380E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.855140\tres = 1.315E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.865249\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.874914\tres = 1.183E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.884128\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.892891\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.901206\tres = 9.920E-03\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.909080\tres = 9.320E-03\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.916523\tres = 8.745E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.923546\tres = 8.194E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.930162\tres = 7.669E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.936387\tres = 7.171E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.942236\tres = 6.698E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.947725\tres = 6.252E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.952869\tres = 5.830E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.957687\tres = 5.433E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.962193\tres = 5.060E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.966404\tres = 4.710E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.970337\tres = 4.381E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.974006\tres = 4.073E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.977426\tres = 3.785E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.980613\tres = 3.515E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.983580\tres = 3.264E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.986341\tres = 3.029E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.988908\tres = 2.809E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.991293\tres = 2.605E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.993509\tres = 2.415E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.995566\tres = 2.238E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.997475\tres = 2.073E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.999246\tres = 1.920E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.000888\tres = 1.777E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.002409\tres = 1.645E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.003818\tres = 1.522E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.005123\tres = 1.408E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.006331\tres = 1.302E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.007450\tres = 1.203E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.008484\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.009440\tres = 1.028E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.010324\tres = 9.496E-04\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.011141\tres = 8.771E-04\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.011897\tres = 8.100E-04\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.012594\tres = 7.478E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.013238\tres = 6.903E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.013833\tres = 6.371E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.014382\tres = 5.879E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.014889\tres = 5.424E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.015357\tres = 5.004E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.015789\tres = 4.615E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.016187\tres = 4.255E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.016554\tres = 3.923E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.016892\tres = 3.617E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.017204\tres = 3.333E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.017492\tres = 3.072E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.017757\tres = 2.831E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.018001\tres = 2.608E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.018226\tres = 2.403E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.018433\tres = 2.213E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.018624\tres = 2.038E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.018800\tres = 1.877E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.018962\tres = 1.728E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.019110\tres = 1.591E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.019248\tres = 1.465E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.019374\tres = 1.348E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.019490\tres = 1.241E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.019597\tres = 1.142E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.019695\tres = 1.051E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.019786\tres = 9.670E-05\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.019869\tres = 8.895E-05\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.019946\tres = 8.183E-05\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.020016\tres = 7.528E-05\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.020081\tres = 6.922E-05\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.020141\tres = 6.368E-05\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.020195\tres = 5.857E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.020246\tres = 5.385E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.020292\tres = 4.954E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.020335\tres = 4.553E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.020374\tres = 4.185E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.020410\tres = 3.848E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.020443\tres = 3.537E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.020474\tres = 3.253E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.020502\tres = 2.989E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.020527\tres = 2.746E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.020551\tres = 2.526E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.020573\tres = 2.319E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.020593\tres = 2.134E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.020611\tres = 1.960E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.020628\tres = 1.800E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.020643\tres = 1.652E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.020657\tres = 1.518E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.020670\tres = 1.398E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.020682\tres = 1.283E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.020693\tres = 1.178E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.020704\tres = 1.083E-05\n" + ] + } + ], + "source": [ + "# Generate tracks for OpenMOC\n", + "openmoc_geometry.initializeFlatSourceRegions()\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, 32, 0.1)\n", + "track_generator.generateTracks()\n", + "\n", + "# Run OpenMOC\n", + "solver = openmoc.CPUSolver(track_generator)\n", + "solver.computeEigenvalue()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.017105\n", + "openmoc keff = 1.020704\n", + "bias [pcm]: 359.8\n" + ] + } + ], + "source": [ + "# Print report of keff and bias with OpenMC\n", + "openmoc_keff = solver.getKeff()\n", + "openmc_keff = sp.k_combined[0]\n", + "bias = (openmoc_keff - openmc_keff) * 1e5\n", + "\n", + "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", + "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", + "print('bias [pcm]: {0:1.1f}'.format(bias))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a non-trivial bias between the eigenvalues computed by OpenMC and OpenMOC. One can show that these biases do not converge to <100 pcm with more particle histories. For heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "\n", + "* Appropriate transport-corrected cross sections\n", + "* Spatial discretization of OpenMOC's mesh\n", + "* Constant-in-angle multi-group cross sections" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Flux and Pin Power Visualizations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will conclude this tutorial by illustrating how to visualize the fission rates computed by OpenMOC and OpenMC. First, we extract OpenMC's volume-averaged fission rates from each fuel pin into a 2D 17x17 NumPy array." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Get the OpenMC fission rate mesh tally data\n", + "mesh_tally = sp.get_tally(name='mesh tally')\n", + "openmc_fission_rates = mesh_tally.get_values(scores=['nu-fission'])\n", + "\n", + "# Reshape array to 2D for plotting\n", + "openmc_fission_rates.shape = (17,17)\n", + "\n", + "# Compute volume-average rates from OpenMC's volume-integrated fission rates\n", + "openmc_fission_rates /= math.pi * fuel_outer_radius.r**2\n", + "\n", + "# Normalize to the average pin power\n", + "openmc_fission_rates /= np.mean(openmc_fission_rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we extract OpenMOC's volume-averaged fission rates into a 2D 17x17 NumPy array." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Export OpenMOC's fission rates for each pin cell instance in the fuel assembly\n", + "openmoc.process.compute_fission_rates(solver)\n", + "\n", + "# Open the pickle file with the fission rates\n", + "fission_rates = pickle.load(open('fission-rates/fission-rates.pkl', 'rb' ))\n", + "\n", + "# Allocate array for fission rates in each fuel pin\n", + "openmoc_fission_rates = np.zeros((17, 17))\n", + "\n", + "# Extract fission rates for each fuel pin\n", + "for key, value in fission_rates.items():\n", + " lat_x = int(key.split(':')[1].split()[3][1:-1])\n", + " lat_y = int(key.split(':')[1].split()[4][:-1]) \n", + " openmoc_fission_rates[lat_x, lat_y] = value\n", + "\n", + "# Normalize to the average pin fission rate\n", + "openmoc_fission_rates /= np.mean(openmoc_fission_rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can easily use Matplotlib to visualize the fission rates from OpenMC and OpenMOC side-by-side." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAADFCAYAAAB0DhgWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGpFJREFUeJzt3XuUXGWZ7/FvExIhkWS4GC4BD6B5DBdBw6h4o1nAAA6M\nKHAYwXGhMggODDqzDqOM3ISluBxA11HOESMMHkZRwGEIjMpFEJCLCIpcEniiRG6BhIsmIUAInT5/\nvLvIplNV79PdVV39xt9nrazV2fX0ft+966mn99613/2CiIiIiIiIiIiIiIiIiIiIiIiIiBSur9cd\niDCzzwBHAROB9YAbgZPd/Zkutfdz4C3ADHdfXVv+d8D/A/Z095urZR8ATgE2qfp3H/B5d3+wxXpn\nAstqiweBPYHPAo+4+/kj6O98YA93f3q4v9tkXR8HzgMerRb1AauAr7r7xYHfP9rd54y2H+uicZ7H\n+5Hy+A2k9/yhqm+/rf3eLOAs4K2kvH0a+JK7/3eTtk8n5fSTQ146EVgf+Bt3P2oE2/Rd4NJmbY5g\nXdsCD5O2FdJ2rwf8F/A5dx/M/P6+wHx3f2y0fRmu9ce6weEysy8DewH7u/siM5sAfAn4uZn9pbu/\n1KWmV1btXl9b9hHWFDTM7ABgDnCIu99eLTsauMXMdmjygRwETnT37zdp719H2lF332Gkv9vCre6+\nb+M/ZjYTuMPM7nT3h1r9UvXefJW0T6RmnOfx/sCFwKHuflu17DDgOjPrd/f5ZjYDuBn4grt/uIrZ\nHZhrZke4e339kHL9Unf/VIt+/ddINsbdjxzJ77UxUP/8mNlGwLWkP7DfyfzuPwNnAircdWa2CfAZ\nYFd3XwTg7gPA581sb+BjwBwzWw38E/BxYCvg1MaRq5l9qnptA+B24JPu/pKZXQQ8ArwbMMCBg9z9\nRVLS/RQ4nCrhzWxjYDtgYa2Lp1dt3d5Y4O5zzOxxYFgfxKo/C9z9S2Z2PPAP1UvLgU+4+7w2y1cD\nW1cF4QTgGNKRw0PA37v7M5ntHeo1Z2LuvsDMHgJ2Bh4ys3cD3wQmA6uBE9z9Z8B1wDQzmwd8ABgA\n/m/VHsBn3P2nZrY+8C3gfcAE4F7g4+6+fDj7rBQF5PGZpKPr2xoL3P1SM3sHcDLwUdLR87X1syl3\nv8PMPgg80WLTm57RV2d1H3X3vzKzfuDcarv6qm2+vM3ynwNz3P17ZrYncA4pD5cCx7n73dX6D6iW\nvZ+Uh4e6+7wW/XyVuy+v2nhb1dfNge8C/wN4HfANd/+amZ1J+oM4y8xOBK4Ezgb2AyYB33b3s6p1\nNP3c5vrSznqj+eUxsDvwqLv/rslrVwH9tf9v7+5vJ71RXzezjc3s/cAZpFPC7Uhv5Jm13zkUOAx4\nE+kU8cO1164G9jezidX/DyG9OQCY2RRgNrDWKZu7/8Tdn2+xTa0uTw0Cg2b2+qrP73D3HUlHZX/d\nanl9BdUR0P8C+qujiEdJp7aR7W3JzN4L7AT8qlr0beCcqo2vkIowwCdIRzA7uvsjpIT/tbu/perr\nf1RFbD9gW3ef5e4zgXtIhWddVUIeX92kb1fX+tZP81y/Y4SXChqXIc4GPuvuO5H+2H8os7z+ObkU\nOL7Kw68C3zezxufrA8B5Ve7dQPrDk1WdWRwE3FotOpn03u0A7A2cZWYz3P0U0h+sI9z9MuBzwCzS\nwc1OwKFmdkB1BD/0c3tAeC+1MK6PuEnXjVtdt10CvKv2/wsB3N2ro8N3kf4i/tDdF1cx5wM/Il1n\nA7ja3f8EYGb3AdvU1rec9Ob9NSnR/5ZUFBsFZmNSEV5MXB/wVTM7ubbspeqD2ki4l0jJ+fdm9gN3\nn1v1b2Kz5UPWfQBwWe0SzXdIhaFh6Pa+sUU/311dNwfYDHgcONjdG6fXs0lHMQC/ALav9YFq/VNI\n1+4PBXD335vZLVUfHwR2NLMPk47i6kVoXVRCHje7zr646nsjbri5fqiZvW/I8r+tvd5o40gzW1Jd\nhvu7zPKGdwGPN8523f0/zWwOsG31+jx3/031869Jf9iamVDL9cmko+Uz3f2SatkJpO8kcPeFZvYU\n6Yxl6FnGgcBX3H0VsMrMLgYOBq6h/ed2RMb7EfczpFPGZjYnJX3Dc7Wf/0hKtGnA4WY2v3pzfkj1\nJpB2Zv1LwgHSaXvdJcARZjYd2LL+RU3V3mpgRnxzXr3GvUPt39trr/W5+yukv+zvJV2WuNnMdq4S\nYq3lQ9a/GfCn2v//BEwfxvY23N7oH/AFYFl1KaThcOCXZvYg6XpgM9NIH87bavt/N2Cau/8K+Mfq\n35Nm9j0zm9ZiPeuCEvJ4yxZ9axTrZ4CtW2xDM4Okg4gdhvy7d0jcJ4EXgOvNzM3skMxySHm1GWn/\n1NXzfWlt+Wpa5/pALdf3Jx3MXlJ7/R3AT6o+zCftp2Z1c2Pga7X36ARgcqvPc4u+hI33wn07sImZ\n7dLktQOBejF5Q+3nTUgJuQj4bi1p3uLurY4yhxoEfkw6ZT0cuKz+oru/ANxJdURZZ2b/ZGbbD10e\n5e73uPthpOS8hupSRKvlNYuBTWv/35ThHSU1cwGwpZl9CF49lfw2cJS7zyIdyTW7/LOEVER2q+3/\nN7r7N6tt+ZG770W6djiZNUeP66Lxnsc3k44Oh/qbWt9uJF1meQ0z+6CZ/VWLtrN3rbn7Enc/wd23\nAY4DLjKzyS2WT6lt02tyvbpEsgnwVK7NNn2ZT7o8dFpt8X+QvmS1qri3OnN6AviH2nu0vbsfXq03\n97kdtnFduN19Kema0MWWbt3BzNY3s7NISfGDWvhHqtd3JN1ydwcwFzjYzDarXjvIzP6lih+aVGsl\nmbuvJB1Rnkg6yhnqFOALlm6lwsz6zOzTpL+2Q48GQsxsZzO71MwmVn+t7wZWt1pe+9VB0jXIg6vr\nyJC+pGxcuxzRrZ+evkQ7DfhK9aXiG4AVpKOH9YFPVf2eQrptcD0ze33Vx/8GPl29PtnMLjCzrc3s\n443LRe7+R9KXqKuHtr2uKCCPTwJOtvRFKVUb/xM4AvhytejrwDvN7F8a15Gr7z6+RToyHiqbb9U+\nuNHMtqgW/Rp4GWi1fHVtvXcCW1Tf60Dab49V362MxunAUWb2pur/b6jax8yOBKYAG1WvrSIdaUO6\nDHW0ma1X1YGTzWy/wOd2RMZ14QZw93NIR3hXVacgDwB/AexT7YiGJWb2G+DnwD+6+9LqGteXSbdc\nzSN9QdG4DWmQNV+QMOTnukuAZ73JfdnV5YOPAKeZ2QJgHumU6P1VQRquQXe/n/SN/wNmdj9wKulu\njKbL632vLkF8hXQ74nxgKulSR7PtbbXNa8VV1/teAo5x93tIR3BOunY6l1RcbiQdGf4CeLT6QH0a\n6K/6cjfwe3d/nJTku1Wnn/NIX+qcO6w9VZhxnse/JB2Nf7F6T5x0p8s+7v5wFbOEdBfQ7sDvq358\nkXS3xq1D19mkX2u9Vm33d4CfmdkDtW1e1mJ5406ZxpnCYcA3q/15LNUfvRb7pF1f6vviEeDfSZ8j\nSAdnV5jZb0lnhucD3zaz7YDLgR+Y2WdJYx8eIb2v80n3z9+S+dz+eTOz1WbW6hqiSBGUxxI17o+4\nRUTktdaVwt12aKpIIZTHIiIiIiIiPTeiW8TM7GukkUuDpDse7moVu3Ju/+CkZ29qv8JL2r8MwIJA\nTORRS1PyIaG2NsmHsHkg5jf5kJDI8JXAONlV9+djJk4NtBXY9sUts6ZaRX/71wH6bursEy6Hk9u/\nDVzaiAxNjjygZVk+hGYPnRlqYj4k1OdcWxt2YB3R9bySD2FVh9qKpP5G+ZBQn3dtU5+HfY3b0sNf\n3uzu7yE9Qet/D3cdIuORcltKMZIvJ/cCrgCo7gnd2NIDX0RKp9yWIoykcG/Bax9I8zTNn3MgUhrl\nthShE7cD9qHbmGTdpNyWcWkkhXsR6cikYSvWnp5IpETKbSnCSAr3tVRPxDOz2cAT7r6io70S6Q3l\nthRh2IW7enD53WZ2K+mJYcd1vFciPaDcllKMaAYcdz+p0x0RGQ+U21KC7k9ddhf5AS2PZl6HNFlQ\nxqpmD5cc4sWV+Zipu+VjCAxUmXdDYD0BOwa2/YVAfyYHBumEBtdEsiYwwqDZQ5zrBu8LtNNDHdoN\nIZ1aT2RWjchAlJzn8iEdG6QTiYmMlxvL92q0hXddeciUiMifDRVuEZHCqHCLiBRGhVtEpDAq3CIi\nhVHhFhEpjAq3iEhhVLhFRArT/QE4K4ClmZjI7C2L8iETZ+Vj1l+Yj5lw66nZmFc2OSMbE7npfwb5\ntu5cmG9r9vR8WxMW5dtaRL6tjQKzCE0OjELYLvB+ZUVGenRJZOaaiMjsLI8HYiIDP44L5NuFgRx4\nOfP6sYF2zg+0EylQRwXaOq9DbUVmtxkLOuIWESmMCreISGFUuEVECqPCLSJSGBVuEZHCqHCLiBRG\nhVtEpDB93W5g5dH9g5PuvaltzLJ78ut5ITABQuSe6LMC93PulW8qtON2CNzvvCwwo+EW/YHGXsqH\nvPxgPmZ+7p57YHZgPw9sl9/PbJUPyem7tfs53Mq1gRngI/dWR+7RPiawz8/s0L3KMwIxue3K3ecN\nMCkQE+lvZP8NBGJO6dC951sH2ops175tyoyOuEVECqPCLSJSGBVuEZHCqHCLiBRGhVtEpDAq3CIi\nhVHhFhEpjAq3iEhhuj8A50P9g5PubD8Ah53y6/nldfmYt0cmZAh4JDAIJXID/ZJAzOxAnye+Lh8z\nGBjp8YfApAMv5kNCD/7fLtDnqbkBOIF19D3YuwE4VwYG4EQ8EYh5NhAT2RGRvN08EJPLk0gebdih\nmMWBmMhAqIjY5CidcZAG4IiIrDtUuEVECqPCLSJSGBVuEZHCqHCLiBRGhVtEpDAq3CIihVHhFhEp\nTOR+/LWY2Z7AZcD91aL73P2EpsHbAMvar++WwOCaPQOzU/xmaX52igX5pjgs0NZtgZkwAuN42GBp\nYLsCbU0PtPXmyMw178239dSt+bY2XhnYroXt29olMvNPYFafqGHlNTAxsM6nAjHHdWjmpshooJMC\nbX090FZuENaJgXbODrQTmUknsk2d2n+R9+rCQFuRQU7tjKhwV25098NG2b7IeKO8lnFvNJdKejbU\nWKSLlNcy7o30iHsQ2NHMriQN3/+iu1/fuW6J9ITyWoow0iPuBcDp7n4QcCRwgZmN5rKLyHigvJYi\njKhwu/sid7+s+vlh0ncwnXoolkhPKK+lFCMq3GZ2hJmdVv08nXRTQ+TplCLjlvJaSjHS08C5wPfN\n7BfABODT7t6pR96K9IryWoowosLt7s8DH+xwX0R6Snktpej+DDhH9w9OujczA86K/Hqeuj8fs0Vg\nFMrCwLQ0kRvxNwvMzhIRaeumlfmYHQLriQxm2CkykidgReA9nTIzExCY9qXvsd7dvndt4O0LTDrE\nC4GYyGCfyKlBZiwcEJvlJSdyfalTXx5EZgeKTI4VOYqNzP40ORAT2cf7agYcEZF1hwq3iEhhVLhF\nRAqjwi0iUhgVbhGRwqhwi4gURoVbRKQwKtwiIoXp/pPPdgY2ah+y6oL8aiKDa5iSD9kusJ7vBQbp\nfHSrfMyChfmYGYE+7xN4l5YHBryE7ByICeyfSY91YD2zAuuItNMlL3ZoPZGBM5FRRpH+dGr8fu6t\ni/QlkEahmZ0GAjGR/mwYiOnU/htt7uiIW0SkMCrcIiKFUeEWESmMCreISGFUuEVECqPCLSJSGBVu\nEZHCqHCLiBSm+wNw5gP3ZTqRmwkFmHDXqdmYCzkjG/OWfFN8jHxbGy7Mt/WhwDQXE5/Lt3V1YLsC\n44GYHdiuV+7Jt/VCYEaeqSvybT2yrH1bWx+eb4cbAjFdEhmwEZmd5ZjA+3J+IAciM+mcGGjrrEBb\nuQEkZwTaOTXQTmTGmZMCbZ0daGtCoK1jA21F6tBoZxnSEbeISGFUuEVECqPCLSJSGBVuEZHCqHCL\niBRGhVtEpDAq3CIihVHhFhEpTGRijVFZeXD/4KRf3dQ+KDAM6LeB2WR2DQzkWbwgH7PB6/Ix0wJt\nRab4+GEg5p2BprYN3NE/GFjPevvmYxb8IB8TGQyya256kzfm19F3V/dzuJUrA7s0MtPJ0kDMpEBM\npK1ITGTWmVzaLgusY2qH+rI4EDM5EBMZUPVyIGZah9o6qE191hG3iEhhVLhFRAqjwi0iUhgVbhGR\nwqhwi4gURoVbRKQwKtwiIoVR4RYRKUx26IuZ7QJcAZzr7ueZ2TbAxaSi/yTwMXeP3Jfe0rOP5mMi\ng2uWBdazYWBwzeLADC8v3Z+P+UM+JDQTxqaBPvcFBjH1RRp7LB8yM/BeXBcY6JQdqRCZkmQURpvb\nkUEUkQEvkcE1kamqIv2JzCgTkRsYE2knMrgmYmIgJrJvuj8d2BqR/rTT9ojbzCYD5wDXsGaU2BnA\nN9x9D+B3wCdH2QeRMafclpLlLpWsBA7ktaNK+4G51c9XAft0oV8i3abclmK1PTtw9wFgwMzqi6e4\ne+NM6Glgyy71TaRrlNtSstF+OdmzB/yIdJlyW8atkRTu582s8XXZDGBRB/sj0kvKbSlCtHD3seYI\n5Hrg0OrnQ4CfdLpTImNIuS3FaXuN28x2B+aQ7tx5xcyOAfYHLqp+/gPw3W53UqTTlNtSstyXk3cA\nb23yUuBx+yLjl3JbStb1e86XPQt9mSuFqwby65mw4NRszMDMM7IxcwMDQz5Mvq3byLe1Qb4p3hNo\na2Bavq3ITDpHLAm0NT3f1gOBtvYLbNfNC9q39b7ILEM99EogJjIT0FGBfXVWIN8iTgq09fVAW7lt\nj7RzdqCdSIH67Djbfxd2YP/laMi7iEhhVLhFRAqjwi0iUhgVbhGRwqhwi4gURoVbRKQwKtwiIoVR\n4RYRKUzXn4C28vT+wUkLbmofdFt+PSsCgz5+vyLWp5zXB2L+GIjZNjCDy1OBwUfbBGbAmbpHoK3r\n8jGRhNg8MHXJisB7MeWd7V9/9ub8OjYb6N1T/K5cMwHDqDweiInkW0RkQMvmgZjczD6RgUeTAzGR\nmWKeCsQEPmYhkUmkZnSorYPafBx1xC0iUhgVbhGRwqhwi4gURoVbRKQwKtwiIoVR4RYRKYwKt4hI\nYVS4RUQK0/UZcFhd/Wtn0/xqli/Mx7wtMDvFaYHZKfbON8XEQMyGgSlwtngpHzN1q3zM4N35mOX5\nEN4caGvCovx+Xj4lMOPIy+1f3nT7/CoIzGjULZHBIZGZTiIfwlMCuX1mh2Z5ifQnt+2RdUQ+Q5H1\nREZgRUZKnRrYx+cH9nGntqsdHXGLiBRGhVtEpDAq3CIihVHhFhEpjAq3iEhhVLhFRAqjwi0iUhgV\nbhGRwnR/BpxTAzPg3BdY0ax8yAOX52N2fFs+Zv178jfiD2yTvxH/4cfybc0M3PT/u8BN/zOm5dva\ncGlgu7bKtzU4Jd9WX6A/5NazONDOg72bAeeODs2AsyoQMy8QExnsc3wg3y4M5Ftm7BTHdmgwS2Sg\nylGBts7rUFs7BGIiA3AidtcMOCIi6w4VbhGRwqhwi4gURoVbRKQwKtwiIoVR4RYRKYwKt4hIYVS4\nRUQKkx28YGa7AFcA57r7eWZ2ETAbeLYK+Td3/3Gr31/5hf7BSZ4ZgLMk0NOZgZiWvagJDMAZfDgf\n81xg5pWJgTv6F67Mx+waGHxEYLaYyHZd82A+Zv/APgz5y8zrE/Kr6Dt/5ANwRpvbDwQG4EQGxbwY\niHkuEBMZyPNsPoTJgZicF8aonWhbgUm2QgNnNgnERGZGigz22alNfW77+2Y2GTgHuIY1SToIfL5d\nQouMd8ptKVnuUslK4EDS4ON69e/ZMGORDlFuS7HaHnG7+wAwYGZDXzrezP6ZdJHjeHePnIGJjBvK\nbSnZSL6cvBj4nLvvDdwDnN7RHon0jnJbijDsWeLd/Ybaf68C/k/nuiPSO8ptKUX0iPvV635mdrmZ\nvbX67x7EHsoqMl4pt6U4ubtKdgfmANOBV8zsWOA04N/N7HlgOfCJrvdSpMOU21Ky3JeTdwBvbfLS\nf3anOyJjQ7ktJRv2Ne5hmwX8RSbm6sB67grE7BaICczM0he4j2DTzfMxCxflY2YGZpNZ9WQ+JjJ4\noC/Q5/0jIz0is9tMDcTkLOzAOrooMrimUx+wyHoiA3C26FBbuUFDkYEqkYFHkcEskVSL7JuxfK8i\nudOOhryLiBRGhVtEpDAq3CIihVHhFhEpjAq3iEhhVLhFRAqjwi0iUpiu38c9MPVNrHp5afug7QIr\nej4QE7lJ9fWBmNWdWc96m+VjBgI3qvYFJhQg0Fbo5trIQ023DcRE9nOuP6HDinsiQV2x/i75GSUi\nH7BJgZjI/cyR3RXpTyTdcm29rgPriK5nIBATuW860lbkvepYUb23d7ktIiIiIiIiIiIiIiIiIiIi\nIiIiIl0XuWu3Y8zsa8C7gEHgM+4eecp2z5jZnsBlwP3Vovvc/YTe9ag1M9sFuAI4193PM7NtSJPf\nrgc8CXzM3V/uZR+HatLni4DZQOOJ6P/m7j/uVf+GQ7ndPcrttXV/IoWKmfUDb3b395jZLOBC4D1j\n1f4o3Ojuh/W6E+2Y2WTgHOAaUuEAOAP4hrv/yMy+BHwS+FaPuriWFn0eBD5fSrFuUG53j3K7ubEc\n8r4X6S8Q7v4gsLGZRcbX9dqYnpWM0ErgQGBxbVk/MLf6+Spgn7HuVEa9z/V9XML+Hkq53T3K7SbG\nsnBvATxT+//TwJZj2P5IDAI7mtmVZnaLmY23BAHA3QfcfeWQxVPcvTFj07jb1y36DHC8mf3MzC4x\ns03HvGMjo9zuEuV2c718yFQfa04jxqsFwOnufhBwJHCBmY3Z5aUOKuHICtJ1y8+5+96kh5Cc3tvu\njJhye+z8Web2WBbuRbz2MVBbkb5YGLfcfZG7X1b9/DDwFDCjt70Ke97MGs/NmUHa/+Oau9/g7vdW\n/72K5rOwj0fK7bH1Z5/bY1m4rwUOBTCz2cAT7r5iDNsfNjM7wsxOq36eDkwHnuhtr9rqY80RyPVU\n+xs4BPhJT3qU9+oRk5ldbmaNhN4DuK83XRo25Xb3KbebrXgsmNlZpE4PAMe5+7j+YFZfMH2f9ADS\nCcAX3f2nve3V2sxsd2AO6cP3CumWo/2Bi4ANgD8An3D3yBMwx0STPj8HnAb8K+khvstJfX6m5UrG\nEeV2dyi3RURERERERERERERERERERERERERERERERGTY/j/0gdXw8QyiJwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot OpenMC's fission rates in the left subplot\n", + "fig = pylab.subplot(121)\n", + "pylab.imshow(openmc_fission_rates, interpolation='none', cmap='jet')\n", + "pylab.grid()\n", + "pylab.title('OpenMC Fission Rates')\n", + "\n", + "# Plot OpenMOC's fission rates in the right subplot\n", + "fig2 = pylab.subplot(122)\n", + "pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet')\n", + "pylab.grid()\n", + "pylab.title('OpenMOC Fission Rates')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb deleted file mode 100644 index f4e4b59eff..0000000000 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb +++ /dev/null @@ -1,2454 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook demonstrates how to use the **``openmc.mgxs``** module to generate multi-group cross sections with OpenMC.\n", - "\n", - "**Note:** that this Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", - "because the backend has already been chosen;\n", - "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", - "or matplotlib.backends is imported for the first time.\n", - "\n", - " warnings.warn(_use_error_msg)\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import openmc\n", - "import openmc.mgxs as mgxs\n", - "import openmoc\n", - "from openmoc.compatible import get_openmoc_geometry\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Infinite Homogeneous Medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Inputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "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')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the nuclides we defined, we will now create a material for the homogeneous medium." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a Material and register the Nuclides\n", - "inf_medium = openmc.Material(name='moderator')\n", - "inf_medium.set_density('g/cc', 5.)\n", - "inf_medium.add_nuclide(h1, 0.028999667)\n", - "inf_medium.add_nuclide(o16, 0.01450188)\n", - "inf_medium.add_nuclide(u235, 0.000114142)\n", - "inf_medium.add_nuclide(u238, 0.006886019)\n", - "inf_medium.add_nuclide(zr90, 0.002116053)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our material, we can now create a materials file object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.default_xs = '71c'\n", - "materials_file.add_material(inf_medium)\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate boundary Planes\n", - "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", - "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", - "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", - "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a Cell\n", - "cell = openmc.Cell(cell_id=1, name='cell')\n", - "\n", - "# Register bounding Surfaces with the Cell\n", - "cell.region = +min_x & -max_x & +min_y & -max_y\n", - "\n", - "# Fill the Cell with the Material\n", - "cell.fill = inf_medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# OpenMC simulation parameters\n", - "batches = 50\n", - "inactive = 10\n", - "particles = 2500\n", - "\n", - "# Instantiate a SettingsFile\n", - "settings_file = openmc.SettingsFile()\n", - "settings_file.batches = batches\n", - "settings_file.inactive = inactive\n", - "settings_file.particles = particles\n", - "settings_file.output = {'tallies': True, 'summary': True}\n", - "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", - "settings_file.set_source_space('box', bounds)\n", - "\n", - "# Export to \"settings.xml\"\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a \"fine\" 8-group EneryGroups object\n", - "fine_groups = mgxs.EnergyGroups()\n", - "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", - " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", - "\n", - "# Instantiate a \"coarse\" 2-group EneryGroups object\n", - "coarse_groups = mgxs.EnergyGroups()\n", - "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", - "\n", - "* `TotalXS`\n", - "* `TransportXS`\n", - "* `AbsorptionXS`\n", - "* `CaptureXS`\n", - "* `FissionXS`\n", - "* `NuFissionXS`\n", - "* `ScatterXS`\n", - "* `NuScatterXS`\n", - "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", - "* `Chi`\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 cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define total, nu-fission, nu-scatter and chi cross sections for our infinite medium cell as the domain and our fine 8-group structure as our energy groups." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate cross sections needed for an OpenMOC simulation\n", - "transport = mgxs.TransportXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "nufission = mgxs.NuFissionXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "nuscatter = mgxs.NuScatterMatrixXS(domain=cell, domain_type='cell', groups=fine_groups)\n", - "chi = mgxs.Chi(domain=cell, domain_type='cell', groups=fine_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "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 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['flux']\n", - "\tEstimator =\ttracklength\n", - "), ('nu-fission', Tally\n", - "\tID =\t10001\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n", - " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n", - " 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['nu-fission']\n", - "\tEstimator =\ttracklength\n", - ")])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nufission.tallies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `NuFission` object includes tracklength tallies for the 'nu-fission' and 'flux' scores in the 8-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Add transport tallies to the tallies file\n", - "for tally in transport.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add nu-fission tallies to the tallies file\n", - "for tally in nufission.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add nu-scatter tallies to the tallies file\n", - "for tally in nuscatter.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Add chi tallies to the tallies file \n", - "for tally in chi.tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - " \n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "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", - " Copyright: 2011-2015 Massachusetts Institute of Technology\n", - " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.7.0\n", - " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-11-01 21:28:30\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\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", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.19804 \n", - " 2/1 1.12945 \n", - " 3/1 1.15573 \n", - " 4/1 1.13929 \n", - " 5/1 1.16300 \n", - " 6/1 1.22117 \n", - " 7/1 1.19012 \n", - " 8/1 1.11299 \n", - " 9/1 1.16066 \n", - " 10/1 1.12566 \n", - " 11/1 1.20854 \n", - " 12/1 1.14691 1.17773 +/- 0.03082\n", - " 13/1 1.17204 1.17583 +/- 0.01789\n", - " 14/1 1.14148 1.16724 +/- 0.01529\n", - " 15/1 1.17272 1.16834 +/- 0.01189\n", - " 16/1 1.18575 1.17124 +/- 0.01014\n", - " 17/1 1.20498 1.17606 +/- 0.00983\n", - " 18/1 1.14754 1.17249 +/- 0.00923\n", - " 19/1 1.18141 1.17348 +/- 0.00820\n", - " 20/1 1.15074 1.17121 +/- 0.00768\n", - " 21/1 1.15914 1.17011 +/- 0.00703\n", - " 22/1 1.14586 1.16809 +/- 0.00673\n", - " 23/1 1.18999 1.16978 +/- 0.00642\n", - " 24/1 1.15101 1.16844 +/- 0.00609\n", - " 25/1 1.13791 1.16640 +/- 0.00602\n", - " 26/1 1.19791 1.16837 +/- 0.00597\n", - " 27/1 1.19818 1.17012 +/- 0.00587\n", - " 28/1 1.14160 1.16854 +/- 0.00576\n", - " 29/1 1.11487 1.16571 +/- 0.00614\n", - " 30/1 1.17538 1.16620 +/- 0.00584\n", - " 31/1 1.20210 1.16791 +/- 0.00581\n", - " 32/1 1.20078 1.16940 +/- 0.00574\n", - " 33/1 1.14624 1.16839 +/- 0.00558\n", - " 34/1 1.14618 1.16747 +/- 0.00542\n", - " 35/1 1.16866 1.16752 +/- 0.00520\n", - " 36/1 1.18565 1.16821 +/- 0.00504\n", - " 37/1 1.16824 1.16821 +/- 0.00485\n", - " 38/1 1.18299 1.16874 +/- 0.00471\n", - " 39/1 1.21418 1.17031 +/- 0.00480\n", - " 40/1 1.11167 1.16835 +/- 0.00504\n", - " 41/1 1.11545 1.16665 +/- 0.00516\n", - " 42/1 1.11114 1.16491 +/- 0.00529\n", - " 43/1 1.14227 1.16423 +/- 0.00517\n", - " 44/1 1.14104 1.16355 +/- 0.00506\n", - " 45/1 1.16756 1.16366 +/- 0.00492\n", - " 46/1 1.13065 1.16274 +/- 0.00487\n", - " 47/1 1.11251 1.16139 +/- 0.00492\n", - " 48/1 1.14731 1.16101 +/- 0.00481\n", - " 49/1 1.16691 1.16117 +/- 0.00469\n", - " 50/1 1.19679 1.16206 +/- 0.00465\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 1.9120E+00 seconds\n", - " Reading cross sections = 4.8600E-01 seconds\n", - " Total time in simulation = 6.1145E+01 seconds\n", - " Time in transport only = 6.0977E+01 seconds\n", - " Time in inactive batches = 8.1390E+00 seconds\n", - " Time in active batches = 5.3006E+01 seconds\n", - " Time synchronizing fission bank = 1.6000E-02 seconds\n", - " Sampling source sites = 1.2000E-02 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 1.0000E-02 seconds\n", - " Total time elapsed = 6.3104E+01 seconds\n", - " Calculation Rate (inactive) = 3071.63 neutrons/second\n", - " Calculation Rate (active) = 1886.58 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.16131 +/- 0.00453\n", - " k-effective (Track-length) = 1.16206 +/- 0.00465\n", - " k-effective (Absorption) = 1.16096 +/- 0.00364\n", - " Combined k-effective = 1.16120 +/- 0.00325\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Run OpenMC!\n", - "executor = openmc.Executor()\n", - "executor.run_simulation()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.50.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the summary file and link it with the statepoint\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide\n" - ] - } - ], - "source": [ - "# Load the tallies from the statepoint into each MGXS object\n", - "transport.load_from_statepoint(sp)\n", - "nufission.load_from_statepoint(sp)\n", - "nuscatter.load_from_statepoint(sp)\n", - "chi.load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! Our multi-group cross sections are now ready to rock 'n roll!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cross Section Data Visualization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first inspect our fission production cross section by printing it to the screen." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 7.69e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t6.59e-04 +/- 2.97e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t8.95e-03 +/- 5.12e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.45e-02 +/- 7.10e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.71e-02 +/- 1.02e+00%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.86e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 6.67e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t2.38e-01 +/- 7.71e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "nufission.print_xs()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1264: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
63111total0.0769700.001012
62112total0.0878760.000344
61113total0.0004180.000023
60114total0.0000000.000000
59115total0.0000000.000000
58116total0.0000000.000000
57117total0.0000000.000000
56118total0.0000000.000000
55121total0.0000000.000000
54122total0.2664990.001265
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "63 1 1 1 total 0.076970 0.001012\n", - "62 1 1 2 total 0.087876 0.000344\n", - "61 1 1 3 total 0.000418 0.000023\n", - "60 1 1 4 total 0.000000 0.000000\n", - "59 1 1 5 total 0.000000 0.000000\n", - "58 1 1 6 total 0.000000 0.000000\n", - "57 1 1 7 total 0.000000 0.000000\n", - "56 1 1 8 total 0.000000 0.000000\n", - "55 1 2 1 total 0.000000 0.000000\n", - "54 1 2 2 total 0.266499 0.001265" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = nuscatter.get_pandas_dataframe()\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "transport.export_xs_data(filename='transport-xs', format='excel')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following code snippet shows how to export all of four cross sections to the same HDF5 binary data store." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "transport.build_hdf5_store(filename='mgxs', append=True)\n", - "nufission.build_hdf5_store(filename='mgxs', append=True)\n", - "nuscatter.build_hdf5_store(filename='mgxs', append=True)\n", - "chi.build_hdf5_store(filename='mgxs', append=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Verification with OpenMOC" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we can inject the multi-group cross sections into the equivalent infinite homogeneous medium OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Get all OpenMOC cells in the gometry\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Get a reference to the Material filling this Cell\n", - " openmoc_material = cell.getFillMaterial()\n", - " \n", - " # Set the number of energy groups for the Material\n", - " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " openmoc_material.setSigmaT(transport.get_xs().flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs().flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs().flatten())\n", - " openmoc_material.setChi(chi.get_xs().flatten())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.685184\tres = 1.483E-316\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.785642\tres = 3.148E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.750185\tres = 1.466E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.728846\tres = 4.513E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.695632\tres = 2.844E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.663357\tres = 4.557E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.632339\tres = 4.640E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.604187\tres = 4.676E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.579451\tres = 4.452E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.558474\tres = 4.094E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.541436\tres = 3.620E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.528380\tres = 3.051E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.519273\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.513991\tres = 1.724E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.512364\tres = 1.017E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.514171\tres = 3.165E-03\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.519155\tres = 3.527E-03\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.527038\tres = 9.693E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.537524\tres = 1.518E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.550310\tres = 1.990E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.565096\tres = 2.379E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.581585\tres = 2.687E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599493\tres = 2.918E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.618548\tres = 3.079E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.638497\tres = 3.179E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.659105\tres = 3.225E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.680156\tres = 3.228E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.701457\tres = 3.194E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.722832\tres = 3.132E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.744127\tres = 3.047E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.765209\tres = 2.946E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.785961\tres = 2.833E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.806283\tres = 2.712E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.826093\tres = 2.586E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.845324\tres = 2.457E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.863921\tres = 2.328E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.881841\tres = 2.200E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.899055\tres = 2.074E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.915540\tres = 1.952E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.931284\tres = 1.834E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.946283\tres = 1.720E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.960536\tres = 1.610E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.974052\tres = 1.506E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.986841\tres = 1.407E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.998920\tres = 1.313E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 1.010307\tres = 1.224E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 1.021023\tres = 1.140E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 1.031091\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 1.040537\tres = 9.861E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 1.049386\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.057664\tres = 8.504E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.065399\tres = 7.889E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.072617\tres = 7.313E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.079345\tres = 6.775E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.085610\tres = 6.273E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.091437\tres = 5.804E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.096851\tres = 5.367E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.101878\tres = 4.961E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.106540\tres = 4.583E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.110861\tres = 4.231E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.114862\tres = 3.905E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.118564\tres = 3.602E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.121987\tres = 3.321E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.125150\tres = 3.060E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.128070\tres = 2.819E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.130764\tres = 2.595E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.133249\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.135539\tres = 2.197E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.137649\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.139591\tres = 1.858E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.141378\tres = 1.707E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.143021\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.144532\tres = 1.440E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.145920\tres = 1.322E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.147196\tres = 1.213E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.148366\tres = 1.113E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.149440\tres = 1.020E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.150426\tres = 9.355E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.151330\tres = 8.574E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.152158\tres = 7.856E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.152918\tres = 7.196E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.153613\tres = 6.590E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.154250\tres = 6.033E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.154833\tres = 5.522E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.155367\tres = 5.053E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.155856\tres = 4.623E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.156303\tres = 4.228E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.156711\tres = 3.866E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.157085\tres = 3.535E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.157427\tres = 3.231E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.157739\tres = 2.952E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158024\tres = 2.697E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.158285\tres = 2.464E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.158523\tres = 2.251E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.158740\tres = 2.055E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.158939\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.159120\tres = 1.713E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.159285\tres = 1.563E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.159436\tres = 1.427E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.159574\tres = 1.302E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.159699\tres = 1.188E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.159814\tres = 1.083E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.159918\tres = 9.880E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.160014\tres = 9.009E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.160101\tres = 8.215E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.160180\tres = 7.490E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.160252\tres = 6.827E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.160318\tres = 6.223E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.160378\tres = 5.672E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.160432\tres = 5.169E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.160482\tres = 4.710E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.160528\tres = 4.291E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.160569\tres = 3.909E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.160607\tres = 3.561E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.160641\tres = 3.244E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.160672\tres = 2.954E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.160700\tres = 2.691E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.160726\tres = 2.450E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.160750\tres = 2.231E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.160771\tres = 2.031E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.160791\tres = 1.849E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.160809\tres = 1.684E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.160825\tres = 1.533E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.160840\tres = 1.395E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.160853\tres = 1.270E-05\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.160865\tres = 1.156E-05\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.160876\tres = 1.052E-05\n" - ] - } - ], - "source": [ - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.161200\n", - "openmoc keff = 1.160876\n", - "bias [pcm]: -32.4\n" - ] - } - ], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although there is a non-trivial bias, one can easily run the preceding code with more particle histories to show that both codes converge to the same eigenvalue with <10 pcm bias. It should be noted that this discrepancy is due to use of tracklength tallies for `NuFission`, while one must use more slowly converging analog tallies for `TransportXS`, `NuScatterMatrixXS` and `Chi` (which require an 'energyout' filter)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Fuel Pin Cell" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Inputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "this time we separate our nuclides into three distinct materials for water, clad and fuel." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# 1.6 enriched fuel\n", - "fuel = openmc.Material(name='1.6% Fuel')\n", - "fuel.set_density('g/cm3', 10.31341)\n", - "fuel.add_nuclide(u235, 3.7503e-4)\n", - "fuel.add_nuclide(u238, 2.2625e-2)\n", - "fuel.add_nuclide(o16, 4.6007e-2)\n", - "\n", - "# borated water\n", - "water = openmc.Material(name='Borated Water')\n", - "water.set_density('g/cm3', 0.740582)\n", - "water.add_nuclide(h1, 4.9457e-2)\n", - "water.add_nuclide(o16, 2.4732e-2)\n", - "\n", - "# zircaloy\n", - "zircaloy = openmc.Material(name='Zircaloy')\n", - "zircaloy.set_density('g/cm3', 6.55)\n", - "zircaloy.add_nuclide(zr90, 7.2758e-3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our materials, we can now create a materials file object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, add Materials\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.add_material(fuel)\n", - "materials_file.add_material(water)\n", - "materials_file.add_material(zircaloy)\n", - "materials_file.default_xs = '71c'\n", - "\n", - "# Export to \"materials.xml\"\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create cylinders for the fuel and clad\n", - "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", - "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", - "\n", - "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", - "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", - "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", - "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", - "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", - "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", - "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create a Universe to encapsulate a fuel pin\n", - "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", - "\n", - "# Create fuel Cell\n", - "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", - "fuel_cell.fill = fuel\n", - "fuel_cell.region = -fuel_outer_radius\n", - "pin_cell_universe.add_cell(fuel_cell)\n", - "\n", - "# Create a clad Cell\n", - "clad_cell = openmc.Cell(name='1.6% Clad')\n", - "clad_cell.fill = zircaloy\n", - "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", - "pin_cell_universe.add_cell(clad_cell)\n", - "\n", - "# Create a moderator Cell\n", - "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", - "moderator_cell.fill = water\n", - "moderator_cell.region = +clad_outer_radius\n", - "pin_cell_universe.add_cell(moderator_cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create root Cell\n", - "root_cell = openmc.Cell(name='root cell')\n", - "root_cell.region = +min_x & -max_x & +min_y & -max_y\n", - "root_cell.fill = pin_cell_universe\n", - "\n", - "# Create root Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(root_cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will reuse our settings from the previous simulation. Now, we let's create transport, nu-fission, nu-scatter and chi multi-group cross sections for each cell." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Extract all Cells filled by Materials\n", - "openmc_cells = openmc_geometry.get_all_material_cells()\n", - "\n", - "# Create dictionary to store multi-group cross sections for all cells\n", - "xs_library = {}\n", - "\n", - "# Instantiate 8-group cross sections for each cell\n", - "for cell in openmc_cells:\n", - " xs_library[cell.id] = {}\n", - " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n", - " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n", - " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n", - " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create a tally trigger set to +/- 0.01 for each tally\n", - "# used to compute the multi-group cross sections\n", - "tally_trigger = openmc.Trigger('std_dev', 1E-2)\n", - "\n", - "# Add the tally trigger to each of the multi-group cross section tallies\n", - "for cell in openmc_cells:\n", - " for mgxs_type in xs_library[cell.id]:\n", - " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger\n", - " \n", - "# Set the trigger to active in the \"settings.xml\" file\n", - "settings_file.trigger_active = True\n", - "settings_file.particles *= 4\n", - "settings_file.trigger_max_batches = settings_file.batches * 4\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, we did not give our cross sections a spatial domain in their constructors. Instead, we will loop over all cells to set each cross sections domain. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Iterate over all cells and cross section types\n", - "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id]:\n", - "\n", - " # Set the cross sections domain type to the cell\n", - " xs_library[cell.id][rxn_type].domain = cell\n", - " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", - " \n", - " # Tally cross sections by nuclide (e.g., micro cross sections)\n", - " xs_library[cell.id][rxn_type].by_nuclide = True\n", - " \n", - " # Add OpenMC tallies to the tallies file for XML generation\n", - " for tally in xs_library[cell.id][rxn_type].tallies.values():\n", - " tallies_file.add_tally(tally, merge=True)\n", - "\n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "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", - " Copyright: 2011-2015 Massachusetts Institute of Technology\n", - " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.7.0\n", - " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-11-01 21:29:37\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading tallies XML file...\n", - " Building neighboring cells lists for each surface...\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 92238.71c\n", - " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 1001.71c\n", - " Loading ACE cross section table: 40090.71c\n", - " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.23985 \n", - " 2/1 1.24082 \n", - " 3/1 1.22031 \n", - " 4/1 1.21649 \n", - " 5/1 1.23229 \n", - " 6/1 1.21957 \n", - " 7/1 1.22515 \n", - " 8/1 1.21309 \n", - " 9/1 1.23939 \n", - " 10/1 1.23865 \n", - " 11/1 1.22776 \n", - " 12/1 1.21661 1.22219 +/- 0.00558\n", - " 13/1 1.22202 1.22213 +/- 0.00322\n", - " 14/1 1.23251 1.22473 +/- 0.00345\n", - " 15/1 1.23965 1.22771 +/- 0.00401\n", - " 16/1 1.21441 1.22549 +/- 0.00395\n", - " 17/1 1.23348 1.22663 +/- 0.00353\n", - " 18/1 1.21121 1.22471 +/- 0.00361\n", - " 19/1 1.20506 1.22252 +/- 0.00386\n", - " 20/1 1.22275 1.22255 +/- 0.00346\n", - " 21/1 1.21700 1.22204 +/- 0.00317\n", - " 22/1 1.20841 1.22091 +/- 0.00311\n", - " 23/1 1.21302 1.22030 +/- 0.00292\n", - " 24/1 1.22504 1.22064 +/- 0.00272\n", - " 25/1 1.22325 1.22081 +/- 0.00254\n", - " 26/1 1.22988 1.22138 +/- 0.00244\n", - " 27/1 1.21374 1.22093 +/- 0.00234\n", - " 28/1 1.21434 1.22056 +/- 0.00224\n", - " 29/1 1.24678 1.22194 +/- 0.00253\n", - " 30/1 1.22600 1.22215 +/- 0.00240\n", - " 31/1 1.22783 1.22242 +/- 0.00230\n", - " 32/1 1.23107 1.22281 +/- 0.00223\n", - " 33/1 1.23041 1.22314 +/- 0.00216\n", - " 34/1 1.21147 1.22266 +/- 0.00212\n", - " 35/1 1.23184 1.22302 +/- 0.00207\n", - " 36/1 1.22513 1.22310 +/- 0.00199\n", - " 37/1 1.22969 1.22335 +/- 0.00193\n", - " 38/1 1.21288 1.22297 +/- 0.00190\n", - " 39/1 1.23967 1.22355 +/- 0.00192\n", - " 40/1 1.21419 1.22324 +/- 0.00188\n", - " 41/1 1.23212 1.22352 +/- 0.00184\n", - " 42/1 1.20703 1.22301 +/- 0.00185\n", - " 43/1 1.24153 1.22357 +/- 0.00188\n", - " 44/1 1.23561 1.22392 +/- 0.00186\n", - " 45/1 1.20369 1.22335 +/- 0.00190\n", - " 46/1 1.24517 1.22395 +/- 0.00194\n", - " 47/1 1.22985 1.22411 +/- 0.00189\n", - " 48/1 1.23570 1.22442 +/- 0.00187\n", - " 49/1 1.22288 1.22438 +/- 0.00182\n", - " 50/1 1.20470 1.22389 +/- 0.00184\n", - " Triggers unsatisfied, max unc./thresh. is 1.18932 for flux in tally 10080\n", - " The estimated number of batches is 67\n", - " Creating state point statepoint.050.h5...\n", - " 51/1 1.24158 1.22432 +/- 0.00185\n", - " 52/1 1.24407 1.22479 +/- 0.00186\n", - " 53/1 1.23412 1.22500 +/- 0.00183\n", - " 54/1 1.25172 1.22561 +/- 0.00189\n", - " 55/1 1.22653 1.22563 +/- 0.00185\n", - " 56/1 1.24741 1.22610 +/- 0.00187\n", - " 57/1 1.24342 1.22647 +/- 0.00186\n", - " 58/1 1.20365 1.22600 +/- 0.00189\n", - " 59/1 1.23576 1.22620 +/- 0.00186\n", - " 60/1 1.21398 1.22595 +/- 0.00184\n", - " 61/1 1.22186 1.22587 +/- 0.00180\n", - " 62/1 1.23502 1.22605 +/- 0.00178\n", - " 63/1 1.23328 1.22618 +/- 0.00175\n", - " 64/1 1.23990 1.22644 +/- 0.00173\n", - " 65/1 1.23283 1.22655 +/- 0.00171\n", - " 66/1 1.21605 1.22637 +/- 0.00169\n", - " 67/1 1.22322 1.22631 +/- 0.00166\n", - " Triggers satisfied for batch 67\n", - " Creating state point statepoint.067.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 2.0080E+00 seconds\n", - " Reading cross sections = 4.3400E-01 seconds\n", - " Total time in simulation = 9.0060E+02 seconds\n", - " Time in transport only = 9.0020E+02 seconds\n", - " Time in inactive batches = 7.3259E+01 seconds\n", - " Time in active batches = 8.2734E+02 seconds\n", - " Time synchronizing fission bank = 6.9000E-02 seconds\n", - " Sampling source sites = 4.7000E-02 seconds\n", - " SEND/RECV source sites = 2.2000E-02 seconds\n", - " Time accumulating tallies = 5.0000E-03 seconds\n", - " Total time for finalization = 7.7000E-02 seconds\n", - " Total time elapsed = 9.0285E+02 seconds\n", - " Calculation Rate (inactive) = 1365.02 neutrons/second\n", - " Calculation Rate (active) = 483.479 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.22548 +/- 0.00143\n", - " k-effective (Track-length) = 1.22631 +/- 0.00166\n", - " k-effective (Absorption) = 1.22204 +/- 0.00138\n", - " Combined k-effective = 1.22386 +/- 0.00114\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Delete old HDF5 files\n", - "!rm *.h5\n", - "\n", - "# Run OpenMC with the output throttled!\n", - "executor = openmc.Executor()\n", - "executor.run_simulation(output=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. As before, we begin our analysis here loading the statepoint file." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint and summary files\n", - "sp = openmc.StatePoint('statepoint.067.h5')\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object and to compute the cross sections using tally arithmetic." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Iterate over all cells and cross section types\n", - "for cell in openmc_cells:\n", - " for rxn_type in xs_library[cell.id]:\n", - " xs_library[cell.id][rxn_type].load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That's it! Our multi-group cross sections are now ready for the big spotlight. This time we have cross sections in three distinct spatial zones - fuel, clad and moderator - on a per-nuclide basis." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cross Section Data Visualization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first inspect one of our cross sections by printing it to the screen as a microscopic cross section in units of barns." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 2.13e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 1.54e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.51e+01 +/- 2.36e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.76e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 4.10e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.94e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 3.44e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.37e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [barns]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.47e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 3.07e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t5.72e-04 +/- 3.47e+00%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.29e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.20e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.94e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 3.44e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.37e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "nufission = xs_library[fuel_cell.id]['nu-fission']\n", - "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our multi-group cross sections are capable of summing across all nuclides to provide us with macroscopic cross sections as well." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [0.821 - 20.0 MeV]:\t2.53e-02 +/- 2.35e-01%\n", - " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.51e-01%\n", - " Group 3 [4e-06 - 0.00553 MeV]:\t2.07e-02 +/- 2.36e-01%\n", - " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.76e-01%\n", - " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.10e-01%\n", - " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.94e-01%\n", - " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 3.44e-01%\n", - " Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.37e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "nufission = xs_library[fuel_cell.id]['nu-fission']\n", - "nufission.print_xs(xs_type='macro', nuclides='sum')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup ingroup outnuclidemeanstd. dev.
1261000211H-10.2338960.004410
1271000211O-161.5644880.007478
1241000212H-11.5899750.003196
1251000212O-160.2836970.001986
1221000213H-10.0108460.000225
1231000213O-160.0000000.000000
1201000214H-10.0000000.000000
1211000214O-160.0000000.000000
1181000215H-10.0000000.000000
1191000215O-160.0000000.000000
\n", - "
" - ], - "text/plain": [ - " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 H-1 0.233896 0.004410\n", - "127 10002 1 1 O-16 1.564488 0.007478\n", - "124 10002 1 2 H-1 1.589975 0.003196\n", - "125 10002 1 2 O-16 0.283697 0.001986\n", - "122 10002 1 3 H-1 0.010846 0.000225\n", - "123 10002 1 3 O-16 0.000000 0.000000\n", - "120 10002 1 4 H-1 0.000000 0.000000\n", - "121 10002 1 4 O-16 0.000000 0.000000\n", - "118 10002 1 5 H-1 0.000000 0.000000\n", - "119 10002 1 5 O-16 0.000000 0.000000" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n", - "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can easily use the Pandas DataFrame to extract the H-1 and O-16 scattering matrices separately." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Slice DataFrame in two for each nuclide's mean values\n", - "h1 = df[df['nuclide'] == 'H-1']['mean']\n", - "o16 = df[df['nuclide'] == 'O-16']['mean']\n", - "\n", - "# Cast DataFrames as NumPy arrays\n", - "h1 = h1.as_matrix()\n", - "o16 = o16.as_matrix()\n", - "\n", - "# Reshape arrays to 2D matrix for plotting\n", - "h1.shape = (fine_groups.num_groups, fine_groups.num_groups)\n", - "o16.shape = (fine_groups.num_groups, fine_groups.num_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Matplotlib's `imshow` routine can be used to plot the matrices to illustrate their sparsity structures." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Create plot of the H-1 scattering matrix\n", - "fig = plt.subplot(121)\n", - "fig.imshow(h1, interpolation='nearest')\n", - "plt.title('H-1 Scattering Matrix')\n", - "\n", - "# Create plot of the O-16 scattering matrix\n", - "fig2 = plt.subplot(122)\n", - "fig2.imshow(o16, interpolation='nearest')\n", - "plt.title('O-16 Scattering Matrix')\n", - "\n", - "# Show the plot on screen\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Extract the 16-group transport cross section for the fuel\n", - "fine_xs = xs_library[fuel_cell.id]['transport']\n", - "\n", - "# Condense to the 2-group structure\n", - "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttransport\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.81e-03 +/- 4.72e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 2.09e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.58e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t2.54e-01 +/- 2.46e-01%\n", - "\n", - "\tNuclide =\tO-16\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.73e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 2.64e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "condense_xs.print_xs()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
3100001U-23520.8327040.098310
4100001U-2389.5744350.015117
5100001O-163.1619190.005466
0100002U-235484.1335131.011870
1100002U-23811.2151520.027565
2100002O-163.7988330.010031
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 20.832704 0.098310\n", - "4 10000 1 U-238 9.574435 0.015117\n", - "5 10000 1 O-16 3.161919 0.005466\n", - "0 10000 2 U-235 484.133513 1.011870\n", - "1 10000 2 U-238 11.215152 0.027565\n", - "2 10000 2 O-16 3.798833 0.010031" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Verification with OpenMOC" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry just as we did before." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Likewise, we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry." - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Get all OpenMOC cells in the gometry\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", - "# as is the case for a complicated geometry like BEAVRS\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Ignore the root cell\n", - " if cell.getName() == 'root cell':\n", - " continue\n", - " \n", - " # Get a reference to the Material filling this Cell\n", - " openmoc_material = cell.getFillMaterial()\n", - " \n", - " # Set the number of energy groups for the Material\n", - " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n", - " \n", - " # Extract the appropriate cross section objects for this cell\n", - " transport = xs_library[cell_id]['transport']\n", - " nufission = xs_library[cell_id]['nu-fission']\n", - " nuscatter = xs_library[cell_id]['nu-scatter']\n", - " chi = xs_library[cell_id]['chi']\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " # NOTE: In each case we must sum across nuclides to get the\n", - " # macroscopic cross sections needed by OpenMOC\n", - " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now ready to run OpenMOC to verify our cross-sections from OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Throttle OpenMOC output to screen\n", - "openmoc.log.set_log_level('WARNING')\n", - "\n", - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.223863\n", - "openmoc keff = 1.222517\n", - "bias [pcm]: -134.7\n" - ] - } - ], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n", - "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", - "\n", - "# Inject multi-group cross sections into OpenMOC Materials\n", - "for cell_id, cell in openmoc_cells.items():\n", - " \n", - " # Ignore the root cell\n", - " if cell.getName() == 'root cell':\n", - " continue\n", - " \n", - " openmoc_material = cell.getFillMaterial()\n", - " openmoc_material.setNumEnergyGroups(coarse_groups.num_groups)\n", - " \n", - " # Extract the appropriate cross section objects for this cell\n", - " transport = xs_library[cell_id]['transport']\n", - " nufission = xs_library[cell_id]['nu-fission']\n", - " nuscatter = xs_library[cell_id]['nu-scatter']\n", - " chi = xs_library[cell_id]['chi']\n", - " \n", - " # Perform group condensation\n", - " transport = transport.get_condensed_xs(coarse_groups)\n", - " nufission = nufission.get_condensed_xs(coarse_groups)\n", - " nuscatter = nuscatter.get_condensed_xs(coarse_groups)\n", - " chi = chi.get_condensed_xs(coarse_groups)\n", - " \n", - " # Inject NumPy arrays of cross section data into the Material\n", - " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", - " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Generate tracks for OpenMOC\n", - "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", - "track_generator.generateTracks()\n", - "\n", - "# Run OpenMOC\n", - "solver = openmoc.CPUSolver(track_generator)\n", - "solver.computeEigenvalue()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.223863\n", - "openmoc keff = 1.225691\n", - "bias [pcm]: 182.7\n" - ] - } - ], - "source": [ - "# Print report of keff and bias with OpenMC\n", - "openmoc_keff = solver.getKeff()\n", - "openmc_keff = sp.k_combined[0]\n", - "bias = (openmoc_keff - openmc_keff) * 1e5\n", - "\n", - "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n", - "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n", - "print('bias [pcm]: {0:1.1f}'.format(bias))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", - "\n", - "* Appropriate transport-corrected cross sections\n", - "* Spatial discretization of OpenMOC's mesh\n", - "* Constant-in-angle multi-group cross sections" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 1e4c3c9cd0..763cdd9efd 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -126,7 +126,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's move on to the geometry. This problem will be a square array of fuel pins, which we can use OpenMC's lattice/universe feature for. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." + "Now let's move on to the geometry. This problem will be a square array of fuel pins and control rod guide tubes for which we can use OpenMC's lattice/universe feature. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." ] }, { @@ -155,7 +155,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces." + "With the surfaces defined, we can now construct a fuel pin cell from cells that are defined by intersections of half-spaces created by the surfaces." ] }, { diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 87ae42b41e..6e2dd94299 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -347,7 +347,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMjhUMjE6MDQ6NDItMDQ6MDCMRUoKAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTI4\nVDIxOjA0OjQyLTA0OjAw/RjytgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTEtMjlUMTY6NDY6NTMtMDU6MDCSkLewAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTExLTI5\nVDE2OjQ2OjUzLTA1OjAw480PDAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -413,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -432,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "collapsed": false, "scrolled": true @@ -458,8 +458,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n", - " Date/Time: 2015-10-28 21:04:43\n", + " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-29 16:46:53\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -520,8 +520,116 @@ " 31/1 1.04883 1.04094 +/- 0.00388\n", " 32/1 1.03557 1.04070 +/- 0.00371\n", " 33/1 1.02947 1.04021 +/- 0.00358\n", - " 34/1 1.03651 1.04006 +/- 0.00343\n" + " 34/1 1.03651 1.04006 +/- 0.00343\n", + " 35/1 1.03331 1.03979 +/- 0.00330\n", + " 36/1 1.05947 1.04054 +/- 0.00326\n", + " 37/1 1.05093 1.04093 +/- 0.00316\n", + " 38/1 1.06787 1.04189 +/- 0.00319\n", + " 39/1 1.01451 1.04095 +/- 0.00322\n", + " 40/1 1.02351 1.04037 +/- 0.00317\n", + " 41/1 1.04826 1.04062 +/- 0.00307\n", + " 42/1 1.04228 1.04067 +/- 0.00298\n", + " 43/1 1.03214 1.04041 +/- 0.00290\n", + " 44/1 1.04950 1.04068 +/- 0.00282\n", + " 45/1 1.06616 1.04141 +/- 0.00284\n", + " 46/1 1.07039 1.04221 +/- 0.00287\n", + " 47/1 1.00292 1.04115 +/- 0.00299\n", + " 48/1 1.04477 1.04125 +/- 0.00291\n", + " 49/1 1.03360 1.04105 +/- 0.00284\n", + " 50/1 1.04783 1.04122 +/- 0.00277\n", + " 51/1 1.03985 1.04119 +/- 0.00271\n", + " 52/1 1.02507 1.04080 +/- 0.00267\n", + " 53/1 1.03477 1.04066 +/- 0.00261\n", + " 54/1 1.00412 1.03983 +/- 0.00268\n", + " 55/1 1.02239 1.03945 +/- 0.00265\n", + " 56/1 1.04308 1.03952 +/- 0.00259\n", + " 57/1 1.05534 1.03986 +/- 0.00256\n", + " 58/1 1.06667 1.04042 +/- 0.00257\n", + " 59/1 1.06458 1.04091 +/- 0.00256\n", + " 60/1 1.00304 1.04015 +/- 0.00262\n", + " 61/1 1.05038 1.04036 +/- 0.00258\n", + " 62/1 1.02904 1.04014 +/- 0.00254\n", + " 63/1 1.00249 1.03943 +/- 0.00259\n", + " 64/1 1.01779 1.03903 +/- 0.00257\n", + " 65/1 1.05335 1.03929 +/- 0.00254\n", + " 66/1 1.06231 1.03970 +/- 0.00253\n", + " 67/1 1.02382 1.03942 +/- 0.00250\n", + " 68/1 1.03796 1.03939 +/- 0.00245\n", + " 69/1 1.03672 1.03935 +/- 0.00241\n", + " 70/1 1.02926 1.03918 +/- 0.00238\n", + " 71/1 1.05834 1.03950 +/- 0.00236\n", + " 72/1 1.04332 1.03956 +/- 0.00232\n", + " 73/1 1.05613 1.03982 +/- 0.00230\n", + " 74/1 1.01963 1.03950 +/- 0.00228\n", + " 75/1 1.02228 1.03924 +/- 0.00226\n", + " 76/1 1.04842 1.03938 +/- 0.00223\n", + " 77/1 1.02157 1.03911 +/- 0.00222\n", + " 78/1 1.02810 1.03895 +/- 0.00219\n", + " 79/1 1.05030 1.03912 +/- 0.00216\n", + " 80/1 1.02391 1.03890 +/- 0.00214\n", + " 81/1 1.02488 1.03870 +/- 0.00212\n", + " 82/1 1.04957 1.03885 +/- 0.00210\n", + " 83/1 1.03499 1.03880 +/- 0.00207\n", + " 84/1 1.05922 1.03907 +/- 0.00206\n", + " 85/1 1.05898 1.03934 +/- 0.00205\n", + " 86/1 1.02242 1.03912 +/- 0.00204\n", + " 87/1 1.03278 1.03904 +/- 0.00201\n", + " 88/1 1.06134 1.03932 +/- 0.00201\n", + " 89/1 1.04521 1.03940 +/- 0.00198\n", + " 90/1 1.04277 1.03944 +/- 0.00196\n", + " 91/1 1.04214 1.03947 +/- 0.00193\n", + " 92/1 1.05610 1.03967 +/- 0.00192\n", + " 93/1 1.04531 1.03974 +/- 0.00190\n", + " 94/1 1.01534 1.03945 +/- 0.00190\n", + " 95/1 1.03971 1.03945 +/- 0.00187\n", + " 96/1 1.07183 1.03983 +/- 0.00189\n", + " 97/1 1.07214 1.04020 +/- 0.00191\n", + " 98/1 1.03710 1.04017 +/- 0.00188\n", + " 99/1 1.02532 1.04000 +/- 0.00187\n", + " 100/1 1.03965 1.04000 +/- 0.00185\n", + " Creating state point statepoint.100.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 3.7900E-01 seconds\n", + " Reading cross sections = 8.7000E-02 seconds\n", + " Total time in simulation = 2.2064E+02 seconds\n", + " Time in transport only = 2.2060E+02 seconds\n", + " Time in inactive batches = 8.7100E+00 seconds\n", + " Time in active batches = 2.1193E+02 seconds\n", + " Time synchronizing fission bank = 1.4000E-02 seconds\n", + " Sampling source sites = 8.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.3000E-02 seconds\n", + " Total time for finalization = 1.6600E-01 seconds\n", + " Total time elapsed = 2.2120E+02 seconds\n", + " Calculation Rate (inactive) = 5740.53 neutrons/second\n", + " Calculation Rate (active) = 2123.37 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.03912 +/- 0.00160\n", + " k-effective (Track-length) = 1.04000 +/- 0.00185\n", + " k-effective (Absorption) = 1.04240 +/- 0.00156\n", + " Combined k-effective = 1.04078 +/- 0.00127\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -545,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "collapsed": false, "scrolled": true @@ -565,11 +673,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux', u'fission']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -584,11 +708,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[ 0.4107676 , 0. ]],\n", + "\n", + " [[ 0.40849402, 0. ]],\n", + "\n", + " [[ 0.41014343, 0. ]],\n", + "\n", + " ..., \n", + " [[ 0.41049467, 0. ]],\n", + "\n", + " [[ 0.40982242, 0. ]],\n", + "\n", + " [[ 0.40996987, 0. ]]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "tally.sum" ] @@ -602,11 +748,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10000, 1, 2)\n" + ] + }, + { + "data": { + "text/plain": [ + "(array([[[ 0.00456408, 0. ]],\n", + " \n", + " [[ 0.00453882, 0. ]],\n", + " \n", + " [[ 0.00455715, 0. ]],\n", + " \n", + " ..., \n", + " [[ 0.00456105, 0. ]],\n", + " \n", + " [[ 0.00455358, 0. ]],\n", + " \n", + " [[ 0.00455522, 0. ]]]),\n", + " array([[[ 1.95085625e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.78129859e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.89709648e-05, 0.00000000e+00]],\n", + " \n", + " ..., \n", + " [[ 1.56286612e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.65813279e-05, 0.00000000e+00]],\n", + " \n", + " [[ 1.67530331e-05, 0.00000000e+00]]]))" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -621,11 +808,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tally\n", + "\tID =\t10000\n", + "\tName =\t\n", + "\tFilters =\t\n", + " \t\tmesh\t[10000]\n", + "\tNuclides =\ttotal \n", + "\tScores =\t[u'flux']\n", + "\tEstimator =\ttracklength\n", + "\n" + ] + } + ], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -641,7 +844,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -655,11 +858,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -676,11 +900,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEACAYAAACznAEdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE7JJREFUeJzt3X2MHOVhx/HvwdkNL17MidbYxsgO2CWWWoWoXKhK1YlK\nXJO2ttVKxpVaOYFWlVAJfQ02UeuTqibGVRpaRVRqSOglip26CbVMlYANZUSrtlBeDITj6pfUCUfi\nI7zFFyVSbPn6x/Ocb273zjt73pndm/t+pNXOPjOz+zya3f3t8zw7uyBJkiRJkiRJkiRJkiRJkiS1\nxXbgZeAlYDfwE0AfcBA4DBwAFtdtfwQYBtaVWlNJUmFWAt8khADAPwFbgV3Ax2LZ3cDOuLwWOAQs\niPseBS4op6qSpPPR7M36JHAKuBjojdffATYAg3GbQWBTXN4I7In7HCcEQn9bayxJKkSzQHgL+BTw\nbUIQvEMYKloCjMZtRuNtgGXASGb/EWB5uyorSSpOs0C4BvhDwvDPMuBS4LfrthmPl5mca50kqUv0\nNln/c8B/Am/G2w8BPw+cAK6M10uB1+P614AVmf2vimVTXHPNNePHjh2bfa0laX46Blxb1J036yEM\nAzcCFwE9wM3AEPAwYXKZeL0vLu8HtgALgVXAauDp+js9duwY4+Pjlb3s2LGj43WwfbZvvrVtPrSP\nMGpTmGY9hBeALwDPAGeA54B/ABYBe4HbCZPHm+P2Q7F8CDgN3IFDRpI0JzQLBAhfMd1VV/YWobcw\nnU/EiyRpDvEcgQIkSdLpKhTK9s1dVW4bVL99Revp0OOOx/EwSVJOPT09UOD7tj0ESRJgIEiSIgNB\nkgQYCJKkyEBQ4Wq1Pnp6eqZcarW+TldLUh2/ZaTChW9G1B/vHnwOSK3xW0aSpFIYCJIkwECQJEUG\ngiQJMBAkSZGBIEkCDARJUmQgaNamO+Gsp2dhQ5mkucET0zRrM51wlrfM54DUGk9MkySVwkCQJAH5\nAuGngeczl+8DHwX6gIPAYeAAsDizz3bgCDAMrGtjfVUZvf7gndRlWh2LugB4DegH7gTeAHYBdwOX\nA9uAtcBu4AZgOfAYsAY4k7kf5xAq4HznEJxXkFrTbXMINwNHgVeBDcBgLB8ENsXljcAe4BRwPG7f\nf74VlSQVq9VA2EJ4swdYAozG5dF4G2AZMJLZZ4TQU5AkdbFWAmEh8OvAP0+zbpzG/n/9eklSF+tt\nYdtbgGeB78Xbo8CVwAlgKfB6LH8NWJHZ76pYNsXAwMDZ5SRJSJKkhapIUvWlaUqapqU9XiuTE18G\nvs7kvMEu4E3gXsJk8mKmTir3MzmpfC1TewlOKleAk8pSuYqeVM57x5cA3wJWAWOxrA/YC1xNmDze\nDLwT190D3AacBu4CHq27PwNhjqnV+hgbe3uaNQaCVJZuCYR2MxDmmCJ6A41lCwifISYtWnQ5J0++\n1Wp1pUoyENQVygkEew3SuXTbeQiSpIoyECRJgIEgSYoMBEkSYCBIkiIDQZIEGAiSpMhAkCQBBoIk\nKTIQJEmAgSBJigwESRJgIEiSIgNBkgQYCJKkyECQJAEGgiQpMhAkSUD+QFgMfAV4BRgC3g/0AQeB\nw8CBuM2E7cARYBhY167KSpKKkzcQ/hb4GvAe4GcJb/TbCIGwBng83gZYC9war9cD97fwOJKkDsnz\nRn0Z8IvA5+Pt08D3gQ3AYCwbBDbF5Y3AHuAUcBw4CvS3p7qSpKLkCYRVwPeAB4HngM8ClwBLgNG4\nzWi8DbAMGMnsPwIsb0dlJUnF6c25zfuAPwD+B7iPyeGhCePxMpOGdQMDA2eXkyQhSZIcVZGk+SNN\nU9I0Le3xenJscyXwX4SeAsBNhEnjdwMfAE4AS4EngOuYDIud8foRYAfwVOY+x8fHz5Uf6jY9PT00\n5no5ZT5XpCC8DnO9b89KniGjE8CrhMljgJuBl4GHga2xbCuwLy7vB7YACwkhshp4uk31lSQVJM+Q\nEcCdwJcIb/LHgI8AFwJ7gdsJk8eb47ZDsXyIMAF9B+ceTlKXqdX6GBt7u9PVkFSywroeTThk1MU6\nOTzkkJE0s24YMpIkzQMGgiQJMBAkSZGBoC7XS09Pz5RLrdbX6UpJleSkshp026SyE81S4KSyJKkU\nBoIkCTAQJEmRgSBJAgwESVJkIEiSAANBkhQZCJIkwECQJEUGgiQJMBAkSZGBIEkCDARJUmQgSJKA\n/IFwHHgReB54Opb1AQeBw8ABYHFm++3AEWAYWNeOikqSipU3EMaBBLge6I9l2wiBsAZ4PN4GWAvc\nGq/XA/e38DiSpA5p5Y26/k8ZNgCDcXkQ2BSXNwJ7gFOEnsVRJkNEktSlWukhPAY8A/xeLFsCjMbl\n0XgbYBkwktl3BFh+ftWUJBWtN+d2vwB8F/hJwjDRcN36cRr/57B+/RQDAwNnl5MkIUmSnFWRpPkh\nTVPSNC3t8Wbz35w7gB8QegoJcAJYCjwBXMfkXMLOeP1I3OepzH34n8pdrPv/U3kBcHpKyaJFl3Py\n5FtIVdYN/6l8MbAoLl9C+NbQS8B+YGss3wrsi8v7gS3AQmAVsJrJbyZJbXCayU5puIyNvd3ZKkkV\nkGfIaAnwL5ntv0T4mukzwF7gdsLk8ea4zVAsHyK8cu/g3MNJkqQuUFjXowmHjLpErdY3w6frbhke\nyl/mc0pVV/SQkYEwz3X/fIGBIE3ohjkESdI8YCBIkgADQZIUGQiSJMBAkCRFBoIkCTAQJEmRgSBJ\nAgwESVJkIEiSAANBkhQZCJIkwECQJEUGgiQJMBDmlVqtj56enikXSZrg/yHMI1X67wP/D0Hzkf+H\nIEkqhYEgSQLyB8KFwPPAw/F2H3AQOAwcABZntt0OHAGGgXXtqaYkqWh5A+EuYIjJgdtthEBYAzwe\nbwOsBW6N1+uB+1t4DElSB+V5s74K+BDwAJOTGRuAwbg8CGyKyxuBPcAp4DhwFOhvU10lSQXKEwif\nBv4MOJMpWwKMxuXReBtgGTCS2W4EWH6edZRy6G34Sm2t1tfpSklzSm+T9b8GvE6YP0hm2Gacxu8A\n1q9vMDAwcHY5SRKSZKa7l/I4Tf1TbWzM8yw0t6VpSpqmpT1es1fMJ4DfIbza3gXUgIeAGwgBcQJY\nCjwBXMfkXMLOeP0IsAN4qu5+PQ+hA6p+HoLnJqjqOn0ewj3ACmAVsAX4N0JA7Ae2xm22Avvi8v64\n3cK4z2rg6fZWWZJUhGZDRvUmPm7tBPYCtxMmjzfH8qFYPkToVdzBuYeTJEldwp+umEccMpLmtk4P\nGUmS5gkDQZIEGAiSpMhAkCQBBoIkKTIQJEmAgSBJigwESRJgIEiSIgNBFeZPYkutaPW3jKQ5xJ/E\nllphD0GSBBgIkqTIQJAkAQZCZdVqfQ0TqpJ0Lv4fQkXNx/8+8D8SVHX+H4IkqRQGgiQJMBAkSVGz\nQHgX8BRwCBgCPhnL+4CDwGHgALA4s8924AgwDKxrZ2UlScXJMzlxMfBDwlnN/wH8KbABeAPYBdwN\nXA5sA9YCu4EbgOXAY8Aa4EzdfTqpXDAnlWcu87mnuaobJpV/GK8XAhcCbxMCYTCWDwKb4vJGYA9w\nCjgOHAX621RXSVKB8gTCBYQho1HgCeBlYEm8TbxeEpeXASOZfUcIPQVJUpfL8+N2Z4D3ApcBjwIf\nqFs/TmO/vH59g4GBgbPLSZKQJEmOqkjS/JGmKWmalvZ4rY5F/TnwI+B3gQQ4ASwl9ByuI8wjAOyM\n148AOwgT01nOIRTMOYSZy3zuaa7q9BzCFUx+g+gi4IPA88B+YGss3wrsi8v7gS2E+YZVwGrg6TbW\nV5JUkGZDRksJk8YXxMsXgccJobAXuJ0webw5bj8Uy4cIP0Z/B+ceTpIkdQl/y6iiHDKaucznnuaq\nTg8ZSZLmCQNBkgQYCJKkyECQJAEGQiX472iS2sFvGVWA3yhqrcznnuYqv2UktVVvQ2+qVuvrdKWk\nrpDnt4ykCjlNfa9hbMwhNgnsIUiSIgNBkgQYCJKkyECQJAEGgiQpMhAkSYCBIEmKDARJEmAgSHj2\nshR4prLk2csSYA9BkhTlCYQVwBPAy8A3gI/G8j7gIHAYOAAszuyzHTgCDAPr2lVZSVJx8vSLr4yX\nQ8ClwLPAJuAjwBvALuBu4HJgG7AW2A3cACwHHgPWAGcy9+nPX7eRP39dTJnPUXWbbvj56xOEMAD4\nAfAK4Y1+AzAYywcJIQGwEdgDnAKOA0eB/vZUV5JUlFbnEFYC1wNPAUuA0Vg+Gm8DLANGMvuMEAJE\nktTFWvmW0aXAV4G7gLG6deM09rnr108xMDBwdjlJEpIkaaEqUtF6G/6KdNGiyzl58q0O1UfzUZqm\npGla2uPlHYtaAPwr8HXgvlg2DCSEIaWlhInn6wjzCAA74/UjwA5Cr2KCcwht5BxCeWU+b9VJ3TCH\n0AN8DhhiMgwA9gNb4/JWYF+mfAuwEFgFrAaebkdlJUnFyZM0NwFPAi8y+ZFpO+FNfi9wNWHyeDPw\nTlx/D3Ab4Yyfu4BH6+7THkIb2UMor8znrTqp6B5Cp07HNBDayEAor8znrTqpG4aMJEnzgIEgSQIM\nBElSZCDMMbVaX8NPNUtSO/jz13PM2NjbTD8BKknnxx6CJAkwECRJkYEgSQIMBElSZCBIkgADQZIU\nGQhdzHMOJJXJ8xC6mOccSCqTPQRJEmAgSJIiA0HKrbdhTqdW6+t0paS2cQ5Byu009XM6Y2PO6ag6\n7CFIkoB8gfB5YBR4KVPWBxwEDgMHgMWZdduBI8AwsK491ZQkFS1PIDwIrK8r20YIhDXA4/E2wFrg\n1ni9Hrg/52NIkjosz5v1vwNv15VtAAbj8iCwKS5vBPYAp4DjwFGg/7xrKUkq3Gw/vS8hDCMRr5fE\n5WXASGa7EWD5LB9DklSidgznjNN4Om39eqmi/CqqqmO2XzsdBa4ETgBLgddj+WvAisx2V8WyBgMD\nA2eXkyQhSZJZVkXqJL+KquKkaUqapqU9Xt5n7krgYeBn4u1dwJvAvYQJ5cXxei2wmzBvsBx4DLiW\nxl7C+Pi4HYdmwo/ZTfdbRpZ1e5nPbxUh/sBlYZ848vQQ9gC/BFwBvAr8BbAT2AvcTpg83hy3HYrl\nQ4SPTnfgkFFTtVpf/CE7SeqcTvVt7SFkTN8TgG771GuZPQR1VtE9BM8RkCQBBoIkKTIQJEmAgSBJ\nigwESRJgIEgFaDx72TOYNRf4BzlS2zWevQyewazuZw9BkgQYCJKkyEAoWa3W1zC2rPnCX0ZVd/On\nK0qW/wfrZiq3bG6WzbztfH0tqHX+dIUkqRQGgiQJMBCkDnNeQd3DQCiQE8hqbuKchcmL/42hTjEQ\nChRe2ON1F6kZew3qDM9UlrqO/9OszrCHIEkCDIS2cb5AxXIYScUrKhDWA8PAEeDugh6jqzhfoGI5\n+aziFREIFwKfIYTCWuC3gPcU8DhdLO10BQqWdroCBUs7XYGc8vUapuu99vQsrGSPI03TTldhTisi\nEPqBo8Bx4BTwZWBjAY/TxdJOV6BgaacrULC00xXIabpew1jDG/3U3uuOeH0q175zLSQMhPNTRCAs\nB17N3B6JZXNS3k9XUndoDInz2ddhqfmliEDo+sHzJ598ctp/tFqw4KImn64mLo2frqRqmu7f3xo/\nEJ3PENR0H7rmWs+kKor4aHsjMECYQwDYDpwB7s1scxS4poDHlqQqOwZc2+lKtKKXUOmVwELgEPNu\nUlmSNOEW4H8JPYHtHa6LJEmSpKLlOfHs7+L6F4Drc+z718ArcfuHgMsy67bH7YeBdedf/abKbN9K\n4EfA8/Fyfzsa0EQR7fvLuO0h4HFgRWZdFY7fTO1bSbnHr4i2TfgTwnxfdka3CsduQn37VlKN194A\n4ducE+24JbOu8ON3IWEoaCWwgOnnCD4EfC0uvx/47xz7fpDJbz3tjBcIJ7cdituvjPsX+ZMbZbdv\nJfBS+6rfVFHtW5TZ/07ggbhcleM3U/tWUt7xK6ptEALuEeD/mHzDrMqxg+nbt5JqvPZ2AH88zeO1\nfPxmc3DznHi2ARiMy08Bi4Erm+x7kJDeE/tcFZc3Anvi9sfj/v2zqHdeZbevbEW1byyz/6XAG3G5\nKsdvpvaVqai2AfwN8LG6+6rKsYPp21e2Its33TdGWz5+swmEPCeezbTNshz7AtzGZEoui9s126dd\nym4fwCpCVy8FbppNpVtQZPv+Cvg28GHgk7GsSsdvon1bmezhQXnHr6i2bYy3X6y7r6ocu5naB9V5\n7d1JGGL6HCFEYBbHbzaBkPcsrNme4/Bx4MfA7jbUYTbKbt93CN3Z6wndvt1MHZ5otyLb93HgauBB\n4L421GE2ymjfPwKfjmVlHr8i2nYRcA9h2CHP/nPt2J2rfVV57f09IdjeC3wX+NRs6zCbP8h5jakT\nhiuYmkLTbXNV3GZBk30/TBhD++Um9/XaLOqdV9nt+3G8ADxHOIdjdVwuQpHtm7CbyR5QlY7fhGz7\nyjx+RbTtGsL48guZ7Z8ljF9X4djN1L5+4HWq8dp7PVP+APDwOe6r7ccvz4ln2YmRG5mcGDnXvuuB\nl4Er6u5rYmJkISEFj1HMGdYTym7fFYQJI4B3Ew7yYopTVPtWZ/a/E/hiXK7K8ZupfWUev6LaljXd\npPJcP3ZZ2fZV5bW3NLP/HzE5+lDa8ZvuxLPfj5cJn4nrXwDe12RfCF+N+hbTfwXsnrj9MPAr7WrE\nOZTZvt8EvhHLngV+tY3tmEkR7fsK4Rsbh4CvAj+VWVeF4zdT+36Dco9fEW3L+iZTv3ZahWOXlW1f\n2ccOimnfFwjzIy8A+4AlmXVlHz9JkiRJkiRJkiRJkiRJkiRJkiRJ0nzy/8sz3m0aJpWnAAAAAElF\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -707,11 +942,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([ (1.0, [0.2712169917165897, -0.04844236597355761, -0.1887902218343974], [0.3889598463000694, 0.8470657529949065, 0.36220139158953857], 2.2746035619924734, 0),\n", + " (1.0, [0.080729018085932, 0.19838688738571317, -0.38053428394017363], [-0.6604834049157511, -0.6893239101986768, 0.2976478097673534], 0.7833467555325838, 0),\n", + " (1.0, [0.019430574216787868, 0.06594180627832635, 0.23329810254580194], [-0.7472138923667574, 0.13227244377548197, -0.651287493870243], 1.1632342240714935, 0),\n", + " ...,\n", + " (1.0, [0.18544614514351207, -0.0113070561851496, 0.5468392238881264], [-0.8006491411918817, 0.43855795172388223, -0.4082007786475368], 1.4358240241589555, 0),\n", + " (1.0, [0.18544614514351207, -0.0113070561851496, 0.5468392238881264], [-0.5150076397044656, -0.34922134026850293, 0.7828228321575105], 1.5771133724329802, 0),\n", + " (1.0, [-0.2722999793764598, 0.22680062445008103, 0.2987060438567475], [0.9207818175032396, -0.2884020326181676, 0.26265017063984586], 2.932342523379745, 0)], \n", + " dtype=[('wgt', '" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nluKTIylGlUqYsKkZZ/mbetoFju0tliVNMWOz/EnQvh/v08Djdeszgd8lyzuJY2Y+3+OQuiCW9w/K\nLpZ8LHJY9cFOLypJ6l9pBjmUJOkZBg5JUiYGDklSJgYOSUDocjsw0Pxjl1vV67hVPRL2qpJyEkuP\nn34WSx53YwZASZKeYeCQJGVi4JAkZWLgkCRlYuCQJGVi4JCkLhkaat3luVLpderSszuuJCCerqJT\nVTfz3+64kqSuMnBIkjIxcEiSMjFwSJIyMXBIkjIxcEiSMjFwSJIyMXBIkjIxcEiSMjFwSJIy6Ubg\nOALYANwPnNrimHOS/euAQ5Jtc4HrgfXA3cDJxSZTkpRG0YFjEFhFCB4HAsuA+Q3HLAb2A/YHTgDO\nTbY/BfwN8HJgIXBik3MlSV1WdOBYAGwENhMCwWpgacMxS4BLkuWbgFnAPsAvgTuS7b8F7gX2LTa5\nkqSJFB04ZgNb6ta3JtsmOmZOwzHDhCqsm3JOnyQpo+kFXz/tIMGNw/vWn/ds4ArgFELJY5yRkZFn\nlqvVKtVqNVMCpamkUoHR0eb7hoa6mxZ1T61Wo1ar5Xa9oufjWAiMENo4AE4DdgBn1h1zHlAjVGNB\naEhfBDwE7AH8O/A94Owm13c+DikD59yIl/Nx7HIrodF7GJgBHAOsaThmDXBcsrwQ+DUhaAwAFwH3\n0DxoSJJ6oOiqqu3AScC1hB5WFxEauVck+88Hrib0rNoIPAYsT/a9FngPcCdwe7LtNOCagtMsSWrD\nqWOlKcSqqnhN1P60bVt+95psVZWBQ5pCDBzllPf/W+xtHJKkPmPgkCRlYuCQJGVi4JAkZWLgkPpM\npRIaU5t9fDtcebBXldRn7DnVf+xVJUkqNQOHJCkTA4ckKRMDh1RSrRrBbQBX0Wwcl0rKRvCpw8Zx\nSVKpGTgkSZkYOCRJmRg4JEmZGDgkSZkYOCRJmRg4JEmZGDgkKXJDQ81f9qxUepMeXwCUSsoXANXp\nz4AvAEp9zLk1FCNLHFLELFWoHUsc0hRlqUJlY+CQuqBdcIDwV2Ozz7ZtvU231IxVVVIXWOWkIlhV\nJUkqBQOHlBPbKjRVWFUl5cTqKHWbVVWSpFKY3usESJI6MzYUSStFlYCtqpJyYlWVysKqKqmLbACX\nLHFImViqUD+wxCEVoFXJwlKFVHzgOALYANwPnNrimHOS/euAQzKeKxVidNQhQKRWigwcg8AqQgA4\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -773,11 +1066,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 0.5)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/collections.py:548: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if self._edgecolors == 'face':\n" + ] + }, + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 6430b24240..afa57c78d9 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -882,7 +882,7 @@ def get_opencg_lattice(openmc_lattice): outer = openmc_lattice.outer if len(pitch) == 2: - new_pitch = np.ones(3, dtype=np.float64) + new_pitch = np.ones(3, dtype=np.float64) * np.inf new_pitch[:2] = pitch pitch = new_pitch From 2fb2b889bebfeaa2d8487760b5005ebbebca844f Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 30 Nov 2015 21:05:52 -0500 Subject: [PATCH 492/519] All MGXS IPython Notebooks are up-to-date and ready to go! --- .../pythonapi/examples/MGXS-Part-I.ipynb | 163 +++-- .../pythonapi/examples/MGXS-Part-II.ipynb | 180 +++--- .../pythonapi/examples/MGXS-Part-III.ipynb | 582 +++--------------- .../source/pythonapi/examples/images/mgxs.png | Bin 0 -> 54562 bytes .../examples/pandas-dataframes.ipynb | 6 +- 5 files changed, 307 insertions(+), 624 deletions(-) create mode 100644 docs/source/pythonapi/examples/images/mgxs.png diff --git a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb index 0bba3bfe0e..3eca44a263 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb +++ b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb @@ -6,10 +6,100 @@ "source": [ "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", "\n", + "* **General equations** for scalar-flux averaged multi-group cross sections\n", "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", "\n", - "**Note:** This Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Multi-Group Cross Sections (MGXS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below:\n", + "\n", + "\n", + "\n", + "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations for fine-mesh heterogeneous deterministic neutron transport applications.\n", + "\n", + "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Introductory Notation\n", + "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spatial and Energy Discretization\n", + "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", + "\n", + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### General Scalar-Flux Weighted MGXS\n", + "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section $\\sigma_{n,x,k,g}$ as follows:\n", + "\n", + "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Scattering Matrices\n", + "The general multi-group cross section $\\sigma_{n,x,k,g}$ is a vector of $G$ values for each energy group $g$. The equation presented above only discretizes the energy of the incoming neutron and neglects the outgoing energy of the neutron (if any). Hence, this formulation must be extended to account for the outgoing energy of neutrons in the discretized scattering matrix cross section used by deterministic neutron transport codes. \n", + "\n", + "We denote the incoming and outgoing neutron energy groups as $g$ and $g'$ for the microscopic scattering matrix cross section $\\sigma_{n,s}(\\mathbf{r},E)$. As before, spatial homogenization and energy condensation are used to find the multi-group scattering matrix cross section $\\sigma_{n,s,k,g \\to g'}$ as follows:\n", + "\n", + "$$\\sigma_{n,s,k,g\\rightarrow g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,s}(\\mathbf{r},E'\\rightarrow E'')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted multi-group microscopic scattering matrix is computed using OpenMC tallies with both energy in and energy out filters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Fission Spectrum\n", + "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", + "\n", + "Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n}(\\mathbf{r},E)$. The multi-group fission spectrum $\\chi_{n,k,g}$ is then the probability of fission neutrons emitted into energy group $g$. \n", + "\n", + "Similar to before, spatial homogenization and energy condensation are used to find the multi-group fission spectrum $\\chi_{n,k,g}$ as follows:\n", + "\n", + "$$\\chi_{n,k,g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "The fission production-weighted multi-group fission spectrum is computed using OpenMC tallies with both energy in and energy out filters.\n", + "\n", + "This concludes our brief overview on the methodology to compute multi-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" ] }, { @@ -29,20 +119,6 @@ "%matplotlib inline" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -95,7 +171,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With our material, we can now create a materials file object that can be exported to an actual XML file." + "With our material, we can now create a `MaterialsFile` object that can be exported to an actual XML file." ] }, { @@ -184,7 +260,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." ] }, { @@ -264,7 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "We can now use the `EnergyGroups` object, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", "\n", "* `TotalXS`\n", "* `TransportXS`\n", @@ -346,7 +422,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each `MGXS` object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." ] }, { @@ -411,7 +487,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-29 17:50:29\n", + " Date/Time: 2015-11-30 20:15:33\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -497,20 +573,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2800E-01 seconds\n", - " Reading cross sections = 8.9000E-02 seconds\n", - " Total time in simulation = 1.4506E+01 seconds\n", - " Time in transport only = 1.4496E+01 seconds\n", - " Time in inactive batches = 1.7910E+00 seconds\n", - " Time in active batches = 1.2715E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 4.1200E-01 seconds\n", + " Reading cross sections = 9.2000E-02 seconds\n", + " Total time in simulation = 1.4213E+01 seconds\n", + " Time in transport only = 1.4199E+01 seconds\n", + " Time in inactive batches = 1.7980E+00 seconds\n", + " Time in active batches = 1.2415E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 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.4943E+01 seconds\n", - " Calculation Rate (inactive) = 13958.7 neutrons/second\n", - " Calculation Rate (active) = 7864.73 neutrons/second\n", + " Total time elapsed = 1.4634E+01 seconds\n", + " Calculation Rate (inactive) = 13904.3 neutrons/second\n", + " Calculation Rate (active) = 8054.77 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -534,9 +610,6 @@ } ], "source": [ - "# Remove old HDF5 (summary, statepoint) files\n", - "!rm statepoint.*\n", - "\n", "# Run OpenMC\n", "executor = openmc.Executor()\n", "executor.run_simulation()" @@ -553,7 +626,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " ] }, { @@ -572,7 +645,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." ] }, { @@ -592,7 +665,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." ] }, { @@ -662,7 +735,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data." + "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." ] }, { @@ -676,7 +749,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" ] }, { @@ -753,7 +827,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The following code snippet shows how to export all of three cross sections to the same HDF5 binary data store." + "The following code snippet shows how to export all three `MGXS` to the same HDF5 binary data store." ] }, { @@ -780,7 +854,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we illustrate how one can leverage OpenMC's tally arithmetic data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" tally based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." ] }, { @@ -997,6 +1071,13 @@ "scattering_to_total.get_pandas_dataframe()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, we sum the derived scatter-to-total and absorption-to-total ratios to confirm that they sum to unity." + ] + }, { "cell_type": "code", "execution_count": 25, diff --git a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb index 2976df22b5..99610944b6 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb +++ b/docs/source/pythonapi/examples/MGXS-Part-II.ipynb @@ -8,11 +8,19 @@ "\n", "* Creation of multi-group cross sections on a **heterogeneous geometry**\n", "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", + "* The use of **[tally precision triggers](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", - "* The use of **PyNE for plot** continuous energy vs. multi-group cross sections\n", - "* **Validation** of multi-group cross sections with **OpenMOC**\n", + "* The use of **[PyNE](http://pyne.io/) to plot** continuous energy vs. multi-group cross sections\n", + "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", "\n", - "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" ] }, { @@ -51,20 +59,6 @@ "%matplotlib inline" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -103,7 +97,7 @@ }, "outputs": [], "source": [ - "# 1.6 enriched fuel\n", + "# 1.6% enriched fuel\n", "fuel = openmc.Material(name='1.6% Fuel')\n", "fuel.set_density('g/cm3', 10.31341)\n", "fuel.add_nuclide(u235, 3.7503e-4)\n", @@ -126,7 +120,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With our materials, we can now create a materials file object that can be exported to an actual XML file." + "With our materials, we can now create a `MaterialsFile` object that can be exported to an actual XML file." ] }, { @@ -168,7 +162,6 @@ "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", "\n", "# Create boundary planes to surround the geometry\n", - "# Use both reflective and vacuum boundaries to make life interesting\n", "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n", "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", @@ -243,7 +236,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." ] }, { @@ -270,7 +263,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10000 particles." + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10,000 particles." ] }, { @@ -307,7 +300,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class." + "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define \"coarse\" 2-group and \"fine\" 8-group structures using the built-in `EnergyGroups` class." ] }, { @@ -318,21 +311,21 @@ }, "outputs": [], "source": [ + "# Instantiate a \"coarse\" 2-group EnergyGroups object\n", + "coarse_groups = mgxs.EnergyGroups()\n", + "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])\n", + "\n", "# Instantiate a \"fine\" 8-group EnergyGroups object\n", "fine_groups = mgxs.EnergyGroups()\n", "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n", - " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n", - "\n", - "# Instantiate a \"coarse\" 2-group EnergyGroups object\n", - "coarse_groups = mgxs.EnergyGroups()\n", - "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])" + " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define transport, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups." + "Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we define transport, fission, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups." ] }, { @@ -363,7 +356,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we showcase the use of OpenMC's tally trigger feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." + "Next, we showcase the use of OpenMC's [tally precision trigger](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element) feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections." ] }, { @@ -387,7 +380,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. " + "Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `MGXS` class' boolean `by_nuclide` instance attribute. " ] }, { @@ -409,7 +402,7 @@ " xs_library[cell.id][rxn_type].domain = cell\n", " xs_library[cell.id][rxn_type].domain_type = 'cell'\n", " \n", - " # Tally cross sections by nuclide (e.g., micro cross sections)\n", + " # Tally cross sections by nuclide\n", " xs_library[cell.id][rxn_type].by_nuclide = True\n", " \n", " # Add OpenMC tallies to the tallies file for XML generation\n", @@ -455,8 +448,8 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-29 21:22:25\n", - " MPI Processes: 1\n", + " Date/Time: 2015-11-30 20:39:59\n", + " MPI Processes: 3\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -575,20 +568,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1800E-01 seconds\n", - " Reading cross sections = 8.7000E-02 seconds\n", - " Total time in simulation = 2.3349E+02 seconds\n", - " Time in transport only = 2.3343E+02 seconds\n", - " Time in inactive batches = 1.4263E+01 seconds\n", - " Time in active batches = 2.1923E+02 seconds\n", - " Time synchronizing fission bank = 2.5000E-02 seconds\n", - " Sampling source sites = 2.1000E-02 seconds\n", - " SEND/RECV source sites = 4.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 9.0000E-03 seconds\n", - " Total time elapsed = 2.3396E+02 seconds\n", - " Calculation Rate (inactive) = 7011.15 neutrons/second\n", - " Calculation Rate (active) = 1824.61 neutrons/second\n", + " Total time for initialization = 6.7400E-01 seconds\n", + " Reading cross sections = 1.4300E-01 seconds\n", + " Total time in simulation = 1.3404E+02 seconds\n", + " Time in transport only = 1.1927E+02 seconds\n", + " Time in inactive batches = 7.6750E+00 seconds\n", + " Time in active batches = 1.2636E+02 seconds\n", + " Time synchronizing fission bank = 1.4700E+01 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 5.0000E-03 seconds\n", + " Time accumulating tallies = 4.0000E-03 seconds\n", + " Total time for finalization = 1.5000E-02 seconds\n", + " Total time elapsed = 1.3475E+02 seconds\n", + " Calculation Rate (inactive) = 13029.3 neutrons/second\n", + " Calculation Rate (active) = 3165.53 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -612,10 +605,7 @@ } ], "source": [ - "# Delete old HDF5 files\n", - "!rm *.h5\n", - "\n", - "# Run OpenMC with the output throttled!\n", + "# Run OpenMC\n", "executor = openmc.Executor()\n", "executor.run_simulation(output=True, mpi_procs=3)" ] @@ -631,7 +621,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " ] }, { @@ -650,7 +640,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." ] }, { @@ -670,7 +660,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object to compute the cross sections using tally arithmetic." + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." ] }, { @@ -801,7 +791,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame." + "Although a printed report is nice, it is not scalable or flexible. Let's extract the microscopic cross section data for the moderator as a [Pandas](http://pandas.pydata.org/) `DataFrame` ." ] }, { @@ -815,7 +805,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" ] }, { @@ -958,7 +949,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." + "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure. The `MGXS` class includes a `get_condensed_xs(...)` method which takes an `EnergyGroups` parameter with a coarse(r) group structure and returns a new `MGXS` condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier." ] }, { @@ -973,14 +964,14 @@ "fine_xs = xs_library[fuel_cell.id]['transport']\n", "\n", "# Condense to the 2-group structure\n", - "condense_xs = fine_xs.get_condensed_xs(coarse_groups)" + "condensed_xs = fine_xs.get_condensed_xs(coarse_groups)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do." + "Group condensation is as simple as that! We now have a new coarse 2-group `TransportXS` in addition to our original 16-group `TransportXS`. Let's inspect the 2-group `TransportXS` by printing it to the screen and extracting a Pandas `DataFrame` as we have already learned how to do." ] }, { @@ -1019,7 +1010,7 @@ } ], "source": [ - "condense_xs.print_xs()" + "condensed_xs.print_xs()" ] }, { @@ -1113,7 +1104,7 @@ } ], "source": [ - "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n", + "df = condensed_xs.get_pandas_dataframe(xs_type='micro')\n", "df" ] }, @@ -1162,8 +1153,6 @@ "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", "\n", "# Inject multi-group cross sections into OpenMOC Materials\n", - "# NOTE: This code will work for 1, 10, or 1,000s of cells\n", - "# as is the case for a complicated geometry like BEAVRS\n", "for cell_id, cell in openmoc_cells.items():\n", " \n", " # Ignore the root cell\n", @@ -1183,8 +1172,7 @@ " chi = xs_library[cell_id]['chi']\n", " \n", " # Inject NumPy arrays of cross section data into the Material\n", - " # NOTE: In each case we must sum across nuclides to get the\n", - " # macroscopic cross sections needed by OpenMOC\n", + " # NOTE: Sum across nuclides to get macro cross sections needed by OpenMOC\n", " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n", " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n", " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n", @@ -1381,7 +1369,7 @@ "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=128, spacing=0.1)\n", "track_generator.generateTracks()\n", "\n", "# Run OpenMOC\n", @@ -1428,7 +1416,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result." + "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they also produce a reasonable result." ] }, { @@ -1722,7 +1710,7 @@ "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=128, spacing=0.1)\n", "track_generator.generateTracks()\n", "\n", "# Run OpenMOC\n", @@ -1762,7 +1750,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", + "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of a pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. For heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n", "\n", "* Appropriate transport-corrected cross sections\n", "* Spatial discretization of OpenMOC's mesh\n", @@ -1782,14 +1770,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for MGXS visualization, only a few of which will be shown here for inspiration.\n", + "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for multi-group cross section visualization, only a few of which will be shown here for enrichment and inspiration.\n", "\n", - "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source PyNE library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -1802,7 +1790,7 @@ "# Extract the U-235 data from the library\n", "u235 = pyne_lib.tables['92235.71c']\n", "\n", - "# Extract the continuous energy fission U-235 cross section data\n", + "# Extract the continuous energy U-235 fission cross section data\n", "fission = u235.reactions[18]" ] }, @@ -1810,12 +1798,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we use matplotlib to plot the multi-group and continuous energy cross sections on a single plot." + "Now, we use [`matplotlib`](http://matplotlib.org/) and [`seaborn`](http://stanford.edu/~mwaskom/software/seaborn/) to plot the continuous energy and multi-group cross sections on a single plot." ] }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1823,18 +1811,18 @@ { "data": { "text/plain": [ - "" + "(9.9999999999999994e-12, 20.0)" ] }, - "execution_count": 46, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\nRETE6eQvWE4Yr8iVHuYAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1863,19 +1851,20 @@ "plt.title('U-235 Fission Cross Section')\n", "plt.xlabel('Energy [MeV]')\n", "plt.ylabel('Micro Fission XS')\n", - "plt.legend(['Continuous', 'Multi-Group'])" + "plt.legend(['Continuous', 'Multi-Group'])\n", + "plt.xlim((x.min(), x.max()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Another useful illustration are scattering matrix sparsity structures. First, we extract Pandas DataFrames for the H-1 and O-16 scattering matrices." + "Another useful type of illustration is scattering matrix sparsity structures. First, we extract Pandas `DataFrames` for the H-1 and O-16 scattering matrices." ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1907,16 +1896,16 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAADUCAYAAACWNDiHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHGBJREFUeJzt3Xm8ZdOZ//HPRcQ8FCpmifAQOtKhyxQUhZC0IOmEIG0K\nEaGRwa9JmyoSRAyJRJqSgXQ6BFGGzqBiJkoEISLhayZVxEwpQ6i6vz/WOurUcYdz79371Nn7ft+v\nl5ez99ln7XVuPfvZa6+9z1pgZmZmZmZmZmZmZmZmZmZmZmZmZlZLPfO6AmWKiNnAypKmN63bG9hD\n0rb9fGZN4OfAs/1tk7c7BNgPeAewIHAjcLCkl4dZ1w8Df5X0eESMBTaSdMUQyzgIeJekY4ZThz7K\newR4WtK4lvVHAV8D3i3psUHK2E/SD/p57yrgK5LuLKK+dRcRhwKfJcXcfMC1wFGSnuln+x7gcODr\nwJaSbm56bzPgLGAh4FHgM5Ke6KOM3YAvA4vm/d4NfKGvbdv8DhsCr0q6OyIWBHaV9D9DLGNn4GOS\nPjucOvRR3nXAWsBKkmY3rf8M8BPS3+6GQcrYX9I5/bx3HnChpF8WUd+hmK/TO+xmEbE2cAlw8yDb\nbQ98Hhgv6X3AOqQD4OQR7P5LwKr59QRgx6F8OCJ6JJ1ZVHJvslxErNGybmfgqTbqtDzw//p7X9I2\nTu7tiYgTgN2A7Zti7gXguohYqJ+PnQWsAvy9pawlSI2YfSWtAVyZy27d5zrA6cAn8j4DeAT40Qi+\nyr7Aevn1+sCeQ/lwjvNLi0ruTV4nHXfNPg0M2IDJdZqffo79XN+95kVyB1hgXux0Husd4L0ZwHjg\nY6Qzen/+CXhA0vMAkl6PiH2B2QARsSzwY9JB+DKplfrbiHgXcB6wGvBO4LuSTo+I40nBtXZEfJ/U\n6logIhaVtHtE7AQcTzqJPADsLunZiDgOWBH4AHBBRCxJaoXsn1sllwGfAN4D3Chpt1y/vYETgSeB\n7wA/ktTXyb4X+A3p4D8+f/afgOeBZRobRcSOwDdIVzIzgM9Kuot0olwpIv6S63g/cA7poP4wcD2w\nB7AR6WS5Uy5vCjBZ0n8P8G8wakTEGOBQ4AONq1FJs4AjImJr4N9Jf9dW35d0V0Ts0LJ+J+B2Sbfm\nsvprmKwL/L1xlSZpdkQcSYpdImJh4GxgM+A14BuS/jciFiHF/wdIMfELSYdHxOdzXT8WESsBhwFL\nRMT1ksZHxIeAbwNLAc+Q4vzhHK8fA5YA7oyIe8hX4RFxLukKZBPSCUjATpJejYjtgB8AL5Hi/GRg\nvT6uOpvj/Kr83ZYmHTcPk3s6ImIT4HvAIqRj/RBJVwO/BZbMcf5R4FzSFf2/Afvlk/M5wKvAUcAG\nknojYhLwgqR+G0EjNRpa8K3dUP12S0maJum5gbbJrgI+HBHnRsT2EbG4pBmSZub3TwL+LOm9wF7A\n+fly9Cjgsdwa2ho4MSJWknQ0MI0U0CeTguiinNxXJ10m7prLu5bUMmv4KPARSaeTArX5BLYDsA0p\n8LeKiE1ysjgz7399YDsGPuldTGrJNHwauKixEBELkAL6c5LWIp1UTslv75O/7zqS3sj7WVnSWpIe\nbarvt0kngm3zyWxRJ/e5bEz6Oz7Qx3tXkBolb5NPsn1ZD3g2Ii6JiPsi4vyIWKaP7W4CVo2IyyJi\n54gYI+k1SS/m978MLCBpdWBb4HsRsQLwBWBJSWuTYmzviNhU0lnArcDhOc6PBKbm5L44cDlwhKQ1\nSQn5wqa6bAt8XtLhfdTzk8AuwHuB5YCdc6v6PGA/SesCawKL9fP3APg/YPuIeEde/jdSLMOc42MS\ncGo+fk9iznG4DzArx/kjefv18/LNeblX0iWkK4L9IuKDwFZA0VfccxkNCf66iPhr4z/gBAZOaIPK\n3QofIv39zgOeyQfLKnmTjwDnN227mqR/AIcAB+f1D5Na0O/pYxc9zDnJbA9cJ+mveflsYMeIaPzb\n3ZJPSjD3iakXuFjS65JeIbVsViO1liXpL5J6ge8z8AntAWBmRHwgL38C+EXT3+JNYEVJU/Oqm4DV\n+6hPw9suVXO/5/7AaaQri/0HqM9oNAZ4up/3nsrvD8XSpCuor5Ba6a+TTrJzyf3sGwJPAGcAT0XE\nbyPi/XmTjwAX5G2nka4en5B0CqkbD0kvAPcwJyaaNcfH5sDfcosYSRcAazQdU/dLerCf7/N/kl7I\nVzV3k7o6A1hQ0pV5mzMYON/NAH5HajAB7Erqxmq2fuP7Mnic/7qf/RwEHEE67r4g6bUB6jRio6GL\nZrzmvsm6F/CZ/PonwDhSMtx6KDeOJN1O7j+MiPVJXRg/BzYFliX1jza2bbTsx5Fa7asAs4AVGPwk\nuxSwRT45NbzAnC6S5wf47ItNr2cB8+fynmtaP53BnQ/snls3j+buoeb3D4qIPUmX7guRu6r68Vxf\nKyX9MSJeAt6Q9Jc26jSaPEPqiuvLu4C/R8Q40pUewCWS/muA8l4ArpL0EEBEfIfURfE2ku4n3W9q\n3KM6Avh1juHWOH8lb7cmcFpErEWKu1UYvN9+KeC9LXH+Wt4H9BM3pGP3pablWaS8thRzHxvtHNuN\nOJ8KrJC7t5rf3w34j3y1Mf8gZfUX59Mi4hZSl9JVbdRpREZDgm/11tlWUn83eAZs4ee+wkdyqwVJ\nd0TEEcy5OfsM6VLxsbz9u0ldMD8lXeKdndf/rY36TiMdjJ/qox6t9WznyuQl5r5UXWGQ7XtJJ67r\nSIn7guY3I2JT0o3UcZIei4htSZeyQxIR/wq8AbwzIj4iqb8W0Gg0FRgTEetJ+lPLezsA35H0B+B9\nbZb3KKnLomE2KTHOJV+1vSpJAJLujYj/IDUcxjAnzhvbrww8S+oC/AOwY+5rvqmNOk0nPUU2rvWN\npqvHdjWSfnOcL9/GZ35FqvtuNHVD5jqsRIrrDSX9KZ/E7htivRrf5YPAncCBpJZ8aUZDF81wDNYH\nvwdwVn4aodEPvRspCULqS9w7v7cucDvpjL8ccEdevxfppuni+TNvkC6dAf5BaoEATAE2j4j35M9t\nGBGNy+m+7i/0tCw36811WS8i3pu7efYb5LuSr4Cmk/o5J7e8PZbUTfB4vrnW+F6N77RY7g/tV0Qs\nSuoiOIjUjXVmLsuA3Of9DeB/cmOBiFggIk4k/RtfMMDHG5pj4VJgfL5hDvA50o3CVtsBP80PBzQe\nu/wMcI+kZ0lx3riKXYEU28uS4vzOnNy3JZ1M+orzN0g3TgF+D6wQ6TFKImL1fIU9lO/VvHw/8I6I\naNyf+DyDNIAkvU463g7n7d0zywEzgfvy8f65XM9F8/eYLyKaTyhvyyH5eJsEfJF00/yoiOjvyqwQ\ndU/wff2Dtt6IfEtEHBERr5L+EbaKiFcjoq9L18OAe4E/RMS9pDP5cqSbLQD/CawcEQ+TLvt2y31t\nRwOTI+Iu0p34s4FJOXlfTHoS5jBSkE2IiN/nbqP98+f+QupLbBzQrd+lr+W5SHoS+CrpZu1UYMDn\ne5ucT7px/FLL+l+Tkv+DpMv804EXI+JC4C7SpeoTTX2prXqA44ArJN2TW6JXk5/asUTSqaS4vCJ3\nY9xDagRsk++DvE1EvJzjeVXg6hzPm0l6nBSrkyNCpNbtl/rY58mkE/o1Oc4fIN0Y/Fje5HRSv/yj\nwDXAl3PZXwdOjYi7SX3rE4GJkZ5CmQx8MyJOIT1psmJETCPdB/gk8N0c55cw5ybrQHHeZ8zne14H\nAudGxB2kY3Q2g1/lnk/6Dcy9LX+LO0ktfJH66i8HbiEdR9NJffKP5u/4Vj1aHAhMk3Rl/judSXqg\nojS1/qGTDS5fYdwoaag36swqI7e0Z5Ce7pkxr+vTKXVvwVuLfGk/rXEpTHpaYMAfdplVUUTcGhG7\n5MVdgb+MpuQObsGPSpF+6n0i6QQ/nfTDpIfmba3MipUfhjgTWJh0Y/jA/PSbmZmZmZlZF+qeLprb\nekf069Jmq29wT1FF8dD16xZWls1jW/bMk3jfrHdKYbF9U89KRRXF3CMBWLVN7DO2fZPVzKymnODN\nzGrKCd7MrKac4M3MaqrUwcYi4nTS8LS9wKGSbitzf2ad4ti2KiitBZ8H+VlD0qakeSTPKGtfZp3k\n2LaqKLOLZgJ55ME8cM/SLaOtmVWVY9sqocwEvzxpvOiGpxl87HGzKnBsWyV08iZrDyOcKs+sSzm2\nrSuVmeCnM/csKivS3rRZZt3OsW2VUGaCn0IawL8xZ+m0prlJzarMsW2VUFqClzQVuD0ifsec6djM\nKs+xbVVR6nPwko4ss3yzecWxbVXgX7KamdWUE7yZWU05wZuZ1ZQTvJlZTZV6k3VIXi6uqEV4pbCy\nNhl/TWFlTb1+QmFlWXXc1PO7wso6lomFlTWRUwsrC14qsCwrilvwZmY15QRvZlZTTvBmZjXlBG9m\nVlNO8GZmNVV6go+I9SLiwYjweB1WK45t63alJviIWAQ4FbiyzP2YdZpj26qg7Bb868AOwN9L3o9Z\npzm2reuVPZrkLGBWRJS5G7OOc2xbFfgmq5lZTTnBm5nVVKcSfE+H9mPWaY5t61ql9sFHxMbAOcBY\n4M2IOAAYL+n5MvdrVjbHtlVB2TdZbwHeX+Y+zOYFx7ZVgfvgzcxqygnezKymnODNzGrKCd7MrKa6\nZ8q+Av35+nGFlXX8+K8UVtas8fMXVtatvx9fWFkAvNmlZdlcJnJsYWV9nS8XVtZRnv6vK7kFb2ZW\nU07wZmY15QRvZlZTTvBmZjXlBG9mVlOlP0UTEScDm+V9nShpctn7NCub49qqoOwp+7YC1pW0KbA9\n8O0y92fWCY5rq4qyu2huAHbJr18EFo0ID69qVee4tkroxJR9M/PiZ4FfSuotc59mZXNcW1V05Jes\nEbETsC+wbSf2Z9YJjmvrdqU/RRMR2wFHAttLmlH2/sw6wXFtVVD2jE5LAt8CJkh6ocx9mXWK49qq\nouwuml2BZYCLIqKxbk9Jj5e8X7MyOa6tEsq+yToJmFTmPsw6zXFtVeFfspqZ1ZQTvJlZTTnBm5nV\nVFt98PmpgTHAW7/Wk/RQWZUy6xTHttXZoAk+Is4A9gGeaXnrPaXUqMscff0pxRVW4Igll07errjC\ngBP4amFlPTBrjcLKeu5vYwsrq9Voj+2jCpz+75YCp//bmNsKKyu5ouDyqqOdFvxWwHKSXiu7MmYd\n5ti2WmunD/5+4PWyK2I2Dzi2rdbaacFPA26IiBuBWXldr6RjyquWWUc4tq3W2knwzwJX59e9pJtR\nHjnP6sCxbbU2aIKXdFwH6mHWcY5tq7t+E3y+bO1Pr6QtBis8IhYBzgXGAgsBx0v65VAraVakkca2\n49qqYqAW/NEDvNfuZewOwK2STomIVYHfAj4QbF4baWw7rq0S+k3wkq4baeGSLmxaXBXwaHs2z400\nth3XVhWdmtHpZmAlUsvHrBYc19btOjIWTZ59fkfgp53Yn1knOK6t27WV4CNi6YjYKCLGRcQS7RYe\nERtExCoAku4CFoiIZYdZV7PCDSe2HddWFYMm+Ij4IvAAaSSV7wIPRcQX2ix/c+BLuZx3AYtJah33\nw2yeGEFsO66tEtrpg98bWF3Si5BaPMB1wPfb+OxZwA8j4gZgYaDdE4NZJ+zN8GLbcW2V0E6Cf6Jx\nAABIej4iHmyn8DyI0x7DrZxZyYYV245rq4p2EvyDEXEpMAWYnzQC33MRsS+ApB+VWD+zMjm2rdba\nSfCLAi8A4/LyS6SDYfO87IPAqsqxbbXWzlg0e3egHmYd59i2umtnRqe+fqXXK2nVEupj1jGObau7\ndrpoNm96vSAwAViknOqYdZRj22qtnS6aR1pXRcQU4LRSalRnhxVX1M49mxRXGDD72S0LK+ukMcV9\n0StXK27u2etblh3bxdmYkworq/fD/1JYWQA9DxU4xP8DxxVXVge000WzNXOPsLcqsHppNTLrEMe2\n1V07XTRHM+cg6CU9afD50mpk1jmObau1drpotuxAPcw6zrFtdddOF837gDNJzwr3AlOBgyQ9UHLd\nzErl2La6a2c0ye8BpwIrkMa+Pgv473Z3EBELR8SDEbHX8KpoVhrHttVaO33wPS3zTU6OiEOGsI+j\nSLPXe7Z66zaObau1dlrw74iIDRoLEbEh6efcg4qItYG1SfNV9gyrhmblcWxbrbXTgv8K8LOIGJuX\nnwD2bLP8bwEHAfsMo25mZXNsW621k+D/JmmtiFiK9DPuFwf9BBARewI3SHosItzCsW7k2LZaayfB\n/y+wpaQXhlj2R4HVI+ITwMrA6xHxuKRrhlpJs5I4tq3W2knw90XET4CbgTfyut7BxsqW9OnG64g4\nFnjYB4B1Gce21Vo7Cf6dwCxgo5b1Hivbqs6xbbXWkfHgJU0caRlmRXNsW90NmOAj4uOSJufXF5J+\nEPIKsLukZztQP7NSOLZtNOj3Ofj8g4+vRUTjJLAK6YcdtwP/1YG6mZXCsW2jxUA/dNoH2FrSm3n5\nNUnXA8cCW5ReM7PyOLZtVBgowc+Q9FTT8s8AJL0BzCy1VmblcmzbqDBQgl+8eUHSOU2LS5RTHbOO\ncGzbqDDQTdY/RcTnJE1qXhkRRwDXllstG9RtxxVa3HzLFJfXes/6cmFlrXXAfYWV1TRln2O7cK8W\nVlLPlEmDbzQEvd8s7sfGPfcXOK7cD44rrqx+DJTg/xO4LP8s+7a87Sak0fN2LL1mZuVxbNuo0G+C\nl/RkRGwMbA2sC7wJ/FzSjZ2qnFkZHNs2Wgz4HLykXuCq/J9ZbTi2bTRoZzx4MzOroHbGohm2iNgS\nuAj4c151t6ShzJhj1nUc11YVpSb47FpJu3RgP2ad5Li2rteJLhpPiGB15Li2rld2C74XWCciLgPG\nABMl+aaWVZ3j2iqh7Bb8/cBxknYC9gJ+2DTAk1lVOa6tEkpN8JKmS7oov34IeBJYqcx9mpXNcW1V\nUWqCj4jd85Rm5JnrxwLTytynWdkc11YVZV9WXg78LCJuAuYHDmwaotWsqhzXVgmlJnhJL+OxPaxm\nHNdWFf4lq5lZTTnBm5nVlBO8mVlNOcGbmdWUE7yZWU11z3ga1/UWOBeWDdVC//xcYWW99u0xhZXV\ne0GB063dO6/i/VjH9jz1/sJK6v3qJwsrq+eOAsPiNz19xrZb8GZmNeUEb2ZWU07wZmY15QRvZlZT\npQ9xGhF7AIeTZq4/RtKvyt6nWdkc11YFZY8muQxwDPAhYAdgpzL3Z9YJjmurirJb8NsAV0maCcwE\nDih5f2ad4Li2Sig7wa8GLJKnNluaNAvONSXv06xsjmurhLIT/HykOSs/DrwbuJZ0cJhVmePaKqHs\np2ieBKZKmp2nNpsREcuWvE+zsjmurRLKTvBTgAkR0ZNvTC0m6ZmS92lWNse1VULpk24DFwO3AL8C\nDi5zf2ad4Li2qij9OXhJk4BJZe/HrJMc11YF/iWrmVlNOcGbmdWUE7yZWU05wZuZ1ZQTvJlZTZX+\nFI1Vw2v3FjfN3tXHblpYWccdV1hRNmrdXVhJPSf8o7CyflXgDJIf7We9W/BmZjXlBG9mVlNO8GZm\nNeUEb2ZWU6XeZI2IfYF/b1r1L5IWL3OfZmVzXFtVlJrgJf0I+BFARGwBfKrM/Zl1guPaqqKTj0ke\nA+zewf2ZdYLj2rpWR/rgI2Ic8JikpzqxP7NOcFxbt+vUTdb9gHM7tC+zTnFcW1frVIIfD9zcoX2Z\ndYrj2rpa6Qk+IlYEXpb0Ztn7MusUx7VVQSda8MsDf+/Afsw6yXFtXa8TU/bdAfxr2fsx6yTHtVWB\nf8lqZlZTTvBmZjXlBG9mVlNO8GZmNeUEb2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZV0jOvK9CuiDgd\n2AjoBQ6VdNsIy1sPmAycJunMEZZ1MrAZafC2EyVNHkYZi5AmjxgLLAQcL+mXI6zXwsCfga9JOm8E\n5WwJXJTLArhb0iEjKG8P4HDgTeAYSb8aZjm1mPy6yNjutrjO5XRlbI+GuO7knKzDFhHjgTUkbRoR\na5MmPN50BOUtApwKXFlA3bYC1s11GwP8kXSADdUOwK2STomIVYHfAiM6CICjgGdJiWOkrpW0y0gL\niYhlSPOYrg8sDkwEhnUg1GHy6yJju0vjGro7tmsd15VI8MAEcnBJujcilo6IxSS9PMzyXicF3REF\n1O0G4Nb8+kVg0YjokTSkwJN0YdPiqsDjI6lUThZrkw6kIq7Uirra2wa4StJMYCZwQEHlVnXy6yJj\nu+viGro+tmsd11VJ8MsDtzctPw2sANw/nMIkzQJmRcSIK5bLmpkXPwv8cjgHQUNE3AysRDpQR+Jb\nwEHAPiMsB1IraZ2IuAwYA0yUdNUwy1oNWCSXtTRwnKRrRlK5ik9+XVhsd3NcQ1fGdu3juqpj0fRQ\nTLdDYSJiJ2Bf4OCRlCNpU2BH4KcjqMuewA2SHqOYFsr9pIDdCdgL+GFEDLdxMB/pYPo4sDfw4wLq\nV6fJr7sqtouKa+jK2K59XFclwU8ntXQaVgSemEd1eZuI2A44Ethe0oxhlrFBRKwCIOkuYIGIWHaY\nVfoo8KmImEpqfR0dEROGWRaSpku6KL9+CHiS1BIbjieBqZJm57JmjOB7NlR58uuuje0i4jqX05Wx\nPRriuipdNFNINy0mRcT6wLTc1zVSI27dRsSSpEvGCZJeGEFRm5Mu874YEe8CFpP0zHAKkvTppvod\nCzw8ksvFiNgdWFPSxIgYS3oaYtowi5sCnBsR3yS1eIb9PXPdqj75dRmx3U1xDV0a26MhriuR4CVN\njYjbI+J3wCxS/9uwRcTGwDmkf9A3I+IAYLyk54dR3K7AMsBFTX2fe0oa6o2ks0iXiDcACwNfGEZd\nynI58LOIuAmYHzhwuIEnaXpEXAzckleN9NK/0pNfFxnbXRrX0L2x7bg2MzMzMzMzMzMzMzMzMzMz\nMzMzM6umygwXXDURsTzwTWA9YAZphLkfSzqjw/XYADgBaPyq7mngSEl/HORzmwBPSnq45CpahTiu\nq6UqQxVUSkT0AJcBv5P0QUlbANsB+0fExztYj7HApaQxszeQ1DgoLs/Dmw5kX2D1suto1eG4rh63\n4EsQEduQBjHarGX9Ao1fykXEuaThXdcC9gBWBk4B3iANNnWwpL9GxHWkCRKujoh3AzdKWiV/fibw\nXtLog+dKOr1lfycAPZKObFl/KvCKpKMjYjawgKTZEbE3sDXwC9JgSY8CX5R0bSF/GKs0x3X1uAVf\njnWBt83K0/Iz6F5gYUlbSpoG/AQ4TNIE4DTgzKbt+htdcCVJ2wNbAEdFxNIt7/8zc8b0bjaVNDFB\nq16gV9KlwJ3Al0bDQWBtc1xXTCXGoqmgN2n620bE/qRB+xcCHm+aQebm/P5SwFhJjXHBrwcuGGQf\nvaQBjpD0YkQICOD3TdvMJI2x0aqHNO5JX+t7WpbNGhzXFeMWfDn+BGzSWJB0jqStSDPtrNC03Rv5\n/60tmeYxwZvfW7Blu+Yg7wFmD1SPJuPouwXUWn7XjEtuXcFxXTFO8CWQdCPwbES8NXVaRLyDdEPq\nlT62fxF4IiI2zKu2IV1uArxEmuYM0vRuDT3AVrnspYE1gPtaij6TNHb2lk312JQ0KcF3+ih/K+YE\n/2zefmDYKOa4rh530ZRnR+CEiPgjKdgWJc1z2Ty/YnNLYk/gtIiYRboUPjCv/x5wVh67+jfM3QJ6\nLiIuId2QOkbSS80VkPRcPgjOiIhT8meeBHZumsDhJGBKRNwP3EW6KQZpYuSzI+LQ3HdpBo5rs/JF\nxI8jYt95XQ+zIjmui+UuGjMzMzMzMzMzMzMzMzMzMzMzMzMzMzOrkv8PzXJvEP/NJ0AAAAAASUVO\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1926,26 +1915,23 @@ "source": [ "# Create plot of the H-1 scattering matrix\n", "fig = plt.subplot(121)\n", - "fig.imshow(h1, interpolation='nearest')\n", + "fig.imshow(h1, interpolation='nearest', cmap='jet')\n", "plt.title('H-1 Scattering Matrix')\n", + "plt.xlabel('Group Out')\n", + "plt.ylabel('Group In')\n", + "plt.grid()\n", "\n", "# Create plot of the O-16 scattering matrix\n", "fig2 = plt.subplot(122)\n", - "fig2.imshow(o16, interpolation='nearest')\n", + "fig2.imshow(o16, interpolation='nearest', cmap='jet')\n", "plt.title('O-16 Scattering Matrix')\n", + "plt.xlabel('Group Out')\n", + "plt.ylabel('Group In')\n", + "plt.grid()\n", "\n", "# Show the plot on screen\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb index 4a8cfbc6b5..2979c2b032 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb +++ b/docs/source/pythonapi/examples/MGXS-Part-III.ipynb @@ -4,23 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to help automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", + "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", "\n", "* Calculation of multi-group cross sections for a **fuel assembly**\n", "* Automated creation, manipulation and storage of `MGXS` with **`openmc.mgxs.Library`**\n", - "* **Validation** of multi-group cross sections with **OpenMOC**\n", - "* Steady-state pin-by-pin **fission rates comparison** between OpenMC and OpenMOC\n", + "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", + "* Steady-state pin-by-pin **fission rates comparison** between OpenMC and [OpenMOC](https://mit-crpg.github.io/OpenMOC/)\n", "\n", - "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases." + "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n" + ] + } + ], "source": [ "import math\n", "import pickle\n", @@ -41,13 +61,6 @@ "%matplotlib inline" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -111,7 +124,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "With our three materials, we can now create a materials file object that can be exported to an actual XML file." + "With our three materials, we can now create a `MaterialsFile` object that can be exported to an actual XML file." ] }, { @@ -216,7 +229,7 @@ "# Create a Universe to encapsulate a control rod guide tube\n", "guide_tube_universe = openmc.Universe(name='Guide Tube')\n", "\n", - "# Create fuel Cell\n", + "# Create guide tube Cell\n", "guide_tube_cell = openmc.Cell(name='Guide Tube Water')\n", "guide_tube_cell.fill = water\n", "guide_tube_cell.region = -fuel_outer_radius\n", @@ -239,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26cm pitch." + "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26 cm pitch." ] }, { @@ -320,7 +333,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML." + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." ] }, { @@ -389,7 +402,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let us also create a plot file that we can use to verify that our pin cell geometry was created successfully." + "Let us also create a `PlotsFile` that we can use to verify that our fuel assembly geometry was created successfully." ] }, { @@ -454,7 +467,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTI5VDE3OjIwOjAxLTA1OjAwddLLfAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0yOVQxNzoyMDowMS0wNTowMASPc8AAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTMwVDIxOjAzOjIyLTA1OjAwMx3rxQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0zMFQyMTowMzoyMi0wNTowMEJAU3kAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -476,7 +489,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As we can see from the plot, we have a nice array of pin cells with fuel, cladding, and water!" + "As we can see from the plot, we have a nice array of fuel and guide tube pin cells with fuel, cladding, and water!" ] }, { @@ -490,7 +503,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." ] }, { @@ -530,7 +543,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to type string codes mapped accepted by the `Library` class:\n", + "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to string codes accepted by the `Library` class:\n", "\n", "* `TotalXS` (`\"total\"`)\n", "* `TransportXS` (`\"transport\"`)\n", @@ -546,7 +559,7 @@ "\n", "In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define `\"transport\"`, `\"nu-fission\"`, `\"nu-scatter matrix\"` and `\"chi\"` cross sections for our `Library`.\n", "\n", - "**Note**: A variety of different approximate transport-corrected total multi-group cross sections (and corresponding scattering matrices) can be found in the literature. At the present time, the `openmc.mgxs` module only supports the \"P0\" transport correction. This correction can be turned on or off through the boolean `Library.correction` property which may take values of `\"P0\"` (default) or `None`." + "**Note**: A variety of different approximate transport-corrected total multi-group cross sections (and corresponding scattering matrices) can be found in the literature. At the present time, the `openmc.mgxs` module only supports the `\"P0\"` transport correction. This correction can be turned on and off through the boolean `Library.correction` property which may take values of `\"P0\"` (default) or `None`." ] }, { @@ -558,14 +571,16 @@ "outputs": [], "source": [ "# Specify multi-group cross section types to compute\n", - "mgxs_lib.mgxs_types = [\"transport\", \"nu-fission\", \"nu-scatter matrix\", \"chi\"]" + "mgxs_lib.mgxs_types = ['transport', 'nu-fission', 'nu-scatter matrix', 'chi']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells for our fuel and guide tube pin cells." + "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells in the fuel assembly geometry.\n", + "\n", + "**Note:** By default, the `Library` class will instantiate `MGXS` objects for each and every domain (material, cell or universe) in the geometry of interest. However, one may specify a subset of these domains to the `Library.domains` property. In our case, we wish to compute multi-group cross sectoins in each and every cell since they will be needed in our downstream OpenMOC calculation on the identical combinatorial geometry mesh." ] }, { @@ -577,14 +592,17 @@ "outputs": [], "source": [ "# Specify a \"cell\" domain type for the cross section tally filters\n", - "mgxs_lib.domain_type = \"cell\"" + "mgxs_lib.domain_type = \"cell\"\n", + "\n", + "# Specify the cell domains over which to compute multi-group cross sections\n", + "mgxs_lib.domains = geometry.get_all_material_cells()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can easily instruct the `Library` to compute multi-group cross sections on a nuclide-by-nuclide basis as was first illustrated in MGXS: Part II with the boolean `Library.by_nuclide` property. By default, `by_nuclide` is set to `False`, but we will set it to `True` here." + "We can easily instruct the `Library` to compute multi-group cross sections on a nuclide-by-nuclide basis with the boolean `Library.by_nuclide` property. By default, `by_nuclide` is set to `False`, but we will set it to `True` here." ] }, { @@ -603,7 +621,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Lastly, we use the `Library` to construct all of the tallies needed to compute all of the requested multi-group cross sections in each domain and nuclide." + "Lastly, we use the `Library` to construct the tallies needed to compute all of the requested multi-group cross sections in each domain and nuclide." ] }, { @@ -624,7 +642,7 @@ "source": [ "The tallies can now be export to a \"tallies.xml\" input file for OpenMC. \n", "\n", - "**NOTE**: At this point the `Library` has constructed nearly 100 distinct `Tally`. The overhead to tally in OpenMC scales as $O(N)$ for $N$ tallies, which can become a bottleneck for large tally datasets. To compensate for this, the Python API's `Tally`, `Filter` and `TalliesFile` classes allow for the smart *merging* of tallies when possible. The `Library` class supports this runtime optimization with the use of the optional `merge` paramter (`False` by default) for the `Library.add_to_tallies_file(...)` method, as shown below." + "**NOTE**: At this point the `Library` has constructed nearly 100 distinct `Tally` objects. The overhead to tally in OpenMC scales as $O(N)$ for $N$ tallies, which can become a bottleneck for large tally datasets. To compensate for this, the Python API's `Tally`, `Filter` and `TalliesFile` classes allow for the smart *merging* of tallies when possible. The `Library` class supports this runtime optimization with the use of the optional `merge` paramter (`False` by default) for the `Library.add_to_tallies_file(...)` method, as shown below." ] }, { @@ -679,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": true }, @@ -691,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, @@ -717,7 +735,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-29 17:20:02\n", + " Date/Time: 2015-11-30 21:03:22\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -765,85 +783,11 @@ " 18/1 1.01476 1.02800 +/- 0.00664\n", " 19/1 1.01490 1.02655 +/- 0.00604\n", " 20/1 1.00926 1.02482 +/- 0.00567\n", - " 21/1 0.98504 1.02120 +/- 0.00627\n", - " 22/1 1.00397 1.01977 +/- 0.00591\n", - " 23/1 1.02556 1.02021 +/- 0.00545\n", - " 24/1 0.99808 1.01863 +/- 0.00529\n", - " 25/1 0.99638 1.01715 +/- 0.00514\n", - " 26/1 0.99615 1.01584 +/- 0.00499\n", - " 27/1 1.01843 1.01599 +/- 0.00469\n", - " 28/1 1.00315 1.01528 +/- 0.00447\n", - " 29/1 1.00633 1.01480 +/- 0.00426\n", - " 30/1 1.02159 1.01514 +/- 0.00405\n", - " 31/1 1.03395 1.01604 +/- 0.00396\n", - " 32/1 1.02672 1.01652 +/- 0.00381\n", - " 33/1 1.03778 1.01745 +/- 0.00375\n", - " 34/1 1.03807 1.01831 +/- 0.00369\n", - " 35/1 1.07854 1.02072 +/- 0.00428\n", - " 36/1 1.03524 1.02128 +/- 0.00415\n", - " 37/1 1.03100 1.02164 +/- 0.00401\n", - " 38/1 1.03853 1.02224 +/- 0.00391\n", - " 39/1 1.04089 1.02288 +/- 0.00383\n", - " 40/1 1.02150 1.02284 +/- 0.00370\n", - " 41/1 0.98470 1.02161 +/- 0.00379\n", - " 42/1 1.00658 1.02114 +/- 0.00370\n", - " 43/1 0.98652 1.02009 +/- 0.00373\n", - " 44/1 1.02787 1.02032 +/- 0.00363\n", - " 45/1 0.98800 1.01939 +/- 0.00364\n", - " 46/1 1.00286 1.01893 +/- 0.00357\n", - " 47/1 1.02559 1.01911 +/- 0.00348\n", - " 48/1 1.03729 1.01959 +/- 0.00342\n", - " 49/1 1.02538 1.01974 +/- 0.00333\n", - " 50/1 1.01478 1.01962 +/- 0.00325\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 4.0000E-01 seconds\n", - " Reading cross sections = 8.4000E-02 seconds\n", - " Total time in simulation = 3.8366E+01 seconds\n", - " Time in transport only = 3.8351E+01 seconds\n", - " Time in inactive batches = 3.6930E+00 seconds\n", - " Time in active batches = 3.4673E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 3.8780E+01 seconds\n", - " Calculation Rate (inactive) = 6769.56 neutrons/second\n", - " Calculation Rate (active) = 2884.09 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.01805 +/- 0.00261\n", - " k-effective (Track-length) = 1.01962 +/- 0.00325\n", - " k-effective (Absorption) = 1.01554 +/- 0.00339\n", - " Combined k-effective = 1.01711 +/- 0.00235\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" + " 21/1 0.98504 1.02120 +/- 0.00627\n" ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "# Remove old HDF5 (summary, statepoint) files\n", - "!rm statepoint.*\n", - "\n", "# Run OpenMC\n", "executor.run_simulation()" ] @@ -859,12 +803,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and \"reading\" the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge." + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, @@ -878,12 +822,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint." + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, @@ -902,7 +846,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, @@ -930,12 +874,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Library` supports a rich API to automate a variety of tasks, including multi-group cross section data retrieval and storage. We will highlight a few of these features here. First, the `Library.get_mgxs(...)` method allows one to extract an `MGXS` object from the `Library` for a particular domain and cross section type. The following cell illustrates how one may extract the `NuFissionXS` object for the fuel cell." + "The `Library` supports a rich API to automate a variety of tasks, including multi-group cross section data retrieval and storage. We will highlight a few of these features here. First, the `Library.get_mgxs(...)` method allows one to extract an `MGXS` object from the `Library` for a particular domain and cross section type. The following cell illustrates how one may extract the `NuFissionXS` object for the fuel cell.\n", + "\n", + "**Note:** The `MGXS.get_mgxs(...)` method will accept either the domain *or* the integer domain ID of interest." ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": false }, @@ -949,106 +895,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `NuFissionXS` object supports all of the methods described previously the `openmc.mgxs` tutorials, such as Pandas DataFrames:" + "The `NuFissionXS` object supports all of the methods described previously the `openmc.mgxs` tutorials, such as [Pandas](http://pandas.pydata.org/) `DataFrames`:" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" - ] - }, - { - "data": { - "text/html": [ - "
\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 8.063513e-03 4.062984e-05\n", - "4 10000 1 U-238 7.335515e-03 4.459335e-05\n", - "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U-235 3.613274e-01 1.902492e-03\n", - "1 10000 2 U-238 6.738424e-07 3.536787e-09\n", - "2 10000 2 O-16 0.000000e+00 0.000000e+00" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = fuel_mgxs.get_pandas_dataframe()\n", "df" @@ -1063,39 +919,11 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\tnu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t10000\n", - "\tNuclide =\tU-235\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 5.04e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.27e-01%\n", - "\n", - "\tNuclide =\tU-238\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 6.08e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.25e-01%\n", - "\n", - "\tNuclide =\tO-16\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "fuel_mgxs.print_xs()" ] @@ -1109,7 +937,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1123,32 +951,30 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The HDF5 store will contain the numerical multi-group cross section data indexed by domain, nuclide and cross section type. Some data workflows may be optimized by storing and retrieving binary representations of the `MGXS` objects in the `Library`. This feature is supported through the `Library.dump_to_file(...)` and `Library.load_from_file(...)` routines which use Python's `pickle` module. This is illustrated as follows." + "The HDF5 store will contain the numerical multi-group cross section data indexed by domain, nuclide and cross section type. Some data workflows may be optimized by storing and retrieving binary representations of the `MGXS` objects in the `Library`. This feature is supported through the `Library.dump_to_file(...)` and `Library.load_from_file(...)` routines which use Python's [`pickle`](https://docs.python.org/2/library/pickle.html) module. This is illustrated as follows." ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "# Store a complete binary representation of the Library and\n", - "# its MGXS objects in a pickled binary file \"mgxs/mgxs.pkl\"\n", + "# Store a Library and its MGXS objects in a pickled binary file \"mgxs/mgxs.pkl\"\n", "mgxs_lib.dump_to_file(filename='mgxs', directory='mgxs')" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "# Instantiate a new MGXS Library from the complete binary representation\n", - "# stored in the pickled binary file \"mgxs/mgxs.pkl\"\n", + "# Instantiate a new MGXS Library from the pickled binary file \"mgxs/mgxs.pkl\"\n", "mgxs_lib = openmc.mgxs.Library.load_from_file(filename='mgxs', directory='mgxs')" ] }, @@ -1156,12 +982,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Library` class may be used to leverage the energy condensation features supported by the `MGXS` class and illutrated in earlier tutorials on `openmc.mgxs`. In particular, one can use the `Library.get_condensed_library(...)` with a coarse group structure which is a subset of the original \"fine\" group structure as shown below." + "The `Library` class may be used to leverage the energy condensation features supported by the `MGXS` class. In particular, one can use the `Library.get_condensed_library(...)` with a coarse group structure which is a subset of the original \"fine\" group structure as shown below." ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": true }, @@ -1176,67 +1002,11 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "0 10000 1 U-235 0.074383 0.000280\n", - "1 10000 1 U-238 0.005959 0.000036\n", - "2 10000 1 O-16 0.000000 0.000000" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Retrieve the NuFissionXS object for the fuel cell from the 1-group library\n", "coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')\n", @@ -1256,12 +1026,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." + "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code [OpenMOC](https://mit-crpg.github.io/OpenMOC/). We will extract an OpenCG geometry from the summary file and convert it into an equivalent OpenMOC geometry." ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1275,12 +1045,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we can inject the multi-group cross sections into the equivalent fuel assembly OpenMOC geometry. The `openmoc.materialize` module is seamlessly integrated to support the loading of `Library` objects from OpenMC." + "Now, we can inject the multi-group cross sections into the equivalent fuel assembly OpenMOC geometry. The `openmoc.materialize` module supports the loading of `Library` objects from OpenMC as illustrated below." ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1299,143 +1069,16 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", - "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.854316\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.801593\tres = 1.522E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.761131\tres = 6.380E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.731467\tres = 5.066E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.709897\tres = 3.910E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.695110\tres = 2.954E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.685966\tres = 2.085E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.681511\tres = 1.317E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.680926\tres = 6.520E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.683509\tres = 1.046E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.688659\tres = 3.848E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.695860\tres = 7.565E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.704674\tres = 1.048E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.714726\tres = 1.269E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.725700\tres = 1.428E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.737329\tres = 1.537E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.749388\tres = 1.604E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.761690\tres = 1.637E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.774081\tres = 1.643E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.786432\tres = 1.628E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.798638\tres = 1.597E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.810618\tres = 1.553E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.822303\tres = 1.501E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.833643\tres = 1.443E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.844598\tres = 1.380E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.855140\tres = 1.315E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.865249\tres = 1.249E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.874914\tres = 1.183E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.884128\tres = 1.118E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.892891\tres = 1.054E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.901206\tres = 9.920E-03\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.909080\tres = 9.320E-03\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.916523\tres = 8.745E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.923546\tres = 8.194E-03\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.930162\tres = 7.669E-03\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.936387\tres = 7.171E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.942236\tres = 6.698E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.947725\tres = 6.252E-03\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.952869\tres = 5.830E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.957687\tres = 5.433E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.962193\tres = 5.060E-03\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.966404\tres = 4.710E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.970337\tres = 4.381E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.974006\tres = 4.073E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.977426\tres = 3.785E-03\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.980613\tres = 3.515E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.983580\tres = 3.264E-03\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.986341\tres = 3.029E-03\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.988908\tres = 2.809E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.991293\tres = 2.605E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.993509\tres = 2.415E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.995566\tres = 2.238E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.997475\tres = 2.073E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.999246\tres = 1.920E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.000888\tres = 1.777E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.002409\tres = 1.645E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.003818\tres = 1.522E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.005123\tres = 1.408E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.006331\tres = 1.302E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.007450\tres = 1.203E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.008484\tres = 1.112E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.009440\tres = 1.028E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.010324\tres = 9.496E-04\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.011141\tres = 8.771E-04\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.011897\tres = 8.100E-04\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.012594\tres = 7.478E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.013238\tres = 6.903E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.013833\tres = 6.371E-04\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.014382\tres = 5.879E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.014889\tres = 5.424E-04\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.015357\tres = 5.004E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.015789\tres = 4.615E-04\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.016187\tres = 4.255E-04\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.016554\tres = 3.923E-04\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.016892\tres = 3.617E-04\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.017204\tres = 3.333E-04\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.017492\tres = 3.072E-04\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.017757\tres = 2.831E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.018001\tres = 2.608E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.018226\tres = 2.403E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.018433\tres = 2.213E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.018624\tres = 2.038E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.018800\tres = 1.877E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.018962\tres = 1.728E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.019110\tres = 1.591E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.019248\tres = 1.465E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.019374\tres = 1.348E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.019490\tres = 1.241E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.019597\tres = 1.142E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.019695\tres = 1.051E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.019786\tres = 9.670E-05\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.019869\tres = 8.895E-05\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.019946\tres = 8.183E-05\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.020016\tres = 7.528E-05\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.020081\tres = 6.922E-05\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.020141\tres = 6.368E-05\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.020195\tres = 5.857E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.020246\tres = 5.385E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.020292\tres = 4.954E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.020335\tres = 4.553E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.020374\tres = 4.185E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.020410\tres = 3.848E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.020443\tres = 3.537E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.020474\tres = 3.253E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.020502\tres = 2.989E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.020527\tres = 2.746E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.020551\tres = 2.526E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.020573\tres = 2.319E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.020593\tres = 2.134E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.020611\tres = 1.960E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.020628\tres = 1.800E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.020643\tres = 1.652E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.020657\tres = 1.518E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.020670\tres = 1.398E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.020682\tres = 1.283E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.020693\tres = 1.178E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.020704\tres = 1.083E-05\n" - ] - } - ], + "outputs": [], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", - "track_generator = openmoc.TrackGenerator(openmoc_geometry, 32, 0.1)\n", + "track_generator = openmoc.TrackGenerator(openmoc_geometry, num_azim=32, spacing=0.1)\n", "track_generator.generateTracks()\n", "\n", "# Run OpenMOC\n", @@ -1452,21 +1095,11 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "openmc keff = 1.017105\n", - "openmoc keff = 1.020704\n", - "bias [pcm]: 359.8\n" - ] - } - ], + "outputs": [], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1500,12 +1133,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We will conclude this tutorial by illustrating how to visualize the fission rates computed by OpenMOC and OpenMC. First, we extract OpenMC's volume-averaged fission rates from each fuel pin into a 2D 17x17 NumPy array." + "We will conclude this tutorial by illustrating how to visualize the fission rates computed by OpenMOC and OpenMC. First, we extract volume-integrated fission rates from OpenMC's mesh fission rate tally for each pin cell in the fuel assembly." ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1518,9 +1151,6 @@ "# Reshape array to 2D for plotting\n", "openmc_fission_rates.shape = (17,17)\n", "\n", - "# Compute volume-average rates from OpenMC's volume-integrated fission rates\n", - "openmc_fission_rates /= math.pi * fuel_outer_radius.r**2\n", - "\n", "# Normalize to the average pin power\n", "openmc_fission_rates /= np.mean(openmc_fission_rates)" ] @@ -1534,7 +1164,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "collapsed": false }, @@ -1568,45 +1198,31 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Plot OpenMC's fission rates in the left subplot\n", "fig = pylab.subplot(121)\n", "pylab.imshow(openmc_fission_rates, interpolation='none', cmap='jet')\n", - "pylab.grid()\n", "pylab.title('OpenMC Fission Rates')\n", "\n", "# Plot OpenMOC's fission rates in the right subplot\n", "fig2 = pylab.subplot(122)\n", "pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet')\n", - "pylab.grid()\n", "pylab.title('OpenMOC Fission Rates')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/images/mgxs.png b/docs/source/pythonapi/examples/images/mgxs.png new file mode 100644 index 0000000000000000000000000000000000000000..3946a5b3c6d3c28579957643f8a15507de01b98e GIT binary patch literal 54562 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

%vLND}1}pwwjk{lj&T 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%0A3-Pt4rTcE=AKUMLd$2cL5vTThF>c9x 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 Date: Mon, 30 Nov 2015 21:31:34 -0500 Subject: [PATCH 493/519] Sphinx documentation updated with new MGXS ipython notebook trio --- .../pythonapi/examples/MGXS-Part-I.ipynb | 1172 ---------------- .../pythonapi/examples/mgxs-part-i.ipynb | 1202 +++++++++++++++++ .../source/pythonapi/examples/mgxs-part-i.rst | 13 + ...{MGXS-Part-II.ipynb => mgxs-part-ii.ipynb} | 0 .../pythonapi/examples/mgxs-part-ii.rst | 13 + ...GXS-Part-III.ipynb => mgxs-part-iii.ipynb} | 482 ++++++- .../pythonapi/examples/mgxs-part-iii.rst | 13 + .../examples/multi-group-cross-sections.rst | 11 - docs/source/pythonapi/index.rst | 4 +- 9 files changed, 1687 insertions(+), 1223 deletions(-) delete mode 100644 docs/source/pythonapi/examples/MGXS-Part-I.ipynb create mode 100644 docs/source/pythonapi/examples/mgxs-part-i.ipynb create mode 100644 docs/source/pythonapi/examples/mgxs-part-i.rst rename docs/source/pythonapi/examples/{MGXS-Part-II.ipynb => mgxs-part-ii.ipynb} (100%) create mode 100644 docs/source/pythonapi/examples/mgxs-part-ii.rst rename docs/source/pythonapi/examples/{MGXS-Part-III.ipynb => mgxs-part-iii.ipynb} (58%) create mode 100644 docs/source/pythonapi/examples/mgxs-part-iii.rst delete mode 100644 docs/source/pythonapi/examples/multi-group-cross-sections.rst diff --git a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb b/docs/source/pythonapi/examples/MGXS-Part-I.ipynb deleted file mode 100644 index 3eca44a263..0000000000 --- a/docs/source/pythonapi/examples/MGXS-Part-I.ipynb +++ /dev/null @@ -1,1172 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", - "\n", - "* **General equations** for scalar-flux averaged multi-group cross sections\n", - "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", - "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", - "\n", - "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction to Multi-Group Cross Sections (MGXS)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below:\n", - "\n", - "\n", - "\n", - "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations for fine-mesh heterogeneous deterministic neutron transport applications.\n", - "\n", - "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Introductory Notation\n", - "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Spatial and Energy Discretization\n", - "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", - "\n", - "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### General Scalar-Flux Weighted MGXS\n", - "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section $\\sigma_{n,x,k,g}$ as follows:\n", - "\n", - "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", - "\n", - "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-Group Scattering Matrices\n", - "The general multi-group cross section $\\sigma_{n,x,k,g}$ is a vector of $G$ values for each energy group $g$. The equation presented above only discretizes the energy of the incoming neutron and neglects the outgoing energy of the neutron (if any). Hence, this formulation must be extended to account for the outgoing energy of neutrons in the discretized scattering matrix cross section used by deterministic neutron transport codes. \n", - "\n", - "We denote the incoming and outgoing neutron energy groups as $g$ and $g'$ for the microscopic scattering matrix cross section $\\sigma_{n,s}(\\mathbf{r},E)$. As before, spatial homogenization and energy condensation are used to find the multi-group scattering matrix cross section $\\sigma_{n,s,k,g \\to g'}$ as follows:\n", - "\n", - "$$\\sigma_{n,s,k,g\\rightarrow g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,s}(\\mathbf{r},E'\\rightarrow E'')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", - "\n", - "This scalar flux-weighted multi-group microscopic scattering matrix is computed using OpenMC tallies with both energy in and energy out filters." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-Group Fission Spectrum\n", - "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", - "\n", - "Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n}(\\mathbf{r},E)$. The multi-group fission spectrum $\\chi_{n,k,g}$ is then the probability of fission neutrons emitted into energy group $g$. \n", - "\n", - "Similar to before, spatial homogenization and energy condensation are used to find the multi-group fission spectrum $\\chi_{n,k,g}$ as follows:\n", - "\n", - "$$\\chi_{n,k,g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", - "\n", - "The fission production-weighted multi-group fission spectrum is computed using OpenMC tallies with both energy in and energy out filters.\n", - "\n", - "This concludes our brief overview on the methodology to compute multi-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Input Files" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import openmc\n", - "import openmc.mgxs as mgxs\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "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')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the nuclides we defined, we will now create a material for the homogeneous medium." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a Material and register the Nuclides\n", - "inf_medium = openmc.Material(name='moderator')\n", - "inf_medium.set_density('g/cc', 5.)\n", - "inf_medium.add_nuclide(h1, 0.028999667)\n", - "inf_medium.add_nuclide(o16, 0.01450188)\n", - "inf_medium.add_nuclide(u235, 0.000114142)\n", - "inf_medium.add_nuclide(u238, 0.006886019)\n", - "inf_medium.add_nuclide(zr90, 0.002116053)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With our material, we can now create a `MaterialsFile` object that can be exported to an actual XML file." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", - "materials_file = openmc.MaterialsFile()\n", - "materials_file.default_xs = '71c'\n", - "materials_file.add_material(inf_medium)\n", - "materials_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate boundary Planes\n", - "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", - "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", - "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", - "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a Cell\n", - "cell = openmc.Cell(cell_id=1, name='cell')\n", - "\n", - "# Register bounding Surfaces with the Cell\n", - "cell.region = +min_x & -max_x & +min_y & -max_y\n", - "\n", - "# Fill the Cell with the Material\n", - "cell.fill = inf_medium" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Instantiate Universe\n", - "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", - "root_universe.add_cell(cell)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Create Geometry and set root Universe\n", - "openmc_geometry = openmc.Geometry()\n", - "openmc_geometry.root_universe = root_universe\n", - "\n", - "# Instantiate a GeometryFile\n", - "geometry_file = openmc.GeometryFile()\n", - "geometry_file.geometry = openmc_geometry\n", - "\n", - "# Export to \"geometry.xml\"\n", - "geometry_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# OpenMC simulation parameters\n", - "batches = 50\n", - "inactive = 10\n", - "particles = 2500\n", - "\n", - "# Instantiate a SettingsFile\n", - "settings_file = openmc.SettingsFile()\n", - "settings_file.batches = batches\n", - "settings_file.inactive = inactive\n", - "settings_file.particles = particles\n", - "settings_file.output = {'tallies': True, 'summary': True}\n", - "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", - "settings_file.set_source_space('fission', bounds)\n", - "\n", - "# Export to \"settings.xml\"\n", - "settings_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a 2-group EnergyGroups object\n", - "groups = mgxs.EnergyGroups()\n", - "groups.group_edges = np.array([0., 0.625e-6, 20.])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now use the `EnergyGroups` object, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", - "\n", - "* `TotalXS`\n", - "* `TransportXS`\n", - "* `AbsorptionXS`\n", - "* `CaptureXS`\n", - "* `FissionXS`\n", - "* `NuFissionXS`\n", - "* `ScatterXS`\n", - "* `NuScatterXS`\n", - "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", - "* `Chi`\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." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate a few different sections\n", - "total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups)\n", - "absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups)\n", - "scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Absorption` object as follows. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "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", - ")])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "absorption.tallies" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each `MGXS` object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Instantiate an empty TalliesFile\n", - "tallies_file = openmc.TalliesFile()\n", - "\n", - "# Add total tallies to the tallies file\n", - "for tally in total.tallies.values():\n", - " tallies_file.add_tally(tally)\n", - "\n", - "# Add absorption tallies to the tallies file\n", - "for tally in absorption.tallies.values():\n", - " tallies_file.add_tally(tally)\n", - "\n", - "# Add scattering tallies to the tallies file\n", - "for tally in scattering.tallies.values():\n", - " tallies_file.add_tally(tally)\n", - " \n", - "# Export to \"tallies.xml\"\n", - "tallies_file.export_to_xml()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we a have a complete set of inputs, so we can go ahead and run our simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "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", - " Copyright: 2011-2015 Massachusetts Institute of Technology\n", - " License: http://mit-crpg.github.io/openmc/license.html\n", - " Version: 0.7.0\n", - " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 20:15:33\n", - " MPI Processes: 1\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading cross sections XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\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", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.19804 \n", - " 2/1 1.12945 \n", - " 3/1 1.15573 \n", - " 4/1 1.13929 \n", - " 5/1 1.16300 \n", - " 6/1 1.22117 \n", - " 7/1 1.19012 \n", - " 8/1 1.11299 \n", - " 9/1 1.16066 \n", - " 10/1 1.12566 \n", - " 11/1 1.20854 \n", - " 12/1 1.14691 1.17773 +/- 0.03082\n", - " 13/1 1.17204 1.17583 +/- 0.01789\n", - " 14/1 1.14148 1.16724 +/- 0.01529\n", - " 15/1 1.17272 1.16834 +/- 0.01189\n", - " 16/1 1.18575 1.17124 +/- 0.01014\n", - " 17/1 1.20498 1.17606 +/- 0.00983\n", - " 18/1 1.14754 1.17249 +/- 0.00923\n", - " 19/1 1.18141 1.17348 +/- 0.00820\n", - " 20/1 1.15074 1.17121 +/- 0.00768\n", - " 21/1 1.15914 1.17011 +/- 0.00703\n", - " 22/1 1.14586 1.16809 +/- 0.00673\n", - " 23/1 1.18999 1.16978 +/- 0.00642\n", - " 24/1 1.15101 1.16844 +/- 0.00609\n", - " 25/1 1.13791 1.16640 +/- 0.00602\n", - " 26/1 1.19791 1.16837 +/- 0.00597\n", - " 27/1 1.19818 1.17012 +/- 0.00587\n", - " 28/1 1.14160 1.16854 +/- 0.00576\n", - " 29/1 1.11487 1.16571 +/- 0.00614\n", - " 30/1 1.17538 1.16620 +/- 0.00584\n", - " 31/1 1.20210 1.16791 +/- 0.00581\n", - " 32/1 1.20078 1.16940 +/- 0.00574\n", - " 33/1 1.14624 1.16839 +/- 0.00558\n", - " 34/1 1.14618 1.16747 +/- 0.00542\n", - " 35/1 1.16866 1.16752 +/- 0.00520\n", - " 36/1 1.18565 1.16821 +/- 0.00504\n", - " 37/1 1.16824 1.16821 +/- 0.00485\n", - " 38/1 1.18299 1.16874 +/- 0.00471\n", - " 39/1 1.21418 1.17031 +/- 0.00480\n", - " 40/1 1.11167 1.16835 +/- 0.00504\n", - " 41/1 1.11545 1.16665 +/- 0.00516\n", - " 42/1 1.11114 1.16491 +/- 0.00529\n", - " 43/1 1.14227 1.16423 +/- 0.00517\n", - " 44/1 1.14104 1.16355 +/- 0.00506\n", - " 45/1 1.16756 1.16366 +/- 0.00492\n", - " 46/1 1.13065 1.16274 +/- 0.00487\n", - " 47/1 1.11251 1.16139 +/- 0.00492\n", - " 48/1 1.14731 1.16101 +/- 0.00481\n", - " 49/1 1.16691 1.16117 +/- 0.00469\n", - " 50/1 1.19679 1.16206 +/- 0.00465\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 4.1200E-01 seconds\n", - " Reading cross sections = 9.2000E-02 seconds\n", - " Total time in simulation = 1.4213E+01 seconds\n", - " Time in transport only = 1.4199E+01 seconds\n", - " Time in inactive batches = 1.7980E+00 seconds\n", - " Time in active batches = 1.2415E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 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.4634E+01 seconds\n", - " Calculation Rate (inactive) = 13904.3 neutrons/second\n", - " Calculation Rate (active) = 8054.77 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.16131 +/- 0.00453\n", - " k-effective (Track-length) = 1.16206 +/- 0.00465\n", - " k-effective (Absorption) = 1.16096 +/- 0.00364\n", - " Combined k-effective = 1.16120 +/- 0.00325\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" - ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Run OpenMC\n", - "executor = openmc.Executor()\n", - "executor.run_simulation()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Tally Data Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.50.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the summary file and link it with the statepoint\n", - "su = openmc.Summary('summary.h5')\n", - "sp.link_with_summary(su)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Load the tallies from the statepoint into each MGXS object\n", - "total.load_from_statepoint(sp)\n", - "absorption.load_from_statepoint(sp)\n", - "scattering.load_from_statepoint(sp)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! Our multi-group cross sections are now ready to rock 'n roll!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extracting and Storing MGXS Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's first inspect our total cross section by printing it to the screen." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttotal\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 1.88e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.91e-01%\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "total.print_xs()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, - { - "data": { - "text/html": [ - "

\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", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
\n", - "
" - ], - "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "1 1 1 total 0.668323 0.001264\n", - "0 1 2 total 1.293258 0.007624" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = scattering.get_pandas_dataframe()\n", - "df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "absorption.export_xs_data(filename='absorption-xs', format='excel')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following code snippet shows how to export all three `MGXS` to the same HDF5 binary data store." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "total.build_hdf5_store(filename='mgxs', append=True)\n", - "absorption.build_hdf5_store(filename='mgxs', append=True)\n", - "scattering.build_hdf5_store(filename='mgxs', append=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparing MGXS with Tally Arithmetic" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide \\\n", - "0 1 (0.0e+00 - 6.3e-07) total \n", - "1 1 (6.3e-07 - 2.0e+01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((total / flux) - (absorption / flux)) - (sca... 4.884981e-15 0.011274 \n", - "1 (((total / flux) - (absorption / flux)) - (sca... 1.221245e-15 0.001802 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", - "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", - "\n", - "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", - "difference.get_pandas_dataframe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similarly, we can use tally arithmetic to compute the ratio of `AbsorptionXS` and `ScatterXS` to the `TotalXS`." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 1 (0.0e+00 - 6.3e-07) total ((absorption / flux) / (total / flux)) \n", - "1 1 (6.3e-07 - 2.0e+01) total ((absorption / flux) / (total / flux)) \n", - "\n", - " mean std. dev. \n", - "0 0.076219 0.000651 \n", - "1 0.019319 0.000086 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", - "absorption_to_total = absorption.xs_tally / total.xs_tally\n", - "\n", - "# The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", - "absorption_to_total.get_pandas_dataframe()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 1 (0.0e+00 - 6.3e-07) total ((scatter / flux) / (total / flux)) \n", - "1 1 (6.3e-07 - 2.0e+01) total ((scatter / flux) / (total / flux)) \n", - "\n", - " mean std. dev. \n", - "0 0.923781 0.007714 \n", - "1 0.980681 0.002617 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", - "scattering_to_total = scattering.xs_tally / total.xs_tally\n", - "\n", - "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", - "scattering_to_total.get_pandas_dataframe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lastly, we sum the derived scatter-to-total and absorption-to-total ratios to confirm that they sum to unity." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide \\\n", - "0 1 (0.0e+00 - 6.3e-07) total \n", - "1 1 (6.3e-07 - 2.0e+01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((absorption / flux) / (total / flux)) + ((sc... 1 0.007741 \n", - "1 (((absorption / flux) / (total / flux)) + ((sc... 1 0.002619 " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", - "sum_ratio = absorption_to_total + scattering_to_total\n", - "\n", - "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", - "sum_ratio.get_pandas_dataframe()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb new file mode 100644 index 0000000000..5207ac4f39 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -0,0 +1,1202 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", + "\n", + "* **General equations** for scalar-flux averaged multi-group cross sections\n", + "* Creation of multi-group cross sections for an **infinite homogeneous medium**\n", + "* Use of **tally arithmetic** to manipulate multi-group cross sections\n", + "\n", + "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Multi-Group Cross Sections (MGXS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\ncdttt+F//ud/nOZ5//33YTab8cYbb+Dxxx9HTEwMWrZsiW+++QaAfReJ3r17o2XLlrj99tthtVox\nbdo0dO/eHQCglEKvXr0wevRol9e32Wxo1aoV5s6d6/PyerIMM2bMwPXr15GVleXy+PXr11fOQ0QU\nLLhlmohIg7KyMpSVlTlNM5lMLluId+7ciX/84x/4/e9/j7CwMKxcuRLjx4/Hl19+WTnIPXbsGIYO\nHYpu3brhv//7v9G+fXvs3r0bjz32GPLy8rBkyRKn51y8eDGGDh2KNWvWwGw2o127dlizZg3+7d/+\nDf/yL/+CVatWobCwEBkZGbh+/TpMJlNl37x587BgwQJ8/fXX6NmzZ+Vzbty4EcXFxT4Ppj1dhvvu\nuw9du3bFa6+95vRa5eXl2LRpE+Lj42vcfYaIyDCKiIj8Zv369cpkMtV4a9asmdO8JpNJdejQQdls\ntspply5dUk2aNFHPP/985bT7779fdenSRRUXFzs9ft68eSokJEQVFhYqpZR67733lMlkUiNGjHCa\nr7y8XLVv317Fx8c7TT937pxq3ry56t69e+W0oqIiFRERodLT053mve2229R9991X67KfPn1amUwm\n9frrr7vcV9cyXLlypXJaRkaGMplM6tChQ5XTduzYoUwmk3r11VdrfO27775bxcXF1dpHRKQDd/Mg\nItJg06ZN+Mc//uF0O3DggMt899xzD8LCwip/jo6ORnR0NM6dOwcAuHbtGv73f/8X48ePR8uWLSu3\neJeVlWHMmDG4du0aPv74Y6fn/NWvfuX085dffolLly5h4sSJTtM7d+6MhIQEp2kWiwXTpk3Dhg0b\ncPXqVQDA3//+dxw/ftznrdLeLkNaWhrMZjNee+21ymnr169HeHg4HnroIZ8aiIh04WCaiEiD2NhY\n3HHHHU63QYMGuczXpk0bl2ktWrTAjz/+CADIz89HeXk5Vq9ejebNmzvdkpKSYDKZkJeX5/T4Dh06\nOP2cn58PALjllltcXis6Otpl2rx581BUVFS53/KLL76ILl264MEHH/Rw6Z15sgyORsA+yB85ciT+\n/Oc/o7S0FHl5edixYwdSUlKcfvEgIgoG3GeaiCiIRUVFoUmTJpg6dSoeffTRGufp1q2b08+OfaAd\nHAP277//3uWxNU3r2bMnxowZg5deegmjR49GTk4Oli9f7vK8OpdhxowZ2LNnD7Kzs3HhwgWUlZVh\n+vTpPr0+EZFOHEwTEQWx0NBQ3HPPPcjNzUVcXByaNWvm9XP07dsX7du3x1/+8hcsWLCgcvq5c+ew\nf/9+dOrUyeUx8+fPx/33349//dd/RfPmzTFr1qyALsO4cePQpk0bvPbaa7h48SL69OnjsksKEVEw\n4GCaiEiDI0eO4MaNGy7Te/bsibZt29b6WFXtWlqrVq3CsGHDMHz4cMyePRtdu3ZFcXExvv76a+zY\nsQN///vfa30+k8mEjIwMPPLII0hJSUFaWhoKCwuxfPlydOzYEWaz6x5/o0aNQmxsLN5//31MmTKl\nzua6eLsMzZo1w69//WusWrUKALBixYp6vT4RkS4cTBMR+ZFjV4i0tLQa71u7dm2duytU350iNjYW\nubm5WL58OX73u9/hhx9+QGRkJHr37o2xY8fW+liHWbNmwWQyYeXKlZgwYQK6d++O3/72t8jOzsb5\n8+drfMzEiRORkZFRr3NL+7IMDjNmzMCqVavQtGlTTJ06td4NREQ68HLiRESNVGFhIXr37o0JEybg\nT3/6k8v9d955J5o1a+ZythB3HJcTX7duHaZMmYKmTfVvr1FKoby8HPfddx8KCgpw5MgR7a9JRFQV\nz+ZBRNQIXLp0CfPmzcP27dvxf//3f9i4cSPuuecelJSUYP78+ZXzFRcXY//+/XjyySdx6NAhPPnk\nk16/1owZM9C8eXNs377dn4tQo/Hjx6N58+b48MMPfT5AkoioPrhlmoioESgsLMTUqVPx6aefoqCg\nAKGhoYiPj0dGRgYGDx5cOd/777+Pe++9F23btsXcuXNdrq5Ym9LSUqctw7feeisiIyP9uhzVnTp1\nCoWFhQCAkJAQxMbGan09IqLqOJgmIiIiIvIRd/MgIiIiIvIRB9NERERERD7iYJqIiIiIyEccTBMR\nERER+YiDaSIiIiIiH3EwTURERETkIw6miYiIiIh8xME0EREREZGPOJgmIiIiIvLR/wcwWUbzha5y\njwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": { + "image/png": { + "width": 350 + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "Image(filename='images/mgxs.png', width=350)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations for fine-mesh heterogeneous deterministic neutron transport applications.\n", + "\n", + "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Introductory Notation\n", + "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spatial and Energy Discretization\n", + "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", + "\n", + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### General Scalar-Flux Weighted MGXS\n", + "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section $\\sigma_{n,x,k,g}$ as follows:\n", + "\n", + "$$\\sigma_{n,x,k,g} = \\frac{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,x}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for most multi-group cross sections, including total, absorption, and fission reaction types. These double integrals are stochastically computed with OpenMC's tally system - in particular, [filters](https://mit-crpg.github.io/openmc/pythonapi/filter.html) on the energy range and spatial zone (material, cell or universe) define the bounds of integration for both numerator and denominator." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Scattering Matrices\n", + "The general multi-group cross section $\\sigma_{n,x,k,g}$ is a vector of $G$ values for each energy group $g$. The equation presented above only discretizes the energy of the incoming neutron and neglects the outgoing energy of the neutron (if any). Hence, this formulation must be extended to account for the outgoing energy of neutrons in the discretized scattering matrix cross section used by deterministic neutron transport codes. \n", + "\n", + "We denote the incoming and outgoing neutron energy groups as $g$ and $g'$ for the microscopic scattering matrix cross section $\\sigma_{n,s}(\\mathbf{r},E)$. As before, spatial homogenization and energy condensation are used to find the multi-group scattering matrix cross section $\\sigma_{n,s,k,g \\to g'}$ as follows:\n", + "\n", + "$$\\sigma_{n,s,k,g\\rightarrow g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\sigma_{n,s}(\\mathbf{r},E'\\rightarrow E'')\\Phi(\\mathbf{r},E')}{\\int_{E_{g}}^{E_{g-1}}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "This scalar flux-weighted multi-group microscopic scattering matrix is computed using OpenMC tallies with both energy in and energy out filters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Fission Spectrum\n", + "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", + "\n", + "Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n}(\\mathbf{r},E)$. The multi-group fission spectrum $\\chi_{n,k,g}$ is then the probability of fission neutrons emitted into energy group $g$. \n", + "\n", + "Similar to before, spatial homogenization and energy condensation are used to find the multi-group fission spectrum $\\chi_{n,k,g}$ as follows:\n", + "\n", + "$$\\chi_{n,k,g'} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "The fission production-weighted multi-group fission spectrum is computed using OpenMC tallies with both energy in and energy out filters.\n", + "\n", + "This concludes our brief overview on the methodology to compute multi-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "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')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.028999667)\n", + "inf_medium.add_nuclide(o16, 0.01450188)\n", + "inf_medium.add_nuclide(u235, 0.000114142)\n", + "inf_medium.add_nuclide(u238, 0.006886019)\n", + "inf_medium.add_nuclide(zr90, 0.002116053)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a `MaterialsFile` object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a MaterialsFile, register all Materials, and export to XML\n", + "materials_file = openmc.MaterialsFile()\n", + "materials_file.default_xs = '71c'\n", + "materials_file.add_material(inf_medium)\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.region = +min_x & -max_x & +min_y & -max_y\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe, put the geometry into a `GeometryFile` object, and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Instantiate a GeometryFile\n", + "geometry_file = openmc.GeometryFile()\n", + "geometry_file.geometry = openmc_geometry\n", + "\n", + "# Export to \"geometry.xml\"\n", + "geometry_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a SettingsFile\n", + "settings_file = openmc.SettingsFile()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True, 'summary': True}\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "settings_file.set_source_space('fission', bounds)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to generate multi-group cross sections! First, let's define a 2-group structure using the built-in `EnergyGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 2-group EnergyGroups object\n", + "groups = mgxs.EnergyGroups()\n", + "groups.group_edges = np.array([0., 0.625e-6, 20.])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the `EnergyGroups` object, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\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." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a few different sections\n", + "total = mgxs.TotalXS(domain=cell, domain_type='cell', groups=groups)\n", + "absorption = mgxs.AbsorptionXS(domain=cell, domain_type='cell', groups=groups)\n", + "scattering = mgxs.ScatterXS(domain=cell, domain_type='cell', groups=groups)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Absorption` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "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", + ")])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "absorption.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Absorption` object includes tracklength tallies for the 'absorption' and 'flux' scores in the 2-group structure in cell 1. Now that each `MGXS` object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty TalliesFile\n", + "tallies_file = openmc.TalliesFile()\n", + "\n", + "# Add total tallies to the tallies file\n", + "for tally in total.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add absorption tallies to the tallies file\n", + "for tally in absorption.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + "\n", + "# Add scattering tallies to the tallies file\n", + "for tally in scattering.tallies.values():\n", + " tallies_file.add_tally(tally)\n", + " \n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "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", + " Copyright: 2011-2015 Massachusetts Institute of Technology\n", + " License: http://mit-crpg.github.io/openmc/license.html\n", + " Version: 0.7.0\n", + " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", + " Date/Time: 2015-11-30 21:26:04\n", + " MPI Processes: 1\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading geometry XML file...\n", + " Reading materials XML file...\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", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.19804 \n", + " 2/1 1.12945 \n", + " 3/1 1.15573 \n", + " 4/1 1.13929 \n", + " 5/1 1.16300 \n", + " 6/1 1.22117 \n", + " 7/1 1.19012 \n", + " 8/1 1.11299 \n", + " 9/1 1.16066 \n", + " 10/1 1.12566 \n", + " 11/1 1.20854 \n", + " 12/1 1.14691 1.17773 +/- 0.03082\n", + " 13/1 1.17204 1.17583 +/- 0.01789\n", + " 14/1 1.14148 1.16724 +/- 0.01529\n", + " 15/1 1.17272 1.16834 +/- 0.01189\n", + " 16/1 1.18575 1.17124 +/- 0.01014\n", + " 17/1 1.20498 1.17606 +/- 0.00983\n", + " 18/1 1.14754 1.17249 +/- 0.00923\n", + " 19/1 1.18141 1.17348 +/- 0.00820\n", + " 20/1 1.15074 1.17121 +/- 0.00768\n", + " 21/1 1.15914 1.17011 +/- 0.00703\n", + " 22/1 1.14586 1.16809 +/- 0.00673\n", + " 23/1 1.18999 1.16978 +/- 0.00642\n", + " 24/1 1.15101 1.16844 +/- 0.00609\n", + " 25/1 1.13791 1.16640 +/- 0.00602\n", + " 26/1 1.19791 1.16837 +/- 0.00597\n", + " 27/1 1.19818 1.17012 +/- 0.00587\n", + " 28/1 1.14160 1.16854 +/- 0.00576\n", + " 29/1 1.11487 1.16571 +/- 0.00614\n", + " 30/1 1.17538 1.16620 +/- 0.00584\n", + " 31/1 1.20210 1.16791 +/- 0.00581\n", + " 32/1 1.20078 1.16940 +/- 0.00574\n", + " 33/1 1.14624 1.16839 +/- 0.00558\n", + " 34/1 1.14618 1.16747 +/- 0.00542\n", + " 35/1 1.16866 1.16752 +/- 0.00520\n", + " 36/1 1.18565 1.16821 +/- 0.00504\n", + " 37/1 1.16824 1.16821 +/- 0.00485\n", + " 38/1 1.18299 1.16874 +/- 0.00471\n", + " 39/1 1.21418 1.17031 +/- 0.00480\n", + " 40/1 1.11167 1.16835 +/- 0.00504\n", + " 41/1 1.11545 1.16665 +/- 0.00516\n", + " 42/1 1.11114 1.16491 +/- 0.00529\n", + " 43/1 1.14227 1.16423 +/- 0.00517\n", + " 44/1 1.14104 1.16355 +/- 0.00506\n", + " 45/1 1.16756 1.16366 +/- 0.00492\n", + " 46/1 1.13065 1.16274 +/- 0.00487\n", + " 47/1 1.11251 1.16139 +/- 0.00492\n", + " 48/1 1.14731 1.16101 +/- 0.00481\n", + " 49/1 1.16691 1.16117 +/- 0.00469\n", + " 50/1 1.19679 1.16206 +/- 0.00465\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.1700E-01 seconds\n", + " Reading cross sections = 9.7000E-02 seconds\n", + " Total time in simulation = 1.4656E+01 seconds\n", + " Time in transport only = 1.4643E+01 seconds\n", + " Time in inactive batches = 1.7940E+00 seconds\n", + " Time in active batches = 1.2862E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 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.5082E+01 seconds\n", + " Calculation Rate (inactive) = 13935.3 neutrons/second\n", + " Calculation Rate (active) = 7774.84 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.16131 +/- 0.00453\n", + " k-effective (Track-length) = 1.16206 +/- 0.00465\n", + " k-effective (Absorption) = 1.16096 +/- 0.00364\n", + " Combined k-effective = 1.16120 +/- 0.00325\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run OpenMC\n", + "executor = openmc.Executor()\n", + "executor.run_simulation()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. This is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a `Summary` object and link it with the statepoint." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the summary file and link it with the statepoint\n", + "su = openmc.Summary('summary.h5')\n", + "sp.link_with_summary(su)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the tallies from the statepoint into each MGXS object\n", + "total.load_from_statepoint(sp)\n", + "absorption.load_from_statepoint(sp)\n", + "scattering.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect our total cross section by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\ttotal\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 1.88e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.91e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "total.print_xs()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since the `openmc.mgxs` module uses [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) under-the-hood, the cross section is stored as a \"derived\" `Tally` object. This means that it can be queried and manipulated using all of the same methods supported for the `Tally` class in the OpenMC Python API. For example, we can construct a [Pandas](http://pandas.pydata.org/) `DataFrame` of the multi-group cross section data." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
111total0.6683230.001264
012total1.2932580.007624
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "1 1 1 total 0.668323 0.001264\n", + "0 1 2 total 1.293258 0.007624" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = scattering.get_pandas_dataframe()\n", + "df.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "absorption.export_xs_data(filename='absorption-xs', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export all three `MGXS` to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "total.build_hdf5_store(filename='mgxs', append=True)\n", + "absorption.build_hdf5_store(filename='mgxs', append=True)\n", + "scattering.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing MGXS with Tally Arithmetic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we illustrate how one can leverage OpenMC's [tally arithmetic](https://mit-crpg.github.io/openmc/pythonapi/examples/tally-arithmetic.html) data processing feature with `MGXS` objects. The `openmc.mgxs` module uses tally arithmetic to compute multi-group cross sections with automated uncertainty propagation. Each `MGXS` object includes an `xs_tally` attribute which is a \"derived\" `Tally` based on the tallies needed to compute the cross section type of interest. These derived tallies can be used in subsequent tally arithmetic operations. For example, we can use tally artithmetic to confirm that the `TotalXS` is equal to the sum of the `AbsorptionXS` and `ScatterXS` objects." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((total / flux) - (absorption / flux)) - (sca...4.884981e-150.011274
11(6.3e-07 - 2.0e+01)total(((total / flux) - (absorption / flux)) - (sca...1.221245e-150.001802
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((total / flux) - (absorption / flux)) - (sca... 4.884981e-15 0.011274 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... 1.221245e-15 0.001802 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", + "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", + "\n", + "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", + "difference.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can use tally arithmetic to compute the ratio of `AbsorptionXS` and `ScatterXS` to the `TotalXS`." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((absorption / flux) / (total / flux))0.0762190.000651
11(6.3e-07 - 2.0e+01)total((absorption / flux) / (total / flux))0.0193190.000086
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((absorption / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((absorption / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.076219 0.000651 \n", + "1 0.019319 0.000086 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", + "absorption_to_total = absorption.xs_tally / total.xs_tally\n", + "\n", + "# The absorption-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "absorption_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total((scatter / flux) / (total / flux))0.9237810.007714
11(6.3e-07 - 2.0e+01)total((scatter / flux) / (total / flux))0.9806810.002617
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide score \\\n", + "0 1 (0.0e+00 - 6.3e-07) total ((scatter / flux) / (total / flux)) \n", + "1 1 (6.3e-07 - 2.0e+01) total ((scatter / flux) / (total / flux)) \n", + "\n", + " mean std. dev. \n", + "0 0.923781 0.007714 \n", + "1 0.980681 0.002617 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", + "scattering_to_total = scattering.xs_tally / total.xs_tally\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "scattering_to_total.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lastly, we sum the derived scatter-to-total and absorption-to-total ratios to confirm that they sum to unity." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellenergy [MeV]nuclidescoremeanstd. dev.
01(0.0e+00 - 6.3e-07)total(((absorption / flux) / (total / flux)) + ((sc...10.007741
11(6.3e-07 - 2.0e+01)total(((absorption / flux) / (total / flux)) + ((sc...10.002619
\n", + "
" + ], + "text/plain": [ + " cell energy [MeV] nuclide \\\n", + "0 1 (0.0e+00 - 6.3e-07) total \n", + "1 1 (6.3e-07 - 2.0e+01) total \n", + "\n", + " score mean std. dev. \n", + "0 (((absorption / flux) / (total / flux)) + ((sc... 1 0.007741 \n", + "1 (((absorption / flux) / (total / flux)) + ((sc... 1 0.002619 " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Use tally arithmetic to ensure that the absorption- and scattering-to-total MGXS ratios sum to unity\n", + "sum_ratio = absorption_to_total + scattering_to_total\n", + "\n", + "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", + "sum_ratio.get_pandas_dataframe()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/examples/mgxs-part-i.rst b/docs/source/pythonapi/examples/mgxs-part-i.rst new file mode 100644 index 0000000000..8b29183f05 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-i.rst @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_i: + +========================= +MGXS Part I: Introduction +========================= + +.. only:: html + + .. notebook:: mgxs-part-i.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/MGXS-Part-II.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb similarity index 100% rename from docs/source/pythonapi/examples/MGXS-Part-II.ipynb rename to docs/source/pythonapi/examples/mgxs-part-ii.ipynb diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.rst b/docs/source/pythonapi/examples/mgxs-part-ii.rst new file mode 100644 index 0000000000..1f6dd22146 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-ii.rst @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_ii: + +=============================== +MGXS Part II: Advanced Features +=============================== + +.. only:: html + + .. notebook:: mgxs-part-ii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb similarity index 58% rename from docs/source/pythonapi/examples/MGXS-Part-III.ipynb rename to docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 2979c2b032..c3f4280de1 100644 --- a/docs/source/pythonapi/examples/MGXS-Part-III.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -467,7 +467,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTMwVDIxOjAzOjIyLTA1OjAwMx3rxQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0zMFQyMTowMzoyMi0wNTowMEJAU3kAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAASWSURB\nVGje7Zs7buMwEEBzieRcaYaB48KVisSFj7Cn4BFU2I37LVan8BFc5ABb2ICtpSSaHP5EUqOAzsIO\nAjwEGjjiZ/hEDZ+eiJ9noHxe6fHvW4BPDmwHEMAaYBdAEb+5Amu/YNlyQLgP4xGhiG9avmwvsBF/\nt/FkY2vj69NLD1f41Z6Yiw3Gvy728ceVuhLhwY8bA0fij8EgO/6wjH2pF/lKxvf3tNG3Z+BRt4oH\nh/Znt5bu+iQd+/Z/Xp8BmiO8X0X/n7KQNbWIZ1wMJjEUPwBuuI1hfcMZxv9Pj19/AexrYH84KASF\nV41nhe8Ku/4f+nSpu3eNsdadjpBLFPF6pIE76Hx4QeiMfy/yVQi/cf6mxx900jk4ScfGlc4/q9v8\nc9sPxhpN4wn3n+qepeqeAK5x/3WZfieGx+8h6Uv8DCNHeAfjv3Q8q0VjwJCesrFbP2X+7NZPidAj\nE7hAyGTSFOvnLX8erfw9YCV+BL4p7DL1gH3SNvK3Z/0Qn3HE64dn/eLifx1Fd/62eP4NVyLsJx1C\nce2bf/7mfL+Kt6UB+ivtm+YasT88u6Yi2z+M+lrpT432J4F9pw+mZOH+rP3pLP2pEzFhaiCdzESG\ncOvBO5g/peMt6d2lYo39d0ivNUvwXyE6KhVb/ssh7r8LMRAs/1XrD0DcfxfiP8DrD54/AFV0/av6\neP/6acQH/NcTr/KH6JCYCnezMOi/8v5H/be7f9N/tdNyluC/sv3V+rnWTvuxUNj/tbax81+u0fDf\nSuttOt7B/Ckd3zVvb7rafzFq6XWxifqv0f8x/2XZ+PBfw39tFb5YyPTz//z+u9P+a+KnTvoO3sH4\nLx3fiyzXTutgbxrgx8F/bdNNR+2/Uq/YuH9dLRXW60cVk14DK2P/aJkinQ7yDfZfR3pH/Feg47/5\n32/6r196/cgVDu3/liK9DgLyX2260U5vMfr9dxvBh/+i+CzptVHE73V69WOj/ddBT/53toKdTV8j\n/5vrT9b+7/eun9P2f6P+m7T/G/GPkP/m481/6xHpHcNu/PJhKFbi18SFi2DhHcyf0vHYf09Sb4ON\n/iXR9d/J/U8Zf5dZxj91/s3ovzzqv3b+IfvvSNL1o5V/belNzP8P/5XxqdLhxdn9N6ZiQf+d6n8z\n+OeP919K+5P7nzr+Ss+f0vHU/EfNv8T8T11/frr/Uv1jFv+l+Ffp8V88ng9YwTT/pz5/EPuf+vz1\nH/pv1vM39fmfvP9A3f8oPn8Kx1P336j7f8T9x//Bf4n7z6T9b+r+O9l/qe8fSs+f0vHU91/U92+z\n+m/++8d7eX869f0v9f0z+f039f176fFfOp5xWv0Htf4E9fSU+hfsv1Pqb/D4h2n1P9T6I2r9E6n+\nilr/Ra4/o9a/lZ4/peOp9ZcbYv0nsf70pXUe2rLqX19acv0ttf7XfmjOrT+2kxbE/Dd4fmZC/TW5\n/ptaf156/pSOp55/mNF/Wx8y238vD//1+++k80fk80/U81elx3/peMZp5/+o5w8b2vlH7/7viP8m\nnJ/JPf9Zev/X9oes87fYf21MOf9LPn9MPf9cdv78A0xugrwgDfcHAAAAJXRFWHRkYXRlOmNyZWF0\nZQAyMDE1LTExLTMwVDIxOjIwOjA3LTA1OjAwkFvB3QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0x\nMS0zMFQyMToyMDowNy0wNTowMOEGeWEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] @@ -697,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": true }, @@ -709,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": { "collapsed": false }, @@ -735,7 +735,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 21:03:22\n", + " Date/Time: 2015-11-30 21:20:07\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -783,8 +783,79 @@ " 18/1 1.01476 1.02800 +/- 0.00664\n", " 19/1 1.01490 1.02655 +/- 0.00604\n", " 20/1 1.00926 1.02482 +/- 0.00567\n", - " 21/1 0.98504 1.02120 +/- 0.00627\n" + " 21/1 0.98504 1.02120 +/- 0.00627\n", + " 22/1 1.00397 1.01977 +/- 0.00591\n", + " 23/1 1.02556 1.02021 +/- 0.00545\n", + " 24/1 0.99808 1.01863 +/- 0.00529\n", + " 25/1 0.99638 1.01715 +/- 0.00514\n", + " 26/1 0.99615 1.01584 +/- 0.00499\n", + " 27/1 1.01843 1.01599 +/- 0.00469\n", + " 28/1 1.00315 1.01528 +/- 0.00447\n", + " 29/1 1.00633 1.01480 +/- 0.00426\n", + " 30/1 1.02159 1.01514 +/- 0.00405\n", + " 31/1 1.03395 1.01604 +/- 0.00396\n", + " 32/1 1.02672 1.01652 +/- 0.00381\n", + " 33/1 1.03778 1.01745 +/- 0.00375\n", + " 34/1 1.03807 1.01831 +/- 0.00369\n", + " 35/1 1.07854 1.02072 +/- 0.00428\n", + " 36/1 1.03524 1.02128 +/- 0.00415\n", + " 37/1 1.03100 1.02164 +/- 0.00401\n", + " 38/1 1.03853 1.02224 +/- 0.00391\n", + " 39/1 1.04089 1.02288 +/- 0.00383\n", + " 40/1 1.02150 1.02284 +/- 0.00370\n", + " 41/1 0.98470 1.02161 +/- 0.00379\n", + " 42/1 1.00658 1.02114 +/- 0.00370\n", + " 43/1 0.98652 1.02009 +/- 0.00373\n", + " 44/1 1.02787 1.02032 +/- 0.00363\n", + " 45/1 0.98800 1.01939 +/- 0.00364\n", + " 46/1 1.00286 1.01893 +/- 0.00357\n", + " 47/1 1.02559 1.01911 +/- 0.00348\n", + " 48/1 1.03729 1.01959 +/- 0.00342\n", + " 49/1 1.02538 1.01974 +/- 0.00333\n", + " 50/1 1.01478 1.01962 +/- 0.00325\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 4.2800E-01 seconds\n", + " Reading cross sections = 9.1000E-02 seconds\n", + " Total time in simulation = 4.1240E+01 seconds\n", + " Time in transport only = 4.1215E+01 seconds\n", + " Time in inactive batches = 4.0230E+00 seconds\n", + " Time in active batches = 3.7217E+01 seconds\n", + " Time synchronizing fission bank = 8.0000E-03 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 2.0000E-03 seconds\n", + " Total time for finalization = 0.0000E+00 seconds\n", + " Total time elapsed = 4.1683E+01 seconds\n", + " Calculation Rate (inactive) = 6214.27 neutrons/second\n", + " Calculation Rate (active) = 2686.94 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.01805 +/- 0.00261\n", + " k-effective (Track-length) = 1.01962 +/- 0.00325\n", + " k-effective (Absorption) = 1.01554 +/- 0.00339\n", + " Combined k-effective = 1.01711 +/- 0.00235\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -808,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -827,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -846,11 +917,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1515: RuntimeWarning: invalid value encountered in true_divide\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1516: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], "source": [ "# Initialize MGXS Library with OpenMC statepoint data\n", "mgxs_lib.load_from_statepoint(sp)" @@ -881,7 +962,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -900,11 +981,101 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" + ] + }, + { + "data": { + "text/html": [ + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
3100001U-2358.063513e-034.062984e-05
4100001U-2387.335515e-034.459335e-05
5100001O-160.000000e+000.000000e+00
0100002U-2353.613274e-011.902492e-03
1100002U-2386.738424e-073.536787e-09
2100002O-160.000000e+000.000000e+00
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "3 10000 1 U-235 8.063513e-03 4.062984e-05\n", + "4 10000 1 U-238 7.335515e-03 4.459335e-05\n", + "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", + "0 10000 2 U-235 3.613274e-01 1.902492e-03\n", + "1 10000 2 U-238 6.738424e-07 3.536787e-09\n", + "2 10000 2 O-16 0.000000e+00 0.000000e+00" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = fuel_mgxs.get_pandas_dataframe()\n", "df" @@ -919,11 +1090,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tnu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t10000\n", + "\tNuclide =\tU-235\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 5.04e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.27e-01%\n", + "\n", + "\tNuclide =\tU-238\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 6.08e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.25e-01%\n", + "\n", + "\tNuclide =\tO-16\n", + "\tCross Sections [cm^-1]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", + "\n", + "\n", + "\n" + ] + } + ], "source": [ "fuel_mgxs.print_xs()" ] @@ -937,7 +1136,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": true }, @@ -956,7 +1155,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": true }, @@ -968,7 +1167,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": true }, @@ -987,7 +1186,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": { "collapsed": true }, @@ -1002,11 +1201,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cellgroup innuclidemeanstd. dev.
0100001U-2350.0743830.000280
1100001U-2380.0059590.000036
2100001O-160.0000000.000000
\n", + "
" + ], + "text/plain": [ + " cell group in nuclide mean std. dev.\n", + "0 10000 1 U-235 0.074383 0.000280\n", + "1 10000 1 U-238 0.005959 0.000036\n", + "2 10000 1 O-16 0.000000 0.000000" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Retrieve the NuFissionXS object for the fuel cell from the 1-group library\n", "coarse_fuel_mgxs = coarse_mgxs_lib.get_mgxs(fuel_cell, 'nu-fission')\n", @@ -1031,7 +1286,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1050,7 +1305,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -1069,12 +1324,139 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ NORMAL ] Ray tracing for track segmentation...\n", + "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Computing the eigenvalue...\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.854316\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.801593\tres = 1.522E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.761131\tres = 6.380E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.731467\tres = 5.066E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.709897\tres = 3.910E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.695110\tres = 2.954E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.685966\tres = 2.085E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.681511\tres = 1.317E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.680926\tres = 6.520E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.683509\tres = 1.046E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.688659\tres = 3.848E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.695860\tres = 7.565E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.704674\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.714726\tres = 1.269E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.725700\tres = 1.428E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.737329\tres = 1.537E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.749388\tres = 1.604E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.761690\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.774081\tres = 1.643E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.786432\tres = 1.628E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.798638\tres = 1.597E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.810618\tres = 1.553E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.822303\tres = 1.501E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.833643\tres = 1.443E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.844598\tres = 1.380E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.855140\tres = 1.315E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.865249\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.874914\tres = 1.183E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.884128\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.892891\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.901206\tres = 9.920E-03\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.909080\tres = 9.320E-03\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.916523\tres = 8.745E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.923546\tres = 8.194E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.930162\tres = 7.669E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.936387\tres = 7.171E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.942236\tres = 6.698E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.947725\tres = 6.252E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.952869\tres = 5.830E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.957687\tres = 5.433E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.962193\tres = 5.060E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.966404\tres = 4.710E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.970337\tres = 4.381E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.974006\tres = 4.073E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.977426\tres = 3.785E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.980613\tres = 3.515E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.983580\tres = 3.264E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.986341\tres = 3.029E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.988908\tres = 2.809E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.991293\tres = 2.605E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.993509\tres = 2.415E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.995566\tres = 2.238E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.997475\tres = 2.073E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.999246\tres = 1.920E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.000888\tres = 1.777E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.002409\tres = 1.645E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.003818\tres = 1.522E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.005123\tres = 1.408E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.006331\tres = 1.302E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.007450\tres = 1.203E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.008484\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.009440\tres = 1.028E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.010324\tres = 9.496E-04\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.011141\tres = 8.771E-04\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.011897\tres = 8.100E-04\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.012594\tres = 7.478E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.013238\tres = 6.903E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.013833\tres = 6.371E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.014382\tres = 5.879E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.014889\tres = 5.424E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.015357\tres = 5.004E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.015789\tres = 4.615E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.016187\tres = 4.255E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.016554\tres = 3.923E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.016892\tres = 3.617E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.017204\tres = 3.333E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.017492\tres = 3.072E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.017757\tres = 2.831E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.018001\tres = 2.608E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.018226\tres = 2.403E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.018433\tres = 2.213E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.018624\tres = 2.038E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.018800\tres = 1.877E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.018962\tres = 1.728E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.019110\tres = 1.591E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.019248\tres = 1.465E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.019374\tres = 1.348E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.019490\tres = 1.241E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.019597\tres = 1.142E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.019695\tres = 1.051E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.019786\tres = 9.670E-05\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.019869\tres = 8.895E-05\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.019946\tres = 8.183E-05\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.020016\tres = 7.528E-05\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.020081\tres = 6.922E-05\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.020141\tres = 6.368E-05\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.020195\tres = 5.857E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.020246\tres = 5.385E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.020292\tres = 4.954E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.020335\tres = 4.553E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.020374\tres = 4.185E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.020410\tres = 3.848E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.020443\tres = 3.537E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.020474\tres = 3.253E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.020502\tres = 2.989E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.020527\tres = 2.746E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.020551\tres = 2.526E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.020573\tres = 2.319E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.020593\tres = 2.134E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.020611\tres = 1.960E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.020628\tres = 1.800E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.020643\tres = 1.652E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.020657\tres = 1.518E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.020670\tres = 1.398E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.020682\tres = 1.283E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.020693\tres = 1.178E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.020704\tres = 1.083E-05\n" + ] + } + ], "source": [ "# Generate tracks for OpenMOC\n", "openmoc_geometry.initializeFlatSourceRegions()\n", @@ -1095,11 +1477,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openmc keff = 1.017105\n", + "openmoc keff = 1.020704\n", + "bias [pcm]: 359.8\n" + ] + } + ], "source": [ "# Print report of keff and bias with OpenMC\n", "openmoc_keff = solver.getKeff()\n", @@ -1138,7 +1530,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": { "collapsed": false }, @@ -1164,7 +1556,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": { "collapsed": false }, @@ -1198,11 +1590,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Plot OpenMC's fission rates in the left subplot\n", "fig = pylab.subplot(121)\n", @@ -1214,15 +1627,6 @@ "pylab.imshow(openmoc_fission_rates, interpolation='none', cmap='jet')\n", "pylab.title('OpenMOC Fission Rates')" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.rst b/docs/source/pythonapi/examples/mgxs-part-iii.rst new file mode 100644 index 0000000000..f441028628 --- /dev/null +++ b/docs/source/pythonapi/examples/mgxs-part-iii.rst @@ -0,0 +1,13 @@ +.. _notebook_mgxs_part_iii: + +======================== +MGXS Part III: Libraries +======================== + +.. only:: html + + .. notebook:: mgxs-part-iii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.rst b/docs/source/pythonapi/examples/multi-group-cross-sections.rst deleted file mode 100644 index b2da0e1bcf..0000000000 --- a/docs/source/pythonapi/examples/multi-group-cross-sections.rst +++ /dev/null @@ -1,11 +0,0 @@ -==================================== -Multi-Group Cross Section Generation -==================================== - -.. only:: html - - .. notebook:: multi-group-cross-sections.ipynb - -.. only:: latex - - IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 465ea8923e..6d513d5d5b 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -74,7 +74,9 @@ on a given module or class. examples/post-processing examples/pandas-dataframes examples/tally-arithmetic - examples/multi-group-cross-sections + examples/mgxs-part-i + examples/mgxs-part-ii + examples/mgxs-part-iii .. _Jupyter: https://jupyter.org/ .. _NumPy: http://www.numpy.org/ From 7be1b7a609112de93182cb92aefdecb45f40ed50 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Tue, 1 Dec 2015 10:13:37 -0500 Subject: [PATCH 494/519] Now using hash(repr(self)) instead of hash(str(self)) in Python API --- openmc/cross.py | 4 ++-- openmc/element.py | 2 +- openmc/filter.py | 2 +- openmc/material.py | 2 +- openmc/mesh.py | 2 +- openmc/nuclide.py | 2 +- openmc/tallies.py | 2 +- openmc/universe.py | 8 ++++---- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openmc/cross.py b/openmc/cross.py index 435557ede7..17cdc5ea66 100644 --- a/openmc/cross.py +++ b/openmc/cross.py @@ -52,7 +52,7 @@ class CrossScore(object): self.binary_op = binary_op def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __eq__(self, other): return str(other) == str(self) @@ -152,7 +152,7 @@ class CrossNuclide(object): self.binary_op = binary_op def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __eq__(self, other): return str(other) == str(self) diff --git a/openmc/element.py b/openmc/element.py index cdc422ed2b..9f04abfdab 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -58,7 +58,7 @@ class Element(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Element - {0}\n'.format(self._name) diff --git a/openmc/filter.py b/openmc/filter.py index 4c058c0855..04935b8edc 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -81,7 +81,7 @@ class Filter(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __deepcopy__(self, memo): existing = memo.get(id(self)) diff --git a/openmc/material.py b/openmc/material.py index 9e0a6b93b3..37ebc8a77f 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -108,7 +108,7 @@ class Material(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Material\n' diff --git a/openmc/mesh.py b/openmc/mesh.py index b963a25a8e..8bad6c5374 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -190,7 +190,7 @@ class Mesh(object): self._width = width def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Mesh\n' diff --git a/openmc/nuclide.py b/openmc/nuclide.py index b95601bf7d..01fb2aa459 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -61,7 +61,7 @@ class Nuclide(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) diff --git a/openmc/tallies.py b/openmc/tallies.py index 8498fbb5b5..197ae29495 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -190,7 +190,7 @@ class Tally(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Tally\n' diff --git a/openmc/universe.py b/openmc/universe.py index 9a8262af39..0e405e9f18 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -95,7 +95,7 @@ class Cell(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Cell\n' @@ -483,7 +483,7 @@ class Universe(object): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'Universe\n' @@ -971,7 +971,7 @@ class RectLattice(Lattice): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'RectLattice\n' @@ -1208,7 +1208,7 @@ class HexLattice(Lattice): return not self == other def __hash__(self): - return hash(str(self)) + return hash(repr(self)) def __repr__(self): string = 'HexLattice\n' From 8c8ca44e866f315e4ff666bb95fbc4c7524029fe Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Dec 2015 19:57:05 -0600 Subject: [PATCH 495/519] Describe xyz_cross variable --- src/geometry.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geometry.F90 b/src/geometry.F90 index 5195054260..9a084a77cb 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -599,7 +599,7 @@ contains real(8) :: d_lat ! distance to lattice boundary real(8) :: d_surf ! distance to surface real(8) :: x0,y0,z0 ! coefficients for surface - real(8) :: xyz_cross(3) + real(8) :: xyz_cross(3) ! coordinates at projected surface crossing logical :: coincident ! is particle on surface? type(Cell), pointer :: c class(Surface), pointer :: surf From 8b91ce82b0d86a756ba7a262c427db1371bfe816 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Wed, 2 Dec 2015 09:18:19 -0500 Subject: [PATCH 496/519] Updated MGXS Notebooks per comments from @paulromano --- .../pythonapi/examples/mgxs-part-i.ipynb | 37 +- .../pythonapi/examples/mgxs-part-ii.ipynb | 789 +++++++++--------- .../pythonapi/examples/mgxs-part-iii.ipynb | 4 +- openmc/mgxs/mgxs.py | 13 +- 4 files changed, 413 insertions(+), 430 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index 5207ac4f39..897af8e3ff 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -24,7 +24,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Many Monte Carlo-based neutron particle transport codes, including OpenMC, use continuous energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's fission continuous energy cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below." + "Many Monte Carlo particle transport codes, including OpenMC, use continuous-energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. An example of U-235's continuous-energy fission cross section along with a 16-group cross section computed for a light water reactor spectrum is displayed below." ] }, { @@ -79,7 +79,7 @@ "### Spatial and Energy Discretization\n", "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", "\n", - "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, or an unstructured mesh such as the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, an arbitrary unstructured mesh or the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." ] }, { @@ -518,7 +518,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 21:26:04\n", + " Date/Time: 2015-12-02 09:11:05\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -605,19 +605,19 @@ " =======================> TIMING STATISTICS <=======================\n", "\n", " Total time for initialization = 4.1700E-01 seconds\n", - " Reading cross sections = 9.7000E-02 seconds\n", - " Total time in simulation = 1.4656E+01 seconds\n", - " Time in transport only = 1.4643E+01 seconds\n", - " Time in inactive batches = 1.7940E+00 seconds\n", - " Time in active batches = 1.2862E+01 seconds\n", + " Reading cross sections = 8.9000E-02 seconds\n", + " Total time in simulation = 1.4728E+01 seconds\n", + " Time in transport only = 1.4712E+01 seconds\n", + " Time in inactive batches = 1.7890E+00 seconds\n", + " Time in active batches = 1.2939E+01 seconds\n", " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 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.5082E+01 seconds\n", - " Calculation Rate (inactive) = 13935.3 neutrons/second\n", - " Calculation Rate (active) = 7774.84 neutrons/second\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.5155E+01 seconds\n", + " Calculation Rate (inactive) = 13974.3 neutrons/second\n", + " Calculation Rate (active) = 7728.57 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -776,13 +776,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" - ] - }, { "data": { "text/html": [ diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index 99610944b6..6194b154ac 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -10,7 +10,7 @@ "* Calculation of cross sections on a **nuclide-by-nuclide basis**\n", "* The use of **[tally precision triggers](https://mit-crpg.github.io/openmc/usersguide/input.html#trigger-element)** with multi-group cross sections\n", "* Built-in features for **energy condensation** in downstream data processing\n", - "* The use of **[PyNE](http://pyne.io/) to plot** continuous energy vs. multi-group cross sections\n", + "* The use of **[PyNE](http://pyne.io/) to plot** continuous-energy vs. multi-group cross sections\n", "* **Validation** of multi-group cross sections with **[OpenMOC](https://mit-crpg.github.io/OpenMOC/)**\n", "\n", "**Note:** This Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook in its entirety, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries. In addition, this Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." @@ -448,7 +448,7 @@ " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", " Git SHA1: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n", - " Date/Time: 2015-11-30 20:39:59\n", + " Date/Time: 2015-12-02 09:13:42\n", " MPI Processes: 3\n", "\n", " ===========================================================================\n", @@ -568,20 +568,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 6.7400E-01 seconds\n", - " Reading cross sections = 1.4300E-01 seconds\n", - " Total time in simulation = 1.3404E+02 seconds\n", - " Time in transport only = 1.1927E+02 seconds\n", - " Time in inactive batches = 7.6750E+00 seconds\n", - " Time in active batches = 1.2636E+02 seconds\n", - " Time synchronizing fission bank = 1.4700E+01 seconds\n", - " Sampling source sites = 6.0000E-03 seconds\n", - " SEND/RECV source sites = 5.0000E-03 seconds\n", - " Time accumulating tallies = 4.0000E-03 seconds\n", - " Total time for finalization = 1.5000E-02 seconds\n", - " Total time elapsed = 1.3475E+02 seconds\n", - " Calculation Rate (inactive) = 13029.3 neutrons/second\n", - " Calculation Rate (active) = 3165.53 neutrons/second\n", + " Total time for initialization = 7.5700E-01 seconds\n", + " Reading cross sections = 1.5800E-01 seconds\n", + " Total time in simulation = 1.4921E+02 seconds\n", + " Time in transport only = 1.4336E+02 seconds\n", + " Time in inactive batches = 8.6210E+00 seconds\n", + " Time in active batches = 1.4059E+02 seconds\n", + " Time synchronizing fission bank = 5.6060E+00 seconds\n", + " Sampling source sites = 1.4000E-02 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 6.0000E-03 seconds\n", + " Total time for finalization = 1.3000E-02 seconds\n", + " Total time elapsed = 1.5002E+02 seconds\n", + " Calculation Rate (inactive) = 11599.6 neutrons/second\n", + " Calculation Rate (active) = 2845.11 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -801,14 +801,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", - "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1272: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n" - ] - }, { "data": { "text/html": [ @@ -1197,172 +1189,170 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.574633\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.574633\tres = 1.959E-316\n", "[ NORMAL ] Iteration 1:\tk_eff = 0.679931\tres = 4.254E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.660910\tres = 1.832E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.798E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.927E-03\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.797E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.928E-03\n", "[ NORMAL ] Iteration 5:\tk_eff = 0.625710\tres = 2.428E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.606521\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.606520\tres = 2.685E-02\n", "[ NORMAL ] Iteration 7:\tk_eff = 0.587277\tres = 3.067E-02\n", "[ NORMAL ] Iteration 8:\tk_eff = 0.568777\tres = 3.173E-02\n", "[ NORMAL ] Iteration 9:\tk_eff = 0.551415\tres = 3.150E-02\n", "[ NORMAL ] Iteration 10:\tk_eff = 0.535708\tres = 3.052E-02\n", "[ NORMAL ] Iteration 11:\tk_eff = 0.521916\tres = 2.849E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.510222\tres = 2.575E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.510221\tres = 2.575E-02\n", "[ NORMAL ] Iteration 13:\tk_eff = 0.500691\tres = 2.241E-02\n", "[ NORMAL ] Iteration 14:\tk_eff = 0.493392\tres = 1.868E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.488318\tres = 1.458E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.488317\tres = 1.458E-02\n", "[ NORMAL ] Iteration 16:\tk_eff = 0.485438\tres = 1.028E-02\n", "[ NORMAL ] Iteration 17:\tk_eff = 0.484705\tres = 5.896E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.486046\tres = 1.510E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.486045\tres = 1.510E-03\n", "[ NORMAL ] Iteration 19:\tk_eff = 0.489362\tres = 2.766E-03\n", "[ NORMAL ] Iteration 20:\tk_eff = 0.494546\tres = 6.824E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.501482\tres = 1.059E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.510042\tres = 1.402E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.520095\tres = 1.707E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.531508\tres = 1.971E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.544145\tres = 2.194E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.501481\tres = 1.059E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.510041\tres = 1.402E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.520094\tres = 1.707E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.531507\tres = 1.971E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.544144\tres = 2.194E-02\n", "[ NORMAL ] Iteration 26:\tk_eff = 0.557872\tres = 2.378E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.572558\tres = 2.523E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.588073\tres = 2.632E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.572557\tres = 2.523E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.588072\tres = 2.632E-02\n", "[ NORMAL ] Iteration 29:\tk_eff = 0.604293\tres = 2.710E-02\n", "[ NORMAL ] Iteration 30:\tk_eff = 0.621101\tres = 2.758E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.638383\tres = 2.781E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.656033\tres = 2.782E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.673951\tres = 2.765E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.692044\tres = 2.731E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.710228\tres = 2.685E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.638382\tres = 2.781E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.656032\tres = 2.782E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.673950\tres = 2.765E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.692043\tres = 2.731E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.710227\tres = 2.685E-02\n", "[ NORMAL ] Iteration 36:\tk_eff = 0.728423\tres = 2.628E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.746559\tres = 2.562E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.746558\tres = 2.562E-02\n", "[ NORMAL ] Iteration 38:\tk_eff = 0.764569\tres = 2.490E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.782397\tres = 2.413E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.799990\tres = 2.332E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.817302\tres = 2.249E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.834293\tres = 2.164E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.850928\tres = 2.079E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.867178\tres = 1.994E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.883019\tres = 1.910E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.898428\tres = 1.827E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.913391\tres = 1.745E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.927893\tres = 1.665E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.941926\tres = 1.588E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.955484\tres = 1.512E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.968564\tres = 1.439E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.981163\tres = 1.369E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.993284\tres = 1.301E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.004930\tres = 1.235E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.016106\tres = 1.172E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.026818\tres = 1.112E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.037075\tres = 1.054E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.046885\tres = 9.989E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.056259\tres = 9.459E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.065207\tres = 8.954E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.073742\tres = 8.471E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.081873\tres = 8.012E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.089615\tres = 7.573E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.096981\tres = 7.156E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.103982\tres = 6.760E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.110632\tres = 6.382E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.116945\tres = 6.024E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.122933\tres = 5.684E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.128609\tres = 5.361E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.133986\tres = 5.055E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.139077\tres = 4.764E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.143893\tres = 4.490E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.148448\tres = 4.228E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.152754\tres = 3.982E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.156821\tres = 3.749E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.160661\tres = 3.528E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.164285\tres = 3.319E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.167703\tres = 3.122E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.170925\tres = 2.936E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.173962\tres = 2.759E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.176824\tres = 2.594E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.179518\tres = 2.437E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.182054\tres = 2.289E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.184440\tres = 2.150E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.186684\tres = 2.018E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.188794\tres = 1.895E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.190777\tres = 1.778E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.192641\tres = 1.668E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.194391\tres = 1.565E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.196034\tres = 1.467E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.197577\tres = 1.376E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.199024\tres = 1.290E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.200382\tres = 1.209E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.201656\tres = 1.133E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.202850\tres = 1.061E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.203970\tres = 9.941E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.205018\tres = 9.307E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.206002\tres = 8.706E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.206923\tres = 8.158E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.207785\tres = 7.636E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.208592\tres = 7.144E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.209347\tres = 6.684E-04\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.210055\tres = 6.249E-04\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.210716\tres = 5.849E-04\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.211335\tres = 5.465E-04\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.211915\tres = 5.115E-04\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.212455\tres = 4.782E-04\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.212962\tres = 4.461E-04\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.213435\tres = 4.176E-04\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.213877\tres = 3.900E-04\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.214290\tres = 3.643E-04\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.214676\tres = 3.404E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.215038\tres = 3.181E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.215375\tres = 2.973E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.215689\tres = 2.771E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.215982\tres = 2.585E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.216257\tres = 2.416E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.216513\tres = 2.258E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.216752\tres = 2.105E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.216975\tres = 1.963E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.217183\tres = 1.834E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.217377\tres = 1.709E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.217558\tres = 1.594E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.217728\tres = 1.488E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.217885\tres = 1.388E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.218033\tres = 1.297E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.218170\tres = 1.206E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.218296\tres = 1.126E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.218416\tres = 1.041E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.218527\tres = 9.807E-05\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.218631\tres = 9.109E-05\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.218727\tres = 8.502E-05\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.218817\tres = 7.897E-05\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.218901\tres = 7.364E-05\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.218979\tres = 6.886E-05\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.219051\tres = 6.353E-05\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.219120\tres = 5.977E-05\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.219183\tres = 5.590E-05\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.219242\tres = 5.170E-05\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.219296\tres = 4.832E-05\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.219347\tres = 4.486E-05\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.219395\tres = 4.185E-05\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.219439\tres = 3.868E-05\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.219480\tres = 3.650E-05\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.219518\tres = 3.379E-05\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.219554\tres = 3.107E-05\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.219587\tres = 2.929E-05\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.219618\tres = 2.709E-05\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.219647\tres = 2.542E-05\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.219674\tres = 2.362E-05\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.219699\tres = 2.199E-05\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.219722\tres = 2.070E-05\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.219743\tres = 1.878E-05\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.219763\tres = 1.770E-05\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.219782\tres = 1.628E-05\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.219799\tres = 1.526E-05\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.219815\tres = 1.387E-05\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.219830\tres = 1.319E-05\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.219844\tres = 1.208E-05\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.219857\tres = 1.150E-05\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.219869\tres = 1.055E-05\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.219880\tres = 1.008E-05\n" + "[ NORMAL ] Iteration 39:\tk_eff = 0.782396\tres = 2.412E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.799989\tres = 2.332E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.817301\tres = 2.249E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.834292\tres = 2.164E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.850927\tres = 2.079E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.867177\tres = 1.994E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.883017\tres = 1.910E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.898427\tres = 1.827E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913389\tres = 1.745E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.927891\tres = 1.665E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.941925\tres = 1.588E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.955483\tres = 1.512E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.968562\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.981161\tres = 1.369E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.993282\tres = 1.301E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.004928\tres = 1.235E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.016104\tres = 1.172E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.026816\tres = 1.112E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.037073\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.046883\tres = 9.989E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.056257\tres = 9.460E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.065205\tres = 8.954E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.073739\tres = 8.472E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.081871\tres = 8.012E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.089613\tres = 7.573E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.096979\tres = 7.156E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.103980\tres = 6.760E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.110631\tres = 6.382E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.116943\tres = 6.024E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.122931\tres = 5.684E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.128607\tres = 5.361E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.133984\tres = 5.055E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.139075\tres = 4.764E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.143892\tres = 4.489E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.148447\tres = 4.229E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.152752\tres = 3.982E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.156819\tres = 3.749E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.160659\tres = 3.528E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.164282\tres = 3.319E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.167701\tres = 3.122E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.170923\tres = 2.936E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.173961\tres = 2.760E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.176822\tres = 2.594E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.179516\tres = 2.437E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.182052\tres = 2.289E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.184438\tres = 2.150E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.186682\tres = 2.019E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.188792\tres = 1.895E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.190775\tres = 1.778E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.192639\tres = 1.668E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.194389\tres = 1.565E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.196032\tres = 1.468E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.197575\tres = 1.376E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.199023\tres = 1.290E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.200381\tres = 1.209E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.201654\tres = 1.133E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.202849\tres = 1.061E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.203968\tres = 9.939E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.205017\tres = 9.307E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.206000\tres = 8.714E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.206921\tres = 8.157E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.207783\tres = 7.634E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.208590\tres = 7.144E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.209346\tres = 6.684E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.210053\tres = 6.252E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.210715\tres = 5.848E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.211334\tres = 5.468E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.211913\tres = 5.113E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.212454\tres = 4.779E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.212960\tres = 4.467E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.213434\tres = 4.175E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.213876\tres = 3.901E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.214289\tres = 3.644E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.214675\tres = 3.404E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.215036\tres = 3.180E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.215373\tres = 2.969E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.215687\tres = 2.773E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.215981\tres = 2.589E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.216255\tres = 2.416E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.216511\tres = 2.256E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.216750\tres = 2.105E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.216973\tres = 1.964E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.217181\tres = 1.833E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.217376\tres = 1.710E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.217557\tres = 1.595E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.217726\tres = 1.488E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.217883\tres = 1.388E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.218030\tres = 1.294E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.218167\tres = 1.207E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.218295\tres = 1.125E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.218414\tres = 1.049E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.218525\tres = 9.777E-05\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.218629\tres = 9.113E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.218725\tres = 8.494E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.218815\tres = 7.916E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.218899\tres = 7.376E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.218977\tres = 6.873E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.219050\tres = 6.404E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.219117\tres = 5.966E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.219180\tres = 5.557E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.219239\tres = 5.177E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.219294\tres = 4.822E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.219345\tres = 4.491E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.219392\tres = 4.182E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.219437\tres = 3.894E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.219478\tres = 3.626E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.219516\tres = 3.376E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.219552\tres = 3.144E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.219585\tres = 2.927E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.219616\tres = 2.724E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.219645\tres = 2.536E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.219672\tres = 2.361E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.219696\tres = 2.197E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.219720\tres = 2.045E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.219741\tres = 1.903E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.219761\tres = 1.771E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.219780\tres = 1.648E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.219797\tres = 1.534E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.219814\tres = 1.427E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.219829\tres = 1.328E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.219843\tres = 1.235E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.219856\tres = 1.149E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.219868\tres = 1.069E-05\n" ] } ], @@ -1396,8 +1386,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223729\n", - "openmoc keff = 1.219880\n", - "bias [pcm]: -384.9\n" + "openmoc keff = 1.219868\n", + "bias [pcm]: -386.1\n" ] } ], @@ -1470,240 +1460,239 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.495594\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.557313\tres = 5.044E-01\n", + "[ NORMAL ] Iteration 0:\tk_eff = 0.495594\tres = 1.959E-316\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.557312\tres = 5.044E-01\n", "[ NORMAL ] Iteration 2:\tk_eff = 0.518115\tres = 1.245E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.509017\tres = 7.033E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.496280\tres = 1.756E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.488358\tres = 2.502E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.482660\tres = 1.596E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.479524\tres = 1.167E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.478569\tres = 6.497E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.479591\tres = 1.992E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.482389\tres = 2.136E-03\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.509016\tres = 7.033E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.496279\tres = 1.756E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.488357\tres = 2.502E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.482659\tres = 1.596E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.479523\tres = 1.167E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.478568\tres = 6.497E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.479590\tres = 1.991E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.482388\tres = 2.136E-03\n", "[ NORMAL ] Iteration 11:\tk_eff = 0.486774\tres = 5.834E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.492576\tres = 9.091E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.492575\tres = 9.091E-03\n", "[ NORMAL ] Iteration 13:\tk_eff = 0.499632\tres = 1.192E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.507800\tres = 1.433E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.516944\tres = 1.635E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.526943\tres = 1.801E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.537682\tres = 1.934E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.549061\tres = 2.038E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.560985\tres = 2.116E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.507799\tres = 1.433E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.516943\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.526942\tres = 1.801E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.537681\tres = 1.934E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.549060\tres = 2.038E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.560984\tres = 2.116E-02\n", "[ NORMAL ] Iteration 20:\tk_eff = 0.573368\tres = 2.172E-02\n", "[ NORMAL ] Iteration 21:\tk_eff = 0.586133\tres = 2.207E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599208\tres = 2.226E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599207\tres = 2.226E-02\n", "[ NORMAL ] Iteration 23:\tk_eff = 0.612528\tres = 2.231E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.626036\tres = 2.223E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.626035\tres = 2.223E-02\n", "[ NORMAL ] Iteration 25:\tk_eff = 0.639676\tres = 2.205E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.653403\tres = 2.179E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.667171\tres = 2.146E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.653402\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.667170\tres = 2.146E-02\n", "[ NORMAL ] Iteration 28:\tk_eff = 0.680942\tres = 2.107E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.694682\tres = 2.064E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.708357\tres = 2.018E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.721941\tres = 1.969E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.735408\tres = 1.918E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.748735\tres = 1.865E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.761905\tres = 1.812E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.774898\tres = 1.759E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.787701\tres = 1.705E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.800300\tres = 1.652E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.599E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.824845\tres = 1.548E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.836773\tres = 1.496E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.848463\tres = 1.446E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.859909\tres = 1.397E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.871106\tres = 1.349E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.694681\tres = 2.064E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.708356\tres = 2.018E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.721940\tres = 1.969E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.735406\tres = 1.918E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.748734\tres = 1.865E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.761904\tres = 1.812E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.774897\tres = 1.759E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.787700\tres = 1.705E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.800299\tres = 1.652E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.600E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.824844\tres = 1.547E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.836772\tres = 1.496E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.848462\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.859908\tres = 1.397E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.871105\tres = 1.349E-02\n", "[ NORMAL ] Iteration 44:\tk_eff = 0.882052\tres = 1.302E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.892746\tres = 1.257E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.892745\tres = 1.257E-02\n", "[ NORMAL ] Iteration 46:\tk_eff = 0.903184\tres = 1.212E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.913368\tres = 1.169E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.913367\tres = 1.169E-02\n", "[ NORMAL ] Iteration 48:\tk_eff = 0.923297\tres = 1.128E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.932973\tres = 1.087E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.942395\tres = 1.048E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.951568\tres = 1.010E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.960491\tres = 9.733E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.969169\tres = 9.378E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.977605\tres = 9.035E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.985801\tres = 8.704E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.993762\tres = 8.384E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.001492\tres = 8.075E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.008993\tres = 7.778E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.016272\tres = 7.490E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.214E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.030175\tres = 6.945E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.036810\tres = 6.689E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.043239\tres = 6.441E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.049467\tres = 6.200E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.055499\tres = 5.970E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.932972\tres = 1.087E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.942394\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.951566\tres = 1.010E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.960490\tres = 9.733E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.969168\tres = 9.378E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.977604\tres = 9.035E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.985800\tres = 8.704E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.993761\tres = 8.384E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.001491\tres = 8.076E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.008992\tres = 7.778E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.016271\tres = 7.490E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.213E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.030174\tres = 6.946E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.036809\tres = 6.688E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.043238\tres = 6.440E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.049466\tres = 6.201E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.055498\tres = 5.970E-03\n", "[ NORMAL ] Iteration 66:\tk_eff = 1.061339\tres = 5.748E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.066994\tres = 5.533E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.072466\tres = 5.328E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.077761\tres = 5.128E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.082883\tres = 4.937E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.066993\tres = 5.534E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.072465\tres = 5.327E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.077760\tres = 5.129E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.082882\tres = 4.937E-03\n", "[ NORMAL ] Iteration 71:\tk_eff = 1.087837\tres = 4.753E-03\n", "[ NORMAL ] Iteration 72:\tk_eff = 1.092628\tres = 4.575E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.097261\tres = 4.404E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.101738\tres = 4.240E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.106067\tres = 4.080E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.110248\tres = 3.929E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.114289\tres = 3.781E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.118192\tres = 3.639E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.121963\tres = 3.502E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.125604\tres = 3.372E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.129120\tres = 3.245E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.132515\tres = 3.124E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.135791\tres = 3.006E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.138955\tres = 2.893E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.142009\tres = 2.786E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.144955\tres = 2.681E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.147798\tres = 2.580E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.150540\tres = 2.483E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.153187\tres = 2.389E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.155740\tres = 2.300E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.158202\tres = 2.214E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.160576\tres = 2.130E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.162866\tres = 2.050E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.165075\tres = 1.973E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.167203\tres = 1.899E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.169257\tres = 1.827E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.171236\tres = 1.759E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.173143\tres = 1.693E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.174982\tres = 1.629E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.176754\tres = 1.568E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.178463\tres = 1.508E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.180109\tres = 1.452E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.181695\tres = 1.397E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.183225\tres = 1.344E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.184698\tres = 1.294E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.186116\tres = 1.245E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.187483\tres = 1.198E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.188801\tres = 1.152E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.190070\tres = 1.110E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.191292\tres = 1.067E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.192470\tres = 1.026E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.193603\tres = 9.889E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.194696\tres = 9.502E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.195748\tres = 9.155E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.196760\tres = 8.807E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.197736\tres = 8.464E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.198675\tres = 8.155E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.199580\tres = 7.844E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.200452\tres = 7.551E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.201290\tres = 7.262E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.202098\tres = 6.981E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.202876\tres = 6.728E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.203624\tres = 6.471E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.204346\tres = 6.219E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.205039\tres = 5.993E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.205708\tres = 5.756E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.206351\tres = 5.551E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.206970\tres = 5.328E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.207566\tres = 5.132E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.208140\tres = 4.943E-04\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.208691\tres = 4.749E-04\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.209223\tres = 4.564E-04\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.209734\tres = 4.396E-04\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.210228\tres = 4.231E-04\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.210702\tres = 4.076E-04\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.211158\tres = 3.916E-04\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.211597\tres = 3.767E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.212019\tres = 3.628E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.212425\tres = 3.484E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.212817\tres = 3.350E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.213193\tres = 3.227E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.213556\tres = 3.106E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.213904\tres = 2.989E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.214240\tres = 2.869E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.214563\tres = 2.770E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.214874\tres = 2.659E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.215172\tres = 2.557E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.215459\tres = 2.457E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.215737\tres = 2.361E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.216003\tres = 2.281E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.216260\tres = 2.194E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.216507\tres = 2.109E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.216744\tres = 2.028E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.216972\tres = 1.950E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.217193\tres = 1.876E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.217403\tres = 1.809E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.217607\tres = 1.733E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.217802\tres = 1.673E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.217990\tres = 1.603E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.218171\tres = 1.544E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.218346\tres = 1.486E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.218513\tres = 1.429E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.218674\tres = 1.376E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.218829\tres = 1.322E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.218979\tres = 1.274E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.219123\tres = 1.225E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.219261\tres = 1.181E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.219394\tres = 1.132E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.219522\tres = 1.090E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.219645\tres = 1.049E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.219763\tres = 1.008E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.219877\tres = 9.716E-05\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.219986\tres = 9.353E-05\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.220091\tres = 8.948E-05\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.220192\tres = 8.598E-05\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.220290\tres = 8.274E-05\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.220384\tres = 7.979E-05\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.220474\tres = 7.672E-05\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.220561\tres = 7.406E-05\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.220644\tres = 7.136E-05\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.220725\tres = 6.812E-05\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.220802\tres = 6.605E-05\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.220877\tres = 6.346E-05\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.220948\tres = 6.086E-05\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.221016\tres = 5.825E-05\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.221083\tres = 5.620E-05\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.221146\tres = 5.433E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.221208\tres = 5.215E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.221267\tres = 5.031E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.221323\tres = 4.820E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.221377\tres = 4.623E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.221430\tres = 4.449E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.221480\tres = 4.287E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.221529\tres = 4.123E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.221575\tres = 3.993E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.221620\tres = 3.779E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.221663\tres = 3.667E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.221705\tres = 3.541E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.221744\tres = 3.378E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.221782\tres = 3.233E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.221820\tres = 3.127E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.221855\tres = 3.033E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.221889\tres = 2.911E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.221922\tres = 2.775E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.221954\tres = 2.682E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.221984\tres = 2.580E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.222013\tres = 2.467E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.222041\tres = 2.365E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.222068\tres = 2.298E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.222094\tres = 2.216E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.222119\tres = 2.115E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.222143\tres = 2.038E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.222166\tres = 1.954E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.222188\tres = 1.879E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.810E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.222230\tres = 1.741E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.222250\tres = 1.694E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.222269\tres = 1.617E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.574E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.222305\tres = 1.497E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.222322\tres = 1.452E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.222338\tres = 1.381E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.222354\tres = 1.330E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.222369\tres = 1.285E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.230E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.170E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.124E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.095E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.222436\tres = 1.047E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.222448\tres = 1.009E-05\n" + "[ NORMAL ] Iteration 73:\tk_eff = 1.097260\tres = 4.404E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.101737\tres = 4.239E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.106065\tres = 4.081E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.110247\tres = 3.928E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.114288\tres = 3.781E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.118191\tres = 3.639E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.121961\tres = 3.503E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.125603\tres = 3.372E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.129119\tres = 3.245E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.132513\tres = 3.124E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.135790\tres = 3.007E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.138954\tres = 2.894E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.142007\tres = 2.785E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.144953\tres = 2.681E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.147796\tres = 2.580E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.150539\tres = 2.483E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.153185\tres = 2.390E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.155738\tres = 2.300E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.158200\tres = 2.214E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.160575\tres = 2.130E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.162865\tres = 2.050E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.165073\tres = 1.973E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.167202\tres = 1.899E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.169255\tres = 1.828E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.171234\tres = 1.759E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.173142\tres = 1.693E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.174980\tres = 1.629E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.176753\tres = 1.567E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.178461\tres = 1.508E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.180107\tres = 1.452E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.181694\tres = 1.397E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.183222\tres = 1.344E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.184695\tres = 1.294E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.186115\tres = 1.245E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.187482\tres = 1.198E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.188799\tres = 1.153E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.190068\tres = 1.109E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.191290\tres = 1.067E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.192468\tres = 1.027E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.193602\tres = 9.883E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.194694\tres = 9.510E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.195746\tres = 9.151E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.196759\tres = 8.805E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.197735\tres = 8.473E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.198674\tres = 8.152E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.199579\tres = 7.844E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.200450\tres = 7.548E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.201289\tres = 7.262E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.202097\tres = 6.988E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.202874\tres = 6.723E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.203623\tres = 6.469E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.204344\tres = 6.224E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.205038\tres = 5.989E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.205706\tres = 5.762E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.206349\tres = 5.544E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.206968\tres = 5.334E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.207564\tres = 5.132E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.208138\tres = 4.938E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.208690\tres = 4.751E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.209221\tres = 4.570E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.209733\tres = 4.397E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.210225\tres = 4.231E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.210699\tres = 4.070E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.211155\tres = 3.916E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.211594\tres = 3.767E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.212017\tres = 3.624E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.212423\tres = 3.487E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.212815\tres = 3.355E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.213191\tres = 3.227E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.213554\tres = 3.105E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.213902\tres = 2.987E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.214238\tres = 2.874E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.214561\tres = 2.764E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.214872\tres = 2.659E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.215171\tres = 2.558E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.215458\tres = 2.461E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.215735\tres = 2.368E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.216002\tres = 2.278E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.216258\tres = 2.191E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.216504\tres = 2.108E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.216742\tres = 2.028E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.216970\tres = 1.951E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.217190\tres = 1.876E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.217401\tres = 1.805E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.217604\tres = 1.736E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.217800\tres = 1.670E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.217988\tres = 1.607E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.218169\tres = 1.546E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.218344\tres = 1.487E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.218511\tres = 1.430E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.218673\tres = 1.376E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.218828\tres = 1.324E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.218977\tres = 1.273E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.219121\tres = 1.225E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.219259\tres = 1.178E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.219392\tres = 1.133E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.219520\tres = 1.090E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.219643\tres = 1.049E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.219761\tres = 1.009E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.219875\tres = 9.702E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.219984\tres = 9.332E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.220090\tres = 8.976E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.220191\tres = 8.634E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.220288\tres = 8.305E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.220382\tres = 7.989E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.220472\tres = 7.684E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.220559\tres = 7.392E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.220643\tres = 7.110E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.220723\tres = 6.839E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.220800\tres = 6.578E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.220874\tres = 6.327E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.220946\tres = 6.086E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.221015\tres = 5.854E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.221081\tres = 5.631E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.221144\tres = 5.416E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.221206\tres = 5.209E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.221264\tres = 5.011E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.221321\tres = 4.820E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.221375\tres = 4.636E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.221428\tres = 4.459E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.221478\tres = 4.289E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.221527\tres = 4.125E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.221573\tres = 3.968E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.221618\tres = 3.816E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.221661\tres = 3.671E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.221703\tres = 3.531E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.221743\tres = 3.396E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.221781\tres = 3.266E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.221818\tres = 3.142E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.221853\tres = 3.022E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.221888\tres = 2.906E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.221920\tres = 2.795E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.221952\tres = 2.689E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.221982\tres = 2.586E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.222012\tres = 2.487E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.222040\tres = 2.392E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.222067\tres = 2.301E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.222093\tres = 2.213E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.222118\tres = 2.129E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.222142\tres = 2.047E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.222165\tres = 1.969E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.222187\tres = 1.894E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.822E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.222229\tres = 1.752E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.222249\tres = 1.685E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.222268\tres = 1.621E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.559E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.222304\tres = 1.499E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.222321\tres = 1.442E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.222337\tres = 1.387E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.222353\tres = 1.334E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.222368\tres = 1.283E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.234E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.187E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.142E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.098E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.222435\tres = 1.056E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.222447\tres = 1.016E-05\n" ] } ], @@ -1730,8 +1719,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223729\n", - "openmoc keff = 1.222448\n", - "bias [pcm]: -128.1\n" + "openmoc keff = 1.222447\n", + "bias [pcm]: -128.2\n" ] } ], @@ -1772,7 +1761,7 @@ "source": [ "It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for multi-group cross section visualization, only a few of which will be shown here for enrichment and inspiration.\n", "\n", - "One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." + "One particularly useful visualization is a comparison of the continuous-energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source [PyNE](http://pyne.io/) library to parse continuous-energy cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows." ] }, { @@ -1783,14 +1772,14 @@ }, "outputs": [], "source": [ - "# Instantiate a PyNE ACE continuous energy cross sections library\n", + "# Instantiate a PyNE ACE continuous-energy cross sections library\n", "pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n", "pyne_lib.read('92235.71c')\n", "\n", "# Extract the U-235 data from the library\n", "u235 = pyne_lib.tables['92235.71c']\n", "\n", - "# Extract the continuous energy U-235 fission cross section data\n", + "# Extract the continuous-energy U-235 fission cross section data\n", "fission = u235.reactions[18]" ] }, @@ -1798,7 +1787,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we use [`matplotlib`](http://matplotlib.org/) and [`seaborn`](http://stanford.edu/~mwaskom/software/seaborn/) to plot the continuous energy and multi-group cross sections on a single plot." + "Now, we use [`matplotlib`](http://matplotlib.org/) and [`seaborn`](http://stanford.edu/~mwaskom/software/seaborn/) to plot the continuous-energy and multi-group cross sections on a single plot." ] }, { @@ -1822,7 +1811,7 @@ "data": { "image/png": "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\nRETE6eQvWE4Yr8iVHuYAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1830,7 +1819,7 @@ } ], "source": [ - "# Create a loglog plot of the U-235 continuous energy fission cross section \n", + "# Create a loglog plot of the U-235 continuous-energy fission cross section \n", "plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1)\n", "\n", "# Extract energy group bounds and MGXS values to plot\n", @@ -1905,7 +1894,7 @@ "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index c3f4280de1..9302036600 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -543,7 +543,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses are mapped to string codes accepted by the `Library` class:\n", + "Now, we must specify to the `Library` which types of cross sections to compute. In particular, the following are the multi-group cross section `MGXS` subclasses that are mapped to string codes accepted by the `Library` class:\n", "\n", "* `TotalXS` (`\"total\"`)\n", "* `TransportXS` (`\"transport\"`)\n", @@ -580,7 +580,7 @@ "source": [ "Now we must specify the type of domain over which we would like the `Library` to compute multi-group cross sections. The domain type corresponds to the type of tally filter to be used in the tallies created to compute multi-group cross sections. At the present time, the `Library` supports `\"material,\"` `\"cell,\"` and `\"universe\"` domain types. We will use a `\"cell\"` domain type here to compute cross sections in each of the cells in the fuel assembly geometry.\n", "\n", - "**Note:** By default, the `Library` class will instantiate `MGXS` objects for each and every domain (material, cell or universe) in the geometry of interest. However, one may specify a subset of these domains to the `Library.domains` property. In our case, we wish to compute multi-group cross sectoins in each and every cell since they will be needed in our downstream OpenMOC calculation on the identical combinatorial geometry mesh." + "**Note:** By default, the `Library` class will instantiate `MGXS` objects for each and every domain (material, cell or universe) in the geometry of interest. However, one may specify a subset of these domains to the `Library.domains` property. In our case, we wish to compute multi-group cross sections in each and every cell since they will be needed in our downstream OpenMOC calculation on the identical combinatorial geometry mesh." ] }, { diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 96fb6e07ee..635c822e31 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1225,28 +1225,29 @@ class MGXS(object): df = df.drop('score', axis=1) # Override energy groups bounds with indices - groups = np.arange(self.num_groups, 0, -1, dtype=np.int) - groups = np.repeat(groups, self.num_nuclides) + all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) + all_groups = np.repeat(all_groups, self.num_nuclides) if 'energy [MeV]' in df and 'energyout [MeV]' in df: df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.tile(all_groups, self.num_subdomains) in_groups = np.repeat(in_groups, self.num_groups) df['group in'] = in_groups df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) - out_groups = np.tile(groups, self.num_subdomains * self.num_groups) + out_groups = \ + np.tile(all_groups, self.num_subdomains * self.num_groups) df['group out'] = out_groups columns = ['group in', 'group out'] elif 'energyout [MeV]' in df: df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True) - in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.tile(all_groups, self.num_subdomains) df['group out'] = in_groups columns = ['group out'] elif 'energy [MeV]' in df: df.rename(columns={'energy [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(groups, self.num_subdomains) + in_groups = np.tile(all_groups, self.num_subdomains) df['group in'] = in_groups columns = ['group in'] From 8506f32c4ff4460d0aebf7b908afdeef8775f403 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 1 Dec 2015 07:22:20 -0600 Subject: [PATCH 497/519] Ability to determine bounding boxes for Regions --- openmc/region.py | 41 +++++++ openmc/surface.py | 278 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 319 insertions(+) diff --git a/openmc/region.py b/openmc/region.py index 936e6e5121..7b640a07f4 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -1,6 +1,8 @@ from abc import ABCMeta, abstractmethod from collections import Iterable +import numpy as np + from openmc.checkvalue import check_type @@ -218,6 +220,8 @@ class Intersection(Region): ---------- nodes : tuple of Region Regions to take the intersection of + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -231,6 +235,16 @@ class Intersection(Region): def nodes(self): return self._nodes + @property + def bounding_box(self): + ll = np.array([-np.inf, -np.inf, -np.inf]) + ur = np.array([np.inf, np.inf, np.inf]) + for n in self.nodes: + ll_n, ur_n = n.bounding_box + ll[:] = np.maximum(ll, ll_n) + ur[:] = np.minimum(ur, ur_n) + return ll, ur + @nodes.setter def nodes(self, nodes): check_type('nodes', nodes, Iterable, Region) @@ -257,6 +271,8 @@ class Union(Region): ---------- nodes : tuple of Region Regions to take the union of + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -270,6 +286,16 @@ class Union(Region): def nodes(self): return self._nodes + @property + def bounding_box(self): + ll = np.array([np.inf, np.inf, np.inf]) + ur = np.array([-np.inf, -np.inf, -np.inf]) + for n in self.nodes: + ll_n, ur_n = n.bounding_box + ll[:] = np.minimum(ll, ll_n) + ur[:] = np.maximum(ur, ur_n) + return ll, ur + @nodes.setter def nodes(self, nodes): check_type('nodes', nodes, Iterable, Region) @@ -300,6 +326,8 @@ class Complement(Region): ---------- node : Region Regions to take the complement of + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -317,3 +345,16 @@ class Complement(Region): def node(self, node): check_type('node', node, Region) self._node = node + + @property + def bounding_box(self): + # Use De Morgan's laws to distribute the complement operator so that it + # only applies to surface half-spaces, thus allowing us to calculate the + # bounding box in the usual recursive manner. + if isinstance(self.node, Union): + temp_region = Intersection(*[~n for n in self.node.nodes]) + elif isinstance(self.node, Intersection): + temp_region = Union(*[~n for n in self.node.nodes]) + else: + temp_region = ~n + return temp_region.bounding_box diff --git a/openmc/surface.py b/openmc/surface.py index 279246b029..83465ac6d0 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -3,6 +3,8 @@ from numbers import Real, Integral from xml.etree import ElementTree as ET import sys +import numpy as np + from openmc.checkvalue import check_type, check_value, check_greater_than from openmc.region import Region @@ -136,6 +138,33 @@ class Surface(object): check_value('boundary type', boundary_type, _BC_TYPES) self._boundary_type = boundary_type + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + def create_xml_subelement(self): element = ET.Element("surface") element.set("id", str(self._id)) @@ -194,6 +223,10 @@ class Plane(Surface): self._type = 'plane' self._coeff_keys = ['A', 'B', 'C', 'D'] + self._coeffs['A'] = 1. + self._coeffs['B'] = 0. + self._coeffs['C'] = 0. + self._coeffs['D'] = 0. if A is not None: self.a = A @@ -276,6 +309,7 @@ class XPlane(Plane): self._type = 'x-plane' self._coeff_keys = ['x0'] + self._coeffs['x0'] = 0. if x0 is not None: self.x0 = x0 @@ -289,6 +323,37 @@ class XPlane(Plane): check_type('x0 coefficient', x0, Real) self._coeffs['x0'] = x0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([self.x0, np.inf, np.inf])) + elif side == '+': + return (np.array([self.x0, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class YPlane(Plane): """A plane perpendicular to the y axis, i.e. a surface of the form :math:`y - @@ -322,6 +387,7 @@ class YPlane(Plane): self._type = 'y-plane' self._coeff_keys = ['y0'] + self._coeffs['y0'] = 0. if y0 is not None: self.y0 = y0 @@ -335,6 +401,37 @@ class YPlane(Plane): check_type('y0 coefficient', y0, Real) self._coeffs['y0'] = y0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, self.y0, np.inf])) + elif side == '+': + return (np.array([-np.inf, -self.y0, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class ZPlane(Plane): """A plane perpendicular to the z axis, i.e. a surface of the form :math:`z - @@ -368,6 +465,7 @@ class ZPlane(Plane): self._type = 'z-plane' self._coeff_keys = ['z0'] + self._coeffs['z0'] = 0. if z0 is not None: self.z0 = z0 @@ -381,6 +479,37 @@ class ZPlane(Plane): check_type('z0 coefficient', z0, Real) self._coeffs['z0'] = z0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, self.z0])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -self.z0]), + np.array([np.inf, np.inf, np.inf])) + class Cylinder(Surface): """A cylinder whose length is parallel to the x-, y-, or z-axis. @@ -415,6 +544,7 @@ class Cylinder(Surface): super(Cylinder, self).__init__(surface_id, boundary_type, name=name) self._coeff_keys = ['R'] + self._coeffs['R'] = 1. if R is not None: self.r = R @@ -468,6 +598,8 @@ class XCylinder(Cylinder): self._type = 'x-cylinder' self._coeff_keys = ['y0', 'z0', 'R'] + self._coeffs['y0'] = 0. + self._coeffs['z0'] = 0. if y0 is not None: self.y0 = y0 @@ -493,6 +625,37 @@ class XCylinder(Cylinder): check_type('z0 coefficient', z0, Real) self._coeffs['z0'] = z0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([-np.inf, self.y0 - self.r, self.z0 - self.r]), + np.array([np.inf, self.y0 + self.r, self.y0 + self.r])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class YCylinder(Cylinder): """An infinite cylinder whose length is parallel to the y-axis. This is a @@ -533,6 +696,8 @@ class YCylinder(Cylinder): self._type = 'y-cylinder' self._coeff_keys = ['x0', 'z0', 'R'] + self._coeffs['x0'] = 0. + self._coeffs['z0'] = 0. if x0 is not None: self.x0 = x0 @@ -558,6 +723,37 @@ class YCylinder(Cylinder): check_type('z0 coefficient', z0, Real) self._coeffs['z0'] = z0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([self.x0 - self.r, -np.inf, self.z0 - self.r]), + np.array([self.x0 + self.r, np.inf, self.y0 + self.r])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class ZCylinder(Cylinder): """An infinite cylinder whose length is parallel to the z-axis. This is a @@ -598,6 +794,8 @@ class ZCylinder(Cylinder): self._type = 'z-cylinder' self._coeff_keys = ['x0', 'y0', 'R'] + self._coeffs['x0'] = 0. + self._coeffs['y0'] = 0. if x0 is not None: self.x0 = x0 @@ -623,6 +821,37 @@ class ZCylinder(Cylinder): check_type('y0 coefficient', y0, Real) self._coeffs['y0'] = y0 + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([self.x0 - self.r, self.y0 - self.r, -np.inf]), + np.array([self.x0 + self.r, self.y0 + self.r, np.inf])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class Sphere(Surface): """A sphere of the form :math:`(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 = R^2`. @@ -667,6 +896,10 @@ class Sphere(Surface): self._type = 'sphere' self._coeff_keys = ['x0', 'y0', 'z0', 'R'] + self._coeffs['x0'] = 0. + self._coeffs['y0'] = 0. + self._coeffs['z0'] = 0. + self._coeffs['R'] = 1. if x0 is not None: self.x0 = x0 @@ -716,6 +949,39 @@ class Sphere(Surface): check_type('R coefficient', R, Real) self._coeffs['R'] = R + def bounding_box(self, side): + """Determine an axis-aligned bounding box. + + An axis-aligned bounding box for surface half-spaces is represented by + its lower-left and upper-right coordinates. If the half-space is + unbounded in a particular direction, numpy.inf is used to represent + infinity. + + Parameters + ---------- + side : {'+', '-'} + Indicates the negative or positive half-space + + Returns + ------- + numpy.array + Lower-left coordinates of the axis-aligned bounding box for the + desired half-space + numpy.array + Upper-right coordinates of the axis-aligned bounding box for the + desired half-space + + """ + + if side == '-': + return (np.array([self.x0 - self.r, self.y0 - self.r, + self.z0 - self.r]), + np.array([self.x0 + self.r, self.y0 + self.r, + self.z0 + self.r])) + elif side == '+': + return (np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf])) + class Cone(Surface): """A conical surface parallel to the x-, y-, or z-axis. @@ -761,6 +1027,10 @@ class Cone(Surface): super(Cone, self).__init__(surface_id, boundary_type, name=name) self._coeff_keys = ['x0', 'y0', 'z0', 'R2'] + self._coeffs['x0'] = 0. + self._coeffs['y0'] = 0. + self._coeffs['z0'] = 0. + self._coeffs['R2'] = 1. if x0 is not None: self.x0 = x0 @@ -982,6 +1252,8 @@ class Quadric(Surface): self._type = 'quadric' self._coeff_keys = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k'] + for key in self._coeff_keys: + self._coeffs[key] = 0. if a is not None: self.a = a @@ -1127,6 +1399,8 @@ class Halfspace(Region): Surface which divides Euclidean space. side : {'+', '-'} Indicates whether the positive or negative half-space is used. + bounding_box : tuple of numpy.array + Lower-left and upper-right coordinates of an axis-aligned bounding box """ @@ -1155,6 +1429,10 @@ class Halfspace(Region): check_value('side', side, ('+', '-')) self._side = side + @property + def bounding_box(self): + return self.surface.bounding_box(self.side) + def __str__(self): return '-' + str(self.surface.id) if self.side == '-' \ else str(self.surface.id) From 48d5f2219de1f91ac70e914b3f98e749b3a83a93 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 2 Dec 2015 13:48:59 -0600 Subject: [PATCH 498/519] Fix error in bounding boxes for y- and z-planes. --- openmc/surface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/surface.py b/openmc/surface.py index 83465ac6d0..6bb05baefc 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -429,7 +429,7 @@ class YPlane(Plane): return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, self.y0, np.inf])) elif side == '+': - return (np.array([-np.inf, -self.y0, -np.inf]), + return (np.array([-np.inf, self.y0, -np.inf]), np.array([np.inf, np.inf, np.inf])) @@ -507,7 +507,7 @@ class ZPlane(Plane): return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, self.z0])) elif side == '+': - return (np.array([-np.inf, -np.inf, -self.z0]), + return (np.array([-np.inf, -np.inf, self.z0]), np.array([np.inf, np.inf, np.inf])) From d13c95018907eaa0556689d409e76c0277a1f5e1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 2 Dec 2015 13:52:32 -0600 Subject: [PATCH 499/519] Use bounding box feature in a few example inputs --- examples/python/boxes/build-xml.py | 4 +++- examples/python/reflective/build-xml.py | 4 +++- examples/xml/boxes/settings.xml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py index 4bac9fff4d..9c28d37bb3 100644 --- a/examples/python/boxes/build-xml.py +++ b/examples/python/boxes/build-xml.py @@ -1,3 +1,5 @@ +import numpy as np + import openmc ############################################################################### @@ -115,7 +117,7 @@ settings_file = openmc.SettingsFile() settings_file.batches = batches settings_file.inactive = inactive settings_file.particles = particles -settings_file.set_source_space('point', [0., 0., 0.]) +settings_file.set_source_space('box', np.concatenate(outer_cube.bounding_box)) settings_file.export_to_xml() ############################################################################### diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 9eab4aec32..44b544d20d 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -1,3 +1,5 @@ +import numpy as np + import openmc ############################################################################### @@ -82,5 +84,5 @@ settings_file = openmc.SettingsFile() settings_file.batches = batches settings_file.inactive = inactive settings_file.particles = particles -settings_file.set_source_space('box', [-1, -1, -1, 1, 1, 1]) +settings_file.set_source_space('box', np.concatenate(cell.region.bounding_box)) settings_file.export_to_xml() diff --git a/examples/xml/boxes/settings.xml b/examples/xml/boxes/settings.xml index 0ac26ec4d4..eff7c1c105 100644 --- a/examples/xml/boxes/settings.xml +++ b/examples/xml/boxes/settings.xml @@ -10,7 +10,7 @@ - + From 7afebb029b93d05f95d0dee5e31cc2a9ec24b4b0 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 3 Dec 2015 07:31:02 -0600 Subject: [PATCH 500/519] Address @wbinventor comments on #516 --- openmc/region.py | 24 +++++++++++------------ openmc/surface.py | 49 +++++++++++++++++++++++++---------------------- 2 files changed, 38 insertions(+), 35 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index 7b640a07f4..b7cfbca7b8 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -237,13 +237,13 @@ class Intersection(Region): @property def bounding_box(self): - ll = np.array([-np.inf, -np.inf, -np.inf]) - ur = np.array([np.inf, np.inf, np.inf]) + lower_left = np.array([-np.inf, -np.inf, -np.inf]) + upper_right = np.array([np.inf, np.inf, np.inf]) for n in self.nodes: - ll_n, ur_n = n.bounding_box - ll[:] = np.maximum(ll, ll_n) - ur[:] = np.minimum(ur, ur_n) - return ll, ur + lower_left_n, upper_right_n = n.bounding_box + lower_left[:] = np.maximum(lower_left, lower_left_n) + upper_right[:] = np.minimum(upper_right, upper_right_n) + return lower_left, upper_right @nodes.setter def nodes(self, nodes): @@ -288,13 +288,13 @@ class Union(Region): @property def bounding_box(self): - ll = np.array([np.inf, np.inf, np.inf]) - ur = np.array([-np.inf, -np.inf, -np.inf]) + lower_left = np.array([np.inf, np.inf, np.inf]) + upper_right = np.array([-np.inf, -np.inf, -np.inf]) for n in self.nodes: - ll_n, ur_n = n.bounding_box - ll[:] = np.minimum(ll, ll_n) - ur[:] = np.maximum(ur, ur_n) - return ll, ur + lower_left_n, upper_right_n = n.bounding_box + lower_left[:] = np.minimum(lower_left, lower_left_n) + upper_right[:] = np.maximum(upper_right, upper_right_n) + return lower_left, upper_right @nodes.setter def nodes(self, nodes): diff --git a/openmc/surface.py b/openmc/surface.py index 6bb05baefc..8dc45209be 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -327,9 +327,9 @@ class XPlane(Plane): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the x-plane surface, the + half-spaces are unbounded in their y- and z- directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -405,9 +405,9 @@ class YPlane(Plane): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the y-plane surface, the + half-spaces are unbounded in their x- and z- directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -483,9 +483,9 @@ class ZPlane(Plane): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the z-plane surface, the + half-spaces are unbounded in their x- and y- directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -629,9 +629,10 @@ class XCylinder(Cylinder): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the x-cylinder surface, + the negative half-space is unbounded in the x- direction and the + positive half-space is unbounded in all directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -651,7 +652,7 @@ class XCylinder(Cylinder): if side == '-': return (np.array([-np.inf, self.y0 - self.r, self.z0 - self.r]), - np.array([np.inf, self.y0 + self.r, self.y0 + self.r])) + np.array([np.inf, self.y0 + self.r, self.z0 + self.r])) elif side == '+': return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, np.inf])) @@ -727,9 +728,10 @@ class YCylinder(Cylinder): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the y-cylinder surface, + the negative half-space is unbounded in the y- direction and the + positive half-space is unbounded in all directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -749,7 +751,7 @@ class YCylinder(Cylinder): if side == '-': return (np.array([self.x0 - self.r, -np.inf, self.z0 - self.r]), - np.array([self.x0 + self.r, np.inf, self.y0 + self.r])) + np.array([self.x0 + self.r, np.inf, self.z0 + self.r])) elif side == '+': return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, np.inf])) @@ -825,9 +827,10 @@ class ZCylinder(Cylinder): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. For the z-cylinder surface, + the negative half-space is unbounded in the z- direction and the + positive half-space is unbounded in all directions. To represent + infinity, numpy.inf is used. Parameters ---------- @@ -953,9 +956,9 @@ class Sphere(Surface): """Determine an axis-aligned bounding box. An axis-aligned bounding box for surface half-spaces is represented by - its lower-left and upper-right coordinates. If the half-space is - unbounded in a particular direction, numpy.inf is used to represent - infinity. + its lower-left and upper-right coordinates. The positive half-space of a + sphere is unbounded in all directions. To represent infinity, numpy.inf + is used. Parameters ---------- From 06f025dc364eeb667e77a664137ecea5ddb18305 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 13:29:38 -0600 Subject: [PATCH 501/519] Modify test_complex_cell to include a cell whose region specification includes both the negative and positive half-space of a surface --- tests/test_complex_cell/geometry.xml | 5 +++-- tests/test_complex_cell/results_true.dat | 18 +++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/test_complex_cell/geometry.xml b/tests/test_complex_cell/geometry.xml index 18e304fe0e..a695396e01 100644 --- a/tests/test_complex_cell/geometry.xml +++ b/tests/test_complex_cell/geometry.xml @@ -15,10 +15,11 @@ + - - + + diff --git a/tests/test_complex_cell/results_true.dat b/tests/test_complex_cell/results_true.dat index 56e7e409f0..97f228e3ee 100644 --- a/tests/test_complex_cell/results_true.dat +++ b/tests/test_complex_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -2.651570E-01 2.116381E-03 +2.565769E-01 8.980879E-04 tally 1: -2.639097E+00 -1.394398E+00 -2.743740E+00 -1.506124E+00 -1.041248E+00 -2.177204E-01 -1.087210E-01 -2.365126E-03 +2.584080E+00 +1.335682E+00 +2.763580E+00 +1.528633E+00 +1.007148E+00 +2.031543E-01 +1.113696E-01 +2.485351E-03 From 10ad9576379a3f4acb3bedd455612961d9fcdb2c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 22:04:13 -0600 Subject: [PATCH 502/519] Elaborate on description of units="sum" option for --- docs/source/usersguide/input.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 0b132275bb..0ac71716bf 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1110,13 +1110,14 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: "" - :density: - An element with attributes/sub-elements called ``value`` and ``units``. The - ``value`` attribute is the numeric value of the density while the ``units`` - can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or "sum". The "sum" unit - indicates that the density should be calculated as the sum of the atom - fractions for each nuclide in the material. This should not be used in - conjunction with weight percents. + :density: An element with attributes/sub-elements called ``value`` and + ``units``. The ``value`` attribute is the numeric value of the density while + the ``units`` can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or + "sum". The "sum" unit indicates that values appearing in ``ao`` attributes + for ```` and ```` sub-elements are to be interpreted as + nuclide/element densities in atom/b-cm, and the total density of the + material is taken as the sum of all nuclides/elements. The "sum" option + cannot be used in conjunction with weight percents. *Default*: None From c4305ff6962a666c6cef942c1f11500951601048 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 22:33:49 -0600 Subject: [PATCH 503/519] Fix minor rst issue --- docs/source/usersguide/input.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 0ac71716bf..fa43ca1d2c 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1110,14 +1110,15 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: "" - :density: An element with attributes/sub-elements called ``value`` and - ``units``. The ``value`` attribute is the numeric value of the density while - the ``units`` can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or - "sum". The "sum" unit indicates that values appearing in ``ao`` attributes - for ```` and ```` sub-elements are to be interpreted as - nuclide/element densities in atom/b-cm, and the total density of the - material is taken as the sum of all nuclides/elements. The "sum" option - cannot be used in conjunction with weight percents. + :density: + An element with attributes/sub-elements called ``value`` and ``units``. The + ``value`` attribute is the numeric value of the density while the ``units`` + can be "g/cm3", "kg/m3", "atom/b-cm", "atom/cm3", or "sum". The "sum" unit + indicates that values appearing in ``ao`` attributes for ```` and + ```` sub-elements are to be interpreted as nuclide/element + densities in atom/b-cm, and the total density of the material is taken as + the sum of all nuclides/elements. The "sum" option cannot be used in + conjunction with weight percents. *Default*: None From 9bf8964edd0522b106c3b6567b43b306fc26ad6f Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 6 Dec 2015 17:45:27 -0500 Subject: [PATCH 504/519] Made DeprecationWarning for Cell.add_surface(...) only print once --- openmc/universe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/universe.py b/openmc/universe.py index 0e405e9f18..7e93981afa 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -240,7 +240,7 @@ class Cell(object): """ - warnings.simplefilter('always', DeprecationWarning) + warnings.simplefilter('once', DeprecationWarning) warnings.warn("Cell.add_surface(...) has been deprecated and may be " "removed in a future version. The region for a Cell " "should be defined using the region property directly.", From 510711e92f6045fdf6928c149db8631a4c4d7dcd Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Sun, 6 Dec 2015 19:58:19 -0500 Subject: [PATCH 505/519] Now store keff as an attribute in MGXS Library class --- openmc/mgxs/library.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 0bf9732549..6845abf20e 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -67,6 +67,9 @@ class Library(object): sp_filename : str The filename of the statepoint with tally data used to the compute cross sections + keff : Real or None + The combined keff from the statepoint file with tally data used to + compute cross sections name : str, optional Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. @@ -88,6 +91,7 @@ class Library(object): self._tally_trigger = None self._all_mgxs = OrderedDict() self._sp_filename = None + self._keff = None self.name = name self.openmc_geometry = openmc_geometry @@ -114,6 +118,7 @@ class Library(object): clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._all_mgxs = self.all_mgxs clone._sp_filename = self._sp_filename + clone._keff = self._keff clone._all_mgxs = OrderedDict() for domain in self.domains: @@ -199,6 +204,10 @@ class Library(object): def sp_filename(self): return self._sp_filename + @property + def keff(self): + return self._keff + @openmc_geometry.setter def openmc_geometry(self, openmc_geometry): cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) @@ -363,6 +372,7 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry + self._keff = statepoint.k_combined[0] # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From e55f9fb3eea1a35a6acafe7929a9ddad6e263cf4 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 7 Dec 2015 08:48:41 -0500 Subject: [PATCH 506/519] Now only store keff in MGXS Library for eigenvalue calculations --- openmc/mgxs/library.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 6845abf20e..ebf4050773 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -69,7 +69,7 @@ class Library(object): compute cross sections keff : Real or None The combined keff from the statepoint file with tally data used to - compute cross sections + compute cross sections (for eigenvalue calculations only) name : str, optional Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. @@ -372,7 +372,9 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry - self._keff = statepoint.k_combined[0] + + if statepoint.run_mode == 'k-effective': + self._keff = statepoint.k_combined[0] # Load tallies for each MGXS for each domain and mgxs type for domain in self.domains: From f822a221527986826a450885be0d089c3609bb79 Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 7 Dec 2015 08:53:36 -0500 Subject: [PATCH 507/519] Moved DeprecationWarning filter to top of universe module --- openmc/universe.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openmc/universe.py b/openmc/universe.py index 7e93981afa..98367c381b 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -15,6 +15,10 @@ from openmc.region import Region, Intersection, Complement if sys.version_info[0] >= 3: basestring = str + +# DeprecationWarning filter for the Cell.add_surface(...) method +warnings.simplefilter('always', DeprecationWarning) + # A static variable for auto-generated Cell IDs AUTO_CELL_ID = 10000 @@ -240,7 +244,6 @@ class Cell(object): """ - warnings.simplefilter('once', DeprecationWarning) warnings.warn("Cell.add_surface(...) has been deprecated and may be " "removed in a future version. The region for a Cell " "should be defined using the region property directly.", From 71c3248f1afa8cd290ce88eef7e6a43f0d8235d9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 23 Nov 2015 08:39:32 -0600 Subject: [PATCH 508/519] Increase list depth so 'make latexpdf' works again --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 05559aab08..79a7604e39 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -200,7 +200,7 @@ latex_elements = { \usepackage{enumitem} \usepackage{amsfonts} \usepackage{amsmath} -\setlistdepth{9} +\setlistdepth{99} \usepackage{tikz} \usetikzlibrary{shapes,snakes,shadows,arrows,calc,decorations.markings,patterns,fit,matrix,spy} \usepackage{fixltx2e} From 5d65f2557e822406b6b7f1d0a89905b7acfa0804 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 23 Nov 2015 08:39:58 -0600 Subject: [PATCH 509/519] Fix warning on definition list in mgxs.Library.get_mgxs --- openmc/mgxs/library.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 0bf9732549..4a17b95e41 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -382,9 +382,7 @@ class Library(object): ---------- domain : Material or Cell or Universe or Integral The material, cell, or universe object of interest (or its ID) - mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', - 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', - 'nu-scatter matrix', 'chi'} + mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'} The type of multi-group cross section object to return Returns From 556dd2de03ad914b31731f811cb3cdbc48a1c762 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 10:38:27 -0600 Subject: [PATCH 510/519] Allow setup.py to be called properly for debian installations --- CMakeLists.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36501c9185..57a49508b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,14 +278,21 @@ target_link_libraries(${program} ${ldflags} ${HDF5_LIBRARIES} fox_dom) install(TARGETS ${program} RUNTIME DESTINATION bin) install(DIRECTORY src/relaxng DESTINATION share/openmc) install(FILES man/man1/openmc.1 DESTINATION share/man/man1) -install(FILES LICENSE DESTINATION "share/doc/${program}/copyright") +install(FILES LICENSE DESTINATION "share/doc/${program}" RENAME copyright) find_package(PythonInterp) if(PYTHONINTERP_FOUND) - install(CODE "execute_process( - COMMAND ${PYTHON_EXECUTABLE} setup.py install - --prefix=${CMAKE_INSTALL_PREFIX} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") + if(debian) + install(CODE "execute_process( + COMMAND ${PYTHON_EXECUTABLE} setup.py install + --root=debian/openmc --install-layout=deb + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") + else() + install(CODE "execute_process( + COMMAND ${PYTHON_EXECUTABLE} setup.py install + --prefix=${CMAKE_INSTALL_PREFIX} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") + endif() endif() #=============================================================================== From ba3a6689b90fd729236f710d03dd23c6ad009dbd Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 20:31:57 -0600 Subject: [PATCH 511/519] Fix integer kind on arguments to h5tget_size_f and h5tset_size_f --- src/hdf5_interface.F90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 656039d197..fc7a462e6a 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -1483,7 +1483,7 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: n + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1544,8 +1544,8 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: size - integer(HSIZE_T) :: n + integer(SIZE_T) :: size + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1628,7 +1628,7 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: n + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O @@ -1644,7 +1644,7 @@ contains ! Create datatype in memory based on Fortran character call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) - call h5tset_size_f(memtype, int(len(buffer(1)), HSIZE_T), hdf5_err) + call h5tset_size_f(memtype, int(len(buffer(1)), SIZE_T), hdf5_err) ! Create dataspace/dataset call h5screate_simple_f(1, dims, dspace, hdf5_err) @@ -1706,8 +1706,8 @@ contains integer(HID_T) :: dspace ! data or file space handle integer(HID_T) :: filetype integer(HID_T) :: memtype - integer(HSIZE_T) :: size - integer(HSIZE_T) :: n + integer(SIZE_T) :: size + integer(SIZE_T) :: n type(c_ptr) :: f_ptr ! Set up collective vs. independent I/O From 01f2e8372ee8017826ad34be66fbc06c2442942b Mon Sep 17 00:00:00 2001 From: "wbinventor@gmail.com" Date: Mon, 7 Dec 2015 15:35:36 -0500 Subject: [PATCH 512/519] Changed MGXS Library keff storage based on runmode of k-eigenvalue --- openmc/mgxs/library.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ebf4050773..0b22e38718 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -373,7 +373,7 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry - if statepoint.run_mode == 'k-effective': + if statepoint.run_mode == 'k-eigenvalue': self._keff = statepoint.k_combined[0] # Load tallies for each MGXS for each domain and mgxs type From 62ddd33b5b753305ff89daa9c5d3eb7ec6429884 Mon Sep 17 00:00:00 2001 From: Bryan Herman Date: Fri, 4 Dec 2015 21:39:00 -0500 Subject: [PATCH 513/519] add RPATH information for installed exe --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 57a49508b3..5ad537e10a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,6 +235,14 @@ if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/xml/fox/.git) endif() add_subdirectory(src/xml/fox) +#=============================================================================== +# RPATH information +#=============================================================================== + +# add the automatically determined parts of the RPATH +# which point to directories outside the build tree to the install RPATH +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + #=============================================================================== # Build OpenMC executable #=============================================================================== From 36f633c453205f863ba2881692c3b0eb45d5fdc6 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 30 Oct 2015 08:13:20 -0500 Subject: [PATCH 514/519] Incremented version. Added release notes for 0.7.1. --- docs/source/conf.py | 2 +- docs/source/releasenotes.rst | 83 +++++++++++++++++++++++------------- setup.py | 2 +- src/constants.F90 | 2 +- 4 files changed, 56 insertions(+), 33 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 79a7604e39..118ff2c03b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -55,7 +55,7 @@ copyright = u'2011-2015, Massachusetts Institute of Technology' # The short X.Y version. version = "0.7" # The full version, including alpha/beta/rc tags. -release = "0.7.0" +release = "0.7.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/releasenotes.rst b/docs/source/releasenotes.rst index dffc17201f..7320781e2b 100644 --- a/docs/source/releasenotes.rst +++ b/docs/source/releasenotes.rst @@ -1,9 +1,30 @@ .. _releasenotes: ============================== -Release Notes for OpenMC 0.7.0 +Release Notes for OpenMC 0.7.1 ============================== +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. + +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. + +.. 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. + ------------------- System Requirements ------------------- @@ -17,36 +38,41 @@ the problem at hand (mostly on the number of nuclides in the problem). New Features ------------ -- Complete Python API -- Python 3 compatability for all scripts -- All scripts consistently named openmc-* and installed together -- New 'distribcell' tally filter for repeated cells -- Ability to specify outer lattice universe -- XML input validation utility (openmc-validate-xml) -- Support for hexagonal lattices -- Material union energy grid method -- Tally triggers -- Remove dependence on PETSc -- Significant OpenMP performance improvements -- Support for Fortran 2008 MPI interface -- Use of Travis CI for continuous integration -- Simplifications and improvements to test suite +- 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 --------- Bug Fixes --------- -- b5f712_: Fix bug in spherical harmonics tallies -- e6675b_: Ensure all constants are double precision -- 04e2c1_: Fix potential bug in sample_nuclide routine -- 6121d9_: Fix bugs related to particle track files -- 2f0e89_: Fixes for nuclide specification in tallies +- 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 -.. _b5f712: https://github.com/mit-crpg/openmc/commit/b5f712 -.. _e6675b: https://github.com/mit-crpg/openmc/commit/e6675b -.. _04e2c1: https://github.com/mit-crpg/openmc/commit/04e2c1 -.. _6121d9: https://github.com/mit-crpg/openmc/commit/6121d9 -.. _2f0e89: https://github.com/mit-crpg/openmc/commit/2f0e89 +.. _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 ------------ Contributors @@ -55,13 +81,10 @@ Contributors This release contains new contributions from the following people: - `Will Boyd `_ -- `Matt Ellis `_ - `Sterling Harper `_ -- `Bryan Herman `_ -- `Nicholas Horelik `_ - `Colin Josey `_ -- `William Lyu `_ - `Adam Nelson `_ - `Paul Romano `_ -- `Anthony Scopatz `_ +- `Kelly Rowland `_ +- `Sam Shaner `_ - `Jon Walsh `_ diff --git a/setup.py b/setup.py index 0c3d5c116f..907d80e31b 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ except ImportError: have_setuptools = False kwargs = {'name': 'openmc', - 'version': '0.7.0', + 'version': '0.7.1', 'packages': ['openmc', 'openmc.mgxs'], 'scripts': glob.glob('scripts/openmc-*'), diff --git a/src/constants.F90 b/src/constants.F90 index 375c517e76..ba77f35aba 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -8,7 +8,7 @@ module constants ! OpenMC major, minor, and release numbers integer, parameter :: VERSION_MAJOR = 0 integer, parameter :: VERSION_MINOR = 7 - integer, parameter :: VERSION_RELEASE = 0 + integer, parameter :: VERSION_RELEASE = 1 ! Revision numbers for binary files integer, parameter :: REVISION_STATEPOINT = 14 From 6800f8ed219f63871527b8c32450e1ffe3c10e4c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 4 Dec 2015 14:02:10 -0600 Subject: [PATCH 515/519] Update list of publications in documentation --- docs/source/publications.rst | 63 ++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/docs/source/publications.rst b/docs/source/publications.rst index 79d089605c..369b9d9775 100644 --- a/docs/source/publications.rst +++ b/docs/source/publications.rst @@ -26,6 +26,10 @@ Overviews Benchmarking ------------ +- Khurrum S. Chaudri and Sikander M. Mirza, "Burnup dependent Monte Carlo + neutron physics calculations of IAEA MTR benchmark," *Prog. Nucl. Energy*, + **81**, 43-52 (2015). ``_ + - Daniel J. Kelly, Brian N. Aviles, Paul K. Romano, Bryan R. Herman, Nicholas E. Horelik, and Benoit Forget, "Analysis of select BEAVRS PWR benchmark cycle 1 results using MC21 and OpenMC," *Proc. PHYSOR*, Kyoto, @@ -57,13 +61,8 @@ Coupling and Multi-physics - Bryan R. Herman, Benoit Forget, and Kord Smith, "Progress toward Monte Carlo-thermal hydraulic coupling using low-order nonlinear diffusion - acceleration methods." In press, *Ann. Nucl. Energy*, - (2014). ``_ - -- Adam G. Nelson and William R. Martin, "Improved Convergence of Monte Carlo - Generated Multi-Group Scattering Moments," *Proc. Int. Conf. Mathematics and - Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley, - Idaho, May 5--9 (2013). + acceleration methods." *Ann. Nucl. Energy*, **84**, 63-72 + (2015). ``_ - Bryan R. Herman, Benoit Forget, and Kord Smith, "Utilizing CMFD in OpenMC to Estimate Dominance Ratio and Adjoint," *Trans. Am. Nucl. Soc.*, **109**, @@ -81,19 +80,65 @@ Geometry Miscellaneous ------------- +- 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. + +- Qicang Shen, William Boyd, Benoit Forget, and Kord Smith, "Tally precision + triggers for the OpenMC Monte Carlo code," *Trans. Am. Nucl. Soc.*, **112**, + 637-640 (2015). + - Timothy P. Burke, Brian C. Kiedrowski, and William R. Martin, "Flux and Reaction Rate Kernel Density Estimators in OpenMC," *Trans. Am. Nucl. Soc.*, **109**, 683-686 (2013). +------------------------------------ +Multi-group Cross Section Generation +------------------------------------ + +- 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) + +- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of + multi-group scattering moment matrices," *Trans. Am. Nucl. Soc.*, **110**, + 217-220 (2014). + +- Adam G. Nelson and William R. Martin, "Improved Convergence of Monte Carlo + Generated Multi-Group Scattering Moments," *Proc. Int. Conf. Mathematics and + Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley, + Idaho, May 5--9 (2013). + ------------ Nuclear Data ------------ +- Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed multipole + for cross section Doppler broadening," *J. Comput. Phys.*, In Press + (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). ``_ + +- 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 + (2015). ``_ + - Jonathan A. Walsh, Benoit Forget, Kord S. Smith, Brian C. Kiedrowski, and Forrest B. Brown, "Direct, on-the-fly calculation of unresolved resonance region cross sections in Monte Carlo simulations," *Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). +- Amanda L. Lund, Andrew R. Siegel, Benoit Forget, Colin Josey, and + Paul K. Romano, "Using fractional cascading to accelerate cross section + lookups in Monte Carlo particle transport calculations," *Proc. Joint + Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015). + +- Ronald O. Rahaman, Andrew R. Siegel, and Paul K. Romano, "Monte Carlo + 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). ``_ @@ -114,6 +159,10 @@ Nuclear Data 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. + - David Ozog, Allen D. Malony, and Andrew R. Siegel, "A performance analysis of SIMD algorithms for Monte Carlo simulations of nuclear reactor cores," *Proc. IEEE Int. Parallel and Distributed Processing Symposium*, Hyderabad, From 9cde4ce12c10b6acacacbee310cd08f19623d955 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 7 Dec 2015 22:16:15 -0600 Subject: [PATCH 516/519] Clarify installation instructions for HDF5 pre-req and Ubuntu PPA --- docs/source/usersguide/install.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index dcf990bdad..e3f0df5e91 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -8,7 +8,7 @@ Installation and Configuration Installing on Ubuntu with PPA ----------------------------- -For users with Ubuntu 11.10 or later, a binary package for OpenMC is available +For users with Ubuntu 15.04 or later, a binary package for OpenMC is available through a Personal Package Archive (PPA) and can be installed through the APT package manager. First, add the following PPA to the repository sources: @@ -28,6 +28,9 @@ Now OpenMC should be recognized within the repository and can be installed: sudo apt-get install openmc +Binary packages from this PPA may exist for earlier versions of Ubuntu, but they +are no longer supported. + -------------------- Building from Source -------------------- @@ -74,6 +77,12 @@ Prerequisites You may omit ``--enable-parallel`` if you want to compile HDF5_ in serial. + .. important:: + + OpenMC uses various parts of the HDF5 Fortran 2003 API; as such you + must include ``--enable-fortran2003`` or else OpenMC will not be able + to compile. + On Debian derivatives, HDF5 and/or parallel HDF5 can be installed through the APT package manager: From f84a4ee4309d76200981c92896f28e8fa1bb8ad3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 8 Dec 2015 07:19:31 -0600 Subject: [PATCH 517/519] Avoid DeprecationWarning from xml.etree.Element.getchildren() --- openmc/clean_xml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index aefd30ac7b..564281a5cc 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -1,7 +1,7 @@ def sort_xml_elements(tree): # Retrieve all children of the root XML node in the tree - elements = tree.getchildren() + elements = list(tree) # Initialize empty lists for the sorted and comment elements sorted_elements = [] From 5f08f922824283052b132aecde8ce27b1300b391 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 14 Dec 2015 07:36:22 -0600 Subject: [PATCH 518/519] Fix bug in Complement.bounding_box. Also remove a few unused variables --- openmc/region.py | 4 +++- src/state_point.F90 | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/region.py b/openmc/region.py index b7cfbca7b8..7589184aa5 100644 --- a/openmc/region.py +++ b/openmc/region.py @@ -355,6 +355,8 @@ class Complement(Region): temp_region = Intersection(*[~n for n in self.node.nodes]) elif isinstance(self.node, Intersection): temp_region = Union(*[~n for n in self.node.nodes]) + elif isinstance(self.node, Complement): + temp_region = self.node.node else: - temp_region = ~n + temp_region = ~self.node return temp_region.bounding_box diff --git a/src/state_point.F90 b/src/state_point.F90 index 046e7e6669..f9f4b5b757 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -870,7 +870,6 @@ contains integer(HSIZE_T) :: dims(1) type(c_ptr) :: f_ptr #ifdef PHDF5 - integer :: data_xfer_mode integer(HID_T) :: plist ! property list #else integer :: i @@ -989,7 +988,6 @@ contains integer(HSIZE_T) :: offset(1) ! offset of data type(c_ptr) :: f_ptr #ifdef PHDF5 - integer :: data_xfer_mode integer(HID_T) :: plist ! property list #endif From 97fd5e191d62ddd5687a8e8b3e301cdc6c1f0bd2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 23 Dec 2015 10:51:21 -0600 Subject: [PATCH 519/519] Add Bryan Herman to release notes --- docs/source/releasenotes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/releasenotes.rst b/docs/source/releasenotes.rst index 7320781e2b..65309fd70a 100644 --- a/docs/source/releasenotes.rst +++ b/docs/source/releasenotes.rst @@ -82,6 +82,7 @@ This release contains new contributions from the following people: - `Will Boyd `_ - `Sterling Harper `_ +- `Bryan Herman `_ - `Colin Josey `_ - `Adam Nelson `_ - `Paul Romano `_