diff --git a/dumux/common/geometry/geometryintersection.hh b/dumux/common/geometry/geometryintersection.hh index f676c12a068245a0b9856e5613fa65c9bb83a630..e3199636d76d4bd51c547223d0331a588aa5d298 100644 --- a/dumux/common/geometry/geometryintersection.hh +++ b/dumux/common/geometry/geometryintersection.hh @@ -79,11 +79,12 @@ template<class Geometry1, class Geometry2, int dim2 = Geometry2::mydimension> class DefaultPolicyChooser { static constexpr int dimworld = Geometry1::coorddimension; + static constexpr int isDim = std::min( int(Geometry1::mydimension), int(Geometry2::mydimension) ); static_assert(dimworld == int(Geometry2::coorddimension), "Geometries must have the same coordinate dimension!"); - static_assert(dim2 == 1 || dim2 == 2, "No chooser class specialization available for given dimensions"); + static_assert(isDim == 1 || isDim == 2, "No chooser class specialization available for given dimensions"); using ctype = typename Dune::PromotionTraits<typename Geometry1::ctype, typename Geometry2::ctype>::PromotedType; public: - using type = std::conditional_t< dim2 == 2, + using type = std::conditional_t< isDim == 2, PolygonPolicy<ctype, Geometry1::coorddimension>, SegmentPolicy<ctype, Geometry1::coorddimension> >; }; @@ -207,7 +208,6 @@ public: //! Determine if the two geometries intersect and compute the intersection geometry static bool intersection(const Geometry1& geo1, const Geometry2& geo2, Intersection& intersection) { - static_assert(int(dim1) >= int(dim2), "Geometries must be ordered such that dim1 >= dim2"); static_assert(dimworld == Geometry2::coorddimension, "Can only intersect geometries of same coordinate dimension"); DUNE_THROW(Dune::NotImplemented, "Geometry intersection detection with intersection computation not implemented for dimworld = " << dimworld << ", dim1 = " << dim1 << ", dim2 = " << dim2); @@ -338,6 +338,31 @@ private: } }; +/*! + * \ingroup Geometry + * \brief A class for segment--polygon intersection in 2d space + */ +template <class Geometry1, class Geometry2, class Policy> +class GeometryIntersection<Geometry1, Geometry2, Policy, 2, 1, 2> +: public GeometryIntersection<Geometry2, Geometry1, Policy, 2, 2, 1> +{ + using Base = GeometryIntersection<Geometry2, Geometry1, Policy, 2, 2, 1>; + +public: + /*! + * \brief Colliding segment and convex polygon + * \param geo1/geo2 The geometries to intersect + * \param intersection If the geometries collide intersection holds the + * corner points of the intersection object in global coordinates. + * \note This forwards to the polygon-segment specialization with swapped arguments. + */ + template<class P = Policy> + static bool intersection(const Geometry1& geo1, const Geometry2& geo2, typename Base::Intersection& intersection) + { + return Base::intersection(geo2, geo1, intersection); + } +}; + /*! * \ingroup Geometry * \brief A class for polyhedron--segment intersection in 3d space @@ -466,6 +491,30 @@ private: } }; +/*! + * \ingroup Geometry + * \brief A class for segment--polyhedron intersection in 3d space + */ +template <class Geometry1, class Geometry2, class Policy> +class GeometryIntersection<Geometry1, Geometry2, Policy, 3, 1, 3> +: public GeometryIntersection<Geometry2, Geometry1, Policy, 3, 3, 1> +{ + using Base = GeometryIntersection<Geometry2, Geometry1, Policy, 3, 3, 1>; +public: + /*! + * \brief Colliding segment and convex polyhedron + * \param geo1/geo2 The geometries to intersect + * \param intersection If the geometries collide intersection holds the + * corner points of the intersection object in global coordinates. + * \note This forwards to the polyhedron-segment specialization with swapped arguments. + */ + template<class P = Policy> + static bool intersection(const Geometry1& geo1, const Geometry2& geo2, typename Base::Intersection& intersection) + { + return Base::intersection(geo2, geo1, intersection); + } +}; + /*! * \ingroup Geometry * \brief A class for polyhedron--polygon intersection in 3d space @@ -492,7 +541,7 @@ private: public: /*! - * \brief Colliding segment and convex polyhedron + * \brief Colliding polygon and convex polyhedron * \note First we find the vertex candidates for the intersection region as follows: * Add triangle vertices that are inside the tetrahedron * Add tetrahedron vertices that are inside the triangle @@ -637,6 +686,30 @@ public: } }; +/*! + * \ingroup Geometry + * \brief A class for polygon--polyhedron intersection in 3d space + */ +template <class Geometry1, class Geometry2, class Policy> +class GeometryIntersection<Geometry1, Geometry2, Policy, 3, 2, 3> +: public GeometryIntersection<Geometry2, Geometry1, Policy, 3, 3, 2> +{ + using Base = GeometryIntersection<Geometry2, Geometry1, Policy, 3, 3, 2>; +public: + /*! + * \brief Colliding polygon and convex polyhedron + * \param geo1/geo2 The geometries to intersect + * \param intersection If the geometries collide intersection holds the + * corner points of the intersection object in global coordinates. + * \note This forwards to the polyhedron-polygon specialization with swapped arguments. + */ + template<class P = Policy> + static bool intersection(const Geometry1& geo1, const Geometry2& geo2, typename Base::Intersection& intersection) + { + return Base::intersection(geo2, geo1, intersection); + } +}; + /*! * \ingroup Geometry * \brief A class for polygon--segment intersection in 3d space @@ -908,6 +981,30 @@ private: } }; +/*! + * \ingroup Geometry + * \brief A class for segment--polygon intersection in 3d space + */ +template <class Geometry1, class Geometry2, class Policy> +class GeometryIntersection<Geometry1, Geometry2, Policy, 3, 1, 2> +: public GeometryIntersection<Geometry2, Geometry1, Policy, 3, 2, 1> +{ + using Base = GeometryIntersection<Geometry2, Geometry1, Policy, 3, 2, 1>; +public: + /*! + * \brief Colliding segment and convex polygon + * \param geo1/geo2 The geometries to intersect + * \param intersection If the geometries collide intersection holds the + * corner points of the intersection object in global coordinates. + * \note This forwards to the polyhedron-polygon specialization with swapped arguments. + */ + template<class P = Policy> + static bool intersection(const Geometry1& geo1, const Geometry2& geo2, typename Base::Intersection& intersection) + { + return Base::intersection(geo2, geo1, intersection); + } +}; + } // end namespace Dumux # endif