conspire 0.7.1

The Rust interface to conspire.
Documentation
use crate::{
    fem::{
        NodalReferenceCoordinates,
        block::{Block, element::ElementNodalReferenceCoordinates},
    },
    math::Scalar,
};

const M: usize = 2;

pub trait SurfaceElements<C, F, const G: usize, const N: usize>
where
    Self: for<'a> From<(C, Vec<[usize; N]>, &'a NodalReferenceCoordinates<3>, Scalar)>,
{
}

impl<C, F, const G: usize, const N: usize, const P: usize>
    From<(C, Vec<[usize; N]>, &NodalReferenceCoordinates<3>, Scalar)> for Block<C, F, G, M, N, P>
where
    F: From<(ElementNodalReferenceCoordinates<N>, Scalar)>,
{
    fn from(
        (constitutive_model, connectivity, coordinates, thickness): (
            C,
            Vec<[usize; N]>,
            &NodalReferenceCoordinates<3>,
            Scalar,
        ),
    ) -> Self {
        let elements = connectivity
            .iter()
            .map(|nodes| {
                <F>::from((
                    nodes
                        .iter()
                        .map(|&node| coordinates[node].clone())
                        .collect(),
                    thickness,
                ))
            })
            .collect();
        let connectivity = connectivity.into();
        Self {
            constitutive_model,
            connectivity,
            elements,
        }
    }
}

impl<C, F, const G: usize, const N: usize, const P: usize> SurfaceElements<C, F, G, N>
    for Block<C, F, G, M, N, P>
where
    F: From<(ElementNodalReferenceCoordinates<N>, Scalar)>,
{
}