diff --git a/src/assembly/local/quadrature_table.rs b/src/assembly/local/quadrature_table.rs index f06455d..374c36b 100644 --- a/src/assembly/local/quadrature_table.rs +++ b/src/assembly/local/quadrature_table.rs @@ -147,6 +147,30 @@ where data: self.data, } } + + /// Replaces the data of the quadrature table with the given data. + pub fn with_data(self, data: NestedVec) -> GeneralQuadratureTable { + GeneralQuadratureTable::from_points_weights_and_data(self.points, self.weights, data) + } + + /// Replaces the data of the quadrature table by calling the given closure with every quadrature + /// point in reference coordinates and its element index. + pub fn with_data_from_fn( + self, + mut data_fn: impl FnMut(usize, &OPoint, &Data) -> NewData, + ) -> GeneralQuadratureTable { + let mut data = NestedVec::new(); + + for (element_index, (points, datas)) in self.points.iter().zip(self.data.iter()).enumerate() { + let mut arr = data.begin_array(); + + for (point, data) in points.iter().zip(datas.iter()) { + arr.push_single(data_fn(element_index, point, data)); + } + } + + self.with_data(data) + } } pub struct GeneralQuadratureParts @@ -266,6 +290,28 @@ where } } +impl UniformQuadratureTable +where + T: Scalar, + GeometryDim: DimName, + Data: Clone, + DefaultAllocator: Allocator, +{ + pub fn to_general(&self, num_elements: usize) -> GeneralQuadratureTable { + let mut points = NestedVec::new(); + let mut weights = NestedVec::new(); + let mut data = NestedVec::new(); + + for _ in 0..num_elements { + points.push(&self.points); + weights.push(&self.weights); + data.push(&self.data); + } + + GeneralQuadratureTable::from_points_weights_and_data(points, weights, data) + } +} + impl QuadratureTable for UniformQuadratureTable where T: Scalar,