struct SphericalChannel<const N: usize> {
vector: [Jet<N>; 3],
k: Jet<N>,
kz: Jet<N>,
sine: Jet<N>,
cosine: Jet<N>,
azimuth: Jet<N>,
area: Jet<N>,
}Expand description
One diffraction channel of a 2D array of spheres in one direction: the plane wave
(qx, qy, ±kz) and the angles at which the multipole coefficients are evaluated,
as jets in the slots above.
Fields§
§vector: [Jet<N>; 3]The plane wavevector (qx, qy, ±kz): +kz on side 0, -kz on side 1.
k: Jet<N>Wavenumber of the medium on the chosen root, see SphericalChannel::new.
kz: Jet<N>Normal wavenumber sqrt(k^2 - q^2) with a positive imaginary part or a
nonnegative real value.
sine: Jet<N>sin(theta) with a nonnegative real part.
cosine: Jet<N>cos(theta) = ±kz / k.
azimuth: Jet<N>exp(i phi) = (qx + i qy) / |q|, or 1 at normal incidence.
area: Jet<N>Unit-cell area.
Implementations§
Source§impl<const N: usize> SphericalChannel<N>
impl<const N: usize> SphericalChannel<N>
Sourcefn new(
k: Complex,
q: [f64; 2],
side: usize,
area: f64,
fixed_q: bool,
) -> Result<Self>
fn new( k: Complex, q: [f64; 2], side: usize, area: f64, fixed_q: bool, ) -> Result<Self>
The channel of transverse wavevector q on side (0 up, 1 down).
k is the principal root of k^2, as upstream sw.periodic_to_pw computes
k = sqrt(kx^2 + ky^2 + kz^2), so a wavenumber with a negative real part gives the
same channel as its negative. kz = sqrt(k^2 - q^2) takes the root with a positive
imaginary part, or the nonnegative real root, as upstream kz_s: the wave decays
or propagates in its direction of travel. Upstream replaces kz = 0 by
1e-20 (1 + i); this returns an error when the computed kz is exactly zero.
Auto Trait Implementations§
impl<const N: usize> Freeze for SphericalChannel<N>
impl<const N: usize> RefUnwindSafe for SphericalChannel<N>
impl<const N: usize> Send for SphericalChannel<N>
impl<const N: usize> Sync for SphericalChannel<N>
impl<const N: usize> Unpin for SphericalChannel<N>
impl<const N: usize> UnwindSafe for SphericalChannel<N>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.