diff --git a/CHANGELOG.md b/CHANGELOG.md index 6767dfbab1..c986979303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved performance of antenna metrics calculation by utilizing cached wave amplitude calculations instead of recomputing wave amplitudes for each port excitation in the `TerminalComponentModelerData`. - Changed hashing method in `Tidy3dBaseModel` from sha256 to md5. -- Allowing for more geometries in a ClipOperation geometry. +- Removed validators on limiting the number of geometries in a ClipOperation geometry. - Improved the speed of computing `Box` shape derivatives when used inside a `GeometryGroup`. - All RF and microwave specific components now inherit from `MicrowaveBaseModel`. - `DirectivityMonitor` now forces `far_field_approx` to `True`, which was previously configurable. diff --git a/tests/test_components/test_scene.py b/tests/test_components/test_scene.py index ff5178d182..09667b6030 100644 --- a/tests/test_components/test_scene.py +++ b/tests/test_components/test_scene.py @@ -9,7 +9,7 @@ import pytest import tidy3d as td -from tidy3d.components.scene import MAX_GEOMETRY_COUNT, MAX_NUM_MEDIUMS +from tidy3d.components.scene import MAX_NUM_MEDIUMS from tidy3d.components.viz import STRUCTURE_EPS_CMAP, STRUCTURE_EPS_CMAP_R from tidy3d.exceptions import SetupError @@ -333,37 +333,37 @@ def test_perturbed_mediums_copy(unstructured, z): assert isinstance(new_scene.structures[0].medium, td.CustomPoleResidue) -def test_max_geometry_validation(): - too_many = [td.Box(size=(1, 1, 1)) for _ in range(MAX_GEOMETRY_COUNT + 1)] - - fine = [ - td.Structure( - geometry=td.ClipOperation( - operation="union", - geometry_a=td.Box(size=(1, 1, 1)), - geometry_b=td.GeometryGroup(geometries=too_many), - ), - medium=td.Medium(permittivity=2.0), - ), - td.Structure( - geometry=td.GeometryGroup(geometries=too_many), - medium=td.Medium(permittivity=2.0), - ), - ] - _ = td.Scene(structures=fine) - - not_fine = [ - td.Structure( - geometry=td.ClipOperation( - operation="difference", - geometry_a=td.Box(size=(1, 1, 1)), - geometry_b=td.GeometryGroup(geometries=too_many), - ), - medium=td.Medium(permittivity=2.0), - ), - ] - with pytest.raises(pd.ValidationError, match=f" {MAX_GEOMETRY_COUNT + 2} "): - _ = td.Scene(structures=not_fine) +# def test_max_geometry_validation(): +# too_many = [td.Box(size=(1, 1, 1)) for _ in range(MAX_GEOMETRY_COUNT + 1)] + +# fine = [ +# td.Structure( +# geometry=td.ClipOperation( +# operation="union", +# geometry_a=td.Box(size=(1, 1, 1)), +# geometry_b=td.GeometryGroup(geometries=too_many), +# ), +# medium=td.Medium(permittivity=2.0), +# ), +# td.Structure( +# geometry=td.GeometryGroup(geometries=too_many), +# medium=td.Medium(permittivity=2.0), +# ), +# ] +# _ = td.Scene(structures=fine) + +# not_fine = [ +# td.Structure( +# geometry=td.ClipOperation( +# operation="difference", +# geometry_a=td.Box(size=(1, 1, 1)), +# geometry_b=td.GeometryGroup(geometries=too_many), +# ), +# medium=td.Medium(permittivity=2.0), +# ), +# ] +# with pytest.raises(pd.ValidationError, match=f" {MAX_GEOMETRY_COUNT + 2} "): +# _ = td.Scene(structures=not_fine) def test_structure_manual_priority(): diff --git a/tests/test_components/test_simulation.py b/tests/test_components/test_simulation.py index 76f0295192..3fdc73f02f 100644 --- a/tests/test_components/test_simulation.py +++ b/tests/test_components/test_simulation.py @@ -13,7 +13,7 @@ import tidy3d as td from tidy3d.components import simulation -from tidy3d.components.scene import MAX_GEOMETRY_COUNT, MAX_NUM_MEDIUMS +from tidy3d.components.scene import MAX_NUM_MEDIUMS from tidy3d.components.simulation import MAX_NUM_SOURCES from tidy3d.exceptions import SetupError, Tidy3dError, Tidy3dKeyError from tidy3d.plugins.mode import ModeSolver @@ -673,38 +673,38 @@ def test_validate_mnt_size(monkeypatch): s._validate_monitor_size() -def test_max_geometry_validation(): - gs = td.GridSpec(wavelength=1.0) - too_many = [td.Box(size=(1, 1, 1)) for _ in range(MAX_GEOMETRY_COUNT + 1)] - - fine = [ - td.Structure( - geometry=td.ClipOperation( - operation="union", - geometry_a=td.Box(size=(1, 1, 1)), - geometry_b=td.GeometryGroup(geometries=too_many), - ), - medium=td.Medium(permittivity=2.0), - ), - td.Structure( - geometry=td.GeometryGroup(geometries=too_many), - medium=td.Medium(permittivity=2.0), - ), - ] - _ = td.Simulation(size=(1, 1, 1), run_time=1, grid_spec=gs, structures=fine) - - not_fine = [ - td.Structure( - geometry=td.ClipOperation( - operation="difference", - geometry_a=td.Box(size=(1, 1, 1)), - geometry_b=td.GeometryGroup(geometries=too_many), - ), - medium=td.Medium(permittivity=2.0), - ), - ] - with pytest.raises(pydantic.ValidationError, match=f" {MAX_GEOMETRY_COUNT + 2} "): - _ = td.Simulation(size=(1, 1, 1), run_time=1, grid_spec=gs, structures=not_fine) +# def test_max_geometry_validation(): +# gs = td.GridSpec(wavelength=1.0) +# too_many = [td.Box(size=(1, 1, 1)) for _ in range(MAX_GEOMETRY_COUNT + 1)] + +# fine = [ +# td.Structure( +# geometry=td.ClipOperation( +# operation="union", +# geometry_a=td.Box(size=(1, 1, 1)), +# geometry_b=td.GeometryGroup(geometries=too_many), +# ), +# medium=td.Medium(permittivity=2.0), +# ), +# td.Structure( +# geometry=td.GeometryGroup(geometries=too_many), +# medium=td.Medium(permittivity=2.0), +# ), +# ] +# _ = td.Simulation(size=(1, 1, 1), run_time=1, grid_spec=gs, structures=fine) + +# not_fine = [ +# td.Structure( +# geometry=td.ClipOperation( +# operation="difference", +# geometry_a=td.Box(size=(1, 1, 1)), +# geometry_b=td.GeometryGroup(geometries=too_many), +# ), +# medium=td.Medium(permittivity=2.0), +# ), +# ] +# with pytest.raises(pydantic.ValidationError, match=f" {MAX_GEOMETRY_COUNT + 2} "): +# _ = td.Simulation(size=(1, 1, 1), run_time=1, grid_spec=gs, structures=not_fine) def test_no_monitor(): diff --git a/tidy3d/components/scene.py b/tidy3d/components/scene.py index c502b4ceec..bf6bf112a2 100644 --- a/tidy3d/components/scene.py +++ b/tidy3d/components/scene.py @@ -39,8 +39,8 @@ TriangularGridDataset, UnstructuredGridDataset, ) -from .geometry.base import Box, ClipOperation, GeometryGroup -from .geometry.utils import flatten_groups, merging_geometries_on_plane, traverse_geometries +from .geometry.base import Box +from .geometry.utils import merging_geometries_on_plane from .grid.grid import Coords, Grid from .material.multi_physics import MultiPhysicsMedium from .medium import ( @@ -82,8 +82,8 @@ # maximum number of mediums supported MAX_NUM_MEDIUMS = 65530 -# maximum geometry count in a single structure -MAX_GEOMETRY_COUNT = 5000 +# # maximum geometry count in a single structure +# MAX_GEOMETRY_COUNT = 5000 # warn and error out if the same medium is present in too many structures WARN_STRUCTURES_PER_MEDIUM = 200 @@ -175,28 +175,28 @@ def _validate_mediums(cls, val): return val - @pd.validator("structures", always=True) - def _validate_num_geometries(cls, val): - """Error if too many geometries in a single structure.""" - - if val is None: - return val - - for i, structure in enumerate(val): - for geometry in flatten_groups(structure.geometry, flatten_transformed=True): - count = sum( - 1 - for g in traverse_geometries(geometry) - if not isinstance(g, (GeometryGroup, ClipOperation)) - ) - if count > MAX_GEOMETRY_COUNT: - raise SetupError( - f"Structure at 'structures[{i}]' has {count} geometries that cannot be " - f"flattened. A maximum of {MAX_GEOMETRY_COUNT} is supported due to " - f"preprocessing performance." - ) - - return val + # @pd.validator("structures", always=True) + # def _validate_num_geometries(cls, val): + # """Error if too many geometries in a single structure.""" + + # if val is None: + # return val + + # for i, structure in enumerate(val): + # for geometry in flatten_groups(structure.geometry, flatten_transformed=True): + # count = sum( + # 1 + # for g in traverse_geometries(geometry) + # if not isinstance(g, (GeometryGroup, ClipOperation)) + # ) + # if count > MAX_GEOMETRY_COUNT: + # raise SetupError( + # f"Structure at 'structures[{i}]' has {count} geometries that cannot be " + # f"flattened. A maximum of {MAX_GEOMETRY_COUNT} is supported due to " + # f"preprocessing performance." + # ) + + # return val @pd.validator("structures", always=True) def _validate_structures_per_medium(cls, val):