Skip to main content

conspire/geometry/mesh/connectivity/
mod.rs

1pub mod base;
2pub mod iter;
3pub mod polytopal;
4pub mod primitive;
5
6use crate::{
7    geometry::mesh::connectivity::{
8        polytopal::PolytopalConnectivity, primitive::PrimitiveConnectivity,
9    },
10    math::Set,
11};
12
13pub enum Connectivity {
14    Hexahedral(PrimitiveConnectivity<3, 8>),
15    Polyhedral(PolytopalConnectivity<3>),
16    Polygonal(PolytopalConnectivity<2>),
17    Pyramidal(PrimitiveConnectivity<3, 5>),
18    Quadrilateral(PrimitiveConnectivity<2, 4>),
19    Tetrahedral(PrimitiveConnectivity<3, 4>),
20    Triangular(PrimitiveConnectivity<2, 3>),
21    Wedge(PrimitiveConnectivity<3, 6>),
22}
23
24pub type Connectivities = Set<Vec<Connectivity>>;
25
26macro_rules! try_from_connectivity {
27    ($variant: ident, $m: literal, $n: literal, $error: literal) => {
28        impl TryFrom<Connectivity> for PrimitiveConnectivity<$m, $n> {
29            type Error = &'static str;
30            fn try_from(connectivity: Connectivity) -> Result<Self, Self::Error> {
31                match connectivity {
32                    Connectivity::$variant(connectivity) => Ok(connectivity),
33                    _ => Err($error),
34                }
35            }
36        }
37    };
38}
39try_from_connectivity!(Hexahedral, 3, 8, "block is not hexahedral");
40try_from_connectivity!(Pyramidal, 3, 5, "block is not pyramidal");
41try_from_connectivity!(Quadrilateral, 2, 4, "block is not quadrilateral");
42try_from_connectivity!(Tetrahedral, 3, 4, "block is not tetrahedral");
43try_from_connectivity!(Triangular, 2, 3, "block is not triangular");
44try_from_connectivity!(Wedge, 3, 6, "block is not a wedge");
45
46impl TryFrom<Connectivity> for PolytopalConnectivity<3> {
47    type Error = &'static str;
48    fn try_from(connectivity: Connectivity) -> Result<Self, Self::Error> {
49        match connectivity {
50            Connectivity::Polyhedral(connectivity) => Ok(connectivity),
51            _ => Err("block is not polyhedral"),
52        }
53    }
54}
55
56impl TryFrom<Connectivity> for PolytopalConnectivity<2> {
57    type Error = &'static str;
58    fn try_from(connectivity: Connectivity) -> Result<Self, Self::Error> {
59        match connectivity {
60            Connectivity::Polygonal(connectivity) => Ok(connectivity),
61            _ => Err("block is not polygonal"),
62        }
63    }
64}