use scirs2_core::constants::PI;
use scirs2_core::ndarray::Array2;
use super::super::core::FluidState;
pub fn lid_driven_cavity(nx: usize, ny: usize, lidvelocity: f64) -> FluidState {
let mut u = Array2::zeros((ny, nx));
let v = Array2::zeros((ny, nx));
for i in 0..nx {
u[[ny - 1, i]] = lidvelocity;
}
let pressure = Array2::zeros((ny, nx));
let dx = 1.0 / (nx - 1) as f64;
let dy = 1.0 / (ny - 1) as f64;
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}
pub fn taylor_green_vortex(nx: usize, ny: usize, a: f64, b: f64) -> FluidState {
let dx = 2.0 * PI / (nx - 1) as f64;
let dy = 2.0 * PI / (ny - 1) as f64;
let mut u = Array2::zeros((ny, nx));
let mut v = Array2::zeros((ny, nx));
let mut pressure = Array2::zeros((ny, nx));
for j in 0..ny {
for i in 0..nx {
let x = i as f64 * dx;
let y = j as f64 * dy;
u[[j, i]] = a * (x / a).cos() * (y / b).sin();
v[[j, i]] = -b * (x / a).sin() * (y / b).cos();
pressure[[j, i]] = -0.25 * ((2.0 * x / a).cos() + (2.0 * y / b).cos());
}
}
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}
pub fn poiseuille_flow(nx: usize, ny: usize, maxvelocity: f64) -> FluidState {
let mut u = Array2::zeros((ny, nx));
let v = Array2::zeros((ny, nx));
let dx = 1.0 / (nx - 1) as f64;
let dy = 1.0 / (ny - 1) as f64;
for j in 0..ny {
for i in 0..nx {
let y_normalized = j as f64 / (ny - 1) as f64; let y_centered = y_normalized - 0.5;
u[[j, i]] = maxvelocity * (0.25 - y_centered * y_centered) * 4.0;
}
}
let pressure = Array2::zeros((ny, nx));
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}
pub fn channel_flow(nx: usize, ny: usize, inletvelocity: f64) -> FluidState {
let mut u = Array2::zeros((ny, nx));
let v = Array2::zeros((ny, nx));
let dx = 1.0 / (nx - 1) as f64;
let dy = 1.0 / (ny - 1) as f64;
for j in 1..ny - 1 {
for i in 0..nx {
u[[j, i]] = inletvelocity;
}
}
let pressure = Array2::zeros((ny, nx));
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}
pub fn couette_flow(nx: usize, ny: usize, wallvelocity: f64) -> FluidState {
let mut u = Array2::zeros((ny, nx));
let v = Array2::zeros((ny, nx));
let dx = 1.0 / (nx - 1) as f64;
let dy = 1.0 / (ny - 1) as f64;
for j in 0..ny {
for i in 0..nx {
let y_normalized = j as f64 / (ny - 1) as f64; u[[j, i]] = wallvelocity * y_normalized;
}
}
let pressure = Array2::zeros((ny, nx));
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}
pub fn stagnation_point_flow(nx: usize, ny: usize, strength: f64) -> FluidState {
let mut u = Array2::zeros((ny, nx));
let mut v = Array2::zeros((ny, nx));
let dx = 1.0 / (nx - 1) as f64;
let dy = 1.0 / (ny - 1) as f64;
for j in 0..ny {
for i in 0..nx {
let x = (i as f64 / (nx - 1) as f64 - 0.5) * 2.0; let y = (j as f64 / (ny - 1) as f64 - 0.5) * 2.0;
u[[j, i]] = strength * x;
v[[j, i]] = -strength * y;
}
}
let pressure = Array2::zeros((ny, nx));
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}
pub fn vortex_pair(nx: usize, ny: usize, vortexstrength: f64, separation: f64) -> FluidState {
let mut u = Array2::zeros((ny, nx));
let mut v = Array2::zeros((ny, nx));
let dx = 1.0 / (nx - 1) as f64;
let dy = 1.0 / (ny - 1) as f64;
let center1_x = 0.5 - separation * 0.5;
let center1_y = 0.5;
let center2_x = 0.5 + separation * 0.5;
let center2_y = 0.5;
for j in 0..ny {
for i in 0..nx {
let x = i as f64 / (nx - 1) as f64;
let y = j as f64 / (ny - 1) as f64;
let dx1 = x - center1_x;
let dy1 = y - center1_y;
let r1_sq = dx1 * dx1 + dy1 * dy1;
let r1 = r1_sq.sqrt();
let dx2 = x - center2_x;
let dy2 = y - center2_y;
let r2_sq = dx2 * dx2 + dy2 * dy2;
let r2 = r2_sq.sqrt();
if r1 > 1e-10 {
u[[j, i]] +=
vortexstrength * (-dy1) / (2.0 * PI * r1_sq) * (1.0 - (-r1_sq * 10.0).exp());
v[[j, i]] +=
vortexstrength * dx1 / (2.0 * PI * r1_sq) * (1.0 - (-r1_sq * 10.0).exp());
}
if r2 > 1e-10 {
u[[j, i]] +=
-vortexstrength * (-dy2) / (2.0 * PI * r2_sq) * (1.0 - (-r2_sq * 10.0).exp());
v[[j, i]] +=
-vortexstrength * dx2 / (2.0 * PI * r2_sq) * (1.0 - (-r2_sq * 10.0).exp());
}
}
}
let pressure = Array2::zeros((ny, nx));
FluidState {
velocity: vec![u, v],
pressure,
temperature: None,
time: 0.0,
dx,
dy,
}
}