ndgrid/geometry/mixed/
entity_geometry.rs1use super::MixedGeometry;
3use crate::{
4 geometry::{Point, PointIter},
5 traits::Geometry,
6 types::Scalar,
7};
8use ndelement::traits::MappedFiniteElement;
9
10#[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 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}