Source code for magpylib_jax.magnet.sphere
"""Differentiable sphere magnet source."""
from __future__ import annotations
import jax.numpy as jnp
from magpylib_jax._types import ArrayLike
from magpylib_jax.constants import MU0
from magpylib_jax.core.base import BaseSource, MagpylibMissingInput
[docs]
class Sphere(BaseSource):
"""Homogeneously polarized sphere with scalar diameter."""
_source_type = "sphere"
def __init__(
self,
diameter: ArrayLike | None = None,
polarization: ArrayLike | None = None,
magnetization: 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.diameter = diameter
self.polarization = polarization
self.magnetization = magnetization
super().__init__(
position=position,
orientation=orientation,
style=style,
style_label=style_label,
**kwargs,
)
@property
def _polarization(self) -> jnp.ndarray:
if self.polarization is not None:
return jnp.asarray(self.polarization, dtype=float)
if self.magnetization is not None:
return MU0 * jnp.asarray(self.magnetization, dtype=float)
raise MagpylibMissingInput("Input polarization of Sphere must be set.")
@property
def volume(self) -> float:
if self.diameter is None:
return 0.0
d = float(jnp.asarray(self.diameter, dtype=float))
return float((4.0 / 3.0) * jnp.pi * (d / 2.0) ** 3)
@property
def centroid(self) -> jnp.ndarray:
return jnp.asarray(self.position, dtype=float)
def _require_inputs(self) -> None:
if self.diameter is None:
raise MagpylibMissingInput("Input diameter of Sphere must be set.")
if self.polarization is None and self.magnetization is None:
raise MagpylibMissingInput("Input polarization of Sphere must be set.")
def _field_kwargs(self) -> dict:
"""Geometry + excitation arguments for the field engine."""
return {"diameter": self.diameter, "polarization": self._polarization}