From 756a43f1c563276af124b520a974389f8b286114 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 28 Jan 2017 11:34:29 -0500 Subject: [PATCH 01/66] Added ability to convert the isotropic or angle representation from one to the other for XSdata objects and MGXSLibrary objects --- openmc/mgxs/mgxs.py | 2 +- openmc/mgxs_library.py | 196 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 194 insertions(+), 4 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index de90d4397a..9f1ac59d1c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -205,7 +205,7 @@ class MGXS(object): clone._name = self.name clone._rxn_type = self.rxn_type clone._by_nuclide = self.by_nuclide - clone._nuclides = copy.deepcopy(self._nuclides) + clone._nuclides = copy.deepcopy(self._nuclides, memo) clone._domain = self.domain clone._domain_type = self.domain_type clone._energy_groups = copy.deepcopy(self.energy_groups, memo) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 4fb347b73c..09f7e421bb 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1,4 +1,4 @@ -from collections import Iterable +import copy from numbers import Real, Integral import os @@ -185,6 +185,52 @@ class XSdata(object): self._inverse_velocity = len(temperatures) * [None] self._xs_shapes = None + 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._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._num_delayed_groups = self.num_delayed_groups + clone._temperatures = copy.deepcopy(self.temperatures, memo) + clone._drepresentation = self.representation + clone._atomic_weight_ratio = self._atomic_weight_ratio + clone._fissionable = self._fissionable + clone._scatter_format = self._scatter_format + clone._order = self._order + clone._num_polar = self._num_polar + clone._num_azimuthal = self._num_azimuthal + clone._total = copy.deepcopy(self._total, memo) + clone._absorption = copy.deepcopy(self._absorption, memo) + clone._scatter_matrix = copy.deepcopy(self._scatter_matrix, memo) + clone._multiplicity_matrix = \ + copy.deepcopy(self._multiplicity_matrix, memo) + clone._fission = copy.deepcopy(self._fission, memo) + clone._nu_fission = copy.deepcopy(self._nu_fission, memo) + clone._prompt_nu_fission = \ + copy.deepcopy(self._prompt_nu_fission, memo) + clone._delayed_nu_fission = \ + copy.deepcopy(self._delayed_nu_fission, memo) + clone._kappa_fission = copy.deepcopy(self._kappa_fission, memo) + clone._chi = copy.deepcopy(self._chi, memo) + clone._chi_prompt = copy.deepcopy(self._chi_prompt, memo) + clone._chi_delayed = copy.deepcopy(self._chi_delayed, memo) + clone._beta = copy.deepcopy(self._beta, memo) + clone._decay_rate = copy.deepcopy(self._decay_rate, memo) + clone._inverse_velocity = \ + copy.deepcopy(self._inverse_velocity, memo) + clone._xs_shapes = copy.deepcopy(self._xs_shapes, 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 @@ -348,7 +394,7 @@ class XSdata(object): @representation.setter def representation(self, representation): - # Check it is of valid type. + # Check it is of valid value. check_value('representation', representation, _REPRESENTATIONS) self._representation = representation @@ -1622,7 +1668,8 @@ class XSdata(object): """ - check_type('inverse_velocity', inverse_velocity, openmc.mgxs.InverseVelocity) + check_type('inverse_velocity', inverse_velocity, + openmc.mgxs.InverseVelocity) check_value('energy_groups', inverse_velocity.energy_groups, [self.energy_groups]) check_value('domain_type', inverse_velocity.domain_type, @@ -1634,6 +1681,89 @@ class XSdata(object): self._inverse_velocity[i] = inverse_velocity.get_xs( nuclides=nuclide, xs_type=xs_type, subdomains=subdomain) + def convert_representation(self, target_representation, num_polar=None, + num_azimuthal=None): + """Produce a new XSdata object with the same data, but converted to the + new representation + + Parameters + ---------- + target_representation : {'isotropic', 'angle'} + Representation of the MGXS (isotropic or angle-dependent flux + weighting). + num_polar : int, optional + Number of equal width angular bins that the polar angular + domain is subdivided into. This is required when + :param:`target_representation` is "angle". + num_azimuthal : int, optional + Number of equal width angular bins that the azimuthal angular + domain is subdivided into. This is required when + :param:`target_representation` is "angle". + + Returns + ------- + openmc.XSdata + Multi-group cross section data with the same data as self, but + represented as specified in :param:`target_representation`. + + """ + + check_value('target_representation', target_representation, + _REPRESENTATIONS) + if target_representation == 'angle': + check_type('num_polar', num_polar, Integral) + check_type('num_azimuthal', num_azimuthal, Integral) + check_greater_than('num_polar', num_polar, 0) + check_greater_than('num_azimuthal', num_azimuthal, 0) + + xsdata = copy.deepcopy(self) + if target_representation == self.representation: + # Check to make sure the num_polar and num_azimuthal values match + if target_representation == 'angle': + if num_polar != self.num_polar or num_azimuthal != self.num_azimuthal: + raise NotImplementedError("XSdata.convert_representation " + "cannot translate between " + "`angle` representations with " + "different angle bin structures") + # Nothing to do + return xsdata + + types = ['total', 'absorption', 'fission', 'nu_fission', + 'scatter_matrix', 'multiplicity_matrix', 'prompt_nu_fission', + 'delayed_nu_fission', 'kappa_fission', 'chi', 'chi_prompt', + 'chi_delayed', 'beta', 'decay_rate', 'inverse_velocity'] + + xsdata.representation = target_representation + # We have different actions depending on the representation conversion + if target_representation == 'isotropic': + xsdata.num_polar = None + xsdata.num_azimuthal = None + for i, temp in enumerate(xsdata.temperatures): + for xs in types: + # Get the original data + orig_data = getattr(self, '_' + xs)[i] + # Since we are going from angle to isotropic, the current + # data should be just averaged over the angle bins + new_data = orig_data.mean(axis=(0, 1)) + setter = getattr(xsdata, 'set_' + xs) + setter(new_data, temp) + + elif target_representation == 'angle': + xsdata.num_polar = num_polar + xsdata.num_azimuthal = num_azimuthal + for i, temp in enumerate(xsdata.temperatures): + for xs in types: + # Get the original data + orig_data = getattr(self, '_' + xs)[i] + # Since we are going from isotropic to angle, the current + # data should be just copied for every polar/azimuthal bin + new_shape = (num_polar, num_azimuthal) + orig_data.shape + new_data = np.resize(orig_data, new_shape) + setter = getattr(xsdata, 'set_' + xs) + setter(new_data, temp) + + return xsdata + def to_hdf5(self, file): """Write XSdata to an HDF5 file @@ -1995,6 +2125,24 @@ class MGXSLibrary(object): self.num_delayed_groups = num_delayed_groups self._xsdatas = [] + 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._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._num_delayed_groups = self.num_delayed_groups + clone._xsdatas = copy.deepcopy(self.xsdatas, memo) + + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + @property def energy_groups(self): return self._energy_groups @@ -2099,6 +2247,48 @@ class MGXSLibrary(object): result = xsdata return result + def convert_representation(self, target_representation, num_polar=None, + num_azimuthal=None): + """Produce a new MGXSLibrary object with the same data, but converted + to the new representation + + Parameters + ---------- + target_representation : {'isotropic', 'angle'} + Representation of the MGXS (isotropic or angle-dependent flux + weighting). + num_polar : int, optional + Number of equal width angular bins that the polar angular + domain is subdivided into. This is required when + :param:`target_representation` is "angle". + num_azimuthal : int, optional + Number of equal width angular bins that the azimuthal angular + domain is subdivided into. This is required when + :param:`target_representation` is "angle". + + Returns + ------- + openmc.MGXSLibrary + Multi-group Library with the same data as self, but represented as + specified in :param:`target_representation`. + + """ + + check_value('target_representation', target_representation, + _REPRESENTATIONS) + if target_representation == 'angle': + check_type('num_polar', num_polar, Integral) + check_type('num_azimuthal', num_azimuthal, Integral) + check_greater_than('num_polar', num_polar, 0) + check_greater_than('num_azimuthal', num_azimuthal, 0) + + library = copy.deepcopy(self) + for i, xsdata in enumerate(self.xsdatas): + library.xsdatas[i] = \ + xsdata.convert_representation(target_representation, + num_polar, num_azimuthal) + return library + def export_to_hdf5(self, filename='mgxs.h5'): """Create an hdf5 file that can be used for a simulation. From 1cd15696c17eb1c4bb63926aad5b0a4efc2a7ed3 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 28 Jan 2017 13:44:38 -0500 Subject: [PATCH 02/66] fixes to convert_representation and MGXSLibrary implementation of convert_scatter_format --- openmc/mgxs_library.py | 83 ++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 20 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 09f7e421bb..5a23e6dbe6 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1736,29 +1736,33 @@ class XSdata(object): xsdata.representation = target_representation # We have different actions depending on the representation conversion if target_representation == 'isotropic': - xsdata.num_polar = None - xsdata.num_azimuthal = None - for i, temp in enumerate(xsdata.temperatures): - for xs in types: - # Get the original data - orig_data = getattr(self, '_' + xs)[i] - # Since we are going from angle to isotropic, the current - # data should be just averaged over the angle bins - new_data = orig_data.mean(axis=(0, 1)) - setter = getattr(xsdata, 'set_' + xs) - setter(new_data, temp) - + # This is not needed for the correct functionality, but these + # values are changed back to None for clarity + xsdata._num_polar = None + xsdata._num_azimuthal = None elif target_representation == 'angle': xsdata.num_polar = num_polar xsdata.num_azimuthal = num_azimuthal - for i, temp in enumerate(xsdata.temperatures): - for xs in types: - # Get the original data - orig_data = getattr(self, '_' + xs)[i] - # Since we are going from isotropic to angle, the current - # data should be just copied for every polar/azimuthal bin - new_shape = (num_polar, num_azimuthal) + orig_data.shape - new_data = np.resize(orig_data, new_shape) + + # Reset XSdata.xs_shapes to accomodate the new shape + # import pdb; pdb.set_trace() + xsdata._xs_shapes = None + xsdata.xs_shapes + + for i, temp in enumerate(xsdata.temperatures): + for xs in types: + # Get the original data + orig_data = getattr(self, '_' + xs)[i] + if orig_data is not None: + if target_representation == 'isotropic': + # Since we are going from angle to isotropic, the + # current data is just averaged over the angle bins + new_data = orig_data.mean(axis=(0, 1)) + elif target_representation == 'angle': + # Since we are going from isotropic to angle, the + # current data is just copied for every angle bin + new_shape = (num_polar, num_azimuthal) + orig_data.shape + new_data = np.resize(orig_data, new_shape) setter = getattr(xsdata, 'set_' + xs) setter(new_data, temp) @@ -2289,6 +2293,45 @@ class MGXSLibrary(object): num_polar, num_azimuthal) return library + def convert_scatter_format(self, target_format, target_order): + """Produce a new MGXSLibrary object with the same data, but converted + to the new scatter format and order + + Parameters + ---------- + target_format : {'isotropic', 'angle'} + Representation of the MGXS (isotropic or angle-dependent flux + weighting). + target_order : int + Either the Legendre target_order, number of bins, or number of + points used to describe the angular distribution associated with + each group-to-group transfer probability. + + Returns + ------- + openmc.MGXSLibrary + Multi-group Library with the same data as self, but with the + scatter format represented as specified in :param:`target_format` + and :param:`target_order`. + + """ + + check_value('target_format', target_format, _SCATTER_TYPES) + check_type('target_order', target_order, Integral) + if target_format == 'legendre': + check_greater_than('target_order', target_order, Integral, 0, + equality=True) + else: + check_greater_than('target_order', target_order, Integral, 0, + equality=True) + + library = copy.deepcopy(self) + for i, xsdata in enumerate(self.xsdatas): + library.xsdatas[i] = \ + xsdata.convert_scatter_format(target_format, target_order) + + return library + def export_to_hdf5(self, filename='mgxs.h5'): """Create an hdf5 file that can be used for a simulation. From 1c367b049c77cf945565187fb384a5a1b49be0dc Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 29 Jan 2017 15:25:00 -0500 Subject: [PATCH 03/66] Finished convert_scatter_format; tested, seems to be great! --- openmc/mgxs_library.py | 206 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 193 insertions(+), 13 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 5a23e6dbe6..b740b4dae9 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -14,9 +14,13 @@ from openmc.checkvalue import check_type, check_value, check_greater_than, \ # Supported incoming particle MGXS angular treatment representations _REPRESENTATIONS = ['isotropic', 'angle'] +# Supported scattering angular distribution representations _SCATTER_TYPES = ['tabular', 'legendre', 'histogram'] +# List of MGXS dimension types _XS_SHAPES = ["[G][G'][Order]", "[G]", "[G']", "[G][G']", "[DG]", "[DG][G]", "[DG][G']", "[DG][G][G']"] +# Number of mu points for conversion between scattering formats +_NMU = 257 class XSdata(object): @@ -195,7 +199,7 @@ class XSdata(object): clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._num_delayed_groups = self.num_delayed_groups clone._temperatures = copy.deepcopy(self.temperatures, memo) - clone._drepresentation = self.representation + clone._representation = self.representation clone._atomic_weight_ratio = self._atomic_weight_ratio clone._fissionable = self._fissionable clone._scatter_format = self._scatter_format @@ -1745,9 +1749,7 @@ class XSdata(object): xsdata.num_azimuthal = num_azimuthal # Reset XSdata.xs_shapes to accomodate the new shape - # import pdb; pdb.set_trace() xsdata._xs_shapes = None - xsdata.xs_shapes for i, temp in enumerate(xsdata.temperatures): for xs in types: @@ -1761,13 +1763,194 @@ class XSdata(object): elif target_representation == 'angle': # Since we are going from isotropic to angle, the # current data is just copied for every angle bin - new_shape = (num_polar, num_azimuthal) + orig_data.shape + new_shape = (num_polar, num_azimuthal) + \ + orig_data.shape new_data = np.resize(orig_data, new_shape) setter = getattr(xsdata, 'set_' + xs) setter(new_data, temp) return xsdata + def convert_scatter_format(self, target_format, target_order=None): + """Produce a new MGXSLibrary object with the same data, but converted + to the new scatter format and order + + Parameters + ---------- + target_format : {'tabular', 'legendre', 'histogram'} + Representation of the scattering angle distribution + target_order : int + Either the Legendre target_order, number of bins, or number of + points used to describe the angular distribution associated with + each group-to-group transfer probability + + Returns + ------- + openmc.XSdata + Multi-group cross section data with the same data as self, but + represented as specified in :param:`target_format`. + + """ + + from scipy.interpolate import interp1d + from scipy.integrate import quad, simps + from scipy.special import eval_legendre + + check_value('target_format', target_format, _SCATTER_TYPES) + check_type('target_order', target_order, Integral) + if target_format == 'legendre': + check_greater_than('target_order', target_order, 0, equality=True) + else: + check_greater_than('target_order', target_order, 0) + + xsdata = copy.deepcopy(self) + xsdata.scatter_format = target_format + xsdata.order = target_order + # Reset XSdata.xs_shapes to accomodate the new shape + xsdata._xs_shapes = None + xsdata.xs_shapes + + # We have to accomodate the following possibilities: + # histogram -> tabular w/ same or diff order + # histogram -> legendre + # histogram -> histogram w/ same or diff order + + for i, temp in enumerate(xsdata.temperatures): + orig_data = self._scatter_matrix[i] + new_shape = orig_data.shape[:-1] + (xsdata.num_orders,) + new_data = np.zeros(new_shape) + if self.scatter_format == 'legendre': + if target_format == 'legendre': + # Then we are changing orders and only need to change + # dimensionality of the mu data and pad/truncate as needed + order = min(xsdata.num_orders, self.num_orders) + new_data[..., :order] = orig_data[..., :order] + elif target_format == 'tabular': + mu = np.linspace(-1, 1, xsdata.num_orders) + # Create the Legendre series and either do a point-wise + # evaluation (tabular) or bin-wise integral (histogram) + new_data[..., :] = \ + np.sum((l + 0.5) * eval_legendre(l, mu) * orig_data + for l in range(self.num_orders)) + elif target_format == 'histogram': + mu = np.linspace(-1, 1, xsdata.num_orders + 1) + # This code will be written to utilize the vectorized + # integration capabilities instead of having an isotropic + # and angle representation path. + for h_bin in range(xsdata.num_orders): + mu_fine = np.linspace(mu[i], mu[i + 1], _NMU) + new_data[..., h_bin] = \ + simps(np.sum((l + 0.5) * + eval_legendre(l, mu_fine) * + orig_data + for l in range(self.num_orders)), + mu_fine) + + # Remove the very small results from numerical precision + # issues (allowing conversions to be reproduced exactly) + new_data[..., np.abs(new_data) < 1.E-10] = 0. + + elif self.scatter_format == 'tabular': + mu_self = np.linspace(-1, 1, self.num_orders) + if target_format == 'legendre': + # find the legendre coefficients via integration. To best + # use the vectorized integration capabilities of scipy, + # this will be done with fixed sample integration routines. + mu_fine = np.linspace(-1, 1, _NMU) + y = [interp1d(mu_self, orig_data)(mu_fine) * + eval_legendre(l, mu_fine) + for l in range(xsdata.num_orders)] + for l in range(xsdata.num_orders): + new_data[..., l] = (l + 0.5) * simps(y[l], mu_fine) + + # Remove the very small results from numerical precision + # issues (allowing conversions to be reproduced exactly) + new_data[..., np.abs(new_data) < 1.E-10] = 0. + elif target_format == 'tabular': + # Simply use an interpolating function to get the new data + mu = np.linspace(-1, 1, xsdata.num_orders) + new_data[..., :] = interp1d(mu_self, orig_data)(mu) + elif target_format == 'histogram': + # Use an interpolating function to do the bin-wise + # integrals + mu = np.linspace(-1, 1, xsdata.num_orders + 1) + + # Like the tabular -> legendre path above, this code will + # be written to utilize the vectorized integration + # capabilities instead of having an isotropic and + # angle representation path. + interp = interp1d(mu_self, orig_data) + for h_bin in range(xsdata.num_orders): + mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) + new_data[..., h_bin] = simps(interp(mu_fine), mu_fine) + + # Remove the very small results from numerical precision + # issues (allowing conversions to be reproduced exactly) + new_data[..., np.abs(new_data) < 1.E-10] = 0. + elif self.scatter_format == 'histogram': + # The histogram format does not have enough information to + # convert to the other forms without inducing an error. + # We will make the assumption that the left-edge of the bin + # has the value of the bin. The mu=1 value will be extrapolated + # from the previous two points. + mu_self = np.linspace(-1, 1, self.num_orders + 1) + tab_data = np.zeros(orig_data.shape[:-1] + + (orig_data.shape[-1] + 1,)) + tab_data[..., :-1] = orig_data + tab_data[..., -1] = (orig_data[..., -2] - + orig_data[..., -3]) + orig_data[..., -2] + # Now get the distribution normalization factor.such + # This factor will be such that its average value is the + # group -> group cross section (which is the sum of the + # original data) + norm = np.sum(orig_data, axis=-1) / np.mean(tab_data, axis=-1) + norm = np.nan_to_num(norm) + for i in range(tab_data.shape[-1]): + tab_data[..., i] *= norm[...] + + # We now have a tabular distribution in tab_data on mu_self + # with a normalization in norm. We now proceed just like the + # tabular branch above. + if target_format == 'legendre': + # find the legendre coefficients via integration. To best + # use the vectorized integration capabilities of scipy, + # this will be done with fixed sample integration routines. + mu_fine = np.linspace(-1, 1, _NMU) + y = [interp1d(mu_self, tab_data)(mu_fine) * + eval_legendre(l, mu_fine) + for l in range(xsdata.num_orders)] + for l in range(xsdata.num_orders): + new_data[..., l] = (l + 0.5) * simps(y[l], mu_fine) + + # Remove the very small results from numerical precision + # issues (allowing conversions to be reproduced exactly) + new_data[..., np.abs(new_data) < 1.E-10] = 0. + elif target_format == 'tabular': + # Simply use an interpolating function to get the new data + mu = np.linspace(-1, 1, xsdata.num_orders) + new_data[..., :] = interp1d(mu_self, tab_data)(mu) + elif target_format == 'histogram': + # Use an interpolating function to do the bin-wise + # integrals + mu = np.linspace(-1, 1, xsdata.num_orders + 1) + + # Like the tabular -> legendre path above, this code will + # be written to utilize the vectorized integration + # capabilities instead of having an isotropic and + # angle representation path. + interp = interp1d(mu_self, tab_data) + for h_bin in range(xsdata.num_orders): + mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) + new_data[..., h_bin] = simps(interp(mu_fine), mu_fine) + + # Remove the very small results from numerical precision + # issues (allowing conversions to be reproduced exactly) + new_data[..., np.abs(new_data) < 1.E-10] = 0. + + xsdata.set_scatter_matrix(new_data, temp) + + return xsdata + def to_hdf5(self, file): """Write XSdata to an HDF5 file @@ -1891,7 +2074,7 @@ class XSdata(object): elif self.representation == 'angle': matrix = \ self._scatter_matrix[i][p, a, g_in, :, 0] - elif self.scatter_format == 'histogram': + else: if self.representation == 'isotropic': matrix = \ np.sum(self._scatter_matrix[i][g_in, :, :], @@ -2299,13 +2482,12 @@ class MGXSLibrary(object): Parameters ---------- - target_format : {'isotropic', 'angle'} - Representation of the MGXS (isotropic or angle-dependent flux - weighting). + target_format : {'tabular', 'legendre', 'histogram'} + Representation of the scattering angle distribution target_order : int Either the Legendre target_order, number of bins, or number of points used to describe the angular distribution associated with - each group-to-group transfer probability. + each group-to-group transfer probability Returns ------- @@ -2319,11 +2501,9 @@ class MGXSLibrary(object): check_value('target_format', target_format, _SCATTER_TYPES) check_type('target_order', target_order, Integral) if target_format == 'legendre': - check_greater_than('target_order', target_order, Integral, 0, - equality=True) + check_greater_than('target_order', target_order, 0, equality=True) else: - check_greater_than('target_order', target_order, Integral, 0, - equality=True) + check_greater_than('target_order', target_order, 0) library = copy.deepcopy(self) for i, xsdata in enumerate(self.xsdatas): From 7e1700227c6bf7dc43e122813f2f12423e71f234 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 5 Feb 2017 15:56:23 -0500 Subject: [PATCH 04/66] Fixes to scatter format conversion as well as initial implementation of conversion of MG library to CE --- openmc/mgxs_library.py | 253 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 239 insertions(+), 14 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index b740b4dae9..6f46f48875 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1793,7 +1793,7 @@ class XSdata(object): """ from scipy.interpolate import interp1d - from scipy.integrate import quad, simps + from scipy.integrate import simps from scipy.special import eval_legendre check_value('target_format', target_format, _SCATTER_TYPES) @@ -1827,24 +1827,34 @@ class XSdata(object): new_data[..., :order] = orig_data[..., :order] elif target_format == 'tabular': mu = np.linspace(-1, 1, xsdata.num_orders) - # Create the Legendre series and either do a point-wise - # evaluation (tabular) or bin-wise integral (histogram) - new_data[..., :] = \ - np.sum((l + 0.5) * eval_legendre(l, mu) * orig_data - for l in range(self.num_orders)) + # Evaluate the legendre on the tabular grid within mu + for imu in range(len(mu)): + new_data[..., imu] = \ + np.sum((l + 0.5) * eval_legendre(l, mu[imu]) * + orig_data[..., l] + for l in range(self.num_orders)) elif target_format == 'histogram': mu = np.linspace(-1, 1, xsdata.num_orders + 1) # This code will be written to utilize the vectorized # integration capabilities instead of having an isotropic # and angle representation path. for h_bin in range(xsdata.num_orders): - mu_fine = np.linspace(mu[i], mu[i + 1], _NMU) - new_data[..., h_bin] = \ - simps(np.sum((l + 0.5) * - eval_legendre(l, mu_fine) * - orig_data - for l in range(self.num_orders)), - mu_fine) + mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) + table_shape = new_data.shape[:-1] + (_NMU,) + table_fine = np.zeros(table_shape) + for imu in range(len(mu_fine)): + table_fine[..., imu] = \ + np.sum((l + 0.5) * + eval_legendre(l, mu_fine[imu]) * + orig_data[..., l] + for l in range(self.num_orders)) + new_data[..., h_bin] = simps(table_fine, mu_fine) + # new_data[..., h_bin] = \ + # simps(np.sum((l + 0.5) * + # eval_legendre(l, mu_fine) * + # orig_data[..., l] + # for l in range(self.num_orders)), + # mu_fine) # Remove the very small results from numerical precision # issues (allowing conversions to be reproduced exactly) @@ -1899,7 +1909,7 @@ class XSdata(object): tab_data[..., :-1] = orig_data tab_data[..., -1] = (orig_data[..., -2] - orig_data[..., -3]) + orig_data[..., -2] - # Now get the distribution normalization factor.such + # Now get the distribution normalization factor. # This factor will be such that its average value is the # group -> group cross section (which is the sum of the # original data) @@ -1951,6 +1961,198 @@ class XSdata(object): return xsdata + def convert_to_continuous_energy(self, temperature=294.): + """Converts the XSdata object to an equivalent + openmc.data.IncidentNeutron object. + + Parameters + ---------- + temperature : float + Temperature of dataset to print; defaults to 294K + + Returns + ------- + openmc.data.IncidentNeutron + The continuous-energy IncidentNeutron data library equivalent + to the MGXS data in self + """ + + # Check if this can be performed successfully + if self.representation == 'angle': + raise ValueError("Cannot convert angle-dependent MGXS; convert to " + "an isotropic representation first") + required_types = ['absorption', 'scatter_matrix'] + for type_check in required_types: + if getattr(self, '_' + type_check)[0] is None: + raise ValueError(type_check + ' data is required') + if temperature not in self.temperatures: + raise ValueError("Invalid temperature") + + def convert_xs(group_edges, values): + cexs = openmc.data.Tabulated1D(group_edges, + np.append(values[::-1], + [values[0]]), + breakpoints=[len(group_edges)], + interpolation=[1]) + return cexs + + # Build required metadata + kTs = self.temperatures[:] * openmc.data.K_BOLTZMANN + if self.atomic_weight_ratio: + awr = self.atomic_weight_ratio + else: + awr = 1. + + # Get the temperature index + iT = np.where(self.temperatures == temperature)[0][0] + data = openmc.data.IncidentNeutron(self.name, 1, 1, 0, awr, kTs) + strT = "{}K".format(int(round(self.temperatures[iT]))) + data.energy = {strT: self.energy_groups.group_edges} + energy_midpoints = (self.energy_groups.group_edges[1:] + + self.energy_groups.group_edges[:-1]) / 2. + + # Elastic MGXS: must explicitly be 0 barns to avoid incorrect + # elastic_scatter calculation with data available to us in MG library. + el_rxn = openmc.data.Reaction(2) + el_rxn.xs[strT] = \ + convert_xs(self.energy_groups.group_edges, + np.zeros(self.energy_groups.num_groups)) + data.reactions[2] = el_rxn + + # Absorption MGXS + abs_rxn = openmc.data.Reaction(102) + abs_rxn.xs[strT] = convert_xs(self.energy_groups.group_edges, + np.subtract(self._absorption[iT], + self._fission[iT])) + data.reactions[102] = abs_rxn + + if self._nu_fission[iT] is not None and self._fission[iT] is not None: + fiss_rxn = openmc.data.Reaction(18) + fiss_rxn.xs[strT] = convert_xs(self.energy_groups.group_edges, + self._fission[iT]) + + # Get nu_fission and chi from the presence of both, or the + # nu_fission matrix + if self._nu_fission[iT].shape == self.xs_shapes["[G][G']"]: + nu_fiss = np.sum(self._nu_fission[iT], axis=1)[::-1] + chi = self._nu_fission[iT][::-1] / nu_fiss + else: + nu_fiss = self._nu_fission[iT][::-1] + chi = np.reshape(np.tile(self._chi[iT][::-1], + self.energy_groups.num_groups), + (self.energy_groups.num_groups, + self.energy_groups.num_groups)) + nu = np.divide(nu_fiss, self._fission[iT][::-1]) + + # Build a histogram distribution to represent the yield for the + # incoming groups + prod = openmc.data.Product() + prod.yield_ = \ + openmc.data.Tabulated1D(self.energy_groups.group_edges[:-1], + nu, breakpoints=[len(nu)], + interpolation=[1]) + + # Now build the outgoing energy distribution using discrete energy + # lines within each of the outgoing groups + chi_eouts = [] + for g in range(self.energy_groups.num_groups): + chi_eouts.append(openmc.stats.Discrete(energy_midpoints, + chi[g, :])) + # Ensure the distribution CDF starts with 0 + chi_eouts[-1].c = np.cumsum(chi[g, :]) - chi[g, 0] + + # Create the continuous distribution for the fission + # The angular distribution will remain None (thus isotropic) + chi_distrib = openmc.data.ContinuousTabular( + [len(chi)], [1], self.energy_groups.group_edges[:-1], + chi_eouts) + prod.distribution = \ + [openmc.data.UncorrelatedAngleEnergy(energy=chi_distrib)] + fiss_rxn.products = [prod] + fiss_rxn.center_of_mass = False + data.reactions[18] = fiss_rxn + + # Scattering Data + # First convert the data to a tabular representation + if self.scatter_format == 'tabular': + tabular = self + else: + tabular = self.convert_scatter_format('tabular', 33) + + # Calculate the isotropic scattering matrix and use that to find the + # total scattering x/s and outgoing energy distributions + isotropic_matrix = np.mean(tabular._scatter_matrix[iT], axis=-1)[::-1, + ::-1] + scatt_xs = np.sum(isotropic_matrix, axis=1) + energy = np.zeros((self.energy_groups.num_groups, + self.energy_groups.num_groups)) + for gin in range(self.energy_groups.num_groups): + energy[gin, :] = isotropic_matrix[gin, :] / scatt_xs[gin] + + # Get the anisotropic but normalized angular distribution + distrib = np.zeros((self.energy_groups.num_groups, + self.energy_groups.num_groups, + tabular.num_orders)) + for gin in range(self.energy_groups.num_groups): + for gout in range(self.energy_groups.num_groups): + distrib[gin, gout, :] = \ + np.divide(tabular._scatter_matrix[iT][gin, gout, :], + isotropic_matrix[gin, gout]) + distrib = np.nan_to_num(distrib) + + # Incorporate the scattering multiplication, if required + scatt_prod = openmc.data.Product() + if self._multiplicity_matrix[iT]: + yield_ = self._multiplicity_matrix[iT][::-1, ::-1] + scatt_prod.yield_ = \ + openmc.data.Tabulated1D(self.energy_groups.group_edges[:-1], + yield_, breakpoints=[len(yield_)], + interpolation=[1]) + + # Now build the outgoing energy distribution using discrete energy + # lines within each of the outgoing groups + scatt_eouts = [] + for g in range(self.energy_groups.num_groups): + scatt_eouts.append( + openmc.stats.Discrete(energy_midpoints, energy[g, :])) + # Ensure the distribution CDF starts with 0 + scatt_eouts[-1].c = np.cumsum(energy[g, :]) - energy[g, 0] + scatt_eouts.append(scatt_eouts[-1]) + + # Build the angular distributions associated with each outgoing energy + # group + mu = np.linspace(-1., 1., tabular.num_orders) + scatt_angles = [] + for gin in range(self.energy_groups.num_groups): + scatt_angles.append([]) + for gout in range(self.energy_groups.num_groups): + scatt_angles[gin].append( + openmc.stats.Tabular(mu, distrib[gin, gout, :])) + # Ensure the distribution CDF starts with 0 + scatt_angles[gin][-1].c = \ + np.cumsum(distrib[gin, gout, :]) - distrib[gin, gout, 0] + scatt_angles.append(scatt_angles[-1]) + + # Combine the energy and angle distributions in to a correlated + # angle/energy object + scatt_prod.distribution = \ + [openmc.data.CorrelatedAngleEnergy( + breakpoints=[len(scatt_eouts)], interpolation=[1], + energy=self.energy_groups.group_edges[:-1], + energy_out=scatt_eouts, mu=scatt_angles)] + + # Finally build the reaction with the just-calculated information + # This will be set to the (n,2n) reaction, though any scattering + # reaction would suffice + scatt_rxn = openmc.data.Reaction(16) + scatt_rxn.xs[strT] = \ + convert_xs(self.energy_groups.group_edges, scatt_xs[::-1]) + scatt_rxn.products = [scatt_prod] + scatt_rxn.center_of_mass = False + data.reactions[16] = scatt_rxn + + return data + def to_hdf5(self, file): """Write XSdata to an HDF5 file @@ -2512,6 +2714,29 @@ class MGXSLibrary(object): return library + def convert_to_continuous_energy(self, h5_filename='ce_mgxs.h5', + library_filename='ce_mgxs.xml'): + """Converts the MGXSLibrary object to an equivalent + library of openmc.data.IncidentNeutron objects + + Parameters + ---------- + h5_filename : str + HDF5 file to write with all the files + library_filename : str + cross_sections.xml file describing the HDF5 file + + """ + + library = openmc.data.DataLibrary() + data = [] + for i, xsdata in enumerate(self.xsdatas): + data.append(xsdata.convert_to_continuous_energy()) + data[-1].export_to_hdf5(h5_filename) + + library.register_file(h5_filename) + library.export_to_xml(library_filename) + def export_to_hdf5(self, filename='mgxs.h5'): """Create an hdf5 file that can be used for a simulation. From 2987ed88221663400dba872878b5178118021021 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 12 Feb 2017 13:18:52 -0500 Subject: [PATCH 05/66] Fix for floating point errors (rarely) causing crashes as no outgoing group is found --- openmc/mgxs_library.py | 6 ------ src/scattdata_header.F90 | 6 +++--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 6f46f48875..b2dee39489 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1849,12 +1849,6 @@ class XSdata(object): orig_data[..., l] for l in range(self.num_orders)) new_data[..., h_bin] = simps(table_fine, mu_fine) - # new_data[..., h_bin] = \ - # simps(np.sum((l + 0.5) * - # eval_legendre(l, mu_fine) * - # orig_data[..., l] - # for l in range(self.num_orders)), - # mu_fine) # Remove the very small results from numerical precision # issues (allowing conversions to be reproduced exactly) diff --git a/src/scattdata_header.F90 b/src/scattdata_header.F90 index 3d9df0bbf0..511e2a2376 100644 --- a/src/scattdata_header.F90 +++ b/src/scattdata_header.F90 @@ -522,7 +522,7 @@ contains gout = this % gmin(gin) prob = this % energy(gin) % data(gout) - do while (prob < xi) + do while ((prob < xi) .and. (gout < this % gmax(gin))) gout = gout + 1 prob = prob + this % energy(gin) % data(gout) end do @@ -568,7 +568,7 @@ contains gout = this % gmin(gin) prob = this % energy(gin) % data(gout) - do while (prob < xi) + do while ((prob < xi) .and. (gout < this % gmax(gin))) gout = gout + 1 prob = prob + this % energy(gin) % data(gout) end do @@ -605,7 +605,7 @@ contains gout = this % gmin(gin) prob = this % energy(gin) % data(gout) - do while (prob < xi) + do while ((prob < xi) .and. (gout < this % gmax(gin))) gout = gout + 1 prob = prob + this % energy(gin) % data(gout) end do From 8093f3654de5decaf4f90ec18a429a49f2bfcf64 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 12 Feb 2017 20:36:39 -0500 Subject: [PATCH 06/66] Tested scattering rigorously which resulted in some changes --- openmc/mgxs_library.py | 73 +++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index b2dee39489..14fb3dddc9 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1865,7 +1865,7 @@ class XSdata(object): eval_legendre(l, mu_fine) for l in range(xsdata.num_orders)] for l in range(xsdata.num_orders): - new_data[..., l] = (l + 0.5) * simps(y[l], mu_fine) + new_data[..., l] = simps(y[l], mu_fine) # Remove the very small results from numerical precision # issues (allowing conversions to be reproduced exactly) @@ -1893,38 +1893,30 @@ class XSdata(object): new_data[..., np.abs(new_data) < 1.E-10] = 0. elif self.scatter_format == 'histogram': # The histogram format does not have enough information to - # convert to the other forms without inducing an error. - # We will make the assumption that the left-edge of the bin - # has the value of the bin. The mu=1 value will be extrapolated - # from the previous two points. - mu_self = np.linspace(-1, 1, self.num_orders + 1) - tab_data = np.zeros(orig_data.shape[:-1] + - (orig_data.shape[-1] + 1,)) - tab_data[..., :-1] = orig_data - tab_data[..., -1] = (orig_data[..., -2] - - orig_data[..., -3]) + orig_data[..., -2] - # Now get the distribution normalization factor. - # This factor will be such that its average value is the - # group -> group cross section (which is the sum of the - # original data) - norm = np.sum(orig_data, axis=-1) / np.mean(tab_data, axis=-1) - norm = np.nan_to_num(norm) - for i in range(tab_data.shape[-1]): - tab_data[..., i] *= norm[...] + # convert to the other forms without inducing some amount of + # error. We will make the assumption that the center of the bin + # has the value of the bin. The mu=-1 and 1 points will be + # extrapolated from the shape. + mu_midpoint = np.linspace(-1, 1, self.num_orders, + endpoint=False) + mu_midpoint += (mu_midpoint[1] - mu_midpoint[0]) * 0.5 + interp = interp1d(mu_midpoint, orig_data, + fill_value='extrapolate') + # Now get the distribution normalization factor to take from + # an integral quantity to a point-wise quantity + norm = float(self.num_orders) / 2.0 - # We now have a tabular distribution in tab_data on mu_self - # with a normalization in norm. We now proceed just like the - # tabular branch above. + # We now have a tabular distribution in tab_data on mu_self. + # We now proceed just like the tabular branch above. if target_format == 'legendre': # find the legendre coefficients via integration. To best # use the vectorized integration capabilities of scipy, # this will be done with fixed sample integration routines. mu_fine = np.linspace(-1, 1, _NMU) - y = [interp1d(mu_self, tab_data)(mu_fine) * - eval_legendre(l, mu_fine) + y = [interp(mu_fine) * norm * eval_legendre(l, mu_fine) for l in range(xsdata.num_orders)] for l in range(xsdata.num_orders): - new_data[..., l] = (l + 0.5) * simps(y[l], mu_fine) + new_data[..., l] = simps(y[l], mu_fine) # Remove the very small results from numerical precision # issues (allowing conversions to be reproduced exactly) @@ -1932,7 +1924,7 @@ class XSdata(object): elif target_format == 'tabular': # Simply use an interpolating function to get the new data mu = np.linspace(-1, 1, xsdata.num_orders) - new_data[..., :] = interp1d(mu_self, tab_data)(mu) + new_data[..., :] = interp(mu) * norm elif target_format == 'histogram': # Use an interpolating function to do the bin-wise # integrals @@ -1942,15 +1934,14 @@ class XSdata(object): # be written to utilize the vectorized integration # capabilities instead of having an isotropic and # angle representation path. - interp = interp1d(mu_self, tab_data) for h_bin in range(xsdata.num_orders): mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) - new_data[..., h_bin] = simps(interp(mu_fine), mu_fine) + new_data[..., h_bin] = \ + norm * simps(interp(mu_fine), mu_fine) # Remove the very small results from numerical precision # issues (allowing conversions to be reproduced exactly) new_data[..., np.abs(new_data) < 1.E-10] = 0. - xsdata.set_scatter_matrix(new_data, temp) return xsdata @@ -2107,10 +2098,18 @@ class XSdata(object): # lines within each of the outgoing groups scatt_eouts = [] for g in range(self.energy_groups.num_groups): + nz = np.nonzero(energy[g, :]) + lo = nz[0][0] + hi = nz[0][-1] + 1 + # scatt_eouts.append( + # openmc.stats.Discrete(energy_midpoints[lo: hi], + # energy[g, lo:hi])) scatt_eouts.append( - openmc.stats.Discrete(energy_midpoints, energy[g, :])) + openmc.stats.Tabular(self.energy_groups.group_edges[:-1], + energy[g, :], + interpolation='histogram')) # Ensure the distribution CDF starts with 0 - scatt_eouts[-1].c = np.cumsum(energy[g, :]) - energy[g, 0] + scatt_eouts[-1].c = np.cumsum(energy[g, lo:hi]) - energy[g, lo] scatt_eouts.append(scatt_eouts[-1]) # Build the angular distributions associated with each outgoing energy @@ -2120,11 +2119,13 @@ class XSdata(object): for gin in range(self.energy_groups.num_groups): scatt_angles.append([]) for gout in range(self.energy_groups.num_groups): - scatt_angles[gin].append( - openmc.stats.Tabular(mu, distrib[gin, gout, :])) - # Ensure the distribution CDF starts with 0 - scatt_angles[gin][-1].c = \ - np.cumsum(distrib[gin, gout, :]) - distrib[gin, gout, 0] + if energy[gin, gout] > 0.: + scatt_angles[gin].append( + openmc.stats.Tabular(mu, distrib[gin, gout, :])) + # Ensure the distribution CDF starts with 0 + scatt_angles[gin][-1].c = \ + np.cumsum(distrib[gin, gout, :]) - \ + distrib[gin, gout, 0] scatt_angles.append(scatt_angles[-1]) # Combine the energy and angle distributions in to a correlated From 13bbabd8cfa388593ea51ee2ab256480b66b8d22 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Mon, 13 Feb 2017 19:51:25 -0500 Subject: [PATCH 07/66] old code cleanup --- openmc/mgxs_library.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 14fb3dddc9..b4482d60b9 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -2098,18 +2098,12 @@ class XSdata(object): # lines within each of the outgoing groups scatt_eouts = [] for g in range(self.energy_groups.num_groups): - nz = np.nonzero(energy[g, :]) - lo = nz[0][0] - hi = nz[0][-1] + 1 - # scatt_eouts.append( - # openmc.stats.Discrete(energy_midpoints[lo: hi], - # energy[g, lo:hi])) scatt_eouts.append( openmc.stats.Tabular(self.energy_groups.group_edges[:-1], energy[g, :], interpolation='histogram')) # Ensure the distribution CDF starts with 0 - scatt_eouts[-1].c = np.cumsum(energy[g, lo:hi]) - energy[g, lo] + scatt_eouts[-1].c = np.cumsum(energy[g, :]) - energy[g, 0] scatt_eouts.append(scatt_eouts[-1]) # Build the angular distributions associated with each outgoing energy From 130db90c2a74f5a24e4248ef2d0bed8f7b81e4fa Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 15 Feb 2017 20:27:31 -0500 Subject: [PATCH 08/66] cleaned up comments and removed the conversion to CE --- openmc/mgxs_library.py | 268 ++++++----------------------------------- 1 file changed, 36 insertions(+), 232 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index b4482d60b9..e3a8ad4d85 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1721,22 +1721,19 @@ class XSdata(object): check_greater_than('num_azimuthal', num_azimuthal, 0) xsdata = copy.deepcopy(self) + + # First handle the case where the current and requested + # representations are the same if target_representation == self.representation: # Check to make sure the num_polar and num_azimuthal values match if target_representation == 'angle': if num_polar != self.num_polar or num_azimuthal != self.num_azimuthal: - raise NotImplementedError("XSdata.convert_representation " - "cannot translate between " + raise NotImplementedError("XCannot translate between " "`angle` representations with " "different angle bin structures") - # Nothing to do + # Nothing to do as the same structure was requested return xsdata - types = ['total', 'absorption', 'fission', 'nu_fission', - 'scatter_matrix', 'multiplicity_matrix', 'prompt_nu_fission', - 'delayed_nu_fission', 'kappa_fission', 'chi', 'chi_prompt', - 'chi_delayed', 'beta', 'decay_rate', 'inverse_velocity'] - xsdata.representation = target_representation # We have different actions depending on the representation conversion if target_representation == 'isotropic': @@ -1748,17 +1745,21 @@ class XSdata(object): xsdata.num_polar = num_polar xsdata.num_azimuthal = num_azimuthal - # Reset XSdata.xs_shapes to accomodate the new shape + # Reset xs_shapes so it is recalculated the next time it is needed xsdata._xs_shapes = None for i, temp in enumerate(xsdata.temperatures): - for xs in types: + for xs in ['total', 'absorption', 'fission', 'nu_fission', + 'scatter_matrix', 'multiplicity_matrix', + 'prompt_nu_fission', 'delayed_nu_fission', + 'kappa_fission', 'chi', 'chi_prompt', 'chi_delayed', + 'beta', 'decay_rate', 'inverse_velocity']: # Get the original data orig_data = getattr(self, '_' + xs)[i] if orig_data is not None: if target_representation == 'isotropic': # Since we are going from angle to isotropic, the - # current data is just averaged over the angle bins + # current data is just the average over the angle bins new_data = orig_data.mean(axis=(0, 1)) elif target_representation == 'angle': # Since we are going from isotropic to angle, the @@ -1787,7 +1788,7 @@ class XSdata(object): Returns ------- openmc.XSdata - Multi-group cross section data with the same data as self, but + Multi-group cross section data with the same data as in self, but represented as specified in :param:`target_format`. """ @@ -1806,15 +1807,11 @@ class XSdata(object): xsdata = copy.deepcopy(self) xsdata.scatter_format = target_format xsdata.order = target_order - # Reset XSdata.xs_shapes to accomodate the new shape + + # Reset and re-generate XSdata.xs_shapes with the new scattering format xsdata._xs_shapes = None xsdata.xs_shapes - # We have to accomodate the following possibilities: - # histogram -> tabular w/ same or diff order - # histogram -> legendre - # histogram -> histogram w/ same or diff order - for i, temp in enumerate(xsdata.temperatures): orig_data = self._scatter_matrix[i] new_shape = orig_data.shape[:-1] + (xsdata.num_orders,) @@ -1827,21 +1824,23 @@ class XSdata(object): new_data[..., :order] = orig_data[..., :order] elif target_format == 'tabular': mu = np.linspace(-1, 1, xsdata.num_orders) - # Evaluate the legendre on the tabular grid within mu + # Evaluate the legendre on the mu grid for imu in range(len(mu)): new_data[..., imu] = \ np.sum((l + 0.5) * eval_legendre(l, mu[imu]) * orig_data[..., l] for l in range(self.num_orders)) elif target_format == 'histogram': + # This code uses the vectorized integration capabilities + # instead of having an isotropic and angle representation + # path. + # Set the histogram mu grid mu = np.linspace(-1, 1, xsdata.num_orders + 1) - # This code will be written to utilize the vectorized - # integration capabilities instead of having an isotropic - # and angle representation path. + # For every bin perform simpson integration of a finely + # sampled orig_data for h_bin in range(xsdata.num_orders): mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) - table_shape = new_data.shape[:-1] + (_NMU,) - table_fine = np.zeros(table_shape) + table_fine = np.zeros(new_data.shape[:-1] + (_NMU,)) for imu in range(len(mu_fine)): table_fine[..., imu] = \ np.sum((l + 0.5) * @@ -1850,16 +1849,17 @@ class XSdata(object): for l in range(self.num_orders)) new_data[..., h_bin] = simps(table_fine, mu_fine) - # Remove the very small results from numerical precision - # issues (allowing conversions to be reproduced exactly) + # Remove the very small values resulting from numerical + # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. elif self.scatter_format == 'tabular': + # Calculate the mu points of the current data mu_self = np.linspace(-1, 1, self.num_orders) if target_format == 'legendre': - # find the legendre coefficients via integration. To best + # Find the Legendre coefficients via integration. To best # use the vectorized integration capabilities of scipy, - # this will be done with fixed sample integration routines. + # this is done with fixed sample integration routines. mu_fine = np.linspace(-1, 1, _NMU) y = [interp1d(mu_self, orig_data)(mu_fine) * eval_legendre(l, mu_fine) @@ -1867,8 +1867,8 @@ class XSdata(object): for l in range(xsdata.num_orders): new_data[..., l] = simps(y[l], mu_fine) - # Remove the very small results from numerical precision - # issues (allowing conversions to be reproduced exactly) + # Remove the very small values resulting from numerical + # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. elif target_format == 'tabular': # Simply use an interpolating function to get the new data @@ -1888,8 +1888,8 @@ class XSdata(object): mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) new_data[..., h_bin] = simps(interp(mu_fine), mu_fine) - # Remove the very small results from numerical precision - # issues (allowing conversions to be reproduced exactly) + # Remove the very small values resulting from numerical + # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. elif self.scatter_format == 'histogram': # The histogram format does not have enough information to @@ -1918,8 +1918,8 @@ class XSdata(object): for l in range(xsdata.num_orders): new_data[..., l] = simps(y[l], mu_fine) - # Remove the very small results from numerical precision - # issues (allowing conversions to be reproduced exactly) + # Remove the very small values resulting from numerical + # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. elif target_format == 'tabular': # Simply use an interpolating function to get the new data @@ -1939,209 +1939,13 @@ class XSdata(object): new_data[..., h_bin] = \ norm * simps(interp(mu_fine), mu_fine) - # Remove the very small results from numerical precision - # issues (allowing conversions to be reproduced exactly) + # Remove the very small values resulting from numerical + # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. xsdata.set_scatter_matrix(new_data, temp) return xsdata - def convert_to_continuous_energy(self, temperature=294.): - """Converts the XSdata object to an equivalent - openmc.data.IncidentNeutron object. - - Parameters - ---------- - temperature : float - Temperature of dataset to print; defaults to 294K - - Returns - ------- - openmc.data.IncidentNeutron - The continuous-energy IncidentNeutron data library equivalent - to the MGXS data in self - """ - - # Check if this can be performed successfully - if self.representation == 'angle': - raise ValueError("Cannot convert angle-dependent MGXS; convert to " - "an isotropic representation first") - required_types = ['absorption', 'scatter_matrix'] - for type_check in required_types: - if getattr(self, '_' + type_check)[0] is None: - raise ValueError(type_check + ' data is required') - if temperature not in self.temperatures: - raise ValueError("Invalid temperature") - - def convert_xs(group_edges, values): - cexs = openmc.data.Tabulated1D(group_edges, - np.append(values[::-1], - [values[0]]), - breakpoints=[len(group_edges)], - interpolation=[1]) - return cexs - - # Build required metadata - kTs = self.temperatures[:] * openmc.data.K_BOLTZMANN - if self.atomic_weight_ratio: - awr = self.atomic_weight_ratio - else: - awr = 1. - - # Get the temperature index - iT = np.where(self.temperatures == temperature)[0][0] - data = openmc.data.IncidentNeutron(self.name, 1, 1, 0, awr, kTs) - strT = "{}K".format(int(round(self.temperatures[iT]))) - data.energy = {strT: self.energy_groups.group_edges} - energy_midpoints = (self.energy_groups.group_edges[1:] + - self.energy_groups.group_edges[:-1]) / 2. - - # Elastic MGXS: must explicitly be 0 barns to avoid incorrect - # elastic_scatter calculation with data available to us in MG library. - el_rxn = openmc.data.Reaction(2) - el_rxn.xs[strT] = \ - convert_xs(self.energy_groups.group_edges, - np.zeros(self.energy_groups.num_groups)) - data.reactions[2] = el_rxn - - # Absorption MGXS - abs_rxn = openmc.data.Reaction(102) - abs_rxn.xs[strT] = convert_xs(self.energy_groups.group_edges, - np.subtract(self._absorption[iT], - self._fission[iT])) - data.reactions[102] = abs_rxn - - if self._nu_fission[iT] is not None and self._fission[iT] is not None: - fiss_rxn = openmc.data.Reaction(18) - fiss_rxn.xs[strT] = convert_xs(self.energy_groups.group_edges, - self._fission[iT]) - - # Get nu_fission and chi from the presence of both, or the - # nu_fission matrix - if self._nu_fission[iT].shape == self.xs_shapes["[G][G']"]: - nu_fiss = np.sum(self._nu_fission[iT], axis=1)[::-1] - chi = self._nu_fission[iT][::-1] / nu_fiss - else: - nu_fiss = self._nu_fission[iT][::-1] - chi = np.reshape(np.tile(self._chi[iT][::-1], - self.energy_groups.num_groups), - (self.energy_groups.num_groups, - self.energy_groups.num_groups)) - nu = np.divide(nu_fiss, self._fission[iT][::-1]) - - # Build a histogram distribution to represent the yield for the - # incoming groups - prod = openmc.data.Product() - prod.yield_ = \ - openmc.data.Tabulated1D(self.energy_groups.group_edges[:-1], - nu, breakpoints=[len(nu)], - interpolation=[1]) - - # Now build the outgoing energy distribution using discrete energy - # lines within each of the outgoing groups - chi_eouts = [] - for g in range(self.energy_groups.num_groups): - chi_eouts.append(openmc.stats.Discrete(energy_midpoints, - chi[g, :])) - # Ensure the distribution CDF starts with 0 - chi_eouts[-1].c = np.cumsum(chi[g, :]) - chi[g, 0] - - # Create the continuous distribution for the fission - # The angular distribution will remain None (thus isotropic) - chi_distrib = openmc.data.ContinuousTabular( - [len(chi)], [1], self.energy_groups.group_edges[:-1], - chi_eouts) - prod.distribution = \ - [openmc.data.UncorrelatedAngleEnergy(energy=chi_distrib)] - fiss_rxn.products = [prod] - fiss_rxn.center_of_mass = False - data.reactions[18] = fiss_rxn - - # Scattering Data - # First convert the data to a tabular representation - if self.scatter_format == 'tabular': - tabular = self - else: - tabular = self.convert_scatter_format('tabular', 33) - - # Calculate the isotropic scattering matrix and use that to find the - # total scattering x/s and outgoing energy distributions - isotropic_matrix = np.mean(tabular._scatter_matrix[iT], axis=-1)[::-1, - ::-1] - scatt_xs = np.sum(isotropic_matrix, axis=1) - energy = np.zeros((self.energy_groups.num_groups, - self.energy_groups.num_groups)) - for gin in range(self.energy_groups.num_groups): - energy[gin, :] = isotropic_matrix[gin, :] / scatt_xs[gin] - - # Get the anisotropic but normalized angular distribution - distrib = np.zeros((self.energy_groups.num_groups, - self.energy_groups.num_groups, - tabular.num_orders)) - for gin in range(self.energy_groups.num_groups): - for gout in range(self.energy_groups.num_groups): - distrib[gin, gout, :] = \ - np.divide(tabular._scatter_matrix[iT][gin, gout, :], - isotropic_matrix[gin, gout]) - distrib = np.nan_to_num(distrib) - - # Incorporate the scattering multiplication, if required - scatt_prod = openmc.data.Product() - if self._multiplicity_matrix[iT]: - yield_ = self._multiplicity_matrix[iT][::-1, ::-1] - scatt_prod.yield_ = \ - openmc.data.Tabulated1D(self.energy_groups.group_edges[:-1], - yield_, breakpoints=[len(yield_)], - interpolation=[1]) - - # Now build the outgoing energy distribution using discrete energy - # lines within each of the outgoing groups - scatt_eouts = [] - for g in range(self.energy_groups.num_groups): - scatt_eouts.append( - openmc.stats.Tabular(self.energy_groups.group_edges[:-1], - energy[g, :], - interpolation='histogram')) - # Ensure the distribution CDF starts with 0 - scatt_eouts[-1].c = np.cumsum(energy[g, :]) - energy[g, 0] - scatt_eouts.append(scatt_eouts[-1]) - - # Build the angular distributions associated with each outgoing energy - # group - mu = np.linspace(-1., 1., tabular.num_orders) - scatt_angles = [] - for gin in range(self.energy_groups.num_groups): - scatt_angles.append([]) - for gout in range(self.energy_groups.num_groups): - if energy[gin, gout] > 0.: - scatt_angles[gin].append( - openmc.stats.Tabular(mu, distrib[gin, gout, :])) - # Ensure the distribution CDF starts with 0 - scatt_angles[gin][-1].c = \ - np.cumsum(distrib[gin, gout, :]) - \ - distrib[gin, gout, 0] - scatt_angles.append(scatt_angles[-1]) - - # Combine the energy and angle distributions in to a correlated - # angle/energy object - scatt_prod.distribution = \ - [openmc.data.CorrelatedAngleEnergy( - breakpoints=[len(scatt_eouts)], interpolation=[1], - energy=self.energy_groups.group_edges[:-1], - energy_out=scatt_eouts, mu=scatt_angles)] - - # Finally build the reaction with the just-calculated information - # This will be set to the (n,2n) reaction, though any scattering - # reaction would suffice - scatt_rxn = openmc.data.Reaction(16) - scatt_rxn.xs[strT] = \ - convert_xs(self.energy_groups.group_edges, scatt_xs[::-1]) - scatt_rxn.products = [scatt_prod] - scatt_rxn.center_of_mass = False - data.reactions[16] = scatt_rxn - - return data - def to_hdf5(self, file): """Write XSdata to an HDF5 file From 855c1ca19bcecb82e9c7b5c9a497a7236c1f3ca8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 16 Jan 2017 19:58:15 -0600 Subject: [PATCH 09/66] Build OpenMC as a library (all except main.F90) --- CMakeLists.txt | 100 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64eee2e9f5..098de3de2a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -266,15 +266,105 @@ add_library(faddeeva STATIC src/Faddeeva.c) #=============================================================================== set(program "openmc") -file(GLOB source src/*.F90 src/xml/openmc_fox.F90) -add_executable(${program} ${source}) +set(LIBOPENMC_FORTRAN_SRC + src/algorithm.F90 + src/angle_distribution.F90 + src/angleenergy_header.F90 + src/bank_header.F90 + src/cmfd_data.F90 + src/cmfd_execute.F90 + src/cmfd_header.F90 + src/cmfd_input.F90 + src/cmfd_loss_operator.F90 + src/cmfd_prod_operator.F90 + src/cmfd_solver.F90 + src/constants.F90 + src/cross_section.F90 + src/dict_header.F90 + src/distribution_multivariate.F90 + src/distribution_univariate.F90 + src/doppler.F90 + src/eigenvalue.F90 + src/endf.F90 + src/endf_header.F90 + src/energy_distribution.F90 + src/energy_grid.F90 + src/error.F90 + src/finalize.F90 + src/geometry.F90 + src/geometry_header.F90 + src/global.F90 + src/hdf5_interface.F90 + src/initialize.F90 + src/input_xml.F90 + src/list_header.F90 + src/material_header.F90 + src/math.F90 + src/matrix_header.F90 + src/mesh.F90 + src/mesh_header.F90 + src/message_passing.F90 + src/mgxs_data.F90 + src/mgxs_header.F90 + src/multipole.F90 + src/multipole_header.F90 + src/nuclide_header.F90 + src/output.F90 + src/particle_header.F90 + src/particle_restart.F90 + src/particle_restart_write.F90 + src/physics_common.F90 + src/physics.F90 + src/physics_mg.F90 + src/plot.F90 + src/plot_header.F90 + src/ppmlib.F90 + src/product_header.F90 + src/progress_header.F90 + src/random_lcg.F90 + src/reaction_header.F90 + src/relaxng + src/sab_header.F90 + src/scattdata_header.F90 + src/secondary_correlated.F90 + src/secondary_kalbach.F90 + src/secondary_nbody.F90 + src/secondary_uncorrelated.F90 + src/set_header.F90 + src/simulation.F90 + src/source.F90 + src/source_header.F90 + src/state_point.F90 + src/stl_vector.F90 + src/string.F90 + src/summary.F90 + src/surface_header.F90 + src/tally.F90 + src/tally_filter.F90 + src/tally_filter_header.F90 + src/tally_header.F90 + src/tally_initialize.F90 + src/timer_header.F90 + src/tracking.F90 + src/track_output.F90 + src/trigger.F90 + src/trigger_header.F90 + src/urr_header.F90 + src/vector_header.F90 + src/volume_calc.F90 + src/volume_header.F90 + src/xml_interface.F90 + src/xml/openmc_fox.F90) +add_library(libopenmc STATIC ${LIBOPENMC_FORTRAN_SRC}) +set_target_properties(libopenmc PROPERTIES OUTPUT_NAME openmc) +add_executable(${program} src/main.F90) # 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}) + target_include_directories(libopenmc PUBLIC ${HDF5_INCLUDE_DIRS}) endif() # target_compile_options was added in CMake 2.8.12 and is the recommended way to @@ -288,6 +378,7 @@ if (CMAKE_VERSION VERSION_LESS 2.8.12) set_property(TARGET faddeeva PROPERTY COMPILE_FLAGS "${cflags}") else() target_compile_options(${program} PUBLIC ${f90flags}) + target_compile_options(libopenmc PUBLIC ${f90flags}) target_compile_options(faddeeva PRIVATE ${cflags}) endif() @@ -298,7 +389,8 @@ 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 faddeeva) +target_link_libraries(libopenmc ${ldflags} ${HDF5_LIBRARIES} fox_dom faddeeva) +target_link_libraries(${program} ${ldflags} libopenmc) #=============================================================================== # Install executable, scripts, manpage, license From 50220c0ef1bc4aafc122576ceff2e00b65bb655b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 18 Jan 2017 07:01:30 -0600 Subject: [PATCH 10/66] Pass MPI intracommunicator to initialize subroutine --- src/cmfd_execute.F90 | 22 +++++++------------- src/cmfd_input.F90 | 1 + src/cmfd_solver.F90 | 6 ++++-- src/eigenvalue.F90 | 20 +++++++++--------- src/error.F90 | 4 +--- src/finalize.F90 | 19 ++++++++--------- src/global.F90 | 15 -------------- src/hdf5_interface.F90 | 10 ++++----- src/initialize.F90 | 45 ++++++++++++++++++++++++----------------- src/input_xml.F90 | 1 + src/main.F90 | 15 +++++++++----- src/mesh.F90 | 11 ++++------ src/message_passing.F90 | 17 ++++++++++++++++ src/output.F90 | 1 + src/physics.F90 | 1 + src/physics_mg.F90 | 1 + src/simulation.F90 | 7 ++----- src/source.F90 | 1 + src/state_point.F90 | 30 ++++++++++++--------------- src/summary.F90 | 1 + src/tally.F90 | 17 +++++++--------- src/tracking.F90 | 1 + src/trigger.F90 | 1 + src/volume_calc.F90 | 8 ++++---- 24 files changed, 126 insertions(+), 129 deletions(-) diff --git a/src/cmfd_execute.F90 b/src/cmfd_execute.F90 index a5d92002b8..b1f0041d32 100644 --- a/src/cmfd_execute.F90 +++ b/src/cmfd_execute.F90 @@ -22,6 +22,7 @@ contains use cmfd_data, only: set_up_cmfd use cmfd_solver, only: cmfd_solver_execute use error, only: warning, fatal_error + use message_passing, only: master ! CMFD single processor on master if (master) then @@ -90,13 +91,9 @@ contains subroutine calc_fission_source() use constants, only: CMFD_NOACCEL, ZERO, TWO - use global, only: cmfd, cmfd_coremap, master, entropy_on, current_batch - use string, only: to_str - -#ifdef MPI - use global, only: mpi_err + use global, only: cmfd, cmfd_coremap, entropy_on, current_batch use message_passing -#endif + use string, only: to_str integer :: nx ! maximum number of cells in x direction integer :: ny ! maximum number of cells in y direction @@ -202,7 +199,7 @@ contains #ifdef MPI ! Broadcast full source to all procs - call MPI_BCAST(cmfd % cmfd_src, n, MPI_REAL8, 0, MPI_COMM_WORLD, mpi_err) + call MPI_BCAST(cmfd % cmfd_src, n, MPI_REAL8, 0, mpi_intracomm, mpi_err) #endif end subroutine calc_fission_source @@ -216,16 +213,11 @@ contains use algorithm, only: binary_search use constants, only: ZERO, ONE use error, only: warning, fatal_error - use global, only: meshes, source_bank, work, n_user_meshes, cmfd, & - master + use global, only: meshes, source_bank, work, n_user_meshes, cmfd use mesh_header, only: RegularMesh use mesh, only: count_bank_sites, get_mesh_indices - use string, only: to_str - -#ifdef MPI - use global, only: mpi_err use message_passing -#endif + use string, only: to_str logical, intent(in) :: new_weights ! calcualte new weights @@ -289,7 +281,7 @@ contains ! Broadcast weight factors to all procs #ifdef MPI call MPI_BCAST(cmfd % weightfactors, ng*nx*ny*nz, MPI_REAL8, 0, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) #endif end if diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index f107627503..95e1b1811b 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -15,6 +15,7 @@ contains subroutine configure_cmfd() use cmfd_header, only: allocate_cmfd + use message_passing, only: master integer :: color ! color group of processor diff --git a/src/cmfd_solver.F90 b/src/cmfd_solver.F90 index 84f0016d3d..fb687d10b4 100644 --- a/src/cmfd_solver.F90 +++ b/src/cmfd_solver.F90 @@ -301,10 +301,12 @@ contains subroutine convergence(iter, innerits, iconv) - use constants, only: ONE, ZERO - use global, only: cmfd_power_monitor, master use, intrinsic :: ISO_FORTRAN_ENV + use constants, only: ONE, ZERO + use global, only: cmfd_power_monitor + use message_passing, only: master + integer, intent(in) :: iter ! outer iteration number integer, intent(in) :: innerits ! inner iteration nubmer logical, intent(out) :: iconv ! convergence logical diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 05c8190a65..a930f4410b 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -1,8 +1,5 @@ module eigenvalue -#ifdef MPI - use message_passing -#endif use algorithm, only: binary_search use constants, only: ZERO @@ -11,6 +8,7 @@ module eigenvalue use math, only: t_percentile use mesh, only: count_bank_sites use mesh_header, only: RegularMesh + use message_passing use random_lcg, only: prn, set_particle_seed, advance_prn_seed use string, only: to_str @@ -66,7 +64,7 @@ contains #ifdef MPI start = 0_8 call MPI_EXSCAN(n_bank, start, 1, MPI_INTEGER8, MPI_SUM, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) ! While we would expect the value of start on rank 0 to be 0, the MPI ! standard says that the receive buffer on rank 0 is undefined and not @@ -76,7 +74,7 @@ contains finish = start + n_bank total = finish call MPI_BCAST(total, 1, MPI_INTEGER8, n_procs - 1, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) #else start = 0_8 @@ -150,13 +148,13 @@ contains ! First do an exclusive scan to get the starting indices for start = 0_8 call MPI_EXSCAN(index_temp, start, 1, MPI_INTEGER8, MPI_SUM, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) finish = start + index_temp ! Allocate space for bank_position if this hasn't been done yet if (.not. allocated(bank_position)) allocate(bank_position(n_procs)) call MPI_ALLGATHER(start, 1, MPI_INTEGER8, bank_position, 1, & - MPI_INTEGER8, MPI_COMM_WORLD, mpi_err) + MPI_INTEGER8, mpi_intracomm, mpi_err) #else start = 0_8 finish = index_temp @@ -210,7 +208,7 @@ contains if (neighbor /= rank) then n_request = n_request + 1 call MPI_ISEND(temp_sites(index_local), int(n), MPI_BANK, neighbor, & - rank, MPI_COMM_WORLD, request(n_request), mpi_err) + rank, mpi_intracomm, request(n_request), mpi_err) end if ! Increment all indices @@ -254,7 +252,7 @@ contains n_request = n_request + 1 call MPI_IRECV(source_bank(index_local), int(n), MPI_BANK, & - neighbor, neighbor, MPI_COMM_WORLD, request(n_request), mpi_err) + neighbor, neighbor, mpi_intracomm, request(n_request), mpi_err) else ! If the source sites are on this procesor, we can simply copy them @@ -379,7 +377,7 @@ contains #ifdef MPI ! Combine values across all processors call MPI_ALLREDUCE(keff_generation, k_generation(overall_gen), 1, & - MPI_REAL8, MPI_SUM, MPI_COMM_WORLD, mpi_err) + MPI_REAL8, MPI_SUM, mpi_intracomm, mpi_err) #else k_generation(overall_gen) = keff_generation #endif @@ -565,7 +563,7 @@ contains #ifdef MPI ! Send source fraction to all processors n = product(ufs_mesh % dimension) - call MPI_BCAST(source_frac, n, MPI_REAL8, 0, MPI_COMM_WORLD, mpi_err) + call MPI_BCAST(source_frac, n, MPI_REAL8, 0, mpi_intracomm, mpi_err) #endif ! Normalize to total weight to get fraction of source in each cell diff --git a/src/error.F90 b/src/error.F90 index 9e5ca84792..1bb6b5257b 100644 --- a/src/error.F90 +++ b/src/error.F90 @@ -3,9 +3,7 @@ module error use, intrinsic :: ISO_FORTRAN_ENV use constants -#ifdef MPI use message_passing -#endif implicit none @@ -139,7 +137,7 @@ contains #ifdef MPI ! Abort MPI - call MPI_ABORT(MPI_COMM_WORLD, code, mpi_err) + call MPI_ABORT(mpi_intracomm, code, mpi_err) #endif ! Abort program diff --git a/src/finalize.F90 b/src/finalize.F90 index 83a5ac5fae..7ad99d0b55 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -1,17 +1,14 @@ module finalize + use hdf5, only: h5tclose_f, h5close_f + use global + use hdf5_interface, only: hdf5_bank_t + use message_passing use output, only: print_runtime, print_results, & print_overlap_check, write_tallies use tally, only: tally_statistics -#ifdef MPI - use message_passing -#endif - - use hdf5_interface, only: hdf5_bank_t - use hdf5, only: h5tclose_f, h5close_f - implicit none contains @@ -21,7 +18,7 @@ contains ! statistics and writing out tallies !=============================================================================== - subroutine finalize_run() + subroutine openmc_finalize() integer :: hdf5_err @@ -66,7 +63,7 @@ contains call MPI_FINALIZE(mpi_err) #endif - end subroutine finalize_run + end subroutine openmc_finalize !=============================================================================== ! REDUCE_OVERLAP_COUNT accumulates cell overlap check counts to master @@ -77,10 +74,10 @@ contains #ifdef MPI if (master) then call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) else call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) end if #endif diff --git a/src/global.F90 b/src/global.F90 index 02f6870189..c483672147 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -267,21 +267,6 @@ module global ! ============================================================================ ! PARALLEL PROCESSING VARIABLES - ! The defaults set here for the number of processors, rank, and master and - ! mpi_enabled flag are for when MPI is not being used at all, i.e. a serial - ! run. In this case, these variables are still used at times. - - integer :: n_procs = 1 ! number of processes - integer :: rank = 0 ! rank of process - logical :: master = .true. ! master process? - logical :: mpi_enabled = .false. ! is MPI in use and initialized? - integer :: mpi_err ! MPI error code -#ifdef MPIF08 - type(MPI_Datatype) :: MPI_BANK -#else - integer :: MPI_BANK ! MPI datatype for fission bank -#endif - #ifdef _OPENMP integer :: n_threads = NONE ! number of OpenMP threads integer :: thread_id ! ID of a given thread diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 5e14605ae4..e588cda146 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -17,7 +17,7 @@ module hdf5_interface use error, only: fatal_error #ifdef PHDF5 - use message_passing, only: MPI_COMM_WORLD, MPI_INFO_NULL + use message_passing, only: mpi_intracomm, MPI_INFO_NULL #endif implicit none @@ -124,10 +124,10 @@ contains 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, & + call h5pset_fapl_mpio_f(plist, mpi_intracomm%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_intracomm, MPI_INFO_NULL, hdf5_err) #endif #endif @@ -174,10 +174,10 @@ contains 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, & + call h5pset_fapl_mpio_f(plist, mpi_intracomm%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_intracomm, MPI_INFO_NULL, hdf5_err) #endif #endif diff --git a/src/initialize.F90 b/src/initialize.F90 index 692319acb8..2101333b7a 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -1,5 +1,12 @@ module initialize + use, intrinsic :: ISO_C_BINDING, only: c_loc + + use hdf5 +#ifdef _OPENMP + use omp_lib +#endif + use bank_header, only: Bank use constants use dict_header, only: DictIntInt, ElemKeyValueII @@ -15,6 +22,7 @@ module initialize hdf5_integer8_t use input_xml, only: read_input_xml, cells_in_univ_dict, read_plots_xml use material_header, only: Material + use message_passing use mgxs_data, only: read_mgxs, create_macro_xs use output, only: title, header, print_version, write_message, & print_usage, print_plot @@ -27,30 +35,23 @@ module initialize use tally_filter use tally, only: init_tally_routines -#ifdef MPI - use message_passing -#endif - -#ifdef _OPENMP - use omp_lib -#endif - - use hdf5 - - use, intrinsic :: ISO_C_BINDING, only: c_loc - implicit none contains !=============================================================================== -! INITIALIZE_RUN takes care of all initialization tasks, i.e. reading +! OPENMC_INIT takes care of all initialization tasks, i.e. reading ! from command line, reading xml input files, initializing random ! number seeds, reading cross sections, initializing starting source, ! setting up timers, etc. !=============================================================================== - subroutine initialize_run() + subroutine openmc_init(intracomm) +#ifdef MPIF08 + type(MPI_Comm), intent(in) :: intracomm +#else + integer, intent(in), optional :: intracomm +#endif ! Start total and initialization timer call time_total%start() @@ -58,7 +59,7 @@ contains #ifdef MPI ! Setup MPI - call initialize_mpi() + call initialize_mpi(intracomm) #endif ! Initialize HDF5 interface @@ -155,7 +156,7 @@ contains ! Stop initialization timer call time_initialize%stop() - end subroutine initialize_run + end subroutine openmc_init #ifdef MPI !=============================================================================== @@ -164,7 +165,12 @@ contains ! each processor. !=============================================================================== - subroutine initialize_mpi() + subroutine initialize_mpi(intracomm) +#ifdef MPIF08 + type(MPI_Comm), intent(in) :: intracomm +#else + integer, intent(in) :: intracomm +#endif integer :: bank_blocks(5) ! Count for each datatype #ifdef MPIF08 @@ -182,8 +188,9 @@ contains call MPI_INIT(mpi_err) ! Determine number of processors and rank of each processor - call MPI_COMM_SIZE(MPI_COMM_WORLD, n_procs, mpi_err) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, mpi_err) + mpi_intracomm = intracomm + call MPI_COMM_SIZE(mpi_intracomm, n_procs, mpi_err) + call MPI_COMM_RANK(mpi_intracomm, rank, mpi_err) ! Determine master if (rank == 0) then diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 8f25d6301f..d96dd419a6 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -15,6 +15,7 @@ module input_xml use hdf5_interface use list_header, only: ListChar, ListInt, ListReal use mesh_header, only: RegularMesh + use message_passing use mgxs_data, only: create_macro_xs, read_mgxs use multipole, only: multipole_read use output, only: write_message diff --git a/src/main.F90 b/src/main.F90 index aff1e21146..8582ef7039 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -1,17 +1,22 @@ program main use constants - use finalize, only: finalize_run + use finalize, only: openmc_finalize use global - use initialize, only: initialize_run + use initialize, only: openmc_init + use message_passing use particle_restart, only: run_particle_restart use plot, only: run_plot use simulation, only: run_simulation implicit none - ! set up problem - call initialize_run() + ! Initialize run -- when run with MPI, pass communicator +#ifdef MPI + call openmc_init(MPI_COMM_WORLD) +#else + call openmc_init() +#endif ! start problem based on mode select case (run_mode) @@ -24,6 +29,6 @@ program main end select ! finalize run - call finalize_run() + call openmc_finalize() end program main diff --git a/src/mesh.F90 b/src/mesh.F90 index 0f342c0509..b778cbdf06 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -1,13 +1,10 @@ module mesh -#ifdef MPI - use message_passing -#endif - use algorithm, only: binary_search use constants use global use mesh_header + use message_passing implicit none @@ -207,17 +204,17 @@ contains ! collect values from all processors if (master) then call MPI_REDUCE(MPI_IN_PLACE, cnt, n, MPI_REAL8, MPI_SUM, 0, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) else ! Receive buffer not significant at other processors call MPI_REDUCE(cnt, dummy, n, MPI_REAL8, MPI_SUM, 0, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) end if ! Check if there were sites outside the mesh for any processor if (present(sites_outside)) then call MPI_REDUCE(outside, sites_outside, 1, MPI_LOGICAL, MPI_LOR, 0, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) end if #else diff --git a/src/message_passing.F90 b/src/message_passing.F90 index 75d0bd301f..6c13b00e88 100644 --- a/src/message_passing.F90 +++ b/src/message_passing.F90 @@ -8,4 +8,21 @@ module message_passing #endif #endif + ! The defaults set here for the number of processors, rank, and master and + ! mpi_enabled flag are for when MPI is not being used at all, i.e. a serial + ! run. In this case, these variables are still used at times. + + integer :: n_procs = 1 ! number of processes + integer :: rank = 0 ! rank of process + logical :: master = .true. ! master process? + logical :: mpi_enabled = .false. ! is MPI in use and initialized? + integer :: mpi_err ! MPI error code +#ifdef MPIF08 + type(MPI_Datatype) :: MPI_BANK ! MPI datatype for fission bank + type(MPI_Comm) :: mpi_intracomm ! MPI intra-communicator +#else + integer :: MPI_BANK ! MPI datatype for fission bank + integer :: mpi_intracomm ! MPI intra-communicator +#endif + end module message_passing diff --git a/src/output.F90 b/src/output.F90 index a0b4a99b54..c719dbed97 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -11,6 +11,7 @@ module output use math, only: t_percentile use mesh_header, only: RegularMesh use mesh, only: mesh_indices_to_bin, bin_to_mesh_indices + use message_passing, only: master, n_procs use nuclide_header use particle_header, only: LocalCoord, Particle use plot_header diff --git a/src/physics.F90 b/src/physics.F90 index d644b5a364..fceca20a96 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -9,6 +9,7 @@ module physics use material_header, only: Material use math use mesh, only: get_mesh_indices + use message_passing use nuclide_header use output, only: write_message use particle_header, only: Particle diff --git a/src/physics_mg.F90 b/src/physics_mg.F90 index 082b337a48..b5d34838c2 100644 --- a/src/physics_mg.F90 +++ b/src/physics_mg.F90 @@ -9,6 +9,7 @@ module physics_mg use math, only: rotate_angle use mgxs_header, only: Mgxs, MgxsContainer use mesh, only: get_mesh_indices + use message_passing use output, only: write_message use particle_header, only: Particle use particle_restart_write, only: write_particle_restart diff --git a/src/simulation.F90 b/src/simulation.F90 index b4a3791f0b..187632836e 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -1,9 +1,5 @@ module simulation -#ifdef MPI - use message_passing -#endif - use cmfd_execute, only: cmfd_init_batch, execute_cmfd use constants, only: ZERO use eigenvalue, only: count_source_for_ufs, calculate_average_keff, & @@ -13,6 +9,7 @@ module simulation use eigenvalue, only: join_bank_from_threads #endif use global + use message_passing use output, only: write_message, header, print_columns, & print_batch_keff, print_generation use particle_header, only: Particle @@ -322,7 +319,7 @@ contains if (master) call check_triggers() #ifdef MPI call MPI_BCAST(satisfy_triggers, 1, MPI_LOGICAL, 0, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) #endif if (satisfy_triggers .or. & (trigger_on .and. current_batch == n_max_batches)) then diff --git a/src/source.F90 b/src/source.F90 index cc85bf6eca..4c0fe98915 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -15,6 +15,7 @@ module source use geometry_header, only: BASE_UNIVERSE use global use hdf5_interface, only: file_create, file_open, file_close, read_dataset + use message_passing, only: rank use output, only: write_message use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_set_stream diff --git a/src/state_point.F90 b/src/state_point.F90 index bf0947163b..257753b5b4 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -11,26 +11,22 @@ module state_point ! intervals, using the tag. !=============================================================================== + use, intrinsic :: ISO_C_BINDING, only: c_loc, c_ptr + + use hdf5 use constants + use dict_header, only: ElemKeyValueII, ElemKeyValueCI use endf, only: reaction_name use error, only: fatal_error, warning use global use hdf5_interface + use mesh_header, only: RegularMesh + use message_passing use output, only: write_message, time_stamp + use random_lcg, only: seed use string, only: to_str, count_digits, zero_padded use tally_header, only: TallyObject - use mesh_header, only: RegularMesh - use dict_header, only: ElemKeyValueII, ElemKeyValueCI - use random_lcg, only: seed - -#ifdef MPI - use message_passing -#endif - - use hdf5 - - use, intrinsic :: ISO_C_BINDING, only: c_loc, c_ptr implicit none @@ -553,7 +549,7 @@ contains ! receive buffer without having a temporary variable #ifdef MPI call MPI_REDUCE(MPI_IN_PLACE, global_temp, n_bins, MPI_REAL8, MPI_SUM, & - 0, MPI_COMM_WORLD, mpi_err) + 0, mpi_intracomm, mpi_err) #endif ! Transfer values to value on master @@ -567,7 +563,7 @@ contains ! Receive buffer not significant at other processors #ifdef MPI call MPI_REDUCE(global_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & - 0, MPI_COMM_WORLD, mpi_err) + 0, mpi_intracomm, mpi_err) #endif end if @@ -616,7 +612,7 @@ contains ! a receive buffer without having a temporary variable #ifdef MPI call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & - MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_SUM, 0, mpi_intracomm, mpi_err) #endif ! At the end of the simulation, store the results back in the @@ -640,7 +636,7 @@ contains ! Receive buffer not significant at other processors #ifdef MPI call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & - 0, MPI_COMM_WORLD, mpi_err) + 0, mpi_intracomm, mpi_err) #endif end if @@ -940,7 +936,7 @@ contains ! 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) + mpi_intracomm, MPI_STATUS_IGNORE, mpi_err) end if #endif @@ -969,7 +965,7 @@ contains else #ifdef MPI call MPI_SEND(source_bank, int(work), MPI_BANK, 0, rank, & - MPI_COMM_WORLD, mpi_err) + mpi_intracomm, mpi_err) #endif end if diff --git a/src/summary.F90 b/src/summary.F90 index 97abeb2063..efe07b1ab8 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -8,6 +8,7 @@ module summary use hdf5_interface use material_header, only: Material use mesh_header, only: RegularMesh + use message_passing use nuclide_header use output, only: time_stamp use surface_header diff --git a/src/tally.F90 b/src/tally.F90 index 41987ec35e..df1b5d2d6e 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2,10 +2,6 @@ module tally use, intrinsic :: ISO_C_BINDING -#ifdef MPI - use message_passing -#endif - use algorithm, only: binary_search use constants use cross_section, only: multipole_deriv_eval @@ -18,6 +14,7 @@ module tally mesh_intersects_1d, mesh_intersects_2d, & mesh_intersects_3d use mesh_header, only: RegularMesh + use message_passing use output, only: header use particle_header, only: LocalCoord, Particle use string, only: to_str @@ -4073,14 +4070,14 @@ contains ! The MPI_IN_PLACE specifier allows the master to copy values into ! a receive buffer without having a temporary variable call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & - MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_SUM, 0, mpi_intracomm, mpi_err) ! Transfer values to value on master t % results(RESULT_VALUE,:,:) = tally_temp else ! Receive buffer not significant at other processors call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, & - MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_SUM, 0, mpi_intracomm, mpi_err) ! Reset value on other processors t % results(RESULT_VALUE,:,:) = ZERO @@ -4094,14 +4091,14 @@ contains if (master) then call MPI_REDUCE(MPI_IN_PLACE, global_temp, N_GLOBAL_TALLIES, & - MPI_REAL8, MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) ! Transfer values back to global_tallies on master global_tallies(RESULT_VALUE, :) = global_temp else ! Receive buffer not significant at other processors call MPI_REDUCE(global_temp, dummy, N_GLOBAL_TALLIES, & - MPI_REAL8, MPI_SUM, 0, MPI_COMM_WORLD, mpi_err) + MPI_REAL8, MPI_SUM, 0, mpi_intracomm, mpi_err) ! Reset value on other processors global_tallies(RESULT_VALUE, :) = ZERO @@ -4111,11 +4108,11 @@ contains ! last realization if (master) then call MPI_REDUCE(MPI_IN_PLACE, total_weight, 1, MPI_REAL8, MPI_SUM, & - 0, MPI_COMM_WORLD, mpi_err) + 0, mpi_intracomm, mpi_err) else ! Receive buffer not significant at other processors call MPI_REDUCE(total_weight, dummy, 1, MPI_REAL8, MPI_SUM, & - 0, MPI_COMM_WORLD, mpi_err) + 0, mpi_intracomm, mpi_err) end if end subroutine reduce_tally_results diff --git a/src/tracking.F90 b/src/tracking.F90 index a45f8e448f..1b4f6b99ba 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -8,6 +8,7 @@ module tracking use geometry_header, only: Universe, BASE_UNIVERSE use global use output, only: write_message + use message_passing use particle_header, only: LocalCoord, Particle use physics, only: collision use physics_mg, only: collision_mg diff --git a/src/trigger.F90 b/src/trigger.F90 index f41cc46cf3..bf22327d60 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -10,6 +10,7 @@ module trigger use output, only: warning, write_message use mesh, only: bin_to_mesh_indices use mesh_header, only: RegularMesh + use message_passing, only: master use trigger_header, only: TriggerObject use tally, only: TallyObject use tally_filter, only: MeshFilter diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index dee646860b..a9584d672f 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -272,11 +272,11 @@ contains if (master) then #ifdef MPI do j = 1, n_procs - 1 - call MPI_RECV(n, 1, MPI_INTEGER, j, 0, MPI_COMM_WORLD, & + call MPI_RECV(n, 1, MPI_INTEGER, j, 0, mpi_intracomm, & MPI_STATUS_IGNORE, mpi_err) allocate(data(2*n)) - call MPI_RECV(data, 2*n, MPI_INTEGER, j, 1, MPI_COMM_WORLD, & + call MPI_RECV(data, 2*n, MPI_INTEGER, j, 1, mpi_intracomm, & MPI_STATUS_IGNORE, mpi_err) do k = 0, n - 1 do m = 1, master_indices(i_domain) % size() @@ -340,8 +340,8 @@ contains data(2*k + 2) = master_hits(i_domain) % data(k + 1) end do - call MPI_SEND(n, 1, MPI_INTEGER, 0, 0, MPI_COMM_WORLD, mpi_err) - call MPI_SEND(data, 2*n, MPI_INTEGER, 0, 1, MPI_COMM_WORLD, mpi_err) + call MPI_SEND(n, 1, MPI_INTEGER, 0, 0, mpi_intracomm, mpi_err) + call MPI_SEND(data, 2*n, MPI_INTEGER, 0, 1, mpi_intracomm, mpi_err) deallocate(data) #endif end if From c9e6bbd6c68d6d42ffd6b4917e69d11ec36aca9e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Feb 2017 11:47:28 -0600 Subject: [PATCH 11/66] Add comment describing intracomm argument --- src/initialize.F90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/initialize.F90 b/src/initialize.F90 index 2101333b7a..d30f1e0144 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -48,9 +48,9 @@ contains subroutine openmc_init(intracomm) #ifdef MPIF08 - type(MPI_Comm), intent(in) :: intracomm + type(MPI_Comm), intent(in) :: intracomm ! MPI intracommunicator #else - integer, intent(in), optional :: intracomm + integer, intent(in), optional :: intracomm ! MPI intracommunicator #endif ! Start total and initialization timer @@ -167,9 +167,9 @@ contains subroutine initialize_mpi(intracomm) #ifdef MPIF08 - type(MPI_Comm), intent(in) :: intracomm + type(MPI_Comm), intent(in) :: intracomm ! MPI intracommunicator #else - integer, intent(in) :: intracomm + integer, intent(in) :: intracomm ! MPI intracommunicator #endif integer :: bank_blocks(5) ! Count for each datatype From 5d2ad92769bdec7615fa0ff0bbc94e36d00953c3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Feb 2017 10:37:35 -0600 Subject: [PATCH 12/66] Add depletable attribute to Material --- openmc/material.py | 119 +++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 53 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index f276f0f1ab..7c271cc309 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -56,6 +56,9 @@ class Material(object): Units used for `density`. Can be one of 'g/cm3', 'g/cc', 'kg/cm3', 'atom/b-cm', 'atom/cm3', 'sum', or 'macro'. The 'macro' unit only applies in the case of a multi-group calculation. + depletable : bool + Indicate whether the material is depletable. This attribute can be used + by downstream depletion applications. elements : list of tuple List in which each item is a 4-tuple consisting of an :class:`openmc.Element` instance, the percent density, the percent @@ -78,6 +81,7 @@ class Material(object): self.temperature = temperature self._density = None self._density_units = '' + self._depletable = False # A list of tuples (nuclide, percent, percent type) self._nuclides = [] @@ -127,37 +131,36 @@ class Material(object): 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}\n'.format('\tTemperature', '=\t', - self._temperature) + string += '{: <16}=\t{}\n'.format('\tID', self._id) + string += '{: <16}=\t{}\n'.format('\tName', self._name) + string += '{: <16}=\t{}\n'.format('\tTemperature', self._temperature) - string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) - string += ' [{0}]\n'.format(self._density_units) + string += '{: <16}=\t{}'.format('\tDensity', self._density) + string += ' [{}]\n'.format(self._density_units) - string += '{0: <16}\n'.format('\tS(a,b) Tables') + string += '{: <16}\n'.format('\tS(a,b) Tables') for sab in self._sab: - string += '{0: <16}{1}{2}\n'.format('\tS(a,b)', '=\t', sab) + string += '{: <16}=\t{}\n'.format('\tS(a,b)', sab) - string += '{0: <16}\n'.format('\tNuclides') + string += '{: <16}\n'.format('\tNuclides') for nuclide, percent, percent_type in self._nuclides: string += '{0: <16}'.format('\t{0.name}'.format(nuclide)) - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + string += '=\t{: <12} [{}]\n'.format(percent, percent_type) if self._macroscopic is not None: - string += '{0: <16}\n'.format('\tMacroscopic Data') - string += '{0: <16}'.format('\t{0}'.format(self._macroscopic)) + string += '{: <16}\n'.format('\tMacroscopic Data') + string += '{: <16}'.format('\t{}'.format(self._macroscopic)) - string += '{0: <16}\n'.format('\tElements') + string += '{: <16}\n'.format('\tElements') for element, percent, percent_type, enr in self._elements: string += '{0: <16}'.format('\t{0.name}'.format(element)) if enr is None: - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + string += '=\t{: <12} [{}]\n'.format(percent, percent_type) else: - string += '=\t{0: <12} [{1}] @ {2} w/o enrichment\n'\ + string += '=\t{: <12} [{}] @ {} w/o enrichment\n'\ .format(percent, percent_type, enr) return string @@ -182,6 +185,10 @@ class Material(object): def density_units(self): return self._density_units + @property + def depletable(self): + return self._depletable + @property def elements(self): return self._elements @@ -234,7 +241,7 @@ class Material(object): @name.setter def name(self, name): if name is not None: - cv.check_type('name for Material ID="{0}"'.format(self._id), + cv.check_type('name for Material ID="{}"'.format(self._id), name, string_types) self._name = name else: @@ -242,10 +249,16 @@ class Material(object): @temperature.setter def temperature(self, temperature): - cv.check_type('Temperature for Material ID="{0}"'.format(self._id), + cv.check_type('Temperature for Material ID="{}"'.format(self._id), temperature, (Real, type(None))) self._temperature = temperature + @depletable.setter + def depletable(self, depletable): + cv.check_type('Depletable flag for Material ID="{}"'.format(self._id), + depletable, bool) + self._depletable = depletable + def set_density(self, units, density=None): """Set the density of the material @@ -264,17 +277,17 @@ class Material(object): if units is 'sum': if density is not None: - msg = 'Density "{0}" for Material ID="{1}" is ignored ' \ + msg = 'Density "{}" for Material ID="{}" is ignored ' \ 'because the unit is "sum"'.format(density, self.id) warnings.warn(msg) else: if density is None: - msg = 'Unable to set the density for Material ID="{0}" ' \ + msg = 'Unable to set the density for Material ID="{}" ' \ 'because a density value must be given when not using ' \ '"sum" unit'.format(self.id) raise ValueError(msg) - cv.check_type('the density for Material ID="{0}"'.format(self.id), + cv.check_type('the density for Material ID="{}"'.format(self.id), density, Real) self._density = density @@ -285,8 +298,8 @@ class Material(object): 'version of openmc') if not isinstance(filename, string_types) and filename is not None: - msg = 'Unable to add OTF material file to Material ID="{0}" with a ' \ - 'non-string name "{1}"'.format(self._id, filename) + msg = 'Unable to add OTF material file to Material ID="{}" with a ' \ + 'non-string name "{}"'.format(self._id, filename) raise ValueError(msg) self._distrib_otf_file = filename @@ -314,23 +327,23 @@ class Material(object): """ if self._macroscopic is not None: - msg = 'Unable to add a Nuclide to Material ID="{0}" as a ' \ + msg = 'Unable to add a Nuclide to Material ID="{}" as a ' \ 'macroscopic data-set has already been added'.format(self._id) raise ValueError(msg) if not isinstance(nuclide, string_types + (openmc.Nuclide,)): - msg = 'Unable to add a Nuclide to Material ID="{0}" with a ' \ - 'non-Nuclide value "{1}"'.format(self._id, nuclide) + msg = 'Unable to add a Nuclide to Material ID="{}" with a ' \ + 'non-Nuclide value "{}"'.format(self._id, nuclide) raise ValueError(msg) elif not isinstance(percent, Real): - msg = 'Unable to add a Nuclide to Material ID="{0}" with a ' \ - 'non-floating point value "{1}"'.format(self._id, percent) + msg = 'Unable to add a Nuclide to Material ID="{}" with a ' \ + 'non-floating point value "{}"'.format(self._id, percent) raise ValueError(msg) elif percent_type not in ['ao', 'wo', 'at/g-cm']: - msg = 'Unable to add a Nuclide to Material ID="{0}" with a ' \ - 'percent type "{1}"'.format(self._id, percent_type) + msg = 'Unable to add a Nuclide to Material ID="{}" with a ' \ + 'percent type "{}"'.format(self._id, percent_type) raise ValueError(msg) if isinstance(nuclide, openmc.Nuclide): @@ -353,7 +366,7 @@ class Material(object): """ if not isinstance(nuclide, openmc.Nuclide): - msg = 'Unable to remove a Nuclide "{0}" in Material ID="{1}" ' \ + msg = 'Unable to remove a Nuclide "{}" in Material ID="{}" ' \ 'since it is not a Nuclide'.format(self._id, nuclide) raise ValueError(msg) @@ -377,15 +390,15 @@ class Material(object): # Ensure no nuclides, elements, or sab are added since these would be # incompatible with macroscopics if self._nuclides or self._elements or self._sab: - msg = 'Unable to add a Macroscopic data set to Material ID="{0}" ' \ - 'with a macroscopic value "{1}" as an incompatible data ' \ + msg = 'Unable to add a Macroscopic data set to Material ID="{}" ' \ + 'with a macroscopic value "{}" as an incompatible data ' \ 'member (i.e., nuclide, element, or S(a,b) table) ' \ 'has already been added'.format(self._id, macroscopic) raise ValueError(msg) if not isinstance(macroscopic, string_types + (openmc.Macroscopic,)): - msg = 'Unable to add a Macroscopic to Material ID="{0}" with a ' \ - 'non-Macroscopic value "{1}"'.format(self._id, macroscopic) + msg = 'Unable to add a Macroscopic to Material ID="{}" with a ' \ + 'non-Macroscopic value "{}"'.format(self._id, macroscopic) raise ValueError(msg) if isinstance(macroscopic, openmc.Macroscopic): @@ -398,7 +411,7 @@ class Material(object): if self._macroscopic is None: self._macroscopic = macroscopic else: - msg = 'Unable to add a Macroscopic to Material ID="{0}". ' \ + msg = 'Unable to add a Macroscopic to Material ID="{}". ' \ 'Only one Macroscopic allowed per ' \ 'Material.'.format(self._id) raise ValueError(msg) @@ -422,7 +435,7 @@ class Material(object): """ if not isinstance(macroscopic, openmc.Macroscopic): - msg = 'Unable to remove a Macroscopic "{0}" in Material ID="{1}" ' \ + msg = 'Unable to remove a Macroscopic "{}" in Material ID="{}" ' \ 'since it is not a Macroscopic'.format(self._id, macroscopic) raise ValueError(msg) @@ -450,23 +463,23 @@ class Material(object): """ if self._macroscopic is not None: - msg = 'Unable to add an Element to Material ID="{0}" as a ' \ + msg = 'Unable to add an Element to Material ID="{}" as a ' \ 'macroscopic data-set has already been added'.format(self._id) raise ValueError(msg) if not isinstance(element, string_types + (openmc.Element,)): - msg = 'Unable to add an Element to Material ID="{0}" with a ' \ - 'non-Element value "{1}"'.format(self._id, element) + msg = 'Unable to add an Element to Material ID="{}" with a ' \ + 'non-Element value "{}"'.format(self._id, element) raise ValueError(msg) if not isinstance(percent, Real): - msg = 'Unable to add an Element to Material ID="{0}" with a ' \ - 'non-floating point value "{1}"'.format(self._id, percent) + msg = 'Unable to add an Element to Material ID="{}" with a ' \ + 'non-floating point value "{}"'.format(self._id, percent) raise ValueError(msg) if percent_type not in ['ao', 'wo']: - msg = 'Unable to add an Element to Material ID="{0}" with a ' \ - 'percent type "{1}"'.format(self._id, percent_type) + msg = 'Unable to add an Element to Material ID="{}" with a ' \ + 'percent type "{}"'.format(self._id, percent_type) raise ValueError(msg) # Copy this Element to separate it from same Element in other Materials @@ -477,14 +490,14 @@ class Material(object): if enrichment is not None: if not isinstance(enrichment, Real): - msg = 'Unable to add an Element to Material ID="{0}" with a ' \ - 'non-floating point enrichment value "{1}"'\ + msg = 'Unable to add an Element to Material ID="{}" with a ' \ + 'non-floating point enrichment value "{}"'\ .format(self._id, enrichment) raise ValueError(msg) elif element.name != 'U': - msg = 'Unable to use enrichment for element {0} which is not ' \ - 'uranium for Material ID="{1}"'.format(element.name, + msg = 'Unable to use enrichment for element {} which is not ' \ + 'uranium for Material ID="{}"'.format(element.name, self._id) raise ValueError(msg) @@ -493,8 +506,8 @@ class Material(object): cv.check_greater_than('enrichment', enrichment, 0., equality=True) if enrichment > 5.0: - msg = 'A uranium enrichment of {0} was given for Material ID='\ - '"{1}". OpenMC assumes the U234/U235 mass ratio is '\ + msg = 'A uranium enrichment of {} was given for Material ID='\ + '"{}". OpenMC assumes the U234/U235 mass ratio is '\ 'constant at 0.008, which is only valid at low ' \ 'enrichments. Consider setting the isotopic ' \ 'composition manually for enrichments over 5%.'.\ @@ -514,7 +527,7 @@ class Material(object): """ if not isinstance(element, openmc.Element): - msg = 'Unable to remove "{0}" in Material ID="{1}" ' \ + msg = 'Unable to remove "{}" in Material ID="{}" ' \ 'since it is not an Element'.format(self.id, element) raise ValueError(msg) @@ -534,13 +547,13 @@ class Material(object): """ if self._macroscopic is not None: - msg = 'Unable to add an S(a,b) table to Material ID="{0}" as a ' \ + msg = 'Unable to add an S(a,b) table to Material ID="{}" as a ' \ 'macroscopic data-set has already been added'.format(self._id) raise ValueError(msg) if not isinstance(name, string_types): - msg = 'Unable to add an S(a,b) table to Material ID="{0}" with a ' \ - 'non-string table name "{1}"'.format(self._id, name) + msg = 'Unable to add an S(a,b) table to Material ID="{}" with a ' \ + 'non-string table name "{}"'.format(self._id, name) raise ValueError(msg) new_name = openmc.data.get_thermal_name(name) From 384a08956af7a92ae3fc70292b27aac698f091ca Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Thu, 16 Feb 2017 21:02:34 -0500 Subject: [PATCH 13/66] Added test of convert_* methods; --- openmc/mgxs_library.py | 92 +++++----- tests/test_mg_convert/inputs_true.dat | 30 ++++ tests/test_mg_convert/results_true.dat | 28 +++ tests/test_mg_convert/test_mg_convert.py | 207 +++++++++++++++++++++++ 4 files changed, 303 insertions(+), 54 deletions(-) create mode 100644 tests/test_mg_convert/inputs_true.dat create mode 100644 tests/test_mg_convert/results_true.dat create mode 100755 tests/test_mg_convert/test_mg_convert.py diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index e3a8ad4d85..d441e1bbbf 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -14,11 +14,14 @@ from openmc.checkvalue import check_type, check_value, check_greater_than, \ # Supported incoming particle MGXS angular treatment representations _REPRESENTATIONS = ['isotropic', 'angle'] + # Supported scattering angular distribution representations _SCATTER_TYPES = ['tabular', 'legendre', 'histogram'] -# List of MGXS dimension types + +# List of MGXS indexing schemes _XS_SHAPES = ["[G][G'][Order]", "[G]", "[G']", "[G][G']", "[DG]", "[DG][G]", "[DG][G']", "[DG][G][G']"] + # Number of mu points for conversion between scattering formats _NMU = 257 @@ -368,15 +371,14 @@ class XSdata(object): @name.setter def name(self, name): + check_type('name for XSdata', name, string_types) self._name = name @energy_groups.setter def energy_groups(self, energy_groups): - # Check validity of energy_groups check_type('energy_groups', energy_groups, openmc.mgxs.EnergyGroups) - if energy_groups.group_edges is None: msg = 'Unable to assign an EnergyGroups object ' \ 'with uninitialized group edges' @@ -387,7 +389,6 @@ class XSdata(object): @num_delayed_groups.setter def num_delayed_groups(self, num_delayed_groups): - # Check validity of num_delayed_groups check_type('num_delayed_groups', num_delayed_groups, Integral) check_less_than('num_delayed_groups', num_delayed_groups, openmc.mgxs.MAX_DELAYED_GROUPS, equality=True) @@ -398,14 +399,12 @@ class XSdata(object): @representation.setter def representation(self, representation): - # Check it is of valid value. check_value('representation', representation, _REPRESENTATIONS) self._representation = representation @atomic_weight_ratio.setter def atomic_weight_ratio(self, atomic_weight_ratio): - # Check validity of type and that the atomic_weight_ratio value is > 0 check_type('atomic_weight_ratio', atomic_weight_ratio, Real) check_greater_than('atomic_weight_ratio', atomic_weight_ratio, 0.0) self._atomic_weight_ratio = atomic_weight_ratio @@ -419,14 +418,12 @@ class XSdata(object): @scatter_format.setter def scatter_format(self, scatter_format): - # check to see it is of a valid type and value check_value('scatter_format', scatter_format, _SCATTER_TYPES) self._scatter_format = scatter_format @order.setter def order(self, order): - # Check type and value check_type('order', order, Integral) check_greater_than('order', order, 0, equality=True) self._order = order @@ -434,7 +431,6 @@ class XSdata(object): @num_polar.setter def num_polar(self, num_polar): - # Make sure we have positive ints check_type('num_polar', num_polar, Integral) check_greater_than('num_polar', num_polar, 0) self._num_polar = num_polar @@ -1688,7 +1684,14 @@ class XSdata(object): def convert_representation(self, target_representation, num_polar=None, num_azimuthal=None): """Produce a new XSdata object with the same data, but converted to the - new representation + new representation (isotropic or angle-dependent). + + This method cannot be used to change the number of polar or + azimuthal bins of an XSdata object that already uses an angular + representation. Finally, this method simply uses an arithmetic mean to + convert from an angular to isotropic representation; no flux-weighting + is applied and therefore the correctness of the solution is not + guaranteed. Parameters ---------- @@ -1728,9 +1731,9 @@ class XSdata(object): # Check to make sure the num_polar and num_azimuthal values match if target_representation == 'angle': if num_polar != self.num_polar or num_azimuthal != self.num_azimuthal: - raise NotImplementedError("XCannot translate between " - "`angle` representations with " - "different angle bin structures") + raise ValueError("Cannot translate between `angle`" + " representations with different angle" + " bin structures") # Nothing to do as the same structure was requested return xsdata @@ -1741,6 +1744,7 @@ class XSdata(object): # values are changed back to None for clarity xsdata._num_polar = None xsdata._num_azimuthal = None + elif target_representation == 'angle': xsdata.num_polar = num_polar xsdata.num_azimuthal = num_azimuthal @@ -1757,16 +1761,19 @@ class XSdata(object): # Get the original data orig_data = getattr(self, '_' + xs)[i] if orig_data is not None: + if target_representation == 'isotropic': # Since we are going from angle to isotropic, the # current data is just the average over the angle bins new_data = orig_data.mean(axis=(0, 1)) + elif target_representation == 'angle': # Since we are going from isotropic to angle, the # current data is just copied for every angle bin new_shape = (num_polar, num_azimuthal) + \ orig_data.shape new_data = np.resize(orig_data, new_shape) + setter = getattr(xsdata, 'set_' + xs) setter(new_data, temp) @@ -1810,18 +1817,19 @@ class XSdata(object): # Reset and re-generate XSdata.xs_shapes with the new scattering format xsdata._xs_shapes = None - xsdata.xs_shapes for i, temp in enumerate(xsdata.temperatures): orig_data = self._scatter_matrix[i] new_shape = orig_data.shape[:-1] + (xsdata.num_orders,) new_data = np.zeros(new_shape) + if self.scatter_format == 'legendre': if target_format == 'legendre': # Then we are changing orders and only need to change # dimensionality of the mu data and pad/truncate as needed order = min(xsdata.num_orders, self.num_orders) new_data[..., :order] = orig_data[..., :order] + elif target_format == 'tabular': mu = np.linspace(-1, 1, xsdata.num_orders) # Evaluate the legendre on the mu grid @@ -1856,6 +1864,7 @@ class XSdata(object): elif self.scatter_format == 'tabular': # Calculate the mu points of the current data mu_self = np.linspace(-1, 1, self.num_orders) + if target_format == 'legendre': # Find the Legendre coefficients via integration. To best # use the vectorized integration capabilities of scipy, @@ -1870,10 +1879,12 @@ class XSdata(object): # Remove the very small values resulting from numerical # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. + elif target_format == 'tabular': # Simply use an interpolating function to get the new data mu = np.linspace(-1, 1, xsdata.num_orders) new_data[..., :] = interp1d(mu_self, orig_data)(mu) + elif target_format == 'histogram': # Use an interpolating function to do the bin-wise # integrals @@ -1891,6 +1902,7 @@ class XSdata(object): # Remove the very small values resulting from numerical # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. + elif self.scatter_format == 'histogram': # The histogram format does not have enough information to # convert to the other forms without inducing some amount of @@ -1921,10 +1933,12 @@ class XSdata(object): # Remove the very small values resulting from numerical # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. + elif target_format == 'tabular': # Simply use an interpolating function to get the new data mu = np.linspace(-1, 1, xsdata.num_orders) new_data[..., :] = interp(mu) * norm + elif target_format == 'histogram': # Use an interpolating function to do the bin-wise # integrals @@ -1942,6 +1956,7 @@ class XSdata(object): # Remove the very small values resulting from numerical # precision issues new_data[..., np.abs(new_data) < 1.E-10] = 0. + xsdata.set_scatter_matrix(new_data, temp) return xsdata @@ -2431,8 +2446,15 @@ class MGXSLibrary(object): def convert_representation(self, target_representation, num_polar=None, num_azimuthal=None): - """Produce a new MGXSLibrary object with the same data, but converted - to the new representation + """Produce a new XSdata object with the same data, but converted to the + new representation (isotropic or angle-dependent). + + This method cannot be used to change the number of polar or + azimuthal bins of an XSdata object that already uses an angular + representation. Finally, this method simply uses an arithmetic mean to + convert from an angular to isotropic representation; no flux-weighting + is applied and therefore the correctness of the solution is not + guaranteed. Parameters ---------- @@ -2456,14 +2478,6 @@ class MGXSLibrary(object): """ - check_value('target_representation', target_representation, - _REPRESENTATIONS) - if target_representation == 'angle': - check_type('num_polar', num_polar, Integral) - check_type('num_azimuthal', num_azimuthal, Integral) - check_greater_than('num_polar', num_polar, 0) - check_greater_than('num_azimuthal', num_azimuthal, 0) - library = copy.deepcopy(self) for i, xsdata in enumerate(self.xsdatas): library.xsdatas[i] = \ @@ -2493,13 +2507,6 @@ class MGXSLibrary(object): """ - check_value('target_format', target_format, _SCATTER_TYPES) - check_type('target_order', target_order, Integral) - if target_format == 'legendre': - check_greater_than('target_order', target_order, 0, equality=True) - else: - check_greater_than('target_order', target_order, 0) - library = copy.deepcopy(self) for i, xsdata in enumerate(self.xsdatas): library.xsdatas[i] = \ @@ -2507,29 +2514,6 @@ class MGXSLibrary(object): return library - def convert_to_continuous_energy(self, h5_filename='ce_mgxs.h5', - library_filename='ce_mgxs.xml'): - """Converts the MGXSLibrary object to an equivalent - library of openmc.data.IncidentNeutron objects - - Parameters - ---------- - h5_filename : str - HDF5 file to write with all the files - library_filename : str - cross_sections.xml file describing the HDF5 file - - """ - - library = openmc.data.DataLibrary() - data = [] - for i, xsdata in enumerate(self.xsdatas): - data.append(xsdata.convert_to_continuous_energy()) - data[-1].export_to_hdf5(h5_filename) - - library.register_file(h5_filename) - library.export_to_xml(library_filename) - def export_to_hdf5(self, filename='mgxs.h5'): """Create an hdf5 file that can be used for a simulation. diff --git a/tests/test_mg_convert/inputs_true.dat b/tests/test_mg_convert/inputs_true.dat new file mode 100644 index 0000000000..9b0b0f4b17 --- /dev/null +++ b/tests/test_mg_convert/inputs_true.dat @@ -0,0 +1,30 @@ + + + + + + + + + + + ./mgxs.h5 + + + + + + + + + 1000 + 2000 + 100 + + + + -5 -5 -5 5 5 5 + + + multi-group + diff --git a/tests/test_mg_convert/results_true.dat b/tests/test_mg_convert/results_true.dat new file mode 100644 index 0000000000..5cf0eb6d26 --- /dev/null +++ b/tests/test_mg_convert/results_true.dat @@ -0,0 +1,28 @@ +k-combined: +9.957263E-01 5.469041E-05 +k-combined: +9.957263E-01 5.469041E-05 +k-combined: +9.963652E-01 5.444550E-05 +k-combined: +9.957263E-01 5.469041E-05 +k-combined: +9.955157E-01 5.785520E-05 +k-combined: +9.954023E-01 5.694553E-05 +k-combined: +9.955722E-01 6.075634E-05 +k-combined: +9.955692E-01 6.094480E-05 +k-combined: +9.955154E-01 5.775805E-05 +k-combined: +9.956787E-01 5.915112E-05 +k-combined: +9.957022E-01 5.952369E-05 +k-combined: +9.953517E-01 5.920431E-05 +k-combined: +9.957263E-01 5.469041E-05 +k-combined: +9.957263E-01 5.469041E-05 diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py new file mode 100755 index 0000000000..c5c0ac16c7 --- /dev/null +++ b/tests/test_mg_convert/test_mg_convert.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python + +import os +import sys +import hashlib +sys.path.insert(0, os.pardir) + +import numpy as np + +from testing_harness import PyAPITestHarness +import openmc + +# OpenMC simulation parameters +batches = 2000 +inactive = 100 +particles = 1000 + + +def build_mgxs_library(convert): + # Instantiate the energy group data + groups = openmc.mgxs.EnergyGroups(group_edges=[1e-5, 0.625, 20.0e6]) + + # Instantiate the 7-group (C5G7) cross section data + uo2_xsdata = openmc.XSdata('UO2', groups) + uo2_xsdata.order = 2 + uo2_xsdata.set_total([2., 2.]) + uo2_xsdata.set_absorption([1., 1.]) + scatter_matrix = np.array([[[0.75, 0.25], + [0.00, 1.00]], + [[0.75 / 3., 0.25 / 3.], + [0.00 / 3., 1.00 / 3.]], + [[0.75 / 4., 0.25 / 4.], + [0.00 / 4., 1.00 / 4.]]]) + scatter_matrix = np.rollaxis(scatter_matrix, 0, 3) + uo2_xsdata.set_scatter_matrix(scatter_matrix) + uo2_xsdata.set_fission([0.5, 0.5]) + uo2_xsdata.set_nu_fission([1., 1.]) + uo2_xsdata.set_chi([1., 0.]) + + mg_cross_sections_file = openmc.MGXSLibrary(groups) + mg_cross_sections_file.add_xsdatas([uo2_xsdata]) + + if convert is not None: + if isinstance(convert[0], list): + for conv in convert: + if conv[0] in ['legendre', 'tabular', 'histogram']: + mg_cross_sections_file = \ + mg_cross_sections_file.convert_scatter_format( + conv[0], conv[1]) + elif conv[0] in ['angle', 'isotropic']: + mg_cross_sections_file = \ + mg_cross_sections_file.convert_representation( + conv[0], conv[1], conv[1]) + elif convert[0] in ['legendre', 'tabular', 'histogram']: + mg_cross_sections_file = \ + mg_cross_sections_file.convert_scatter_format( + convert[0], convert[1]) + elif convert[0] in ['angle', 'isotropic']: + mg_cross_sections_file = \ + mg_cross_sections_file.convert_representation( + convert[0], convert[1], convert[1]) + + mg_cross_sections_file.export_to_hdf5() + + +class MGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Instantiate some Macroscopic Data + uo2_data = openmc.Macroscopic('UO2') + + # Instantiate some Materials and register the appropriate objects + mat = openmc.Material(material_id=1, name='UO2 fuel') + mat.set_density('macro', 1.0) + mat.add_macroscopic(uo2_data) + + # Instantiate a Materials collection and export to XML + materials_file = openmc.Materials([mat]) + materials_file.cross_sections = "./mgxs.h5" + materials_file.export_to_xml() + + # Instantiate ZCylinder surfaces + left = openmc.XPlane(surface_id=4, x0=-5., name='left') + right = openmc.XPlane(surface_id=5, x0=5., name='right') + bottom = openmc.YPlane(surface_id=6, y0=-5., name='bottom') + top = openmc.YPlane(surface_id=7, y0=5., name='top') + + left.boundary_type = 'reflective' + right.boundary_type = 'vacuum' + top.boundary_type = 'reflective' + bottom.boundary_type = 'reflective' + + # Instantiate Cells + fuel = openmc.Cell(cell_id=1, name='cell 1') + + # Use surface half-spaces to define regions + fuel.region = +left & -right & +bottom & -top + + # Register Materials with Cells + fuel.fill = mat + + # Instantiate Universe + root = openmc.Universe(universe_id=0, name='root universe') + + # Register Cells with Universe + root.add_cells([fuel]) + + # Instantiate a Geometry, register the root Universe, and export to XML + geometry = openmc.Geometry(root) + geometry.export_to_xml() + + settings_file = openmc.Settings() + settings_file.energy_mode = "multi-group" + settings_file.batches = batches + settings_file.inactive = inactive + settings_file.particles = particles + + # Create an initial uniform spatial source distribution + bounds = [-5, -5, -5, 5, 5, 5] + uniform_dist = openmc.stats.Box(bounds[:3], bounds[3:]) + settings_file.source = openmc.source.Source(space=uniform_dist) + + settings_file.export_to_xml() + + def _run_openmc(self): + # Run multiple conversions to compare results + cases = [None, ['legendre', 2], ['legendre', 0], + ['tabular', 33], ['histogram', 32], + [['tabular', 33], ['legendre', 1]], + [['tabular', 33], ['tabular', 3]], + [['tabular', 33], ['histogram', 32]], + [['histogram', 32], ['legendre', 1]], + [['histogram', 32], ['tabular', 3]], + [['histogram', 32], ['histogram', 16]], + [['histogram', 32], ['histogram', 128]], + ['angle', 2], [['angle', 2], ['isotropic', None]]] + + outstr = '' + for case in cases: + build_mgxs_library(case) + + if self._opts.mpi_exec is not None: + returncode = openmc.run(mpi_procs=self._opts.mpi_np, + openmc_exec=self._opts.exe, + mpi_exec=self._opts.mpi_exec) + + else: + returncode = openmc.run(openmc_exec=self._opts.exe) + + assert returncode == 0, 'OpenMC did not exit successfully.' + + sp = openmc.StatePoint('statepoint.' + str(batches) + '.h5') + + # Write out k-combined. + outstr += 'k-combined:\n' + form = '{0:12.6E} {1:12.6E}\n' + outstr += form.format(sp.k_combined[0], sp.k_combined[1]) + sp.close() + + return outstr + + def _get_results(self, outstr, hash_output=False): + # 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(), 'mgxs.h5') + if os.path.exists(f): + os.remove(f) + + 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() + outstr = self._run_openmc() + results = self._get_results(outstr) + 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() + outstr = self._run_openmc() + results = self._get_results(outstr) + self._write_results(results) + self._overwrite_results() + finally: + self._cleanup() + + +if __name__ == '__main__': + harness = MGXSTestHarness('statepoint.10.*', False) + harness.main() From 7069c5db315be9f2a756d6e5d8cc295d7be474a0 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 17 Feb 2017 07:48:45 -0500 Subject: [PATCH 14/66] lessened the number of particles used in test_mg_convert and reduced the number of cases by 2 --- tests/test_mg_convert/inputs_true.dat | 2 +- tests/test_mg_convert/results_true.dat | 28 ++++++++++-------------- tests/test_mg_convert/test_mg_convert.py | 5 ++--- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/tests/test_mg_convert/inputs_true.dat b/tests/test_mg_convert/inputs_true.dat index 9b0b0f4b17..95ad615867 100644 --- a/tests/test_mg_convert/inputs_true.dat +++ b/tests/test_mg_convert/inputs_true.dat @@ -18,7 +18,7 @@ 1000 - 2000 + 1000 100 diff --git a/tests/test_mg_convert/results_true.dat b/tests/test_mg_convert/results_true.dat index 5cf0eb6d26..cf4777b8eb 100644 --- a/tests/test_mg_convert/results_true.dat +++ b/tests/test_mg_convert/results_true.dat @@ -1,28 +1,24 @@ k-combined: -9.957263E-01 5.469041E-05 +9.957366E-01 7.836427E-05 k-combined: -9.957263E-01 5.469041E-05 +9.963227E-01 8.010344E-05 k-combined: -9.963652E-01 5.444550E-05 +9.957366E-01 7.836427E-05 k-combined: -9.957263E-01 5.469041E-05 +9.955152E-01 8.132242E-05 k-combined: -9.955157E-01 5.785520E-05 +9.953937E-01 8.452497E-05 k-combined: -9.954023E-01 5.694553E-05 +9.957744E-01 8.816057E-05 k-combined: -9.955722E-01 6.075634E-05 +9.955332E-01 8.894390E-05 k-combined: -9.955692E-01 6.094480E-05 +9.956463E-01 8.378533E-05 k-combined: -9.955154E-01 5.775805E-05 +9.955875E-01 8.818927E-05 k-combined: -9.956787E-01 5.915112E-05 +9.957017E-01 8.726677E-05 k-combined: -9.957022E-01 5.952369E-05 +9.957366E-01 7.836427E-05 k-combined: -9.953517E-01 5.920431E-05 -k-combined: -9.957263E-01 5.469041E-05 -k-combined: -9.957263E-01 5.469041E-05 +9.957366E-01 7.836427E-05 diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py index c5c0ac16c7..ad86e5a508 100755 --- a/tests/test_mg_convert/test_mg_convert.py +++ b/tests/test_mg_convert/test_mg_convert.py @@ -11,7 +11,7 @@ from testing_harness import PyAPITestHarness import openmc # OpenMC simulation parameters -batches = 2000 +batches = 1000 inactive = 100 particles = 1000 @@ -123,7 +123,7 @@ class MGXSTestHarness(PyAPITestHarness): def _run_openmc(self): # Run multiple conversions to compare results - cases = [None, ['legendre', 2], ['legendre', 0], + cases = [['legendre', 2], ['legendre', 0], ['tabular', 33], ['histogram', 32], [['tabular', 33], ['legendre', 1]], [['tabular', 33], ['tabular', 3]], @@ -131,7 +131,6 @@ class MGXSTestHarness(PyAPITestHarness): [['histogram', 32], ['legendre', 1]], [['histogram', 32], ['tabular', 3]], [['histogram', 32], ['histogram', 16]], - [['histogram', 32], ['histogram', 128]], ['angle', 2], [['angle', 2], ['isotropic', None]]] outstr = '' From ffc3bbfd67f0584820d3100801986b7f10d34ab8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Feb 2017 17:10:19 -0600 Subject: [PATCH 15/66] Allow plot, volume, and particle restart run modes directly --- examples/xml/basic/settings.xml | 10 +- examples/xml/boxes/settings.xml | 9 +- examples/xml/lattice/nested/settings.xml | 9 +- examples/xml/lattice/simple/settings.xml | 9 +- examples/xml/pincell/settings.xml | 11 +- examples/xml/pincell_multigroup/settings.xml | 18 +- examples/xml/reflective/settings.xml | 9 +- openmc/settings.py | 32 ++- src/constants.F90 | 3 +- src/input_xml.F90 | 211 ++++++++++-------- tests/test_asymmetric_lattice/inputs_true.dat | 9 +- tests/test_cmfd_feed/settings.xml | 11 +- tests/test_cmfd_nofeed/settings.xml | 11 +- tests/test_complex_cell/settings.xml | 9 +- tests/test_confidence_intervals/settings.xml | 9 +- .../inputs_true.dat | 7 +- tests/test_density/settings.xml | 9 +- tests/test_diff_tally/inputs_true.dat | 9 +- tests/test_distribmat/inputs_true.dat | 9 +- .../test_eigenvalue_genperbatch/settings.xml | 11 +- .../test_eigenvalue_no_inactive/settings.xml | 9 +- tests/test_energy_cutoff/inputs_true.dat | 7 +- tests/test_energy_grid/settings.xml | 9 +- tests/test_energy_laws/settings.xml | 9 +- tests/test_entropy/settings.xml | 9 +- .../case-1/settings.xml | 9 +- .../case-2/settings.xml | 9 +- .../case-3/settings.xml | 9 +- .../case-4/settings.xml | 19 +- tests/test_filter_energyfun/inputs_true.dat | 9 +- tests/test_filter_mesh/inputs_true.dat | 9 +- tests/test_fixed_source/settings.xml | 7 +- tests/test_infinite_cell/settings.xml | 9 +- tests/test_iso_in_lab/inputs_true.dat | 9 +- tests/test_lattice/settings.xml | 9 +- tests/test_lattice_hex/settings.xml | 9 +- tests/test_lattice_mixed/settings.xml | 9 +- tests/test_lattice_multiple/settings.xml | 9 +- tests/test_mg_basic/inputs_true.dat | 9 +- tests/test_mg_max_order/inputs_true.dat | 9 +- tests/test_mg_nuclide/inputs_true.dat | 9 +- tests/test_mg_tallies/inputs_true.dat | 9 +- .../inputs_true.dat | 9 +- .../inputs_true.dat | 9 +- .../inputs_true.dat | 9 +- tests/test_mgxs_library_hdf5/inputs_true.dat | 9 +- tests/test_mgxs_library_mesh/inputs_true.dat | 9 +- .../inputs_true.dat | 9 +- .../inputs_true.dat | 9 +- tests/test_multipole/inputs_true.dat | 9 +- tests/test_output/settings.xml | 9 +- .../test_particle_restart_eigval/settings.xml | 9 +- .../test_particle_restart_fixed/settings.xml | 7 +- tests/test_periodic/inputs_true.dat | 9 +- tests/test_plot/settings.xml | 9 +- tests/test_ptables_off/settings.xml | 9 +- tests/test_quadric_surfaces/settings.xml | 9 +- tests/test_reflective_plane/settings.xml | 9 +- .../test_resonance_scattering/inputs_true.dat | 9 +- tests/test_rotation/settings.xml | 9 +- tests/test_salphabeta/settings.xml | 9 +- tests/test_score_current/settings.xml | 9 +- tests/test_seed/settings.xml | 9 +- tests/test_source/inputs_true.dat | 9 +- tests/test_sourcepoint_batch/settings.xml | 9 +- tests/test_sourcepoint_latest/settings.xml | 9 +- tests/test_sourcepoint_restart/settings.xml | 9 +- tests/test_statepoint_batch/settings.xml | 9 +- tests/test_statepoint_restart/settings.xml | 9 +- tests/test_statepoint_sourcesep/settings.xml | 9 +- tests/test_survival_biasing/settings.xml | 9 +- tests/test_tallies/inputs_true.dat | 9 +- tests/test_tally_aggregation/inputs_true.dat | 9 +- tests/test_tally_arithmetic/inputs_true.dat | 9 +- tests/test_tally_assumesep/settings.xml | 9 +- tests/test_tally_nuclides/settings.xml | 9 +- tests/test_tally_slice_merge/inputs_true.dat | 9 +- tests/test_trace/settings.xml | 9 +- tests/test_track_output/settings.xml | 18 +- tests/test_translation/settings.xml | 9 +- .../test_trigger_batch_interval/settings.xml | 17 +- .../settings.xml | 17 +- tests/test_trigger_no_status/settings.xml | 19 +- tests/test_trigger_tallies/settings.xml | 17 +- tests/test_triso/inputs_true.dat | 9 +- tests/test_uniform_fs/settings.xml | 9 +- tests/test_universe/settings.xml | 9 +- tests/test_void/settings.xml | 9 +- tests/test_volume_calc/inputs_true.dat | 9 +- 89 files changed, 499 insertions(+), 584 deletions(-) diff --git a/examples/xml/basic/settings.xml b/examples/xml/basic/settings.xml index eb9f5bd56d..6e622b6cef 100644 --- a/examples/xml/basic/settings.xml +++ b/examples/xml/basic/settings.xml @@ -1,12 +1,10 @@ - - - 15 - 5 - 10000 - + eigenvalue + 15 + 5 + 10000 diff --git a/examples/xml/boxes/settings.xml b/examples/xml/boxes/settings.xml index eff7c1c105..9007a12c59 100644 --- a/examples/xml/boxes/settings.xml +++ b/examples/xml/boxes/settings.xml @@ -2,11 +2,10 @@ - - 15 - 5 - 10000 - + eigenvalue + 15 + 5 + 10000 diff --git a/examples/xml/lattice/nested/settings.xml b/examples/xml/lattice/nested/settings.xml index 2a6aaaf426..879173d1b3 100644 --- a/examples/xml/lattice/nested/settings.xml +++ b/examples/xml/lattice/nested/settings.xml @@ -2,11 +2,10 @@ - - 20 - 10 - 10000 - + eigenvalue + 20 + 10 + 10000 diff --git a/examples/xml/lattice/simple/settings.xml b/examples/xml/lattice/simple/settings.xml index 2a6aaaf426..879173d1b3 100644 --- a/examples/xml/lattice/simple/settings.xml +++ b/examples/xml/lattice/simple/settings.xml @@ -2,11 +2,10 @@ - - 20 - 10 - 10000 - + eigenvalue + 20 + 10 + 10000 diff --git a/examples/xml/pincell/settings.xml b/examples/xml/pincell/settings.xml index 443af9cde2..733de19260 100644 --- a/examples/xml/pincell/settings.xml +++ b/examples/xml/pincell/settings.xml @@ -2,11 +2,10 @@ - - 100 - 10 - 1000 - + eigenvalue + 100 + 10 + 1000 - - 500 - 10 - 10000 - + eigenvalue + 500 + 10 + 10000 diff --git a/openmc/settings.py b/openmc/settings.py index e6a3f9e131..a4dde8da30 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -11,6 +11,9 @@ from openmc.clean_xml import clean_xml_indentation import openmc.checkvalue as cv from openmc import Nuclide, VolumeCalculation, Source, Mesh +_RUN_MODES = ['eigenvalue', 'fixed source', 'plot', 'volume', + 'particle restart'] + class Settings(object): """Settings used for an OpenMC simulation. @@ -81,7 +84,7 @@ class Settings(object): The elastic scattering model to use for resonant isotopes run_cmfd : bool Indicate if coarse mesh finite difference acceleration is to be used - run_mode : {'eigenvalue' or 'fixed source'} + run_mode : {'eigenvalue', 'fixed source', 'plot', 'volume', 'particle restart'} The type of calculation to perform (default is 'eigenvalue') seed : int Seed for the linear congruential pseudorandom number generator @@ -388,10 +391,7 @@ class Settings(object): @run_mode.setter def run_mode(self, run_mode): - 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) + cv.check_value('run mode', run_mode, _RUN_MODES) self._run_mode = run_mode @batches.setter @@ -794,18 +794,8 @@ class Settings(object): self._create_fission_neutrons = create_fission_neutrons def _create_run_mode_subelement(self, root): - - if self.run_mode == 'eigenvalue': - elem = ET.SubElement(root, "eigenvalue") - self._create_particles_subelement(elem) - self._create_batches_subelement(elem) - self._create_inactive_subelement(elem) - self._create_generations_per_batch_subelement(elem) - self._create_keff_trigger_subelement(elem) - else: - elem = ET.SubElement(root, "fixed_source") - self._create_particles_subelement(elem) - self._create_batches_subelement(elem) + elem = ET.SubElement(root, "run_mode") + elem.text = self._run_mode def _create_batches_subelement(self, run_mode_element): if self._batches is not None: @@ -814,8 +804,7 @@ class Settings(object): def _create_generations_per_batch_subelement(self, run_mode_element): if self._generations_per_batch is not None: - element = ET.SubElement(run_mode_element, - "generations_per_batch") + element = ET.SubElement(run_mode_element, "generations_per_batch") element.text = str(self._generations_per_batch) def _create_inactive_subelement(self, run_mode_element): @@ -1081,6 +1070,11 @@ class Settings(object): root_element = ET.Element("settings") self._create_run_mode_subelement(root_element) + self._create_particles_subelement(root_element) + self._create_batches_subelement(root_element) + self._create_inactive_subelement(root_element) + self._create_generations_per_batch_subelement(root_element) + self._create_keff_trigger_subelement(root_element) self._create_source_subelement(root_element) self._create_output_subelement(root_element) self._create_statepoint_subelement(root_element) diff --git a/src/constants.F90 b/src/constants.F90 index 8ed657339c..43ba2c223c 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -424,7 +424,8 @@ module constants MODE_FIXEDSOURCE = 1, & ! Fixed source mode MODE_EIGENVALUE = 2, & ! K eigenvalue mode MODE_PLOTTING = 3, & ! Plotting mode - MODE_PARTICLE = 4 ! Particle restart mode + MODE_PARTICLE = 4, & ! Particle restart mode + MODE_VOLUME = 5 ! Volume calculation mode !============================================================================= ! CMFD CONSTANTS diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 2be8cbd573..6a2efa2e75 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -100,7 +100,6 @@ contains type(Node), pointer :: node_res_scat => null() type(Node), pointer :: node_scatterer => null() type(Node), pointer :: node_trigger => null() - type(Node), pointer :: node_keff_trigger => null() type(Node), pointer :: node_vol => null() type(Node), pointer :: node_tab_leg => null() type(NodeList), pointer :: node_scat_list => null() @@ -224,111 +223,49 @@ contains end if end if - ! Make sure that either eigenvalue or fixed source was specified - if (.not. check_for_node(doc, "eigenvalue") .and. & - .not. check_for_node(doc, "fixed_source")) then - call fatal_error(" or not specified.") - end if + if (check_for_node(doc, "run_mode")) then + call get_node_value(doc, "run_mode", temp_str) + select case (to_lower(temp_str)) + case ("eigenvalue") + run_mode = MODE_EIGENVALUE + case ("fixed source") + run_mode = MODE_FIXEDSOURCE + case ("plot") + run_mode = MODE_PLOTTING + case ("particle restart") + run_mode = MODE_PARTICLE + case ("volume") + run_mode = MODE_VOLUME + end select - ! Eigenvalue information - if (check_for_node(doc, "eigenvalue")) then - ! Set run mode - if (run_mode == NONE) run_mode = MODE_EIGENVALUE + ! Assume XML specifics , , etc. directly + node_mode => doc + else + call warning(" should be specified.") - ! Get pointer to eigenvalue XML block - call get_node_ptr(doc, "eigenvalue", node_mode) - - ! Check number of particles - if (.not. check_for_node(node_mode, "particles")) then - call fatal_error("Need to specify number of particles per generation.") + ! Make sure that either eigenvalue or fixed source was specified + if (.not. check_for_node(doc, "eigenvalue") .and. & + .not. check_for_node(doc, "fixed_source")) then + call fatal_error(" or not specified.") end if - ! Get number of particles - call get_node_value(node_mode, "particles", temp_long) + if (check_for_node(doc, "eigenvalue")) then + ! Set run mode + if (run_mode == NONE) run_mode = MODE_EIGENVALUE - ! If the number of particles was specified as a command-line argument, we - ! don't set it here - if (n_particles == 0) n_particles = temp_long + ! Get pointer to eigenvalue XML block + call get_node_ptr(doc, "eigenvalue", node_mode) + elseif (check_for_node(doc, "fixed_source")) then + ! Set run mode + if (run_mode == NONE) run_mode = MODE_FIXEDSOURCE - ! Get number of basic batches - call get_node_value(node_mode, "batches", n_batches) - if (.not. trigger_on) then - n_max_batches = n_batches - end if - - ! Get number of inactive batches - call get_node_value(node_mode, "inactive", n_inactive) - n_active = n_batches - n_inactive - if (check_for_node(node_mode, "generations_per_batch")) then - call get_node_value(node_mode, "generations_per_batch", gen_per_batch) - end if - - ! Allocate array for batch keff and entropy - allocate(k_generation(n_max_batches*gen_per_batch)) - allocate(entropy(n_max_batches*gen_per_batch)) - entropy = ZERO - - ! Get the trigger information for keff - if (check_for_node(node_mode, "keff_trigger")) then - call get_node_ptr(node_mode, "keff_trigger", node_keff_trigger) - - if (check_for_node(node_keff_trigger, "type")) then - call get_node_value(node_keff_trigger, "type", temp_str) - temp_str = trim(to_lower(temp_str)) - - select case (temp_str) - case ('std_dev') - keff_trigger % trigger_type = STANDARD_DEVIATION - case ('variance') - keff_trigger % trigger_type = VARIANCE - case ('rel_err') - keff_trigger % trigger_type = RELATIVE_ERROR - case default - call fatal_error("Unrecognized keff trigger type " // temp_str) - end select - - else - call fatal_error("Specify keff trigger type in settings XML") - end if - - if (check_for_node(node_keff_trigger, "threshold")) then - call get_node_value(node_keff_trigger, "threshold", & - keff_trigger % threshold) - else - call fatal_error("Specify keff trigger threshold in settings XML") - end if + ! Get pointer to fixed_source XML block + call get_node_ptr(doc, "fixed_source", node_mode) end if end if - ! Fixed source calculation information - if (check_for_node(doc, "fixed_source")) then - ! Set run mode - if (run_mode == NONE) run_mode = MODE_FIXEDSOURCE - - ! Get pointer to fixed_source XML block - call get_node_ptr(doc, "fixed_source", node_mode) - - ! Check number of particles - if (.not. check_for_node(node_mode, "particles")) then - call fatal_error("Need to specify number of particles per batch.") - end if - - ! Get number of particles - call get_node_value(node_mode, "particles", temp_long) - - ! If the number of particles was specified as a command-line argument, we - ! don't set it here - if (n_particles == 0) n_particles = temp_long - - ! Copy batch information - call get_node_value(node_mode, "batches", n_batches) - if (.not. trigger_on) then - n_max_batches = n_batches - end if - n_active = n_batches - n_inactive = 0 - gen_per_batch = 1 - end if + ! Read run parameters + call get_run_parameters(node_mode) ! Check number of active batches, inactive batches, and particles if (n_active <= 0) then @@ -1093,6 +1030,86 @@ contains end subroutine read_settings_xml +!=============================================================================== +! GET_RUN_PARAMETERS +!=============================================================================== + + subroutine get_run_parameters(node_base) + type(Node), pointer :: node_base + + integer(8) :: temp_long + character(MAX_LINE_LEN) :: temp_str + type(Node), pointer :: node_keff_trigger => null() + + ! Check number of particles + if (.not. check_for_node(node_base, "particles")) then + call fatal_error("Need to specify number of particles.") + end if + + ! Get number of particles + call get_node_value(node_base, "particles", temp_long) + + ! If the number of particles was specified as a command-line argument, we + ! don't set it here + if (n_particles == 0) n_particles = temp_long + + ! Get number of basic batches + call get_node_value(node_base, "batches", n_batches) + if (.not. trigger_on) then + n_max_batches = n_batches + end if + n_inactive = 0 + gen_per_batch = 1 + + ! Get number of inactive batches + if (run_mode == MODE_EIGENVALUE) then + call get_node_value(node_base, "inactive", n_inactive) + if (check_for_node(node_base, "generations_per_batch")) then + call get_node_value(node_base, "generations_per_batch", gen_per_batch) + end if + + ! Allocate array for batch keff and entropy + allocate(k_generation(n_max_batches*gen_per_batch)) + allocate(entropy(n_max_batches*gen_per_batch)) + entropy = ZERO + + ! Get the trigger information for keff + if (check_for_node(node_base, "keff_trigger")) then + call get_node_ptr(node_base, "keff_trigger", node_keff_trigger) + + if (check_for_node(node_keff_trigger, "type")) then + call get_node_value(node_keff_trigger, "type", temp_str) + temp_str = trim(to_lower(temp_str)) + + select case (temp_str) + case ('std_dev') + keff_trigger % trigger_type = STANDARD_DEVIATION + case ('variance') + keff_trigger % trigger_type = VARIANCE + case ('rel_err') + keff_trigger % trigger_type = RELATIVE_ERROR + case default + call fatal_error("Unrecognized keff trigger type " // temp_str) + end select + + else + call fatal_error("Specify keff trigger type in settings XML") + end if + + if (check_for_node(node_keff_trigger, "threshold")) then + call get_node_value(node_keff_trigger, "threshold", & + keff_trigger % threshold) + else + call fatal_error("Specify keff trigger threshold in settings XML") + end if + end if + end if + + ! Determine number of active batches + n_active = n_batches - n_inactive + + end subroutine get_run_parameters + !=============================================================================== ! READ_GEOMETRY_XML reads data from a geometry.xml file and parses it, checking ! for errors and placing properly-formatted data in the right data structures diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index ada4f8f052..32745dad1e 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -205,11 +205,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -32 -32 0 32 32 32 diff --git a/tests/test_cmfd_feed/settings.xml b/tests/test_cmfd_feed/settings.xml index 41de07f569..eab90b70fd 100644 --- a/tests/test_cmfd_feed/settings.xml +++ b/tests/test_cmfd_feed/settings.xml @@ -2,11 +2,10 @@ - - 20 - 10 - 1000 - + eigenvalue + 20 + 10 + 1000 @@ -19,7 +18,7 @@ - + 10 1 1 -10.0 -1.0 -1.0 diff --git a/tests/test_cmfd_nofeed/settings.xml b/tests/test_cmfd_nofeed/settings.xml index 41de07f569..eab90b70fd 100644 --- a/tests/test_cmfd_nofeed/settings.xml +++ b/tests/test_cmfd_nofeed/settings.xml @@ -2,11 +2,10 @@ - - 20 - 10 - 1000 - + eigenvalue + 20 + 10 + 1000 @@ -19,7 +18,7 @@ - + 10 1 1 -10.0 -1.0 -1.0 diff --git a/tests/test_complex_cell/settings.xml b/tests/test_complex_cell/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_complex_cell/settings.xml +++ b/tests/test_complex_cell/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_confidence_intervals/settings.xml b/tests/test_confidence_intervals/settings.xml index 19a27694e0..09e53927d3 100644 --- a/tests/test_confidence_intervals/settings.xml +++ b/tests/test_confidence_intervals/settings.xml @@ -3,11 +3,10 @@ true - - 10 - 2 - 100 - + eigenvalue + 10 + 2 + 100 diff --git a/tests/test_create_fission_neutrons/inputs_true.dat b/tests/test_create_fission_neutrons/inputs_true.dat index ad2e47f9b3..b4245d2c89 100644 --- a/tests/test_create_fission_neutrons/inputs_true.dat +++ b/tests/test_create_fission_neutrons/inputs_true.dat @@ -18,10 +18,9 @@ - - 100 - 10 - + fixed source + 100 + 10 -1 -1 -1 1 1 1 diff --git a/tests/test_density/settings.xml b/tests/test_density/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_density/settings.xml +++ b/tests/test_density/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_diff_tally/inputs_true.dat b/tests/test_diff_tally/inputs_true.dat index 0010c6d97f..0d75e48c6f 100644 --- a/tests/test_diff_tally/inputs_true.dat +++ b/tests/test_diff_tally/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 3 - 0 - + eigenvalue + 100 + 3 + 0 -160 -160 -183 160 160 183 diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index d9b32ca841..746bb8bef5 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -37,11 +37,10 @@ - - 1000 - 5 - 0 - + eigenvalue + 1000 + 5 + 0 -1 -1 -1 1 1 1 diff --git a/tests/test_eigenvalue_genperbatch/settings.xml b/tests/test_eigenvalue_genperbatch/settings.xml index a64b477b88..fefc2d059a 100644 --- a/tests/test_eigenvalue_genperbatch/settings.xml +++ b/tests/test_eigenvalue_genperbatch/settings.xml @@ -1,12 +1,11 @@ - - 7 - 3 - 1000 - 3 - + eigenvalue + 7 + 3 + 1000 + 3 diff --git a/tests/test_eigenvalue_no_inactive/settings.xml b/tests/test_eigenvalue_no_inactive/settings.xml index 36d323ac04..f13a1665e7 100644 --- a/tests/test_eigenvalue_no_inactive/settings.xml +++ b/tests/test_eigenvalue_no_inactive/settings.xml @@ -1,11 +1,10 @@ - - 10 - 0 - 1000 - + eigenvalue + 10 + 0 + 1000 diff --git a/tests/test_energy_cutoff/inputs_true.dat b/tests/test_energy_cutoff/inputs_true.dat index eafb2e3895..7f67288d1e 100644 --- a/tests/test_energy_cutoff/inputs_true.dat +++ b/tests/test_energy_cutoff/inputs_true.dat @@ -17,10 +17,9 @@ - - 100 - 10 - + fixed source + 100 + 10 -1 -1 -1 1 1 1 diff --git a/tests/test_energy_grid/settings.xml b/tests/test_energy_grid/settings.xml index 1e4b5937b8..4b8d4fcebb 100644 --- a/tests/test_energy_grid/settings.xml +++ b/tests/test_energy_grid/settings.xml @@ -3,11 +3,10 @@ 20000 - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_energy_laws/settings.xml b/tests/test_energy_laws/settings.xml index 1c3f444f0f..946345eeb5 100644 --- a/tests/test_energy_laws/settings.xml +++ b/tests/test_energy_laws/settings.xml @@ -1,10 +1,9 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_entropy/settings.xml b/tests/test_entropy/settings.xml index d6c6c4a478..df6a851ef6 100644 --- a/tests/test_entropy/settings.xml +++ b/tests/test_entropy/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_filter_distribcell/case-1/settings.xml b/tests/test_filter_distribcell/case-1/settings.xml index 3ca5c1a327..14c6f3020f 100644 --- a/tests/test_filter_distribcell/case-1/settings.xml +++ b/tests/test_filter_distribcell/case-1/settings.xml @@ -1,11 +1,10 @@ - - 1 - 0 - 1000 - + eigenvalue + 1 + 0 + 1000 diff --git a/tests/test_filter_distribcell/case-2/settings.xml b/tests/test_filter_distribcell/case-2/settings.xml index 3ca5c1a327..14c6f3020f 100644 --- a/tests/test_filter_distribcell/case-2/settings.xml +++ b/tests/test_filter_distribcell/case-2/settings.xml @@ -1,11 +1,10 @@ - - 1 - 0 - 1000 - + eigenvalue + 1 + 0 + 1000 diff --git a/tests/test_filter_distribcell/case-3/settings.xml b/tests/test_filter_distribcell/case-3/settings.xml index 98c02fc307..ac716f3209 100644 --- a/tests/test_filter_distribcell/case-3/settings.xml +++ b/tests/test_filter_distribcell/case-3/settings.xml @@ -1,11 +1,10 @@ - - 3 - 0 - 100 - + eigenvalue + 3 + 0 + 100 diff --git a/tests/test_filter_distribcell/case-4/settings.xml b/tests/test_filter_distribcell/case-4/settings.xml index 90e48b9c18..f3f0779bc9 100644 --- a/tests/test_filter_distribcell/case-4/settings.xml +++ b/tests/test_filter_distribcell/case-4/settings.xml @@ -1,13 +1,12 @@ - - 1000 - 1 - 0 - - - - -1 -1 -1 1 1 1 - - + eigenvalue + 1000 + 1 + 0 + + + -1 -1 -1 1 1 1 + + diff --git a/tests/test_filter_energyfun/inputs_true.dat b/tests/test_filter_energyfun/inputs_true.dat index df627fa049..48f6c5033e 100644 --- a/tests/test_filter_energyfun/inputs_true.dat +++ b/tests/test_filter_energyfun/inputs_true.dat @@ -298,11 +298,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_filter_mesh/inputs_true.dat b/tests/test_filter_mesh/inputs_true.dat index 9f1951b56b..1d9d6ac5c2 100644 --- a/tests/test_filter_mesh/inputs_true.dat +++ b/tests/test_filter_mesh/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_fixed_source/settings.xml b/tests/test_fixed_source/settings.xml index 1e9b85d5a8..e7e7f2f5b9 100644 --- a/tests/test_fixed_source/settings.xml +++ b/tests/test_fixed_source/settings.xml @@ -1,10 +1,9 @@ - - 10 - 100 - + fixed source + 10 + 100 294 diff --git a/tests/test_infinite_cell/settings.xml b/tests/test_infinite_cell/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_infinite_cell/settings.xml +++ b/tests/test_infinite_cell/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 6b4b14c2c4..682f8020f6 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_lattice/settings.xml b/tests/test_lattice/settings.xml index d152920c11..ebe98a2837 100644 --- a/tests/test_lattice/settings.xml +++ b/tests/test_lattice/settings.xml @@ -10,11 +10,10 @@ =============================================================== --> - - 10 - 5 - 100 - + eigenvalue + 10 + 5 + 100 diff --git a/tests/test_lattice_hex/settings.xml b/tests/test_lattice_hex/settings.xml index 810529cb13..0d87c3b861 100644 --- a/tests/test_lattice_hex/settings.xml +++ b/tests/test_lattice_hex/settings.xml @@ -1,10 +1,9 @@ - - 10 - 5 - 500 - + eigenvalue + 10 + 5 + 500 diff --git a/tests/test_lattice_mixed/settings.xml b/tests/test_lattice_mixed/settings.xml index b67824d036..69d50204e0 100644 --- a/tests/test_lattice_mixed/settings.xml +++ b/tests/test_lattice_mixed/settings.xml @@ -1,10 +1,9 @@ - - 10 - 5 - 500 - + eigenvalue + 10 + 5 + 500 diff --git a/tests/test_lattice_multiple/settings.xml b/tests/test_lattice_multiple/settings.xml index 517637a59f..569c809821 100644 --- a/tests/test_lattice_multiple/settings.xml +++ b/tests/test_lattice_multiple/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 100 - + eigenvalue + 10 + 5 + 100 diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index 182e5f46d3..7141e57dd4 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -84,11 +84,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 0.0 0.0 0.0 10.0 10.0 5.0 diff --git a/tests/test_mg_max_order/inputs_true.dat b/tests/test_mg_max_order/inputs_true.dat index 857e95bf55..a5feed722d 100644 --- a/tests/test_mg_max_order/inputs_true.dat +++ b/tests/test_mg_max_order/inputs_true.dat @@ -30,11 +30,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 0.0 0.0 0.0 10.0 10.0 5.0 diff --git a/tests/test_mg_nuclide/inputs_true.dat b/tests/test_mg_nuclide/inputs_true.dat index 829b908ffa..b5cb31b59c 100644 --- a/tests/test_mg_nuclide/inputs_true.dat +++ b/tests/test_mg_nuclide/inputs_true.dat @@ -84,11 +84,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 0.0 0.0 0.0 10.0 10.0 5.0 diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index 56d97a394c..244d92b06b 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -84,11 +84,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 0.0 0.0 0.0 10.0 10.0 5.0 diff --git a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat index 920dc4b5ef..e31ee4d049 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -38,11 +38,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -0.63 -0.63 -1 0.63 0.63 1 diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index ac3f32c4f7..ad6526fc16 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -38,11 +38,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -0.63 -0.63 -1 0.63 0.63 1 diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index fd04015270..9103a4b968 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -65,11 +65,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -10.71 -10.71 -1 10.71 10.71 1 diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index ac3f32c4f7..ad6526fc16 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -38,11 +38,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -0.63 -0.63 -1 0.63 0.63 1 diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 07b2076d73..421f4d8c78 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index ac3f32c4f7..ad6526fc16 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -38,11 +38,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -0.63 -0.63 -1 0.63 0.63 1 diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index 05227ca8c6..74dfc7b2e3 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -38,11 +38,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -0.63 -0.63 -1 0.63 0.63 1 diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 4b158b07c7..2a1e865ada 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -34,11 +34,10 @@ - - 1000 - 5 - 0 - + eigenvalue + 1000 + 5 + 0 -1 -1 -1 1 1 1 diff --git a/tests/test_output/settings.xml b/tests/test_output/settings.xml index e2f3fc0186..22b6267a33 100644 --- a/tests/test_output/settings.xml +++ b/tests/test_output/settings.xml @@ -3,11 +3,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_particle_restart_eigval/settings.xml b/tests/test_particle_restart_eigval/settings.xml index c01617e221..da37b4fc2e 100644 --- a/tests/test_particle_restart_eigval/settings.xml +++ b/tests/test_particle_restart_eigval/settings.xml @@ -1,11 +1,10 @@ - - 12 - 5 - 1200 - + eigenvalue + 12 + 5 + 1200 diff --git a/tests/test_particle_restart_fixed/settings.xml b/tests/test_particle_restart_fixed/settings.xml index 1d8193f8f6..9c731fde8c 100644 --- a/tests/test_particle_restart_fixed/settings.xml +++ b/tests/test_particle_restart_fixed/settings.xml @@ -1,10 +1,9 @@ - - 12 - 1000 - + fixed source + 12 + 1000 diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 764fec50db..5f7da5c470 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -25,11 +25,10 @@ - - 1000 - 4 - 0 - + eigenvalue + 1000 + 4 + 0 -5.0 -5.0 -5.0 5.0 5.0 5.0 diff --git a/tests/test_plot/settings.xml b/tests/test_plot/settings.xml index 03985b3ae9..37623cb1fb 100644 --- a/tests/test_plot/settings.xml +++ b/tests/test_plot/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_ptables_off/settings.xml b/tests/test_ptables_off/settings.xml index ab5404b206..5ae20fd386 100644 --- a/tests/test_ptables_off/settings.xml +++ b/tests/test_ptables_off/settings.xml @@ -3,11 +3,10 @@ false - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_quadric_surfaces/settings.xml b/tests/test_quadric_surfaces/settings.xml index 9f0e8ed05f..81e5ad1855 100644 --- a/tests/test_quadric_surfaces/settings.xml +++ b/tests/test_quadric_surfaces/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_reflective_plane/settings.xml b/tests/test_reflective_plane/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_reflective_plane/settings.xml +++ b/tests/test_reflective_plane/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index 804c6c4f6f..2801f115de 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -15,11 +15,10 @@ - - 1000 - 10 - 5 - + eigenvalue + 1000 + 10 + 5 -4 -4 -4 4 4 4 diff --git a/tests/test_rotation/settings.xml b/tests/test_rotation/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_rotation/settings.xml +++ b/tests/test_rotation/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_salphabeta/settings.xml b/tests/test_salphabeta/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_salphabeta/settings.xml +++ b/tests/test_salphabeta/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_score_current/settings.xml b/tests/test_score_current/settings.xml index 517637a59f..569c809821 100644 --- a/tests/test_score_current/settings.xml +++ b/tests/test_score_current/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 100 - + eigenvalue + 10 + 5 + 100 diff --git a/tests/test_seed/settings.xml b/tests/test_seed/settings.xml index 0514e8a0ac..11da445885 100644 --- a/tests/test_seed/settings.xml +++ b/tests/test_seed/settings.xml @@ -3,11 +3,10 @@ 239407351 - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_source/inputs_true.dat b/tests/test_source/inputs_true.dat index 727636c517..bb80609aff 100644 --- a/tests/test_source/inputs_true.dat +++ b/tests/test_source/inputs_true.dat @@ -13,11 +13,10 @@ - - 1000 - 10 - 5 - + eigenvalue + 1000 + 10 + 5 diff --git a/tests/test_sourcepoint_batch/settings.xml b/tests/test_sourcepoint_batch/settings.xml index c816fe700e..13096d551b 100644 --- a/tests/test_sourcepoint_batch/settings.xml +++ b/tests/test_sourcepoint_batch/settings.xml @@ -4,11 +4,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_sourcepoint_latest/settings.xml b/tests/test_sourcepoint_latest/settings.xml index fa7f07dfae..58dfa671d4 100644 --- a/tests/test_sourcepoint_latest/settings.xml +++ b/tests/test_sourcepoint_latest/settings.xml @@ -3,11 +3,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_sourcepoint_restart/settings.xml b/tests/test_sourcepoint_restart/settings.xml index 4e9b12d246..1a7a21357c 100644 --- a/tests/test_sourcepoint_restart/settings.xml +++ b/tests/test_sourcepoint_restart/settings.xml @@ -4,11 +4,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_statepoint_batch/settings.xml b/tests/test_statepoint_batch/settings.xml index 0d8c3e88f0..e2f8dad47b 100644 --- a/tests/test_statepoint_batch/settings.xml +++ b/tests/test_statepoint_batch/settings.xml @@ -3,11 +3,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_statepoint_restart/settings.xml b/tests/test_statepoint_restart/settings.xml index ec9adfb1dc..88382f74b4 100644 --- a/tests/test_statepoint_restart/settings.xml +++ b/tests/test_statepoint_restart/settings.xml @@ -3,11 +3,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_statepoint_sourcesep/settings.xml b/tests/test_statepoint_sourcesep/settings.xml index 17d4ee2e2e..86489bf33d 100644 --- a/tests/test_statepoint_sourcesep/settings.xml +++ b/tests/test_statepoint_sourcesep/settings.xml @@ -4,11 +4,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_survival_biasing/settings.xml b/tests/test_survival_biasing/settings.xml index b0ff3fafc6..6d5b667891 100644 --- a/tests/test_survival_biasing/settings.xml +++ b/tests/test_survival_biasing/settings.xml @@ -8,11 +8,10 @@ 1.2 - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index c349c3b94a..88ff72f9bb 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -297,11 +297,10 @@ - - 400 - 5 - 0 - + eigenvalue + 400 + 5 + 0 -160 -160 -183 160 160 183 diff --git a/tests/test_tally_aggregation/inputs_true.dat b/tests/test_tally_aggregation/inputs_true.dat index 23a35ad792..8223b8d6a2 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_tally_arithmetic/inputs_true.dat b/tests/test_tally_arithmetic/inputs_true.dat index 323b56e496..4ade94e938 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_tally_assumesep/settings.xml b/tests/test_tally_assumesep/settings.xml index 517637a59f..569c809821 100644 --- a/tests/test_tally_assumesep/settings.xml +++ b/tests/test_tally_assumesep/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 100 - + eigenvalue + 10 + 5 + 100 diff --git a/tests/test_tally_nuclides/settings.xml b/tests/test_tally_nuclides/settings.xml index b2ddb42483..32afc717a9 100644 --- a/tests/test_tally_nuclides/settings.xml +++ b/tests/test_tally_nuclides/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 100 - + eigenvalue + 10 + 5 + 100 diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index 8941737607..93b4af5cd9 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -297,11 +297,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -160 -160 -183 160 160 183 diff --git a/tests/test_trace/settings.xml b/tests/test_trace/settings.xml index e50684eef6..ce614711bd 100644 --- a/tests/test_trace/settings.xml +++ b/tests/test_trace/settings.xml @@ -3,11 +3,10 @@ 5 1 453 - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_track_output/settings.xml b/tests/test_track_output/settings.xml index ef74341dbb..299ee72c53 100644 --- a/tests/test_track_output/settings.xml +++ b/tests/test_track_output/settings.xml @@ -1,19 +1,11 @@ - - - - - - 2 - 0 - 100 - - - - + eigenvalue + 2 + 0 + 100 @@ -26,5 +18,5 @@ 1 1 1 1 1 2 - + diff --git a/tests/test_translation/settings.xml b/tests/test_translation/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_translation/settings.xml +++ b/tests/test_translation/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_trigger_batch_interval/settings.xml b/tests/test_trigger_batch_interval/settings.xml index b8e1e9c96a..ecba8d3475 100644 --- a/tests/test_trigger_batch_interval/settings.xml +++ b/tests/test_trigger_batch_interval/settings.xml @@ -1,14 +1,13 @@ - - 15 - 5 - 1000 - - std_dev - 0.004 - - + eigenvalue + 15 + 5 + 1000 + + std_dev + 0.004 + true diff --git a/tests/test_trigger_no_batch_interval/settings.xml b/tests/test_trigger_no_batch_interval/settings.xml index 5412af35f9..9a4c94226c 100644 --- a/tests/test_trigger_no_batch_interval/settings.xml +++ b/tests/test_trigger_no_batch_interval/settings.xml @@ -1,14 +1,13 @@ - - 15 - 5 - 1000 - - std_dev - 0.004 - - + eigenvalue + 15 + 5 + 1000 + + std_dev + 0.004 + true diff --git a/tests/test_trigger_no_status/settings.xml b/tests/test_trigger_no_status/settings.xml index 3d215a4329..b85816240e 100644 --- a/tests/test_trigger_no_status/settings.xml +++ b/tests/test_trigger_no_status/settings.xml @@ -1,20 +1,19 @@ - - 10 - 5 - 1000 - - std_dev - 0.009 - - + eigenvalue + 10 + 5 + 1000 + + std_dev + 0.009 + false 15 1 - + diff --git a/tests/test_trigger_tallies/settings.xml b/tests/test_trigger_tallies/settings.xml index 895c0ee72c..d8f814bf33 100644 --- a/tests/test_trigger_tallies/settings.xml +++ b/tests/test_trigger_tallies/settings.xml @@ -1,14 +1,13 @@ - - 10 - 5 - 1000 - - std_dev - 0.001 - - + eigenvalue + 10 + 5 + 1000 + + std_dev + 0.001 + true diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index be6d2d0eae..43b15b037c 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -430,11 +430,10 @@ - - 100 - 5 - 0 - + eigenvalue + 100 + 5 + 0 0.0 0.0 0.0 diff --git a/tests/test_uniform_fs/settings.xml b/tests/test_uniform_fs/settings.xml index d7956e7438..3e6ef672fd 100644 --- a/tests/test_uniform_fs/settings.xml +++ b/tests/test_uniform_fs/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_universe/settings.xml b/tests/test_universe/settings.xml index a6fd5da19e..70b4e802f8 100644 --- a/tests/test_universe/settings.xml +++ b/tests/test_universe/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 1000 - + eigenvalue + 10 + 5 + 1000 diff --git a/tests/test_void/settings.xml b/tests/test_void/settings.xml index b2ddb42483..32afc717a9 100644 --- a/tests/test_void/settings.xml +++ b/tests/test_void/settings.xml @@ -1,11 +1,10 @@ - - 10 - 5 - 100 - + eigenvalue + 10 + 5 + 100 diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index af26cf8e7b..28b4928cd9 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -26,11 +26,10 @@ - - 1000 - 4 - 0 - + eigenvalue + 1000 + 4 + 0 -1.0 -1.0 -5.0 1.0 1.0 5.0 From 698efb04e21eb685e73b636d2369ac1c2437d061 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 16 Feb 2017 17:26:23 -0600 Subject: [PATCH 16/66] Allow volume calculations to be run alone --- src/input_xml.F90 | 25 +++++++++++++--------- src/main.F90 | 3 +++ src/simulation.F90 | 3 --- tests/test_volume_calc/inputs_true.dat | 10 +-------- tests/test_volume_calc/results_true.dat | 1 - tests/test_volume_calc/test_volume_calc.py | 19 ++++++---------- 6 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 6a2efa2e75..93bb1e733c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -264,16 +264,18 @@ contains end if end if - ! Read run parameters - call get_run_parameters(node_mode) + if (run_mode == MODE_EIGENVALUE .or. run_mode == MODE_FIXEDSOURCE) then + ! Read run parameters + call get_run_parameters(node_mode) - ! Check number of active batches, inactive batches, and particles - if (n_active <= 0) then - call fatal_error("Number of active batches must be greater than zero.") - elseif (n_inactive < 0) then - call fatal_error("Number of inactive batches must be non-negative.") - elseif (n_particles <= 0) then - call fatal_error("Number of particles must be greater than zero.") + ! Check number of active batches, inactive batches, and particles + if (n_active <= 0) then + call fatal_error("Number of active batches must be greater than zero.") + elseif (n_inactive < 0) then + call fatal_error("Number of inactive batches must be non-negative.") + elseif (n_particles <= 0) then + call fatal_error("Number of particles must be greater than zero.") + end if end if ! Copy random number seed if specified @@ -317,7 +319,10 @@ contains ! Get point to list of elements and make sure there is at least one call get_node_list(doc, "source", node_source_list) n = get_list_size(node_source_list) - if (n == 0) call fatal_error("No source specified in settings XML file.") + + if (run_mode == MODE_EIGENVALUE .or. run_mode == MODE_FIXEDSOURCE) then + if (n == 0) call fatal_error("No source specified in settings XML file.") + end if ! Allocate array for sources allocate(external_source(n)) diff --git a/src/main.F90 b/src/main.F90 index 8582ef7039..1cd3a9e547 100644 --- a/src/main.F90 +++ b/src/main.F90 @@ -8,6 +8,7 @@ program main use particle_restart, only: run_particle_restart use plot, only: run_plot use simulation, only: run_simulation + use volume_calc, only: run_volume_calculations implicit none @@ -26,6 +27,8 @@ program main call run_plot() case (MODE_PARTICLE) if (master) call run_particle_restart() + case (MODE_VOLUME) + call run_volume_calculations() end select ! finalize run diff --git a/src/simulation.F90 b/src/simulation.F90 index 187632836e..707f427378 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -39,9 +39,6 @@ contains type(Particle) :: p integer(8) :: i_work - ! Volume calculations - if (size(volume_calcs) > 0) call run_volume_calculations() - if (.not. restart_run) call initialize_source() ! Display header diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 28b4928cd9..627d30a404 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -26,15 +26,7 @@ - eigenvalue - 1000 - 4 - 0 - - - -1.0 -1.0 -5.0 1.0 1.0 5.0 - - + volume cell 1 2 3 diff --git a/tests/test_volume_calc/results_true.dat b/tests/test_volume_calc/results_true.dat index a36e61fb5e..8eb2a61acf 100644 --- a/tests/test_volume_calc/results_true.dat +++ b/tests/test_volume_calc/results_true.dat @@ -1,4 +1,3 @@ -k-combined: 4.165450e-02 3.582533e-04 Volume calculation 0 Domain 1: 31.4693 +/- 0.0721 cm^3 Domain 2: 2.0933 +/- 0.0310 cm^3 diff --git a/tests/test_volume_calc/test_volume_calc.py b/tests/test_volume_calc/test_volume_calc.py index fa267efb6a..cb4ecc2d74 100644 --- a/tests/test_volume_calc/test_volume_calc.py +++ b/tests/test_volume_calc/test_volume_calc.py @@ -52,22 +52,12 @@ class VolumeTest(PyAPITestHarness): # Define settings settings = openmc.Settings() - settings.particles = 1000 - settings.batches = 4 - settings.inactive = 0 - settings.source = openmc.Source(space=openmc.stats.Box( - [-1., -1., -5.], [1., 1., 5.])) + settings.run_mode = 'volume' settings.volume_calculations = vol_calcs settings.export_to_xml() def _get_results(self): - # Read the statepoint file. - statepoint = os.path.join(os.getcwd(), self._sp_name) - sp = openmc.StatePoint(statepoint) - - # Write out k-combined. - outstr = 'k-combined: {:12.6e} {:12.6e}\n'.format(*sp.k_combined) - + outstr = '' for i, filename in enumerate(sorted(glob.glob(os.path.join( os.getcwd(), 'volume_*.h5')))): outstr += 'Volume calculation {}\n'.format(i) @@ -83,6 +73,9 @@ class VolumeTest(PyAPITestHarness): return outstr + def _test_output_created(self): + pass + if __name__ == '__main__': - harness = VolumeTest('statepoint.4.h5') + harness = VolumeTest('') harness.main() From aeffb739ec82bed69f5a7efda44a4805c9bfc4bc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 06:53:32 -0600 Subject: [PATCH 17/66] Make sure prism functions are in documentation --- docs/source/pythonapi/index.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 1125a4b32d..0f22d01021 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -115,15 +115,17 @@ Many of the above classes are derived from several abstract classes: openmc.Region openmc.Lattice -One function is also available to create a hexagonal region defined by the -intersection of six surface half-spaces. +Two helpers function are also available to create rectangular and hexagonal +prisms defined by the intersection of four and six surface half-spaces, +respectively. .. autosummary:: :toctree: generated :nosignatures: :template: myfunction.rst - openmc.make_hexagon_region + openmc.get_hexagonal_prism + openmc.get_rectangular_prism Constructing Tallies -------------------- From f28a0fcddaf0876b6e3b9c1cf1616795e8633db3 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 09:29:14 -0600 Subject: [PATCH 18/66] Allow arbitrary MPI arguments in openmc.run() --- openmc/executor.py | 22 +++++++++---------- .../test_mgxs_library_ce_to_mg.py | 14 +++++------- .../test_statepoint_restart.py | 7 +++--- tests/testing_harness.py | 11 +++++----- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/openmc/executor.py b/openmc/executor.py index a20437e1cd..3b9b8abd8d 100644 --- a/openmc/executor.py +++ b/openmc/executor.py @@ -44,8 +44,8 @@ def plot_geometry(output=True, openmc_exec='openmc', cwd='.'): def run(particles=None, threads=None, geometry_debug=False, - restart_file=None, tracks=False, mpi_procs=1, output=True, - openmc_exec='openmc', mpi_exec='mpiexec', cwd='.'): + restart_file=None, tracks=False, output=True, cwd='.', + openmc_exec='openmc', mpi_args=None): """Run an OpenMC simulation. Parameters @@ -56,23 +56,23 @@ def run(particles=None, threads=None, geometry_debug=False, Number of OpenMP threads. If OpenMC is compiled with OpenMP threading enabled, the default is implementation-dependent but is usually equal to the number of hardware threads available (or a value set by the - OMP_NUM_THREADS environment variable). + :envvar:`OMP_NUM_THREADS` environment variable). geometry_debug : bool, optional Turn on geometry debugging during simulation. Defaults to False. restart_file : str, optional Path to restart file to use tracks : bool, optional Write tracks for all particles. Defaults to False. - mpi_procs : int, optional - Number of MPI processes. output : bool, optional Capture OpenMC output from standard out. Defaults to True. + cwd : str, optional + Path to working directory to run in. Defaults to the current working + directory. openmc_exec : str, optional Path to OpenMC executable. Defaults to 'openmc'. - mpi_exec : str, optional - MPI execute command. Defaults to 'mpiexec'. - cwd : str, optional - Path to working directory to run in. Defaults to the current working directory. + mpi_args : list of str, optional + MPI execute command and any additional MPI arguments to pass, + e.g. ['mpiexec', '-n', '8']. """ @@ -94,8 +94,8 @@ def run(particles=None, threads=None, geometry_debug=False, if tracks: post_args += '-t' - if isinstance(mpi_procs, Integral) and mpi_procs > 1: - pre_args += '{} -n {} '.format(mpi_exec, mpi_procs) + if mpi_args is not None: + pre_args = ' '.join(mpi_args) + ' ' command = pre_args + openmc_exec + ' ' + post_args diff --git a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py index 7dc679b1fe..f9f9a75097 100644 --- a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py +++ b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py @@ -41,10 +41,9 @@ class MGXSTestHarness(PyAPITestHarness): def _run_openmc(self): # Initial run if self._opts.mpi_exec is not None: - returncode = openmc.run(mpi_procs=self._opts.mpi_np, - openmc_exec=self._opts.exe, - mpi_exec=self._opts.mpi_exec) - + mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np] + returncode = openmc.run(openmc_exec=self._opts.exe, + mpi_args=mpi_args) else: returncode = openmc.run(openmc_exec=self._opts.exe) @@ -74,10 +73,9 @@ class MGXSTestHarness(PyAPITestHarness): # Re-run MG mode. if self._opts.mpi_exec is not None: - returncode = openmc.run(mpi_procs=self._opts.mpi_np, - openmc_exec=self._opts.exe, - mpi_exec=self._opts.mpi_exec) - + mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np] + returncode = openmc.run(openmc_exec=self._opts.exe, + mpi_args=mpi_args) else: returncode = openmc.run(openmc_exec=self._opts.exe) diff --git a/tests/test_statepoint_restart/test_statepoint_restart.py b/tests/test_statepoint_restart/test_statepoint_restart.py index d39bf7cd5f..61522ee051 100644 --- a/tests/test_statepoint_restart/test_statepoint_restart.py +++ b/tests/test_statepoint_restart/test_statepoint_restart.py @@ -50,11 +50,10 @@ class StatepointRestartTestHarness(TestHarness): # Run OpenMC if self._opts.mpi_exec is not None: - returncode = openmc.run(mpi_procs=self._opts.mpi_np, - restart_file=statepoint, + mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np] + returncode = openmc.run(restart_file=statepoint, openmc_exec=self._opts.exe, - mpi_exec=self._opts.mpi_exec) - + mpi_args=mpi_args) else: returncode = openmc.run(openmc_exec=self._opts.exe, restart_file=statepoint) diff --git a/tests/testing_harness.py b/tests/testing_harness.py index b833615c79..fc3b4f9346 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -24,7 +24,7 @@ class TestHarness(object): self.parser = OptionParser() self.parser.add_option('--exe', dest='exe', default='openmc') self.parser.add_option('--mpi_exec', dest='mpi_exec', default=None) - self.parser.add_option('--mpi_np', dest='mpi_np', type=int, default=2) + self.parser.add_option('--mpi_np', dest='mpi_np', default='2') self.parser.add_option('--update', dest='update', action='store_true', default=False) self._opts = None @@ -62,9 +62,9 @@ class TestHarness(object): def _run_openmc(self): if self._opts.mpi_exec is not None: - returncode = openmc.run(mpi_procs=self._opts.mpi_np, - openmc_exec=self._opts.exe, - mpi_exec=self._opts.mpi_exec) + returncode = openmc.run( + openmc_exec=self._opts.exe, + mpi_args=[self._opts.mpi_exec, '-n', self._opts.mpi_np]) else: returncode = openmc.run(openmc_exec=self._opts.exe) @@ -190,8 +190,7 @@ class ParticleRestartTestHarness(TestHarness): # Set arguments args = {'openmc_exec': self._opts.exe} if self._opts.mpi_exec is not None: - args.update({'mpi_procs': self._opts.mpi_np, - 'mpi_exec': self._opts.mpi_exec}) + args['mpi_args'] = [self._opts.mpi_exec, '-n', self._opts.mpi_np] # Initial run returncode = openmc.run(**args) From 1fc810003433385fd9e534d0d669536644c905f1 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 09:43:40 -0600 Subject: [PATCH 19/66] Don't show run results for run modes where it doesn't make sense --- src/finalize.F90 | 45 ----------------------------- src/input_xml.F90 | 70 ++++++++++++++++++++++++---------------------- src/simulation.F90 | 56 +++++++++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 81 deletions(-) diff --git a/src/finalize.F90 b/src/finalize.F90 index 7ad99d0b55..0f1af23560 100644 --- a/src/finalize.F90 +++ b/src/finalize.F90 @@ -5,9 +5,6 @@ module finalize use global use hdf5_interface, only: hdf5_bank_t use message_passing - use output, only: print_runtime, print_results, & - print_overlap_check, write_tallies - use tally, only: tally_statistics implicit none @@ -22,30 +19,6 @@ contains integer :: hdf5_err - ! Start finalization timer - call time_finalize%start() - - if (run_mode /= MODE_PLOTTING .and. run_mode /= MODE_PARTICLE) then - ! Calculate statistics for tallies and write to tallies.out - if (master) then - if (n_realizations > 1) call tally_statistics() - end if - if (output_tallies) then - if (master) call write_tallies() - end if - if (check_overlaps) call reduce_overlap_count() - end if - - ! Stop timers and show timing statistics - call time_finalize%stop() - call time_total%stop() - if (master .and. (run_mode /= MODE_PLOTTING .and. & - run_mode /= MODE_PARTICLE)) then - call print_runtime() - call print_results() - if (check_overlaps) call print_overlap_check() - end if - ! Deallocate arrays call free_memory() @@ -65,22 +38,4 @@ contains end subroutine openmc_finalize -!=============================================================================== -! REDUCE_OVERLAP_COUNT accumulates cell overlap check counts to master -!=============================================================================== - - subroutine reduce_overlap_count() - -#ifdef MPI - if (master) then - call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - else - call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & - MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) - end if -#endif - - end subroutine reduce_overlap_count - end module finalize diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 93bb1e733c..46eea2c516 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -79,7 +79,6 @@ contains integer :: temp_int integer :: temp_int_array3(3) integer, allocatable :: temp_int_array(:) - integer(8) :: temp_long real(8), allocatable :: temp_real(:) integer :: n_tracks logical :: file_exists @@ -223,44 +222,47 @@ contains end if end if - if (check_for_node(doc, "run_mode")) then - call get_node_value(doc, "run_mode", temp_str) - select case (to_lower(temp_str)) - case ("eigenvalue") - run_mode = MODE_EIGENVALUE - case ("fixed source") - run_mode = MODE_FIXEDSOURCE - case ("plot") - run_mode = MODE_PLOTTING - case ("particle restart") - run_mode = MODE_PARTICLE - case ("volume") - run_mode = MODE_VOLUME - end select + ! Check run mode if it hasn't been set from the command line + if (run_mode == NONE) then + if (check_for_node(doc, "run_mode")) then + call get_node_value(doc, "run_mode", temp_str) + select case (to_lower(temp_str)) + case ("eigenvalue") + run_mode = MODE_EIGENVALUE + case ("fixed source") + run_mode = MODE_FIXEDSOURCE + case ("plot") + run_mode = MODE_PLOTTING + case ("particle restart") + run_mode = MODE_PARTICLE + case ("volume") + run_mode = MODE_VOLUME + end select - ! Assume XML specifics , , etc. directly - node_mode => doc - else - call warning(" should be specified.") + ! Assume XML specifics , , etc. directly + node_mode => doc + else + call warning(" should be specified.") - ! Make sure that either eigenvalue or fixed source was specified - if (.not. check_for_node(doc, "eigenvalue") .and. & - .not. check_for_node(doc, "fixed_source")) then - call fatal_error(" or not specified.") - end if + ! Make sure that either eigenvalue or fixed source was specified + if (.not. check_for_node(doc, "eigenvalue") .and. & + .not. check_for_node(doc, "fixed_source")) then + call fatal_error(" or not specified.") + end if - if (check_for_node(doc, "eigenvalue")) then - ! Set run mode - if (run_mode == NONE) run_mode = MODE_EIGENVALUE + if (check_for_node(doc, "eigenvalue")) then + ! Set run mode + if (run_mode == NONE) run_mode = MODE_EIGENVALUE - ! Get pointer to eigenvalue XML block - call get_node_ptr(doc, "eigenvalue", node_mode) - elseif (check_for_node(doc, "fixed_source")) then - ! Set run mode - if (run_mode == NONE) run_mode = MODE_FIXEDSOURCE + ! Get pointer to eigenvalue XML block + call get_node_ptr(doc, "eigenvalue", node_mode) + elseif (check_for_node(doc, "fixed_source")) then + ! Set run mode + if (run_mode == NONE) run_mode = MODE_FIXEDSOURCE - ! Get pointer to fixed_source XML block - call get_node_ptr(doc, "fixed_source", node_mode) + ! Get pointer to fixed_source XML block + call get_node_ptr(doc, "fixed_source", node_mode) + end if end if end if diff --git a/src/simulation.F90 b/src/simulation.F90 index 707f427378..1274c2b008 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -11,13 +11,15 @@ module simulation use global use message_passing use output, only: write_message, header, print_columns, & - print_batch_keff, print_generation + print_batch_keff, print_generation, print_runtime, & + print_results, print_overlap_check, write_tallies use particle_header, only: Particle use random_lcg, only: set_particle_seed use source, only: initialize_source, sample_external_source use state_point, only: write_state_point, write_source_point use string, only: to_str - use tally, only: synchronize_tallies, setup_active_usertallies + use tally, only: synchronize_tallies, setup_active_usertallies, & + tally_statistics use trigger, only: check_triggers use tracking, only: transport use volume_calc, only: run_volume_calculations @@ -110,6 +112,8 @@ contains if (master) call header("SIMULATION FINISHED", level=1) + call finalize_simulation() + ! Clear particle call p % clear() @@ -376,4 +380,52 @@ contains end subroutine replay_batch_history +!=============================================================================== +! FINALIZE_SIMULATION calculates tally statistics, writes tallies, and displays +! execution time and results +!=============================================================================== + + subroutine finalize_simulation + + ! Start finalization timer + call time_finalize%start() + + ! Calculate statistics for tallies and write to tallies.out + if (master) then + if (n_realizations > 1) call tally_statistics() + end if + if (output_tallies) then + if (master) call write_tallies() + end if + if (check_overlaps) call reduce_overlap_count() + + ! Stop timers and show timing statistics + call time_finalize%stop() + call time_total%stop() + if (master) then + call print_runtime() + call print_results() + if (check_overlaps) call print_overlap_check() + end if + + end subroutine finalize_simulation + +!=============================================================================== +! REDUCE_OVERLAP_COUNT accumulates cell overlap check counts to master +!=============================================================================== + + subroutine reduce_overlap_count() + +#ifdef MPI + if (master) then + call MPI_REDUCE(MPI_IN_PLACE, overlap_check_cnt, n_cells, & + MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) + else + call MPI_REDUCE(overlap_check_cnt, overlap_check_cnt, n_cells, & + MPI_INTEGER8, MPI_SUM, 0, mpi_intracomm, mpi_err) + end if +#endif + + end subroutine reduce_overlap_count + end module simulation From 46643382f477624e864ea0686fe480d794608490 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 10:57:40 -0600 Subject: [PATCH 20/66] Update documentation --- docs/source/conf.py | 2 +- docs/source/usersguide/input.rst | 159 ++++++++++++++++--------------- 2 files changed, 82 insertions(+), 79 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index d7fc23c43e..22fc13a3ff 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -248,7 +248,7 @@ napoleon_use_ivar = True intersphinx_mapping = { 'python': ('https://docs.python.org/3', None), - 'numpy': ('http://docs.scipy.org/doc/numpy/', None), + 'numpy': ('https://docs.scipy.org/doc/numpy/', None), 'pandas': ('http://pandas.pydata.org/pandas-docs/stable/', None), 'matplotlib': ('http://matplotlib.org/', None) } diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 809e02b916..fff479cb96 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -94,6 +94,18 @@ Settings Specification -- settings.xml All simulation parameters and miscellaneous options are specified in the settings.xml file. +```` Element +--------------------- + +The ```` element indicates the total number of batches to execute, +where each batch corresponds to a tally realization. In a fixed source +calculation, each batch consists of a number of source particles. In an +eigenvalue calculation, each batch consists of one or many fission source +iterations (generations), where each generation itself consists of a number of +source neutrons. + + *Default*: None + ```` Element ---------------------------------- @@ -132,67 +144,6 @@ you care. This element has the following attributes/sub-elements: *Default*: 0.0 -.. _eigenvalue: - -```` Element ------------------------- - -The ```` element indicates that a :math:`k`-eigenvalue calculation -should be performed. It has the following attributes/sub-elements: - - :batches: - The total number of batches, where each batch corresponds to multiple - fission source iterations. Batching is done to eliminate correlation between - realizations of random variables. - - *Default*: None - - :generations_per_batch: - The number of total fission source iterations per batch. - - *Default*: 1 - - :inactive: - The number of inactive batches. In general, the starting cycles in a - criticality calculation can not be used to contribute to tallies since the - fission source distribution and eigenvalue are generally not converged - immediately. - - *Default*: None - - :particles: - The number of neutrons to simulate per fission source iteration. - - *Default*: None - - :keff_trigger: - This tag specifies a precision trigger on the combined :math:`k_{eff}`. The - trigger is a convergence criterion on the uncertainty of the estimated - eigenvalue. It has the following attributes/sub-elements: - - :type: - The type of precision trigger. Accepted options are "variance", "std_dev", - and "rel_err". - - :variance: - Variance of the batch mean :math:`\sigma^2` - - :std_dev: - Standard deviation of the batch mean :math:`\sigma` - - :rel_err: - Relative error of the batch mean :math:`\frac{\sigma}{\mu}` - - *Default*: None - - :threshold: - The precision trigger's convergence criterion for the - combined :math:`k_{eff}`. - - *Default*: None - - .. note:: See section on the :ref:`trigger` for more information. - ```` Element ------------------------- @@ -247,23 +198,57 @@ problem. It has the following attributes/sub-elements: *Default*: None -```` Element +```` Element +----------------------------------- + +The ```` element indicates the number of total fission +source iterations per batch for an eigenvalue calculation. This element is +ignored for all run modes other than "eigenvalue". + + *Default*: 1 + +```` Element +---------------------- + +The ```` element indicates the number of inactive batches used in a +k-eigenvalue calculation. In general, the starting fission source iterations in +an eigenvalue calculation can not be used to contribute to tallies since the +fission source distribution and eigenvalue are generally not converged +immediately. + + *Default*: 0 + +```` Element -------------------------- -The ```` element indicates that a fixed source calculation should -be performed. It has the following attributes/sub-elements: +The ```` element specifies a precision trigger on the combined +:math:`k_{eff}`. The trigger is a convergence criterion on the uncertainty of +the estimated eigenvalue. It has the following attributes/sub-elements: - :batches: - The total number of batches. For fixed source calculations, each batch - represents a realization of random variables for tallies. + :type: + The type of precision trigger. Accepted options are "variance", "std_dev", + and "rel_err". + + :variance: + Variance of the batch mean :math:`\sigma^2` + + :std_dev: + Standard deviation of the batch mean :math:`\sigma` + + :rel_err: + Relative error of the batch mean :math:`\frac{\sigma}{\mu}` *Default*: None - :particles: - The number of particles to simulate per batch. + :threshold: + The precision trigger's convergence criterion for the + combined :math:`k_{eff}`. *Default*: None +.. note:: See section on the :ref:`trigger` for more information. + + ```` Element --------------------------- @@ -336,6 +321,15 @@ will abort. *Default*: Current working directory +```` Element +----------------------- + +This element indicates the number of neutrons to simulate per fission source +iteration when a k-eigenvalue calculation is performed or the number of neutrons +per batch for a fixed source simulation. + + *Default*: None + ```` Element --------------------- @@ -408,7 +402,16 @@ The ```` element indicates whether or not CMFD acceleration should be turned on or off. This element has no attributes or sub-elements and can be set to either "false" or "true". - *Defualt*: false + *Default*: false + +```` Element +---------------------- + +The ```` element indicates which run mode should be used when OpenMC +is executed. This element has no attributes or sub-elements and can be set to +"eigenvalue", "fixed source", "plot", "volume", or "particle restart". + + *Default*: None ```` Element ------------------ @@ -774,13 +777,13 @@ number, and particle number, respectively. ------------------------- OpenMC includes tally precision triggers which allow the user to define -uncertainty thresholds on :math:`k_{eff}` in the ```` subelement of -``settings.xml``, and/or tallies in ``tallies.xml``. When using triggers, +uncertainty thresholds on :math:`k_{eff}` in the ```` subelement +of ``settings.xml``, and/or tallies in ``tallies.xml``. When using triggers, OpenMC will run until it completes as many batches as defined by ````. -At this point, the uncertainties on all tallied values are computed and -compared with their corresponding trigger thresholds. If any triggers have not -been met, OpenMC will continue until either all trigger thresholds have been -satisfied or ```` has been reached. +At this point, the uncertainties on all tallied values are computed and compared +with their corresponding trigger thresholds. If any triggers have not been met, +OpenMC will continue until either all trigger thresholds have been satisfied or +```` has been reached. The ```` element provides an active "toggle switch" for tally precision trigger(s), the maximum number of batches and the batch interval. It @@ -793,8 +796,8 @@ has the following attributes/sub-elements: :max_batches: This describes the maximum number of batches allowed when using trigger(s). - .. note:: When max_batches is set, the number of ``batches`` shown in - ```` element represents minimum number of batches to + .. note:: When max_batches is set, the number of ``batches`` shown in the + ```` element represents minimum number of batches to simulate when using the trigger(s). :batch_interval: From 3298c247900011af8d453e28d8e1f8bf2661c490 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 11:13:00 -0600 Subject: [PATCH 21/66] Fix variable declaration in timer_header --- src/timer_header.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/timer_header.F90 b/src/timer_header.F90 index 3a633f7004..6f9785d565 100644 --- a/src/timer_header.F90 +++ b/src/timer_header.F90 @@ -42,11 +42,11 @@ contains function timer_get_value(self) result(elapsed) class(Timer), intent(in) :: self ! the timer - real(8) :: elapsed ! total elapsed time + real(8) :: elapsed ! total elapsed time integer(8) :: end_counts ! current number of counts integer(8) :: count_rate ! system-dependent counting rate - real :: elapsed_time ! elapsed time since last start + real(8) :: elapsed_time ! elapsed time since last start if (self % running) then call system_clock(end_counts, count_rate) From 606253e11cf795acc851bdabff8be04ea26206ea Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 14:53:34 -0600 Subject: [PATCH 22/66] Write depletable attribute to XML and summary files --- openmc/material.py | 5 ++++- openmc/summary.py | 18 ++++++++++-------- src/input_xml.F90 | 7 +++++++ src/material_header.F90 | 3 ++- src/summary.F90 | 6 ++++++ 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 7c271cc309..7d59c52ee1 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -255,7 +255,7 @@ class Material(object): @depletable.setter def depletable(self, depletable): - cv.check_type('Depletable flag for Material ID="{}"'.format(self._id), + cv.check_type('Depletable flag for Material ID="{}"'.format(self.id), depletable, bool) self._depletable = depletable @@ -771,6 +771,9 @@ class Material(object): if len(self._name) > 0: element.set("name", str(self._name)) + if self._depletable: + element.set("depletable", "true") + # Create temperature XML subelement if self.temperature is not None: subelement = ET.SubElement(element, "temperature") diff --git a/openmc/summary.py b/openmc/summary.py index b283ed502c..5bc4c56a2e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -97,23 +97,25 @@ class Summary(object): # Values - Material objects self.materials = {} - for key in self._f['materials'].keys(): + for key, group in self._f['materials'].items(): if key == 'n_materials': continue material_id = int(key.lstrip('material ')) - index = self._f['materials'][key]['index'].value - 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'].value + + index = group['index'].value + name = group['name'].value.decode() + density = group['atom_density'].value + nuc_densities = group['nuclide_densities'][...] + nuclides = group['nuclides'].value # Create the Material material = openmc.Material(material_id=material_id, name=name) + material.depletable = bool(group.attrs['depletable']) # 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 + if 'sab_names' in group: + sab_tables = group['sab_names'].value for sab_table in sab_tables: name = sab_table.decode() material.add_s_alpha_beta(name) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 46eea2c516..fa2e9881c0 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2251,6 +2251,13 @@ contains call fatal_error("Must specify id of material in materials XML file") end if + ! Check if material is depletable + if (check_for_node(node_mat, "depletable")) then + call get_node_value(node_mat, "depletable", temp_str) + if (to_lower(temp_str) == "true" .or. temp_str == "1") & + mat % depletable = .true. + end if + ! Check to make sure 'id' hasn't been used if (material_dict % has_key(mat % id)) then call fatal_error("Two or more materials use the same unique ID: " & diff --git a/src/material_header.F90 b/src/material_header.F90 index f7c1b5db09..fdc36548f6 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -31,8 +31,9 @@ module material_header character(20), allocatable :: names(:) ! isotope names character(20), allocatable :: sab_names(:) ! name of S(a,b) table - ! Does this material contain fissionable nuclides? + ! Does this material contain fissionable nuclides? Is it depletable? logical :: fissionable = .false. + logical :: depletable = .false. ! enforce isotropic scattering in lab logical, allocatable :: p0(:) diff --git a/src/summary.F90 b/src/summary.F90 index efe07b1ab8..78a8276f16 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -536,6 +536,12 @@ contains material_group = create_group(materials_group, "material " // & trim(to_str(m%id))) + if (m % depletable) then + call write_attribute(material_group, "depletable", 1) + else + call write_attribute(material_group, "depletable", 0) + end if + ! Write internal OpenMC index for this material call write_dataset(material_group, "index", i) From e6a3c04817126a524549b82ed95dffdc2a6bdb8a Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 05:20:30 -0500 Subject: [PATCH 23/66] docstring modifications and reduced histories in test_mg_convert in an attempt to bring its runtime down --- openmc/mgxs_library.py | 6 ++---- tests/test_mg_convert/inputs_true.dat | 6 +++--- tests/test_mg_convert/results_true.dat | 24 ++++++++++++------------ tests/test_mg_convert/test_mg_convert.py | 6 +++--- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index d441e1bbbf..deef7e82d0 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1690,8 +1690,7 @@ class XSdata(object): azimuthal bins of an XSdata object that already uses an angular representation. Finally, this method simply uses an arithmetic mean to convert from an angular to isotropic representation; no flux-weighting - is applied and therefore the correctness of the solution is not - guaranteed. + is applied and therefore reaction rates will not be preserved. Parameters ---------- @@ -2453,8 +2452,7 @@ class MGXSLibrary(object): azimuthal bins of an XSdata object that already uses an angular representation. Finally, this method simply uses an arithmetic mean to convert from an angular to isotropic representation; no flux-weighting - is applied and therefore the correctness of the solution is not - guaranteed. + is applied and therefore the reaction rates will not be preserved. Parameters ---------- diff --git a/tests/test_mg_convert/inputs_true.dat b/tests/test_mg_convert/inputs_true.dat index 95ad615867..9bfb1dfbae 100644 --- a/tests/test_mg_convert/inputs_true.dat +++ b/tests/test_mg_convert/inputs_true.dat @@ -17,9 +17,9 @@ - 1000 - 1000 - 100 + 100 + 10 + 5 diff --git a/tests/test_mg_convert/results_true.dat b/tests/test_mg_convert/results_true.dat index cf4777b8eb..a52b929dcf 100644 --- a/tests/test_mg_convert/results_true.dat +++ b/tests/test_mg_convert/results_true.dat @@ -1,24 +1,24 @@ k-combined: -9.957366E-01 7.836427E-05 +9.930873E-01 2.221904E-03 k-combined: -9.963227E-01 8.010344E-05 +9.948148E-01 1.216270E-03 k-combined: -9.957366E-01 7.836427E-05 +9.930873E-01 2.221904E-03 k-combined: -9.955152E-01 8.132242E-05 +9.755034E-01 6.178296E-03 k-combined: -9.953937E-01 8.452497E-05 +9.738059E-01 4.529068E-03 k-combined: -9.957744E-01 8.816057E-05 +9.866847E-01 9.485912E-03 k-combined: -9.955332E-01 8.894390E-05 +9.755024E-01 6.179047E-03 k-combined: -9.956463E-01 8.378533E-05 +9.738061E-01 4.529462E-03 k-combined: -9.955875E-01 8.818927E-05 +9.866835E-01 9.485832E-03 k-combined: -9.957017E-01 8.726677E-05 +9.719024E-01 4.213166E-03 k-combined: -9.957366E-01 7.836427E-05 +9.930873E-01 2.221904E-03 k-combined: -9.957366E-01 7.836427E-05 +9.930873E-01 2.221904E-03 diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py index ad86e5a508..607195a82b 100755 --- a/tests/test_mg_convert/test_mg_convert.py +++ b/tests/test_mg_convert/test_mg_convert.py @@ -11,9 +11,9 @@ from testing_harness import PyAPITestHarness import openmc # OpenMC simulation parameters -batches = 1000 -inactive = 100 -particles = 1000 +batches = 10 +inactive = 5 +particles = 100 def build_mgxs_library(convert): From ca746424e1646d7ef39d119c3127a2fa4583a866 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 12:15:26 -0500 Subject: [PATCH 24/66] Closed StatePoint inbetween reads and writes in the test_mgxs_library_ce_to_mg; this was failing on my machine, but apparently not elsewhere. I thought I fixed it with a recompile of HDF5 which stopped the non-sensical error messages; turns out it came back and this is actually the culprit --- .../test_mgxs_library_ce_to_mg.py | 3 ++ tests/test_salphabeta/geometry.xml | 15 ------- tests/test_salphabeta/materials.xml | 41 ------------------- tests/test_salphabeta/settings.xml | 16 -------- 4 files changed, 3 insertions(+), 72 deletions(-) delete mode 100644 tests/test_salphabeta/geometry.xml delete mode 100644 tests/test_salphabeta/materials.xml delete mode 100644 tests/test_salphabeta/settings.xml diff --git a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py index 7dc679b1fe..e6511fd623 100644 --- a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py +++ b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py @@ -72,6 +72,9 @@ class MGXSTestHarness(PyAPITestHarness): if os.path.exists('./tallies.xml'): os.remove('./tallies.xml') + # Close the statepoint to allow writing + sp.close() + # Re-run MG mode. if self._opts.mpi_exec is not None: returncode = openmc.run(mpi_procs=self._opts.mpi_np, diff --git a/tests/test_salphabeta/geometry.xml b/tests/test_salphabeta/geometry.xml deleted file mode 100644 index 2b978b9148..0000000000 --- a/tests/test_salphabeta/geometry.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml deleted file mode 100644 index bfe0a6224d..0000000000 --- a/tests/test_salphabeta/materials.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_salphabeta/settings.xml b/tests/test_salphabeta/settings.xml deleted file mode 100644 index a6fd5da19e..0000000000 --- a/tests/test_salphabeta/settings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - 10 - 5 - 1000 - - - - - -4 -4 -4 4 4 4 - - - - From a7b174aff623825c1e07b5c0ddc54692f5fcffce Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 12:16:58 -0500 Subject: [PATCH 25/66] Ahh!! I deleted the XML files! forgot that this was a legacy test --- tests/test_salphabeta/geometry.xml | 15 +++++++++++ tests/test_salphabeta/materials.xml | 41 +++++++++++++++++++++++++++++ tests/test_salphabeta/settings.xml | 16 +++++++++++ 3 files changed, 72 insertions(+) create mode 100644 tests/test_salphabeta/geometry.xml create mode 100644 tests/test_salphabeta/materials.xml create mode 100644 tests/test_salphabeta/settings.xml diff --git a/tests/test_salphabeta/geometry.xml b/tests/test_salphabeta/geometry.xml new file mode 100644 index 0000000000..2b978b9148 --- /dev/null +++ b/tests/test_salphabeta/geometry.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml new file mode 100644 index 0000000000..bfe0a6224d --- /dev/null +++ b/tests/test_salphabeta/materials.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_salphabeta/settings.xml b/tests/test_salphabeta/settings.xml new file mode 100644 index 0000000000..a6fd5da19e --- /dev/null +++ b/tests/test_salphabeta/settings.xml @@ -0,0 +1,16 @@ + + + + + 10 + 5 + 1000 + + + + + -4 -4 -4 4 4 4 + + + + From db33004a0f2c7db8eb8a67d92c09f25cc3a1ef93 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 14:51:12 -0500 Subject: [PATCH 26/66] Added test for Legendre scattering - current tests converted all legenres to tabular distributions, this avoids that --- tests/test_mg_legendre/inputs_true.dat | 47 ++++++++++++++++++++++ tests/test_mg_legendre/results_true.dat | 2 + tests/test_mg_legendre/test_mg_legendre.py | 28 +++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 tests/test_mg_legendre/inputs_true.dat create mode 100644 tests/test_mg_legendre/results_true.dat create mode 100644 tests/test_mg_legendre/test_mg_legendre.py diff --git a/tests/test_mg_legendre/inputs_true.dat b/tests/test_mg_legendre/inputs_true.dat new file mode 100644 index 0000000000..fe0b5cf16d --- /dev/null +++ b/tests/test_mg_legendre/inputs_true.dat @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + 100 + 10 + 5 + + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + + false + + diff --git a/tests/test_mg_legendre/results_true.dat b/tests/test_mg_legendre/results_true.dat new file mode 100644 index 0000000000..d0f8c319e7 --- /dev/null +++ b/tests/test_mg_legendre/results_true.dat @@ -0,0 +1,2 @@ +k-combined: +1.110122E+00 2.549637E-02 diff --git a/tests/test_mg_legendre/test_mg_legendre.py b/tests/test_mg_legendre/test_mg_legendre.py new file mode 100644 index 0000000000..a16912c5db --- /dev/null +++ b/tests/test_mg_legendre/test_mg_legendre.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import os +import sys + +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +from input_set import MGInputSet + + +class MGMaxOrderTestHarness(PyAPITestHarness): + def __init__(self, statepoint_name, tallies_present, mg=False): + PyAPITestHarness.__init__(self, statepoint_name, tallies_present) + self._input_set = MGInputSet() + + def _build_inputs(self): + """Write input XML files.""" + reps = ['iso'] + self._input_set.build_default_materials_and_geometry(reps=reps) + self._input_set.build_default_settings() + # Enforce Legendre scattering + self._input_set.settings.tabular_legendre = {'enable': False} + self._input_set.export() + + +if __name__ == '__main__': + harness = MGMaxOrderTestHarness('statepoint.10.*', False, mg=True) + harness.main() From db744637536fb41830f74b1fb3db66272507f159 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 18 Feb 2017 14:39:56 -0600 Subject: [PATCH 27/66] Address @nelsonag comments on documentation --- docs/source/pythonapi/index.rst | 2 +- docs/source/usersguide/input.rst | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 0f22d01021..fb6cfe9277 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -115,7 +115,7 @@ Many of the above classes are derived from several abstract classes: openmc.Region openmc.Lattice -Two helpers function are also available to create rectangular and hexagonal +Two helper function are also available to create rectangular and hexagonal prisms defined by the intersection of four and six surface half-spaces, respectively. diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index fff479cb96..a64454e92e 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -214,14 +214,15 @@ The ```` element indicates the number of inactive batches used in a k-eigenvalue calculation. In general, the starting fission source iterations in an eigenvalue calculation can not be used to contribute to tallies since the fission source distribution and eigenvalue are generally not converged -immediately. +immediately. This element is ignored for all run modes other than "eigenvalue". *Default*: 0 ```` Element -------------------------- -The ```` element specifies a precision trigger on the combined +The ```` element (ignored for all run modes other than +"eigenvalue".) specifies a precision trigger on the combined :math:`k_{eff}`. The trigger is a convergence criterion on the uncertainty of the estimated eigenvalue. It has the following attributes/sub-elements: From 471ebbfa891fc7df8721969f0c16839315294c04 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 19 Feb 2017 06:10:20 -0500 Subject: [PATCH 28/66] Moved check for small values to end of convert_scatter_format and added blank line --- openmc/mgxs_library.py | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index deef7e82d0..af6dc8f98c 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1837,6 +1837,7 @@ class XSdata(object): np.sum((l + 0.5) * eval_legendre(l, mu[imu]) * orig_data[..., l] for l in range(self.num_orders)) + elif target_format == 'histogram': # This code uses the vectorized integration capabilities # instead of having an isotropic and angle representation @@ -1856,10 +1857,6 @@ class XSdata(object): for l in range(self.num_orders)) new_data[..., h_bin] = simps(table_fine, mu_fine) - # Remove the very small values resulting from numerical - # precision issues - new_data[..., np.abs(new_data) < 1.E-10] = 0. - elif self.scatter_format == 'tabular': # Calculate the mu points of the current data mu_self = np.linspace(-1, 1, self.num_orders) @@ -1875,10 +1872,6 @@ class XSdata(object): for l in range(xsdata.num_orders): new_data[..., l] = simps(y[l], mu_fine) - # Remove the very small values resulting from numerical - # precision issues - new_data[..., np.abs(new_data) < 1.E-10] = 0. - elif target_format == 'tabular': # Simply use an interpolating function to get the new data mu = np.linspace(-1, 1, xsdata.num_orders) @@ -1898,10 +1891,6 @@ class XSdata(object): mu_fine = np.linspace(mu[h_bin], mu[h_bin + 1], _NMU) new_data[..., h_bin] = simps(interp(mu_fine), mu_fine) - # Remove the very small values resulting from numerical - # precision issues - new_data[..., np.abs(new_data) < 1.E-10] = 0. - elif self.scatter_format == 'histogram': # The histogram format does not have enough information to # convert to the other forms without inducing some amount of @@ -1929,10 +1918,6 @@ class XSdata(object): for l in range(xsdata.num_orders): new_data[..., l] = simps(y[l], mu_fine) - # Remove the very small values resulting from numerical - # precision issues - new_data[..., np.abs(new_data) < 1.E-10] = 0. - elif target_format == 'tabular': # Simply use an interpolating function to get the new data mu = np.linspace(-1, 1, xsdata.num_orders) @@ -1952,9 +1937,8 @@ class XSdata(object): new_data[..., h_bin] = \ norm * simps(interp(mu_fine), mu_fine) - # Remove the very small values resulting from numerical - # precision issues - new_data[..., np.abs(new_data) < 1.E-10] = 0. + # Remove small values resulting from numerical precision issues + new_data[..., np.abs(new_data) < 1.E-10] = 0. xsdata.set_scatter_matrix(new_data, temp) From 38ce9acdfbc13b5aac8b9b1370d71eb12525d4a8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 19 Feb 2017 09:43:57 -0500 Subject: [PATCH 29/66] Updated openmc.run commands and input files to reflect the new run modes --- tests/test_mg_convert/inputs_true.dat | 9 ++++----- tests/test_mg_convert/test_mg_convert.py | 6 +++--- tests/test_mg_legendre/inputs_true.dat | 9 ++++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/test_mg_convert/inputs_true.dat b/tests/test_mg_convert/inputs_true.dat index 9bfb1dfbae..85eeb3a24a 100644 --- a/tests/test_mg_convert/inputs_true.dat +++ b/tests/test_mg_convert/inputs_true.dat @@ -16,11 +16,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 -5 -5 -5 5 5 5 diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py index 607195a82b..f4cd90e713 100755 --- a/tests/test_mg_convert/test_mg_convert.py +++ b/tests/test_mg_convert/test_mg_convert.py @@ -138,9 +138,9 @@ class MGXSTestHarness(PyAPITestHarness): build_mgxs_library(case) if self._opts.mpi_exec is not None: - returncode = openmc.run(mpi_procs=self._opts.mpi_np, - openmc_exec=self._opts.exe, - mpi_exec=self._opts.mpi_exec) + mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np] + returncode = openmc.run(openmc_exec=self._opts.exe, + mpi_args=mpi_args) else: returncode = openmc.run(openmc_exec=self._opts.exe) diff --git a/tests/test_mg_legendre/inputs_true.dat b/tests/test_mg_legendre/inputs_true.dat index fe0b5cf16d..ca24a0dcf7 100644 --- a/tests/test_mg_legendre/inputs_true.dat +++ b/tests/test_mg_legendre/inputs_true.dat @@ -30,11 +30,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 0.0 0.0 0.0 10.0 10.0 5.0 From 594d8359710d17a66e2b5f058d33958585517265 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 13:53:31 -0500 Subject: [PATCH 30/66] Added ability to use two out of three estimators for calculating the combined k_eff if a degenerate case is found --- src/eigenvalue.F90 | 166 ++++++++++++++++++++++++++++++--------------- 1 file changed, 112 insertions(+), 54 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index a930f4410b..a04b32340d 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -446,7 +446,7 @@ contains integer :: l ! loop index integer :: i, j, k ! indices referring to collision, absorption, or track - integer :: n ! number of realizations + real(8) :: n ! number of realizations real(8) :: kv(3) ! vector of k-effective estimates real(8) :: cov(3,3) ! sample covariance matrix real(8) :: f ! weighting factor @@ -458,73 +458,131 @@ contains if (n_realizations <= 3) return ! Initialize variables - n = n_realizations - g = ZERO - S = ZERO - k_combined = ZERO + n = real(n_realizations, 8) ! Copy estimates of k-effective and its variance (not variance of the mean) kv(1) = global_tallies(RESULT_SUM, K_COLLISION) / n kv(2) = global_tallies(RESULT_SUM, K_ABSORPTION) / n kv(3) = global_tallies(RESULT_SUM, K_TRACKLENGTH) / n - cov(1,1) = (global_tallies(RESULT_SUM_SQ, K_COLLISION) - & - n * kv(1) * kv(1)) / (n - 1) - cov(2,2) = (global_tallies(RESULT_SUM_SQ, K_ABSORPTION) - & - n * kv(2) * kv(2)) / (n - 1) - cov(3,3) = (global_tallies(RESULT_SUM_SQ, K_TRACKLENGTH) - & - n * kv(3) * kv(3)) / (n - 1) + cov(1, 1) = (global_tallies(RESULT_SUM_SQ, K_COLLISION) - & + n * kv(1) * kv(1)) / (n - ONE) + cov(2, 2) = (global_tallies(RESULT_SUM_SQ, K_ABSORPTION) - & + n * kv(2) * kv(2)) / (n - ONE) + cov(3, 3) = (global_tallies(RESULT_SUM_SQ, K_TRACKLENGTH) - & + n * kv(3) * kv(3)) / (n - ONE) ! Calculate covariances based on sums with Bessel's correction - cov(1,2) = (k_col_abs - n * kv(1) * kv(2))/(n - 1) - cov(1,3) = (k_col_tra - n * kv(1) * kv(3))/(n - 1) - cov(2,3) = (k_abs_tra - n * kv(2) * kv(3))/(n - 1) - cov(2,1) = cov(1,2) - cov(3,1) = cov(1,3) - cov(3,2) = cov(2,3) + cov(1, 2) = (k_col_abs - n * kv(1) * kv(2)) / (n - ONE) + cov(1, 3) = (k_col_tra - n * kv(1) * kv(3)) / (n - ONE) + cov(2, 3) = (k_abs_tra - n * kv(2) * kv(3)) / (n - ONE) + cov(2, 1) = cov(1, 2) + cov(3, 1) = cov(1, 3) + cov(3, 2) = cov(2, 3) - do l = 1, 3 - ! Permutations of estimates - if (l == 1) then - ! i = collision, j = absorption, k = tracklength - i = 1 - j = 2 - k = 3 - elseif (l == 2) then - ! i = absortion, j = tracklength, k = collision - i = 2 - j = 3 - k = 1 - elseif (l == 3) then - ! i = tracklength, j = collision, k = absorption - i = 3 - j = 1 - k = 2 - end if + ! Check to see if two estimators are the same; this is guaranteed to happen + ! in MG-mode with survival biasing when the collision and absorption + ! estimators are the same, but can theoretically happen at anytime. + ! If it does, the standard estimators will produce floating-point + ! exceptions and an expression specifically derived for the combination of + ! two estimators (vice three) should be used instead. - ! Calculate weighting - f = cov(j,j)*(cov(k,k) - cov(i,k)) - cov(k,k)*cov(i,j) + & - cov(j,k)*(cov(i,j) + cov(i,k) - cov(j,k)) + ! First we will identify if there are any matching estimators + if ((abs(kv(1) - kv(2)) / kv(1) < FP_REL_PRECISION) .and. & + (abs(cov(1, 1) - cov(2, 2)) / cov(1, 1) < FP_REL_PRECISION)) then + ! 1 and 2 match, so only use 1 and 3 in our comparisons + i = 1 + j = 3 - ! Add to S sums for variance of combined estimate - S(1) = S(1) + f * cov(1,l) - S(2) = S(2) + (cov(j,j) + cov(k,k) - TWO*cov(j,k))*kv(l)*kv(l) - S(3) = S(3) + (cov(k,k) + cov(i,j) - cov(j,k) - cov(i,k))*kv(l)*kv(j) + else if ((abs(kv(1) - kv(3)) / kv(1) < FP_REL_PRECISION) .and. & + (abs(cov(1, 1) - cov(3, 3)) / cov(1, 1) < FP_REL_PRECISION)) then + ! 1 and 3 match, so only use 1 and 2 in our comparisons + i = 1 + j = 2 - ! Add to sum for combined k-effective - k_combined(1) = k_combined(1) + f * kv(l) - g = g + f - end do + else if ((abs(kv(2) - kv(3)) / kv(2) < FP_REL_PRECISION) .and. & + (abs(cov(2, 2) - cov(3, 3)) / cov(2, 2) < FP_REL_PRECISION)) then + ! 2 and 3 match, so only use 1 and 2 in our comparisons + i = 1 + j = 2 - ! Complete calculations of S sums - S = (n - 1)*S - S(1) = (n - 1)**2 * S(1) + else + ! No two estimators match, so set i to 0 and this will be the indicator + ! to use all three estimators. + i = 0 + end if - ! Calculate combined estimate of k-effective - k_combined(1) = k_combined(1) / g + if (i == 0) then + ! Use three estimators as derived in the paper by Urbatsch - ! Calculate standard deviation of combined estimate - g = (n - 1)**2 * g - k_combined(2) = sqrt(S(1)/(g*n*(n-3)) * (ONE + n*((S(2) - TWO*S(3))/g))) + ! Initialize variables + g = ZERO + S = ZERO + k_combined = ZERO + + do l = 1, 3 + ! Permutations of estimates + if (l == 1) then + ! i = collision, j = absorption, k = tracklength + i = 1 + j = 2 + k = 3 + elseif (l == 2) then + ! i = absortion, j = tracklength, k = collision + i = 2 + j = 3 + k = 1 + elseif (l == 3) then + ! i = tracklength, j = collision, k = absorption + i = 3 + j = 1 + k = 2 + end if + + ! Calculate weighting + f = cov(j, j) * (cov(k, k) - cov(i, k)) - cov(k, k) * cov(i, j) + & + cov(j, k) * (cov(i, j) + cov(i, k) - cov(j, k)) + + ! Add to S sums for variance of combined estimate + S(1) = S(1) + f * cov(1, l) + S(2) = S(2) + (cov(j, j) + cov(k, k) - TWO * cov(j, k)) * kv(l) * kv(l) + S(3) = S(3) + (cov(k, k) + cov(i, j) - cov(j, k) - & + cov(i, k)) * kv(l) * kv(j) + + ! Add to sum for combined k-effective + k_combined(1) = k_combined(1) + f * kv(l) + g = g + f + end do + + ! Complete calculations of S sums + S = (n - ONE) * S + S(1) = (n - ONE)**2 * S(1) + + ! Calculate combined estimate of k-effective + k_combined(1) = k_combined(1) / g + + ! Calculate standard deviation of combined estimate + g = (n - ONE)**2 * g + k_combined(2) = sqrt(S(1) / & + (g * n * (n - THREE)) * (ONE + n * ((S(2) - TWO * S(3)) / g))) + + else + ! Use only two estimators + ! These equations are derived analogously to that done in the paper by + ! Urbatsch, but are simpler than for the three estimators case since the + ! block matrices of the three estimator equations reduces to scalars here + + ! Store commonly used terms + f = cov(i, i) - cov(i, j) + g = (cov(i, i) + cov(j, j) - TWO * cov(i, j)) + + ! Calculate combined estimate of k-effective + k_combined(1) = kv(i) - f / g * (kv(i) - kv(j)) + + ! Calculate standard deviation of combined estimate + k_combined(2) = sqrt(cov(i, i) * (ONE - f * f / g) * & + (ONE / n + (kv(i) - kv(j)) * (kv(i) - kv(j)) / ((n - ONE) * g))) + + end if end subroutine calculate_combined_keff From de268232aa65d160ac1572301056f68da1409107 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 14:16:57 -0500 Subject: [PATCH 31/66] Added a test for multi-group survival biasing --- .../test_mg_survival_biasing/inputs_true.dat | 99 +++++++++++++++++++ .../test_mg_survival_biasing/results_true.dat | 2 + .../test_mg_survival_biasing.py | 21 ++++ 3 files changed, 122 insertions(+) create mode 100644 tests/test_mg_survival_biasing/inputs_true.dat create mode 100644 tests/test_mg_survival_biasing/results_true.dat create mode 100644 tests/test_mg_survival_biasing/test_mg_survival_biasing.py diff --git a/tests/test_mg_survival_biasing/inputs_true.dat b/tests/test_mg_survival_biasing/inputs_true.dat new file mode 100644 index 0000000000..6628c528fd --- /dev/null +++ b/tests/test_mg_survival_biasing/inputs_true.dat @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../1d_mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + 10 + 5 + + + + 0.0 0.0 0.0 10.0 10.0 5.0 + + + multi-group + true + diff --git a/tests/test_mg_survival_biasing/results_true.dat b/tests/test_mg_survival_biasing/results_true.dat new file mode 100644 index 0000000000..13717361ad --- /dev/null +++ b/tests/test_mg_survival_biasing/results_true.dat @@ -0,0 +1,2 @@ +k-combined: +1.080832E+00 3.435003E-02 diff --git a/tests/test_mg_survival_biasing/test_mg_survival_biasing.py b/tests/test_mg_survival_biasing/test_mg_survival_biasing.py new file mode 100644 index 0000000000..1883c33dcc --- /dev/null +++ b/tests/test_mg_survival_biasing/test_mg_survival_biasing.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class MGBasicTestHarness(PyAPITestHarness): + 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.settings.survival_biasing = True + self._input_set.export() + + +if __name__ == '__main__': + harness = MGBasicTestHarness('statepoint.10.*', False, mg=True) + harness.main() From 39b95aa5e6670894241158928433c2857a4505b3 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 18 Feb 2017 14:58:36 -0500 Subject: [PATCH 32/66] Fixed indenting --- src/eigenvalue.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index a04b32340d..f8d620f744 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -488,19 +488,19 @@ contains ! First we will identify if there are any matching estimators if ((abs(kv(1) - kv(2)) / kv(1) < FP_REL_PRECISION) .and. & - (abs(cov(1, 1) - cov(2, 2)) / cov(1, 1) < FP_REL_PRECISION)) then + (abs(cov(1, 1) - cov(2, 2)) / cov(1, 1) < FP_REL_PRECISION)) then ! 1 and 2 match, so only use 1 and 3 in our comparisons i = 1 j = 3 else if ((abs(kv(1) - kv(3)) / kv(1) < FP_REL_PRECISION) .and. & - (abs(cov(1, 1) - cov(3, 3)) / cov(1, 1) < FP_REL_PRECISION)) then + (abs(cov(1, 1) - cov(3, 3)) / cov(1, 1) < FP_REL_PRECISION)) then ! 1 and 3 match, so only use 1 and 2 in our comparisons i = 1 j = 2 else if ((abs(kv(2) - kv(3)) / kv(2) < FP_REL_PRECISION) .and. & - (abs(cov(2, 2) - cov(3, 3)) / cov(2, 2) < FP_REL_PRECISION)) then + (abs(cov(2, 2) - cov(3, 3)) / cov(2, 2) < FP_REL_PRECISION)) then ! 2 and 3 match, so only use 1 and 2 in our comparisons i = 1 j = 2 From ac27ee46757dae0f6612a5060ca464975186c632 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 19 Feb 2017 09:57:07 -0500 Subject: [PATCH 33/66] fixed failing test --- tests/test_mg_survival_biasing/inputs_true.dat | 9 ++++----- tests/test_mg_survival_biasing/results_true.dat | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/test_mg_survival_biasing/inputs_true.dat b/tests/test_mg_survival_biasing/inputs_true.dat index 6628c528fd..be2e6b2d92 100644 --- a/tests/test_mg_survival_biasing/inputs_true.dat +++ b/tests/test_mg_survival_biasing/inputs_true.dat @@ -84,11 +84,10 @@ - - 100 - 10 - 5 - + eigenvalue + 100 + 10 + 5 0.0 0.0 0.0 10.0 10.0 5.0 diff --git a/tests/test_mg_survival_biasing/results_true.dat b/tests/test_mg_survival_biasing/results_true.dat index 13717361ad..da0cd243ea 100644 --- a/tests/test_mg_survival_biasing/results_true.dat +++ b/tests/test_mg_survival_biasing/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.080832E+00 3.435003E-02 +1.080827E+00 3.265304E-02 From 3fb5f1dc57dc507bc7896f73d523b6f90e8f88d2 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 19 Feb 2017 13:30:32 -0500 Subject: [PATCH 34/66] Now I fixed it - forgot to recompile before updating results --- tests/test_mg_survival_biasing/results_true.dat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_mg_survival_biasing/results_true.dat b/tests/test_mg_survival_biasing/results_true.dat index da0cd243ea..13717361ad 100644 --- a/tests/test_mg_survival_biasing/results_true.dat +++ b/tests/test_mg_survival_biasing/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.080827E+00 3.265304E-02 +1.080832E+00 3.435003E-02 From 6b97178ba6e380cfd4e567167564cab1f891dcf5 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 21 Feb 2017 12:42:36 -0500 Subject: [PATCH 35/66] Revised per eq 40 of Urbatsch and @paulromano comments --- src/eigenvalue.F90 | 13 +++++++------ tests/test_mg_survival_biasing/results_true.dat | 2 +- .../test_mg_survival_biasing.py | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index f8d620f744..86169d98d4 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -571,16 +571,17 @@ contains ! Urbatsch, but are simpler than for the three estimators case since the ! block matrices of the three estimator equations reduces to scalars here - ! Store commonly used terms - f = cov(i, i) - cov(i, j) - g = (cov(i, i) + cov(j, j) - TWO * cov(i, j)) + ! Store the commonly used term + f = kv(i) - kv(j) + g = cov(i, i) + cov(j, j) - TWO * cov(i, j) ! Calculate combined estimate of k-effective - k_combined(1) = kv(i) - f / g * (kv(i) - kv(j)) + k_combined(1) = kv(i) - (cov(i, i) - cov(i, j)) / g * f ! Calculate standard deviation of combined estimate - k_combined(2) = sqrt(cov(i, i) * (ONE - f * f / g) * & - (ONE / n + (kv(i) - kv(j)) * (kv(i) - kv(j)) / ((n - ONE) * g))) + k_combined(2) = (cov(i, i) * cov(j, j) - cov(i, j) * cov(i, j)) * & + (g + n * f * f) / (n * (n - TWO) * g * g) + k_combined(2) = sqrt(k_combined(2)) end if diff --git a/tests/test_mg_survival_biasing/results_true.dat b/tests/test_mg_survival_biasing/results_true.dat index 13717361ad..b20d632885 100644 --- a/tests/test_mg_survival_biasing/results_true.dat +++ b/tests/test_mg_survival_biasing/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.080832E+00 3.435003E-02 +1.080832E+00 1.336780E-02 diff --git a/tests/test_mg_survival_biasing/test_mg_survival_biasing.py b/tests/test_mg_survival_biasing/test_mg_survival_biasing.py index 1883c33dcc..61b7381a47 100644 --- a/tests/test_mg_survival_biasing/test_mg_survival_biasing.py +++ b/tests/test_mg_survival_biasing/test_mg_survival_biasing.py @@ -17,5 +17,5 @@ class MGBasicTestHarness(PyAPITestHarness): if __name__ == '__main__': - harness = MGBasicTestHarness('statepoint.10.*', False, mg=True) + harness = MGBasicTestHarness('statepoint.10.h5', False, mg=True) harness.main() From 6793ca9836d8d77f656b74d25a6b0b372f835cdf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 10:41:51 -0600 Subject: [PATCH 36/66] Add git SHA1 hash to --version output and summary/statepoint files --- docs/source/io_formats/statepoint.rst | 4 ++++ docs/source/io_formats/summary.rst | 4 ++++ src/output.F90 | 5 ++++- src/state_point.F90 | 3 +++ src/summary.F90 | 3 +++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index e334f2bf11..a93e2f26d1 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -27,6 +27,10 @@ The current revision of the statepoint file format is 15. Release version number for OpenMC +**/git_sha1** (*char[40]*) + + Git commit SHA-1 hash + **/date_and_time** (*char[]*) Date and time the state point was written. diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 435cb45c87..3084c27383 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -27,6 +27,10 @@ The current revision of the summary file format is 4. Release version number for OpenMC +**/git_sha1** (*char[40]*) + + Git commit SHA-1 hash + **/date_and_time** (*char[]*) Date and time the summary was written. diff --git a/src/output.F90 b/src/output.F90 index c719dbed97..b1b8320c68 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -173,10 +173,13 @@ contains if (master) then write(UNIT=OUTPUT_UNIT, FMT='(1X,A,1X,I1,".",I1,".",I1)') & "OpenMC version", VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE +#ifdef GIT_SHA1 + write(UNIT=OUTPUT_UNIT, FMT='(1X,A,A)') "Git SHA1: ", GIT_SHA1 +#endif write(UNIT=OUTPUT_UNIT, FMT=*) "Copyright (c) 2011-2015 & &Massachusetts Institute of Technology" write(UNIT=OUTPUT_UNIT, FMT=*) "MIT/X license at & - &" + &" end if end subroutine print_version diff --git a/src/state_point.F90 b/src/state_point.F90 index 257753b5b4..5872fbadf4 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -77,6 +77,9 @@ contains 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) +#ifdef GIT_SHA1 + call write_dataset(file_id, "git_sha1", GIT_SHA1) +#endif ! Write current date and time call write_dataset(file_id, "date_and_time", time_stamp()) diff --git a/src/summary.F90 b/src/summary.F90 index 78a8276f16..a17aa5210d 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -96,6 +96,9 @@ contains 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) +#ifdef GIT_SHA1 + call write_dataset(file_id, "git_sha1", GIT_SHA1) +#endif ! Write current date and time call write_dataset(file_id, "date_and_time", time_stamp()) From 0c616c8b22b846132fc69645dc1231c877b4a6bb Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 14:29:34 -0600 Subject: [PATCH 37/66] Handle HDF5 format versions consistently --- openmc/checkvalue.py | 33 ++++++++ openmc/particle_restart.py | 16 ++-- openmc/statepoint.py | 45 ++++------- openmc/summary.py | 22 ++---- openmc/volume.py | 4 + src/constants.F90 | 18 +++-- src/hdf5_interface.F90 | 79 +++++++++++++++++-- src/initialize.F90 | 12 +-- src/input_xml.F90 | 6 +- src/multipole.F90 | 9 ++- src/particle_restart.F90 | 5 +- src/particle_restart_write.F90 | 12 ++- src/state_point.F90 | 36 ++++----- src/summary.F90 | 57 ++----------- src/track_output.F90 | 8 +- src/volume_calc.F90 | 21 +++-- .../results_true.dat | 2 +- 17 files changed, 218 insertions(+), 167 deletions(-) diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index fe5683c06a..06e5240048 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -239,6 +239,39 @@ def check_greater_than(name, value, minimum, equality=False): raise ValueError(msg) +def check_filetype_version(obj, expected_type, expected_version): + """Check filetype and version of an HDF5 file. + + Parameters + ---------- + obj : h5py.File + HDF5 file to check + expected_type + Expected file type, e.g. 'statepoint' + expected_version + Expected major version number. + + """ + try: + this_filetype = obj.attrs['filetype'].decode() + this_version = obj.attrs['version'] + + # Check filetype + if this_filetype != expected_type: + raise IOError('{} is not a {} file.'.format( + obj.filename, expected_type)) + + # Check version + if this_version[0] != expected_version: + raise IOError('Statepoint file has a version of {} which is not ' + 'consistent with the version expected by OpenMC, {}' + .format('.'.join(this_version), expected_version)) + except AttributeError: + raise IOError('Could not read {} file. This most likely means the {} ' + 'file was produced by a different version of OpenMC than ' + 'the one you are using.'.format(expected_type)) + + class CheckedList(list): """A list for which each element is type-checked as it's added diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index cb13265860..651855a878 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -1,5 +1,9 @@ import h5py +import openmc.checkvalue as cv + +_VERSION_PARTICLE_RESTART = 2 + class Particle(object): """Information used to restart a specific particle that caused a simulation to fail. @@ -37,15 +41,9 @@ class Particle(object): def __init__(self, filename): self._f = h5py.File(filename, 'r') - # Ensure filetype and revision are correct - 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 has a file revision of {} ' - 'which is not consistent with the revision this ' - 'version of OpenMC expects ({}).'.format( - self._f['revision'].value, 1)) + # Ensure filetype and version are correct + cv.check_filetype_version(self._f, 'particle restart', + _VERSION_PARTICLE_RESTART) @property def current_batch(self): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 144146ba3a..89eabdfd71 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -10,6 +10,8 @@ import h5py import openmc import openmc.checkvalue as cv +_VERSION_STATEPOINT = 16 + class StatePoint(object): """State information on a simulation at a certain point in time (at the end @@ -78,7 +80,7 @@ class StatePoint(object): path : str Working directory for simulation run_mode : str - Simulation run mode, e.g. 'k-eigenvalue' + Simulation run mode, e.g. 'eigenvalue' runtime : dict Dictionary whose keys are strings describing various runtime metrics and whose values are time values in seconds. @@ -110,21 +112,8 @@ class StatePoint(object): def __init__(self, filename, autolink=True): self._f = h5py.File(filename, 'r') - # Ensure filetype and revision are correct - 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 != 15: - 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, 15)) + # Check filetype and version + cv.check_filetype_version(self._f, 'statepoint', _VERSION_STATEPOINT) # Set flags for what data has been read self._meshes_read = False @@ -188,18 +177,18 @@ class StatePoint(object): @property def date_and_time(self): - return self._f['date_and_time'].value.decode() + return self._f.attrs['date_and_time'].decode() @property def entropy(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['entropy'].value else: return None @property def gen_per_batch(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['gen_per_batch'].value else: return None @@ -234,35 +223,35 @@ class StatePoint(object): @property def k_generation(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_generation'].value else: return None @property def k_combined(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_combined'].value else: return None @property def k_col_abs(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_col_abs'].value else: return None @property def k_col_tra(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_col_tra'].value else: return None @property def k_abs_tra(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['k_abs_tra'].value else: return None @@ -321,7 +310,7 @@ class StatePoint(object): @property def n_inactive(self): - if self.run_mode == 'k-eigenvalue': + if self.run_mode == 'eigenvalue': return self._f['n_inactive'].value else: return None @@ -336,7 +325,7 @@ class StatePoint(object): @property def path(self): - return self._f['path'].value.decode() + return self._f.attrs['path'].decode() @property def run_mode(self): @@ -501,9 +490,7 @@ class StatePoint(object): @property def version(self): - return (self._f['version_major'].value, - self._f['version_minor'].value, - self._f['version_release'].value) + return self._f.attrs['version'] @property def summary(self): diff --git a/openmc/summary.py b/openmc/summary.py index 5bc4c56a2e..b219e2aafc 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -5,8 +5,11 @@ import numpy as np import h5py import openmc +import openmc.checkvalue as cv from openmc.region import Region +_VERSION_SUMMARY = 5 + class Summary(object): """Information summarizing the geometry, materials, and tallies used in a @@ -31,6 +34,8 @@ class Summary(object): raise ValueError(msg) self._f = h5py.File(filename, 'r') + cv.check_filetype_version(self._f, 'summary', _VERSION_SUMMARY) + self._openmc_geometry = None self._opencg_geometry = None @@ -53,22 +58,9 @@ class Summary(object): def _read_metadata(self): # Read OpenMC version - self.version = [self._f['version_major'].value, - self._f['version_minor'].value, - self._f['version_release'].value] + self.version = self._f.attrs['openmc_version'] # Read date and time - self.date_and_time = self._f['date_and_time'][...] - - # Read if continuous-energy or multi-group - self.run_CE = (self._f['run_CE'].value == 1) - - self.n_batches = self._f['n_batches'].value - self.n_particles = self._f['n_particles'].value - if 'n_inactive' in self._f: - 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 + self.date_and_time = self._f.attrs['date_and_time'] def _read_nuclides(self): self.nuclides = {} diff --git a/openmc/volume.py b/openmc/volume.py index b1391c687c..d85a9a17cc 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -10,6 +10,8 @@ import h5py import openmc import openmc.checkvalue as cv +_VERSION_VOLUME = 1 + class VolumeCalculation(object): """Stochastic volume calculation specifications and results. @@ -189,6 +191,8 @@ class VolumeCalculation(object): """ with h5py.File(filename, 'r') as f: + cv.check_filetype_version(f, "volume", _VERSION_VOLUME) + domain_type = f.attrs['domain_type'].decode() samples = f.attrs['samples'] lower_left = f.attrs['lower_left'] diff --git a/src/constants.F90 b/src/constants.F90 index 43ba2c223c..7f3cf87f83 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -9,17 +9,19 @@ module constants integer, parameter :: VERSION_MAJOR = 0 integer, parameter :: VERSION_MINOR = 8 integer, parameter :: VERSION_RELEASE = 0 + integer, parameter :: & + VERSION(3) = [VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE] ! HDF5 data format - integer, parameter :: HDF5_VERSION_MAJOR = 1 - integer, parameter :: HDF5_VERSION_MINOR = 0 + integer, parameter :: HDF5_VERSION(2) = [1, 0] - ! Revision numbers for binary files - integer, parameter :: REVISION_STATEPOINT = 15 - integer, parameter :: REVISION_PARTICLE_RESTART = 1 - integer, parameter :: REVISION_TRACK = 1 - integer, parameter :: REVISION_SUMMARY = 4 - character(10), parameter :: MULTIPOLE_VERSION = "v0.2" + ! Version numbers for binary files + integer, parameter :: VERSION_STATEPOINT(2) = [16, 0] + integer, parameter :: VERSION_PARTICLE_RESTART(2) = [2, 0] + integer, parameter :: VERSION_TRACK(2) = [2, 0] + integer, parameter :: VERSION_SUMMARY(2) = [5, 0] + integer, parameter :: VERSION_VOLUME(2) = [1, 0] + character(10), parameter :: VERSION_MULTIPOLE = "v0.2" ! ============================================================================ ! ADJUSTABLE PARAMETERS diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index e588cda146..6ca39e0001 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -75,6 +75,8 @@ module hdf5_interface module procedure write_attribute_double module procedure write_attribute_double_1D module procedure write_attribute_integer + module procedure write_attribute_integer_1D + module procedure write_attribute_string end interface write_attribute public :: write_dataset @@ -93,7 +95,6 @@ module hdf5_interface public :: close_dataset public :: get_shape public :: get_ndims - public :: write_attribute_string public :: get_groups public :: get_datasets public :: get_name @@ -2046,15 +2047,46 @@ contains ! WRITE_ATTRIBUTE_STRING !=============================================================================== - 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 + subroutine write_attribute_string(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id ! object to write attribute to + character(*), intent(in) :: name ! name of attribute + character(*), intent(in), target :: buffer ! string to write - integer :: hdf5_err + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + integer(HID_T) :: filetype + integer(SIZE_T) :: i + integer(SIZE_T) :: n + character(kind=C_CHAR), allocatable, target :: temp_buffer(:) + type(c_ptr) :: f_ptr - call h5ltset_attribute_string_f(group_id, var, attr_type, attr_str, hdf5_err) + ! Create datatype for HDF5 file based on C char + n = len_trim(buffer) + if (n > 0) then + call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) + call h5tset_size_f(filetype, n, hdf5_err) + + ! Crate memory space and attribute + call h5screate_f(H5S_SCALAR_F, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), filetype, dspace_id, & + attr_id, hdf5_err) + + ! Copy string to temporary buffer + allocate(temp_buffer(n)) + do i = 1, n + temp_buffer(i) = buffer(i:i) + end do + + ! Write attribute + f_ptr = c_loc(buffer(1:1)) + call h5awrite_f(attr_id, filetype, f_ptr, hdf5_err) + + ! Close attribute + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + call h5tclose_f(filetype, hdf5_err) + end if end subroutine write_attribute_string subroutine read_attribute_double(buffer, obj_id, name) @@ -2270,6 +2302,37 @@ contains call h5aread_f(attr_id, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) end subroutine read_attribute_integer_1D_explicit + subroutine write_attribute_integer_1D(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name + integer, target, intent(in) :: buffer(:) + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + call write_attribute_integer_1D_explicit(obj_id, dims, name, buffer) + end subroutine write_attribute_integer_1D + + subroutine write_attribute_integer_1D_explicit(obj_id, dims, name, buffer) + integer(HID_T), intent(in) :: obj_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name + integer, target, intent(in) :: buffer(dims(1)) + + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + type(C_PTR) :: f_ptr + + call h5screate_simple_f(1, dims, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), H5T_NATIVE_INTEGER, dspace_id, & + attr_id, hdf5_err) + f_ptr = c_loc(buffer) + call h5awrite_f(attr_id, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + end subroutine write_attribute_integer_1D_explicit + subroutine read_attribute_integer_2D(buffer, obj_id, name) integer, target, allocatable, intent(inout) :: buffer(:,:) integer(HID_T), intent(in) :: obj_id diff --git a/src/initialize.F90 b/src/initialize.F90 index d30f1e0144..ed1e663fdb 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -18,8 +18,8 @@ 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_integer8_t + use hdf5_interface, only: file_open, read_attribute, file_close, & + hdf5_bank_t, hdf5_integer8_t use input_xml, only: read_input_xml, cells_in_univ_dict, read_plots_xml use material_header, only: Material use message_passing @@ -307,11 +307,11 @@ contains ! Check what type of file this is file_id = file_open(argv(i), 'r', parallel=.true.) - call read_dataset(filetype, file_id, 'filetype') + call read_attribute(filetype, file_id, 'filetype') call file_close(file_id) ! Set path and flag for type of run - select case (filetype) + select case (trim(filetype)) case ('statepoint') path_state_point = argv(i) restart_run = .true. @@ -319,7 +319,7 @@ contains path_particle_restart = argv(i) particle_restart_run = .true. case default - call fatal_error("Unrecognized file after restart flag.") + call fatal_error("Unrecognized file after restart flag: " // filetype // ".") end select ! If its a restart run check for additional source file @@ -333,7 +333,7 @@ contains ! Check file type is a source file file_id = file_open(argv(i), 'r', parallel=.true.) - call read_dataset(filetype, file_id, 'filetype') + call read_attribute(filetype, file_id, 'filetype') call file_close(file_id) if (filetype /= 'source') then call fatal_error("Second file after restart flag must be a & diff --git a/src/input_xml.F90 b/src/input_xml.F90 index fa2e9881c0..b1d62e6283 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5412,16 +5412,16 @@ contains if (attribute_exists(file_id, 'version')) then call read_attribute(version, file_id, 'version') - if (version(1) /= HDF5_VERSION_MAJOR) then + if (version(1) /= HDF5_VERSION(1)) then call fatal_error("HDF5 data format uses version " // trim(to_str(& version(1))) // "." // trim(to_str(version(2))) // " whereas & &your installation of OpenMC expects version " // trim(to_str(& - HDF5_VERSION_MAJOR)) // ".x data.") + HDF5_VERSION(1))) // ".x data.") end if else call fatal_error("HDF5 data does not indicate a version. Your & &installation of OpenMC expects version " // trim(to_str(& - HDF5_VERSION_MAJOR)) // ".x data.") + HDF5_VERSION(1))) // ".x data.") end if end subroutine check_data_version diff --git a/src/multipole.F90 b/src/multipole.F90 index a099e50476..c59f947272 100644 --- a/src/multipole.F90 +++ b/src/multipole.F90 @@ -1,8 +1,9 @@ module multipole + use hdf5 + use constants use global - use hdf5 use hdf5_interface use multipole_header, only: MultipoleArray, FIT_T, FIT_A, FIT_F, & MP_FISS, FORM_MLBW, FORM_RM @@ -39,9 +40,9 @@ contains ! Check the file version number. call read_dataset(version, file_id, "version") - if (version /= MULTIPOLE_VERSION) call fatal_error("The current multipole& - & format version is " // trim(MULTIPOLE_VERSION) // " but the file "& - // trim(filename) // " uses version " // trim(version)) + if (version /= VERSION_MULTIPOLE) call fatal_error("The current multipole& + & format version is " // trim(VERSION_MULTIPOLE) // " but the file "& + // trim(filename) // " uses version " // trim(version) // ".") ! Load in all the array size scalars call read_dataset(multipole % length, group_id, "length") diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index a1c32f723e..e0174d05f8 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -69,7 +69,6 @@ contains type(Particle), intent(inout) :: p integer, intent(inout) :: previous_run_mode - integer :: int_scalar integer(HID_T) :: file_id character(MAX_WORD_LEN) :: tempstr @@ -81,15 +80,13 @@ contains file_id = file_open(path_particle_restart, 'r') ! Read data from file - call read_dataset(tempstr, file_id, 'filetype') - call read_dataset(int_scalar, file_id, 'revision') call read_dataset(current_batch, file_id, 'current_batch') call read_dataset(gen_per_batch, file_id, 'gen_per_batch') call read_dataset(current_gen, file_id, 'current_gen') call read_dataset(n_particles, file_id, 'n_particles') call read_dataset(tempstr, file_id, 'run_mode') select case (tempstr) - case ('k-eigenvalue') + case ('eigenvalue') previous_run_mode = MODE_EIGENVALUE case ('fixed source') previous_run_mode = MODE_FIXEDSOURCE diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index d983b3db8a..a2e01a7a6d 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -39,9 +39,15 @@ contains ! Get information about source particle src => source_bank(current_work) + ! Write filetype and version info + call write_attribute(file_id, 'filetype', 'particle restart') + call write_attribute(file_id, 'version', VERSION_PARTICLE_RESTART) + call write_attribute(file_id, "openmc_version", VERSION) +#ifdef GIT_SHA1 + call write_attribute(file_id, "git_sha1", GIT_SHA1) +#endif + ! Write data to file - 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) call write_dataset(file_id, 'current_gen', current_gen) @@ -50,7 +56,7 @@ contains case (MODE_FIXEDSOURCE) call write_dataset(file_id, 'run_mode', 'fixed source') case (MODE_EIGENVALUE) - call write_dataset(file_id, 'run_mode', 'k-eigenvalue') + call write_dataset(file_id, 'run_mode', 'eigenvalue') 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 5872fbadf4..cb4ae5157a 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -68,39 +68,37 @@ contains file_id = file_create(filename) ! Write file type - call write_dataset(file_id, "filetype", 'statepoint') + call write_attribute(file_id, "filetype", "statepoint") ! Write revision number for state point file - call write_dataset(file_id, "revision", REVISION_STATEPOINT) + call write_attribute(file_id, "version", VERSION_STATEPOINT) ! Write OpenMC version - 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) + call write_attribute(file_id, "openmc_version", VERSION) #ifdef GIT_SHA1 - call write_dataset(file_id, "git_sha1", GIT_SHA1) + call write_attribute(file_id, "git_sha1", GIT_SHA1) #endif ! Write current date and time - call write_dataset(file_id, "date_and_time", time_stamp()) + call write_attribute(file_id, "date_and_time", time_stamp()) ! Write path to input - call write_dataset(file_id, "path", path_input) + call write_attribute(file_id, "path", path_input) ! Write out random number seed call write_dataset(file_id, "seed", seed) ! Write run information if (run_CE) then - call write_dataset(file_id, "run_CE", 1) + call write_dataset(file_id, "energy_mode", "continuous-energy") else - call write_dataset(file_id, "run_CE", 0) + call write_dataset(file_id, "energy_mode", "multi-group") end if 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") + call write_dataset(file_id, "run_mode", "eigenvalue") end select call write_dataset(file_id, "n_particles", n_particles) call write_dataset(file_id, "n_batches", n_batches) @@ -670,13 +668,13 @@ contains integer :: i integer :: int_array(3) + integer, allocatable :: array(:) integer(HID_T) :: file_id integer(HID_T) :: cmfd_group integer(HID_T) :: tallies_group integer(HID_T) :: tally_group real(8) :: real_array(3) logical :: source_present - integer :: sp_run_CE character(MAX_WORD_LEN) :: word type(TallyObject), pointer :: tally @@ -688,15 +686,15 @@ contains file_id = file_open(path_state_point, 'r', parallel=.true.) ! Read filetype - call read_dataset(word, file_id, "filetype") + call read_attribute(word, file_id, "filetype") if (word /= 'statepoint') then call fatal_error("OpenMC tried to restart from a non-statepoint file.") end if ! Read revision number for state point file and make sure it matches with ! current version - call read_dataset(int_array(1), file_id, "revision") - if (int_array(1) /= REVISION_STATEPOINT) then + call read_attribute(array, file_id, "version") + if (any(array /= VERSION_STATEPOINT)) then call fatal_error("State point version does not match current version & &in OpenMC.") end if @@ -706,11 +704,11 @@ contains ! It is not impossible for a state point to be generated from a CE run but ! to be loaded in to an MG run (or vice versa), check to prevent that. - call read_dataset(sp_run_CE, file_id, "run_CE") - if (sp_run_CE == 0 .and. run_CE) then + call read_dataset(word, file_id, "energy_mode") + if (word == "multi-group" .and. run_CE) then call fatal_error("State point file is from multi-group run but & & current run is continous-energy!") - else if (sp_run_CE == 1 .and. .not. run_CE) then + else if (word == "continuous-energy" .and. .not. run_CE) then call fatal_error("State point file is from continuous-energy run but & & current run is multi-group!") end if @@ -720,7 +718,7 @@ contains select case(word) case ('fixed source') run_mode = MODE_FIXEDSOURCE - case ('k-eigenvalue') + case ('eigenvalue') run_mode = MODE_EIGENVALUE end select call read_dataset(n_particles, file_id, "n_particles") diff --git a/src/summary.F90 b/src/summary.F90 index a17aa5210d..10b26d0e0c 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -1,5 +1,7 @@ module summary + use hdf5 + use constants use endf, only: reaction_name use geometry_header, only: BASE_UNIVERSE, Cell, Universe, Lattice, & @@ -16,8 +18,6 @@ module summary use tally_header, only: TallyObject use tally_filter, only: find_offset - use hdf5 - implicit none private @@ -39,36 +39,6 @@ contains ! Write header information call write_header(file_id) - if (run_CE) then - call write_dataset(file_id, "run_CE", 1) - else - call write_dataset(file_id, "run_CE", 0) - end if - - ! 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 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_inactive", & - "description", "Number of inactive batches") - call write_attribute_string(file_id, "n_active", & - "description", "Number of active batches") - call write_attribute_string(file_id, "gen_per_batch", & - "description", "Number of generations per batch") - end if - call write_nuclides(file_id) call write_geometry(file_id) call write_materials(file_id) @@ -88,25 +58,16 @@ 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) - call write_dataset(file_id, "version_release", VERSION_RELEASE) + ! Write filetype and version info + call write_attribute(file_id, "filetype", "summary") + call write_attribute(file_id, "version", VERSION_SUMMARY) + call write_attribute(file_id, "openmc_version", VERSION) #ifdef GIT_SHA1 - call write_dataset(file_id, "git_sha1", GIT_SHA1) + call write_attribute(file_id, "git_sha1", GIT_SHA1) #endif ! Write current date and time - call write_dataset(file_id, "date_and_time", time_stamp()) - - ! Write MPI information - call write_dataset(file_id, "n_procs", n_procs) - call write_attribute_string(file_id, "n_procs", "description", & - "Number of MPI processes") + call write_attribute(file_id, "date_and_time", time_stamp()) end subroutine write_header @@ -553,8 +514,6 @@ contains ! Write atom density with units 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(nucnames(m%n_nuclides)) diff --git a/src/track_output.F90 b/src/track_output.F90 index 1411738622..bdef9579c2 100644 --- a/src/track_output.F90 +++ b/src/track_output.F90 @@ -114,10 +114,10 @@ contains !$omp critical (FinalizeParticleTrack) file_id = file_create(fname) - 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) + call write_attribute(file_id, 'filetype', 'track') + call write_attribute(file_id, 'version', VERSION_TRACK) + call write_attribute(file_id, 'n_particles', n_particle_tracks) + call write_attribute(file_id, 'n_coords', n_coords) do i = 1, n_particle_tracks call write_dataset(file_id, 'coordinates_' // trim(to_str(i)), & tracks(i)%coords) diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index a9584d672f..5fb4cb5b4d 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -9,8 +9,8 @@ module volume_calc use geometry, only: find_cell use global use hdf5_interface, only: file_create, file_close, write_attribute, & - create_group, close_group, write_dataset, write_attribute_string - use output, only: write_message, header + create_group, close_group, write_dataset + use output, only: write_message, header, time_stamp use message_passing use particle_header, only: Particle use random_lcg, only: prn, prn_set_stream, set_particle_seed @@ -426,14 +426,25 @@ contains ! Create HDF5 file file_id = file_create(filename) + ! Write header info + call write_attribute(file_id, "filetype", "volume") + call write_attribute(file_id, "version", VERSION_VOLUME) + call write_attribute(file_id, "openmc_version", VERSION) +#ifdef GIT_SHA1 + call write_attribute(file_id, "git_sha1", GIT_SHA1) +#endif + + ! Write current date and time + call write_attribute(file_id, "date_and_time", time_stamp()) + ! Write basic metadata select case (this % domain_type) case (FILTER_CELL) - call write_attribute_string(file_id, ".", "domain_type", "cell") + call write_attribute(file_id, "domain_type", "cell") case (FILTER_MATERIAL) - call write_attribute_string(file_id, ".", "domain_type", "material") + call write_attribute(file_id, "domain_type", "material") case (FILTER_UNIVERSE) - call write_attribute_string(file_id, ".", "domain_type", "universe") + call write_attribute(file_id, "domain_type", "universe") end select call write_attribute(file_id, "samples", this % samples) call write_attribute(file_id, "lower_left", this % lower_left) diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index e0a9864a07..5b548bca7c 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: 1.030000E+03 run mode: -k-eigenvalue +eigenvalue particle weight: 1.000000E+00 particle energy: From b4845f1474b13814f3ae0beedeb6177c6216e1ea Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 17 Feb 2017 15:21:42 -0600 Subject: [PATCH 38/66] Refactor openmc.Summary() class. Only store user IDs in summary/statepoint files --- openmc/mgxs/library.py | 54 +-- openmc/mgxs/mgxs.py | 10 +- openmc/statepoint.py | 30 +- openmc/summary.py | 377 ++++++------------ src/constants.F90 | 2 +- src/summary.F90 | 33 +- src/tally_filter.F90 | 55 ++- .../test_asymmetric_lattice.py | 5 +- tests/test_distribmat/test_distribmat.py | 3 +- tests/test_mg_convert/test_mg_convert.py | 1 - .../test_mgxs_library_ce_to_mg.py | 3 - .../test_mgxs_library_distribcell.py | 2 +- tests/test_multipole/test_multipole.py | 3 +- 13 files changed, 227 insertions(+), 351 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index f5342e844c..ac82ede1d3 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -31,7 +31,7 @@ class Library(object): Parameters ---------- - openmc_geometry : openmc.Geometry + geometry : openmc.Geometry A geometry which has been initialized with a root universe by_nuclide : bool If true, computes cross sections for each nuclide in each domain @@ -43,12 +43,8 @@ class Library(object): Attributes ---------- - openmc_geometry : openmc.Geometry + 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 @@ -100,12 +96,11 @@ class Library(object): """ - def __init__(self, openmc_geometry, by_nuclide=False, + def __init__(self, geometry, by_nuclide=False, mgxs_types=None, name=''): self._name = '' - self._openmc_geometry = None - self._opencg_geometry = None + self._geometry = None self._by_nuclide = None self._mgxs_types = [] self._domain_type = None @@ -126,7 +121,7 @@ class Library(object): self._estimator = None self.name = name - self.openmc_geometry = openmc_geometry + self.geometry = geometry self.by_nuclide = by_nuclide if mgxs_types is not None: @@ -139,8 +134,7 @@ class Library(object): if existing is None: clone = type(self).__new__(type(self)) clone._name = self.name - clone._openmc_geometry = self.openmc_geometry - clone._opencg_geometry = None + clone._geometry = self.geometry clone._by_nuclide = self.by_nuclide clone._mgxs_types = self.mgxs_types clone._domain_type = self.domain_type @@ -175,15 +169,8 @@ class Library(object): return existing @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 + def geometry(self): + return self._geometry @property def name(self): @@ -205,11 +192,11 @@ class Library(object): def domains(self): if self._domains == 'all': if self.domain_type == 'material': - return self.openmc_geometry.get_all_materials() + return self.geometry.get_all_materials() elif self.domain_type in ['cell', 'distribcell']: - return self.openmc_geometry.get_all_material_cells() + return self.geometry.get_all_material_cells() elif self.domain_type == 'universe': - return self.openmc_geometry.get_all_universes() + return self.geometry.get_all_universes() elif self.domain_type == 'mesh': raise ValueError('Unable to get domains for Mesh domain type') else: @@ -277,11 +264,10 @@ class Library(object): def sparse(self): return self._sparse - @openmc_geometry.setter - def openmc_geometry(self, openmc_geometry): - cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry) - self._openmc_geometry = openmc_geometry - self._opencg_geometry = None + @geometry.setter + def geometry(self, geometry): + cv.check_type('geometry', geometry, openmc.Geometry) + self._geometry = geometry @name.setter def name(self, name): @@ -330,13 +316,13 @@ 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() + all_domains = self.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() + all_domains = self.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() + all_domains = self.geometry.get_all_universes() elif self.domain_type == 'mesh': cv.check_iterable_type('domain', domains, openmc.Mesh) @@ -597,7 +583,7 @@ class Library(object): raise ValueError(msg) self._sp_filename = statepoint._f.filename - self._openmc_geometry = statepoint.summary.openmc_geometry + self._geometry = statepoint.summary.geometry self._nuclides = statepoint.summary.nuclides if statepoint.run_mode == 'k-eigenvalue': @@ -1352,7 +1338,7 @@ class Library(object): else: # Create a copy of the Geometry for these Macroscopics - geometry = copy.deepcopy(self.openmc_geometry) + geometry = copy.deepcopy(self.geometry) materials = openmc.Materials() # Get all Cells from the Geometry for differentiation diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7bbd257ca0..114c99a4a2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -904,12 +904,16 @@ class MGXS(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 + su = statepoint.summary if self.domain_type == 'cell' or self.domain_type == 'distribcell': - self.domain = statepoint.summary.get_cell_by_id(self.domain.id) + cells = {c.id: c for c in su.geometry.get_all_cells()} + self.domain = cells[self.domain.id] elif self.domain_type == 'universe': - self.domain = statepoint.summary.get_universe_by_id(self.domain.id) + universes = {u.id: u for u in su.geometry.get_all_universes()} + self.domain = universes[self.domain.id] elif self.domain_type == 'material': - self.domain = statepoint.summary.get_material_by_id(self.domain.id) + mats = {m.id: m for m in su.materials} + self.domain = mats[self.domain.id] elif self.domain_type == 'mesh': self.domain = statepoint.meshes[self.domain.id] else: diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 89eabdfd71..b8257f5197 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -136,9 +136,6 @@ class StatePoint(object): vol = openmc.VolumeCalculation.from_hdf5(path_i) self.add_volume_information(vol) - def close(self): - self._f.close() - @property def cmfd_on(self): return self._f['cmfd_on'].value > 0 @@ -490,7 +487,7 @@ class StatePoint(object): @property def version(self): - return self._f.attrs['version'] + return tuple(self._f.attrs['version']) @property def summary(self): @@ -692,38 +689,21 @@ class StatePoint(object): RuntimeWarning) return - if not isinstance(summary, openmc.summary.Summary): + if not isinstance(summary, openmc.Summary): msg = 'Unable to link statepoint with "{0}" which ' \ 'is not a Summary object'.format(summary) raise ValueError(msg) + cell_dict = {c.id: c for c in summary.geometry.get_all_cells()} + for tally_id, tally in self.tallies.items(): tally.name = summary.tally_names[tally_id] tally.with_summary = True for tally_filter in tally.filters: - if isinstance(tally_filter, (openmc.CellFilter, - openmc.DistribcellFilter)): - distribcell_ids = [] - for bin in tally_filter.bins: - distribcell_ids.append(summary.cells[bin].id) - tally_filter.bins = distribcell_ids - if isinstance(tally_filter, (openmc.DistribcellFilter)): cell_id = tally_filter.bins[0] - cell = summary.get_cell_by_id(cell_id) + cell = cell_dict[cell_id] tally_filter.distribcell_paths = cell.distribcell_paths - if isinstance(tally_filter, openmc.UniverseFilter): - universe_ids = [] - for bin in tally_filter.bins: - universe_ids.append(summary.universes[bin].id) - tally_filter.bins = universe_ids - - if isinstance(tally_filter, openmc.MaterialFilter): - material_ids = [] - for bin in tally_filter.bins: - material_ids.append(summary.materials[bin].id) - tally_filter.bins = material_ids - self._summary = summary diff --git a/openmc/summary.py b/openmc/summary.py index b219e2aafc..6563d4f27f 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -12,17 +12,23 @@ _VERSION_SUMMARY = 5 class Summary(object): - """Information summarizing the geometry, materials, and tallies used in a - simulation. + """Summary of 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. + date_and_time : str + Date and time when simulation began + geometry : openmc.Geometry + The geometry reconstructed from the summary file + materials : openmc.Materials + The materials reconstructed from the summary file + nuclides : dict + Dictionary whose keys are nuclide names and values are atomic weight + ratios. + tally_names : dict + Dictionary whose keys are tally IDs and values are tally names. + version: tuple of int + Version of OpenMC """ @@ -36,31 +42,28 @@ class Summary(object): self._f = h5py.File(filename, 'r') cv.check_filetype_version(self._f, 'summary', _VERSION_SUMMARY) - self._openmc_geometry = None - self._opencg_geometry = None + self._geometry = openmc.Geometry() + self._materials = openmc.Materials() - self._read_metadata() self._read_nuclides() self._read_geometry() self._read_tallies() - self._f.close() @property - def openmc_geometry(self): - return self._openmc_geometry + def date_and_time(self): + return self._f.attrs['date_and_time'] @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 + def geometry(self): + return self._geometry - def _read_metadata(self): - # Read OpenMC version - self.version = self._f.attrs['openmc_version'] - # Read date and time - self.date_and_time = self._f.attrs['date_and_time'] + @property + def materials(self): + return self._materials + + @property + def version(self): + return tuple(self._f.attrs['openmc_version']) def _read_nuclides(self): self.nuclides = {} @@ -69,33 +72,26 @@ class Summary(object): awrs = self._f['nuclides/awrs'].value for n in range(n_nuclides): name = names[n].decode() - name = name[:name.find('.')] self.nuclides[name] = awrs[n] def _read_geometry(self): # Read in and initialize the Materials and Geometry self._read_materials() - self._read_surfaces() - self._read_cells() - self._read_universes() - self._read_lattices() - self._finalize_geometry() + surfaces = self._read_surfaces() + cells, cell_fills = self._read_cells(surfaces) + universes = self._read_universes(cells, cell_fills) + lattices = self._read_lattices(universes) + self._finalize_geometry(cells, cell_fills, universes, lattices) def _read_materials(self): self.n_materials = self._f['n_materials'].value - # Initialize dictionary for each Material - # Keys - Material keys - # Values - Material objects - self.materials = {} - for key, group in self._f['materials'].items(): if key == 'n_materials': continue material_id = int(key.lstrip('material ')) - index = group['index'].value name = group['name'].value.decode() density = group['atom_density'].value nuc_densities = group['nuclide_densities'][...] @@ -127,26 +123,20 @@ class Summary(object): percent=density, percent_type='ao') # Add the Material to the global dictionary of all Materials - self.materials[index] = material + self.materials.append(material) def _read_surfaces(self): - self.n_surfaces = self._f['geometry/n_surfaces'].value + surfaces = {} - # Initialize dictionary for each Surface - # Keys - Surface keys - # Values - Surfacee objects - self.surfaces = {} - - for key in self._f['geometry/surfaces'].keys(): + for key, group in self._f['geometry/surfaces'].items(): if key == 'n_surfaces': continue surface_id = int(key.lstrip('surface ')) - index = self._f['geometry/surfaces'][key]['index'].value - 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'][...] + name = group['name'].value.decode() + surf_type = group['type'].value.decode() + bc = group['boundary_condition'].value.decode() + coeffs = group['coefficients'][...] # Create the Surface based on its type if surf_type == 'x-plane': @@ -212,42 +202,33 @@ class Summary(object): g, h, j, k, name) # Add Surface to global dictionary of all Surfaces - self.surfaces[index] = surface + surfaces[surface.id] = surface - def _read_cells(self): - self.n_cells = self._f['geometry/n_cells'].value + return surfaces - # Initialize dictionary for each Cell - # Keys - Cell keys - # Values - Cell objects - self.cells = {} + def _read_cells(self, surfaces): + cells = {} # Initialize dictionary for each Cell's fill - # (e.g., Material, Universe or Lattice ID) - # This dictionary is used later to link the fills with - # the corresponding objects - # Keys - Cell keys - # Values - Filling Material, Universe or Lattice ID - self._cell_fills = {} + cell_fills = {} - for key in self._f['geometry/cells'].keys(): + for key, group in self._f['geometry/cells'].items(): if key == 'n_cells': continue cell_id = int(key.lstrip('cell ')) - index = self._f['geometry/cells'][key]['index'].value - name = self._f['geometry/cells'][key]['name'].value.decode() - fill_type = self._f['geometry/cells'][key]['fill_type'].value.decode() + name = group['name'].value.decode() + fill_type = group['fill_type'].value.decode() if fill_type == 'normal': - fill = self._f['geometry/cells'][key]['material'].value + fill = group['material'].value elif fill_type == 'universe': - fill = self._f['geometry/cells'][key]['fill'].value + fill = group['fill'].value else: - fill = self._f['geometry/cells'][key]['lattice'].value + fill = group['lattice'].value - if 'region' in self._f['geometry/cells'][key].keys(): - region = self._f['geometry/cells'][key]['region'].value.decode() + if 'region' in group.keys(): + region = group['region'].value.decode() else: region = [] @@ -255,237 +236,220 @@ class Summary(object): cell = openmc.Cell(cell_id=cell_id, name=name) if fill_type == 'universe': - if 'offset' in self._f['geometry/cells'][key]: - offset = self._f['geometry/cells'][key]['offset'][...] + if 'offset' in group: + offset = group['offset'][...] cell.offsets = offset - if 'translation' in self._f['geometry/cells'][key]: - translation = \ - self._f['geometry/cells'][key]['translation'][...] + if 'translation' in group: + translation = group['translation'][...] translation = np.asarray(translation, dtype=np.float64) cell.translation = translation - if 'rotation' in self._f['geometry/cells'][key]: - rotation = \ - self._f['geometry/cells'][key]['rotation'][...] + if 'rotation' in group: + rotation = group['rotation'][...] rotation = np.asarray(rotation, dtype=np.int) cell._rotation = rotation elif fill_type == 'normal': - cell.temperature = \ - self._f['geometry/cells'][key]['temperature'][...] + cell.temperature = group['temperature'][...] # Store Cell fill information for after Universe/Lattice creation - self._cell_fills[index] = (fill_type, fill) + cell_fills[cell.id] = (fill_type, fill) # Generate Region object given infix expression if region: - cell.region = Region.from_expression( - region, {s.id: s for s in self.surfaces.values()}) + cell.region = Region.from_expression(region, surfaces) # Get the distribcell data - if 'distribcell_index' in self._f['geometry/cells'][key]: - ind = self._f['geometry/cells'][key]['distribcell_index'].value + if 'distribcell_index' in group: + ind = group['distribcell_index'].value cell.distribcell_index = ind - paths = self._f['geometry/cells'][key]['paths'][...] + paths = group['paths'][...] paths = [str(path.decode()) for path in paths] cell.distribcell_paths = paths # Add the Cell to the global dictionary of all Cells - self.cells[index] = cell + cells[cell.id] = cell - def _read_universes(self): - self.n_universes = self._f['geometry/n_universes'].value + return cells, cell_fills + def _read_universes(self, cells, cell_fills): # Initialize dictionary for each Universe # Keys - Universe keys # Values - Universe objects - self.universes = {} + universes = {} for key in self._f['geometry/universes'].keys(): if key == 'n_universes': continue universe_id = int(key.lstrip('universe ')) - index = self._f['geometry/universes'][key]['index'].value - cells = self._f['geometry/universes'][key]['cells'][...] + cell_ids = self._f['geometry/universes'][key]['cells'][...] # Create this Universe universe = openmc.Universe(universe_id=universe_id) # Add each Cell to the Universe - for cell_id in cells: - cell = self.cells[cell_id] - universe.add_cell(cell) + for cell_id in cell_ids: + universe.add_cell(cells[cell_id]) # Add the Universe to the global list of Universes - self.universes[index] = universe + universes[universe.id] = universe - def _read_lattices(self): - self.n_lattices = self._f['geometry/n_lattices'].value + return universes + def _read_lattices(self, universes): # Initialize lattices for each Lattice # Keys - Lattice keys # Values - Lattice objects - self.lattices = {} + lattices = {} - for key in self._f['geometry/lattices'].keys(): + for key, group in self._f['geometry/lattices'].items(): if key == 'n_lattices': continue lattice_id = int(key.lstrip('lattice ')) - 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() + name = group['name'].value.decode() + lattice_type = group['type'].value.decode() - if 'offsets' in self._f['geometry/lattices'][key]: - offsets = self._f['geometry/lattices'][key]['offsets'][...] + if 'offsets' in group: + offsets = group['offsets'][...] else: offsets = None if lattice_type == 'rectangular': - dimension = self._f['geometry/lattices'][key]['dimension'][...] - lower_left = \ - self._f['geometry/lattices'][key]['lower_left'][...] - pitch = self._f['geometry/lattices'][key]['pitch'][...] - outer = self._f['geometry/lattices'][key]['outer'].value - universe_ids = \ - self._f['geometry/lattices'][key]['universes'][...] + dimension = group['dimension'][...] + lower_left = group['lower_left'][...] + pitch = group['pitch'][...] + outer = group['outer'].value + universe_ids = group['universes'][...] # Create the Lattice lattice = openmc.RectLattice(lattice_id=lattice_id, name=name) lattice.lower_left = lower_left lattice.pitch = pitch - # If the Universe specified outer the Lattice is not void (-22) - if outer != -22: - lattice.outer = self.universes[outer] + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] # Build array of Universe pointers for the Lattice - universes = \ - np.empty(tuple(universe_ids.shape), dtype=openmc.Universe) + uarray = np.empty(universe_ids.shape, dtype=openmc.Universe) for z in range(universe_ids.shape[0]): for y in range(universe_ids.shape[1]): for x in range(universe_ids.shape[2]): - universes[z, y, x] = \ - self.get_universe_by_id(universe_ids[z, y, x]) + uarray[z, y, x] = universes[universe_ids[z, y, x]] # Use 2D NumPy array to store lattice universes for 2D lattices if len(dimension) == 2: - universes = np.squeeze(universes) - universes = np.atleast_2d(universes) + uarray = np.squeeze(uarray) + uarray = np.atleast_2d(uarray) # Set the universes for the lattice - lattice.universes = universes + lattice.universes = uarray # Set the distribcell offsets for the lattice if offsets is not None: lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices - self.lattices[index] = lattice + lattices[lattice.id] = lattice - if lattice_type == 'hexagonal': - n_rings = self._f['geometry/lattices'][key]['n_rings'].value - n_axial = self._f['geometry/lattices'][key]['n_axial'].value - center = self._f['geometry/lattices'][key]['center'][...] - pitch = self._f['geometry/lattices'][key]['pitch'][...] - outer = self._f['geometry/lattices'][key]['outer'].value + elif lattice_type == 'hexagonal': + n_rings = group['n_rings'].value + n_axial = group['n_axial'].value + center = group['center'][...] + pitch = group['pitch'][...] + outer = group['outer'].value - universe_ids = self._f[ - 'geometry/lattices'][key]['universes'][...] + universe_ids = group['universes'][...] # Create the Lattice lattice = openmc.HexLattice(lattice_id=lattice_id, name=name) lattice.center = center lattice.pitch = pitch - # If the Universe specified outer the Lattice is not void (-22) - if outer != -22: - lattice.outer = self.universes[outer] + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] # Build array of Universe pointers for the Lattice. Note that # we need to convert between the HDF5's square array of # (x, alpha, z) to the Python API's format of a ragged nested # list of (z, ring, theta). - universes = [] + uarray = [] for z in range(n_axial): # Add a list for this axial level. - universes.append([]) + uarray.append([]) x = n_rings - 1 a = 2*n_rings - 2 for r in range(n_rings - 1, 0, -1): # Add a list for this ring. - universes[-1].append([]) + uarray[-1].append([]) # Climb down the top-right. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x += 1 a -= 1 # Climb down the right. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) a -= 1 # Climb down the bottom-right. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x -= 1 # Climb up the bottom-left. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x -= 1 a += 1 # Climb up the left. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) a += 1 # Climb up the top-left. for i in range(r): - universes[-1][-1].append(universe_ids[z, a, x]) + uarray[-1][-1].append(universe_ids[z, a, x]) x += 1 # Move down to the next ring. a -= 1 # Convert the ids into Universe objects. - universes[-1][-1] = [self.get_universe_by_id(u_id) - for u_id in universes[-1][-1]] + uarray[-1][-1] = [universes[u_id] + for u_id in uarray[-1][-1]] # Handle the degenerate center ring separately. u_id = universe_ids[z, a, x] - universes[-1].append([self.get_universe_by_id(u_id)]) + uarray[-1].append([universes[u_id]]) # Add the universes to the lattice. if len(pitch) == 2: # Lattice is 3D - lattice.universes = universes + lattice.universes = uarray else: # Lattice is 2D; extract the only axial level - lattice.universes = universes[0] + lattice.universes = uarray[0] if offsets is not None: lattice.offsets = offsets # Add the Lattice to the global dictionary of all Lattices - self.lattices[index] = lattice + lattices[lattice.id] = lattice - def _finalize_geometry(self): - # Initialize Geometry object - self._openmc_geometry = openmc.Geometry() + return lattices + def _finalize_geometry(self, cells, cell_fills, universes, lattices): # Iterate over all Cells and add fill Materials, Universes and Lattices - for cell_key in self._cell_fills.keys(): - # Determine fill type ('normal', 'universe', or 'lattice') and ID - fill_type = self._cell_fills[cell_key][0] - fill_id = self._cell_fills[cell_key][1] - + for cell_id, (fill_type, fill_id) in cell_fills.items(): # Retrieve the object corresponding to the fill type and ID if fill_type == 'normal': if isinstance(fill_id, Iterable): @@ -497,16 +461,15 @@ class Summary(object): else: fill = None elif fill_type == 'universe': - fill = self.get_universe_by_id(fill_id) + fill = universes[fill_id] else: - fill = self.get_lattice_by_id(fill_id) + fill = lattices[fill_id] # Set the fill for the Cell - self.cells[cell_key].fill = fill + cells[cell_id].fill = fill # Set the root universe for the Geometry - root_universe = self.get_universe_by_id(0) - self.openmc_geometry.root_universe = root_universe + self.geometry.root_universe = universes[0] def _read_tallies(self): # Initialize a dictionary for the tally names @@ -542,7 +505,7 @@ class Summary(object): Results from a stochastic volume calculation """ - self.openmc_geometry.add_volume_information(volume_calc) + self.geometry.add_volume_information(volume_calc) def get_material_by_id(self, material_id): """Return a Material object given the material id @@ -559,92 +522,8 @@ class Summary(object): """ - for material in self.materials.values(): + for material in self.materials: if material.id == material_id: return material return None - - def get_surface_by_id(self, surface_id): - """Return a Surface object given the surface id - - Parameters - ---------- - id : int - Unique identifier for the surface - - Returns - ------- - surface : openmc.Surface - Surface with given id - - """ - - for surface in self.surfaces.values(): - if surface.id == surface_id: - return surface - - return None - - def get_cell_by_id(self, cell_id): - """Return a Cell object given the cell id - - Parameters - ---------- - id : int - Unique identifier for the cell - - Returns - ------- - cell : openmc.Cell - Cell with given id - - """ - - for cell in self.cells.values(): - if cell.id == cell_id: - return cell - - return None - - def get_universe_by_id(self, universe_id): - """Return a Universe object given the universe id - - Parameters - ---------- - id : int - Unique identifier for the universe - - Returns - ------- - universe : openmc.Universe - Universe with given id - - """ - - for universe in self.universes.values(): - if universe.id == universe_id: - return universe - - return None - - def get_lattice_by_id(self, lattice_id): - """Return a Lattice object given the lattice id - - Parameters - ---------- - id : int - Unique identifier for the lattice - - Returns - ------- - lattice : openmc.Lattice - Lattice with given id - - """ - - for lattice in self.lattices.values(): - if lattice.id == lattice_id: - return lattice - - return None diff --git a/src/constants.F90 b/src/constants.F90 index 7f3cf87f83..d1095d786b 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -144,7 +144,7 @@ module constants SURF_CONE_Z = 11 ! Cone parallel to z-axis ! Flag to say that the outside of a lattice is not defined - integer, parameter :: NO_OUTER_UNIVERSE = -22 + integer, parameter :: NO_OUTER_UNIVERSE = -1 ! Maximum number of lost particles integer, parameter :: MAX_LOST_PARTICLES = 10 diff --git a/src/summary.F90 b/src/summary.F90 index 10b26d0e0c..638d232704 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -116,9 +116,10 @@ contains subroutine write_geometry(file_id) integer(HID_T), intent(in) :: file_id - integer :: i, j, k, m, offset + integer :: i, j, k, m, offset integer, allocatable :: lattice_universes(:,:,:) integer, allocatable :: cell_materials(:) + integer, allocatable :: cell_ids(:) real(8), allocatable :: cell_temperatures(:) integer(HID_T) :: geom_group integer(HID_T) :: cells_group, cell_group @@ -152,9 +153,6 @@ contains c => cells(i) cell_group = create_group(cells_group, "cell " // trim(to_str(c%id))) - ! Write internal OpenMC index for this cell - call write_dataset(cell_group, "index", i) - ! Write name for this cell call write_dataset(cell_group, "name", c%name) @@ -267,9 +265,6 @@ contains surface_group = create_group(surfaces_group, "surface " // & trim(to_str(s%id))) - ! Write internal OpenMC index for this surface - call write_dataset(surface_group, "index", i) - ! Write name for this surface call write_dataset(surface_group, "name", s%name) @@ -368,11 +363,15 @@ contains univ_group = create_group(universes_group, "universe " // & trim(to_str(u%id))) - ! Write internal OpenMC index for this universe - call write_dataset(univ_group, "index", i) - ! Write list of cells in this universe - if (u%n_cells > 0) call write_dataset(univ_group, "cells", u%cells) + if (u % n_cells > 0) then + allocate(cell_ids(u % n_cells)) + do j = 1, u % n_cells + cell_ids(j) = cells(u % cells(j)) % id + end do + call write_dataset(univ_group, "cells", cell_ids) + deallocate(cell_ids) + end if call close_group(univ_group) end do UNIVERSE_LOOP @@ -390,13 +389,14 @@ contains lat => lattices(i)%obj lattice_group = create_group(lattices_group, "lattice " // trim(to_str(lat%id))) - ! Write internal OpenMC index for this lattice - call write_dataset(lattice_group, "index", i) - ! 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) + if (lat % outer > 0) then + call write_dataset(lattice_group, "outer", universes(lat % outer) % id) + else + call write_dataset(lattice_group, "outer", lat % outer) + end if ! Write distribcell offsets if present if (allocated(lat%offset)) then @@ -506,9 +506,6 @@ contains call write_attribute(material_group, "depletable", 0) end if - ! Write internal OpenMC index for this material - call write_dataset(material_group, "index", i) - ! Write name for this material call write_dataset(material_group, "name", m % name) diff --git a/src/tally_filter.F90 b/src/tally_filter.F90 index 4b372defe0..a7b0fc46ae 100644 --- a/src/tally_filter.F90 +++ b/src/tally_filter.F90 @@ -501,9 +501,17 @@ contains class(UniverseFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: universe_ids(:) + call write_dataset(filter_group, "type", "universe") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % universes ) + + allocate(universe_ids(size(this % universes))) + do i = 1, size(this % universes) + universe_ids(i) = universes(this % universes(i)) % id + end do + call write_dataset(filter_group, "bins", universe_ids) end subroutine to_statepoint_universe subroutine initialize_universe(this) @@ -562,9 +570,17 @@ contains class(MaterialFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: material_ids(:) + call write_dataset(filter_group, "type", "material") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % materials ) + + allocate(material_ids(size(this % materials))) + do i = 1, size(this % materials) + material_ids(i) = materials(this % materials(i)) % id + end do + call write_dataset(filter_group, "bins", material_ids) end subroutine to_statepoint_material subroutine initialize_material(this) @@ -639,9 +655,17 @@ contains class(CellFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: cell_ids(:) + call write_dataset(filter_group, "type", "cell") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % cells ) + + allocate(cell_ids(size(this % cells))) + do i = 1, size(this % cells) + cell_ids(i) = cells(this % cells(i)) % id + end do + call write_dataset(filter_group, "bins", cell_ids) end subroutine to_statepoint_cell subroutine initialize_cell(this) @@ -725,7 +749,7 @@ contains call write_dataset(filter_group, "type", "distribcell") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % cell ) + call write_dataset(filter_group, "bins", cells(this % cell) % id) end subroutine to_statepoint_distribcell subroutine initialize_distribcell(this) @@ -784,9 +808,16 @@ contains class(CellbornFilter), intent(in) :: this integer(HID_T), intent(in) :: filter_group + integer :: i + integer, allocatable :: cell_ids(:) + call write_dataset(filter_group, "type", "cellborn") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % cells ) + allocate(cell_ids(size(this % cells))) + do i = 1, size(this % cells) + cell_ids(i) = cells(this % cells(i)) % id + end do + call write_dataset(filter_group, "bins", cell_ids) end subroutine to_statepoint_cellborn subroutine initialize_cellborn(this) @@ -852,7 +883,7 @@ contains call write_dataset(filter_group, "type", "surface") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % surfaces ) + call write_dataset(filter_group, "bins", this % surfaces) end subroutine to_statepoint_surface subroutine initialize_surface(this) @@ -941,7 +972,7 @@ contains call write_dataset(filter_group, "type", "energy") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_energy function text_label_energy(this, bin) result(label) @@ -1006,7 +1037,7 @@ contains call write_dataset(filter_group, "type", "energyout") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_energyout function text_label_energyout(this, bin) result(label) @@ -1048,7 +1079,7 @@ contains call write_dataset(filter_group, "type", "delayedgroup") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % groups ) + call write_dataset(filter_group, "bins", this % groups) end subroutine to_statepoint_dg function text_label_dg(this, bin) result(label) @@ -1097,7 +1128,7 @@ contains call write_dataset(filter_group, "type", "mu") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_mu function text_label_mu(this, bin) result(label) @@ -1160,7 +1191,7 @@ contains call write_dataset(filter_group, "type", "polar") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_polar function text_label_polar(this, bin) result(label) @@ -1223,7 +1254,7 @@ contains call write_dataset(filter_group, "type", "azimuthal") call write_dataset(filter_group, "n_bins", this % n_bins) - call write_dataset(filter_group, "bins", this % bins ) + call write_dataset(filter_group, "bins", this % bins) end subroutine to_statepoint_azimuthal function text_label_azimuthal(this, bin) result(label) diff --git a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py index 45d392ad07..55f4b48525 100644 --- a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py +++ b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py @@ -89,8 +89,9 @@ class AsymmetricLatticeTestHarness(PyAPITestHarness): outstr += '\n'.join(map('{:.8e}'.format, tally.std_dev.flatten())) + '\n' # Extract fuel assembly lattices from the summary - core = sp.summary.get_cell_by_id(1) - fuel = sp.summary.get_cell_by_id(80) + cell_dict = {c.id: c for c in sp.summary.geometry.get_all_cells()} + core = cell_dict[1] + fuel = cell_dict[80] fuel = fuel.fill core = core.fill diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index ec19176c49..ad7fe09f04 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -116,7 +116,8 @@ class DistribmatTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(DistribmatTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - outstr += str(su.get_cell_by_id(11)) + cells = {c.id: c for c in su.geometry.get_all_cells()} + outstr += str(cells[11]) return outstr def _cleanup(self): diff --git a/tests/test_mg_convert/test_mg_convert.py b/tests/test_mg_convert/test_mg_convert.py index f4cd90e713..d8a9665d8f 100755 --- a/tests/test_mg_convert/test_mg_convert.py +++ b/tests/test_mg_convert/test_mg_convert.py @@ -153,7 +153,6 @@ class MGXSTestHarness(PyAPITestHarness): outstr += 'k-combined:\n' form = '{0:12.6E} {1:12.6E}\n' outstr += form.format(sp.k_combined[0], sp.k_combined[1]) - sp.close() return outstr diff --git a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py index dbc2e0916c..f9f9a75097 100644 --- a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py +++ b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py @@ -71,9 +71,6 @@ class MGXSTestHarness(PyAPITestHarness): if os.path.exists('./tallies.xml'): os.remove('./tallies.xml') - # Close the statepoint to allow writing - sp.close() - # Re-run MG mode. if self._opts.mpi_exec is not None: mpi_args = [self._opts.mpi_exec, '-n', self._opts.mpi_np] diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index 277e8583e3..a86b998b83 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -34,7 +34,7 @@ class MGXSTestHarness(PyAPITestHarness): self.mgxs_lib.num_delayed_groups = 6 self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'distribcell' - cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() + cells = self.mgxs_lib.geometry.get_all_material_cells() self.mgxs_lib.domains = [c for c in cells if c.name == 'fuel'] self.mgxs_lib.build_library() diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 32b38dd76e..97ad249561 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -107,7 +107,8 @@ class MultipoleTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(MultipoleTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - outstr += str(su.get_cell_by_id(11)) + cells = {c.id: c for c in su.geometry.get_all_cells()} + outstr += str(cells[11]) return outstr def _cleanup(self): From 71b49aace8107fc618cccbcc757c358086181814 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 09:03:50 -0600 Subject: [PATCH 39/66] Rewrite documentation for summary and statepoint files. Continue making a few changes. --- docs/source/io_formats/statepoint.rst | 532 +++++++++----------------- docs/source/io_formats/summary.rst | 384 +++++++------------ openmc/statepoint.py | 100 ++--- openmc/summary.py | 57 +-- src/state_point.F90 | 50 +-- src/summary.F90 | 45 +-- 6 files changed, 380 insertions(+), 788 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index a93e2f26d1..63ca703003 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -4,358 +4,180 @@ State Point File Format ======================= -The current revision of the statepoint file format is 15. - -**/filetype** (*char[]*) - - String indicating the type of file. - -**/revision** (*int*) - - Revision of the state point 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 - -**/git_sha1** (*char[40]*) - - Git commit SHA-1 hash - -**/date_and_time** (*char[]*) - - Date and time the state point was written. - -**/path** (*char[]*) - - Absolute path to directory containing input files. - -**/seed** (*int8_t*) - - Pseudo-random number generator seed. - -**/run_CE** (*int*) - - Flag to denote continuous-energy or multi-group mode. A value of 1 - indicates a continuous-energy run while a value of 0 indicates a - multi-group run. - -**/run_mode** (*char[]*) - - Run mode used. A value of 1 indicates a fixed-source run and a value of 2 - indicates an eigenvalue run. - -**/n_particles** (*int8_t*) - - Number of particles used per generation. - -**/n_batches** (*int*) - - Number of batches to simulate. - -**/current_batch** (*int*) - - The number of batches already simulated. - -if run_mode == 'k-eigenvalue': - - **/n_inactive** (*int*) - - Number of inactive batches. - - **/gen_per_batch** (*int*) - - Number of generations per batch. - - **/k_generation** (*double[]*) - - k-effective for each generation simulated. - - **/entropy** (*double[]*) - - Shannon entropy for each generation simulated - - **/k_col_abs** (*double*) - - Sum of product of collision/absorption estimates of k-effective - - **/k_col_tra** (*double*) - - Sum of product of collision/track-length estimates of k-effective - - **/k_abs_tra** (*double*) - - Sum of product of absorption/track-length estimates of k-effective - - **/k_combined** (*double[2]*) - - Mean and standard deviation of a combined estimate of k-effective - - **/cmfd_on** (*int*) - - Flag indicating whether CMFD is on (1) or off (0). - - if (cmfd_on) - - **/cmfd/indices** (*int[4]*) - - Indices for cmfd mesh (i,j,k,g) - - **/cmfd/k_cmfd** (*double[]*) - - CMFD eigenvalues - - **/cmfd/cmfd_src** (*double[][][][]*) - - CMFD fission source - - **/cmfd/cmfd_entropy** (*double[]*) - - CMFD estimate of Shannon entropy - - **/cmfd/cmfd_balance** (*double[]*) - - RMS of the residual neutron balance equation on CMFD mesh - - **/cmfd/cmfd_dominance** (*double[]*) - - CMFD estimate of dominance ratio - - **/cmfd/cmfd_srccmp** (*double[]*) - - RMS comparison of difference between OpenMC and CMFD fission source - -**/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. - -**/tallies/meshes/mesh /type** (*char[]*) - - Type of mesh. - -**/tallies/meshes/mesh /dimension** (*int*) - - Number of mesh cells in each dimension. - -**/tallies/meshes/mesh /lower_left** (*double[]*) - - Coordinates of lower-left corner of mesh. - -**/tallies/meshes/mesh /upper_right** (*double[]*) - - Coordinates of upper-right corner of mesh. - -**/tallies/meshes/mesh /width** (*double[]*) - - Width of each mesh cell in each dimension. - -**/tallies/derivatives/derivative /independent variable** (*char[]*) - - Independent variable of tally derivative - -**/tallies/derivatives/derivative /material** (*int*) - - ID of the perturbed material - -**/tallies/derivatives/derivative /nuclide** (*char[]*) - - Alias of the perturbed nuclide - -**/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. - -**/tallies/tally /estimator** (*char[]*) - - Type of tally estimator, either 'analog', 'tracklength', or 'collision'. - -**/tallies/tally /n_realizations** (*int*) - - Number of realizations. - -**/tallies/tally /n_filters** (*int*) - - Number of filters used. - -**/tallies/tally /filter /type** (*char[]*) - - Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn', - 'surface', 'mesh', 'energy', 'energyout', 'distribcell', 'mu', 'polar', - 'azimuthal', 'delayedgroup', or 'energyfunction'. - -**/tallies/tally /filter /n_bins** (*int*) - - Number of bins for the j-th filter. Not present for 'energyfunction' - filters. - -**/tallies/tally /filter /bins** (*int[]* or *double[]*) - - Value for each filter bin of this type. Not present for 'energyfunction' - filters. - -**/tallies/tally /filter /energy** (*double[]*) - - Energy grid points for energyfunction interpolation. Only used for - 'energyfunction' filters. - -**/tallies/tally /filter /y** (*double[]*) - - Interpolant values for energyfunction interpolation. Only used for - 'energyfunction' filters. - -**/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 /derivative** (*int*) - - ID of the derivative applied to the tally. - -**/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[][]*) - - Values of specified scores. - -**/tallies/tally /n_user_scores** (*int*) - - Number of scores without accounting for those added by expansions, - e.g. scatter-PN. - -**/tallies/tally /moment_orders** (*char[][]*) - - Tallying moment orders for Legendre and spherical harmonic tally expansions - (*e.g.*, 'P2', 'Y1,2', etc.). - -**/tallies/tally /results** (*double[][][2]*) - - Accumulated sum and sum-of-squares for each bin of the i-th tally. The first - dimension represents combinations of filter bins, the second dimensions - represents scoring bins, and the third dimension has two entries for the sum - and the sum-of-squares. - -**/source_present** (*int*) - - Flag indicated if source bank is present in the file - -**/n_realizations** (*int*) - - Number of realizations for global tallies. - -**/n_global_tallies** (*int*) - - Number of global tally scores. - -**/global_tallies** (Compound type) - - Accumulated sum and sum-of-squares for each global tally. The compound type - has fields named ``sum`` and ``sum_sq``. - -**/tallies_present** (*int*) - - Flag indicated if tallies are present in the file. - -if (run_mode == 'k-eigenvalue' and source_present > 0) - - **/source_bank** (Compound type) - - Source bank information for each particle. The compound type has fields - ``wgt``, ``xyz``, ``uvw``, ``E``, ``g``, and ``delayed_group``, which - represent the weight, position, direction, energy, energy group, and - delayed_group of the source particle, respectively. - -**/runtime/total initialization** (*double*) - - Time (in seconds on the master process) spent reading inputs, allocating - arrays, etc. - -**/runtime/reading cross sections** (*double*) - - Time (in seconds on the master process) spent loading cross section - libraries (this is a subset of initialization). - -**/runtime/simulation** (*double*) - - Time (in seconds on the master process) spent between initialization and - finalization. - -**/runtime/transport** (*double*) - - Time (in seconds on the master process) spent transporting particles. - -**/runtime/inactive batches** (*double*) - - Time (in seconds on the master process) spent in the inactive batches - (including non-transport activities like communcating sites). - -**/runtime/active batches** (*double*) - - Time (in seconds on the master process) spent in the active batches - (including non-transport activities like communicating sites). - -**/runtime/synchronizing fission bank** (*double*) - - Time (in seconds on the master process) spent sampling source particles - from fission sites and communicating them to other processes for load - balancing. - -**/runtime/sampling source sites** (*double*) - - Time (in seconds on the master process) spent sampling source particles - from fission sites. - -**/runtime/SEND-RECV source sites** (*double*) - - Time (in seconds on the master process) spent communicating source sites - between processes for load balancing. - -**/runtime/accumulating tallies** (*double*) - - Time (in seconds on the master process) spent communicating tally results - and evaluating their statistics. - -**/runtime/CMFD** (*double*) - - Time (in seconds on the master process) spent evaluating CMFD. - -**/runtime/CMFD building matrices** (*double*) - - Time (in seconds on the master process) spent buliding CMFD matrices. - -**/runtime/CMFD solving matrices** (*double*) - - Time (in seconds on the master process) spent solving CMFD matrices. - -**/runtime/total** (*double*) - - Total time spent (in seconds on the master process) in the program. +The current revision of the statepoint file format is 16.0. + +**/** + +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the + statepoint file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + - **path** (*char[]*) -- Path to directory containing input files. + - **cmfd_on** (*int*) -- Flag indicating whether CMFD is on (1) or + off (0). + - **tallies_present** (*int*) -- Flag indicating if tallies are + present in the file. + - **source_present** (*int*) -- Flag indicating if source bank is + present in the file. + +:Datasets: - **seed** (*int8_t*) -- Pseudo-random number generator seed. + - **energy_mode** (*char[]*) -- Energy mode of the run, either + 'continuous-energy' or 'multi-group'. + - **run_mode** (*char[]*) -- Run mode used, either 'eigenvalue' or + 'fixed source'. + - **n_particles** (*int8_t*) -- Number of particles used per generation. + - **n_batches** (*int*) -- Number of batches to simulate. + - **current_batch** (*int*) -- The number of batches already simulated. + - **n_inactive** (*int*) -- Number of inactive batches. Only present + when `run_mode` is 'eigenvalue'. + - **gen_per_batch** (*int*) -- Number of generations per batch. Only + present when `run_mode` is 'eigenvalue'. + - **k_generation** (*double[]*) -- k-effective for each generation + simulated. + - **entropy** (*double[]*) -- Shannon entropy for each generation + simulated. + - **k_col_abs** (*double*) -- Sum of product of collision/absorption + estimates of k-effective. + - **k_col_tra** (*double*) -- Sum of product of + collision/track-length estimates of k-effective. + - **k_abs_tra** (*double*) -- Sum of product of + absorption/track-length estimates of k-effective. + - **k_combined** (*double[2]*) -- Mean and standard deviation of a + combined estimate of k-effective. + - **n_realizations** (*int*) -- Number of realizations for global + tallies. + - **global_tallies** (*double[][2]*) -- Accumulated sum and + sum-of-squares for each global tally. + - **source_bank** (Compound type) -- Source bank information for each + particle. The compound type has fields ``wgt``, ``xyz``, ``uvw``, + ``E``, ``g``, and ``delayed_group``, which represent the weight, + position, direction, energy, energy group, and delayed_group of the + source particle, respectively. Only present when `run_mode` is + 'eigenvalue'. + +**/cmfd/** + +:Datasets: - **indices** (*int[4]*) -- Indices for cmfd mesh (i,j,k,g) + - **k_cmfd** (*double[]*) -- CMFD eigenvalues + - **cmfd_src** (*double[][][][]*) -- CMFD fission source + - **cmfd_entropy** (*double[]*) -- CMFD estimate of Shannon entropy + - **cmfd_balance** (*double[]*) -- RMS of the residual neutron + balance equation on CMFD mesh + - **cmfd_dominance** (*double[]*) -- CMFD estimate of dominance ratio + - **cmfd_srccmp** (*double[]*) -- RMS comparison of difference + between OpenMC and CMFD fission source + +**/tallies/** + +:Attributes: - **n_tallies** (*int*) -- Number of user-defined tallies. + +:Datasets: - **ids** (*int[]*) -- Internal unique ID of each tally. + - **keys** (*int[]*) -- User-defined unique ID of each tally. + +**/tallies/meshes/** + +:Attributes: - **n_meshes** (*int*) -- Number of meshes in the problem. + +:Datasets: - **ids** (*int[]*) -- Internal unique ID of each mesh. + - **keys** (*int[]*) -- User-identified unique ID of each mesh. + +**/tallies/meshes/mesh /** + +:Datasets: - **type** (*char[]*) -- Type of mesh. + - **dimension** (*int*) -- Number of mesh cells in each dimension. + - **lower_left** (*double[]*) -- Coordinates of lower-left corner of + mesh. + - **upper_right** (*double[]*) -- Coordinates of upper-right corner + of mesh. + - **width** (*double[]*) -- Width of each mesh cell in each + dimension. + +**/tallies/derivatives/derivative /** + +:Datasets: - **independent variable** (*char[]*) -- Independent variable of + tally derivative. + - **material** (*int*) -- ID of the perturbed material. + - **nuclide** (*char[]*) -- Alias of the perturbed nuclide. + - **estimator** (*char[]*) -- Type of tally estimator, either + 'analog', 'tracklength', or 'collision'. + +**/tallies/tally /** + +:Datasets: - **n_realizations** (*int*) -- Number of realizations. + - **n_filters** (*int*) -- Number of filters used. + - **nuclides** (*char[][]*) -- Array of nuclides to tally. Note that + if no nuclide is specified in the user input, a single 'total' + nuclide appears here. + - **derivative** (*int*) -- ID of the derivative applied to the + 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. + - **score_bins** (*char[][]*) -- Values of specified scores. + - **n_user_scores** (*int*) -- Number of scores without accounting + for those added by expansions, e.g. scatter-PN. + - **moment_orders** (*char[][]*) -- Tallying moment orders for + Legendre and spherical harmonic tally expansions (e.g., 'P2', + 'Y1,2', etc.). + - **results** (*double[][][2]*) -- Accumulated sum and sum-of-squares + for each bin of the i-th tally. The first dimension represents + combinations of filter bins, the second dimensions represents + scoring bins, and the third dimension has two entries for the sum + and the sum-of-squares. + +**/tallies/tally /filter /** + +:Datasets: - **type** (*char[]*) -- Type of the j-th filter. Can be 'universe', + 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy', + 'energyout', 'distribcell', 'mu', 'polar', 'azimuthal', + 'delayedgroup', or 'energyfunction'. + - **n_bins** (*int*) -- Number of bins for the j-th filter. Not + present for 'energyfunction' filters. + - **bins** (*int[]* or *double[]*) -- Value for each filter bin of + this type. Not present for 'energyfunction' filters. + - **energy** (*double[]*) -- Energy grid points for energyfunction + interpolation. Only used for 'energyfunction' filters. + - **y** (*double[]*) -- Interpolant values for energyfunction + interpolation. Only used for 'energyfunction' filters. + +**/runtime/** + +:Datasets: - **total initialization** (*double*) -- Time (in seconds on the + master process) spent reading inputs, allocating arrays, etc. + - **reading cross sections** (*double*) -- Time (in seconds on the + master process) spent loading cross section libraries (this is a + subset of initialization). + - **simulation** (*double*) -- Time (in seconds on the master + process) spent between initialization and finalization. + - **transport** (*double*) -- Time (in seconds on the master process) + spent transporting particles. + - **inactive batches** (*double*) -- Time (in seconds on the master + process) spent in the inactive batches (including non-transport + activities like communcating sites). + - **active batches** (*double*) -- Time (in seconds on the master + process) spent in the active batches (including non-transport + activities like communicating sites). + - **synchronizing fission bank** (*double*) -- Time (in seconds on + the master process) spent sampling source particles from fission + sites and communicating them to other processes for load balancing. + - **sampling source sites** (*double*) -- Time (in seconds on the + master process) spent sampling source particles from fission sites. + - **SEND-RECV source sites** (*double*) -- Time (in seconds on the + master process) spent communicating source sites between processes + for load balancing. + - **accumulating tallies** (*double*) -- Time (in seconds on the + master process) spent communicating tally results and evaluating + their statistics. + - **CMFD** (*double*) -- Time (in seconds on the master process) + spent evaluating CMFD. + - **CMFD building matrices** (*double*) -- Time (in seconds on the + master process) spent buliding CMFD matrices. + - **CMFD solving matrices** (*double*) -- Time (in seconds on the + master process) spent solving CMFD matrices. + - **total** (*double*) -- Total time spent (in seconds on the master + process) in the program. diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 3084c27383..28aca93498 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -4,259 +4,131 @@ Summary File Format =================== -The current revision of the summary file format is 4. - -**/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 - -**/git_sha1** (*char[40]*) - - Git commit SHA-1 hash - -**/date_and_time** (*char[]*) - - Date and time the summary 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. - -**/n_inactive** (*int*) - - Number of inactive batches. Only present if /run_mode is set to - 'k-eigenvalue'. - -**/n_active** (*int*) - - Number of active batches. Only present if /run_mode is set to - 'k-eigenvalue'. - -**/gen_per_batch** (*int*) - - 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*) - - Number of lattices in the problem. - -**/geometry/cells/cell /index** (*int*) - - Index in cells array used internally in OpenMC. - -**/geometry/cells/cell /name** (*char[]*) - - Name of the cell. - -**/geometry/cells/cell /universe** (*int*) - - Universe assigned to the cell. If none is specified, the default - universe (0) is assigned. - -**/geometry/cells/cell /fill_type** (*char[]*) - - Type of fill for the cell. Can be 'normal', 'universe', or 'lattice'. - -**/geometry/cells/cell /material** (*int* or *int[]*) - - Unique ID of the material(s) assigned to the cell. This dataset is present - only if fill_type is set to 'normal'. The value '-1' signifies void - material. The data is an array if the cell uses distributed materials, - otherwise it is a scalar. - -**/geometry/cells/cell /temperature** (*double[]*) - - Temperature of the cell in Kelvin. - -**/geometry/cells/cell /offset** (*int[]*) - - Offsets used for distribcell tally filter. 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 /rotation** (*double[3]*) - - 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/cells/cell /lattice** (*int*) - - Unique ID of the lattice which fills the cell. Only present if fill_type is - set to 'lattice'. - -**/geometry/cells/cell /region** (*char[]*) - - Region specification for the cell. - -**/geometry/cells/cell /distribcell_index** (*int*) - - Index of this cell in distribcell arrays. Only present if this cell is - listed in a distribcell filter or if it uses distributed materials. - -**/geometry/cells/cell /paths** (*char[][]*) - - The paths traversed through the CSG tree to reach each distribcell - instance. This consists of the integer IDs for each universe, cell and - lattice delimited by '->'. Each lattice cell is specified by its (x,y) or - (x,y,z) indices. Only present if this cell is listed in a distribcell filter - or if it uses distributed materials. - -**/geometry/surfaces/surface /index** (*int*) - - Index in surfaces array used internally in OpenMC. - -**/geometry/surfaces/surface /name** (*char[]*) - - Name of the surface. - -**/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', 'z-cone', or - 'quadric'. - -**/geometry/surfaces/surface /coefficients** (*double[]*) - - Array of coefficients that define the surface. See :ref:`surface_element` - for what coefficients are defined for each surface type. - -**/geometry/surfaces/surface /boundary_condition** (*char[]*) - - Boundary condition applied to the surface. Can be 'transmission', 'vacuum', - 'reflective', or 'periodic'. - -**/geometry/universes/universe /index** (*int*) - - Index in the universes array used internally in OpenMC. - -**/geometry/universes/universe /cells** (*int[]*) - - Array of unique IDs of cells that appear in the universe. - -**/geometry/lattices/lattice /index** (*int*) - - Index in the lattices array used internally in OpenMC. - -**/geometry/lattices/lattice /name** (*char[]*) - - 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 /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*) - - Number of materials in the problem. - -**/materials/material /index** (*int*) - - Index in materials array used internally in OpenMC. - -**/materials/material /name** (*char[]*) - - Name of the material. - -**/materials/material /atom_density** (*double[]*) - - Total atom density of the material in atom/b-cm. - -**/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/tally /name** (*char[]*) - - Name of the tally. +The current version of the summary file format is 5.0. + +**/** + +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the summary + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + +**/geometry/** + +:Attributes: - **n_cells** (*int*) -- Number of cells in the problem. + - **n_surfaces** (*int*) -- Number of surfaces in the problem. + - **n_universes** (*int*) -- Number of unique universes in the + problem. + - **n_lattices** (*int*) -- Number of lattices in the problem. + +**/geometry/cells/cell /** + +:Datasets: - **name** (*char[]*) -- Name of the cell. + - **universe** (*int*) -- Universe assigned to the cell. If none is + specified, the default universe (0) is assigned. + - **fill_type** (*char[]*) -- Type of fill for the cell. Can be + 'normal', 'universe', or 'lattice'. + - **material** (*int* or *int[]*) -- Unique ID of the material(s) + assigned to the cell. This dataset is present only if fill_type is + set to 'normal'. The value '-1' signifies void material. The data + is an array if the cell uses distributed materials, otherwise it is + a scalar. + - **temperature** (*double[]*) -- Temperature of the cell in Kelvin. + - **offset** (*int[]*) -- Offsets used for distribcell tally + filter. This dataset is present only if fill_type is set to + 'universe'. + - **translation** (*double[3]*) -- Translation applied to the fill + universe. This dataset is present only if fill_type is set to + 'universe'. + - **rotation** (*double[3]*) -- 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'. + - **lattice** (*int*) -- Unique ID of the lattice which fills the + cell. Only present if fill_type is set to 'lattice'. + - **region** (*char[]*) -- Region specification for the cell. + - **distribcell_index** (*int*) -- Index of this cell in distribcell + arrays. Only present if this cell is listed in a distribcell filter + or if it uses distributed materials. + - **paths** (*char[][]*) -- The paths traversed through the CSG tree + to reach each distribcell instance. This consists of the integer + IDs for each universe, cell and lattice delimited by '->'. Each + lattice cell is specified by its (x,y) or (x,y,z) indices. Only + present if this cell is listed in a distribcell filter or if it + uses distributed materials. + +**/geometry/surfaces/surface /** + +:Datasets: - **name** (*char[]*) -- Name of the surface. + - **type** (*char[]*) -- Type of the surface. Can be 'x-plane', + 'y-plane', 'z-plane', 'plane', 'x-cylinder', 'y-cylinder', + 'z-cylinder', 'sphere', 'x-cone', 'y-cone', 'z-cone', or 'quadric'. + - **coefficients** (*double[]*) -- Array of coefficients that define + the surface. See :ref:`surface_element` for what coefficients are + defined for each surface type. + - **boundary_condition** (*char[]*) -- Boundary condition applied to + the surface. Can be 'transmission', 'vacuum', 'reflective', or + 'periodic'. + +**/geometry/universes/universe /** + +:Datasets: + - **cells** (*int[]*) -- Array of unique IDs of cells that appear in + the universe. + +**/geometry/lattices/lattice /** + +:Datasets: - **name** (*char[]*) -- Name of the lattice. + - **type** (*char[]*) -- Type of the lattice, either 'rectangular' or + 'hexagonal'. + - **pitch** (*double[]*) -- Pitch of the lattice in centimeters. + - **outer** (*int*) -- Outer universe assigned to lattice cells + outside the defined range. + - **offsets** (*int[]*) -- Offsets used for distribcell tally filter. + - **universes** (*int[][][]*) -- Three-dimensional array of universes + assigned to each cell of the lattice. + - **dimension** (*int[]*) -- The number of lattice cells in each + direction. This dataset is present only when the 'type' dataset is + set to 'rectangular'. + - **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'. + - **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'. + - **n_axial** (*int*) -- Number of lattice positions along the + z-axis. This dataset is present only when the 'type' dataset is set + to 'hexagonal'. + - **center** (*double[]*) -- Coordinates of the center of the + lattice. This dataset is present only when the 'type' dataset is + set to 'hexagonal'. + +**/materials/** + +:Attributes: - **n_materials** (*int*) -- Number of materials in the problem. + + +**/materials/material /** + +:Datasets: - **name** (*char[]*) -- Name of the material. + - **atom_density** (*double[]*) -- Total atom density of the material + in atom/b-cm. + - **nuclides** (*char[][]*) -- Array of nuclides present in the + material, e.g., 'U235'. + - **nuclide_densities** (*double[]*) -- Atom density of each nuclide. + - **sab_names** (*char[][]*) -- Names of + S(:math:`\alpha`,:math:`\beta`) tables assigned to the material. + +**/nuclides/** + +:Attributes: - **n_nuclides** (*int*) -- Number of nuclides in the problem. + +:Datasets: - **names** (*char[][]*) -- Names of nuclides. + - **awrs** (*float[]*) -- Atomic weight ratio of each nuclide. + +**/tallies/tally /** + +:Datasets: - **name** (*char[]*) -- Name of the tally. diff --git a/openmc/statepoint.py b/openmc/statepoint.py index b8257f5197..c3436ceb57 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -138,7 +138,7 @@ class StatePoint(object): @property def cmfd_on(self): - return self._f['cmfd_on'].value > 0 + return self._f.attrs['cmfd_on'] > 0 @property def cmfd_balance(self): @@ -262,7 +262,7 @@ class StatePoint(object): self._meshes = {} # Read the number of Meshes - n_meshes = self._f['tallies/meshes/n_meshes'].value + n_meshes = self._f['tallies/meshes'].attrs['n_meshes'] # Read a list of the IDs for each Mesh if n_meshes > 0: @@ -271,28 +271,17 @@ class StatePoint(object): else: mesh_keys = [] - # Build dictionary of Meshes - base = 'tallies/meshes/mesh ' - # Iterate over all Meshes for mesh_key in mesh_keys: - # Read the mesh type - mesh_type = self._f['{0}{1}/type'.format(base, mesh_key)].value.decode() + group = self._f['tallies/meshes/mesh {}'.format(mesh_key)] - # 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 + # Read and assign mesh properties mesh = openmc.Mesh(mesh_key) - mesh.dimension = dimension - mesh.width = width - mesh.lower_left = lower_left - mesh.upper_right = upper_right - mesh.type = mesh_type + mesh.type = group['type'].value.decode() + mesh.dimension = group['dimension'].value + mesh.lower_left = group['lower_left'].value + mesh.upper_right = group['upper_right'].value + mesh.width = group['width'].value # Add mesh to the global dictionary of all Meshes self._meshes[mesh_key] = mesh @@ -343,7 +332,7 @@ class StatePoint(object): @property def source_present(self): - return self._f['source_present'].value > 0 + return self._f.attrs['source_present'] > 0 @property def sparse(self): @@ -356,7 +345,7 @@ class StatePoint(object): self._tallies = {} # Read the number of tallies - n_tallies = self._f['tallies/n_tallies'].value + n_tallies = self._f['tallies'].attrs['n_tallies'] # Read a list of the IDs for each Tally if n_tallies > 0: @@ -365,54 +354,44 @@ class StatePoint(object): else: tally_keys = [] - base = 'tallies/tally ' - # Iterate over all Tallies for tally_key in tally_keys: + group = self._f['tallies/tally {}'.format(tally_key)] + # Read the Tally size specifications - n_realizations = \ - self._f['{0}{1}/n_realizations'.format(base, tally_key)].value + n_realizations = group['n_realizations'].value # Create Tally object and assign basic properties tally = openmc.Tally(tally_id=tally_key) tally._sp_filename = self._f.filename - tally.estimator = self._f['{0}{1}/estimator'.format( - base, tally_key)].value.decode() + tally.name = group['name'].value.decode() + tally.estimator = group['estimator'].value.decode() tally.num_realizations = n_realizations # Read derivative information. - if 'derivative' in self._f['{0}{1}'.format(base, tally_key)]: - deriv_id = self._f['{0}{1}/derivative'.format( - base, tally_key)].value + if 'derivative' in group: + deriv_id = group['derivative'].value tally.derivative = self.tally_derivatives[deriv_id] - # 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) - # Read all filters - for j in range(1, n_filters+1): - subsubbase = '{0}{1}'.format(subbase, j) - new_filter = openmc.Filter.from_hdf5(self._f[subsubbase], + n_filters = group['n_filters'].value + for j in range(1, n_filters + 1): + filter_group = group['filter {}'.format(j)] + new_filter = openmc.Filter.from_hdf5(filter_group, meshes=self.meshes) tally.filters.append(new_filter) - # Read Nuclide bins - nuclide_names = \ - self._f['{0}{1}/nuclides'.format(base, tally_key)].value + # Read nuclide bins + nuclide_names = group['nuclides'].value - # Add all Nuclides to the Tally + # Add all nuclides to the Tally for name in nuclide_names: nuclide = openmc.Nuclide(name.decode().strip()) tally.nuclides.append(nuclide) - scores = self._f['{0}{1}/score_bins'.format( - base, tally_key)].value - n_score_bins = self._f['{0}{1}/n_score_bins' - .format(base, tally_key)].value + scores = group['score_bins'].value + n_score_bins = group['n_score_bins'].value # Compute and set the filter strides for i in range(n_filters): @@ -423,8 +402,7 @@ class StatePoint(object): tally_filter.stride *= tally.filters[j].num_bins # Read scattering moment order strings (e.g., P3, Y1,2, etc.) - moments = self._f['{0}{1}/moment_orders'.format( - base, tally_key)].value + moments = group['moment_orders'].value # Add the scores to the Tally for j, score in enumerate(scores): @@ -446,7 +424,7 @@ class StatePoint(object): @property def tallies_present(self): - return self._f['tallies/tallies_present'].value + return self._f.attrs['tallies_present'] > 0 @property def tally_derivatives(self): @@ -464,21 +442,20 @@ class StatePoint(object): # Create each derivative object and add it to the dictionary. for d_id in deriv_ids: - base = 'tallies/derivatives/derivative {:d}'.format(d_id) + group = self._f['tallies/derivatives/derivative {}' + .format(d_id)] deriv = openmc.TallyDerivative(derivative_id=d_id) - deriv.variable = \ - self._f[base + '/independent variable'].value.decode() + deriv.variable = group['independent variable'].value.decode() if deriv.variable == 'density': - deriv.material = self._f[base + '/material'].value + deriv.material = group['material'].value elif deriv.variable == 'nuclide_density': - deriv.material = self._f[base + '/material'].value - deriv.nuclide = \ - self._f[base + '/nuclide'].value.decode() + deriv.material = group['material'].value + deriv.nuclide = group['nuclide'].value.decode() elif deriv.variable == 'temperature': - deriv.material = self._f[base + '/material'].value + deriv.material = group['material'].value else: - raise RuntimeError('Unrecognized tally differential ' - 'variable') + raise ValueError('Unrecognized tally differential ' + 'variable') self._derivs[d_id] = deriv self._derivs_read = True @@ -697,7 +674,6 @@ class StatePoint(object): cell_dict = {c.id: c for c in summary.geometry.get_all_cells()} for tally_id, tally in self.tallies.items(): - tally.name = summary.tally_names[tally_id] tally.with_summary = True for tally_filter in tally.filters: diff --git a/openmc/summary.py b/openmc/summary.py index 6563d4f27f..e11b05d456 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -25,8 +25,6 @@ class Summary(object): nuclides : dict Dictionary whose keys are nuclide names and values are atomic weight ratios. - tally_names : dict - Dictionary whose keys are tally IDs and values are tally names. version: tuple of int Version of OpenMC @@ -44,10 +42,10 @@ class Summary(object): self._geometry = openmc.Geometry() self._materials = openmc.Materials() + self._nuclides = {} self._read_nuclides() self._read_geometry() - self._read_tallies() @property def date_and_time(self): @@ -61,18 +59,19 @@ class Summary(object): def materials(self): return self._materials + @property + def nuclides(self): + return self._nuclides + @property def version(self): return tuple(self._f.attrs['openmc_version']) def _read_nuclides(self): - self.nuclides = {} - n_nuclides = self._f['nuclides/n_nuclides_total'].value names = self._f['nuclides/names'].value awrs = self._f['nuclides/awrs'].value - for n in range(n_nuclides): - name = names[n].decode() - self.nuclides[name] = awrs[n] + for name, awr in zip(names, awrs): + self._nuclides[name.decode()] = awr def _read_geometry(self): # Read in and initialize the Materials and Geometry @@ -84,12 +83,7 @@ class Summary(object): self._finalize_geometry(cells, cell_fills, universes, lattices) def _read_materials(self): - self.n_materials = self._f['n_materials'].value - for key, group in self._f['materials'].items(): - if key == 'n_materials': - continue - material_id = int(key.lstrip('material ')) name = group['name'].value.decode() @@ -129,9 +123,6 @@ class Summary(object): surfaces = {} for key, group in self._f['geometry/surfaces'].items(): - if key == 'n_surfaces': - continue - surface_id = int(key.lstrip('surface ')) name = group['name'].value.decode() surf_type = group['type'].value.decode() @@ -213,9 +204,6 @@ class Summary(object): cell_fills = {} for key, group in self._f['geometry/cells'].items(): - if key == 'n_cells': - continue - cell_id = int(key.lstrip('cell ')) name = group['name'].value.decode() fill_type = group['fill_type'].value.decode() @@ -280,9 +268,6 @@ class Summary(object): universes = {} for key in self._f['geometry/universes'].keys(): - if key == 'n_universes': - continue - universe_id = int(key.lstrip('universe ')) cell_ids = self._f['geometry/universes'][key]['cells'][...] @@ -305,9 +290,6 @@ class Summary(object): lattices = {} for key, group in self._f['geometry/lattices'].items(): - if key == 'n_lattices': - continue - lattice_id = int(key.lstrip('lattice ')) name = group['name'].value.decode() lattice_type = group['type'].value.decode() @@ -471,31 +453,6 @@ class Summary(object): # Set the root universe for the Geometry self.geometry.root_universe = universes[0] - def _read_tallies(self): - # Initialize a dictionary for the tally names - # Keys - Tally IDs - # Values - Tally names - self.tally_names = {} - - # Read the number of tallies - if 'tallies' not in self._f: - return - - # OpenMC Tally keys - all_keys = self._f['tallies/'].keys() - tally_keys = [key for key in all_keys if 'tally' in key] - - base = 'tallies/tally ' - - # 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 - tally_name = self._f['{0}/name'.format(subbase)].value.decode() - self.tally_names[tally_id] = tally_name - def add_volume_information(self, volume_calc): """Add volume information to the geometry within the summary file diff --git a/src/state_point.F90 b/src/state_point.F90 index cb4ae5157a..ee7c7bf528 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -108,9 +108,9 @@ contains ! Indicate whether source bank is stored in statepoint if (source_separate) then - call write_dataset(file_id, "source_present", 0) + call write_attribute(file_id, "source_present", 0) else - call write_dataset(file_id, "source_present", 1) + call write_attribute(file_id, "source_present", 1) end if ! Write out information for eigenvalue run @@ -126,7 +126,7 @@ contains ! Write out CMFD info if (cmfd_on) then - call write_dataset(file_id, "cmfd_on", 1) + call write_attribute(file_id, "cmfd_on", 1) cmfd_group = create_group(file_id, "cmfd") call write_dataset(cmfd_group, "indices", cmfd % indices) @@ -138,7 +138,7 @@ contains call write_dataset(cmfd_group, "cmfd_srccmp", cmfd % src_cmp) call close_group(cmfd_group) else - call write_dataset(file_id, "cmfd_on", 0) + call write_attribute(file_id, "cmfd_on", 0) end if end if @@ -146,7 +146,7 @@ contains ! Write number of meshes meshes_group = create_group(tallies_group, "meshes") - call write_dataset(meshes_group, "n_meshes", n_meshes) + call write_attribute(meshes_group, "n_meshes", n_meshes) if (n_meshes > 0) then @@ -229,7 +229,7 @@ contains end if ! Write number of tallies - call write_dataset(tallies_group, "n_tallies", n_tallies) + call write_attribute(tallies_group, "n_tallies", n_tallies) if (n_tallies > 0) then @@ -257,6 +257,9 @@ contains tally_group = create_group(tallies_group, "tally " // & trim(to_str(tally % id))) + ! Write the name for this tally + call write_dataset(tally_group, "name", tally % name) + select case(tally % estimator) case (ESTIMATOR_ANALOG) call write_dataset(tally_group, "estimator", "analog") @@ -373,14 +376,14 @@ contains call write_dataset(file_id, "n_realizations", n_realizations) ! Write global tallies - 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 write_dataset(tallies_group, "tallies_present", 1) + call write_attribute(file_id, "tallies_present", 1) + + tallies_group = open_group(file_id, "tallies") ! Write all tally results TALLY_RESULTS: do i = 1, n_tallies @@ -394,12 +397,12 @@ contains call close_group(tally_group) end do TALLY_RESULTS + call close_group(tallies_group) else ! Indicate tallies are off - call write_dataset(tallies_group, "tallies_present", 0) + call write_attribute(file_id, "tallies_present", 0) end if - call close_group(tallies_group) ! Write out the runtime metrics. runtime_group = create_group(file_id, "runtime") @@ -571,7 +574,7 @@ contains if (tallies_on) then ! Indicate that tallies are on if (master) then - call write_dataset(tallies_group, "tallies_present", 1) + call write_attribute(file_id, "tallies_present", 1) ! Build list of tally IDs current => tally_dict%keys() @@ -649,14 +652,12 @@ contains deallocate(id_array) + if (master) call close_group(tallies_group) else - if (master) then - ! Indicate that tallies are off - call write_dataset(tallies_group, "tallies_present", 0) - end if + ! Indicate that tallies are off + if (master) call write_dataset(file_id, "tallies_present", 0) end if - if (master) call close_group(tallies_group) end subroutine write_tally_results_nr @@ -731,7 +732,7 @@ contains call read_dataset(restart_batch, file_id, "current_batch") ! Check for source in statepoint if needed - call read_dataset(int_array(1), file_id, "source_present") + call read_attribute(int_array(1), file_id, "source_present") if (int_array(1) == 1) then source_present = .true. else @@ -760,7 +761,7 @@ contains n_inactive = max(n_inactive, int_array(1)) ! Read in to see if CMFD was on - call read_dataset(int_array(1), file_id, "cmfd_on") + call read_attribute(int_array(1), file_id, "cmfd_on") ! Read in CMFD info if (int_array(1) == 1) then @@ -801,12 +802,12 @@ contains call read_dataset(global_tallies, file_id, "global_tallies") ! Check if tally results are present - tallies_group = open_group(file_id, "tallies") - call read_dataset(int_array(1), tallies_group, "tallies_present", & - indep=.true.) + call read_attribute(int_array(1), file_id, "tallies_present") ! Read in sum and sum squared if (int_array(1) == 1) then + tallies_group = open_group(file_id, "tallies") + TALLY_RESULTS: do i = 1, n_tallies ! Set pointer to tally tally => tallies(i) @@ -819,12 +820,11 @@ contains "n_realizations") call close_group(tally_group) end do TALLY_RESULTS + + call close_group(tallies_group) end if - - call close_group(tallies_group) end if - ! Read source if in eigenvalue mode if (run_mode == MODE_EIGENVALUE) then diff --git a/src/summary.F90 b/src/summary.F90 index 638d232704..fa5681052f 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -36,15 +36,10 @@ contains ! Create a new file using default properties. file_id = file_create("summary.h5") - ! Write header information call write_header(file_id) - call write_nuclides(file_id) call write_geometry(file_id) call write_materials(file_id) - if (n_tallies > 0) then - call write_tallies(file_id) - end if ! Terminate access to the file. call file_close(file_id) @@ -84,7 +79,7 @@ contains ! Write useful data from nuclide objects nuclide_group = create_group(file_id, "nuclides") - call write_dataset(nuclide_group, "n_nuclides_total", n_nuclides_total) + call write_attribute(nuclide_group, "n_nuclides", n_nuclides_total) ! Build array of nuclide names and awrs allocate(nucnames(n_nuclides_total)) @@ -137,10 +132,10 @@ contains ! Use H5LT interface to write number of geometry objects 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) + call write_attribute(geom_group, "n_cells", n_cells) + call write_attribute(geom_group, "n_surfaces", n_surfaces) + call write_attribute(geom_group, "n_universes", n_universes) + call write_attribute(geom_group, "n_lattices", n_lattices) ! ========================================================================== ! WRITE INFORMATION ON CELLS @@ -542,34 +537,4 @@ contains end subroutine write_materials -!=============================================================================== -! WRITE_TALLIES -!=============================================================================== - - subroutine write_tallies(file_id) - integer(HID_T), intent(in) :: file_id - - integer :: i - integer(HID_T) :: tallies_group - integer(HID_T) :: tally_group - type(TallyObject), pointer :: t - - tallies_group = create_group(file_id, "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 write_dataset(tally_group, "name", t % name) - - call close_group(tally_group) - end do TALLY_METADATA - - call close_group(tallies_group) - - end subroutine write_tallies - end module summary From e642b401a2fc6d849234b8b8a4b89d58e02c57ea Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 09:45:42 -0600 Subject: [PATCH 40/66] Get rid of last instance of internal IDs in statepoint --- docs/source/io_formats/statepoint.rst | 8 +- docs/source/io_formats/summary.rst | 2 +- openmc/statepoint.py | 52 +++---- src/state_point.F90 | 204 ++++++++++---------------- 4 files changed, 97 insertions(+), 169 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index 63ca703003..f2fa223c89 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -74,16 +74,12 @@ The current revision of the statepoint file format is 16.0. **/tallies/** :Attributes: - **n_tallies** (*int*) -- Number of user-defined tallies. - -:Datasets: - **ids** (*int[]*) -- Internal unique ID of each tally. - - **keys** (*int[]*) -- User-defined unique ID of each tally. + - **ids** (*int[]*) -- User-defined unique ID of each tally. **/tallies/meshes/** :Attributes: - **n_meshes** (*int*) -- Number of meshes in the problem. - -:Datasets: - **ids** (*int[]*) -- Internal unique ID of each mesh. - - **keys** (*int[]*) -- User-identified unique ID of each mesh. + - **ids** (*int[]*) -- User-identified unique ID of each mesh. **/tallies/meshes/mesh /** diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 28aca93498..671fa33348 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -120,7 +120,7 @@ The current version of the summary file format is 5.0. material, e.g., 'U235'. - **nuclide_densities** (*double[]*) -- Atom density of each nuclide. - **sab_names** (*char[][]*) -- Names of - S(:math:`\alpha`,:math:`\beta`) tables assigned to the material. + S(:math:`\alpha,\beta`) tables assigned to the material. **/nuclides/** diff --git a/openmc/statepoint.py b/openmc/statepoint.py index c3436ceb57..3354181fd5 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -111,6 +111,8 @@ class StatePoint(object): def __init__(self, filename, autolink=True): self._f = h5py.File(filename, 'r') + self._meshes = {} + self._tallies = {} # Check filetype and version cv.check_filetype_version(self._f, 'statepoint', _VERSION_STATEPOINT) @@ -256,27 +258,14 @@ class StatePoint(object): @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'].attrs['n_meshes'] - - # 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 = [] + mesh_group = self._f['tallies/meshes'] # Iterate over all Meshes - for mesh_key in mesh_keys: - group = self._f['tallies/meshes/mesh {}'.format(mesh_key)] + for key, group in mesh_group.items(): + mesh_id = int(key.lstrip('mesh ')) # Read and assign mesh properties - mesh = openmc.Mesh(mesh_key) + mesh = openmc.Mesh(mesh_id) mesh.type = group['type'].value.decode() mesh.dimension = group['dimension'].value mesh.lower_left = group['lower_left'].value @@ -284,7 +273,7 @@ class StatePoint(object): mesh.width = group['width'].value # Add mesh to the global dictionary of all Meshes - self._meshes[mesh_key] = mesh + self._meshes[mesh_id] = mesh self._meshes_read = True @@ -340,30 +329,27 @@ class StatePoint(object): @property def tallies(self): - if not self._tallies_read: - # Initialize dictionary for tallies - self._tallies = {} - + if self.tallies_present and not self._tallies_read: # Read the number of tallies - n_tallies = self._f['tallies'].attrs['n_tallies'] + tallies_group = self._f['tallies'] + n_tallies = tallies_group.attrs['n_tallies'] # 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 + # Tally used-defined IDs + tally_ids = tallies_group.attrs['ids'] else: - tally_keys = [] + tally_ids = [] - # Iterate over all Tallies - for tally_key in tally_keys: - group = self._f['tallies/tally {}'.format(tally_key)] + # Iterate over all tallies + for tally_id in tally_ids: + group = tallies_group['tally {}'.format(tally_id)] - - # Read the Tally size specifications + # Read the number of realizations n_realizations = group['n_realizations'].value # Create Tally object and assign basic properties - tally = openmc.Tally(tally_id=tally_key) + tally = openmc.Tally(tally_id) tally._sp_filename = self._f.filename tally.name = group['name'].value.decode() tally.estimator = group['estimator'].value.decode() @@ -416,7 +402,7 @@ class StatePoint(object): # Add Tally to the global dictionary of all Tallies tally.sparse = self.sparse - self._tallies[tally_key] = tally + self._tallies[tally_id] = tally self._tallies_read = True diff --git a/src/state_point.F90 b/src/state_point.F90 index ee7c7bf528..fcbe9f6daf 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -16,7 +16,6 @@ module state_point use hdf5 use constants - use dict_header, only: ElemKeyValueII, ElemKeyValueCI use endf, only: reaction_name use error, only: fatal_error, warning use global @@ -50,10 +49,7 @@ contains runtime_group character(MAX_WORD_LEN), allocatable :: str_array(:) character(MAX_FILE_LEN) :: filename - type(RegularMesh), pointer :: meshp type(TallyObject), pointer :: tally - type(ElemKeyValueII), pointer :: current - type(ElemKeyValueII), pointer :: next ! Set filename for state point filename = trim(path_output) // 'statepoint.' // & @@ -149,49 +145,32 @@ contains call write_attribute(meshes_group, "n_meshes", n_meshes) if (n_meshes > 0) then - - ! Print list of mesh IDs - current => mesh_dict % keys() - + ! Write IDs of meshes 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 - - ! Move to next mesh - next => current % next - deallocate(current) - current => next - i = i + 1 + do i = 1, n_meshes + id_array(i) = meshes(i) % id end do - - call write_dataset(meshes_group, "ids", id_array) - call write_dataset(meshes_group, "keys", key_array) - - deallocate(key_array) + call write_attribute(meshes_group, "ids", id_array) + deallocate(id_array) ! Write information for meshes MESH_LOOP: do i = 1, n_meshes - meshp => meshes(id_array(i)) - mesh_group = create_group(meshes_group, "mesh " & - // trim(to_str(meshp % id))) + associate (m => meshes(i)) + mesh_group = create_group(meshes_group, "mesh " & + // trim(to_str(m % id))) - 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) - call write_dataset(mesh_group, "width", meshp % width) + select case (m % type) + case (MESH_REGULAR) + call write_dataset(mesh_group, "type", "regular") + end select + 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) + call close_group(mesh_group) + end associate end do MESH_LOOP - - deallocate(id_array) end if call close_group(meshes_group) @@ -232,22 +211,13 @@ contains call write_attribute(tallies_group, "n_tallies", n_tallies) if (n_tallies > 0) then - - ! Print list of tally IDs + ! Write array of tally IDs allocate(id_array(n_tallies)) - allocate(key_array(n_tallies)) - - ! Write all tally information except results do i = 1, n_tallies - tally => tallies(i) - key_array(i) = tally % id - id_array(i) = i + id_array(i) = tallies(i) % id end do - - call write_dataset(tallies_group, "ids", id_array) - call write_dataset(tallies_group, "keys", key_array) - - deallocate(key_array) + call write_attribute(tallies_group, "ids", id_array) + deallocate(id_array) ! Write all tally information except results TALLY_METADATA: do i = 1, n_tallies @@ -525,10 +495,6 @@ contains #ifdef MPI real(8) :: dummy ! temporary receive buffer for non-root reduces #endif - integer, allocatable :: id_array(:) - type(ElemKeyValueII), pointer :: current - type(ElemKeyValueII), pointer :: next - type(TallyObject), pointer :: tally type(TallyObject) :: dummy_tally ! ========================================================================== @@ -575,83 +541,65 @@ contains ! Indicate that tallies are on if (master) then call write_attribute(file_id, "tallies_present", 1) - - ! Build list of tally IDs - current => tally_dict%keys() - allocate(id_array(n_tallies)) - i = 1 - - do while (associated(current)) - id_array(i) = current%value - ! Move to next tally - next => current%next - deallocate(current) - current => next - i = i + 1 - end do - end if ! Write all tally results TALLY_RESULTS: do i = 1, n_tallies + associate (t => tallies(i)) + ! Determine size of tally results array + m = size(t % results, 2) + n = size(t % results, 3) + n_bins = m*n*2 - tally => tallies(i) + ! Allocate array for storing sums and sums of squares, but + ! contiguously in memory for each + allocate(tally_temp(2,m,n)) + tally_temp(1,:,:) = t % results(RESULT_SUM,:,:) + tally_temp(2,:,:) = t % results(RESULT_SUM_SQ,:,:) - ! Determine size of tally results array - m = size(tally%results, 2) - n = size(tally%results, 3) - n_bins = m*n*2 + if (master) then + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(t % id))) - ! 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(RESULT_SUM,:,:) - tally_temp(2,:,:) = tally%results(RESULT_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 + ! The MPI_IN_PLACE specifier allows the master to copy values into + ! a receive buffer without having a temporary variable #ifdef MPI - call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & - MPI_SUM, 0, mpi_intracomm, mpi_err) + call MPI_REDUCE(MPI_IN_PLACE, tally_temp, n_bins, MPI_REAL8, & + MPI_SUM, 0, mpi_intracomm, mpi_err) #endif - ! 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(RESULT_SUM,:,:) = tally_temp(1,:,:) - tally%results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + ! 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 + t % results(RESULT_SUM,:,:) = tally_temp(1,:,:) + t % results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + end if + + ! Put in temporary tally result + allocate(dummy_tally % results(3,m,n)) + dummy_tally % results(RESULT_SUM,:,:) = tally_temp(1,:,:) + dummy_tally % results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + + ! Write reduced tally results to file + call dummy_tally % write_results_hdf5(tally_group) + + ! Deallocate temporary tally result + deallocate(dummy_tally % results) + else + ! Receive buffer not significant at other processors +#ifdef MPI + call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & + 0, mpi_intracomm, mpi_err) +#endif end if - ! Put in temporary tally result - allocate(dummy_tally % results(3,m,n)) - dummy_tally % results(RESULT_SUM,:,:) = tally_temp(1,:,:) - dummy_tally % results(RESULT_SUM_SQ,:,:) = tally_temp(2,:,:) + ! Deallocate temporary copy of tally results + deallocate(tally_temp) - ! Write reduced tally results to file - call dummy_tally % write_results_hdf5(tally_group) - - ! Deallocate temporary tally result - deallocate(dummy_tally % results) - else - ! Receive buffer not significant at other processors -#ifdef MPI - call MPI_REDUCE(tally_temp, dummy, n_bins, MPI_REAL8, MPI_SUM, & - 0, mpi_intracomm, mpi_err) -#endif - end if - - ! Deallocate temporary copy of tally results - deallocate(tally_temp) - - if (master) call close_group(tally_group) + if (master) call close_group(tally_group) + end associate end do TALLY_RESULTS - deallocate(id_array) - if (master) call close_group(tallies_group) else ! Indicate that tallies are off @@ -677,7 +625,6 @@ contains real(8) :: real_array(3) logical :: source_present character(MAX_WORD_LEN) :: word - type(TallyObject), pointer :: tally ! Write message call write_message("Loading state point " // trim(path_state_point) & @@ -809,16 +756,15 @@ contains tallies_group = open_group(file_id, "tallies") TALLY_RESULTS: do i = 1, n_tallies - ! Set pointer to tally - tally => tallies(i) - - ! Read sum, sum_sq, and N for each bin - tally_group = open_group(tallies_group, "tally " // & - trim(to_str(tally % id))) - call tally % read_results_hdf5(tally_group) - call read_dataset(tally % n_realizations, tally_group, & - "n_realizations") - call close_group(tally_group) + associate (t => tallies(i)) + ! Read sum, sum_sq, and N for each bin + tally_group = open_group(tallies_group, "tally " // & + trim(to_str(t % id))) + call t % read_results_hdf5(tally_group) + call read_dataset(t % n_realizations, tally_group, & + "n_realizations") + call close_group(tally_group) + end associate end do TALLY_RESULTS call close_group(tallies_group) From 4729754ce51e88507158d6312fcd2bb34baabd5b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 09:49:48 -0600 Subject: [PATCH 41/66] Make StatePoint.generations_per_batch consistent with Settings --- docs/source/io_formats/statepoint.rst | 4 ++-- openmc/statepoint.py | 6 +++--- src/state_point.F90 | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index f2fa223c89..eff590605a 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -34,8 +34,8 @@ The current revision of the statepoint file format is 16.0. - **current_batch** (*int*) -- The number of batches already simulated. - **n_inactive** (*int*) -- Number of inactive batches. Only present when `run_mode` is 'eigenvalue'. - - **gen_per_batch** (*int*) -- Number of generations per batch. Only - present when `run_mode` is 'eigenvalue'. + - **generations_per_batch** (*int*) -- Number of generations per + batch. Only present when `run_mode` is 'eigenvalue'. - **k_generation** (*double[]*) -- k-effective for each generation simulated. - **entropy** (*double[]*) -- Shannon entropy for each generation diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 3354181fd5..affca19646 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -52,7 +52,7 @@ class StatePoint(object): Date and time when simulation began entropy : numpy.ndarray Shannon entropy of fission source at each batch - gen_per_batch : Integral + generations_per_batch : int Number of fission generations per batch global_tallies : numpy.ndarray of compound datatype Global tallies for k-effective estimates and leakage. The compound @@ -186,9 +186,9 @@ class StatePoint(object): return None @property - def gen_per_batch(self): + def generations_per_batch(self): if self.run_mode == 'eigenvalue': - return self._f['gen_per_batch'].value + return self._f['generations_per_batch'].value else: return None diff --git a/src/state_point.F90 b/src/state_point.F90 index fcbe9f6daf..378fde6519 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -112,7 +112,7 @@ contains ! Write out information for eigenvalue run if (run_mode == MODE_EIGENVALUE) then 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, "generations_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) @@ -694,7 +694,7 @@ contains ! Read information specific to eigenvalue run if (run_mode == MODE_EIGENVALUE) then call read_dataset(int_array(1), file_id, "n_inactive") - call read_dataset(gen_per_batch, file_id, "gen_per_batch") + call read_dataset(gen_per_batch, file_id, "generations_per_batch") call read_dataset(k_generation(1:restart_batch*gen_per_batch), & file_id, "k_generation") call read_dataset(entropy(1:restart_batch*gen_per_batch), & From 8f2efa19dd7bfecfb34ada63f7639acebff4e970 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 10:22:15 -0600 Subject: [PATCH 42/66] Create Mesh.from_hdf5() and Surface.from_hdf5() methods --- openmc/mesh.py | 27 ++++++++++++++ openmc/statepoint.py | 16 ++------- openmc/summary.py | 84 +++----------------------------------------- openmc/surface.py | 70 ++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 93 deletions(-) diff --git a/openmc/mesh.py b/openmc/mesh.py index 960ce4a1bf..24c39b530b 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -160,6 +160,33 @@ class Mesh(EqualityMixin): string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._width) return string + @classmethod + def from_hdf5(cls, group): + """Create mesh from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + + Returns + ------- + openmc.Mesh + Mesh instance + + """ + mesh_id = int(group.name.split('/')[-1].lstrip('mesh ')) + + # Read and assign mesh properties + mesh = cls(mesh_id) + mesh.type = group['type'].value.decode() + mesh.dimension = group['dimension'].value + mesh.lower_left = group['lower_left'].value + mesh.upper_right = group['upper_right'].value + mesh.width = group['width'].value + + return mesh + def cell_generator(self): """Generator function to traverse through every [i,j,k] index of the mesh. diff --git a/openmc/statepoint.py b/openmc/statepoint.py index affca19646..f29829a417 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -261,19 +261,9 @@ class StatePoint(object): mesh_group = self._f['tallies/meshes'] # Iterate over all Meshes - for key, group in mesh_group.items(): - mesh_id = int(key.lstrip('mesh ')) - - # Read and assign mesh properties - mesh = openmc.Mesh(mesh_id) - mesh.type = group['type'].value.decode() - mesh.dimension = group['dimension'].value - mesh.lower_left = group['lower_left'].value - mesh.upper_right = group['upper_right'].value - mesh.width = group['width'].value - - # Add mesh to the global dictionary of all Meshes - self._meshes[mesh_id] = mesh + for group in mesh_group.values(): + mesh = openmc.Mesh.from_hdf5(group) + self._meshes[mesh.id] = mesh self._meshes_read = True diff --git a/openmc/summary.py b/openmc/summary.py index e11b05d456..3b39d7489e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -78,7 +78,7 @@ class Summary(object): self._read_materials() surfaces = self._read_surfaces() cells, cell_fills = self._read_cells(surfaces) - universes = self._read_universes(cells, cell_fills) + universes = self._read_universes(cells) lattices = self._read_lattices(universes) self._finalize_geometry(cells, cell_fills, universes, lattices) @@ -121,78 +121,8 @@ class Summary(object): def _read_surfaces(self): surfaces = {} - - for key, group in self._f['geometry/surfaces'].items(): - surface_id = int(key.lstrip('surface ')) - name = group['name'].value.decode() - surf_type = group['type'].value.decode() - bc = group['boundary_condition'].value.decode() - coeffs = group['coefficients'][...] - - # Create the Surface based on its type - if surf_type == 'x-plane': - x0 = coeffs[0] - surface = openmc.XPlane(surface_id, bc, x0, name) - - elif surf_type == 'y-plane': - y0 = coeffs[0] - surface = openmc.YPlane(surface_id, bc, y0, name) - - elif surf_type == 'z-plane': - z0 = coeffs[0] - surface = openmc.ZPlane(surface_id, bc, z0, name) - - 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': - y0 = coeffs[0] - z0 = coeffs[1] - R = coeffs[2] - surface = openmc.XCylinder(surface_id, bc, y0, z0, R, name) - - 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': - x0 = coeffs[0] - y0 = coeffs[1] - R = coeffs[2] - surface = openmc.ZCylinder(surface_id, bc, x0, y0, R, name) - - 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']: - x0 = coeffs[0] - y0 = coeffs[1] - z0 = coeffs[2] - R2 = coeffs[3] - - if surf_type == 'x-cone': - surface = openmc.XCone(surface_id, bc, x0, y0, z0, R2, name) - if surf_type == 'y-cone': - surface = openmc.YCone(surface_id, bc, x0, y0, z0, R2, name) - 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 + for group in self._f['geometry/surfaces'].values(): + surface = openmc.Surface.from_hdf5(group) surfaces[surface.id] = surface return surfaces @@ -261,10 +191,7 @@ class Summary(object): return cells, cell_fills - def _read_universes(self, cells, cell_fills): - # Initialize dictionary for each Universe - # Keys - Universe keys - # Values - Universe objects + def _read_universes(self, cells): universes = {} for key in self._f['geometry/universes'].keys(): @@ -284,9 +211,6 @@ class Summary(object): return universes def _read_lattices(self, universes): - # Initialize lattices for each Lattice - # Keys - Lattice keys - # Values - Lattice objects lattices = {} for key, group in self._f['geometry/lattices'].items(): diff --git a/openmc/surface.py b/openmc/surface.py index 04c7f95981..193afe3100 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -186,6 +186,76 @@ class Surface(object): return element + @staticmethod + def from_hdf5(group): + """Create surface from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + + Returns + ------- + openmc.Surface + Instance of surface subclass + + """ + surface_id = int(group.name.split('/')[-1].lstrip('surface ')) + name = group['name'].value.decode() + surf_type = group['type'].value.decode() + bc = group['boundary_condition'].value.decode() + coeffs = group['coefficients'][...] + + # Create the Surface based on its type + if surf_type == 'x-plane': + x0 = coeffs[0] + surface = XPlane(surface_id, bc, x0, name) + + elif surf_type == 'y-plane': + y0 = coeffs[0] + surface = YPlane(surface_id, bc, y0, name) + + elif surf_type == 'z-plane': + z0 = coeffs[0] + surface = ZPlane(surface_id, bc, z0, name) + + elif surf_type == 'plane': + A, B, C, D = coeffs + surface = Plane(surface_id, bc, A, B, C, D, name) + + elif surf_type == 'x-cylinder': + y0, z0, R = coeffs + surface = XCylinder(surface_id, bc, y0, z0, R, name) + + elif surf_type == 'y-cylinder': + x0, z0, R = coeffs + surface = YCylinder(surface_id, bc, x0, z0, R, name) + + elif surf_type == 'z-cylinder': + x0, y0, R = coeffs + surface = ZCylinder(surface_id, bc, x0, y0, R, name) + + elif surf_type == 'sphere': + x0, y0, z0, R = coeffs + surface = Sphere(surface_id, bc, x0, y0, z0, R, name) + + elif surf_type in ['x-cone', 'y-cone', 'z-cone']: + x0, y0, z0, R2 = coeffs + if surf_type == 'x-cone': + surface = XCone(surface_id, bc, x0, y0, z0, R2, name) + elif surf_type == 'y-cone': + surface = YCone(surface_id, bc, x0, y0, z0, R2, name) + elif surf_type == 'z-cone': + surface = 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 = Quadric(surface_id, bc, a, b, c, d, e, f, g, + h, j, k, name) + + return surface + class Plane(Surface): """An arbitrary plane of the form :math:`Ax + By + Cz = D`. From 26e260114108c3cee6653e9c57e80c98fdd5dbfc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 10:47:51 -0600 Subject: [PATCH 43/66] Update particle restart format and documentation --- docs/source/io_formats/particle_restart.rst | 74 +++++++------------ docs/source/io_formats/statepoint.rst | 2 +- openmc/particle_restart.py | 12 +-- src/particle_restart.F90 | 4 +- src/particle_restart_write.F90 | 52 +++++++------ .../results_true.dat | 2 +- .../results_true.dat | 2 +- tests/testing_harness.py | 4 +- 8 files changed, 63 insertions(+), 89 deletions(-) diff --git a/docs/source/io_formats/particle_restart.rst b/docs/source/io_formats/particle_restart.rst index 3dee8c47db..9f34184955 100644 --- a/docs/source/io_formats/particle_restart.rst +++ b/docs/source/io_formats/particle_restart.rst @@ -4,55 +4,31 @@ Particle Restart File Format ============================ -The current revision of the particle restart file format is 1. +The current version of the particle restart file format is 2.0. -**/filetype** (*char[]*) +**/** - String indicating the type of file. +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the summary + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. -**/revision** (*int*) - - Revision of the particle restart file format. Any time a change is made in - the format, 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 eV for continuous-energy mode, or the energy - group of the particle for multi-group mode. - -**/xyz** (*double[3]*) - - Position of the particle. - -**/uvw** (*double[3]*) - - Direction of the particle. +:Datasets: - **current_batch** (*int*) -- The number of batches already + simulated. + - **generations_per_batch** (*int*) -- Number of generations per + batch. + - **current_generation** (*int*) -- The number of generations already + simulated. + - **n_particles** (*int8_t*) -- Number of particles used per + generation. + - **run_mode** (*char[]*) -- Run mode used, either 'fixed source', + 'eigenvalue', or 'particle restart'. + - **id** (*int8_t*) -- Unique identifier of the particle. + - **weight** (*double*) -- Weight of the particle. + - **energy** (*double*) -- Energy of the particle in eV for + continuous-energy mode, or the energy group of the particle for + multi-group mode. + - **xyz** (*double[3]*) -- Position of the particle. + - **uvw** (*double[3]*) -- Direction of the particle. diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index eff590605a..8026c258e6 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -4,7 +4,7 @@ State Point File Format ======================= -The current revision of the statepoint file format is 16.0. +The current version of the statepoint file format is 16.0. **/** diff --git a/openmc/particle_restart.py b/openmc/particle_restart.py index 651855a878..4fab8e5634 100644 --- a/openmc/particle_restart.py +++ b/openmc/particle_restart.py @@ -17,9 +17,9 @@ class Particle(object): ---------- current_batch : int The batch containing the particle - gen_per_batch : int + generations_per_batch : int Number of generations per batch - current_gen : int + current_generation : int The generation containing the particle n_particles : int Number of particles per generation @@ -50,16 +50,16 @@ class Particle(object): return self._f['current_batch'].value @property - def current_gen(self): - return self._f['current_gen'].value + def current_generation(self): + return self._f['current_generation'].value @property def energy(self): return self._f['energy'].value @property - def gen_per_batch(self): - return self._f['gen_per_batch'].value + def generations_per_batch(self): + return self._f['generations_per_batch'].value @property def id(self): diff --git a/src/particle_restart.F90 b/src/particle_restart.F90 index e0174d05f8..430ee4d447 100644 --- a/src/particle_restart.F90 +++ b/src/particle_restart.F90 @@ -81,8 +81,8 @@ contains ! Read data from file call read_dataset(current_batch, file_id, 'current_batch') - call read_dataset(gen_per_batch, file_id, 'gen_per_batch') - call read_dataset(current_gen, file_id, 'current_gen') + call read_dataset(gen_per_batch, file_id, 'generations_per_batch') + call read_dataset(current_gen, file_id, 'current_generation') call read_dataset(n_particles, file_id, 'n_particles') call read_dataset(tempstr, file_id, 'run_mode') select case (tempstr) diff --git a/src/particle_restart_write.F90 b/src/particle_restart_write.F90 index a2e01a7a6d..08e80ea1b0 100644 --- a/src/particle_restart_write.F90 +++ b/src/particle_restart_write.F90 @@ -23,7 +23,6 @@ contains integer(HID_T) :: file_id character(MAX_FILE_LEN) :: filename - type(Bank), pointer :: src ! Dont write another restart file if in particle restart mode if (run_mode == MODE_PARTICLE) return @@ -36,35 +35,34 @@ contains ! Create file file_id = file_create(filename) - ! Get information about source particle - src => source_bank(current_work) - - ! Write filetype and version info - call write_attribute(file_id, 'filetype', 'particle restart') - call write_attribute(file_id, 'version', VERSION_PARTICLE_RESTART) - call write_attribute(file_id, "openmc_version", VERSION) + associate (src => source_bank(current_work)) + ! Write filetype and version info + call write_attribute(file_id, 'filetype', 'particle restart') + call write_attribute(file_id, 'version', VERSION_PARTICLE_RESTART) + call write_attribute(file_id, "openmc_version", VERSION) #ifdef GIT_SHA1 - call write_attribute(file_id, "git_sha1", GIT_SHA1) + call write_attribute(file_id, "git_sha1", GIT_SHA1) #endif - ! Write data to file - 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) - 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', 'eigenvalue') - 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) - call write_dataset(file_id, 'xyz', src%xyz) - call write_dataset(file_id, 'uvw', src%uvw) + ! Write data to file + call write_dataset(file_id, 'current_batch', current_batch) + call write_dataset(file_id, 'generations_per_batch', gen_per_batch) + call write_dataset(file_id, 'current_generation', current_gen) + call write_dataset(file_id, 'n_particles', n_particles) + 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', 'eigenvalue') + 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) + call write_dataset(file_id, 'xyz', src%xyz) + call write_dataset(file_id, 'uvw', src%uvw) + end associate ! Close file call file_close(file_id) diff --git a/tests/test_particle_restart_eigval/results_true.dat b/tests/test_particle_restart_eigval/results_true.dat index 5b548bca7c..d1f933582e 100644 --- a/tests/test_particle_restart_eigval/results_true.dat +++ b/tests/test_particle_restart_eigval/results_true.dat @@ -1,6 +1,6 @@ current batch: 1.000000E+01 -current gen: +current generation: 1.000000E+00 particle id: 1.030000E+03 diff --git a/tests/test_particle_restart_fixed/results_true.dat b/tests/test_particle_restart_fixed/results_true.dat index 0a5126de83..c4ac94c4d8 100644 --- a/tests/test_particle_restart_fixed/results_true.dat +++ b/tests/test_particle_restart_fixed/results_true.dat @@ -1,6 +1,6 @@ current batch: 7.000000E+00 -current gen: +current generation: 1.000000E+00 particle id: 1.440000E+02 diff --git a/tests/testing_harness.py b/tests/testing_harness.py index fc3b4f9346..352022b260 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -219,8 +219,8 @@ class ParticleRestartTestHarness(TestHarness): outstr = '' outstr += 'current batch:\n' outstr += "{0:12.6E}\n".format(p.current_batch) - outstr += 'current gen:\n' - outstr += "{0:12.6E}\n".format(p.current_gen) + outstr += 'current generation:\n' + outstr += "{0:12.6E}\n".format(p.current_generation) outstr += 'particle id:\n' outstr += "{0:12.6E}\n".format(p.id) outstr += 'run mode:\n' From 05d7e817947799f4a68be7bf9e939945695bb947 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 11:05:52 -0600 Subject: [PATCH 44/66] Update documentation for remaining file formats --- docs/source/io_formats/particle_restart.rst | 4 +-- docs/source/io_formats/track.rst | 33 ++++++++------------ docs/source/io_formats/volume.rst | 18 +++++++++-- docs/source/io_formats/voxel.rst | 34 +++++++++++---------- scripts/openmc-voxel-to-silovtk | 8 ++--- src/constants.F90 | 1 + src/plot.F90 | 21 +++++++++---- src/state_point.F90 | 1 - tests/test_plot/test_plot.py | 8 ++--- 9 files changed, 71 insertions(+), 57 deletions(-) diff --git a/docs/source/io_formats/particle_restart.rst b/docs/source/io_formats/particle_restart.rst index 9f34184955..6ebf7e7baa 100644 --- a/docs/source/io_formats/particle_restart.rst +++ b/docs/source/io_formats/particle_restart.rst @@ -9,8 +9,8 @@ The current version of the particle restart file format is 2.0. **/** :Attributes: - **filetype** (*char[]*) -- String indicating the type of file. - - **version** (*int[2]*) -- Major and minor version of the summary - file format. + - **version** (*int[2]*) -- Major and minor version of the particle + restart file format. - **openmc_version** (*int[3]*) -- Major, minor, and release version number for OpenMC. - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. diff --git a/docs/source/io_formats/track.rst b/docs/source/io_formats/track.rst index e5cb5d46e3..c617cd73e3 100644 --- a/docs/source/io_formats/track.rst +++ b/docs/source/io_formats/track.rst @@ -4,27 +4,18 @@ Track File Format ================= -The current revision of the particle track file format is 1. +The current revision of the particle track file format is 2.0. -**/filetype** (*char[]*) +**/** - String indicating the type of file. +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the track + file format. + - **n_particles** (*int*) -- Number of particles for which tracks + are recorded. + - **n_coords** (*int[]*) -- Number of coordinates for each + particle. -**/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. +:Datasets: + - **coordinates_** (*double[][3]*) -- (x,y,z) coordinates for the + *i*-th particle. diff --git a/docs/source/io_formats/volume.rst b/docs/source/io_formats/volume.rst index 10b7a3b732..456a06eef5 100644 --- a/docs/source/io_formats/volume.rst +++ b/docs/source/io_formats/volume.rst @@ -4,19 +4,31 @@ Volume File Format ================== +The current version of the volume file format is 1.0. + **/** -:Attributes: - **samples** (*int*) -- Number of samples +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the summary + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + - **domain_type** (*char[]*) -- The type of domain for which + volumes are calculated, either 'cell', 'material', or 'universe'. + - **samples** (*int*) -- Number of samples - **lower_left** (*double[3]*) -- Lower-left coordinates of bounding box - **upper_right** (*double[3]*) -- Upper-right coordinates of bounding box -**/cell_/** +**/domain_/** :Datasets: - **volume** (*double[2]*) -- Calculated volume and its uncertainty in cubic centimeters - **nuclides** (*char[][]*) -- Names of nuclides identified in the - cell + domain - **atoms** (*double[][2]*) -- Total number of atoms of each nuclide and its uncertainty diff --git a/docs/source/io_formats/voxel.rst b/docs/source/io_formats/voxel.rst index 6b73f2800a..52ae78aaa0 100644 --- a/docs/source/io_formats/voxel.rst +++ b/docs/source/io_formats/voxel.rst @@ -4,22 +4,24 @@ Voxel Plot File Format ====================== -**/filetype** (*char[]*) +The current version of the voxel file format is 1.0. - String indicating the type of file. +**/** -**/num_voxels** (*int[3]*) +:Attributes: - **filetype** (*char[]*) -- String indicating the type of file. + - **version** (*int[2]*) -- Major and minor version of the voxel + file format. + - **openmc_version** (*int[3]*) -- Major, minor, and release + version number for OpenMC. + - **git_sha1** (*char[40]*) -- Git commit SHA-1 hash. + - **date_and_time** (*char[]*) -- Date and time the summary was + written. + - **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. - 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. +:Datasets: + - **data** (*int[][][]*) -- Data for each voxel that represents a + material or cell ID. diff --git a/scripts/openmc-voxel-to-silovtk b/scripts/openmc-voxel-to-silovtk index 1329b6b6c7..471047127e 100755 --- a/scripts/openmc-voxel-to-silovtk +++ b/scripts/openmc-voxel-to-silovtk @@ -27,9 +27,9 @@ def parse_options(): 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 + dimension = fh.attrs['num_voxels'] + width = fh.attrs['voxel_width'] + lower_left = fh.attrs['lower_left'] voxel_data = fh['data'].value nx, ny, nz = dimension @@ -40,7 +40,7 @@ def main(filename, o): import vtk except: print('The vtk python bindings do not appear to be installed ' - 'properly.\nOn Ubuntu: sudo apt-get install python-vtk\n' + 'properly.\nOn Ubuntu: sudo apt install python-vtk\n' 'See: http://www.vtk.org/') return diff --git a/src/constants.F90 b/src/constants.F90 index d1095d786b..4b57ac5406 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -21,6 +21,7 @@ module constants integer, parameter :: VERSION_TRACK(2) = [2, 0] integer, parameter :: VERSION_SUMMARY(2) = [5, 0] integer, parameter :: VERSION_VOLUME(2) = [1, 0] + integer, parameter :: VERSION_VOXEL(2) = [1, 0] character(10), parameter :: VERSION_MULTIPOLE = "v0.2" ! ============================================================================ diff --git a/src/plot.F90 b/src/plot.F90 index b5832bbdfa..5ed6ee853f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -8,7 +8,7 @@ module plot use hdf5_interface use mesh, only: get_mesh_indices use mesh_header, only: RegularMesh - use output, only: write_message + use output, only: write_message, time_stamp use particle_header, only: LocalCoord, Particle use plot_header use ppmlib, only: Image, init_image, allocate_image, & @@ -381,11 +381,20 @@ contains ! Open binary plot file for writing file_id = file_create(pl%path_plot) - ! write plot header info - 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) + ! write header info + call write_attribute(file_id, "filetype", 'voxel') + call write_attribute(file_id, "version", VERSION_VOXEL) + call write_attribute(file_id, "openmc_version", VERSION) +#ifdef GIT_SHA1 + call write_attribute(file_id, "git_sha1", GIT_SHA1) +#endif + + ! Write current date and time + call write_attribute(file_id, "date_and_time", time_stamp()) + + call write_attribute(file_id, "num_voxels", pl%pixels) + call write_attribute(file_id, "voxel_width", vox) + call write_attribute(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 diff --git a/src/state_point.F90 b/src/state_point.F90 index 378fde6519..f3b452953b 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -42,7 +42,6 @@ contains 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, tallies_group, tally_group, meshes_group, & mesh_group, filter_group, derivs_group, deriv_group, & diff --git a/tests/test_plot/test_plot.py b/tests/test_plot/test_plot.py index 606a1fd647..718d6505c9 100644 --- a/tests/test_plot/test_plot.py +++ b/tests/test_plot/test_plot.py @@ -50,10 +50,10 @@ class PlotTestHarness(TestHarness): voxel_files = glob.glob(os.path.join(os.getcwd(), '*.voxel')) for fname in sorted(voxel_files): with h5py.File(fname, 'r') as fh: - outstr += fh['filetype'].value - outstr += fh['num_voxels'].value.tostring() - outstr += fh['lower_left'].value.tostring() - outstr += fh['voxel_width'].value.tostring() + outstr += fh.attrs['filetype'] + outstr += fh.attrs['num_voxels'].tostring() + outstr += fh.attrs['lower_left'].tostring() + outstr += fh.attrs['voxel_width'].tostring() outstr += fh['data'].value.tostring() # Hash the information and return. From f0d9acc59625f202b3960a9552eb7f4f485faf79 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 12:12:18 -0600 Subject: [PATCH 45/66] Change plot names (plot ID as suffix). Voxel files are now .h5 --- src/input_xml.F90 | 4 +- src/plot.F90 | 171 +++++++++++++++++------------------ tests/test_plot/settings.xml | 11 +-- tests/test_plot/test_plot.py | 35 ++++--- 4 files changed, 101 insertions(+), 120 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index b1d62e6283..fc4d5a581c 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -4261,14 +4261,14 @@ contains end select ! Set output file path - filename = trim(to_str(pl % id)) // "_plot" + filename = "plot_" // trim(to_str(pl % id)) if (check_for_node(node_plot, "filename")) & call get_node_value(node_plot, "filename", filename) select case (pl % type) case (PLOT_TYPE_SLICE) pl % path_plot = trim(path_input) // trim(filename) // ".ppm" case (PLOT_TYPE_VOXEL) - pl % path_plot = trim(path_input) // trim(filename) // ".voxel" + pl % path_plot = trim(path_input) // trim(filename) // ".h5" end select ! Copy plot pixel size diff --git a/src/plot.F90 b/src/plot.F90 index 5ed6ee853f..dd0d4bfbd8 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -29,22 +29,21 @@ contains subroutine run_plot() integer :: i ! loop index for plots - type(ObjectPlot), pointer :: pl => null() do i = 1, n_plots - pl => plots(i) + associate (pl => plots(i)) + ! Display output message + call write_message("Processing plot " // trim(to_str(pl % id)) & + // ": " // trim(pl % path_plot) // " ...", 5) - ! Display output message - call write_message("Processing plot " // trim(to_str(pl % id)) & - &// ": " // trim(pl % path_plot) // " ...", 5) - - if (pl % type == PLOT_TYPE_SLICE) then - ! create 2d image - call create_ppm(pl) - else if (pl % type == PLOT_TYPE_VOXEL) then - ! create dump for 3D silomesh utility script - call create_3d_dump(pl) - end if + if (pl % type == PLOT_TYPE_SLICE) then + ! create 2d image + call create_ppm(pl) + else if (pl % type == PLOT_TYPE_VOXEL) then + ! create dump for 3D silomesh utility script + call create_3d_dump(pl) + end if + end associate end do end subroutine run_plot @@ -55,15 +54,13 @@ contains !=============================================================================== subroutine position_rgb(p, pl, rgb, id) - - type(Particle), intent(inout) :: p - type(ObjectPlot), pointer, intent(in) :: pl - integer, intent(out) :: rgb(3) - integer, intent(out) :: id + type(Particle), intent(inout) :: p + type(ObjectPlot), intent(in) :: pl + integer, intent(out) :: rgb(3) + integer, intent(out) :: id integer :: j logical :: found_cell - type(Cell), pointer :: c p % n_coord = 1 @@ -81,19 +78,20 @@ contains else if (pl % color_by == PLOT_COLOR_MATS) then ! Assign color based on material - c => cells(p % coord(j) % cell) - if (c % type == CELL_FILL) then - ! If we stopped on a middle universe level, treat as if not found - rgb = pl % not_found % rgb - id = -1 - else if (p % material == MATERIAL_VOID) then - ! By default, color void cells white - rgb = 255 - id = -1 - else - rgb = pl % colors(p % material) % rgb - id = materials(p % material) % id - end if + associate (c => cells(p % coord(j) % cell)) + if (c % type == CELL_FILL) then + ! If we stopped on a middle universe level, treat as if not found + rgb = pl % not_found % rgb + id = -1 + else if (p % material == MATERIAL_VOID) then + ! By default, color void cells white + rgb = 255 + id = -1 + else + rgb = pl % colors(p % material) % rgb + id = materials(p % material) % id + end if + end associate else if (pl % color_by == PLOT_COLOR_CELLS) then ! Assign color based on cell rgb = pl % colors(p % coord(j) % cell) % rgb @@ -112,8 +110,7 @@ contains !=============================================================================== subroutine create_ppm(pl) - - type(ObjectPlot), pointer :: pl + type(ObjectPlot), intent(in) :: pl integer :: in_i integer :: out_i @@ -183,7 +180,7 @@ contains if (associated(pl % meshlines_mesh)) call draw_mesh_lines(pl, img) ! Write out the ppm to a file - call output_ppm(pl,img) + call output_ppm(pl, img) ! Free up space call deallocate_image(img) @@ -196,10 +193,10 @@ contains !=============================================================================== ! DRAW_MESH_LINES draws mesh line boundaries on an image !=============================================================================== - subroutine draw_mesh_lines(pl, img) - type(ObjectPlot), pointer, intent(in) :: pl - type(Image), intent(inout) :: img + subroutine draw_mesh_lines(pl, img) + type(ObjectPlot), intent(in) :: pl + type(Image), intent(inout) :: img logical :: in_mesh integer :: out_, in_ ! pixel location @@ -216,9 +213,6 @@ 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(RegularMesh), pointer :: m - - m => pl % meshlines_mesh r = pl % meshlines_color % rgb(1) g = pl % meshlines_color % rgb(2) @@ -246,55 +240,57 @@ contains width = xyz_ur_plot - xyz_ll_plot - call get_mesh_indices(m, xyz_ll_plot, ijk_ll(:m % n_dimension), in_mesh) - call get_mesh_indices(m, xyz_ur_plot, ijk_ur(:m % n_dimension), in_mesh) + associate (m => pl % meshlines_mesh) + call get_mesh_indices(m, xyz_ll_plot, ijk_ll(:m % n_dimension), in_mesh) + call get_mesh_indices(m, xyz_ur_plot, ijk_ur(:m % n_dimension), in_mesh) - ! sweep through all meshbins on this plane and draw borders - do i = ijk_ll(outer), ijk_ur(outer) - do j = ijk_ll(inner), ijk_ur(inner) - ! check if we're in the mesh for this ijk - if (i > 0 .and. i <= m % dimension(outer) .and. & - j > 0 .and. j <= m % dimension(inner)) then + ! sweep through all meshbins on this plane and draw borders + do i = ijk_ll(outer), ijk_ur(outer) + do j = ijk_ll(inner), ijk_ur(inner) + ! check if we're in the mesh for this ijk + if (i > 0 .and. i <= m % dimension(outer) .and. & + j > 0 .and. j <= m % dimension(inner)) then - ! get xyz's of lower left and upper right of this mesh cell - xyz_ll(outer) = m % lower_left(outer) + m % width(outer) * (i - 1) - xyz_ll(inner) = m % lower_left(inner) + m % width(inner) * (j - 1) - xyz_ur(outer) = m % lower_left(outer) + m % width(outer) * i - xyz_ur(inner) = m % lower_left(inner) + m % width(inner) * j + ! get xyz's of lower left and upper right of this mesh cell + xyz_ll(outer) = m % lower_left(outer) + m % width(outer) * (i - 1) + xyz_ll(inner) = m % lower_left(inner) + m % width(inner) * (j - 1) + xyz_ur(outer) = m % lower_left(outer) + m % width(outer) * i + xyz_ur(inner) = m % lower_left(inner) + m % width(inner) * j - ! map the xyz ranges to pixel ranges + ! map the xyz ranges to pixel ranges - frac = (xyz_ll(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(1) = int(frac * real(img % width, 8)) - frac = (xyz_ur(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(2) = int(frac * real(img % width, 8)) + frac = (xyz_ll(outer) - xyz_ll_plot(outer)) / width(outer) + outrange(1) = int(frac * real(img % width, 8)) + frac = (xyz_ur(outer) - xyz_ll_plot(outer)) / width(outer) + outrange(2) = int(frac * real(img % width, 8)) - frac = (xyz_ur(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(1) = int((ONE - frac) * real(img % height, 8)) - frac = (xyz_ll(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(2) = int((ONE - frac) * real(img % height, 8)) + frac = (xyz_ur(inner) - xyz_ll_plot(inner)) / width(inner) + inrange(1) = int((ONE - frac) * real(img % height, 8)) + frac = (xyz_ll(inner) - xyz_ll_plot(inner)) / width(inner) + inrange(2) = int((ONE - frac) * real(img % height, 8)) - ! draw lines - do out_ = outrange(1), outrange(2) - do plus = 0, pl % meshlines_width - call set_pixel(img, out_, inrange(1) + plus, r, g, b) - call set_pixel(img, out_, inrange(2) + plus, r, g, b) - call set_pixel(img, out_, inrange(1) - plus, r, g, b) - call set_pixel(img, out_, inrange(2) - plus, r, g, b) + ! draw lines + do out_ = outrange(1), outrange(2) + do plus = 0, pl % meshlines_width + call set_pixel(img, out_, inrange(1) + plus, r, g, b) + call set_pixel(img, out_, inrange(2) + plus, r, g, b) + call set_pixel(img, out_, inrange(1) - plus, r, g, b) + call set_pixel(img, out_, inrange(2) - plus, r, g, b) + end do end do - end do - do in_ = inrange(1), inrange(2) - do plus = 0, pl % meshlines_width - call set_pixel(img, outrange(1) + plus, in_, r, g, b) - call set_pixel(img, outrange(2) + plus, in_, r, g, b) - call set_pixel(img, outrange(1) - plus, in_, r, g, b) - call set_pixel(img, outrange(2) - plus, in_, r, g, b) + do in_ = inrange(1), inrange(2) + do plus = 0, pl % meshlines_width + call set_pixel(img, outrange(1) + plus, in_, r, g, b) + call set_pixel(img, outrange(2) + plus, in_, r, g, b) + call set_pixel(img, outrange(1) - plus, in_, r, g, b) + call set_pixel(img, outrange(2) - plus, in_, r, g, b) + end do end do - end do - end if + end if + end do end do - end do + end associate end subroutine draw_mesh_lines @@ -303,9 +299,8 @@ contains !=============================================================================== subroutine output_ppm(pl, img) - - type(ObjectPlot), pointer :: pl - type(Image), intent(in) :: img + type(ObjectPlot), intent(in) :: pl + type(Image), intent(in) :: img integer :: i ! loop index for height integer :: j ! loop index for width @@ -316,20 +311,19 @@ contains ! Write header write(unit_plot, '(A2)') 'P6' - write(unit_plot, '(I0,'' '',I0)') img%width, img%height + 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)), & - achar(img%green(i,j)), achar(img%blue(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) - end subroutine output_ppm !=============================================================================== @@ -345,8 +339,7 @@ contains !=============================================================================== subroutine create_3d_dump(pl) - - type(ObjectPlot), pointer :: pl + type(ObjectPlot), intent(in) :: pl integer :: x, y, z ! voxel location indices integer :: rgb(3) ! colors (red, green, blue) from 0-255 diff --git a/tests/test_plot/settings.xml b/tests/test_plot/settings.xml index 37623cb1fb..197b9c7093 100644 --- a/tests/test_plot/settings.xml +++ b/tests/test_plot/settings.xml @@ -1,16 +1,7 @@ - eigenvalue - 10 - 5 - 1000 - - - - -4 -4 -4 4 4 4 - - + plot 5 4 3 diff --git a/tests/test_plot/test_plot.py b/tests/test_plot/test_plot.py index 718d6505c9..b21e1aada8 100644 --- a/tests/test_plot/test_plot.py +++ b/tests/test_plot/test_plot.py @@ -33,28 +33,25 @@ class PlotTestHarness(TestHarness): for fname in self._plot_names: path = os.path.join(os.getcwd(), fname) if os.path.exists(path): - #os.remove(path) - pass + os.remove(path) def _get_results(self): """Return a string hash of the plot files.""" outstr = bytes() - # Add PPM output to results - ppm_files = glob.glob(os.path.join(os.getcwd(), '*.ppm')) - for fname in sorted(ppm_files): - with open(fname, 'rb') as fh: - outstr += fh.read() - - # Add voxel data to results - voxel_files = glob.glob(os.path.join(os.getcwd(), '*.voxel')) - for fname in sorted(voxel_files): - with h5py.File(fname, 'r') as fh: - outstr += fh.attrs['filetype'] - outstr += fh.attrs['num_voxels'].tostring() - outstr += fh.attrs['lower_left'].tostring() - outstr += fh.attrs['voxel_width'].tostring() - outstr += fh['data'].value.tostring() + for fname in self._plot_names: + if fname.endswith('.ppm'): + # Add PPM output to results + with open(fname, 'rb') as fh: + outstr += fh.read() + elif fname.endswith('.h5'): + # Add voxel data to results + with h5py.File(fname, 'r') as fh: + outstr += fh.attrs['filetype'] + outstr += fh.attrs['num_voxels'].tostring() + outstr += fh.attrs['lower_left'].tostring() + outstr += fh.attrs['voxel_width'].tostring() + outstr += fh['data'].value.tostring() # Hash the information and return. sha512 = hashlib.sha512() @@ -65,6 +62,6 @@ class PlotTestHarness(TestHarness): if __name__ == '__main__': - harness = PlotTestHarness(('1_plot.ppm', '2_plot.ppm', '3_plot.ppm', - '4_plot.voxel')) + harness = PlotTestHarness(('plot_1.ppm', 'plot_2.ppm', 'plot_3.ppm', + 'plot_4.h5')) harness.main() From 40a931f97bfdc03380820f86cf9243f218baf99b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 20 Feb 2017 13:17:50 -0600 Subject: [PATCH 46/66] Parallelize slice plots --- CMakeLists.txt | 1 - src/plot.F90 | 118 +++++++++++++++++++++-------------------- src/ppmlib.F90 | 127 --------------------------------------------- src/ppmlib.LICENSE | 4 -- 4 files changed, 58 insertions(+), 192 deletions(-) delete mode 100644 src/ppmlib.F90 delete mode 100644 src/ppmlib.LICENSE diff --git a/CMakeLists.txt b/CMakeLists.txt index 098de3de2a..3ecdc1e9bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -318,7 +318,6 @@ set(LIBOPENMC_FORTRAN_SRC src/physics_mg.F90 src/plot.F90 src/plot_header.F90 - src/ppmlib.F90 src/product_header.F90 src/progress_header.F90 src/random_lcg.F90 diff --git a/src/plot.F90 b/src/plot.F90 index dd0d4bfbd8..86d303b3dd 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -11,14 +11,19 @@ module plot use output, only: write_message, time_stamp use particle_header, only: LocalCoord, Particle use plot_header - use ppmlib, only: Image, init_image, allocate_image, & - deallocate_image, set_pixel use progress_header, only: ProgressBar use string, only: to_str use hdf5 implicit none + private + + public :: run_plot + + integer, parameter :: RED = 1 + integer, parameter :: GREEN = 2 + integer, parameter :: BLUE = 3 contains @@ -41,7 +46,7 @@ contains call create_ppm(pl) else if (pl % type == PLOT_TYPE_VOXEL) then ! create dump for 3D silomesh utility script - call create_3d_dump(pl) + call create_voxel(pl) end if end associate end do @@ -117,19 +122,22 @@ contains integer :: x, y ! pixel location integer :: rgb(3) ! colors (red, green, blue) from 0-255 integer :: id + integer :: height, width real(8) :: in_pixel real(8) :: out_pixel real(8) :: xyz(3) - type(Image) :: img + integer, allocatable :: data(:,:,:) type(Particle) :: p - type(ProgressBar) :: progress - ! Initialize and allocate space for image - call init_image(img) - call allocate_image(img, pl % pixels(1), pl % pixels(2)) + width = pl % pixels(1) + height = pl % pixels(2) - in_pixel = pl % width(1)/dble(pl % pixels(1)) - out_pixel = pl % width(2)/dble(pl % pixels(2)) + in_pixel = pl % width(1)/dble(width) + out_pixel = pl % width(2)/dble(height) + + ! Allocate and initialize results array + allocate(data(3, width, height)) + data(:,:,:) = 0 if (pl % basis == PLOT_BASIS_XY) then in_i = 1 @@ -157,36 +165,28 @@ contains p % coord(1) % uvw = [ HALF, HALF, HALF ] p % coord(1) % universe = BASE_UNIVERSE - do y = 1, img % height - call progress % set_value(dble(y)/dble(img % height)*100) - do x = 1, img % width +!$omp parallel do firstprivate(p) private(x, rgb, id) reduction(+ : data) + do y = 1, height + ! Set y coordinate + p % coord(1) % xyz(out_i) = xyz(out_i) - out_pixel*(y - 1) + do x = 1, width + ! Set x coordinate + p % coord(1) % xyz(in_i) = xyz(in_i) + in_pixel*(x - 1) ! get pixel color call position_rgb(p, pl, rgb, id) ! Create a pixel at (x,y) with color (r,g,b) - call set_pixel(img, x-1, y-1, rgb(1), rgb(2), rgb(3)) - - ! Advance pixel in first direction - p % coord(1) % xyz(in_i) = p % coord(1) % xyz(in_i) + in_pixel + data(:, x, y) = rgb end do - - ! Advance pixel in second direction - p % coord(1) % xyz(in_i) = xyz(in_i) - p % coord(1) % xyz(out_i) = p % coord(1) % xyz(out_i) - out_pixel end do +!$omp end parallel do ! Draw tally mesh boundaries on the image if requested - if (associated(pl % meshlines_mesh)) call draw_mesh_lines(pl, img) + if (associated(pl % meshlines_mesh)) call draw_mesh_lines(pl, data) ! Write out the ppm to a file - call output_ppm(pl, img) - - ! Free up space - call deallocate_image(img) - - ! Clear particle - call p % clear() + call output_ppm(pl, data) end subroutine create_ppm @@ -194,13 +194,13 @@ contains ! DRAW_MESH_LINES draws mesh line boundaries on an image !=============================================================================== - subroutine draw_mesh_lines(pl, img) + subroutine draw_mesh_lines(pl, data) type(ObjectPlot), intent(in) :: pl - type(Image), intent(inout) :: img + integer, intent(inout) :: data(:,:,:) logical :: in_mesh integer :: out_, in_ ! pixel location - integer :: r, g, b ! RGB color for meshlines pixels + integer :: rgb(3) ! RGB color for meshlines pixels integer :: outrange(2), inrange(2) ! range of pixel locations integer :: i, j ! loop indices integer :: plus @@ -214,9 +214,7 @@ contains real(8) :: xyz_ll(3) ! lower left xyz real(8) :: xyz_ur(3) ! upper right xyz - r = pl % meshlines_color % rgb(1) - g = pl % meshlines_color % rgb(2) - b = pl % meshlines_color % rgb(3) + rgb(:) = pl % meshlines_color % rgb select case (pl % basis) case(PLOT_BASIS_XY) @@ -260,30 +258,30 @@ contains ! map the xyz ranges to pixel ranges frac = (xyz_ll(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(1) = int(frac * real(img % width, 8)) + outrange(1) = int(frac * real(pl % pixels(1), 8)) frac = (xyz_ur(outer) - xyz_ll_plot(outer)) / width(outer) - outrange(2) = int(frac * real(img % width, 8)) + outrange(2) = int(frac * real(pl % pixels(1), 8)) frac = (xyz_ur(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(1) = int((ONE - frac) * real(img % height, 8)) + inrange(1) = int((ONE - frac) * real(pl % pixels(2), 8)) frac = (xyz_ll(inner) - xyz_ll_plot(inner)) / width(inner) - inrange(2) = int((ONE - frac) * real(img % height, 8)) + inrange(2) = int((ONE - frac) * real(pl % pixels(2), 8)) ! draw lines do out_ = outrange(1), outrange(2) do plus = 0, pl % meshlines_width - call set_pixel(img, out_, inrange(1) + plus, r, g, b) - call set_pixel(img, out_, inrange(2) + plus, r, g, b) - call set_pixel(img, out_, inrange(1) - plus, r, g, b) - call set_pixel(img, out_, inrange(2) - plus, r, g, b) + data(:, out_ + 1, inrange(1) + plus + 1) = rgb + data(:, out_ + 1, inrange(2) + plus + 1) = rgb + data(:, out_ + 1, inrange(1) - plus + 1) = rgb + data(:, out_ + 1, inrange(2) - plus + 1) = rgb end do end do do in_ = inrange(1), inrange(2) do plus = 0, pl % meshlines_width - call set_pixel(img, outrange(1) + plus, in_, r, g, b) - call set_pixel(img, outrange(2) + plus, in_, r, g, b) - call set_pixel(img, outrange(1) - plus, in_, r, g, b) - call set_pixel(img, outrange(2) - plus, in_, r, g, b) + data(:, outrange(1) + plus + 1, in_ + 1) = rgb + data(:, outrange(2) + plus + 1, in_ + 1) = rgb + data(:, outrange(1) - plus + 1, in_ + 1) = rgb + data(:, outrange(2) - plus + 1, in_ + 1) = rgb end do end do @@ -298,12 +296,12 @@ contains ! OUTPUT_PPM writes out a previously generated image to a PPM file !=============================================================================== - subroutine output_ppm(pl, img) + subroutine output_ppm(pl, data) type(ObjectPlot), intent(in) :: pl - type(Image), intent(in) :: img + integer, intent(in) :: data(:,:,:) - integer :: i ! loop index for height - integer :: j ! loop index for width + integer :: y ! loop index for height + integer :: x ! loop index for width integer :: unit_plot ! Open PPM file for writing @@ -311,14 +309,14 @@ contains ! Write header write(unit_plot, '(A2)') 'P6' - write(unit_plot, '(I0,'' '',I0)') img % width, img % height + write(unit_plot, '(I0,'' '',I0)') pl % pixels(1), pl % pixels(2) 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)), & - achar(img % green(i,j)), achar(img % blue(i,j)) + do y = 1, pl % pixels(2) + do x = 1, pl % pixels(1) + write(unit_plot, '(3A1)', advance='no') achar(data(RED, x, y)), & + achar(data(GREEN, x, y)), achar(data(BLUE, x, y)) end do end do @@ -327,7 +325,7 @@ contains end subroutine output_ppm !=============================================================================== -! CREATE_3D_DUMP outputs a binary file that can be input into silomesh for 3D +! CREATE_VOXEL outputs a binary file that can be input into silomesh for 3D ! geometry visualization. It works the same way as create_ppm by dragging a ! particle across the geometry for the specified number of voxels. The first ! 3 int(4)'s in the binary are the number of x, y, and z voxels. The next 3 @@ -338,7 +336,7 @@ contains ! id. For 1 million voxels this produces a file of approximately 15MB. !=============================================================================== - subroutine create_3d_dump(pl) + subroutine create_voxel(pl) type(ObjectPlot), intent(in) :: pl integer :: x, y, z ! voxel location indices @@ -348,7 +346,7 @@ contains 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) :: memspace integer(HID_T) :: dset integer(HSIZE_T) :: dims(3) integer(HSIZE_T) :: dims_slab(3) @@ -445,6 +443,6 @@ contains call h5sclose_f(memspace, hdf5_err) call file_close(file_id) - end subroutine create_3d_dump + end subroutine create_voxel end module plot diff --git a/src/ppmlib.F90 b/src/ppmlib.F90 deleted file mode 100644 index ebd8105bef..0000000000 --- a/src/ppmlib.F90 +++ /dev/null @@ -1,127 +0,0 @@ -module ppmlib - - implicit none - -!=============================================================================== -! Image holds RGB information for output PPM image -!=============================================================================== - - type Image - integer, dimension(:,:), pointer :: red, green, blue - integer :: width, height - end type Image - -contains - -!=============================================================================== -! INIT_IMAGE initializes the Image derived type -!=============================================================================== - - subroutine init_image(img) - - type(Image), intent(out) :: img - - nullify(img % red) - nullify(img % green) - nullify(img % blue) - - img % width = 0 - img % height = 0 - - end subroutine init_image - -!=============================================================================== -! ALLOCATE_IMAGE sets the width and height of an image and allocates color -! arrays -!=============================================================================== - - subroutine allocate_image(img, w, h) - - type(Image), intent(inout) :: img - integer, intent(in) :: w ! width of image - integer, intent(in) :: h ! height of image - - ! allocate red, green, and blue array - allocate(img % red(w, h)) - allocate(img % green(w, h)) - allocate(img % blue(w, h)) - - ! set width and height - img % width = w - img % height = h - - end subroutine allocate_image - -!=============================================================================== -! DEALLOCATE_IMAGE -!=============================================================================== - - subroutine deallocate_image(img) - - type(Image) :: img - - if (associated(img % red)) deallocate(img % red) - if (associated(img % green)) deallocate(img % green) - if (associated(img % blue)) deallocate(img % blue) - - end subroutine deallocate_image - -!=============================================================================== -! INSIDE_IMAGE determines whether a point (x,y) is inside the image -!=============================================================================== - - - function inside_image(img, x, y) result(inside) - - type(Image), intent(in) :: img - integer, intent(in) :: x, y - logical :: inside - - inside = .false. - - if ((x < img % width) .and. (y < img % height) .and. & - (x >= 0) .and. (y >= 0)) inside = .true. - - end function inside_image - -!=============================================================================== -! VALID_IMAGE checks whether the image has a width and height and if its color -! arrays are allocated -!=============================================================================== - - function valid_image(img) result(valid) - - type(Image), intent(in) :: img - logical :: valid - - valid = .false. - - if (img % width == 0) return - if (img % height == 0) return - if (.not. associated(img % red) .or. & - .not. associated(img % green) .or. & - .not. associated(img % blue)) return - - valid = .true. - - end function valid_image - -!=============================================================================== -! SET_PIXEL sets the colors for a given pixel -!=============================================================================== - - subroutine set_pixel(img, x, y, r, g, b) - - type(Image), intent(inout) :: img - integer, intent(in) :: x, y ! coordinates - integer, intent(in) :: r, g, b ! red, green, and blue - - if (inside_image(img, x, y) .and. valid_image(img)) then - img % red(x+1,y+1) = mod(abs(r), 256) - img % green(x+1, y+1) = mod(abs(g), 256) - img % blue(x+1, y+1) = mod(abs(b), 256) - end if - - end subroutine set_pixel - -end module ppmlib diff --git a/src/ppmlib.LICENSE b/src/ppmlib.LICENSE deleted file mode 100644 index a733e8d3e9..0000000000 --- a/src/ppmlib.LICENSE +++ /dev/null @@ -1,4 +0,0 @@ -The source code in ppmlib.F90 is adapted from code found on Rosetta Code - which was authored -by Mauro Panigada. The authors of OpenMC have obtained permission from Mauro -Panigada to use and distribution this source code as part of OpenMC. From 7d01622403cd536e32bf45574ddf7210bba87854 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 21 Feb 2017 21:07:01 -0600 Subject: [PATCH 47/66] Update two Jupyter notebooks --- .../pythonapi/examples/mgxs-part-ii.ipynb | 1562 +++++++++-------- .../pythonapi/examples/mgxs-part-iii.ipynb | 484 ++--- 2 files changed, 1029 insertions(+), 1017 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index bab3b6bfcc..5e48244b7e 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -34,7 +34,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/lib/python3.6/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/python3/lib/python3.5/site-packages/matplotlib/__init__.py:1401: 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", @@ -46,7 +46,7 @@ "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", + "plt.style.use('seaborn-dark')\n", "\n", "import openmoc\n", "from openmoc.opencg_compatible import get_openmoc_geometry\n", @@ -54,6 +54,7 @@ "import openmc\n", "import openmc.mgxs as mgxs\n", "import openmc.data\n", + "from openmc.opencg_compatible import get_opencg_geometry\n", "\n", "%matplotlib inline" ] @@ -453,9 +454,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 54b65c8bda6af5788bd762b8cf9855d1a8008238\n", - " Date/Time | 2017-02-12 13:37:37\n", - " OpenMP Threads | 8\n", + " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", + " Date/Time | 2017-02-21 15:07:51\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -465,11 +466,11 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", + " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -483,85 +484,93 @@ " ========= ======== ==================== \n", " 1/1 1.20332 \n", " 2/1 1.22209 \n", - " 3/1 1.24309 \n", - " 4/1 1.22833 \n", - " 5/1 1.21786 \n", - " 6/1 1.22005 \n", - " 7/1 1.20894 \n", - " 8/1 1.22071 \n", - " 9/1 1.21279 \n", - " 10/1 1.22198 \n", - " 11/1 1.22287 \n", - " 12/1 1.25490 1.23888 +/- 0.01602\n", - " 13/1 1.20224 1.22667 +/- 0.01532\n", - " 14/1 1.23375 1.22844 +/- 0.01098\n", - " 15/1 1.23068 1.22889 +/- 0.00851\n", - " 16/1 1.23073 1.22920 +/- 0.00696\n", - " 17/1 1.25364 1.23269 +/- 0.00684\n", - " 18/1 1.20820 1.22963 +/- 0.00667\n", - " 19/1 1.23138 1.22982 +/- 0.00588\n", - " 20/1 1.20682 1.22752 +/- 0.00574\n", - " 21/1 1.23580 1.22827 +/- 0.00525\n", - " 22/1 1.24190 1.22941 +/- 0.00492\n", - " 23/1 1.23125 1.22955 +/- 0.00453\n", - " 24/1 1.21606 1.22859 +/- 0.00430\n", - " 25/1 1.23653 1.22912 +/- 0.00404\n", - " 26/1 1.23850 1.22970 +/- 0.00383\n", - " 27/1 1.20986 1.22853 +/- 0.00378\n", - " 28/1 1.25277 1.22988 +/- 0.00381\n", - " 29/1 1.23334 1.23006 +/- 0.00361\n", - " 30/1 1.24345 1.23073 +/- 0.00349\n", - " 31/1 1.21565 1.23001 +/- 0.00339\n", - " 32/1 1.20555 1.22890 +/- 0.00342\n", - " 33/1 1.22995 1.22895 +/- 0.00327\n", - " 34/1 1.19763 1.22764 +/- 0.00339\n", - " 35/1 1.22645 1.22760 +/- 0.00325\n", - " 36/1 1.23900 1.22803 +/- 0.00316\n", - " 37/1 1.24305 1.22859 +/- 0.00309\n", - " 38/1 1.22484 1.22846 +/- 0.00298\n", - " 39/1 1.20986 1.22782 +/- 0.00294\n", - " 40/1 1.23764 1.22814 +/- 0.00286\n", - " 41/1 1.20476 1.22739 +/- 0.00287\n", - " 42/1 1.21652 1.22705 +/- 0.00280\n", - " 43/1 1.21279 1.22662 +/- 0.00275\n", - " 44/1 1.20210 1.22590 +/- 0.00276\n", - " 45/1 1.22644 1.22591 +/- 0.00268\n", - " 46/1 1.22907 1.22600 +/- 0.00261\n", - " 47/1 1.24057 1.22639 +/- 0.00257\n", - " 48/1 1.21610 1.22612 +/- 0.00251\n", - " 49/1 1.22199 1.22602 +/- 0.00245\n", - " 50/1 1.20860 1.22558 +/- 0.00243\n", - " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10050\n", - " The estimated number of batches is 73\n", + " 3/1 1.24322 \n", + " 4/1 1.21622 \n", + " 5/1 1.25850 \n", + " 6/1 1.22581 \n", + " 7/1 1.21118 \n", + " 8/1 1.23377 \n", + " 9/1 1.24254 \n", + " 10/1 1.21241 \n", + " 11/1 1.21042 \n", + " 12/1 1.23539 1.22290 +/- 0.01249\n", + " 13/1 1.22436 1.22339 +/- 0.00723\n", + " 14/1 1.22888 1.22476 +/- 0.00529\n", + " 15/1 1.22553 1.22491 +/- 0.00410\n", + " 16/1 1.24194 1.22775 +/- 0.00439\n", + " 17/1 1.24755 1.23058 +/- 0.00466\n", + " 18/1 1.21117 1.22815 +/- 0.00471\n", + " 19/1 1.22530 1.22784 +/- 0.00417\n", + " 20/1 1.20762 1.22582 +/- 0.00424\n", + " 21/1 1.20377 1.22381 +/- 0.00433\n", + " 22/1 1.24305 1.22541 +/- 0.00426\n", + " 23/1 1.22434 1.22533 +/- 0.00392\n", + " 24/1 1.22937 1.22562 +/- 0.00364\n", + " 25/1 1.22458 1.22555 +/- 0.00339\n", + " 26/1 1.18978 1.22332 +/- 0.00388\n", + " 27/1 1.20582 1.22229 +/- 0.00379\n", + " 28/1 1.22719 1.22256 +/- 0.00358\n", + " 29/1 1.21307 1.22206 +/- 0.00343\n", + " 30/1 1.20915 1.22141 +/- 0.00331\n", + " 31/1 1.22799 1.22173 +/- 0.00317\n", + " 32/1 1.21251 1.22131 +/- 0.00305\n", + " 33/1 1.20540 1.22062 +/- 0.00299\n", + " 34/1 1.20052 1.21978 +/- 0.00299\n", + " 35/1 1.24552 1.22081 +/- 0.00304\n", + " 36/1 1.21685 1.22066 +/- 0.00293\n", + " 37/1 1.22395 1.22078 +/- 0.00282\n", + " 38/1 1.22379 1.22089 +/- 0.00272\n", + " 39/1 1.20951 1.22049 +/- 0.00265\n", + " 40/1 1.25199 1.22154 +/- 0.00277\n", + " 41/1 1.23243 1.22190 +/- 0.00270\n", + " 42/1 1.20973 1.22152 +/- 0.00264\n", + " 43/1 1.24682 1.22228 +/- 0.00268\n", + " 44/1 1.20694 1.22183 +/- 0.00263\n", + " 45/1 1.22196 1.22183 +/- 0.00256\n", + " 46/1 1.20687 1.22142 +/- 0.00252\n", + " 47/1 1.22023 1.22139 +/- 0.00245\n", + " 48/1 1.22204 1.22140 +/- 0.00239\n", + " 49/1 1.22077 1.22139 +/- 0.00232\n", + " 50/1 1.23166 1.22164 +/- 0.00228\n", + " Triggers unsatisfied, max unc./thresh. is 1.17623 for flux in tally 10057\n", + " The estimated number of batches is 66\n", " Creating state point statepoint.050.h5...\n", - " 51/1 1.21850 1.22541 +/- 0.00237\n", - " 52/1 1.22833 1.22548 +/- 0.00232\n", - " 53/1 1.20239 1.22494 +/- 0.00233\n", - " 54/1 1.24876 1.22548 +/- 0.00234\n", - " 55/1 1.20670 1.22506 +/- 0.00232\n", - " 56/1 1.24260 1.22545 +/- 0.00230\n", - " 57/1 1.21039 1.22512 +/- 0.00228\n", - " 58/1 1.23929 1.22542 +/- 0.00225\n", - " 59/1 1.21357 1.22518 +/- 0.00221\n", - " 60/1 1.23456 1.22537 +/- 0.00218\n", - " 61/1 1.23963 1.22565 +/- 0.00215\n", - " 62/1 1.24020 1.22593 +/- 0.00213\n", - " 63/1 1.22325 1.22587 +/- 0.00209\n", - " 64/1 1.22070 1.22578 +/- 0.00205\n", - " 65/1 1.22423 1.22575 +/- 0.00201\n", - " 66/1 1.22973 1.22582 +/- 0.00198\n", - " 67/1 1.21842 1.22569 +/- 0.00195\n", - " 68/1 1.19552 1.22517 +/- 0.00198\n", - " 69/1 1.21475 1.22500 +/- 0.00196\n", - " 70/1 1.21888 1.22489 +/- 0.00193\n", - " 71/1 1.19720 1.22444 +/- 0.00195\n", - " 72/1 1.23770 1.22465 +/- 0.00193\n", - " 73/1 1.23894 1.22488 +/- 0.00191\n", - " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10050\n", - " The estimated number of batches is 74\n", - " 74/1 1.22437 1.22487 +/- 0.00188\n", - " Triggers satisfied for batch 74\n", - " Creating state point statepoint.074.h5...\n", + " 51/1 1.20071 1.22113 +/- 0.00228\n", + " 52/1 1.21423 1.22097 +/- 0.00223\n", + " 53/1 1.25595 1.22178 +/- 0.00233\n", + " 54/1 1.21806 1.22170 +/- 0.00227\n", + " 55/1 1.22911 1.22186 +/- 0.00223\n", + " 56/1 1.23054 1.22205 +/- 0.00219\n", + " 57/1 1.19384 1.22145 +/- 0.00222\n", + " 58/1 1.20625 1.22114 +/- 0.00220\n", + " 59/1 1.21977 1.22111 +/- 0.00216\n", + " 60/1 1.20813 1.22085 +/- 0.00213\n", + " 61/1 1.22077 1.22085 +/- 0.00209\n", + " 62/1 1.21956 1.22082 +/- 0.00205\n", + " 63/1 1.22360 1.22087 +/- 0.00201\n", + " 64/1 1.23955 1.22122 +/- 0.00200\n", + " 65/1 1.21143 1.22104 +/- 0.00197\n", + " 66/1 1.21791 1.22099 +/- 0.00194\n", + " Triggers unsatisfied, max unc./thresh. is 1.13207 for flux in tally 10057\n", + " The estimated number of batches is 82\n", + " 67/1 1.24897 1.22148 +/- 0.00196\n", + " 68/1 1.22221 1.22149 +/- 0.00193\n", + " 69/1 1.25627 1.22208 +/- 0.00199\n", + " 70/1 1.21493 1.22196 +/- 0.00196\n", + " 71/1 1.23406 1.22216 +/- 0.00193\n", + " 72/1 1.23842 1.22242 +/- 0.00192\n", + " 73/1 1.24542 1.22279 +/- 0.00193\n", + " 74/1 1.21314 1.22263 +/- 0.00190\n", + " 75/1 1.26484 1.22328 +/- 0.00198\n", + " 76/1 1.22243 1.22327 +/- 0.00195\n", + " 77/1 1.21865 1.22320 +/- 0.00192\n", + " 78/1 1.23500 1.22338 +/- 0.00190\n", + " 79/1 1.22125 1.22334 +/- 0.00187\n", + " 80/1 1.23793 1.22355 +/- 0.00186\n", + " 81/1 1.24238 1.22382 +/- 0.00185\n", + " 82/1 1.23493 1.22397 +/- 0.00183\n", + " Triggers satisfied for batch 82\n", + " Creating state point statepoint.082.h5...\n", "\n", " ===========================================================================\n", " ======================> SIMULATION FINISHED <======================\n", @@ -570,27 +579,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.4833E-01 seconds\n", - " Reading cross sections = 2.2326E-01 seconds\n", - " Total time in simulation = 3.0446E+01 seconds\n", - " Time in transport only = 2.9495E+01 seconds\n", - " Time in inactive batches = 1.6469E+00 seconds\n", - " Time in active batches = 2.8800E+01 seconds\n", - " Time synchronizing fission bank = 1.5962E-02 seconds\n", - " Sampling source sites = 1.1235E-02 seconds\n", - " SEND/RECV source sites = 4.6646E-03 seconds\n", - " Time accumulating tallies = 4.9838E-04 seconds\n", - " Total time for finalization = 1.5461E-02 seconds\n", - " Total time elapsed = 3.0842E+01 seconds\n", - " Calculation Rate (inactive) = 60719.1 neutrons/second\n", - " Calculation Rate (active) = 13889.1 neutrons/second\n", + " Total time for initialization = 3.6241E-01 seconds\n", + " Reading cross sections = 2.5754E-01 seconds\n", + " Total time in simulation = 9.0901E+01 seconds\n", + " Time in transport only = 9.0045E+01 seconds\n", + " Time in inactive batches = 2.9786E+00 seconds\n", + " Time in active batches = 8.7923E+01 seconds\n", + " Time synchronizing fission bank = 2.7221E-02 seconds\n", + " Sampling source sites = 1.6637E-02 seconds\n", + " SEND/RECV source sites = 1.0474E-02 seconds\n", + " Time accumulating tallies = 9.2191E-04 seconds\n", + " Total time for finalization = 1.2513E-02 seconds\n", + " Total time elapsed = 9.1307E+01 seconds\n", + " Calculation Rate (inactive) = 33572.9 neutrons/second\n", + " Calculation Rate (active) = 4549.45 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.22358 +/- 0.00179\n", - " k-effective (Track-length) = 1.22487 +/- 0.00188\n", - " k-effective (Absorption) = 1.22300 +/- 0.00114\n", - " Combined k-effective = 1.22347 +/- 0.00106\n", + " k-effective (Collision) = 1.22348 +/- 0.00169\n", + " k-effective (Track-length) = 1.22397 +/- 0.00183\n", + " k-effective (Absorption) = 1.22467 +/- 0.00117\n", + " Combined k-effective = 1.22448 +/- 0.00108\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -634,7 +643,7 @@ "outputs": [], "source": [ "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.074.h5')" + "sp = openmc.StatePoint('statepoint.082.h5')" ] }, { @@ -696,25 +705,25 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [barns]:\n", - " Group 1 [821000.0 - 20000000.0eV]:\t3.30e+00 +/- 2.19e-01%\n", - " Group 2 [5530.0 - 821000.0 eV]:\t3.96e+00 +/- 1.32e-01%\n", - " Group 3 [4.0 - 5530.0 eV]:\t5.52e+01 +/- 2.31e-01%\n", - " Group 4 [0.625 - 4.0 eV]:\t8.83e+01 +/- 2.96e-01%\n", - " Group 5 [0.28 - 0.625 eV]:\t2.90e+02 +/- 4.64e-01%\n", - " Group 6 [0.14 - 0.28 eV]:\t4.49e+02 +/- 4.22e-01%\n", - " Group 7 [0.058 - 0.14 eV]:\t6.87e+02 +/- 2.97e-01%\n", - " Group 8 [0.0 - 0.058 eV]:\t1.44e+03 +/- 2.91e-01%\n", + " Group 1 [821000.0 - 20000000.0eV]:\t3.30e+00 +/- 2.14e-01%\n", + " Group 2 [5530.0 - 821000.0 eV]:\t3.96e+00 +/- 1.33e-01%\n", + " Group 3 [4.0 - 5530.0 eV]:\t5.50e+01 +/- 2.29e-01%\n", + " Group 4 [0.625 - 4.0 eV]:\t8.85e+01 +/- 3.10e-01%\n", + " Group 5 [0.28 - 0.625 eV]:\t2.90e+02 +/- 3.94e-01%\n", + " Group 6 [0.14 - 0.28 eV]:\t4.49e+02 +/- 4.12e-01%\n", + " Group 7 [0.058 - 0.14 eV]:\t6.87e+02 +/- 3.01e-01%\n", + " Group 8 [0.0 - 0.058 eV]:\t1.44e+03 +/- 2.79e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [barns]:\n", - " Group 1 [821000.0 - 20000000.0eV]:\t1.06e+00 +/- 2.56e-01%\n", - " Group 2 [5530.0 - 821000.0 eV]:\t1.21e-03 +/- 2.55e-01%\n", - " Group 3 [4.0 - 5530.0 eV]:\t5.77e-04 +/- 3.67e+00%\n", - " Group 4 [0.625 - 4.0 eV]:\t6.54e-06 +/- 2.74e-01%\n", - " Group 5 [0.28 - 0.625 eV]:\t1.07e-05 +/- 4.55e-01%\n", - " Group 6 [0.14 - 0.28 eV]:\t1.55e-05 +/- 4.25e-01%\n", - " Group 7 [0.058 - 0.14 eV]:\t2.30e-05 +/- 2.97e-01%\n", - " Group 8 [0.0 - 0.058 eV]:\t4.24e-05 +/- 2.90e-01%\n", + " Group 1 [821000.0 - 20000000.0eV]:\t1.06e+00 +/- 2.53e-01%\n", + " Group 2 [5530.0 - 821000.0 eV]:\t1.21e-03 +/- 2.60e-01%\n", + " Group 3 [4.0 - 5530.0 eV]:\t5.73e-04 +/- 2.93e+00%\n", + " Group 4 [0.625 - 4.0 eV]:\t6.54e-06 +/- 2.72e-01%\n", + " Group 5 [0.28 - 0.625 eV]:\t1.07e-05 +/- 3.83e-01%\n", + " Group 6 [0.14 - 0.28 eV]:\t1.55e-05 +/- 4.13e-01%\n", + " Group 7 [0.058 - 0.14 eV]:\t2.30e-05 +/- 3.01e-01%\n", + " Group 8 [0.0 - 0.058 eV]:\t4.24e-05 +/- 2.79e-01%\n", "\n", "\n", "\n" @@ -724,7 +733,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] } @@ -757,14 +766,14 @@ "\tDomain Type =\tcell\n", "\tDomain ID =\t10000\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [821000.0 - 20000000.0eV]:\t2.52e-02 +/- 2.44e-01%\n", - " Group 2 [5530.0 - 821000.0 eV]:\t1.51e-03 +/- 1.30e-01%\n", - " Group 3 [4.0 - 5530.0 eV]:\t2.07e-02 +/- 2.31e-01%\n", - " Group 4 [0.625 - 4.0 eV]:\t3.31e-02 +/- 2.96e-01%\n", - " Group 5 [0.28 - 0.625 eV]:\t1.09e-01 +/- 4.64e-01%\n", - " Group 6 [0.14 - 0.28 eV]:\t1.69e-01 +/- 4.22e-01%\n", - " Group 7 [0.058 - 0.14 eV]:\t2.58e-01 +/- 2.97e-01%\n", - " Group 8 [0.0 - 0.058 eV]:\t5.40e-01 +/- 2.91e-01%\n", + " Group 1 [821000.0 - 20000000.0eV]:\t2.52e-02 +/- 2.41e-01%\n", + " Group 2 [5530.0 - 821000.0 eV]:\t1.51e-03 +/- 1.31e-01%\n", + " Group 3 [4.0 - 5530.0 eV]:\t2.07e-02 +/- 2.29e-01%\n", + " Group 4 [0.625 - 4.0 eV]:\t3.32e-02 +/- 3.10e-01%\n", + " Group 5 [0.28 - 0.625 eV]:\t1.09e-01 +/- 3.94e-01%\n", + " Group 6 [0.14 - 0.28 eV]:\t1.69e-01 +/- 4.12e-01%\n", + " Group 7 [0.058 - 0.14 eV]:\t2.58e-01 +/- 3.01e-01%\n", + " Group 8 [0.0 - 0.058 eV]:\t5.40e-01 +/- 2.79e-01%\n", "\n", "\n", "\n" @@ -794,7 +803,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -821,8 +830,8 @@ " 1\n", " 1\n", " H1\n", - " 0.234115\n", - " 0.003568\n", + " 0.233991\n", + " 0.003752\n", " \n", " \n", " 127\n", @@ -830,8 +839,8 @@ " 1\n", " 1\n", " O16\n", - " 1.563707\n", - " 0.005953\n", + " 1.569288\n", + " 0.006360\n", " \n", " \n", " 124\n", @@ -839,8 +848,8 @@ " 1\n", " 2\n", " H1\n", - " 1.594129\n", - " 0.002369\n", + " 1.587279\n", + " 0.003098\n", " \n", " \n", " 125\n", @@ -848,8 +857,8 @@ " 1\n", " 2\n", " O16\n", - " 0.285761\n", - " 0.001676\n", + " 0.285599\n", + " 0.001422\n", " \n", " \n", " 122\n", @@ -857,8 +866,8 @@ " 1\n", " 3\n", " H1\n", - " 0.011089\n", - " 0.000248\n", + " 0.010482\n", + " 0.000220\n", " \n", " \n", " 123\n", @@ -875,8 +884,8 @@ " 1\n", " 4\n", " H1\n", - " 0.000000\n", - " 0.000000\n", + " 0.000009\n", + " 0.000006\n", " \n", " \n", " 121\n", @@ -893,8 +902,8 @@ " 1\n", " 5\n", " H1\n", - " 0.000000\n", - " 0.000000\n", + " 0.000005\n", + " 0.000005\n", " \n", " \n", " 119\n", @@ -911,15 +920,15 @@ ], "text/plain": [ " cell group in group out nuclide mean std. dev.\n", - "126 10002 1 1 H1 0.234115 0.003568\n", - "127 10002 1 1 O16 1.563707 0.005953\n", - "124 10002 1 2 H1 1.594129 0.002369\n", - "125 10002 1 2 O16 0.285761 0.001676\n", - "122 10002 1 3 H1 0.011089 0.000248\n", + "126 10002 1 1 H1 0.233991 0.003752\n", + "127 10002 1 1 O16 1.569288 0.006360\n", + "124 10002 1 2 H1 1.587279 0.003098\n", + "125 10002 1 2 O16 0.285599 0.001422\n", + "122 10002 1 3 H1 0.010482 0.000220\n", "123 10002 1 3 O16 0.000000 0.000000\n", - "120 10002 1 4 H1 0.000000 0.000000\n", + "120 10002 1 4 H1 0.000009 0.000006\n", "121 10002 1 4 O16 0.000000 0.000000\n", - "118 10002 1 5 H1 0.000000 0.000000\n", + "118 10002 1 5 H1 0.000005 0.000005\n", "119 10002 1 5 O16 0.000000 0.000000" ] }, @@ -980,18 +989,18 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t7.73e-03 +/- 5.06e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t1.82e-01 +/- 2.05e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t7.84e-03 +/- 4.34e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t1.82e-01 +/- 1.91e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t2.17e-01 +/- 1.44e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t2.53e-01 +/- 2.57e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t2.17e-01 +/- 1.38e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t2.53e-01 +/- 2.27e-01%\n", "\n", "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t1.46e-01 +/- 1.60e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t1.75e-01 +/- 2.94e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t1.45e-01 +/- 1.54e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t1.74e-01 +/- 2.60e-01%\n", "\n", "\n", "\n" @@ -1030,48 +1039,48 @@ " 10000\n", " 1\n", " U235\n", - " 20.611692\n", - " 0.104237\n", + " 20.912730\n", + " 0.090857\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U238\n", - " 9.585358\n", - " 0.013808\n", + " 9.577234\n", + " 0.013248\n", " \n", " \n", " 5\n", " 10000\n", " 1\n", " O16\n", - " 3.164190\n", - " 0.005049\n", + " 3.158619\n", + " 0.004864\n", " \n", " \n", " 0\n", " 10000\n", " 2\n", " U235\n", - " 485.413426\n", - " 0.996410\n", + " 485.364898\n", + " 0.925632\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U238\n", - " 11.190386\n", - " 0.028731\n", + " 11.196946\n", + " 0.025466\n", " \n", " \n", " 2\n", " 10000\n", " 2\n", " O16\n", - " 3.794859\n", - " 0.011139\n", + " 3.788841\n", + " 0.009855\n", " \n", " \n", "\n", @@ -1079,12 +1088,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U235 20.611692 0.104237\n", - "4 10000 1 U238 9.585358 0.013808\n", - "5 10000 1 O16 3.164190 0.005049\n", - "0 10000 2 U235 485.413426 0.996410\n", - "1 10000 2 U238 11.190386 0.028731\n", - "2 10000 2 O16 3.794859 0.011139" + "3 10000 1 U235 20.912730 0.090857\n", + "4 10000 1 U238 9.577234 0.013248\n", + "5 10000 1 O16 3.158619 0.004864\n", + "0 10000 2 U235 485.364898 0.925632\n", + "1 10000 2 U238 11.196946 0.025466\n", + "2 10000 2 O16 3.788841 0.009855" ] }, "execution_count": 22, @@ -1119,8 +1128,9 @@ }, "outputs": [], "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(sp.summary.opencg_geometry)" + "# Create an OpenMOC Geometry from an equivalent OpenCG Geometry\n", + "opencg_geometry = get_opencg_geometry(sp.summary.geometry)\n", + "openmoc_geometry = get_openmoc_geometry(opencg_geometry)" ] }, { @@ -1141,11 +1151,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1201,239 +1211,239 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.423123\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.475922\tres = 5.769E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.491444\tres = 1.248E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.487441\tres = 3.261E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.483949\tres = 8.144E-03\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.477326\tres = 7.164E-03\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.469012\tres = 1.369E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.460422\tres = 1.742E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.450721\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.441532\tres = 2.107E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.432168\tres = 2.039E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.423131\tres = 2.121E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.414705\tres = 2.091E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.406943\tres = 1.991E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.399627\tres = 1.872E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.393329\tres = 1.798E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.387699\tres = 1.576E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.382949\tres = 1.431E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.379028\tres = 1.225E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.375935\tres = 1.024E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.373785\tres = 8.161E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.372655\tres = 5.719E-03\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.372273\tres = 3.023E-03\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.372879\tres = 1.024E-03\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.374353\tres = 1.629E-03\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.376678\tres = 3.952E-03\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.379854\tres = 6.211E-03\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.383870\tres = 8.433E-03\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.388664\tres = 1.057E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.394216\tres = 1.249E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.400506\tres = 1.429E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.407502\tres = 1.596E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.415145\tres = 1.747E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.423426\tres = 1.876E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.432299\tres = 1.995E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.441713\tres = 2.095E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.451665\tres = 2.178E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.462081\tres = 2.253E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.472952\tres = 2.306E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.484221\tres = 2.352E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.495862\tres = 2.383E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.507836\tres = 2.404E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.520110\tres = 2.415E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.532648\tres = 2.417E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.545419\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.558389\tres = 2.398E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.571526\tres = 2.378E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.584803\tres = 2.353E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.598190\tres = 2.323E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.611658\tres = 2.289E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.625182\tres = 2.252E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.638739\tres = 2.211E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.652303\tres = 2.168E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.665851\tres = 2.124E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.679365\tres = 2.077E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.692822\tres = 2.030E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.706205\tres = 1.981E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 0.719497\tres = 1.932E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 0.732680\tres = 1.882E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 0.745741\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 60:\tk_eff = 0.758665\tres = 1.783E-02\n", - "[ NORMAL ] Iteration 61:\tk_eff = 0.771440\tres = 1.733E-02\n", - "[ NORMAL ] Iteration 62:\tk_eff = 0.784054\tres = 1.684E-02\n", - "[ NORMAL ] Iteration 63:\tk_eff = 0.796496\tres = 1.635E-02\n", - "[ NORMAL ] Iteration 64:\tk_eff = 0.808757\tres = 1.587E-02\n", - "[ NORMAL ] Iteration 65:\tk_eff = 0.820828\tres = 1.539E-02\n", - "[ NORMAL ] Iteration 66:\tk_eff = 0.832701\tres = 1.493E-02\n", - "[ NORMAL ] Iteration 67:\tk_eff = 0.844370\tres = 1.446E-02\n", - "[ NORMAL ] Iteration 68:\tk_eff = 0.855828\tres = 1.401E-02\n", - "[ NORMAL ] Iteration 69:\tk_eff = 0.867071\tres = 1.357E-02\n", - "[ NORMAL ] Iteration 70:\tk_eff = 0.878094\tres = 1.314E-02\n", - "[ NORMAL ] Iteration 71:\tk_eff = 0.888893\tres = 1.271E-02\n", - "[ NORMAL ] Iteration 72:\tk_eff = 0.899465\tres = 1.230E-02\n", - "[ NORMAL ] Iteration 73:\tk_eff = 0.909808\tres = 1.189E-02\n", - "[ NORMAL ] Iteration 74:\tk_eff = 0.919919\tres = 1.150E-02\n", - "[ NORMAL ] Iteration 75:\tk_eff = 0.929799\tres = 1.111E-02\n", - "[ NORMAL ] Iteration 76:\tk_eff = 0.939445\tres = 1.074E-02\n", - "[ NORMAL ] Iteration 77:\tk_eff = 0.948857\tres = 1.037E-02\n", - "[ NORMAL ] Iteration 78:\tk_eff = 0.958037\tres = 1.002E-02\n", - "[ NORMAL ] Iteration 79:\tk_eff = 0.966984\tres = 9.675E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 0.975699\tres = 9.339E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 0.984185\tres = 9.012E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 0.992442\tres = 8.697E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.000473\tres = 8.390E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.008281\tres = 8.092E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.015867\tres = 7.804E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.023234\tres = 7.524E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.030387\tres = 7.253E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.037327\tres = 6.990E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.044059\tres = 6.736E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.050586\tres = 6.489E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.056911\tres = 6.251E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.063039\tres = 6.021E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.068972\tres = 5.798E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.074717\tres = 5.582E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.080275\tres = 5.373E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.085652\tres = 5.172E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.090851\tres = 4.977E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.095877\tres = 4.789E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.100733\tres = 4.607E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.105424\tres = 4.432E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.109955\tres = 4.262E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.114329\tres = 4.098E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.118550\tres = 3.941E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.122623\tres = 3.789E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.126552\tres = 3.641E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.130340\tres = 3.499E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.133992\tres = 3.362E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.137511\tres = 3.231E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.140902\tres = 3.103E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.144169\tres = 2.981E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.147314\tres = 2.863E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.150342\tres = 2.750E-03\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.153257\tres = 2.639E-03\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.156062\tres = 2.534E-03\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.158761\tres = 2.432E-03\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.161357\tres = 2.334E-03\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.163854\tres = 2.240E-03\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.166253\tres = 2.150E-03\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.168560\tres = 2.062E-03\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.170777\tres = 1.978E-03\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.172907\tres = 1.897E-03\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.174953\tres = 1.819E-03\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.176918\tres = 1.745E-03\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.178805\tres = 1.672E-03\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.180617\tres = 1.603E-03\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.182356\tres = 1.537E-03\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.184025\tres = 1.473E-03\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.185626\tres = 1.412E-03\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.187163\tres = 1.352E-03\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.188637\tres = 1.296E-03\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.190050\tres = 1.241E-03\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.191406\tres = 1.189E-03\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.192704\tres = 1.139E-03\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.193949\tres = 1.090E-03\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.195144\tres = 1.044E-03\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.196287\tres = 1.001E-03\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.197383\tres = 9.567E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.198433\tres = 9.157E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.199438\tres = 8.775E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.200401\tres = 8.388E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.201324\tres = 8.030E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.202206\tres = 7.682E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.203051\tres = 7.348E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.203860\tres = 7.028E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.204634\tres = 6.722E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.205375\tres = 6.429E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.206084\tres = 6.153E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.206762\tres = 5.883E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.207411\tres = 5.617E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.208031\tres = 5.377E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.208623\tres = 5.137E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.209191\tres = 4.906E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.209733\tres = 4.694E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.210251\tres = 4.486E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.210747\tres = 4.280E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.211220\tres = 4.098E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.211673\tres = 3.908E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.212105\tres = 3.738E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.212518\tres = 3.567E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.212913\tres = 3.409E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.213290\tres = 3.260E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.213650\tres = 3.104E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.213995\tres = 2.965E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.214322\tres = 2.838E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.214637\tres = 2.701E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.214937\tres = 2.587E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.215222\tres = 2.469E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.215494\tres = 2.348E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.215755\tres = 2.242E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.216004\tres = 2.144E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.216241\tres = 2.048E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.216467\tres = 1.950E-04\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.216683\tres = 1.857E-04\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.216889\tres = 1.778E-04\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.217085\tres = 1.696E-04\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.217273\tres = 1.614E-04\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.217452\tres = 1.543E-04\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.217623\tres = 1.465E-04\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.217785\tres = 1.405E-04\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.217940\tres = 1.335E-04\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.218088\tres = 1.269E-04\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.218229\tres = 1.218E-04\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.218363\tres = 1.157E-04\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.218492\tres = 1.101E-04\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.218615\tres = 1.056E-04\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.218731\tres = 1.007E-04\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.218841\tres = 9.536E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.218947\tres = 9.039E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.219048\tres = 8.671E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.219144\tres = 8.281E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.219236\tres = 7.903E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.219323\tres = 7.535E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.219406\tres = 7.153E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.219485\tres = 6.803E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.219561\tres = 6.458E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.219633\tres = 6.195E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.219701\tres = 5.920E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.219766\tres = 5.593E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.219829\tres = 5.350E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.219887\tres = 5.127E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.219944\tres = 4.821E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.219998\tres = 4.617E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.220048\tres = 4.406E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.220097\tres = 4.167E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.220143\tres = 4.017E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.220188\tres = 3.759E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.220230\tres = 3.628E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.220270\tres = 3.429E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.220307\tres = 3.268E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.220343\tres = 3.102E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.220377\tres = 2.945E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.220410\tres = 2.801E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.220441\tres = 2.693E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.220470\tres = 2.516E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.220498\tres = 2.414E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.220525\tres = 2.300E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.220550\tres = 2.205E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.220575\tres = 2.056E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.220598\tres = 2.005E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.220620\tres = 1.878E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.220640\tres = 1.785E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.220660\tres = 1.689E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.220679\tres = 1.624E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.220697\tres = 1.546E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.220714\tres = 1.473E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.220731\tres = 1.431E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.220747\tres = 1.359E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.220762\tres = 1.274E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.220776\tres = 1.210E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.220789\tres = 1.159E-05\n", - "[ NORMAL ] Iteration 231:\tk_eff = 1.220801\tres = 1.069E-05\n", - "[ NORMAL ] Iteration 232:\tk_eff = 1.220813\tres = 1.043E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.423140\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.475976\tres = 5.769E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.491509\tres = 1.249E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.487503\tres = 3.263E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.484002\tres = 8.150E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.477365\tres = 7.181E-03\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.469036\tres = 1.371E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.460429\tres = 1.745E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.450711\tres = 1.835E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.441506\tres = 2.111E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.432127\tres = 2.042E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.423076\tres = 2.124E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.414637\tres = 2.095E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.406863\tres = 1.995E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.399537\tres = 1.875E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.393230\tres = 1.801E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.387592\tres = 1.579E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.382836\tres = 1.434E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.378910\tres = 1.227E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.375812\tres = 1.026E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.373658\tres = 8.176E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.372526\tres = 5.730E-03\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.372142\tres = 3.031E-03\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.372747\tres = 1.030E-03\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.374220\tres = 1.627E-03\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.376545\tres = 3.951E-03\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.379722\tres = 6.213E-03\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.383738\tres = 8.437E-03\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.388532\tres = 1.058E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.394086\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.400378\tres = 1.429E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.407375\tres = 1.597E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.415020\tres = 1.747E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.423303\tres = 1.877E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.432177\tres = 1.996E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.441592\tres = 2.096E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.451546\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.461964\tres = 2.254E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.472835\tres = 2.307E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.484106\tres = 2.353E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.495748\tres = 2.384E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.507723\tres = 2.405E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.519997\tres = 2.416E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.532536\tres = 2.418E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.545307\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.558277\tres = 2.398E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.571414\tres = 2.379E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.584691\tres = 2.353E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.598077\tres = 2.323E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.611545\tres = 2.289E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.625068\tres = 2.252E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.638624\tres = 2.211E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.652187\tres = 2.169E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.665734\tres = 2.124E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.679246\tres = 2.077E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.692702\tres = 2.030E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.706083\tres = 1.981E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 0.719373\tres = 1.932E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 0.732554\tres = 1.882E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 0.745613\tres = 1.832E-02\n", + "[ NORMAL ] Iteration 60:\tk_eff = 0.758535\tres = 1.783E-02\n", + "[ NORMAL ] Iteration 61:\tk_eff = 0.771307\tres = 1.733E-02\n", + "[ NORMAL ] Iteration 62:\tk_eff = 0.783919\tres = 1.684E-02\n", + "[ NORMAL ] Iteration 63:\tk_eff = 0.796359\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 64:\tk_eff = 0.808617\tres = 1.587E-02\n", + "[ NORMAL ] Iteration 65:\tk_eff = 0.820685\tres = 1.539E-02\n", + "[ NORMAL ] Iteration 66:\tk_eff = 0.832556\tres = 1.492E-02\n", + "[ NORMAL ] Iteration 67:\tk_eff = 0.844222\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 68:\tk_eff = 0.855678\tres = 1.401E-02\n", + "[ NORMAL ] Iteration 69:\tk_eff = 0.866918\tres = 1.357E-02\n", + "[ NORMAL ] Iteration 70:\tk_eff = 0.877939\tres = 1.314E-02\n", + "[ NORMAL ] Iteration 71:\tk_eff = 0.888734\tres = 1.271E-02\n", + "[ NORMAL ] Iteration 72:\tk_eff = 0.899303\tres = 1.230E-02\n", + "[ NORMAL ] Iteration 73:\tk_eff = 0.909643\tres = 1.189E-02\n", + "[ NORMAL ] Iteration 74:\tk_eff = 0.919752\tres = 1.150E-02\n", + "[ NORMAL ] Iteration 75:\tk_eff = 0.929628\tres = 1.111E-02\n", + "[ NORMAL ] Iteration 76:\tk_eff = 0.939271\tres = 1.074E-02\n", + "[ NORMAL ] Iteration 77:\tk_eff = 0.948681\tres = 1.037E-02\n", + "[ NORMAL ] Iteration 78:\tk_eff = 0.957857\tres = 1.002E-02\n", + "[ NORMAL ] Iteration 79:\tk_eff = 0.966802\tres = 9.673E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 0.975514\tres = 9.338E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 0.983997\tres = 9.012E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 0.992252\tres = 8.696E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.000280\tres = 8.389E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.008085\tres = 8.091E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.015668\tres = 7.803E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.023034\tres = 7.522E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.030183\tres = 7.252E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.037121\tres = 6.989E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.043850\tres = 6.735E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.050374\tres = 6.488E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.056697\tres = 6.250E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.062823\tres = 6.020E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.068754\tres = 5.797E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.074496\tres = 5.581E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.080052\tres = 5.372E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.085427\tres = 5.171E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.090623\tres = 4.976E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.095647\tres = 4.788E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.100501\tres = 4.606E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.105190\tres = 4.431E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.109719\tres = 4.261E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.114091\tres = 4.098E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.118310\tres = 3.940E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.122382\tres = 3.787E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.126308\tres = 3.640E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.130095\tres = 3.498E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.133745\tres = 3.362E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.137262\tres = 3.230E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.140652\tres = 3.102E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.143916\tres = 2.980E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.147061\tres = 2.862E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.150087\tres = 2.749E-03\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.153001\tres = 2.638E-03\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.155805\tres = 2.534E-03\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.158502\tres = 2.432E-03\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.161096\tres = 2.333E-03\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.163591\tres = 2.239E-03\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.165989\tres = 2.149E-03\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.168295\tres = 2.061E-03\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.170511\tres = 1.978E-03\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.172640\tres = 1.896E-03\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.174685\tres = 1.819E-03\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.176649\tres = 1.744E-03\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.178535\tres = 1.672E-03\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.180345\tres = 1.603E-03\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.182083\tres = 1.536E-03\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.183751\tres = 1.473E-03\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.185352\tres = 1.411E-03\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.186888\tres = 1.352E-03\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.188360\tres = 1.295E-03\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.189772\tres = 1.241E-03\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.191127\tres = 1.189E-03\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.192425\tres = 1.138E-03\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.193670\tres = 1.090E-03\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.194863\tres = 1.044E-03\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.196006\tres = 9.995E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.197101\tres = 9.566E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.198150\tres = 9.162E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.199155\tres = 8.766E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.200116\tres = 8.384E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.201038\tres = 8.017E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.201920\tres = 7.684E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.202765\tres = 7.343E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.203573\tres = 7.030E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.204347\tres = 6.718E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.205087\tres = 6.424E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.205796\tres = 6.147E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.206473\tres = 5.881E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.207122\tres = 5.614E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.207741\tres = 5.376E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.208334\tres = 5.136E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.208901\tres = 4.903E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.209443\tres = 4.695E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.209961\tres = 4.482E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.210455\tres = 4.282E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.210928\tres = 4.088E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.211380\tres = 3.910E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.211813\tres = 3.730E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.212225\tres = 3.573E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.212620\tres = 3.403E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.212997\tres = 3.256E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.213356\tres = 3.107E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.213700\tres = 2.965E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.214028\tres = 2.829E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.214341\tres = 2.706E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.214640\tres = 2.581E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.214926\tres = 2.465E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.215199\tres = 2.352E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.215459\tres = 2.241E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.215707\tres = 2.144E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.215944\tres = 2.036E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.216170\tres = 1.952E-04\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.216386\tres = 1.854E-04\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.216592\tres = 1.780E-04\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.216788\tres = 1.689E-04\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.216976\tres = 1.615E-04\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.217154\tres = 1.545E-04\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.217325\tres = 1.462E-04\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.217487\tres = 1.400E-04\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.217642\tres = 1.336E-04\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.217789\tres = 1.271E-04\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.217931\tres = 1.212E-04\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.218065\tres = 1.160E-04\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.218193\tres = 1.102E-04\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.218315\tres = 1.054E-04\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.218431\tres = 9.964E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.218542\tres = 9.572E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.218647\tres = 9.081E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.218748\tres = 8.632E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.218844\tres = 8.232E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.218936\tres = 7.887E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.219023\tres = 7.563E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.219106\tres = 7.154E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.219185\tres = 6.778E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.219261\tres = 6.484E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.219333\tres = 6.207E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.219401\tres = 5.898E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.219466\tres = 5.590E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.219528\tres = 5.305E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.219587\tres = 5.076E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.219643\tres = 4.829E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.219696\tres = 4.595E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.219747\tres = 4.399E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.219796\tres = 4.161E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.219842\tres = 3.973E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.219886\tres = 3.781E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.219928\tres = 3.629E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.219968\tres = 3.451E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.220006\tres = 3.274E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.220042\tres = 3.108E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.220076\tres = 2.951E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.220108\tres = 2.785E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.220139\tres = 2.664E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.220169\tres = 2.518E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.220197\tres = 2.463E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.220224\tres = 2.318E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.220249\tres = 2.189E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.220273\tres = 2.075E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.220296\tres = 1.964E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.220318\tres = 1.922E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.220339\tres = 1.776E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.220358\tres = 1.701E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.220377\tres = 1.615E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.220395\tres = 1.559E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.220412\tres = 1.443E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.220429\tres = 1.403E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.220444\tres = 1.354E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.220459\tres = 1.235E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.220472\tres = 1.204E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.220485\tres = 1.135E-05\n", + "[ NORMAL ] Iteration 231:\tk_eff = 1.220498\tres = 1.085E-05\n", + "[ NORMAL ] Iteration 232:\tk_eff = 1.220510\tres = 1.022E-05\n" ] } ], @@ -1465,9 +1475,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.223474\n", - "openmoc keff = 1.220813\n", - "bias [pcm]: -266.0\n" + "openmc keff = 1.224484\n", + "openmoc keff = 1.220510\n", + "bias [pcm]: -397.4\n" ] } ], @@ -1500,17 +1510,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } ], "source": [ - "openmoc_geometry = get_openmoc_geometry(sp.summary.opencg_geometry)\n", + "opencg_geometry = get_opencg_geometry(sp.summary.geometry)\n", + "openmoc_geometry = get_openmoc_geometry(opencg_geometry)\n", "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n", "\n", "# Inject multi-group cross sections into OpenMOC Materials\n", @@ -1555,347 +1566,347 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.366907\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.391217\tres = 6.331E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.393027\tres = 6.626E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.381142\tres = 4.627E-03\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.375065\tres = 3.024E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.369644\tres = 1.594E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.365597\tres = 1.445E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.363111\tres = 1.095E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.361532\tres = 6.802E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.361339\tres = 4.349E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.362062\tres = 5.320E-04\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.363777\tres = 2.001E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.366396\tres = 4.735E-03\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.369859\tres = 7.199E-03\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.374042\tres = 9.454E-03\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.378972\tres = 1.131E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.384524\tres = 1.318E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.390678\tres = 1.465E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.397373\tres = 1.600E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.404563\tres = 1.714E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.412208\tres = 1.809E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.420270\tres = 1.890E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.428695\tres = 1.956E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.437463\tres = 2.005E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.446530\tres = 2.045E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.455867\tres = 2.073E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.465443\tres = 2.091E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.475229\tres = 2.101E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.485199\tres = 2.103E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.495328\tres = 2.098E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.505592\tres = 2.088E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.515970\tres = 2.072E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.526441\tres = 2.053E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.536986\tres = 2.029E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.547587\tres = 2.003E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.558228\tres = 1.974E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.568894\tres = 1.943E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.579570\tres = 1.911E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.590242\tres = 1.877E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.600898\tres = 1.841E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.611527\tres = 1.805E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.622119\tres = 1.769E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.632663\tres = 1.732E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.643149\tres = 1.695E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.653571\tres = 1.658E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.663920\tres = 1.620E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.674190\tres = 1.583E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.684373\tres = 1.547E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.694464\tres = 1.510E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.704458\tres = 1.475E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.714349\tres = 1.439E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.724134\tres = 1.404E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.733809\tres = 1.370E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.743369\tres = 1.336E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.752812\tres = 1.303E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.762135\tres = 1.270E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.771336\tres = 1.238E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 0.780412\tres = 1.207E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 0.789363\tres = 1.177E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 0.798184\tres = 1.147E-02\n", - "[ NORMAL ] Iteration 60:\tk_eff = 0.806878\tres = 1.118E-02\n", - "[ NORMAL ] Iteration 61:\tk_eff = 0.815440\tres = 1.089E-02\n", - "[ NORMAL ] Iteration 62:\tk_eff = 0.823872\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 63:\tk_eff = 0.832173\tres = 1.034E-02\n", - "[ NORMAL ] Iteration 64:\tk_eff = 0.840341\tres = 1.007E-02\n", - "[ NORMAL ] Iteration 65:\tk_eff = 0.848378\tres = 9.816E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 0.856281\tres = 9.563E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 0.864053\tres = 9.316E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 0.871694\tres = 9.076E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 0.879202\tres = 8.842E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 0.886580\tres = 8.614E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 0.893828\tres = 8.392E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 0.900946\tres = 8.175E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 0.907936\tres = 7.964E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 0.914798\tres = 7.758E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 0.921534\tres = 7.558E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 0.928144\tres = 7.363E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 0.934630\tres = 7.173E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 0.940992\tres = 6.988E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 0.947233\tres = 6.807E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 0.953353\tres = 6.633E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 0.959355\tres = 6.461E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 0.965239\tres = 6.295E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 0.971007\tres = 6.133E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 0.976660\tres = 5.975E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 0.982199\tres = 5.822E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 0.987627\tres = 5.672E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 0.992946\tres = 5.526E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 0.998156\tres = 5.385E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.003259\tres = 5.247E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.008257\tres = 5.113E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.013151\tres = 4.982E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.017944\tres = 4.854E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.022636\tres = 4.730E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.027230\tres = 4.609E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.031726\tres = 4.492E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.036126\tres = 4.377E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.040434\tres = 4.265E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.044649\tres = 4.157E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.048774\tres = 4.052E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.052810\tres = 3.949E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.056758\tres = 3.848E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.060621\tres = 3.751E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.064400\tres = 3.655E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.068096\tres = 3.563E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.071711\tres = 3.472E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.075247\tres = 3.384E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.078705\tres = 3.299E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.082086\tres = 3.216E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.085392\tres = 3.135E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.088624\tres = 3.056E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.091784\tres = 2.977E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.094875\tres = 2.903E-03\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.097895\tres = 2.831E-03\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.100847\tres = 2.759E-03\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.103734\tres = 2.689E-03\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.106555\tres = 2.622E-03\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.109312\tres = 2.556E-03\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.112007\tres = 2.492E-03\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.114640\tres = 2.429E-03\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.117214\tres = 2.368E-03\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.119728\tres = 2.309E-03\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.122186\tres = 2.251E-03\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.124587\tres = 2.195E-03\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.126934\tres = 2.140E-03\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.129226\tres = 2.086E-03\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.131465\tres = 2.034E-03\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.133653\tres = 1.983E-03\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.135791\tres = 1.934E-03\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.137879\tres = 1.886E-03\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.139918\tres = 1.839E-03\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.141911\tres = 1.792E-03\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.143857\tres = 1.748E-03\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.145758\tres = 1.704E-03\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.147615\tres = 1.662E-03\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.149428\tres = 1.621E-03\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.151199\tres = 1.580E-03\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.152929\tres = 1.541E-03\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.154618\tres = 1.503E-03\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.156268\tres = 1.465E-03\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.157878\tres = 1.429E-03\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.159452\tres = 1.393E-03\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.160988\tres = 1.359E-03\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.162488\tres = 1.325E-03\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.163953\tres = 1.292E-03\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.165384\tres = 1.261E-03\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.166780\tres = 1.229E-03\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.168144\tres = 1.198E-03\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.169476\tres = 1.169E-03\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.170776\tres = 1.140E-03\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.172045\tres = 1.111E-03\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.173284\tres = 1.084E-03\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.174493\tres = 1.057E-03\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.175674\tres = 1.031E-03\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.176828\tres = 1.005E-03\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.177953\tres = 9.813E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.179052\tres = 9.563E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.180125\tres = 9.324E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.181172\tres = 9.100E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.182194\tres = 8.877E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.183192\tres = 8.650E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.184167\tres = 8.445E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.185117\tres = 8.233E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.186045\tres = 8.028E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.186951\tres = 7.831E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.187836\tres = 7.636E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.188699\tres = 7.452E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.189541\tres = 7.265E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.190363\tres = 7.087E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.191166\tres = 6.911E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.191949\tres = 6.742E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.192714\tres = 6.578E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.193460\tres = 6.414E-04\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.194188\tres = 6.255E-04\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.194899\tres = 6.097E-04\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.195593\tres = 5.957E-04\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.196270\tres = 5.807E-04\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.196931\tres = 5.660E-04\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.197576\tres = 5.523E-04\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.198204\tres = 5.389E-04\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.198819\tres = 5.250E-04\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.199418\tres = 5.125E-04\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.200003\tres = 5.002E-04\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.200574\tres = 4.878E-04\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.201131\tres = 4.760E-04\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.201674\tres = 4.637E-04\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.202206\tres = 4.523E-04\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.202724\tres = 4.421E-04\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.203229\tres = 4.306E-04\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.203722\tres = 4.200E-04\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.204203\tres = 4.099E-04\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.204673\tres = 3.998E-04\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.205131\tres = 3.903E-04\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.205578\tres = 3.802E-04\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.206014\tres = 3.706E-04\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.206440\tres = 3.618E-04\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.206855\tres = 3.530E-04\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.207261\tres = 3.443E-04\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.207657\tres = 3.359E-04\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.208043\tres = 3.282E-04\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.208419\tres = 3.196E-04\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.208787\tres = 3.116E-04\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.209145\tres = 3.039E-04\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.209495\tres = 2.962E-04\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.209836\tres = 2.895E-04\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.210170\tres = 2.824E-04\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.210495\tres = 2.756E-04\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.210812\tres = 2.687E-04\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.211122\tres = 2.619E-04\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.211423\tres = 2.559E-04\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.211718\tres = 2.491E-04\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.212006\tres = 2.430E-04\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.212286\tres = 2.376E-04\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.212560\tres = 2.313E-04\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.212827\tres = 2.257E-04\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.213088\tres = 2.203E-04\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.213341\tres = 2.149E-04\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.213590\tres = 2.092E-04\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.213831\tres = 2.047E-04\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.214068\tres = 1.990E-04\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.214298\tres = 1.945E-04\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.214523\tres = 1.900E-04\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.214743\tres = 1.850E-04\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.214956\tres = 1.807E-04\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.215166\tres = 1.760E-04\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.215370\tres = 1.724E-04\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.215569\tres = 1.677E-04\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.215762\tres = 1.637E-04\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.215951\tres = 1.595E-04\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.216136\tres = 1.554E-04\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.216316\tres = 1.518E-04\n", - "[ NORMAL ] Iteration 231:\tk_eff = 1.216492\tres = 1.479E-04\n", - "[ NORMAL ] Iteration 232:\tk_eff = 1.216663\tres = 1.446E-04\n", - "[ NORMAL ] Iteration 233:\tk_eff = 1.216831\tres = 1.411E-04\n", - "[ NORMAL ] Iteration 234:\tk_eff = 1.216994\tres = 1.377E-04\n", - "[ NORMAL ] Iteration 235:\tk_eff = 1.217153\tres = 1.341E-04\n", - "[ NORMAL ] Iteration 236:\tk_eff = 1.217309\tres = 1.307E-04\n", - "[ NORMAL ] Iteration 237:\tk_eff = 1.217461\tres = 1.279E-04\n", - "[ NORMAL ] Iteration 238:\tk_eff = 1.217608\tres = 1.246E-04\n", - "[ NORMAL ] Iteration 239:\tk_eff = 1.217752\tres = 1.215E-04\n", - "[ NORMAL ] Iteration 240:\tk_eff = 1.217893\tres = 1.183E-04\n", - "[ NORMAL ] Iteration 241:\tk_eff = 1.218031\tres = 1.156E-04\n", - "[ NORMAL ] Iteration 242:\tk_eff = 1.218165\tres = 1.129E-04\n", - "[ NORMAL ] Iteration 243:\tk_eff = 1.218296\tres = 1.104E-04\n", - "[ NORMAL ] Iteration 244:\tk_eff = 1.218423\tres = 1.072E-04\n", - "[ NORMAL ] Iteration 245:\tk_eff = 1.218548\tres = 1.045E-04\n", - "[ NORMAL ] Iteration 246:\tk_eff = 1.218669\tres = 1.024E-04\n", - "[ NORMAL ] Iteration 247:\tk_eff = 1.218788\tres = 9.969E-05\n", - "[ NORMAL ] Iteration 248:\tk_eff = 1.218903\tres = 9.716E-05\n", - "[ NORMAL ] Iteration 249:\tk_eff = 1.219016\tres = 9.478E-05\n", - "[ NORMAL ] Iteration 250:\tk_eff = 1.219126\tres = 9.241E-05\n", - "[ NORMAL ] Iteration 251:\tk_eff = 1.219233\tres = 9.028E-05\n", - "[ NORMAL ] Iteration 252:\tk_eff = 1.219338\tres = 8.820E-05\n", - "[ NORMAL ] Iteration 253:\tk_eff = 1.219440\tres = 8.585E-05\n", - "[ NORMAL ] Iteration 254:\tk_eff = 1.219540\tres = 8.383E-05\n", - "[ NORMAL ] Iteration 255:\tk_eff = 1.219638\tres = 8.191E-05\n", - "[ NORMAL ] Iteration 256:\tk_eff = 1.219732\tres = 8.000E-05\n", - "[ NORMAL ] Iteration 257:\tk_eff = 1.219825\tres = 7.789E-05\n", - "[ NORMAL ] Iteration 258:\tk_eff = 1.219915\tres = 7.582E-05\n", - "[ NORMAL ] Iteration 259:\tk_eff = 1.220003\tres = 7.393E-05\n", - "[ NORMAL ] Iteration 260:\tk_eff = 1.220089\tres = 7.210E-05\n", - "[ NORMAL ] Iteration 261:\tk_eff = 1.220173\tres = 7.026E-05\n", - "[ NORMAL ] Iteration 262:\tk_eff = 1.220255\tres = 6.882E-05\n", - "[ NORMAL ] Iteration 263:\tk_eff = 1.220335\tres = 6.737E-05\n", - "[ NORMAL ] Iteration 264:\tk_eff = 1.220412\tres = 6.552E-05\n", - "[ NORMAL ] Iteration 265:\tk_eff = 1.220488\tres = 6.380E-05\n", - "[ NORMAL ] Iteration 266:\tk_eff = 1.220562\tres = 6.221E-05\n", - "[ NORMAL ] Iteration 267:\tk_eff = 1.220635\tres = 6.069E-05\n", - "[ NORMAL ] Iteration 268:\tk_eff = 1.220705\tres = 5.922E-05\n", - "[ NORMAL ] Iteration 269:\tk_eff = 1.220774\tres = 5.778E-05\n", - "[ NORMAL ] Iteration 270:\tk_eff = 1.220842\tres = 5.661E-05\n", - "[ NORMAL ] Iteration 271:\tk_eff = 1.220907\tres = 5.519E-05\n", - "[ NORMAL ] Iteration 272:\tk_eff = 1.220971\tres = 5.373E-05\n", - "[ NORMAL ] Iteration 273:\tk_eff = 1.221033\tres = 5.234E-05\n", - "[ NORMAL ] Iteration 274:\tk_eff = 1.221094\tres = 5.116E-05\n", - "[ NORMAL ] Iteration 275:\tk_eff = 1.221153\tres = 4.958E-05\n", - "[ NORMAL ] Iteration 276:\tk_eff = 1.221211\tres = 4.859E-05\n", - "[ NORMAL ] Iteration 277:\tk_eff = 1.221268\tres = 4.726E-05\n", - "[ NORMAL ] Iteration 278:\tk_eff = 1.221323\tres = 4.630E-05\n", - "[ NORMAL ] Iteration 279:\tk_eff = 1.221377\tres = 4.510E-05\n", - "[ NORMAL ] Iteration 280:\tk_eff = 1.221429\tres = 4.409E-05\n", - "[ NORMAL ] Iteration 281:\tk_eff = 1.221481\tres = 4.282E-05\n", - "[ NORMAL ] Iteration 282:\tk_eff = 1.221531\tres = 4.223E-05\n", - "[ NORMAL ] Iteration 283:\tk_eff = 1.221579\tres = 4.097E-05\n", - "[ NORMAL ] Iteration 284:\tk_eff = 1.221627\tres = 3.991E-05\n", - "[ NORMAL ] Iteration 285:\tk_eff = 1.221673\tres = 3.900E-05\n", - "[ NORMAL ] Iteration 286:\tk_eff = 1.221719\tres = 3.805E-05\n", - "[ NORMAL ] Iteration 287:\tk_eff = 1.221763\tres = 3.705E-05\n", - "[ NORMAL ] Iteration 288:\tk_eff = 1.221806\tres = 3.605E-05\n", - "[ NORMAL ] Iteration 289:\tk_eff = 1.221848\tres = 3.540E-05\n", - "[ NORMAL ] Iteration 290:\tk_eff = 1.221889\tres = 3.451E-05\n", - "[ NORMAL ] Iteration 291:\tk_eff = 1.221929\tres = 3.361E-05\n", - "[ NORMAL ] Iteration 292:\tk_eff = 1.221968\tres = 3.264E-05\n", - "[ NORMAL ] Iteration 293:\tk_eff = 1.222006\tres = 3.194E-05\n", - "[ NORMAL ] Iteration 294:\tk_eff = 1.222043\tres = 3.100E-05\n", - "[ NORMAL ] Iteration 295:\tk_eff = 1.222079\tres = 3.021E-05\n", - "[ NORMAL ] Iteration 296:\tk_eff = 1.222114\tres = 2.963E-05\n", - "[ NORMAL ] Iteration 297:\tk_eff = 1.222149\tres = 2.899E-05\n", - "[ NORMAL ] Iteration 298:\tk_eff = 1.222183\tres = 2.802E-05\n", - "[ NORMAL ] Iteration 299:\tk_eff = 1.222216\tres = 2.767E-05\n", - "[ NORMAL ] Iteration 300:\tk_eff = 1.222248\tres = 2.667E-05\n", - "[ NORMAL ] Iteration 301:\tk_eff = 1.222279\tres = 2.625E-05\n", - "[ NORMAL ] Iteration 302:\tk_eff = 1.222309\tres = 2.557E-05\n", - "[ NORMAL ] Iteration 303:\tk_eff = 1.222339\tres = 2.475E-05\n", - "[ NORMAL ] Iteration 304:\tk_eff = 1.222368\tres = 2.429E-05\n", - "[ NORMAL ] Iteration 305:\tk_eff = 1.222396\tres = 2.362E-05\n", - "[ NORMAL ] Iteration 306:\tk_eff = 1.222423\tres = 2.316E-05\n", - "[ NORMAL ] Iteration 307:\tk_eff = 1.222450\tres = 2.258E-05\n", - "[ NORMAL ] Iteration 308:\tk_eff = 1.222476\tres = 2.210E-05\n", - "[ NORMAL ] Iteration 309:\tk_eff = 1.222502\tres = 2.143E-05\n", - "[ NORMAL ] Iteration 310:\tk_eff = 1.222527\tres = 2.108E-05\n", - "[ NORMAL ] Iteration 311:\tk_eff = 1.222551\tres = 2.047E-05\n", - "[ NORMAL ] Iteration 312:\tk_eff = 1.222575\tres = 1.989E-05\n", - "[ NORMAL ] Iteration 313:\tk_eff = 1.222598\tres = 1.935E-05\n", - "[ NORMAL ] Iteration 314:\tk_eff = 1.222621\tres = 1.921E-05\n", - "[ NORMAL ] Iteration 315:\tk_eff = 1.222643\tres = 1.851E-05\n", - "[ NORMAL ] Iteration 316:\tk_eff = 1.222665\tres = 1.815E-05\n", - "[ NORMAL ] Iteration 317:\tk_eff = 1.222686\tres = 1.771E-05\n", - "[ NORMAL ] Iteration 318:\tk_eff = 1.222707\tres = 1.734E-05\n", - "[ NORMAL ] Iteration 319:\tk_eff = 1.222727\tres = 1.689E-05\n", - "[ NORMAL ] Iteration 320:\tk_eff = 1.222746\tres = 1.648E-05\n", - "[ NORMAL ] Iteration 321:\tk_eff = 1.222766\tres = 1.591E-05\n", - "[ NORMAL ] Iteration 322:\tk_eff = 1.222784\tres = 1.559E-05\n", - "[ NORMAL ] Iteration 323:\tk_eff = 1.222802\tres = 1.522E-05\n", - "[ NORMAL ] Iteration 324:\tk_eff = 1.222820\tres = 1.491E-05\n", - "[ NORMAL ] Iteration 325:\tk_eff = 1.222837\tres = 1.449E-05\n", - "[ NORMAL ] Iteration 326:\tk_eff = 1.222854\tres = 1.405E-05\n", - "[ NORMAL ] Iteration 327:\tk_eff = 1.222870\tres = 1.371E-05\n", - "[ NORMAL ] Iteration 328:\tk_eff = 1.222886\tres = 1.337E-05\n", - "[ NORMAL ] Iteration 329:\tk_eff = 1.222902\tres = 1.321E-05\n", - "[ NORMAL ] Iteration 330:\tk_eff = 1.222917\tres = 1.281E-05\n", - "[ NORMAL ] Iteration 331:\tk_eff = 1.222932\tres = 1.247E-05\n", - "[ NORMAL ] Iteration 332:\tk_eff = 1.222947\tres = 1.215E-05\n", - "[ NORMAL ] Iteration 333:\tk_eff = 1.222961\tres = 1.201E-05\n", - "[ NORMAL ] Iteration 334:\tk_eff = 1.222975\tres = 1.163E-05\n", - "[ NORMAL ] Iteration 335:\tk_eff = 1.222988\tres = 1.122E-05\n", - "[ NORMAL ] Iteration 336:\tk_eff = 1.223001\tres = 1.090E-05\n", - "[ NORMAL ] Iteration 337:\tk_eff = 1.223014\tres = 1.070E-05\n", - "[ NORMAL ] Iteration 338:\tk_eff = 1.223027\tres = 1.047E-05\n", - "[ NORMAL ] Iteration 339:\tk_eff = 1.223039\tres = 1.015E-05\n", - "[ NORMAL ] Iteration 340:\tk_eff = 1.223051\tres = 1.002E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.366890\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.391200\tres = 6.331E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.393015\tres = 6.626E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.381131\tres = 4.640E-03\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.375055\tres = 3.024E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.369635\tres = 1.594E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.365588\tres = 1.445E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.363102\tres = 1.095E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.361522\tres = 6.801E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.361329\tres = 4.350E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.362052\tres = 5.337E-04\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.363766\tres = 2.000E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.366383\tres = 4.733E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.369846\tres = 7.196E-03\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.374028\tres = 9.452E-03\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.378957\tres = 1.131E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.384508\tres = 1.318E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.390660\tres = 1.465E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.397354\tres = 1.600E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.404542\tres = 1.713E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.412186\tres = 1.809E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.420246\tres = 1.889E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.428671\tres = 1.956E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.437437\tres = 2.005E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.446503\tres = 2.045E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.455839\tres = 2.073E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.465413\tres = 2.091E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.475198\tres = 2.100E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.485167\tres = 2.103E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.495295\tres = 2.098E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.505558\tres = 2.087E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.515935\tres = 2.072E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.526405\tres = 2.053E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.536950\tres = 2.029E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.547551\tres = 2.003E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.558191\tres = 1.974E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.568856\tres = 1.943E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.579532\tres = 1.911E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.590203\tres = 1.877E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.600860\tres = 1.841E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.611489\tres = 1.806E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.622080\tres = 1.769E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.632623\tres = 1.732E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.643111\tres = 1.695E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.653533\tres = 1.658E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.663882\tres = 1.621E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.674152\tres = 1.584E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.684335\tres = 1.547E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.694427\tres = 1.511E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.704421\tres = 1.475E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.714313\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.724099\tres = 1.404E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.733774\tres = 1.370E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.743335\tres = 1.336E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.752778\tres = 1.303E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.762103\tres = 1.270E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.771304\tres = 1.239E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 0.780382\tres = 1.207E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 0.789332\tres = 1.177E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 0.798155\tres = 1.147E-02\n", + "[ NORMAL ] Iteration 60:\tk_eff = 0.806849\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 61:\tk_eff = 0.815413\tres = 1.089E-02\n", + "[ NORMAL ] Iteration 62:\tk_eff = 0.823846\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 63:\tk_eff = 0.832147\tres = 1.034E-02\n", + "[ NORMAL ] Iteration 64:\tk_eff = 0.840316\tres = 1.008E-02\n", + "[ NORMAL ] Iteration 65:\tk_eff = 0.848354\tres = 9.817E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 0.856259\tres = 9.565E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 0.864033\tres = 9.318E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 0.871674\tres = 9.078E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 0.879184\tres = 8.844E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 0.886563\tres = 8.616E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 0.893812\tres = 8.393E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 0.900932\tres = 8.177E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 0.907923\tres = 7.965E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 0.914786\tres = 7.760E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 0.921523\tres = 7.560E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 0.928134\tres = 7.365E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 0.934621\tres = 7.174E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 0.940985\tres = 6.989E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 0.947227\tres = 6.809E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 0.953349\tres = 6.634E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 0.959352\tres = 6.463E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 0.965237\tres = 6.297E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 0.971006\tres = 6.134E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 0.976660\tres = 5.977E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 0.982201\tres = 5.823E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 0.987631\tres = 5.674E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 0.992950\tres = 5.528E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 0.998161\tres = 5.386E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.003266\tres = 5.248E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.008265\tres = 5.114E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.013161\tres = 4.983E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.017954\tres = 4.856E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.022648\tres = 4.731E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.027243\tres = 4.611E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.031741\tres = 4.493E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.036143\tres = 4.379E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.040452\tres = 4.267E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.044667\tres = 4.159E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.048794\tres = 4.052E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.052831\tres = 3.950E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.056781\tres = 3.849E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.060645\tres = 3.752E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.064425\tres = 3.656E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.068122\tres = 3.564E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.071738\tres = 3.474E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.075274\tres = 3.386E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.078734\tres = 3.300E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.082116\tres = 3.217E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.085423\tres = 3.136E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.088657\tres = 3.056E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.091818\tres = 2.980E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.094909\tres = 2.904E-03\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.097930\tres = 2.831E-03\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.100884\tres = 2.760E-03\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.103771\tres = 2.690E-03\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.106593\tres = 2.623E-03\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.109351\tres = 2.557E-03\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.112047\tres = 2.492E-03\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.114682\tres = 2.430E-03\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.117257\tres = 2.369E-03\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.119772\tres = 2.310E-03\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.122231\tres = 2.251E-03\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.124633\tres = 2.196E-03\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.126980\tres = 2.140E-03\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.129273\tres = 2.087E-03\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.131514\tres = 2.035E-03\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.133703\tres = 1.984E-03\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.135840\tres = 1.934E-03\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.137929\tres = 1.886E-03\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.139970\tres = 1.839E-03\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.141963\tres = 1.793E-03\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.143910\tres = 1.749E-03\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.145812\tres = 1.705E-03\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.147670\tres = 1.663E-03\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.149484\tres = 1.622E-03\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.151256\tres = 1.581E-03\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.152986\tres = 1.541E-03\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.154676\tres = 1.503E-03\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.156326\tres = 1.466E-03\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.157938\tres = 1.429E-03\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.159512\tres = 1.394E-03\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.161049\tres = 1.359E-03\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.162549\tres = 1.326E-03\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.164015\tres = 1.292E-03\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.165446\tres = 1.261E-03\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.166843\tres = 1.229E-03\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.168208\tres = 1.199E-03\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.169540\tres = 1.169E-03\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.170840\tres = 1.140E-03\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.172110\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.173350\tres = 1.085E-03\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.174560\tres = 1.058E-03\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.175742\tres = 1.031E-03\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.176895\tres = 1.006E-03\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.178021\tres = 9.812E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.179121\tres = 9.567E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.180194\tres = 9.336E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.181242\tres = 9.100E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.182264\tres = 8.875E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.183264\tres = 8.656E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.184238\tres = 8.452E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.185189\tres = 8.233E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.186118\tres = 8.029E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.187024\tres = 7.839E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.187908\tres = 7.641E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.188772\tres = 7.449E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.189615\tres = 7.271E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.190438\tres = 7.093E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.191241\tres = 6.915E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.192024\tres = 6.742E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.192789\tres = 6.576E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.193536\tres = 6.419E-04\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.194265\tres = 6.263E-04\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.194976\tres = 6.104E-04\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.195670\tres = 5.955E-04\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.196347\tres = 5.806E-04\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.197008\tres = 5.665E-04\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.197653\tres = 5.525E-04\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.198284\tres = 5.388E-04\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.198898\tres = 5.263E-04\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.199498\tres = 5.126E-04\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.200083\tres = 5.000E-04\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.200654\tres = 4.880E-04\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.201212\tres = 4.757E-04\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.201756\tres = 4.647E-04\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.202286\tres = 4.528E-04\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.202804\tres = 4.414E-04\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.203310\tres = 4.310E-04\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.203803\tres = 4.203E-04\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.204285\tres = 4.100E-04\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.204755\tres = 4.003E-04\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.205214\tres = 3.902E-04\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.205661\tres = 3.810E-04\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.206097\tres = 3.711E-04\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.206523\tres = 3.617E-04\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.206939\tres = 3.528E-04\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.207345\tres = 3.447E-04\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.207740\tres = 3.363E-04\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.208127\tres = 3.281E-04\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.208503\tres = 3.198E-04\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.208871\tres = 3.119E-04\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.209230\tres = 3.041E-04\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.209580\tres = 2.968E-04\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.209921\tres = 2.897E-04\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.210255\tres = 2.824E-04\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.210580\tres = 2.759E-04\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.210898\tres = 2.688E-04\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.211208\tres = 2.622E-04\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.211510\tres = 2.563E-04\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.211804\tres = 2.495E-04\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.212092\tres = 2.428E-04\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.212373\tres = 2.374E-04\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.212647\tres = 2.318E-04\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.212914\tres = 2.258E-04\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.213175\tres = 2.200E-04\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.213429\tres = 2.153E-04\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.213678\tres = 2.097E-04\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.213920\tres = 2.049E-04\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.214156\tres = 1.996E-04\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.214387\tres = 1.945E-04\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.214612\tres = 1.904E-04\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.214832\tres = 1.853E-04\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.215046\tres = 1.806E-04\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.215255\tres = 1.762E-04\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.215459\tres = 1.722E-04\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.215658\tres = 1.676E-04\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.215852\tres = 1.637E-04\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.216041\tres = 1.597E-04\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.216226\tres = 1.557E-04\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.216407\tres = 1.520E-04\n", + "[ NORMAL ] Iteration 231:\tk_eff = 1.216582\tres = 1.483E-04\n", + "[ NORMAL ] Iteration 232:\tk_eff = 1.216754\tres = 1.444E-04\n", + "[ NORMAL ] Iteration 233:\tk_eff = 1.216921\tres = 1.409E-04\n", + "[ NORMAL ] Iteration 234:\tk_eff = 1.217084\tres = 1.376E-04\n", + "[ NORMAL ] Iteration 235:\tk_eff = 1.217244\tres = 1.344E-04\n", + "[ NORMAL ] Iteration 236:\tk_eff = 1.217399\tres = 1.309E-04\n", + "[ NORMAL ] Iteration 237:\tk_eff = 1.217551\tres = 1.274E-04\n", + "[ NORMAL ] Iteration 238:\tk_eff = 1.217699\tres = 1.247E-04\n", + "[ NORMAL ] Iteration 239:\tk_eff = 1.217843\tres = 1.216E-04\n", + "[ NORMAL ] Iteration 240:\tk_eff = 1.217983\tres = 1.184E-04\n", + "[ NORMAL ] Iteration 241:\tk_eff = 1.218121\tres = 1.154E-04\n", + "[ NORMAL ] Iteration 242:\tk_eff = 1.218255\tres = 1.131E-04\n", + "[ NORMAL ] Iteration 243:\tk_eff = 1.218386\tres = 1.101E-04\n", + "[ NORMAL ] Iteration 244:\tk_eff = 1.218514\tres = 1.075E-04\n", + "[ NORMAL ] Iteration 245:\tk_eff = 1.218639\tres = 1.048E-04\n", + "[ NORMAL ] Iteration 246:\tk_eff = 1.218760\tres = 1.024E-04\n", + "[ NORMAL ] Iteration 247:\tk_eff = 1.218879\tres = 9.989E-05\n", + "[ NORMAL ] Iteration 248:\tk_eff = 1.218994\tres = 9.739E-05\n", + "[ NORMAL ] Iteration 249:\tk_eff = 1.219107\tres = 9.487E-05\n", + "[ NORMAL ] Iteration 250:\tk_eff = 1.219217\tres = 9.257E-05\n", + "[ NORMAL ] Iteration 251:\tk_eff = 1.219324\tres = 9.035E-05\n", + "[ NORMAL ] Iteration 252:\tk_eff = 1.219429\tres = 8.803E-05\n", + "[ NORMAL ] Iteration 253:\tk_eff = 1.219531\tres = 8.599E-05\n", + "[ NORMAL ] Iteration 254:\tk_eff = 1.219631\tres = 8.364E-05\n", + "[ NORMAL ] Iteration 255:\tk_eff = 1.219728\tres = 8.175E-05\n", + "[ NORMAL ] Iteration 256:\tk_eff = 1.219823\tres = 7.971E-05\n", + "[ NORMAL ] Iteration 257:\tk_eff = 1.219916\tres = 7.776E-05\n", + "[ NORMAL ] Iteration 258:\tk_eff = 1.220006\tres = 7.582E-05\n", + "[ NORMAL ] Iteration 259:\tk_eff = 1.220094\tres = 7.438E-05\n", + "[ NORMAL ] Iteration 260:\tk_eff = 1.220181\tres = 7.227E-05\n", + "[ NORMAL ] Iteration 261:\tk_eff = 1.220264\tres = 7.058E-05\n", + "[ NORMAL ] Iteration 262:\tk_eff = 1.220346\tres = 6.872E-05\n", + "[ NORMAL ] Iteration 263:\tk_eff = 1.220426\tres = 6.695E-05\n", + "[ NORMAL ] Iteration 264:\tk_eff = 1.220504\tres = 6.549E-05\n", + "[ NORMAL ] Iteration 265:\tk_eff = 1.220580\tres = 6.375E-05\n", + "[ NORMAL ] Iteration 266:\tk_eff = 1.220654\tres = 6.240E-05\n", + "[ NORMAL ] Iteration 267:\tk_eff = 1.220726\tres = 6.073E-05\n", + "[ NORMAL ] Iteration 268:\tk_eff = 1.220797\tres = 5.942E-05\n", + "[ NORMAL ] Iteration 269:\tk_eff = 1.220866\tres = 5.792E-05\n", + "[ NORMAL ] Iteration 270:\tk_eff = 1.220933\tres = 5.661E-05\n", + "[ NORMAL ] Iteration 271:\tk_eff = 1.220999\tres = 5.501E-05\n", + "[ NORMAL ] Iteration 272:\tk_eff = 1.221063\tres = 5.368E-05\n", + "[ NORMAL ] Iteration 273:\tk_eff = 1.221125\tres = 5.286E-05\n", + "[ NORMAL ] Iteration 274:\tk_eff = 1.221187\tres = 5.103E-05\n", + "[ NORMAL ] Iteration 275:\tk_eff = 1.221246\tres = 5.013E-05\n", + "[ NORMAL ] Iteration 276:\tk_eff = 1.221304\tres = 4.861E-05\n", + "[ NORMAL ] Iteration 277:\tk_eff = 1.221360\tres = 4.737E-05\n", + "[ NORMAL ] Iteration 278:\tk_eff = 1.221416\tres = 4.629E-05\n", + "[ NORMAL ] Iteration 279:\tk_eff = 1.221470\tres = 4.515E-05\n", + "[ NORMAL ] Iteration 280:\tk_eff = 1.221522\tres = 4.417E-05\n", + "[ NORMAL ] Iteration 281:\tk_eff = 1.221574\tres = 4.309E-05\n", + "[ NORMAL ] Iteration 282:\tk_eff = 1.221624\tres = 4.219E-05\n", + "[ NORMAL ] Iteration 283:\tk_eff = 1.221673\tres = 4.099E-05\n", + "[ NORMAL ] Iteration 284:\tk_eff = 1.221721\tres = 3.998E-05\n", + "[ NORMAL ] Iteration 285:\tk_eff = 1.221767\tres = 3.891E-05\n", + "[ NORMAL ] Iteration 286:\tk_eff = 1.221812\tres = 3.781E-05\n", + "[ NORMAL ] Iteration 287:\tk_eff = 1.221857\tres = 3.698E-05\n", + "[ NORMAL ] Iteration 288:\tk_eff = 1.221900\tres = 3.633E-05\n", + "[ NORMAL ] Iteration 289:\tk_eff = 1.221942\tres = 3.535E-05\n", + "[ NORMAL ] Iteration 290:\tk_eff = 1.221983\tres = 3.445E-05\n", + "[ NORMAL ] Iteration 291:\tk_eff = 1.222023\tres = 3.355E-05\n", + "[ NORMAL ] Iteration 292:\tk_eff = 1.222062\tres = 3.281E-05\n", + "[ NORMAL ] Iteration 293:\tk_eff = 1.222100\tres = 3.203E-05\n", + "[ NORMAL ] Iteration 294:\tk_eff = 1.222138\tres = 3.108E-05\n", + "[ NORMAL ] Iteration 295:\tk_eff = 1.222174\tres = 3.049E-05\n", + "[ NORMAL ] Iteration 296:\tk_eff = 1.222209\tres = 2.969E-05\n", + "[ NORMAL ] Iteration 297:\tk_eff = 1.222244\tres = 2.902E-05\n", + "[ NORMAL ] Iteration 298:\tk_eff = 1.222278\tres = 2.820E-05\n", + "[ NORMAL ] Iteration 299:\tk_eff = 1.222310\tres = 2.747E-05\n", + "[ NORMAL ] Iteration 300:\tk_eff = 1.222342\tres = 2.679E-05\n", + "[ NORMAL ] Iteration 301:\tk_eff = 1.222374\tres = 2.626E-05\n", + "[ NORMAL ] Iteration 302:\tk_eff = 1.222404\tres = 2.554E-05\n", + "[ NORMAL ] Iteration 303:\tk_eff = 1.222434\tres = 2.483E-05\n", + "[ NORMAL ] Iteration 304:\tk_eff = 1.222463\tres = 2.432E-05\n", + "[ NORMAL ] Iteration 305:\tk_eff = 1.222492\tres = 2.387E-05\n", + "[ NORMAL ] Iteration 306:\tk_eff = 1.222519\tres = 2.316E-05\n", + "[ NORMAL ] Iteration 307:\tk_eff = 1.222546\tres = 2.274E-05\n", + "[ NORMAL ] Iteration 308:\tk_eff = 1.222573\tres = 2.220E-05\n", + "[ NORMAL ] Iteration 309:\tk_eff = 1.222599\tres = 2.168E-05\n", + "[ NORMAL ] Iteration 310:\tk_eff = 1.222624\tres = 2.107E-05\n", + "[ NORMAL ] Iteration 311:\tk_eff = 1.222648\tres = 2.062E-05\n", + "[ NORMAL ] Iteration 312:\tk_eff = 1.222672\tres = 2.005E-05\n", + "[ NORMAL ] Iteration 313:\tk_eff = 1.222696\tres = 1.959E-05\n", + "[ NORMAL ] Iteration 314:\tk_eff = 1.222718\tres = 1.898E-05\n", + "[ NORMAL ] Iteration 315:\tk_eff = 1.222740\tres = 1.841E-05\n", + "[ NORMAL ] Iteration 316:\tk_eff = 1.222762\tres = 1.808E-05\n", + "[ NORMAL ] Iteration 317:\tk_eff = 1.222783\tres = 1.765E-05\n", + "[ NORMAL ] Iteration 318:\tk_eff = 1.222803\tres = 1.713E-05\n", + "[ NORMAL ] Iteration 319:\tk_eff = 1.222823\tres = 1.674E-05\n", + "[ NORMAL ] Iteration 320:\tk_eff = 1.222843\tres = 1.638E-05\n", + "[ NORMAL ] Iteration 321:\tk_eff = 1.222862\tres = 1.593E-05\n", + "[ NORMAL ] Iteration 322:\tk_eff = 1.222880\tres = 1.546E-05\n", + "[ NORMAL ] Iteration 323:\tk_eff = 1.222898\tres = 1.519E-05\n", + "[ NORMAL ] Iteration 324:\tk_eff = 1.222916\tres = 1.487E-05\n", + "[ NORMAL ] Iteration 325:\tk_eff = 1.222933\tres = 1.446E-05\n", + "[ NORMAL ] Iteration 326:\tk_eff = 1.222950\tres = 1.403E-05\n", + "[ NORMAL ] Iteration 327:\tk_eff = 1.222967\tres = 1.379E-05\n", + "[ NORMAL ] Iteration 328:\tk_eff = 1.222982\tres = 1.342E-05\n", + "[ NORMAL ] Iteration 329:\tk_eff = 1.222998\tres = 1.298E-05\n", + "[ NORMAL ] Iteration 330:\tk_eff = 1.223013\tres = 1.278E-05\n", + "[ NORMAL ] Iteration 331:\tk_eff = 1.223028\tres = 1.236E-05\n", + "[ NORMAL ] Iteration 332:\tk_eff = 1.223043\tres = 1.227E-05\n", + "[ NORMAL ] Iteration 333:\tk_eff = 1.223057\tres = 1.177E-05\n", + "[ NORMAL ] Iteration 334:\tk_eff = 1.223070\tres = 1.146E-05\n", + "[ NORMAL ] Iteration 335:\tk_eff = 1.223084\tres = 1.122E-05\n", + "[ NORMAL ] Iteration 336:\tk_eff = 1.223097\tres = 1.105E-05\n", + "[ NORMAL ] Iteration 337:\tk_eff = 1.223110\tres = 1.063E-05\n", + "[ NORMAL ] Iteration 338:\tk_eff = 1.223122\tres = 1.054E-05\n", + "[ NORMAL ] Iteration 339:\tk_eff = 1.223134\tres = 1.015E-05\n", + "[ NORMAL ] Iteration 340:\tk_eff = 1.223146\tres = 1.005E-05\n" ] } ], @@ -1920,9 +1931,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.223474\n", - "openmoc keff = 1.223051\n", - "bias [pcm]: -42.3\n" + "openmc keff = 1.224484\n", + "openmoc keff = 1.223146\n", + "bias [pcm]: -133.8\n" ] } ], @@ -1979,7 +1990,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1995,9 +2006,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nxhiT4P4fD4z+wrudGZ0AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2080,9 +2091,9 @@ "outputs": [ { "data": { - "image/png": "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\ni7uZWYH+P/3NVBUejmSDAAAAAElFTkSuQmCC\n", + "image/png": "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\nK8T/B194ISi0+XToAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2096,7 +2107,6 @@ "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", @@ -2104,7 +2114,6 @@ "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()" @@ -2112,8 +2121,9 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -2127,7 +2137,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 2927466daf..40e195d65d 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/lib/python3.6/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/python3/lib/python3.5/site-packages/matplotlib/__init__.py:1401: 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", @@ -51,6 +51,7 @@ "\n", "import openmc\n", "import openmc.mgxs\n", + "from openmc.opencg_compatible import get_opencg_geometry\n", "import openmoc\n", "import openmoc.process\n", "from openmoc.opencg_compatible import get_openmoc_geometry\n", @@ -457,7 +458,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -742,9 +743,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 54b65c8bda6af5788bd762b8cf9855d1a8008238\n", - " Date/Time | 2017-02-12 13:39:31\n", - " OpenMP Threads | 8\n", + " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", + " Date/Time | 2017-02-21 15:11:55\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -754,12 +755,12 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading B10 from /opt/xsdata/nndc/B10.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", + " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/scripts/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -774,53 +775,53 @@ " 1/1 1.03852 \n", " 2/1 0.99743 \n", " 3/1 1.02987 \n", - " 4/1 1.04472 \n", - " 5/1 1.02183 \n", - " 6/1 1.05263 \n", - " 7/1 0.99048 \n", - " 8/1 1.02753 \n", - " 9/1 1.03159 \n", - " 10/1 1.04005 \n", - " 11/1 1.05278 \n", - " 12/1 1.02555 1.03917 +/- 0.01362\n", - " 13/1 0.99400 1.02411 +/- 0.01699\n", - " 14/1 1.03508 1.02685 +/- 0.01232\n", - " 15/1 1.00055 1.02159 +/- 0.01090\n", - " 16/1 1.01334 1.02022 +/- 0.00900\n", - " 17/1 0.99822 1.01707 +/- 0.00823\n", - " 18/1 1.01767 1.01715 +/- 0.00713\n", - " 19/1 1.05052 1.02086 +/- 0.00730\n", - " 20/1 1.03133 1.02190 +/- 0.00661\n", - " 21/1 1.04112 1.02365 +/- 0.00623\n", - " 22/1 1.04175 1.02516 +/- 0.00588\n", - " 23/1 1.01909 1.02469 +/- 0.00543\n", - " 24/1 1.07119 1.02801 +/- 0.00603\n", - " 25/1 0.97414 1.02442 +/- 0.00666\n", - " 26/1 1.04709 1.02584 +/- 0.00639\n", - " 27/1 1.05872 1.02777 +/- 0.00631\n", - " 28/1 1.03930 1.02841 +/- 0.00598\n", - " 29/1 1.01488 1.02770 +/- 0.00570\n", - " 30/1 1.04513 1.02857 +/- 0.00548\n", - " 31/1 0.99538 1.02699 +/- 0.00545\n", - " 32/1 1.00106 1.02581 +/- 0.00532\n", - " 33/1 0.99389 1.02442 +/- 0.00527\n", - " 34/1 0.99938 1.02338 +/- 0.00516\n", - " 35/1 1.02161 1.02331 +/- 0.00495\n", - " 36/1 1.04084 1.02398 +/- 0.00480\n", - " 37/1 0.98801 1.02265 +/- 0.00481\n", - " 38/1 1.01348 1.02232 +/- 0.00464\n", - " 39/1 1.06693 1.02386 +/- 0.00474\n", - " 40/1 1.07729 1.02564 +/- 0.00491\n", - " 41/1 1.03191 1.02585 +/- 0.00475\n", - " 42/1 1.05209 1.02667 +/- 0.00468\n", - " 43/1 1.02997 1.02677 +/- 0.00453\n", - " 44/1 1.07288 1.02812 +/- 0.00460\n", - " 45/1 1.01268 1.02768 +/- 0.00449\n", - " 46/1 1.03759 1.02796 +/- 0.00437\n", - " 47/1 1.02620 1.02791 +/- 0.00425\n", - " 48/1 1.02509 1.02783 +/- 0.00414\n", - " 49/1 1.01075 1.02740 +/- 0.00406\n", - " 50/1 0.99403 1.02656 +/- 0.00404\n", + " 4/1 1.04397 \n", + " 5/1 1.06262 \n", + " 6/1 1.06657 \n", + " 7/1 0.98574 \n", + " 8/1 1.04364 \n", + " 9/1 1.01253 \n", + " 10/1 1.02094 \n", + " 11/1 0.99586 \n", + " 12/1 1.00508 1.00047 +/- 0.00461\n", + " 13/1 1.05292 1.01795 +/- 0.01769\n", + " 14/1 1.04732 1.02530 +/- 0.01450\n", + " 15/1 1.04886 1.03001 +/- 0.01218\n", + " 16/1 1.00948 1.02659 +/- 0.01052\n", + " 17/1 1.02684 1.02662 +/- 0.00889\n", + " 18/1 0.97234 1.01984 +/- 0.01026\n", + " 19/1 0.99754 1.01736 +/- 0.00938\n", + " 20/1 0.98964 1.01459 +/- 0.00884\n", + " 21/1 1.04140 1.01703 +/- 0.00836\n", + " 22/1 1.03854 1.01882 +/- 0.00784\n", + " 23/1 1.05917 1.02192 +/- 0.00785\n", + " 24/1 1.02413 1.02208 +/- 0.00727\n", + " 25/1 1.03113 1.02268 +/- 0.00679\n", + " 26/1 1.05113 1.02446 +/- 0.00660\n", + " 27/1 1.03252 1.02494 +/- 0.00622\n", + " 28/1 1.05196 1.02644 +/- 0.00605\n", + " 29/1 0.99663 1.02487 +/- 0.00593\n", + " 30/1 1.01820 1.02454 +/- 0.00564\n", + " 31/1 1.02753 1.02468 +/- 0.00537\n", + " 32/1 1.02162 1.02454 +/- 0.00512\n", + " 33/1 1.04083 1.02525 +/- 0.00494\n", + " 34/1 1.03335 1.02558 +/- 0.00474\n", + " 35/1 1.01304 1.02508 +/- 0.00458\n", + " 36/1 0.99299 1.02385 +/- 0.00457\n", + " 37/1 1.04936 1.02479 +/- 0.00450\n", + " 38/1 1.02856 1.02493 +/- 0.00433\n", + " 39/1 1.03706 1.02535 +/- 0.00420\n", + " 40/1 1.08118 1.02721 +/- 0.00447\n", + " 41/1 1.00149 1.02638 +/- 0.00440\n", + " 42/1 1.00233 1.02563 +/- 0.00433\n", + " 43/1 1.03023 1.02577 +/- 0.00419\n", + " 44/1 1.03230 1.02596 +/- 0.00407\n", + " 45/1 0.98123 1.02468 +/- 0.00416\n", + " 46/1 1.02126 1.02458 +/- 0.00404\n", + " 47/1 0.99772 1.02386 +/- 0.00400\n", + " 48/1 1.02773 1.02396 +/- 0.00389\n", + " 49/1 1.01690 1.02378 +/- 0.00379\n", + " 50/1 1.02890 1.02391 +/- 0.00370\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -830,27 +831,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2114E-01 seconds\n", - " Reading cross sections = 2.9270E-01 seconds\n", - " Total time in simulation = 7.0359E+00 seconds\n", - " Time in transport only = 6.4162E+00 seconds\n", - " Time in inactive batches = 4.6555E-01 seconds\n", - " Time in active batches = 6.5703E+00 seconds\n", - " Time synchronizing fission bank = 2.7486E-03 seconds\n", - " Sampling source sites = 1.8012E-03 seconds\n", - " SEND/RECV source sites = 9.0751E-04 seconds\n", - " Time accumulating tallies = 3.3323E-04 seconds\n", - " Total time for finalization = 2.6483E-05 seconds\n", - " Total time elapsed = 7.4667E+00 seconds\n", - " Calculation Rate (inactive) = 53700.2 neutrons/second\n", - " Calculation Rate (active) = 15219.9 neutrons/second\n", + " Total time for initialization = 5.2287E-01 seconds\n", + " Reading cross sections = 3.5267E-01 seconds\n", + " Total time in simulation = 1.3331E+01 seconds\n", + " Time in transport only = 1.3109E+01 seconds\n", + " Time in inactive batches = 9.4551E-01 seconds\n", + " Time in active batches = 1.2385E+01 seconds\n", + " Time synchronizing fission bank = 3.8467E-03 seconds\n", + " Sampling source sites = 2.5076E-03 seconds\n", + " SEND/RECV source sites = 1.2758E-03 seconds\n", + " Time accumulating tallies = 7.0302E-04 seconds\n", + " Total time for finalization = 1.5000E-05 seconds\n", + " Total time elapsed = 1.3863E+01 seconds\n", + " Calculation Rate (inactive) = 26440.9 neutrons/second\n", + " Calculation Rate (active) = 8074.24 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02436 +/- 0.00318\n", - " k-effective (Track-length) = 1.02656 +/- 0.00404\n", - " k-effective (Absorption) = 1.02601 +/- 0.00333\n", - " Combined k-effective = 1.02539 +/- 0.00276\n", + " k-effective (Collision) = 1.02621 +/- 0.00393\n", + " k-effective (Track-length) = 1.02391 +/- 0.00370\n", + " k-effective (Absorption) = 1.02077 +/- 0.00423\n", + " Combined k-effective = 1.02331 +/- 0.00353\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -970,7 +971,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -995,16 +996,16 @@ " 10000\n", " 1\n", " U235\n", - " 8.047288e-03\n", - " 2.712731e-05\n", + " 8.096764e-03\n", + " 3.130177e-05\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U238\n", - " 7.364803e-03\n", - " 4.197956e-05\n", + " 7.364515e-03\n", + " 4.510564e-05\n", " \n", " \n", " 5\n", @@ -1019,16 +1020,16 @@ " 10000\n", " 2\n", " U235\n", - " 3.616058e-01\n", - " 2.178190e-03\n", + " 3.611153e-01\n", + " 2.048312e-03\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U238\n", - " 6.743624e-07\n", - " 4.004691e-09\n", + " 6.735070e-07\n", + " 3.780177e-09\n", " \n", " \n", " 2\n", @@ -1044,11 +1045,11 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U235 8.047288e-03 2.712731e-05\n", - "4 10000 1 U238 7.364803e-03 4.197956e-05\n", + "3 10000 1 U235 8.096764e-03 3.130177e-05\n", + "4 10000 1 U238 7.364515e-03 4.510564e-05\n", "5 10000 1 O16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U235 3.616058e-01 2.178190e-03\n", - "1 10000 2 U238 6.743624e-07 4.004691e-09\n", + "0 10000 2 U235 3.611153e-01 2.048312e-03\n", + "1 10000 2 U238 6.735070e-07 3.780177e-09\n", "2 10000 2 O16 0.000000e+00 0.000000e+00" ] }, @@ -1086,13 +1087,13 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t8.05e-03 +/- 3.37e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t3.62e-01 +/- 6.02e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t8.10e-03 +/- 3.87e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t3.61e-01 +/- 5.67e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [0.625 - 20000000.0eV]:\t7.36e-03 +/- 5.70e-01%\n", - " Group 2 [0.0 - 0.625 eV]:\t6.74e-07 +/- 5.94e-01%\n", + " Group 1 [0.625 - 20000000.0eV]:\t7.36e-03 +/- 6.12e-01%\n", + " Group 2 [0.0 - 0.625 eV]:\t6.74e-07 +/- 5.61e-01%\n", "\n", "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", @@ -1107,7 +1108,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1506: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1506: RuntimeWarning: invalid value encountered in true_divide\n", " data = self.std_dev[indices] / self.mean[indices]\n" ] } @@ -1134,11 +1135,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1212,7 +1213,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1237,16 +1238,16 @@ " 10000\n", " 1\n", " U235\n", - " 0.074714\n", - " 0.000331\n", + " 0.074393\n", + " 0.000308\n", " \n", " \n", " 1\n", " 10000\n", " 1\n", " U238\n", - " 0.005976\n", - " 0.000034\n", + " 0.005982\n", + " 0.000036\n", " \n", " \n", " 2\n", @@ -1262,8 +1263,8 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "0 10000 1 U235 0.074714 0.000331\n", - "1 10000 1 U238 0.005976 0.000034\n", + "0 10000 1 U235 0.074393 0.000308\n", + "1 10000 1 U238 0.005982 0.000036\n", "2 10000 1 O16 0.000000 0.000000" ] }, @@ -1303,7 +1304,8 @@ "outputs": [], "source": [ "# Create an OpenMOC Geometry from the OpenCG Geometry\n", - "openmoc_geometry = get_openmoc_geometry(mgxs_lib.opencg_geometry)" + "opencg_geometry = get_opencg_geometry(mgxs_lib.geometry)\n", + "openmoc_geometry = get_openmoc_geometry(opencg_geometry)" ] }, { @@ -1324,11 +1326,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1359,131 +1361,131 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.823553\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.780331\tres = 1.940E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.739473\tres = 6.545E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.710842\tres = 5.284E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.689636\tres = 3.926E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.675006\tres = 3.007E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.665799\tres = 2.138E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.661143\tres = 1.377E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.660269\tres = 7.173E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.662521\tres = 1.977E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.667334\tres = 3.703E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.674221\tres = 7.406E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.682763\tres = 1.042E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.692603\tres = 1.275E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.703433\tres = 1.448E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.714994\tres = 1.570E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.727063\tres = 1.649E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.739455\tres = 1.694E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.752013\tres = 1.710E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.764605\tres = 1.703E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.777124\tres = 1.679E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.789481\tres = 1.642E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.801604\tres = 1.595E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.813436\tres = 1.540E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.824931\tres = 1.480E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.836055\tres = 1.417E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.846783\tres = 1.352E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.857097\tres = 1.287E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.866984\tres = 1.221E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.876441\tres = 1.157E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.885464\tres = 1.094E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.894057\tres = 1.032E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.902225\tres = 9.732E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.909975\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.917318\tres = 8.615E-03\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.924266\tres = 8.093E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.930830\tres = 7.596E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.937025\tres = 7.123E-03\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.942865\tres = 6.675E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.948364\tres = 6.251E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.953538\tres = 5.850E-03\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.958400\tres = 5.472E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.962967\tres = 5.115E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.967251\tres = 4.779E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.971269\tres = 4.464E-03\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.975034\tres = 4.167E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.978560\tres = 3.889E-03\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.981859\tres = 3.627E-03\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.984944\tres = 3.382E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.987828\tres = 3.153E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.990523\tres = 2.938E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.993039\tres = 2.737E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.995388\tres = 2.549E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.997579\tres = 2.373E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.999623\tres = 2.209E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.001528\tres = 2.056E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.003303\tres = 1.912E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.004956\tres = 1.779E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.006496\tres = 1.654E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.007930\tres = 1.538E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.009264\tres = 1.429E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.010505\tres = 1.328E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.011659\tres = 1.234E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.012732\tres = 1.147E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.013730\tres = 1.065E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.014657\tres = 9.889E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.015518\tres = 9.182E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.016319\tres = 8.524E-04\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.017062\tres = 7.912E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.017752\tres = 7.343E-04\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.018393\tres = 6.813E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.018987\tres = 6.321E-04\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.019539\tres = 5.864E-04\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.020051\tres = 5.439E-04\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.020527\tres = 5.044E-04\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.020967\tres = 4.677E-04\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.021376\tres = 4.337E-04\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.021755\tres = 4.021E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.022107\tres = 3.727E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.022432\tres = 3.454E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.022734\tres = 3.201E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.023014\tres = 2.966E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.023273\tres = 2.749E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.023514\tres = 2.547E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.023736\tres = 2.359E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.023943\tres = 2.185E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.024134\tres = 2.024E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.024311\tres = 1.875E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.024475\tres = 1.736E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.024626\tres = 1.608E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.024767\tres = 1.489E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.024897\tres = 1.378E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.025018\tres = 1.276E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.025129\tres = 1.181E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.025232\tres = 1.093E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.025328\tres = 1.012E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.025416\tres = 9.368E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.025498\tres = 8.671E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.025574\tres = 8.025E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.025644\tres = 7.426E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.025709\tres = 6.871E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.025769\tres = 6.361E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.025824\tres = 5.884E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.025876\tres = 5.443E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.025923\tres = 5.037E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.025967\tres = 4.659E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.026008\tres = 4.311E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.026046\tres = 3.987E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.026081\tres = 3.688E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.026113\tres = 3.412E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.026143\tres = 3.154E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.026170\tres = 2.920E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.026196\tres = 2.699E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.026219\tres = 2.497E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.026241\tres = 2.311E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.026261\tres = 2.135E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.026279\tres = 1.974E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.026297\tres = 1.826E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.026312\tres = 1.690E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.026327\tres = 1.563E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.026341\tres = 1.446E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.026353\tres = 1.337E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.026365\tres = 1.235E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.026376\tres = 1.141E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.026386\tres = 1.057E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.823793\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.780554\tres = 1.938E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.739678\tres = 6.539E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.711003\tres = 5.285E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.689738\tres = 3.931E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.675038\tres = 3.014E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.665753\tres = 2.147E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.661013\tres = 1.389E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.660052\tres = 7.293E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.662216\tres = 2.057E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.666942\tres = 3.576E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.673743\tres = 7.278E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.682202\tres = 1.030E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.691961\tres = 1.264E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.702715\tres = 1.438E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.714203\tres = 1.561E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.726205\tres = 1.641E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.738532\tres = 1.686E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.751030\tres = 1.703E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.763567\tres = 1.697E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.776034\tres = 1.674E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.788344\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.800423\tres = 1.591E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.812215\tres = 1.536E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.823673\tres = 1.477E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.834764\tres = 1.415E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.845462\tres = 1.350E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.855748\tres = 1.285E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.865611\tres = 1.220E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.875045\tres = 1.156E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.884048\tres = 1.093E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.892623\tres = 1.032E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.900775\tres = 9.727E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.908511\tres = 9.158E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.915841\tres = 8.613E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.922778\tres = 8.092E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.929332\tres = 7.596E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.935519\tres = 7.124E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.941351\tres = 6.676E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.946843\tres = 6.253E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.952011\tres = 5.852E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.956869\tres = 5.474E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.961431\tres = 5.118E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.965712\tres = 4.783E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.969727\tres = 4.467E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.973489\tres = 4.170E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.977013\tres = 3.892E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.980310\tres = 3.631E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.983394\tres = 3.386E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.986277\tres = 3.156E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.988971\tres = 2.942E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.991487\tres = 2.740E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.993835\tres = 2.552E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.996026\tres = 2.376E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.998069\tres = 2.212E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.999974\tres = 2.059E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.001749\tres = 1.915E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.003403\tres = 1.782E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.004943\tres = 1.657E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.006377\tres = 1.540E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.007711\tres = 1.432E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.008952\tres = 1.331E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.010107\tres = 1.237E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.011181\tres = 1.149E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.012179\tres = 1.067E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.013107\tres = 9.909E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.013969\tres = 9.201E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.014769\tres = 8.542E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.015513\tres = 7.929E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.016204\tres = 7.358E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.016845\tres = 6.828E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.017440\tres = 6.335E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.017993\tres = 5.877E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.018505\tres = 5.451E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.018980\tres = 5.056E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.019422\tres = 4.688E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.019831\tres = 4.347E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.020210\tres = 4.030E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.020562\tres = 3.736E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.020888\tres = 3.463E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.021190\tres = 3.209E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.021471\tres = 2.974E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.021730\tres = 2.756E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.021971\tres = 2.553E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.022194\tres = 2.365E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.022400\tres = 2.191E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.022592\tres = 2.030E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.022769\tres = 1.880E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.022933\tres = 1.741E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.023085\tres = 1.612E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.023226\tres = 1.493E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.023356\tres = 1.382E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.023477\tres = 1.279E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.023589\tres = 1.184E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.023692\tres = 1.096E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.023788\tres = 1.015E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.023876\tres = 9.392E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.023958\tres = 8.694E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.024034\tres = 8.044E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.024104\tres = 7.445E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.024169\tres = 6.889E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.024229\tres = 6.374E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.024285\tres = 5.896E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.024336\tres = 5.457E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.024384\tres = 5.048E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.024428\tres = 4.671E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.024469\tres = 4.320E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.024507\tres = 3.994E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.024541\tres = 3.696E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.024574\tres = 3.416E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.024603\tres = 3.163E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.024631\tres = 2.924E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.024656\tres = 2.704E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.024680\tres = 2.501E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.024702\tres = 2.312E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.024722\tres = 2.138E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.024741\tres = 1.981E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.024758\tres = 1.827E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.024774\tres = 1.690E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.024789\tres = 1.564E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.024802\tres = 1.446E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.024815\tres = 1.338E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.024827\tres = 1.236E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.024837\tres = 1.143E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.024847\tres = 1.057E-05\n" ] } ], @@ -1515,9 +1517,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.025390\n", - "openmoc keff = 1.026386\n", - "bias [pcm]: 99.6\n" + "openmc keff = 1.023307\n", + "openmoc keff = 1.024847\n", + "bias [pcm]: 154.0\n" ] } ], @@ -1625,7 +1627,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 43, @@ -1634,9 +1636,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1662,7 +1664,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -1676,7 +1678,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, From 8059854a77f22f3e92fc6ccba8f3c800cba5033a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 06:56:13 -0600 Subject: [PATCH 48/66] Update settings.xml RELAX NG schema --- src/relaxng/settings.rnc | 41 ++++------- src/relaxng/settings.rng | 145 ++++++++++++--------------------------- 2 files changed, 56 insertions(+), 130 deletions(-) diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 62d9451c3d..988fd0471a 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -1,29 +1,7 @@ element settings { - element confidence_intervals { xsd:boolean }? & + element batches { xsd:positiveInteger }? & - ( - element eigenvalue { - (element batches { xsd:positiveInteger } | - attribute batches { xsd:positiveInteger }) & - (element inactive { xsd:nonNegativeInteger } | - attribute inactive { xsd:nonNegativeInteger }) & - (element particles { xsd:positiveInteger } | - attribute particles { xsd:positiveInteger }) & - (element generations_per_batch { xsd:positiveInteger } | - attribute generations_per_batch { xsd:positiveInteger })? & - (element keff_trigger { - (element type { xsd:string } | attribute type { xsd:string }) & - (element threshold { xsd:double} | attribute threshold { xsd:double }) - } - )? - } | - element fixed_source { - (element batches { xsd:positiveInteger } | - attribute batches { xsd:positiveInteger }) & - (element particles { xsd:positiveInteger } | - attribute particles { xsd:positiveInteger }) - } - ) & + element confidence_intervals { xsd:boolean }? & element cutoff { (element weight { xsd:double } | attribute weight { xsd:double })? & @@ -43,12 +21,19 @@ element settings { attribute upper_right { list { xsd:double+ } }) }? & + element generations_per_batch { xsd:positiveInteger }? & + + element inactive { xsd:nonNegativeInteger }? & + + element keff_trigger { + (element type { xsd:string } | attribute type { xsd:string }) & + (element threshold { xsd:double} | attribute threshold { xsd:double }) + }? & + element log_grid_bins { xsd:positiveInteger }? & element max_order { xsd:nonNegativeInteger }? & - element natural_elements { xsd:string { maxLength = "20" } }? & - element no_reduce { xsd:boolean }? & element output { @@ -60,6 +45,8 @@ element settings { element output_path { xsd:string { maxLength = "255" } }? & + element particles { xsd:positiveInteger }? & + element ptables { xsd:boolean }? & element run_cmfd { xsd:boolean }? & @@ -179,5 +166,5 @@ element settings { (element E_max { xsd:double } | attribute E_max { xsd:double })? }* - }? & + }? } diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index cbeac25a51..fe0a294f42 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -1,107 +1,16 @@ + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 255 - - - - - - - 255 - - - @@ -208,6 +117,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -218,13 +159,6 @@ - - - - 20 - - - @@ -273,6 +207,11 @@ + + + + + From 58bb9c18eede9f4940b0f9e9df6527852c4d42ed Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 14:50:16 -0600 Subject: [PATCH 49/66] Address easy comments from @wbinventor --- docs/source/io_formats/statepoint.rst | 73 +++++++++---------- docs/source/io_formats/summary.rst | 2 +- .../pythonapi/examples/mgxs-part-iii.ipynb | 2 +- openmc/checkvalue.py | 5 +- openmc/statepoint.py | 11 +-- openmc/surface.py | 6 +- src/hdf5_interface.F90 | 2 +- src/initialize.F90 | 6 +- src/summary.F90 | 10 +-- 9 files changed, 53 insertions(+), 64 deletions(-) diff --git a/docs/source/io_formats/statepoint.rst b/docs/source/io_formats/statepoint.rst index 8026c258e6..cbd916d23e 100644 --- a/docs/source/io_formats/statepoint.rst +++ b/docs/source/io_formats/statepoint.rst @@ -19,10 +19,10 @@ The current version of the statepoint file format is 16.0. - **path** (*char[]*) -- Path to directory containing input files. - **cmfd_on** (*int*) -- Flag indicating whether CMFD is on (1) or off (0). - - **tallies_present** (*int*) -- Flag indicating if tallies are - present in the file. - - **source_present** (*int*) -- Flag indicating if source bank is - present in the file. + - **tallies_present** (*int*) -- Flag indicating whether tallies + are present (1) or not (0). + - **source_present** (*int*) -- Flag indicating whether the source + bank is present (1) or not (0). :Datasets: - **seed** (*int8_t*) -- Pseudo-random number generator seed. - **energy_mode** (*char[]*) -- Energy mode of the run, either @@ -79,7 +79,7 @@ The current version of the statepoint file format is 16.0. **/tallies/meshes/** :Attributes: - **n_meshes** (*int*) -- Number of meshes in the problem. - - **ids** (*int[]*) -- User-identified unique ID of each mesh. + - **ids** (*int[]*) -- User-defined unique ID of each mesh. **/tallies/meshes/mesh /** @@ -143,37 +143,32 @@ The current version of the statepoint file format is 16.0. **/runtime/** -:Datasets: - **total initialization** (*double*) -- Time (in seconds on the - master process) spent reading inputs, allocating arrays, etc. - - **reading cross sections** (*double*) -- Time (in seconds on the - master process) spent loading cross section libraries (this is a - subset of initialization). - - **simulation** (*double*) -- Time (in seconds on the master - process) spent between initialization and finalization. - - **transport** (*double*) -- Time (in seconds on the master process) - spent transporting particles. - - **inactive batches** (*double*) -- Time (in seconds on the master - process) spent in the inactive batches (including non-transport - activities like communcating sites). - - **active batches** (*double*) -- Time (in seconds on the master - process) spent in the active batches (including non-transport - activities like communicating sites). - - **synchronizing fission bank** (*double*) -- Time (in seconds on - the master process) spent sampling source particles from fission - sites and communicating them to other processes for load balancing. - - **sampling source sites** (*double*) -- Time (in seconds on the - master process) spent sampling source particles from fission sites. - - **SEND-RECV source sites** (*double*) -- Time (in seconds on the - master process) spent communicating source sites between processes - for load balancing. - - **accumulating tallies** (*double*) -- Time (in seconds on the - master process) spent communicating tally results and evaluating - their statistics. - - **CMFD** (*double*) -- Time (in seconds on the master process) - spent evaluating CMFD. - - **CMFD building matrices** (*double*) -- Time (in seconds on the - master process) spent buliding CMFD matrices. - - **CMFD solving matrices** (*double*) -- Time (in seconds on the - master process) spent solving CMFD matrices. - - **total** (*double*) -- Total time spent (in seconds on the master - process) in the program. +All values are given in seconds and are measured on the master process. + +:Datasets: - **total initialization** (*double*) -- Time spent reading inputs, + allocating arrays, etc. + - **reading cross sections** (*double*) -- Time spent loading cross + section libraries (this is a subset of initialization). + - **simulation** (*double*) -- Time spent between initialization and + finalization. + - **transport** (*double*) -- Time spent transporting particles. + - **inactive batches** (*double*) -- Time spent in the inactive + batches (including non-transport activities like communcating + sites). + - **active batches** (*double*) -- Time spent in the active batches + (including non-transport activities like communicating sites). + - **synchronizing fission bank** (*double*) -- Time spent sampling + source particles from fission sites and communicating them to other + processes for load balancing. + - **sampling source sites** (*double*) -- Time spent sampling source + particles from fission sites. + - **SEND-RECV source sites** (*double*) -- Time spent communicating + source sites between processes for load balancing. + - **accumulating tallies** (*double*) -- Time spent communicating + tally results and evaluating their statistics. + - **CMFD** (*double*) -- Time spent evaluating CMFD. + - **CMFD building matrices** (*double*) -- Time spent buliding CMFD + matrices. + - **CMFD solving matrices** (*double*) -- Time spent solving CMFD + matrices. + - **total** (*double*) -- Total time spent in the program. diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index 671fa33348..f882705490 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -27,7 +27,7 @@ The current version of the summary file format is 5.0. **/geometry/cells/cell /** -:Datasets: - **name** (*char[]*) -- Name of the cell. +:Datasets: - **name** (*char[]*) -- User-defined name of the cell. - **universe** (*int*) -- Universe assigned to the cell. If none is specified, the default universe (0) is assigned. - **fill_type** (*char[]*) -- Type of fill for the cell. Can be diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 40e195d65d..b76696d7fb 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -1303,7 +1303,7 @@ }, "outputs": [], "source": [ - "# Create an OpenMOC Geometry from the OpenCG Geometry\n", + "# Create an OpenMOC Geometry from an equivalent OpenCG Geometry\n", "opencg_geometry = get_opencg_geometry(mgxs_lib.geometry)\n", "openmoc_geometry = get_openmoc_geometry(opencg_geometry)" ] diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index 06e5240048..aa4dc067f9 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -263,9 +263,10 @@ def check_filetype_version(obj, expected_type, expected_version): # Check version if this_version[0] != expected_version: - raise IOError('Statepoint file has a version of {} which is not ' + raise IOError('{} file has a version of {} which is not ' 'consistent with the version expected by OpenMC, {}' - .format('.'.join(this_version), expected_version)) + .format(this_filetype, '.'.join(this_version), + expected_version)) except AttributeError: raise IOError('Could not read {} file. This most likely means the {} ' 'file was produced by a different version of OpenMC than ' diff --git a/openmc/statepoint.py b/openmc/statepoint.py index f29829a417..9c96408855 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -113,6 +113,7 @@ class StatePoint(object): self._f = h5py.File(filename, 'r') self._meshes = {} self._tallies = {} + self._derivs = {} # Check filetype and version cv.check_filetype_version(self._f, 'statepoint', _VERSION_STATEPOINT) @@ -326,7 +327,7 @@ class StatePoint(object): # Read a list of the IDs for each Tally if n_tallies > 0: - # Tally used-defined IDs + # Tally user-defined IDs tally_ids = tallies_group.attrs['ids'] else: tally_ids = [] @@ -405,11 +406,6 @@ class StatePoint(object): @property def tally_derivatives(self): if not self._derivs_read: - # Initialize dictionaries for the Meshes - # Keys - Derivative IDs - # Values - TallyDerivative objects - self._derivs = {} - # Populate the dictionary if any derivatives are present. if 'derivatives' in self._f['tallies']: # Read the derivative ids. @@ -429,9 +425,6 @@ class StatePoint(object): deriv.nuclide = group['nuclide'].value.decode() elif deriv.variable == 'temperature': deriv.material = group['material'].value - else: - raise ValueError('Unrecognized tally differential ' - 'variable') self._derivs[d_id] = deriv self._derivs_read = True diff --git a/openmc/surface.py b/openmc/surface.py index 193afe3100..e7d999b15e 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -14,7 +14,7 @@ from openmc.region import Region, Intersection, Union # A static variable for auto-generated Surface IDs AUTO_SURFACE_ID = 10000 -_BC_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] +_BOUNDARY_TYPES = ['transmission', 'vacuum', 'reflective', 'periodic'] def reset_auto_surface_id(): @@ -141,7 +141,7 @@ class Surface(object): @boundary_type.setter def boundary_type(self, boundary_type): check_type('boundary type', boundary_type, string_types) - check_value('boundary type', boundary_type, _BC_TYPES) + check_value('boundary type', boundary_type, _BOUNDARY_TYPES) self._boundary_type = boundary_type def bounding_box(self, side): @@ -204,7 +204,7 @@ class Surface(object): surface_id = int(group.name.split('/')[-1].lstrip('surface ')) name = group['name'].value.decode() surf_type = group['type'].value.decode() - bc = group['boundary_condition'].value.decode() + bc = group['boundary_type'].value.decode() coeffs = group['coefficients'][...] # Create the Surface based on its type diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 6ca39e0001..3a25825112 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -2067,7 +2067,7 @@ contains call h5tcopy_f(H5T_C_S1, filetype, hdf5_err) call h5tset_size_f(filetype, n, hdf5_err) - ! Crate memory space and attribute + ! Create memory space and attribute call h5screate_f(H5S_SCALAR_F, dspace_id, hdf5_err) call h5acreate_f(obj_id, trim(name), filetype, dspace_id, & attr_id, hdf5_err) diff --git a/src/initialize.F90 b/src/initialize.F90 index ed1e663fdb..be4b0f28a6 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -13,18 +13,18 @@ module initialize use set_header, only: SetInt use energy_grid, only: logarithmic_grid, grid_method use error, only: fatal_error, warning - use geometry, only: neighbor_lists, count_instance, calc_offsets, & + use geometry, only: neighbor_lists, count_instance, calc_offsets, & maximum_levels use geometry_header, only: Cell, Universe, Lattice, RectLattice, HexLattice,& &BASE_UNIVERSE use global - use hdf5_interface, only: file_open, read_attribute, file_close, & + use hdf5_interface, only: file_open, read_attribute, file_close, & hdf5_bank_t, hdf5_integer8_t use input_xml, only: read_input_xml, cells_in_univ_dict, read_plots_xml use material_header, only: Material use message_passing use mgxs_data, only: read_mgxs, create_macro_xs - use output, only: title, header, print_version, write_message, & + use output, only: title, header, print_version, write_message, & print_usage, print_plot use random_lcg, only: initialize_prng use state_point, only: load_state_point diff --git a/src/summary.F90 b/src/summary.F90 index fa5681052f..e6ad6f5d95 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -329,16 +329,16 @@ contains call write_dataset(surface_group, "coefficients", coeffs) deallocate(coeffs) - ! Write boundary condition + ! Write boundary type select case (s%bc) case (BC_TRANSMIT) - call write_dataset(surface_group, "boundary_condition", "transmission") + call write_dataset(surface_group, "boundary_type", "transmission") case (BC_VACUUM) - call write_dataset(surface_group, "boundary_condition", "vacuum") + call write_dataset(surface_group, "boundary_type", "vacuum") case (BC_REFLECT) - call write_dataset(surface_group, "boundary_condition", "reflective") + call write_dataset(surface_group, "boundary_type", "reflective") case (BC_PERIODIC) - call write_dataset(surface_group, "boundary_condition", "periodic") + call write_dataset(surface_group, "boundary_type", "periodic") end select call close_group(surface_group) From 01254d0b3de170a566d1c731757b90fe543c2801 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 17:00:25 -0600 Subject: [PATCH 50/66] Make Universe, Lattice, and Material.from_hdf5 methods --- openmc/cell.py | 2 +- openmc/lattice.py | 151 ++++++++++++++++++++++++++++++ openmc/material.py | 43 +++++++++ openmc/summary.py | 224 +++------------------------------------------ openmc/surface.py | 22 ++++- openmc/universe.py | 29 ++++++ 6 files changed, 255 insertions(+), 216 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 8cd87daf3d..87dbb0797c 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -563,7 +563,7 @@ class Cell(object): if isinstance(node, Halfspace): path = "./surface[@id='{}']".format(node.surface.id) if xml_element.find(path) is None: - xml_element.append(node.surface.create_xml_subelement()) + xml_element.append(node.surface.to_xml_element()) elif isinstance(node, Complement): create_surface_elements(node.node, element) else: diff --git a/openmc/lattice.py b/openmc/lattice.py index d6f701e529..361c2a6be9 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -110,6 +110,157 @@ class Lattice(object): cv.check_type('outer universe', outer, openmc.Universe) self._outer = outer + @staticmethod + def from_hdf5(group, universes): + """Create lattice from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + universes : dict + Dictionary mapping universe IDs to instances of + :class:`openmc.Universe`. + + Returns + ------- + openmc.Lattice + Instance of lattice subclass + + """ + lattice_id = int(group.name.split('/')[-1].lstrip('lattice ')) + name = group['name'].value.decode() + lattice_type = group['type'].value.decode() + + if 'offsets' in group: + offsets = group['offsets'][...] + else: + offsets = None + + if lattice_type == 'rectangular': + dimension = group['dimension'][...] + lower_left = group['lower_left'][...] + pitch = group['pitch'][...] + outer = group['outer'].value + universe_ids = group['universes'][...] + + # Create the Lattice + lattice = openmc.RectLattice(lattice_id, name) + lattice.lower_left = lower_left + lattice.pitch = pitch + + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] + + # Build array of Universe pointers for the Lattice + uarray = np.empty(universe_ids.shape, dtype=openmc.Universe) + + for z in range(universe_ids.shape[0]): + for y in range(universe_ids.shape[1]): + for x in range(universe_ids.shape[2]): + uarray[z, y, x] = universes[universe_ids[z, y, x]] + + # Use 2D NumPy array to store lattice universes for 2D lattices + if len(dimension) == 2: + uarray = np.squeeze(uarray) + uarray = np.atleast_2d(uarray) + + # Set the universes for the lattice + lattice.universes = uarray + + # Set the distribcell offsets for the lattice + if offsets is not None: + lattice.offsets = offsets + + elif lattice_type == 'hexagonal': + n_rings = group['n_rings'].value + n_axial = group['n_axial'].value + center = group['center'][...] + pitch = group['pitch'][...] + outer = group['outer'].value + + universe_ids = group['universes'][...] + + # Create the Lattice + lattice = openmc.HexLattice(lattice_id, name) + lattice.center = center + lattice.pitch = pitch + + # If the Universe specified outer the Lattice is not void + if outer >= 0: + lattice.outer = universes[outer] + + # Build array of Universe pointers for the Lattice. Note that + # we need to convert between the HDF5's square array of + # (x, alpha, z) to the Python API's format of a ragged nested + # list of (z, ring, theta). + uarray = [] + for z in range(n_axial): + # Add a list for this axial level. + uarray.append([]) + x = n_rings - 1 + a = 2*n_rings - 2 + for r in range(n_rings - 1, 0, -1): + # Add a list for this ring. + uarray[-1].append([]) + + # Climb down the top-right. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x += 1 + a -= 1 + + # Climb down the right. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + a -= 1 + + # Climb down the bottom-right. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x -= 1 + + # Climb up the bottom-left. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x -= 1 + a += 1 + + # Climb up the left. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + a += 1 + + # Climb up the top-left. + for i in range(r): + uarray[-1][-1].append(universe_ids[z, a, x]) + x += 1 + + # Move down to the next ring. + a -= 1 + + # Convert the ids into Universe objects. + uarray[-1][-1] = [universes[u_id] + for u_id in uarray[-1][-1]] + + # Handle the degenerate center ring separately. + u_id = universe_ids[z, a, x] + uarray[-1].append([universes[u_id]]) + + # Add the universes to the lattice. + if len(pitch) == 2: + # Lattice is 3D + lattice.universes = uarray + else: + # Lattice is 2D; extract the only axial level + lattice.universes = uarray[0] + + if offsets is not None: + lattice.offsets = offsets + + return lattice + def get_unique_universes(self): """Determine all unique universes in the lattice diff --git a/openmc/material.py b/openmc/material.py index 7d59c52ee1..b9705243ec 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -259,6 +259,49 @@ class Material(object): depletable, bool) self._depletable = depletable + @classmethod + def from_hdf5(cls, group): + """Create material from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + + Returns + ------- + openmc.Material + Material instance + + """ + mat_id = int(group.name.split('/')[-1].lstrip('material ')) + + name = group['name'].value.decode() + density = group['atom_density'].value + nuc_densities = group['nuclide_densities'][...] + nuclides = group['nuclides'].value + + # Create the Material + material = cls(mat_id, name) + material.depletable = bool(group.attrs['depletable']) + + # Read the names of the S(a,b) tables for this Material and add them + if 'sab_names' in group: + sab_tables = group['sab_names'].value + for sab_table in sab_tables: + name = sab_table.decode() + material.add_s_alpha_beta(name) + + # 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 + for fullname, density in zip(nuclides, nuc_densities): + name = fullname.decode().strip() + material.add_nuclide(name, percent=density, percent_type='ao') + + return material + def set_density(self, units, density=None): """Set the density of the material diff --git a/openmc/summary.py b/openmc/summary.py index 3b39d7489e..40299a2e4a 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -83,40 +83,10 @@ class Summary(object): self._finalize_geometry(cells, cell_fills, universes, lattices) def _read_materials(self): - for key, group in self._f['materials'].items(): - material_id = int(key.lstrip('material ')) + for group in self._f['materials'].values(): + material = openmc.Material.from_hdf5(group) - name = group['name'].value.decode() - density = group['atom_density'].value - nuc_densities = group['nuclide_densities'][...] - nuclides = group['nuclides'].value - - # Create the Material - material = openmc.Material(material_id=material_id, name=name) - material.depletable = bool(group.attrs['depletable']) - - # Read the names of the S(a,b) tables for this Material and add them - if 'sab_names' in group: - sab_tables = group['sab_names'].value - for sab_table in sab_tables: - name = sab_table.decode() - material.add_s_alpha_beta(name) - - # 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 - for fullname, density in zip(nuclides, nuc_densities): - name = fullname.decode().strip() - - if 'nat' in name: - material.add_element(openmc.Element(name=name), - percent=density, percent_type='ao') - else: - material.add_nuclide(openmc.Nuclide(name=name), - percent=density, percent_type='ao') - - # Add the Material to the global dictionary of all Materials + # Add the material to the Materials collection self.materials.append(material) def _read_surfaces(self): @@ -193,179 +163,30 @@ class Summary(object): def _read_universes(self, cells): universes = {} - - for key in self._f['geometry/universes'].keys(): - universe_id = int(key.lstrip('universe ')) - cell_ids = self._f['geometry/universes'][key]['cells'][...] - - # Create this Universe - universe = openmc.Universe(universe_id=universe_id) - - # Add each Cell to the Universe - for cell_id in cell_ids: - universe.add_cell(cells[cell_id]) - - # Add the Universe to the global list of Universes + for group in self._f['geometry/universes'].values(): + universe = openmc.Universe.from_hdf5(group, cells) universes[universe.id] = universe - return universes def _read_lattices(self, universes): lattices = {} - - for key, group in self._f['geometry/lattices'].items(): - lattice_id = int(key.lstrip('lattice ')) - name = group['name'].value.decode() - lattice_type = group['type'].value.decode() - - if 'offsets' in group: - offsets = group['offsets'][...] - else: - offsets = None - - if lattice_type == 'rectangular': - dimension = group['dimension'][...] - lower_left = group['lower_left'][...] - pitch = group['pitch'][...] - outer = group['outer'].value - universe_ids = group['universes'][...] - - # Create the Lattice - lattice = openmc.RectLattice(lattice_id=lattice_id, name=name) - lattice.lower_left = lower_left - lattice.pitch = pitch - - # If the Universe specified outer the Lattice is not void - if outer >= 0: - lattice.outer = universes[outer] - - # Build array of Universe pointers for the Lattice - uarray = np.empty(universe_ids.shape, dtype=openmc.Universe) - - for z in range(universe_ids.shape[0]): - for y in range(universe_ids.shape[1]): - for x in range(universe_ids.shape[2]): - uarray[z, y, x] = universes[universe_ids[z, y, x]] - - # Use 2D NumPy array to store lattice universes for 2D lattices - if len(dimension) == 2: - uarray = np.squeeze(uarray) - uarray = np.atleast_2d(uarray) - - # Set the universes for the lattice - lattice.universes = uarray - - # Set the distribcell offsets for the lattice - if offsets is not None: - lattice.offsets = offsets - - # Add the Lattice to the global dictionary of all Lattices - lattices[lattice.id] = lattice - - elif lattice_type == 'hexagonal': - n_rings = group['n_rings'].value - n_axial = group['n_axial'].value - center = group['center'][...] - pitch = group['pitch'][...] - outer = group['outer'].value - - universe_ids = group['universes'][...] - - # Create the Lattice - lattice = openmc.HexLattice(lattice_id=lattice_id, name=name) - lattice.center = center - lattice.pitch = pitch - - # If the Universe specified outer the Lattice is not void - if outer >= 0: - lattice.outer = universes[outer] - - # Build array of Universe pointers for the Lattice. Note that - # we need to convert between the HDF5's square array of - # (x, alpha, z) to the Python API's format of a ragged nested - # list of (z, ring, theta). - uarray = [] - for z in range(n_axial): - # Add a list for this axial level. - uarray.append([]) - x = n_rings - 1 - a = 2*n_rings - 2 - for r in range(n_rings - 1, 0, -1): - # Add a list for this ring. - uarray[-1].append([]) - - # Climb down the top-right. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x += 1 - a -= 1 - - # Climb down the right. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - a -= 1 - - # Climb down the bottom-right. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x -= 1 - - # Climb up the bottom-left. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x -= 1 - a += 1 - - # Climb up the left. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - a += 1 - - # Climb up the top-left. - for i in range(r): - uarray[-1][-1].append(universe_ids[z, a, x]) - x += 1 - - # Move down to the next ring. - a -= 1 - - # Convert the ids into Universe objects. - uarray[-1][-1] = [universes[u_id] - for u_id in uarray[-1][-1]] - - # Handle the degenerate center ring separately. - u_id = universe_ids[z, a, x] - uarray[-1].append([universes[u_id]]) - - # Add the universes to the lattice. - if len(pitch) == 2: - # Lattice is 3D - lattice.universes = uarray - else: - # Lattice is 2D; extract the only axial level - lattice.universes = uarray[0] - - if offsets is not None: - lattice.offsets = offsets - - # Add the Lattice to the global dictionary of all Lattices - lattices[lattice.id] = lattice - + for group in self._f['geometry/lattices'].values(): + lattice = openmc.Lattice.from_hdf5(group, universes) + lattices[lattice.id] = lattice return lattices def _finalize_geometry(self, cells, cell_fills, universes, lattices): + materials = {m.id: m for m in self.materials} + # Iterate over all Cells and add fill Materials, Universes and Lattices for cell_id, (fill_type, fill_id) in cell_fills.items(): # Retrieve the object corresponding to the fill type and ID if fill_type == 'normal': if isinstance(fill_id, Iterable): - fill = [self.get_material_by_id(mat) if mat > 0 else None + fill = [materials[mat] if mat > 0 else None for mat in fill_id] else: - if fill_id > 0: - fill = self.get_material_by_id(fill_id) - else: - fill = None + fill = materials[fill_id] if fill_id > 0 else None elif fill_type == 'universe': fill = universes[fill_id] else: @@ -387,24 +208,3 @@ class Summary(object): """ self.geometry.add_volume_information(volume_calc) - - def get_material_by_id(self, material_id): - """Return a Material object given the material id - - Parameters - ---------- - id : int - Unique identifier for the material - - Returns - ------- - material : openmc.Material - Material with given id - - """ - - for material in self.materials: - if material.id == material_id: - return material - - return None diff --git a/openmc/surface.py b/openmc/surface.py index e7d999b15e..5eb242003b 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -171,7 +171,15 @@ class Surface(object): return (np.array([-np.inf, -np.inf, -np.inf]), np.array([np.inf, np.inf, np.inf])) - def create_xml_subelement(self): + def to_xml_element(self): + """Return XML representation of the surface + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing source data + + """ element = ET.Element("surface") element.set("id", str(self._id)) @@ -384,8 +392,16 @@ class Plane(Surface): x, y, z = point return self.a*x + self.b*y + self.c*z - self.d - def create_xml_subelement(self): - element = super(Plane, self).create_xml_subelement() + def to_xml_element(self): + """Return XML representation of the surface + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing source data + + """ + element = super(Plane, self).to_xml_element() # Add periodic surface pair information if self.boundary_type == 'periodic': diff --git a/openmc/universe.py b/openmc/universe.py index b66a20cfe4..19f6cf47fd 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -118,6 +118,35 @@ class Universe(object): else: self._name = '' + @classmethod + def from_hdf5(cls, group, cells): + """Create universe from HDF5 group + + Parameters + ---------- + group : h5py.Group + Group in HDF5 file + cells : dict + Dictionary mapping cell IDs to instances of :class:`openmc.Cell`. + + Returns + ------- + openmc.Universe + Universe instance + + """ + universe_id = int(group.name.split('/')[-1].lstrip('universe ')) + cell_ids = group['cells'].value + + # Create this Universe + universe = cls(universe_id) + + # Add each Cell to the Universe + for cell_id in cell_ids: + universe.add_cell(cells[cell_id]) + + return universe + def find(self, point): """Find cells/universes/lattices which contain a given point From eecf45411b1631865f2876b40b908befb5356159 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 22 Feb 2017 17:09:19 -0600 Subject: [PATCH 51/66] 'normal' fill type -> 'material' --- docs/source/io_formats/summary.rst | 2 +- openmc/summary.py | 6 +++--- src/constants.F90 | 8 ++++---- src/geometry.F90 | 32 +++++++++++++++--------------- src/initialize.F90 | 10 +++++----- src/plot.F90 | 2 +- src/summary.F90 | 8 ++++---- src/tally_filter.F90 | 16 +++++++-------- 8 files changed, 42 insertions(+), 42 deletions(-) diff --git a/docs/source/io_formats/summary.rst b/docs/source/io_formats/summary.rst index f882705490..b047ac225c 100644 --- a/docs/source/io_formats/summary.rst +++ b/docs/source/io_formats/summary.rst @@ -31,7 +31,7 @@ The current version of the summary file format is 5.0. - **universe** (*int*) -- Universe assigned to the cell. If none is specified, the default universe (0) is assigned. - **fill_type** (*char[]*) -- Type of fill for the cell. Can be - 'normal', 'universe', or 'lattice'. + 'material', 'universe', or 'lattice'. - **material** (*int* or *int[]*) -- Unique ID of the material(s) assigned to the cell. This dataset is present only if fill_type is set to 'normal'. The value '-1' signifies void material. The data diff --git a/openmc/summary.py b/openmc/summary.py index 40299a2e4a..8347105b1e 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -108,7 +108,7 @@ class Summary(object): name = group['name'].value.decode() fill_type = group['fill_type'].value.decode() - if fill_type == 'normal': + if fill_type == 'material': fill = group['material'].value elif fill_type == 'universe': fill = group['fill'].value @@ -138,7 +138,7 @@ class Summary(object): rotation = np.asarray(rotation, dtype=np.int) cell._rotation = rotation - elif fill_type == 'normal': + elif fill_type == 'material': cell.temperature = group['temperature'][...] # Store Cell fill information for after Universe/Lattice creation @@ -181,7 +181,7 @@ class Summary(object): # Iterate over all Cells and add fill Materials, Universes and Lattices for cell_id, (fill_type, fill_id) in cell_fills.items(): # Retrieve the object corresponding to the fill type and ID - if fill_type == 'normal': + if fill_type == 'material': if isinstance(fill_id, Iterable): fill = [materials[mat] if mat > 0 else None for mat in fill_id] diff --git a/src/constants.F90 b/src/constants.F90 index 4b57ac5406..a2590a12a0 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -107,11 +107,11 @@ module constants OP_INTERSECTION = huge(0) - 3, & ! Intersection operator OP_UNION = huge(0) - 4 ! Union operator (^) - ! Cell types + ! Cell fill types integer, parameter :: & - CELL_NORMAL = 1, & ! Cell with a specified material - CELL_FILL = 2, & ! Cell filled by a separate universe - CELL_LATTICE = 3 ! Cell filled with a lattice + FILL_MATERIAL = 1, & ! Cell with a specified material + FILL_UNIVERSE = 2, & ! Cell filled by a separate universe + FILL_LATTICE = 3 ! Cell filled with a lattice ! Void material integer, parameter :: MATERIAL_VOID = -1 diff --git a/src/geometry.F90 b/src/geometry.F90 index d41ca14475..ecb76d0505 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -244,7 +244,7 @@ contains call write_message(" Entering cell " // trim(to_str(c % id))) end if - CELL_TYPE: if (c % type == CELL_NORMAL) then + CELL_TYPE: if (c % type == FILL_MATERIAL) then ! ====================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH @@ -260,10 +260,10 @@ contains distribcell_index = c % distribcell_index offset = 0 do k = 1, p % n_coord - if (cells(p % coord(k) % cell) % type == CELL_FILL) then + if (cells(p % coord(k) % cell) % type == FILL_UNIVERSE) then offset = offset + cells(p % coord(k) % cell) % & offset(distribcell_index) - elseif (cells(p % coord(k) % cell) % type == CELL_LATTICE) then + elseif (cells(p % coord(k) % cell) % type == FILL_LATTICE) then if (lattices(p % coord(k + 1) % lattice) % obj & % are_valid_indices([& p % coord(k + 1) % lattice_x, & @@ -293,7 +293,7 @@ contains p % sqrtkT = c % sqrtkT(1) end if - elseif (c % type == CELL_FILL) then CELL_TYPE + elseif (c % type == FILL_UNIVERSE) then CELL_TYPE ! ====================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL @@ -322,7 +322,7 @@ contains j = p % n_coord if (.not. found) exit - elseif (c % type == CELL_LATTICE) then CELL_TYPE + elseif (c % type == FILL_LATTICE) then CELL_TYPE ! ====================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL @@ -1116,11 +1116,11 @@ contains ! ==================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - elseif (c % type == CELL_FILL) then + elseif (c % type == FILL_UNIVERSE) then ! Set offset for the cell on this level c % offset(map) = offset @@ -1134,7 +1134,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj @@ -1232,11 +1232,11 @@ contains ! ==================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - elseif (c % type == CELL_FILL) then + elseif (c % type == FILL_UNIVERSE) then next_univ => universes(c % fill) @@ -1251,7 +1251,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj @@ -1346,11 +1346,11 @@ contains ! ==================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - elseif (c % type == CELL_FILL) then + elseif (c % type == FILL_UNIVERSE) then next_univ => universes(c % fill) @@ -1359,7 +1359,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj @@ -1428,14 +1428,14 @@ contains ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then next_univ => universes(c % fill) levels_below = max(levels_below, maximum_levels(next_univ)) ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj diff --git a/src/initialize.F90 b/src/initialize.F90 index be4b0f28a6..2ed47a8baf 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -560,11 +560,11 @@ contains if (c % material(1) == NONE) then id = c % fill if (universe_dict % has_key(id)) then - c % type = CELL_FILL + c % type = FILL_UNIVERSE 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 % type = FILL_LATTICE c % fill = lid else call fatal_error("Specified fill " // trim(to_str(id)) // " on cell "& @@ -575,9 +575,9 @@ contains do j = 1, size(c % material) id = c % material(j) if (id == MATERIAL_VOID) then - c % type = CELL_NORMAL + c % type = FILL_MATERIAL else if (material_dict % has_key(id)) then - c % type = CELL_NORMAL + c % type = FILL_MATERIAL c % material(j) = material_dict % get_key(id) else call fatal_error("Could not find material " // trim(to_str(id)) & @@ -934,7 +934,7 @@ contains ! Allocate offset table for fill cells do i = 1, n_cells - if (cells(i) % type /= CELL_NORMAL) then + if (cells(i) % type /= FILL_MATERIAL) then allocate(cells(i) % offset(n_maps)) end if end do diff --git a/src/plot.F90 b/src/plot.F90 index 86d303b3dd..ee8ffdb14f 100644 --- a/src/plot.F90 +++ b/src/plot.F90 @@ -84,7 +84,7 @@ contains if (pl % color_by == PLOT_COLOR_MATS) then ! Assign color based on material associate (c => cells(p % coord(j) % cell)) - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then ! If we stopped on a middle universe level, treat as if not found rgb = pl % not_found % rgb id = -1 diff --git a/src/summary.F90 b/src/summary.F90 index e6ad6f5d95..2781273089 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -156,8 +156,8 @@ contains ! Write information on what fills this cell select case (c%type) - case (CELL_NORMAL) - call write_dataset(cell_group, "fill_type", "normal") + case (FILL_MATERIAL) + call write_dataset(cell_group, "fill_type", "material") if (size(c % material) == 1) then if (c % material(1) == MATERIAL_VOID) then @@ -185,7 +185,7 @@ contains call write_dataset(cell_group, "temperature", cell_temperatures) deallocate(cell_temperatures) - case (CELL_FILL) + case (FILL_UNIVERSE) call write_dataset(cell_group, "fill_type", "universe") call write_dataset(cell_group, "fill", universes(c%fill)%id) if (allocated(c%offset)) then @@ -201,7 +201,7 @@ contains call write_dataset(cell_group, "rotation", c%rotation) end if - case (CELL_LATTICE) + case (FILL_LATTICE) call write_dataset(cell_group, "fill_type", "lattice") call write_dataset(cell_group, "lattice", lattices(c%fill)%obj%id) end select diff --git a/src/tally_filter.F90 b/src/tally_filter.F90 index a7b0fc46ae..21fc3a472e 100644 --- a/src/tally_filter.F90 +++ b/src/tally_filter.F90 @@ -716,10 +716,10 @@ contains distribcell_index = cells(this % cell) % distribcell_index offset = 0 do i = 1, p % n_coord - if (cells(p % coord(i) % cell) % type == CELL_FILL) then + if (cells(p % coord(i) % cell) % type == FILL_UNIVERSE) then offset = offset + cells(p % coord(i) % cell) % & offset(distribcell_index) - elseif (cells(p % coord(i) % cell) % type == CELL_LATTICE) then + elseif (cells(p % coord(i) % cell) % type == FILL_LATTICE) then if (lattices(p % coord(i + 1) % lattice) % obj & % are_valid_indices([& p % coord(i + 1) % lattice_x, & @@ -1421,7 +1421,7 @@ contains c => cells(cell_index) ! Skip normal cells which do not have offsets - if (c % type == CELL_NORMAL) then + if (c % type == FILL_MATERIAL) then cycle end if @@ -1430,13 +1430,13 @@ contains end do ! Ensure we didn't just end the loop by iteration - if (c % type /= CELL_NORMAL) then + if (c % type /= FILL_MATERIAL) then ! There are more cells in this universe that it could be in later_cell = .true. ! Two cases, lattice or fill cell - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then temp_offset = c % offset(map) ! Get the offset of the first lattice location @@ -1453,7 +1453,7 @@ contains end if end if - if (n == 1 .and. c % type /= CELL_NORMAL) then + if (n == 1 .and. c % type /= FILL_MATERIAL) then this_cell = .true. end if @@ -1471,7 +1471,7 @@ contains ! ==================================================================== ! CELL CONTAINS LOWER UNIVERSE, RECURSIVELY FIND CELL - if (c % type == CELL_FILL) then + if (c % type == FILL_UNIVERSE) then ! Enter this cell to update the current offset offset = c % offset(map) + offset @@ -1482,7 +1482,7 @@ contains ! ==================================================================== ! CELL CONTAINS LATTICE, RECURSIVELY FIND CELL - elseif (c % type == CELL_LATTICE) then + elseif (c % type == FILL_LATTICE) then ! Set current lattice lat => lattices(c % fill) % obj From 7ca46e809ce01fe7857ae36072822a1718f01aaf Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 23 Feb 2017 07:39:28 -0600 Subject: [PATCH 52/66] Make get_all_* methods consistent -- always return dict --- openmc/cell.py | 23 ++-- openmc/geometry.py | 105 +++++++----------- openmc/mgxs/library.py | 14 +-- openmc/mgxs/mgxs.py | 15 +-- openmc/plots.py | 4 +- openmc/statepoint.py | 4 +- openmc/universe.py | 11 +- .../test_asymmetric_lattice.py | 6 +- tests/test_distribmat/test_distribmat.py | 5 +- .../test_mgxs_library_distribcell.py | 2 +- tests/test_multipole/test_multipole.py | 5 +- 11 files changed, 81 insertions(+), 113 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 87dbb0797c..859adb6d1d 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -433,7 +433,7 @@ class Cell(object): Returns ------- - nuclides : dict + nuclides : collections.OrderedDict Dictionary whose keys are nuclide names and values are 2-tuples of (nuclide, density) @@ -467,7 +467,7 @@ class Cell(object): Returns ------- - cells : dict + cells : collections.orderedDict Dictionary whose keys are cell IDs and values are :class:`Cell` instances @@ -485,20 +485,23 @@ class Cell(object): Returns ------- - materials : dict + materials : collections.OrderedDict Dictionary whose keys are material IDs and values are :class:`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 in cells.values(): - materials.update(cell.get_all_materials()) + elif self.fill_type == 'distribmat': + for m in self.fill: + if m is not None: + materials[m.id] = m + else: + # Append all Cells in each Cell in the Universe to the dictionary + cells = self.get_all_cells() + for cell in cells.values(): + materials.update(cell.get_all_materials()) return materials @@ -508,7 +511,7 @@ class Cell(object): Returns ------- - universes : dict + universes : collections.OrderedDict Dictionary whose keys are universe IDs and values are :class:`Universe` instances diff --git a/openmc/geometry.py b/openmc/geometry.py index 70f9c928f6..5f651af2f3 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -151,102 +151,80 @@ class Geometry(object): return offset def get_all_cells(self): - """Return all cells defined + """Return all cells in the geometry. Returns ------- - list of openmc.Cell - Cells in the geometry + collections.OrderedDict + Dictionary mapping cell IDs to :class:`openmc.Cell` instances """ - - all_cells = self.root_universe.get_all_cells() - cells = list(set(all_cells.values())) - cells.sort(key=lambda x: x.id) - return cells + return self.root_universe.get_all_cells() def get_all_universes(self): - """Return all universes defined + """Return all universes in the geometry. Returns ------- - list of openmc.Universe - Universes in the geometry + collections.OrderedDict + Dictionary mapping universe IDs to :class:`openmc.Universe` + instances """ - - all_universes = self._root_universe.get_all_universes() - universes = list(set(all_universes.values())) - universes.sort(key=lambda x: x.id) + universes = OrderedDict() + universes[self.root_universe.id] = self.root_universe + universes.update(self.root_universe.get_all_universes()) return universes def get_all_materials(self): - """Return all materials assigned to a cell + """Return all materials within the geometry. Returns ------- - list of openmc.Material - Materials in the geometry + collections.OrderedDict + Dictionary mapping material IDs to :class:`openmc.Material` + instances """ - - material_cells = self.get_all_material_cells() - materials = [] - - for cell in material_cells: - if cell.fill_type == 'distribmat': - for m in cell.fill: - if m is not None and m not in materials: - materials.append(m) - elif cell.fill_type == 'material': - if cell.fill not in materials: - materials.append(cell.fill) - - materials.sort(key=lambda x: x.id) - return materials + return self.root_universe.get_all_materials() def get_all_material_cells(self): """Return all cells filled by a material Returns ------- - list of openmc.Cell - Cells filled by Materials in the geometry + collections.OrderedDict + Dictionary mapping cell IDs to :class:`openmc.Cell` instances that + are filled with materials or distributed materials. """ + material_cells = OrderedDict() - all_cells = self.get_all_cells() - material_cells = [] - - for cell in all_cells: + for cell in self.get_all_cells().values(): if cell.fill_type in ('material', 'distribmat'): if cell not in material_cells: - material_cells.append(cell) + material_cells[cell.id] = cell - 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 + """Return all universes having at least one non-fill cell Returns ------- - list of openmc.Universe - Universes with non-fill cells + collections.OrderedDict + Dictionary mapping universe IDs to :class:`openmc.Universe` + instances with non-fill cells """ + material_universes = OrderedDict() - all_universes = self.get_all_universes() - material_universes = [] - - for universe in all_universes: - cells = universe.cells - for cell in cells: + for universe in self.get_all_universes(): + for cell in universe.cells: if cell.fill_type in ('material', 'distribmat', 'void'): if universe not in material_universes: - material_universes.append(universe) + material_universes[universe.id] = universe - material_universes.sort(key=lambda x: x.id) return material_universes def get_all_lattices(self): @@ -254,20 +232,17 @@ class Geometry(object): Returns ------- - list of openmc.Lattice - Lattices in the geometry + collections.OrderedDict + Dictionary mapping lattice IDs to :class:`openmc.Lattice` instances """ + lattices = OrderedDict() - cells = self.get_all_cells() - lattices = [] - - for cell in cells: + for cell in self.get_all_cells(): if cell.fill_type == 'lattice': if cell.fill not in lattices: - lattices.append(cell.fill) + lattices[cell.fill.id] = cell.fill - lattices.sort(key=lambda x: x.id) return lattices def get_materials_by_name(self, name, case_sensitive=False, matching=False): @@ -293,7 +268,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_materials = self.get_all_materials() + all_materials = self.get_all_materials().values() materials = set() for material in all_materials: @@ -333,7 +308,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_cells = self.get_all_cells() + all_cells = self.get_all_cells().values() cells = set() for cell in all_cells: @@ -373,7 +348,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_cells = self.get_all_cells() + all_cells = self.get_all_cells().values() cells = set() for cell in all_cells: @@ -413,7 +388,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_universes = self.get_all_universes() + all_universes = self.get_all_universes().values() universes = set() for universe in all_universes: @@ -453,7 +428,7 @@ class Geometry(object): if not case_sensitive: name = name.lower() - all_lattices = self.get_all_lattices() + all_lattices = self.get_all_lattices().values() lattices = set() for lattice in all_lattices: diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ac82ede1d3..6b0bc39138 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -192,11 +192,11 @@ class Library(object): def domains(self): if self._domains == 'all': if self.domain_type == 'material': - return self.geometry.get_all_materials() + return list(self.geometry.get_all_materials().values()) elif self.domain_type in ['cell', 'distribcell']: - return self.geometry.get_all_material_cells() + return list(self.geometry.get_all_material_cells().values()) elif self.domain_type == 'universe': - return self.geometry.get_all_universes() + return list(self.geometry.get_all_universes().values()) elif self.domain_type == 'mesh': raise ValueError('Unable to get domains for Mesh domain type') else: @@ -316,13 +316,13 @@ class Library(object): else: if self.domain_type == 'material': cv.check_iterable_type('domain', domains, openmc.Material) - all_domains = self.geometry.get_all_materials() + all_domains = self.geometry.get_all_materials().values() elif self.domain_type in ['cell', 'distribcell']: cv.check_iterable_type('domain', domains, openmc.Cell) - all_domains = self.geometry.get_all_material_cells() + all_domains = self.geometry.get_all_material_cells().values() elif self.domain_type == 'universe': cv.check_iterable_type('domain', domains, openmc.Universe) - all_domains = self.geometry.get_all_universes() + all_domains = self.geometry.get_all_universes().values() elif self.domain_type == 'mesh': cv.check_iterable_type('domain', domains, openmc.Mesh) @@ -1342,7 +1342,7 @@ class Library(object): materials = openmc.Materials() # Get all Cells from the Geometry for differentiation - all_cells = geometry.get_all_material_cells() + all_cells = geometry.get_all_material_cells().values() # Create the xsdata object and add it to the mgxs_file for i, domain in enumerate(self.domains): diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 114c99a4a2..33bdeb83aa 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -894,7 +894,7 @@ class MGXS(object): """ - cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint) + cv.check_type('statepoint', statepoint, openmc.StatePoint) if statepoint.summary is None: msg = 'Unable to load data from a statepoint which has not been ' \ @@ -904,16 +904,13 @@ class MGXS(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 - su = statepoint.summary - if self.domain_type == 'cell' or self.domain_type == 'distribcell': - cells = {c.id: c for c in su.geometry.get_all_cells()} - self.domain = cells[self.domain.id] + geom = statepoint.summary.geometry + if self.domain_type in ('cell', 'distribcell'): + self.domain = geom.get_all_cells()[self.domain.id] elif self.domain_type == 'universe': - universes = {u.id: u for u in su.geometry.get_all_universes()} - self.domain = universes[self.domain.id] + self.domain = geom.get_all_universes()[self.domain.id] elif self.domain_type == 'material': - mats = {m.id: m for m in su.materials} - self.domain = mats[self.domain.id] + self.domain = geom.get_all_materials()[self.domain.id] elif self.domain_type == 'mesh': self.domain = statepoint.meshes[self.domain.id] else: diff --git a/openmc/plots.py b/openmc/plots.py index 48af6f23c3..bbefb10768 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -351,11 +351,11 @@ class Plot(object): # Generate random colors for each feature self.col_spec = {} - for domain in domains: + for domain_id in domains: 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) + self.col_spec[domain_id] = (r, g, b) def highlight_domains(self, geometry, domains, seed=1, alpha=0.5, background='gray'): diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 9c96408855..4101b066a1 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -640,7 +640,7 @@ class StatePoint(object): 'is not a Summary object'.format(summary) raise ValueError(msg) - cell_dict = {c.id: c for c in summary.geometry.get_all_cells()} + cells = summary.geometry.get_all_cells() for tally_id, tally in self.tallies.items(): tally.with_summary = True @@ -648,7 +648,7 @@ class StatePoint(object): for tally_filter in tally.filters: if isinstance(tally_filter, (openmc.DistribcellFilter)): cell_id = tally_filter.bins[0] - cell = cell_dict[cell_id] + cell = cells[cell_id] tally_filter.distribcell_paths = cell.distribcell_paths self._summary = summary diff --git a/openmc/universe.py b/openmc/universe.py index 19f6cf47fd..fa850968da 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -440,7 +440,7 @@ class Universe(object): Returns ------- - materials : Collections.OrderedDict + materials : collections.OrderedDict Dictionary whose keys are material IDs and values are :class:`Material` instances @@ -465,14 +465,9 @@ class Universe(object): :class:`Universe` instances """ - - # Get all Cells in this Universe - cells = self.get_all_cells() - + # Append all Universes within each Cell to the dictionary universes = OrderedDict() - - # Append all Universes containing each Cell to the dictionary - for cell in cells.values(): + for cell in self.get_all_cells().values(): universes.update(cell.get_all_universes()) return universes diff --git a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py index 55f4b48525..eeeba5281e 100644 --- a/tests/test_asymmetric_lattice/test_asymmetric_lattice.py +++ b/tests/test_asymmetric_lattice/test_asymmetric_lattice.py @@ -89,9 +89,9 @@ class AsymmetricLatticeTestHarness(PyAPITestHarness): outstr += '\n'.join(map('{:.8e}'.format, tally.std_dev.flatten())) + '\n' # Extract fuel assembly lattices from the summary - cell_dict = {c.id: c for c in sp.summary.geometry.get_all_cells()} - core = cell_dict[1] - fuel = cell_dict[80] + cells = sp.summary.geometry.get_all_cells() + core = cells[1] + fuel = cells[80] fuel = fuel.fill core = core.fill diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index ad7fe09f04..6c1c5f79cf 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -116,8 +116,7 @@ class DistribmatTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(DistribmatTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - cells = {c.id: c for c in su.geometry.get_all_cells()} - outstr += str(cells[11]) + outstr += str(su.geometry.get_all_cells()[11]) return outstr def _cleanup(self): @@ -128,5 +127,5 @@ class DistribmatTestHarness(PyAPITestHarness): if __name__ == '__main__': - harness = DistribmatTestHarness('statepoint.5.*') + harness = DistribmatTestHarness('statepoint.5.h5') harness.main() diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index a86b998b83..9ab7548fa8 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -34,7 +34,7 @@ class MGXSTestHarness(PyAPITestHarness): self.mgxs_lib.num_delayed_groups = 6 self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'distribcell' - cells = self.mgxs_lib.geometry.get_all_material_cells() + cells = self.mgxs_lib.geometry.get_all_material_cells().values() self.mgxs_lib.domains = [c for c in cells if c.name == 'fuel'] self.mgxs_lib.build_library() diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 97ad249561..85c360e734 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -107,8 +107,7 @@ class MultipoleTestHarness(PyAPITestHarness): def _get_results(self): outstr = super(MultipoleTestHarness, self)._get_results() su = openmc.Summary('summary.h5') - cells = {c.id: c for c in su.geometry.get_all_cells()} - outstr += str(cells[11]) + outstr += str(su.geometry.get_all_cells()[11]) return outstr def _cleanup(self): @@ -119,5 +118,5 @@ class MultipoleTestHarness(PyAPITestHarness): if __name__ == '__main__': - harness = MultipoleTestHarness('statepoint.5.*') + harness = MultipoleTestHarness('statepoint.5.h5') harness.main() From e40c89b34f2dea4b613d11a60a754ecc70ab6655 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 23 Feb 2017 09:43:00 -0600 Subject: [PATCH 53/66] Address a few more @wbinventor comments. Fix Jupyter notebooks. --- .../pythonapi/examples/mgxs-part-ii.ipynb | 2 +- .../pythonapi/examples/mgxs-part-iii.ipynb | 35 +- .../pythonapi/examples/mgxs-part-iv.ipynb | 337 +++++++++--------- openmc/geometry.py | 7 +- openmc/mgxs/library.py | 12 +- 5 files changed, 199 insertions(+), 194 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index 5e48244b7e..359fd4eaa7 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -332,7 +332,7 @@ "outputs": [], "source": [ "# Extract all Cells filled by Materials\n", - "openmc_cells = openmc_geometry.get_all_material_cells()\n", + "openmc_cells = openmc_geometry.get_all_material_cells().values()\n", "\n", "# Create dictionary to store multi-group cross sections for all cells\n", "xs_library = {}\n", diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index b76696d7fb..69297d8841 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -594,7 +594,7 @@ "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()" + "mgxs_lib.domains = geometry.get_all_material_cells().values()" ] }, { @@ -743,8 +743,8 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", - " Date/Time | 2017-02-21 15:11:55\n", + " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", + " Date/Time | 2017-02-23 09:36:51\n", " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", @@ -831,20 +831,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.2287E-01 seconds\n", - " Reading cross sections = 3.5267E-01 seconds\n", - " Total time in simulation = 1.3331E+01 seconds\n", - " Time in transport only = 1.3109E+01 seconds\n", - " Time in inactive batches = 9.4551E-01 seconds\n", - " Time in active batches = 1.2385E+01 seconds\n", - " Time synchronizing fission bank = 3.8467E-03 seconds\n", - " Sampling source sites = 2.5076E-03 seconds\n", - " SEND/RECV source sites = 1.2758E-03 seconds\n", - " Time accumulating tallies = 7.0302E-04 seconds\n", - " Total time for finalization = 1.5000E-05 seconds\n", - " Total time elapsed = 1.3863E+01 seconds\n", - " Calculation Rate (inactive) = 26440.9 neutrons/second\n", - " Calculation Rate (active) = 8074.24 neutrons/second\n", + " Total time for initialization = 4.2238E-01 seconds\n", + " Reading cross sections = 3.1986E-01 seconds\n", + " Total time in simulation = 1.3628E+01 seconds\n", + " Time in transport only = 1.3342E+01 seconds\n", + " Time in inactive batches = 1.1012E+00 seconds\n", + " Time in active batches = 1.2527E+01 seconds\n", + " Time synchronizing fission bank = 3.7750E-03 seconds\n", + " Sampling source sites = 2.4760E-03 seconds\n", + " SEND/RECV source sites = 1.2253E-03 seconds\n", + " Time accumulating tallies = 6.5502E-04 seconds\n", + " Total time for finalization = 9.4890E-06 seconds\n", + " Total time elapsed = 1.4059E+01 seconds\n", + " Calculation Rate (inactive) = 22702.0 neutrons/second\n", + " Calculation Rate (active) = 7982.70 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1663,6 +1663,7 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index 125340af7c..dfab3b2bef 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -425,7 +425,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX////pgJFyEhJNv8RV\nUZDeAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+ECFw8nCpeOQocAAAWFSURBVGje7Zs7cttADIZ9CSvX\ncrP0iCxUqbBc8Ag6xR6BhV2EvYvwFD4CCx1ABT1jMdgndpegRQnOrCbjpPlGESISC4A/gd27e8H5\n83CX3b4+iKJrRHkS4vkghMPBonRYWGwtfgD2YN+dRDUOoh6lACw0Noi9w2fESuEoAR/uVuMolX03\n9oXGT7F3eFL2iEfhUX1f4cPdL/ishs+68ai+udE4xPhexbjX2FfjGNoPj/DPNX4Tsd+EODr8FvsV\ndf1Hd9P2VvCi4+s/aXvrf+upAD+1/9GV1mkOH5X9vV6THtfvACslcaUCbESL61drBPtdI8SrFMWr\nELsXCkuFDYW75gbiP7d9Cf7bAYI/aCwUShrBvh30+lWQkzVgZ/HD4OixNCgcQpJ3BxU/Ln91elKo\nM5VEE38QtJ+Yv6cQ9xjKNYayyl8TypP8DfJnQ2H/b/N3ye9P83cT33SQv/sQh9gV7zZ/0dNj5HQa\nC5vVzv9+/WFN2w8KVaZ2BwL1+pv4g0x1QRfjq0dB4Q3kT277oP6VNL6gKxNU9a8zK+WLbi/Wwpdi\nhbboKqyxFOulHMj6v4W/AXbmUeAxrv9J/CqEBXaRKsXaodD4nsYvkT/G6H1D4SR/iPy1Roj9JsQ5\ne18/7EUHv1+Fvx/Xj5V9Ugb5K8TW4TZEEdcvoz/up0VTe9qsVIppKVX6a7D6y9ZvwEKjrtQxPtv6\nfXII9vCxKOGaIeAIfEF8IvAG8ie3vRK9rRQl+PPpSctbhfpTUCpviH+kxsZgpT91+snoX1l49KK3\niUQvICRy5aUw6l8leoVwoo3Uv1rKreF/UFLY6d9QP4L9Wf2r7EP9GOSfcsjZ56f60kz+XmVPXv+R\nuP49ff0T/53Rv6n/7m2lvXT9Wqd/VUz8hvh5M/ED6ILmt4mfHYZSaePnTWpsf/SvqV9O6dLYYClL\nEetnoH/LBLFoBvrX189uTv8++kot5vTvQD4/9jP690g9P/4z/bvo/XVG/xYoZZx+8fr3MxAtsf7t\nUOkG2JqsTtCIpgCt/qX1226KqZS7gfzJbe+c9jLrtIZ8lXD+s4umlW6AKIVrlML2/cXjgPFjlJqI\nRC+Fj0bVJe+vSh56pSdR6YkQ1ygF10Wqf0FeLta/iKn9Mv1L24ti2e+7W4n1b3T/W+L+t9H9T/Sv\nVboUmqJJon1/hZq8LnzRDlDrX1u0xRT1+6vEpomMmyYkqi95vIH8yW1PN+122KkLcNLKi/WTF01z\n/cNASrWE/l3ev6T17zX909z9X27/euK/Rf3zWP+Waf9eEv37KkWJ+rfDl6ZglNDa+cEBhwYDvkoN\nP/rX69814NaI3imq0l7OYDy/qSdDGwr7r+Y3VbzoKZr6XX2lfxfOb87qXzr+b1j/Xlp/nP6dn98M\ncdH7cn7zjPObKsYWS3Eb9w8n85smHtqQuPuZ30T2dlIT6F9xFl+n8xslegL9a4c2KRr9W4rp/GYq\numiM9Nec/j2v/yj9u1h//hv9e93vc++f63/u+rPjL3f+5Lbn1j9m/eXWf+7zh/v8+2b9e/Hzn6s/\nuPqHrb8g71n6L3f+5Lbnvn8w33+4718/+5d47//c/gO7/5E7/nPbc/tv3P4fs//I7X9y+6/fqH+v\n6j9z+9/c/ju3/8+eP+TOn9z23PkXc/7Gnf9x5483q38Xzn+582fu/Js9fy8kb/6fO39y23P3n3S8\n/S/c/Tfc/T83uX/pgv1XE/9duP+Lu/+Mvf8td/znti8kb/8ld/9nx9t/Sjw/Ltr/yt1/+337f6/b\nf0zoB3nJ/ucVc/81d/83e/957vzJbc89/8A8f8E9/5HE78XnT/4H/cs5f8Q9/8Q9f8U+/5U7f3Lb\nc88fdrzzjyvm+cuf/Uu887/c88fs88954/8vO4SjPC+2QRIAAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTctMDItMjNUMDk6Mzk6MTAtMDY6MDBLGrg3AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTAyLTIz\nVDA5OjM5OjEwLTA2OjAwOkcAiwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -529,7 +529,7 @@ "mgxs_lib.domain_type = \"material\"\n", "\n", "# Specify the cell domains over which to compute multi-group cross sections\n", - "mgxs_lib.domains = geometry.get_all_materials()" + "mgxs_lib.domains = geometry.get_all_materials().values()" ] }, { @@ -571,7 +571,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/mgxs/library.py:426: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", + "/home/romano/openmc/openmc/mgxs/library.py:412: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", " warn(msg, RuntimeWarning)\n" ] } @@ -727,9 +727,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 6e3f6bf8b11cb3f6f171f1c351ddcaf85dd515ec\n", - " Date/Time | 2017-02-11 14:12:04\n", - " OpenMP Threads | 8\n", + " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", + " Date/Time | 2017-02-23 09:39:10\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -739,12 +739,12 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading B10 from /opt/xsdata/nndc/B10.h5\n", + " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", + " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", + " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/scripts/nndc_hdf5/B10.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -756,56 +756,56 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.05201 \n", - " 2/1 1.02017 \n", - " 3/1 1.02398 \n", - " 4/1 1.02677 \n", - " 5/1 1.01070 \n", - " 6/1 1.02964 \n", - " 7/1 1.02163 \n", - " 8/1 1.04524 \n", - " 9/1 1.00773 \n", - " 10/1 1.01536 \n", - " 11/1 1.02992 \n", - " 12/1 1.03248 1.03120 +/- 0.00128\n", - " 13/1 0.99044 1.01761 +/- 0.01361\n", - " 14/1 1.01484 1.01692 +/- 0.00965\n", - " 15/1 1.01491 1.01652 +/- 0.00748\n", - " 16/1 1.03809 1.02011 +/- 0.00709\n", - " 17/1 1.02536 1.02086 +/- 0.00604\n", - " 18/1 1.03663 1.02283 +/- 0.00559\n", - " 19/1 1.03902 1.02463 +/- 0.00525\n", - " 20/1 1.01557 1.02373 +/- 0.00478\n", - " 21/1 1.01286 1.02274 +/- 0.00443\n", - " 22/1 1.01392 1.02200 +/- 0.00411\n", - " 23/1 1.04439 1.02372 +/- 0.00416\n", - " 24/1 1.04034 1.02491 +/- 0.00403\n", - " 25/1 0.99433 1.02287 +/- 0.00427\n", - " 26/1 1.02720 1.02314 +/- 0.00400\n", - " 27/1 1.03545 1.02387 +/- 0.00383\n", - " 28/1 1.03853 1.02468 +/- 0.00370\n", - " 29/1 1.02735 1.02482 +/- 0.00350\n", - " 30/1 1.02429 1.02480 +/- 0.00332\n", - " 31/1 1.02901 1.02500 +/- 0.00317\n", - " 32/1 1.03296 1.02536 +/- 0.00304\n", - " 33/1 1.03605 1.02582 +/- 0.00294\n", - " 34/1 1.04247 1.02652 +/- 0.00290\n", - " 35/1 1.02088 1.02629 +/- 0.00279\n", - " 36/1 1.03017 1.02644 +/- 0.00269\n", - " 37/1 1.03216 1.02665 +/- 0.00259\n", - " 38/1 1.01459 1.02622 +/- 0.00254\n", - " 39/1 1.03706 1.02659 +/- 0.00248\n", - " 40/1 1.01383 1.02617 +/- 0.00243\n", - " 41/1 0.99028 1.02501 +/- 0.00262\n", - " 42/1 1.02969 1.02516 +/- 0.00254\n", - " 43/1 1.02097 1.02503 +/- 0.00247\n", - " 44/1 1.02650 1.02507 +/- 0.00239\n", - " 45/1 1.03939 1.02548 +/- 0.00236\n", - " 46/1 1.00974 1.02505 +/- 0.00233\n", - " 47/1 1.02563 1.02506 +/- 0.00227\n", - " 48/1 1.00377 1.02450 +/- 0.00228\n", - " 49/1 0.99082 1.02364 +/- 0.00238\n", - " 50/1 1.00805 1.02325 +/- 0.00235\n", + " 1/1 1.05169 \n", + " 2/1 1.02178 \n", + " 3/1 1.02778 \n", + " 4/1 1.01814 \n", + " 5/1 1.02993 \n", + " 6/1 1.05836 \n", + " 7/1 1.00011 \n", + " 8/1 1.04961 \n", + " 9/1 1.00908 \n", + " 10/1 1.00134 \n", + " 11/1 1.04275 \n", + " 12/1 1.04456 1.04366 +/- 0.00090\n", + " 13/1 1.00699 1.03143 +/- 0.01224\n", + " 14/1 1.05509 1.03735 +/- 0.01048\n", + " 15/1 1.01645 1.03317 +/- 0.00913\n", + " 16/1 1.02813 1.03233 +/- 0.00750\n", + " 17/1 1.03686 1.03298 +/- 0.00637\n", + " 18/1 1.04389 1.03434 +/- 0.00569\n", + " 19/1 1.01404 1.03208 +/- 0.00550\n", + " 20/1 1.01838 1.03071 +/- 0.00511\n", + " 21/1 1.02745 1.03042 +/- 0.00463\n", + " 22/1 1.03013 1.03039 +/- 0.00422\n", + " 23/1 1.02808 1.03022 +/- 0.00389\n", + " 24/1 1.04615 1.03135 +/- 0.00378\n", + " 25/1 1.03395 1.03153 +/- 0.00352\n", + " 26/1 1.05256 1.03284 +/- 0.00355\n", + " 27/1 1.03201 1.03279 +/- 0.00333\n", + " 28/1 1.00136 1.03105 +/- 0.00359\n", + " 29/1 1.01409 1.03015 +/- 0.00351\n", + " 30/1 1.01159 1.02923 +/- 0.00346\n", + " 31/1 1.02533 1.02904 +/- 0.00330\n", + " 32/1 1.04169 1.02962 +/- 0.00320\n", + " 33/1 1.02904 1.02959 +/- 0.00305\n", + " 34/1 1.04991 1.03044 +/- 0.00304\n", + " 35/1 1.03223 1.03051 +/- 0.00292\n", + " 36/1 1.02835 1.03043 +/- 0.00281\n", + " 37/1 1.02690 1.03029 +/- 0.00270\n", + " 38/1 1.02993 1.03028 +/- 0.00261\n", + " 39/1 1.03601 1.03048 +/- 0.00252\n", + " 40/1 1.04026 1.03081 +/- 0.00246\n", + " 41/1 1.00972 1.03013 +/- 0.00247\n", + " 42/1 1.04266 1.03052 +/- 0.00243\n", + " 43/1 1.01825 1.03015 +/- 0.00238\n", + " 44/1 1.05496 1.03087 +/- 0.00242\n", + " 45/1 1.01621 1.03046 +/- 0.00239\n", + " 46/1 1.04001 1.03072 +/- 0.00234\n", + " 47/1 1.04887 1.03121 +/- 0.00233\n", + " 48/1 1.02937 1.03116 +/- 0.00226\n", + " 49/1 1.01104 1.03065 +/- 0.00226\n", + " 50/1 1.03586 1.03078 +/- 0.00221\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -815,27 +815,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6381E-01 seconds\n", - " Reading cross sections = 2.7394E-01 seconds\n", - " Total time in simulation = 8.2977E+00 seconds\n", - " Time in transport only = 8.2033E+00 seconds\n", - " Time in inactive batches = 1.0881E+00 seconds\n", - " Time in active batches = 7.2096E+00 seconds\n", - " Time synchronizing fission bank = 5.2924E-03 seconds\n", - " Sampling source sites = 3.6536E-03 seconds\n", - " SEND/RECV source sites = 1.6013E-03 seconds\n", - " Time accumulating tallies = 1.1932E-04 seconds\n", - " Total time for finalization = 3.3830E-06 seconds\n", - " Total time elapsed = 8.6802E+00 seconds\n", - " Calculation Rate (inactive) = 45950.7 neutrons/second\n", - " Calculation Rate (active) = 27740.7 neutrons/second\n", + " Total time for initialization = 4.2488E-01 seconds\n", + " Reading cross sections = 3.1421E-01 seconds\n", + " Total time in simulation = 1.7708E+01 seconds\n", + " Time in transport only = 1.7283E+01 seconds\n", + " Time in inactive batches = 1.7937E+00 seconds\n", + " Time in active batches = 1.5915E+01 seconds\n", + " Time synchronizing fission bank = 5.8977E-03 seconds\n", + " Sampling source sites = 3.9998E-03 seconds\n", + " SEND/RECV source sites = 1.8525E-03 seconds\n", + " Time accumulating tallies = 1.4703E-04 seconds\n", + " Total time for finalization = 4.6920E-06 seconds\n", + " Total time elapsed = 1.8150E+01 seconds\n", + " Calculation Rate (inactive) = 27874.7 neutrons/second\n", + " Calculation Rate (active) = 12567.0 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02354 +/- 0.00215\n", - " k-effective (Track-length) = 1.02325 +/- 0.00235\n", - " k-effective (Absorption) = 1.02582 +/- 0.00193\n", - " Combined k-effective = 1.02474 +/- 0.00151\n", + " k-effective (Collision) = 1.02955 +/- 0.00250\n", + " k-effective (Track-length) = 1.03078 +/- 0.00221\n", + " k-effective (Absorption) = 1.02896 +/- 0.00244\n", + " Combined k-effective = 1.03019 +/- 0.00179\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -971,11 +971,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1084,9 +1084,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1094,9 +1094,9 @@ }, { "data": { - "image/png": "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\n2zkpAAAAAElFTkSuQmCC\n", + "image/png": "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\nmBVZSy0AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1104,9 +1104,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1187,9 +1187,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 6e3f6bf8b11cb3f6f171f1c351ddcaf85dd515ec\n", - " Date/Time | 2017-02-11 14:12:19\n", - " OpenMP Threads | 8\n", + " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", + " Date/Time | 2017-02-23 09:39:37\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -1213,56 +1213,56 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 0.98551 \n", - " 2/1 1.05279 \n", - " 3/1 1.03429 \n", - " 4/1 1.01472 \n", - " 5/1 1.01149 \n", - " 6/1 1.07167 \n", - " 7/1 1.00534 \n", - " 8/1 1.02138 \n", - " 9/1 1.03005 \n", - " 10/1 0.99297 \n", - " 11/1 1.00323 \n", - " 12/1 1.00757 1.00540 +/- 0.00217\n", - " 13/1 1.02578 1.01219 +/- 0.00691\n", - " 14/1 1.01920 1.01395 +/- 0.00519\n", - " 15/1 1.02700 1.01656 +/- 0.00479\n", - " 16/1 1.02370 1.01775 +/- 0.00409\n", - " 17/1 1.00321 1.01567 +/- 0.00403\n", - " 18/1 1.01318 1.01536 +/- 0.00351\n", - " 19/1 1.02439 1.01636 +/- 0.00325\n", - " 20/1 1.03004 1.01773 +/- 0.00321\n", - " 21/1 1.01840 1.01779 +/- 0.00291\n", - " 22/1 1.00581 1.01679 +/- 0.00284\n", - " 23/1 1.01457 1.01662 +/- 0.00261\n", - " 24/1 1.03033 1.01760 +/- 0.00261\n", - " 25/1 1.00450 1.01673 +/- 0.00258\n", - " 26/1 1.03680 1.01798 +/- 0.00272\n", - " 27/1 1.02786 1.01856 +/- 0.00262\n", - " 28/1 1.01150 1.01817 +/- 0.00250\n", - " 29/1 0.99850 1.01714 +/- 0.00258\n", - " 30/1 1.02729 1.01764 +/- 0.00250\n", - " 31/1 1.02587 1.01803 +/- 0.00241\n", - " 32/1 1.01423 1.01786 +/- 0.00231\n", - " 33/1 1.05449 1.01945 +/- 0.00272\n", - " 34/1 0.99908 1.01861 +/- 0.00274\n", - " 35/1 1.02441 1.01884 +/- 0.00264\n", - " 36/1 1.01844 1.01882 +/- 0.00253\n", - " 37/1 1.03198 1.01931 +/- 0.00249\n", - " 38/1 1.05078 1.02043 +/- 0.00265\n", - " 39/1 1.01134 1.02012 +/- 0.00257\n", - " 40/1 1.01423 1.01992 +/- 0.00249\n", - " 41/1 1.03987 1.02057 +/- 0.00250\n", - " 42/1 1.05441 1.02162 +/- 0.00264\n", - " 43/1 1.02068 1.02160 +/- 0.00256\n", - " 44/1 1.06387 1.02284 +/- 0.00277\n", - " 45/1 1.04844 1.02357 +/- 0.00279\n", - " 46/1 1.01967 1.02346 +/- 0.00272\n", - " 47/1 1.01830 1.02332 +/- 0.00264\n", - " 48/1 1.00888 1.02294 +/- 0.00260\n", - " 49/1 1.03033 1.02313 +/- 0.00254\n", - " 50/1 1.02732 1.02324 +/- 0.00248\n", + " 1/1 1.00368 \n", + " 2/1 0.99772 \n", + " 3/1 1.04317 \n", + " 4/1 1.02487 \n", + " 5/1 1.01766 \n", + " 6/1 1.03964 \n", + " 7/1 1.02340 \n", + " 8/1 1.02634 \n", + " 9/1 1.03388 \n", + " 10/1 1.02952 \n", + " 11/1 1.01872 \n", + " 12/1 1.02315 1.02093 +/- 0.00222\n", + " 13/1 1.02926 1.02371 +/- 0.00306\n", + " 14/1 1.01288 1.02100 +/- 0.00346\n", + " 15/1 1.04072 1.02494 +/- 0.00477\n", + " 16/1 1.01872 1.02391 +/- 0.00403\n", + " 17/1 1.00295 1.02091 +/- 0.00454\n", + " 18/1 1.02724 1.02170 +/- 0.00401\n", + " 19/1 1.01843 1.02134 +/- 0.00355\n", + " 20/1 1.02340 1.02155 +/- 0.00318\n", + " 21/1 1.03938 1.02317 +/- 0.00331\n", + " 22/1 1.00397 1.02157 +/- 0.00342\n", + " 23/1 1.03516 1.02261 +/- 0.00331\n", + " 24/1 1.03595 1.02357 +/- 0.00321\n", + " 25/1 1.03557 1.02437 +/- 0.00309\n", + " 26/1 1.03415 1.02498 +/- 0.00296\n", + " 27/1 1.02624 1.02505 +/- 0.00278\n", + " 28/1 1.02469 1.02503 +/- 0.00262\n", + " 29/1 1.00769 1.02412 +/- 0.00264\n", + " 30/1 1.02584 1.02420 +/- 0.00251\n", + " 31/1 0.99119 1.02263 +/- 0.00286\n", + " 32/1 1.00246 1.02172 +/- 0.00287\n", + " 33/1 1.00718 1.02108 +/- 0.00282\n", + " 34/1 1.01662 1.02090 +/- 0.00270\n", + " 35/1 1.01834 1.02080 +/- 0.00260\n", + " 36/1 1.04397 1.02169 +/- 0.00265\n", + " 37/1 1.01419 1.02141 +/- 0.00256\n", + " 38/1 1.02268 1.02145 +/- 0.00247\n", + " 39/1 1.04256 1.02218 +/- 0.00249\n", + " 40/1 1.03746 1.02269 +/- 0.00246\n", + " 41/1 1.02199 1.02267 +/- 0.00238\n", + " 42/1 1.03030 1.02291 +/- 0.00232\n", + " 43/1 1.00489 1.02236 +/- 0.00231\n", + " 44/1 1.03025 1.02259 +/- 0.00225\n", + " 45/1 1.05954 1.02365 +/- 0.00243\n", + " 46/1 1.03444 1.02395 +/- 0.00238\n", + " 47/1 1.00532 1.02345 +/- 0.00237\n", + " 48/1 1.03364 1.02371 +/- 0.00232\n", + " 49/1 1.02660 1.02379 +/- 0.00226\n", + " 50/1 1.04569 1.02434 +/- 0.00227\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -1272,27 +1272,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6247E-02 seconds\n", - " Reading cross sections = 2.9810E-03 seconds\n", - " Total time in simulation = 7.6874E+00 seconds\n", - " Time in transport only = 7.5290E+00 seconds\n", - " Time in inactive batches = 5.9831E-01 seconds\n", - " Time in active batches = 7.0890E+00 seconds\n", - " Time synchronizing fission bank = 5.0012E-03 seconds\n", - " Sampling source sites = 3.4413E-03 seconds\n", - " SEND/RECV source sites = 1.4835E-03 seconds\n", - " Time accumulating tallies = 1.1537E-04 seconds\n", - " Total time for finalization = 3.0480E-06 seconds\n", - " Total time elapsed = 7.7461E+00 seconds\n", - " Calculation Rate (inactive) = 83568.1 neutrons/second\n", - " Calculation Rate (active) = 28212.6 neutrons/second\n", + " Total time for initialization = 2.6345E-02 seconds\n", + " Reading cross sections = 3.9616E-03 seconds\n", + " Total time in simulation = 1.6005E+01 seconds\n", + " Time in transport only = 1.5841E+01 seconds\n", + " Time in inactive batches = 1.3158E+00 seconds\n", + " Time in active batches = 1.4689E+01 seconds\n", + " Time synchronizing fission bank = 6.9577E-03 seconds\n", + " Sampling source sites = 4.4024E-03 seconds\n", + " SEND/RECV source sites = 2.4544E-03 seconds\n", + " Time accumulating tallies = 1.4749E-04 seconds\n", + " Total time for finalization = 3.7060E-06 seconds\n", + " Total time elapsed = 1.6053E+01 seconds\n", + " Calculation Rate (inactive) = 37998.4 neutrons/second\n", + " Calculation Rate (active) = 13615.9 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02169 +/- 0.00234\n", - " k-effective (Track-length) = 1.02324 +/- 0.00248\n", - " k-effective (Absorption) = 1.02565 +/- 0.00155\n", - " Combined k-effective = 1.02525 +/- 0.00163\n", + " k-effective (Collision) = 1.02412 +/- 0.00199\n", + " k-effective (Track-length) = 1.02434 +/- 0.00227\n", + " k-effective (Absorption) = 1.02703 +/- 0.00143\n", + " Combined k-effective = 1.02632 +/- 0.00142\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -1373,9 +1373,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Continuous-Energy keff = 1.024739\n", - "Multi-Group keff = 1.025255\n", - "bias [pcm]: -51.5\n" + "Continuous-Energy keff = 1.030194\n", + "Multi-Group keff = 1.026316\n", + "bias [pcm]: 387.9\n" ] } ], @@ -1472,7 +1472,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 41, @@ -1481,9 +1481,9 @@ }, { "data": { - "image/png": "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\nA2gShaIjcDJaAAAAAElFTkSuQmCC\n", + "image/png": "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\nQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1518,8 +1518,9 @@ } ], "metadata": { + "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -1533,7 +1534,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.0" + "version": "3.5.2" } }, "nbformat": 4, diff --git a/openmc/geometry.py b/openmc/geometry.py index 5f651af2f3..a272eec0a7 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -208,13 +208,16 @@ class Geometry(object): return material_cells def get_all_material_universes(self): - """Return all universes having at least one non-fill cell + """Return all universes having at least one material-filled cell. + + This method can be used to find universes that have at least one cell + that is filled with a material or is void. Returns ------- collections.OrderedDict Dictionary mapping universe IDs to :class:`openmc.Universe` - instances with non-fill cells + instances with at least one material-filled cell """ material_universes = OrderedDict() diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 6b0bc39138..13fbe5e87c 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -3,7 +3,7 @@ import os import copy import pickle from numbers import Integral -from collections import OrderedDict +from collections import OrderedDict, Iterable from warnings import warn from six import string_types @@ -315,16 +315,16 @@ class Library(object): # User specified a list of material, cell or universe domains else: if self.domain_type == 'material': - cv.check_iterable_type('domain', domains, openmc.Material) + cv.check_type('domain', domains, Iterable, openmc.Material) all_domains = self.geometry.get_all_materials().values() elif self.domain_type in ['cell', 'distribcell']: - cv.check_iterable_type('domain', domains, openmc.Cell) + cv.check_type('domain', domains, Iterable, openmc.Cell) all_domains = self.geometry.get_all_material_cells().values() elif self.domain_type == 'universe': - cv.check_iterable_type('domain', domains, openmc.Universe) + cv.check_type('domain', domains, Iterable, openmc.Universe) all_domains = self.geometry.get_all_universes().values() elif self.domain_type == 'mesh': - cv.check_iterable_type('domain', domains, openmc.Mesh) + cv.check_type('domain', domains, Iterable, openmc.Mesh) # The mesh and geometry are independent, so set all_domains # to the input domains @@ -339,7 +339,7 @@ class Library(object): raise ValueError('Domain "{}" could not be found in the ' 'geometry.'.format(domain)) - self._domains = domains + self._domains = list(domains) @energy_groups.setter def energy_groups(self, energy_groups): From f139ce8dc12ae036e73ddf46c9ed5ba1a563be1c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 24 Feb 2017 15:01:21 -0500 Subject: [PATCH 54/66] Fix printing bug for tallies with AggregateNuclide --- openmc/tallies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/tallies.py b/openmc/tallies.py index 20e03129b5..9eef5f374f 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -195,7 +195,7 @@ class Tally(object): if isinstance(nuclide, openmc.Nuclide): string += nuclide.name + ' ' else: - string += nuclide + ' ' + string += str(nuclide) + ' ' string += '\n' From fc3df18eab72265016f733aedb257c2ae8e7bba5 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 25 Feb 2017 08:17:10 -0500 Subject: [PATCH 55/66] Added an openmc.run mode (summary, which just shows the timing and summary results; fixed the generation of cells from a mesh (incorrect ordering of universes in the lattice), xs_shapes for delayed groups had wrong ordering (fixed) in openmc.MGXSLibrary and openmc.Plotter, fixed error in multi-group plots which only plotted one group not all, fixed issue with setting max order to 0 for Legendre scattering (not legendre converted to tabular w/in OpenMC, the default), removed superfluous xs assignments in MG mode which only slowed things down --- openmc/executor.py | 26 ++++++++++++++++++++------ openmc/mesh.py | 35 +++++++++++++---------------------- openmc/mgxs/library.py | 1 + openmc/mgxs_library.py | 4 ++-- openmc/plotter.py | 24 ++++++++++++------------ src/mgxs_header.F90 | 8 +------- src/tally.F90 | 2 +- src/tracking.F90 | 2 -- 8 files changed, 50 insertions(+), 52 deletions(-) diff --git a/openmc/executor.py b/openmc/executor.py index 3b9b8abd8d..efc28a0b98 100644 --- a/openmc/executor.py +++ b/openmc/executor.py @@ -5,21 +5,33 @@ import sys from six import string_types +summary_indicator = "TIMING STATISTICS" + def _run(command, output, cwd): # Launch a subprocess p = subprocess.Popen(command, shell=True, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) + storage_flag = False + # Capture and re-print OpenMC output in real-time while True: # If OpenMC is finished, break loop line = p.stdout.readline() - if not line and p.poll() != None: + if not line and p.poll() is not None: break - # If user requested output, print to screen - if output: + if output == 'full': + # If user requested output, print to screen + print(line, end='') + elif output == 'summary' and summary_indicator in line: + # If they requested a summary, look for the start of the summary + storage_flag = True + + if storage_flag: + # If a summary is requested, and we have reached the summary, + # then print it print(line, end='') # Return the returncode (integer, zero if no problems encountered) @@ -44,7 +56,7 @@ def plot_geometry(output=True, openmc_exec='openmc', cwd='.'): def run(particles=None, threads=None, geometry_debug=False, - restart_file=None, tracks=False, output=True, cwd='.', + restart_file=None, tracks=False, output="full", cwd='.', openmc_exec='openmc', mpi_args=None): """Run an OpenMC simulation. @@ -63,8 +75,10 @@ def run(particles=None, threads=None, geometry_debug=False, Path to restart file to use tracks : bool, optional Write tracks for all particles. Defaults to False. - output : bool, optional - Capture OpenMC output from standard out. Defaults to True. + output : {"full", "summary", "none", False}, optional + Degree of OpenMC output captured from standard out. "full" prints all + output; "summary" prints only the results summary, and "none" or False + does not show the output. Defaults to "full". cwd : str, optional Path to working directory to run in. Defaults to the current working directory. diff --git a/openmc/mesh.py b/openmc/mesh.py index 24c39b530b..4d97262924 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -189,21 +189,21 @@ class Mesh(EqualityMixin): def cell_generator(self): """Generator function to traverse through every [i,j,k] index - of the mesh. + of the mesh in the same order that would be done by the Fortran For example the following code: .. code-block:: python for mesh_index in mymesh.cell_generator(): - print mesh_index + print(mesh_index) will produce the following output for a 3-D 2x2x2 mesh in mymesh:: [1, 1, 1] + [2, 1, 1] [1, 1, 2] [1, 2, 1] - [1, 2, 2] ... @@ -213,13 +213,13 @@ class Mesh(EqualityMixin): for x in range(self.dimension[0]): yield [x + 1, 1, 1] elif len(self.dimension) == 2: - for x in range(self.dimension[0]): - for y in range(self.dimension[1]): + for y in range(self.dimension[1]): + for x in range(self.dimension[0]): yield [x + 1, y + 1, 1] else: - for x in range(self.dimension[0]): + for z in range(self.dimension[2]): for y in range(self.dimension[1]): - for z in range(self.dimension[2]): + for x in range(self.dimension[0]): yield [x + 1, y + 1, z + 1] def to_xml_element(self): @@ -321,25 +321,17 @@ class Mesh(EqualityMixin): # Build the universes which will be used for each of the [i,j,k] # locations within the mesh. - # We will also have to build cells to assign to these universes - universes = np.ndarray(self.dimension[::-1], dtype=np.object) + # We will concurrently build cells to assign to these universes cells = [] + universes = [] for [i, j, k] in self.cell_generator(): - if len(self.dimension) == 1: - universes[i - 1] = openmc.Universe() - cells.append(openmc.Cell()) - universes[i - 1].add_cells([cells[-1]]) - elif len(self.dimension) == 2: - universes[j - 1, i - 1] = openmc.Universe() - cells.append(openmc.Cell()) - universes[j - 1, i - 1].add_cells([cells[-1]]) - else: - universes[k - 1, j - 1, i - 1] = openmc.Universe() - cells.append(openmc.Cell()) - universes[k - 1, j - 1, i - 1].add_cells([cells[-1]]) + cells.append(openmc.Cell()) + universes.append(openmc.Universe()) + universes[-1].add_cell(cells[-1]) lattice = openmc.RectLattice() lattice.lower_left = self.lower_left + lattice.universes = np.reshape(universes, self.dimension) if self.width is not None: lattice.pitch = self.width @@ -359,7 +351,6 @@ class Mesh(EqualityMixin): dz = ((self.upper_right[2] - self.lower_left[2]) / self.dimension[2]) lattice.pitch = [dx, dy, dz] - lattice.universes = universes # Fill Cell with the Lattice root_cell.fill = lattice diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 13fbe5e87c..627fb2508a 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -1317,6 +1317,7 @@ class Library(object): root_cell, cells = \ self.domains[0].build_cells(bc) root.add_cell(root_cell) + geometry = openmc.Geometry() geometry.root_universe = root materials = openmc.Materials() diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index af6dc8f98c..db69055a7d 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -351,8 +351,8 @@ class XSdata(object): self._xs_shapes["[DG]"] = (self.num_delayed_groups,) self._xs_shapes["[DG][G]"] = (self.num_delayed_groups, self.energy_groups.num_groups) - self._xs_shapes["[DG'][G']"] = (self.num_delayed_groups, - self.energy_groups.num_groups) + self._xs_shapes["[DG][G']"] = (self.num_delayed_groups, + self.energy_groups.num_groups) self._xs_shapes["[DG][G][G']"] = (self.num_delayed_groups, self.energy_groups.num_groups, self.energy_groups.num_groups) diff --git a/openmc/plotter.py b/openmc/plotter.py index 83f5722cc3..80a2077acb 100644 --- a/openmc/plotter.py +++ b/openmc/plotter.py @@ -676,7 +676,7 @@ def calculate_mgxs(this, types, orders=None, temperature=294., for line in range(len(types)): for g in range(library.energy_groups.num_groups): - data[g * 2: g * 2 + 2] = mgxs[line, g] + data[line, g * 2: g * 2 + 2] = mgxs[line, g] return energy_grid[::-1], data @@ -775,28 +775,28 @@ def _calculate_mgxs_nuc_macro(this, types, library, orders=None, data[i, :] = temp_data[orders[i]] else: data[i, :] = np.sum(temp_data[:]) - elif shape in (xsdata.xs_shapes["[G'][DG]"], - xsdata.xs_shapes["[G][DG]"]): + elif shape in (xsdata.xs_shapes["[DG][G']"], + xsdata.xs_shapes["[DG][G]"]): # Then we have an array vs groups with values for each # delayed group. The user-provided value of orders tells us # which delayed group we want. If none are provided, then # we sum all the delayed groups together. if orders[i]: - if orders[i] < len(shape[1]): - data[i, :] = temp_data[:, orders[i]] + if orders[i] < len(shape[0]): + data[i, :] = temp_data[orders[i], :] else: - data[i, :] = np.sum(temp_data[:, :], axis=1) - elif shape == xsdata.xs_shapes["[G][G'][DG]"]: + data[i, :] = np.sum(temp_data[:, :], axis=0) + elif shape == xsdata.xs_shapes["[DG][G][G']"]: # Then we have a delayed group matrix. We will first # remove the outgoing group dependency - temp_data = np.sum(temp_data, axis=1) + temp_data = np.sum(temp_data, axis=-1) # And then proceed in exactly the same manner as the - # "[G'][DG]" of "[G][DG]" shapes in the previous block. + # "[DG][G']" or "[DG][G]" shapes in the previous block. if orders[i]: - if orders[i] < len(shape[1]): - data[i, :] = temp_data[:, orders[i]] + if orders[i] < len(shape[0]): + data[i, :] = temp_data[orders[i], :] else: - data[i, :] = np.sum(temp_data[:, :], axis=1) + data[i, :] = np.sum(temp_data[:, :], axis=0) elif shape == xsdata.xs_shapes["[G][G'][Order]"]: # This is a scattering matrix with angular data # First remove the outgoing group dependence diff --git a/src/mgxs_header.F90 b/src/mgxs_header.F90 index 04443e6d5e..faf0fbaff9 100644 --- a/src/mgxs_header.F90 +++ b/src/mgxs_header.F90 @@ -2340,7 +2340,7 @@ module mgxs_header ! Now need to compare this material maximum scattering order with ! the problem wide max scatt order and use whichever is lower - order = min(mat_max_order, max_order) + order = min(mat_max_order, max_order + 1) ! Ok, got our order, store the dimensionality order_dim = order @@ -3467,9 +3467,7 @@ module mgxs_header type(MaterialMacroXS), intent(inout) :: xs ! Resultant Mgxs Data xs % total = this % xs(this % index_temp) % total(gin) - xs % elastic = this % xs(this % index_temp) % scatter % scattxs(gin) xs % absorption = this % xs(this % index_temp) % absorption(gin) - xs % fission = this % xs(this % index_temp) % fission(gin) xs % nu_fission = & this % xs(this % index_temp) % prompt_nu_fission(gin) + & sum(this % xs(this % index_temp) % delayed_nu_fission(:, gin)) @@ -3487,12 +3485,8 @@ module mgxs_header call find_angle(this % polar, this % azimuthal, uvw, iazi, ipol) xs % total = this % xs(this % index_temp) % & total(gin, iazi, ipol) - xs % elastic = this % xs(this % index_temp) % & - scatter(iazi, ipol) % obj % scattxs(gin) xs % absorption = this % xs(this % index_temp) % & absorption(gin, iazi, ipol) - xs % fission = this % xs(this % index_temp) % & - fission(gin, iazi, ipol) xs % nu_fission = this % xs(this % index_temp) % & prompt_nu_fission(gin, iazi, ipol) + & sum(this % xs(this % index_temp) % & diff --git a/src/tally.F90 b/src/tally.F90 index df1b5d2d6e..650e91b666 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2027,7 +2027,7 @@ contains end do SCORE_LOOP - nullify(matxs,nucxs) + nullify(matxs, nucxs) end subroutine score_general_mg !=============================================================================== diff --git a/src/tracking.F90 b/src/tracking.F90 index 1b4f6b99ba..a673b67516 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -105,9 +105,7 @@ contains p % coord(p % n_coord) % uvw, material_xs) else material_xs % total = ZERO - material_xs % elastic = ZERO material_xs % absorption = ZERO - material_xs % fission = ZERO material_xs % nu_fission = ZERO end if end if From 6aa561c291e4c4e615a9d55f3298dec7666152ef Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 25 Feb 2017 08:52:16 -0500 Subject: [PATCH 56/66] Updated mgxs-iv notebook --- .../pythonapi/examples/mgxs-part-iv.ipynb | 351 ++++-------------- 1 file changed, 62 insertions(+), 289 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index dfab3b2bef..f0fce27c26 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -338,7 +338,7 @@ "outputs": [], "source": [ "# OpenMC simulation parameters\n", - "batches = 50\n", + "batches = 500\n", "inactive = 10\n", "particles = 5000\n", "\n", @@ -425,7 +425,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -571,7 +571,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/mgxs/library.py:412: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", + "/home/nelsonag/git/openmc/openmc/mgxs/library.py:412: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", " warn(msg, RuntimeWarning)\n" ] } @@ -684,7 +684,7 @@ "collapsed": true }, "source": [ - "Time to run the calculation and get our results!" + "Time to run the calculation and get our results! This time we will suppress the OpenMC output except for the summary information." ] }, { @@ -698,144 +698,29 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - " %%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%\n", - " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n", - " ################## %%%%%%%%%%%%%%%%%%%%%%%\n", - " ################### %%%%%%%%%%%%%%%%%%%%%%%\n", - " #################### %%%%%%%%%%%%%%%%%%%%%%\n", - " ##################### %%%%%%%%%%%%%%%%%%%%%\n", - " ###################### %%%%%%%%%%%%%%%%%%%%\n", - " ####################### %%%%%%%%%%%%%%%%%%\n", - " ####################### %%%%%%%%%%%%%%%%%\n", - " ###################### %%%%%%%%%%%%%%%%%\n", - " #################### %%%%%%%%%%%%%%%%%\n", - " ################# %%%%%%%%%%%%%%%%%\n", - " ############### %%%%%%%%%%%%%%%%\n", - " ############ %%%%%%%%%%%%%%%\n", - " ######## %%%%%%%%%%%%%%\n", - " %%%%%%%%%%%\n", - "\n", - " | The OpenMC Monte Carlo Code\n", - " Copyright | 2011-2017 Massachusetts Institute of Technology\n", - " License | http://openmc.readthedocs.io/en/latest/license.html\n", - " Version | 0.8.0\n", - " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", - " Date/Time | 2017-02-23 09:39:10\n", - " OpenMP Threads | 4\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading cross sections XML file...\n", - " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", - " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", - " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", - " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", - " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", - " Reading B10 from /home/romano/openmc/scripts/nndc_hdf5/B10.h5\n", - " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", - " Reading tallies XML file...\n", - " Building neighboring cells lists for each surface...\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.05169 \n", - " 2/1 1.02178 \n", - " 3/1 1.02778 \n", - " 4/1 1.01814 \n", - " 5/1 1.02993 \n", - " 6/1 1.05836 \n", - " 7/1 1.00011 \n", - " 8/1 1.04961 \n", - " 9/1 1.00908 \n", - " 10/1 1.00134 \n", - " 11/1 1.04275 \n", - " 12/1 1.04456 1.04366 +/- 0.00090\n", - " 13/1 1.00699 1.03143 +/- 0.01224\n", - " 14/1 1.05509 1.03735 +/- 0.01048\n", - " 15/1 1.01645 1.03317 +/- 0.00913\n", - " 16/1 1.02813 1.03233 +/- 0.00750\n", - " 17/1 1.03686 1.03298 +/- 0.00637\n", - " 18/1 1.04389 1.03434 +/- 0.00569\n", - " 19/1 1.01404 1.03208 +/- 0.00550\n", - " 20/1 1.01838 1.03071 +/- 0.00511\n", - " 21/1 1.02745 1.03042 +/- 0.00463\n", - " 22/1 1.03013 1.03039 +/- 0.00422\n", - " 23/1 1.02808 1.03022 +/- 0.00389\n", - " 24/1 1.04615 1.03135 +/- 0.00378\n", - " 25/1 1.03395 1.03153 +/- 0.00352\n", - " 26/1 1.05256 1.03284 +/- 0.00355\n", - " 27/1 1.03201 1.03279 +/- 0.00333\n", - " 28/1 1.00136 1.03105 +/- 0.00359\n", - " 29/1 1.01409 1.03015 +/- 0.00351\n", - " 30/1 1.01159 1.02923 +/- 0.00346\n", - " 31/1 1.02533 1.02904 +/- 0.00330\n", - " 32/1 1.04169 1.02962 +/- 0.00320\n", - " 33/1 1.02904 1.02959 +/- 0.00305\n", - " 34/1 1.04991 1.03044 +/- 0.00304\n", - " 35/1 1.03223 1.03051 +/- 0.00292\n", - " 36/1 1.02835 1.03043 +/- 0.00281\n", - " 37/1 1.02690 1.03029 +/- 0.00270\n", - " 38/1 1.02993 1.03028 +/- 0.00261\n", - " 39/1 1.03601 1.03048 +/- 0.00252\n", - " 40/1 1.04026 1.03081 +/- 0.00246\n", - " 41/1 1.00972 1.03013 +/- 0.00247\n", - " 42/1 1.04266 1.03052 +/- 0.00243\n", - " 43/1 1.01825 1.03015 +/- 0.00238\n", - " 44/1 1.05496 1.03087 +/- 0.00242\n", - " 45/1 1.01621 1.03046 +/- 0.00239\n", - " 46/1 1.04001 1.03072 +/- 0.00234\n", - " 47/1 1.04887 1.03121 +/- 0.00233\n", - " 48/1 1.02937 1.03116 +/- 0.00226\n", - " 49/1 1.01104 1.03065 +/- 0.00226\n", - " 50/1 1.03586 1.03078 +/- 0.00221\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.2488E-01 seconds\n", - " Reading cross sections = 3.1421E-01 seconds\n", - " Total time in simulation = 1.7708E+01 seconds\n", - " Time in transport only = 1.7283E+01 seconds\n", - " Time in inactive batches = 1.7937E+00 seconds\n", - " Time in active batches = 1.5915E+01 seconds\n", - " Time synchronizing fission bank = 5.8977E-03 seconds\n", - " Sampling source sites = 3.9998E-03 seconds\n", - " SEND/RECV source sites = 1.8525E-03 seconds\n", - " Time accumulating tallies = 1.4703E-04 seconds\n", - " Total time for finalization = 4.6920E-06 seconds\n", - " Total time elapsed = 1.8150E+01 seconds\n", - " Calculation Rate (inactive) = 27874.7 neutrons/second\n", - " Calculation Rate (active) = 12567.0 neutrons/second\n", + " Total time for initialization = 3.2303E-01 seconds\n", + " Reading cross sections = 2.4414E-01 seconds\n", + " Total time in simulation = 1.4351E+02 seconds\n", + " Time in transport only = 1.4018E+02 seconds\n", + " Time in inactive batches = 7.9702E-01 seconds\n", + " Time in active batches = 1.4272E+02 seconds\n", + " Time synchronizing fission bank = 8.1742E-02 seconds\n", + " Sampling source sites = 5.6844E-02 seconds\n", + " SEND/RECV source sites = 2.4302E-02 seconds\n", + " Time accumulating tallies = 1.9605E-03 seconds\n", + " Total time for finalization = 6.3080E-06 seconds\n", + " Total time elapsed = 1.4385E+02 seconds\n", + " Calculation Rate (inactive) = 62733.9 neutrons/second\n", + " Calculation Rate (active) = 17166.9 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02955 +/- 0.00250\n", - " k-effective (Track-length) = 1.03078 +/- 0.00221\n", - " k-effective (Absorption) = 1.02896 +/- 0.00244\n", - " Combined k-effective = 1.03019 +/- 0.00179\n", + " k-effective (Collision) = 1.02519 +/- 0.00068\n", + " k-effective (Track-length) = 1.02548 +/- 0.00075\n", + " k-effective (Absorption) = 1.02621 +/- 0.00064\n", + " Combined k-effective = 1.02580 +/- 0.00053\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -852,8 +737,8 @@ } ], "source": [ - "# Run OpenMC\n", - "openmc.run()" + "# Run OpenMC, showing only the summary information at the end.\n", + "openmc.run(output='summary')" ] }, { @@ -971,11 +856,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1084,9 +969,9 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1094,9 +979,9 @@ }, { "data": { - "image/png": "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\nmBVZSy0AAAAASUVORK5CYII=\n", + "image/png": "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\ntPx/RfHQqmw1MBwAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1104,9 +989,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1143,7 +1028,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "At this point, the problem is set up and we can run the multi-group calculation." + "At this point, the problem is set up and we can run the multi-group calculation, again with only summary information being displayed." ] }, { @@ -1158,141 +1043,29 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n", - " %%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%\n", - " %%%%%%%%%%%%%%%%%%%%%%%%\n", - " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n", - " ################## %%%%%%%%%%%%%%%%%%%%%%%\n", - " ################### %%%%%%%%%%%%%%%%%%%%%%%\n", - " #################### %%%%%%%%%%%%%%%%%%%%%%\n", - " ##################### %%%%%%%%%%%%%%%%%%%%%\n", - " ###################### %%%%%%%%%%%%%%%%%%%%\n", - " ####################### %%%%%%%%%%%%%%%%%%\n", - " ####################### %%%%%%%%%%%%%%%%%\n", - " ###################### %%%%%%%%%%%%%%%%%\n", - " #################### %%%%%%%%%%%%%%%%%\n", - " ################# %%%%%%%%%%%%%%%%%\n", - " ############### %%%%%%%%%%%%%%%%\n", - " ############ %%%%%%%%%%%%%%%\n", - " ######## %%%%%%%%%%%%%%\n", - " %%%%%%%%%%%\n", - "\n", - " | The OpenMC Monte Carlo Code\n", - " Copyright | 2011-2017 Massachusetts Institute of Technology\n", - " License | http://openmc.readthedocs.io/en/latest/license.html\n", - " Version | 0.8.0\n", - " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", - " Date/Time | 2017-02-23 09:39:37\n", - " OpenMP Threads | 4\n", - "\n", - " ===========================================================================\n", - " ========================> INITIALIZATION <=========================\n", - " ===========================================================================\n", - "\n", - " Reading settings XML file...\n", - " Reading geometry XML file...\n", - " Reading materials XML file...\n", - " Reading cross sections HDF5 file...\n", - " Reading tallies XML file...\n", - " Loading Cross Section Data...\n", - " Loading fuel Data...\n", - " Loading zircaloy Data...\n", - " Loading water Data...\n", - " Building neighboring cells lists for each surface...\n", - " Initializing source particles...\n", - "\n", - " ===========================================================================\n", - " ====================> K EIGENVALUE SIMULATION <====================\n", - " ===========================================================================\n", - "\n", - " Bat./Gen. k Average k \n", - " ========= ======== ==================== \n", - " 1/1 1.00368 \n", - " 2/1 0.99772 \n", - " 3/1 1.04317 \n", - " 4/1 1.02487 \n", - " 5/1 1.01766 \n", - " 6/1 1.03964 \n", - " 7/1 1.02340 \n", - " 8/1 1.02634 \n", - " 9/1 1.03388 \n", - " 10/1 1.02952 \n", - " 11/1 1.01872 \n", - " 12/1 1.02315 1.02093 +/- 0.00222\n", - " 13/1 1.02926 1.02371 +/- 0.00306\n", - " 14/1 1.01288 1.02100 +/- 0.00346\n", - " 15/1 1.04072 1.02494 +/- 0.00477\n", - " 16/1 1.01872 1.02391 +/- 0.00403\n", - " 17/1 1.00295 1.02091 +/- 0.00454\n", - " 18/1 1.02724 1.02170 +/- 0.00401\n", - " 19/1 1.01843 1.02134 +/- 0.00355\n", - " 20/1 1.02340 1.02155 +/- 0.00318\n", - " 21/1 1.03938 1.02317 +/- 0.00331\n", - " 22/1 1.00397 1.02157 +/- 0.00342\n", - " 23/1 1.03516 1.02261 +/- 0.00331\n", - " 24/1 1.03595 1.02357 +/- 0.00321\n", - " 25/1 1.03557 1.02437 +/- 0.00309\n", - " 26/1 1.03415 1.02498 +/- 0.00296\n", - " 27/1 1.02624 1.02505 +/- 0.00278\n", - " 28/1 1.02469 1.02503 +/- 0.00262\n", - " 29/1 1.00769 1.02412 +/- 0.00264\n", - " 30/1 1.02584 1.02420 +/- 0.00251\n", - " 31/1 0.99119 1.02263 +/- 0.00286\n", - " 32/1 1.00246 1.02172 +/- 0.00287\n", - " 33/1 1.00718 1.02108 +/- 0.00282\n", - " 34/1 1.01662 1.02090 +/- 0.00270\n", - " 35/1 1.01834 1.02080 +/- 0.00260\n", - " 36/1 1.04397 1.02169 +/- 0.00265\n", - " 37/1 1.01419 1.02141 +/- 0.00256\n", - " 38/1 1.02268 1.02145 +/- 0.00247\n", - " 39/1 1.04256 1.02218 +/- 0.00249\n", - " 40/1 1.03746 1.02269 +/- 0.00246\n", - " 41/1 1.02199 1.02267 +/- 0.00238\n", - " 42/1 1.03030 1.02291 +/- 0.00232\n", - " 43/1 1.00489 1.02236 +/- 0.00231\n", - " 44/1 1.03025 1.02259 +/- 0.00225\n", - " 45/1 1.05954 1.02365 +/- 0.00243\n", - " 46/1 1.03444 1.02395 +/- 0.00238\n", - " 47/1 1.00532 1.02345 +/- 0.00237\n", - " 48/1 1.03364 1.02371 +/- 0.00232\n", - " 49/1 1.02660 1.02379 +/- 0.00226\n", - " 50/1 1.04569 1.02434 +/- 0.00227\n", - " Creating state point statepoint.50.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 2.6345E-02 seconds\n", - " Reading cross sections = 3.9616E-03 seconds\n", - " Total time in simulation = 1.6005E+01 seconds\n", - " Time in transport only = 1.5841E+01 seconds\n", - " Time in inactive batches = 1.3158E+00 seconds\n", - " Time in active batches = 1.4689E+01 seconds\n", - " Time synchronizing fission bank = 6.9577E-03 seconds\n", - " Sampling source sites = 4.4024E-03 seconds\n", - " SEND/RECV source sites = 2.4544E-03 seconds\n", - " Time accumulating tallies = 1.4749E-04 seconds\n", - " Total time for finalization = 3.7060E-06 seconds\n", - " Total time elapsed = 1.6053E+01 seconds\n", - " Calculation Rate (inactive) = 37998.4 neutrons/second\n", - " Calculation Rate (active) = 13615.9 neutrons/second\n", + " Total time for initialization = 4.3662E-02 seconds\n", + " Reading cross sections = 5.8801E-03 seconds\n", + " Total time in simulation = 1.7518E+02 seconds\n", + " Time in transport only = 1.7154E+02 seconds\n", + " Time in inactive batches = 8.0088E-01 seconds\n", + " Time in active batches = 1.7438E+02 seconds\n", + " Time synchronizing fission bank = 9.8651E-02 seconds\n", + " Sampling source sites = 6.7951E-02 seconds\n", + " SEND/RECV source sites = 2.9902E-02 seconds\n", + " Time accumulating tallies = 2.2328E-03 seconds\n", + " Total time for finalization = 5.9420E-06 seconds\n", + " Total time elapsed = 1.7525E+02 seconds\n", + " Calculation Rate (inactive) = 62431.1 neutrons/second\n", + " Calculation Rate (active) = 14049.6 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02412 +/- 0.00199\n", - " k-effective (Track-length) = 1.02434 +/- 0.00227\n", - " k-effective (Absorption) = 1.02703 +/- 0.00143\n", - " Combined k-effective = 1.02632 +/- 0.00142\n", + " k-effective (Collision) = 1.02429 +/- 0.00068\n", + " k-effective (Track-length) = 1.02408 +/- 0.00075\n", + " k-effective (Absorption) = 1.02514 +/- 0.00050\n", + " Combined k-effective = 1.02488 +/- 0.00045\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -1309,8 +1082,8 @@ } ], "source": [ - "# Run the Multi-Group OpenMC Simulation\n", - "openmc.run()" + "# Run OpenMC, showing only the summary information at the end.\n", + "openmc.run(output='summary')" ] }, { @@ -1373,9 +1146,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Continuous-Energy keff = 1.030194\n", - "Multi-Group keff = 1.026316\n", - "bias [pcm]: 387.9\n" + "Continuous-Energy keff = 1.025799\n", + "Multi-Group keff = 1.024883\n", + "bias [pcm]: 91.6\n" ] } ], @@ -1472,7 +1245,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 41, @@ -1481,9 +1254,9 @@ }, { "data": { - "image/png": "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\nQmCC\n", + "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1520,7 +1293,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1534,7 +1307,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, From bd9b32b804b60def8639f667bcdb35896a4a5882 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 25 Feb 2017 14:36:09 -0500 Subject: [PATCH 57/66] Removed Nu* MGXS classes. --- .../pythonapi/examples/mgxs-part-i.ipynb | 54 +- .../pythonapi/examples/mgxs-part-ii.ipynb | 84 +-- .../pythonapi/examples/mgxs-part-iii.ipynb | 90 ++- openmc/mgxs/mgxs.py | 666 +++--------------- 4 files changed, 224 insertions(+), 670 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index d076823bea..2b3d5a77c0 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -369,21 +369,19 @@ "\n", "* `TotalXS`\n", "* `TransportXS`\n", - "* `NuTransportXS`\n", "* `AbsorptionXS`\n", "* `CaptureXS`\n", "* `FissionXS`\n", - "* `NuFissionXS`\n", "* `KappaFissionXS`\n", "* `ScatterXS`\n", - "* `NuScatterXS`\n", "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", "* `Chi`\n", "* `ChiPrompt`\n", "* `InverseVelocity`\n", "* `PromptNuFissionXS`\n", "\n", + "Of course, we know that the transport (`TransportXS`), fission (`FissionXS`), scattering (`ScatterXS`), and scattering-matrix (`ScatterMatrixXS`) cross sections can potentially incorporate neutron multiplication ($\\nu$). For these types, the multpiplication can be accomodated by setting the `nu` parameter to `True` as shown below.\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." ] }, @@ -398,7 +396,11 @@ "# Instantiate a few different sections\n", "total = mgxs.TotalXS(domain=cell, groups=groups)\n", "absorption = mgxs.AbsorptionXS(domain=cell, groups=groups)\n", - "scattering = mgxs.ScatterXS(domain=cell, groups=groups)" + "scattering = mgxs.ScatterXS(domain=cell, groups=groups)\n", + "\n", + "# Note that if we wanted to incorporate neutron multiplication in the\n", + "# scattering cross section we would write the previous line as:\n", + "# scattering = mgxs.ScatterXS(domain=cell, groups=groups, nu=True)" ] }, { @@ -520,8 +522,8 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 54b65c8bda6af5788bd762b8cf9855d1a8008238\n", - " Date/Time | 2017-02-12 13:36:24\n", + " Git SHA1 | 60a1f157dae88b62e1865a5fe3efd7ef0773a068\n", + " Date/Time | 2017-02-25 14:26:54\n", " OpenMP Threads | 8\n", "\n", " ===========================================================================\n", @@ -592,7 +594,7 @@ " 42/1 1.13779 1.16177 +/- 0.00531\n", " 43/1 1.15066 1.16143 +/- 0.00516\n", " 44/1 1.12174 1.16026 +/- 0.00514\n", - " 45/1 1.17479 1.16068 +/- 0.00501\n", + " 45/1 1.17478 1.16068 +/- 0.00501\n", " 46/1 1.14146 1.16014 +/- 0.00489\n", " 47/1 1.20464 1.16135 +/- 0.00491\n", " 48/1 1.15119 1.16108 +/- 0.00479\n", @@ -607,20 +609,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1327E-01 seconds\n", - " Reading cross sections = 3.2638E-01 seconds\n", - " Total time in simulation = 2.2324E+00 seconds\n", - " Time in transport only = 2.1226E+00 seconds\n", - " Time in inactive batches = 3.0650E-01 seconds\n", - " Time in active batches = 1.9259E+00 seconds\n", - " Time synchronizing fission bank = 2.7640E-03 seconds\n", - " Sampling source sites = 2.0198E-03 seconds\n", - " SEND/RECV source sites = 7.0929E-04 seconds\n", - " Time accumulating tallies = 4.5355E-05 seconds\n", - " Total time for finalization = 4.1885E-04 seconds\n", - " Total time elapsed = 2.6534E+00 seconds\n", - " Calculation Rate (inactive) = 81567.1 neutrons/second\n", - " Calculation Rate (active) = 51923.2 neutrons/second\n", + " Total time for initialization = 3.5070E-01 seconds\n", + " Reading cross sections = 2.4151E-01 seconds\n", + " Total time in simulation = 2.3276E+00 seconds\n", + " Time in transport only = 2.2350E+00 seconds\n", + " Time in inactive batches = 2.5677E-01 seconds\n", + " Time in active batches = 2.0708E+00 seconds\n", + " Time synchronizing fission bank = 2.7683E-03 seconds\n", + " Sampling source sites = 2.0233E-03 seconds\n", + " SEND/RECV source sites = 7.1007E-04 seconds\n", + " Time accumulating tallies = 5.0753E-05 seconds\n", + " Total time for finalization = 3.8695E-04 seconds\n", + " Total time elapsed = 2.6857E+00 seconds\n", + " Calculation Rate (inactive) = 97364.6 neutrons/second\n", + " Calculation Rate (active) = 48290.8 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -901,7 +903,7 @@ " 6.250000e-01\n", " total\n", " (((total / flux) - (absorption / flux)) - (sca...\n", - " -2.664535e-15\n", + " -5.551115e-15\n", " 0.011292\n", " \n", " \n", @@ -911,7 +913,7 @@ " 2.000000e+07\n", " total\n", " (((total / flux) - (absorption / flux)) - (sca...\n", - " -3.330669e-16\n", + " -1.110223e-16\n", " 0.002570\n", " \n", " \n", @@ -924,8 +926,8 @@ "1 1 6.25e-01 2.00e+07 total \n", "\n", " score mean std. dev. \n", - "0 (((total / flux) - (absorption / flux)) - (sca... -2.66e-15 1.13e-02 \n", - "1 (((total / flux) - (absorption / flux)) - (sca... -3.33e-16 2.57e-03 " + "0 (((total / flux) - (absorption / flux)) - (sca... -5.55e-15 1.13e-02 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... -1.11e-16 2.57e-03 " ] }, "execution_count": 22, diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index 359fd4eaa7..a0e47fa12c 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -34,7 +34,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/miniconda3/envs/python3/lib/python3.5/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", + "/usr/lib/python3.6/site-packages/matplotlib/__init__.py:1401: 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", @@ -342,8 +342,8 @@ " 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]['nu-fission'] = mgxs.FissionXS(groups=fine_groups, nu=True)\n", + " xs_library[cell.id]['nu-scatter'] = mgxs.ScatterMatrixXS(groups=fine_groups, nu=True)\n", " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)" ] }, @@ -454,9 +454,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | dfc6f1d9bf1b31fc94dad1cb30bd672b25f47e04\n", - " Date/Time | 2017-02-21 15:07:51\n", - " OpenMP Threads | 4\n", + " Git SHA1 | 60a1f157dae88b62e1865a5fe3efd7ef0773a068\n", + " Date/Time | 2017-02-25 14:28:21\n", + " OpenMP Threads | 8\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -466,11 +466,11 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", - " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", - " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", - " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", - " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", + " Reading U235 from /opt/xsdata/nndc/U235.h5\n", + " Reading U238 from /opt/xsdata/nndc/U238.h5\n", + " Reading O16 from /opt/xsdata/nndc/O16.h5\n", + " Reading H1 from /opt/xsdata/nndc/H1.h5\n", + " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -532,7 +532,7 @@ " 48/1 1.22204 1.22140 +/- 0.00239\n", " 49/1 1.22077 1.22139 +/- 0.00232\n", " 50/1 1.23166 1.22164 +/- 0.00228\n", - " Triggers unsatisfied, max unc./thresh. is 1.17623 for flux in tally 10057\n", + " Triggers unsatisfied, max unc./thresh. is 1.17623 for flux in tally 10050\n", " The estimated number of batches is 66\n", " Creating state point statepoint.050.h5...\n", " 51/1 1.20071 1.22113 +/- 0.00228\n", @@ -551,7 +551,7 @@ " 64/1 1.23955 1.22122 +/- 0.00200\n", " 65/1 1.21143 1.22104 +/- 0.00197\n", " 66/1 1.21791 1.22099 +/- 0.00194\n", - " Triggers unsatisfied, max unc./thresh. is 1.13207 for flux in tally 10057\n", + " Triggers unsatisfied, max unc./thresh. is 1.13207 for flux in tally 10050\n", " The estimated number of batches is 82\n", " 67/1 1.24897 1.22148 +/- 0.00196\n", " 68/1 1.22221 1.22149 +/- 0.00193\n", @@ -579,20 +579,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6241E-01 seconds\n", - " Reading cross sections = 2.5754E-01 seconds\n", - " Total time in simulation = 9.0901E+01 seconds\n", - " Time in transport only = 9.0045E+01 seconds\n", - " Time in inactive batches = 2.9786E+00 seconds\n", - " Time in active batches = 8.7923E+01 seconds\n", - " Time synchronizing fission bank = 2.7221E-02 seconds\n", - " Sampling source sites = 1.6637E-02 seconds\n", - " SEND/RECV source sites = 1.0474E-02 seconds\n", - " Time accumulating tallies = 9.2191E-04 seconds\n", - " Total time for finalization = 1.2513E-02 seconds\n", - " Total time elapsed = 9.1307E+01 seconds\n", - " Calculation Rate (inactive) = 33572.9 neutrons/second\n", - " Calculation Rate (active) = 4549.45 neutrons/second\n", + " Total time for initialization = 3.2089E-01 seconds\n", + " Reading cross sections = 2.2960E-01 seconds\n", + " Total time in simulation = 3.1332E+01 seconds\n", + " Time in transport only = 3.1007E+01 seconds\n", + " Time in inactive batches = 1.6660E+00 seconds\n", + " Time in active batches = 2.9666E+01 seconds\n", + " Time synchronizing fission bank = 1.7043E-02 seconds\n", + " Sampling source sites = 1.1813E-02 seconds\n", + " SEND/RECV source sites = 5.1688E-03 seconds\n", + " Time accumulating tallies = 5.0509E-04 seconds\n", + " Total time for finalization = 1.6880E-02 seconds\n", + " Total time elapsed = 3.1699E+01 seconds\n", + " Calculation Rate (inactive) = 60024.2 neutrons/second\n", + " Calculation Rate (active) = 13483.6 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -733,7 +733,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] } @@ -803,7 +803,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1151,11 +1151,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1510,11 +1510,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1990,7 +1990,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -2006,9 +2006,9 @@ }, { "data": { - "image/png": "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\nxhiT4P4fD4z+wrudGZ0AAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2091,9 +2091,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAADRCAYAAADcxUm6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGRxJREFUeJzt3Xm0XFWZ9/HvBUGEMCMzCmF4GGxRoIHQ0GEI8xDRZiGN\nMsjQqEjzImC30E3S2IIggwrdgL1eBn0bFBAFBURoiQJhEGQI4A8ZQiShgRCBoBhMct8/9i6sXO69\nqSTn3Dp35/dZ665UnTq1z67Kc556zj5TT29vL2ZmNvwt0e0OmJlZNZzQzcwK4YRuZlYIJ3Qzs0I4\noZuZFcIJ3cysEO/pdgeqFBG9wHqSXmibdgTwKUljBnjPhsC1wIyB5snznQAcAywFLA38Ejhe0syF\n7OuewJOSpkTEGsB2km5cwDaOB9aQ9C8L04d+2psMTJe0TZ/ppwNnAhtImjyfNo6R9O0BXrsDOEXS\nQ1X0t2QR0QOcABxNirklgJ8Dp0t6ZZD3nAx8FdhF0l1tr+0IXAK8D3ietE5M66eNQ4BTgGXzch8D\nPtffvB1+ju2AtyQ9GhHvBQ6WdNUCtnEgsL+kzyxMH/pp705gU2AdSXPapn8K+A7pu7tzPm0MFudX\nAddKuqmK/i6IxbpCj4gAfgw8MJ/59gI+S/qP3hTYjLRinLsIi/8/wAfy412AAxa0AUkXVZXM26we\nEZv0mXYg0G8SaRcRawKnDvS6pN2czDv278ChwN455jYHXgPujIj3DfCe/wQ2AV5unxgRKwDfB46W\ntCHwU+CQvm+OiM2BC4GP52VuAjwL/N9F+BxHAh/Ojz8KHLagDUi6oapk3uZtYLc+0w4Bfje/N0bE\nkgyy7ks6rBvJHAqr0BfCn4BdgT2BDQeZ76+ApyVNB5A0KyKOBnoBImI14HJgC+BN4GRJt+XK+0pg\nfeC9wLcknR8RZ5KCabOI+A9SRfSeiBgh6ZMRMRb4CrAc8DTw95KmR8Q4YB1gS+C/gZWAdSUdnauO\nG4GPAxsAv8jv681bKWcDLwEXAJdL6hngs95CCuzx+bP9FfB7YNXWDBFxACnhLJ0/71GSHgbuAdaN\niN+QVuKnSMngUGD33KdPAdsBoyUdkNu7DfiRpIsH+T9YbETEKsCJwEdaW5uSZgNfiojdgE8Dl/Xz\n1islTcxbWu3GAg9Juje39bUBFr0F8FJrK0zSnIg4jVS8kH9ILgV2Iq07/y7puxGxLCn+P0KKiesl\nnRwRx5ES+AERsU7+TCtExC8l7RQRf0P6AVkZmE6K12dzvB4ArAg8CDxB3sqOiCtIWxg7kH5wngLG\nSvpj3ur9L1JMXgB8HfjwAFuVrTi/re0734D0A0aeNgq4iLQezgVOkHQ78DNgxRzne+fPfjdp3TuK\ntIX0X8BbwOnA1pLmRsRlwOuSThng+19ki3WFLul5SS92MOvtwB4RcWVE7B0Ry0t6o2245WzgCUkj\ngcOBq/Pm5enAc7na2Q04KyLWy1X1VODQvHJdBFyXk/lI0mbfIbm9n5M2lVv2AfaRdGE//dyflDg3\nIf1Q7ZAD9T+AMaQKac/5fNZrmbd6OyRPAyAi3kP6kTpGUgA/Iq04AJ8BpkjaVNLbedq6kkLSlLY2\nLwTWiYg98o/X8qTq0pLtSd/jU/28dhMwur83SZo4QHtbAtMj4oaIeCoirslFSF93Ax+IiBsj4sCI\nWEXSW5Jm5Ne/CCwtaQNSnF0UEWuTtl6XJw1jbAUcERE7SroEuB84Ncf5PwMTczJfPn+WL0vaCPgG\naSuiZQ/gOEn9bfEdBBxMKsLeDxyYq+YrgWMlbQZsTErEA/kxsFdELJOf/x0plttdBpyb19+z+ct6\n+BlgTo7z5/K0rYEtJN3TerOk64EpwNER8VHSOnnGIH1aZCUm9Dsj4jetP+CsRW1Q0q+BvyF9X1cC\nr+aVozVksg9wddu860uaRRoD/UKe/izwv6QqYDB7AXdKmpSfX0KqcJbMz+9rbSn047q8Av6BVLl8\ngFQNPyVpkqS5zD9xPg3MjIit8/NPANe3fRezgdVb1R5pX8LIQdr7cd8JedzyGOA80opyTO6bJasw\n8BDXS/n1BbESKUGeQqrCZ5F+VOeRx8m3BV4Evgm8EhG3R0RryGQf4Jo87wukH+tpks4jVcm9kn4P\nPM7gMQGpyn9B0s9ye1cDG7WtU09J+u0A7/2JpBk5Fh8jxfkmwHsl3ZLn+RaD57eZwF3Avvn5J4Hv\n9ZnnI/zlR2Z+cX7zADH8eeBLpPXu85L+OEgbi6zEIZed+9spmh9fRQpYgN0kTe20UUm/Aj6ddzxt\nRdpJ+D1gFLAaaXyzNW+rcv9rUlX+AWAOsBbz/xFdCfjb/GPU8jp/GfKY8e63zDNfyxxgSdLmbPt7\nOvnMVwOH5B+RyXm4p/31EyLicNIw0jLkoacB9NtfSQ9FxBukSmdSf/MsxqYDaw/w2hrAyxGxLdDa\nuXiDpH8epL3XgTskPQ0QEd8Abu1vxrxV8A95vs2AfwJuiYj1eHecv5nn2xg4PyI2JcXdeqRhiMGs\nBGzYJ85nkSpuWLg4/33b9E524l4N/H1E3AOsKenhPnF+KCnWl8/LGGiYcsD+SnohIu4lFYQ/66BP\ni6TEhD4gSQu8QwbeOULgOUlTJfUCD0bEl4DWJu50UrBPzvOvT0qc3yWN5V2Sx7I7SabTgNsl/V0/\n/ViY7r8BjGh7vlYH7/keqSLpJVdkbX3YgVRxbCtpckTsDvS7t38wEbEvMBtYJiL2kXTzgrZRsInA\nKhGxpaRH+ry2H2lfzP2kIY5OPE8agmiZk//mkYcF/ihJAJKezEdSvUHaKmjFeWv+dUmJ7GLSWPfH\n8rj73R30aRrpKK9t+r6Q99ssqL5xvmYH77mZVDkfStuwYu7DOqS43i4n+o1JW70LJCK2JBWAD5OG\npmrdT1TikEsdDgX+Mx8t0BpHPgSYkF+/ETgiv7Y58BDpx3J14MGczA8njem1gu7PpCql7+OfAjvl\nsXQiYttcUS2sB4EPR8RGEbEE6TC4QeUtl9+Rxilv6PPy6qSjKKbknWGHA8vlLZc/AyPy9zOgiFiO\nNGZ6PGlI6uI8zQBJr5N2On8nIjaAFHMRcRapUrxmsPf344fA6LZEeSxpv1BfewBX5Z35rcMgP0Xa\nPzSdFOeHRURPpCOafk1K8KsDv87JfHfSj8dAcb5Cbvc+YK1IhzUSESMj4jv5tYXxW2CpiNg5Pz+O\nwbcckfQn0pbKybx7uOX9wB+A3+R4Pjb3c0T+HEvkyn1AeX27DDiJNPx6ev6hqM1indAj4ri2cfZR\nedy9v2NkTyT9Oj8QEcqP1yAdkgWpYl03H13wPdLe+reAfwFuiIhHSQF+KfDtSMe+XwdcExEnkfa0\n7xoRD+SdtMfk9z1J2mHaN9g6ltv7Mmnn6n2kyrsTVwOPSHqtz/RbSdXVM7nfF5I2ga8DHiVVbP/b\nNhban/HAjyU9livNO0hH9Vgm6eukZHBTjtEnSFXymLYdzvOIiEl53nWA/5fjedu8Q/pIUkz9ljSc\nc1I/TZxD2jH48xznz5B25u+fX7+A9GP+PHAn6WiuKaT/u/MiYhJph+14YHyko1huAL4WEeeTxqzX\nJsXP26Qdkd/KcX4D6djthbqed95n9Vngioh4mLSOzmU+SZ0U569IeqLP9EdIFfxTpC2mm4B7SUXc\ni/mzTMlbrAP5HPCipFvy93QxaX2uTY+vh16+iOhprSgRsQVwl6SVu9wts9rkLb43gZXyFs9iYbGu\n0BcHeXNxamvTljSMMtDhbWbDVkQ8EBEH56cHk8boF5tkDq7QFwuRTp0+i/QD/iLpRKCnu9srs2rl\ngxcuJp0I9QbwWUmDngVeGid0M7NCeMjFzKwQTuhmZoXo2olFPQ/O93Cijo3c+vGqmuLZCVtU1pZ1\nV+/oQc/sq83O3FpZbE/oGezozwX1/fnPYsNCb++4fmPbFbqZWSGc0M3MCuGEbmZWCCd0M7NCOKGb\nmRWi1qNcIuIC0t1XeoF/XNzO2rIyOa6tqWqr0CNiNLCxpFGk++x9s65lmQ0Vx7U1WZ1DLruRrsOM\npCeBlVvXEzcbxhzX1lh1JvQ1mfe+iK/Q2V1EzJrMcW2NNZQ7Rbty1p5ZzRzX1hh1JvRpzFu5rE26\ndKvZcOa4tsaqM6HfRrrFFBGxFTBN0swal2c2FBzX1li1JXRJ9wAPRsQ9pCMBPl/XssyGiuPamqzW\n49Al/VOd7Zt1g+PamspnipqZFcIJ3cysEE7oZmaF6Nodi3izuqaWp7qDDEaN/p/K2po4YdfK2rLh\nY0LPvZW1dQZ7V9bWeM6rrC14o8K2rCqu0M3MCuGEbmZWCCd0M7NCOKGbmRXCCd3MrBBO6GZmhXBC\nNzMrhBO6mVkhnNDNzArhhG5mVggndDOzQjihm5kVwgndzKwQTuhmZoVwQjczK4QTuplZIZzQzcwK\n4YRuZlaI7t2CrkKPTNi+srbOHH1yZW3NGb1kZW3df9/oytoCYHZD27J5jOeMytr6Cl+srK3TfTu7\nRnKFbmZWCCd0M7NCOKGbmRXCCd3MrBBO6GZmhXBCNzMrRK2HLUbEOcBOeTlnSfpBncszGwqOa2uq\n2ir0iNgF+JCkUcBewIV1LctsqDiurcnqHHL5BXBQfvwasFxEVHemjVl3OK6tsWobcpE0B/hDfnoU\ncHOeZjZsOa6tyWo/9T8ixpICf4+6l2U2VBzX1kR17xTdEzgN2EvS63Uuy2yoOK6tqWpL6BGxInAu\nMEbSjLqWYzaUHNfWZHVW6AcDqwHfj4jWtMMkTalxmWZ1c1xbY9W5U/Qy4LK62jfrBse1NZnPFDUz\nK4QTuplZIZzQzcwK0dPb29udBU+gOwseShWeFP7DG/asrjHgq3y5sraenrNRZW3NeGH1ytrq/eBS\nPZU1tgB6esYVH9u/ZHxlbe3EryprK7mp4vaap7d3XL+x7QrdzKwQTuhmZoWY72GLEXEkcAKwAtCT\n/3oljay5b2a1cmxbaTo5Dv0U4EDghZr7YjbUHNtWlE4S+m8lqfaemA09x7YVpZOE/nJETAQmArNb\nEyWdWluvzIaGY9uK0klCvyv/mZXGsW1FGTChR8Sy+eG1Q9QXsyHh2LZSDVahPw79nvzTk6f7SAAb\nrhzbVqQBE7qkDYayI2ZDxbFtpfKJRWZmhXBCNzMrRMcJPSJWi4hV6+yMWTc4tq0UnZz6fwTwFWAG\nsEREjAC+LOm/a+6bWa0c21aaTo5DPxHYUtKrkKoZ4HbAQW/DnWPbitLJkMtUUgXT8irwTD3dMRtS\njm0rSicV+hvAwxExgfQDMAqYHBHngE+TtmHNsW1F6SSh35r/Wh6oqS9mQ82xbUXpJKFDP2fVSbqq\n4r6U58TqmvpYz6jqGgPmvrpzZW2dvUp1H/SnH6zyVnt7dTKTY3sh7MTZlbXVO3qbytoC6Hm+wjsA\nTh5XXVtDoJOE/qG2x0sB2wOTAAe9DXeObSvKfBO6pFPan0fEksB1tfXIbIg4tq00nRyHvmyfSWsB\nm9bTHbOh49i20nQy5PJ42+Ne4HXgvHq6YzakHNtWlE6GXDYAiIiVgbmSXq+9V2ZDwLFtpelkyGUM\ncDHwJ2DpiJgLHCvp7ro7Z1Ynx7aVppMhl38Ddpb0IkBErEc6NXqn+b0xIt5HOmrgTElXLEI/zerg\n2LaidHLq/9utgAeQ9Dvgzx22fzrznlpt1iSObStKJxX6sxFxMXAn6RZdu9DB9S4iYlNgc+Ani9JB\nsxo5tq0onVToxwL3AjsCO5Dukn5cB+87Dzhp4btmVjvHthWlkwr9akkHAd/ptNGIOAyYKOm5iFjo\nzpnVzLFtRekkoc+IiK8C9wNvtyZKunmQ9+wLjIyI/YB1gVkR8YKk2xept2bVcmxbUTpJ6EuTzqAb\n2zatFxgw6CUd3HocEeOAyQ54ayDHthWlkxOLjgSIiGVIY+5zJM2qu2NmdXNsW2kGTOj5prnfAD4t\nqRd4NM+/fETsJ+m+ThYgaVwVHTWrimPbSjXYUS4XA4/mgAeYKmkksCcwvvaemdXHsW1FGiyhf1DS\nOW3PXweQ9BCwXK29MquXY9uK1Mlx6ABI+ljb06Vr6ItZVzi2rRSDJfSXI+Jd9z2LiH2BybX1yKx+\njm0r0mBHuZwEXB8RjwGP5Xm3JR1729HNGq1CvxpXaXNLrLpCZW31fvuLlbUVR6uytgYJU8f2Inur\nspZ6JlxWWVsAvV/rqaytnucqvD/pJeOqa2sAA1bokp4BtgK+C8wCZgLflLSNpOm198ysJo5tK9Wg\nx6FLmgv8NP+ZFcOxbSXqeKeomZk1mxO6mVkhnNDNzArhhG5mVggndDOzQjihm5kVwgndzKwQTuhm\nZoVwQjczK4QTuplZIZzQzcwK4YRuZlYIJ3Qzs0I4oZuZFcIJ3cysEE7oZmaFGPQGF9Ygb1bb3DKv\nHVFZWz0XnlRZW72bVXf7MJ6srimr09RKW+v50nWVtdX7xQpvZzemwtvZDcAVuplZIZzQzcwK4YRu\nZlYIJ3Qzs0I4oZuZFaLWo1wi4lDgVGA28K+SflLn8syGguPamqq2Cj0iVgXOAHYE9gPG1rUss6Hi\nuLYmq7NCHwPcLmkmMBM4tsZlmQ0Vx7U1Vp0JfX1g2Yi4EVgZGCfpjhqXZzYU1sdxbQ1V507RHmBV\n4OPAEcDlEVHhaYBmXeG4tsaqM6G/BNwjabakZ0ibp++vcXlmQ8FxbY1VZ0K/Ddg1IpbIO5JGANNr\nXJ7ZUHBcW2PVltAlTQWuA+4FbgG+IGluXcszGwqOa2uyWo9Dl3QpcGmdyzAbao5rayqfKWpmVggn\ndDOzQjihm5kVwgndzKwQPb299d8Wqd8FT6A7C7ZkRHVN3bH1DpW19YueiZW1Na63tysn/PT0jHNs\nF+O0ylq6jaUra2v3AWLbFbqZWSGc0M3MCuGEbmZWCCd0M7NCOKGbmRXCCd3MrBBO6GZmhXBCNzMr\nhBO6mVkhnNDNzArhhG5mVggndDOzQjihm5kVwgndzKwQTuhmZoVwQjczK4QTuplZIZzQzcwK0bVb\n0JmZWbVcoZuZFcIJ3cysEE7oZmaFeE+3OzCQiLgA2B7oBf5R0gNd7tI7IuIcYCfS93eWpB90uUsA\nRMT7gEnAmZKu6HJ33hERhwKnArOBf5X0ky53qauaGttNjWtoZmw3Ma4bWaFHxGhgY0mjgKOAb3a5\nS++IiF2AD+W+7QVc2OUutTsdmNHtTrSLiFWBM4Adgf2Asd3tUXc1NbYbHtfQsNhualw3MqEDuwE/\nBJD0JLByRKzQ3S694xfAQfnxa8ByEbFkF/sDQERsCmwOdL1K6GMMcLukmZJelHRstzvUZU2N7UbG\nNTQ2thsZ100dclkTeLDt+St52hvd6c5fSJoD/CE/PQq4OU/rtvOA44HDu92RPtYHlo2IG4GVgXGS\n7uhul7qqkbHd4LiGZsb2+jQwrptaoffV0+0O9BURY0mBf3wD+nIYMFHSc93uSz96gFWBjwNHAJdH\nROP+P7uoUd9Fk+IaGh3bjYzrplbo00hVS8vawItd6su7RMSewGnAXpJe73Z/gH2BkRGxH7AuMCsi\nXpB0e5f7BfAScI+k2cAzETETeD/wcne71TWNje0GxjU0N7YbGddNTei3AeOBSyNiK2CapJld7hMA\nEbEicC4wRlIjdtJIOrj1OCLGAZMbEPAttwFXRMTXSJumI4Dp3e1SVzUytpsY19Do2G5kXDcyoUu6\nJyIejIh7gLnA57vdpzYHA6sB34+I1rTDJE3pXpeaS9LUiLgOuDdP+oKkud3sUzc1OLYd1wugqXHt\na7mYmRViuOwUNTOz+XBCNzMrhBO6mVkhnNDNzArhhG5mVohGHrY4nEXERsD5wBp50vPA5yTVeoxq\nRCybl7sd8GfSiQ+fk/S7Qd7zt8BvJC2uJ/nYAnBsN58r9ArlixldD5wjaTtJ25Gu2zEUV9Q7n3SS\nykclbQucDdwaEUsN8p7PAKsPQd9smHNsDw+u0Ku1OzBJ0l1t084lX68jIq4A3iZdA+KTwGXASOC9\npOsp3xYRk0mXMX0zIr5OugY0pEuarkA6/fkCSZe3FhARywN7Axu2pkm6OyLuA8ZGxIjc5sn58STg\nGOBjwBYR8QmfQGLz4dgeBlyhV2tT4LH2CZLm9rlq3QxJnwAOAf4kaTTpAj8XzaftLYADgF2Br0RE\n+//dhqTNy9l93vMwEPRD0s/y60cuTgFvC82xPQy4Qq/WXNq+04j4EbAiqfL4cJ58f/53G+BOAEnT\nImJWRKwySNsTclBPj4jfk07Tbo0P9gL9Xbu6B2jKJVBteHNsDwOu0Kv1OPDXrSeSxkrambQitL7r\nt/O/vcx76dSlSStN+7UY2scI2/+vevrM9ywQEbF0n/58BHhikDbNOuXYHgac0Kv1P8B6EbF/a0K+\not7yvLuaeADYJc+zHjBX0mukGx2slXdCbd82/6iIWDIiVsvtvdp6IV+t7yZgXNtydwA+SrrLyxvA\nWvmlHdvanKfqMhuEY3sYcEKvkKRe0g6eT0fEAxFxN2mP/P6S3uoz+zXAkhHx8/z4H/L0i0gB/ANS\nVdQyGbiWtGKd1s+V3U4ElomIRyLiftJ1rQ/KY5x3kKqcO0ljoa33TgCui4gtFu2TW+kc28ODr7Y4\nDETEEeQ9+d3ui1mVHNvVcoVuZlYIV+hmZoVwhW5mVggndDOzQjihm5kVwgndzKwQTuhmZoVwQjcz\nK8T/B194ISi0+XToAAAAAElFTkSuQmCC\n", + "image/png": "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\n4C3won+7HwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2123,7 +2123,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -2137,7 +2137,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 69297d8841..a41fb13740 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/miniconda3/envs/python3/lib/python3.5/site-packages/matplotlib/__init__.py:1401: UserWarning: This call to matplotlib.use() has no effect\n", + "/usr/lib/python3.6/site-packages/matplotlib/__init__.py:1401: 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", @@ -458,7 +458,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+ECFRULN01vixUAAAWFSURBVGje7Zs7cttADIZ9CSvX\ncrP0iCxUqbBc8Ag6xR6BhV2EvYvwFD4CCx1ABT1jMdgndpegRQnOrCbjpPlGESISC4A/gd27e8H5\n83CX3b4+iKJrRHkS4vkghMPBonRYWGwtfgD2YN+dRDUOoh6lACw0Noi9w2fESuEoAR/uVuMolX03\n9oXGT7F3eFL2iEfhUX1f4cPdL/ishs+68ai+udE4xPhexbjX2FfjGNoPj/DPNX4Tsd+EODr8FvsV\ndf1Hd9P2VvCi4+s/aXvrf+upAD+1/9GV1mkOH5X9vV6THtfvACslcaUCbESL61drBPtdI8SrFMWr\nELsXCkuFDYW75gbiP7d9Cf7bAYI/aCwUShrBvh30+lWQkzVgZ/HD4OixNCgcQpJ3BxU/Ln91elKo\nM5VEE38QtJ+Yv6cQ9xjKNYayyl8TypP8DfJnQ2H/b/N3ye9P83cT33SQv/sQh9gV7zZ/0dNj5HQa\nC5vVzv9+/WFN2w8KVaZ2BwL1+pv4g0x1QRfjq0dB4Q3kT277oP6VNL6gKxNU9a8zK+WLbi/Wwpdi\nhbboKqyxFOulHMj6v4W/AXbmUeAxrv9J/CqEBXaRKsXaodD4nsYvkT/G6H1D4SR/iPy1Roj9JsQ5\ne18/7EUHv1+Fvx/Xj5V9Ugb5K8TW4TZEEdcvoz/up0VTe9qsVIppKVX6a7D6y9ZvwEKjrtQxPtv6\nfXII9vCxKOGaIeAIfEF8IvAG8ie3vRK9rRQl+PPpSctbhfpTUCpviH+kxsZgpT91+snoX1l49KK3\niUQvICRy5aUw6l8leoVwoo3Uv1rKreF/UFLY6d9QP4L9Wf2r7EP9GOSfcsjZ56f60kz+XmVPXv+R\nuP49ff0T/53Rv6n/7m2lvXT9Wqd/VUz8hvh5M/ED6ILmt4mfHYZSaePnTWpsf/SvqV9O6dLYYClL\nEetnoH/LBLFoBvrX189uTv8++kot5vTvQD4/9jP690g9P/4z/bvo/XVG/xYoZZx+8fr3MxAtsf7t\nUOkG2JqsTtCIpgCt/qX1226KqZS7gfzJbe+c9jLrtIZ8lXD+s4umlW6AKIVrlML2/cXjgPFjlJqI\nRC+Fj0bVJe+vSh56pSdR6YkQ1ygF10Wqf0FeLta/iKn9Mv1L24ti2e+7W4n1b3T/W+L+t9H9T/Sv\nVboUmqJJon1/hZq8LnzRDlDrX1u0xRT1+6vEpomMmyYkqi95vIH8yW1PN+122KkLcNLKi/WTF01z\n/cNASrWE/l3ev6T17zX909z9X27/euK/Rf3zWP+Waf9eEv37KkWJ+rfDl6ZglNDa+cEBhwYDvkoN\nP/rX69814NaI3imq0l7OYDy/qSdDGwr7r+Y3VbzoKZr6XX2lfxfOb87qXzr+b1j/Xlp/nP6dn98M\ncdH7cn7zjPObKsYWS3Eb9w8n85smHtqQuPuZ30T2dlIT6F9xFl+n8xslegL9a4c2KRr9W4rp/GYq\numiM9Nec/j2v/yj9u1h//hv9e93vc++f63/u+rPjL3f+5Lbn1j9m/eXWf+7zh/v8+2b9e/Hzn6s/\nuPqHrb8g71n6L3f+5Lbnvn8w33+4718/+5d47//c/gO7/5E7/nPbc/tv3P4fs//I7X9y+6/fqH+v\n6j9z+9/c/ju3/8+eP+TOn9z23PkXc/7Gnf9x5483q38Xzn+582fu/Js9fy8kb/6fO39y23P3n3S8\n/S/c/Tfc/T83uX/pgv1XE/9duP+Lu/+Mvf8td/znti8kb/8ld/9nx9t/Sjw/Ltr/yt1/+337f6/b\nf0zoB3nJ/ucVc/81d/83e/957vzJbc89/8A8f8E9/5HE78XnT/4H/cs5f8Q9/8Q9f8U+/5U7f3Lb\nc88fdrzzjyvm+cuf/Uu887/c88fs88954/8vO4SjPC+2QRIAAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTctMDItMjFUMTU6MTE6NTUtMDY6MDBWxh2xAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTAyLTIx\nVDE1OjExOjU1LTA2OjAwJ5ulDQAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -537,17 +537,13 @@ "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", - "* `NuTransportXS` (`\"nu-transport\"`)\n", + "* `TransportXS` (`\"transport\"` or `\"nu-transport` with `nu` set to `True`)\n", "* `AbsorptionXS` (`\"absorption\"`)\n", "* `CaptureXS` (`\"capture\"`)\n", - "* `FissionXS` (`\"fission\"`)\n", - "* `NuFissionXS` (`\"nu-fission\"`)\n", + "* `FissionXS` (`\"fission\"` or `\"nu-fission\"` with `nu` set to `True`)\n", "* `KappaFissionXS` (`\"kappa-fission\"`)\n", - "* `ScatterXS` (`\"scatter\"`)\n", - "* `NuScatterXS` (`\"nu-scatter\"`)\n", - "* `ScatterMatrixXS` (`\"scatter matrix\"`)\n", - "* `NuScatterMatrixXS` (`\"nu-scatter matrix\"`)\n", + "* `ScatterXS` (`\"scatter\"` or `\"nu-scatter\"` with `nu` set to `True`)\n", + "* `ScatterMatrixXS` (`\"scatter matrix\"` or `\"nu-scatter matrix\"` with `nu` set to `True`)\n", "* `Chi` (`\"chi\"`)\n", "* `ChiPrompt` (`\"chi prompt\"`)\n", "* `InverseVelocity` (`\"inverse-velocity\"`)\n", @@ -743,9 +739,9 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 7ca46e809ce01fe7857ae36072822a1718f01aaf\n", - " Date/Time | 2017-02-23 09:36:51\n", - " OpenMP Threads | 4\n", + " Git SHA1 | 60a1f157dae88b62e1865a5fe3efd7ef0773a068\n", + " Date/Time | 2017-02-25 14:32:59\n", + " OpenMP Threads | 8\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -755,12 +751,12 @@ " Reading geometry XML file...\n", " Reading materials XML file...\n", " Reading cross sections XML file...\n", - " Reading U235 from /home/romano/openmc/scripts/nndc_hdf5/U235.h5\n", - " Reading U238 from /home/romano/openmc/scripts/nndc_hdf5/U238.h5\n", - " Reading O16 from /home/romano/openmc/scripts/nndc_hdf5/O16.h5\n", - " Reading H1 from /home/romano/openmc/scripts/nndc_hdf5/H1.h5\n", - " Reading B10 from /home/romano/openmc/scripts/nndc_hdf5/B10.h5\n", - " Reading Zr90 from /home/romano/openmc/scripts/nndc_hdf5/Zr90.h5\n", + " Reading U235 from /opt/xsdata/nndc/U235.h5\n", + " Reading U238 from /opt/xsdata/nndc/U238.h5\n", + " Reading O16 from /opt/xsdata/nndc/O16.h5\n", + " Reading H1 from /opt/xsdata/nndc/H1.h5\n", + " Reading B10 from /opt/xsdata/nndc/B10.h5\n", + " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", " Maximum neutron transport energy: 2.00000E+07 eV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -831,20 +827,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2238E-01 seconds\n", - " Reading cross sections = 3.1986E-01 seconds\n", - " Total time in simulation = 1.3628E+01 seconds\n", - " Time in transport only = 1.3342E+01 seconds\n", - " Time in inactive batches = 1.1012E+00 seconds\n", - " Time in active batches = 1.2527E+01 seconds\n", - " Time synchronizing fission bank = 3.7750E-03 seconds\n", - " Sampling source sites = 2.4760E-03 seconds\n", - " SEND/RECV source sites = 1.2253E-03 seconds\n", - " Time accumulating tallies = 6.5502E-04 seconds\n", - " Total time for finalization = 9.4890E-06 seconds\n", - " Total time elapsed = 1.4059E+01 seconds\n", - " Calculation Rate (inactive) = 22702.0 neutrons/second\n", - " Calculation Rate (active) = 7982.70 neutrons/second\n", + " Total time for initialization = 3.4863E-01 seconds\n", + " Reading cross sections = 2.6337E-01 seconds\n", + " Total time in simulation = 6.2906E+00 seconds\n", + " Time in transport only = 6.0984E+00 seconds\n", + " Time in inactive batches = 5.0785E-01 seconds\n", + " Time in active batches = 5.7827E+00 seconds\n", + " Time synchronizing fission bank = 2.6573E-03 seconds\n", + " Sampling source sites = 1.9038E-03 seconds\n", + " SEND/RECV source sites = 7.1726E-04 seconds\n", + " Time accumulating tallies = 2.9242E-04 seconds\n", + " Total time for finalization = 7.4980E-06 seconds\n", + " Total time elapsed = 6.6484E+00 seconds\n", + " Calculation Rate (inactive) = 49227.5 neutrons/second\n", + " Calculation Rate (active) = 17292.9 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -971,7 +967,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1108,7 +1104,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1506: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1506: RuntimeWarning: invalid value encountered in true_divide\n", " data = self.std_dev[indices] / self.mean[indices]\n" ] } @@ -1135,11 +1131,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1213,7 +1209,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" ] }, @@ -1326,11 +1322,11 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1835: RuntimeWarning: invalid value encountered in true_divide\n", " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1836: RuntimeWarning: invalid value encountered in true_divide\n", " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", + "/home/nelsonag/git/openmc/openmc/tallies.py:1837: RuntimeWarning: invalid value encountered in true_divide\n", " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" ] } @@ -1627,7 +1623,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 43, @@ -1636,9 +1632,9 @@ }, { "data": { - "image/png": "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\nRU5ErkJggg==\n", + "image/png": "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\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1665,7 +1661,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -1679,7 +1675,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.0" } }, "nbformat": 4, diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 33bdeb83aa..284be6ca3a 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -149,6 +149,8 @@ class MGXS(object): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + nu : bool + If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -230,6 +232,7 @@ class MGXS(object): self._derived = False self._hdf5_key = None self._valid_estimators = ESTIMATOR_TYPES + self._nu = False self.name = name self.by_nuclide = by_nuclide @@ -408,6 +411,10 @@ class MGXS(object): def rxn_type(self): return self._rxn_type + @property + def nu(self): + return self._nu + @property def by_nuclide(self): return self._by_nuclide @@ -573,6 +580,11 @@ class MGXS(object): cv.check_type('name', name, string_types) self._name = name + @nu.setter + def nu(self, nu): + cv.check_type('nu', nu, bool) + self._nu = nu + @by_nuclide.setter def by_nuclide(self, by_nuclide): cv.check_type('by_nuclide', by_nuclide, bool) @@ -704,7 +716,7 @@ class MGXS(object): elif mgxs_type == 'transport': mgxs = TransportXS(domain, domain_type, energy_groups) elif mgxs_type == 'nu-transport': - mgxs = NuTransportXS(domain, domain_type, energy_groups) + mgxs = TransportXS(domain, domain_type, energy_groups, nu=True) elif mgxs_type == 'absorption': mgxs = AbsorptionXS(domain, domain_type, energy_groups) elif mgxs_type == 'capture': @@ -712,17 +724,17 @@ class MGXS(object): elif mgxs_type == 'fission': mgxs = FissionXS(domain, domain_type, energy_groups) elif mgxs_type == 'nu-fission': - mgxs = NuFissionXS(domain, domain_type, energy_groups) + mgxs = FissionXS(domain, domain_type, energy_groups, nu=True) elif mgxs_type == 'kappa-fission': mgxs = KappaFissionXS(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) + mgxs = ScatterXS(domain, domain_type, energy_groups, nu=True) 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) + mgxs = ScatterMatrixXS(domain, domain_type, energy_groups, nu=True) elif mgxs_type == 'multiplicity matrix': mgxs = MultiplicityMatrixXS(domain, domain_type, energy_groups) elif mgxs_type == 'nu-fission matrix': @@ -2001,6 +2013,8 @@ class MatrixMGXS(MGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + nu : bool + If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -2555,9 +2569,8 @@ class TotalXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(TotalXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -2607,6 +2620,9 @@ class TransportXS(MGXS): The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation + nu : bool + If True, the cross section data will include neutron multiplication; + defaults to True. by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -2625,6 +2641,8 @@ class TransportXS(MGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + nu : bool + If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -2685,19 +2703,32 @@ class TransportXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, nu=False, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(TransportXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) - self._rxn_type = 'transport' + if not nu: + self._rxn_type = 'transport' + else: + self._rxn_type = 'nu-transport' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.nu = nu @property def scores(self): - return ['flux', 'total', 'scatter-1'] + if not self.nu: + return ['flux', 'total', 'scatter-1'] + else: + return ['flux', 'total', 'nu-scatter-1'] + + @property + def tally_keys(self): + if not self.nu: + return super(TransportXS, self).tally_keys + else: + return ['flux', 'total', 'scatter-1'] @property def filters(self): @@ -2724,131 +2755,6 @@ class TransportXS(MGXS): return self._rxn_rate_tally -class NuTransportXS(TransportXS): - r"""A transport-corrected total multi-group cross section which - accounts for neutron multiplicity in scattering reactions. - - 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:`NuTransportXS.energy_groups` and - :attr:`NuTransportXS.domain` properties. Tallies for the flux and - appropriate reaction rates over the specified domain are generated - automatically via the :attr:`NuTransportXS.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:`NuTransportXS.xs_tally` property. - - The calculation of the transport-corrected cross section is the same as that - for :class:`TransportXS` except that the scattering multiplicity is - accounted for. - - 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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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 : '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:`NuTransportXS.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., '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 - - """ - - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): - super(NuTransportXS, self).__init__(domain, domain_type, - groups, by_nuclide, name, - num_polar, num_azimuthal) - self._rxn_type = 'nu-transport' - - @property - def scores(self): - return ['flux', 'total', 'nu-scatter-1'] - - @property - def tally_keys(self): - return ['flux', 'total', 'scatter-1'] - - class AbsorptionXS(MGXS): r"""An absorption multi-group cross section. @@ -2966,9 +2872,8 @@ class AbsorptionXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(AbsorptionXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -3094,9 +2999,8 @@ class CaptureXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(CaptureXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -3150,6 +3054,9 @@ class FissionXS(MGXS): The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation + nu : bool + If True, the cross section data will include neutron multiplication; + defaults to False by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -3168,6 +3075,8 @@ class FissionXS(MGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + nu : bool + If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -3228,136 +3137,15 @@ class FissionXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, nu=False, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(FissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) - self._rxn_type = 'fission' - - -class NuFissionXS(MGXS): - r"""A fission neutron production 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:`NuFissionXS.energy_groups` and :attr:`NuFissionXS.domain` - properties. Tallies for the flux and appropriate reaction rates over the - specified domain are generated automatically via the - :attr:`NuFissionXS.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:`NuFissionXS.xs_tally` property. - - For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the - fission neutron production cross section is calculated as: - - .. math:: - - \frac{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; - \nu\sigma_f (r, E) \psi (r, E, \Omega)}{\int_{r \in V} dr \int_{4\pi} - d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. - - - 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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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:`NuFissionXS.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., '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 - - """ - - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): - super(NuFissionXS, self).__init__(domain, domain_type, - groups, by_nuclide, name, num_polar, - num_azimuthal) - self._rxn_type = 'nu-fission' + if not nu: + self._rxn_type = 'fission' + else: + self._rxn_type = 'nu-fission' class KappaFissionXS(MGXS): @@ -3479,9 +3267,8 @@ class KappaFissionXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(KappaFissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -3526,6 +3313,9 @@ class ScatterXS(MGXS): The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation + nu : bool + If True, the cross section data will include neutron multiplication; + defaults to False by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -3544,6 +3334,8 @@ class ScatterXS(MGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + nu : bool + If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -3604,142 +3396,21 @@ class ScatterXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, nu=False, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(ScatterXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) - self._rxn_type = 'scatter' + if not nu: + self._rxn_type = 'scatter' + else: + self._rxn_type = 'nu-scatter' + # Only analog estimators are valid so change from the defaults + # to reflect this + self._estimator = 'analog' + self._valid_estimators = ['analog'] - -class NuScatterXS(MGXS): - r"""A scattering neutron production multi-group cross section. - - The neutron production from scattering is defined as the average number of - neutrons produced from all neutron-producing reactions except for fission. - - 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:`NuScatterXS.energy_groups` and - :attr:`NuScatterXS.domain` properties. Tallies for the flux and appropriate - reaction rates over the specified domain are generated automatically via the - :attr:`NuScatterXS.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:`NuScatterXS.xs_tally` property. - - For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the - scattering neutron production cross section is calculated as: - - .. math:: - - \frac{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; - \sum_i \upsilon_i \sigma_i (r, E) \psi (r, E, \Omega)}{\int_{r \in V} dr - \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. - - where :math:`\upsilon_i` is the multiplicity of the :math:`i`-th scattering - reaction. - - 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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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 : '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:`NuScatterXS.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., '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 - - """ - - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): - super(NuScatterXS, self).__init__(domain, domain_type, - groups, by_nuclide, name, num_polar, - num_azimuthal) - self._rxn_type = 'nu-scatter' - self._estimator = 'analog' - self._valid_estimators = ['analog'] + self.nu = nu class ScatterMatrixXS(MatrixMGXS): @@ -3793,6 +3464,9 @@ class ScatterMatrixXS(MatrixMGXS): The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation + nu : bool + If True, the cross section data will include neutron multiplication; + defaults to False by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -3824,6 +3498,8 @@ class ScatterMatrixXS(MatrixMGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + nu : bool + If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -3884,20 +3560,24 @@ class ScatterMatrixXS(MatrixMGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, nu=False, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(ScatterMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_azimuthal) - self._rxn_type = 'scatter' + if not nu: + self._rxn_type = 'scatter' + self._hdf5_key = 'scatter matrix' + else: + self._rxn_type = 'nu-scatter' + self._hdf5_key = 'nu-scatter matrix' self._correction = 'P0' self._scatter_format = 'legendre' self._legendre_order = 0 self._histogram_bins = 16 - self._hdf5_key = 'scatter matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.nu = nu def __deepcopy__(self, memo): clone = super(ScatterMatrixXS, self).__deepcopy__(memo) @@ -4601,128 +4281,6 @@ class ScatterMatrixXS(MatrixMGXS): print(string) -class NuScatterMatrixXS(ScatterMatrixXS): - """A scattering production matrix multi-group cross section for one or - more Legendre moments. - - 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:`NuScatterMatrixXS.energy_groups` and - :attr:`NuScatterMatrixXS.domain` properties. Tallies for the flux and - appropriate reaction rates over the specified domain are generated - automatically via the :attr:`NuScatterMatrixXS.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:`NuScatterMatrixXS.xs_tally` property. - - The calculation of the scattering-production matrix is the same as that for - :class:`ScatterMatrixXS` except that the scattering multiplicity is - accounted for. - - 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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - Attributes - ---------- - correction : 'P0' or None - Apply the P0 correction to scattering matrices if set to 'P0' - legendre_order : int - The highest legendre moment in the scattering matrix (default is 0) - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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 : '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:`NuScatterMatrixXS.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., '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 - - """ - - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): - super(NuScatterMatrixXS, self).__init__(domain, domain_type, - groups, by_nuclide, name, - num_polar, num_azimuthal) - self._rxn_type = 'nu-scatter' - self._hdf5_key = 'nu-scatter matrix' - - class MultiplicityMatrixXS(MatrixMGXS): r"""The scattering multiplicity matrix. @@ -4847,15 +4405,15 @@ class MultiplicityMatrixXS(MatrixMGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(MultiplicityMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) self._rxn_type = 'multiplicity matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.nu = True @property def scores(self): @@ -5009,9 +4567,8 @@ class NuFissionMatrixXS(MatrixMGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(NuFissionMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -5019,6 +4576,7 @@ class NuFissionMatrixXS(MatrixMGXS): self._hdf5_key = 'nu-fission matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.nu = True class Chi(MGXS): @@ -5138,14 +4696,14 @@ class Chi(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) self._rxn_type = 'chi' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.nu = True @property def _dont_squeeze(self): @@ -5691,9 +5249,8 @@ class ChiPrompt(Chi): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(ChiPrompt, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -5820,9 +5377,8 @@ class InverseVelocity(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(InverseVelocity, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -5850,8 +5406,8 @@ class InverseVelocity(MGXS): if xs_type == 'macro': return 'second/cm' else: - raise ValueError('Unable to return the units of InverseVelocity for' - ' xs_type other than "macro"') + raise ValueError('Unable to return the units of InverseVelocity' + ' for xs_type other than "macro"') class PromptNuFissionXS(MGXS): @@ -5966,13 +5522,13 @@ class PromptNuFissionXS(MGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(PromptNuFissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) self._rxn_type = 'prompt-nu-fission' + self.nu = True class PromptNuFissionMatrixXS(MatrixMGXS): @@ -6092,9 +5648,8 @@ class PromptNuFissionMatrixXS(MatrixMGXS): """ - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', num_polar=1, - num_azimuthal=1): + def __init__(self, domain=None, domain_type=None, groups=None, + by_nuclide=False, name='', num_polar=1, num_azimuthal=1): super(PromptNuFissionMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) @@ -6102,3 +5657,4 @@ class PromptNuFissionMatrixXS(MatrixMGXS): self._hdf5_key = 'prompt-nu-fission matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.nu = True From c40a1ca2fd3ed4d9fbc5b23563516a436bd90c7a Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 25 Feb 2017 14:54:03 -0500 Subject: [PATCH 58/66] whoops, missed some old Nu* references --- openmc/mgxs_library.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index af6dc8f98c..d1a46df09a 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1074,12 +1074,12 @@ class XSdata(object): def set_nu_fission_mgxs(self, nu_fission, temperature=294., nuclide='total', xs_type='macro', subdomain=None): - """This method allows for an openmc.mgxs.NuFissionXS + """This method allows for an openmc.mgxs.FissionXS to be used to set the nu-fission cross section for this XSdata object. Parameters ---------- - nu_fission: openmc.mgxs.NuFissionXS + nu_fission: openmc.mgxs.FissionXS MGXS Object containing the nu-fission cross section for the domain of interest. temperature : float @@ -1102,8 +1102,9 @@ class XSdata(object): """ - check_type('nu_fission', nu_fission, (openmc.mgxs.NuFissionXS, + check_type('nu_fission', nu_fission, (openmc.mgxs.FissionXS, openmc.mgxs.NuFissionMatrixXS)) + check_value('nu', nu_fission.nu, [True]) check_value('energy_groups', nu_fission.energy_groups, [self.energy_groups]) check_value('domain_type', nu_fission.domain_type, @@ -1598,8 +1599,9 @@ class XSdata(object): """ - check_type('nuscatter', nuscatter, (openmc.mgxs.NuScatterMatrixXS, + check_type('nuscatter', nuscatter, (openmc.mgxs.ScatterMatrixXS, openmc.mgxs.MultiplicityMatrixXS)) + check_value('nu', nuscatter.nu, [True]) check_value('energy_groups', nuscatter.energy_groups, [self.energy_groups]) check_value('domain_type', nuscatter.domain_type, From 5e313cf5f1d601074ad95c17ae589bf564972adb Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 05:33:32 -0500 Subject: [PATCH 59/66] Revisions per @wbinventors comments --- docs/source/pythonapi/examples/mgxs-part-i.ipynb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index 2b3d5a77c0..17d64ee2d7 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -380,7 +380,9 @@ "* `InverseVelocity`\n", "* `PromptNuFissionXS`\n", "\n", - "Of course, we know that the transport (`TransportXS`), fission (`FissionXS`), scattering (`ScatterXS`), and scattering-matrix (`ScatterMatrixXS`) cross sections can potentially incorporate neutron multiplication ($\\nu$). For these types, the multpiplication can be accomodated by setting the `nu` parameter to `True` as shown below.\n", + "Of course, we are aware that the fission cross section (`FissionXS`) can sometimes be paired with the fission neutron multiplication to become $\\nu\\sigma_f$. This can be accomodated in to the `FissionXS` class by setting the `nu` parameter to `True` as shown below.\n", + "\n", + "Additionally, scattering reactions (like (n,2n)) can also be defined to take in to account the neutron multiplication to become $\\nu\\sigma_s$. This can be accomodated in the the transport (`TransportXS`), scattering (`ScatterXS`), and scattering-matrix (`ScatterMatrixXS`) cross sections types by setting the `nu` parameter to `True` as shown below.\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." ] From 14f6185744399413eaef85503b4ae5fc256262c6 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 05:39:20 -0500 Subject: [PATCH 60/66] resolved @wbinventor comments on the mesh and executor --- openmc/executor.py | 6 +++--- openmc/mesh.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openmc/executor.py b/openmc/executor.py index efc28a0b98..6f7e223110 100644 --- a/openmc/executor.py +++ b/openmc/executor.py @@ -5,7 +5,7 @@ import sys from six import string_types -summary_indicator = "TIMING STATISTICS" +_summary_indicator = "TIMING STATISTICS" def _run(command, output, cwd): @@ -25,7 +25,7 @@ def _run(command, output, cwd): if output == 'full': # If user requested output, print to screen print(line, end='') - elif output == 'summary' and summary_indicator in line: + elif output == 'summary' and _summary_indicator in line: # If they requested a summary, look for the start of the summary storage_flag = True @@ -56,7 +56,7 @@ def plot_geometry(output=True, openmc_exec='openmc', cwd='.'): def run(particles=None, threads=None, geometry_debug=False, - restart_file=None, tracks=False, output="full", cwd='.', + restart_file=None, tracks=False, output='full', cwd='.', openmc_exec='openmc', mpi_args=None): """Run an OpenMC simulation. diff --git a/openmc/mesh.py b/openmc/mesh.py index 4d97262924..6e3f2a2665 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -188,8 +188,8 @@ class Mesh(EqualityMixin): return mesh def cell_generator(self): - """Generator function to traverse through every [i,j,k] index - of the mesh in the same order that would be done by the Fortran + """Generator function to traverse through every [i,j,k] index of the + mesh For example the following code: @@ -202,8 +202,8 @@ class Mesh(EqualityMixin): [1, 1, 1] [2, 1, 1] - [1, 1, 2] [1, 2, 1] + [2, 2, 1] ... From 413e04c5cf36d1d424e0d4fb4912a6ae18ab0054 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 06:19:40 -0500 Subject: [PATCH 61/66] Added a bit more documentation for nu, merged the Prompt* MGXS types with their total counterparts using the same method used for nu, and udpated mdgxs-part-i. --- .../pythonapi/examples/mdgxs-part-i.ipynb | 227 ++++----- openmc/mgxs/mgxs.py | 481 ++++-------------- 2 files changed, 201 insertions(+), 507 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index f7582fcbe6..05366758a1 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -365,20 +365,15 @@ "\n", "* `TotalXS`\n", "* `TransportXS`\n", - "* `NuTransportXS`\n", "* `AbsorptionXS`\n", "* `CaptureXS`\n", "* `FissionXS`\n", - "* `NuFissionXS`\n", + "* `NuFissionMatrixXS`\n", "* `KappaFissionXS`\n", "* `ScatterXS`\n", - "* `NuScatterXS`\n", "* `ScatterMatrixXS`\n", - "* `NuScatterMatrixXS`\n", "* `Chi`\n", - "* `ChiPrompt`\n", "* `InverseVelocity`\n", - "* `PromptNuFissionXS`\n", "\n", "A separate abstract `MDGXS` class is used for cross-sections and parameters that involve delayed neutrons. The subclasses of `MDGXS` include:\n", "\n", @@ -387,7 +382,11 @@ "* `Beta`\n", "* `DecayRate`\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 chi-prompt, chi-delayed, and prompt-nu-fission cross sections with our 100-energy-group structure and multi-group delayed-nu-fission and beta cross sections with our 100-energy-group and 6-delayed-group structures. " + "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. \n", + "\n", + "In this case, let's create the multi-group chi-prompt, chi-delayed, and prompt-nu-fission cross sections with our 100-energy-group structure and multi-group delayed-nu-fission and beta cross sections with our 100-energy-group and 6-delayed-group structures. \n", + "\n", + "The prompt chi and nu-fission data can actually be gathered using the `Chi` and `FissionXS` classes, respectively, but passing in a value of `True` for the optional `prompt` parameter upon initialization." ] }, { @@ -399,8 +398,8 @@ "outputs": [], "source": [ "# Instantiate a few different sections\n", - "chi_prompt = mgxs.ChiPrompt(domain=cell, groups=energy_groups, by_nuclide=True)\n", - "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=energy_groups, by_nuclide=True)\n", + "chi_prompt = mgxs.Chi(domain=cell, groups=energy_groups, by_nuclide=True, prompt=True)\n", + "prompt_nu_fission = mgxs.FissionXS(domain=cell, groups=energy_groups, by_nuclide=True, nu=True, prompt=True)\n", "chi_delayed = mgxs.ChiDelayed(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", "beta = mgxs.Beta(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", @@ -542,8 +541,8 @@ " Copyright | 2011-2017 Massachusetts Institute of Technology\n", " License | http://openmc.readthedocs.io/en/latest/license.html\n", " Version | 0.8.0\n", - " Git SHA1 | 6e3f6bf8b11cb3f6f171f1c351ddcaf85dd515ec\n", - " Date/Time | 2017-02-11 14:15:38\n", + " Git SHA1 | 5e313cf5f1d601074ad95c17ae589bf564972adb\n", + " Date/Time | 2017-02-26 06:05:10\n", " OpenMP Threads | 8\n", "\n", " ===========================================================================\n", @@ -617,10 +616,10 @@ " 44/1 1.24424 1.23133 +/- 0.00389\n", " 45/1 1.24767 1.23179 +/- 0.00381\n", " 46/1 1.22998 1.23174 +/- 0.00370\n", - " 47/1 1.26352 1.23260 +/- 0.00370\n", - " 48/1 1.23155 1.23257 +/- 0.00360\n", - " 49/1 1.22059 1.23227 +/- 0.00352\n", - " 50/1 1.24724 1.23264 +/- 0.00345\n", + " 47/1 1.26195 1.23256 +/- 0.00369\n", + " 48/1 1.23146 1.23253 +/- 0.00359\n", + " 49/1 1.22059 1.23222 +/- 0.00351\n", + " 50/1 1.24724 1.23260 +/- 0.00345\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -630,27 +629,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1132E-01 seconds\n", - " Reading cross sections = 3.2075E-01 seconds\n", - " Total time in simulation = 1.3772E+01 seconds\n", - " Time in transport only = 1.2971E+01 seconds\n", - " Time in inactive batches = 6.3146E-01 seconds\n", - " Time in active batches = 1.3140E+01 seconds\n", - " Time synchronizing fission bank = 5.4819E-03 seconds\n", - " Sampling source sites = 3.8838E-03 seconds\n", - " SEND/RECV source sites = 1.5557E-03 seconds\n", - " Time accumulating tallies = 5.3270E-04 seconds\n", - " Total time for finalization = 4.9668E-02 seconds\n", - " Total time elapsed = 1.4246E+01 seconds\n", - " Calculation Rate (inactive) = 79181.7 neutrons/second\n", - " Calculation Rate (active) = 15220.4 neutrons/second\n", + " Total time for initialization = 3.8846E-01 seconds\n", + " Reading cross sections = 3.0221E-01 seconds\n", + " Total time in simulation = 1.2666E+01 seconds\n", + " Time in transport only = 1.2196E+01 seconds\n", + " Time in inactive batches = 5.1652E-01 seconds\n", + " Time in active batches = 1.2150E+01 seconds\n", + " Time synchronizing fission bank = 5.1914E-03 seconds\n", + " Sampling source sites = 3.6297E-03 seconds\n", + " SEND/RECV source sites = 1.5222E-03 seconds\n", + " Time accumulating tallies = 5.2027E-04 seconds\n", + " Total time for finalization = 4.8293E-02 seconds\n", + " Total time elapsed = 1.3117E+01 seconds\n", + " Calculation Rate (inactive) = 96801.2 neutrons/second\n", + " Calculation Rate (active) = 16461.5 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.23260 +/- 0.00309\n", - " k-effective (Track-length) = 1.23264 +/- 0.00345\n", + " k-effective (Collision) = 1.23256 +/- 0.00308\n", + " k-effective (Track-length) = 1.23260 +/- 0.00345\n", " k-effective (Absorption) = 1.23111 +/- 0.00186\n", - " Combined k-effective = 1.23135 +/- 0.00185\n", + " Combined k-effective = 1.23135 +/- 0.00184\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -759,17 +758,17 @@ { "data": { "text/plain": [ - "array([[[ 5.14239169e-06, 1.16429778e-06]],\n", + "array([[[ 5.14223507e-06, 1.16426087e-06]],\n", "\n", - " [[ 2.65434434e-05, 7.58244504e-06]],\n", + " [[ 2.65426350e-05, 7.58220468e-06]],\n", "\n", - " [[ 2.53406770e-05, 5.73814391e-06]],\n", + " [[ 2.53399053e-05, 5.73796202e-06]],\n", "\n", - " [[ 5.68158884e-05, 1.04761254e-05]],\n", + " [[ 5.68141581e-05, 1.04757933e-05]],\n", "\n", - " [[ 2.32937121e-05, 5.45676114e-06]],\n", + " [[ 2.32930026e-05, 5.45658817e-06]],\n", "\n", - " [[ 9.75765501e-06, 1.65156185e-06]]])" + " [[ 9.75735783e-06, 1.65150949e-06]]])" ] }, "execution_count": 18, @@ -819,8 +818,8 @@ " 1\n", " 1\n", " U235\n", - " 9.533842e-11\n", - " 4.789050e-11\n", + " 9.534320e-11\n", + " 4.789291e-11\n", " \n", " \n", " 199\n", @@ -828,8 +827,8 @@ " 1\n", " 1\n", " Pu239\n", - " 1.606499e-11\n", - " 8.071081e-12\n", + " 1.606580e-11\n", + " 8.071486e-12\n", " \n", " \n", " 398\n", @@ -837,8 +836,8 @@ " 2\n", " 1\n", " U235\n", - " 1.224131e-09\n", - " 6.149449e-10\n", + " 1.224152e-09\n", + " 6.149552e-10\n", " \n", " \n", " 399\n", @@ -846,8 +845,8 @@ " 2\n", " 1\n", " Pu239\n", - " 2.602518e-10\n", - " 1.307590e-10\n", + " 2.602562e-10\n", + " 1.307612e-10\n", " \n", " \n", " 598\n", @@ -855,8 +854,8 @@ " 3\n", " 1\n", " U235\n", - " 9.033000e-10\n", - " 4.537601e-10\n", + " 9.032969e-10\n", + " 4.537585e-10\n", " \n", " \n", " 599\n", @@ -864,8 +863,8 @@ " 3\n", " 1\n", " Pu239\n", - " 1.522295e-10\n", - " 7.648264e-11\n", + " 1.522290e-10\n", + " 7.648238e-11\n", " \n", " \n", " 798\n", @@ -873,8 +872,8 @@ " 4\n", " 1\n", " U235\n", - " 1.749138e-09\n", - " 8.786432e-10\n", + " 1.749268e-09\n", + " 8.787082e-10\n", " \n", " \n", " 799\n", @@ -882,8 +881,8 @@ " 4\n", " 1\n", " Pu239\n", - " 2.400317e-10\n", - " 1.205943e-10\n", + " 2.400495e-10\n", + " 1.206032e-10\n", " \n", " \n", " 998\n", @@ -909,14 +908,14 @@ ], "text/plain": [ " cell delayedgroup group in nuclide mean std. dev.\n", - "198 1 1 1 U235 9.533842e-11 4.789050e-11\n", - "199 1 1 1 Pu239 1.606499e-11 8.071081e-12\n", - "398 1 2 1 U235 1.224131e-09 6.149449e-10\n", - "399 1 2 1 Pu239 2.602518e-10 1.307590e-10\n", - "598 1 3 1 U235 9.033000e-10 4.537601e-10\n", - "599 1 3 1 Pu239 1.522295e-10 7.648264e-11\n", - "798 1 4 1 U235 1.749138e-09 8.786432e-10\n", - "799 1 4 1 Pu239 2.400317e-10 1.205943e-10\n", + "198 1 1 1 U235 9.534320e-11 4.789291e-11\n", + "199 1 1 1 Pu239 1.606580e-11 8.071486e-12\n", + "398 1 2 1 U235 1.224152e-09 6.149552e-10\n", + "399 1 2 1 Pu239 2.602562e-10 1.307612e-10\n", + "598 1 3 1 U235 9.032969e-10 4.537585e-10\n", + "599 1 3 1 Pu239 1.522290e-10 7.648238e-11\n", + "798 1 4 1 U235 1.749268e-09 8.787082e-10\n", + "799 1 4 1 Pu239 2.400495e-10 1.206032e-10\n", "998 1 5 1 U235 2.724017e-10 1.368376e-10\n", "999 1 5 1 Pu239 4.749191e-11 2.386080e-11" ] @@ -998,7 +997,7 @@ " 1\n", " U235\n", " 0.120780\n", - " 0.000551\n", + " 0.000549\n", " \n", " \n", " 5\n", @@ -1007,7 +1006,7 @@ " 1\n", " Pu239\n", " 0.113370\n", - " 0.000452\n", + " 0.000451\n", " \n", " \n", " 6\n", @@ -1016,7 +1015,7 @@ " 1\n", " U235\n", " 0.302780\n", - " 0.001381\n", + " 0.001378\n", " \n", " \n", " 7\n", @@ -1025,7 +1024,7 @@ " 1\n", " Pu239\n", " 0.292500\n", - " 0.001166\n", + " 0.001163\n", " \n", " \n", " 8\n", @@ -1034,7 +1033,7 @@ " 1\n", " U235\n", " 0.849490\n", - " 0.003875\n", + " 0.003865\n", " \n", " \n", " 9\n", @@ -1043,7 +1042,7 @@ " 1\n", " Pu239\n", " 0.857490\n", - " 0.003419\n", + " 0.003411\n", " \n", " \n", " 10\n", @@ -1052,7 +1051,7 @@ " 1\n", " U235\n", " 2.853000\n", - " 0.013013\n", + " 0.012980\n", " \n", " \n", " 11\n", @@ -1061,7 +1060,7 @@ " 1\n", " Pu239\n", " 2.729700\n", - " 0.010884\n", + " 0.010858\n", " \n", " \n", "\n", @@ -1073,14 +1072,14 @@ "1 1 1 1 Pu239 0.013271 0.000053\n", "2 1 2 1 U235 0.032739 0.000149\n", "3 1 2 1 Pu239 0.030881 0.000123\n", - "4 1 3 1 U235 0.120780 0.000551\n", - "5 1 3 1 Pu239 0.113370 0.000452\n", - "6 1 4 1 U235 0.302780 0.001381\n", - "7 1 4 1 Pu239 0.292500 0.001166\n", - "8 1 5 1 U235 0.849490 0.003875\n", - "9 1 5 1 Pu239 0.857490 0.003419\n", - "10 1 6 1 U235 2.853000 0.013013\n", - "11 1 6 1 Pu239 2.729700 0.010884" + "4 1 3 1 U235 0.120780 0.000549\n", + "5 1 3 1 Pu239 0.113370 0.000451\n", + "6 1 4 1 U235 0.302780 0.001378\n", + "7 1 4 1 Pu239 0.292500 0.001163\n", + "8 1 5 1 U235 0.849490 0.003865\n", + "9 1 5 1 Pu239 0.857490 0.003411\n", + "10 1 6 1 U235 2.853000 0.012980\n", + "11 1 6 1 Pu239 2.729700 0.010858" ] }, "execution_count": 20, @@ -1169,7 +1168,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 23, @@ -1180,7 +1179,7 @@ "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1251,8 +1250,8 @@ " 1\n", " U235\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 8.779406e-08\n", - " 4.667924e-10\n", + " 8.779139e-08\n", + " 4.658590e-10\n", " \n", " \n", " 1\n", @@ -1260,8 +1259,8 @@ " 1\n", " Pu239\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 7.150041e-09\n", - " 3.565013e-11\n", + " 7.149814e-09\n", + " 3.559010e-11\n", " \n", " \n", " 2\n", @@ -1269,8 +1268,8 @@ " 2\n", " U235\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 9.528171e-07\n", - " 5.066035e-09\n", + " 9.527880e-07\n", + " 5.055905e-09\n", " \n", " \n", " 3\n", @@ -1278,8 +1277,8 @@ " 2\n", " Pu239\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.303200e-07\n", - " 6.497762e-10\n", + " 1.303159e-07\n", + " 6.486820e-10\n", " \n", " \n", " 4\n", @@ -1287,8 +1286,8 @@ " 3\n", " U235\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 2.353975e-07\n", - " 1.251585e-09\n", + " 2.353903e-07\n", + " 1.249083e-09\n", " \n", " \n", " 5\n", @@ -1296,8 +1295,8 @@ " 3\n", " Pu239\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 2.032960e-08\n", - " 1.013634e-10\n", + " 2.032895e-08\n", + " 1.011928e-10\n", " \n", " \n", " 6\n", @@ -1305,8 +1304,8 @@ " 4\n", " U235\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 4.720335e-07\n", - " 2.509756e-09\n", + " 4.720191e-07\n", + " 2.504737e-09\n", " \n", " \n", " 7\n", @@ -1314,8 +1313,8 @@ " 4\n", " Pu239\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 2.626392e-08\n", - " 1.309520e-10\n", + " 2.626309e-08\n", + " 1.307315e-10\n", " \n", " \n", " 8\n", @@ -1323,8 +1322,8 @@ " 5\n", " U235\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 2.828001e-08\n", - " 1.503620e-10\n", + " 2.827915e-08\n", + " 1.500614e-10\n", " \n", " \n", " 9\n", @@ -1332,8 +1331,8 @@ " 5\n", " Pu239\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 2.430664e-09\n", - " 1.211930e-11\n", + " 2.430587e-09\n", + " 1.209889e-11\n", " \n", " \n", " 10\n", @@ -1341,8 +1340,8 @@ " 6\n", " U235\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.477575e-09\n", - " 7.856122e-12\n", + " 1.477530e-09\n", + " 7.840413e-12\n", " \n", " \n", " 11\n", @@ -1350,8 +1349,8 @@ " 6\n", " Pu239\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 6.994534e-11\n", - " 3.487477e-13\n", + " 6.994312e-11\n", + " 3.481605e-13\n", " \n", " \n", "\n", @@ -1373,18 +1372,18 @@ "11 1 6 Pu239 \n", "\n", " score mean std. dev. \n", - "0 (((delayed-nu-fission / nu-fission) * (delayed... 8.78e-08 4.67e-10 \n", - "1 (((delayed-nu-fission / nu-fission) * (delayed... 7.15e-09 3.57e-11 \n", - "2 (((delayed-nu-fission / nu-fission) * (delayed... 9.53e-07 5.07e-09 \n", - "3 (((delayed-nu-fission / nu-fission) * (delayed... 1.30e-07 6.50e-10 \n", + "0 (((delayed-nu-fission / nu-fission) * (delayed... 8.78e-08 4.66e-10 \n", + "1 (((delayed-nu-fission / nu-fission) * (delayed... 7.15e-09 3.56e-11 \n", + "2 (((delayed-nu-fission / nu-fission) * (delayed... 9.53e-07 5.06e-09 \n", + "3 (((delayed-nu-fission / nu-fission) * (delayed... 1.30e-07 6.49e-10 \n", "4 (((delayed-nu-fission / nu-fission) * (delayed... 2.35e-07 1.25e-09 \n", "5 (((delayed-nu-fission / nu-fission) * (delayed... 2.03e-08 1.01e-10 \n", - "6 (((delayed-nu-fission / nu-fission) * (delayed... 4.72e-07 2.51e-09 \n", + "6 (((delayed-nu-fission / nu-fission) * (delayed... 4.72e-07 2.50e-09 \n", "7 (((delayed-nu-fission / nu-fission) * (delayed... 2.63e-08 1.31e-10 \n", "8 (((delayed-nu-fission / nu-fission) * (delayed... 2.83e-08 1.50e-10 \n", "9 (((delayed-nu-fission / nu-fission) * (delayed... 2.43e-09 1.21e-11 \n", - "10 (((delayed-nu-fission / nu-fission) * (delayed... 1.48e-09 7.86e-12 \n", - "11 (((delayed-nu-fission / nu-fission) * (delayed... 6.99e-11 3.49e-13 " + "10 (((delayed-nu-fission / nu-fission) * (delayed... 1.48e-09 7.84e-12 \n", + "11 (((delayed-nu-fission / nu-fission) * (delayed... 6.99e-11 3.48e-13 " ] }, "execution_count": 24, @@ -1438,7 +1437,7 @@ "data": { "image/png": "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\nPsWOO+7ITjvtxKWXXvrec9/+9rfZddddGT16NJ/5zGeYN28eAA899BADBw5k9OjRjB49mvPOO6/4\nE6LYBLM1q6+j3cKayeC9fdJ640uAQXmOTc1puwOPlmw+WdITkq6T9D7M6lC9J5dW3eU81je9e/fm\n4osvZubMmfzpT3/iiiuu4JlnngHgjDPO4IknnmDGjBkcdNBBqyWSffbZhxkzZjBjxgzOPvvsdRJr\nkQmmUuNd+dTNbe3T7rGSGoApwGkR8VrafBXwfmA02VrtFSvokk6Q1Cypef78+e2fgVmNRdTfzYo1\nZMgQ9thjDwD69+/PjjvuyIsvvgjAgAGrVn9+4403at6vVGSCaQGGlTweSrZEbMV9JPUGBgIL2zs2\nrfk9BbglIt5bHjciXo6IFSVrxVdcmz0iromIxohoHDy46lxtZtbDFNk31dXmzJnDn//8Z/baa6/3\ntn3rW99i2LBh3HLLLavVYB555BF222039t9/f55++umuD6aCIhPMY8BISSMk9SXrtJ9ats9U4Nh0\n/wjggcgWqJkKjE+jzEYAI4FpqX9mEjAzIr5fWpCkISUPDyNbwMrMrC60Vdtoa/vSpUs5/PDD+cEP\nfrBazeX8889n7ty5fOELX+Dyyy8HYI899uCFF17gL3/5C6eccgqHHnpo159ABYUlmNSncjJwH1ln\n/O0R8bSk8yQdknabBAySNBs4HZiYjn0auB14BrgXOCkiVgAfBY4G9q0wHPk/JT0p6QngU8A3ijo3\nM7OuNmjQIBYtWrTatoULF7L55pu/1zl/9dVXA9nMA4cffjhf+MIX+OxnP1uxvM9//vNMmTIFyJrO\nGhoaADjggAN49913efXVVws8m0yhV/KnocL3lG07u+T+MuDINo49Hzi/bNv/ULl/hog4em3jNTOr\nVT9SQ0MDQ4YM4f7772fMmDEsXLiQe++9l1NPPZVjjz32vf0iguOOO44dd9yR008/fbUynn32WUaO\nHAnA1KlT+eAHPwjA3//+d7bcckskMW3aNFauXMmgQYMKPydPFWNmtp646aabOOmkk5gwYQIA55xz\nDu9///tX2+cPf/gDN998M7vssgujR48G4IILLuCAAw5g4sSJzJo1iw022IBtt932vRrPnXfeyVVX\nXUXv3r3ZaKONmDx58joZAKDowcM+GhsbwwuO2fqm9P++Hv896zH+mTNnsuOOO9Y6jPVSpfdG0vSI\n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\nUXFWRrt2AGEAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1499,9 +1498,9 @@ }, { "data": { - "image/png": "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\nkr1doNMAAAAASUVORK5CYII=\n", + "image/png": "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\n4X0RmYab6nB24iviU19fT0FBAcOGDUMk3kDHyGZUlU2bNlFfX8/w4cMzLY5hdGvSNg3lZaqaBTyO\n6/76sKquEZGrRWQygIgcKSL1uLmd54vIms6U4YsvvmDQoEGmKHIUEWHQoEE2MjSMLCCt6yxUdTlu\niGv/uat8+yuJTrQTr40FuEnp24UpitzGvr+OUflCJc4Kh6btTZFzhaFCGsobouoAlB9d3uXyGbmD\nreBOI3V1dRx22GFR5xzHYe7cua3qbtiwgeOOO46RI0dy6KGHcuutt0bKfv3rXzN69GiKi4s54YQT\naGhwf+g1NTUMHDiQ4uJiiouLufrqq1PKtGDBAmbNSrq+MVCdjjJs2DA+/vjjtN6jO1D5QiUFNxRQ\nVBmd8dOpcZAK4fInL49SFLHUba2jcXsjzgonzZIauY4piyyhV69eVFZWsnbtWv7+979z++238+ab\n7vrFn/3sZ7z22musXr2aSZMmRSmFY445htWrV7N69WquuuqqRM0beUp41LCxaWO7ri9dUErd1rqk\nCsUwwJRF1lBYWEhJSQkABQUFjBw5kvfec1MF77rrrpF6n332WZunZu677z4OPPBAJkyYwPPPPx85\n/9FHH3H66adz5JFHcuSRR0aVhamurmbcuHEcccQRfOtb3+KDDz6gubmZESNGEHZXbm5u5oADDuDj\njz9O2OamTZs44YQTOOKII7jooouwaMedQ5CHfKhPiLnHz0XnKDpHo6ag1n+ynoWvLkyniEae0K2U\nheOASOKtqKht9R0nPXLW1dXxyiuvMG7cuMi5X/7ylwwZMoQHH3wwamTx4osvcvjhh3PSSSexZk1r\n/4CNGzcyZ84cnn/+eZ588snIaAXgkksu4bLLLmPlypU88sgjXHjhha2uHz9+PH//+9955ZVXmDJl\nCjfddBM9evTgvPPO48EH3VTGTz31FIcffjh77LFHwjYrKioYP348r7zyCpMnT+Y///lPp/WX0Rqn\n1Ikoh8ZfNJo9wugwlvwojSQaASQbGTQ1NXH66adzyy23RI0orrvuOq677jpuuOEG5s2bR0VFBSUl\nJaxfv55QKMTy5cs57bTT+Oc/o5PX/eMf/6C0tJQ993TjhJ111lm88847gPuQ9yuPTz/9lMbGxqjr\n6+vrOeuss9i4cSPbt2+PuLCef/75nHrqqVx66aXce++9/OAHP0ja5rPPPssf//hHAE455RR23333\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 284be6ca3a..3ff17b35fc 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -151,6 +151,8 @@ class MGXS(object): Reaction type (e.g., 'total', 'nu-fission', etc.) nu : bool If True, the cross section data will include neutron multiplication + prompt : bool + If true, computes cross sections which only includes prompt neutrons by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -233,6 +235,7 @@ class MGXS(object): self._hdf5_key = None self._valid_estimators = ESTIMATOR_TYPES self._nu = False + self._prompt = False self.name = name self.by_nuclide = by_nuclide @@ -415,6 +418,10 @@ class MGXS(object): def nu(self): return self._nu + @property + def prompt(self): + return self._prompt + @property def by_nuclide(self): return self._by_nuclide @@ -585,6 +592,11 @@ class MGXS(object): cv.check_type('nu', nu, bool) self._nu = nu + @prompt.setter + def prompt(self, prompt): + cv.check_type('prompt', prompt, bool) + self._prompt = prompt + @by_nuclide.setter def by_nuclide(self, by_nuclide): cv.check_type('by_nuclide', by_nuclide, bool) @@ -742,13 +754,14 @@ class MGXS(object): elif mgxs_type == 'chi': mgxs = Chi(domain, domain_type, energy_groups) elif mgxs_type == 'chi-prompt': - mgxs = ChiPrompt(domain, domain_type, energy_groups) + mgxs = Chi(domain, domain_type, energy_groups, prompt=True) elif mgxs_type == 'inverse-velocity': mgxs = InverseVelocity(domain, domain_type, energy_groups) elif mgxs_type == 'prompt-nu-fission': - mgxs = PromptNuFissionXS(domain, domain_type, energy_groups) + mgxs = FissionXS(domain, domain_type, energy_groups, prompt=True) elif mgxs_type == 'prompt-nu-fission matrix': - mgxs = PromptNuFissionMatrixXS(domain, domain_type, energy_groups) + mgxs = NuFissionMatrixXS(domain, domain_type, energy_groups, + prompt=True) mgxs.by_nuclide = by_nuclide mgxs.name = name @@ -2612,6 +2625,9 @@ class TransportXS(MGXS): \sigma_{tr} &= \frac{\langle \sigma_t \phi \rangle - \langle \sigma_{s1} \phi \rangle}{\langle \phi \rangle} + To incorporate the effect of scattering multiplication in the above + relation, the `nu` parameter can be set to `True`. + Parameters ---------- domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh @@ -3046,6 +3062,16 @@ class FissionXS(MGXS): \sigma_f (r, E) \psi (r, E, \Omega)}{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. + To incorporate the effect of neutron multiplication in the above + relation, the `nu` parameter can be set to `True`. + + This class can also be used to gather a prompt-nu-fission cross section + (which only includes the contributions from prompt neutrons). This is + accomplished by setting the :attr:`FissionXS.prompt` attribute to `True`. + Since the prompt-nu-fission cross section requires neutron multiplication, + the `nu` parameter will automatically be set to `True` if `prompt` is also + `True`. + Parameters ---------- domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh @@ -3057,6 +3083,10 @@ class FissionXS(MGXS): nu : bool If True, the cross section data will include neutron multiplication; defaults to False + prompt : bool + If true, computes cross sections which only includes prompt neutrons; + defaults to False which includes prompt and delayed in total. Setting + this to True will also set nu to True by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -3077,6 +3107,8 @@ class FissionXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) nu : bool If True, the cross section data will include neutron multiplication + prompt : bool + If true, computes cross sections which only includes prompt neutrons by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -3138,15 +3170,20 @@ class FissionXS(MGXS): """ def __init__(self, domain=None, domain_type=None, groups=None, nu=False, - by_nuclide=False, name='', num_polar=1, num_azimuthal=1): + prompt=False, by_nuclide=False, name='', num_polar=1, + num_azimuthal=1): super(FissionXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) - if not nu: - self._rxn_type = 'fission' + if not prompt: + if not nu: + self._rxn_type = 'fission' + else: + self._rxn_type = 'nu-fission' + self.nu = nu else: - self._rxn_type = 'nu-fission' - + self._rxn_type = 'prompt-nu-fission' + self.nu = True class KappaFissionXS(MGXS): r"""A recoverable fission energy production rate multi-group cross section. @@ -3305,6 +3342,9 @@ class ScatterXS(MGXS): \Omega) \right ]}{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. + To incorporate the effect of scattering multiplication from (n,xn) + reactions in the above relation, the `nu` parameter can be set to `True`. + Parameters ---------- domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh @@ -3455,6 +3495,8 @@ class ScatterMatrixXS(MatrixMGXS): \phi \rangle - \delta_{gg'} \sum_{g''} \langle \sigma_{s,1,g''\rightarrow g} \phi \rangle}{\langle \phi \rangle} + To incorporate the effect of neutron multiplication from (n,xn) reactions + in the above relation, the `nu` parameter can be set to `True`. Parameters ---------- @@ -4481,6 +4523,11 @@ class NuFissionMatrixXS(MatrixMGXS): \nu\sigma_{f,g'\rightarrow g} &= \frac{\langle \nu\sigma_{f,g'\rightarrow g} \phi \rangle}{\langle \phi \rangle} + This class can also be used to gather a prompt-nu-fission cross section + (which only includes the contributions from prompt neutrons). This is + accomplished by setting the :attr:`NuFissionMatrixXS.prompt` attribute to + `True`. + Parameters ---------- domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh @@ -4489,6 +4536,9 @@ class NuFissionMatrixXS(MatrixMGXS): The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation + prompt : bool + If true, computes cross sections which only includes prompt neutrons; + defaults to False which includes prompt and delayed in total by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -4507,6 +4557,8 @@ class NuFissionMatrixXS(MatrixMGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + prompt : bool + If true, computes cross sections which only includes prompt neutrons by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -4568,12 +4620,17 @@ class NuFissionMatrixXS(MatrixMGXS): """ def __init__(self, domain=None, domain_type=None, groups=None, - by_nuclide=False, name='', num_polar=1, num_azimuthal=1): + prompt=False, by_nuclide=False, name='', num_polar=1, + num_azimuthal=1): super(NuFissionMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) - self._rxn_type = 'nu-fission' - self._hdf5_key = 'nu-fission matrix' + if not prompt: + self._rxn_type = 'nu-fission' + self._hdf5_key = 'nu-fission matrix' + else: + self._rxn_type = 'prompt-nu-fission' + self._hdf5_key = 'prompt-nu-fission matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] self.nu = True @@ -4610,6 +4667,10 @@ class Chi(MGXS): \chi_g &= \frac{\langle \nu\sigma_{f,g' \rightarrow g} \phi \rangle} {\langle \nu\sigma_f \phi \rangle} + This class can also be used to gather a prompt-chi (which only includes the + outgoing energy spectrum of prompt neutrons). This is accomplished by + setting the :attr:`Chi.prompt` attribute to `True`. + Parameters ---------- domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh @@ -4618,6 +4679,9 @@ class Chi(MGXS): The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation + prompt : bool + If true, computes cross sections which only includes prompt neutrons; + defaults to False which includes prompt and delayed in total by_nuclide : bool If true, computes cross sections for each nuclide in domain name : str, optional @@ -4636,6 +4700,8 @@ class Chi(MGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) + prompt : bool + If true, computes cross sections which only includes prompt neutrons by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -4697,13 +4763,18 @@ class Chi(MGXS): """ def __init__(self, domain=None, domain_type=None, groups=None, - by_nuclide=False, name='', num_polar=1, num_azimuthal=1): + prompt=False, by_nuclide=False, name='', num_polar=1, + num_azimuthal=1): super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name, num_polar, num_azimuthal) - self._rxn_type = 'chi' + if not prompt: + self._rxn_type = 'chi' + else: + self._rxn_type = 'chi-prompt' self._estimator = 'analog' self._valid_estimators = ['analog'] self.nu = True + self.prompt = prompt @property def _dont_squeeze(self): @@ -4717,7 +4788,10 @@ class Chi(MGXS): @property def scores(self): - return ['nu-fission', 'nu-fission'] + if not self.prompt: + return ['nu-fission', 'nu-fission'] + else: + return ['prompt-nu-fission', 'prompt-nu-fission'] @property def filters(self): @@ -5132,135 +5206,6 @@ class Chi(MGXS): return '%' -class ChiPrompt(Chi): - r"""The prompt fission spectrum. - - 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:`ChiPrompt.energy_groups` and - :attr:`ChiPrompt.domain` properties. Tallies for the flux and appropriate - reaction rates over the specified domain are generated automatically via the - :attr:`ChiPrompt.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:`ChiPrompt.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^p \sigma_{f,g' \rightarrow g} \phi \rangle &= \int_{r \in V} - dr \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; - \chi(E)^p \nu^p \sigma_f (r, E') \psi(r, E', \Omega')\\ - \langle \nu^p \sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} - d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu^p \sigma_f (r, - E') \psi(r, E', \Omega') \\ - \chi_g^p &= \frac{\langle \nu^p \sigma_{f,g' \rightarrow g} \phi \rangle} - {\langle \nu^p \sigma_f \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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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 : '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:`ChiPrompt.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='', num_polar=1, num_azimuthal=1): - super(ChiPrompt, self).__init__(domain, domain_type, groups, - by_nuclide, name, num_polar, - num_azimuthal) - self._rxn_type = 'chi-prompt' - - @property - def scores(self): - return ['prompt-nu-fission', 'prompt-nu-fission'] - - class InverseVelocity(MGXS): r"""An inverse velocity multi-group cross section. @@ -5408,253 +5353,3 @@ class InverseVelocity(MGXS): else: raise ValueError('Unable to return the units of InverseVelocity' ' for xs_type other than "macro"') - - -class PromptNuFissionXS(MGXS): - r"""A prompt fission neutron production 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:`PromptNuFissionXS.energy_groups` and - :attr:`PromptNuFissionXS.domain` properties. Tallies for the flux and - appropriate reaction rates over the specified domain are generated - automatically via the :attr:`PromptNuFissionXS.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:`PromptNuFissionXS.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:: - - \frac{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; - \nu\sigma_f^p (r, E) \psi (r, E, \Omega)}{\int_{r \in V} dr \int_{4\pi} - d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. - - 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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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='', num_polar=1, num_azimuthal=1): - super(PromptNuFissionXS, self).__init__(domain, domain_type, groups, - by_nuclide, name, num_polar, - num_azimuthal) - self._rxn_type = 'prompt-nu-fission' - self.nu = True - - -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. - num_polar : Integral, optional - Number of equi-width polar angle bins for angle discretization; - defaults to one bin - num_azimuthal : Integral, optional - Number of equi-width azimuthal angle bins for angle discretization; - defaults to one bin - - 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 - num_polar : Integral - Number of equi-width polar angle bins for angle discretization - num_azimuthal : Integral - Number of equi-width azimuthal angle bins for angle discretization - 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 : '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='', num_polar=1, num_azimuthal=1): - super(PromptNuFissionMatrixXS, self).__init__(domain, domain_type, - groups, by_nuclide, name, - num_polar, num_azimuthal) - self._rxn_type = 'prompt-nu-fission' - self._hdf5_key = 'prompt-nu-fission matrix' - self._estimator = 'analog' - self._valid_estimators = ['analog'] - self.nu = True From 58517587aa536a82c851cdcaa01f80991106f2b5 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 06:26:24 -0500 Subject: [PATCH 62/66] I again forgot about updating the mgxs_library module for the removal of the prompt types --- openmc/mgxs_library.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index d1a46df09a..79630ca16e 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1125,13 +1125,13 @@ class XSdata(object): subdomain=None): """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. + This method allows for an openmc.mgxs.FissionXS or + openmc.mgxs.NuFissionMatrixXS to be used to set the prompt-nu-fission + cross section for this XSdata object. Parameters ---------- - prompt_nu_fission: openmc.mgxs.PromptNuFissionXS or openmc.mgxs.PromptNuFissionMatrixXS + prompt_nu_fission: openmc.mgxs.FissionXS or openmc.mgxs.NuFissionMatrixXS MGXS Object containing the prompt-nu-fission cross section for the domain of interest. temperature : float @@ -1155,8 +1155,8 @@ class XSdata(object): """ check_type('prompt_nu_fission', prompt_nu_fission, - (openmc.mgxs.PromptNuFissionXS, - openmc.mgxs.PromptNuFissionMatrixXS)) + (openmc.mgxs.FissionXS, openmc.mgxs.NuFissionMatrixXS)) + check_value('prompt', prompt_nu_fission.prompt, [True]) check_value('energy_groups', prompt_nu_fission.energy_groups, [self.energy_groups]) check_value('domain_type', prompt_nu_fission.domain_type, @@ -1308,12 +1308,12 @@ class XSdata(object): def set_chi_prompt_mgxs(self, chi_prompt, temperature=294., nuclide='total', xs_type='macro', subdomain=None): - """This method allows for an openmc.mgxs.ChiPrompt - to be used to set chi-prompt for this XSdata object. + """This method allows for an openmc.mgxs.Chi to be used to set + chi-prompt for this XSdata object. Parameters ---------- - chi_prompt: openmc.mgxs.ChiPrompt + chi_prompt: openmc.mgxs.Chi MGXS Object containing chi-prompt for the domain of interest. temperature : float Temperature (in units of Kelvin) of the provided dataset. Defaults @@ -1335,7 +1335,8 @@ class XSdata(object): """ - check_type('chi_prompt', chi_prompt, openmc.mgxs.ChiPrompt) + check_type('chi_prompt', chi_prompt, openmc.mgxs.Chi) + check_value('prompt', chi_prompt.prompt, [True]) check_value('energy_groups', chi_prompt.energy_groups, [self.energy_groups]) check_value('domain_type', chi_prompt.domain_type, From 6ce91c2b96bd9ce58d96319b2c6fd8d00b7f95c2 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 14:51:19 -0500 Subject: [PATCH 63/66] moved nu and prompt attributes to only the MGXS children who need them and added deepcopy capabilities for the nu/prompt data. --- .../pythonapi/examples/mdgxs-part-i.ipynb | 2 +- openmc/mgxs/mgxs.py | 113 +++++++++++++----- 2 files changed, 84 insertions(+), 31 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index 05366758a1..6d84ca3c21 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -386,7 +386,7 @@ "\n", "In this case, let's create the multi-group chi-prompt, chi-delayed, and prompt-nu-fission cross sections with our 100-energy-group structure and multi-group delayed-nu-fission and beta cross sections with our 100-energy-group and 6-delayed-group structures. \n", "\n", - "The prompt chi and nu-fission data can actually be gathered using the `Chi` and `FissionXS` classes, respectively, but passing in a value of `True` for the optional `prompt` parameter upon initialization." + "The prompt chi and nu-fission data can actually be gathered using the `Chi` and `FissionXS` classes, respectively, by passing in a value of `True` for the optional `prompt` parameter upon initialization." ] }, { diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 3ff17b35fc..92c449f70b 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -149,10 +149,6 @@ class MGXS(object): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) - nu : bool - If True, the cross section data will include neutron multiplication - prompt : bool - If true, computes cross sections which only includes prompt neutrons by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -234,8 +230,6 @@ class MGXS(object): self._derived = False self._hdf5_key = None self._valid_estimators = ESTIMATOR_TYPES - self._nu = False - self._prompt = False self.name = name self.by_nuclide = by_nuclide @@ -414,14 +408,6 @@ class MGXS(object): def rxn_type(self): return self._rxn_type - @property - def nu(self): - return self._nu - - @property - def prompt(self): - return self._prompt - @property def by_nuclide(self): return self._by_nuclide @@ -587,16 +573,6 @@ class MGXS(object): cv.check_type('name', name, string_types) self._name = name - @nu.setter - def nu(self, nu): - cv.check_type('nu', nu, bool) - self._nu = nu - - @prompt.setter - def prompt(self, prompt): - cv.check_type('prompt', prompt, bool) - self._prompt = prompt - @by_nuclide.setter def by_nuclide(self, by_nuclide): cv.check_type('by_nuclide', by_nuclide, bool) @@ -2026,8 +2002,6 @@ class MatrixMGXS(MGXS): Name of the multi-group cross section rxn_type : str Reaction type (e.g., 'total', 'nu-fission', etc.) - nu : bool - If True, the cross section data will include neutron multiplication by_nuclide : bool If true, computes cross sections for each nuclide in domain domain : Material or Cell or Universe or Mesh @@ -2732,6 +2706,11 @@ class TransportXS(MGXS): self._valid_estimators = ['analog'] self.nu = nu + def __deepcopy__(self, memo): + clone = super(TransportXS, self).__deepcopy__(memo) + clone._nu = self.nu + return clone + @property def scores(self): if not self.nu: @@ -2770,6 +2749,15 @@ class TransportXS(MGXS): return self._rxn_rate_tally + @property + def nu(self): + return self._nu + + @nu.setter + def nu(self, nu): + cv.check_type('nu', nu, bool) + self._nu = nu + class AbsorptionXS(MGXS): r"""An absorption multi-group cross section. @@ -3184,6 +3172,32 @@ class FissionXS(MGXS): else: self._rxn_type = 'prompt-nu-fission' self.nu = True + self.prompt = prompt + + def __deepcopy__(self, memo): + clone = super(FissionXS, self).__deepcopy__(memo) + clone._nu = self.nu + clone._prompt = self.prompt + return clone + + @property + def nu(self): + return self._nu + + @property + def prompt(self): + return self._prompt + + @nu.setter + def nu(self, nu): + cv.check_type('nu', nu, bool) + self._nu = nu + + @prompt.setter + def prompt(self, prompt): + cv.check_type('prompt', prompt, bool) + self._prompt = prompt + class KappaFissionXS(MGXS): r"""A recoverable fission energy production rate multi-group cross section. @@ -3449,9 +3463,22 @@ class ScatterXS(MGXS): # to reflect this self._estimator = 'analog' self._valid_estimators = ['analog'] - self.nu = nu + def __deepcopy__(self, memo): + clone = super(ScatterXS, self).__deepcopy__(memo) + clone._nu = self.nu + return clone + + @property + def nu(self): + return self._nu + + @nu.setter + def nu(self, nu): + cv.check_type('nu', nu, bool) + self._nu = nu + class ScatterMatrixXS(MatrixMGXS): r"""A scattering matrix multi-group cross section with the cosine of the @@ -3627,6 +3654,7 @@ class ScatterMatrixXS(MatrixMGXS): clone._scatter_format = self.scatter_format clone._legendre_order = self.legendre_order clone._histogram_bins = self.histogram_bins + clone._nu = self.nu return clone @property @@ -3645,6 +3673,10 @@ class ScatterMatrixXS(MatrixMGXS): else: return (1, 2) + @property + def nu(self): + return self._nu + @property def correction(self): return self._correction @@ -3721,6 +3753,11 @@ class ScatterMatrixXS(MatrixMGXS): return self._rxn_rate_tally + @nu.setter + def nu(self, nu): + cv.check_type('nu', nu, bool) + self._nu = nu + @correction.setter def correction(self, correction): cv.check_value('correction', correction, ('P0', None)) @@ -4455,7 +4492,6 @@ class MultiplicityMatrixXS(MatrixMGXS): self._rxn_type = 'multiplicity matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] - self.nu = True @property def scores(self): @@ -4633,7 +4669,11 @@ class NuFissionMatrixXS(MatrixMGXS): self._hdf5_key = 'prompt-nu-fission matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] - self.nu = True + + def __deepcopy__(self, memo): + clone = super(NuFissionMatrixXS, self).__deepcopy__(memo) + clone._prompt = self.prompt + return clone class Chi(MGXS): @@ -4773,9 +4813,17 @@ class Chi(MGXS): self._rxn_type = 'chi-prompt' self._estimator = 'analog' self._valid_estimators = ['analog'] - self.nu = True self.prompt = prompt + def __deepcopy__(self, memo): + clone = super(Chi, self).__deepcopy__(memo) + clone._prompt = self.prompt + return clone + + @property + def prompt(self): + return self._prompt + @property def _dont_squeeze(self): """Create a tuple of axes which should not be removed during the get_xs @@ -4832,6 +4880,11 @@ class Chi(MGXS): return self._xs_tally + @prompt.setter + def prompt(self, prompt): + cv.check_type('prompt', prompt, bool) + self._prompt = prompt + def get_homogenized_mgxs(self, other_mgxs): """Construct a homogenized mgxs with other MGXS objects. From f1c17ad150ac4ca524995fe9e41e0c0451e7e9e2 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 15:00:57 -0500 Subject: [PATCH 64/66] missing setting of prompt in NuFissionMatrixXS --- openmc/mgxs/mgxs.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 92c449f70b..10e10738e2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -4669,6 +4669,16 @@ class NuFissionMatrixXS(MatrixMGXS): self._hdf5_key = 'prompt-nu-fission matrix' self._estimator = 'analog' self._valid_estimators = ['analog'] + self.prompt = prompt + + @property + def prompt(self): + return self._prompt + + @prompt.setter + def prompt(self, prompt): + cv.check_type('prompt', prompt, bool) + self._prompt = prompt def __deepcopy__(self, memo): clone = super(NuFissionMatrixXS, self).__deepcopy__(memo) From c82cf1bea4f8f2751bede004b97c1d9acd5ef065 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 26 Feb 2017 15:15:02 -0500 Subject: [PATCH 65/66] I should quit while im ahead. this is three times in a row i missed this file --- 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 79630ca16e..1803562b7c 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1104,7 +1104,8 @@ class XSdata(object): check_type('nu_fission', nu_fission, (openmc.mgxs.FissionXS, openmc.mgxs.NuFissionMatrixXS)) - check_value('nu', nu_fission.nu, [True]) + if isinstance(nu_fission, openmc.mgxs.FissionXS): + check_value('nu', nu_fission.nu, [True]) check_value('energy_groups', nu_fission.energy_groups, [self.energy_groups]) check_value('domain_type', nu_fission.domain_type, @@ -1602,7 +1603,6 @@ class XSdata(object): check_type('nuscatter', nuscatter, (openmc.mgxs.ScatterMatrixXS, openmc.mgxs.MultiplicityMatrixXS)) - check_value('nu', nuscatter.nu, [True]) check_value('energy_groups', nuscatter.energy_groups, [self.energy_groups]) check_value('domain_type', nuscatter.domain_type, From 828a0e7e9465f8e3351e9676bd9f2a0ea7616a9f Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 27 Feb 2017 06:36:20 -0600 Subject: [PATCH 66/66] Fix error in geometry RELAX NG schema and missing element in settings --- src/relaxng/geometry.rnc | 4 ++-- src/relaxng/geometry.rng | 28 ++++++++++++++++------------ src/relaxng/settings.rnc | 2 ++ src/relaxng/settings.rng | 5 +++++ 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/relaxng/geometry.rnc b/src/relaxng/geometry.rnc index 49b90e4e54..c9c53f6d64 100644 --- a/src/relaxng/geometry.rnc +++ b/src/relaxng/geometry.rnc @@ -6,8 +6,8 @@ element geometry { (element universe { xsd:int } | attribute universe { xsd:int })? & ( (element fill { xsd:int } | attribute fill { xsd:int }) | - (element material { ( xsd:int | "void" )+ } | - attribute material { ( xsd:int | "void" )+ }) + (element material { list { ( xsd:int | "void" )+ } } | + attribute material { list { ( xsd:int | "void" )+ } }) ) & (element temperature { list { xsd:double+ } } | attribute temperature { list { xsd:double+ } } )? & diff --git a/src/relaxng/geometry.rng b/src/relaxng/geometry.rng index 4a4fa30ebc..d2c1f635ee 100644 --- a/src/relaxng/geometry.rng +++ b/src/relaxng/geometry.rng @@ -47,20 +47,24 @@ - - - - void - - + + + + + void + + + - - - - void - - + + + + + void + + + diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 988fd0471a..1cac11e54c 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -51,6 +51,8 @@ element settings { element run_cmfd { xsd:boolean }? & + element run_mode { xsd:string }? & + element seed { xsd:positiveInteger }? & element source { diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index fe0a294f42..8db4efcbce 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -222,6 +222,11 @@ + + + + +