Skip to main content

conspire/domain/cbm/block/
mod.rs

1pub mod node;
2pub mod solid;
3#[cfg(test)]
4mod test;
5
6use crate::{
7    domain::{
8        NodalReferenceCoordinates,
9        block::{add_node_neighbors, element::Elements},
10    },
11    geometry::mesh::PrimitiveConnectivity,
12};
13use node::{Node, Weighting};
14use std::fmt::{self, Debug, Formatter};
15
16pub struct Block<C> {
17    constitutive_model: C,
18    connectivity: PrimitiveConnectivity<3, 4>,
19    nodes: Vec<Node>,
20}
21
22impl<C> Debug for Block<C> {
23    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
24        write!(f, "Block {{ {} particles }}", self.nodes.len())
25    }
26}
27
28impl<C>
29    From<(
30        C,
31        PrimitiveConnectivity<3, 4>,
32        &NodalReferenceCoordinates<3>,
33    )> for Block<C>
34{
35    fn from(
36        (constitutive_model, connectivity, reference_coordinates): (
37            C,
38            PrimitiveConnectivity<3, 4>,
39            &NodalReferenceCoordinates<3>,
40        ),
41    ) -> Self {
42        Self::from((
43            constitutive_model,
44            connectivity,
45            reference_coordinates,
46            Weighting::default(),
47        ))
48    }
49}
50
51impl<C>
52    From<(
53        C,
54        PrimitiveConnectivity<3, 4>,
55        &NodalReferenceCoordinates<3>,
56        Weighting,
57    )> for Block<C>
58{
59    fn from(
60        (constitutive_model, connectivity, reference_coordinates, weighting): (
61            C,
62            PrimitiveConnectivity<3, 4>,
63            &NodalReferenceCoordinates<3>,
64            Weighting,
65        ),
66    ) -> Self {
67        let nodes = Node::vec_from(&connectivity, reference_coordinates, weighting);
68        Self {
69            constitutive_model,
70            connectivity,
71            nodes,
72        }
73    }
74}
75
76impl<C> Elements for Block<C> {
77    fn node_neighbors(&self, neighbors: &mut [Vec<usize>]) {
78        add_node_neighbors(
79            self.connectivity.iter().map(|nodes| nodes.as_slice()),
80            neighbors,
81        )
82    }
83}