diff --git a/tidy3d/components/geometry.py b/tidy3d/components/geometry.py index 355ca70e75..86f3e08f69 100644 --- a/tidy3d/components/geometry.py +++ b/tidy3d/components/geometry.py @@ -813,7 +813,7 @@ class PolySlab(Planar): """ slab_bounds: Tuple[float, float] - vertices: Vertices #Union[Vertices, Array[float]] + vertices: Union[Vertices, Array[float]] type: Literal["PolySlab"] = "PolySlab" @pydantic.validator("slab_bounds", always=True) diff --git a/tidy3d/components/medium.py b/tidy3d/components/medium.py index 6150078ec7..6a753a7edd 100644 --- a/tidy3d/components/medium.py +++ b/tidy3d/components/medium.py @@ -7,7 +7,7 @@ import numpy as np from .base import Tidy3dBaseModel -from .types import PoleAndResidue, Literal, Ax, FreqBound +from .types import PoleAndResidue, Literal, Ax, FreqBound, ComplexNumber from .viz import add_ax_if_none from .validators import validate_name_str @@ -422,6 +422,18 @@ class PoleResidue(DispersiveMedium): poles: List[PoleAndResidue] = [] type: Literal["PoleResidue"] = "PoleResidue" + @pydantic.validator("poles", always=True) + def convert_complex(cls, val): + """convert list of poles to complex""" + poles_complex = [] + for (a, c) in val: + if isinstance(a, ComplexNumber): + a = a.real + 1j * a.imag + if isinstance(c, ComplexNumber): + c = c.real + 1j * c.imag + poles_complex.append((a, c)) + return poles_complex + @ensure_freq_in_range def eps_model(self, frequency: float) -> complex: """Complex-valued permittivity as a function of frequency. diff --git a/tidy3d/components/simulation.py b/tidy3d/components/simulation.py index b7692a8d34..3462391511 100644 --- a/tidy3d/components/simulation.py +++ b/tidy3d/components/simulation.py @@ -908,7 +908,9 @@ def discretize(self, box: Box) -> Grid: sub_boundaries = Coords(**sub_cell_boundary_dict) return Grid(boundaries=sub_boundaries) - def epsilon(self, box: Box, coord_key: str = 'centers', freq: float = None) -> Dict[str, xr.DataArray]: + def epsilon( + self, box: Box, coord_key: str = "centers", freq: float = None + ) -> Dict[str, xr.DataArray]: """Get array of permittivity at volume specified by box and freq Parameters diff --git a/tidy3d/components/types.py b/tidy3d/components/types.py index 65a1edf7bd..e88a8c8664 100644 --- a/tidy3d/components/types.py +++ b/tidy3d/components/types.py @@ -41,7 +41,8 @@ class ComplexNumber(pydantic.BaseModel): imag: float -PoleAndResidue = Tuple[complex, complex] +Complex = Union[complex, ComplexNumber] +PoleAndResidue = Tuple[Complex, Complex] FreqBound = Union[float, Inf, Literal[-inf]] """ symmetries """ diff --git a/tidy3d/components/validators.py b/tidy3d/components/validators.py index 25d001c896..8657dc1d42 100644 --- a/tidy3d/components/validators.py +++ b/tidy3d/components/validators.py @@ -6,7 +6,6 @@ from ..log import ValidationError, SetupError from .geometry import Box - """ Explanation of pydantic validators: Validators are class methods that are added to the models to validate their fields (kwargs). diff --git a/tidy3d/plugins/near2far/near2far.py b/tidy3d/plugins/near2far/near2far.py index 05ee302d04..2c6be60e8a 100644 --- a/tidy3d/plugins/near2far/near2far.py +++ b/tidy3d/plugins/near2far/near2far.py @@ -67,7 +67,7 @@ def __init__(self, sim_data: SimulationData, mon_name: str, frequency: float): self.Mx = np.squeeze(Ey.values) self.My = -np.squeeze(Ex.values) - def _radiation_vectors(self, theta : float, phi : float): + def _radiation_vectors(self, theta: float, phi: float): """Compute radiation vectors at an angle in spherical coordinates Parameters diff --git a/tidy3d/web/container.py b/tidy3d/web/container.py index 28a2aa72c2..0e829a5614 100644 --- a/tidy3d/web/container.py +++ b/tidy3d/web/container.py @@ -265,7 +265,15 @@ def monitor(self) -> None: # pylint:disable=too-many-locals def pbar_description(task_name: str, status: str) -> str: return f"{task_name}: status = {status}" - run_statuses = ["queued", "preprocess", "queued_solver", "running", "postprocess", "visualize", "success"] + run_statuses = [ + "queued", + "preprocess", + "queued_solver", + "running", + "postprocess", + "visualize", + "success", + ] end_statuses = ("success", "error", "diverged", "deleted", "draft") pbar_tasks = {}