From b21a7a53a8c94376dd76784fa1637b0dd341b0b1 Mon Sep 17 00:00:00 2001 From: Jonathan Shimwell Date: Wed, 20 Mar 2024 18:18:43 +0000 Subject: [PATCH] moved files from old branch --- .../workflows/simple_tokamak_cad_to_dagmc.yml | 30 ++++++ .../simple_tokamak_cad_to_openmc.yml | 30 ++++++ README.md | 3 +- examples/compare_csg_cad_ellipticaltorus.py | 2 +- examples/compare_csg_cad_simpletokamak.py | 96 ++++++++++++++++++ examples/simpletokamak.png | Bin 0 -> 49985 bytes src/model_benchmark_zoo/__init__.py | 3 +- src/model_benchmark_zoo/simpletokamak.py | 62 +++++++++++ .../test_csg_cad_simple_tokamak.py | 81 +++++++++++++++ .../test_csg_cad_simple_tokamak.py | 79 ++++++++++++++ 10 files changed, 383 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/simple_tokamak_cad_to_dagmc.yml create mode 100644 .github/workflows/simple_tokamak_cad_to_openmc.yml create mode 100644 examples/compare_csg_cad_simpletokamak.py create mode 100644 examples/simpletokamak.png create mode 100644 src/model_benchmark_zoo/simpletokamak.py create mode 100644 tests/test_cad_to_dagmc/test_csg_cad_simple_tokamak.py create mode 100644 tests/test_cad_to_openmc/test_csg_cad_simple_tokamak.py diff --git a/.github/workflows/simple_tokamak_cad_to_dagmc.yml b/.github/workflows/simple_tokamak_cad_to_dagmc.yml new file mode 100644 index 0000000..691d26f --- /dev/null +++ b/.github/workflows/simple_tokamak_cad_to_dagmc.yml @@ -0,0 +1,30 @@ +name: simple tokamak - cad to dagmc + +on: + pull_request: + branches: + - develop + - main + push: + branches: + - main + +jobs: + testing: + runs-on: ubuntu-latest + steps: + + - name: checkout actions + uses: actions/checkout@v4 + + - name: use upstream test composite action + uses: ./.github/actions/dependencies_cad_to_dagmc + + - shell: bash + env: + OPENMC_CROSS_SECTIONS: /home/runner/work/model_benchmark_zoo/model_benchmark_zoo/cross_sections.xml + run: | + source "${HOME}/conda/etc/profile.d/conda.sh" + source "${HOME}/conda/etc/profile.d/mamba.sh" + mamba activate + pytest tests/test_cad_to_dagmc/test_csg_cad_simple_tokamak.py diff --git a/.github/workflows/simple_tokamak_cad_to_openmc.yml b/.github/workflows/simple_tokamak_cad_to_openmc.yml new file mode 100644 index 0000000..11b0bfe --- /dev/null +++ b/.github/workflows/simple_tokamak_cad_to_openmc.yml @@ -0,0 +1,30 @@ +name: simple tokamak - cad to openmc + +on: + pull_request: + branches: + - develop + - main + push: + branches: + - main + +jobs: + testing: + runs-on: ubuntu-latest + steps: + + - name: checkout actions + uses: actions/checkout@v4 + + - name: use upstream test composite action + uses: ./.github/actions/dependencies_cad_to_openmc + + - shell: bash + env: + OPENMC_CROSS_SECTIONS: /home/runner/work/model_benchmark_zoo/model_benchmark_zoo/cross_sections.xml + run: | + source "${HOME}/conda/etc/profile.d/conda.sh" + source "${HOME}/conda/etc/profile.d/mamba.sh" + mamba activate + pytest tests/test_cad_to_openmc/test_csg_cad_simple_tokamak.py diff --git a/README.md b/README.md index 2e1d381..b08993a 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ models (CSG) for comparing neutronics simulations with both geometry types. |

| [![nested_cylinder](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/nested_cylinder_cad_to_dagmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/nested_cylinder_cad_to_dagmc.yml)
[![nested cylinder - cad to openmc](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/nested_cylinder_cad_to_openmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/nested_cylinder_cad_to_openmc.yml) | |

| [![circular_torus](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/circular_torus_cad_to_dagmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/circular_torus_cad_to_dagmc.yml)
[![circular torus - cad to openmc](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/circular_torus_cad_to_openmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/circular_torus_cad_to_openmc.yml) | |

| [![elliptical_torus](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/elliptical_torus_cad_to_dagmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/elliptical_torus_cad_to_dagmc.yml)
[![elliptical torus - cad to openmc](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/elliptical_torus_cad_to_openmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/elliptical_torus_cad_to_openmc.yml) | +|

| [![simple_tokamak](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/simple_tokamak_cad_to_dagmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/simple_tokamak_cad_to_dagmc.yml)
[![elliptical torus - cad to openmc](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/simple_tokamak_cad_to_openmc.yml/badge.svg)](https://github.com/fusion-energy/model_benchmark_zoo/actions/workflows/simple_tokamak_cad_to_openmc.yml) | # Installation prerequisite @@ -41,7 +42,7 @@ mamba activate new_env Install the dependencies, if this fails to solve the environment you could also try [installing OpenMC from source](https://docs.openmc.org/en/stable/quickinstall.html) which might be prefered. ```bash -mamba install -y -c conda-forge moab>=5.3.0 gmsh python-gmsh "openmc=0.14.0=dagmc*nompi*" +mamba install -y -c conda-forge gmsh python-gmsh "openmc=0.14.0=dagmc*nompi*" ``` CadQuery should then be installed, here is the mamba command and the pip command. diff --git a/examples/compare_csg_cad_ellipticaltorus.py b/examples/compare_csg_cad_ellipticaltorus.py index 5b1519a..bf8e43e 100644 --- a/examples/compare_csg_cad_ellipticaltorus.py +++ b/examples/compare_csg_cad_ellipticaltorus.py @@ -27,7 +27,7 @@ my_settings.particles = 500 my_settings.run_mode = 'fixed source' -# Create a DT point source +# Create a DT ring source my_source = openmc.IndependentSource() r = openmc.stats.Discrete([major_radius], [1]) phi = openmc.stats.Uniform(0, 2*np.pi) diff --git a/examples/compare_csg_cad_simpletokamak.py b/examples/compare_csg_cad_simpletokamak.py new file mode 100644 index 0000000..1804828 --- /dev/null +++ b/examples/compare_csg_cad_simpletokamak.py @@ -0,0 +1,96 @@ +from model_benchmark_zoo import SimpleTokamak +import openmc +import math + +mat1 = openmc.Material(name='1') +mat1.add_nuclide('Fe56', 1) +mat1.set_density('g/cm3', 1) + +mat2 = openmc.Material(name='2') +mat2.add_nuclide('Be9', 1) +mat2.set_density('g/cm3', 1) + +# geometry used in both simulations +common_geometry_object = SimpleTokamak( + radius=500, + blanket_thicknesses=100, + center_column_thicknesses=150, + center_column_extent_beyond_blanket=20, +) +# just writing a CAD step file for visulisation +common_geometry_object.export_stp_file("simpletokamak.stp") + +mat1_filter = openmc.MaterialFilter(mat1) +tally1 = openmc.Tally(name='mat1_flux_tally') +tally1.filters = [mat1_filter] +tally1.scores = ['flux'] + +mat2_filter = openmc.MaterialFilter(mat2) +tally2 = openmc.Tally(name='mat2_flux_tally') +tally2.filters = [mat2_filter] +tally2.scores = ['flux'] + +my_tallies = openmc.Tallies([tally1, tally2]) + +my_settings = openmc.Settings() +my_settings.batches = 10 +my_settings.inactive = 0 +my_settings.particles = 500 +my_settings.run_mode = 'fixed source' + +# Create a DT ring source +my_source = openmc.IndependentSource() +source_r = common_geometry_object.center_column_thicknesses + (common_geometry_object.radius-common_geometry_object.center_column_thicknesses) /2 +r = openmc.stats.Discrete([source_r], [1]) +phi = openmc.stats.Uniform(0, 2*math.pi) +z = openmc.stats.Discrete([0], [1]) +my_source.space = openmc.stats.CylindricalIndependent(r, phi, z) +my_source.energy = openmc.stats.Discrete([14e6], [1]) +my_settings.source = my_source + +# making openmc.Model with CSG geometry +csg_model = common_geometry_object.csg_model(materials=[mat1, mat2]) +csg_model.tallies = my_tallies +csg_model.settings = my_settings + +output_file_from_csg = csg_model.run() + +# extracting the tally result from the CSG simulation +with openmc.StatePoint(output_file_from_csg) as sp_from_csg: + csg_result_mat_1 = sp_from_csg.get_tally(name="mat1_flux_tally") + csg_result_mat_2 = sp_from_csg.get_tally(name="mat2_flux_tally") + +csg_result_mat_1_str = f'CSG tally mean {csg_result_mat_1.mean} std dev {csg_result_mat_1.std_dev}' +csg_result_mat_2_str = f'CSG tally mean {csg_result_mat_2.mean} std dev {csg_result_mat_2.std_dev}' + +common_geometry_object.export_h5m_file_with_cad_to_dagmc( + h5m_filename='simpletokamak.h5m', + material_tags=['1', '2'], + # the small mesh sizes make a large detailed mesh which is needed to get similar answers + min_mesh_size=0.01, + max_mesh_size=0.5 +) +# making openmc.Model with DAGMC geometry and specifying mesh sizes to get a good representation of a sphere +dag_model = common_geometry_object.dagmc_model( + h5m_filename='simpletokamak.h5m', materials=[mat1, mat2]) +dag_model.tallies = my_tallies +dag_model.settings = my_settings + +output_file_from_cad = dag_model.run() + +# extracting the tally result from the DAGMC simulation +with openmc.StatePoint(output_file_from_cad) as sp_from_cad: + cad_result_mat_1 = sp_from_cad.get_tally(name="mat1_flux_tally") + cad_result_mat_2 = sp_from_cad.get_tally(name="mat2_flux_tally") + +cad_result_mat_1_str = f'CAD tally mean {cad_result_mat_1.mean} std dev {cad_result_mat_1.std_dev}' +cad_result_mat_2_str = f'CAD tally mean {cad_result_mat_2.mean} std dev {cad_result_mat_2.std_dev}' + +# printing both tally results +print(csg_result_mat_1_str) +print(cad_result_mat_1_str) +print(csg_result_mat_2_str) +print(cad_result_mat_2_str) + +assert math.isclose(cad_result_mat_1.mean, csg_result_mat_1.mean, rel_tol=0.01) +assert math.isclose(cad_result_mat_2.mean, csg_result_mat_2.mean, rel_tol=0.01) \ No newline at end of file diff --git a/examples/simpletokamak.png b/examples/simpletokamak.png new file mode 100644 index 0000000000000000000000000000000000000000..df55171fba93542c4cb1b3ce75b6a7747df03981 GIT binary patch literal 49985 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 literal 0 HcmV?d00001 diff --git a/src/model_benchmark_zoo/__init__.py b/src/model_benchmark_zoo/__init__.py index fe40b2a..c84bc47 100644 --- a/src/model_benchmark_zoo/__init__.py +++ b/src/model_benchmark_zoo/__init__.py @@ -6,4 +6,5 @@ from .cylinder import * from .circulartorus import * from .nestedcylinder import * -from .ellipticaltorus import * \ No newline at end of file +from .ellipticaltorus import * +from .simpletokamak import * diff --git a/src/model_benchmark_zoo/simpletokamak.py b/src/model_benchmark_zoo/simpletokamak.py new file mode 100644 index 0000000..e3f4eaf --- /dev/null +++ b/src/model_benchmark_zoo/simpletokamak.py @@ -0,0 +1,62 @@ + +from .utils import BaseCommonGeometryObject + +class SimpleTokamak(BaseCommonGeometryObject): + def __init__( + self, + radius=500, + blanket_thicknesses=100, + center_column_thicknesses=150, + center_column_extent_beyond_blanket=10, + ): + self.radius = radius + self.blanket_thicknesses = blanket_thicknesses + self.center_column_thicknesses = center_column_thicknesses + self.center_column_extent_beyond_blanket = center_column_extent_beyond_blanket + + def csg_model(self, materials): + import openmc + + center_column_height = (self.radius + self.blanket_thicknesses + self.center_column_extent_beyond_blanket)*2 + + surface_inner_wall = openmc.Sphere(r=self.radius) + surface_outer_wall = openmc.Sphere(r=self.radius + self.blanket_thicknesses) + surface_center_cylinder = openmc.ZCylinder(r=self.center_column_thicknesses) + surface_top_cy = openmc.ZPlane(z0=center_column_height/2, boundary_type='vacuum') + surface_bot_cy = openmc.ZPlane(z0=-center_column_height/2, boundary_type='vacuum') + outer_surface = openmc.ZCylinder(r=self.radius + self.blanket_thicknesses, boundary_type='vacuum') + + region1 = -surface_inner_wall & +surface_center_cylinder # plasma + region2 = +surface_inner_wall & -surface_outer_wall & +surface_center_cylinder # blanket + region3 = -surface_top_cy & +surface_bot_cy & -surface_center_cylinder # center column + region4 = +surface_outer_wall & -surface_top_cy & +surface_bot_cy & +surface_center_cylinder & -outer_surface # outer vessel + + cell1 = openmc.Cell(region=region1) # plasma + cell2 = openmc.Cell(region=region2) # blanket + cell2.fill = materials[0] + cell3 = openmc.Cell(region=region3) # center column + cell3.fill = materials[1] + cell4 = openmc.Cell(region=region4) # outer vessel + + geometry = openmc.Geometry([cell1, cell2, cell3, cell4]) + materials = openmc.Materials([materials[0], materials[1]]) + model = openmc.Model(geometry=geometry, materials=materials) + return model + + def cadquery_assembly(self): + import cadquery as cq + + assembly = cq.Assembly(name="simpletokamak") + + center_column_height = self.radius + self.blanket_thicknesses + self.center_column_extent_beyond_blanket + + sphere1 = cq.Workplane().sphere(self.radius) + sphere2 = cq.Workplane().sphere(self.radius + self.blanket_thicknesses) + + center_column = cq.Workplane("XY").circle(self.center_column_thicknesses).extrude(center_column_height, both=True) + + sphere2 = sphere2.cut(sphere1).cut(center_column) + + assembly.add(sphere2) + assembly.add(center_column) + return assembly diff --git a/tests/test_cad_to_dagmc/test_csg_cad_simple_tokamak.py b/tests/test_cad_to_dagmc/test_csg_cad_simple_tokamak.py new file mode 100644 index 0000000..30e8a7d --- /dev/null +++ b/tests/test_cad_to_dagmc/test_csg_cad_simple_tokamak.py @@ -0,0 +1,81 @@ +from model_benchmark_zoo import SimpleTokamak +import openmc +import math + +def test_compare(): + # single material used in both simulations + mat1 = openmc.Material(name='1') + mat1.add_nuclide('Fe56', 1) + mat1.set_density('g/cm3', 1) + + mat2 = openmc.Material(name='2') + mat2.add_nuclide('Be9', 1) + mat2.set_density('g/cm3', 1) + + # geometry used in both simulations + common_geometry_object = SimpleTokamak( + radius=500, + blanket_thicknesses=100, + center_column_thicknesses=50 + ) + + mat1_filter = openmc.MaterialFilter(mat1) + tally1 = openmc.Tally(name='mat1_flux_tally') + tally1.filters = [mat1_filter] + tally1.scores = ['flux'] + + mat2_filter = openmc.MaterialFilter(mat2) + tally2 = openmc.Tally(name='mat2_flux_tally') + tally2.filters = [mat2_filter] + tally2.scores = ['flux'] + + my_tallies = openmc.Tallies([tally1, tally2]) + + my_settings = openmc.Settings() + my_settings.batches = 10 + my_settings.inactive = 0 + my_settings.particles = 500 + my_settings.run_mode = 'fixed source' + + # Create a DT ring source + my_source = openmc.IndependentSource() + source_r = common_geometry_object.center_column_thicknesses + (common_geometry_object.radius-common_geometry_object.center_column_thicknesses) /2 + r = openmc.stats.Discrete([source_r], [1]) + phi = openmc.stats.Uniform(0, 2*math.pi) + z = openmc.stats.Discrete([0], [1]) + my_source.space = openmc.stats.CylindricalIndependent(r, phi, z) + my_source.energy = openmc.stats.Discrete([14e6], [1]) + my_settings.source = my_source + + # making openmc.Model with CSG geometry + csg_model = common_geometry_object.csg_model(materials=[mat1, mat2]) + csg_model.tallies = my_tallies + csg_model.settings = my_settings + + output_file_from_csg = csg_model.run() + + # extracting the tally result from the CSG simulation + with openmc.StatePoint(output_file_from_csg) as sp_from_csg: + csg_result_mat_1 = sp_from_csg.get_tally(name="mat1_flux_tally") + csg_result_mat_2 = sp_from_csg.get_tally(name="mat2_flux_tally") + + common_geometry_object.export_h5m_file_with_cad_to_dagmc( + h5m_filename='simpletokamak.h5m', + material_tags=['1', '2'], + max_mesh_size=5, + min_mesh_size=0.05 + ) + # making openmc.Model with DAGMC geometry and specifying mesh sizes to get a good representation of a sphere + dag_model = common_geometry_object.dagmc_model(h5m_filename='simpletokamak.h5m', materials=[mat1, mat2]) + dag_model.tallies = my_tallies + dag_model.settings = my_settings + + output_file_from_cad = dag_model.run() + + # extracting the tally result from the DAGMC simulation + with openmc.StatePoint(output_file_from_cad) as sp_from_cad: + cad_result_mat_1 = sp_from_cad.get_tally(name="mat1_flux_tally") + cad_result_mat_2 = sp_from_cad.get_tally(name="mat2_flux_tally") + + assert math.isclose(cad_result_mat_1.mean, csg_result_mat_1.mean, rel_tol=0.01) + assert math.isclose(cad_result_mat_2.mean, csg_result_mat_2.mean, rel_tol=0.01) diff --git a/tests/test_cad_to_openmc/test_csg_cad_simple_tokamak.py b/tests/test_cad_to_openmc/test_csg_cad_simple_tokamak.py new file mode 100644 index 0000000..a3782ce --- /dev/null +++ b/tests/test_cad_to_openmc/test_csg_cad_simple_tokamak.py @@ -0,0 +1,79 @@ +from model_benchmark_zoo import SimpleTokamak +import openmc +import math + +def test_compare(): + # single material used in both simulations + mat1 = openmc.Material(name='1') + mat1.add_nuclide('Fe56', 1) + mat1.set_density('g/cm3', 1) + + mat2 = openmc.Material(name='2') + mat2.add_nuclide('Be9', 1) + mat2.set_density('g/cm3', 1) + + # geometry used in both simulations + common_geometry_object = SimpleTokamak( + radius=500, + blanket_thicknesses=100, + center_column_thicknesses=50 + ) + + mat1_filter = openmc.MaterialFilter(mat1) + tally1 = openmc.Tally(name='mat1_flux_tally') + tally1.filters = [mat1_filter] + tally1.scores = ['flux'] + + mat2_filter = openmc.MaterialFilter(mat2) + tally2 = openmc.Tally(name='mat2_flux_tally') + tally2.filters = [mat2_filter] + tally2.scores = ['flux'] + + my_tallies = openmc.Tallies([tally1, tally2]) + + my_settings = openmc.Settings() + my_settings.batches = 10 + my_settings.inactive = 0 + my_settings.particles = 500 + my_settings.run_mode = 'fixed source' + + # Create a DT ring source + my_source = openmc.IndependentSource() + source_r = common_geometry_object.center_column_thicknesses + (common_geometry_object.radius-common_geometry_object.center_column_thicknesses) /2 + r = openmc.stats.Discrete([source_r], [1]) + phi = openmc.stats.Uniform(0, 2*math.pi) + z = openmc.stats.Discrete([0], [1]) + my_source.space = openmc.stats.CylindricalIndependent(r, phi, z) + my_source.energy = openmc.stats.Discrete([14e6], [1]) + my_settings.source = my_source + + # making openmc.Model with CSG geometry + csg_model = common_geometry_object.csg_model(materials=[mat1, mat2]) + csg_model.tallies = my_tallies + csg_model.settings = my_settings + + output_file_from_csg = csg_model.run() + + # extracting the tally result from the CSG simulation + with openmc.StatePoint(output_file_from_csg) as sp_from_csg: + csg_result_mat_1 = sp_from_csg.get_tally(name="mat1_flux_tally") + csg_result_mat_2 = sp_from_csg.get_tally(name="mat2_flux_tally") + + common_geometry_object.export_h5m_file_with_cad_to_openmc( + h5m_filename='simpletokamak.h5m', + material_tags=['1', '2'], + ) + # making openmc.Model with DAGMC geometry and specifying mesh sizes to get a good representation of a sphere + dag_model = common_geometry_object.dagmc_model(h5m_filename='simpletokamak.h5m', materials=[mat1, mat2]) + dag_model.tallies = my_tallies + dag_model.settings = my_settings + + output_file_from_cad = dag_model.run() + + # extracting the tally result from the DAGMC simulation + with openmc.StatePoint(output_file_from_cad) as sp_from_cad: + cad_result_mat_1 = sp_from_cad.get_tally(name="mat1_flux_tally") + cad_result_mat_2 = sp_from_cad.get_tally(name="mat2_flux_tally") + + assert math.isclose(cad_result_mat_1.mean, csg_result_mat_1.mean) + assert math.isclose(cad_result_mat_2.mean, csg_result_mat_2.mean)