Source code for magpylib_jax.current.polyline
"""Differentiable polyline current source."""
from __future__ import annotations
import jax.numpy as jnp
from magpylib_jax._types import ArrayLike
from magpylib_jax.core.base import BaseSource, MagpylibMissingInput
[docs]
class Polyline(BaseSource):
"""Piecewise-linear current path through `vertices`."""
_source_type = "polyline"
def __init__(
self,
current: ArrayLike | None = None,
vertices: ArrayLike | None = None,
position: ArrayLike = (0.0, 0.0, 0.0),
orientation: ArrayLike | None = None,
style=None,
style_label: str | None = None,
**kwargs,
) -> None:
self.current = current
self.vertices = vertices
super().__init__(
position=position,
orientation=orientation,
style=style,
style_label=style_label,
**kwargs,
)
@property
def _segments(self) -> tuple[jnp.ndarray, jnp.ndarray]:
if self.vertices is None:
raise MagpylibMissingInput("Input vertices of Polyline must be set.")
verts = jnp.asarray(self.vertices, dtype=float)
if verts.ndim != 2 or verts.shape[0] < 2 or verts.shape[1] != 3:
raise ValueError("`vertices` must have shape (n>=2, 3).")
return verts[:-1], verts[1:]
@property
def centroid(self) -> jnp.ndarray:
if self.vertices is None:
return jnp.asarray(self.position, dtype=float)
verts = jnp.asarray(self.vertices, dtype=float)
return jnp.mean(verts, axis=0) + jnp.asarray(self.position, dtype=float)
@property
def volume(self) -> float:
return 0.0
def _require_inputs(self) -> None:
if self.vertices is None:
raise MagpylibMissingInput("Input vertices of Polyline must be set.")
if self.current is None:
raise MagpylibMissingInput("Input current of Polyline must be set.")
def _field_kwargs(self) -> dict:
"""Geometry + excitation arguments for the field engine."""
seg_start, seg_end = self._segments
return {
"segment_start": seg_start,
"segment_end": seg_end,
"current": self.current,
}