From 31c5f136bed7f972cac28070a4f4e6863bd4227f Mon Sep 17 00:00:00 2001 From: Marco Feder Date: Tue, 26 Apr 2022 19:32:00 +0300 Subject: [PATCH] Added support for CGAL library. Co-authored-by: Luca Heltai --- cmake/configure/configure_cgal.cmake | 20 ++++ cmake/modules/FindCGAL.cmake | 45 +++++++++ doc/doxygen/options.dox.in | 1 + doc/news/changes/major/20220426FederHeltai | 3 + include/deal.II/base/config.h.in | 1 + include/deal.II/cgal/utilities.h | 110 +++++++++++++++++++++ tests/cgal/CMakeLists.txt | 6 ++ tests/cgal/cgal_point_01.cc | 46 +++++++++ tests/cgal/cgal_point_01.output | 3 + 9 files changed, 235 insertions(+) create mode 100644 cmake/configure/configure_cgal.cmake create mode 100644 cmake/modules/FindCGAL.cmake create mode 100644 doc/news/changes/major/20220426FederHeltai create mode 100644 include/deal.II/cgal/utilities.h create mode 100644 tests/cgal/CMakeLists.txt create mode 100644 tests/cgal/cgal_point_01.cc create mode 100644 tests/cgal/cgal_point_01.output diff --git a/cmake/configure/configure_cgal.cmake b/cmake/configure/configure_cgal.cmake new file mode 100644 index 0000000000..d13ac066ba --- /dev/null +++ b/cmake/configure/configure_cgal.cmake @@ -0,0 +1,20 @@ +## --------------------------------------------------------------------- +## +## Copyright (C) 2017 by the deal.II authors +## +## This file is part of the deal.II library. +## +## The deal.II library is free software; you can use it, redistribute +## it, and/or modify it under the terms of the GNU Lesser General +## Public License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## The full text of the license can be found in the file LICENSE.md at +## the top level directory of deal.II. +## +## --------------------------------------------------------------------- + +# +# Configuration for the CGAL library: +# + +CONFIGURE_FEATURE(CGAL) diff --git a/cmake/modules/FindCGAL.cmake b/cmake/modules/FindCGAL.cmake new file mode 100644 index 0000000000..34a77169bc --- /dev/null +++ b/cmake/modules/FindCGAL.cmake @@ -0,0 +1,45 @@ +## --------------------------------------------------------------------- +## +## Copyright (C) 2017 by the deal.II authors +## +## This file is part of the deal.II library. +## +## The deal.II library is free software; you can use it, redistribute +## it, and/or modify it under the terms of the GNU Lesser General +## Public License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## The full text of the license can be found in the file LICENSE.md at +## the top level directory of deal.II. +## +## --------------------------------------------------------------------- + +# +# Try to find the CGAL libraries +# +# This module exports +# +# CGAL_INCLUDE_DIRS +# + +SET(CGAL_DIR "" CACHE PATH "An optional hint to a CGAL installation") +SET_IF_EMPTY(CGAL_DIR "$ENV{CGAL_DIR}") + +IF(NOT "${CGAL_DIR}" STREQUAL "") + SET(CGAL_DIR ${CGAL_DIR}) +ENDIF() + +IF(DEAL_II_HAVE_CXX17) + # temporarily disable ${CMAKE_SOURCE_DIR}/cmake/modules for module lookup + LIST(REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules/) + FIND_PACKAGE(CGAL) + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules/) +ELSE(DEAL_II_HAVE_CXX17) + SET(CGAL_FOUND FALSE) + SET(CGAL_INCLUDE_DIRS "-NOTFOUND") + MESSAGE("-- WARNING: CGAL wrappers require cxx17. Disabling CGAL Support.") +ENDIF(DEAL_II_HAVE_CXX17) + +DEAL_II_PACKAGE_HANDLE(CGAL + INCLUDE_DIRS REQUIRED CGAL_INCLUDE_DIRS + CLEAR CGAL_INCLUDE_DIRS + ) diff --git a/doc/doxygen/options.dox.in b/doc/doxygen/options.dox.in index 25a3c15df4..308f28dd3c 100644 --- a/doc/doxygen/options.dox.in +++ b/doc/doxygen/options.dox.in @@ -194,6 +194,7 @@ PREDEFINED = DOXYGEN=1 \ DEAL_II_ARPACK_WITH_PARPACK=1 \ DEAL_II_WITH_ASSIMP=1 \ DEAL_II_WITH_BOOST=1 \ + DEAL_II_WITH_CGAL=1 \ DEAL_II_WITH_TASKFLOW=1 \ DEAL_II_WITH_COMPLEX_VALUES=1 \ DEAL_II_WITH_CUDA=1 \ diff --git a/doc/news/changes/major/20220426FederHeltai b/doc/news/changes/major/20220426FederHeltai new file mode 100644 index 0000000000..e4d7d88dda --- /dev/null +++ b/doc/news/changes/major/20220426FederHeltai @@ -0,0 +1,3 @@ +New: Added support for the CGAL library (www.cgal.org). +
+(Marco Feder, Luca Heltai, 2022/04/26) diff --git a/include/deal.II/base/config.h.in b/include/deal.II/base/config.h.in index 7d0e646b39..aff1915bcb 100644 --- a/include/deal.II/base/config.h.in +++ b/include/deal.II/base/config.h.in @@ -39,6 +39,7 @@ #cmakedefine DEAL_II_WITH_ARPACK #cmakedefine DEAL_II_WITH_ARBORX #cmakedefine DEAL_II_WITH_ASSIMP +#cmakedefine DEAL_II_WITH_CGAL #cmakedefine DEAL_II_WITH_COMPLEX_VALUES #cmakedefine DEAL_II_WITH_CUDA #cmakedefine DEAL_II_WITH_GINKGO diff --git a/include/deal.II/cgal/utilities.h b/include/deal.II/cgal/utilities.h new file mode 100644 index 0000000000..deba433c95 --- /dev/null +++ b/include/deal.II/cgal/utilities.h @@ -0,0 +1,110 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2020 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + +#ifndef dealii_cgal_utilities_h +#define dealii_cgal_utilities_h + +#include + +#ifdef DEAL_II_WITH_CGAL +# include +# include + +DEAL_II_NAMESPACE_OPEN +/** + * Interface to the Computational Geometry Algorithm Library (CGAL). + * + * CGAL is a software project that provides easy access to efficient and + * reliable geometric algorithms. The library offers data structures and + * algorithms like triangulations, Voronoi diagrams, Boolean operations on + * polygons and polyhedra, point set processing, arrangements of curves, surface + * and volume mesh generation, geometry processing, alpha shapes, convex hull + * algorithms, shape reconstruction, AABB and KD trees... + * + * You can learn more about the CGAL library at https://www.cgal.org/ + */ +namespace CGALWrappers +{ + /** + * Convert from deal.II Point to any compatible CGAL point. + * + * @tparam CGALPointType Any of the CGAL point types + * @tparam dim Dimension of the point + * @param [in] p An input deal.II Point + * @return CGALPointType A CGAL point + */ + template + inline CGALPointType + to_cgal(const dealii::Point &p); + + /** + * Convert from various CGAL point types to deal.II Point. + * @tparam dim Dimension of the point + * @tparam CGALPointType Any of the CGAL point types + * @param p + * @return dealii::Point + */ + template + inline dealii::Point + to_dealii(const CGALPointType &p); +} // namespace CGALWrappers + +# ifndef DOXYGEN +// Template implementations +namespace CGALWrappers +{ + template + inline CGALPointType + to_cgal(const dealii::Point &p) + { + constexpr int cdim = CGALPointType::Ambient_dimension::value; + static_assert(dim <= cdim, "Only dim <= cdim supported"); + if constexpr (cdim == 1) + return CGALPointType(p[0]); + else if constexpr (cdim == 2) + return CGALPointType(p[0], dim > 1 ? p[1] : 0); + else if constexpr (cdim == 3) + return CGALPointType(p[0], dim > 1 ? p[1] : 0, dim > 2 ? p[2] : 0); + else + Assert(false, dealii::ExcNotImplemented()); + return CGALPointType(); + } + + + + template + inline dealii::Point + to_dealii(const CGALPointType &p) + { + constexpr int cdim = CGALPointType::Ambient_dimension::value; + if constexpr (dim == 1) + return dealii::Point(CGAL::to_double(p.x())); + else if constexpr (dim == 2) + return dealii::Point(CGAL::to_double(p.x()), + cdim > 1 ? CGAL::to_double(p.y()) : 0); + else if constexpr (dim == 3) + return dealii::Point(CGAL::to_double(p.x()), + cdim > 1 ? CGAL::to_double(p.y()) : 0, + cdim > 2 ? CGAL::to_double(p.z()) : 0); + else + Assert(false, dealii::ExcNotImplemented()); + } +} // namespace CGALWrappers +# endif + +DEAL_II_NAMESPACE_CLOSE + +#endif +#endif diff --git a/tests/cgal/CMakeLists.txt b/tests/cgal/CMakeLists.txt new file mode 100644 index 0000000000..9c78c28903 --- /dev/null +++ b/tests/cgal/CMakeLists.txt @@ -0,0 +1,6 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.1.0) +INCLUDE(../setup_testsubproject.cmake) +PROJECT(testsuite CXX) +IF(DEAL_II_WITH_CGAL) + DEAL_II_PICKUP_TESTS() +ENDIF() diff --git a/tests/cgal/cgal_point_01.cc b/tests/cgal/cgal_point_01.cc new file mode 100644 index 0000000000..26ca14cb2b --- /dev/null +++ b/tests/cgal/cgal_point_01.cc @@ -0,0 +1,46 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2020 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + +// Test conversion from CGAL to deal.II Point and viceversa + +#include + +#include +#include +#include + +#include "../tests.h" + +using namespace CGALWrappers; + +int +main() +{ + initlog(); + using CGALPoint = CGAL::Point_3>; + // Test conversion from deal.II Point to CGAL Point + { + const Point<3> p(1.0, 2.0, 3.0); + const auto cgal_point = to_cgal(p); + deallog << "CGAL Point: " << cgal_point << std::endl; + } + + // Test conversion from CGAL Point to deal.II Point + { + const CGALPoint cgal_point(1.0, 2.0, 3.0); + const auto deal_ii_point = to_dealii<3>(cgal_point); + deallog << "deal.II Point: " << deal_ii_point << std::endl; + } +} diff --git a/tests/cgal/cgal_point_01.output b/tests/cgal/cgal_point_01.output new file mode 100644 index 0000000000..0da2203397 --- /dev/null +++ b/tests/cgal/cgal_point_01.output @@ -0,0 +1,3 @@ + +DEAL::CGAL Point: 1.00000 2.00000 3.00000 +DEAL::deal.II Point: 1.00000 2.00000 3.00000 -- 2.39.5