pub mod advanced_models;
pub mod les;
pub mod models;
pub mod rans;
pub use models::{
RANSModel as RANSModelTrait, SGSModel as SGSModelTrait, TurbulenceConstants, TurbulenceModel,
TurbulenceModelType, TurbulenceUtils,
};
pub use advanced_models::{
AdvancedTurbulenceModel, SpalartAllmarasConstants, SpalartAllmarasModel,
};
pub use les::{FluidState3D, LESolver, SGSModel};
pub use rans::{RANSModel, RANSSolver, RANSState};
#[cfg(test)]
mod tests {
use super::*;
use scirs2_core::ndarray::Array3;
#[test]
fn test_turbulence_module_exports() {
let _model_type = TurbulenceModelType::KEpsilon;
let _constants = TurbulenceConstants::default();
let _sgs_model = SGSModel::Smagorinsky;
let _rans_model = RANSModel::KEpsilon;
}
#[test]
fn test_rans_integration() {
let solver = RANSSolver::new(8, 8, RANSModel::KEpsilon, 1000.0);
let state = RANSState::new(8, 8, 0.1, 0.1);
assert_eq!(solver.nx, 8);
assert_eq!(state.mean_velocity.len(), 2);
}
#[test]
fn test_les_integration() {
let solver = LESolver::new(4, 4, 4, 0.1, 0.1, 0.1, SGSModel::Vreman);
let velocity = vec![
Array3::zeros((4, 4, 4)),
Array3::zeros((4, 4, 4)),
Array3::zeros((4, 4, 4)),
];
let state = FluidState3D {
velocity,
pressure: Array3::zeros((4, 4, 4)),
dx: 0.1,
dy: 0.1,
dz: 0.1,
};
assert_eq!(solver.nx, 4);
assert_eq!(state.velocity.len(), 3);
}
#[test]
fn test_advanced_model_integration() {
let model = AdvancedTurbulenceModel::new(TurbulenceModelType::KOmega, 4, 4, 4);
let sa_model = SpalartAllmarasModel::new(4, 4, 4);
assert_eq!(model.model_type, TurbulenceModelType::KOmega);
assert_eq!(sa_model.nu_tilde.dim(), (4, 4, 4));
}
#[test]
fn test_turbulence_utils() {
let velocity = vec![
Array3::ones((4, 4, 4)),
Array3::zeros((4, 4, 4)),
Array3::zeros((4, 4, 4)),
];
let strain_mag = TurbulenceUtils::compute_strain_rate_magnitude(&velocity, 0.1, 0.1, 0.1);
assert!(strain_mag.is_ok());
let vorticity_mag = TurbulenceUtils::compute_vorticity_magnitude(&velocity, 0.1, 0.1, 0.1);
assert!(vorticity_mag.is_ok());
let wall_distance = TurbulenceUtils::compute_wall_distance(4, 4, 4);
assert_eq!(wall_distance.dim(), (4, 4, 4));
}
#[test]
fn test_comprehensive_workflow() {
let rans_solver = RANSSolver::new(6, 6, RANSModel::KOmegaSST, 2000.0);
let rans_state = RANSState::lid_driven_cavity(6, 6, 0.1, 0.1, 1.0);
let les_solver = LESolver::new(6, 6, 6, 0.1, 0.1, 0.1, SGSModel::DynamicSmagorinsky);
let advanced_model = AdvancedTurbulenceModel::new(TurbulenceModelType::KEpsilon, 6, 6, 6);
assert_eq!(rans_solver.model_type(), TurbulenceModelType::KOmegaSST);
assert_eq!(les_solver.sgs_model, SGSModel::DynamicSmagorinsky);
assert_eq!(advanced_model.model_type, TurbulenceModelType::KEpsilon);
assert!(rans_state.turbulent_kinetic_energy[[3, 3]] > 0.0);
}
#[test]
fn test_boundary_conditions_integration() {
let mut k = Array3::from_elem((4, 4, 4), 1.0);
let mut epsilon = Array3::from_elem((4, 4, 4), 1.0);
let advanced_model = AdvancedTurbulenceModel::new(TurbulenceModelType::KEpsilon, 4, 4, 4);
let result = advanced_model.apply_turbulence_boundary_conditions(&mut k, &mut epsilon);
assert!(result.is_ok());
assert_eq!(k[[0, 0, 0]], 0.0);
assert_eq!(epsilon[[0, 0, 0]], 1e6);
}
}