pub mod dealiasing;
pub mod fft_operations;
pub mod solver;
pub use dealiasing::{DealiasingOperations, DealiasingStrategy};
pub use fft_operations::{FFTOperations, FFTResult};
pub use solver::SpectralNavierStokesSolver;
pub use solver::SpectralNavierStokesSolver as SpectralSolver;
#[cfg(test)]
mod tests {
use super::*;
use scirs2_core::ndarray::Array2;
#[test]
fn test_spectral_module_integration() {
let solver = SpectralNavierStokesSolver::new(
8,
8,
None,
2.0 * std::f64::consts::PI,
2.0 * std::f64::consts::PI,
None,
0.01,
0.001,
DealiasingStrategy::TwoThirds,
);
let vorticity = solver.initialize_taylor_green_vortex_2d();
assert_eq!(vorticity.dim(), (8, 8));
let _solver_none = SpectralNavierStokesSolver::new(
8,
8,
None,
2.0 * std::f64::consts::PI,
2.0 * std::f64::consts::PI,
None,
0.01,
0.001,
DealiasingStrategy::None,
);
let _solver_phase = SpectralNavierStokesSolver::new(
8,
8,
None,
2.0 * std::f64::consts::PI,
2.0 * std::f64::consts::PI,
None,
0.01,
0.001,
DealiasingStrategy::PhaseShift,
);
}
#[test]
fn test_fft_operations_integration() {
let field = Array2::ones((8, 8));
let field_hat = FFTOperations::fft_2d_forward(&field).expect("Operation failed");
assert_eq!(field_hat.dim(), (8, 8));
let recovered = FFTOperations::fft_2d_backward(&field_hat).expect("Operation failed");
assert_eq!(recovered.dim(), (8, 8));
let spectrum = FFTOperations::compute_energy_spectrum_2d(&field).expect("Operation failed");
assert!(!spectrum.is_empty());
}
#[test]
fn test_dealiasing_integration() {
let field = Array2::ones((8, 8));
let dealiased =
DealiasingOperations::apply_dealiasing_2d(&field, DealiasingStrategy::TwoThirds)
.expect("Operation failed");
assert_eq!(dealiased.dim(), field.dim());
let strategy = DealiasingOperations::recommend_strategy((64, 64), 1000.0, 0.95);
assert!(matches!(
strategy,
DealiasingStrategy::TwoThirds | DealiasingStrategy::ThreeHalves
));
}
#[test]
fn test_3d_solver_creation() {
let solver_3d = SpectralNavierStokesSolver::new(
8,
8,
Some(8),
2.0 * std::f64::consts::PI,
2.0 * std::f64::consts::PI,
Some(2.0 * std::f64::consts::PI),
0.01,
0.001,
DealiasingStrategy::TwoThirds,
);
let velocity_3d = solver_3d.initialize_taylor_green_vortex_3d();
assert_eq!(velocity_3d[0].dim(), (8, 8, 8));
assert_eq!(velocity_3d[1].dim(), (8, 8, 8));
assert_eq!(velocity_3d[2].dim(), (8, 8, 8));
}
#[test]
fn test_solver_parameters() {
let solver = SpectralNavierStokesSolver::new(
16,
32,
Some(8),
4.0,
6.0,
Some(2.0),
0.02,
0.0005,
DealiasingStrategy::PhaseShift,
);
assert_eq!(solver.nx, 16);
assert_eq!(solver.ny, 32);
assert_eq!(solver.nz, Some(8));
assert_eq!(solver.lx, 4.0);
assert_eq!(solver.ly, 6.0);
assert_eq!(solver.lz, Some(2.0));
assert_eq!(solver.nu, 0.02);
assert_eq!(solver.dt, 0.0005);
assert_eq!(solver.dealiasing, DealiasingStrategy::PhaseShift);
}
#[test]
fn test_default_dealiasing_strategy() {
let default_strategy = DealiasingStrategy::default();
assert_eq!(default_strategy, DealiasingStrategy::TwoThirds);
}
}