Source code for tdgl.fluxoid

from typing import Dict, List, NamedTuple, Optional, Union

import numpy as np
import pint

from .device.device import Device


[docs]class Fluxoid(NamedTuple): """The fluxoid for a closed region :math:`S` with boundary :math:`\\partial S` is defined as: .. math:: \\begin{split} \\Phi^f_S &= \\Phi^f_{S,\\text{ flux}} + \\Phi^f_{S,\\text{ supercurrent}} \\\\&=\\int_S \\mu_0 H_z(\\mathbf{r})\\,\\mathrm{d}^2r + \\oint_{\\partial S} \\mu_0\\Lambda(\\mathbf{r})\\mathbf{K}_s(\\mathbf{r})\\cdot\\mathrm{d}\\mathbf{r} \\\\&=\\oint_{\\partial S} \\mathbf{A}(\\mathbf{r})\\cdot\\mathrm{d}\\mathbf{r} + \\oint_{\\partial S} \\mu_0\\Lambda(\\mathbf{r})\\mathbf{K}_s(\\mathbf{r})\\cdot\\mathrm{d}\\mathbf{r} \\end{split} Args: flux_part: :math:`\\int_S \\mu_0 H_z(\\mathbf{r})\\,\\mathrm{d}^2r=\\oint_{\\partial S}\\mathbf{A}(\\mathbf{r})\\cdot\\mathrm{d}\\mathbf{r}`. supercurrent_part: :math:`\\oint_{\\partial S}\\mu_0\\Lambda(\\mathbf{r})\\mathbf{K}_s(\\mathbf{r})\\cdot\\mathrm{d}\\mathbf{r}`. """ flux_part: Union[float, pint.Quantity] supercurrent_part: Union[float, pint.Quantity]
[docs]def make_fluxoid_polygons( device: Device, holes: Optional[Union[List[str], str]] = None, join_style: str = "mitre", interp_points: Optional[int] = None, ) -> Dict[str, np.ndarray]: """Generates polygons enclosing the given holes to calculate the fluxoid. Args: device: The Device for which to generate polygons. holes: Name(s) of the hole(s) in the device for which to generate polygons. Defaults to all holes in the device. join_style: See :meth:`tdgl.Polygon.buffer`. interp_points: If provided, the resulting polygons will be interpolated to ``interp_points`` vertices. Returns: A dict of ``{hole_name: fluxoid_polygon}``. """ device_polygons = [device.film] + device.holes device_holes = {hole.name: hole for hole in device.holes} if holes is None: holes = list(device_holes) if isinstance(holes, str): holes = [holes] polygons = {} for name in holes: hole = device_holes[name] hole_poly = hole.polygon min_dist = min( hole_poly.exterior.distance(other.polygon.exterior) for other in device_polygons if other.name != name ) delta = min_dist / 2 new_poly = hole.buffer(delta, join_style=join_style) if interp_points: new_poly = new_poly.resample(interp_points) polygons[name] = new_poly.points return polygons