Skip to content

Commit

Permalink
Merge pull request #13932 from luca-heltai/cgal-move_implementation_i…
Browse files Browse the repository at this point in the history
…mplicit_function

Move implementation of implicit_function() into .cc file
  • Loading branch information
tamiko committed Jun 10, 2022
2 parents bf58f08 + 135689d commit 587e1e8
Show file tree
Hide file tree
Showing 8 changed files with 376 additions and 226 deletions.
220 changes: 220 additions & 0 deletions include/deal.II/cgal/additional_data.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
// ---------------------------------------------------------------------
//
// Copyright (C) 2022 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_additional_data_h
#define dealii_cgal_additional_data_h

#include <deal.II/base/config.h>

#ifdef DEAL_II_WITH_CGAL

# include <CGAL/Mesh_facet_topology.h>


DEAL_II_NAMESPACE_OPEN
namespace CGALWrappers
{
enum class FacetTopology
{
/**
* Each vertex of the facet have to be on the surface, on a curve, or on a
* corner.
*/
facet_vertices_on_surface = CGAL::FACET_VERTICES_ON_SURFACE,

/**
* The three vertices of a facet belonging to a surface patch s have to be
* on the same surface patch s, on a curve or on a corner.
*/
facet_vertices_on_same_surface_patch =
CGAL::FACET_VERTICES_ON_SAME_SURFACE_PATCH,

/**
* The three vertices of a facet belonging to a surface patch s have to be
* on the same surface patch s, or on a curve incident to the surface patch
* s or on a corner incident to the surface patch s.
*/
facet_vertices_on_same_surface_patch_with_adjacency_check =
CGAL::FACET_VERTICES_ON_SAME_SURFACE_PATCH_WITH_ADJACENCY_CHECK,
};

/**
* Struct that must be used to pass additional
* arguments to the CGAL::Mesh_criteria_3 class (see
* https://doc.cgal.org/latest/Mesh_3/index.html for more information.)
*
* The arguments allow for fine control on the size, quality, and distribution
* of the cells of the final triangulation. CGAL uses Boost named parameters
* for these arguments in dimension three, i.e., they must be specified with
* the syntax `CGAL::parameters::parameter_name=parameter_value`, irrespective
* of their order. Accepted parameters are:
*
* - `CGAL::parameters::edge_size`: a constant
* providing a uniform upper bound for the lengths of
* curve edges. This parameter has to be set to a positive value when
* 1-dimensional features protection is used.
* - `CGAL::parameters::facet_angle`: a lower bound for the angles (in
* degrees) of the surface mesh facets.
* - `CGAL::parameters::facet_size`: a constant
* describing a uniform upper bound for the radii
* of the surface Delaunay balls.
* - `CGAL::parameters::facet_distance`: a constant
* describing a uniform upper bound for the distance
* between the facet circumcenter and the center of its surface Delaunay ball.
* - `CGAL::parameters::facet_topology`: the set of topological constraints
* which have to be verified by each surface facet. The default value is
* `CGAL::FACET_VERTICES_ON_SURFACE`. See the enum @p FacetToplogy CGAL::Mesh_facet_topology manual
* page to get all possible values.
* - `CGAL::parameters::cell_radius_edge_ratio`: an upper bound for the
* radius-edge ratio of the mesh tetrahedra.
* - `CGAL::parameters::cell_size`: a constant
* describing a uniform upper bound for the
* circumradii of the mesh tetrahedra.
*
* @note This struct must be instantiated with `dim=3`.
*/
template <int dim>
struct AdditionalData
{
/**
* Uniform upper bound for the lengths of curve edges.
* This parameter has to be set to a positive value when1-dimensional
* features protection is used.
*/
double edge_size;

/**
* Lower bound for the angles (in degrees) of the surface mesh facets.
*/
double facet_angle;

/**
* Uniform upper bound for the radii of the surface Delaunay balls.
*/
double facet_size;
/**
* Uniform upper bound for the distance between the facet circumcenter and
* the center of its surface Delaunay ball.
*/
double facet_distance;

/**
* Set of topological constraints which have to be verified by each surface
* facet.
*/
FacetTopology facet_topology;

/**
* upper bound for the radius-edge ratio of the mesh tetrahedra.
*/
double cell_radius_edge_ratio;
/**
* Uniform upper bound for the circumradii of the mesh tetrahedra.
*/
double cell_size;

/**
* Constructor.
*/
AdditionalData(
double edge_s = std::numeric_limits<double>::max(),
double facet_a = 0.,
double facet_s = 0.,
double facet_d = 0.,
FacetTopology facet_t =
dealii::CGALWrappers::FacetTopology::facet_vertices_on_surface,
double cell_radius_edge_r = 0.,
double cell_s = 0.)
{
AssertThrow(
dim == 3,
ExcMessage(
"These struct can be instantiated with 3D Triangulations only."));
edge_size = edge_s;
facet_angle = facet_a;
facet_size = facet_s;
facet_distance = facet_d;
facet_topology = facet_t;
cell_radius_edge_ratio = cell_radius_edge_r;
cell_size = cell_s;
}
};

/**
* Specialization of the above struct when the object to be constructed is a
* 2D triangulation embedded in the 3D space, i.e. a Triangulation<2,3>.
* Only three parameters are accepted:
* - `angular_bound` is a lower bound in degrees for the angles of mesh
* facets.
* - `radius_bound` is an upper bound on the radii of surface Delaunay balls.
* A surface Delaunay ball is a ball circumscribing a mesh facet and centered
* on the surface.
* - `distance_bound` is an upper bound for the distance between the
* circumcenter of a mesh facet and the center of a surface Delaunay ball of
* this facet.
*/
template <>
struct AdditionalData<2>
{
/**
* Lower bound in degrees for the angles of mesh facets.
*/
double angular_bound;

/**
* Upper bound on the radii of surface Delaunay balls. A surface Delaunay
* ball is a ball circumscribing a mesh facet and centered on the surface.
*/
double radius_bound;

/**
* Upper bound for the distance between the circumcenter of a mesh facet
* and the center of a surface Delaunay ball of this facet.
*/
double distance_bound;

/**
* Constructor.
*/
AdditionalData(double angular_b = 0.,
double radius_b = 0.,
double distance_b = 0.)
{
angular_bound = angular_b;
radius_bound = radius_b;
distance_bound = distance_b;
}
};

} // namespace CGALWrappers
DEAL_II_NAMESPACE_CLOSE

#else

DEAL_II_NAMESPACE_OPEN
namespace CGALWrappers
{
/**
* Empty structure for the case where CGAL is not available.
*/
template <int dim>
struct AdditionalData
{};
} // namespace CGALWrappers

DEAL_II_NAMESPACE_CLOSE
#endif

#endif
27 changes: 21 additions & 6 deletions include/deal.II/cgal/triangulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,32 @@

#include <deal.II/base/config.h>

#ifdef DEAL_II_WITH_CGAL
#include <deal.II/base/exceptions.h>
#include <deal.II/base/function.h>

#include <deal.II/grid/tria.h>

# include <deal.II/grid/tria.h>
#include <deal.II/cgal/utilities.h>

#ifdef DEAL_II_WITH_CGAL

# include <boost/hana.hpp>

# include <CGAL/Complex_2_in_triangulation_3.h>
# include <CGAL/IO/facets_in_complex_2_to_triangle_mesh.h>
# include <CGAL/Implicit_surface_3.h>
# include <CGAL/Labeled_mesh_domain_3.h>
# include <CGAL/Mesh_complex_3_in_triangulation_3.h>
# include <CGAL/Mesh_criteria_3.h>
# include <CGAL/Mesh_triangulation_3.h>
# include <CGAL/Polyhedron_3.h>
# include <CGAL/Surface_mesh.h>
# include <CGAL/Surface_mesh_default_triangulation_3.h>
# include <CGAL/Triangulation_2.h>
# include <CGAL/Triangulation_3.h>
# include <deal.II/cgal/utilities.h>
# include <CGAL/make_mesh_3.h>
# include <CGAL/make_surface_mesh.h>
# include <deal.II/cgal/surface_mesh.h>

DEAL_II_NAMESPACE_OPEN

Expand Down Expand Up @@ -256,8 +271,8 @@ namespace CGALWrappers
// A face is identified by a cell and by the index within the cell
// of the opposite vertex. Loop over vertices, and retain only those
// that belong to this face.
unsigned int j = 0;
for (unsigned int i = 0; i < 4; ++i)
int j = 0;
for (int i = 0; i < 4; ++i)
if (i != cgal_vertex_face_index)
dealii_face.vertices[j++] =
cgal_to_dealii_vertex_map[cgal_cell->vertex(i)];
Expand Down Expand Up @@ -545,8 +560,8 @@ namespace CGALWrappers
}
triangulation.create_triangulation(vertices, cells, subcell_data);
}
# endif
} // namespace CGALWrappers
# endif // doxygen

DEAL_II_NAMESPACE_CLOSE

Expand Down
96 changes: 2 additions & 94 deletions include/deal.II/cgal/utilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

#include <deal.II/base/config.h>

#include <deal.II/cgal/additional_data.h>

#ifdef DEAL_II_WITH_CGAL
# include <deal.II/base/quadrature_lib.h>

Expand Down Expand Up @@ -115,100 +117,6 @@ namespace CGALWrappers



/**
* Struct that must be used to pass additional
* arguments to the CGAL::Mesh_criteria_3 class (see
* https://doc.cgal.org/latest/Mesh_3/index.html for more information.)
*
* The arguments allow for fine control on the size, quality, and distribution
* of the cells of the final triangulation. CGAL uses Boost named parameters
* for these arguments in dimension three, i.e., they must be specified with
* the syntax `CGAL::parameters::parameter_name=parameter_value`, irrespective
* of their order. Accepted parameters are:
*
* - `CGAL::parameters::edge_size`: a constant
* providing a uniform upper bound for the lengths of
* curve edges. This parameter has to be set to a positive value when
* 1-dimensional features protection is used.
* - `CGAL::parameters::facet_angle`: a lower bound for the angles (in
* degrees) of the surface mesh facets.
* - `CGAL::parameters::facet_size`: a constant
* describing a uniform upper bound for the radii
* of the surface Delaunay balls.
* - `CGAL::parameters::facet_distance`: a constant
* describing a uniform upper bound for the distance
* between the facet circumcenter and the center of its surface Delaunay ball.
* - `CGAL::parameters::facet_topology`: the set of topological constraints
* which have to be verified by each surface facet. The default value is
* `CGAL::FACET_VERTICES_ON_SURFACE`. See CGAL::Mesh_facet_topology manual
* page to get all possible values.
* - `CGAL::parameters::cell_radius_edge_ratio`: an upper bound for the
* radius-edge ratio of the mesh tetrahedra.
* - `CGAL::parameters::cell_size`: a constant
* describing a uniform upper bound for the
* circumradii of the mesh tetrahedra.
*
* @note This struct must be instantiated with `dim=3`.
*/
template <int dim>
struct AdditionalData
{
double facet_angle;
double facet_size;
double facet_distance;
double cell_radius_edge_ratio;
double cell_size;

AdditionalData(
double facet_a = CGAL::parameters::is_default_parameter(true),
double facet_s = CGAL::parameters::is_default_parameter(true),
double facet_d = CGAL::parameters::is_default_parameter(true),
double cell_radius_edge_r = CGAL::parameters::is_default_parameter(true),
double cell_s = CGAL::parameters::is_default_parameter(true))
{
AssertThrow(
dim == 3,
ExcMessage(
"These struct can be instantiated with 3D Triangulations only."));
facet_angle = facet_a;
facet_size = facet_s;
facet_distance = facet_d;
cell_radius_edge_ratio = cell_radius_edge_r;
cell_size = cell_s;
}
};



/**
* Specialization of the above struct when the object to be constructed is a
* 2D triangulation embedded in the 3D space, i.e. a Triangulation<2,3>.
* Only three parameters are accepted:
* - `angular_bound` is a lower bound in degrees for the angles of mesh
* facets.
* - `radius_bound` is an upper bound on the radii of surface Delaunay balls.
* A surface Delaunay ball is a ball circumscribing a mesh facet and centered
* on the surface.
* - `distance_bound` is an upper bound for the distance between the
* circumcenter of a mesh facet and the center of a surface Delaunay ball of
* this facet.
*/
template <>
struct AdditionalData<2>
{
double angular_bound, radius_bound, distance_bound;
AdditionalData(double angular_b = 0.,
double radius_b = 0.,
double distance_b = 0.)
{
angular_bound = angular_b;
radius_bound = radius_b;
distance_bound = distance_b;
}
};



/**
* Given a closed CGAL::Surface_mesh, this function fills the
* region bounded by the surface with tets.
Expand Down

0 comments on commit 587e1e8

Please sign in to comment.