conspire/domain/cbm/block/
mod.rs1pub 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}