From c693621460043cbe084d4156819fe278201d28ef Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Mon, 9 Dec 2024 16:08:07 -0500 Subject: [PATCH 01/17] + openmc model neutron source --- libra_toolbox/__init__.py | 1 + libra_toolbox/_version.py | 16 +++++ libra_toolbox/neutronics/__init__.py | 1 + .../neutronics/neutron_source/__init__.py | 0 .../neutronics/neutron_source/mvng_source.py | 57 ++++++++++++++++++ .../neutron_source/mvng_source_diamond.h5 | Bin 0 -> 225304 bytes pyproject.toml | 5 +- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 libra_toolbox/_version.py create mode 100644 libra_toolbox/neutronics/__init__.py create mode 100644 libra_toolbox/neutronics/neutron_source/__init__.py create mode 100644 libra_toolbox/neutronics/neutron_source/mvng_source.py create mode 100644 libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5 diff --git a/libra_toolbox/__init__.py b/libra_toolbox/__init__.py index d7bf500..6cf8257 100644 --- a/libra_toolbox/__init__.py +++ b/libra_toolbox/__init__.py @@ -1,2 +1,3 @@ from . import tritium from . import neutron_detection +from . import neutronics \ No newline at end of file diff --git a/libra_toolbox/_version.py b/libra_toolbox/_version.py new file mode 100644 index 0000000..dcdd831 --- /dev/null +++ b/libra_toolbox/_version.py @@ -0,0 +1,16 @@ +# file generated by setuptools_scm +# don't change, don't track in version control +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple, Union + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '0.1.dev87+geef7af6.d20241209' +__version_tuple__ = version_tuple = (0, 1, 'dev87', 'geef7af6.d20241209') diff --git a/libra_toolbox/neutronics/__init__.py b/libra_toolbox/neutronics/__init__.py new file mode 100644 index 0000000..ce942a2 --- /dev/null +++ b/libra_toolbox/neutronics/__init__.py @@ -0,0 +1 @@ +from . import neutron_source \ No newline at end of file diff --git a/libra_toolbox/neutronics/neutron_source/__init__.py b/libra_toolbox/neutronics/neutron_source/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/libra_toolbox/neutronics/neutron_source/mvng_source.py b/libra_toolbox/neutronics/neutron_source/mvng_source.py new file mode 100644 index 0000000..2568d79 --- /dev/null +++ b/libra_toolbox/neutronics/neutron_source/mvng_source.py @@ -0,0 +1,57 @@ +# building the MIT-VaultLab neutron generator +# angular and energy distribution + +import numpy as np +import h5py +import openmc + + +def mvng_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): + '''method for building the MIT-VaultLab neutron generator in OpenMC + with data tabulated from John Ball and Shon Mackie characterization + via diamond detectors + + Parameters + ---------- + center : coordinate position of the source (it is a point source) + + reference_uvw : direction for the polar angle (tuple or list of versors) + it is the same for the openmc.PolarAzimuthal class + more specifically, polar angle = 0 is the direction of the D accelerator + towards the Zr-T target + ''' + + angles = ["0", "15", "30", "45", "60", "75", "90", "105", "120", "135", "150"] + + with h5py.File('mvng_source_diamond.h5', 'r') as mvng_source: + # energy values + energies = mvng_source['values/table']['Energy (MeV)'] * 1e6 + # angular bins in [0, pi) + pbins = np.cos([np.deg2rad(float(a)) for a in angles] + [np.pi]) + spectra = [mvng_source['values/table'][col] for col in angles] + + # yield values for strengths + yields = np.sum(spectra, axis=-1) * np.diff(pbins) + yields /= np.sum(yields) + + # azimuthal values + phi = openmc.stats.Uniform(a=0, b=2*np.pi) + + all_sources = [] + for i, angle in enumerate(pbins[:-1]): + + mu = openmc.stats.Uniform(a=pbins[i+1], b=pbins[i]) + + space = openmc.stats.Point(center) + angle = openmc.stats.PolarAzimuthal( + mu=mu, phi=phi, reference_uvw=reference_uvw) + energy = openmc.stats.Tabular( + energies, spectra[i], interpolation='linear-linear') + strength = yields[i] + + my_source = openmc.Source( + space=space, angle=angle, energy=energy, strength=strength, particle='neutron') + + all_sources.append(my_source) + + return all_sources diff --git a/libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5 b/libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5 new file mode 100644 index 0000000000000000000000000000000000000000..8afe5fa056ee1aa337230efe296e9e0eff564e3d GIT binary patch literal 225304 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 UZ<@mM9H+K`QOay*aT9O)FR-2LT>t<8 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index e6c18e9..1728774 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,4 +21,7 @@ dependencies = ["numpy", "pint", "scipy", "matplotlib", "sympy", "pandas"] tests = ["pytest>=5.4.3", "pytest-cov", "nbconvert", "ipykernel"] [tool.setuptools_scm] -write_to = "libra_toolbox/_version.py" \ No newline at end of file +write_to = "libra_toolbox/_version.py" + +[tool.setuptools.package-data] +mvng_source = ["libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5"] \ No newline at end of file From 287ee4769e754de939e345975519edec71a37269 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Mon, 9 Dec 2024 16:49:18 -0500 Subject: [PATCH 02/17] fixed names and import --- libra_toolbox/neutronics/__init__.py | 2 +- .../mvng_source.py => neutron_source.py} | 8 ++++++-- libra_toolbox/neutronics/neutron_source/__init__.py | 0 ..._source_diamond.h5 => neutron_source_diamond.h5} | Bin pyproject.toml | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) rename libra_toolbox/neutronics/{neutron_source/mvng_source.py => neutron_source.py} (87%) delete mode 100644 libra_toolbox/neutronics/neutron_source/__init__.py rename libra_toolbox/neutronics/{neutron_source/mvng_source_diamond.h5 => neutron_source_diamond.h5} (100%) diff --git a/libra_toolbox/neutronics/__init__.py b/libra_toolbox/neutronics/__init__.py index ce942a2..3bbb7ad 100644 --- a/libra_toolbox/neutronics/__init__.py +++ b/libra_toolbox/neutronics/__init__.py @@ -1 +1 @@ -from . import neutron_source \ No newline at end of file +from .neutron_source import * \ No newline at end of file diff --git a/libra_toolbox/neutronics/neutron_source/mvng_source.py b/libra_toolbox/neutronics/neutron_source.py similarity index 87% rename from libra_toolbox/neutronics/neutron_source/mvng_source.py rename to libra_toolbox/neutronics/neutron_source.py index 2568d79..9debc53 100644 --- a/libra_toolbox/neutronics/neutron_source/mvng_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -1,12 +1,13 @@ # building the MIT-VaultLab neutron generator # angular and energy distribution +from pathlib import Path import numpy as np import h5py import openmc -def mvng_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): +def neutron_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): '''method for building the MIT-VaultLab neutron generator in OpenMC with data tabulated from John Ball and Shon Mackie characterization via diamond detectors @@ -23,7 +24,10 @@ def mvng_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): angles = ["0", "15", "30", "45", "60", "75", "90", "105", "120", "135", "150"] - with h5py.File('mvng_source_diamond.h5', 'r') as mvng_source: + filename = 'neutron_source_diamond.h5' + filename = str(Path(__file__).parent) / Path(filename) + + with h5py.File(filename, 'r') as mvng_source: # energy values energies = mvng_source['values/table']['Energy (MeV)'] * 1e6 # angular bins in [0, pi) diff --git a/libra_toolbox/neutronics/neutron_source/__init__.py b/libra_toolbox/neutronics/neutron_source/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5 b/libra_toolbox/neutronics/neutron_source_diamond.h5 similarity index 100% rename from libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5 rename to libra_toolbox/neutronics/neutron_source_diamond.h5 diff --git a/pyproject.toml b/pyproject.toml index 1728774..61ab23b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,4 +24,4 @@ tests = ["pytest>=5.4.3", "pytest-cov", "nbconvert", "ipykernel"] write_to = "libra_toolbox/_version.py" [tool.setuptools.package-data] -mvng_source = ["libra_toolbox/neutronics/neutron_source/mvng_source_diamond.h5"] \ No newline at end of file +mvng_source = ["libra_toolbox/neutronics/neutron_source_diamond.h5"] \ No newline at end of file From d70ed5f601c7d882b2502514216c539065fff526 Mon Sep 17 00:00:00 2001 From: RemDelaporteMathurin Date: Mon, 9 Dec 2024 17:31:13 -0500 Subject: [PATCH 03/17] black formatting --- libra_toolbox/neutronics/neutron_source.py | 29 +++++++++++++--------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index 9debc53..71d91e6 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -8,7 +8,7 @@ def neutron_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): - '''method for building the MIT-VaultLab neutron generator in OpenMC + """method for building the MIT-VaultLab neutron generator in OpenMC with data tabulated from John Ball and Shon Mackie characterization via diamond detectors @@ -20,41 +20,46 @@ def neutron_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): it is the same for the openmc.PolarAzimuthal class more specifically, polar angle = 0 is the direction of the D accelerator towards the Zr-T target - ''' + """ angles = ["0", "15", "30", "45", "60", "75", "90", "105", "120", "135", "150"] - filename = 'neutron_source_diamond.h5' + filename = "neutron_source_diamond.h5" filename = str(Path(__file__).parent) / Path(filename) - with h5py.File(filename, 'r') as mvng_source: + with h5py.File(filename, "r") as mvng_source: # energy values - energies = mvng_source['values/table']['Energy (MeV)'] * 1e6 + energies = mvng_source["values/table"]["Energy (MeV)"] * 1e6 # angular bins in [0, pi) pbins = np.cos([np.deg2rad(float(a)) for a in angles] + [np.pi]) - spectra = [mvng_source['values/table'][col] for col in angles] + spectra = [mvng_source["values/table"][col] for col in angles] # yield values for strengths yields = np.sum(spectra, axis=-1) * np.diff(pbins) yields /= np.sum(yields) # azimuthal values - phi = openmc.stats.Uniform(a=0, b=2*np.pi) + phi = openmc.stats.Uniform(a=0, b=2 * np.pi) all_sources = [] for i, angle in enumerate(pbins[:-1]): - mu = openmc.stats.Uniform(a=pbins[i+1], b=pbins[i]) + mu = openmc.stats.Uniform(a=pbins[i + 1], b=pbins[i]) space = openmc.stats.Point(center) - angle = openmc.stats.PolarAzimuthal( - mu=mu, phi=phi, reference_uvw=reference_uvw) + angle = openmc.stats.PolarAzimuthal(mu=mu, phi=phi, reference_uvw=reference_uvw) energy = openmc.stats.Tabular( - energies, spectra[i], interpolation='linear-linear') + energies, spectra[i], interpolation="linear-linear" + ) strength = yields[i] my_source = openmc.Source( - space=space, angle=angle, energy=energy, strength=strength, particle='neutron') + space=space, + angle=angle, + energy=energy, + strength=strength, + particle="neutron", + ) all_sources.append(my_source) From 42192bfb4957ec6d9a73eb91e473957509b5ebbe Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Tue, 10 Dec 2024 10:58:00 -0500 Subject: [PATCH 04/17] + dependiencies --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 61ab23b..fd70a28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ description = "Design and analysis tools for LIBRA project" license = {file = "LICENSE"} requires-python = ">=3.6" dynamic = ["version"] -dependencies = ["numpy", "pint", "scipy", "matplotlib", "sympy", "pandas"] +dependencies = ["numpy", "pint", "scipy", "matplotlib", "sympy", "pandas", "openmc", "h5py"] [project.optional-dependencies] tests = ["pytest>=5.4.3", "pytest-cov", "nbconvert", "ipykernel"] From 08fd1e43eb054c3cdc62ece46c799c1f20001115 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 11 Dec 2024 16:21:54 -0500 Subject: [PATCH 05/17] cleaner function & generator name --- ...e_diamond.h5 => A325_generator_diamond.h5} | Bin libra_toolbox/neutronics/neutron_source.py | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) rename libra_toolbox/neutronics/{neutron_source_diamond.h5 => A325_generator_diamond.h5} (100%) diff --git a/libra_toolbox/neutronics/neutron_source_diamond.h5 b/libra_toolbox/neutronics/A325_generator_diamond.h5 similarity index 100% rename from libra_toolbox/neutronics/neutron_source_diamond.h5 rename to libra_toolbox/neutronics/A325_generator_diamond.h5 diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index 71d91e6..1acc6ec 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -2,13 +2,14 @@ # angular and energy distribution from pathlib import Path +import pandas as pd import numpy as np import h5py import openmc -def neutron_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): - """method for building the MIT-VaultLab neutron generator in OpenMC +def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): + """method for building the MIT-VaultLab A-325 neutron generator in OpenMC with data tabulated from John Ball and Shon Mackie characterization via diamond detectors @@ -22,17 +23,18 @@ def neutron_source_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): towards the Zr-T target """ - angles = ["0", "15", "30", "45", "60", "75", "90", "105", "120", "135", "150"] - - filename = "neutron_source_diamond.h5" + filename = "A325_generator_diamond.h5" filename = str(Path(__file__).parent) / Path(filename) - with h5py.File(filename, "r") as mvng_source: + with h5py.File(filename, "r") as source: + df = pd.DataFrame(source["values/table"][()]).drop(columns='index') # energy values - energies = mvng_source["values/table"]["Energy (MeV)"] * 1e6 + energies = np.array(df["Energy (MeV)"]) * 1e6 + # angle column names + angles = df.columns[1:] # angular bins in [0, pi) pbins = np.cos([np.deg2rad(float(a)) for a in angles] + [np.pi]) - spectra = [mvng_source["values/table"][col] for col in angles] + spectra = [np.array(source[col]) for col in angles] # yield values for strengths yields = np.sum(spectra, axis=-1) * np.diff(pbins) From 91225f64e40375127b9ec829c97e69a5bb750580 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 11 Dec 2024 16:27:42 -0500 Subject: [PATCH 06/17] better function documentation --- libra_toolbox/neutronics/neutron_source.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index 1acc6ec..ab0652f 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -2,25 +2,35 @@ # angular and energy distribution from pathlib import Path +from collections.abc import Iterable import pandas as pd import numpy as np import h5py import openmc -def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)): - """method for building the MIT-VaultLab A-325 neutron generator in OpenMC +def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)) -> Iterable[openmc.Source]: + """ + Builds the MIT-VaultLab A-325 neutron generator in OpenMC with data tabulated from John Ball and Shon Mackie characterization via diamond detectors Parameters ---------- - center : coordinate position of the source (it is a point source) - - reference_uvw : direction for the polar angle (tuple or list of versors) + center : tuple, optional + coordinate position of the source (it is a point source), + by default (0, 0, 0) + reference_uvw : tuple, optional + direction for the polar angle (tuple or list of versors) it is the same for the openmc.PolarAzimuthal class more specifically, polar angle = 0 is the direction of the D accelerator - towards the Zr-T target + towards the Zr-T target, by default (0, 0, 1) + + Returns + ------- + Iterable[openmc.Source] + list of openmc neutron sources with angular and energy distribution + and total strenght of 1 """ filename = "A325_generator_diamond.h5" From 8b0dd4917f0af424b5bdc5f941b619bac5bae8db Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 11 Dec 2024 17:40:45 -0500 Subject: [PATCH 07/17] initial test on neutron source --- test/neutronics/test_neutron_source.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test/neutronics/test_neutron_source.py diff --git a/test/neutronics/test_neutron_source.py b/test/neutronics/test_neutron_source.py new file mode 100644 index 0000000..261151e --- /dev/null +++ b/test/neutronics/test_neutron_source.py @@ -0,0 +1,8 @@ +from libra_toolbox.neutronics.neutron_source import * +from collections.abc import Iterable + +def test_get_avg_neutron_rate(tmpdir): + + source = A325_generator_diamond((0,0,0), (0,0,1)) + + assert source == Iterable[openmc.Source] \ No newline at end of file From c1696950aa87e6987062a3c883f52e2c2f8aa6b8 Mon Sep 17 00:00:00 2001 From: Stefano Segantin Date: Wed, 11 Dec 2024 17:41:05 -0500 Subject: [PATCH 08/17] + openmc -v to dependencies --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fd70a28..87c57f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ description = "Design and analysis tools for LIBRA project" license = {file = "LICENSE"} requires-python = ">=3.6" dynamic = ["version"] -dependencies = ["numpy", "pint", "scipy", "matplotlib", "sympy", "pandas", "openmc", "h5py"] +dependencies = ["numpy", "pint", "scipy", "matplotlib", "sympy", "pandas", "openmc>=0.14.0", "h5py"] [project.optional-dependencies] tests = ["pytest>=5.4.3", "pytest-cov", "nbconvert", "ipykernel"] From 703c8b179be2828dd3cc911e4680341e4579c1b9 Mon Sep 17 00:00:00 2001 From: RemDelaporteMathurin Date: Thu, 12 Dec 2024 11:25:30 -0500 Subject: [PATCH 09/17] added conda to CI --- .github/workflows/ci.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e15b42..ddcaf6e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,10 +8,18 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v2 + - name: Set up Conda + uses: conda-incubator/setup-miniconda@v2 with: - python-version: "3.10" + activate-environment: myenv + miniforge-version: latest + # use-mamba: true + channels: conda-forge + + - name: Create Conda environment + shell: bash -l {0} + run: | + conda install -c conda-forge openmc>=0.14.0 - name: Install dependencies run: | From 5f62d494b2bfef5b5da1c9db998822f322f72385 Mon Sep 17 00:00:00 2001 From: RemDelaporteMathurin Date: Thu, 12 Dec 2024 11:26:15 -0500 Subject: [PATCH 10/17] use right shell for all steps --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ddcaf6e..0e43a87 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,14 +22,17 @@ jobs: conda install -c conda-forge openmc>=0.14.0 - name: Install dependencies + shell: bash -l {0} run: | pip install .[tests] - name: Run tests + shell: bash -l {0} run: | python -m pytest test/ --cov libra_toolbox --cov-report xml --cov-report term - name: Run notebook examples + shell: bash -l {0} run: | jupyter nbconvert --to python --execute docs/examples/*.ipynb From 67b6c9ab3c22cd93c915b65e5da4a590798d033c Mon Sep 17 00:00:00 2001 From: RemDelaporteMathurin Date: Thu, 12 Dec 2024 11:27:42 -0500 Subject: [PATCH 11/17] python -m pip instead of pip --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e43a87..488e163 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - name: Install dependencies shell: bash -l {0} run: | - pip install .[tests] + python -m pip install .[tests] - name: Run tests shell: bash -l {0} From 2c21678a09d92c4593ee361a60647d51a87babc8 Mon Sep 17 00:00:00 2001 From: Stefano Segantin <92783079+SteSeg@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:40:19 -0500 Subject: [PATCH 12/17] Update libra_toolbox/neutronics/neutron_source.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Delaporte-Mathurin <40028739+RemDelaporteMathurin@users.noreply.github.com> --- libra_toolbox/neutronics/neutron_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index ab0652f..db90949 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -30,7 +30,7 @@ def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)) -> Iterabl ------- Iterable[openmc.Source] list of openmc neutron sources with angular and energy distribution - and total strenght of 1 + and total strength of 1 """ filename = "A325_generator_diamond.h5" From 06c835c77b0d550f34bcb5ac12661e25c8f7ae2a Mon Sep 17 00:00:00 2001 From: Stefano Segantin <92783079+SteSeg@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:40:36 -0500 Subject: [PATCH 13/17] Update libra_toolbox/neutronics/neutron_source.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Delaporte-Mathurin <40028739+RemDelaporteMathurin@users.noreply.github.com> --- libra_toolbox/neutronics/neutron_source.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index db90949..97b2e2e 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -28,7 +28,6 @@ def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)) -> Iterabl Returns ------- - Iterable[openmc.Source] list of openmc neutron sources with angular and energy distribution and total strength of 1 """ From c3cd01b5ab324a5dc77799e6dbbac0de42633fd3 Mon Sep 17 00:00:00 2001 From: Stefano Segantin <92783079+SteSeg@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:40:44 -0500 Subject: [PATCH 14/17] Update pyproject.toml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Delaporte-Mathurin <40028739+RemDelaporteMathurin@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 87c57f3..33f28fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,4 +24,4 @@ tests = ["pytest>=5.4.3", "pytest-cov", "nbconvert", "ipykernel"] write_to = "libra_toolbox/_version.py" [tool.setuptools.package-data] -mvng_source = ["libra_toolbox/neutronics/neutron_source_diamond.h5"] \ No newline at end of file +mvng_source = ["*.h5"] \ No newline at end of file From e9950c55330e052a024ed620e3fa893ef50b04fa Mon Sep 17 00:00:00 2001 From: Stefano Segantin <92783079+SteSeg@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:40:57 -0500 Subject: [PATCH 15/17] Update libra_toolbox/neutronics/neutron_source.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Delaporte-Mathurin <40028739+RemDelaporteMathurin@users.noreply.github.com> --- libra_toolbox/neutronics/neutron_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index 97b2e2e..84dddab 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -9,7 +9,7 @@ import openmc -def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)) -> Iterable[openmc.Source]: +def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)) -> Iterable[openmc.IndependentSource]: """ Builds the MIT-VaultLab A-325 neutron generator in OpenMC with data tabulated from John Ball and Shon Mackie characterization From 815e8afbc986c3e85d1e7e60f9355cf231b0448e Mon Sep 17 00:00:00 2001 From: Stefano Segantin <92783079+SteSeg@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:59:58 -0500 Subject: [PATCH 16/17] Update libra_toolbox/neutronics/neutron_source.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Delaporte-Mathurin <40028739+RemDelaporteMathurin@users.noreply.github.com> --- libra_toolbox/neutronics/neutron_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libra_toolbox/neutronics/neutron_source.py b/libra_toolbox/neutronics/neutron_source.py index 84dddab..a7e934d 100644 --- a/libra_toolbox/neutronics/neutron_source.py +++ b/libra_toolbox/neutronics/neutron_source.py @@ -43,7 +43,7 @@ def A325_generator_diamond(center=(0, 0, 0), reference_uvw=(0, 0, 1)) -> Iterabl angles = df.columns[1:] # angular bins in [0, pi) pbins = np.cos([np.deg2rad(float(a)) for a in angles] + [np.pi]) - spectra = [np.array(source[col]) for col in angles] + spectra = [np.array(df[col]) for col in angles] # yield values for strengths yields = np.sum(spectra, axis=-1) * np.diff(pbins) From 9e8874336d564832036663063d844d1b084cd035 Mon Sep 17 00:00:00 2001 From: Stefano Segantin <92783079+SteSeg@users.noreply.github.com> Date: Fri, 13 Dec 2024 10:00:07 -0500 Subject: [PATCH 17/17] Update test/neutronics/test_neutron_source.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémi Delaporte-Mathurin <40028739+RemDelaporteMathurin@users.noreply.github.com> --- test/neutronics/test_neutron_source.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/neutronics/test_neutron_source.py b/test/neutronics/test_neutron_source.py index 261151e..843b3d8 100644 --- a/test/neutronics/test_neutron_source.py +++ b/test/neutronics/test_neutron_source.py @@ -1,8 +1,10 @@ from libra_toolbox.neutronics.neutron_source import * from collections.abc import Iterable -def test_get_avg_neutron_rate(tmpdir): +def test_get_avg_neutron_rate(): - source = A325_generator_diamond((0,0,0), (0,0,1)) + source = A325_generator_diamond((0, 0, 0), (0, 0, 1)) - assert source == Iterable[openmc.Source] \ No newline at end of file + assert isinstance(source, Iterable) + for s in source: + assert isinstance(s, openmc.IndependentSource) \ No newline at end of file