Source code for tidy3d.components.bc_placement

"""Defines placements for boundary conditions."""

from __future__ import annotations

from abc import ABC
from typing import Union

import pydantic.v1 as pd

from tidy3d.exceptions import SetupError

from .base import Tidy3dBaseModel
from .types import BoxSurface


class AbstractBCPlacement(ABC, Tidy3dBaseModel):
    """Abstract placement for boundary conditions."""


[docs] class StructureBoundary(AbstractBCPlacement): """Placement of boundary conditions on the structure's boundary. Example ------- >>> bc_placement = StructureBoundary(structure="box") """ structure: str = pd.Field( title="Structure Name", description="Name of the structure.", )
[docs] class StructureStructureInterface(AbstractBCPlacement): """Placement of boundary conditions between two structures. Example ------- >>> bc_placement = StructureStructureInterface(structures=["box", "sphere"]) """ structures: tuple[str, str] = pd.Field( title="Structures", description="Names of two structures.", )
[docs] @pd.validator("structures", always=True) def unique_names(cls, val): """Error if the same structure is provided twice""" if val[0] == val[1]: raise SetupError( "The same structure is provided twice in 'StructureStructureInterface'." ) return val
[docs] class MediumMediumInterface(AbstractBCPlacement): """Placement of boundary conditions between two mediums. Example ------- >>> bc_placement = MediumMediumInterface(mediums=["dieletric", "metal"]) """ mediums: tuple[str, str] = pd.Field( title="Mediums", description="Names of two mediums.", )
[docs] @pd.validator("mediums", always=True) def unique_names(cls, val): """Error if the same structure is provided twice""" if val[0] == val[1]: raise SetupError("The same medium is provided twice in 'MediumMediumInterface'.") return val
[docs] class SimulationBoundary(AbstractBCPlacement): """Placement of boundary conditions on the simulation box boundary. Example ------- >>> bc_placement = SimulationBoundary(surfaces=["x-", "x+"]) """ surfaces: tuple[BoxSurface, ...] = pd.Field( ("x-", "x+", "y-", "y+", "z-", "z+"), title="Surfaces", description="Surfaces of simulation domain where to apply boundary conditions.", )
[docs] class StructureSimulationBoundary(AbstractBCPlacement): """Placement of boundary conditions on the simulation box boundary covered by the structure. Example ------- >>> bc_placement = StructureSimulationBoundary(structure="box", surfaces=["y-", "y+"]) """ structure: str = pd.Field( title="Structure Name", description="Name of the structure.", ) surfaces: tuple[BoxSurface, ...] = pd.Field( ("x-", "x+", "y-", "y+", "z-", "z+"), title="Surfaces", description="Surfaces of simulation domain where to apply boundary conditions.", )
BCPlacementType = Union[ StructureBoundary, StructureStructureInterface, MediumMediumInterface, SimulationBoundary, StructureSimulationBoundary, ]