Skip to content

Commit 37f822c

Browse files
committed
Change canonical quadrature traits from assoc fn to methods
1 parent 17e0dac commit 37f822c

2 files changed

Lines changed: 53 additions & 70 deletions

File tree

src/quadrature/canonical.rs

Lines changed: 52 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
use crate::allocators::BiDimAllocator;
2-
use crate::assembly::local::UniformQuadratureTable;
1+
use crate::assembly::local::{UniformQuadratureTable};
32
use crate::element::Tet4Element;
43
use crate::element::*;
4+
use crate::connectivity::*;
55
use crate::mesh::Mesh;
6-
use crate::nalgebra::{DefaultAllocator, DimName, Scalar};
76
use crate::quadrature::QuadraturePair;
87
use crate::quadrature::{tensor, total_order};
98
use crate::Real;
@@ -18,7 +17,7 @@ use crate::Real;
1817
pub trait CanonicalMassQuadrature {
1918
type Quadrature;
2019

21-
fn canonical_mass_quadrature() -> Self::Quadrature;
20+
fn canonical_mass_quadrature(&self) -> Self::Quadrature;
2221
}
2322

2423
/// A canonical quadrature for integrating the stiffness terms.
@@ -31,93 +30,77 @@ pub trait CanonicalMassQuadrature {
3130
pub trait CanonicalStiffnessQuadrature {
3231
type Quadrature;
3332

34-
fn canonical_stiffness_quadrature() -> Self::Quadrature;
33+
fn canonical_stiffness_quadrature(&self) -> Self::Quadrature;
3534
}
3635

37-
macro_rules! impl_canonical_mass_for_element {
38-
($element:ty, $quadrature:expr) => {
39-
impl<T> CanonicalMassQuadrature for $element
36+
macro_rules! impl_canonical_rule_for_element {
37+
($trait_name:ty, $method_name:ident, $connectivity:ty, $element:ty, $quadrature:expr) => {
38+
impl<T> $trait_name for $element
4039
where
4140
T: Real,
4241
{
43-
type Quadrature = QuadraturePair<T, <$element as ReferenceFiniteElement<T>>::ReferenceDim>;
42+
type Quadrature = QuadraturePair<T, ConnectivityReferenceDim<T, $connectivity>>;
4443

45-
fn canonical_mass_quadrature() -> Self::Quadrature {
44+
fn $method_name(&self) -> Self::Quadrature {
4645
$quadrature
4746
}
4847
}
49-
};
50-
}
5148

52-
macro_rules! impl_canonical_stiffness_for_element {
53-
($element:ty, $quadrature:expr) => {
54-
impl<T> CanonicalStiffnessQuadrature for $element
49+
impl<T> $trait_name for Mesh<T, ConnectivityGeometryDim<T, $connectivity>, $connectivity>
5550
where
56-
T: Real,
51+
T: Real
5752
{
58-
type Quadrature = QuadraturePair<T, <$element as ReferenceFiniteElement<T>>::ReferenceDim>;
53+
type Quadrature = UniformQuadratureTable<T, ConnectivityReferenceDim<T, $connectivity>>;
5954

60-
fn canonical_stiffness_quadrature() -> Self::Quadrature {
61-
$quadrature
55+
fn $method_name(&self) -> Self::Quadrature {
56+
UniformQuadratureTable::from_quadrature($quadrature)
6257
}
6358
}
59+
}
60+
}
61+
62+
macro_rules! impl_canonical_mass_for_element {
63+
($connectivity:ty, $element:ty, $quadrature:expr) => {
64+
impl_canonical_rule_for_element!(
65+
CanonicalMassQuadrature,
66+
canonical_mass_quadrature,
67+
$connectivity, $element, $quadrature);
68+
};
69+
}
70+
71+
macro_rules! impl_canonical_stiffness_for_element {
72+
($connectivity:ty, $element:ty, $quadrature:expr) => {
73+
impl_canonical_rule_for_element!(
74+
CanonicalStiffnessQuadrature,
75+
canonical_stiffness_quadrature,
76+
$connectivity, $element, $quadrature);
6477
};
6578
}
6679

6780
// Triangular elements
68-
impl_canonical_mass_for_element!(Tri3d2Element<T>, total_order::triangle(2).unwrap());
69-
impl_canonical_mass_for_element!(Tri6d2Element<T>, total_order::triangle(4).unwrap());
70-
impl_canonical_stiffness_for_element!(Tri3d2Element<T>, total_order::triangle(1).unwrap());
71-
impl_canonical_stiffness_for_element!(Tri6d2Element<T>, total_order::triangle(2).unwrap());
81+
impl_canonical_mass_for_element!(Tri3d2Connectivity, Tri3d2Element<T>, total_order::triangle(2).unwrap());
82+
impl_canonical_mass_for_element!(Tri6d2Connectivity, Tri6d2Element<T>, total_order::triangle(4).unwrap());
83+
impl_canonical_stiffness_for_element!(Tri3d2Connectivity, Tri3d2Element<T>, total_order::triangle(1).unwrap());
84+
impl_canonical_stiffness_for_element!(Tri6d2Connectivity, Tri6d2Element<T>, total_order::triangle(2).unwrap());
7285

7386
// Quadrilateral elements
74-
impl_canonical_mass_for_element!(Quad4d2Element<T>, tensor::quadrilateral_gauss(2));
75-
impl_canonical_mass_for_element!(Quad9d2Element<T>, tensor::quadrilateral_gauss(3));
76-
impl_canonical_stiffness_for_element!(Quad4d2Element<T>, tensor::quadrilateral_gauss(2));
77-
impl_canonical_stiffness_for_element!(Quad9d2Element<T>, tensor::quadrilateral_gauss(3));
87+
impl_canonical_mass_for_element!(Quad4d2Connectivity, Quad4d2Element<T>, tensor::quadrilateral_gauss(2));
88+
impl_canonical_mass_for_element!(Quad9d2Connectivity, Quad9d2Element<T>, tensor::quadrilateral_gauss(3));
89+
impl_canonical_stiffness_for_element!(Quad4d2Connectivity, Quad4d2Element<T>, tensor::quadrilateral_gauss(2));
90+
impl_canonical_stiffness_for_element!(Quad9d2Connectivity, Quad9d2Element<T>, tensor::quadrilateral_gauss(3));
7891

7992
// Tetrahedral elements
80-
impl_canonical_mass_for_element!(Tet4Element<T>, total_order::tetrahedron(2).unwrap());
81-
impl_canonical_mass_for_element!(Tet10Element<T>, total_order::tetrahedron(4).unwrap());
82-
impl_canonical_mass_for_element!(Tet20Element<T>, total_order::tetrahedron(6).unwrap());
83-
impl_canonical_stiffness_for_element!(Tet4Element<T>, total_order::tetrahedron(1).unwrap());
84-
impl_canonical_stiffness_for_element!(Tet10Element<T>, total_order::tetrahedron(2).unwrap());
85-
impl_canonical_stiffness_for_element!(Tet20Element<T>, total_order::tetrahedron(4).unwrap());
93+
impl_canonical_mass_for_element!(Tet4Connectivity, Tet4Element<T>, total_order::tetrahedron(2).unwrap());
94+
impl_canonical_mass_for_element!(Tet10Connectivity, Tet10Element<T>, total_order::tetrahedron(4).unwrap());
95+
impl_canonical_mass_for_element!(Tet20Connectivity, Tet20Element<T>, total_order::tetrahedron(6).unwrap());
96+
impl_canonical_stiffness_for_element!(Tet4Connectivity, Tet4Element<T>, total_order::tetrahedron(1).unwrap());
97+
impl_canonical_stiffness_for_element!(Tet10Connectivity, Tet10Element<T>, total_order::tetrahedron(2).unwrap());
98+
impl_canonical_stiffness_for_element!(Tet20Connectivity, Tet20Element<T>, total_order::tetrahedron(4).unwrap());
8699

87100
// Hexahedral elements
88-
impl_canonical_mass_for_element!(Hex8Element<T>, tensor::hexahedron_gauss(2));
89-
impl_canonical_mass_for_element!(Hex20Element<T>, tensor::hexahedron_gauss(3));
90-
impl_canonical_mass_for_element!(Hex27Element<T>, tensor::hexahedron_gauss(3));
91-
impl_canonical_stiffness_for_element!(Hex8Element<T>, tensor::hexahedron_gauss(2));
92-
impl_canonical_stiffness_for_element!(Hex20Element<T>, tensor::hexahedron_gauss(3));
93-
impl_canonical_stiffness_for_element!(Hex27Element<T>, tensor::hexahedron_gauss(3));
94-
95-
impl<T, D, C> CanonicalMassQuadrature for Mesh<T, D, C>
96-
where
97-
T: Scalar,
98-
D: DimName,
99-
C: ElementConnectivity<T, GeometryDim = D>,
100-
C::Element: CanonicalMassQuadrature<Quadrature = QuadraturePair<T, C::ReferenceDim>>,
101-
DefaultAllocator: BiDimAllocator<T, C::GeometryDim, C::ReferenceDim>,
102-
{
103-
type Quadrature = UniformQuadratureTable<T, C::ReferenceDim>;
104-
105-
fn canonical_mass_quadrature() -> Self::Quadrature {
106-
UniformQuadratureTable::from_quadrature(C::Element::canonical_mass_quadrature())
107-
}
108-
}
109-
110-
impl<T, D, C> CanonicalStiffnessQuadrature for Mesh<T, D, C>
111-
where
112-
T: Scalar,
113-
D: DimName,
114-
C: ElementConnectivity<T, GeometryDim = D>,
115-
C::Element: CanonicalStiffnessQuadrature<Quadrature = QuadraturePair<T, C::ReferenceDim>>,
116-
DefaultAllocator: BiDimAllocator<T, C::GeometryDim, C::ReferenceDim>,
117-
{
118-
type Quadrature = UniformQuadratureTable<T, C::ReferenceDim>;
119-
120-
fn canonical_stiffness_quadrature() -> Self::Quadrature {
121-
UniformQuadratureTable::from_quadrature(C::Element::canonical_stiffness_quadrature())
122-
}
123-
}
101+
impl_canonical_mass_for_element!(Hex8Connectivity, Hex8Element<T>, tensor::hexahedron_gauss(2));
102+
impl_canonical_mass_for_element!(Hex20Connectivity, Hex20Element<T>, tensor::hexahedron_gauss(3));
103+
impl_canonical_mass_for_element!(Hex27Connectivity, Hex27Element<T>, tensor::hexahedron_gauss(3));
104+
impl_canonical_stiffness_for_element!(Hex8Connectivity, Hex8Element<T>, tensor::hexahedron_gauss(2));
105+
impl_canonical_stiffness_for_element!(Hex20Connectivity, Hex20Element<T>, tensor::hexahedron_gauss(3));
106+
impl_canonical_stiffness_for_element!(Hex27Connectivity, Hex27Element<T>, tensor::hexahedron_gauss(3));

tests/unit_tests/quadrature/canonical.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ macro_rules! test_canonical_assembly_is_exact_and_minimal {
7575
let element = $element::<f64>::reference();
7676

7777
let reference_quadrature = $reference_quadrature;
78-
let canonical_quadrature = $element::<f64>::$canonical_quadrature_method();
78+
let canonical_quadrature = element.$canonical_quadrature_method();
7979
let canonical_matrix = $assembly_fn(&element, &canonical_quadrature);
8080
let reference_matrix = $assembly_fn(&element, &reference_quadrature);
8181

0 commit comments

Comments
 (0)