Skip to content

Commit 322cfd7

Browse files
committed
Use macro to implement MshConnectivity
1 parent 1b8ae1e commit 322cfd7

File tree

1 file changed

+23
-50
lines changed

1 file changed

+23
-50
lines changed

src/io/msh.rs

Lines changed: 23 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -195,60 +195,33 @@ where
195195
fn try_connectivity_from_msh_element(element: &mshio::Element<u64>) -> eyre::Result<Self>;
196196
}
197197

198-
impl MshConnectivity for Tri3d2Connectivity {
199-
fn msh_element_type() -> mshio::ElementType {
200-
mshio::ElementType::Tri3
201-
}
202-
203-
fn reference_dim() -> usize {
204-
2
205-
}
206-
207-
fn try_connectivity_from_msh_element(element: &mshio::Element<u64>) -> eyre::Result<Self> {
208-
Ok(Self([
209-
element.nodes[0] as usize - 1,
210-
element.nodes[1] as usize - 1,
211-
element.nodes[2] as usize - 1,
212-
]))
213-
}
214-
}
215-
216-
impl MshConnectivity for Tri3d3Connectivity {
217-
fn msh_element_type() -> mshio::ElementType {
218-
mshio::ElementType::Tri3
219-
}
198+
macro_rules! impl_msh_connectivity {
199+
($connectivity:ident, $msh_type:ident, num_nodes = $num_nodes:literal) => {
200+
impl MshConnectivity for $connectivity {
201+
fn msh_element_type() -> mshio::ElementType {
202+
mshio::ElementType::$msh_type
203+
}
220204

221-
fn reference_dim() -> usize {
222-
3
223-
}
205+
fn reference_dim() -> usize {
206+
use crate::element::ElementConnectivity;
207+
<$connectivity as ElementConnectivity::<f64>>::ReferenceDim::dim()
208+
}
224209

225-
fn try_connectivity_from_msh_element(element: &mshio::Element<u64>) -> eyre::Result<Self> {
226-
Ok(Self([
227-
element.nodes[0] as usize - 1,
228-
element.nodes[1] as usize - 1,
229-
element.nodes[2] as usize - 1,
230-
]))
231-
}
210+
fn try_connectivity_from_msh_element(element: &mshio::Element<u64>) -> eyre::Result<Self> {
211+
assert_eq!(element.nodes.len(), $num_nodes, "number of msh element nodes have to match with connectivity");
212+
let mut nodes = [0; $num_nodes];
213+
for i in 0..$num_nodes {
214+
nodes[i] = element.nodes[i] as usize - 1;
215+
}
216+
Ok(Self(nodes))
217+
}
218+
}
219+
};
232220
}
233221

234-
impl MshConnectivity for Tet4Connectivity {
235-
fn msh_element_type() -> mshio::ElementType {
236-
mshio::ElementType::Tet4
237-
}
238-
239-
fn reference_dim() -> usize {
240-
3
241-
}
242-
243-
fn try_connectivity_from_msh_element(element: &mshio::Element<u64>) -> eyre::Result<Self> {
244-
Ok(Self([
245-
element.nodes[0] as usize - 1,
246-
element.nodes[1] as usize - 1,
247-
element.nodes[2] as usize - 1,
248-
element.nodes[3] as usize - 1,
249-
]))
250-
}
251-
}
222+
impl_msh_connectivity!(Tri3d2Connectivity, Tri3, num_nodes = 3);
223+
impl_msh_connectivity!(Tri3d3Connectivity, Tri3, num_nodes = 3);
224+
impl_msh_connectivity!(Tet4Connectivity, Tet4, num_nodes = 4);
252225

253226
#[cfg(test)]
254227
mod msh_tests {

0 commit comments

Comments
 (0)