diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 7e310857c..e364452b1 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -293,6 +293,7 @@ Multi-group Cross Sections openmc.mgxs.NuScatterXS openmc.mgxs.NuScatterMatrixXS openmc.mgxs.PromptNuFissionXS + openmc.mgxs.PromptNuFissionMatrixXS openmc.mgxs.ScatterXS openmc.mgxs.ScatterMatrixXS openmc.mgxs.TotalXS @@ -309,6 +310,7 @@ Multi-delayed-group Cross Sections openmc.mgxs.MDGXS openmc.mgxs.ChiDelayed openmc.mgxs.DelayedNuFissionXS + openmc.mgxs.DelayedNuFissionMatrixXS openmc.mgxs.Beta openmc.mgxs.DecayRate diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index f6bf4dab2..08e0bb404 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -514,7 +514,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', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', chi', 'chi-prompt', 'inverse-velocity', 'prompt-nu-fission', 'delayed-nu-fission', 'chi-delayed', 'beta'} + mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', chi', 'chi-prompt', 'inverse-velocity', 'prompt-nu-fission', 'prompt-nu-fission matrix', 'delayed-nu-fission', 'delayed-nu-fission matrix', 'chi-delayed', 'beta'} The type of multi-group cross section object to return Returns @@ -975,12 +975,24 @@ class Library(object): nuclide=[nuclide], subdomain=subdomain) + if 'prompt-nu-fission matrix' in self.mgxs_types: + mymgxs = self.get_mgxs(domain, 'prompt-nu-fission matrix') + xsdata.set_prompt_nu_fission_mgxs(mymgxs, xs_type=xs_type, + nuclide=[nuclide], + subdomain=subdomain) + if 'delayed-nu-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'delayed-nu-fission') xsdata.set_delayed_nu_fission_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], subdomain=subdomain) + if 'delayed-nu-fission matrix' in self.mgxs_types: + mymgxs = self.get_mgxs(domain, 'delayed-nu-fission matrix') + xsdata.set_delayed_nu_fission_mgxs(mymgxs, xs_type=xs_type, + nuclide=[nuclide], + subdomain=subdomain) + if 'beta' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission') xsdata.set_beta_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index a99a99bee..5b2f451c2 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -21,7 +21,8 @@ import openmc.checkvalue as cv MDGXS_TYPES = ['delayed-nu-fission', 'chi-delayed', 'beta', - 'decay-rate'] + 'decay-rate', + 'delayed-nu-fission matrix'] # Maximum number of delayed groups, from src/constants.F90 MAX_DELAYED_GROUPS = 8 @@ -211,7 +212,7 @@ class MDGXS(MGXS): Parameters ---------- - mdgxs_type : {'delayed-nu-fission', 'chi-delayed', 'beta', 'decay-rate'} + mdgxs_type : {'delayed-nu-fission', 'chi-delayed', 'beta', 'decay-rate', 'delayed-nu-fission matrix'} The type of multi-delayed-group cross section object to return domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh @@ -249,6 +250,9 @@ class MDGXS(MGXS): mdgxs = Beta(domain, domain_type, energy_groups, delayed_groups) elif mdgxs_type == 'decay-rate': mdgxs = DecayRate(domain, domain_type, energy_groups, delayed_groups) + elif mdgxs_type == 'delayed-nu-fission matrix': + mdgxs = DelayedNuFissionMatrixXS(domain, domain_type, energy_groups, + delayed_groups) mdgxs.by_nuclide = by_nuclide mdgxs.name = name @@ -1733,3 +1737,609 @@ class DecayRate(MDGXS): super(DecayRate, self)._compute_xs() return self._xs_tally + + +@add_metaclass(ABCMeta) +class MatrixMDGXS(MDGXS): + """An abstract multi-delayed-group cross section for some energy group and + delayed group structure within some spatial domain. This class is + specifically intended for cross sections which depend on both the incoming + and outgoing energy groups and are therefore represented by matrices. + An example of this is the delayed-nu-fission matrix. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group and multi-delayed-group cross sections for downstream neutronics + calculations. + + NOTE: Users should instantiate the subclasses of this abstract class. + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + energy_groups : openmc.mgxs.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. + delayed_groups : list of int + Delayed groups to filter out the xs + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : list of int + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'collision', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. 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) and the number of mesh cells for + 'mesh' domain types. + num_nuclides : int + 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 : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + @property + def filters(self): + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy = openmc.EnergyFilter(group_edges) + energyout = openmc.EnergyoutFilter(group_edges) + + if self.delayed_groups is not None: + delayed = openmc.DelayedGroupFilter(self.delayed_groups) + return [[energy], [delayed, energy, energyout]] + else: + return [[energy], [energy, energyout]] + + def get_xs(self, in_groups='all', out_groups='all', + subdomains='all', nuclides='all', + xs_type='macro', order_groups='increasing', + row_column='inout', value='mean', delayed_groups='all', + squeeze=True, **kwargs): + """Returns an array of multi-group cross sections. + + This method constructs a 4D NumPy array for the requested + multi-group cross section data for one or more subdomains + (1st dimension), delayed groups (2nd dimension), energy groups in + (3rd dimension), energy groups out (4th dimension), and nuclides + (5th dimension). + + Parameters + ---------- + in_groups : Iterable of Integral or 'all' + Incoming energy groups of interest. Defaults to 'all'. + out_groups : Iterable of Integral or 'all' + Outgoing energy groups of interest. Defaults to 'all'. + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest. Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U235', 'U238']). The + special string 'all' will return the cross sections for all + nuclides in the spatial domain. The special string 'sum' will + return the cross section summed over all nuclides. Defaults to + 'all'. + xs_type: {'macro', 'micro'} + 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 or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. + row_column: {'inout', 'outin'} + Return the cross section indexed first by incoming group and + second by outgoing group ('inout'), or vice versa ('outin'). + Defaults to 'inout'. + value : {'mean', 'std_dev', 'rel_err'} + A string for the type of value to return. Defaults to 'mean'. + delayed_groups : list of int or 'all' + Delayed groups of interest. Defaults to 'all'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array to be returned. Defaults to True. + + Returns + ------- + numpy.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. + + """ + + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + # FIXME: Unable to get microscopic xs for mesh domain because the mesh + # cells do not know the nuclide densities in each mesh cell. + if self.domain_type == 'mesh' and xs_type == 'micro': + msg = 'Unable to get micro xs for mesh domain since the mesh ' \ + 'cells do not know the nuclide densities in each mesh cell.' + raise ValueError(msg) + + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if not isinstance(subdomains, string_types): + cv.check_iterable_type('subdomains', subdomains, Integral, + max_depth=3) + for subdomain in subdomains: + filters.append(_DOMAIN_TO_FILTER[self.domain_type]) + filter_bins.append((subdomain,)) + + # Construct list of energy group bounds tuples for all requested groups + if not isinstance(in_groups, string_types): + cv.check_iterable_type('groups', in_groups, Integral) + for group in in_groups: + filters.append(openmc.EnergyFilter) + filter_bins.append(( + self.energy_groups.get_group_bounds(group),)) + + # Construct list of energy group bounds tuples for all requested groups + if not isinstance(out_groups, string_types): + cv.check_iterable_type('groups', out_groups, Integral) + for group in out_groups: + filters.append(openmc.EnergyoutFilter) + filter_bins.append(( + self.energy_groups.get_group_bounds(group),)) + + # Construct list of delayed group tuples for all requested groups + if not isinstance(delayed_groups, string_types): + cv.check_type('delayed groups', delayed_groups, list, int) + for delayed_group in delayed_groups: + filters.append(openmc.DelayedGroupFilter) + filter_bins.append((delayed_group,)) + + # Construct a collection of the nuclides to retrieve from the xs tally + if self.by_nuclide: + if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: + query_nuclides = self.get_nuclides() + else: + query_nuclides = nuclides + else: + 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) + + # 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] + + # Eliminate the trivial score dimension + xs = np.squeeze(xs, axis=len(xs.shape) - 1) + xs = np.nan_to_num(xs) + + 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) + + if delayed_groups == 'all': + num_delayed_groups = self.num_delayed_groups + else: + num_delayed_groups = len(delayed_groups) + + # Reshape tally data array with separate axes for domain and energy + num_subdomains = int(xs.shape[0] / (num_in_groups * num_out_groups * + num_delayed_groups)) + new_shape = (num_subdomains, num_delayed_groups, num_in_groups, + num_out_groups) + new_shape += xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Transpose the matrix if requested by user + if row_column == 'outin': + xs = np.swapaxes(xs, 2, 3) + + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + xs = xs[:, :, ::-1, ::-1, :] + + if squeeze: + xs = np.squeeze(xs) + xs = np.atleast_2d(xs) + + return xs + + def get_slice(self, nuclides=[], in_groups=[], out_groups=[], + delayed_groups=[]): + """Build a sliced MatrixMDGXS object for the specified nuclides and + energy groups. + + This method constructs a new MdGXS to encapsulate a subset of the data + represented by this MdGXS. The subset of data to include in the tally + slice is determined by the nuclides, energy groups, and delayed groups + specified in the input parameters. + + Parameters + ---------- + nuclides : list of str + A list of nuclide name strings + (e.g., ['U235', 'U238']; default is []) + in_groups : list of int + A list of incoming energy group indices starting at 1 for the high + energies (e.g., [1, 2, 3]; default is []) + out_groups : list of int + A list of outgoing energy group indices starting at 1 for the high + energies (e.g., [1, 2, 3]; default is []) + delayed_groups : list of int + A list of delayed group indices + (e.g., [1, 2, 3]; default is []) + + Returns + ------- + openmc.mgxs.MatrixMDGXS + A new MatrixMDGXS object which encapsulates the subset of data + requested for the nuclide(s) and/or energy group(s) requested in + the parameters. + + """ + + # Call super class method and null out derived tallies + slice_xs = super(MatrixMDGXS, self).get_slice(nuclides, in_groups, + delayed_groups) + slice_xs._rxn_rate_tally = None + slice_xs._xs_tally = None + + # Slice outgoing energy groups if needed + if len(out_groups) != 0: + filter_bins = [] + for group in out_groups: + group_bounds = self.energy_groups.get_group_bounds(group) + filter_bins.append(group_bounds) + filter_bins = [tuple(filter_bins)] + + # Slice each of the tallies across energyout groups + for tally_type, tally in slice_xs.tallies.items(): + if tally.contains_filter(openmc.EnergyoutFilter): + tally_slice = tally.get_slice( + filters=[openmc.EnergyoutFilter], + filter_bins=filter_bins) + slice_xs.tallies[tally_type] = tally_slice + + slice_xs.sparse = self.sparse + return slice_xs + + def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): + """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. + 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., ['U235', 'U238']). + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will + report the cross sections summed over all nuclides. Defaults to + 'all'. + xs_type: {'macro', 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + + """ + + # Construct a collection of the subdomains to report + if not isinstance(subdomains, string_types): + cv.check_iterable_type('subdomains', subdomains, Integral) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + xyz = [range(1, x+1) for x in self.domain.dimension] + subdomains = list(itertools.product(*xyz)) + else: + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_nuclides() + if nuclides == 'sum': + nuclides = ['sum'] + else: + cv.check_iterable_type('nuclides', nuclides, string_types) + else: + nuclides = ['sum'] + + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + # Build header for string with type and domain info + string = 'Multi-Delayed-Group XS\n' + 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) + + # Generate the header for an individual XS + xs_header = '\tCross Sections [{0}]:'.format(self.get_units(xs_type)) + + # If cross section data has not been computed, only print string header + if self.tallies is None: + print(string) + return + + 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 all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += '{: <16}=\t{}\n'.format('\tSubdomain', subdomain) + + # Loop over all Nuclides + for nuclide in nuclides: + + # Build header for nuclide type + if xs_type != 'sum': + string += '{: <16}=\t{}\n'.format('\tNuclide', nuclide) + + # Build header for cross section type + string += '{: <16}\n'.format(xs_header) + + if self.delayed_groups is not None: + + for delayed_group in self.delayed_groups: + + template = '{0: <12}Delayed Group {1}:\t' + string += template.format('', delayed_group) + string += '\n' + + 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], [nuclide], + xs_type=xs_type, + value='mean', + delayed_groups=[delayed_group]) + rel_err = self.get_xs([in_group], [out_group], + [subdomain], [nuclide], + xs_type=xs_type, + value='rel_err', + delayed_groups=[delayed_group]) + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. + string += '{:.2e} +/- {:.2e}%'.format(average, + rel_err) + string += '\n' + string += '\n' + string += '\n' + else: + + 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], [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') + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. + string += '{:.2e} +/- {:.2e}%'.format(average, + rel_err) + string += '\n' + string += '\n' + string += '\n' + string += '\n' + + print(string) + + +class DelayedNuFissionMatrixXS(MatrixMDGXS): + r"""A fission delayed neutron production matrix multi-group cross section. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group fission neutron production cross sections for multi-group + neutronics calculations. At a minimum, one needs to set the + :attr:`DelayedNuFissionMatrixXS.energy_groups` and + :attr:`DelayedNuFissionMatrixXS.domain` properties. Tallies for the flux and + appropriate reaction rates over the specified domain are generated + automatically via the :attr:`DelayedNuFissionMatrixXS.tallies` property, + which can then be appended to a :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`DelayedNuFissionMatrixXS.xs_tally` + property. + + For a spatial domain :math:`V`, energy group :math:`[E_g,E_{g-1}]`, and + delayed group :math:`d`, the fission delayed neutron production cross + section is calculated as: + + .. math:: + + \langle \nu\sigma_{f,g'\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_{E_{g'}}^{E_{g'-1}} dE' \int_{E_g}^{E_{g-1}} dE + \; \chi(E) \nu\sigma_f^d (r, E') \psi(r, E', \Omega')\\ + \langle \phi \rangle &= \int_{r \in V} dr \int_{4\pi} d\Omega + \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega) \\ + \nu\sigma_{f,g'\rightarrow g} &= \frac{\langle \nu\sigma_{f,g'\rightarrow + g}^d \phi \rangle}{\langle \phi \rangle} + + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.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. + delayed_groups : list of int + Delayed groups to filter out the xs + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : list of int + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`DelayedNuFissionXS.tally_keys` property + and values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + 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 : int + 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 : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, energy_groups=None, + delayed_groups=None, by_nuclide=False, name=''): + super(DelayedNuFissionMatrixXS, self).__init__(domain, domain_type, + energy_groups, + delayed_groups, + by_nuclide, name) + self._rxn_type = 'delayed-nu-fission' + self._hdf5_key = 'delayed-nu-fission matrix' + self._estimator = 'analog' + self._valid_estimators = ['analog'] diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index cf7efc51e..1936697ee 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -36,7 +36,8 @@ MGXS_TYPES = ['total', 'chi', 'chi-prompt', 'inverse-velocity', - 'prompt-nu-fission'] + 'prompt-nu-fission', + 'prompt-nu-fission matrix'] # Supported domain types DOMAIN_TYPES = ['cell', @@ -448,7 +449,7 @@ class MGXS(object): Parameters ---------- - mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', 'chi', 'chi-prompt', 'inverse-velocity', 'prompt-nu-fission'} + mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', 'chi', 'chi-prompt', 'inverse-velocity', 'prompt-nu-fission', 'prompt-nu-fission matrix'} The type of multi-group cross section object to return domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization @@ -509,6 +510,8 @@ class MGXS(object): mgxs = InverseVelocity(domain, domain_type, energy_groups) elif mgxs_type == 'prompt-nu-fission': mgxs = PromptNuFissionXS(domain, domain_type, energy_groups) + elif mgxs_type == 'prompt-nu-fission matrix': + mgxs = PromptNuFissionMatrixXS(domain, domain_type, energy_groups) mgxs.by_nuclide = by_nuclide mgxs.name = name @@ -1752,7 +1755,7 @@ class MatrixMGXS(MGXS): Returns ------- - ndarray + numpy.ndarray A NumPy array of the multi-group cross section indexed in the order each group and subdomain is listed in the parameters. @@ -3587,7 +3590,7 @@ class ScatterMatrixXS(MatrixMGXS): Returns ------- - ndarray + numpy.ndarray A NumPy array of the multi-group cross section indexed in the order each group and subdomain is listed in the parameters. @@ -5132,3 +5135,120 @@ class PromptNuFissionXS(MGXS): super(PromptNuFissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'prompt-nu-fission' + + +class PromptNuFissionMatrixXS(MatrixMGXS): + r"""A prompt fission neutron production matrix multi-group cross section. + + 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 multi-group neutronics calculations. At a + minimum, one needs to set the :attr:`PromptNuFissionMatrixXS.energy_groups` + and :attr:`PromptNuFissionMatrixXS.domain` properties. Tallies for the flux + and appropriate reaction rates over the specified domain are generated + automatically via the :attr:`PromptNuFissionMatrixXS.tallies` property, + which can then be appended to a :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`PromptNuFissionMatrixXS.xs_tally` + property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission spectrum is calculated as: + + .. math:: + + \langle \nu\sigma_{f,g'\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_{E_{g'}}^{E_{g'-1}} dE' \int_{E_g}^{E_{g-1}} dE + \; \chi(E) \nu\sigma_f^p (r, E') \psi(r, E', \Omega')\\ + \langle \phi \rangle &= \int_{r \in V} dr \int_{4\pi} d\Omega + \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega) \\ + \nu\sigma_{f,g'\rightarrow g} &= \frac{\langle \nu\sigma_{f,g'\rightarrow + g}^p \phi \rangle}{\langle \phi \rangle} + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.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. + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'collision', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`PromptNuFissionXS.tally_keys` property + and values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. 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 : int + 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 : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, + groups=None, by_nuclide=False, name=''): + super(PromptNuFissionMatrixXS, self).__init__(domain, domain_type, + groups, by_nuclide, name) + self._rxn_type = 'prompt-nu-fission' + self._hdf5_key = 'prompt-nu-fission matrix' + self._estimator = 'analog' + self._valid_estimators = ['analog'] diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index adfabe022..3f3a38b06 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -16,7 +16,7 @@ from openmc.checkvalue import check_type, check_value, check_greater_than, \ _REPRESENTATIONS = ['isotropic', 'angle'] _SCATTER_TYPES = ['tabular', 'legendre', 'histogram'] _XS_SHAPES = ["[Order][G][G']", "[G]", "[G']", "[G][G']", "[DG]", "[G][DG]", - "[G'][DG]"] + "[G'][DG]", "[G][G'][DG]"] class XSdata(object): @@ -137,11 +137,11 @@ class XSdata(object): [Order][G][G']: scatter_matrix [G]: total, absorption, fission, kappa_fission, nu_fission, - prompt_nu_fission, inverse_velocity + prompt_nu_fission, delayed_nu_fission, inverse_velocity [G']: chi, chi_prompt, chi_delayed - [G][G']: multiplicity_matrix, nu_fission + [G][G']: multiplicity_matrix, nu_fission, prompt_nu_fission [DG]: beta, decay_rate @@ -149,6 +149,8 @@ class XSdata(object): [G'][DG]: chi_delayed + [G][G'][DG]: delayed_nu_fission + """ def __init__(self, name, energy_groups, temperatures=[294.], @@ -298,6 +300,10 @@ class XSdata(object): self.num_delayed_groups) self._xs_shapes["[G'][DG]"] = (self.energy_groups.num_groups, self.num_delayed_groups) + self._xs_shapes["[G][G'][DG]"] = (self.energy_groups.num_groups, + self.energy_groups.num_groups, + self.num_delayed_groups) + self._xs_shapes["[Order][G][G']"] \ = (self.num_orders, self.energy_groups.num_groups, self.energy_groups.num_groups) @@ -816,7 +822,7 @@ class XSdata(object): """ # Get the accepted shapes for this xs - shapes = [self.xs_shapes["[G]"]] + shapes = [self.xs_shapes["[G]"], self.xs_shapes["[G][G']"]] # Convert to a numpy array so we can easily get the shape for checking prompt_nu_fission = np.asarray(prompt_nu_fission) @@ -850,7 +856,7 @@ class XSdata(object): """ # Get the accepted shapes for this xs - shapes = [self.xs_shapes["[G][DG]"]] + shapes = [self.xs_shapes["[G][DG]"], self.xs_shapes["[G][G'][DG]"]] # Convert to a numpy array so we can easily get the shape for checking delayed_nu_fission = np.asarray(delayed_nu_fission) @@ -1086,12 +1092,15 @@ class XSdata(object): def set_prompt_nu_fission_mgxs(self, prompt_nu_fission, temperature=294., nuclide='total', xs_type='macro', subdomain=None): - """This method allows for an openmc.mgxs.PromptNuFissionXS to be used to - set the prompt-nu-fission cross section for this XSdata object. + """Sets the prompt-nu-fission cross section. + + This method allows for an openmc.mgxs.PromptNuFissionXS or + openmc.mgxs.PromptNuFissionMatrixXS to be used to set the + prompt-nu-fission cross section for this XSdata object. Parameters ---------- - prompt_nu_fission: openmc.mgxs.PromptNuFissionXS + prompt_nu_fission: openmc.mgxs.PromptNuFissionXS or openmc.mgxs.PromptNuFissionMatrixXS MGXS Object containing the prompt-nu-fission cross section for the domain of interest. temperature : float @@ -1115,7 +1124,8 @@ class XSdata(object): """ check_type('prompt_nu_fission', prompt_nu_fission, - (openmc.mgxs.PromptNuFissionXS,)) + (openmc.mgxs.PromptNuFissionXS, + openmc.mgxs.PromptNuFissionMatrixXS)) check_value('energy_groups', prompt_nu_fission.energy_groups, [self.energy_groups]) check_value('domain_type', prompt_nu_fission.domain_type, @@ -1139,12 +1149,13 @@ class XSdata(object): def set_delayed_nu_fission_mgxs(self, delayed_nu_fission, temperature=294., nuclide='total', xs_type='macro', subdomain=None): - """This method allows for an openmc.mgxs.DelayedNuFissionXS to be used - to set the delayed-nu-fission cross section for this XSdata object. + """This method allows for an openmc.mgxs.DelayedNuFissionXS or + openmc.mgxs.DelayedNuFissionMatrixXS to be used to set the + delayed-nu-fission cross section for this XSdata object. Parameters ---------- - delayed_nu_fission: openmc.mgxs.DelayedNuFissionXS + delayed_nu_fission: openmc.mgxs.DelayedNuFissionXS or openmc.mgxs.DelayedNuFissionMatrixXS MGXS Object containing the delayed-nu-fission cross section for the domain of interest. temperature : float @@ -1168,7 +1179,8 @@ class XSdata(object): """ check_type('delayed_nu_fission', delayed_nu_fission, - (openmc.mgxs.DelayedNuFissionXS,)) + (openmc.mgxs.DelayedNuFissionXS, + openmc.mgxs.DelayedNuFissionMatrixXS)) check_value('energy_groups', delayed_nu_fission.energy_groups, [self.energy_groups]) check_value('num_delayed_groups', delayed_nu_fission.num_delayed_groups, diff --git a/src/mgxs_header.F90 b/src/mgxs_header.F90 index 17104d508..d536a587e 100644 --- a/src/mgxs_header.F90 +++ b/src/mgxs_header.F90 @@ -434,7 +434,7 @@ module mgxs_header integer :: ndims integer(HSIZE_T) :: dims(2) real(8), allocatable :: temp_arr(:), temp_2d(:, :) - real(8), allocatable :: temp_beta(:, :) + real(8), allocatable :: temp_beta(:, :), temp_3d(:, :, :) real(8) :: dmu, mu, norm, chi_sum integer :: order, order_dim, gin, gout, l, imu, length type(VectorInt) :: temps_to_read @@ -767,9 +767,57 @@ module mgxs_header ! If prompt-nu-fission present, set prompt-nu-fission if (object_exists(xsdata_grp, "prompt-nu-fission")) then - ! Set prompt-nu-fission - call read_dataset(xs % prompt_nu_fission, xsdata_grp, & - "prompt-nu-fission") + ! Get the dimensions of the prompt-nu-fission dataset + xsdata = open_dataset(xsdata_grp, "prompt-nu-fission") + call get_ndims(xsdata, ndims) + + ! If prompt-nu-fission is a vector + if (ndims == 1) then + + ! Set prompt_nu_fission + call read_dataset(xs % prompt_nu_fission, xsdata_grp, & + "prompt-nu-fission") + + ! If prompt-nu-fission is a matrix, set prompt_nu_fission and + ! chi_prompt. + else if (ndims == 2) then + + ! chi_prompt is embedded in prompt_nu_fission -> extract + ! chi_prompt + allocate(temp_arr(energy_groups * energy_groups)) + call read_dataset(temp_arr, xsdata_grp, "prompt-nu-fission") + allocate(temp_2d(energy_groups, energy_groups)) + temp_2d = reshape(temp_arr, (/energy_groups, energy_groups/)) + + ! Deallocate temporary 1D array for prompt_nu_fission matrix + deallocate(temp_arr) + + ! Set the vector prompt-nu-fission from the matrix + ! prompt-nu-fission + do gin = 1, energy_groups + xs % prompt_nu_fission(gin) = sum(temp_2d(:, gin)) + end do + + ! Now pull out information needed for chi + xs % chi_prompt(:, :) = temp_2d + + ! Deallocate temporary 2D array for nu_fission matrix + deallocate(temp_2d) + + ! Normalize chi so its CDF goes to 1 + do gin = 1, energy_groups + chi_sum = sum(xs % chi_prompt(:, gin)) + if (chi_sum == ZERO) then + call fatal_error("Encountered chi prompt for a group & + &that sums to zero") + else + xs % chi_prompt(:, gin) = xs % chi_prompt(:, gin) / chi_sum + end if + end do + else + call fatal_error("prompt-nu-fission must be provided as a 1D & + &or 2D array") + end if end if ! If delayed-nu-fission provided, set delayed-nu-fission. If @@ -848,9 +896,52 @@ module mgxs_header ! Deallocate temporary array for delayed-nu-fission matrix deallocate(temp_arr) + ! If delayed nu-fission is a 3D matrix, set delayed_nu_fission + ! and chi_delayed. + else if (ndims == 3) then + + ! chi_delayed is embedded in delayed_nu_fission -> extract + ! chi_delayed + allocate(temp_arr(delayed_groups * energy_groups * & + energy_groups)) + call read_dataset(temp_arr, xsdata_grp, "delayed-nu-fission") + allocate(temp_3d(delayed_groups, energy_groups, energy_groups)) + temp_3d = reshape(temp_arr, (/delayed_groups, energy_groups, & + energy_groups/)) + + ! Deallocate temporary 1D array for delayed_nu_fission matrix + deallocate(temp_arr) + + ! Set the 2D delayed-nu-fission matrix and 3D chi_dealyed matrix + ! from the 3D delayed-nu-fission matrix + do dg = 1, delayed_groups + do gin = 1, energy_groups + xs % delayed_nu_fission(dg, gin) = sum(temp_3d(dg, :, gin)) + do gout = 1, energy_groups + xs % chi_delayed(dg, gout, gin) = temp_3d(dg, gout, gin) + end do + end do + end do + + ! Normalize chi_delayed so its CDF goes to 1 + do dg = 1, delayed_groups + do gin = 1, energy_groups + chi_sum = sum(xs % chi_delayed(dg, :, gin)) + if (chi_sum == ZERO) then + call fatal_error("Encountered chi delayed for a group & + &that sums to zero") + else + xs % chi_delayed(dg, :, gin) = & + xs % chi_delayed(dg, :, gin) / chi_sum + end if + end do + end do + + ! Deallocate temporary 3D matrix for delayed_nu_fission + deallocate(temp_3d) else call fatal_error("delayed-nu-fission must be provided as a & - &1D or 2D array") + &1D, 2D, or 3D array") end if end if @@ -1119,7 +1210,8 @@ module mgxs_header integer(HSIZE_T) :: dims(4) integer, allocatable :: int_arr(:) real(8), allocatable :: temp_1d(:), temp_3d(:, :, :) - real(8), allocatable :: temp_4d(:, :, :, :), temp_beta(:, :, :, :) + real(8), allocatable :: temp_4d(:, :, :, :), temp_5d(:, :, :, :, :) + real(8), allocatable :: temp_beta(:, :, :, :) real(8) :: dmu, mu, norm, chi_sum integer :: order, order_dim, gin, gout, l, imu, dg type(VectorInt) :: temps_to_read @@ -1540,16 +1632,70 @@ module mgxs_header ! If prompt-nu-fission present, set prompt-nu-fission if (object_exists(xsdata_grp, "prompt-nu-fission")) then - ! Allocate temporary array for prompt-nu-fission - allocate(temp_1d(energy_groups * this % n_azi * this % n_pol)) + ! Get the dimensions of the prompt-nu-fission dataset + xsdata = open_dataset(xsdata_grp, "prompt-nu-fission") + call get_ndims(xsdata, ndims) - ! Read prompt-nu-fission - call read_dataset(temp_1d, xsdata_grp, "prompt-nu-fission") - xs % prompt_nu_fission = reshape(temp_1d, (/energy_groups, & - this % n_azi, this % n_pol/)) + ! If prompt-nu-fission is a vector for each azi and pol + if (ndims == 3) then - ! Deallocate temporary array for prompt-nu-fission - deallocate(temp_1d) + ! Set prompt_nu_fission + call read_dataset(xs % prompt_nu_fission, xsdata_grp, & + "prompt-nu-fission") + + ! If prompt-nu-fission is a matrix for each azi and pol, + ! set prompt_nu_fission and chi_prompt. + else if (ndims == 4) then + + ! chi_prompt is embedded in prompt_nu_fission -> extract + ! chi_prompt + allocate(temp_1d(energy_groups * energy_groups & + * this % n_azi * this % n_pol)) + allocate(temp_4d(energy_groups, energy_groups, this % n_azi, & + this % n_pol)) + call read_dataset(temp_1d, xsdata_grp, "prompt-nu-fission") + temp_4d = reshape(temp_1d, (/energy_groups, energy_groups, & + this % n_azi, this % n_pol/)) + + ! Deallocate temporary 1D array for prompt_nu_fission matrix + deallocate(temp_1d) + + ! Set the vector prompt-nu-fission from the matrix + ! prompt-nu-fission + do ipol = 1, this % n_pol + do iazi = 1, this % n_azi + do gin = 1, energy_groups + xs % prompt_nu_fission(gin, iazi, ipol) = & + sum(temp_4d(:, gin, iazi, ipol)) + end do + end do + end do + + ! Now pull out information needed for chi + xs % chi_prompt(:, :, :, :) = temp_4d + + ! Deallocate temporary 4D array for nu_fission matrix + deallocate(temp_4d) + + ! Normalize chi so its CDF goes to 1 + do ipol = 1, this % n_pol + do iazi = 1, this % n_azi + do gin = 1, energy_groups + chi_sum = sum(xs % chi_prompt(:, gin, iazi, ipol)) + if (chi_sum == ZERO) then + call fatal_error("Encountered chi prompt for a group & + &that sums to zero") + else + xs % chi_prompt(:, gin, iazi, ipol) = & + xs % chi_prompt(:, gin, iazi, ipol) / chi_sum + end if + end do + end do + end do + else + call fatal_error("prompt-nu-fission must be provided as a 3D & + &or 4D array") + end if end if ! If delayed-nu-fission provided, set delayed-nu-fission. If @@ -1639,9 +1785,64 @@ module mgxs_header ! Deallocate temporary array for delayed-nu-fission matrix deallocate(temp_1d) + ! If delayed nu-fission is a 5D matrix, set delayed_nu_fission + ! and chi_delayed. + else if (ndims == 5) then + + ! chi_delayed is embedded in delayed_nu_fission -> extract + ! chi_delayed + allocate(temp_1d(delayed_groups * energy_groups * & + energy_groups * this % n_azi * this % n_pol)) + allocate(temp_5d(delayed_groups, energy_groups, energy_groups, & + this % n_azi, this % n_pol)) + call read_dataset(temp_1d, xsdata_grp, "delayed-nu-fission") + temp_5d = reshape(temp_1d, (/delayed_groups, energy_groups, & + energy_groups, this % n_azi, this % n_pol/)) + + ! Deallocate temporary 1D array for delayed_nu_fission matrix + deallocate(temp_1d) + + ! Set the 4D delayed-nu-fission matrix and 5D chi_delayed matrix + ! from the 5D delayed-nu-fission matrix + do ipol = 1, this % n_pol + do iazi = 1, this % n_azi + do dg = 1, delayed_groups + do gin = 1, energy_groups + xs % delayed_nu_fission(dg, gin, iazi, ipol) = & + sum(temp_5d(dg, :, gin, iazi, ipol)) + do gout = 1, energy_groups + xs % chi_delayed(dg, gout, gin, iazi, ipol) = & + temp_5d(dg, gout, gin, iazi, ipol) + end do + end do + end do + end do + end do + + ! Normalize chi_delayed so its CDF goes to 1 + do ipol = 1, this % n_pol + do iazi = 1, this % n_azi + do dg = 1, delayed_groups + do gin = 1, energy_groups + chi_sum = sum(xs % chi_delayed(dg, :, gin, iazi, ipol)) + if (chi_sum == ZERO) then + call fatal_error("Encountered chi delayed for a group& + & that sums to zero") + else + xs % chi_delayed(dg, :, gin, iazi, ipol) = & + xs % chi_delayed(dg, :, gin, iazi, ipol) / & + chi_sum + end if + end do + end do + end do + end do + + ! Deallocate temporary 5D matrix for delayed_nu_fission + deallocate(temp_5d) else call fatal_error("delayed-nu-fission must be provided as a & - &1D or 2D array") + &3D, 4D, or 5D array") end if end if diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index e66d3d111..6b3f5ab3a 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -e86f24e20f37096c7898f459fc5bf336f3e0670fb30f321443f2bb3a01a154ef3d234bb48d4cee8e0d3730fd182b6a2051ec1b4c09d771420886a56ba928fdd9 \ No newline at end of file +4291b40470e7d59383c9e51c4178ca923b698cb1aaea16c1982fe3789ca980df10a65b84fb5021dacd4d290ebc232c2579f99b6c990fb6b8f28f67eef2aabcb2 \ 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 525d76efe..6f29fbc4c 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -40,6 +40,8 @@ 0 10000 1 total 4.996730e-07 3.650635e-08 material group in nuclide mean std. dev. 0 10000 1 total 0.090004 0.006367 + material group in group out nuclide mean std. dev. +0 10000 1 1 total 0.084542 0.005716 material delayedgroup group in nuclide mean std. dev. 0 10000 1 1 total 0.000021 0.000001 1 10000 2 1 total 0.000110 0.000008 @@ -68,6 +70,13 @@ 3 10000 4 1 total 0.302780 0.109110 4 10000 5 1 total 0.000000 0.000000 5 10000 6 1 total 0.000000 0.000000 + material delayedgroup group in group out nuclide mean std. dev. +0 10000 1 1 1 total 0.000000 0.000000 +1 10000 2 1 1 total 0.000384 0.000236 +2 10000 3 1 1 total 0.000179 0.000180 +3 10000 4 1 1 total 0.000730 0.000188 +4 10000 5 1 1 total 0.000000 0.000000 +5 10000 6 1 1 total 0.000000 0.000000 material group in nuclide mean std. dev. 0 10001 1 total 0.311594 0.013793 material group in nuclide mean std. dev. @@ -110,6 +119,8 @@ 0 10001 1 total 5.454760e-07 4.949800e-08 material group in nuclide mean std. dev. 0 10001 1 total 0.0 0.0 + material group in group out nuclide mean std. dev. +0 10001 1 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. 0 10001 1 1 total 0.0 0.0 1 10001 2 1 total 0.0 0.0 @@ -138,6 +149,13 @@ 3 10001 4 1 total 0.0 0.0 4 10001 5 1 total 0.0 0.0 5 10001 6 1 total 0.0 0.0 + material delayedgroup group in group out nuclide mean std. dev. +0 10001 1 1 1 total 0.0 0.0 +1 10001 2 1 1 total 0.0 0.0 +2 10001 3 1 1 total 0.0 0.0 +3 10001 4 1 1 total 0.0 0.0 +4 10001 5 1 1 total 0.0 0.0 +5 10001 6 1 1 total 0.0 0.0 material group in nuclide mean std. dev. 0 10002 1 total 0.904999 0.043964 material group in nuclide mean std. dev. @@ -180,6 +198,8 @@ 0 10002 1 total 5.773006e-07 5.322132e-08 material group in nuclide mean std. dev. 0 10002 1 total 0.0 0.0 + material group in group out nuclide mean std. dev. +0 10002 1 1 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. 0 10002 1 1 total 0.0 0.0 1 10002 2 1 total 0.0 0.0 @@ -208,3 +228,10 @@ 3 10002 4 1 total 0.0 0.0 4 10002 5 1 total 0.0 0.0 5 10002 6 1 total 0.0 0.0 + material delayedgroup group in group out nuclide mean std. dev. +0 10002 1 1 1 total 0.0 0.0 +1 10002 2 1 1 total 0.0 0.0 +2 10002 3 1 1 total 0.0 0.0 +3 10002 4 1 1 total 0.0 0.0 +4 10002 5 1 1 total 0.0 0.0 +5 10002 6 1 1 total 0.0 0.0 diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index f03c41fe7..f00c2133d 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -67ee414eed54f596464831e734ac365e43b88bf03297e2b08adfb97510e1d8e631ff45061d5b99aa0ad85ec08d5b51e341866e60f35cdbfae078030bcde6c794 \ No newline at end of file +df187239f7481867cc09138709da90bc28eeb647b4bcbb08b894e7fdf6ff45510341b77e34754c2358f0e0665f8e552bb1eafed8c42cd2c50595b60366320ce4 \ No newline at end of file diff --git a/tests/test_mgxs_library_distribcell/results_true.dat b/tests/test_mgxs_library_distribcell/results_true.dat index ef4d93eb9..2b43005aa 100644 --- a/tests/test_mgxs_library_distribcell/results_true.dat +++ b/tests/test_mgxs_library_distribcell/results_true.dat @@ -40,6 +40,8 @@ 0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 5.139437e-07 2.133314e-08 avg(distribcell) group in nuclide mean std. dev. 0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.091725 0.003604 + avg(distribcell) group in group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.093985 0.005872 avg(distribcell) delayedgroup group in nuclide mean std. dev. 0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.000021 8.253907e-07 1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0.000112 4.284000e-06 @@ -68,3 +70,10 @@ 3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0.000000 0.000000 4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0.000000 0.000000 5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 2.853000 4.034751 + avg(distribcell) delayedgroup group in group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 1 total 0.000000 0.000000 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 1 total 0.000175 0.000175 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 1 total 0.000178 0.000178 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 1 total 0.000000 0.000000 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 1 total 0.000000 0.000000 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 1 total 0.000178 0.000178 diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index e66d3d111..6b3f5ab3a 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -e86f24e20f37096c7898f459fc5bf336f3e0670fb30f321443f2bb3a01a154ef3d234bb48d4cee8e0d3730fd182b6a2051ec1b4c09d771420886a56ba928fdd9 \ No newline at end of file +4291b40470e7d59383c9e51c4178ca923b698cb1aaea16c1982fe3789ca980df10a65b84fb5021dacd4d290ebc232c2579f99b6c990fb6b8f28f67eef2aabcb2 \ 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 8b02203c6..d491e72ba 100644 --- a/tests/test_mgxs_library_hdf5/results_true.dat +++ b/tests/test_mgxs_library_hdf5/results_true.dat @@ -72,6 +72,11 @@ domain=10000 type=inverse-velocity domain=10000 type=prompt-nu-fission [1.92392215e-02 4.66719027e-01] [1.30950595e-03 4.14108704e-02] +domain=10000 type=prompt-nu-fission matrix +[[2.01424282e-02 0.00000000e+00] + [4.45819177e-01 0.00000000e+00]] +[[3.14909168e-03 0.00000000e+00] + [2.86750787e-02 0.00000000e+00]] domain=10000 type=delayed-nu-fission [[2.29808234e-05 1.06974158e-04] [1.43606337e-04 5.52167907e-04] @@ -124,6 +129,41 @@ domain=10000 type=decay-rate [0.00000000e+00 1.09109511e-01] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] +domain=10000 type=delayed-nu-fission matrix +[[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [2.53814542e-03 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [1.18579166e-03 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [8.59787018e-04 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]]] +[[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [1.56094584e-03 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [1.18610401e-03 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [2.22194634e-04 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]]] domain=10001 type=total [3.13737671e-01 3.00821402e-01] [1.55819024e-02 2.80524484e-02] @@ -198,6 +238,11 @@ domain=10001 type=inverse-velocity domain=10001 type=prompt-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] +domain=10001 type=prompt-nu-fission matrix +[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] +[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] domain=10001 type=delayed-nu-fission [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -250,6 +295,41 @@ domain=10001 type=decay-rate [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] +domain=10001 type=delayed-nu-fission matrix +[[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]]] +[[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]]] domain=10002 type=total [6.64572261e-01 2.05238401e+00] [3.12147519e-02 2.24342907e-01] @@ -324,6 +404,11 @@ domain=10002 type=inverse-velocity domain=10002 type=prompt-nu-fission [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] +domain=10002 type=prompt-nu-fission matrix +[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] +[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] domain=10002 type=delayed-nu-fission [[0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] @@ -376,3 +461,38 @@ domain=10002 type=decay-rate [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00] [0.00000000e+00 0.00000000e+00]] +domain=10002 type=delayed-nu-fission matrix +[[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]]] +[[[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]] + + [[0.00000000e+00 0.00000000e+00] + [0.00000000e+00 0.00000000e+00]]] diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 3b297354d..70799f147 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -1 +1 @@ -a0d62fc011ae33756cd87202432f5c49f847793a40ec50efc6e4366755a70196f9ae970b24244766c011e2991961ea92317b53f6839b89363262b4e67ed4b289 \ No newline at end of file +03d894a7995ac40f7971b17349b460f4b563cb1c94abaa7e7241e6f7edad7f0cb80d3f80829db14ea6b7d70d18197cb15e308047cd10f699d834178eeb6396be \ No newline at end of file diff --git a/tests/test_mgxs_library_mesh/results_true.dat b/tests/test_mgxs_library_mesh/results_true.dat index 2fc403c89..b4681d25c 100644 --- a/tests/test_mgxs_library_mesh/results_true.dat +++ b/tests/test_mgxs_library_mesh/results_true.dat @@ -130,6 +130,12 @@ 1 1 2 1 1 total 0.020397 0.008086 2 2 1 1 1 total 0.025824 0.003192 3 2 2 1 1 total 0.020865 0.004879 + mesh 1 group in group out nuclide mean std. dev. + x y z +0 1 1 1 1 1 total 0.020874 0.002977 +1 1 2 1 1 1 total 0.017348 0.008786 +2 2 1 1 1 1 total 0.020409 0.003354 +3 2 2 1 1 1 total 0.011105 0.003806 mesh 1 delayedgroup group in nuclide mean std. dev. x y z 0 1 1 1 1 1 total 0.000005 1.004627e-06 @@ -234,3 +240,29 @@ 21 2 2 1 4 1 total 0.00000 0.00000 22 2 2 1 5 1 total 0.00000 0.00000 23 2 2 1 6 1 total 0.00000 0.00000 + mesh 1 delayedgroup group in group out nuclide mean std. dev. + x y z +0 1 1 1 1 1 1 total 0.000000 0.000000 +1 1 1 1 2 1 1 total 0.000000 0.000000 +2 1 1 1 3 1 1 total 0.000000 0.000000 +3 1 1 1 4 1 1 total 0.000000 0.000000 +4 1 1 1 5 1 1 total 0.000185 0.000186 +5 1 1 1 6 1 1 total 0.000000 0.000000 +6 1 2 1 1 1 1 total 0.000000 0.000000 +7 1 2 1 2 1 1 total 0.000000 0.000000 +8 1 2 1 3 1 1 total 0.000000 0.000000 +9 1 2 1 4 1 1 total 0.000000 0.000000 +10 1 2 1 5 1 1 total 0.000000 0.000000 +11 1 2 1 6 1 1 total 0.000000 0.000000 +12 2 1 1 1 1 1 total 0.000000 0.000000 +13 2 1 1 2 1 1 total 0.000000 0.000000 +14 2 1 1 3 1 1 total 0.000000 0.000000 +15 2 1 1 4 1 1 total 0.000000 0.000000 +16 2 1 1 5 1 1 total 0.000000 0.000000 +17 2 1 1 6 1 1 total 0.000000 0.000000 +18 2 2 1 1 1 1 total 0.000000 0.000000 +19 2 2 1 2 1 1 total 0.000000 0.000000 +20 2 2 1 3 1 1 total 0.000000 0.000000 +21 2 2 1 4 1 1 total 0.000000 0.000000 +22 2 2 1 5 1 1 total 0.000000 0.000000 +23 2 2 1 6 1 1 total 0.000000 0.000000 diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index e66d3d111..6b3f5ab3a 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -e86f24e20f37096c7898f459fc5bf336f3e0670fb30f321443f2bb3a01a154ef3d234bb48d4cee8e0d3730fd182b6a2051ec1b4c09d771420886a56ba928fdd9 \ No newline at end of file +4291b40470e7d59383c9e51c4178ca923b698cb1aaea16c1982fe3789ca980df10a65b84fb5021dacd4d290ebc232c2579f99b6c990fb6b8f28f67eef2aabcb2 \ 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 07813519a..fac47af46 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -84,6 +84,11 @@ material group in nuclide mean std. dev. 1 10000 1 total 0.019239 0.001310 0 10000 2 total 0.466719 0.041411 + material group in group out nuclide mean std. dev. +3 10000 1 1 total 0.020142 0.003149 +2 10000 1 2 total 0.000000 0.000000 +1 10000 2 1 total 0.445819 0.028675 +0 10000 2 2 total 0.000000 0.000000 material delayedgroup group in nuclide mean std. dev. 1 10000 1 1 total 0.000023 0.000002 3 10000 2 1 total 0.000144 0.000011 @@ -136,6 +141,31 @@ 6 10000 4 2 total 0.302780 0.109110 8 10000 5 2 total 0.000000 0.000000 10 10000 6 2 total 0.000000 0.000000 + material delayedgroup group in group out nuclide mean std. dev. +3 10000 1 1 1 total 0.000000 0.000000 +7 10000 2 1 1 total 0.000000 0.000000 +11 10000 3 1 1 total 0.000000 0.000000 +15 10000 4 1 1 total 0.000000 0.000000 +19 10000 5 1 1 total 0.000000 0.000000 +23 10000 6 1 1 total 0.000000 0.000000 +2 10000 1 1 2 total 0.000000 0.000000 +6 10000 2 1 2 total 0.000000 0.000000 +10 10000 3 1 2 total 0.000000 0.000000 +14 10000 4 1 2 total 0.000000 0.000000 +18 10000 5 1 2 total 0.000000 0.000000 +22 10000 6 1 2 total 0.000000 0.000000 +1 10000 1 2 1 total 0.000000 0.000000 +5 10000 2 2 1 total 0.002538 0.001561 +9 10000 3 2 1 total 0.001186 0.001186 +13 10000 4 2 1 total 0.000860 0.000222 +17 10000 5 2 1 total 0.000000 0.000000 +21 10000 6 2 1 total 0.000000 0.000000 +0 10000 1 2 2 total 0.000000 0.000000 +4 10000 2 2 2 total 0.000000 0.000000 +8 10000 3 2 2 total 0.000000 0.000000 +12 10000 4 2 2 total 0.000000 0.000000 +16 10000 5 2 2 total 0.000000 0.000000 +20 10000 6 2 2 total 0.000000 0.000000 material group in nuclide mean std. dev. 1 10001 1 total 0.313738 0.015582 0 10001 2 total 0.300821 0.028052 @@ -222,6 +252,11 @@ material group in nuclide mean std. dev. 1 10001 1 total 0.0 0.0 0 10001 2 total 0.0 0.0 + material group in group out nuclide mean std. dev. +3 10001 1 1 total 0.0 0.0 +2 10001 1 2 total 0.0 0.0 +1 10001 2 1 total 0.0 0.0 +0 10001 2 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. 1 10001 1 1 total 0.0 0.0 3 10001 2 1 total 0.0 0.0 @@ -274,6 +309,31 @@ 6 10001 4 2 total 0.0 0.0 8 10001 5 2 total 0.0 0.0 10 10001 6 2 total 0.0 0.0 + material delayedgroup group in group out nuclide mean std. dev. +3 10001 1 1 1 total 0.0 0.0 +7 10001 2 1 1 total 0.0 0.0 +11 10001 3 1 1 total 0.0 0.0 +15 10001 4 1 1 total 0.0 0.0 +19 10001 5 1 1 total 0.0 0.0 +23 10001 6 1 1 total 0.0 0.0 +2 10001 1 1 2 total 0.0 0.0 +6 10001 2 1 2 total 0.0 0.0 +10 10001 3 1 2 total 0.0 0.0 +14 10001 4 1 2 total 0.0 0.0 +18 10001 5 1 2 total 0.0 0.0 +22 10001 6 1 2 total 0.0 0.0 +1 10001 1 2 1 total 0.0 0.0 +5 10001 2 2 1 total 0.0 0.0 +9 10001 3 2 1 total 0.0 0.0 +13 10001 4 2 1 total 0.0 0.0 +17 10001 5 2 1 total 0.0 0.0 +21 10001 6 2 1 total 0.0 0.0 +0 10001 1 2 2 total 0.0 0.0 +4 10001 2 2 2 total 0.0 0.0 +8 10001 3 2 2 total 0.0 0.0 +12 10001 4 2 2 total 0.0 0.0 +16 10001 5 2 2 total 0.0 0.0 +20 10001 6 2 2 total 0.0 0.0 material group in nuclide mean std. dev. 1 10002 1 total 0.664572 0.031215 0 10002 2 total 2.052384 0.224343 @@ -360,6 +420,11 @@ material group in nuclide mean std. dev. 1 10002 1 total 0.0 0.0 0 10002 2 total 0.0 0.0 + material group in group out nuclide mean std. dev. +3 10002 1 1 total 0.0 0.0 +2 10002 1 2 total 0.0 0.0 +1 10002 2 1 total 0.0 0.0 +0 10002 2 2 total 0.0 0.0 material delayedgroup group in nuclide mean std. dev. 1 10002 1 1 total 0.0 0.0 3 10002 2 1 total 0.0 0.0 @@ -412,3 +477,28 @@ 6 10002 4 2 total 0.0 0.0 8 10002 5 2 total 0.0 0.0 10 10002 6 2 total 0.0 0.0 + material delayedgroup group in group out nuclide mean std. dev. +3 10002 1 1 1 total 0.0 0.0 +7 10002 2 1 1 total 0.0 0.0 +11 10002 3 1 1 total 0.0 0.0 +15 10002 4 1 1 total 0.0 0.0 +19 10002 5 1 1 total 0.0 0.0 +23 10002 6 1 1 total 0.0 0.0 +2 10002 1 1 2 total 0.0 0.0 +6 10002 2 1 2 total 0.0 0.0 +10 10002 3 1 2 total 0.0 0.0 +14 10002 4 1 2 total 0.0 0.0 +18 10002 5 1 2 total 0.0 0.0 +22 10002 6 1 2 total 0.0 0.0 +1 10002 1 2 1 total 0.0 0.0 +5 10002 2 2 1 total 0.0 0.0 +9 10002 3 2 1 total 0.0 0.0 +13 10002 4 2 1 total 0.0 0.0 +17 10002 5 2 1 total 0.0 0.0 +21 10002 6 2 1 total 0.0 0.0 +0 10002 1 2 2 total 0.0 0.0 +4 10002 2 2 2 total 0.0 0.0 +8 10002 3 2 2 total 0.0 0.0 +12 10002 4 2 2 total 0.0 0.0 +16 10002 5 2 2 total 0.0 0.0 +20 10002 6 2 2 total 0.0 0.0 diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index d7c6eeab0..ed6f4d443 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -1e8d0f408ba9d47fc9278e750dbf68d3104d248f7783ca1185c8b7666c9ee2ba3ec6fcf4a49bb614956bb8eb3a57dc1c104725b4160171dfbe6dc972a268df56 \ No newline at end of file +eed0190893105747f0146472dfea86ca58b9fc2e8d039961d9fef8f235f79da32215f9b59b840419e6b69c5a04544b4659f2634b63e3a76b6b0f8c75d05e416c \ 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 b55ab34ab..bdc0d1768 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -ce682f577fd65dd9b6e5da58763cf2ae4cf8e5041b38b5d1ed64d3ba7a3a4df7338aadfa8830a0764fc9ffb737f05fc989a494158c714047186dd18605a7d2b8 \ No newline at end of file +8bc6694ee99cc05ec59143dac065f3f51026713044c48a36ac486f46014289c1f18d4d8e14ef0bb468050aea0bac5628425fd76154a01c7438c7d85139aa2f06 \ No newline at end of file