18#ifdef DEAL_II_WITH_CGAL
22# include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
23# include <CGAL/Labeled_mesh_domain_3.h>
24# include <CGAL/Mesh_triangulation_3.h>
42 const double &outer_ball_radius)
44# ifdef DEAL_II_WITH_CGAL
47 "The implicit function must have exactly one component."));
48 Assert(dealii_implicit_function.
value(interior_point) < 0,
50 "The implicit function must be negative at the interior point."));
51 Assert(outer_ball_radius > 0,
52 ExcMessage(
"The outer ball radius must be positive."));
54 ExcMessage(
"The triangulation must be empty."));
56 if constexpr (dim == 3)
58 using K = CGAL::Exact_predicates_inexact_constructions_kernel;
59 using NumberType = K::FT;
60 using Point_3 = K::Point_3;
61 using Sphere_3 = K::Sphere_3;
63 using Mesh_domain = CGAL::Labeled_mesh_domain_3<K>;
65 CGAL::Mesh_triangulation_3<Mesh_domain,
68 using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3<Tr, int, int>;
69 using Mesh_criteria = CGAL::Mesh_criteria_3<Tr>;
72 auto cgal_implicit_function = [&](
const Point_3 &p) {
74 dealii_implicit_function.
value(
Point<3>(p.x(), p.y(), p.z())));
77 Mesh_domain domain = Mesh_domain::create_implicit_mesh_domain(
78 cgal_implicit_function,
80 Point_3(interior_point[0], interior_point[1], interior_point[2]),
81 outer_ball_radius * outer_ball_radius));
83 Mesh_criteria criteria(CGAL::parameters::facet_size =
data.facet_size,
84 CGAL::parameters::facet_angle =
data.facet_angle,
85 CGAL::parameters::facet_distance =
87 CGAL::parameters::cell_radius_edge_ratio =
88 data.cell_radius_edge_ratio,
89 CGAL::parameters::cell_size =
data.cell_size);
91 auto cgal_triangulation = CGAL::make_mesh_3<C3t3>(domain, criteria);
92 CGALWrappers::cgal_triangulation_to_dealii_triangulation(
93 cgal_triangulation, tria);
95 else if constexpr (dim == 2)
98 using Tr = CGAL::Surface_mesh_default_triangulation_3;
99 using C2t3 = CGAL::Complex_2_in_triangulation_3<Tr>;
100 using GT = Tr::Geom_traits;
101 using Sphere_3 = GT::Sphere_3;
102 using Point_3 = GT::Point_3;
105 using Surface_3 = CGAL::Implicit_surface_3<GT, Function>;
109 auto cgal_implicit_function = [&](
const Point_3 &p) {
111 dealii_implicit_function.
value(
Point<3>(p.x(), p.y(), p.z())));
114 Surface_3 surface(cgal_implicit_function,
115 Sphere_3(Point_3(interior_point[0],
118 outer_ball_radius * outer_ball_radius));
124 CGAL::Surface_mesh_default_criteria_3<Tr> criteria(
data.angular_bound,
126 data.distance_bound);
127 CGAL::make_surface_mesh(c2t3,
130 CGAL::Non_manifold_tag());
131 CGAL::facets_in_complex_2_to_triangle_mesh(c2t3, mesh);
132 CGALWrappers::cgal_surface_mesh_to_dealii_triangulation(mesh, tria);
142 (void)dealii_implicit_function;
144 (void)interior_point;
145 (void)outer_ball_radius;
158# ifdef DEAL_II_WITH_CGAL
162 "The input triangulation cannot be empty when calling this function."));
166 "The output triangulation must be empty when calling this function."));
167 using K = CGAL::Exact_predicates_inexact_constructions_kernel;
168 using Point_3 = K::Point_3;
171 CGAL::Polyhedral_mesh_domain_with_features_3<
K,
172 CGAL::Surface_mesh<Point_3>>;
173 using Tr = CGAL::Mesh_triangulation_3<Mesh_domain,
176 using Mesh_criteria = CGAL::Mesh_criteria_3<Tr>;
178 CGAL::Mesh_complex_3_in_triangulation_3<Tr,
179 Mesh_domain::Corner_index,
180 Mesh_domain::Curve_index>;
182 CGAL::Surface_mesh<Point_3> mesh;
192 CGAL::Polygon_mesh_processing::triangulate_faces(mesh);
193 CGAL::Polygon_mesh_processing::stitch_borders(mesh);
194 Mesh_domain domain(mesh);
195 domain.detect_features();
196 Mesh_criteria criteria(CGAL::parameters::facet_size =
data.facet_size,
197 CGAL::parameters::facet_angle =
data.facet_angle,
198 CGAL::parameters::facet_distance =
200 CGAL::parameters::cell_radius_edge_ratio =
201 data.cell_radius_edge_ratio,
202 CGAL::parameters::cell_size =
data.cell_size);
203 const auto cgal_triangulation = CGAL::make_mesh_3<C3t3>(domain, criteria);
204 CGALWrappers::cgal_triangulation_to_dealii_triangulation(cgal_triangulation,
219# include "grid/grid_generator_cgal.inst"
const unsigned int n_components
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const
unsigned int n_active_cells() const
unsigned int n_cells() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
std::vector< index_type > data
void dealii_tria_to_cgal_surface_mesh(const ::Triangulation< dim, spacedim > &triangulation, CGAL::Surface_mesh< CGALPointType > &mesh)
CGAL::Surface_mesh< K_exact::Point_3 > Surface_mesh
CGAL::Sequential_tag ConcurrencyTag
CGAL::Exact_predicates_exact_constructions_kernel_with_sqrt K
void surface_mesh_to_volumetric_mesh(const Triangulation< 2, 3 > &surface_tria, Triangulation< 3 > &vol_tria, const CGALWrappers::AdditionalData< 3 > &data=CGALWrappers::AdditionalData< 3 >{})
void implicit_function(Triangulation< dim, 3 > &tria, const Function< 3 > &implicit_function, const CGALWrappers::AdditionalData< dim > &data=CGALWrappers::AdditionalData< dim >{}, const Point< 3 > &interior_point=Point< 3 >(), const double &outer_ball_radius=1.0)