Skip to main content

conspire/math/tensor/rank_2/vec/
mod.rs

1use crate::math::{Tensor, TensorRank0, assert::FiniteDifference};
2use crate::math::{TensorArray, TensorRank2, tensor::vec::TensorVector};
3use crate::units::Dimensionless;
4
5/// A vector of rank-2 tensors.
6pub type TensorRank2Vec<const D: usize, I, J, U = Dimensionless> =
7    TensorVector<TensorRank2<D, I, J, U>>;
8
9impl<const D: usize, I, J, U> TensorRank2Vec<D, I, J, U> {
10    pub fn zero(len: usize) -> Self {
11        (0..len).map(|_| TensorRank2::zero()).collect()
12    }
13}
14
15impl<const D: usize, I, J, U> FiniteDifference for TensorRank2Vec<D, I, J, U> {
16    fn error_fd(&self, comparator: &Self, epsilon: TensorRank0) -> Option<(bool, usize)> {
17        let error_count = self
18            .iter()
19            .zip(comparator.iter())
20            .map(|(self_a, comparator_a)| {
21                self_a
22                    .iter()
23                    .zip(comparator_a.iter())
24                    .map(|(self_a_i, comparator_a_i)| {
25                        self_a_i
26                            .iter()
27                            .zip(comparator_a_i.iter())
28                            .filter(|&(&self_a_ij, &comparator_a_ij)| {
29                                self_a_ij.differs(comparator_a_ij, epsilon)
30                            })
31                            .count()
32                    })
33                    .sum::<usize>()
34            })
35            .sum();
36        if error_count > 0 {
37            Some((true, error_count))
38        } else {
39            None
40        }
41    }
42}