From 3132460e0c1a462aa0d641848a37b1ffe05fea58 Mon Sep 17 00:00:00 2001 From: Giovanni Mariano <7062986+giovanni-mariano@users.noreply.github.com> Date: Sun, 26 Apr 2026 08:36:52 +0200 Subject: [PATCH 1/2] Added degenerated torus case: when A=0 and B=C, torus is now converted to sphere --- src/openmc_mcnp_adapter/openmc_conversion.py | 14 ++++++-------- tests/test_surfaces.py | 7 +++++++ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/openmc_mcnp_adapter/openmc_conversion.py b/src/openmc_mcnp_adapter/openmc_conversion.py index 7e4c576..412a723 100644 --- a/src/openmc_mcnp_adapter/openmc_conversion.py +++ b/src/openmc_mcnp_adapter/openmc_conversion.py @@ -301,15 +301,13 @@ def flip_sense(surf): a, b, c, d, e, f, g, h, j, k = coeffs surf = openmc.Quadric(surface_id=s['id'], a=a, b=b, c=c, d=d, e=e, f=f, g=g, h=h, j=j, k=k) - elif s['mnemonic'] == 'tx': + elif s['mnemonic'] in ('tx', 'ty', 'tz'): x0, y0, z0, a, b, c = coeffs - surf = openmc.XTorus(surface_id=s['id'], x0=x0, y0=y0, z0=z0, a=a, b=b, c=c) - elif s['mnemonic'] == 'ty': - x0, y0, z0, a, b, c = coeffs - surf = openmc.YTorus(surface_id=s['id'], x0=x0, y0=y0, z0=z0, a=a, b=b, c=c) - elif s['mnemonic'] == 'tz': - x0, y0, z0, a, b, c = coeffs - surf = openmc.ZTorus(surface_id=s['id'], x0=x0, y0=y0, z0=z0, a=a, b=b, c=c) + if a == 0 and b == c: + surf = openmc.Sphere(surface_id=s['id'], x0=x0, y0=y0, z0=z0, r=b) + else: + cls = getattr(openmc, f"{s['mnemonic'][1].upper()}Torus") + surf = cls(surface_id=s['id'], x0=x0, y0=y0, z0=z0, a=a, b=b, c=c) elif s['mnemonic'] in ('x', 'y', 'z'): axis = s['mnemonic'].upper() cls_plane = getattr(openmc, f'{axis}Plane') diff --git a/tests/test_surfaces.py b/tests/test_surfaces.py index 727c054..666910f 100644 --- a/tests/test_surfaces.py +++ b/tests/test_surfaces.py @@ -323,6 +323,13 @@ def test_torus(mnemonic, expected_type): assert getattr(surf, name) == approx(val) +@mark.parametrize("mnemonic", ["tx", "ty", "tz"]) +def test_torus_degenerate_sphere(mnemonic): + surf = convert_surface(mnemonic, (1.0, 2.0, 3.0, 0.0, 0.5, 0.5)) + assert isinstance(surf, openmc.Sphere) + assert (surf.x0, surf.y0, surf.z0, surf.r) == approx((1.0, 2.0, 3.0, 0.5)) + + @mark.parametrize( "mnemonic, params, expected_type, attr, value", [ From 487d6faa9edd7a0efd9d4dd7c84beb50f2c3c932 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 1 May 2026 14:09:10 -0500 Subject: [PATCH 2/2] Better floating point comparison, add warning --- src/openmc_mcnp_adapter/openmc_conversion.py | 6 +++++- tests/test_surfaces.py | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/openmc_mcnp_adapter/openmc_conversion.py b/src/openmc_mcnp_adapter/openmc_conversion.py index 412a723..3898646 100644 --- a/src/openmc_mcnp_adapter/openmc_conversion.py +++ b/src/openmc_mcnp_adapter/openmc_conversion.py @@ -303,7 +303,11 @@ def flip_sense(surf): f=f, g=g, h=h, j=j, k=k) elif s['mnemonic'] in ('tx', 'ty', 'tz'): x0, y0, z0, a, b, c = coeffs - if a == 0 and b == c: + if isclose(a, 0.0, abs_tol=1e-12) and isclose(b, c): + warnings.warn( + f"Degenerate torus surface {s['id']} (A=0, B=C) converted " + f"to an openmc.Sphere of radius {b}." + ) surf = openmc.Sphere(surface_id=s['id'], x0=x0, y0=y0, z0=z0, r=b) else: cls = getattr(openmc, f"{s['mnemonic'][1].upper()}Torus") diff --git a/tests/test_surfaces.py b/tests/test_surfaces.py index 666910f..32df317 100644 --- a/tests/test_surfaces.py +++ b/tests/test_surfaces.py @@ -7,7 +7,7 @@ RectangularParallelepiped, RightCircularCylinder, ConicalFrustum, \ XConeOneSided, YConeOneSided, ZConeOneSided from openmc_mcnp_adapter import mcnp_str_to_model, get_openmc_surfaces -from pytest import approx, mark, raises +from pytest import approx, mark, raises, warns def convert_surface(mnemonic: str, params: Sequence[float]) -> openmc.Surface: @@ -325,7 +325,8 @@ def test_torus(mnemonic, expected_type): @mark.parametrize("mnemonic", ["tx", "ty", "tz"]) def test_torus_degenerate_sphere(mnemonic): - surf = convert_surface(mnemonic, (1.0, 2.0, 3.0, 0.0, 0.5, 0.5)) + with warns(UserWarning, match="Degenerate torus"): + surf = convert_surface(mnemonic, (1.0, 2.0, 3.0, 0.0, 0.5, 0.5)) assert isinstance(surf, openmc.Sphere) assert (surf.x0, surf.y0, surf.z0, surf.r) == approx((1.0, 2.0, 3.0, 0.5))