ndgrid/geometry/mixed/
entity_geometry.rs

1//! Geometry where each entity of a given dimension is represented by the same element
2use super::MixedGeometry;
3use crate::{
4    geometry::{Point, PointIter},
5    traits::Geometry,
6    types::Scalar,
7};
8use ndelement::traits::MappedFiniteElement;
9
10/// Geometry of an entity
11#[derive(Debug)]
12pub struct MixedEntityGeometry<'a, T: Scalar, E: MappedFiniteElement> {
13    geometry: &'a MixedGeometry<T, E>,
14    element_index: usize,
15    cell_index: usize,
16    sub_entity_dim: usize,
17    sub_entity_index: usize,
18}
19
20impl<'a, T: Scalar, E: MappedFiniteElement> MixedEntityGeometry<'a, T, E> {
21    /// Create new
22    pub fn new(
23        geometry: &'a MixedGeometry<T, E>,
24        element_index: usize,
25        cell_index: usize,
26        sub_entity_dim: usize,
27        sub_entity_index: usize,
28    ) -> Self {
29        Self {
30            geometry,
31            element_index,
32            cell_index,
33            sub_entity_dim,
34            sub_entity_index,
35        }
36    }
37}
38
39impl<T: Scalar, E: MappedFiniteElement> Geometry for MixedEntityGeometry<'_, T, E> {
40    type T = T;
41    type Point<'a>
42        = Point<'a, T>
43    where
44        Self: 'a;
45    type PointIter<'a>
46        = PointIter<'a, T>
47    where
48        Self: 'a;
49
50    fn points(&self) -> PointIter<'_, T> {
51        let gdim = self.geometry.dim();
52        let mut pts = vec![];
53        for index in self
54            .geometry
55            .element(self.element_index)
56            .entity_closure_dofs(self.sub_entity_dim, self.sub_entity_index)
57            .unwrap()
58        {
59            let i = self.geometry.cells(self.element_index)[[*index, self.cell_index]];
60            pts.push((
61                i,
62                &self.geometry.points().data().unwrap()[i * gdim..(i + 1) * gdim],
63            ))
64        }
65
66        PointIter::new(pts)
67    }
68
69    fn point_count(&self) -> usize {
70        self.geometry.cells(self.element_index).shape()[0]
71    }
72    fn degree(&self) -> usize {
73        self.geometry
74            .element(self.element_index)
75            .lagrange_superdegree()
76    }
77}