conspire/domain/fem/block/surface/
mod.rs1use 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}