1- use crate :: allocators:: BiDimAllocator ;
2- use crate :: assembly:: local:: UniformQuadratureTable ;
1+ use crate :: assembly:: local:: { UniformQuadratureTable } ;
32use crate :: element:: Tet4Element ;
43use crate :: element:: * ;
4+ use crate :: connectivity:: * ;
55use crate :: mesh:: Mesh ;
6- use crate :: nalgebra:: { DefaultAllocator , DimName , Scalar } ;
76use crate :: quadrature:: QuadraturePair ;
87use crate :: quadrature:: { tensor, total_order} ;
98use crate :: Real ;
@@ -18,7 +17,7 @@ use crate::Real;
1817pub 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 {
3130pub 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 ) ) ;
0 commit comments