From 8878be735ab08990edbd6d0bd1b4329c324b8ed3 Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sat, 13 Apr 2024 22:09:31 -0400 Subject: [PATCH 1/7] Add tetrahedron to tests --- test/runtests.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 756aa8da..f23b5d42 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -102,18 +102,19 @@ end segment(T) = Segment(pt_e(T), pt_n(T)) sphere2d(T) = Sphere(origin2d(T), T(2.5)) sphere3d(T) = Sphere(origin3d(T), T(2.5)) + tetra(T) = Tetrahedron(pt_n(T), pt_w(T), pt_e(T), pt_n(T)+ẑ(T)) triangle(T) = Ngon(pt_e(T), pt_n(T), pt_w(T)) torus(T) = Torus(origin3d(T), ẑ(T), T(3.5), T(1.25)) SUPPORT_MATRIX(T) = [ # Name, T type, example, integral,line,surface,volume, GaussLegendre,GaussKronrod,HAdaptiveCubature - SupportItem("Ball{2,$T}", T, ball2d(T), 1, 0, 1, 0, 1, 1, 1), - SupportItem("Ball{3,$T}", T, ball3d(T), 1, 0, 0, 1, 1, 0, 1), + SupportItem("Ball{2,$T}", T, ball2d(T), 1, 0, 1, 0, 1, 1, 1), + SupportItem("Ball{3,$T}", T, ball3d(T), 1, 0, 0, 1, 1, 0, 1), # Ball{Dim,T} SupportItem("BezierCurve{$T}", T, bezier(T), 1, 1, 0, 0, 1, 1, 1), - SupportItem("Box{1,$T}", T, box1d(T), 1, 1, 0, 0, 1, 1, 1), - SupportItem("Box{2,$T}", T, box2d(T), 1, 0, 1, 0, 1, 1, 1), - SupportItem("Box{3,$T}", T, box3d(T), 1, 0, 0, 1, 1, 0, 1), + SupportItem("Box{1,$T}", T, box1d(T), 1, 1, 0, 0, 1, 1, 1), + SupportItem("Box{2,$T}", T, box2d(T), 1, 0, 1, 0, 1, 1, 1), + SupportItem("Box{3,$T}", T, box3d(T), 1, 0, 0, 1, 1, 0, 1), # Box{Dim,T} SupportItem("Circle{$T}", T, circle(T), 1, 1, 0, 0, 1, 1, 1), # Cone @@ -133,6 +134,7 @@ end # SimpleMesh SupportItem("Sphere{2,$T}", T, sphere2d(T), 1, 1, 0, 0, 1, 1, 1), SupportItem("Sphere{3,$T}", T, sphere3d(T), 1, 0, 1, 0, 1, 1, 1), + SupportItem("Tetrahedron", T, tetra(T), 1, 0, 0, 1, 1, 0, 1), SupportItem("Triangle{$T}", T, triangle(T), 1, 0, 1, 0, 1, 1, 1), SupportItem("Torus{$T}", T, torus(T), 1, 0, 1, 0, 1, 1, 1), ] From c13ecf97edad947cc48aa74119a8bff53093ec9c Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sun, 14 Apr 2024 10:04:24 -0400 Subject: [PATCH 2/7] Add QuadGK method for integrating Tetrahedron --- src/integral_volume.jl | 34 ++++++++++++++++++++++++++++++++++ test/runtests.jl | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/integral_volume.jl b/src/integral_volume.jl index f8b993c7..9622278c 100644 --- a/src/integral_volume.jl +++ b/src/integral_volume.jl @@ -33,6 +33,40 @@ function _integral_3d( end +################################################################################ +# Specialized Methods for Tetrahedron +################################################################################ + +function integral( + f::F, + tetrahedron::Meshes.Tetrahedron{3,T}, + settings::GaussLegendre +) where {F<:Function, T} + error("Integrating a Tetrahedron{3,T} with GaussLegendre not supported.") +end + +function integral( + f::F, + tetrahedron::Meshes.Tetrahedron{3,T}, + settings::GaussKronrod +) where {F<:Function, T} + # Validate the provided integrand function + _validate_integrand(f,3,T) + + inner∫₂(v,w) = QuadGK.quadgk(u -> f(tetrahedron(u,v,w)), T(0), T(1-v-w); settings.kwargs...)[1] + inner∫₁(w) = QuadGK.quadgk(v -> inner∫₂(v,w), T(0), T(1-w); settings.kwargs...)[1] + outer∫ = QuadGK.quadgk(w -> inner∫₁(w), T(0), T(1); settings.kwargs...)[1] +end + +function integral( + f::F, + cyl::Meshes.CylinderSurface{T}, + settings::HAdaptiveCubature +) where {F<:Function, T} + error("Integrating a Tetrahedron{3,T} with HAdaptiveCubature not supported.") +end + + ################################################################################ # Unsupported Placeholders ################################################################################ diff --git a/test/runtests.jl b/test/runtests.jl index f23b5d42..58d3aede 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -134,7 +134,7 @@ end # SimpleMesh SupportItem("Sphere{2,$T}", T, sphere2d(T), 1, 1, 0, 0, 1, 1, 1), SupportItem("Sphere{3,$T}", T, sphere3d(T), 1, 0, 1, 0, 1, 1, 1), - SupportItem("Tetrahedron", T, tetra(T), 1, 0, 0, 1, 1, 0, 1), + SupportItem("Tetrahedron", T, tetra(T), 1, 0, 0, 1, 0, 1, 0), SupportItem("Triangle{$T}", T, triangle(T), 1, 0, 1, 0, 1, 1, 1), SupportItem("Torus{$T}", T, torus(T), 1, 0, 1, 0, 1, 1, 1), ] From 09af8edc63e12b04b09e9d662d584da7df4b6413 Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sun, 14 Apr 2024 10:06:57 -0400 Subject: [PATCH 3/7] Fix copy/paste error --- src/integral_volume.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integral_volume.jl b/src/integral_volume.jl index 9622278c..26302a3c 100644 --- a/src/integral_volume.jl +++ b/src/integral_volume.jl @@ -60,7 +60,7 @@ end function integral( f::F, - cyl::Meshes.CylinderSurface{T}, + tetrahedron::Meshes.Tetrahedron{3,T}, settings::HAdaptiveCubature ) where {F<:Function, T} error("Integrating a Tetrahedron{3,T} with HAdaptiveCubature not supported.") From 18a9c128ccb2c652cd639f05dc7417855c6e8d5a Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sun, 14 Apr 2024 10:21:23 -0400 Subject: [PATCH 4/7] Bugfix - domain correction --- src/integral_volume.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/integral_volume.jl b/src/integral_volume.jl index 26302a3c..fee734ea 100644 --- a/src/integral_volume.jl +++ b/src/integral_volume.jl @@ -56,6 +56,9 @@ function integral( inner∫₂(v,w) = QuadGK.quadgk(u -> f(tetrahedron(u,v,w)), T(0), T(1-v-w); settings.kwargs...)[1] inner∫₁(w) = QuadGK.quadgk(v -> inner∫₂(v,w), T(0), T(1-w); settings.kwargs...)[1] outer∫ = QuadGK.quadgk(w -> inner∫₁(w), T(0), T(1); settings.kwargs...)[1] + + # Apply barycentric domain correction + return 2 * volume(tetrahedron) * outer∫ end function integral( From a6f6d5f331bf3cd5c2d56c449bf588fd2975c458 Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sun, 14 Apr 2024 10:31:57 -0400 Subject: [PATCH 5/7] Bugfix - domain correction --- src/integral_volume.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/integral_volume.jl b/src/integral_volume.jl index fee734ea..70b2dba0 100644 --- a/src/integral_volume.jl +++ b/src/integral_volume.jl @@ -57,8 +57,8 @@ function integral( inner∫₁(w) = QuadGK.quadgk(v -> inner∫₂(v,w), T(0), T(1-w); settings.kwargs...)[1] outer∫ = QuadGK.quadgk(w -> inner∫₁(w), T(0), T(1); settings.kwargs...)[1] - # Apply barycentric domain correction - return 2 * volume(tetrahedron) * outer∫ + # Apply barycentric domain correction (volume: 1/6 → actual) + return 6 * volume(tetrahedron) * outer∫ end function integral( From 14160a8e1514dc077497f1bd4fdcb466d938ba1a Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sun, 14 Apr 2024 10:33:26 -0400 Subject: [PATCH 6/7] Bump package version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index f7bf5512..6eb4c2fd 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "MeshIntegrals" uuid = "dadec2fd-bbe0-4da4-9dbe-476c782c8e47" authors = ["Mike Ingold "] -version = "0.11.6" +version = "0.11.7" [deps] FastGaussQuadrature = "442a2c76-b920-505d-bb47-c5924d526838" From d8ee4d5b6c01133c4c2c7054589844320a600c17 Mon Sep 17 00:00:00 2001 From: Michael Ingold Date: Sun, 14 Apr 2024 11:29:56 -0400 Subject: [PATCH 7/7] Update support matrix --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00fff640..eec2f533 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ integral(f, unit_circle_bz, GaussKronrod()) |--------|---------| | :white_check_mark: | Implemented, passes tests | | :x: | Planned but not yet implemented | -| :warning: | Unable to implement until parameterization not available (see [Issue #28](https://github.com/mikeingold/MeshIntegrals.jl/issues/28)) | +| :warning: | Unable to implement: parameterization not available (see [Issue #28](https://github.com/mikeingold/MeshIntegrals.jl/issues/28)) | ### Integral | Geometry | Gauss-Legendre | Gauss-Kronrod | H-Adaptive Cubature | @@ -85,5 +85,6 @@ integral(f, unit_circle_bz, GaussKronrod()) | `SimpleMesh{Dim,T,V}` | :x: | :x: | :x: | | `Sphere{2,T}` | :white_check_mark: | :white_check_mark: | :white_check_mark: | | `Sphere{3,T}` | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| `Tetrahedron{3,T}` | :x: | :white_check_mark: | :x: | | `Triangle{T}` | :white_check_mark: | :white_check_mark: | :white_check_mark: | | `Torus{T}` | :white_check_mark: | :white_check_mark: | :white_check_mark: |