Skip to main content

conspire/domain/fem/block/surface/
mod.rs

1use crate::{
2    fem::{
3        NodalReferenceCoordinates,
4        block::{Block, element::ElementNodalReferenceCoordinates},
5    },
6    math::Scalar,
7};
8
9const M: usize = 2;
10
11pub trait SurfaceElements<C, F, const G: usize, const N: usize>
12where
13    Self: for<'a> From<(C, Vec<[usize; N]>, &'a NodalReferenceCoordinates<3>, Scalar)>,
14{
15}
16
17impl<C, F, const G: usize, const N: usize, const P: usize>
18    From<(C, Vec<[usize; N]>, &NodalReferenceCoordinates<3>, Scalar)> for Block<C, F, G, M, N, P>
19where
20    F: From<(ElementNodalReferenceCoordinates<N>, Scalar)>,
21{
22    fn from(
23        (constitutive_model, connectivity, coordinates, thickness): (
24            C,
25            Vec<[usize; N]>,
26            &NodalReferenceCoordinates<3>,
27            Scalar,
28        ),
29    ) -> Self {
30        let elements = connectivity
31            .iter()
32            .map(|nodes| {
33                <F>::from((
34                    nodes
35                        .iter()
36                        .map(|&node| coordinates[node].clone())
37                        .collect(),
38                    thickness,
39                ))
40            })
41            .collect();
42        let connectivity = connectivity.into();
43        Self {
44            constitutive_model,
45            connectivity,
46            elements,
47        }
48    }
49}
50
51impl<C, F, const G: usize, const N: usize, const P: usize> SurfaceElements<C, F, G, N>
52    for Block<C, F, G, M, N, P>
53where
54    F: From<(ElementNodalReferenceCoordinates<N>, Scalar)>,
55{
56}