use crate::wave_ray_path::State;
#[derive(Clone, Debug)]
pub(crate) struct Point<T> {
x: T,
y: T,
}
#[allow(dead_code)]
impl<T> Point<T> {
pub(crate) fn new(x: T, y: T) -> Self {
Point { x, y }
}
pub(crate) fn x(&self) -> &T {
&self.x
}
pub(crate) fn y(&self) -> &T {
&self.y
}
}
pub(crate) struct Coordinate<T> {
lat: T,
lon: T,
}
#[allow(dead_code)]
impl<T> Coordinate<T> {
fn new(lat: T, lon: T) -> Self {
Coordinate { lat, lon }
}
fn lat(&self) -> &T {
&self.lat
}
fn lon(&self) -> &T {
&self.lon
}
}
#[allow(dead_code)]
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct Current<T> {
u: T,
v: T,
}
#[allow(dead_code)]
impl<T> Current<T> {
pub(crate) fn new(u: T, v: T) -> Self {
Current { u, v }
}
pub(crate) fn u(&self) -> &T {
&self.u
}
pub(crate) fn v(&self) -> &T {
&self.v
}
}
#[allow(dead_code)]
#[derive(Clone, Debug)]
pub(crate) struct WaveNumber<T> {
kx: T,
ky: T,
}
#[allow(dead_code)]
impl<T> WaveNumber<T> {
pub(crate) fn new(kx: T, ky: T) -> Self {
WaveNumber { kx, ky }
}
pub(crate) fn kx(&self) -> &T {
&self.kx
}
pub(crate) fn ky(&self) -> &T {
&self.ky
}
}
#[allow(dead_code)]
#[derive(Clone, Debug)]
pub(crate) struct RayState<T> {
point: Point<T>,
wave_number: WaveNumber<T>,
}
impl<T> RayState<T> {
pub(crate) fn new(point: Point<T>, wave_number: WaveNumber<T>) -> Self {
RayState { point, wave_number }
}
fn point(&self) -> &Point<T> {
&self.point
}
pub(crate) fn wave_number(&self) -> &WaveNumber<T> {
&self.wave_number
}
}
impl From<RayState<f64>> for State {
fn from(value: RayState<f64>) -> Self {
State::new(
*value.point().x(),
*value.point().y(),
*value.wave_number().kx(),
*value.wave_number().ky(),
)
}
}
#[derive(Clone, Debug)]
pub(crate) struct Ray<T> {
time: Vec<f32>,
state: Vec<RayState<T>>,
depth: Vec<f32>,
current: Vec<Current<T>>,
}
#[allow(dead_code)]
impl<T> Ray<T> {
fn new() -> Self {
Ray {
time: Vec::new(),
state: Vec::new(),
depth: Vec::new(),
current: Vec::new(),
}
}
fn push(&mut self, time: f32, state: RayState<T>, depth: f32, current: Current<T>) {
self.time.push(time);
self.state.push(state);
self.depth.push(depth);
self.current.push(current);
}
}
#[cfg(test)]
mod test_ray {
use super::*;
#[test]
fn test_new() {
let ray: Ray<f32> = Ray::new();
assert_eq!(ray.time.len(), 0);
assert_eq!(ray.state.len(), 0);
assert_eq!(ray.depth.len(), 0);
assert_eq!(ray.current.len(), 0);
}
#[test]
fn test_push() {
let mut ray: Ray<f32> = Ray::new();
let point = Point::new(1.0, 2.0);
let wave_number = WaveNumber { kx: 3.0, ky: 4.0 };
let current = Current::new(5.0, 6.0);
ray.push(0.0, RayState { point, wave_number }, 100.0, current);
assert_eq!(ray.time.len(), 1);
assert_eq!(ray.state.len(), 1);
assert_eq!(ray.depth.len(), 1);
assert_eq!(ray.current.len(), 1);
}
}
pub(crate) struct Bundle<T> {
rays: Vec<Ray<T>>,
}
#[allow(dead_code)]
impl<T> Bundle<T> {
fn new() -> Self {
Bundle { rays: Vec::new() }
}
fn push(&mut self, ray: Ray<T>) {
self.rays.push(ray);
}
}
#[derive(Debug, PartialEq)]
pub(crate) struct Gradient<T> {
dx: T,
dy: T,
}
impl<T> Gradient<T> {
pub(crate) fn new(dx: T, dy: T) -> Self {
Gradient { dx, dy }
}
pub(crate) fn dx(&self) -> &T {
&self.dx
}
pub(crate) fn dy(&self) -> &T {
&self.dy
}
}