use crate::boundary::BoxedBC;
use numra_core::Scalar;
#[derive(Clone)]
pub struct BoundaryConditions2D<S: Scalar> {
pub x_min: BoxedBC<S>,
pub x_max: BoxedBC<S>,
pub y_min: BoxedBC<S>,
pub y_max: BoxedBC<S>,
}
impl<S: Scalar> BoundaryConditions2D<S> {
pub fn all_zero_dirichlet() -> Self {
Self {
x_min: BoxedBC::dirichlet(S::ZERO),
x_max: BoxedBC::dirichlet(S::ZERO),
y_min: BoxedBC::dirichlet(S::ZERO),
y_max: BoxedBC::dirichlet(S::ZERO),
}
}
pub fn all_dirichlet(value: S) -> Self {
Self {
x_min: BoxedBC::dirichlet(value),
x_max: BoxedBC::dirichlet(value),
y_min: BoxedBC::dirichlet(value),
y_max: BoxedBC::dirichlet(value),
}
}
pub fn all_zero_neumann() -> Self {
Self {
x_min: BoxedBC::neumann(S::ZERO),
x_max: BoxedBC::neumann(S::ZERO),
y_min: BoxedBC::neumann(S::ZERO),
y_max: BoxedBC::neumann(S::ZERO),
}
}
}
#[derive(Clone)]
pub struct BoundaryConditions3D<S: Scalar> {
pub x_min: BoxedBC<S>,
pub x_max: BoxedBC<S>,
pub y_min: BoxedBC<S>,
pub y_max: BoxedBC<S>,
pub z_min: BoxedBC<S>,
pub z_max: BoxedBC<S>,
}
impl<S: Scalar> BoundaryConditions3D<S> {
pub fn all_zero_dirichlet() -> Self {
Self {
x_min: BoxedBC::dirichlet(S::ZERO),
x_max: BoxedBC::dirichlet(S::ZERO),
y_min: BoxedBC::dirichlet(S::ZERO),
y_max: BoxedBC::dirichlet(S::ZERO),
z_min: BoxedBC::dirichlet(S::ZERO),
z_max: BoxedBC::dirichlet(S::ZERO),
}
}
pub fn all_dirichlet(value: S) -> Self {
Self {
x_min: BoxedBC::dirichlet(value),
x_max: BoxedBC::dirichlet(value),
y_min: BoxedBC::dirichlet(value),
y_max: BoxedBC::dirichlet(value),
z_min: BoxedBC::dirichlet(value),
z_max: BoxedBC::dirichlet(value),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::boundary::BoundaryCondition;
#[test]
fn test_bc2d_all_zero_dirichlet() {
let bc = BoundaryConditions2D::<f64>::all_zero_dirichlet();
assert!(bc.x_min.is_dirichlet());
assert!(bc.x_max.is_dirichlet());
assert!(bc.y_min.is_dirichlet());
assert!(bc.y_max.is_dirichlet());
assert!((bc.x_min.value(0.0).unwrap()).abs() < 1e-10);
}
#[test]
fn test_bc2d_all_dirichlet() {
let bc = BoundaryConditions2D::all_dirichlet(5.0_f64);
assert!((bc.x_min.value(0.0).unwrap() - 5.0).abs() < 1e-10);
assert!((bc.y_max.value(0.0).unwrap() - 5.0).abs() < 1e-10);
}
#[test]
fn test_bc2d_all_zero_neumann() {
let bc = BoundaryConditions2D::<f64>::all_zero_neumann();
assert!(!bc.x_min.is_dirichlet());
assert!(!bc.y_max.is_dirichlet());
}
#[test]
fn test_bc3d_all_zero_dirichlet() {
let bc = BoundaryConditions3D::<f64>::all_zero_dirichlet();
assert!(bc.x_min.is_dirichlet());
assert!(bc.z_max.is_dirichlet());
assert!((bc.z_min.value(0.0).unwrap()).abs() < 1e-10);
}
}