use crate::math::array::Array;
pub trait FdmLinearOp {
fn apply(&self, r: &Array) -> Array;
}
#[cfg(test)]
mod tests {
use super::*;
use crate::methods::finitedifferences::operators::FdmLinearOpLayout;
use crate::types::Size;
struct ShiftUp {
layout: FdmLinearOpLayout,
direction: Size,
}
impl FdmLinearOp for ShiftUp {
fn apply(&self, r: &Array) -> Array {
let mut result = Array::with_size(r.size());
for position in self.layout.iter() {
result[position.index()] =
r[self.layout.neighbourhood(&position, self.direction, 1)];
}
result
}
}
#[test]
fn apply_reads_grid_values_through_the_layout() {
let layout = FdmLinearOpLayout::new(vec![3, 2]);
let values = Array::incremental(layout.size(), 0.0, 1.0);
let op = ShiftUp {
layout,
direction: 0,
};
let shifted = op.apply(&values);
assert_eq!(shifted, Array::from([1.0, 2.0, 1.0, 4.0, 5.0, 4.0]));
}
}