Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
64 changes: 32 additions & 32 deletions tests/test_components/test_scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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():
Expand Down
66 changes: 33 additions & 33 deletions tests/test_components/test_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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():
Expand Down
52 changes: 26 additions & 26 deletions tidy3d/components/scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down