use std::f64::consts::PI;
use crate::{
bathymetry::ConstantSlope,
current::ConstantCurrent,
datatype::{Point, RayState, WaveNumber},
ray::ManyRays,
};
use crate::tests::helper::*;
#[test]
fn test_linear_beach_right() {
let bathymetry_data = ConstantSlope::builder()
.x0(0.0)
.y0(0.0)
.h0(100.0)
.dhdx(-0.05)
.dhdy(0.0)
.build()
.unwrap();
let current_data = ConstantCurrent::new(0.0, 0.0);
let k = 0.05;
let up_ray = RayState::new(
Point::new(0.0, 0.0),
WaveNumber::new(k * (PI / 6.0).cos(), k * (PI / 6.0).sin()),
);
let down_ray = RayState::new(
Point::new(0.0, 0.0),
WaveNumber::new(k * (-PI / 6.0).cos(), k * (-PI / 6.0).sin()),
);
let straight_ray = RayState::new(Point::new(0.0, 0.0), WaveNumber::new(k, 0.0));
let initial_rays = vec![up_ray, down_ray, straight_ray];
let waves = ManyRays::new(&bathymetry_data, ¤t_data, &initial_rays);
let results = waves.trace_many(0.0, 1_000.0, 1.0);
let mut results_iter = results.iter().flatten();
let up_result = results_iter.next().unwrap();
let down_result = results_iter.next().unwrap();
let straight_result = results_iter.next().unwrap();
assert!(results_iter.next().is_none());
let (_, data) = up_result.get();
assert!(increase(data, XINDEX));
assert!(increase(data, YINDEX));
assert!(same(data, KY_INDEX));
assert!(increase(data, KX_INDEX));
let (_, data) = down_result.get();
assert!(increase(data, XINDEX));
assert!(decrease(data, YINDEX));
assert!(same(data, KY_INDEX));
assert!(increase(data, KX_INDEX));
let (_, data) = straight_result.get();
assert!(increase(data, XINDEX));
assert!(same(data, YINDEX));
assert!(same(data, KY_INDEX));
assert!(increase(data, KX_INDEX));
}
#[test]
fn test_linear_beach_left() {
let bathymetry_data = ConstantSlope::builder()
.x0(0.0)
.y0(0.0)
.h0(0.0)
.dhdx(0.05)
.dhdy(0.0)
.build()
.unwrap();
let current_data = ConstantCurrent::new(0.0, 0.0);
let k = 0.05;
let up_ray = RayState::new(
Point::new(2_000.0, 0.0),
WaveNumber::new(-k * (PI / 6.0).cos(), k * (PI / 6.0).sin()),
);
let down_ray = RayState::new(
Point::new(2_000.0, 0.0),
WaveNumber::new(-k * (-PI / 6.0).cos(), k * (-PI / 6.0).sin()),
);
let straight_ray = RayState::new(Point::new(2_000.0, 100.0), WaveNumber::new(-k, 0.0));
let initial_rays = vec![up_ray, down_ray, straight_ray];
let waves = ManyRays::new(&bathymetry_data, ¤t_data, &initial_rays);
let results = waves.trace_many(0.0, 1_000.0, 1.0);
let mut results_iter = results.iter().flatten();
let up_result = results_iter.next().unwrap();
let down_result = results_iter.next().unwrap();
let straight_result = results_iter.next().unwrap();
assert!(results_iter.next().is_none());
let (_, data) = up_result.get();
assert!(decrease(data, XINDEX));
assert!(increase(data, YINDEX));
assert!(same(data, KY_INDEX));
assert!(decrease(data, KX_INDEX));
let (_, data) = down_result.get();
assert!(decrease(data, XINDEX));
assert!(decrease(data, YINDEX));
assert!(same(data, KY_INDEX));
assert!(decrease(data, KX_INDEX));
let (_, data) = straight_result.get();
assert!(decrease(data, XINDEX));
assert!(same(data, YINDEX));
assert!(same(data, KY_INDEX));
assert!(decrease(data, KX_INDEX));
}
#[test]
fn test_linear_beach_top() {
let bathymetry_data = ConstantSlope::builder()
.x0(0.0)
.y0(0.0)
.h0(100.0)
.dhdx(0.0)
.dhdy(-0.05)
.build()
.unwrap();
let current_data = ConstantCurrent::new(0.0, 0.0);
let k = 0.05;
let left_ray = RayState::new(
Point::new(0.0, 0.0),
WaveNumber::new(k * (4.0 * PI / 6.0).cos(), k * (4.0 * PI / 6.0).sin()),
);
let right_ray = RayState::new(
Point::new(0.0, 0.0),
WaveNumber::new(k * (2.0 * PI / 6.0).cos(), k * (2.0 * PI / 6.0).sin()),
);
let vertical_ray = RayState::new(Point::new(100.0, 0.0), WaveNumber::new(0.0, k));
let initial_rays = vec![left_ray, right_ray, vertical_ray];
let waves = ManyRays::new(&bathymetry_data, ¤t_data, &initial_rays);
let results = waves.trace_many(0.0, 1_000.0, 1.0);
let mut results_iter = results.iter().flatten();
let left_result = results_iter.next().unwrap();
let right_result = results_iter.next().unwrap();
let vertical_result = results_iter.next().unwrap();
assert!(results_iter.next().is_none());
let (_, data) = left_result.get();
assert!(decrease(data, XINDEX));
assert!(increase(data, YINDEX));
assert!(same(data, KX_INDEX));
assert!(increase(data, KY_INDEX));
let (_, data) = right_result.get();
assert!(increase(data, XINDEX));
assert!(increase(data, YINDEX));
assert!(same(data, KX_INDEX));
assert!(increase(data, KY_INDEX));
let (_, data) = vertical_result.get();
assert!(same(data, XINDEX));
assert!(increase(data, YINDEX));
assert!(same(data, KX_INDEX));
assert!(increase(data, KY_INDEX));
}
#[test]
fn test_linear_beach_bottom() {
let bathymetry_data = ConstantSlope::builder()
.x0(0.0)
.y0(0.0)
.h0(0.0)
.dhdx(0.0)
.dhdy(0.05)
.build()
.unwrap();
let current_data = ConstantCurrent::new(0.0, 0.0);
let k = 0.05;
let left_ray = RayState::new(
Point::new(0.0, 2_000.0),
WaveNumber::new(k * (4.0 * PI / 6.0).cos(), -k * (4.0 * PI / 6.0).sin()),
);
let right_ray = RayState::new(
Point::new(0.0, 2_000.0),
WaveNumber::new(k * (2.0 * PI / 6.0).cos(), -k * (2.0 * PI / 6.0).sin()),
);
let vertical_ray = RayState::new(Point::new(100.0, 2_000.0), WaveNumber::new(0.0, -k));
let initial_rays = vec![left_ray, right_ray, vertical_ray];
let waves = ManyRays::new(&bathymetry_data, ¤t_data, &initial_rays);
let results = waves.trace_many(0.0, 1_000.0, 1.0);
let mut results_iter = results.iter().flatten();
let left_result = results_iter.next().unwrap();
let right_result = results_iter.next().unwrap();
let vertical_result = results_iter.next().unwrap();
assert!(results_iter.next().is_none());
let (_, data) = left_result.get();
assert!(decrease(data, XINDEX));
assert!(decrease(data, YINDEX));
assert!(same(data, KX_INDEX));
assert!(decrease(data, KY_INDEX));
let (_, data) = right_result.get();
assert!(increase(data, XINDEX));
assert!(decrease(data, YINDEX));
assert!(same(data, KX_INDEX));
assert!(decrease(data, KY_INDEX));
let (_, data) = vertical_result.get();
assert!(same(data, XINDEX));
assert!(decrease(data, YINDEX));
assert!(same(data, KX_INDEX));
assert!(decrease(data, KY_INDEX));
}