From f528eee67db0c2558740d97b04f80290200bd7d9 Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:08:22 -0800 Subject: [PATCH 01/13] Removing dependence on six (#2037) --- armi/cases/case.py | 4 ++-- armi/cli/entryPoint.py | 5 +---- armi/mpiActions.py | 7 +++---- armi/nuclearDataIO/cccc/tests/test_cccc.py | 4 +--- armi/nuclearDataIO/tests/test_xsLibraries.py | 8 ++++---- .../neutronics/tests/test_crossSectionManager.py | 8 ++++---- armi/reactor/blockParameters.py | 4 +--- armi/reactor/composites.py | 6 ++---- armi/reactor/parameters/parameterCollections.py | 15 +++++++-------- armi/reactor/tests/test_reactors.py | 8 ++++---- armi/tests/mockRunLogs.py | 14 +++++++------- armi/utils/iterables.py | 8 +++----- 12 files changed, 39 insertions(+), 52 deletions(-) diff --git a/armi/cases/case.py b/armi/cases/case.py index faebff6dd..588b020c4 100644 --- a/armi/cases/case.py +++ b/armi/cases/case.py @@ -28,6 +28,7 @@ import ast import cProfile import glob +import io import os import pathlib import pstats @@ -38,7 +39,6 @@ import trace import coverage -import six from armi import context from armi import getPluginManager @@ -492,7 +492,7 @@ def _endProfiling(profiler=None): profiler.disable() profiler.dump_stats("profiler.{:0>3}.stats".format(context.MPI_RANK)) - statsStream = six.StringIO() + statsStream = io.StringIO() summary = pstats.Stats(profiler, stream=statsStream).sort_stats("cumulative") summary.print_stats() if context.MPI_SIZE > 0 and context.MPI_COMM is not None: diff --git a/armi/cli/entryPoint.py b/armi/cli/entryPoint.py index bef74f07d..d6832c708 100644 --- a/armi/cli/entryPoint.py +++ b/armi/cli/entryPoint.py @@ -20,8 +20,6 @@ import argparse from typing import Optional, Union -import six - from armi import context, runLog, settings @@ -46,8 +44,7 @@ def __new__(mcs, name, bases, attrs): return type.__new__(mcs, name, bases, attrs) -@six.add_metaclass(_EntryPointEnforcer) -class EntryPoint: +class EntryPoint(metaclass=_EntryPointEnforcer): """ Generic command line entry point. diff --git a/armi/mpiActions.py b/armi/mpiActions.py index 8026ddf1d..ca3fc9ca3 100644 --- a/armi/mpiActions.py +++ b/armi/mpiActions.py @@ -56,10 +56,9 @@ import collections import gc import math +import pickle import timeit -from six.moves import cPickle - from armi import context from armi import interfaces from armi import runLog @@ -138,7 +137,7 @@ def _mpiOperationHelper(self, obj, mpiFunction): self.o = self.r = self.cs = None try: return mpiFunction(obj, root=0) - except cPickle.PicklingError as error: + except pickle.PicklingError as error: runLog.error("Failed to {} {}.".format(mpiFunction.__name__, obj)) runLog.error(error) raise @@ -539,7 +538,7 @@ def invokeHook(self): # or how the interfaces are distributed. self.r._markSynchronized() - except (cPickle.PicklingError, TypeError) as error: + except (pickle.PicklingError, TypeError) as error: runLog.error("Failed to transmit on distribute state root MPI bcast") runLog.error(error) # workers are still waiting for a reactor object diff --git a/armi/nuclearDataIO/cccc/tests/test_cccc.py b/armi/nuclearDataIO/cccc/tests/test_cccc.py index 6f9ea18ee..33b16c2b8 100644 --- a/armi/nuclearDataIO/cccc/tests/test_cccc.py +++ b/armi/nuclearDataIO/cccc/tests/test_cccc.py @@ -15,8 +15,6 @@ import io import unittest -import six - from armi.nuclearDataIO import cccc @@ -104,4 +102,4 @@ def setUpClass(cls): cls.readerClass = cccc.AsciiRecordReader def setUp(self): - self.streamCls = six.StringIO + self.streamCls = io.StringIO diff --git a/armi/nuclearDataIO/tests/test_xsLibraries.py b/armi/nuclearDataIO/tests/test_xsLibraries.py index ae4b55229..88fd59ad3 100644 --- a/armi/nuclearDataIO/tests/test_xsLibraries.py +++ b/armi/nuclearDataIO/tests/test_xsLibraries.py @@ -15,11 +15,11 @@ import copy import filecmp import os +import pickle import traceback import unittest import numpy as np -from six.moves import cPickle from armi.nucDirectory import nuclideBases from armi.nuclearDataIO import xsLibraries @@ -87,15 +87,15 @@ def setUpClass(cls): cls.xsLibGenerationErrorStack = traceback.format_exc() def test_canPickleAndUnpickleISOTXS(self): - pikAA = cPickle.loads(cPickle.dumps(self.isotxsAA)) + pikAA = pickle.loads(pickle.dumps(self.isotxsAA)) self.assertTrue(xsLibraries.compare(pikAA, self.isotxsAA)) def test_canPickleAndUnpickleGAMISO(self): - pikAA = cPickle.loads(cPickle.dumps(self.gamisoAA)) + pikAA = pickle.loads(pickle.dumps(self.gamisoAA)) self.assertTrue(xsLibraries.compare(pikAA, self.gamisoAA)) def test_canPickleAndUnpicklePMATRX(self): - pikAA = cPickle.loads(cPickle.dumps(self.pmatrxAA)) + pikAA = pickle.loads(pickle.dumps(self.pmatrxAA)) self.assertTrue(xsLibraries.compare(pikAA, self.pmatrxAA)) def test_compareWorks(self): diff --git a/armi/physics/neutronics/tests/test_crossSectionManager.py b/armi/physics/neutronics/tests/test_crossSectionManager.py index ec86ab3ea..219d852fb 100644 --- a/armi/physics/neutronics/tests/test_crossSectionManager.py +++ b/armi/physics/neutronics/tests/test_crossSectionManager.py @@ -19,12 +19,11 @@ """ import copy import os +import pickle import unittest from io import BytesIO from unittest.mock import MagicMock -from six.moves import cPickle - from armi import settings from armi.physics.neutronics import crossSectionGroupManager from armi.physics.neutronics.const import CONF_CROSS_SECTION @@ -73,9 +72,9 @@ def test_getBlocksInGroup(self): def test_is_pickleable(self): self.bc.weightingParam = "test" buf = BytesIO() - cPickle.dump(self.bc, buf) + pickle.dump(self.bc, buf) buf.seek(0) - newBc = cPickle.load(buf) + newBc = pickle.load(buf) self.assertEqual(self.bc.weightingParam, newBc.weightingParam) @@ -85,6 +84,7 @@ def setUp(self): for bi, b in enumerate(self.blockList): b.setType("fuel") b.p.percentBu = bi / 4.0 * 100 + self.blockList[0], self.blockList[2] = self.blockList[2], self.blockList[0] self.bc = MedianBlockCollection( self.blockList[0].core.r.blueprints.allNuclidesInProblem diff --git a/armi/reactor/blockParameters.py b/armi/reactor/blockParameters.py index 8952bfc97..e96010cbd 100644 --- a/armi/reactor/blockParameters.py +++ b/armi/reactor/blockParameters.py @@ -13,8 +13,6 @@ # limitations under the License. """Parameter definitions for Blocks.""" -import six - from armi import runLog from armi.physics.neutronics import crossSectionGroupManager from armi.reactor import parameters @@ -207,7 +205,7 @@ def envGroup(self, envGroupChar): ) self.envGroupNum = intValue return - elif not isinstance(envGroupChar, six.string_types): + elif not isinstance(envGroupChar, str): raise Exception( f"Wrong type for envGroupChar {envGroupChar}: {type(envGroupChar)}" ) diff --git a/armi/reactor/composites.py b/armi/reactor/composites.py index 62a0e329d..1b2bad687 100644 --- a/armi/reactor/composites.py +++ b/armi/reactor/composites.py @@ -39,7 +39,6 @@ from typing import Dict, List, Optional, Tuple, Type, Union import numpy as np -import six from armi import context, runLog, utils from armi.nucDirectory import elements, nucDir, nuclideBases @@ -759,10 +758,9 @@ def hasFlags(self, typeID: TypeSpec, exact=False): """ if not typeID: return not exact - if isinstance(typeID, six.string_types): + if isinstance(typeID, str): raise TypeError( - "Must pass Flags, or an iterable of Flags; Strings are no longer " - "supported" + "Must pass Flags, or an iterable of Flags; Strings are no longer supported" ) elif not isinstance(typeID, Flags): diff --git a/armi/reactor/parameters/parameterCollections.py b/armi/reactor/parameters/parameterCollections.py index e3cc0d886..c588563cc 100644 --- a/armi/reactor/parameters/parameterCollections.py +++ b/armi/reactor/parameters/parameterCollections.py @@ -12,13 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Any, Optional, List, Set, Iterator, Callable import copy import pickle -from typing import Any, Optional, List, Set, Iterator, Callable import sys import numpy as np -import six from armi import runLog from armi.reactor.parameters import parameterDefinitions, exceptions @@ -38,10 +37,10 @@ This is a counter of the number of instances of all types. They are useful for tracking items through the history of a database. -.. warning:: - - This is not MPI safe. We also have not done anything to make it thread safe, - except that the GIL exists. +Warning +------- +This is not MPI safe. We also have not done anything to make it thread safe, except that the GIL +exists. """ @@ -365,7 +364,7 @@ def __setitem__(self, name, value): ) def __delitem__(self, name): - if isinstance(name, six.string_types): + if isinstance(name, str): pd = self.paramDefs[name] if hasattr(self, pd.fieldName): pd.assigned = SINCE_ANYTHING @@ -374,7 +373,7 @@ def __delitem__(self, name): del self._hist[name] def __contains__(self, name): - if isinstance(name, six.string_types): + if isinstance(name, str): return hasattr(self, "_p_" + name) else: return name in self._hist diff --git a/armi/reactor/tests/test_reactors.py b/armi/reactor/tests/test_reactors.py index 6187155e6..ea03fbaa5 100644 --- a/armi/reactor/tests/test_reactors.py +++ b/armi/reactor/tests/test_reactors.py @@ -15,12 +15,12 @@ import copy import logging import os +import pickle import unittest from math import sqrt from unittest.mock import patch from numpy.testing import assert_allclose, assert_equal -from six.moves import cPickle from armi import operators from armi import runLog @@ -170,7 +170,7 @@ def loadTestReactor( if isPickeledReactor and TEST_REACTOR: # return test reactor only if no custom settings are needed. - o, r, assemNum = cPickle.loads(TEST_REACTOR) + o, r, assemNum = pickle.loads(TEST_REACTOR) o.reattach(r, o.cs) return o, r @@ -196,7 +196,7 @@ def loadTestReactor( if isPickeledReactor: # cache it for fast load for other future tests # protocol=2 allows for classes with __slots__ but not __getstate__ to be pickled - TEST_REACTOR = cPickle.dumps((o, o.r, o.r.p.maxAssemNum), protocol=2) + TEST_REACTOR = pickle.dumps((o, o.r, o.r.p.maxAssemNum), protocol=2) return o, o.r @@ -934,7 +934,7 @@ def test_getMass(self): assert_allclose(mass1, mass2) def test_isPickleable(self): - loaded = cPickle.loads(cPickle.dumps(self.r)) + loaded = pickle.loads(pickle.dumps(self.r)) # ensure we didn't break the current reactor self.assertIs(self.r.core.spatialGrid.armiObject, self.r.core) diff --git a/armi/tests/mockRunLogs.py b/armi/tests/mockRunLogs.py index bc10db3a5..38b5c7462 100644 --- a/armi/tests/mockRunLogs.py +++ b/armi/tests/mockRunLogs.py @@ -12,20 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. """ -This module contains subclasses of the armi.runLog._RunLog class that can be used to determine whether or not -one of the specific methods were called. These should only be used in testing. +This module contains subclasses of the armi.runLog._RunLog class that can be used to determine +whether or not one of the specific methods were called. These should only be used in testing. """ -import six +import io import sys from armi import runLog class BufferLog(runLog._RunLog): - r"""Log which captures the output in attributes instead of emitting them. + """Log which captures the output in attributes instead of emitting them. - Used mostly in testing to ensure certain things get output, or to prevent any output - from showing. + Used mostly in testing to ensure certain things get output, or to prevent any output from + showing. """ def __init__(self, *args, **kwargs): @@ -34,7 +34,7 @@ def __init__(self, *args, **kwargs): self._outputStream = "" self._singleMessageCounts = {} self._singleWarningMessageCounts = {} - self._errStream = six.StringIO() + self._errStream = io.StringIO() sys.stderr = self._errStream self.setVerbosity(0) diff --git a/armi/utils/iterables.py b/armi/utils/iterables.py index ce204aa0a..70fafc0a2 100644 --- a/armi/utils/iterables.py +++ b/armi/utils/iterables.py @@ -13,11 +13,9 @@ # limitations under the License. """Module of utilities to help dealing with iterable objects in Python.""" -from itertools import tee, chain +from itertools import chain, filterfalse, tee import struct -from six.moves import filterfalse, map, xrange, filter - import numpy as np @@ -43,7 +41,7 @@ def chunk(lst, n): >>> list(chunk([1,2,3,4,5,6,7,8,9,10], 4)) [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]] """ - for i in xrange(0, len(lst), n): + for i in range(0, len(lst), n): yield lst[i : i + n] @@ -84,7 +82,7 @@ def split(a, n, padWith=()): k, m = divmod(N, n) chunked = [ - a[i * k + min(i, m) : (i + 1) * k + min(i + 1, m)] or padWith for i in xrange(n) + a[i * k + min(i, m) : (i + 1) * k + min(i + 1, m)] or padWith for i in range(n) ] return chunked From f86ef61964cab1be8064468627906d85519788eb Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:29:12 -0800 Subject: [PATCH 02/13] Identifying all first-order dependencies (#2039) --- pyproject.toml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a1b4c6a2f..330094aa1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,8 +31,8 @@ authors = [ ] dependencies = [ "coverage>=7.2.0", # Code coverage tool. Sadly baked into every Case. - "h5py>=3.9 ; python_version >= '3.11.0'", # Needed because our database files are H5 format "h5py>=3.0,<=3.9 ; python_version < '3.11.0'", + "h5py>=3.9 ; python_version >= '3.11.0'", # Needed because our database files are H5 format "htmltree>=0.7.6", # Our reports have HTML output "matplotlib>=3.5.3,<3.8.0", # Important plotting library "numpy>=1.21", # Important math library @@ -40,8 +40,9 @@ dependencies = [ "pluggy>=1.2.0", # Central tool behind the ARMI Plugin system "pyDOE>=0.3.8", # We import a Latin-hypercube algorithm to explore a phase space "pyevtk>=1.2.0", # Handles binary VTK visualization files - "ruamel.yaml.clib ; python_version >= '3.11.0'", # C-based core of ruamel below + "python-dateutil>=2.2", # To read a datetime string more easily. "ruamel.yaml ; python_version >= '3.11.0'", # Our foundational YAML library + "ruamel.yaml.clib ; python_version >= '3.11.0'", # C-based core of ruamel below "ruamel.yaml.clib<=0.2.7 ; python_version < '3.11.0'", # C-based core of ruamel below "ruamel.yaml<=0.17.21 ; python_version < '3.11.0'", # Our foundational YAML library "scipy>=1.7.0", # Used for curve-fitting and matrix math @@ -81,9 +82,10 @@ test = [ "ipykernel>=6.0.0", # IPython Kernel (We run test notebooks from the doc tutorials.) "jupyter_client>=7.0.0", # Reference implementation of the Jupyter protocol "nbconvert>=7.0.0", # Converting Jupyter Notebooks to other formats - "pytest>=7.0.0", # Our primary test tooling + "nbformat>=5.5.0", # Jupyter Notebook reader "pytest-cov>=4.0.0", # coverage plugin "pytest-xdist>=3.0.0", # To spread our tests over multiple CPUs + "pytest>=7.0.0", # Our primary test tooling "ruff==0.5.1", # Linting and code formatting (version-pinned) ] docs = [ From bc1ec01d1b86ac90321219eff93c79b015958a74 Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Tue, 24 Dec 2024 10:15:46 -0800 Subject: [PATCH 03/13] Sorting imports with ruff (#2025) --- .github/workflows/validatemanifest.py | 3 +- armi/__init__.py | 46 +++++++---------- armi/__main__.py | 4 +- armi/apps.py | 23 +++++---- armi/bookkeeping/__init__.py | 12 +++-- armi/bookkeeping/db/__init__.py | 3 +- armi/bookkeeping/db/compareDB3.py | 2 +- armi/bookkeeping/db/databaseInterface.py | 17 +++---- armi/bookkeeping/db/factory.py | 2 +- armi/bookkeeping/db/layout.py | 9 ++-- armi/bookkeeping/db/tests/test_comparedb3.py | 8 +-- .../db/tests/test_databaseInterface.py | 4 +- armi/bookkeeping/db/tests/test_layout.py | 3 +- armi/bookkeeping/db/typedefs.py | 3 +- armi/bookkeeping/historyTracker.py | 10 ++-- armi/bookkeeping/mainInterface.py | 13 ++--- armi/bookkeeping/memoryProfiler.py | 9 ++-- armi/bookkeeping/report/newReportUtils.py | 13 +++-- armi/bookkeeping/report/reportInterface.py | 7 +-- armi/bookkeeping/report/reportingUtils.py | 24 +++++---- .../report/tests/test_newReport.py | 6 +-- armi/bookkeeping/report/tests/test_report.py | 4 +- armi/bookkeeping/snapshotInterface.py | 5 +- armi/bookkeeping/tests/_constants.py | 1 - armi/bookkeeping/tests/test_historyTracker.py | 6 +-- armi/bookkeeping/tests/test_memoryProfiler.py | 4 +- armi/bookkeeping/visualization/entryPoint.py | 3 +- .../visualization/tests/test_vis.py | 7 +-- armi/bookkeeping/visualization/utils.py | 5 +- armi/bookkeeping/visualization/vtk.py | 11 ++--- armi/bookkeeping/visualization/xdmf.py | 15 ++---- armi/cases/case.py | 23 +++------ .../tests/test_inputModifiers.py | 13 +++-- armi/cases/suite.py | 8 ++- armi/cases/suiteBuilder.py | 7 +-- armi/cases/tests/test_cases.py | 16 ++---- armi/cases/tests/test_suiteBuilder.py | 4 +- armi/cli/__init__.py | 13 ++--- armi/cli/database.py | 3 +- armi/cli/gridGui.py | 1 + armi/cli/modify.py | 4 +- armi/cli/reportsEntryPoint.py | 3 +- armi/cli/runSuite.py | 2 +- armi/cli/tests/test_runEntryPoint.py | 6 +-- armi/context.py | 4 +- armi/interfaces.py | 8 +-- armi/materials/__init__.py | 2 +- armi/materials/air.py | 2 +- armi/materials/be9.py | 4 +- armi/materials/copper.py | 2 +- armi/materials/graphite.py | 4 +- armi/materials/hafnium.py | 2 +- armi/materials/hastelloyN.py | 2 +- armi/materials/material.py | 4 +- armi/materials/mox.py | 2 +- armi/materials/tests/test_materials.py | 2 +- armi/materials/tests/test_uZr.py | 2 +- armi/materials/tests/test_water.py | 2 +- armi/materials/thoriumOxide.py | 2 +- armi/materials/uThZr.py | 4 +- armi/materials/uraniumOxide.py | 1 - armi/migration/m0_1_3.py | 2 +- armi/migration/m0_1_6.py | 3 +- armi/migration/tests/test_m0_1_6.py | 2 +- armi/migration/tests/test_migration_base.py | 3 +- armi/mpiActions.py | 9 +--- armi/nucDirectory/elements.py | 2 +- armi/nucDirectory/nuclideBases.py | 6 +-- armi/nucDirectory/tests/test_nuclideBases.py | 2 +- .../tests/test_thermalScattering.py | 3 +- armi/nucDirectory/thermalScattering.py | 3 +- armi/nuclearDataIO/__init__.py | 3 +- armi/nuclearDataIO/cccc/compxs.py | 8 +-- armi/nuclearDataIO/cccc/dif3d.py | 1 - armi/nuclearDataIO/cccc/dlayxs.py | 4 +- armi/nuclearDataIO/cccc/gamiso.py | 3 +- armi/nuclearDataIO/cccc/isotxs.py | 6 +-- armi/nuclearDataIO/cccc/pmatrx.py | 4 +- armi/nuclearDataIO/cccc/tests/test_fixsrc.py | 3 +- armi/nuclearDataIO/cccc/tests/test_gamiso.py | 2 +- armi/nuclearDataIO/nuclearFileMetadata.py | 1 - .../nuclearDataIO/tests/test_xsCollections.py | 3 +- armi/nuclearDataIO/tests/test_xsNuclides.py | 7 +-- armi/nuclearDataIO/xsCollections.py | 3 +- armi/nuclearDataIO/xsLibraries.py | 8 +-- armi/nuclearDataIO/xsNuclides.py | 4 +- armi/operators/__init__.py | 4 +- armi/operators/operatorMPI.py | 5 +- armi/operators/settingsValidation.py | 8 +-- armi/operators/snapshots.py | 2 +- armi/operators/tests/test_operators.py | 10 ++-- armi/physics/executers.py | 2 +- armi/physics/fuelCycle/__init__.py | 7 +-- armi/physics/fuelCycle/fuelHandlerFactory.py | 3 +- .../physics/fuelCycle/fuelHandlerInterface.py | 11 +++-- armi/physics/fuelCycle/fuelHandlers.py | 2 +- armi/physics/fuelCycle/settings.py | 3 +- .../fuelCycle/tests/test_fuelHandlers.py | 2 +- armi/physics/fuelPerformance/executers.py | 7 ++- armi/physics/fuelPerformance/parameters.py | 2 +- armi/physics/fuelPerformance/plugin.py | 4 +- armi/physics/fuelPerformance/settings.py | 1 - .../neutronics/crossSectionSettings.py | 3 +- armi/physics/neutronics/diffIsotxs.py | 3 +- armi/physics/neutronics/energyGroups.py | 4 +- .../fissionProductModel/__init__.py | 1 + .../fissionProductModel.py | 6 +-- .../fissionProductModelSettings.py | 2 +- .../lumpedFissionProduct.py | 6 +-- .../tests/test_fissionProductModel.py | 8 +-- .../tests/test_lumpedFissionProduct.py | 14 +++--- .../globalFlux/globalFluxInterface.py | 21 +++----- .../tests/test_globalFluxInterface.py | 3 +- .../neutronics/latticePhysics/__init__.py | 3 +- .../latticePhysics/latticePhysicsWriter.py | 16 +++--- .../tests/test_latticeInterface.py | 19 ++++--- .../tests/test_latticeWriter.py | 4 +- .../neutronics/macroXSGenerationInterface.py | 5 +- armi/physics/neutronics/reports.py | 5 +- armi/physics/neutronics/settings.py | 6 +-- .../tests/test_crossSectionSettings.py | 20 ++++---- .../tests/test_crossSectionTable.py | 2 + .../neutronics/tests/test_neutronicsPlugin.py | 15 +++--- armi/physics/thermalHydraulics/parameters.py | 2 +- armi/physics/thermalHydraulics/plugin.py | 4 +- armi/plugins.py | 2 +- armi/reactor/__init__.py | 17 +++---- armi/reactor/assemblies.py | 7 +-- armi/reactor/blocks.py | 29 +++++------ armi/reactor/blueprints/__init__.py | 36 +++++++------- armi/reactor/blueprints/assemblyBlueprint.py | 7 +-- armi/reactor/blueprints/blockBlueprint.py | 5 +- armi/reactor/blueprints/componentBlueprint.py | 8 ++- armi/reactor/blueprints/gridBlueprint.py | 7 ++- armi/reactor/blueprints/isotopicOptions.py | 14 ++---- armi/reactor/blueprints/reactorBlueprint.py | 9 ++-- .../blueprints/tests/test_blueprints.py | 12 ++--- .../blueprints/tests/test_customIsotopics.py | 11 +++-- .../blueprints/tests/test_gridBlueprints.py | 1 - .../tests/test_materialModifications.py | 3 +- .../tests/test_reactorBlueprints.py | 6 +-- armi/reactor/components/__init__.py | 2 +- armi/reactor/components/basicShapes.py | 3 +- armi/reactor/components/complexShapes.py | 4 +- armi/reactor/components/component.py | 14 ++---- armi/reactor/components/volumetricShapes.py | 3 +- armi/reactor/composites.py | 4 +- .../axialExpansionChanger/__init__.py | 4 +- .../assemblyAxialLinkage.py | 3 +- .../axialExpansionChanger/expansionData.py | 6 +-- armi/reactor/converters/geometryConverters.py | 36 +++++++------- armi/reactor/converters/meshConverters.py | 2 +- .../generalParameterSweepConverters.py | 2 +- .../tests/test_paramSweepConverters.py | 5 +- .../converters/pinTypeBlockConverters.py | 2 +- .../converters/tests/test_blockConverter.py | 2 +- .../tests/test_geometryConverters.py | 9 ++-- .../converters/tests/test_meshConverters.py | 2 +- .../tests/test_pinTypeBlockConverters.py | 7 ++- .../converters/tests/test_uniformMesh.py | 9 ++-- armi/reactor/converters/uniformMesh.py | 22 ++++----- armi/reactor/cores.py | 24 ++++----- armi/reactor/flags.py | 1 - armi/reactor/geometry.py | 2 +- armi/reactor/grids/__init__.py | 24 +++++---- armi/reactor/grids/axial.py | 2 +- armi/reactor/grids/cartesian.py | 2 +- armi/reactor/grids/grid.py | 4 +- armi/reactor/grids/hexagonal.py | 4 +- armi/reactor/grids/locations.py | 4 +- armi/reactor/grids/structuredGrid.py | 4 +- armi/reactor/grids/tests/test_grids.py | 7 ++- armi/reactor/grids/thetarz.py | 4 +- armi/reactor/parameters/__init__.py | 33 ++++++------- .../parameters/parameterCollections.py | 11 ++--- .../parameters/parameterDefinitions.py | 4 +- armi/reactor/reactors.py | 11 ++--- armi/reactor/systemLayoutInput.py | 12 ++--- armi/reactor/tests/test_assemblies.py | 27 +++++----- armi/reactor/tests/test_blocks.py | 14 +++--- armi/reactor/tests/test_components.py | 3 +- armi/reactor/tests/test_composites.py | 16 ++---- armi/reactor/tests/test_hexBlockRotate.py | 6 +-- armi/reactor/tests/test_parameters.py | 4 +- armi/reactor/tests/test_reactors.py | 19 +++---- armi/reactor/tests/test_zones.py | 16 +++--- armi/settings/__init__.py | 11 +++-- armi/settings/caseSettings.py | 4 +- armi/settings/fwSettings/__init__.py | 4 +- armi/settings/fwSettings/globalSettings.py | 1 - armi/settings/fwSettings/reportSettings.py | 1 - .../tests/test_tightCouplingSettings.py | 4 +- armi/settings/setting.py | 5 +- armi/settings/settingsIO.py | 7 ++- armi/settings/tests/test_inspectors.py | 4 +- armi/settings/tests/test_settings.py | 16 ++---- armi/settings/tests/test_settingsIO.py | 6 +-- armi/tests/__init__.py | 9 ++-- .../anl-afci-177-fuelManagement.py | 3 +- armi/tests/test_apps.py | 18 ++++--- armi/tests/test_interfaces.py | 3 +- armi/tests/test_lwrInputs.py | 7 ++- armi/tests/test_mpiActions.py | 6 +-- armi/tests/test_mpiFeatures.py | 12 ++--- armi/tests/test_mpiParameters.py | 3 +- armi/tests/test_plugins.py | 18 ++++--- armi/tests/test_user_plugins.py | 6 +-- armi/utils/asciimaps.py | 1 - armi/utils/codeTiming.py | 2 +- armi/utils/customExceptions.py | 3 +- armi/utils/densityTools.py | 6 +-- armi/utils/directoryChangers.py | 6 +-- armi/utils/flags.py | 3 +- armi/utils/gridEditor.py | 17 +++---- armi/utils/iterables.py | 2 +- armi/utils/parsing.py | 1 + armi/utils/plotting.py | 11 ++--- armi/utils/reportPlotting.py | 7 ++- armi/utils/tabulate.py | 8 +-- armi/utils/tests/test_asciimaps.py | 1 - armi/utils/tests/test_custom_exceptions.py | 3 +- armi/utils/tests/test_directoryChangers.py | 5 +- armi/utils/tests/test_mathematics.py | 2 +- armi/utils/tests/test_outputCache.py | 3 +- armi/utils/tests/test_plotting.py | 3 +- armi/utils/tests/test_tabulate.py | 49 ++++++++++--------- armi/utils/tests/test_textProcessors.py | 8 +-- armi/utils/tests/test_triangle.py | 1 + armi/utils/tests/test_utils.py | 2 +- armi/utils/textProcessors.py | 5 +- armi/utils/units.py | 1 - doc/conf.py | 7 +-- .../framework/run_chartOfNuclides.py | 2 +- .../framework/run_computeReactionRates.py | 15 ++---- .../framework/run_fuelManagement.py | 1 - doc/gallery-src/framework/run_grids1_hex.py | 4 +- doc/gallery-src/framework/run_isotxs.py | 4 +- doc/gallery-src/framework/run_materials.py | 2 +- .../run_programmaticReactorDefinition.py | 14 +++--- .../framework/run_reactorFacemap.py | 2 +- .../framework/run_transmutationMatrix.py | 4 +- pyproject.toml | 3 +- 242 files changed, 713 insertions(+), 990 deletions(-) diff --git a/.github/workflows/validatemanifest.py b/.github/workflows/validatemanifest.py index 2e1fd901a..cb2978e46 100644 --- a/.github/workflows/validatemanifest.py +++ b/.github/workflows/validatemanifest.py @@ -18,8 +18,9 @@ Validate that we aren't trying to include files that don't exist. """ -from glob import glob import os +from glob import glob + import toml # CONSTANTS diff --git a/armi/__init__.py b/armi/__init__.py index 7a3eadc52..874ddf84f 100644 --- a/armi/__init__.py +++ b/armi/__init__.py @@ -51,8 +51,10 @@ import subprocess import sys import traceback -from typing import Optional, List, Type import warnings +from typing import List, Optional, Type + +import __main__ as main # The _bootstrap module performs operations that may need to occur before it is # necessarily safe to import the rest of the ARMI system. Things like: @@ -60,35 +62,26 @@ # - detect the nature of interaction with the user (terminal UI, GUI, unsupervized, etc) # - Initialize the nuclide database import armi._bootstrap -from armi import context +from armi import apps, cli, context, pluginManager, plugins, runLog from armi.context import ( - ROOT, - RES, - DOC, - USER, - START_TIME, + APP_DATA, CURRENT_MODE, + DOC, MPI_COMM, - MPI_RANK, + MPI_DISTRIBUTABLE, MPI_NODENAME, MPI_NODENAMES, - MPI_DISTRIBUTABLE, + MPI_RANK, MPI_SIZE, - APP_DATA, + RES, + ROOT, + START_TIME, + USER, + Mode, ) -from armi.context import Mode - -from armi import cli from armi.meta import __version__ -from armi import apps -from armi import pluginManager -from armi import plugins -from armi import runLog -from armi.reactor import flags -from armi.reactor import parameters from armi.nucDirectory import nuclideBases - -import __main__ as main +from armi.reactor import flags, parameters # ARMI does not configure its own application by default. This is mostly to catch issues # involving calling code that requires the framework to be configured before that has @@ -151,8 +144,7 @@ def init(choice=None, fName=None, cs=None, skipInspection=False): -------- >>> o = armi.init() """ - from armi import cases - from armi import settings + from armi import cases, settings if cs is None: if fName is None: @@ -178,12 +170,8 @@ def getDefaultPlugins() -> List[Type[plugins.ArmiPlugin]]: This is useful for an application to fold all of the ARMI Framework's capabilities into its own set of plugins. """ - from armi import cli - from armi import bookkeeping - from armi.physics import fuelCycle - from armi.physics import neutronics - from armi.physics import safety - from armi import reactor + from armi import bookkeeping, cli, reactor + from armi.physics import fuelCycle, neutronics, safety defaultPlugins = [ cli.EntryPointsPlugin, diff --git a/armi/__main__.py b/armi/__main__.py index 3389d548e..0a9c379f1 100644 --- a/armi/__main__.py +++ b/armi/__main__.py @@ -20,9 +20,7 @@ """ import sys -from armi import apps -from armi import configure, isConfigured -from armi import context +from armi import apps, configure, context, isConfigured from armi.cli import ArmiCLI diff --git a/armi/apps.py b/armi/apps.py index 22b620239..7d6263868 100644 --- a/armi/apps.py +++ b/armi/apps.py @@ -29,16 +29,15 @@ code to access such things through an App object. """ # ruff: noqa: E402 -from typing import Dict, Optional, Tuple, List import collections import importlib import sys +from typing import Dict, List, Optional, Tuple -from armi import context, plugins, pluginManager, meta, settings +from armi import context, meta, pluginManager, plugins, settings from armi.reactor import parameters from armi.reactor.flags import Flags -from armi.settings import fwSettings -from armi.settings import Setting +from armi.settings import Setting, fwSettings class App: @@ -85,14 +84,14 @@ def __init__(self): self.__initNewPlugins() def __initNewPlugins(self): - from armi import cli - from armi import bookkeeping - from armi.physics import fuelCycle - from armi.physics import fuelPerformance - from armi.physics import neutronics - from armi.physics import safety - from armi.physics import thermalHydraulics - from armi import reactor + from armi import bookkeeping, cli, reactor + from armi.physics import ( + fuelCycle, + fuelPerformance, + neutronics, + safety, + thermalHydraulics, + ) self._pm = plugins.getNewPluginManager() for plugin in ( diff --git a/armi/bookkeeping/__init__.py b/armi/bookkeeping/__init__.py index 00c8f149d..4a1b0bf7d 100644 --- a/armi/bookkeeping/__init__.py +++ b/armi/bookkeeping/__init__.py @@ -20,11 +20,13 @@ class BookkeepingPlugin(plugins.ArmiPlugin): @staticmethod @plugins.HOOKIMPL def exposeInterfaces(cs): + from armi.bookkeeping import ( + historyTracker, + mainInterface, + memoryProfiler, + snapshotInterface, + ) from armi.bookkeeping.db import databaseInterface - from armi.bookkeeping import historyTracker - from armi.bookkeeping import memoryProfiler - from armi.bookkeeping import mainInterface - from armi.bookkeeping import snapshotInterface from armi.bookkeeping.report import reportInterface interfaceInfo = [] @@ -75,8 +77,8 @@ def mpiActionRequiresReset(cmd) -> bool: -------- armi.operators.operatorMPI.OperatorMPI.workerOperate """ - from armi.bookkeeping import memoryProfiler from armi import mpiActions + from armi.bookkeeping import memoryProfiler if isinstance(cmd, mpiActions.MpiAction): for donotReset in ( diff --git a/armi/bookkeeping/db/__init__.py b/armi/bookkeeping/db/__init__.py index efc5f734a..5e2b9f421 100644 --- a/armi/bookkeeping/db/__init__.py +++ b/armi/bookkeeping/db/__init__.py @@ -62,15 +62,14 @@ import os from armi import runLog +from armi.bookkeeping.db.compareDB3 import compareDatabases # re-export package components for easier import from armi.bookkeeping.db.database import Database from armi.bookkeeping.db.database3 import Database3 from armi.bookkeeping.db.databaseInterface import DatabaseInterface -from armi.bookkeeping.db.compareDB3 import compareDatabases from armi.bookkeeping.db.factory import databaseFactory - __all__ = [ "Database", "Database3", diff --git a/armi/bookkeeping/db/compareDB3.py b/armi/bookkeeping/db/compareDB3.py index e71e4167e..ec64cab72 100644 --- a/armi/bookkeeping/db/compareDB3.py +++ b/armi/bookkeeping/db/compareDB3.py @@ -43,11 +43,11 @@ even if the code hasn't changed. """ -from typing import Sequence, Optional, Pattern, Tuple import collections import os import re import traceback +from typing import Optional, Pattern, Sequence, Tuple import h5py import numpy as np diff --git a/armi/bookkeeping/db/databaseInterface.py b/armi/bookkeeping/db/databaseInterface.py index 5e1e73ce9..fd5ebbd2b 100644 --- a/armi/bookkeeping/db/databaseInterface.py +++ b/armi/bookkeeping/db/databaseInterface.py @@ -21,25 +21,22 @@ import pathlib import time from typing import ( + MutableSequence, Optional, - Tuple, Sequence, - MutableSequence, + Tuple, ) -from armi import context -from armi import interfaces -from armi import runLog +from armi import context, interfaces, runLog from armi.bookkeeping.db.database import Database, getH5GroupName -from armi.reactor.parameters import parameterDefinitions +from armi.bookkeeping.db.typedefs import Histories, History from armi.reactor.composites import ArmiObject -from armi.bookkeeping.db.typedefs import History, Histories -from armi.utils import getPreviousTimeNode, getStepLengths +from armi.reactor.parameters import parameterDefinitions from armi.settings.fwSettings.databaseSettings import ( - CONF_SYNC_AFTER_WRITE, CONF_FORCE_DB_PARAMS, + CONF_SYNC_AFTER_WRITE, ) - +from armi.utils import getPreviousTimeNode, getStepLengths ORDER = interfaces.STACK_ORDER.BOOKKEEPING diff --git a/armi/bookkeeping/db/factory.py b/armi/bookkeeping/db/factory.py index 386e327a7..50cc51346 100644 --- a/armi/bookkeeping/db/factory.py +++ b/armi/bookkeeping/db/factory.py @@ -17,8 +17,8 @@ import h5py -from armi.bookkeeping.db.database import Database from armi.bookkeeping.db import permissions +from armi.bookkeeping.db.database import Database def databaseFactory(dbName: str, permission: str, version: Optional[str] = None): diff --git a/armi/bookkeeping/db/layout.py b/armi/bookkeeping/db/layout.py index e36cd0630..ff0671729 100644 --- a/armi/bookkeeping/db/layout.py +++ b/armi/bookkeeping/db/layout.py @@ -26,12 +26,12 @@ import collections from typing import ( + Any, + Dict, + List, Optional, Tuple, Type, - Dict, - Any, - List, ) import numpy as np @@ -41,8 +41,7 @@ from armi.reactor.components import Component from armi.reactor.composites import ArmiObject from armi.reactor.excoreStructure import ExcoreStructure -from armi.reactor.reactors import Core -from armi.reactor.reactors import Reactor +from armi.reactor.reactors import Core, Reactor # Here we store the Database version information. DB_MAJOR = 3 diff --git a/armi/bookkeeping/db/tests/test_comparedb3.py b/armi/bookkeeping/db/tests/test_comparedb3.py index 4eb5531d8..4bcb18fe2 100644 --- a/armi/bookkeeping/db/tests/test_comparedb3.py +++ b/armi/bookkeeping/db/tests/test_comparedb3.py @@ -19,17 +19,17 @@ import numpy as np from armi.bookkeeping.db.compareDB3 import ( - _compareSets, + DiffResults, + OutputWriter, _compareAuxData, + _compareSets, _diffSimpleData, _diffSpecialData, compareDatabases, - DiffResults, - OutputWriter, ) from armi.bookkeeping.db.databaseInterface import DatabaseInterface from armi.reactor.tests import test_reactors -from armi.tests import mockRunLogs, TEST_ROOT +from armi.tests import TEST_ROOT, mockRunLogs from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/bookkeeping/db/tests/test_databaseInterface.py b/armi/bookkeeping/db/tests/test_databaseInterface.py index 1e77061d4..e5d066553 100644 --- a/armi/bookkeeping/db/tests/test_databaseInterface.py +++ b/armi/bookkeeping/db/tests/test_databaseInterface.py @@ -21,9 +21,7 @@ from numpy.testing import assert_allclose, assert_equal from armi import __version__ as version -from armi import interfaces -from armi import runLog -from armi import settings +from armi import interfaces, runLog, settings from armi.bookkeeping.db.database import Database from armi.bookkeeping.db.databaseInterface import DatabaseInterface from armi.cases import case diff --git a/armi/bookkeeping/db/tests/test_layout.py b/armi/bookkeeping/db/tests/test_layout.py index 3769351d0..5acf5e4ed 100644 --- a/armi/bookkeeping/db/tests/test_layout.py +++ b/armi/bookkeeping/db/tests/test_layout.py @@ -16,8 +16,7 @@ import unittest from armi import context -from armi.bookkeeping.db import database -from armi.bookkeeping.db import layout +from armi.bookkeeping.db import database, layout from armi.reactor import grids from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/bookkeeping/db/typedefs.py b/armi/bookkeeping/db/typedefs.py index a8cf505cd..e1ffd8990 100644 --- a/armi/bookkeeping/db/typedefs.py +++ b/armi/bookkeeping/db/typedefs.py @@ -12,12 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Dict, Tuple, Any +from typing import Any, Dict, Tuple from armi.reactor.composites import ArmiObject from armi.reactor.grids import LocationBase - # Return type for the getHistories() method # param time node value History = Dict[str, Dict[Tuple[int, int], Any]] diff --git a/armi/bookkeeping/historyTracker.py b/armi/bookkeeping/historyTracker.py index 4f5a6e752..0bf34e347 100644 --- a/armi/bookkeeping/historyTracker.py +++ b/armi/bookkeeping/historyTracker.py @@ -67,21 +67,19 @@ def getHistoryParams(self): See :ref:`detail-assems`. """ -from typing import TYPE_CHECKING import traceback +from typing import TYPE_CHECKING -from armi import interfaces -from armi import runLog -from armi import operators -from armi.reactor.flags import Flags +from armi import interfaces, operators, runLog from armi.reactor import grids +from armi.reactor.flags import Flags from armi.utils import tabulate ORDER = 2 * interfaces.STACK_ORDER.BEFORE + interfaces.STACK_ORDER.BOOKKEEPING if TYPE_CHECKING: - from armi.reactor.blocks import Block from armi.reactor.assemblies import Assembly + from armi.reactor.blocks import Block def describeInterfaces(cs): diff --git a/armi/bookkeeping/mainInterface.py b/armi/bookkeeping/mainInterface.py index 3689ec038..67b26e886 100644 --- a/armi/bookkeeping/mainInterface.py +++ b/armi/bookkeeping/mainInterface.py @@ -22,18 +22,15 @@ import os import re -from armi import context -from armi import interfaces -from armi import operators -from armi import runLog -from armi import utils +from armi import context, interfaces, operators, runLog, utils from armi.bookkeeping.db.database import Database -from armi.settings.fwSettings.globalSettings import CONF_COPY_FILES_FROM -from armi.settings.fwSettings.globalSettings import CONF_COPY_FILES_TO +from armi.settings.fwSettings.globalSettings import ( + CONF_COPY_FILES_FROM, + CONF_COPY_FILES_TO, +) from armi.utils import pathTools from armi.utils.customExceptions import InputError - ORDER = interfaces.STACK_ORDER.PREPROCESSING diff --git a/armi/bookkeeping/memoryProfiler.py b/armi/bookkeeping/memoryProfiler.py index f3b6106d4..302f2d462 100644 --- a/armi/bookkeeping/memoryProfiler.py +++ b/armi/bookkeeping/memoryProfiler.py @@ -36,15 +36,12 @@ https://pythonhosted.org/psutil/ https://docs.python.org/3/library/gc.html#gc.garbage """ -from os import cpu_count -from typing import Optional import gc import sys +from os import cpu_count +from typing import Optional -from armi import context -from armi import interfaces -from armi import mpiActions -from armi import runLog +from armi import context, interfaces, mpiActions, runLog from armi.reactor.composites import ArmiObject from armi.utils import tabulate from armi.utils.customExceptions import NonexistentSetting diff --git a/armi/bookkeeping/report/newReportUtils.py b/armi/bookkeeping/report/newReportUtils.py index 98c14bf92..e7f2adb45 100644 --- a/armi/bookkeeping/report/newReportUtils.py +++ b/armi/bookkeeping/report/newReportUtils.py @@ -13,6 +13,7 @@ # limitations under the License. import collections import os + import numpy as np from armi import runLog @@ -22,12 +23,12 @@ from armi.reactor.components import component from armi.reactor.flags import Flags from armi.utils import ( - units, - plotting, - iterables, getAvailabilityFactors, getCycleLengths, getStepLengths, + iterables, + plotting, + units, ) @@ -294,8 +295,7 @@ def _setGeneralCoreParametersData(core, cs, coreDesignTable): def _setGeneralSimulationData(core, cs, coreDesignTable): - from armi.physics.neutronics.settings import CONF_GEN_XS - from armi.physics.neutronics.settings import CONF_GLOBAL_FLUX_ACTIVE + from armi.physics.neutronics.settings import CONF_GEN_XS, CONF_GLOBAL_FLUX_ACTIVE coreDesignTable.addRow([" ", ""]) coreDesignTable.addRow(["Full Core Model", "{}".format(core.isFullCore)]) @@ -411,8 +411,7 @@ def insertSettingsData(cs, report): report: ReportContent The report to be added to """ - from armi.physics.neutronics.settings import CONF_GEN_XS - from armi.physics.neutronics.settings import CONF_NEUTRONICS_KERNEL + from armi.physics.neutronics.settings import CONF_GEN_XS, CONF_NEUTRONICS_KERNEL report[COMPREHENSIVE_REPORT][CASE_PARAMETERS] = newReports.Table("Case Parameters") report[COMPREHENSIVE_REPORT][REACTOR_PARAMS] = newReports.Table( diff --git a/armi/bookkeeping/report/reportInterface.py b/armi/bookkeeping/report/reportInterface.py index 0105f70bb..46940fb12 100644 --- a/armi/bookkeeping/report/reportInterface.py +++ b/armi/bookkeeping/report/reportInterface.py @@ -20,16 +20,13 @@ """ import re -from armi import interfaces -from armi import runLog +from armi import interfaces, runLog from armi.bookkeeping import report from armi.bookkeeping.report import reportingUtils from armi.physics import neutronics from armi.physics.neutronics.settings import CONF_NEUTRONICS_TYPE from armi.reactor.flags import Flags -from armi.utils import directoryChangers -from armi.utils import reportPlotting -from armi.utils import units +from armi.utils import directoryChangers, reportPlotting, units ORDER = interfaces.STACK_ORDER.BEFORE + interfaces.STACK_ORDER.BOOKKEEPING diff --git a/armi/bookkeeping/report/reportingUtils.py b/armi/bookkeeping/report/reportingUtils.py index 9ac13287c..1378efdf7 100644 --- a/armi/bookkeeping/report/reportingUtils.py +++ b/armi/bookkeeping/report/reportingUtils.py @@ -16,7 +16,6 @@ A collection of miscellaneous functions used by ReportInterface to generate various reports. """ -from copy import copy import collections import os import pathlib @@ -25,23 +24,23 @@ import sys import textwrap import time +from copy import copy import numpy as np -from armi import context -from armi import interfaces -from armi import runLog +from armi import context, interfaces, runLog from armi.bookkeeping import report from armi.operators import RunTypes from armi.reactor.components import ComponentType from armi.reactor.flags import Flags -from armi.utils import getFileSHA1Hash -from armi.utils import iterables -from armi.utils import plotting -from armi.utils import tabulate -from armi.utils import textProcessors -from armi.utils import units - +from armi.utils import ( + getFileSHA1Hash, + iterables, + plotting, + tabulate, + textProcessors, + units, +) # Set to prevent the image and text from being too small to read. MAX_ASSEMS_PER_ASSEM_PLOT = 6 @@ -970,8 +969,7 @@ def _setGeneralCoreParametersData(core, cs, coreDesignTable): def _setGeneralSimulationData(core, cs, coreDesignTable): - from armi.physics.neutronics.settings import CONF_GEN_XS - from armi.physics.neutronics.settings import CONF_GLOBAL_FLUX_ACTIVE + from armi.physics.neutronics.settings import CONF_GEN_XS, CONF_GLOBAL_FLUX_ACTIVE report.setData(" ", "", coreDesignTable, report.DESIGN) report.setData( diff --git a/armi/bookkeeping/report/tests/test_newReport.py b/armi/bookkeeping/report/tests/test_newReport.py index bf11ecf2c..3337cc351 100644 --- a/armi/bookkeeping/report/tests/test_newReport.py +++ b/armi/bookkeeping/report/tests/test_newReport.py @@ -20,12 +20,10 @@ import htmltree from armi import getPluginManagerOrFail -from armi.bookkeeping.report import data -from armi.bookkeeping.report import newReports +from armi.bookkeeping.report import data, newReports from armi.physics.neutronics.reports import neutronicsPlotting from armi.reactor.tests import test_reactors -from armi.tests import mockRunLogs -from armi.tests import TEST_ROOT +from armi.tests import TEST_ROOT, mockRunLogs from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/bookkeeping/report/tests/test_report.py b/armi/bookkeeping/report/tests/test_report.py index 6dfb12e26..24e0ac9b8 100644 --- a/armi/bookkeeping/report/tests/test_report.py +++ b/armi/bookkeeping/report/tests/test_report.py @@ -13,13 +13,13 @@ # limitations under the License. """Really basic tests of the report Utils.""" -from glob import glob -from unittest.mock import patch import logging import os import subprocess import sys import unittest +from glob import glob +from unittest.mock import patch from armi import runLog, settings from armi.bookkeeping import report diff --git a/armi/bookkeeping/snapshotInterface.py b/armi/bookkeeping/snapshotInterface.py index 087c0a6b9..1ef75c8a8 100644 --- a/armi/bookkeeping/snapshotInterface.py +++ b/armi/bookkeeping/snapshotInterface.py @@ -27,12 +27,9 @@ Snapshots can be requested through the settings: ``dumpSnapshot`` and/or ``defaultSnapshots``. """ -from armi import interfaces -from armi import operators -from armi import runLog +from armi import interfaces, operators, runLog from armi.utils import getStepLengths - ORDER = interfaces.STACK_ORDER.POSTPROCESSING diff --git a/armi/bookkeeping/tests/_constants.py b/armi/bookkeeping/tests/_constants.py index 8002d27ec..28f28041e 100644 --- a/armi/bookkeeping/tests/_constants.py +++ b/armi/bookkeeping/tests/_constants.py @@ -22,7 +22,6 @@ from armi.tests import TEST_ROOT - # These files are needed to run the data_model ipython notebook, which is done in # test_historyTracker, and when building the docs. TUTORIAL_FILES = [ diff --git a/armi/bookkeeping/tests/test_historyTracker.py b/armi/bookkeeping/tests/test_historyTracker.py index e27a92395..a9d5afdc6 100644 --- a/armi/bookkeeping/tests/test_historyTracker.py +++ b/armi/bookkeeping/tests/test_historyTracker.py @@ -24,14 +24,12 @@ import shutil import unittest -from armi import settings -from armi import utils +from armi import settings, utils from armi.bookkeeping import historyTracker from armi.bookkeeping.tests._constants import TUTORIAL_FILES from armi.cases import case from armi.context import ROOT -from armi.reactor import blocks -from armi.reactor import grids +from armi.reactor import blocks, grids from armi.reactor.flags import Flags from armi.tests import ArmiTestHelper from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/bookkeeping/tests/test_memoryProfiler.py b/armi/bookkeeping/tests/test_memoryProfiler.py index 497fb3a64..d32adf185 100644 --- a/armi/bookkeeping/tests/test_memoryProfiler.py +++ b/armi/bookkeeping/tests/test_memoryProfiler.py @@ -13,9 +13,9 @@ # limitations under the License. """Tests for memoryProfiler.""" -from unittest.mock import MagicMock, patch import logging import unittest +from unittest.mock import MagicMock, patch from armi import runLog from armi.bookkeeping import memoryProfiler @@ -24,7 +24,7 @@ getTotalJobMemory, ) from armi.reactor.tests import test_reactors -from armi.tests import mockRunLogs, TEST_ROOT +from armi.tests import TEST_ROOT, mockRunLogs class TestMemoryProfiler(unittest.TestCase): diff --git a/armi/bookkeeping/visualization/entryPoint.py b/armi/bookkeeping/visualization/entryPoint.py index 13d919951..7a677721e 100644 --- a/armi/bookkeeping/visualization/entryPoint.py +++ b/armi/bookkeeping/visualization/entryPoint.py @@ -127,9 +127,8 @@ def parse(self, args): def invoke(self): # late imports so that we dont have to import the world to do anything - from armi.bookkeeping.visualization import vtk - from armi.bookkeeping.visualization import xdmf from armi.bookkeeping.db import databaseFactory + from armi.bookkeeping.visualization import vtk, xdmf # a little baroque, but easy to extend with future formats formatMap = { diff --git a/armi/bookkeeping/visualization/tests/test_vis.py b/armi/bookkeeping/visualization/tests/test_vis.py index c53dae864..050357280 100644 --- a/armi/bookkeeping/visualization/tests/test_vis.py +++ b/armi/bookkeeping/visualization/tests/test_vis.py @@ -20,11 +20,8 @@ from armi import settings from armi.bookkeeping.db import Database -from armi.bookkeeping.visualization import utils -from armi.bookkeeping.visualization import vtk -from armi.bookkeeping.visualization import xdmf -from armi.reactor import blocks -from armi.reactor import components +from armi.bookkeeping.visualization import utils, vtk, xdmf +from armi.reactor import blocks, components from armi.reactor.tests import test_reactors from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/bookkeeping/visualization/utils.py b/armi/bookkeeping/visualization/utils.py index c692afeeb..eabafd020 100644 --- a/armi/bookkeeping/visualization/utils.py +++ b/armi/bookkeeping/visualization/utils.py @@ -26,12 +26,9 @@ from pyevtk.hl import unstructuredGridToVTK from pyevtk.vtk import VtkHexahedron, VtkQuadraticHexahedron -from armi.reactor import assemblies -from armi.reactor import reactors -from armi.reactor import blocks +from armi.reactor import assemblies, blocks, reactors from armi.utils import hexagon - # The hex prism cell type is not very well-documented, and so is not described in # pyevtk. Digging into the header reveals that `16` does the trick. _HEX_PRISM_TID = 16 diff --git a/armi/bookkeeping/visualization/vtk.py b/armi/bookkeeping/visualization/vtk.py index f5b382f66..5a4a30013 100644 --- a/armi/bookkeeping/visualization/vtk.py +++ b/armi/bookkeeping/visualization/vtk.py @@ -28,20 +28,15 @@ wouldn't be too difficult to do here either. Also future work, but probably not super important unless dealing with really big meshes. """ -from typing import Dict, Any, List, Optional, Set, Tuple +from typing import Any, Dict, List, Optional, Set, Tuple import numpy as np from pyevtk.vtk import VtkGroup from armi import runLog from armi.bookkeeping.db import database -from armi.bookkeeping.visualization import dumper -from armi.bookkeeping.visualization import utils -from armi.reactor import assemblies -from armi.reactor import blocks -from armi.reactor import composites -from armi.reactor import parameters -from armi.reactor import reactors +from armi.bookkeeping.visualization import dumper, utils +from armi.reactor import assemblies, blocks, composites, parameters, reactors class VtkDumper(dumper.VisFileDumper): diff --git a/armi/bookkeeping/visualization/xdmf.py b/armi/bookkeeping/visualization/xdmf.py index c912bba21..566816952 100644 --- a/armi/bookkeeping/visualization/xdmf.py +++ b/armi/bookkeeping/visualization/xdmf.py @@ -39,22 +39,17 @@ import io import math import pathlib -from typing import Optional, Set, List, Tuple, Dict -import xml.etree.ElementTree as ET import xml.dom.minidom +import xml.etree.ElementTree as ET +from typing import Dict, List, Optional, Set, Tuple -import numpy as np import h5py +import numpy as np from armi import runLog -from armi.reactor import assemblies -from armi.reactor import composites -from armi.reactor import reactors -from armi.reactor import blocks from armi.bookkeeping.db import database -from armi.bookkeeping.visualization import dumper -from armi.bookkeeping.visualization import utils - +from armi.bookkeeping.visualization import dumper, utils +from armi.reactor import assemblies, blocks, composites, reactors _VTK_TO_XDMF_CELLS = {16: 16} diff --git a/armi/cases/case.py b/armi/cases/case.py index 588b020c4..05eeb3ce1 100644 --- a/armi/cases/case.py +++ b/armi/cases/case.py @@ -24,7 +24,6 @@ -------- armi.cases.suite : A collection of Cases """ -from typing import Dict, Optional, Sequence, Set, Union import ast import cProfile import glob @@ -37,28 +36,22 @@ import textwrap import time import trace +from typing import Dict, Optional, Sequence, Set, Union import coverage -from armi import context -from armi import getPluginManager -from armi import interfaces -from armi import operators -from armi import runLog -from armi import settings +from armi import context, getPluginManager, interfaces, operators, runLog, settings from armi.bookkeeping.db import compareDatabases from armi.cli import reportsEntryPoint from armi.nucDirectory import nuclideBases from armi.physics.neutronics.settings import CONF_LOADING_FILE -from armi.reactor import blueprints -from armi.reactor import reactors -from armi.reactor import systemLayoutInput -from armi.utils import pathTools -from armi.utils import tabulate -from armi.utils import textProcessors +from armi.reactor import blueprints, reactors, systemLayoutInput +from armi.utils import pathTools, tabulate, textProcessors from armi.utils.customExceptions import NonexistentSetting -from armi.utils.directoryChangers import DirectoryChanger -from armi.utils.directoryChangers import ForcedCreationDirectoryChanger +from armi.utils.directoryChangers import ( + DirectoryChanger, + ForcedCreationDirectoryChanger, +) # Change from default .coverage to help with Windows dotfile issues. # Must correspond with data_file entry in `pyproject.toml`! diff --git a/armi/cases/inputModifiers/tests/test_inputModifiers.py b/armi/cases/inputModifiers/tests/test_inputModifiers.py index d711275aa..cb03835a4 100644 --- a/armi/cases/inputModifiers/tests/test_inputModifiers.py +++ b/armi/cases/inputModifiers/tests/test_inputModifiers.py @@ -12,20 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. """Unit tests for input modifiers.""" -from ruamel import yaml import io import os import unittest -from armi import cases -from armi import settings +from ruamel import yaml + +from armi import cases, settings from armi.cases import suiteBuilder -from armi.reactor import blueprints -from armi.reactor import systemLayoutInput -from armi.utils import directoryChangers from armi.cases.inputModifiers import ( - neutronicsModifiers, inputModifiers, + neutronicsModifiers, pinTypeInputModifiers, ) from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( @@ -36,7 +33,9 @@ CONF_EPS_FSAVG, CONF_EPS_FSPOINT, ) +from armi.reactor import blueprints, systemLayoutInput from armi.reactor.tests import test_reactors +from armi.utils import directoryChangers class MockGeom: diff --git a/armi/cases/suite.py b/armi/cases/suite.py index 222e2397c..6b580e9ec 100644 --- a/armi/cases/suite.py +++ b/armi/cases/suite.py @@ -28,14 +28,12 @@ armi.cases.case : An individual item of a case suite. """ import os -from typing import Optional, Sequence import traceback +from typing import Optional, Sequence -from armi import runLog -from armi import settings +from armi import runLog, settings from armi.cases import case as armicase -from armi.utils import directoryChangers -from armi.utils import tabulate +from armi.utils import directoryChangers, tabulate class CaseSuite: diff --git a/armi/cases/suiteBuilder.py b/armi/cases/suiteBuilder.py index fd846086d..47d475bd1 100644 --- a/armi/cases/suiteBuilder.py +++ b/armi/cases/suiteBuilder.py @@ -25,12 +25,13 @@ of how you can modify inputs for parameter sweeping. Power-users will generally make their own ``Modifier``\ s that are design-specific. """ -from collections import Counter -from pyDOE import lhs -from typing import List import copy import os import random +from collections import Counter +from typing import List + +from pyDOE import lhs from armi.cases import suite diff --git a/armi/cases/tests/test_cases.py b/armi/cases/tests/test_cases.py index b04c9fcdd..9347e1616 100644 --- a/armi/cases/tests/test_cases.py +++ b/armi/cases/tests/test_cases.py @@ -22,24 +22,14 @@ import h5py -from armi import cases -from armi import context -from armi import getApp -from armi import interfaces -from armi import plugins -from armi import runLog -from armi import settings +from armi import cases, context, getApp, interfaces, plugins, runLog, settings from armi.bookkeeping.db.databaseInterface import DatabaseInterface from armi.physics.fuelCycle.settings import CONF_SHUFFLE_LOGIC -from armi.reactor import blueprints -from armi.reactor import systemLayoutInput +from armi.reactor import blueprints, systemLayoutInput from armi.reactor.tests import test_reactors -from armi.tests import ARMI_RUN_PATH -from armi.tests import mockRunLogs -from armi.tests import TEST_ROOT +from armi.tests import ARMI_RUN_PATH, TEST_ROOT, mockRunLogs from armi.utils import directoryChangers - GEOM_INPUT = """ diff --git a/armi/cases/tests/test_suiteBuilder.py b/armi/cases/tests/test_suiteBuilder.py index 81c94c639..eab1f618c 100644 --- a/armi/cases/tests/test_suiteBuilder.py +++ b/armi/cases/tests/test_suiteBuilder.py @@ -18,12 +18,12 @@ from armi import cases, settings from armi.cases.inputModifiers.inputModifiers import ( - SamplingInputModifier, InputModifier, + SamplingInputModifier, ) from armi.cases.suiteBuilder import ( - LatinHyperCubeSuiteBuilder, FullFactorialSuiteBuilder, + LatinHyperCubeSuiteBuilder, SeparateEffectsSuiteBuilder, ) diff --git a/armi/cli/__init__.py b/armi/cli/__init__.py index dd46f65c2..2e496f413 100644 --- a/armi/cli/__init__.py +++ b/armi/cli/__init__.py @@ -45,10 +45,7 @@ import textwrap from typing import Optional -from armi import context -from armi import meta -from armi import plugins -from armi import runLog +from armi import context, meta, plugins, runLog class EntryPointsPlugin(plugins.ArmiPlugin): @@ -57,16 +54,16 @@ class EntryPointsPlugin(plugins.ArmiPlugin): def defineEntryPoints(): from armi.cli import ( checkInputs, + # testing + cleanTemps, clone, compareCases, + gridGui, migrateInputs, modify, + reportsEntryPoint, run, - gridGui, - # testing - cleanTemps, runSuite, - reportsEntryPoint, ) entryPoints = [] diff --git a/armi/cli/database.py b/armi/cli/database.py index bf33e20ee..df55db474 100644 --- a/armi/cli/database.py +++ b/armi/cli/database.py @@ -16,8 +16,7 @@ import os import pathlib -from armi import context -from armi import runLog +from armi import context, runLog from armi.cli.entryPoint import EntryPoint from armi.utils.textProcessors import resolveMarkupInclusions diff --git a/armi/cli/gridGui.py b/armi/cli/gridGui.py index e99c82e6c..d02c5dd13 100644 --- a/armi/cli/gridGui.py +++ b/armi/cli/gridGui.py @@ -38,6 +38,7 @@ def invoke(self): # invoking the entry point try: import wx + from armi.utils import gridEditor except ImportError: raise RuntimeError( diff --git a/armi/cli/modify.py b/armi/cli/modify.py index 197f9f8bf..e1ed6bdaf 100644 --- a/armi/cli/modify.py +++ b/armi/cli/modify.py @@ -17,9 +17,7 @@ file(s). All valid settings may be used as keyword arguments. """ -from armi import operators -from armi import runLog -from armi import settings +from armi import operators, runLog, settings from armi.cli.entryPoint import EntryPoint diff --git a/armi/cli/reportsEntryPoint.py b/armi/cli/reportsEntryPoint.py index efb2802fc..12ca7eb25 100644 --- a/armi/cli/reportsEntryPoint.py +++ b/armi/cli/reportsEntryPoint.py @@ -17,8 +17,7 @@ from armi.bookkeeping.db import databaseFactory from armi.bookkeeping.report import newReports as reports from armi.cli import entryPoint -from armi.reactor import blueprints -from armi.reactor import reactors +from armi.reactor import blueprints, reactors from armi.utils.directoryChangers import ForcedCreationDirectoryChanger diff --git a/armi/cli/runSuite.py b/armi/cli/runSuite.py index 6df7d1e84..7bd38201e 100644 --- a/armi/cli/runSuite.py +++ b/armi/cli/runSuite.py @@ -15,8 +15,8 @@ """Run multiple ARMI cases one after the other on the local machine.""" import os -from armi.cli.run import RunEntryPoint from armi import cases +from armi.cli.run import RunEntryPoint from armi.utils import directoryChangers diff --git a/armi/cli/tests/test_runEntryPoint.py b/armi/cli/tests/test_runEntryPoint.py index 9ba20f072..97fcacb3e 100644 --- a/armi/cli/tests/test_runEntryPoint.py +++ b/armi/cli/tests/test_runEntryPoint.py @@ -12,12 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. """Test for run cli entry point.""" -from glob import glob -from shutil import copyfile import logging import os import sys import unittest +from glob import glob +from shutil import copyfile from armi import runLog from armi.__main__ import main @@ -35,7 +35,7 @@ from armi.cli.runSuite import RunSuiteCommand from armi.physics.neutronics.diffIsotxs import CompareIsotxsLibraries from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings -from armi.tests import mockRunLogs, TEST_ROOT, ARMI_RUN_PATH +from armi.tests import ARMI_RUN_PATH, TEST_ROOT, mockRunLogs from armi.utils.directoryChangers import TemporaryDirectoryChanger from armi.utils.dynamicImporter import getEntireFamilyTree diff --git a/armi/context.py b/armi/context.py index 259b87d29..76b9e5c02 100644 --- a/armi/context.py +++ b/armi/context.py @@ -18,7 +18,6 @@ ARMI's global state information: operating system information, environment data, user data, memory parallelism, temporary storage locations, and if operational mode (interactive, gui, or batch). """ -from logging import DEBUG import datetime import enum import gc @@ -26,6 +25,7 @@ import os import sys import time +from logging import DEBUG # h5py needs to be imported here, so that the disconnectAllHdfDBs() call that gets bound to atexit # below doesn't lead to a segfault on python exit. @@ -38,10 +38,8 @@ # >>> import h5py # # >>> atexit.register(willSegFault) - import h5py # noqa: F401 - BLUEPRINTS_IMPORTED = False BLUEPRINTS_IMPORT_CONTEXT = "" diff --git a/armi/interfaces.py b/armi/interfaces.py index ee1c360ea..8f103ea43 100644 --- a/armi/interfaces.py +++ b/armi/interfaces.py @@ -24,16 +24,12 @@ armi.plugins : Register various interfaces """ import copy -from typing import Union -from typing import NamedTuple -from typing import List -from typing import Dict +from typing import Dict, List, NamedTuple, Union import numpy as np from numpy.linalg import norm -from armi import getPluginManagerOrFail, settings, utils -from armi import runLog +from armi import getPluginManagerOrFail, runLog, settings, utils from armi.reactor import parameters from armi.utils import textProcessors diff --git a/armi/materials/__init__.py b/armi/materials/__init__.py index e8f86261d..1078ade88 100644 --- a/armi/materials/__init__.py +++ b/armi/materials/__init__.py @@ -32,10 +32,10 @@ The base class for all materials is in :py:mod:`armi.materials.material`. """ -from typing import List import importlib import inspect import pkgutil +from typing import List from armi.materials.material import Material diff --git a/armi/materials/air.py b/armi/materials/air.py index 643a1d239..53a339bb3 100644 --- a/armi/materials/air.py +++ b/armi/materials/air.py @@ -14,7 +14,7 @@ """Simple air material.""" from armi.materials import material -from armi.utils.units import getTk, G_PER_CM3_TO_KG_PER_M3 +from armi.utils.units import G_PER_CM3_TO_KG_PER_M3, getTk class Air(material.Fluid): diff --git a/armi/materials/be9.py b/armi/materials/be9.py index 1467064b9..8b7122588 100644 --- a/armi/materials/be9.py +++ b/armi/materials/be9.py @@ -18,10 +18,10 @@ It has a nice (n,2n) reaction and is an inhalation hazard. """ -from armi.utils.units import getTk from armi.materials.material import Material -from armi.nucDirectory import thermalScattering as tsl from armi.nucDirectory import nuclideBases as nb +from armi.nucDirectory import thermalScattering as tsl +from armi.utils.units import getTk class Be9(Material): diff --git a/armi/materials/copper.py b/armi/materials/copper.py index 8ffb62217..c44815d29 100644 --- a/armi/materials/copper.py +++ b/armi/materials/copper.py @@ -14,8 +14,8 @@ """Copper metal.""" -from armi.utils.units import getTk from armi.materials.material import Material +from armi.utils.units import getTk class Cu(Material): diff --git a/armi/materials/graphite.py b/armi/materials/graphite.py index b7ac48141..0e7ec764f 100644 --- a/armi/materials/graphite.py +++ b/armi/materials/graphite.py @@ -15,9 +15,9 @@ """Graphite is often used as a moderator in gas-cooled nuclear reactors.""" from armi.materials.material import Material -from armi.utils import units -from armi.nucDirectory import thermalScattering as tsl from armi.nucDirectory import nuclideBases as nb +from armi.nucDirectory import thermalScattering as tsl +from armi.utils import units class Graphite(Material): diff --git a/armi/materials/hafnium.py b/armi/materials/hafnium.py index 709ec39d0..1694c1c57 100644 --- a/armi/materials/hafnium.py +++ b/armi/materials/hafnium.py @@ -14,8 +14,8 @@ """Hafnium is an element that has high capture cross section across multiple isotopes.""" -from armi.nucDirectory import nucDir from armi.materials.material import SimpleSolid +from armi.nucDirectory import nucDir class Hafnium(SimpleSolid): diff --git a/armi/materials/hastelloyN.py b/armi/materials/hastelloyN.py index fbbe1b2ce..dd60db465 100644 --- a/armi/materials/hastelloyN.py +++ b/armi/materials/hastelloyN.py @@ -15,7 +15,7 @@ """Hastelloy-N is a high-nickel structural material invented by ORNL for handling molten fluoride salts.""" from armi.materials.material import Material -from armi.utils.units import getTk, getTc +from armi.utils.units import getTc, getTk class HastelloyN(Material): diff --git a/armi/materials/material.py b/armi/materials/material.py index 362b66ece..06593dbe8 100644 --- a/armi/materials/material.py +++ b/armi/materials/material.py @@ -21,14 +21,14 @@ import traceback import warnings -from scipy.optimize import fsolve import numpy as np +from scipy.optimize import fsolve from armi import runLog from armi.nucDirectory import nuclideBases from armi.reactor.flags import TypeSpec from armi.utils import densityTools -from armi.utils.units import getTk, getTc +from armi.utils.units import getTc, getTk # globals FAIL_ON_RANGE = False diff --git a/armi/materials/mox.py b/armi/materials/mox.py index b2ab41700..61631a412 100644 --- a/armi/materials/mox.py +++ b/armi/materials/mox.py @@ -23,8 +23,8 @@ """ from armi import runLog -from armi.materials.uraniumOxide import UraniumOxide from armi.materials import material +from armi.materials.uraniumOxide import UraniumOxide from armi.nucDirectory import nucDir diff --git a/armi/materials/tests/test_materials.py b/armi/materials/tests/test_materials.py index 1b27df200..22b125f79 100644 --- a/armi/materials/tests/test_materials.py +++ b/armi/materials/tests/test_materials.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. """Tests materials.py.""" -from copy import deepcopy import math import pickle import unittest +from copy import deepcopy from numpy import testing diff --git a/armi/materials/tests/test_uZr.py b/armi/materials/tests/test_uZr.py index e2b4eb270..ddd5e67e1 100644 --- a/armi/materials/tests/test_uZr.py +++ b/armi/materials/tests/test_uZr.py @@ -13,8 +13,8 @@ # limitations under the License. """Tests for simplified UZr material.""" -from unittest import TestCase import pickle +from unittest import TestCase from armi.materials.uZr import UZr diff --git a/armi/materials/tests/test_water.py b/armi/materials/tests/test_water.py index d62c190c4..2756e433a 100644 --- a/armi/materials/tests/test_water.py +++ b/armi/materials/tests/test_water.py @@ -15,7 +15,7 @@ """Unit tests for water materials.""" import unittest -from armi.materials.water import SaturatedWater, SaturatedSteam, Water +from armi.materials.water import SaturatedSteam, SaturatedWater, Water class Test_Water(unittest.TestCase): diff --git a/armi/materials/thoriumOxide.py b/armi/materials/thoriumOxide.py index af5177c5b..28730a7c7 100644 --- a/armi/materials/thoriumOxide.py +++ b/armi/materials/thoriumOxide.py @@ -21,8 +21,8 @@ https://www-pub.iaea.org/mtcd/publications/pdf/te_1450_web.pdf """ from armi import runLog +from armi.materials.material import FuelMaterial, Material, SimpleSolid from armi.utils.units import getTk -from armi.materials.material import Material, FuelMaterial, SimpleSolid class ThoriumOxide(FuelMaterial, SimpleSolid): diff --git a/armi/materials/uThZr.py b/armi/materials/uThZr.py index 4e60c132c..0aaf27719 100644 --- a/armi/materials/uThZr.py +++ b/armi/materials/uThZr.py @@ -13,9 +13,9 @@ # limitations under the License. """Uranium Thorium Zirconium alloy metal.""" -from armi.utils.units import getTk -from armi.materials.material import FuelMaterial from armi import runLog +from armi.materials.material import FuelMaterial +from armi.utils.units import getTk class UThZr(FuelMaterial): diff --git a/armi/materials/uraniumOxide.py b/armi/materials/uraniumOxide.py index 64ce7f1b0..4d899df9b 100644 --- a/armi/materials/uraniumOxide.py +++ b/armi/materials/uraniumOxide.py @@ -32,7 +32,6 @@ from armi.nucDirectory import thermalScattering as tsl from armi.utils.units import getTk - HeatCapacityConstants = collections.namedtuple( "HeatCapacityConstants", ["c1", "c2", "c3", "theta", "Ea"] ) diff --git a/armi/migration/m0_1_3.py b/armi/migration/m0_1_3.py index 4e7f4ed49..10ce88910 100644 --- a/armi/migration/m0_1_3.py +++ b/armi/migration/m0_1_3.py @@ -15,8 +15,8 @@ import io import re -from armi.migration.base import BlueprintsMigration from armi import runLog +from armi.migration.base import BlueprintsMigration class RemoveCentersFromBlueprints(BlueprintsMigration): diff --git a/armi/migration/m0_1_6.py b/armi/migration/m0_1_6.py index 371dd2d65..0f19099ad 100644 --- a/armi/migration/m0_1_6.py +++ b/armi/migration/m0_1_6.py @@ -17,9 +17,8 @@ import re from armi import runLog -from armi.settings import caseSettings from armi.migration.base import SettingsMigration -from armi.settings import settingsIO +from armi.settings import caseSettings, settingsIO from armi.utils.units import ASCII_LETTER_A, ASCII_ZERO AXIAL_CHARS = [ diff --git a/armi/migration/tests/test_m0_1_6.py b/armi/migration/tests/test_m0_1_6.py index bb0931fdd..94df94c1e 100644 --- a/armi/migration/tests/test_m0_1_6.py +++ b/armi/migration/tests/test_m0_1_6.py @@ -17,7 +17,7 @@ from armi.migration.m0_1_6 import ConvertAlphanumLocationSettingsToNum from armi.settings import caseSettings -from armi.settings.settingsIO import SettingsWriter, SettingsReader +from armi.settings.settingsIO import SettingsReader, SettingsWriter class TestMigration(unittest.TestCase): diff --git a/armi/migration/tests/test_migration_base.py b/armi/migration/tests/test_migration_base.py index 67bffcc81..4fb532eac 100644 --- a/armi/migration/tests/test_migration_base.py +++ b/armi/migration/tests/test_migration_base.py @@ -15,8 +15,7 @@ import os import unittest -from armi.migration.base import Migration -from armi.migration.base import SettingsMigration +from armi.migration.base import Migration, SettingsMigration from armi.tests import TEST_ROOT diff --git a/armi/mpiActions.py b/armi/mpiActions.py index ca3fc9ca3..dbf0171cf 100644 --- a/armi/mpiActions.py +++ b/armi/mpiActions.py @@ -59,15 +59,10 @@ import pickle import timeit -from armi import context -from armi import interfaces -from armi import runLog -from armi import settings -from armi import utils +from armi import context, interfaces, runLog, settings, utils from armi.reactor import reactors from armi.reactor.parameters import parameterDefinitions -from armi.utils import iterables -from armi.utils import tabulate +from armi.utils import iterables, tabulate class MpiAction: diff --git a/armi/nucDirectory/elements.py b/armi/nucDirectory/elements.py index 35b33794c..a7669f5a2 100644 --- a/armi/nucDirectory/elements.py +++ b/armi/nucDirectory/elements.py @@ -130,8 +130,8 @@ def getAttributes(element): """ import os -from typing import List from enum import Enum +from typing import List from armi import context from armi.utils.units import HEAVY_METAL_CUTOFF_Z diff --git a/armi/nucDirectory/nuclideBases.py b/armi/nucDirectory/nuclideBases.py index 60490c3b9..d9e1130fc 100644 --- a/armi/nucDirectory/nuclideBases.py +++ b/armi/nucDirectory/nuclideBases.py @@ -97,11 +97,10 @@ class which is used to organize and store metadata about each nuclide. The import os -from ruamel.yaml import YAML import numpy as np +from ruamel.yaml import YAML -from armi import context -from armi import runLog +from armi import context, runLog from armi.nucDirectory import transmutations from armi.utils.units import HEAVY_METAL_CUTOFF_Z @@ -116,7 +115,6 @@ class which is used to organize and store metadata about each nuclide. The # together to maintain self-consistency. from armi.nucDirectory import elements # noqa: E402 - # Dictionary of INuclides by the INuclide.name for fast indexing byName = {} byDBName = {} diff --git a/armi/nucDirectory/tests/test_nuclideBases.py b/armi/nucDirectory/tests/test_nuclideBases.py index 0bfcafbb8..1ef1b5900 100644 --- a/armi/nucDirectory/tests/test_nuclideBases.py +++ b/armi/nucDirectory/tests/test_nuclideBases.py @@ -23,7 +23,7 @@ from armi.context import RES from armi.nucDirectory import nuclideBases from armi.nucDirectory.tests import NUCDIRECTORY_TESTS_DEFAULT_DIR_PATH -from armi.utils.units import SECONDS_PER_HOUR, AVOGADROS_NUMBER, CURIE_PER_BECQUEREL +from armi.utils.units import AVOGADROS_NUMBER, CURIE_PER_BECQUEREL, SECONDS_PER_HOUR class TestNuclide(unittest.TestCase): diff --git a/armi/nucDirectory/tests/test_thermalScattering.py b/armi/nucDirectory/tests/test_thermalScattering.py index e6e4d9291..a3b676365 100644 --- a/armi/nucDirectory/tests/test_thermalScattering.py +++ b/armi/nucDirectory/tests/test_thermalScattering.py @@ -16,8 +16,7 @@ from armi.nucDirectory import nuclideBases as nb from armi.nucDirectory import thermalScattering as ts -from armi.reactor import blocks -from armi.reactor import components +from armi.reactor import blocks, components def buildBlockWithTSL(): diff --git a/armi/nucDirectory/thermalScattering.py b/armi/nucDirectory/thermalScattering.py index ed0857f05..e53f4f9f3 100644 --- a/armi/nucDirectory/thermalScattering.py +++ b/armi/nucDirectory/thermalScattering.py @@ -55,9 +55,8 @@ """ from typing import Tuple, Union -from armi.nucDirectory import nuclideBases as nb from armi.nucDirectory import elements - +from armi.nucDirectory import nuclideBases as nb BE_METAL = "Be-metal" BEO = "BeO" diff --git a/armi/nuclearDataIO/__init__.py b/armi/nuclearDataIO/__init__.py index 89a2ca925..643cb9a2e 100644 --- a/armi/nuclearDataIO/__init__.py +++ b/armi/nuclearDataIO/__init__.py @@ -15,8 +15,6 @@ """Read and/or write data files associated with nuclear data and reactor physics data.""" # ruff: noqa: F401 -from armi.physics import neutronics - # export the cccc modules here to keep external clients happy, # though prefer full imports in new code from armi.nuclearDataIO.cccc import ( @@ -34,6 +32,7 @@ rtflux, rzflux, ) +from armi.physics import neutronics def getExpectedISOTXSFileName(cycle=None, node=None, suffix=None, xsID=None): diff --git a/armi/nuclearDataIO/cccc/compxs.py b/armi/nuclearDataIO/cccc/compxs.py index 99bf03114..0a65049f7 100644 --- a/armi/nuclearDataIO/cccc/compxs.py +++ b/armi/nuclearDataIO/cccc/compxs.py @@ -74,18 +74,18 @@ """ from traceback import format_exc -from scipy.sparse import csc_matrix import numpy as np +from scipy.sparse import csc_matrix from armi import runLog from armi.nuclearDataIO import cccc -from armi.nuclearDataIO.xsCollections import XSCollection from armi.nuclearDataIO.nuclearFileMetadata import ( - RegionXSMetadata, COMPXS_POWER_CONVERSION_FACTORS, REGIONXS_POWER_CONVERT_DIRECTIONAL_DIFF, + RegionXSMetadata, ) -from armi.utils.properties import unlockImmutableProperties, lockImmutableProperties +from armi.nuclearDataIO.xsCollections import XSCollection +from armi.utils.properties import lockImmutableProperties, unlockImmutableProperties def _getRegionIO(): diff --git a/armi/nuclearDataIO/cccc/dif3d.py b/armi/nuclearDataIO/cccc/dif3d.py index e5d8443ee..1ad9e14dd 100644 --- a/armi/nuclearDataIO/cccc/dif3d.py +++ b/armi/nuclearDataIO/cccc/dif3d.py @@ -20,7 +20,6 @@ from armi import runLog from armi.nuclearDataIO import cccc - FILE_SPEC_2D_PARAMS = ( [ "IPROBT", diff --git a/armi/nuclearDataIO/cccc/dlayxs.py b/armi/nuclearDataIO/cccc/dlayxs.py index 4364b92b1..58471bbc4 100644 --- a/armi/nuclearDataIO/cccc/dlayxs.py +++ b/armi/nuclearDataIO/cccc/dlayxs.py @@ -27,9 +27,7 @@ from armi import runLog from armi.nucDirectory import nuclideBases -from armi.nuclearDataIO import cccc -from armi.nuclearDataIO import nuclearFileMetadata - +from armi.nuclearDataIO import cccc, nuclearFileMetadata ALLOWED_NUCLIDE_CONTRIBUTION_ERROR = 1e-5 diff --git a/armi/nuclearDataIO/cccc/gamiso.py b/armi/nuclearDataIO/cccc/gamiso.py index 5c0b4132a..c203c244d 100644 --- a/armi/nuclearDataIO/cccc/gamiso.py +++ b/armi/nuclearDataIO/cccc/gamiso.py @@ -37,9 +37,8 @@ """ from armi import runLog +from armi.nuclearDataIO import xsLibraries, xsNuclides from armi.nuclearDataIO.cccc import isotxs -from armi.nuclearDataIO import xsLibraries -from armi.nuclearDataIO import xsNuclides def compare(lib1, lib2): diff --git a/armi/nuclearDataIO/cccc/isotxs.py b/armi/nuclearDataIO/cccc/isotxs.py index 69c7747a7..fd3a5f9ba 100644 --- a/armi/nuclearDataIO/cccc/isotxs.py +++ b/armi/nuclearDataIO/cccc/isotxs.py @@ -37,16 +37,14 @@ """ -import traceback import itertools +import traceback import numpy as np from scipy import sparse from armi import runLog -from armi.nuclearDataIO import cccc -from armi.nuclearDataIO import xsNuclides -from armi.nuclearDataIO import xsLibraries +from armi.nuclearDataIO import cccc, xsLibraries, xsNuclides from armi.utils import properties # scattering block definitions from ISOTXS diff --git a/armi/nuclearDataIO/cccc/pmatrx.py b/armi/nuclearDataIO/cccc/pmatrx.py index 2ae73ceff..de9cdee69 100644 --- a/armi/nuclearDataIO/cccc/pmatrx.py +++ b/armi/nuclearDataIO/cccc/pmatrx.py @@ -26,9 +26,7 @@ import traceback from armi import runLog -from armi.nuclearDataIO import cccc -from armi.nuclearDataIO import xsNuclides -from armi.nuclearDataIO import xsLibraries +from armi.nuclearDataIO import cccc, xsLibraries, xsNuclides from armi.utils import properties diff --git a/armi/nuclearDataIO/cccc/tests/test_fixsrc.py b/armi/nuclearDataIO/cccc/tests/test_fixsrc.py index 531b3036f..739a54d70 100644 --- a/armi/nuclearDataIO/cccc/tests/test_fixsrc.py +++ b/armi/nuclearDataIO/cccc/tests/test_fixsrc.py @@ -13,10 +13,11 @@ # limitations under the License. """Test the reading and writing of the DIF3D FIXSRC file format.""" -import numpy as np import os import unittest +import numpy as np + from armi.nuclearDataIO.cccc import fixsrc from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/nuclearDataIO/cccc/tests/test_gamiso.py b/armi/nuclearDataIO/cccc/tests/test_gamiso.py index 6fd45bfa3..473b5a0b5 100644 --- a/armi/nuclearDataIO/cccc/tests/test_gamiso.py +++ b/armi/nuclearDataIO/cccc/tests/test_gamiso.py @@ -13,9 +13,9 @@ # limitations under the License. """Test GAMISO reading and writing.""" -from copy import deepcopy import os import unittest +from copy import deepcopy from armi.nuclearDataIO import xsLibraries from armi.nuclearDataIO.cccc import gamiso diff --git a/armi/nuclearDataIO/nuclearFileMetadata.py b/armi/nuclearDataIO/nuclearFileMetadata.py index 2e1ddb89a..be894c79b 100644 --- a/armi/nuclearDataIO/nuclearFileMetadata.py +++ b/armi/nuclearDataIO/nuclearFileMetadata.py @@ -24,7 +24,6 @@ from armi import runLog from armi.utils import properties - COMPXS_POWER_CONVERSION_FACTORS = ["fissionWattSeconds", "captureWattSeconds"] REGIONXS_POWER_CONVERT_DIRECTIONAL_DIFF = [ "powerConvMult", diff --git a/armi/nuclearDataIO/tests/test_xsCollections.py b/armi/nuclearDataIO/tests/test_xsCollections.py index 6a85e1734..a039c8bef 100644 --- a/armi/nuclearDataIO/tests/test_xsCollections.py +++ b/armi/nuclearDataIO/tests/test_xsCollections.py @@ -17,9 +17,8 @@ import unittest from armi import settings +from armi.nuclearDataIO import isotxs, xsCollections from armi.reactor.blocks import HexBlock -from armi.nuclearDataIO import isotxs -from armi.nuclearDataIO import xsCollections from armi.tests import ISOAA_PATH from armi.utils.directoryChangers import TemporaryDirectoryChanger from armi.utils.plotting import plotNucXs diff --git a/armi/nuclearDataIO/tests/test_xsNuclides.py b/armi/nuclearDataIO/tests/test_xsNuclides.py index 91109e5c2..2985d6e70 100644 --- a/armi/nuclearDataIO/tests/test_xsNuclides.py +++ b/armi/nuclearDataIO/tests/test_xsNuclides.py @@ -16,11 +16,8 @@ import unittest from armi.nucDirectory import nuclideBases -from armi.nuclearDataIO import isotxs -from armi.nuclearDataIO import xsLibraries -from armi.nuclearDataIO import xsNuclides -from armi.tests import ISOAA_PATH -from armi.tests import mockRunLogs +from armi.nuclearDataIO import isotxs, xsLibraries, xsNuclides +from armi.tests import ISOAA_PATH, mockRunLogs class NuclideTests(unittest.TestCase): diff --git a/armi/nuclearDataIO/xsCollections.py b/armi/nuclearDataIO/xsCollections.py index 913032aef..c2d873b5c 100644 --- a/armi/nuclearDataIO/xsCollections.py +++ b/armi/nuclearDataIO/xsCollections.py @@ -42,8 +42,7 @@ from scipy import sparse from armi import runLog -from armi.utils import properties -from armi.utils import units +from armi.utils import properties, units # Basic cross-section types that are represented by a 1-D vector in the multigroup approximation # No one is particularly proud of these names...we can claim diff --git a/armi/nuclearDataIO/xsLibraries.py b/armi/nuclearDataIO/xsLibraries.py index f38bbaa65..a60d4e5e8 100644 --- a/armi/nuclearDataIO/xsLibraries.py +++ b/armi/nuclearDataIO/xsLibraries.py @@ -31,9 +31,7 @@ def compare(lib1, lib2): """Compare two XSLibraries, and return True if equal, or False if not.""" - from armi.nuclearDataIO.cccc import isotxs - from armi.nuclearDataIO.cccc import gamiso - from armi.nuclearDataIO.cccc import pmatrx + from armi.nuclearDataIO.cccc import gamiso, isotxs, pmatrx equal = True # check the nuclides @@ -177,10 +175,8 @@ def mergeXSLibrariesInWorkingDirectory( An alternate directory in which to search for files other than the working directory. The main purpose of this is for testing, but it could also be useful to users. """ - from armi.nuclearDataIO.cccc import isotxs - from armi.nuclearDataIO.cccc import gamiso - from armi.nuclearDataIO.cccc import pmatrx from armi import nuclearDataIO + from armi.nuclearDataIO.cccc import gamiso, isotxs, pmatrx baseDir = alternateDirectory or os.getcwd() globPath = os.path.join(baseDir, _ISOTXS_EXT + "*") diff --git a/armi/nuclearDataIO/xsNuclides.py b/armi/nuclearDataIO/xsNuclides.py index c2c976af4..d59b85daf 100644 --- a/armi/nuclearDataIO/xsNuclides.py +++ b/armi/nuclearDataIO/xsNuclides.py @@ -26,9 +26,7 @@ index (i.e. "PU39AA"). """ from armi.nucDirectory import nuclideBases -from armi.nuclearDataIO import xsCollections -from armi.nuclearDataIO import xsLibraries -from armi.nuclearDataIO import nuclearFileMetadata +from armi.nuclearDataIO import nuclearFileMetadata, xsCollections, xsLibraries from armi.utils.customExceptions import warn_when_root diff --git a/armi/operators/__init__.py b/armi/operators/__init__.py index 6eb5ca3cc..7efe833a3 100644 --- a/armi/operators/__init__.py +++ b/armi/operators/__init__.py @@ -39,8 +39,8 @@ math on the reactor model """ -from armi import context -from armi import getPluginManagerOrFail +# ruff: noqa: I001 +from armi import context, getPluginManagerOrFail from armi.operators.runTypes import RunTypes from armi.operators.operator import Operator from armi.operators.operatorMPI import OperatorMPI diff --git a/armi/operators/operatorMPI.py b/armi/operators/operatorMPI.py index bb9761653..dcd5a9538 100644 --- a/armi/operators/operatorMPI.py +++ b/armi/operators/operatorMPI.py @@ -41,10 +41,7 @@ import time import traceback -from armi import context -from armi import getPluginManager -from armi import mpiActions -from armi import runLog +from armi import context, getPluginManager, mpiActions, runLog from armi.operators.operator import Operator from armi.reactor import reactors diff --git a/armi/operators/settingsValidation.py b/armi/operators/settingsValidation.py index 949b0e09b..ec9446b1c 100644 --- a/armi/operators/settingsValidation.py +++ b/armi/operators/settingsValidation.py @@ -24,6 +24,8 @@ """ # ruff: noqa: F401 -from armi.settings.settingsValidation import createQueryRevertBadPathToDefault -from armi.settings.settingsValidation import Inspector -from armi.settings.settingsValidation import Query +from armi.settings.settingsValidation import ( + Inspector, + Query, + createQueryRevertBadPathToDefault, +) diff --git a/armi/operators/snapshots.py b/armi/operators/snapshots.py index 575c8b606..4ce4d2655 100644 --- a/armi/operators/snapshots.py +++ b/armi/operators/snapshots.py @@ -14,8 +14,8 @@ """Snapshot Operator.""" -from armi.operators import operatorMPI from armi import runLog +from armi.operators import operatorMPI class OperatorSnapshots(operatorMPI.OperatorMPI): diff --git a/armi/operators/tests/test_operators.py b/armi/operators/tests/test_operators.py index 54199a5b9..878324123 100644 --- a/armi/operators/tests/test_operators.py +++ b/armi/operators/tests/test_operators.py @@ -13,12 +13,12 @@ # limitations under the License. """Tests for operators.""" -from unittest.mock import patch import collections import io import os import sys import unittest +from unittest.mock import patch from armi import settings from armi.bookkeeping.db.databaseInterface import DatabaseInterface @@ -27,16 +27,16 @@ from armi.physics.neutronics.globalFlux.globalFluxInterface import ( GlobalFluxInterfaceUsingExecuters, ) -from armi.reactor.reactors import Reactor, Core +from armi.reactor.reactors import Core, Reactor from armi.reactor.tests import test_reactors from armi.settings.caseSettings import Settings from armi.settings.fwSettings.globalSettings import ( - CONF_RUN_TYPE, - CONF_TIGHT_COUPLING, CONF_CYCLES_SKIP_TIGHT_COUPLING_INTERACTION, - CONF_TIGHT_COUPLING_SETTINGS, CONF_DEFERRED_INTERFACE_NAMES, CONF_DEFERRED_INTERFACES_CYCLE, + CONF_RUN_TYPE, + CONF_TIGHT_COUPLING, + CONF_TIGHT_COUPLING_SETTINGS, ) from armi.tests import mockRunLogs from armi.utils import directoryChangers diff --git a/armi/physics/executers.py b/armi/physics/executers.py index d99c11c6d..b8deaaca2 100644 --- a/armi/physics/executers.py +++ b/armi/physics/executers.py @@ -21,7 +21,7 @@ import os from armi import runLog -from armi.context import getFastPath, MPI_RANK +from armi.context import MPI_RANK, getFastPath from armi.utils import directoryChangers, pathTools diff --git a/armi/physics/fuelCycle/__init__.py b/armi/physics/fuelCycle/__init__.py index 95f4e96d8..384d73f16 100644 --- a/armi/physics/fuelCycle/__init__.py +++ b/armi/physics/fuelCycle/__init__.py @@ -28,12 +28,9 @@ The fuel handler plugin moves fuel around in a reactor. """ -from armi import interfaces -from armi import operators -from armi import plugins +from armi import interfaces, operators, plugins from armi.operators import RunTypes -from armi.physics.fuelCycle import fuelHandlers -from armi.physics.fuelCycle import settings +from armi.physics.fuelCycle import fuelHandlers, settings ORDER = interfaces.STACK_ORDER.FUEL_MANAGEMENT diff --git a/armi/physics/fuelCycle/fuelHandlerFactory.py b/armi/physics/fuelCycle/fuelHandlerFactory.py index c6068f62e..babc59ed7 100644 --- a/armi/physics/fuelCycle/fuelHandlerFactory.py +++ b/armi/physics/fuelCycle/fuelHandlerFactory.py @@ -14,8 +14,7 @@ """factory for the FuelHandler.""" from armi.physics.fuelCycle import fuelHandlers -from armi.physics.fuelCycle.settings import CONF_FUEL_HANDLER_NAME -from armi.physics.fuelCycle.settings import CONF_SHUFFLE_LOGIC +from armi.physics.fuelCycle.settings import CONF_FUEL_HANDLER_NAME, CONF_SHUFFLE_LOGIC from armi.utils import directoryChangers, pathTools diff --git a/armi/physics/fuelCycle/fuelHandlerInterface.py b/armi/physics/fuelCycle/fuelHandlerInterface.py index 0425cdec9..85bd52655 100644 --- a/armi/physics/fuelCycle/fuelHandlerInterface.py +++ b/armi/physics/fuelCycle/fuelHandlerInterface.py @@ -14,12 +14,13 @@ """A place for the FuelHandler's Interface.""" -from armi import interfaces -from armi import runLog +from armi import interfaces, runLog from armi.physics.fuelCycle import fuelHandlerFactory -from armi.physics.fuelCycle.settings import CONF_PLOT_SHUFFLE_ARROWS -from armi.physics.fuelCycle.settings import CONF_RUN_LATTICE_BEFORE_SHUFFLING -from armi.physics.fuelCycle.settings import CONF_SHUFFLE_LOGIC +from armi.physics.fuelCycle.settings import ( + CONF_PLOT_SHUFFLE_ARROWS, + CONF_RUN_LATTICE_BEFORE_SHUFFLING, + CONF_SHUFFLE_LOGIC, +) from armi.utils import plotting diff --git a/armi/physics/fuelCycle/fuelHandlers.py b/armi/physics/fuelCycle/fuelHandlers.py index 9f99d5a8f..74697cd63 100644 --- a/armi/physics/fuelCycle/fuelHandlers.py +++ b/armi/physics/fuelCycle/fuelHandlers.py @@ -37,8 +37,8 @@ from armi.physics.fuelCycle.fuelHandlerInterface import FuelHandlerInterface from armi.physics.fuelCycle.settings import CONF_ASSEMBLY_ROTATION_ALG from armi.reactor.flags import Flags -from armi.utils.customExceptions import InputError from armi.reactor.parameters import ParamLocation +from armi.utils.customExceptions import InputError class FuelHandler: diff --git a/armi/physics/fuelCycle/settings.py b/armi/physics/fuelCycle/settings.py index 647a279ae..fd50301c3 100644 --- a/armi/physics/fuelCycle/settings.py +++ b/armi/physics/fuelCycle/settings.py @@ -12,8 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. """Settings for generic fuel cycle code.""" -from armi.settings import setting -from armi.settings import settingsValidation +from armi.settings import setting, settingsValidation CONF_ASSEM_ROTATION_STATIONARY = "assemblyRotationStationary" CONF_ASSEMBLY_ROTATION_ALG = "assemblyRotationAlgorithm" diff --git a/armi/physics/fuelCycle/tests/test_fuelHandlers.py b/armi/physics/fuelCycle/tests/test_fuelHandlers.py index b6bbc14a0..2ea5e57d6 100644 --- a/armi/physics/fuelCycle/tests/test_fuelHandlers.py +++ b/armi/physics/fuelCycle/tests/test_fuelHandlers.py @@ -38,12 +38,12 @@ ) from armi.reactor import assemblies, blocks, components, grids from armi.reactor.flags import Flags +from armi.reactor.parameters import ParamLocation from armi.reactor.tests import test_reactors from armi.reactor.zones import Zone from armi.settings import caseSettings from armi.tests import TEST_ROOT, ArmiTestHelper, mockRunLogs from armi.utils import directoryChangers -from armi.reactor.parameters import ParamLocation class FuelHandlerTestHelper(ArmiTestHelper): diff --git a/armi/physics/fuelPerformance/executers.py b/armi/physics/fuelPerformance/executers.py index 7cc0af2fb..2bd92fac4 100644 --- a/armi/physics/fuelPerformance/executers.py +++ b/armi/physics/fuelPerformance/executers.py @@ -22,15 +22,14 @@ """ from armi.physics import executers - from armi.physics.fuelPerformance.settings import ( - CONF_FUEL_PERFORMANCE_ENGINE, CONF_AXIAL_EXPANSION, CONF_BOND_REMOVAL, - CONF_FGR_REMOVAL, - CONF_CLADDING_WASTAGE, CONF_CLADDING_STRAIN, + CONF_CLADDING_WASTAGE, + CONF_FGR_REMOVAL, CONF_FGYF, + CONF_FUEL_PERFORMANCE_ENGINE, ) diff --git a/armi/physics/fuelPerformance/parameters.py b/armi/physics/fuelPerformance/parameters.py index 604a37015..47d09f32a 100644 --- a/armi/physics/fuelPerformance/parameters.py +++ b/armi/physics/fuelPerformance/parameters.py @@ -13,8 +13,8 @@ # limitations under the License. """Parameter definitions for fuel performance plugins.""" from armi.reactor import parameters -from armi.reactor.parameters import ParamLocation from armi.reactor.blocks import Block +from armi.reactor.parameters import ParamLocation from armi.utils import units diff --git a/armi/physics/fuelPerformance/plugin.py b/armi/physics/fuelPerformance/plugin.py index 9e82f7f50..60bdbf07f 100644 --- a/armi/physics/fuelPerformance/plugin.py +++ b/armi/physics/fuelPerformance/plugin.py @@ -14,11 +14,9 @@ """Generic Fuel Performance Plugin.""" -from armi import plugins -from armi import interfaces +from armi import interfaces, plugins from armi.physics.fuelPerformance import settings - ORDER = interfaces.STACK_ORDER.CROSS_SECTIONS diff --git a/armi/physics/fuelPerformance/settings.py b/armi/physics/fuelPerformance/settings.py index edef934f2..91f190637 100644 --- a/armi/physics/fuelPerformance/settings.py +++ b/armi/physics/fuelPerformance/settings.py @@ -17,7 +17,6 @@ from armi.settings import setting from armi.settings.settingsValidation import Query - CONF_AXIAL_EXPANSION = "axialExpansion" CONF_BOND_REMOVAL = "bondRemoval" CONF_CLADDING_STRAIN = "claddingStrain" diff --git a/armi/physics/neutronics/crossSectionSettings.py b/armi/physics/neutronics/crossSectionSettings.py index a683f7d7f..b1d0d0b40 100644 --- a/armi/physics/neutronics/crossSectionSettings.py +++ b/armi/physics/neutronics/crossSectionSettings.py @@ -31,8 +31,7 @@ import voluptuous as vol -from armi import context -from armi import runLog +from armi import context, runLog from armi.physics.neutronics import crossSectionGroupManager from armi.physics.neutronics.crossSectionGroupManager import BLOCK_COLLECTIONS from armi.settings import Setting diff --git a/armi/physics/neutronics/diffIsotxs.py b/armi/physics/neutronics/diffIsotxs.py index 5ac4c1e59..d94baa195 100644 --- a/armi/physics/neutronics/diffIsotxs.py +++ b/armi/physics/neutronics/diffIsotxs.py @@ -52,8 +52,7 @@ def addOptions(self): ) def invoke(self): - from armi.nuclearDataIO import isotxs - from armi.nuclearDataIO import xsLibraries + from armi.nuclearDataIO import isotxs, xsLibraries runLog.setVerbosity(0) refIsotxs = isotxs.readBinary(self.args.reference) diff --git a/armi/physics/neutronics/energyGroups.py b/armi/physics/neutronics/energyGroups.py index 5da90636d..4482f4a29 100644 --- a/armi/physics/neutronics/energyGroups.py +++ b/armi/physics/neutronics/energyGroups.py @@ -20,13 +20,13 @@ import numpy as np from armi import runLog -from armi.utils.mathematics import findNearestValue from armi.physics.neutronics.const import ( FAST_FLUX_THRESHOLD_EV, + HIGH_ENERGY_EV, MAXIMUM_XS_LIBRARY_ENERGY, ULTRA_FINE_GROUP_LETHARGY_WIDTH, - HIGH_ENERGY_EV, ) +from armi.utils.mathematics import findNearestValue def getFastFluxGroupCutoff(eGrpStruc): diff --git a/armi/physics/neutronics/fissionProductModel/__init__.py b/armi/physics/neutronics/fissionProductModel/__init__.py index 1a9a15347..014243375 100644 --- a/armi/physics/neutronics/fissionProductModel/__init__.py +++ b/armi/physics/neutronics/fissionProductModel/__init__.py @@ -15,6 +15,7 @@ """The Fission product model subpackage.""" import os + from armi.context import RES REFERENCE_LUMPED_FISSION_PRODUCT_FILE = os.path.join( diff --git a/armi/physics/neutronics/fissionProductModel/fissionProductModel.py b/armi/physics/neutronics/fissionProductModel/fissionProductModel.py index 73b998fa7..218ae3f2d 100644 --- a/armi/physics/neutronics/fissionProductModel/fissionProductModel.py +++ b/armi/physics/neutronics/fissionProductModel/fissionProductModel.py @@ -96,15 +96,13 @@ is initialized and may not be an out-of-the-box general solution. """ -from armi import runLog -from armi import interfaces -from armi.reactor.flags import Flags +from armi import interfaces, runLog from armi.physics.neutronics.fissionProductModel import lumpedFissionProduct from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( CONF_FP_MODEL, CONF_MAKE_ALL_BLOCK_LFPS_INDEPENDENT, ) - +from armi.reactor.flags import Flags NUM_FISSION_PRODUCTS_PER_LFP = 2.0 diff --git a/armi/physics/neutronics/fissionProductModel/fissionProductModelSettings.py b/armi/physics/neutronics/fissionProductModel/fissionProductModelSettings.py index d23e1b142..e9c48c12d 100644 --- a/armi/physics/neutronics/fissionProductModel/fissionProductModelSettings.py +++ b/armi/physics/neutronics/fissionProductModel/fissionProductModelSettings.py @@ -14,8 +14,8 @@ """Settings related to the fission product model.""" -from armi.settings import setting from armi.physics.neutronics import fissionProductModel +from armi.settings import setting CONF_FP_MODEL = "fpModel" CONF_MAKE_ALL_BLOCK_LFPS_INDEPENDENT = "makeAllBlockLFPsIndependent" diff --git a/armi/physics/neutronics/fissionProductModel/lumpedFissionProduct.py b/armi/physics/neutronics/fissionProductModel/lumpedFissionProduct.py index 4a5c1ce75..3aa8e3e56 100644 --- a/armi/physics/neutronics/fissionProductModel/lumpedFissionProduct.py +++ b/armi/physics/neutronics/fissionProductModel/lumpedFissionProduct.py @@ -20,13 +20,11 @@ """ import os -from armi.nucDirectory import nuclideBases from armi import runLog -from armi.nucDirectory import elements - +from armi.nucDirectory import elements, nuclideBases from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( - CONF_LFP_COMPOSITION_FILE_PATH, CONF_FP_MODEL, + CONF_LFP_COMPOSITION_FILE_PATH, ) diff --git a/armi/physics/neutronics/fissionProductModel/tests/test_fissionProductModel.py b/armi/physics/neutronics/fissionProductModel/tests/test_fissionProductModel.py index a21b5abd9..0ec9dd6f7 100644 --- a/armi/physics/neutronics/fissionProductModel/tests/test_fissionProductModel.py +++ b/armi/physics/neutronics/fissionProductModel/tests/test_fissionProductModel.py @@ -16,14 +16,14 @@ from armi import nuclideBases from armi.physics.neutronics.fissionProductModel import fissionProductModel +from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( + CONF_FISSION_PRODUCT_LIBRARY_NAME, + CONF_FP_MODEL, +) from armi.physics.neutronics.fissionProductModel.tests import test_lumpedFissionProduct from armi.physics.neutronics.isotopicDepletion.isotopicDepletionInterface import ( isDepletable, ) -from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( - CONF_FP_MODEL, - CONF_FISSION_PRODUCT_LIBRARY_NAME, -) from armi.reactor.flags import Flags from armi.reactor.tests.test_reactors import ( buildOperatorOfEmptyHexBlocks, diff --git a/armi/physics/neutronics/fissionProductModel/tests/test_lumpedFissionProduct.py b/armi/physics/neutronics/fissionProductModel/tests/test_lumpedFissionProduct.py index 9d5f7f796..2197060ec 100644 --- a/armi/physics/neutronics/fissionProductModel/tests/test_lumpedFissionProduct.py +++ b/armi/physics/neutronics/fissionProductModel/tests/test_lumpedFissionProduct.py @@ -13,24 +13,24 @@ # limitations under the License. """Tests for lumpedFissionProduce module.""" -import unittest import io import math import os +import unittest +from armi.context import RES +from armi.nucDirectory import nuclideBases from armi.physics.neutronics.fissionProductModel import ( - lumpedFissionProduct, REFERENCE_LUMPED_FISSION_PRODUCT_FILE, + lumpedFissionProduct, ) -from armi.context import RES -from armi.settings import Settings -from armi.reactor.tests.test_reactors import buildOperatorOfEmptyHexBlocks -from armi.reactor.flags import Flags -from armi.nucDirectory import nuclideBases from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( CONF_FP_MODEL, CONF_LFP_COMPOSITION_FILE_PATH, ) +from armi.reactor.flags import Flags +from armi.reactor.tests.test_reactors import buildOperatorOfEmptyHexBlocks +from armi.settings import Settings LFP_TEXT = """LFP35 GE73 5.9000E-06 LFP35 GE74 1.4000E-05 diff --git a/armi/physics/neutronics/globalFlux/globalFluxInterface.py b/armi/physics/neutronics/globalFlux/globalFluxInterface.py index 9e51adab5..aef9d2800 100644 --- a/armi/physics/neutronics/globalFlux/globalFluxInterface.py +++ b/armi/physics/neutronics/globalFlux/globalFluxInterface.py @@ -20,20 +20,15 @@ import numpy as np -from armi import interfaces -from armi import runLog -from armi.physics import constants -from armi.physics import executers -from armi.physics import neutronics -from armi.reactor import geometry -from armi.reactor import reactors -from armi.physics.neutronics.globalFlux import RX_PARAM_NAMES, RX_ABS_MICRO_LABELS +from armi import interfaces, runLog +from armi.physics import constants, executers, neutronics +from armi.physics.neutronics.globalFlux import RX_ABS_MICRO_LABELS, RX_PARAM_NAMES +from armi.reactor import geometry, reactors from armi.reactor.blocks import Block -from armi.reactor.converters import geometryConverters -from armi.reactor.converters import uniformMesh +from armi.reactor.converters import geometryConverters, uniformMesh from armi.reactor.flags import Flags from armi.settings.caseSettings import Settings -from armi.utils import units, codeTiming, getMaxBurnSteps, getBurnSteps +from armi.utils import codeTiming, getBurnSteps, getMaxBurnSteps, units ORDER = interfaces.STACK_ORDER.FLUX @@ -496,9 +491,9 @@ def fromUserSettings(self, cs: Settings): CONF_XS_KERNEL, ) from armi.settings.fwSettings.globalSettings import ( - CONF_PHYSICS_FILES, - CONF_NON_UNIFORM_ASSEM_FLAGS, CONF_DETAILED_AXIAL_EXPANSION, + CONF_NON_UNIFORM_ASSEM_FLAGS, + CONF_PHYSICS_FILES, ) self.kernelName = cs[CONF_NEUTRONICS_KERNEL] diff --git a/armi/physics/neutronics/globalFlux/tests/test_globalFluxInterface.py b/armi/physics/neutronics/globalFlux/tests/test_globalFluxInterface.py index 09adacaf8..e7a79d909 100644 --- a/armi/physics/neutronics/globalFlux/tests/test_globalFluxInterface.py +++ b/armi/physics/neutronics/globalFlux/tests/test_globalFluxInterface.py @@ -27,8 +27,7 @@ from armi.reactor import geometry from armi.reactor.blocks import HexBlock from armi.reactor.flags import Flags -from armi.reactor.tests import test_blocks -from armi.reactor.tests import test_reactors +from armi.reactor.tests import test_blocks, test_reactors from armi.tests import ISOAA_PATH diff --git a/armi/physics/neutronics/latticePhysics/__init__.py b/armi/physics/neutronics/latticePhysics/__init__.py index 1d94e02b7..b66824141 100644 --- a/armi/physics/neutronics/latticePhysics/__init__.py +++ b/armi/physics/neutronics/latticePhysics/__init__.py @@ -16,8 +16,7 @@ # ruff: noqa: F401 import os -from armi import interfaces -from armi import settings +from armi import interfaces, settings from armi.physics import neutronics from armi.utils import pathTools diff --git a/armi/physics/neutronics/latticePhysics/latticePhysicsWriter.py b/armi/physics/neutronics/latticePhysics/latticePhysicsWriter.py index c52ed664a..09f636f2e 100644 --- a/armi/physics/neutronics/latticePhysics/latticePhysicsWriter.py +++ b/armi/physics/neutronics/latticePhysics/latticePhysicsWriter.py @@ -21,30 +21,28 @@ physics codes. """ -import math import collections +import math import numpy as np import ordered_set -from armi import runLog -from armi import interfaces -from armi.physics import neutronics -from armi.reactor import components +from armi import interfaces, runLog from armi.nucDirectory import nuclideBases -from armi.reactor.flags import Flags -from armi.utils.customExceptions import warn_when_root +from armi.physics import neutronics from armi.physics.neutronics.const import CONF_CROSS_SECTION from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( CONF_FP_MODEL, ) from armi.physics.neutronics.settings import ( + CONF_GEN_XS, CONF_MINIMUM_FISSILE_FRACTION, CONF_MINIMUM_NUCLIDE_DENSITY, ) -from armi.physics.neutronics.settings import CONF_GEN_XS +from armi.reactor import components +from armi.reactor.flags import Flags from armi.settings.fwSettings.globalSettings import CONF_DETAILED_AXIAL_EXPANSION - +from armi.utils.customExceptions import warn_when_root # number of decimal places to round temperatures to in _groupNuclidesByTemperature _NUM_DIGITS_ROUND_TEMPERATURE = 3 diff --git a/armi/physics/neutronics/latticePhysics/tests/test_latticeInterface.py b/armi/physics/neutronics/latticePhysics/tests/test_latticeInterface.py index 63a4bfd38..11e4cdd57 100644 --- a/armi/physics/neutronics/latticePhysics/tests/test_latticeInterface.py +++ b/armi/physics/neutronics/latticePhysics/tests/test_latticeInterface.py @@ -13,27 +13,26 @@ # limitations under the License. """Test the Lattice Interface.""" -from collections import OrderedDict import unittest +from collections import OrderedDict -from armi.physics.neutronics.latticePhysics.latticePhysicsInterface import ( - LatticePhysicsInterface, -) from armi import settings from armi.nuclearDataIO.cccc import isotxs from armi.operators.operator import Operator from armi.physics.neutronics import LatticePhysicsFrequency from armi.physics.neutronics.crossSectionGroupManager import CrossSectionGroupManager -from armi.physics.neutronics.settings import CONF_GEN_XS -from armi.physics.neutronics.settings import CONF_GLOBAL_FLUX_ACTIVE -from armi.reactor.reactors import Reactor, Core -from armi.reactor.tests.test_blocks import buildSimpleFuelBlock -from armi.tests import mockRunLogs +from armi.physics.neutronics.latticePhysics.latticePhysicsInterface import ( + LatticePhysicsInterface, +) +from armi.physics.neutronics.settings import CONF_GEN_XS, CONF_GLOBAL_FLUX_ACTIVE from armi.reactor.assemblies import ( HexAssembly, grids, ) -from armi.tests import ISOAA_PATH +from armi.reactor.reactors import Core, Reactor +from armi.reactor.tests.test_blocks import buildSimpleFuelBlock +from armi.tests import ISOAA_PATH, mockRunLogs + # As an interface, LatticePhysicsInterface must be subclassed to be used class LatticeInterfaceTester(LatticePhysicsInterface): diff --git a/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py b/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py index f7f1f8e2c..90c96accf 100644 --- a/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py +++ b/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py @@ -13,8 +13,8 @@ # limitations under the License. """Test the Lattice Physics Writer.""" -from collections import defaultdict import unittest +from collections import defaultdict from armi.physics.neutronics.const import CONF_CROSS_SECTION from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( @@ -27,8 +27,8 @@ LatticePhysicsWriter, ) from armi.physics.neutronics.settings import ( - CONF_XS_BLOCK_REPRESENTATION, CONF_DISABLE_BLOCK_TYPE_EXCLUSION_IN_XS_GENERATION, + CONF_XS_BLOCK_REPRESENTATION, ) from armi.reactor.tests.test_reactors import loadTestReactor from armi.tests import TEST_ROOT diff --git a/armi/physics/neutronics/macroXSGenerationInterface.py b/armi/physics/neutronics/macroXSGenerationInterface.py index 2665b82cc..99928d9dc 100644 --- a/armi/physics/neutronics/macroXSGenerationInterface.py +++ b/armi/physics/neutronics/macroXSGenerationInterface.py @@ -20,10 +20,7 @@ \Sigma_i = N_i \sigma_i """ -from armi import context -from armi import interfaces -from armi import mpiActions -from armi import runLog +from armi import context, interfaces, mpiActions, runLog from armi.nuclearDataIO import xsCollections from armi.physics.neutronics.settings import CONF_MINIMUM_NUCLIDE_DENSITY from armi.utils import getBurnSteps, iterables diff --git a/armi/physics/neutronics/reports.py b/armi/physics/neutronics/reports.py index 5989fbeb1..e0623df3e 100644 --- a/armi/physics/neutronics/reports.py +++ b/armi/physics/neutronics/reports.py @@ -14,9 +14,7 @@ from collections import defaultdict -from armi.bookkeeping.report import newReportUtils -from armi.bookkeeping.report import newReports -from armi.reactor.flags import Flags +from armi.bookkeeping.report import newReports, newReportUtils from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( CONF_FP_MODEL, ) @@ -25,6 +23,7 @@ CONF_NEUTRONICS_KERNEL, CONF_NEUTRONICS_TYPE, ) +from armi.reactor.flags import Flags def insertNeutronicsReport(r, cs, report, stage): diff --git a/armi/physics/neutronics/settings.py b/armi/physics/neutronics/settings.py index d6aaa42bb..1677096d3 100644 --- a/armi/physics/neutronics/settings.py +++ b/armi/physics/neutronics/settings.py @@ -19,15 +19,13 @@ from armi.physics.neutronics import LatticePhysicsFrequency from armi.physics.neutronics.const import NEUTRON from armi.physics.neutronics.energyGroups import GROUP_STRUCTURE -from armi.settings import setting -from armi.settings import settingsValidation -from armi.utils import directoryChangers +from armi.settings import setting, settingsValidation from armi.settings.fwSettings.globalSettings import ( CONF_DETAILED_AXIAL_EXPANSION, CONF_NON_UNIFORM_ASSEM_FLAGS, CONF_RUN_TYPE, ) - +from armi.utils import directoryChangers CONF_BC_COEFFICIENT = "bcCoefficient" CONF_BOUNDARIES = "boundaries" diff --git a/armi/physics/neutronics/tests/test_crossSectionSettings.py b/armi/physics/neutronics/tests/test_crossSectionSettings.py index 17499e806..b2882656d 100644 --- a/armi/physics/neutronics/tests/test_crossSectionSettings.py +++ b/armi/physics/neutronics/tests/test_crossSectionSettings.py @@ -15,22 +15,24 @@ import io import unittest -from ruamel.yaml import YAML import voluptuous as vol +from ruamel.yaml import YAML from armi import settings from armi.physics.neutronics.const import CONF_CROSS_SECTION -from armi.physics.neutronics.crossSectionSettings import CONF_BLOCK_REPRESENTATION -from armi.physics.neutronics.crossSectionSettings import CONF_GEOM -from armi.physics.neutronics.crossSectionSettings import XSModelingOptions -from armi.physics.neutronics.crossSectionSettings import XSSettingDef -from armi.physics.neutronics.crossSectionSettings import XSSettings -from armi.physics.neutronics.crossSectionSettings import xsSettingsValidator -from armi.physics.neutronics.tests.test_neutronicsPlugin import XS_EXAMPLE +from armi.physics.neutronics.crossSectionSettings import ( + CONF_BLOCK_REPRESENTATION, + CONF_GEOM, + XSModelingOptions, + XSSettingDef, + XSSettings, + xsSettingsValidator, +) from armi.physics.neutronics.settings import ( - CONF_XS_BLOCK_REPRESENTATION, CONF_DISABLE_BLOCK_TYPE_EXCLUSION_IN_XS_GENERATION, + CONF_XS_BLOCK_REPRESENTATION, ) +from armi.physics.neutronics.tests.test_neutronicsPlugin import XS_EXAMPLE from armi.settings import caseSettings diff --git a/armi/physics/neutronics/tests/test_crossSectionTable.py b/armi/physics/neutronics/tests/test_crossSectionTable.py index 8dfc878b8..c0f23f7d0 100644 --- a/armi/physics/neutronics/tests/test_crossSectionTable.py +++ b/armi/physics/neutronics/tests/test_crossSectionTable.py @@ -17,6 +17,8 @@ from armi.nuclearDataIO.cccc import isotxs from armi.physics.neutronics.isotopicDepletion import ( crossSectionTable, +) +from armi.physics.neutronics.isotopicDepletion import ( isotopicDepletionInterface as idi, ) from armi.physics.neutronics.latticePhysics import ORDER diff --git a/armi/physics/neutronics/tests/test_neutronicsPlugin.py b/armi/physics/neutronics/tests/test_neutronicsPlugin.py index 00c855ada..ca93f62c7 100644 --- a/armi/physics/neutronics/tests/test_neutronicsPlugin.py +++ b/armi/physics/neutronics/tests/test_neutronicsPlugin.py @@ -22,26 +22,23 @@ from armi.physics import neutronics from armi.physics.neutronics.const import CONF_CROSS_SECTION from armi.physics.neutronics.settings import ( + CONF_BOUNDARIES, + CONF_DPA_XS_SET, CONF_GEN_XS, CONF_GLOBAL_FLUX_ACTIVE, + CONF_GRID_PLATE_DPA_XS_SET, CONF_GROUP_STRUCTURE, - CONF_DPA_XS_SET, - CONF_OUTERS_, CONF_INNERS_, - CONF_NEUTRONICS_KERNEL, CONF_LATTICE_PHYSICS_FREQUENCY, + CONF_NEUTRONICS_KERNEL, + CONF_OUTERS_, getNeutronicsSettingValidators, ) -from armi.settings import caseSettings -from armi.settings import settingsValidation +from armi.settings import caseSettings, settingsValidation from armi.settings.fwSettings.globalSettings import CONF_RUN_TYPE from armi.tests import TEST_ROOT from armi.tests.test_plugins import TestPlugin from armi.utils import directoryChangers -from armi.physics.neutronics.settings import ( - CONF_BOUNDARIES, - CONF_GRID_PLATE_DPA_XS_SET, -) XS_EXAMPLE = """AA: geometry: 0D diff --git a/armi/physics/thermalHydraulics/parameters.py b/armi/physics/thermalHydraulics/parameters.py index a6af2c1ba..8939abf61 100644 --- a/armi/physics/thermalHydraulics/parameters.py +++ b/armi/physics/thermalHydraulics/parameters.py @@ -13,8 +13,8 @@ # limitations under the License. """Parameter definitions for thermal hydraulic plugins.""" from armi.reactor import parameters -from armi.reactor.parameters import ParamLocation from armi.reactor.blocks import Block +from armi.reactor.parameters import ParamLocation from armi.utils import units diff --git a/armi/physics/thermalHydraulics/plugin.py b/armi/physics/thermalHydraulics/plugin.py index 0d675a054..562dc880b 100644 --- a/armi/physics/thermalHydraulics/plugin.py +++ b/armi/physics/thermalHydraulics/plugin.py @@ -20,10 +20,8 @@ """ -from armi import plugins +from armi import interfaces, plugins from armi.physics.thermalHydraulics import settings -from armi import interfaces - ORDER = interfaces.STACK_ORDER.THERMAL_HYDRAULICS diff --git a/armi/plugins.py b/armi/plugins.py index fdeb4cd66..d5fd810a6 100644 --- a/armi/plugins.py +++ b/armi/plugins.py @@ -118,7 +118,7 @@ replaced with plugin-based fuel handler logic. """ -from typing import Callable, Dict, List, Union, TYPE_CHECKING +from typing import TYPE_CHECKING, Callable, Dict, List, Union import pluggy diff --git a/armi/reactor/__init__.py b/armi/reactor/__init__.py index c7c3981d0..3536b698c 100644 --- a/armi/reactor/__init__.py +++ b/armi/reactor/__init__.py @@ -49,14 +49,13 @@ See :doc:`/developer/index`. """ -from typing import Dict, Callable, Union, TYPE_CHECKING +from typing import TYPE_CHECKING, Callable, Dict, Union -from armi import materials -from armi import plugins +from armi import materials, plugins if TYPE_CHECKING: - from armi.reactor.reactors import Core from armi.reactor.excoreStructure import ExcoreStructure + from armi.reactor.reactors import Core from armi.reactor.spentFuelPool import SpentFuelPool @@ -79,9 +78,9 @@ def beforeReactorConstruction(cs) -> None: @staticmethod @plugins.HOOKIMPL def defineBlockTypes(): - from armi.reactor.components.basicShapes import Rectangle, Hexagon - from armi.reactor.components.volumetricShapes import RadialSegment from armi.reactor import blocks + from armi.reactor.components.basicShapes import Hexagon, Rectangle + from armi.reactor.components.volumetricShapes import RadialSegment return [ (Rectangle, blocks.CartesianBlock), @@ -92,8 +91,8 @@ def defineBlockTypes(): @staticmethod @plugins.HOOKIMPL def defineAssemblyTypes(): - from armi.reactor.blocks import HexBlock, CartesianBlock, ThRZBlock - from armi.reactor.assemblies import HexAssembly, CartesianAssembly, ThRZAssembly + from armi.reactor.assemblies import CartesianAssembly, HexAssembly, ThRZAssembly + from armi.reactor.blocks import CartesianBlock, HexBlock, ThRZBlock return [ (HexBlock, HexAssembly), @@ -106,9 +105,9 @@ def defineAssemblyTypes(): def defineSystemBuilders() -> Dict[ str, Callable[[str], Union["Core", "ExcoreStructure", "SpentFuelPool"]] ]: - from armi.reactor.spentFuelPool import SpentFuelPool from armi.reactor.excoreStructure import ExcoreStructure from armi.reactor.reactors import Core + from armi.reactor.spentFuelPool import SpentFuelPool return { "core": Core, diff --git a/armi/reactor/assemblies.py b/armi/reactor/assemblies.py index da55c7694..149c04690 100644 --- a/armi/reactor/assemblies.py +++ b/armi/reactor/assemblies.py @@ -20,19 +20,16 @@ import copy import math import pickle +from collections.abc import Iterable from random import randint from typing import ClassVar, Optional, Type -from collections.abc import Iterable import numpy as np from scipy import interpolate from armi import runLog from armi.materials.material import Fluid -from armi.reactor import assemblyParameters -from armi.reactor import blocks -from armi.reactor import composites -from armi.reactor import grids +from armi.reactor import assemblyParameters, blocks, composites, grids from armi.reactor.flags import Flags from armi.reactor.parameters import ParamLocation from armi.reactor.spentFuelPool import SpentFuelPool diff --git a/armi/reactor/blocks.py b/armi/reactor/blocks.py index 023e86361..aebf3893d 100644 --- a/armi/reactor/blocks.py +++ b/armi/reactor/blocks.py @@ -18,35 +18,32 @@ Assemblies are made of blocks. Blocks are made of components. """ -from typing import Optional, Type, Tuple, ClassVar import collections import copy import functools import math +from typing import ClassVar, Optional, Tuple, Type import numpy as np -from armi import nuclideBases -from armi import runLog +from armi import nuclideBases, runLog from armi.bookkeeping import report from armi.nuclearDataIO import xsCollections -from armi.physics.neutronics import GAMMA -from armi.physics.neutronics import NEUTRON -from armi.reactor import blockParameters -from armi.reactor import components -from armi.reactor import composites -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import parameters +from armi.physics.neutronics import GAMMA, NEUTRON +from armi.reactor import ( + blockParameters, + components, + composites, + geometry, + grids, + parameters, +) from armi.reactor.components import basicShapes -from armi.reactor.components.basicShapes import Hexagon, Circle +from armi.reactor.components.basicShapes import Circle, Hexagon from armi.reactor.components.complexShapes import Helix from armi.reactor.flags import Flags from armi.reactor.parameters import ParamLocation -from armi.utils import densityTools -from armi.utils import hexagon -from armi.utils import iterables -from armi.utils import units +from armi.utils import densityTools, hexagon, iterables, units from armi.utils.plotting import plotBlockFlux from armi.utils.units import TRACE_NUMBER_DENSITY diff --git a/armi/reactor/blueprints/__init__.py b/armi/reactor/blueprints/__init__.py index 48532ed58..aa31dddde 100644 --- a/armi/reactor/blueprints/__init__.py +++ b/armi/reactor/blueprints/__init__.py @@ -69,40 +69,42 @@ import traceback import typing -from ruamel.yaml import CLoader, RoundTripLoader import ordered_set import yamlize import yamlize.objects +from ruamel.yaml import CLoader, RoundTripLoader -from armi import context -from armi import getPluginManager, getPluginManagerOrFail -from armi import migration -from armi import plugins -from armi import runLog +from armi import ( + context, + getPluginManager, + getPluginManagerOrFail, + migration, + plugins, + runLog, +) from armi.nucDirectory import nuclideBases from armi.physics.neutronics.settings import CONF_LOADING_FILE -from armi.reactor import assemblies -from armi.reactor import geometry -from armi.reactor import systemLayoutInput +from armi.reactor import assemblies, geometry, systemLayoutInput from armi.reactor.blueprints import isotopicOptions from armi.reactor.blueprints.assemblyBlueprint import AssemblyKeyedList from armi.reactor.blueprints.blockBlueprint import BlockKeyedList -from armi.reactor.blueprints.componentBlueprint import ComponentGroups -from armi.reactor.blueprints.componentBlueprint import ComponentKeyedList +from armi.reactor.blueprints.componentBlueprint import ( + ComponentGroups, + ComponentKeyedList, +) from armi.reactor.blueprints.gridBlueprint import Grids, Triplet -from armi.reactor.blueprints.reactorBlueprint import Systems, SystemBlueprint +from armi.reactor.blueprints.reactorBlueprint import SystemBlueprint, Systems from armi.reactor.converters import axialExpansionChanger from armi.reactor.flags import Flags from armi.settings.fwSettings.globalSettings import ( - CONF_DETAILED_AXIAL_EXPANSION, + CONF_ACCEPTABLE_BLOCK_AREA_ERROR, CONF_ASSEM_FLAGS_SKIP_AXIAL_EXP, + CONF_DETAILED_AXIAL_EXPANSION, + CONF_GEOM_FILE, CONF_INPUT_HEIGHTS_HOT, CONF_NON_UNIFORM_ASSEM_FLAGS, - CONF_ACCEPTABLE_BLOCK_AREA_ERROR, - CONF_GEOM_FILE, ) -from armi.utils import tabulate -from armi.utils import textProcessors +from armi.utils import tabulate, textProcessors from armi.utils.customExceptions import InputError context.BLUEPRINTS_IMPORTED = True diff --git a/armi/reactor/blueprints/assemblyBlueprint.py b/armi/reactor/blueprints/assemblyBlueprint.py index 6ef7c420f..083c42c8f 100644 --- a/armi/reactor/blueprints/assemblyBlueprint.py +++ b/armi/reactor/blueprints/assemblyBlueprint.py @@ -22,11 +22,8 @@ """ import yamlize -from armi import getPluginManagerOrFail -from armi import runLog -from armi.reactor import assemblies -from armi.reactor import grids -from armi.reactor import parameters +from armi import getPluginManagerOrFail, runLog +from armi.reactor import assemblies, grids, parameters from armi.reactor.blueprints import blockBlueprint from armi.reactor.flags import Flags from armi.settings.fwSettings.globalSettings import CONF_INPUT_HEIGHTS_HOT diff --git a/armi/reactor/blueprints/blockBlueprint.py b/armi/reactor/blueprints/blockBlueprint.py index a1e7a5543..fe358c561 100644 --- a/armi/reactor/blueprints/blockBlueprint.py +++ b/armi/reactor/blueprints/blockBlueprint.py @@ -15,14 +15,13 @@ """This module defines the ARMI input for a block definition, and code for constructing an ARMI ``Block``.""" import collections from inspect import signature -from typing import Iterable, Set, Iterator +from typing import Iterable, Iterator, Set import yamlize from armi import getPluginManagerOrFail, runLog from armi.materials.material import Material -from armi.reactor import blocks -from armi.reactor import parameters +from armi.reactor import blocks, parameters from armi.reactor.blueprints import componentBlueprint from armi.reactor.components.component import Component from armi.reactor.composites import Composite diff --git a/armi/reactor/blueprints/componentBlueprint.py b/armi/reactor/blueprints/componentBlueprint.py index 289a0de8f..c871d8ca5 100644 --- a/armi/reactor/blueprints/componentBlueprint.py +++ b/armi/reactor/blueprints/componentBlueprint.py @@ -20,13 +20,11 @@ """ import yamlize -from armi import runLog -from armi import materials -from armi.reactor import components -from armi.reactor import composites +from armi import materials, runLog +from armi.nucDirectory import nuclideBases +from armi.reactor import components, composites from armi.reactor.flags import Flags from armi.utils import densityTools -from armi.nucDirectory import nuclideBases COMPONENT_GROUP_SHAPE = "group" diff --git a/armi/reactor/blueprints/gridBlueprint.py b/armi/reactor/blueprints/gridBlueprint.py index 2c1341fdd..c05a8ed7b 100644 --- a/armi/reactor/blueprints/gridBlueprint.py +++ b/armi/reactor/blueprints/gridBlueprint.py @@ -100,18 +100,17 @@ IC IC MC PC RR SH """ -from io import StringIO -from typing import Tuple import copy import itertools +from io import StringIO +from typing import Tuple import numpy as np import yamlize from ruamel.yaml import scalarstring from armi import runLog -from armi.reactor import blueprints -from armi.reactor import geometry, grids +from armi.reactor import blueprints, geometry, grids from armi.utils import asciimaps from armi.utils.customExceptions import InputError from armi.utils.mathematics import isMonotonic diff --git a/armi/reactor/blueprints/isotopicOptions.py b/armi/reactor/blueprints/isotopicOptions.py index e8b2b3544..f2e92866b 100644 --- a/armi/reactor/blueprints/isotopicOptions.py +++ b/armi/reactor/blueprints/isotopicOptions.py @@ -20,23 +20,19 @@ """ import yamlize -from armi import materials -from armi import runLog -from armi.nucDirectory import elements -from armi.nucDirectory import nucDir -from armi.nucDirectory import nuclideBases -from armi.utils import densityTools -from armi.utils import units -from armi.utils.customExceptions import InputError +from armi import materials, runLog +from armi.nucDirectory import elements, nucDir, nuclideBases from armi.physics.neutronics.fissionProductModel.fissionProductModelSettings import ( - CONF_FP_MODEL, CONF_FISSION_PRODUCT_LIBRARY_NAME, + CONF_FP_MODEL, ) from armi.physics.neutronics.settings import ( CONF_MCNP_LIB_BASE, CONF_NEUTRONICS_KERNEL, CONF_XS_KERNEL, ) +from armi.utils import densityTools, units +from armi.utils.customExceptions import InputError ALLOWED_KEYS = set(nuclideBases.byName.keys()) | set(elements.bySymbol.keys()) diff --git a/armi/reactor/blueprints/reactorBlueprint.py b/armi/reactor/blueprints/reactorBlueprint.py index 75b363a64..ff7a4e8fb 100644 --- a/armi/reactor/blueprints/reactorBlueprint.py +++ b/armi/reactor/blueprints/reactorBlueprint.py @@ -35,11 +35,8 @@ """ import yamlize -from armi import context -from armi import getPluginManagerOrFail -from armi import runLog -from armi.reactor import geometry -from armi.reactor import grids +from armi import context, getPluginManagerOrFail, runLog +from armi.reactor import geometry, grids from armi.reactor.blueprints.gridBlueprint import Triplet from armi.utils import tabulate @@ -236,7 +233,7 @@ def _modifyGeometry(self, container, gridDesign): # all cases should have no edge assemblies. They are added ephemerally when needed from armi.reactor.converters import ( geometryConverters, - ) # preventing circular imports + ) runLog.header("=========== Applying Geometry Modifications ===========") converter = geometryConverters.EdgeAssemblyChanger() diff --git a/armi/reactor/blueprints/tests/test_blueprints.py b/armi/reactor/blueprints/tests/test_blueprints.py index 7827dd5e1..95811561c 100644 --- a/armi/reactor/blueprints/tests/test_blueprints.py +++ b/armi/reactor/blueprints/tests/test_blueprints.py @@ -23,16 +23,14 @@ from armi import settings from armi.nucDirectory.elements import bySymbol from armi.physics.neutronics.settings import CONF_XS_KERNEL -from armi.reactor import blueprints -from armi.reactor import parameters +from armi.reactor import blueprints, parameters from armi.reactor.blueprints.componentBlueprint import ComponentBlueprint -from armi.reactor.blueprints.isotopicOptions import NuclideFlags, CustomIsotopics -from armi.reactor.flags import Flags -from armi.tests import TEST_ROOT -from armi.utils import directoryChangers -from armi.utils import textProcessors from armi.reactor.blueprints.gridBlueprint import saveToStream +from armi.reactor.blueprints.isotopicOptions import CustomIsotopics, NuclideFlags +from armi.reactor.flags import Flags from armi.settings.fwSettings.globalSettings import CONF_INPUT_HEIGHTS_HOT +from armi.tests import TEST_ROOT +from armi.utils import directoryChangers, textProcessors class TestBlueprints(unittest.TestCase): diff --git a/armi/reactor/blueprints/tests/test_customIsotopics.py b/armi/reactor/blueprints/tests/test_customIsotopics.py index d971cb658..27ce95edc 100644 --- a/armi/reactor/blueprints/tests/test_customIsotopics.py +++ b/armi/reactor/blueprints/tests/test_customIsotopics.py @@ -18,11 +18,12 @@ import yamlize -from armi import runLog -from armi import settings -from armi.physics.neutronics.settings import CONF_MCNP_LIB_BASE -from armi.physics.neutronics.settings import CONF_NEUTRONICS_KERNEL -from armi.physics.neutronics.settings import CONF_XS_KERNEL +from armi import runLog, settings +from armi.physics.neutronics.settings import ( + CONF_MCNP_LIB_BASE, + CONF_NEUTRONICS_KERNEL, + CONF_XS_KERNEL, +) from armi.reactor import blueprints from armi.reactor.blueprints import isotopicOptions from armi.reactor.flags import Flags diff --git a/armi/reactor/blueprints/tests/test_gridBlueprints.py b/armi/reactor/blueprints/tests/test_gridBlueprints.py index 076a68186..16e38cd50 100644 --- a/armi/reactor/blueprints/tests/test_gridBlueprints.py +++ b/armi/reactor/blueprints/tests/test_gridBlueprints.py @@ -25,7 +25,6 @@ from armi.reactor.blueprints.gridBlueprint import Grids, saveToStream from armi.utils.directoryChangers import TemporaryDirectoryChanger - LATTICE_BLUEPRINT = """ control: geom: hex_corners_up diff --git a/armi/reactor/blueprints/tests/test_materialModifications.py b/armi/reactor/blueprints/tests/test_materialModifications.py index a6487f903..52ada251e 100644 --- a/armi/reactor/blueprints/tests/test_materialModifications.py +++ b/armi/reactor/blueprints/tests/test_materialModifications.py @@ -16,8 +16,7 @@ from numpy.testing import assert_allclose -from armi import materials -from armi import settings +from armi import materials, settings from armi.reactor import blueprints from armi.reactor.blueprints.blockBlueprint import BlockBlueprint diff --git a/armi/reactor/blueprints/tests/test_reactorBlueprints.py b/armi/reactor/blueprints/tests/test_reactorBlueprints.py index 411d6fcfa..2e107517e 100644 --- a/armi/reactor/blueprints/tests/test_reactorBlueprints.py +++ b/armi/reactor/blueprints/tests/test_reactorBlueprints.py @@ -17,10 +17,8 @@ import unittest from armi import settings -from armi.reactor import blueprints -from armi.reactor import reactors -from armi.reactor.blueprints import gridBlueprint -from armi.reactor.blueprints import reactorBlueprint +from armi.reactor import blueprints, reactors +from armi.reactor.blueprints import gridBlueprint, reactorBlueprint from armi.reactor.blueprints.tests import test_customIsotopics from armi.reactor.composites import Composite from armi.reactor.excoreStructure import ExcoreStructure diff --git a/armi/reactor/components/__init__.py b/armi/reactor/components/__init__.py index 516cdae81..953d12d22 100644 --- a/armi/reactor/components/__init__.py +++ b/armi/reactor/components/__init__.py @@ -26,7 +26,7 @@ Class inheritance diagram for :py:mod:`armi.reactor.components`. """ -# ruff: noqa: F405 +# ruff: noqa: F405, I001 import math import numpy as np diff --git a/armi/reactor/components/basicShapes.py b/armi/reactor/components/basicShapes.py index 4e395009b..2edc20a9a 100644 --- a/armi/reactor/components/basicShapes.py +++ b/armi/reactor/components/basicShapes.py @@ -20,8 +20,7 @@ """ import math -from armi.reactor.components import ShapedComponent -from armi.reactor.components import componentParameters +from armi.reactor.components import ShapedComponent, componentParameters class Circle(ShapedComponent): diff --git a/armi/reactor/components/complexShapes.py b/armi/reactor/components/complexShapes.py index 2f1ff9f6f..247447ab7 100644 --- a/armi/reactor/components/complexShapes.py +++ b/armi/reactor/components/complexShapes.py @@ -16,9 +16,7 @@ import math -from armi.reactor.components import ShapedComponent -from armi.reactor.components import componentParameters -from armi.reactor.components import basicShapes +from armi.reactor.components import ShapedComponent, basicShapes, componentParameters class HoledHexagon(basicShapes.Hexagon): diff --git a/armi/reactor/components/component.py b/armi/reactor/components/component.py index 5a4da2f3b..979d6471d 100644 --- a/armi/reactor/components/component.py +++ b/armi/reactor/components/component.py @@ -19,21 +19,15 @@ """ import copy import re +from typing import Optional import numpy as np -from typing import Optional -from armi import materials -from armi import runLog +from armi import materials, runLog from armi.bookkeeping import report -from armi.materials import custom -from armi.materials import material -from armi.materials import void +from armi.materials import custom, material, void from armi.nucDirectory import nuclideBases -from armi.reactor import composites -from armi.reactor import flags -from armi.reactor import grids -from armi.reactor import parameters +from armi.reactor import composites, flags, grids, parameters from armi.reactor.components import componentParameters from armi.utils import densityTools from armi.utils.units import C_TO_K diff --git a/armi/reactor/components/volumetricShapes.py b/armi/reactor/components/volumetricShapes.py index 329c537b1..27d2bee51 100644 --- a/armi/reactor/components/volumetricShapes.py +++ b/armi/reactor/components/volumetricShapes.py @@ -16,8 +16,7 @@ import math -from armi.reactor.components import componentParameters -from armi.reactor.components import ShapedComponent +from armi.reactor.components import ShapedComponent, componentParameters class Sphere(ShapedComponent): diff --git a/armi/reactor/composites.py b/armi/reactor/composites.py index 1b2bad687..e6cd581c6 100644 --- a/armi/reactor/composites.py +++ b/armi/reactor/composites.py @@ -46,9 +46,7 @@ from armi.reactor import grids, parameters from armi.reactor.flags import Flags, TypeSpec from armi.reactor.parameters import resolveCollections -from armi.utils import densityTools -from armi.utils import tabulate -from armi.utils import units +from armi.utils import densityTools, tabulate, units from armi.utils.densityTools import calculateNumberDensity from armi.utils.flags import auto diff --git a/armi/reactor/converters/axialExpansionChanger/__init__.py b/armi/reactor/converters/axialExpansionChanger/__init__.py index 9676af29d..eb7454eac 100644 --- a/armi/reactor/converters/axialExpansionChanger/__init__.py +++ b/armi/reactor/converters/axialExpansionChanger/__init__.py @@ -19,12 +19,10 @@ ) from armi.reactor.converters.axialExpansionChanger.axialExpansionChanger import ( AxialExpansionChanger, -) -from armi.reactor.converters.axialExpansionChanger.axialExpansionChanger import ( makeAssemsAbleToSnapToUniformMesh, ) -from armi.reactor.converters.axialExpansionChanger.expansionData import ExpansionData from armi.reactor.converters.axialExpansionChanger.expansionData import ( + ExpansionData, getSolidComponents, iterSolidComponents, ) diff --git a/armi/reactor/converters/axialExpansionChanger/assemblyAxialLinkage.py b/armi/reactor/converters/axialExpansionChanger/assemblyAxialLinkage.py index ae546b51e..c41977d63 100644 --- a/armi/reactor/converters/axialExpansionChanger/assemblyAxialLinkage.py +++ b/armi/reactor/converters/axialExpansionChanger/assemblyAxialLinkage.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import typing import dataclasses import functools import itertools +import typing from armi import runLog from armi.reactor.blocks import Block @@ -24,7 +24,6 @@ iterSolidComponents, ) - if typing.TYPE_CHECKING: from armi.reactor.assemblies import Assembly diff --git a/armi/reactor/converters/axialExpansionChanger/expansionData.py b/armi/reactor/converters/axialExpansionChanger/expansionData.py index 39d4dacaa..b3aa73aed 100644 --- a/armi/reactor/converters/axialExpansionChanger/expansionData.py +++ b/armi/reactor/converters/axialExpansionChanger/expansionData.py @@ -14,7 +14,7 @@ """Data container for axial expansion.""" from statistics import mean -from typing import TYPE_CHECKING, Optional, Iterable +from typing import TYPE_CHECKING, Iterable, Optional from armi import runLog from armi.materials import material @@ -29,9 +29,9 @@ ] if TYPE_CHECKING: - from armi.reactor.components import Component - from armi.reactor.blocks import Block from armi.reactor.assemblies import Assembly + from armi.reactor.blocks import Block + from armi.reactor.components import Component def iterSolidComponents(b: "Block") -> Iterable["Component"]: diff --git a/armi/reactor/converters/geometryConverters.py b/armi/reactor/converters/geometryConverters.py index e035c4e9a..8006a917f 100644 --- a/armi/reactor/converters/geometryConverters.py +++ b/armi/reactor/converters/geometryConverters.py @@ -35,26 +35,26 @@ import matplotlib.pyplot as plt import numpy as np -from armi import materials -from armi import runLog +from armi import materials, runLog from armi.physics.neutronics.fissionProductModel import lumpedFissionProduct -from armi.reactor import assemblies -from armi.reactor import blocks -from armi.reactor import components -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import parameters -from armi.reactor import reactors -from armi.reactor.converters import blockConverters -from armi.reactor.converters import meshConverters +from armi.reactor import ( + assemblies, + blocks, + components, + geometry, + grids, + parameters, + reactors, +) +from armi.reactor.converters import blockConverters, meshConverters from armi.reactor.flags import Flags -from armi.reactor.parameters import Category -from armi.reactor.parameters import NEVER -from armi.reactor.parameters import ParamLocation -from armi.reactor.parameters import SINCE_LAST_GEOMETRY_TRANSFORMATION -from armi.utils import hexagon -from armi.utils import plotting -from armi.utils import units +from armi.reactor.parameters import ( + NEVER, + SINCE_LAST_GEOMETRY_TRANSFORMATION, + Category, + ParamLocation, +) +from armi.utils import hexagon, plotting, units BLOCK_AXIAL_MESH_SPACING = ( 20 # Block axial mesh spacing set for nodal diffusion calculation (cm) diff --git a/armi/reactor/converters/meshConverters.py b/armi/reactor/converters/meshConverters.py index 769770e63..ef89eedaa 100644 --- a/armi/reactor/converters/meshConverters.py +++ b/armi/reactor/converters/meshConverters.py @@ -15,8 +15,8 @@ """Mesh specifiers update the mesh structure of a reactor by increasing or decreasing the number of mesh coordinates.""" import collections -import math import itertools +import math import numpy as np diff --git a/armi/reactor/converters/parameterSweeps/generalParameterSweepConverters.py b/armi/reactor/converters/parameterSweeps/generalParameterSweepConverters.py index 11248e3b8..a5d6a0bc0 100644 --- a/armi/reactor/converters/parameterSweeps/generalParameterSweepConverters.py +++ b/armi/reactor/converters/parameterSweeps/generalParameterSweepConverters.py @@ -13,12 +13,12 @@ # limitations under the License. """Module for general core parameter sweeps.""" -from armi.reactor.converters.geometryConverters import GeometryConverter from armi.physics.neutronics.settings import ( CONF_EPS_EIG, CONF_EPS_FSAVG, CONF_EPS_FSPOINT, ) +from armi.reactor.converters.geometryConverters import GeometryConverter class ParameterSweepConverter(GeometryConverter): diff --git a/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py b/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py index 97fc3d95f..81f87fa96 100644 --- a/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py +++ b/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py @@ -16,15 +16,14 @@ import os import unittest -from armi.tests import TEST_ROOT +from armi.physics.neutronics.settings import CONF_EPS_FSPOINT from armi.reactor.converters.parameterSweeps.generalParameterSweepConverters import ( NeutronicConvergenceModifier, ParameterSweepConverter, SettingsModifier, ) from armi.reactor.tests.test_reactors import loadTestReactor -from armi.physics.neutronics.settings import CONF_EPS_FSPOINT - +from armi.tests import TEST_ROOT THIS_DIR = os.path.dirname(__file__) diff --git a/armi/reactor/converters/pinTypeBlockConverters.py b/armi/reactor/converters/pinTypeBlockConverters.py index 59864ae35..ab36abbfe 100644 --- a/armi/reactor/converters/pinTypeBlockConverters.py +++ b/armi/reactor/converters/pinTypeBlockConverters.py @@ -28,8 +28,8 @@ """ import math -from armi.reactor.flags import Flags from armi import runLog +from armi.reactor.flags import Flags def adjustSmearDensity(obj, value, bolBlock=None): diff --git a/armi/reactor/converters/tests/test_blockConverter.py b/armi/reactor/converters/tests/test_blockConverter.py index 7e0195d17..e32056345 100644 --- a/armi/reactor/converters/tests/test_blockConverter.py +++ b/armi/reactor/converters/tests/test_blockConverter.py @@ -13,10 +13,10 @@ # limitations under the License. """Test block conversions.""" +import math import os import unittest -import math import numpy as np from armi.physics.neutronics.isotopicDepletion.isotopicDepletionInterface import ( diff --git a/armi/reactor/converters/tests/test_geometryConverters.py b/armi/reactor/converters/tests/test_geometryConverters.py index 629092693..0461e5979 100644 --- a/armi/reactor/converters/tests/test_geometryConverters.py +++ b/armi/reactor/converters/tests/test_geometryConverters.py @@ -16,20 +16,17 @@ import math import os import unittest + from numpy.testing import assert_allclose from armi import runLog -from armi.reactor import blocks -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor.converters import geometryConverters -from armi.reactor.converters import uniformMesh +from armi.reactor import blocks, geometry, grids +from armi.reactor.converters import geometryConverters, uniformMesh from armi.reactor.flags import Flags from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings from armi.tests import TEST_ROOT, mockRunLogs from armi.utils import directoryChangers - THIS_DIR = os.path.dirname(__file__) diff --git a/armi/reactor/converters/tests/test_meshConverters.py b/armi/reactor/converters/tests/test_meshConverters.py index 8ce07596a..348e5d270 100644 --- a/armi/reactor/converters/tests/test_meshConverters.py +++ b/armi/reactor/converters/tests/test_meshConverters.py @@ -16,7 +16,7 @@ import math import unittest -from armi.reactor.converters import meshConverters, geometryConverters +from armi.reactor.converters import geometryConverters, meshConverters from armi.reactor.tests.test_reactors import loadTestReactor from armi.tests import TEST_ROOT diff --git a/armi/reactor/converters/tests/test_pinTypeBlockConverters.py b/armi/reactor/converters/tests/test_pinTypeBlockConverters.py index 2574aa969..4760d9f7b 100644 --- a/armi/reactor/converters/tests/test_pinTypeBlockConverters.py +++ b/armi/reactor/converters/tests/test_pinTypeBlockConverters.py @@ -15,14 +15,13 @@ import copy import unittest -from armi.reactor.flags import Flags - -from armi.reactor.tests.test_blocks import loadTestBlock, buildSimpleFuelBlock from armi.reactor.converters.pinTypeBlockConverters import ( - adjustCladThicknessByOD, adjustCladThicknessByID, + adjustCladThicknessByOD, adjustSmearDensity, ) +from armi.reactor.flags import Flags +from armi.reactor.tests.test_blocks import buildSimpleFuelBlock, loadTestBlock class TestPinTypeConverters(unittest.TestCase): diff --git a/armi/reactor/converters/tests/test_uniformMesh.py b/armi/reactor/converters/tests/test_uniformMesh.py index 2edaf6a4b..063883e6a 100644 --- a/armi/reactor/converters/tests/test_uniformMesh.py +++ b/armi/reactor/converters/tests/test_uniformMesh.py @@ -13,20 +13,19 @@ # limitations under the License. """Tests for the uniform mesh geometry converter.""" import collections +import copy import os import random import unittest -import copy from armi.nuclearDataIO.cccc import isotxs from armi.physics.neutronics.settings import CONF_XS_KERNEL -from armi.settings.fwSettings.globalSettings import CONF_UNIFORM_MESH_MINIMUM_SIZE from armi.reactor.converters import uniformMesh from armi.reactor.flags import Flags -from armi.reactor.tests import test_assemblies -from armi.reactor.tests import test_blocks +from armi.reactor.tests import test_assemblies, test_blocks from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings -from armi.tests import TEST_ROOT, ISOAA_PATH +from armi.settings.fwSettings.globalSettings import CONF_UNIFORM_MESH_MINIMUM_SIZE +from armi.tests import ISOAA_PATH, TEST_ROOT class DummyFluxOptions: diff --git a/armi/reactor/converters/uniformMesh.py b/armi/reactor/converters/uniformMesh.py index 8bb949771..af7fcda70 100644 --- a/armi/reactor/converters/uniformMesh.py +++ b/armi/reactor/converters/uniformMesh.py @@ -52,28 +52,24 @@ .. figure:: /.static/axial_homogenization.png """ -import re -import glob -import copy import collections +import copy +import glob +import re from timeit import default_timer as timer import numpy as np import armi from armi import runLog -from armi.utils.mathematics import average1DWithinTolerance -from armi.utils import iterables -from armi.utils import plotting -from armi.reactor import grids -from armi.reactor.reactors import Core -from armi.reactor.flags import Flags +from armi.physics.neutronics.globalFlux import RX_ABS_MICRO_LABELS, RX_PARAM_NAMES +from armi.reactor import grids, parameters from armi.reactor.converters.geometryConverters import GeometryConverter -from armi.reactor import parameters -from armi.reactor.reactors import Reactor +from armi.reactor.flags import Flags +from armi.reactor.reactors import Core, Reactor from armi.settings.fwSettings.globalSettings import CONF_UNIFORM_MESH_MINIMUM_SIZE -from armi.physics.neutronics.globalFlux import RX_PARAM_NAMES, RX_ABS_MICRO_LABELS - +from armi.utils import iterables, plotting +from armi.utils.mathematics import average1DWithinTolerance HEAVY_METAL_PARAMS = ["molesHmBOL", "massHmBOL"] diff --git a/armi/reactor/cores.py b/armi/reactor/cores.py index 00ce8d47d..830a8fd5a 100644 --- a/armi/reactor/cores.py +++ b/armi/reactor/cores.py @@ -18,24 +18,25 @@ A Core frequently contain assemblies which in turn contain more refinement in representing the physical reactor. """ -from typing import Optional import collections import copy import itertools import os import time +from typing import Optional import numpy as np -from armi import getPluginManagerOrFail, nuclearDataIO -from armi import runLog +from armi import getPluginManagerOrFail, nuclearDataIO, runLog from armi.nuclearDataIO import xsLibraries -from armi.reactor import composites -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import parameters -from armi.reactor import reactorParameters -from armi.reactor import zones +from armi.reactor import ( + composites, + geometry, + grids, + parameters, + reactorParameters, + zones, +) from armi.reactor.flags import Flags from armi.settings.fwSettings.globalSettings import ( CONF_AUTOMATIC_VARIABLE_MESH, @@ -48,8 +49,7 @@ CONF_TRACK_ASSEMS, CONF_ZONE_DEFINITIONS, ) -from armi.utils import createFormattedStrWithDelimiter, units -from armi.utils import tabulate +from armi.utils import createFormattedStrWithDelimiter, tabulate, units from armi.utils.iterables import Sequence from armi.utils.mathematics import average1DWithinTolerance @@ -124,8 +124,8 @@ def __init__(self, name): def setOptionsFromCs(self, cs): from armi.physics.fuelCycle.settings import ( - CONF_JUMP_RING_NUM, CONF_CIRCULAR_RING_MODE, + CONF_JUMP_RING_NUM, ) # these are really "user modifiable modeling constants" diff --git a/armi/reactor/flags.py b/armi/reactor/flags.py index 190d58c7a..e311f6e4a 100644 --- a/armi/reactor/flags.py +++ b/armi/reactor/flags.py @@ -110,7 +110,6 @@ from armi.utils.flags import Flag, FlagType, auto - # Type alias used for passing type specifications to many of the composite methods. See # Composite::hasFlags() to understand the semantics for how TypeSpecs are interpreted. # Anything that interprets a TypeSpec should apply the same semantics. diff --git a/armi/reactor/geometry.py b/armi/reactor/geometry.py index 93a9d9fc5..7d1e3601e 100644 --- a/armi/reactor/geometry.py +++ b/armi/reactor/geometry.py @@ -17,7 +17,7 @@ geometry. """ import enum -from typing import Union, Optional +from typing import Optional, Union class GeomType(enum.Enum): diff --git a/armi/reactor/grids/__init__.py b/armi/reactor/grids/__init__.py index fa6fe3c07..541e1cd15 100644 --- a/armi/reactor/grids/__init__.py +++ b/armi/reactor/grids/__init__.py @@ -61,29 +61,27 @@ current grid. """ # ruff: noqa: F401 -from typing import Tuple, Optional +from typing import Optional, Tuple +from armi.reactor.grids.axial import AxialGrid +from armi.reactor.grids.cartesian import CartesianGrid from armi.reactor.grids.constants import ( - BOUNDARY_CENTER, BOUNDARY_0_DEGREES, - BOUNDARY_120_DEGREES, BOUNDARY_60_DEGREES, + BOUNDARY_120_DEGREES, + BOUNDARY_CENTER, ) - +from armi.reactor.grids.grid import Grid +from armi.reactor.grids.hexagonal import COS30, SIN30, TRIANGLES_IN_HEXAGON, HexGrid from armi.reactor.grids.locations import ( - LocationBase, + CoordinateLocation, IndexLocation, + LocationBase, MultiIndexLocation, - CoordinateLocation, addingIsValid, ) - -from armi.reactor.grids.grid import Grid -from armi.reactor.grids.structuredGrid import StructuredGrid, GridParameters, _tuplify -from armi.reactor.grids.axial import AxialGrid -from armi.reactor.grids.cartesian import CartesianGrid -from armi.reactor.grids.hexagonal import HexGrid, COS30, SIN30, TRIANGLES_IN_HEXAGON -from armi.reactor.grids.thetarz import ThetaRZGrid, TAU +from armi.reactor.grids.structuredGrid import GridParameters, StructuredGrid, _tuplify +from armi.reactor.grids.thetarz import TAU, ThetaRZGrid def locatorLabelToIndices(label: str) -> Tuple[int, int, Optional[int]]: diff --git a/armi/reactor/grids/axial.py b/armi/reactor/grids/axial.py index 4cde443f1..ffbb43a4a 100644 --- a/armi/reactor/grids/axial.py +++ b/armi/reactor/grids/axial.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from typing import List, Optional, TYPE_CHECKING, NoReturn +from typing import TYPE_CHECKING, List, NoReturn, Optional import numpy as np diff --git a/armi/reactor/grids/cartesian.py b/armi/reactor/grids/cartesian.py index 4971e8ee0..adb83c08e 100644 --- a/armi/reactor/grids/cartesian.py +++ b/armi/reactor/grids/cartesian.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import itertools -from typing import Optional, NoReturn, Tuple +from typing import NoReturn, Optional, Tuple import numpy as np diff --git a/armi/reactor/grids/grid.py b/armi/reactor/grids/grid.py index fac584260..14ab823c2 100644 --- a/armi/reactor/grids/grid.py +++ b/armi/reactor/grids/grid.py @@ -12,12 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. from abc import ABC, abstractmethod -from typing import Union, Optional, Hashable, TYPE_CHECKING, Dict, Iterable, Tuple, List +from typing import TYPE_CHECKING, Dict, Hashable, Iterable, List, Optional, Tuple, Union import numpy as np from armi.reactor import geometry -from armi.reactor.grids.locations import LocationBase, IndexLocation, IJType, IJKType +from armi.reactor.grids.locations import IJKType, IJType, IndexLocation, LocationBase if TYPE_CHECKING: from armi.reactor.composites import ArmiObject diff --git a/armi/reactor/grids/hexagonal.py b/armi/reactor/grids/hexagonal.py index df44d19ef..262307826 100644 --- a/armi/reactor/grids/hexagonal.py +++ b/armi/reactor/grids/hexagonal.py @@ -13,15 +13,15 @@ # limitations under the License. from collections import deque from math import sqrt -from typing import Tuple, List, Optional +from typing import List, Optional, Tuple import numpy as np from armi.reactor import geometry from armi.reactor.grids.constants import ( BOUNDARY_0_DEGREES, - BOUNDARY_120_DEGREES, BOUNDARY_60_DEGREES, + BOUNDARY_120_DEGREES, BOUNDARY_CENTER, ) from armi.reactor.grids.locations import IJKType, IJType, IndexLocation diff --git a/armi/reactor/grids/locations.py b/armi/reactor/grids/locations.py index 1d0320ee2..cc2a1aaf7 100644 --- a/armi/reactor/grids/locations.py +++ b/armi/reactor/grids/locations.py @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional, TYPE_CHECKING, Union, Hashable, Tuple, List, Iterator -from abc import ABC, abstractmethod import math +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Hashable, Iterator, List, Optional, Tuple, Union import numpy as np diff --git a/armi/reactor/grids/structuredGrid.py b/armi/reactor/grids/structuredGrid.py index 07388338b..177120419 100644 --- a/armi/reactor/grids/structuredGrid.py +++ b/armi/reactor/grids/structuredGrid.py @@ -10,10 +10,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from abc import abstractmethod import collections import itertools -from typing import Tuple, Union, List, Iterable, Optional, Sequence +from abc import abstractmethod +from typing import Iterable, List, Optional, Sequence, Tuple, Union import numpy as np diff --git a/armi/reactor/grids/tests/test_grids.py b/armi/reactor/grids/tests/test_grids.py index 79502922d..8cfa5c492 100644 --- a/armi/reactor/grids/tests/test_grids.py +++ b/armi/reactor/grids/tests/test_grids.py @@ -13,17 +13,16 @@ # limitations under the License. """Tests for grids.""" -from io import BytesIO -from random import randint import math import pickle import unittest +from io import BytesIO +from random import randint import numpy as np from numpy.testing import assert_allclose, assert_array_equal -from armi.reactor import geometry -from armi.reactor import grids +from armi.reactor import geometry, grids from armi.utils import hexagon diff --git a/armi/reactor/grids/thetarz.py b/armi/reactor/grids/thetarz.py index 7f9582d4c..c3270c009 100644 --- a/armi/reactor/grids/thetarz.py +++ b/armi/reactor/grids/thetarz.py @@ -12,11 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. import math -from typing import TYPE_CHECKING, Optional, NoReturn +from typing import TYPE_CHECKING, NoReturn, Optional import numpy as np -from armi.reactor.grids.locations import IJType, IJKType +from armi.reactor.grids.locations import IJKType, IJType from armi.reactor.grids.structuredGrid import StructuredGrid if TYPE_CHECKING: diff --git a/armi/reactor/parameters/__init__.py b/armi/reactor/parameters/__init__.py index 16bf2813b..62716923b 100644 --- a/armi/reactor/parameters/__init__.py +++ b/armi/reactor/parameters/__init__.py @@ -197,37 +197,32 @@ class instance to have a ``__dict__``. This saves memory when there are many .. _Meriam-Webster: http://www.merriam-webster.com/dictionary/parameter """ # ruff: noqa: F401 +from armi.reactor.parameters.exceptions import ( + ParameterDefinitionError, + ParameterError, + UnknownParameterError, +) from armi.reactor.parameters.parameterCollections import ( ParameterCollection, + applyAllParameters, collectPluginParameters, ) -from armi.reactor.parameters.parameterCollections import applyAllParameters -from armi.reactor.parameters.parameterDefinitions import ( - ParameterDefinitionCollection, - Parameter, -) - from armi.reactor.parameters.parameterDefinitions import ( + ALL_DEFINITIONS, + NEVER, + SINCE_ANYTHING, + SINCE_BACKUP, SINCE_INITIALIZATION, SINCE_LAST_DISTRIBUTE_STATE, SINCE_LAST_GEOMETRY_TRANSFORMATION, - SINCE_BACKUP, - SINCE_ANYTHING, - NEVER, - Serializer, Category, - ParamLocation, NoDefault, - ALL_DEFINITIONS, -) - -from armi.reactor.parameters.exceptions import ( - ParameterDefinitionError, - ParameterError, - UnknownParameterError, + Parameter, + ParameterDefinitionCollection, + ParamLocation, + Serializer, ) - forType = ALL_DEFINITIONS.forType inCategory = ALL_DEFINITIONS.inCategory byNameAndType = ALL_DEFINITIONS.byNameAndType diff --git a/armi/reactor/parameters/parameterCollections.py b/armi/reactor/parameters/parameterCollections.py index c588563cc..65f3c34fc 100644 --- a/armi/reactor/parameters/parameterCollections.py +++ b/armi/reactor/parameters/parameterCollections.py @@ -12,24 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Optional, List, Set, Iterator, Callable import copy import pickle import sys +from typing import Any, Callable, Iterator, List, Optional, Set import numpy as np from armi import runLog -from armi.reactor.parameters import parameterDefinitions, exceptions +from armi.reactor.parameters import exceptions, parameterDefinitions from armi.reactor.parameters.parameterDefinitions import ( - SINCE_LAST_DISTRIBUTE_STATE, - SINCE_BACKUP, - SINCE_ANYTHING, NEVER, + SINCE_ANYTHING, + SINCE_BACKUP, + SINCE_LAST_DISTRIBUTE_STATE, ) from armi.utils import units - GLOBAL_SERIAL_NUM = -1 """ The serial number for all ParameterCollections diff --git a/armi/reactor/parameters/parameterDefinitions.py b/armi/reactor/parameters/parameterDefinitions.py index 4063a2cf3..54b213782 100644 --- a/armi/reactor/parameters/parameterDefinitions.py +++ b/armi/reactor/parameters/parameterDefinitions.py @@ -25,15 +25,15 @@ -------- armi.reactor.parameters """ -from typing import Any, Dict, Optional, Sequence, Tuple, Type import enum import functools import re +from typing import Any, Dict, Optional, Sequence, Tuple, Type import numpy as np from armi.reactor.flags import Flags -from armi.reactor.parameters.exceptions import ParameterError, ParameterDefinitionError +from armi.reactor.parameters.exceptions import ParameterDefinitionError, ParameterError # bitwise masks for high-speed operations on the `assigned` attribute # see: https://web.archive.org/web/20120225043338/http://www.vipan.com/htdocs/bitwisehelp.html diff --git a/armi/reactor/reactors.py b/armi/reactor/reactors.py index 1c5b862d5..4354fe60b 100644 --- a/armi/reactor/reactors.py +++ b/armi/reactor/reactors.py @@ -16,16 +16,13 @@ Reactor objects represent the highest level in the hierarchy of structures that compose the system to be modeled. """ -from typing import Optional import copy +from typing import Optional -from armi import getPluginManagerOrFail -from armi import runLog -from armi.reactor import composites -from armi.reactor import reactorParameters +from armi import getPluginManagerOrFail, runLog +from armi.reactor import composites, reactorParameters from armi.reactor.cores import Core -from armi.reactor.excoreStructure import ExcoreCollection -from armi.reactor.excoreStructure import ExcoreStructure +from armi.reactor.excoreStructure import ExcoreCollection, ExcoreStructure from armi.reactor.systemLayoutInput import SystemLayoutInput from armi.settings.fwSettings.globalSettings import ( CONF_GEOM_FILE, diff --git a/armi/reactor/systemLayoutInput.py b/armi/reactor/systemLayoutInput.py index 38573b029..7b7cdb659 100644 --- a/armi/reactor/systemLayoutInput.py +++ b/armi/reactor/systemLayoutInput.py @@ -25,20 +25,18 @@ reactor.blueprints.gridBlueprint """ -from collections import OrderedDict -from copy import copy import os import sys import xml.etree.ElementTree as ET +from collections import OrderedDict +from copy import copy -from ruamel.yaml import YAML import voluptuous as vol +from ruamel.yaml import YAML from armi import runLog -from armi.reactor import geometry -from armi.reactor import grids -from armi.utils import asciimaps -from armi.utils import directoryChangers +from armi.reactor import geometry, grids +from armi.utils import asciimaps, directoryChangers INP_SYSTEMS = "reactor" INP_SYMMETRY = "symmetry" diff --git a/armi/reactor/tests/test_assemblies.py b/armi/reactor/tests/test_assemblies.py index 787dd129c..d32494725 100644 --- a/armi/reactor/tests/test_assemblies.py +++ b/armi/reactor/tests/test_assemblies.py @@ -21,31 +21,30 @@ import numpy as np from numpy.testing import assert_allclose -from armi import settings -from armi import tests +from armi import settings, tests from armi.physics.neutronics.settings import ( CONF_LOADING_FILE, CONF_XS_KERNEL, ) -from armi.reactor import assemblies -from armi.reactor import blocks -from armi.reactor import blueprints -from armi.reactor import components -from armi.reactor import geometry -from armi.reactor import parameters -from armi.reactor import reactors +from armi.reactor import ( + assemblies, + blocks, + blueprints, + components, + geometry, + parameters, + reactors, +) from armi.reactor.assemblies import ( - copy, Flags, - grids, HexAssembly, + copy, + grids, runLog, ) from armi.reactor.tests import test_reactors from armi.tests import TEST_ROOT, mockRunLogs -from armi.utils import directoryChangers -from armi.utils import textProcessors - +from armi.utils import directoryChangers, textProcessors NUM_BLOCKS = 3 diff --git a/armi/reactor/tests/test_blocks.py b/armi/reactor/tests/test_blocks.py index db2adf8a8..80ff304ec 100644 --- a/armi/reactor/tests/test_blocks.py +++ b/armi/reactor/tests/test_blocks.py @@ -37,14 +37,16 @@ from armi.reactor.components import basicShapes, complexShapes from armi.reactor.flags import Flags from armi.reactor.tests.test_assemblies import makeTestAssembly -from armi.reactor.tests.test_reactors import loadTestReactor -from armi.reactor.tests.test_reactors import TEST_ROOT +from armi.reactor.tests.test_reactors import TEST_ROOT, loadTestReactor from armi.tests import ISOAA_PATH -from armi.utils import hexagon, units, densityTools +from armi.utils import densityTools, hexagon, units from armi.utils.directoryChangers import TemporaryDirectoryChanger -from armi.utils.units import MOLES_PER_CC_TO_ATOMS_PER_BARN_CM -from armi.utils.units import ASCII_LETTER_A, ASCII_LETTER_Z, ASCII_LETTER_a - +from armi.utils.units import ( + ASCII_LETTER_A, + ASCII_LETTER_Z, + MOLES_PER_CC_TO_ATOMS_PER_BARN_CM, + ASCII_LETTER_a, +) NUM_PINS_IN_TEST_BLOCK = 217 diff --git a/armi/reactor/tests/test_components.py b/armi/reactor/tests/test_components.py index 7ce082a54..eed58904c 100644 --- a/armi/reactor/tests/test_components.py +++ b/armi/reactor/tests/test_components.py @@ -22,8 +22,7 @@ from armi.materials import air, alloy200 from armi.materials.material import Material -from armi.reactor import components -from armi.reactor import flags +from armi.reactor import components, flags from armi.reactor.blocks import Block from armi.reactor.components import ( Circle, diff --git a/armi/reactor/tests/test_composites.py b/armi/reactor/tests/test_composites.py index 5a60cc5a1..b9cfd9093 100644 --- a/armi/reactor/tests/test_composites.py +++ b/armi/reactor/tests/test_composites.py @@ -13,31 +13,23 @@ # limitations under the License. """Tests for the composite pattern.""" -from copy import deepcopy import logging import unittest +from copy import deepcopy -from armi import nuclearDataIO -from armi import runLog -from armi import settings -from armi import utils +from armi import nuclearDataIO, runLog, settings, utils from armi.nucDirectory import nucDir, nuclideBases from armi.physics.neutronics.fissionProductModel.tests.test_lumpedFissionProduct import ( getDummyLFPFile, ) -from armi.reactor import assemblies -from armi.reactor import components -from armi.reactor import composites -from armi.reactor import grids -from armi.reactor import parameters +from armi.reactor import assemblies, components, composites, grids, parameters from armi.reactor.blueprints import assemblyBlueprint from armi.reactor.components import basicShapes from armi.reactor.composites import getReactionRateDict from armi.reactor.flags import Flags, TypeSpec from armi.reactor.tests.test_blocks import loadTestBlock from armi.reactor.tests.test_reactors import loadTestReactor -from armi.tests import ISOAA_PATH -from armi.tests import mockRunLogs +from armi.tests import ISOAA_PATH, mockRunLogs class MockBP: diff --git a/armi/reactor/tests/test_hexBlockRotate.py b/armi/reactor/tests/test_hexBlockRotate.py index 610286c2e..d0bac628b 100644 --- a/armi/reactor/tests/test_hexBlockRotate.py +++ b/armi/reactor/tests/test_hexBlockRotate.py @@ -22,12 +22,12 @@ from armi.reactor.blocks import HexBlock from armi.reactor.components import Component from armi.reactor.grids import ( - MultiIndexLocation, CoordinateLocation, - IndexLocation, HexGrid, + IndexLocation, + MultiIndexLocation, ) -from armi.reactor.tests.test_blocks import loadTestBlock, NUM_PINS_IN_TEST_BLOCK +from armi.reactor.tests.test_blocks import NUM_PINS_IN_TEST_BLOCK, loadTestBlock from armi.utils import iterables diff --git a/armi/reactor/tests/test_parameters.py b/armi/reactor/tests/test_parameters.py index 8fb70d741..38631b904 100644 --- a/armi/reactor/tests/test_parameters.py +++ b/armi/reactor/tests/test_parameters.py @@ -12,11 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. """Tests for assorted Parameters tools.""" -from glob import glob -from shutil import copyfile import copy import os import unittest +from glob import glob +from shutil import copyfile from armi.reactor import parameters from armi.reactor.reactorParameters import makeParametersReadOnly diff --git a/armi/reactor/tests/test_reactors.py b/armi/reactor/tests/test_reactors.py index ea03fbaa5..70ddf96ca 100644 --- a/armi/reactor/tests/test_reactors.py +++ b/armi/reactor/tests/test_reactors.py @@ -22,26 +22,21 @@ from numpy.testing import assert_allclose, assert_equal -from armi import operators -from armi import runLog -from armi import settings -from armi import tests +from armi import operators, runLog, settings, tests from armi.materials import uZr from armi.physics.neutronics.settings import CONF_XS_KERNEL -from armi.reactor import assemblies -from armi.reactor import blocks -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import reactors +from armi.reactor import assemblies, blocks, geometry, grids, reactors from armi.reactor.components import Hexagon, Rectangle from armi.reactor.composites import Composite from armi.reactor.converters import geometryConverters from armi.reactor.converters.axialExpansionChanger import AxialExpansionChanger from armi.reactor.flags import Flags from armi.reactor.spentFuelPool import SpentFuelPool -from armi.settings.fwSettings.globalSettings import CONF_ASSEM_FLAGS_SKIP_AXIAL_EXP -from armi.settings.fwSettings.globalSettings import CONF_SORT_REACTOR -from armi.tests import ARMI_RUN_PATH, mockRunLogs, TEST_ROOT +from armi.settings.fwSettings.globalSettings import ( + CONF_ASSEM_FLAGS_SKIP_AXIAL_EXP, + CONF_SORT_REACTOR, +) +from armi.tests import ARMI_RUN_PATH, TEST_ROOT, mockRunLogs from armi.utils import directoryChangers THIS_DIR = os.path.dirname(__file__) diff --git a/armi/reactor/tests/test_zones.py b/armi/reactor/tests/test_zones.py index 4ded16430..9ac40a6d3 100644 --- a/armi/reactor/tests/test_zones.py +++ b/armi/reactor/tests/test_zones.py @@ -18,13 +18,15 @@ import unittest from armi import runLog -from armi.reactor import assemblies -from armi.reactor import blocks -from armi.reactor import blueprints -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import reactors -from armi.reactor import zones +from armi.reactor import ( + assemblies, + blocks, + blueprints, + geometry, + grids, + reactors, + zones, +) from armi.reactor.tests import test_reactors from armi.tests import mockRunLogs diff --git a/armi/settings/__init__.py b/armi/settings/__init__.py index 258864bde..31bc31307 100644 --- a/armi/settings/__init__.py +++ b/armi/settings/__init__.py @@ -20,21 +20,22 @@ availability fraction and things like that. The ARMI Framework itself has many settings of its own, and plugins typically register some of their own settings as well. """ -from typing import List import fnmatch import glob import os +from typing import List from ruamel import yaml from armi import runLog from armi.settings.caseSettings import Settings -from armi.settings.setting import Default # noqa: F401 -from armi.settings.setting import Option # noqa: F401 -from armi.settings.setting import Setting +from armi.settings.setting import ( + Default, # noqa: F401 + Option, # noqa: F401 + Setting, +) from armi.utils.customExceptions import InvalidSettingsFileError - NOT_ENABLED = "" # An empty setting value implies that the feature diff --git a/armi/settings/caseSettings.py b/armi/settings/caseSettings.py index 165359fd5..76a2d2f0b 100644 --- a/armi/settings/caseSettings.py +++ b/armi/settings/caseSettings.py @@ -25,10 +25,10 @@ import logging import os from copy import copy, deepcopy + from ruamel.yaml import YAML -from armi import context -from armi import runLog +from armi import context, runLog from armi.settings import settingsIO from armi.settings.setting import Setting from armi.utils import pathTools diff --git a/armi/settings/fwSettings/__init__.py b/armi/settings/fwSettings/__init__.py index a7caffdb4..22e96f542 100644 --- a/armi/settings/fwSettings/__init__.py +++ b/armi/settings/fwSettings/__init__.py @@ -16,9 +16,7 @@ from typing import List from armi.settings import setting -from armi.settings.fwSettings import globalSettings -from armi.settings.fwSettings import databaseSettings -from armi.settings.fwSettings import reportSettings +from armi.settings.fwSettings import databaseSettings, globalSettings, reportSettings def getFrameworkSettings() -> List[setting.Setting]: diff --git a/armi/settings/fwSettings/globalSettings.py b/armi/settings/fwSettings/globalSettings.py index 353a0cc79..cb07e9b33 100644 --- a/armi/settings/fwSettings/globalSettings.py +++ b/armi/settings/fwSettings/globalSettings.py @@ -29,7 +29,6 @@ from armi.settings.fwSettings import tightCouplingSettings from armi.utils.mathematics import isMonotonic - # Framework settings CONF_ACCEPTABLE_BLOCK_AREA_ERROR = "acceptableBlockAreaError" CONF_ASSEM_FLAGS_SKIP_AXIAL_EXP = "assemFlagsToSkipAxialExpansion" diff --git a/armi/settings/fwSettings/reportSettings.py b/armi/settings/fwSettings/reportSettings.py index 67c5a8322..5cb16c5a4 100644 --- a/armi/settings/fwSettings/reportSettings.py +++ b/armi/settings/fwSettings/reportSettings.py @@ -18,7 +18,6 @@ from armi.settings import setting - CONF_GEN_REPORTS = "genReports" CONF_ASSEM_POW_SUMMARY = "assemPowSummary" CONF_SUMMARIZE_ASSEM_DESIGN = "summarizeAssemDesign" diff --git a/armi/settings/fwSettings/tests/test_tightCouplingSettings.py b/armi/settings/fwSettings/tests/test_tightCouplingSettings.py index 7336ba713..451617b8b 100644 --- a/armi/settings/fwSettings/tests/test_tightCouplingSettings.py +++ b/armi/settings/fwSettings/tests/test_tightCouplingSettings.py @@ -21,11 +21,11 @@ import io import unittest -from ruamel.yaml import YAML import voluptuous as vol +from ruamel.yaml import YAML -from armi.settings.fwSettings.tightCouplingSettings import TightCouplingSettingDef from armi.settings.fwSettings.tightCouplingSettings import ( + TightCouplingSettingDef, tightCouplingSettingsValidator, ) diff --git a/armi/settings/setting.py b/armi/settings/setting.py index 1d83cccc7..c4d901d0f 100644 --- a/armi/settings/setting.py +++ b/armi/settings/setting.py @@ -23,17 +23,16 @@ complex schema validation for settings that are more complex dictionaries (e.g. XS, rx coeffs). """ -from collections import namedtuple -from typing import List, Optional, Tuple import copy import datetime +from collections import namedtuple +from typing import List, Optional, Tuple import voluptuous as vol from armi import runLog from armi.reactor.flags import Flags - # Options are used to imbue existing settings with new Options. This allows a setting # like `neutronicsKernel` to strictly enforce options, even though the plugin that # defines it does not know all possible options, which may be provided from other diff --git a/armi/settings/settingsIO.py b/armi/settings/settingsIO.py index 516b5f238..d1171dfb6 100644 --- a/armi/settings/settingsIO.py +++ b/armi/settings/settingsIO.py @@ -16,19 +16,18 @@ :py:class:`~armi.settings.caseSettings.Settings`, and the contained :py:class:`~armi.settings.setting.Setting`. """ -from typing import Dict, Tuple, Set import collections import datetime import enum import os import sys +from typing import Dict, Set, Tuple -from ruamel.yaml import YAML import ruamel.yaml.comments +from ruamel.yaml import YAML -from armi import runLog +from armi import context, runLog from armi.meta import __version__ as version -from armi import context from armi.settings.setting import Setting from armi.utils.customExceptions import ( InvalidSettingsFileError, diff --git a/armi/settings/tests/test_inspectors.py b/armi/settings/tests/test_inspectors.py index cb27b3e96..e3d81095d 100644 --- a/armi/settings/tests/test_inspectors.py +++ b/armi/settings/tests/test_inspectors.py @@ -16,9 +16,7 @@ import os import unittest -from armi import context -from armi import operators -from armi import settings +from armi import context, operators, settings from armi.settings import settingsValidation from armi.settings.settingsValidation import createQueryRevertBadPathToDefault from armi.utils import directoryChangers diff --git a/armi/settings/tests/test_settings.py b/armi/settings/tests/test_settings.py index 3cfae7386..1f363565b 100644 --- a/armi/settings/tests/test_settings.py +++ b/armi/settings/tests/test_settings.py @@ -18,23 +18,17 @@ import os import unittest -from ruamel.yaml import YAML import voluptuous as vol +from ruamel.yaml import YAML -from armi import configure -from armi import getApp -from armi import getPluginManagerOrFail -from armi import plugins -from armi import settings +from armi import configure, getApp, getPluginManagerOrFail, plugins, settings from armi.physics.fuelCycle import FuelHandlerPlugin -from armi.physics.fuelCycle.settings import CONF_CIRCULAR_RING_ORDER -from armi.physics.fuelCycle.settings import CONF_SHUFFLE_LOGIC +from armi.physics.fuelCycle.settings import CONF_CIRCULAR_RING_ORDER, CONF_SHUFFLE_LOGIC from armi.physics.neutronics.settings import CONF_NEUTRONICS_KERNEL from armi.reactor.flags import Flags -from armi.settings import caseSettings -from armi.settings import setting +from armi.settings import caseSettings, setting from armi.settings.settingsValidation import Inspector, validateVersion -from armi.tests import TEST_ROOT, ARMI_RUN_PATH +from armi.tests import ARMI_RUN_PATH, TEST_ROOT from armi.utils import directoryChangers from armi.utils.customExceptions import NonexistentSetting diff --git a/armi/settings/tests/test_settingsIO.py b/armi/settings/tests/test_settingsIO.py index 9b99f1b3c..b2f0e2552 100644 --- a/armi/settings/tests/test_settingsIO.py +++ b/armi/settings/tests/test_settingsIO.py @@ -17,11 +17,9 @@ import os import unittest -from armi import context -from armi import settings +from armi import context, settings from armi.cli import entryPoint -from armi.settings import setting -from armi.settings import settingsIO +from armi.settings import setting, settingsIO from armi.tests import TEST_ROOT from armi.utils import directoryChangers from armi.utils.customExceptions import ( diff --git a/armi/tests/__init__.py b/armi/tests/__init__.py index 6e5607a2a..be870e3ae 100644 --- a/armi/tests/__init__.py +++ b/armi/tests/__init__.py @@ -17,19 +17,16 @@ This package contains some input files that can be used across a wide variety of unit tests in other lower-level subpackages. """ -from typing import Optional import datetime import itertools import os import re import shutil import unittest +from typing import Optional -from armi import context -from armi import runLog -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import reactors +from armi import context, runLog +from armi.reactor import geometry, grids, reactors TEST_ROOT = os.path.dirname(os.path.abspath(__file__)) ARMI_RUN_PATH = os.path.join(TEST_ROOT, "armiRun.yaml") diff --git a/armi/tests/anl-afci-177/anl-afci-177-fuelManagement.py b/armi/tests/anl-afci-177/anl-afci-177-fuelManagement.py index 62953ce44..cc608e6ef 100644 --- a/armi/tests/anl-afci-177/anl-afci-177-fuelManagement.py +++ b/armi/tests/anl-afci-177/anl-afci-177-fuelManagement.py @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from armi.utils import units - from armi.physics.fuelCycle.fuelHandlers import FuelHandler +from armi.utils import units class SampleShuffler(FuelHandler): diff --git a/armi/tests/test_apps.py b/armi/tests/test_apps.py index c14ffe5a6..69a7478f2 100644 --- a/armi/tests/test_apps.py +++ b/armi/tests/test_apps.py @@ -16,15 +16,17 @@ import copy import unittest -from armi import configure -from armi import context -from armi import getApp -from armi import getDefaultPluginManager -from armi import isStableReleaseVersion -from armi import meta -from armi import plugins -from armi.reactor.flags import Flags +from armi import ( + configure, + context, + getApp, + getDefaultPluginManager, + isStableReleaseVersion, + meta, + plugins, +) from armi.__main__ import main +from armi.reactor.flags import Flags class TestPlugin1(plugins.ArmiPlugin): diff --git a/armi/tests/test_interfaces.py b/armi/tests/test_interfaces.py index 1f23afdd3..53bdbc07f 100644 --- a/armi/tests/test_interfaces.py +++ b/armi/tests/test_interfaces.py @@ -15,8 +15,7 @@ """Tests the Interface.""" import unittest -from armi import interfaces -from armi import settings +from armi import interfaces, settings class DummyInterface(interfaces.Interface): diff --git a/armi/tests/test_lwrInputs.py b/armi/tests/test_lwrInputs.py index 6cc37b81b..297a3ad3f 100644 --- a/armi/tests/test_lwrInputs.py +++ b/armi/tests/test_lwrInputs.py @@ -12,16 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. """Tests for C5G7 input files.""" -from logging import WARNING import os import unittest +from logging import WARNING from armi import runLog from armi.reactor.flags import Flags -from armi.tests import mockRunLogs -from armi.tests import TEST_ROOT -from armi.utils import directoryChangers from armi.reactor.tests import test_reactors +from armi.tests import TEST_ROOT, mockRunLogs +from armi.utils import directoryChangers TEST_INPUT_TITLE = "c5g7-settings.yaml" diff --git a/armi/tests/test_mpiActions.py b/armi/tests/test_mpiActions.py index 35bea5007..e89a3fc1b 100644 --- a/armi/tests/test_mpiActions.py +++ b/armi/tests/test_mpiActions.py @@ -14,16 +14,16 @@ """Tests for MPI actions.""" import unittest +from armi import context from armi.mpiActions import ( - _diagnosePickleError, DistributeStateAction, DistributionAction, MpiAction, - runActions, + _diagnosePickleError, _disableForExclusiveTasks, _makeQueue, + runActions, ) -from armi import context from armi.reactor.tests import test_reactors from armi.tests import mockRunLogs from armi.utils import iterables diff --git a/armi/tests/test_mpiFeatures.py b/armi/tests/test_mpiFeatures.py index 3682d5687..9194d5dab 100644 --- a/armi/tests/test_mpiFeatures.py +++ b/armi/tests/test_mpiFeatures.py @@ -24,24 +24,20 @@ or mpiexec.exe -n 2 python -m pytest armi/tests/test_mpiFeatures.py """ -from unittest.mock import patch import os import shutil import unittest +from unittest.mock import patch -from armi import context -from armi import mpiActions -from armi import settings +from armi import context, mpiActions, settings from armi.interfaces import Interface from armi.mpiActions import DistributeStateAction from armi.operators import OperatorMPI from armi.physics.neutronics.const import CONF_CROSS_SECTION -from armi.reactor import blueprints -from armi.reactor import reactors +from armi.reactor import blueprints, reactors from armi.reactor.parameters import parameterDefinitions from armi.reactor.tests import test_reactors -from armi.tests import ARMI_RUN_PATH, TEST_ROOT -from armi.tests import mockRunLogs +from armi.tests import ARMI_RUN_PATH, TEST_ROOT, mockRunLogs from armi.utils import pathTools from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/tests/test_mpiParameters.py b/armi/tests/test_mpiParameters.py index 4754a7690..a0502ddf9 100644 --- a/armi/tests/test_mpiParameters.py +++ b/armi/tests/test_mpiParameters.py @@ -16,8 +16,7 @@ import unittest from armi import context -from armi.reactor import composites -from armi.reactor import parameters +from armi.reactor import composites, parameters # determine if this is a parallel run, and MPI is installed MPI_EXE = None diff --git a/armi/tests/test_plugins.py b/armi/tests/test_plugins.py index 462d7a7ad..a8f6a6b68 100644 --- a/armi/tests/test_plugins.py +++ b/armi/tests/test_plugins.py @@ -19,19 +19,21 @@ import yamlize -from armi import context -from armi import getApp -from armi import getPluginManagerOrFail -from armi import interfaces -from armi import plugins -from armi import settings -from armi import utils +from armi import ( + context, + getApp, + getPluginManagerOrFail, + interfaces, + plugins, + settings, + utils, +) from armi.bookkeeping.db.passiveDBLoadPlugin import PassiveDBLoadPlugin from armi.physics.neutronics import NeutronicsPlugin from armi.reactor.blocks import Block from armi.reactor.converters.axialExpansionChanger import AxialExpansionChanger from armi.reactor.flags import Flags -from armi.reactor.tests.test_reactors import loadTestReactor, TEST_ROOT +from armi.reactor.tests.test_reactors import TEST_ROOT, loadTestReactor class PluginFlags1(plugins.ArmiPlugin): diff --git a/armi/tests/test_user_plugins.py b/armi/tests/test_user_plugins.py index 0840afd58..55c6e1005 100644 --- a/armi/tests/test_user_plugins.py +++ b/armi/tests/test_user_plugins.py @@ -16,11 +16,7 @@ import os import unittest -from armi import context -from armi import getApp -from armi import interfaces -from armi import plugins -from armi import utils +from armi import context, getApp, interfaces, plugins, utils from armi.reactor.flags import Flags from armi.reactor.tests import test_reactors from armi.settings import caseSettings diff --git a/armi/utils/asciimaps.py b/armi/utils/asciimaps.py index 20cee223f..1a632db64 100644 --- a/armi/utils/asciimaps.py +++ b/armi/utils/asciimaps.py @@ -49,7 +49,6 @@ """ import re - from typing import Union from armi import runLog diff --git a/armi/utils/codeTiming.py b/armi/utils/codeTiming.py index c01b21435..12d22c2a8 100644 --- a/armi/utils/codeTiming.py +++ b/armi/utils/codeTiming.py @@ -14,9 +14,9 @@ """Utilities related to profiling code.""" import copy +import functools import os import time -import functools def timed(*args): diff --git a/armi/utils/customExceptions.py b/armi/utils/customExceptions.py index 229b31ffa..b3d62e380 100644 --- a/armi/utils/customExceptions.py +++ b/armi/utils/customExceptions.py @@ -16,8 +16,9 @@ Globally accessible exception definitions for better granularity on exception behavior and exception handling behavior. """ +from inspect import getframeinfo, stack + from armi import runLog -from inspect import stack, getframeinfo def info(func): diff --git a/armi/utils/densityTools.py b/armi/utils/densityTools.py index 94b46a82d..59d15438f 100644 --- a/armi/utils/densityTools.py +++ b/armi/utils/densityTools.py @@ -13,11 +13,11 @@ # limitations under the License. """Assorted utilities to help with basic density calculations.""" -from typing import Tuple, List, Dict +from typing import Dict, List, Tuple -from armi.nucDirectory import nucDir, nuclideBases, elements -from armi.utils import units from armi import runLog +from armi.nucDirectory import elements, nucDir, nuclideBases +from armi.utils import units def getNDensFromMasses(rho, massFracs, normalize=False): diff --git a/armi/utils/directoryChangers.py b/armi/utils/directoryChangers.py index 50a5c0cbd..4d8ea5146 100644 --- a/armi/utils/directoryChangers.py +++ b/armi/utils/directoryChangers.py @@ -19,10 +19,8 @@ import shutil import string -from armi import context -from armi import runLog -from armi.utils import pathTools -from armi.utils import safeCopy, safeMove +from armi import context, runLog +from armi.utils import pathTools, safeCopy, safeMove def _changeDirectory(destination): diff --git a/armi/utils/flags.py b/armi/utils/flags.py index f0b83c271..51fe1d726 100644 --- a/armi/utils/flags.py +++ b/armi/utils/flags.py @@ -25,8 +25,7 @@ provides most of the safety and functionality. """ import math - -from typing import Dict, Union, Sequence, List, Tuple +from typing import Dict, List, Sequence, Tuple, Union class auto: # noqa: N801 diff --git a/armi/utils/gridEditor.py b/armi/utils/gridEditor.py index 025afa386..9513b7699 100644 --- a/armi/utils/gridEditor.py +++ b/armi/utils/gridEditor.py @@ -63,21 +63,18 @@ import sys from typing import Dict, Optional, Sequence, Tuple, Union -import wx -import wx.adv import numpy as np import numpy.linalg +import wx +import wx.adv -from armi.utils import hexagon -from armi.utils import textProcessors -from armi.settings.caseSettings import Settings -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor.flags import Flags +from armi.reactor import geometry, grids from armi.reactor.blueprints import Blueprints, gridBlueprint, migrate -from armi.reactor.blueprints.gridBlueprint import GridBlueprint, saveToStream from armi.reactor.blueprints.assemblyBlueprint import AssemblyBlueprint - +from armi.reactor.blueprints.gridBlueprint import GridBlueprint, saveToStream +from armi.reactor.flags import Flags +from armi.settings.caseSettings import Settings +from armi.utils import hexagon, textProcessors UNIT_SIZE = 50 # pixels per assembly UNIT_MARGIN = 40 # offset applied to the draw area margins diff --git a/armi/utils/iterables.py b/armi/utils/iterables.py index 70fafc0a2..8169f81f9 100644 --- a/armi/utils/iterables.py +++ b/armi/utils/iterables.py @@ -13,8 +13,8 @@ # limitations under the License. """Module of utilities to help dealing with iterable objects in Python.""" -from itertools import chain, filterfalse, tee import struct +from itertools import chain, filterfalse, tee import numpy as np diff --git a/armi/utils/parsing.py b/armi/utils/parsing.py index 3bd379688..e8a716230 100644 --- a/armi/utils/parsing.py +++ b/armi/utils/parsing.py @@ -16,6 +16,7 @@ import ast import copy + from dateutil import parser diff --git a/armi/utils/plotting.py b/armi/utils/plotting.py index 5e99c48a4..5584bc489 100644 --- a/armi/utils/plotting.py +++ b/armi/utils/plotting.py @@ -29,26 +29,25 @@ import os import re -from matplotlib.collections import PatchCollection -from matplotlib.widgets import Slider -from mpl_toolkits import axes_grid1 -from ordered_set import OrderedSet import matplotlib.colors as mcolors import matplotlib.patches import matplotlib.pyplot as plt import matplotlib.text as mpl_text import numpy as np +from matplotlib.collections import PatchCollection +from matplotlib.widgets import Slider +from mpl_toolkits import axes_grid1 +from ordered_set import OrderedSet from armi import runLog from armi.bookkeeping import report from armi.materials import custom from armi.reactor import grids -from armi.reactor.components import Helix, Circle, DerivedShape +from armi.reactor.components import Circle, DerivedShape, Helix from armi.reactor.components.basicShapes import Hexagon, Rectangle, Square from armi.reactor.flags import Flags from armi.utils import hexagon - LUMINANCE_WEIGHTS = np.array([0.3, 0.59, 0.11, 0.0]) diff --git a/armi/utils/reportPlotting.py b/armi/utils/reportPlotting.py index 936bbec1d..c9e79a88f 100644 --- a/armi/utils/reportPlotting.py +++ b/armi/utils/reportPlotting.py @@ -28,16 +28,15 @@ import math import os -from matplotlib import colormaps -from matplotlib import colors as mpltcolors import matplotlib.path import matplotlib.projections.polar import matplotlib.pyplot as plt import matplotlib.spines import numpy as np +from matplotlib import colormaps +from matplotlib import colors as mpltcolors -from armi import runLog -from armi import settings +from armi import runLog, settings from armi.bookkeeping import report from armi.physics.neutronics import crossSectionGroupManager from armi.reactor.flags import Flags diff --git a/armi/utils/tabulate.py b/armi/utils/tabulate.py index 2f78c3ac8..2c0dee34d 100644 --- a/armi/utils/tabulate.py +++ b/armi/utils/tabulate.py @@ -210,14 +210,14 @@ Header column width can be specified in a similar way using `maxheadercolwidth`. """ +import dataclasses +import math +import re from collections import namedtuple from collections.abc import Iterable, Sized -from functools import reduce, partial +from functools import partial, reduce from itertools import chain, zip_longest from textwrap import TextWrapper -import dataclasses -import math -import re from armi import runLog diff --git a/armi/utils/tests/test_asciimaps.py b/armi/utils/tests/test_asciimaps.py index b154b1b50..48711ecf3 100644 --- a/armi/utils/tests/test_asciimaps.py +++ b/armi/utils/tests/test_asciimaps.py @@ -17,7 +17,6 @@ from armi.utils import asciimaps - CARTESIAN_MAP = """2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 diff --git a/armi/utils/tests/test_custom_exceptions.py b/armi/utils/tests/test_custom_exceptions.py index 7060307a3..e8729dd4d 100644 --- a/armi/utils/tests/test_custom_exceptions.py +++ b/armi/utils/tests/test_custom_exceptions.py @@ -15,8 +15,7 @@ import unittest from armi.tests import mockRunLogs -from armi.utils.customExceptions import info, important -from armi.utils.customExceptions import warn, warn_when_root +from armi.utils.customExceptions import important, info, warn, warn_when_root class CustomExceptionTests(unittest.TestCase): diff --git a/armi/utils/tests/test_directoryChangers.py b/armi/utils/tests/test_directoryChangers.py index 30aec94fc..3b95b000e 100644 --- a/armi/utils/tests/test_directoryChangers.py +++ b/armi/utils/tests/test_directoryChangers.py @@ -13,13 +13,12 @@ # limitations under the License. """Module for testing directoryChangers.""" -from pathlib import Path import os import shutil import unittest +from pathlib import Path -from armi.utils import directoryChangers -from armi.utils import directoryChangersMpi +from armi.utils import directoryChangers, directoryChangersMpi class ExpectedException(Exception): diff --git a/armi/utils/tests/test_mathematics.py b/armi/utils/tests/test_mathematics.py index b7554b07a..2a38d4274 100644 --- a/armi/utils/tests/test_mathematics.py +++ b/armi/utils/tests/test_mathematics.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. """Testing mathematics utilities.""" -from math import sqrt import unittest +from math import sqrt import numpy as np diff --git a/armi/utils/tests/test_outputCache.py b/armi/utils/tests/test_outputCache.py index b8052ac58..fbc9a1545 100644 --- a/armi/utils/tests/test_outputCache.py +++ b/armi/utils/tests/test_outputCache.py @@ -16,8 +16,7 @@ import time import unittest -from armi.utils import directoryChangers -from armi.utils import outputCache +from armi.utils import directoryChangers, outputCache class TestOutputCache(unittest.TestCase): diff --git a/armi/utils/tests/test_plotting.py b/armi/utils/tests/test_plotting.py index bc28b5991..318e52447 100644 --- a/armi/utils/tests/test_plotting.py +++ b/armi/utils/tests/test_plotting.py @@ -20,8 +20,7 @@ from armi import settings from armi.nuclearDataIO.cccc import isotxs -from armi.reactor import blueprints -from armi.reactor import reactors +from armi.reactor import blueprints, reactors from armi.reactor.flags import Flags from armi.reactor.tests import test_reactors from armi.tests import ISOAA_PATH, TEST_ROOT diff --git a/armi/utils/tests/test_tabulate.py b/armi/utils/tests/test_tabulate.py index 1876cd250..06a27ec1b 100644 --- a/armi/utils/tests/test_tabulate.py +++ b/armi/utils/tests/test_tabulate.py @@ -19,32 +19,31 @@ https://github.com/astanin/python-tabulate """ -from collections import defaultdict -from collections import namedtuple -from collections import OrderedDict -from collections import UserDict +import unittest +from collections import OrderedDict, UserDict, defaultdict, namedtuple from dataclasses import dataclass from datetime import datetime -import unittest import numpy as np -from armi.utils.tabulate import _alignCellVeritically -from armi.utils.tabulate import _alignColumn -from armi.utils.tabulate import _bool -from armi.utils.tabulate import _buildLine -from armi.utils.tabulate import _buildRow -from armi.utils.tabulate import _format -from armi.utils.tabulate import _isMultiline -from armi.utils.tabulate import _multilineWidth -from armi.utils.tabulate import _normalizeTabularData -from armi.utils.tabulate import _tableFormats -from armi.utils.tabulate import _type -from armi.utils.tabulate import _visibleWidth -from armi.utils.tabulate import _wrapTextToColWidths -from armi.utils.tabulate import SEPARATING_LINE -from armi.utils.tabulate import tabulate -from armi.utils.tabulate import tabulateFormats +from armi.utils.tabulate import ( + SEPARATING_LINE, + _alignCellVeritically, + _alignColumn, + _bool, + _buildLine, + _buildRow, + _format, + _isMultiline, + _multilineWidth, + _normalizeTabularData, + _tableFormats, + _type, + _visibleWidth, + _wrapTextToColWidths, + tabulate, + tabulateFormats, +) class TestTabulateAPI(unittest.TestCase): @@ -543,9 +542,11 @@ def test_alignCellVeriticallyBottomMultiTextMultiplePad(self): def test_assortedRareEdgeCases(self): """Test some of the more rare edge cases in the purely internal functions.""" - from armi.utils.tabulate import _alignHeader - from armi.utils.tabulate import _prependRowIndex - from armi.utils.tabulate import _removeSeparatingLines + from armi.utils.tabulate import ( + _alignHeader, + _prependRowIndex, + _removeSeparatingLines, + ) self.assertEqual(_alignHeader("123", False, 3, 3, False, None), "123") diff --git a/armi/utils/tests/test_textProcessors.py b/armi/utils/tests/test_textProcessors.py index 1d15afcc6..141ebe58f 100644 --- a/armi/utils/tests/test_textProcessors.py +++ b/armi/utils/tests/test_textProcessors.py @@ -12,16 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. """Tests for functions in textProcessors.py.""" -from io import StringIO import logging import os import pathlib -import ruamel import unittest +from io import StringIO + +import ruamel from armi import runLog -from armi.tests import mockRunLogs -from armi.tests import TEST_ROOT +from armi.tests import TEST_ROOT, mockRunLogs from armi.utils import textProcessors from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/utils/tests/test_triangle.py b/armi/utils/tests/test_triangle.py index 428f0eae2..cbf57bac1 100644 --- a/armi/utils/tests/test_triangle.py +++ b/armi/utils/tests/test_triangle.py @@ -13,6 +13,7 @@ # limitations under the License. """Test the basic triangle math.""" import unittest + from armi.utils import triangle diff --git a/armi/utils/tests/test_utils.py b/armi/utils/tests/test_utils.py index 867362754..c7982dfd5 100644 --- a/armi/utils/tests/test_utils.py +++ b/armi/utils/tests/test_utils.py @@ -13,9 +13,9 @@ # limitations under the License. """Testing some utility functions.""" -from collections import defaultdict import os import unittest +from collections import defaultdict import numpy as np diff --git a/armi/utils/textProcessors.py b/armi/utils/textProcessors.py index db9868316..e62bf411f 100644 --- a/armi/utils/textProcessors.py +++ b/armi/utils/textProcessors.py @@ -14,13 +14,12 @@ """Utility classes and functions for manipulating text files.""" import io import os -import re import pathlib -from typing import List, Tuple, Union, Optional, TextIO +import re +from typing import List, Optional, TextIO, Tuple, Union from armi import runLog - _INCLUDE_CTOR = False _INCLUDE_RE = re.compile(r"^([^#]*\s+)?!include\s+(.*)\n?$") _INDENT_RE = re.compile(r"^[\s\-\?:]*([^\s\-\?:].*)?$") diff --git a/armi/utils/units.py b/armi/utils/units.py index defa61110..a95061bd8 100644 --- a/armi/utils/units.py +++ b/armi/utils/units.py @@ -16,7 +16,6 @@ import scipy.constants - # Units (misc) DPA = "dpa" FIMA = "FIMA" diff --git a/doc/conf.py b/doc/conf.py index 1dc187fa4..987455cfd 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -35,10 +35,10 @@ import sys import warnings +import sphinx_rtd_theme from docutils import nodes, statemachine from docutils.parsers.rst import Directive, directives from sphinx.domains.python import PythonDomain -import sphinx_rtd_theme # handle python import locations for this execution PYTHONPATH = os.path.abspath("..") @@ -48,11 +48,8 @@ # Add dochelpers.py from doc/.static/ directory sys.path.insert(0, ".static") -from armi import apps +from armi import apps, context, disableFutureConfigures, meta from armi import configure as armi_configure -from armi import context -from armi import disableFutureConfigures -from armi import meta from armi.bookkeeping import tests as bookkeepingTests from armi.utils import safeCopy diff --git a/doc/gallery-src/framework/run_chartOfNuclides.py b/doc/gallery-src/framework/run_chartOfNuclides.py index 13fcfe3ad..f0818d7e4 100644 --- a/doc/gallery-src/framework/run_chartOfNuclides.py +++ b/doc/gallery-src/framework/run_chartOfNuclides.py @@ -25,8 +25,8 @@ """ import matplotlib.pyplot as plt -from armi.nucDirectory import nuclideBases from armi import configure +from armi.nucDirectory import nuclideBases configure(permissive=True) diff --git a/doc/gallery-src/framework/run_computeReactionRates.py b/doc/gallery-src/framework/run_computeReactionRates.py index 1c73f7e37..1a7c2d52b 100644 --- a/doc/gallery-src/framework/run_computeReactionRates.py +++ b/doc/gallery-src/framework/run_computeReactionRates.py @@ -26,19 +26,10 @@ import numpy as np from armi import configure, nuclideBases, settings -from armi.materials import ht9 -from armi.materials import sodium -from armi.materials import uZr +from armi.materials import ht9, sodium, uZr from armi.nuclearDataIO.cccc import isotxs -from armi.reactor import assemblies -from armi.reactor import blocks -from armi.reactor import blueprints -from armi.reactor import geometry -from armi.reactor import grids -from armi.reactor import reactors -from armi.reactor.components import Circle -from armi.reactor.components import DerivedShape -from armi.reactor.components import Hexagon +from armi.reactor import assemblies, blocks, blueprints, geometry, grids, reactors +from armi.reactor.components import Circle, DerivedShape, Hexagon from armi.reactor.flags import Flags from armi.tests import ISOAA_PATH diff --git a/doc/gallery-src/framework/run_fuelManagement.py b/doc/gallery-src/framework/run_fuelManagement.py index d355bbaf0..a55adcab2 100644 --- a/doc/gallery-src/framework/run_fuelManagement.py +++ b/doc/gallery-src/framework/run_fuelManagement.py @@ -30,7 +30,6 @@ # sphinx_gallery_thumbnail_number = 2 import math - from armi import configure from armi.physics.fuelCycle import fuelHandlers from armi.reactor.flags import Flags diff --git a/doc/gallery-src/framework/run_grids1_hex.py b/doc/gallery-src/framework/run_grids1_hex.py index 7d39ca1f0..c822a91a3 100644 --- a/doc/gallery-src/framework/run_grids1_hex.py +++ b/doc/gallery-src/framework/run_grids1_hex.py @@ -22,12 +22,12 @@ """ import math -import matplotlib.pyplot as plt import matplotlib.patches as mpatches +import matplotlib.pyplot as plt from matplotlib.collections import PatchCollection -from armi.reactor import grids from armi import configure +from armi.reactor import grids configure(permissive=True) diff --git a/doc/gallery-src/framework/run_isotxs.py b/doc/gallery-src/framework/run_isotxs.py index b0dbc50fa..095864039 100644 --- a/doc/gallery-src/framework/run_isotxs.py +++ b/doc/gallery-src/framework/run_isotxs.py @@ -20,10 +20,10 @@ """ import matplotlib.pyplot as plt +from armi import configure +from armi.nuclearDataIO.cccc import isotxs from armi.physics.neutronics import energyGroups from armi.tests import ISOAA_PATH -from armi.nuclearDataIO.cccc import isotxs -from armi import configure configure(permissive=True) diff --git a/doc/gallery-src/framework/run_materials.py b/doc/gallery-src/framework/run_materials.py index bb78d4e8d..ab469f1ae 100644 --- a/doc/gallery-src/framework/run_materials.py +++ b/doc/gallery-src/framework/run_materials.py @@ -22,8 +22,8 @@ More info about the materials here: :py:mod:`armi.materials`. """ -import numpy as np import matplotlib.pyplot as plt +import numpy as np from armi import configure, materials from armi.nucDirectory import nuclideBases diff --git a/doc/gallery-src/framework/run_programmaticReactorDefinition.py b/doc/gallery-src/framework/run_programmaticReactorDefinition.py index e270afeb7..b9c2dce05 100644 --- a/doc/gallery-src/framework/run_programmaticReactorDefinition.py +++ b/doc/gallery-src/framework/run_programmaticReactorDefinition.py @@ -37,12 +37,14 @@ from armi import cases from armi.reactor import blueprints -from armi.reactor.blueprints import assemblyBlueprint -from armi.reactor.blueprints import blockBlueprint -from armi.reactor.blueprints import componentBlueprint -from armi.reactor.blueprints import gridBlueprint -from armi.reactor.blueprints import isotopicOptions -from armi.reactor.blueprints import reactorBlueprint +from armi.reactor.blueprints import ( + assemblyBlueprint, + blockBlueprint, + componentBlueprint, + gridBlueprint, + isotopicOptions, + reactorBlueprint, +) from armi.settings import caseSettings from armi.utils import plotting diff --git a/doc/gallery-src/framework/run_reactorFacemap.py b/doc/gallery-src/framework/run_reactorFacemap.py index 457aa3f5f..fd29de066 100644 --- a/doc/gallery-src/framework/run_reactorFacemap.py +++ b/doc/gallery-src/framework/run_reactorFacemap.py @@ -18,9 +18,9 @@ Load a test reactor from the test suite and plot a dummy power distribution from it. You can plot any block parameter. """ +from armi import configure from armi.reactor.tests import test_reactors from armi.utils import plotting -from armi import configure # configure ARMI configure(permissive=True) diff --git a/doc/gallery-src/framework/run_transmutationMatrix.py b/doc/gallery-src/framework/run_transmutationMatrix.py index 2546c65f1..82e5a2289 100644 --- a/doc/gallery-src/framework/run_transmutationMatrix.py +++ b/doc/gallery-src/framework/run_transmutationMatrix.py @@ -29,12 +29,12 @@ A Bateman equation/matrix exponential solver is required to actually *solve* transmutation and decay problems, which can be provided via a plugin. """ -import os import math +import os import matplotlib.patches as mpatch -from matplotlib.collections import PatchCollection import matplotlib.pyplot as plt +from matplotlib.collections import PatchCollection from armi.context import RES from armi.nucDirectory import nuclideBases diff --git a/pyproject.toml b/pyproject.toml index 330094aa1..affae444d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -167,11 +167,12 @@ exclude = [ [tool.ruff.lint] # Enable pycodestyle (E) and Pyflakes (F) codes by default. # D - NumPy docstring rules +# I - Sorting imports # N801 - Class name should use CapWords convention # SIM - code simplification rules # TID - tidy imports # TODO: We want to support PLW0603 - don't use the global keyword -select = ["E", "F", "D", "N801", "SIM", "TID"] +select = ["D", "E", "F", "I", "N801", "SIM", "TID"] # Ruff rules we ignore (for now) because they are not 100% automatable # From 66551d5ffbdf835d68daef216e7d2c5d5817caa5 Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Sun, 29 Dec 2024 09:33:15 -0800 Subject: [PATCH 04/13] Starting the armi.testing modules (#2028) --- armi/bookkeeping/db/tests/test_database3.py | 2 +- .../db/tests/test_databaseInterface.py | 2 +- armi/bookkeeping/report/tests/test_report.py | 2 +- armi/cli/tests/test_runEntryPoint.py | 2 +- armi/context.py | 7 +- .../tests/test_latticeWriter.py | 2 +- .../tests/test_crossSectionTable.py | 2 +- .../tests/test_macroXSGenerationInterface.py | 2 +- .../tests/test_paramSweepConverters.py | 2 +- .../tests/test_axialExpansionChanger.py | 2 +- .../converters/tests/test_blockConverter.py | 2 +- .../tests/test_geometryConverters.py | 2 +- .../converters/tests/test_meshConverters.py | 2 +- .../converters/tests/test_uniformMesh.py | 2 +- armi/reactor/tests/test_blocks.py | 4 +- armi/reactor/tests/test_components.py | 2 +- armi/reactor/tests/test_composites.py | 2 +- armi/reactor/tests/test_parameters.py | 2 +- armi/reactor/tests/test_reactors.py | 98 +-------------- armi/testing/__init__.py | 117 ++++++++++++++++++ armi/tests/test_plugins.py | 3 +- armi/utils/tests/test_utils.py | 2 +- doc/release/0.5.rst | 4 +- 23 files changed, 147 insertions(+), 120 deletions(-) create mode 100644 armi/testing/__init__.py diff --git a/armi/bookkeeping/db/tests/test_database3.py b/armi/bookkeeping/db/tests/test_database3.py index c4e769ea9..91246ac57 100644 --- a/armi/bookkeeping/db/tests/test_database3.py +++ b/armi/bookkeeping/db/tests/test_database3.py @@ -29,8 +29,8 @@ from armi.reactor.excoreStructure import ExcoreCollection, ExcoreStructure from armi.reactor.reactors import Core, Reactor from armi.reactor.spentFuelPool import SpentFuelPool -from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings from armi.settings.fwSettings.globalSettings import CONF_SORT_REACTOR +from armi.testing import loadTestReactor, reduceTestReactorRings from armi.tests import TEST_ROOT, mockRunLogs from armi.utils import getPreviousTimeNode, safeCopy from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/bookkeeping/db/tests/test_databaseInterface.py b/armi/bookkeeping/db/tests/test_databaseInterface.py index e5d066553..a4c12ded4 100644 --- a/armi/bookkeeping/db/tests/test_databaseInterface.py +++ b/armi/bookkeeping/db/tests/test_databaseInterface.py @@ -29,7 +29,7 @@ from armi.physics.neutronics.settings import CONF_LOADING_FILE from armi.reactor import grids from armi.reactor.flags import Flags -from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings +from armi.testing import loadTestReactor, reduceTestReactorRings from armi.tests import TEST_ROOT from armi.utils import directoryChangers diff --git a/armi/bookkeeping/report/tests/test_report.py b/armi/bookkeeping/report/tests/test_report.py index 24e0ac9b8..b395781d6 100644 --- a/armi/bookkeeping/report/tests/test_report.py +++ b/armi/bookkeeping/report/tests/test_report.py @@ -40,7 +40,7 @@ writeCycleSummary, writeWelcomeHeaders, ) -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor from armi.tests import mockRunLogs from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/cli/tests/test_runEntryPoint.py b/armi/cli/tests/test_runEntryPoint.py index 97fcacb3e..2094f6222 100644 --- a/armi/cli/tests/test_runEntryPoint.py +++ b/armi/cli/tests/test_runEntryPoint.py @@ -34,7 +34,7 @@ from armi.cli.run import RunEntryPoint from armi.cli.runSuite import RunSuiteCommand from armi.physics.neutronics.diffIsotxs import CompareIsotxsLibraries -from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings +from armi.testing import loadTestReactor, reduceTestReactorRings from armi.tests import ARMI_RUN_PATH, TEST_ROOT, mockRunLogs from armi.utils.directoryChangers import TemporaryDirectoryChanger from armi.utils.dynamicImporter import getEntireFamilyTree diff --git a/armi/context.py b/armi/context.py index 76b9e5c02..8436ceae5 100644 --- a/armi/context.py +++ b/armi/context.py @@ -97,12 +97,7 @@ def setMode(cls, mode): try: - # Check for MPI. The mpi4py module uses cPickle to serialize python objects in preparation for - # network transmission. Sometimes, when cPickle fails, it gives very cryptic error messages that - # do not help much. If you uncomment th following line, you can trick mpi4py into using the - # pure-python pickle module in place of cPickle and now you will generally get much more - # meaningful and useful error messages Then comment it back out because it's slow. - # import sys, pickle; sys.modules['cPickle'] = pickle + # Check for MPI from mpi4py import MPI MPI_COMM = MPI.COMM_WORLD diff --git a/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py b/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py index 90c96accf..89f1b1225 100644 --- a/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py +++ b/armi/physics/neutronics/latticePhysics/tests/test_latticeWriter.py @@ -30,7 +30,7 @@ CONF_DISABLE_BLOCK_TYPE_EXCLUSION_IN_XS_GENERATION, CONF_XS_BLOCK_REPRESENTATION, ) -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor from armi.tests import TEST_ROOT diff --git a/armi/physics/neutronics/tests/test_crossSectionTable.py b/armi/physics/neutronics/tests/test_crossSectionTable.py index c0f23f7d0..a961be50e 100644 --- a/armi/physics/neutronics/tests/test_crossSectionTable.py +++ b/armi/physics/neutronics/tests/test_crossSectionTable.py @@ -23,8 +23,8 @@ ) from armi.physics.neutronics.latticePhysics import ORDER from armi.reactor.tests.test_blocks import loadTestBlock -from armi.reactor.tests.test_reactors import loadTestReactor from armi.settings import Settings +from armi.testing import loadTestReactor from armi.tests import ISOAA_PATH diff --git a/armi/physics/neutronics/tests/test_macroXSGenerationInterface.py b/armi/physics/neutronics/tests/test_macroXSGenerationInterface.py index 6131c17a8..2b202fdcd 100644 --- a/armi/physics/neutronics/tests/test_macroXSGenerationInterface.py +++ b/armi/physics/neutronics/tests/test_macroXSGenerationInterface.py @@ -20,8 +20,8 @@ from armi.physics.neutronics.macroXSGenerationInterface import ( MacroXSGenerationInterface, ) -from armi.reactor.tests.test_reactors import loadTestReactor from armi.settings import Settings +from armi.testing import loadTestReactor from armi.tests import ISOAA_PATH diff --git a/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py b/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py index 81f87fa96..af7d0dd6f 100644 --- a/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py +++ b/armi/reactor/converters/parameterSweeps/tests/test_paramSweepConverters.py @@ -22,7 +22,7 @@ ParameterSweepConverter, SettingsModifier, ) -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor from armi.tests import TEST_ROOT THIS_DIR = os.path.dirname(__file__) diff --git a/armi/reactor/converters/tests/test_axialExpansionChanger.py b/armi/reactor/converters/tests/test_axialExpansionChanger.py index a8a4708b9..49bb32bb4 100644 --- a/armi/reactor/converters/tests/test_axialExpansionChanger.py +++ b/armi/reactor/converters/tests/test_axialExpansionChanger.py @@ -40,7 +40,7 @@ areAxiallyLinked, ) from armi.reactor.flags import Flags -from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings +from armi.testing import loadTestReactor, reduceTestReactorRings from armi.tests import TEST_ROOT from armi.utils import units diff --git a/armi/reactor/converters/tests/test_blockConverter.py b/armi/reactor/converters/tests/test_blockConverter.py index e32056345..702b8eb38 100644 --- a/armi/reactor/converters/tests/test_blockConverter.py +++ b/armi/reactor/converters/tests/test_blockConverter.py @@ -26,7 +26,7 @@ from armi.reactor.converters import blockConverters from armi.reactor.flags import Flags from armi.reactor.tests.test_blocks import loadTestBlock -from armi.reactor.tests.test_reactors import TEST_ROOT, loadTestReactor +from armi.testing import TEST_ROOT, loadTestReactor from armi.utils import hexagon from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/reactor/converters/tests/test_geometryConverters.py b/armi/reactor/converters/tests/test_geometryConverters.py index 0461e5979..5746a18bb 100644 --- a/armi/reactor/converters/tests/test_geometryConverters.py +++ b/armi/reactor/converters/tests/test_geometryConverters.py @@ -23,7 +23,7 @@ from armi.reactor import blocks, geometry, grids from armi.reactor.converters import geometryConverters, uniformMesh from armi.reactor.flags import Flags -from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings +from armi.testing import loadTestReactor, reduceTestReactorRings from armi.tests import TEST_ROOT, mockRunLogs from armi.utils import directoryChangers diff --git a/armi/reactor/converters/tests/test_meshConverters.py b/armi/reactor/converters/tests/test_meshConverters.py index 348e5d270..14f102139 100644 --- a/armi/reactor/converters/tests/test_meshConverters.py +++ b/armi/reactor/converters/tests/test_meshConverters.py @@ -17,7 +17,7 @@ import unittest from armi.reactor.converters import geometryConverters, meshConverters -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor from armi.tests import TEST_ROOT diff --git a/armi/reactor/converters/tests/test_uniformMesh.py b/armi/reactor/converters/tests/test_uniformMesh.py index 063883e6a..d5d386f56 100644 --- a/armi/reactor/converters/tests/test_uniformMesh.py +++ b/armi/reactor/converters/tests/test_uniformMesh.py @@ -23,8 +23,8 @@ from armi.reactor.converters import uniformMesh from armi.reactor.flags import Flags from armi.reactor.tests import test_assemblies, test_blocks -from armi.reactor.tests.test_reactors import loadTestReactor, reduceTestReactorRings from armi.settings.fwSettings.globalSettings import CONF_UNIFORM_MESH_MINIMUM_SIZE +from armi.testing import loadTestReactor, reduceTestReactorRings from armi.tests import ISOAA_PATH, TEST_ROOT diff --git a/armi/reactor/tests/test_blocks.py b/armi/reactor/tests/test_blocks.py index 80ff304ec..aa6c914d4 100644 --- a/armi/reactor/tests/test_blocks.py +++ b/armi/reactor/tests/test_blocks.py @@ -37,8 +37,8 @@ from armi.reactor.components import basicShapes, complexShapes from armi.reactor.flags import Flags from armi.reactor.tests.test_assemblies import makeTestAssembly -from armi.reactor.tests.test_reactors import TEST_ROOT, loadTestReactor -from armi.tests import ISOAA_PATH +from armi.testing import loadTestReactor +from armi.tests import ISOAA_PATH, TEST_ROOT from armi.utils import densityTools, hexagon, units from armi.utils.directoryChangers import TemporaryDirectoryChanger from armi.utils.units import ( diff --git a/armi/reactor/tests/test_components.py b/armi/reactor/tests/test_components.py index eed58904c..ad32245e4 100644 --- a/armi/reactor/tests/test_components.py +++ b/armi/reactor/tests/test_components.py @@ -48,7 +48,7 @@ UnshapedVolumetricComponent, materials, ) -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor class TestComponentFactory(unittest.TestCase): diff --git a/armi/reactor/tests/test_composites.py b/armi/reactor/tests/test_composites.py index b9cfd9093..861faa80c 100644 --- a/armi/reactor/tests/test_composites.py +++ b/armi/reactor/tests/test_composites.py @@ -28,7 +28,7 @@ from armi.reactor.composites import getReactionRateDict from armi.reactor.flags import Flags, TypeSpec from armi.reactor.tests.test_blocks import loadTestBlock -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor from armi.tests import ISOAA_PATH, mockRunLogs diff --git a/armi/reactor/tests/test_parameters.py b/armi/reactor/tests/test_parameters.py index 38631b904..9f1a5e018 100644 --- a/armi/reactor/tests/test_parameters.py +++ b/armi/reactor/tests/test_parameters.py @@ -20,7 +20,7 @@ from armi.reactor import parameters from armi.reactor.reactorParameters import makeParametersReadOnly -from armi.reactor.tests.test_reactors import loadTestReactor +from armi.testing import loadTestReactor from armi.tests import TEST_ROOT from armi.utils.directoryChangers import TemporaryDirectoryChanger diff --git a/armi/reactor/tests/test_reactors.py b/armi/reactor/tests/test_reactors.py index 70ddf96ca..561c55247 100644 --- a/armi/reactor/tests/test_reactors.py +++ b/armi/reactor/tests/test_reactors.py @@ -36,11 +36,11 @@ CONF_ASSEM_FLAGS_SKIP_AXIAL_EXP, CONF_SORT_REACTOR, ) -from armi.tests import ARMI_RUN_PATH, TEST_ROOT, mockRunLogs +from armi.testing import loadTestReactor, reduceTestReactorRings # noqa: F401 +from armi.tests import TEST_ROOT, mockRunLogs from armi.utils import directoryChangers -THIS_DIR = os.path.dirname(__file__) -TEST_REACTOR = None # pickled string of test reactor (for fast caching) +_THIS_DIR = os.path.dirname(__file__) def buildOperatorOfEmptyHexBlocks(customSettings=None): @@ -125,95 +125,6 @@ def buildOperatorOfEmptyCartesianBlocks(customSettings=None): return o -""" -NOTE: If this reactor had 3 rings instead of 9, most unit tests that use it -go 4 times faster (based on testing). The problem is it would breat a LOT -of downstream tests that import this method. Probably still worth it though. -""" - - -def loadTestReactor( - inputFilePath=TEST_ROOT, - customSettings=None, - inputFileName="armiRun.yaml", -): - """ - Loads a test reactor. Can be used in other test modules. - - Parameters - ---------- - inputFilePath : str, default=TEST_ROOT - Path to the directory of the input file. - - customSettings : dict with str keys and values of any type, default=None - For each key in customSettings, the cs which is loaded from the - armiRun.yaml will be overwritten to the value given in customSettings - for that key. - - inputFileName : str, default="armiRun.yaml" - Name of the input file to run. - - Returns - ------- - o : Operator - r : Reactor - """ - global TEST_REACTOR - fName = os.path.join(inputFilePath, inputFileName) - customSettings = customSettings or {} - isPickeledReactor = fName == ARMI_RUN_PATH and customSettings == {} - - if isPickeledReactor and TEST_REACTOR: - # return test reactor only if no custom settings are needed. - o, r, assemNum = pickle.loads(TEST_REACTOR) - o.reattach(r, o.cs) - return o, r - - cs = settings.Settings(fName=fName) - - # Overwrite settings if desired - if customSettings: - cs = cs.modified(newSettings=customSettings) - - if "verbosity" not in customSettings: - runLog.setVerbosity("error") - - newSettings = {} - cs = cs.modified(newSettings=newSettings) - - o = operators.factory(cs) - r = reactors.loadFromCs(cs) - - o.initializeInterfaces(r) - - o.r.core.regenAssemblyLists() - - if isPickeledReactor: - # cache it for fast load for other future tests - # protocol=2 allows for classes with __slots__ but not __getstate__ to be pickled - TEST_REACTOR = pickle.dumps((o, o.r, o.r.p.maxAssemNum), protocol=2) - - return o, o.r - - -def reduceTestReactorRings(r, cs, maxNumRings): - """Helper method for the test reactor above. - - The goal is to reduce the size of the reactor for tests that don't neeed - such a large reactor, and would run much faster with a smaller one. - """ - maxRings = r.core.getNumRings() - if maxNumRings > maxRings: - runLog.info("The test reactor has a maximum of {} rings.".format(maxRings)) - return - elif maxNumRings <= 1: - raise ValueError("The test reactor must have multiple rings.") - - # reducing the size of the test reactor, by removing the outer rings - for ring in range(maxRings, maxNumRings, -1): - r.core.removeAssembliesInRing(ring, cs) - - class ReactorTests(unittest.TestCase): @classmethod def setUpClass(cls): @@ -862,7 +773,8 @@ class MockLib: for b in self.r.core.getBlocks(): b.p.mgFlux = range(5) b.p.adjMgFlux = range(5) - with directoryChangers.TemporaryDirectoryChanger(root=THIS_DIR): + + with directoryChangers.TemporaryDirectoryChanger(root=_THIS_DIR): self.r.core.saveAllFlux() def test_getFluxVector(self): diff --git a/armi/testing/__init__.py b/armi/testing/__init__.py new file mode 100644 index 000000000..994db60d9 --- /dev/null +++ b/armi/testing/__init__.py @@ -0,0 +1,117 @@ +# Copyright 2024 TerraPower, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Importable testing utilities. + +This is a very limited set of ARMI testing tools, meant to be importable as part of the ARMI API. +The goal is to provide a small set of high quality tools to help downstream ARMI developers write +tests. + +Notes +----- +This will not be a catch-all for random unit test functions. Be very sparing here. +""" +import os +import pickle + +from armi import operators, runLog, settings +from armi.reactor import reactors +from armi.tests import ARMI_RUN_PATH, TEST_ROOT + +_THIS_DIR = os.path.dirname(__file__) +_TEST_REACTOR = None # pickled string of test reactor (for fast caching) + + +def loadTestReactor( + inputFilePath=TEST_ROOT, + customSettings=None, + inputFileName="armiRun.yaml", +): + """ + Loads a test reactor. Can be used in other test modules. + + Parameters + ---------- + inputFilePath : str, default=TEST_ROOT + Path to the directory of the input file. + + customSettings : dict with str keys and values of any type, default=None + For each key in customSettings, the cs which is loaded from the armiRun.yaml will be + overwritten to the value given in customSettings for that key. + + inputFileName : str, default="armiRun.yaml" + Name of the input file to run. + + Notes + ----- + If the armiRun.yaml test reactor 3 rings instead of 9, most unit tests that use it go 4 times + faster (based on testing). The problem is it would breat a LOT of downstream tests that import + this method. It is still worth it though. + + Returns + ------- + o : Operator + r : Reactor + """ + global _TEST_REACTOR + fName = os.path.join(inputFilePath, inputFileName) + customSettings = customSettings or {} + isPickeledReactor = fName == ARMI_RUN_PATH and customSettings == {} + + if isPickeledReactor and _TEST_REACTOR: + # return test reactor only if no custom settings are needed. + o, r, assemNum = pickle.loads(_TEST_REACTOR) + o.reattach(r, o.cs) + return o, r + + cs = settings.Settings(fName=fName) + + # Overwrite settings if desired + if customSettings: + cs = cs.modified(newSettings=customSettings) + + if "verbosity" not in customSettings: + runLog.setVerbosity("error") + + cs = cs.modified(newSettings={}) + o = operators.factory(cs) + r = reactors.loadFromCs(cs) + + o.initializeInterfaces(r) + o.r.core.regenAssemblyLists() + + if isPickeledReactor: + # cache it for fast load for other future tests protocol=2 allows for classes with __slots__ + # but not __getstate__ to be pickled + _TEST_REACTOR = pickle.dumps((o, o.r, o.r.p.maxAssemNum), protocol=2) + + return o, o.r + + +def reduceTestReactorRings(r, cs, maxNumRings): + """Helper method for the test reactor above. + + The goal is to reduce the size of the reactor for tests that don't neeed such a large reactor, + and would run much faster with a smaller one. + """ + maxRings = r.core.getNumRings() + if maxNumRings > maxRings: + runLog.info("The test reactor has a maximum of {} rings.".format(maxRings)) + return + elif maxNumRings <= 1: + raise ValueError("The test reactor must have multiple rings.") + + # reducing the size of the test reactor, by removing the outer rings + for ring in range(maxRings, maxNumRings, -1): + r.core.removeAssembliesInRing(ring, cs) diff --git a/armi/tests/test_plugins.py b/armi/tests/test_plugins.py index a8f6a6b68..7852ce653 100644 --- a/armi/tests/test_plugins.py +++ b/armi/tests/test_plugins.py @@ -33,7 +33,8 @@ from armi.reactor.blocks import Block from armi.reactor.converters.axialExpansionChanger import AxialExpansionChanger from armi.reactor.flags import Flags -from armi.reactor.tests.test_reactors import TEST_ROOT, loadTestReactor +from armi.testing import loadTestReactor +from armi.tests import TEST_ROOT class PluginFlags1(plugins.ArmiPlugin): diff --git a/armi/utils/tests/test_utils.py b/armi/utils/tests/test_utils.py index c7982dfd5..b514b5692 100644 --- a/armi/utils/tests/test_utils.py +++ b/armi/utils/tests/test_utils.py @@ -20,8 +20,8 @@ import numpy as np from armi import utils -from armi.reactor.tests.test_reactors import loadTestReactor from armi.settings.caseSettings import Settings +from armi.testing import loadTestReactor from armi.tests import mockRunLogs from armi.utils import ( codeTiming, diff --git a/doc/release/0.5.rst b/doc/release/0.5.rst index f730979d6..0e49b8e5a 100644 --- a/doc/release/0.5.rst +++ b/doc/release/0.5.rst @@ -4,11 +4,13 @@ ARMI v0.5 Release Notes ARMI v0.5.1 =========== -Release Date: TBD +Release Date: TBD (March-ish, 2025) New Features ------------ #. Move instead of copy files from TemporaryDirectoryChanger. (`PR#2022 `_) +#. Creating the ``armi.testing`` module, to share ARMI testing tools. (`PR#2028 `_) +#. TBD API Changes ----------- From ea73f1c9410df8eab3b6876d96ae029f26dd3d1f Mon Sep 17 00:00:00 2001 From: Nick Touran Date: Fri, 3 Jan 2025 08:20:20 -0800 Subject: [PATCH 05/13] Raising error in invalid xsTypeNum condition (#2042) --- armi/physics/neutronics/crossSectionGroupManager.py | 7 ++++++- armi/reactor/tests/test_assemblies.py | 8 ++++---- armi/utils/tests/test_reportPlotting.py | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/armi/physics/neutronics/crossSectionGroupManager.py b/armi/physics/neutronics/crossSectionGroupManager.py index 1dac6f13a..1eca9a382 100644 --- a/armi/physics/neutronics/crossSectionGroupManager.py +++ b/armi/physics/neutronics/crossSectionGroupManager.py @@ -95,7 +95,7 @@ def getXSTypeNumberFromLabel(xsTypeLabel: str) -> int: return int("".join(["{:02d}".format(ord(si)) for si in xsTypeLabel])) -def getXSTypeLabelFromNumber(xsTypeNumber: int) -> int: +def getXSTypeLabelFromNumber(xsTypeNumber: int) -> str: """ Convert a XSID label (e.g. 65) to an XS label (e.g. 'A'). @@ -107,6 +107,11 @@ def getXSTypeLabelFromNumber(xsTypeNumber: int) -> int: if xsTypeNumber > ord("Z"): # two digit. Parse return chr(int(str(xsTypeNumber)[:2])) + chr(int(str(xsTypeNumber)[2:])) + elif xsTypeNumber < ord("A"): + raise ValueError( + f"Cannot convert invalid xsTypeNumber `{xsTypeNumber}` to char. " + "The number must be >= 65 (corresponding to 'A')." + ) else: return chr(xsTypeNumber) except ValueError: diff --git a/armi/reactor/tests/test_assemblies.py b/armi/reactor/tests/test_assemblies.py index d32494725..ee2823bf6 100644 --- a/armi/reactor/tests/test_assemblies.py +++ b/armi/reactor/tests/test_assemblies.py @@ -219,7 +219,7 @@ def setUp(self): "residence": 4.0, "smearDensity": 0.6996721711791459, "timeToLimit": 2.7e5, - "xsTypeNum": 40, + "xsTypeNum": 65, "zbottom": 97.3521, "ztop": 111.80279999999999, } @@ -776,9 +776,9 @@ def test_calcTotalParam(self): # Set the 1st block to have higher params than the rest. self.blockParamsTemp = {} for key, val in self.blockParams.items(): - b.p[key] = self.blockParamsTemp[key] = ( - val * i - ) # Iterate with i in self.assemNum, so higher assemNums get the high values. + # Iterate with i in self.assemNum, so higher assemNums get the high values. + if key != "xsTypeNum": # must keep valid + b.p[key] = self.blockParamsTemp[key] = val * i b.setHeight(self.height) b.setType("fuel") diff --git a/armi/utils/tests/test_reportPlotting.py b/armi/utils/tests/test_reportPlotting.py index 5e0268bff..62aa283fd 100644 --- a/armi/utils/tests/test_reportPlotting.py +++ b/armi/utils/tests/test_reportPlotting.py @@ -118,8 +118,8 @@ def test_xsHistoryVsTime(self): class HistTester: def __init__(self): self.xsHistory = { - 1: [[0, 1], [0, 2], [0, 3]], - 2: [[0, 5], [0, 6], [0, 7]], + 65: [[0, 1], [0, 2], [0, 3]], + 66: [[0, 5], [0, 6], [0, 7]], } history = HistTester() From 1920ff0ecb146a050c1c2f0a199cf620834728b2 Mon Sep 17 00:00:00 2001 From: Arrielle Opotowsky Date: Fri, 3 Jan 2025 10:51:19 -0600 Subject: [PATCH 06/13] Unpinning the max `matplotlib` version (#2040) --- armi/bookkeeping/db/database.py | 11 ++++++----- armi/bookkeeping/db/databaseInterface.py | 5 ++++- armi/reactor/assemblies.py | 4 ++-- armi/reactor/components/__init__.py | 6 +++--- armi/utils/mathematics.py | 7 +++++-- armi/utils/tests/test_iterables.py | 7 ------- armi/utils/tests/test_tabulate.py | 6 +++--- armi/utils/tests/test_textProcessors.py | 2 +- pyproject.toml | 3 ++- 9 files changed, 26 insertions(+), 25 deletions(-) diff --git a/armi/bookkeeping/db/database.py b/armi/bookkeeping/db/database.py index 5a718cda8..672e905fd 100644 --- a/armi/bookkeeping/db/database.py +++ b/armi/bookkeeping/db/database.py @@ -1097,7 +1097,7 @@ def _readParams(h5group, compTypeName, comps, allowMissing=False): ) ) - if data.dtype.type is np.string_: + if data.dtype.type is np.bytes_: data = np.char.decode(data) if attrs.get("specialFormatting", False): @@ -1291,7 +1291,7 @@ def getHistoriesByLocation( ) raise - if data.dtype.type is np.string_: + if data.dtype.type is np.bytes_: data = np.char.decode(data) if dataSet.attrs.get("specialFormatting", False): @@ -1394,8 +1394,9 @@ def getHistories( # current time step and something has created the group to store aux data continue - cycle = h5TimeNodeGroup.attrs["cycle"] - timeNode = h5TimeNodeGroup.attrs["timeNode"] + # might save as int or np.int64, so forcing int keeps things predictable + cycle = int(h5TimeNodeGroup.attrs["cycle"]) + timeNode = int(h5TimeNodeGroup.attrs["timeNode"]) layout = Layout( (self.versionMajor, self.versionMinor), h5group=h5TimeNodeGroup ) @@ -1450,7 +1451,7 @@ def getHistories( ) raise - if data.dtype.type is np.string_: + if data.dtype.type is np.bytes_: data = np.char.decode(data) if dataSet.attrs.get("specialFormatting", False): diff --git a/armi/bookkeeping/db/databaseInterface.py b/armi/bookkeeping/db/databaseInterface.py index fd5ebbd2b..d5850ed35 100644 --- a/armi/bookkeeping/db/databaseInterface.py +++ b/armi/bookkeeping/db/databaseInterface.py @@ -390,7 +390,10 @@ def getHistory( if nowRequested: for param in params or history.keys(): if param == "location": - history[param][now] = tuple(comp.spatialLocator.indices) + # might save as int or np.int64, so forcing int keeps things predictable + history[param][now] = tuple( + int(i) for i in comp.spatialLocator.indices + ) else: history[param][now] = comp.p[param] diff --git a/armi/reactor/assemblies.py b/armi/reactor/assemblies.py index 149c04690..c36833513 100644 --- a/armi/reactor/assemblies.py +++ b/armi/reactor/assemblies.py @@ -1021,7 +1021,7 @@ def getBlocksBetweenElevations(self, zLower, zUpper): return blocksHere def getParamValuesAtZ( - self, param, elevations, interpType="linear", fillValue=np.NaN + self, param, elevations, interpType="linear", fillValue=np.nan ): """ Interpolates a param axially to find it at any value of elevation z. @@ -1070,7 +1070,7 @@ def getParamValuesAtZ( ) return interpolator(elevations) - def getParamOfZFunction(self, param, interpType="linear", fillValue=np.NaN): + def getParamOfZFunction(self, param, interpType="linear", fillValue=np.nan): """ Interpolates a param axially to find it at any value of elevation z. diff --git a/armi/reactor/components/__init__.py b/armi/reactor/components/__init__.py index 953d12d22..8b5a938a2 100644 --- a/armi/reactor/components/__init__.py +++ b/armi/reactor/components/__init__.py @@ -132,7 +132,7 @@ def __init__( material, Tinput, Thot, - area=np.NaN, + area=np.nan, modArea=None, isotopics=None, mergeWith=None, @@ -224,12 +224,12 @@ def __init__( material, Tinput, Thot, - area=np.NaN, + area=np.nan, op=None, isotopics=None, mergeWith=None, components=None, - volume=np.NaN, + volume=np.nan, ): Component.__init__( self, diff --git a/armi/utils/mathematics.py b/armi/utils/mathematics.py index 3169e92be..57ac4fe1e 100644 --- a/armi/utils/mathematics.py +++ b/armi/utils/mathematics.py @@ -411,7 +411,9 @@ def goalFunc(guess, func, positiveGuesses): tol=tol, options={"maxiter": maxIterations}, ) - ans = float(X["x"]) + + # X returns `[num]` instead of `num`, so we have to grab the first/only element in that list + ans = float(X["x"][0]) if positiveGuesses is True: ans = abs(ans) @@ -515,7 +517,8 @@ def parabolaFromPoints(p1, p2, p3): print("Error in parabola {} {}".format(A, b)) raise - return float(x[0]), float(x[1]), float(x[2]) + # x[#] returns `[num]` instead of `num`, so we have to grab the first/only element in that list + return float(x[0][0]), float(x[1][0]), float(x[2][0]) def parabolicInterpolation(ap, bp, cp, targetY): diff --git a/armi/utils/tests/test_iterables.py b/armi/utils/tests/test_iterables.py index f1ebcb8e0..fc233810a 100644 --- a/armi/utils/tests/test_iterables.py +++ b/armi/utils/tests/test_iterables.py @@ -13,7 +13,6 @@ # limitations under the License. """Unittests for iterables.py.""" -import time import unittest import numpy as np @@ -69,20 +68,14 @@ def test_split(self): self.assertEqual(unchu, data) def test_packingAndUnpackingBinaryStrings(self): - start = time.perf_counter() packed = iterables.packBinaryStrings(_TEST_DATA) unpacked = iterables.unpackBinaryStrings(packed["turtle"][0]) - timeDelta = time.perf_counter() - start self.assertEqual(_TEST_DATA["turtle"], unpacked) - return timeDelta def test_packingAndUnpackingHexStrings(self): - start = time.perf_counter() packed = iterables.packHexStrings(_TEST_DATA) unpacked = iterables.unpackHexStrings(packed["turtle"][0]) - timeDelta = time.perf_counter() - start self.assertEqual(_TEST_DATA["turtle"], unpacked) - return timeDelta def test_sequenceInit(self): # init an empty sequence diff --git a/armi/utils/tests/test_tabulate.py b/armi/utils/tests/test_tabulate.py index 06a27ec1b..140c28426 100644 --- a/armi/utils/tests/test_tabulate.py +++ b/armi/utils/tests/test_tabulate.py @@ -213,7 +213,7 @@ def test_numpyRecordArray(self): [("Alice", 23, 169.5), ("Bob", 27, 175.0)], dtype={ "names": ["name", "age", "height"], - "formats": ["a32", "uint8", "float32"], + "formats": ["S32", "uint8", "float32"], }, ) expected = "\n".join( @@ -233,7 +233,7 @@ def test_numpyRecordArrayKeys(self): [("Alice", 23, 169.5), ("Bob", 27, 175.0)], dtype={ "names": ["name", "age", "height"], - "formats": ["a32", "uint8", "float32"], + "formats": ["S32", "uint8", "float32"], }, ) expected = "\n".join( @@ -253,7 +253,7 @@ def test_numpyRecordArrayHeaders(self): [("Alice", 23, 169.5), ("Bob", 27, 175.0)], dtype={ "names": ["name", "age", "height"], - "formats": ["a32", "uint8", "float32"], + "formats": ["S32", "uint8", "float32"], }, ) expected = "\n".join( diff --git a/armi/utils/tests/test_textProcessors.py b/armi/utils/tests/test_textProcessors.py index 141ebe58f..16f5a11ef 100644 --- a/armi/utils/tests/test_textProcessors.py +++ b/armi/utils/tests/test_textProcessors.py @@ -145,7 +145,7 @@ def test_readFile(self): def test_readFileWithPattern(self): with textProcessors.SequentialReader(self._DUMMY_FILE_NAME) as sr: - self.assertTrue(sr.searchForPattern("(X\s+Y\s+\d+\.\d+)")) + self.assertTrue(sr.searchForPattern(r"(X\s+Y\s+\d+\.\d+)")) self.assertEqual(float(sr.line.split()[2]), 3.5) def test_issueWarningOnFindingText(self): diff --git a/pyproject.toml b/pyproject.toml index affae444d..0de69c1e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,8 @@ dependencies = [ "h5py>=3.0,<=3.9 ; python_version < '3.11.0'", "h5py>=3.9 ; python_version >= '3.11.0'", # Needed because our database files are H5 format "htmltree>=0.7.6", # Our reports have HTML output - "matplotlib>=3.5.3,<3.8.0", # Important plotting library + "matplotlib>=3.5.3,<3.8.0 ; python_version < '3.11.0'", + "matplotlib>=3.5.3 ; python_version >= '3.11.0'", # Important plotting library "numpy>=1.21", # Important math library "ordered-set>=3.1.1", # A useful data structure "pluggy>=1.2.0", # Central tool behind the ARMI Plugin system From 85053e36541b1f32256ecf70cab2adb2982d091a Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Thu, 9 Jan 2025 20:36:42 -0800 Subject: [PATCH 07/13] Cleaning up some casual docstrings (#2048) --- armi/apps.py | 9 --------- armi/mpiActions.py | 2 +- armi/nuclearDataIO/cccc/isotxs.py | 5 +++-- armi/physics/__init__.py | 9 --------- armi/physics/fuelCycle/fuelHandlers.py | 5 ++--- armi/utils/gridEditor.py | 3 +-- 6 files changed, 7 insertions(+), 26 deletions(-) diff --git a/armi/apps.py b/armi/apps.py index 7d6263868..cf39295a3 100644 --- a/armi/apps.py +++ b/armi/apps.py @@ -18,15 +18,6 @@ This module defines the :py:class:`App` class, which is used to configure the ARMI Framework for a specific application. An ``App`` implements a simple interface for customizing much of the Framework's behavior. - -Notes ------ -Historical Fun Fact - -This pattern is used by many frameworks as a way of encapsulating what would otherwise be global -state. The ARMI Framework has historically made heavy use of global state (e.g., -:py:mod:`armi.nucDirectory.nuclideBases`), and it will take quite a bit of effort to refactor the -code to access such things through an App object. """ # ruff: noqa: E402 import collections diff --git a/armi/mpiActions.py b/armi/mpiActions.py index dbf0171cf..4f952f687 100644 --- a/armi/mpiActions.py +++ b/armi/mpiActions.py @@ -469,7 +469,7 @@ def invokeHook(self): actionResult = None try: action = mpiComm.scatter(self._actions, root=0) - # create a new communicator that only has these specific dudes running + # create a new communicator that only has these specific processes running hasAction = action is not None context.MPI_COMM = mpiComm.Split(int(hasAction)) context.MPI_RANK = context.MPI_COMM.Get_rank() diff --git a/armi/nuclearDataIO/cccc/isotxs.py b/armi/nuclearDataIO/cccc/isotxs.py index fd3a5f9ba..617cd514e 100644 --- a/armi/nuclearDataIO/cccc/isotxs.py +++ b/armi/nuclearDataIO/cccc/isotxs.py @@ -753,8 +753,9 @@ def _getScatterMatrix(self, blockNumIndex): """ Get the scatter matrix for a particular blockNum. - Note: This is stupid and the logic should be combined with _setScatterMatrix. - Please recommend a better way to do it during code review. + Notes + ----- + This logic could be combined with _setScatterMatrix. """ if blockNumIndex == self._getElasticScatterBlockNumIndex(): scatterMatrix = self._getMicros().elasticScatter diff --git a/armi/physics/__init__.py b/armi/physics/__init__.py index 2603decb4..24a75f720 100644 --- a/armi/physics/__init__.py +++ b/armi/physics/__init__.py @@ -69,13 +69,4 @@ And then the associated ARMI-based app could import both ``IAEA.physics.neutronics.superSourceTerm`` and ``IAEA.physics.economics.magwoodsbrain``. Having a consistency in namespace along these lines is quite nice. - -If you want to propose a new namespace root folder here, we recommend making a ticket to aid in the discussion. - - -.. admonition:: Historical fun fact - - **All** physics modules once actually lived in this package, - before the age of Plugins began. The current state is transient, and will - converge as the framework matures. """ diff --git a/armi/physics/fuelCycle/fuelHandlers.py b/armi/physics/fuelCycle/fuelHandlers.py index 74697cd63..4b7140fa1 100644 --- a/armi/physics/fuelCycle/fuelHandlers.py +++ b/armi/physics/fuelCycle/fuelHandlers.py @@ -278,12 +278,11 @@ def findAssembly( multiplier. For example, if you wanted an assembly that had a bu close to half of assembly bob, you'd give param='percentBu', compareTo=(bob,0.5) If you want one with a bu close to 0.3, you'd do param='percentBu',compareTo=0.3. Yes, if you give a (float, - multiplier) tuple, the code will make fun of you for not doing your own math, but will - still operate as expected. + multiplier) tuple the code will still work as expected. forceSide : bool, optional requires the found assembly to have either 1: higher, -1: lower, None: any param than - compareTo + compareTo exclusions : list, optional List of assemblies that will be excluded from the search diff --git a/armi/utils/gridEditor.py b/armi/utils/gridEditor.py index 9513b7699..7363dfe9a 100644 --- a/armi/utils/gridEditor.py +++ b/armi/utils/gridEditor.py @@ -51,8 +51,7 @@ between asemblies of different design, but the same flags. * No proper zoom support, and object sizes are fixed and don't accommodate long - specifiers. Adding zoom would make for a fun first task to a new developer interested - in computer graphics. + specifiers. """ import colorsys From 1618c29d7432cc1a03580814c4109d2e1cc2a680 Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:35:14 -0800 Subject: [PATCH 08/13] Removing Database3 from the namespace (#2052) --- armi/bookkeeping/db/__init__.py | 2 -- armi/bookkeeping/db/database3.py | 27 --------------------------- doc/release/0.5.rst | 2 +- 3 files changed, 1 insertion(+), 30 deletions(-) delete mode 100644 armi/bookkeeping/db/database3.py diff --git a/armi/bookkeeping/db/__init__.py b/armi/bookkeeping/db/__init__.py index 5e2b9f421..9ece84985 100644 --- a/armi/bookkeeping/db/__init__.py +++ b/armi/bookkeeping/db/__init__.py @@ -66,13 +66,11 @@ # re-export package components for easier import from armi.bookkeeping.db.database import Database -from armi.bookkeeping.db.database3 import Database3 from armi.bookkeeping.db.databaseInterface import DatabaseInterface from armi.bookkeeping.db.factory import databaseFactory __all__ = [ "Database", - "Database3", "DatabaseInterface", "compareDatabases", "databaseFactory", diff --git a/armi/bookkeeping/db/database3.py b/armi/bookkeeping/db/database3.py deleted file mode 100644 index e28f71320..000000000 --- a/armi/bookkeeping/db/database3.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2024 TerraPower, LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Temporary placeholder, to support backwards compatibility of the API. - -We are moving from the name "Database3" to just "Database". As this is an API breaking change, this -file exists to streamline and ease the transition. -""" -# ruff: noqa: F403, F405 -from armi.bookkeeping.db.database import * - - -class Database3(Database): - """Temporary placeholder to ease the API-breaking transition from Database3 to Database.""" - - pass diff --git a/doc/release/0.5.rst b/doc/release/0.5.rst index 0e49b8e5a..16891118c 100644 --- a/doc/release/0.5.rst +++ b/doc/release/0.5.rst @@ -14,7 +14,7 @@ New Features API Changes ----------- -#. TBD +#. Removing ``Database3`` from the API, use ``Database``. (`PR#2052 `_) Bug Fixes --------- From ee691abf61d56197515886ec5bbb4804b4673a90 Mon Sep 17 00:00:00 2001 From: Arrielle Opotowsky Date: Tue, 14 Jan 2025 12:14:12 -0600 Subject: [PATCH 09/13] Putting Python exe file path in Case logs (#2053) --- armi/bookkeeping/report/reportingUtils.py | 2 ++ armi/bookkeeping/report/tests/test_report.py | 1 + 2 files changed, 3 insertions(+) diff --git a/armi/bookkeeping/report/reportingUtils.py b/armi/bookkeeping/report/reportingUtils.py index 1378efdf7..01dbd6914 100644 --- a/armi/bookkeeping/report/reportingUtils.py +++ b/armi/bookkeeping/report/reportingUtils.py @@ -52,6 +52,7 @@ Operator_WorkingDirectory = "Working Directory:" Operator_CurrentUser = "Current User:" Operator_PythonInterperter = "Python Interpreter:" +Operator_PythonExecutable = "Python Executable:" Operator_ArmiCodebase = "ARMI Location:" Operator_MasterMachine = "Master Machine:" Operator_Date = "Date and Time:" @@ -77,6 +78,7 @@ def _writeCaseInformation(o, cs): (Operator_ArmiCodebase, context.ROOT), (Operator_WorkingDirectory, os.getcwd()), (Operator_PythonInterperter, sys.version), + (Operator_PythonExecutable, sys.executable), (Operator_MasterMachine, getNodeName()), (Operator_NumProcessors, context.MPI_SIZE), (Operator_Date, context.START_TIME), diff --git a/armi/bookkeeping/report/tests/test_report.py b/armi/bookkeeping/report/tests/test_report.py index b395781d6..1dc64a0f5 100644 --- a/armi/bookkeeping/report/tests/test_report.py +++ b/armi/bookkeeping/report/tests/test_report.py @@ -261,6 +261,7 @@ def test_writeWelcomeHeaders(self): self.assertIn("Case Info", mock.getStdout()) self.assertIn("Input File Info", mock.getStdout()) self.assertIn("crossSectionControl-DA", mock.getStdout()) + self.assertIn("Python Executable", mock.getStdout()) self.assertIn(randoFile, mock.getStdout()) From 3431c44859a88ead124dfd323781c70c39bae714 Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Wed, 15 Jan 2025 13:56:52 -0800 Subject: [PATCH 10/13] Corrrectly ignoring BP sections in PassiveDBLoadPlugin (#2055) --- armi/bookkeeping/db/passiveDBLoadPlugin.py | 1 + .../db/tests/test_passiveDBLoadPlugin.py | 110 ++++++++++++++++++ armi/tests/test_plugins.py | 23 ---- doc/release/0.5.rst | 2 + 4 files changed, 113 insertions(+), 23 deletions(-) create mode 100644 armi/bookkeeping/db/tests/test_passiveDBLoadPlugin.py diff --git a/armi/bookkeeping/db/passiveDBLoadPlugin.py b/armi/bookkeeping/db/passiveDBLoadPlugin.py index 4dcb9ee30..e832d07b1 100644 --- a/armi/bookkeeping/db/passiveDBLoadPlugin.py +++ b/armi/bookkeeping/db/passiveDBLoadPlugin.py @@ -33,6 +33,7 @@ class PassThroughYamlize(yamlize.Object): @classmethod def from_yaml(cls, loader, node, round_trip_data=None): + node.value = [] return yamlize.Object.from_yaml.__func__( PassThroughYamlize, loader, node, round_trip_data ) diff --git a/armi/bookkeeping/db/tests/test_passiveDBLoadPlugin.py b/armi/bookkeeping/db/tests/test_passiveDBLoadPlugin.py new file mode 100644 index 000000000..d7803b2ee --- /dev/null +++ b/armi/bookkeeping/db/tests/test_passiveDBLoadPlugin.py @@ -0,0 +1,110 @@ +# Copyright 2025 TerraPower, LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Provides functionality for testing the PassiveDBLoadPlugin.""" +import unittest +from copy import deepcopy +from io import StringIO + +from ruamel.yaml.cyaml import CLoader +from ruamel.yaml.nodes import MappingNode, ScalarNode + +from armi import context, getApp +from armi.bookkeeping.db.passiveDBLoadPlugin import ( + PassiveDBLoadPlugin, + PassThroughYamlize, +) +from armi.reactor.blocks import Block + + +class TestPassiveDBLoadPlugin(unittest.TestCase): + def setUp(self): + """ + Manipulate the standard App. We can't just configure our own, since the + pytest environment bleeds between tests. + """ + self.app = getApp() + self._backupApp = deepcopy(self.app) + + def tearDown(self): + """Restore the App to its original state.""" + import armi + + armi._app = self._backupApp + context.APP_NAME = "armi" + + def test_passiveDBLoadPlugin(self): + plug = PassiveDBLoadPlugin() + + # default case + bpSections = plug.defineBlueprintsSections() + self.assertEqual(len(bpSections), 0) + params = plug.defineParameters() + self.assertEqual(len(params), 0) + + # non-empty cases + PassiveDBLoadPlugin.SKIP_BP_SECTIONS = ["hi", "mom"] + PassiveDBLoadPlugin.UNKNOWN_PARAMS = {Block: ["fake1", "fake2"]} + bpSections = plug.defineBlueprintsSections() + self.assertEqual(len(bpSections), 2) + self.assertTrue(type(bpSections[0]), tuple) + self.assertEqual(bpSections[0][0], "hi") + self.assertTrue(type(bpSections[1]), tuple) + self.assertEqual(bpSections[1][0], "mom") + params = plug.defineParameters() + self.assertEqual(len(params), 1) + self.assertIn(Block, params) + + +class TestPassThroughYamlize(unittest.TestCase): + def test_passThroughYamlizeExample1(self): + # create node from known BP-style YAML object + node = MappingNode( + "test_passThroughYamlizeExample1", + [ + ( + ScalarNode(tag="tag:yaml.org,2002:str", value="core-wide"), + MappingNode( + tag="tag:yaml.org,2002:map", + value=[ + ( + ScalarNode( + tag="tag:yaml.org,2002:str", + value="fuel axial expansion", + ), + ScalarNode(tag="tag:yaml.org,2002:bool", value="False"), + ), + ( + ScalarNode( + tag="tag:yaml.org,2002:str", + value="grid plate radial expansion", + ), + ScalarNode(tag="tag:yaml.org,2002:bool", value="True"), + ), + ], + ), + ) + ], + ) + + # test that node is non-zero and has the "core-wide" section + self.assertEqual(node.value[0][0].value, "core-wide") + + # pass the YAML string through the known YAML + pty = PassThroughYamlize() + loader = CLoader(StringIO("")) + _p = pty.from_yaml(loader, node) + + # prove the section has been cleared + self.assertEqual(len(node.value), 0) diff --git a/armi/tests/test_plugins.py b/armi/tests/test_plugins.py index 7852ce653..5069674ac 100644 --- a/armi/tests/test_plugins.py +++ b/armi/tests/test_plugins.py @@ -28,7 +28,6 @@ settings, utils, ) -from armi.bookkeeping.db.passiveDBLoadPlugin import PassiveDBLoadPlugin from armi.physics.neutronics import NeutronicsPlugin from armi.reactor.blocks import Block from armi.reactor.converters.axialExpansionChanger import AxialExpansionChanger @@ -131,28 +130,6 @@ def test_axialExpansionHook(self): # Registering a plugin that implements the hook means we get that plugin's axial expander self.assertIs(second, SillyAxialExpansionChanger) - def test_passiveDBLoadPlugin(self): - plug = PassiveDBLoadPlugin() - - # default case - bpSections = plug.defineBlueprintsSections() - self.assertEqual(len(bpSections), 0) - params = plug.defineParameters() - self.assertEqual(len(params), 0) - - # non-empty cases - PassiveDBLoadPlugin.SKIP_BP_SECTIONS = ["hi", "mom"] - PassiveDBLoadPlugin.UNKNOWN_PARAMS = {Block: ["fake1", "fake2"]} - bpSections = plug.defineBlueprintsSections() - self.assertEqual(len(bpSections), 2) - self.assertTrue(type(bpSections[0]), tuple) - self.assertEqual(bpSections[0][0], "hi") - self.assertTrue(type(bpSections[1]), tuple) - self.assertEqual(bpSections[1][0], "mom") - params = plug.defineParameters() - self.assertEqual(len(params), 1) - self.assertIn(Block, params) - def test_beforeReactorConstructionHook(self): """Test that plugin hook successfully injects code before reactor initialization. diff --git a/doc/release/0.5.rst b/doc/release/0.5.rst index 16891118c..e2d4a065d 100644 --- a/doc/release/0.5.rst +++ b/doc/release/0.5.rst @@ -15,9 +15,11 @@ New Features API Changes ----------- #. Removing ``Database3`` from the API, use ``Database``. (`PR#2052 `_) +#. TBD Bug Fixes --------- +#. Fixing BP-section ignoring tool in ``PassiveDBLoadPlugin``. (`PR#2055 `_) #. TBD Quality Work From 516c55d8c13688892ca0ad434fc8088ea39b4968 Mon Sep 17 00:00:00 2001 From: Michael Jarrett Date: Wed, 22 Jan 2025 10:15:56 -0800 Subject: [PATCH 11/13] Fixing scaling of edge assembly `VOLUME_INTEGRATED` params in 1/3 core symmetry (#2060) --- .../globalFlux/globalFluxInterface.py | 2 +- armi/reactor/blueprints/reactorBlueprint.py | 1 + armi/reactor/converters/geometryConverters.py | 17 +++++++++-------- .../converters/tests/test_geometryConverters.py | 2 +- doc/release/0.5.rst | 1 + 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/armi/physics/neutronics/globalFlux/globalFluxInterface.py b/armi/physics/neutronics/globalFlux/globalFluxInterface.py index aef9d2800..e99865cb5 100644 --- a/armi/physics/neutronics/globalFlux/globalFluxInterface.py +++ b/armi/physics/neutronics/globalFlux/globalFluxInterface.py @@ -640,7 +640,7 @@ def _undoGeometryTransformations(self): geomConverter = self.geomConverters.get("edgeAssems") if geomConverter: geomConverter.scaleParamsRelatedToSymmetry( - self.r, paramsToScaleSubset=self.options.paramsToScaleSubset + self.r.core, paramsToScaleSubset=self.options.paramsToScaleSubset ) # Resets the reactor core model to the correct symmetry and removes diff --git a/armi/reactor/blueprints/reactorBlueprint.py b/armi/reactor/blueprints/reactorBlueprint.py index ff7a4e8fb..0af2d81fd 100644 --- a/armi/reactor/blueprints/reactorBlueprint.py +++ b/armi/reactor/blueprints/reactorBlueprint.py @@ -237,6 +237,7 @@ def _modifyGeometry(self, container, gridDesign): runLog.header("=========== Applying Geometry Modifications ===========") converter = geometryConverters.EdgeAssemblyChanger() + converter.scaleParamsRelatedToSymmetry(container) converter.removeEdgeAssemblies(container) # now update the spatial grid dimensions based on the populated children diff --git a/armi/reactor/converters/geometryConverters.py b/armi/reactor/converters/geometryConverters.py index 8006a917f..64d62d6cc 100644 --- a/armi/reactor/converters/geometryConverters.py +++ b/armi/reactor/converters/geometryConverters.py @@ -1360,7 +1360,7 @@ def convert(self, r): self.listOfVolIntegratedParamsToScale, _, ) = _generateListOfParamsToScale( - self._sourceReactor, paramsToScaleSubset=[] + self._sourceReactor.core, paramsToScaleSubset=[] ) for b in a: @@ -1516,6 +1516,7 @@ def removeEdgeAssemblies(self, core): # Don't use newAssembliesAdded b/c this may be BOL cleaning of a fresh case that has edge # assems. edgeAssemblies = core.getAssembliesOnSymmetryLine(grids.BOUNDARY_120_DEGREES) + for a in edgeAssemblies: runLog.debug( "Removing edge assembly {} from {} from the reactor without discharging".format( @@ -1538,7 +1539,7 @@ def removeEdgeAssemblies(self, core): self.reset() @staticmethod - def scaleParamsRelatedToSymmetry(reactor, paramsToScaleSubset=None): + def scaleParamsRelatedToSymmetry(core, paramsToScaleSubset=None): """ Scale volume-dependent params like power to account for cut-off edges. @@ -1555,11 +1556,11 @@ def scaleParamsRelatedToSymmetry(reactor, paramsToScaleSubset=None): "Scaling edge-assembly parameters to account for full hexes instead of two halves" ) completeListOfParamsToScale = _generateListOfParamsToScale( - reactor, paramsToScaleSubset + core, paramsToScaleSubset ) symmetricAssems = ( - reactor.core.getAssembliesOnSymmetryLine(grids.BOUNDARY_0_DEGREES), - reactor.core.getAssembliesOnSymmetryLine(grids.BOUNDARY_120_DEGREES), + core.getAssembliesOnSymmetryLine(grids.BOUNDARY_0_DEGREES), + core.getAssembliesOnSymmetryLine(grids.BOUNDARY_120_DEGREES), ) if not all(symmetricAssems): runLog.extra("No edge-assemblies found to scale parameters for.") @@ -1569,15 +1570,15 @@ def scaleParamsRelatedToSymmetry(reactor, paramsToScaleSubset=None): _scaleParamsInBlock(b, bSymmetric, completeListOfParamsToScale) -def _generateListOfParamsToScale(r, paramsToScaleSubset): +def _generateListOfParamsToScale(core, paramsToScaleSubset): fluxParamsToScale = ( - r.core.getFirstBlock() + core.getFirstBlock() .p.paramDefs.inCategory(Category.fluxQuantities) .inCategory(Category.multiGroupQuantities) .names ) listOfVolumeIntegratedParamsToScale = ( - r.core.getFirstBlock() + core.getFirstBlock() .p.paramDefs.atLocation(ParamLocation.VOLUME_INTEGRATED) .since(SINCE_LAST_GEOMETRY_TRANSFORMATION) ) diff --git a/armi/reactor/converters/tests/test_geometryConverters.py b/armi/reactor/converters/tests/test_geometryConverters.py index 5746a18bb..1c326cd19 100644 --- a/armi/reactor/converters/tests/test_geometryConverters.py +++ b/armi/reactor/converters/tests/test_geometryConverters.py @@ -317,7 +317,7 @@ def getAssemByRingPos(ringPos: tuple): # must be added after geom transform for b in self.o.r.core.getBlocks(): b.p.power = 1.0 - converter.scaleParamsRelatedToSymmetry(self.r) + converter.scaleParamsRelatedToSymmetry(self.r.core) a = self.r.core.getAssembliesOnSymmetryLine(grids.BOUNDARY_0_DEGREES)[0] self.assertTrue(all(b.p.power == 2.0 for b in a), "Powers were not scaled") diff --git a/doc/release/0.5.rst b/doc/release/0.5.rst index e2d4a065d..e005d82f8 100644 --- a/doc/release/0.5.rst +++ b/doc/release/0.5.rst @@ -20,6 +20,7 @@ API Changes Bug Fixes --------- #. Fixing BP-section ignoring tool in ``PassiveDBLoadPlugin``. (`PR#2055 `_) +#. Fixing scaling of volume-integrated parameters on edge assembleis. (`PR#2060 `_) #. TBD Quality Work From 471e9e247f0bcb113611596c358ba43c603fdca2 Mon Sep 17 00:00:00 2001 From: John Stilley <1831479+john-science@users.noreply.github.com> Date: Wed, 22 Jan 2025 10:47:21 -0800 Subject: [PATCH 12/13] Moving our CLA in-house (#2061) --- CONTRIBUTING.md | 62 ++++++++++++++++++++++- doc/developer/first_time_contributors.rst | 2 +- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index da7a88d95..0459d0923 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,63 @@ -# How to Contribute +# Contribution License Agreement For information on how to contribute to ARMI, see [our official documenation](https://terrapower.github.io/armi/developer/first_time_contributors.html). + +This Contribution License Agreement (**"Agreement"**) is agreed to by the party signing below (**"You"**), and conveys certain license rights to TerraPower, LLC and its affiliates (**"TerraPower"**) for Your contributions to TerraPower open source projects. This Agreement is effective as of the latest signature date below. + +## 1. Definitions. + +**"Code"** means the computer software code, whether in human-readable or machine-executable form, that is delivered by You to TerraPower under this Agreement. + +**"Project"** means any of the projects owned or managed by TerraPower in which software is offered under a license approved by the Open Source Initiative (OSI) ([www.opensource.org](http://www.opensource.org)) and documentation offered under an OSI or a Creative Commons license (https://creativecommons.org/licenses). + +**"Submit"** is the act of uploading, submitting, transmitting, or distributing code or other content to any Project, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Project for the purpose of discussing and improving that Project, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Submission." + +**"Submission"** means the Code and any other copyrightable material Submitted by You, including any associated comments and documentation. + +## 2. Your Submission. + +You must agree to the terms of this Agreement before making a Submission to any Project. This Agreement covers any and all Submissions that You, now or in the future (except as described in Section 4 below), Submit to any Project. + +## 3. Originality of Work. + +You represent that each of Your Submissions is entirely Your original work. Should You wish to Submit materials that are not Your original work, You may Submit them separately to the Project if You (a) retain all copyright and license information that was in the materials as You received them, (b) in the description accompanying Your Submission, include the phrase "Submission containing materials of a third party:" followed by the names of the third party and any licenses or other restrictions of which You are aware, and (c) follow any other instructions in the Project’s written guidelines concerning Submissions. + +## 4. Your Employer. + +References to "employer" in this Agreement include Your employer or anyone else for whom You are acting in making Your Submission, e.g. as a contractor, vendor, or agent. If Your Submission is made in the course of Your work for an employer or Your employer has intellectual property rights in Your Submission by contract or applicable law, You must secure permission from Your employer to make the Submission before signing this Agreement. In that case, the term "You" in this Agreement will refer to You and the employer collectively. If You change employers in the future and desire to Submit additional Submissions for the new employer, then You agree to sign a new Agreement and secure permission from the new employer before Submitting those Submissions. + +## 5. Licenses. + +### a. Copyright License. + +You grant TerraPower, and those who receive the Submission directly or indirectly from TerraPower, a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license in the Submission to reproduce, prepare derivative works of, publicly display, publicly perform, and distribute the Submission and such derivative works, and to sublicense any or all of the foregoing rights to third parties. + +### b. Patent License. + +You grant TerraPower, and those who receive the Submission directly or indirectly from TerraPower, a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license under Your patent claims that are necessarily infringed by the Submission or the combination of the Submission with the Project to which it was Submitted to make, have made, use, offer to sell, sell and import or otherwise dispose of the Submission alone or with the Project. + +### c. Other Rights Reserved. + +Each party reserves all rights not expressly granted in this Agreement. No additional licenses or rights whatsoever (including, without limitation, any implied licenses) are granted by implication, exhaustion, estoppel or otherwise. + +## 6. Representations and Warranties. + +You represent that You are legally entitled to grant the above licenses. You represent that each of Your Submissions is entirely Your original work (except as You may have disclosed under Section 3). You represent that You have secured permission from Your employer to make the Submission in cases where Your Submission is made in the course of Your work for Your employer or Your employer has intellectual property rights in Your Submission by contract or applicable law. If You are signing this Agreement on behalf of Your employer, You represent and warrant that You have the necessary authority to bind the listed employer to the obligations contained in this Agreement. You are not expected to provide support for Your Submission, unless You choose to do so. UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, AND EXCEPT FOR THE WARRANTIES EXPRESSLY STATED IN SECTIONS 3, 4, AND 6, THE SUBMISSION PROVIDED UNDER THIS AGREEMENT IS PROVIDED WITHOUT WARRANTY OF ANY KIND, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY OF NONINFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. + +## 7. Notice to TerraPower. + +You agree to notify TerraPower in writing of any facts or circumstances of which You later become aware that would make Your representations in this Agreement inaccurate in any respect. + +## 8. Information about Submissions. + +You agree that contributions to Projects and information about contributions may be maintained indefinitely and disclosed publicly, including Your name and other information that You submit with Your Submission. + +## 9. Governing Law/Jurisdiction. + +This Agreement is governed by the laws of the State of Washington, USA and the parties consent to exclusive jurisdiction and venue in the federal courts located in King County, Washington, USA unless no federal subject matter jurisdiction exists, in which case the parties consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington, USA. The parties waive all defenses of lack of personal jurisdiction and forum non-conveniens. + +## 10. Entire Agreement/Assignment. + +This Agreement is the entire agreement between the parties, and supersedes any and all prior agreements, understandings or communications, written or oral, between the parties relating to the subject matter hereof. This Agreement may be assigned by TerraPower. + +Please select one of the options below and sign as indicated. By signing, You accept and agree to the terms of this Contribution License Agreement for Your present and future Submissions to TerraPower. diff --git a/doc/developer/first_time_contributors.rst b/doc/developer/first_time_contributors.rst index 00cd676fb..64e9dcd07 100644 --- a/doc/developer/first_time_contributors.rst +++ b/doc/developer/first_time_contributors.rst @@ -49,7 +49,7 @@ The process for opening a PR against ARMI goes something like this: b. See ARMIs specific guidance on what makes a "good" Pull Request: :ref:`armi-tooling`. 5. Actively engage with your PR reviewer's questions and comments. -> Note that a bot will require that you sign our `Contributor License Agreement `_ +> Note that a bot will require that you sign our `Contributor License Agreement `_ before we can accept a pull request from you. See our published documentation for a complete guide to our coding standards and practices: :ref:`armi-stds`. From 3049a0ccfceeb638db51c1cf4e800a97c96ac975 Mon Sep 17 00:00:00 2001 From: Arrielle Opotowsky Date: Thu, 23 Jan 2025 11:50:57 -0600 Subject: [PATCH 13/13] Update the check for a jagged array during `_writeParams` (#2051) --- armi/bookkeeping/db/database.py | 22 +++++++++++---------- armi/bookkeeping/db/tests/test_database3.py | 14 +++++++++++++ doc/release/0.5.rst | 1 + 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/armi/bookkeeping/db/database.py b/armi/bookkeeping/db/database.py index 672e905fd..1a19dbcd9 100644 --- a/armi/bookkeeping/db/database.py +++ b/armi/bookkeeping/db/database.py @@ -914,16 +914,18 @@ def _compose(self, comps, cs, parent=None): return comp - def _writeParams(self, h5group, comps) -> tuple: - def _getShape(arr: [np.ndarray, List, Tuple]): - """Get the shape of a np.ndarray, list, or tuple.""" - if isinstance(arr, np.ndarray): - return arr.shape - elif isinstance(arr, (list, tuple)): - return (len(arr),) - else: - return (1,) + @staticmethod + def _getArrayShape(arr: [np.ndarray, List, Tuple]): + """Get the shape of a np.ndarray, list, or tuple.""" + if isinstance(arr, np.ndarray): + return arr.shape + elif isinstance(arr, (list, tuple)): + return (len(arr),) + else: + # not a list, tuple, or array (likely int, float, or None) + return 1 + def _writeParams(self, h5group, comps) -> tuple: c = comps[0] groupName = c.__class__.__name__ if groupName not in h5group: @@ -969,7 +971,7 @@ def _getShape(arr: [np.ndarray, List, Tuple]): else: # check if temp is a jagged array if any(isinstance(x, (np.ndarray, list)) for x in temp): - jagged = len(set([_getShape(x) for x in temp])) != 1 + jagged = len(set([self._getArrayShape(x) for x in temp])) != 1 else: jagged = False data = ( diff --git a/armi/bookkeeping/db/tests/test_database3.py b/armi/bookkeeping/db/tests/test_database3.py index 91246ac57..09491fb9a 100644 --- a/armi/bookkeeping/db/tests/test_database3.py +++ b/armi/bookkeeping/db/tests/test_database3.py @@ -23,6 +23,7 @@ import numpy as np from armi.bookkeeping.db import _getH5File, database, loadOperator +from armi.bookkeeping.db.database import Database from armi.bookkeeping.db.databaseInterface import DatabaseInterface from armi.bookkeeping.db.jaggedArray import JaggedArray from armi.reactor import parameters @@ -283,6 +284,19 @@ def _compareRoundTrip(self, data): roundTrip = database.unpackSpecialData(packed, attrs, "testing") self._compareArrays(data, roundTrip) + def test_getArrayShape(self): + """Tests a helper method for ``_writeParams``.""" + base = [1, 2, 3, 4] + self.assertEqual(Database._getArrayShape(base), (4,)) + self.assertEqual(Database._getArrayShape(tuple(base)), (4,)) + arr = np.array(base) + self.assertEqual(Database._getArrayShape(arr), (4,)) + arr = np.array([base]) + self.assertEqual(Database._getArrayShape(arr), (1, 4)) + # not array type + self.assertEqual(Database._getArrayShape(1), 1) + self.assertEqual(Database._getArrayShape(None), 1) + def test_writeToDB(self): """Test writing to the database. diff --git a/doc/release/0.5.rst b/doc/release/0.5.rst index e005d82f8..d487bb64c 100644 --- a/doc/release/0.5.rst +++ b/doc/release/0.5.rst @@ -19,6 +19,7 @@ API Changes Bug Fixes --------- +#. Fixing check for jagged arrays during ``_writeParams``. (`PR#2051 `_) #. Fixing BP-section ignoring tool in ``PassiveDBLoadPlugin``. (`PR#2055 `_) #. Fixing scaling of volume-integrated parameters on edge assembleis. (`PR#2060 `_) #. TBD