use crate::fields::field::Field;
use crate::primitives::{SymmTensor, Tensor, Vector3};
#[derive(Debug, Clone)]
pub enum BoundaryCondition<T: Clone> {
FixedValue(T),
FixedField(Field<T>),
ZeroGradient,
Symmetry,
Empty,
Calculated(Field<T>),
}
impl<T: Clone + Default> BoundaryCondition<T> {
pub fn is_fixed_value(&self) -> bool {
matches!(self, Self::FixedValue(_) | Self::FixedField(_))
}
}
#[derive(Debug, Clone)]
pub struct PatchField<T: Clone> {
pub bc: BoundaryCondition<T>,
pub values: Field<T>,
}
impl PatchField<f64> {
pub fn fixed_value(size: usize, v: f64) -> Self {
Self {
bc: BoundaryCondition::FixedValue(v),
values: Field::uniform(size, v),
}
}
pub fn zero_gradient(size: usize) -> Self {
Self {
bc: BoundaryCondition::ZeroGradient,
values: Field::zeros(size),
}
}
pub fn empty() -> Self {
Self {
bc: BoundaryCondition::Empty,
values: Field::new(vec![]),
}
}
}
impl PatchField<Vector3> {
pub fn fixed_value_vec(size: usize, v: Vector3) -> Self {
Self {
bc: BoundaryCondition::FixedValue(v),
values: Field::uniform(size, v),
}
}
pub fn zero_gradient_vec(size: usize) -> Self {
Self {
bc: BoundaryCondition::ZeroGradient,
values: Field::zero_vec(size),
}
}
pub fn empty_vec() -> Self {
Self {
bc: BoundaryCondition::Empty,
values: Field::new(vec![]),
}
}
}
impl PatchField<Tensor> {
pub fn fixed_value_tensor(size: usize, v: Tensor) -> Self {
Self {
bc: BoundaryCondition::FixedValue(v),
values: Field::uniform(size, v),
}
}
pub fn zero_gradient_tensor(size: usize) -> Self {
Self {
bc: BoundaryCondition::ZeroGradient,
values: Field::uniform(size, Tensor::ZERO),
}
}
}
impl PatchField<SymmTensor> {
pub fn fixed_value_symm_tensor(size: usize, v: SymmTensor) -> Self {
Self {
bc: BoundaryCondition::FixedValue(v),
values: Field::uniform(size, v),
}
}
pub fn zero_gradient_symm_tensor(size: usize) -> Self {
Self {
bc: BoundaryCondition::ZeroGradient,
values: Field::uniform(size, SymmTensor::ZERO),
}
}
}