mirror of https://github.com/CGAL/cgal
clean up Periodic_3_mesh_3 doc
This commit is contained in:
parent
7a6faa7c38
commit
d2cd6244ff
|
|
@ -153,6 +153,8 @@ private:
|
|||
* \tparam MC either a model of the concept `MeshCriteria_3` or a model
|
||||
* of `MeshCriteriaWithFeatures_3` if the domain has exposed features.
|
||||
*
|
||||
* \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters
|
||||
*
|
||||
* \param c3t3 the mesh to be refined that is modified by the refinement process.
|
||||
* As the refinement process only adds points to the triangulation, all
|
||||
* vertices of the triangulation of `c3t3` remain in the
|
||||
|
|
|
|||
|
|
@ -1,83 +0,0 @@
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup PkgPeriodic3Mesh3Functions
|
||||
|
||||
The function `lloyd_optimize_periodic_3_mesh_3()` is a periodic mesh optimization
|
||||
process based on the minimization of a global energy function.
|
||||
|
||||
This function directly calls `lloyd_optimize_mesh_3()`, but is provided for convenience.
|
||||
Further information can be found on the documentation of the function `lloyd_optimize_mesh_3()`.
|
||||
|
||||
\note This function requires the \ref thirdpartyEigen library.
|
||||
*/
|
||||
template<typename C3T3, typename MD>
|
||||
CGAL::Mesh_optimization_return_code
|
||||
lloyd_optimize_periodic_3_mesh_3(C3T3& c3t3,
|
||||
const MD& domain,
|
||||
double parameters::time_limit=0,
|
||||
std::size_t parameters::max_iteration_number=0,
|
||||
double parameters::convergence=0.02,
|
||||
double parameters::freeze_bound = 0.01,
|
||||
bool parameters::do_freeze=true);
|
||||
|
||||
|
||||
/*!
|
||||
\ingroup PkgPeriodic3Mesh3Functions
|
||||
|
||||
The function `odt_optimize_periodic_3_mesh_3()` is a periodic mesh optimization
|
||||
process based on the minimization of a global energy function.
|
||||
|
||||
This function directly calls `odt_optimize_mesh_3()`, but is provided for convenience.
|
||||
Further information can be found on the documentation of the function `odt_optimize_mesh_3()`.
|
||||
*/
|
||||
template<typename C3T3, typename MD>
|
||||
Mesh_optimization_return_code
|
||||
odt_optimize_periodic_3_mesh_3(C3T3& c3t3,
|
||||
const MD& domain,
|
||||
double parameters::time_limit=0,
|
||||
std::size_t parameters::max_iteration_number=0,
|
||||
double parameters::convergence=0.02,
|
||||
double parameters::freeze_bound = 0.01,
|
||||
bool parameters::do_freeze=true);
|
||||
|
||||
/*!
|
||||
\ingroup PkgPeriodic3Mesh3Functions
|
||||
|
||||
The function `perturb_periodic_3_mesh_3()` is a mesh optimizer that
|
||||
improves the quality of a Delaunay mesh by changing the positions of some vertices of the mesh.
|
||||
|
||||
This function directly calls `perturb_mesh_3()`, but is provided for convenience.
|
||||
Further information can be found on the documentation of the function `perturb_mesh_3()`.
|
||||
*/
|
||||
template<typename C3T3, typename MD>
|
||||
CGAL::Mesh_optimization_return_code
|
||||
perturb_periodic_3_mesh_3(C3T3& c3t3,
|
||||
const MD& domain,
|
||||
double parameters::time_limit=0,
|
||||
double parameters::sliver_bound=0);
|
||||
|
||||
/*!
|
||||
\ingroup PkgPeriodic3Mesh3Functions
|
||||
|
||||
The function `exude_periodic_3_mesh_3()` performs a sliver exudation process
|
||||
on a periodic Delaunay mesh.
|
||||
|
||||
The sliver exudation process consists in optimizing the weights of vertices
|
||||
of the periodic weighted Delaunay triangulation in such a way that slivers disappear
|
||||
and the quality of the mesh improves.
|
||||
|
||||
\warning This optimizer modifies the weight of vertices of the periodic triangulation
|
||||
and, if called, must be the last optimizer to be called. If the mesh is refined after
|
||||
this optimization has been performed, all improvements will be lost.
|
||||
|
||||
This function directly calls `exude_mesh_3()`, but is provided for convenience.
|
||||
Further information can be found on the documentation of the function `exude_mesh_3()`.
|
||||
*/
|
||||
template<typename C3T3>
|
||||
CGAL::Mesh_optimization_return_code
|
||||
exude_periodic_3_mesh_3(C3T3& c3t3,
|
||||
double parameters::time_limit=0,
|
||||
double parameters::sliver_bound=0);
|
||||
|
||||
} /* namespace CGAL */
|
||||
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
INPUT += \
|
||||
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/make_periodic_3_mesh_3.h \
|
||||
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/refine_periodic_3_mesh_3.h
|
||||
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/refine_periodic_3_mesh_3.h \
|
||||
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/optimize_periodic_3_mesh_3.h
|
||||
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Periodic Mesh Generation"
|
||||
EXTRACT_ALL = false
|
||||
HIDE_UNDOC_CLASSES = true
|
||||
|
|
|
|||
|
|
@ -167,186 +167,182 @@ struct C3t3_initializer<C3T3, MeshDomain, MeshCriteria, true, CGAL::Tag_true>
|
|||
// -----------------------------------
|
||||
|
||||
/*!
|
||||
\ingroup PkgPeriodic3Mesh3Functions
|
||||
|
||||
The function `make_periodic_3_mesh_3()` is a 3D periodic mesh generator.
|
||||
It produces simplicial meshes which discretize 3D periodic domains.
|
||||
The periodic mesh generation algorithm is a Delaunay refinement process
|
||||
followed by an optimization phase. The criteria driving the Delaunay refinement
|
||||
process may be tuned to achieve the user needs with respect to
|
||||
the size of mesh elements, the accuracy of boundaries approximation,
|
||||
etc.
|
||||
The optimization phase is a sequence of optimization processes,
|
||||
amongst the following available optimizers: an ODT-smoothing,
|
||||
a Lloyd smoothing, a sliver perturber, and a sliver exuder.
|
||||
Each optimization process can be activated or not, according to the user requirements
|
||||
and available time.
|
||||
By default, only the perturber and the exuder are activated.
|
||||
Note that the benefits of the exuder will be lost if the mesh
|
||||
is further refined afterward, and that ODT-smoothing, Lloyd-smoothing,
|
||||
and sliver perturber should never be called after the sliver exuder.
|
||||
In the case of further refinement, only the sliver exuder can be used.
|
||||
The function outputs the mesh to an object which provides iterators to
|
||||
traverse the resulting mesh data structure or can be written to a file
|
||||
(see \ref Periodic_3_mesh_3_section_examples ).
|
||||
|
||||
|
||||
\tparam C3T3 is required to be a model of
|
||||
the concept `MeshComplex_3InTriangulation_3`. This is the return type.
|
||||
The type `C3T3` is in particular required to provide a nested type
|
||||
`C3T3::Triangulation` for the 3D triangulation
|
||||
embedding the mesh. The vertex and cell base classes of the
|
||||
triangulation `C3T3::Triangulation` are required to be models of the
|
||||
concepts `MeshVertexBase_3` and `MeshCellBase_3`
|
||||
respectively.
|
||||
|
||||
\tparam MD is required to be a model of
|
||||
the concept `MeshDomain_3`, or of the refined concept
|
||||
`MeshDomainWithFeatures_3`
|
||||
if the domain has corners and curves that need to be accurately represented in the mesh.
|
||||
The argument `domain`
|
||||
is the sole link through which the domain
|
||||
to be discretized is known by the mesh generation algorithm.
|
||||
|
||||
\tparam MC has to be a model of the concept
|
||||
`MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` if the domain has exposed features.
|
||||
The argument `criteria` of type `MC` specifies the
|
||||
size and shape requirements for mesh tetrahedra
|
||||
and surface facets. These criteria
|
||||
form the rules which drive the refinement process. All mesh elements
|
||||
satisfy those criteria at the end of the refinement process.
|
||||
In addition, if the domain has features, the argument
|
||||
`criteria` provides a sizing field to guide the discretization
|
||||
of 1-dimensional exposed features.
|
||||
|
||||
\tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||
|
||||
|
||||
\param domain the domain to be discretized
|
||||
\param criteria the criteria
|
||||
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below:
|
||||
|
||||
\cgalNamedParamsBegin
|
||||
\cgalParamNBegin{features_options}
|
||||
\cgalParamDescription{allows the user to specify whether 0 and 1-dimensional features have to be
|
||||
taken into account or not
|
||||
when the domain is a model of `MeshDomainWithFeatures_3`.
|
||||
The type `Features` of this parameter is an internal undescribed type.
|
||||
The library provides functions to construct appropriate values of that type.
|
||||
<UL>
|
||||
<LI>\link parameters::features() `parameters::features(domain)` \endlink sets `features` according to the domain,
|
||||
i.e.\ 0 and 1-dimensional features are taken into account if `domain` is a
|
||||
`MeshDomainWithFeatures_3`. This is the default behavior
|
||||
if parameter `features` is not specified.
|
||||
<LI>`parameters::no_features()` prevents the representation
|
||||
of 0 and 1-dimensional features in the mesh.
|
||||
</UL>}
|
||||
\cgalParamType{`parameters::features()' OR `parameters::features(domain)`}
|
||||
\cgalParamDefault{`parameters::features(domain)`}
|
||||
|
||||
\cgalParamNBegin{manifold_option}
|
||||
\cgalParamDescription{allows the user to drive the meshing algorithm,
|
||||
and ensure that the output mesh surface follows the given manifold criterion.
|
||||
It can be activated with `parameters::manifold()`, `parameters::manifold_with_boundary()`
|
||||
and `parameters::non_manifold()`. Note that the meshing algorithm cannot generate a manifold
|
||||
surface if the input surface is not manifold.}
|
||||
\cgalParamType{`parameters::manifold()` OR `parameters::manifold_with_boundary()` OR `parameters::non_manifold()`}
|
||||
\cgalParamDefault{`parameters::non_manifold()`}
|
||||
|
||||
\cgalParamNBegin{lloyd_options}
|
||||
\cgalParamDescription{`parameters::lloyd()` and `parameters::no_lloyd()` are designed to
|
||||
trigger or not a call to `lloyd_optimize_mesh_3()` function and to set the
|
||||
parameters of this optimizer. If one parameter is not set, the default value of
|
||||
`lloyd_optimize_mesh_3()` is used for this parameter.}
|
||||
\cgalParamType{`parameters::lloyd()` OR `parameters::no_lloyd()`}
|
||||
\cgalParamDefault{`parameters::no_lloyd()`}
|
||||
|
||||
\cgalParamNBegin{odt_options}
|
||||
\cgalParamDescription{`parameters::odt()` and `parameters::no_odt()` are designed to
|
||||
trigger or not a call to `odt_optimize_mesh_3()` function and
|
||||
to set the parameters of this optimizer.
|
||||
If one parameter is not set, the default value of
|
||||
`odt_optimize_mesh_3()` is used for this parameter.}
|
||||
\cgalParamType{`parameters::odt()` OR `parameters::no_odt()`}
|
||||
\cgalParamDefault{`parameters::no_odt()`}
|
||||
|
||||
\cgalParamNBegin{perturb_options}
|
||||
\cgalParamDescription{`parameters::perturb()` and `parameters::no_perturb()` are designed to
|
||||
trigger or not a call to `perturb_mesh_3()` function and
|
||||
to set the parameters of this optimizer. If one parameter is not set, the default value of
|
||||
`perturb_mesh_3()` is used for this parameter, except for the time bound which is set to be
|
||||
equal to the refinement CPU time.}
|
||||
\cgalParamType{`parameters::perturb()` and `parameters::no_perturb()`}
|
||||
\cgalParamDefault{`parameters::no_perturb`}
|
||||
|
||||
\cgalParamNBegin{exude_options}
|
||||
\cgalParamDescription{parameters::exude()` and `parameters::no_exude()` are designed to
|
||||
trigger or not a call to `exude_mesh_3()` function and to override to set the
|
||||
parameters of this optimizer. If one parameter is not set, the default value of
|
||||
`exude_mesh_3()` is used for this parameter, except for the time bound which is set to be
|
||||
equal to the refinement CPU time.}
|
||||
\cgalParamType{`parameters::exude()` and `parameters::no_exude()`}
|
||||
\cgalParamDefault{`parameters::no_exude`}
|
||||
|
||||
\cgalNamedParamsEnd
|
||||
|
||||
The optimization parameters can be passed in an arbitrary order. If one parameter
|
||||
is not passed, its default value is used. The default values are
|
||||
`no_lloyd()`, `no_odt()`, `perturb()` and `exude()`.
|
||||
|
||||
Note that whatever may be the optimization processes activated,
|
||||
they are always launched in the order that is a suborder
|
||||
of the following (see user manual for further
|
||||
details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*.
|
||||
|
||||
Beware that optimization of the mesh is obtained
|
||||
by perturbing mesh vertices and modifying the mesh connectivity
|
||||
and that this has an impact
|
||||
on the strict compliance to the refinement criteria.
|
||||
Though a strict compliance to mesh criteria
|
||||
is guaranteed at the end of the Delaunay refinement, this may no longer be true after
|
||||
some optimization processes. Also beware that the default behavior does involve some
|
||||
optimization processes.
|
||||
|
||||
\sa `refine_periodic_3_mesh_3()`
|
||||
\sa `make_mesh_3()`
|
||||
\sa `parameters::features()`
|
||||
\sa `parameters::no_features()`
|
||||
\sa `parameters::manifold()`
|
||||
\sa `parameters::manifold_with_boundary()`
|
||||
\sa `parameters::non_manifold()`
|
||||
\sa `exude_mesh_3()`
|
||||
\sa `perturb_mesh_3()`
|
||||
\sa `lloyd_optimize_mesh_3()`
|
||||
\sa `odt_optimize_mesh_3()`
|
||||
\sa `parameters::exude()`
|
||||
\sa `parameters::no_exude()`
|
||||
\sa `parameters::perturb()`
|
||||
\sa `parameters::no_perturb()`
|
||||
\sa `parameters::lloyd()`
|
||||
\sa `parameters::no_lloyd()`
|
||||
\sa `parameters::odt()`
|
||||
\sa `parameters::no_odt()`
|
||||
*/
|
||||
* \ingroup PkgPeriodic3Mesh3Functions
|
||||
*
|
||||
* The function `make_periodic_3_mesh_3()` is a 3D periodic mesh generator.
|
||||
* It produces simplicial meshes which discretize 3D periodic domains.
|
||||
* The periodic mesh generation algorithm is a Delaunay refinement process
|
||||
* followed by an optimization phase. The criteria driving the Delaunay refinement
|
||||
* process may be tuned to achieve the user needs with respect to
|
||||
* the size of mesh elements, the accuracy of boundaries approximation,
|
||||
* etc.
|
||||
* The optimization phase is a sequence of optimization processes,
|
||||
* amongst the following available optimizers: an ODT-smoothing,
|
||||
* a Lloyd smoothing, a sliver perturber, and a sliver exuder.
|
||||
* Each optimization process can be activated or not, according to the user requirements
|
||||
* and available time.
|
||||
* By default, only the perturber and the exuder are activated.
|
||||
* Note that the benefits of the exuder will be lost if the mesh
|
||||
* is further refined afterward, and that ODT-smoothing, Lloyd-smoothing,
|
||||
* and sliver perturber should never be called after the sliver exuder.
|
||||
* In the case of further refinement, only the sliver exuder can be used.
|
||||
* The function outputs the mesh to an object which provides iterators to
|
||||
* traverse the resulting mesh data structure or can be written to a file
|
||||
* (see \ref Periodic_3_mesh_3_section_examples ).
|
||||
*
|
||||
*
|
||||
* \tparam C3T3 is required to be a model of
|
||||
* the concept `MeshComplex_3InTriangulation_3`. This is the return type.
|
||||
* The type `C3T3` is in particular required to provide a nested type
|
||||
* `C3T3::Triangulation` for the 3D triangulation
|
||||
* embedding the mesh. The vertex and cell base classes of the
|
||||
* triangulation `C3T3::Triangulation` are required to be models of the
|
||||
* concepts `MeshVertexBase_3` and `MeshCellBase_3`
|
||||
* respectively.
|
||||
*
|
||||
* \tparam MD is required to be a model of
|
||||
* the concept `MeshDomain_3`, or of the refined concept
|
||||
* `MeshDomainWithFeatures_3`
|
||||
* if the domain has corners and curves that need to be accurately represented in the mesh.
|
||||
* The argument `domain`
|
||||
* is the sole link through which the domain
|
||||
* to be discretized is known by the mesh generation algorithm.
|
||||
*
|
||||
* \tparam MC has to be a model of the concept
|
||||
* `MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` if the domain has exposed features.
|
||||
* The argument `criteria` of type `MC` specifies the
|
||||
* size and shape requirements for mesh tetrahedra
|
||||
* and surface facets. These criteria
|
||||
* form the rules which drive the refinement process. All mesh elements
|
||||
* satisfy those criteria at the end of the refinement process.
|
||||
* In addition, if the domain has features, the argument
|
||||
* `criteria` provides a sizing field to guide the discretization
|
||||
* of 1-dimensional exposed features.
|
||||
*
|
||||
* \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
||||
*
|
||||
*
|
||||
* \param domain the domain to be discretized
|
||||
* \param criteria the criteria
|
||||
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below:
|
||||
*
|
||||
* \cgalNamedParamsBegin
|
||||
* \cgalParamSectionBegin{Feature preservation options}
|
||||
* \cgalParamDescription{If the domain is a model of `MeshDomainWithFeatures_3`, 0 and 1-dimensional features can be
|
||||
* taken into account while generating the mesh. The following two named parameters control
|
||||
* this option:
|
||||
* <UL>
|
||||
* <LI>\link parameters::features() `parameters::features(domain)` \endlink
|
||||
* <LI>`parameters::no_features()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::features(domain)`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Topological options (manifoldness)}
|
||||
* \cgalParamDescription{In order to drive the meshing algorithm and ensure that the output mesh follows a desired topological criterion,
|
||||
* three named parameters control this option:
|
||||
* <UL>
|
||||
* <LI>`parameters::manifold()`
|
||||
* <LI>`parameters::manifold_with_boundary()`
|
||||
* <LI>`parameters::non_manifold()`
|
||||
* </UL>
|
||||
* Note that the meshing algorithm cannot generate a manifold surface if the input surface is not manifold.}
|
||||
* \cgalParamDefault{`parameters::non_manifold()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Lloyd optimization}
|
||||
* \cgalParamDescription{`lloyd_optimize_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::no_lloyd()`
|
||||
* <LI> `parameters::lloyd_optimize_mesh_3()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::no_lloyd()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{ODT optimization}
|
||||
* \cgalParamDescription{`odt_optimize_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::no_odt()`
|
||||
* <LI> `parameters::odt()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::no_odt()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Mesh perturbation}
|
||||
* \cgalParamDescription{`perturb_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::no_perturb()`
|
||||
* <LI> `parameters::perturb()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::perturb()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Mesh exudation}
|
||||
* \cgalParamDescription{`exude_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::exude()`
|
||||
* <LI> `parameters::no_exude()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::exude()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalNamedParamsEnd
|
||||
*
|
||||
* The optimization parameters can be passed in an arbitrary order. If one parameter
|
||||
* is not passed, its default value is used. The default values are
|
||||
* `no_lloyd()`, `no_odt()`, `perturb()` and `exude()`.
|
||||
*
|
||||
* Note that whatever may be the optimization processes activated,
|
||||
* they are always launched in the order that is a suborder
|
||||
* of the following (see user manual for further
|
||||
* details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*.
|
||||
*
|
||||
* Beware that optimization of the mesh is obtained
|
||||
* by perturbing mesh vertices and modifying the mesh connectivity
|
||||
* and that this has an impact
|
||||
* on the strict compliance to the refinement criteria.
|
||||
* Though a strict compliance to mesh criteria
|
||||
* is guaranteed at the end of the Delaunay refinement, this may no longer be true after
|
||||
* some optimization processes. Also beware that the default behavior does involve some
|
||||
* optimization processes.
|
||||
*
|
||||
* \sa `refine_periodic_3_mesh_3()`
|
||||
* \sa `make_mesh_3()`
|
||||
* \sa `parameters::features()`
|
||||
* \sa `parameters::no_features()`
|
||||
* \sa `parameters::manifold()`
|
||||
* \sa `parameters::manifold_with_boundary()`
|
||||
* \sa `parameters::non_manifold()`
|
||||
* \sa `exude_mesh_3()`
|
||||
* \sa `perturb_mesh_3()`
|
||||
* \sa `lloyd_optimize_mesh_3()`
|
||||
* \sa `odt_optimize_mesh_3()`
|
||||
* \sa `parameters::exude()`
|
||||
* \sa `parameters::no_exude()`
|
||||
* \sa `parameters::perturb()`
|
||||
* \sa `parameters::no_perturb()`
|
||||
* \sa `parameters::lloyd()`
|
||||
* \sa `parameters::no_lloyd()`
|
||||
* \sa `parameters::odt()`
|
||||
* \sa `parameters::no_odt()`
|
||||
*/
|
||||
template<typename C3T3, typename MeshDomain, typename MeshCriteria, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
C3T3 make_periodic_3_mesh_3(MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
C3T3 c3t3;
|
||||
parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::exude().v);
|
||||
parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::perturb().v);
|
||||
parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v);
|
||||
parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v);
|
||||
parameters::internal::Features_options features_param = choose_parameter(get_parameter(np, internal_np::features_options_param), parameters::features(domain).v);
|
||||
parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options());
|
||||
parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options());
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
C3T3 c3t3;
|
||||
parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::exude().v);
|
||||
parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::perturb().v);
|
||||
parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v);
|
||||
parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v);
|
||||
parameters::internal::Features_options features_param = choose_parameter(get_parameter(np, internal_np::features_options_param), parameters::features(domain).v);
|
||||
parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options());
|
||||
parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options());
|
||||
|
||||
make_periodic_3_mesh_3_impl(c3t3, domain, criteria,
|
||||
exude_param, perturb_param, odt_param, lloyd_param,
|
||||
features_param.features(), mesh_options_param,
|
||||
manifold_options_param);
|
||||
return c3t3;
|
||||
make_periodic_3_mesh_3_impl(c3t3, domain, criteria,
|
||||
exude_param, perturb_param, odt_param, lloyd_param,
|
||||
features_param.features(), mesh_options_param,
|
||||
manifold_options_param);
|
||||
return c3t3;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -354,7 +350,7 @@ C3T3 make_periodic_3_mesh_3(MeshDomain& domain, MeshCriteria& criteria, const CG
|
|||
template<typename C3T3, typename MeshDomain, typename MeshCriteria, typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
C3T3 make_periodic_3_mesh_3(MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return make_periodic_3_mesh_3<C3T3>(domain, criteria, internal_np::combine_named_parameters(nps...));
|
||||
return make_periodic_3_mesh_3<C3T3>(domain, criteria, internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -24,96 +24,139 @@
|
|||
|
||||
namespace CGAL {
|
||||
// ---------------------------------- pertuber ---------------------------------
|
||||
/*!
|
||||
* \ingroup PkgPeriodic3Mesh3Functions
|
||||
*
|
||||
* The function `perturb_periodic_3_mesh_3()` is a mesh optimizer that
|
||||
* improves the quality of a Delaunay mesh by changing the positions of some vertices of the mesh.
|
||||
*
|
||||
* This function directly calls `perturb_mesh_3()`, but is provided for convenience.
|
||||
* Further information can be found on the documentation of the function `perturb_mesh_3()`.
|
||||
*/
|
||||
template<typename C3T3, typename MeshDomain, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
Mesh_optimization_return_code perturb_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
double time_limit = choose_parameter(get_parameter(np,internal_np::maximum_running_time),0);
|
||||
auto sliver_bound = choose_parameter(get_parameter(np,internal_np::lower_sliver_bound), parameters::default_values_for_mesh_3::perturb_sliver_bound);
|
||||
auto sliver_criterion = choose_parameter(get_parameter(np, internal_np::sliver_criteria), parameters::default_values_for_mesh_3::default_sliver_criterion(c3t3,sliver_bound));
|
||||
auto perturbation_vector = choose_parameter(get_parameter(np,internal_np::perturb_vector), default_perturbation_vector(c3t3,domain,sliver_criterion));
|
||||
return perturb_mesh_3_impl(c3t3, domain, time_limit, sliver_criterion, perturbation_vector);
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
double time_limit = choose_parameter(get_parameter(np,internal_np::maximum_running_time),0);
|
||||
auto sliver_bound = choose_parameter(get_parameter(np,internal_np::lower_sliver_bound), parameters::default_values_for_mesh_3::perturb_sliver_bound);
|
||||
auto sliver_criterion = choose_parameter(get_parameter(np, internal_np::sliver_criteria), parameters::default_values_for_mesh_3::default_sliver_criterion(c3t3,sliver_bound));
|
||||
auto perturbation_vector = choose_parameter(get_parameter(np,internal_np::perturb_vector), default_perturbation_vector(c3t3,domain,sliver_criterion));
|
||||
return perturb_mesh_3_impl(c3t3, domain, time_limit, sliver_criterion, perturbation_vector);
|
||||
}
|
||||
|
||||
template<typename C3T3, typename MeshDomain, typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code perturb_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return perturb_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...));
|
||||
return perturb_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code perturb_periodic_3_mesh_3(const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return perturb_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...));
|
||||
return perturb_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
// ---------------------------------- exuder -----------------------------------
|
||||
|
||||
/*!
|
||||
* \ingroup PkgPeriodic3Mesh3Functions
|
||||
*
|
||||
* The function `exude_periodic_3_mesh_3()` performs a sliver exudation process
|
||||
* on a periodic Delaunay mesh.
|
||||
*
|
||||
* The sliver exudation process consists in optimizing the weights of vertices
|
||||
* of the periodic weighted Delaunay triangulation in such a way that slivers disappear
|
||||
* and the quality of the mesh improves.
|
||||
*
|
||||
* \warning This optimizer modifies the weight of vertices of the periodic triangulation
|
||||
* and, if called, must be the last optimizer to be called. If the mesh is refined after
|
||||
* this optimization has been performed, all improvements will be lost.
|
||||
*
|
||||
* This function directly calls `exude_mesh_3()`, but is provided for convenience.
|
||||
* Further information can be found on the documentation of the function `exude_mesh_3()`.
|
||||
*/
|
||||
template<typename C3T3, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
Mesh_optimization_return_code exude_periodic_3_mesh_3(C3T3& c3t3,const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
int time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0);
|
||||
double sliver_bound= choose_parameter(get_parameter(np,internal_np::lower_sliver_bound),parameters::default_values_for_mesh_3::exude_sliver_bound);
|
||||
return exude_mesh_3_impl(c3t3,time_limit,sliver_bound);
|
||||
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
int time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0);
|
||||
double sliver_bound= choose_parameter(get_parameter(np,internal_np::lower_sliver_bound),parameters::default_values_for_mesh_3::exude_sliver_bound);
|
||||
return exude_mesh_3_impl(c3t3,time_limit,sliver_bound);
|
||||
}
|
||||
template<typename C3T3, typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code exude_periodic_3_mesh_3(C3T3& c3t3, const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return exude_periodic_3_mesh_3(c3t3,internal_np::combine_named_parameters(nps...));
|
||||
return exude_periodic_3_mesh_3(c3t3,internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code exude_periodic_3_mesh_3(const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return exude_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...));
|
||||
return exude_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
|
||||
// ------------------------------ odt optimizer --------------------------------
|
||||
|
||||
/*!
|
||||
* \ingroup PkgPeriodic3Mesh3Functions
|
||||
*
|
||||
* The function `odt_optimize_periodic_3_mesh_3()` is a periodic mesh optimization
|
||||
* process based on the minimization of a global energy function.
|
||||
*
|
||||
* This function directly calls `odt_optimize_mesh_3()`, but is provided for convenience.
|
||||
* Further information can be found on the documentation of the function `odt_optimize_mesh_3()`.
|
||||
*/
|
||||
template<typename C3T3,typename MeshDomain,typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
Mesh_optimization_return_code odt_optimize_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
double time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0);
|
||||
std::size_t max_iteration_number=choose_parameter(get_parameter(np,internal_np::number_of_iterations),0);
|
||||
double convergence=choose_parameter(get_parameter(np,internal_np::convergence_ratio),0.02);
|
||||
double freeze_bound=choose_parameter(get_parameter(np,internal_np::vertex_freeze_bound),0.01);
|
||||
bool do_freeze=choose_parameter(get_parameter(np,internal_np::freeze),true);
|
||||
return odt_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iteration_number, convergence, freeze_bound, do_freeze);
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
double time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0);
|
||||
std::size_t max_iteration_number=choose_parameter(get_parameter(np,internal_np::number_of_iterations),0);
|
||||
double convergence=choose_parameter(get_parameter(np,internal_np::convergence_ratio),0.02);
|
||||
double freeze_bound=choose_parameter(get_parameter(np,internal_np::vertex_freeze_bound),0.01);
|
||||
bool do_freeze=choose_parameter(get_parameter(np,internal_np::freeze),true);
|
||||
return odt_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iteration_number, convergence, freeze_bound, do_freeze);
|
||||
}
|
||||
|
||||
template<typename C3T3, typename MeshDomain, typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code odt_optimize_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return odt_optimize_periodic_3_mesh_3(c3t3, domain, internal_np::combine_named_parameters(nps...));
|
||||
return odt_optimize_periodic_3_mesh_3(c3t3, domain, internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code odt_optimize_periodic_3_mesh_3(const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return odt_optimize_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...));
|
||||
return odt_optimize_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------- lloyd optimizer -----------------------------
|
||||
/*!
|
||||
* \ingroup PkgPeriodic3Mesh3Functions
|
||||
*
|
||||
* The function `lloyd_optimize_periodic_3_mesh_3()` is a periodic mesh optimization
|
||||
* process based on the minimization of a global energy function.
|
||||
*
|
||||
* This function directly calls `lloyd_optimize_mesh_3()`, but is provided for convenience.
|
||||
* Further information can be found on the documentation of the function `lloyd_optimize_mesh_3()`.
|
||||
*
|
||||
* \note This function requires the \ref thirdpartyEigen library.
|
||||
*/
|
||||
template<typename C3T3, typename MeshDomain, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
Mesh_optimization_return_code lloyd_optimize_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain,const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
int max_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 0);
|
||||
const double convergence_ratio = choose_parameter(get_parameter(np, internal_np::convergence_ratio), 0.001);
|
||||
const double freeze_bound = choose_parameter(get_parameter(np, internal_np::vertex_freeze_bound), 0.001);
|
||||
const double time_limit = choose_parameter(get_parameter(np, internal_np::maximum_running_time), 0.);
|
||||
bool do_freeze = choose_parameter(get_parameter(np,internal_np::freeze),true);
|
||||
return lloyd_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iterations, convergence_ratio, freeze_bound, do_freeze);
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
int max_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 0);
|
||||
const double convergence_ratio = choose_parameter(get_parameter(np, internal_np::convergence_ratio), 0.001);
|
||||
const double freeze_bound = choose_parameter(get_parameter(np, internal_np::vertex_freeze_bound), 0.001);
|
||||
const double time_limit = choose_parameter(get_parameter(np, internal_np::maximum_running_time), 0.);
|
||||
bool do_freeze = choose_parameter(get_parameter(np,internal_np::freeze),true);
|
||||
return lloyd_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iterations, convergence_ratio, freeze_bound, do_freeze);
|
||||
}
|
||||
|
||||
template<typename C3T3, typename MeshDomain,typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
Mesh_optimization_return_code lloyd_optimize_periodic_3_mesh_3(C3T3& c3t3,MeshDomain& domain, const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return lloyd_optimize_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...));
|
||||
return lloyd_optimize_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
|
||||
} // namespace CGAL
|
||||
|
|
|
|||
|
|
@ -134,204 +134,207 @@ void project_points(C3T3& c3t3,
|
|||
} // namespace internal
|
||||
|
||||
/*!
|
||||
\ingroup PkgPeriodic3Mesh3Functions
|
||||
|
||||
The function `refine_periodic_3_mesh_3()` is a 3D periodic
|
||||
mesh generator. It produces periodic simplicial meshes which discretize
|
||||
3D periodic domains.
|
||||
|
||||
The periodic mesh generation algorithm is a Delaunay refinement process
|
||||
followed by an optimization phase.
|
||||
The criteria driving the Delaunay refinement
|
||||
process may be tuned to achieve the user needs with respect to
|
||||
the size of mesh elements, the accuracy of boundaries approximation, etc.
|
||||
|
||||
The optimization phase is a sequence of optimization processes,
|
||||
amongst the following available optimizers: an ODT-smoothing,
|
||||
a Lloyd smoothing, a sliver perturber, and a sliver exuder.
|
||||
Each optimization process can be activated or not, according to the user requirements
|
||||
and available time.
|
||||
By default, only the perturber and the exuder are activated.
|
||||
Note that the benefits of the exuder will be lost if the mesh
|
||||
is further refined afterward.
|
||||
|
||||
\attention The function template `refine_periodic_3_mesh_3()` may be used
|
||||
to refine a previously computed mesh, e.g.:
|
||||
\code{.cpp}
|
||||
C3T3 c3t3 = CGAL::make_periodic_3_mesh_3<C3T3>(domain,criteria);
|
||||
|
||||
CGAL::refine_periodic_3_mesh_3(c3t3, domain, new_criteria);
|
||||
\endcode
|
||||
|
||||
\attention Note that the triangulation must form at all times a simplicial complex within
|
||||
a single copy of the domain (see Sections \ref P3Triangulation3secspace and \ref P3Triangulation3secintro
|
||||
of the manual of 3D periodic triangulations). It is the responsability of the user to provide
|
||||
a triangulation that satisfies this condition when calling the refinement
|
||||
function `refine_periodic_3_mesh_3`. The underlying triangulation of a mesh
|
||||
complex obtained through `make_periodic_3_mesh_3()` or `refine_periodic_3_mesh_3()`
|
||||
will always satisfy this condition.
|
||||
|
||||
|
||||
\tparam C3T3 is required to be a model of
|
||||
the concept
|
||||
`MeshComplex_3InTriangulation_3`.
|
||||
The argument `c3t3` is passed by
|
||||
reference as this object is modified by the refinement process. As the
|
||||
refinement process only adds points to the triangulation, all
|
||||
vertices of the triangulation of `c3t3` remain in the
|
||||
mesh during the refinement process. Object `c3t3` can be used to insert
|
||||
specific points in the domain to ensure that they will be contained in the
|
||||
final triangulation.
|
||||
The type `C3T3` is in particular required to provide a nested type
|
||||
`C3T3::Triangulation` for the 3D triangulation
|
||||
embedding the mesh. The vertex and cell base classes of the
|
||||
triangulation `C3T3::Triangulation` are required to be models of the
|
||||
concepts `MeshVertexBase_3` and `MeshCellBase_3`
|
||||
respectively.
|
||||
|
||||
\tparam MD is required to be a model of
|
||||
the concept `Periodic_3MeshDomain_3` or of the refined concept
|
||||
`Periodic_3MeshDomainWithFeatures_3` if 0 and 1-dimensional features
|
||||
of the input complex have to be accurately represented in the mesh.
|
||||
The argument `domain` is the sole link through which the domain
|
||||
to be discretized is known by the mesh generation algorithm.
|
||||
|
||||
\tparam MC is required to be a model of the concept
|
||||
`MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3`
|
||||
if the domain has exposed features. The argument `criteria` of
|
||||
type `MC` specifies the
|
||||
size and shape requirements for mesh tetrahedra
|
||||
and surface facets. These criteria
|
||||
form the rules which drive the refinement process. All mesh elements
|
||||
satisfy those criteria at the end of the refinement process.
|
||||
In addition, if the domain has features, the argument
|
||||
`criteria` provides a sizing field to guide the discretization
|
||||
of 1-dimensional exposed features.
|
||||
|
||||
\param c3t3 the mesh to be refined.
|
||||
\param domain the domain to be discretized
|
||||
\param criteria the criteria
|
||||
\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below:
|
||||
|
||||
The following four parameters are optional optimization parameters.
|
||||
They control which optimization processes are performed
|
||||
and allow the user to tune the parameters of the optimization processes.
|
||||
Individual optimization parameters are not described here as they are
|
||||
internal types (see instead the documentation page of each optimizer).
|
||||
For each optimization algorithm, there exist two global functions
|
||||
that allow to enable or disable the optimizer:
|
||||
|
||||
\cgalNamedParamsBegin
|
||||
\cgalParamNBegin{manifold_option}
|
||||
\cgalParamDescription{allows the user to drive the meshing algorithm,
|
||||
and ensure that the output mesh surface follows the given manifold criterion.
|
||||
It can be activated with `parameters::manifold()`, `parameters::manifold_with_boundary()`
|
||||
and `parameters::non_manifold()`. Note that the meshing algorithm cannot generate a manifold
|
||||
surface if the input surface is not manifold.}
|
||||
\cgalParamType{`parameters::manifold()` OR `parameters::manifold_with_boundary()` OR `parameters::non_manifold()`}
|
||||
\cgalParamDefault{`parameters::non_manifold()`}
|
||||
|
||||
\cgalParamNBegin{lloyd_options}
|
||||
\cgalParamDescription{`parameters::lloyd()` and `parameters::no_lloyd()` are designed to
|
||||
trigger or not a call to `lloyd_optimize_mesh_3()` function and to set the
|
||||
parameters of this optimizer. If one parameter is not set, the default value of
|
||||
`lloyd_optimize_mesh_3()` is used for this parameter.}
|
||||
\cgalParamType{`parameters::lloyd()` OR `parameters::no_lloyd()`}
|
||||
\cgalParamDefault{`parameters::no_lloyd()'}
|
||||
|
||||
\cgalParamNBegin{odt_options}
|
||||
\cgalParamDescription{`parameters::odt()` and `parameters::no_odt()` are designed to
|
||||
trigger or not a call to `odt_optimize_mesh_3()` function and
|
||||
to set the parameters of this optimizer.
|
||||
If one parameter is not set, the default value of
|
||||
`odt_optimize_mesh_3()` is used for this parameter.}
|
||||
\cgalParamType{`parameters::odt()` OR `parameters::no_odt()`}
|
||||
\cgalParamDefault{`parameters::no_odt()`}
|
||||
|
||||
\cgalParamNBegin{perturb_options}
|
||||
\cgalParamDescription{`parameters::perturb()` and `parameters::no_perturb()` are designed to
|
||||
trigger or not a call to `perturb_mesh_3()` function and
|
||||
to set the parameters of this optimizer. If one parameter is not set, the default value of
|
||||
`perturb_mesh_3()` is used for this parameter, except for the time bound which is set to be
|
||||
equal to the refinement CPU time.}
|
||||
\cgalParamType{`parameters::perturb()` and `parameters::no_perturb()`}
|
||||
\cgalParamDefault{`parameters::no_perturb`}
|
||||
|
||||
\cgalParamNBegin{exude_options}
|
||||
\cgalParamDescription{parameters::exude()` and `parameters::no_exude()` are designed to
|
||||
trigger or not a call to `exude_mesh_3()` function and to override to set the
|
||||
parameters of this optimizer. If one parameter is not set, the default value of
|
||||
`exude_mesh_3()` is used for this parameter, except for the time bound which is set to be
|
||||
equal to the refinement CPU time.}
|
||||
\cgalParamType{`parameters::exude()` and `parameters::no_exude()`}
|
||||
\cgalParamDefault{`parameters::no_exude`}
|
||||
|
||||
\cgalNamedParamsEnd
|
||||
|
||||
The optimization parameters can be passed in arbitrary order. If one parameter
|
||||
is not passed, its default value is used. The default values are
|
||||
`no_lloyd()`, `no_odt()`, `perturb()` and `exude()`.
|
||||
Note that whatever may be the optimization processes activated,
|
||||
they are always launched in the order that is a suborder
|
||||
of the following (see user manual for further
|
||||
details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*.
|
||||
|
||||
Beware that optimization of the mesh is obtained
|
||||
by perturbing mesh vertices and modifying the mesh connectivity
|
||||
and that this has an impact
|
||||
on the strict compliance to the refinement criteria.
|
||||
Though a strict compliance to mesh criteria
|
||||
is guaranteed at the end of the Delaunay refinement, this may no longer be true after
|
||||
some optimization processes. Also beware that the default behavior does involve some
|
||||
optimization processes.
|
||||
|
||||
\sa `make_periodic_3_mesh_3()`
|
||||
\sa `refine_mesh_3()`
|
||||
\sa `exude_periodic_3_mesh_3()`
|
||||
\sa `perturb_periodic_3_mesh_3()`
|
||||
\sa `lloyd_optimize_periodic_3_mesh_3()`
|
||||
\sa `odt_optimize_periodic_3_mesh_3()`
|
||||
\sa `parameters::exude`
|
||||
\sa `parameters::no_exude`
|
||||
\sa `parameters::perturb`
|
||||
\sa `parameters::no_perturb`
|
||||
\sa `parameters::lloyd`
|
||||
\sa `parameters::no_lloyd`
|
||||
\sa `parameters::odt`
|
||||
\sa `parameters::no_odt`
|
||||
* \ingroup PkgPeriodic3Mesh3Functions
|
||||
*
|
||||
* The function `refine_periodic_3_mesh_3()` is a 3D periodic
|
||||
* mesh generator. It produces periodic simplicial meshes which discretize
|
||||
* 3D periodic domains.
|
||||
*
|
||||
* The periodic mesh generation algorithm is a Delaunay refinement process
|
||||
* followed by an optimization phase.
|
||||
* The criteria driving the Delaunay refinement
|
||||
* process may be tuned to achieve the user needs with respect to
|
||||
* the size of mesh elements, the accuracy of boundaries approximation, etc.
|
||||
*
|
||||
* The optimization phase is a sequence of optimization processes,
|
||||
* amongst the following available optimizers: an ODT-smoothing,
|
||||
* a Lloyd smoothing, a sliver perturber, and a sliver exuder.
|
||||
* Each optimization process can be activated or not, according to the user requirements
|
||||
* and available time.
|
||||
* By default, only the perturber and the exuder are activated.
|
||||
* Note that the benefits of the exuder will be lost if the mesh
|
||||
* is further refined afterward.
|
||||
*
|
||||
* \attention The function template `refine_periodic_3_mesh_3()` may be used
|
||||
* to refine a previously computed mesh, e.g.:
|
||||
* \code{.cpp}
|
||||
* C3T3 c3t3 = CGAL::make_periodic_3_mesh_3<C3T3>(domain,criteria);
|
||||
*
|
||||
* CGAL::refine_periodic_3_mesh_3(c3t3, domain, new_criteria);
|
||||
* \endcode
|
||||
*
|
||||
* \attention Note that the triangulation must form at all times a simplicial complex within
|
||||
* a single copy of the domain (see Sections \ref P3Triangulation3secspace and \ref P3Triangulation3secintro
|
||||
* of the manual of 3D periodic triangulations). It is the responsability of the user to provide
|
||||
* a triangulation that satisfies this condition when calling the refinement
|
||||
* function `refine_periodic_3_mesh_3`. The underlying triangulation of a mesh
|
||||
* complex obtained through `make_periodic_3_mesh_3()` or `refine_periodic_3_mesh_3()`
|
||||
* will always satisfy this condition.
|
||||
*
|
||||
*
|
||||
* \tparam C3T3 is required to be a model of
|
||||
* the concept
|
||||
* `MeshComplex_3InTriangulation_3`.
|
||||
* The argument `c3t3` is passed by
|
||||
* reference as this object is modified by the refinement process. As the
|
||||
* refinement process only adds points to the triangulation, all
|
||||
* vertices of the triangulation of `c3t3` remain in the
|
||||
* mesh during the refinement process. Object `c3t3` can be used to insert
|
||||
* specific points in the domain to ensure that they will be contained in the
|
||||
* final triangulation.
|
||||
* The type `C3T3` is in particular required to provide a nested type
|
||||
* `C3T3::Triangulation` for the 3D triangulation
|
||||
* embedding the mesh. The vertex and cell base classes of the
|
||||
* triangulation `C3T3::Triangulation` are required to be models of the
|
||||
* concepts `MeshVertexBase_3` and `MeshCellBase_3`
|
||||
* respectively.
|
||||
*
|
||||
* \tparam MD is required to be a model of
|
||||
* the concept `Periodic_3MeshDomain_3` or of the refined concept
|
||||
* `Periodic_3MeshDomainWithFeatures_3` if 0 and 1-dimensional features
|
||||
* of the input complex have to be accurately represented in the mesh.
|
||||
* The argument `domain` is the sole link through which the domain
|
||||
* to be discretized is known by the mesh generation algorithm.
|
||||
*
|
||||
* \tparam MC is required to be a model of the concept
|
||||
* `MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3`
|
||||
* if the domain has exposed features. The argument `criteria` of
|
||||
* type `MC` specifies the
|
||||
* size and shape requirements for mesh tetrahedra
|
||||
* and surface facets. These criteria
|
||||
* form the rules which drive the refinement process. All mesh elements
|
||||
* satisfy those criteria at the end of the refinement process.
|
||||
* In addition, if the domain has features, the argument
|
||||
* `criteria` provides a sizing field to guide the discretization
|
||||
* of 1-dimensional exposed features.
|
||||
*
|
||||
* \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters
|
||||
*
|
||||
* \param c3t3 the mesh to be refined.
|
||||
* \param domain the domain to be discretized
|
||||
* \param criteria the criteria
|
||||
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below:
|
||||
*
|
||||
* The following four parameters are optional optimization parameters.
|
||||
* They control which optimization processes are performed
|
||||
* and allow the user to tune the parameters of the optimization processes.
|
||||
* Individual optimization parameters are not described here as they are
|
||||
* internal types (see instead the documentation page of each optimizer).
|
||||
* For each optimization algorithm, there exist two global functions
|
||||
* that allow to enable or disable the optimizer:
|
||||
*
|
||||
* \cgalNamedParamsBegin
|
||||
* \cgalParamSectionBegin{Topological options (manifoldness)}
|
||||
* \cgalParamDescription{In order to drive the meshing algorithm and ensure that the output mesh follows a desired topological criterion,
|
||||
* three named parameters control this option:
|
||||
* <UL>
|
||||
* <LI>`parameters::manifold()`
|
||||
* <LI>`parameters::manifold_with_boundary()`
|
||||
* <LI>`parameters::non_manifold()`
|
||||
* </UL>
|
||||
* Note that the meshing algorithm cannot generate a manifold surface if the input surface is not manifold.}
|
||||
* \cgalParamDefault{`parameters::non_manifold()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Lloyd optimization}
|
||||
* \cgalParamDescription{`lloyd_optimize_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::no_lloyd()`
|
||||
* <LI> `parameters::lloyd_optimize_mesh_3()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::no_lloyd()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{ODT optimization}
|
||||
* \cgalParamDescription{`odt_optimize_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::no_odt()`
|
||||
* <LI> `parameters::odt()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::no_odt()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Mesh perturbation}
|
||||
* \cgalParamDescription{`perturb_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::no_perturb()`
|
||||
* <LI> `parameters::perturb()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::perturb()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalParamSectionBegin{Mesh exudation}
|
||||
* \cgalParamDescription{`exude_mesh_3()` can optionally be called after the meshing process.
|
||||
* Two named parameters control this behavior:
|
||||
* <UL>
|
||||
* <LI> `parameters::exude()`
|
||||
* <LI> `parameters::no_exude()`
|
||||
* </UL>}
|
||||
* \cgalParamDefault{`parameters::exude()`}
|
||||
* \cgalParamSectionEnd
|
||||
* \cgalNamedParamsEnd
|
||||
*
|
||||
* The optimization parameters can be passed in arbitrary order. If one parameter
|
||||
* is not passed, its default value is used. The default values are
|
||||
* `no_lloyd()`, `no_odt()`, `perturb()` and `exude()`.
|
||||
* Note that whatever may be the optimization processes activated,
|
||||
* they are always launched in the order that is a suborder
|
||||
* of the following (see user manual for further
|
||||
* details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*.
|
||||
*
|
||||
* Beware that optimization of the mesh is obtained
|
||||
* by perturbing mesh vertices and modifying the mesh connectivity
|
||||
* and that this has an impact
|
||||
* on the strict compliance to the refinement criteria.
|
||||
* Though a strict compliance to mesh criteria
|
||||
* is guaranteed at the end of the Delaunay refinement, this may no longer be true after
|
||||
* some optimization processes. Also beware that the default behavior does involve some
|
||||
* optimization processes.
|
||||
*
|
||||
* \sa `make_periodic_3_mesh_3()`
|
||||
* \sa `refine_mesh_3()`
|
||||
* \sa `exude_periodic_3_mesh_3()`
|
||||
* \sa `perturb_periodic_3_mesh_3()`
|
||||
* \sa `lloyd_optimize_periodic_3_mesh_3()`
|
||||
* \sa `odt_optimize_periodic_3_mesh_3()`
|
||||
* \sa `parameters::exude`
|
||||
* \sa `parameters::no_exude`
|
||||
* \sa `parameters::perturb`
|
||||
* \sa `parameters::no_perturb`
|
||||
* \sa `parameters::lloyd`
|
||||
* \sa `parameters::no_lloyd`
|
||||
* \sa `parameters::odt`
|
||||
* \sa `parameters::no_odt`
|
||||
*/
|
||||
|
||||
|
||||
template<typename C3T3, typename MeshDomain, typename MeshCriteria, typename CGAL_NP_TEMPLATE_PARAMETERS>
|
||||
void refine_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& np = parameters::default_values())
|
||||
{
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::no_exude().v);
|
||||
parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::no_perturb().v);
|
||||
parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v);
|
||||
parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v);
|
||||
bool reset = choose_parameter(get_parameter(np, internal_np::do_reset_c3t3), false);
|
||||
parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options());
|
||||
parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options());
|
||||
using parameters::choose_parameter;
|
||||
using parameters::get_parameter;
|
||||
parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::no_exude().v);
|
||||
parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::no_perturb().v);
|
||||
parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v);
|
||||
parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v);
|
||||
bool reset = choose_parameter(get_parameter(np, internal_np::do_reset_c3t3), false);
|
||||
parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options());
|
||||
parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options());
|
||||
|
||||
return refine_periodic_3_mesh_3_impl(c3t3,
|
||||
domain,
|
||||
criteria,
|
||||
exude_param,
|
||||
perturb_param,
|
||||
odt_param,
|
||||
lloyd_param,
|
||||
reset,
|
||||
mesh_options_param,
|
||||
manifold_options_param);
|
||||
return refine_periodic_3_mesh_3_impl(c3t3,
|
||||
domain,
|
||||
criteria,
|
||||
exude_param,
|
||||
perturb_param,
|
||||
odt_param,
|
||||
lloyd_param,
|
||||
reset,
|
||||
mesh_options_param,
|
||||
manifold_options_param);
|
||||
}
|
||||
|
||||
#ifndef DOXYGEN_RUNNING
|
||||
template<typename C3T3, typename MeshDomain, typename MeshCriteria, typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
||||
void refine_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& ... nps)
|
||||
{
|
||||
return refine_periodic_3_mesh_3(c3t3, domain, criteria, internal_np::combine_named_parameters(nps...));
|
||||
return refine_periodic_3_mesh_3(c3t3, domain, criteria, internal_np::combine_named_parameters(nps...));
|
||||
}
|
||||
/**
|
||||
* @brief This function refines the mesh c3t3 wrt domain & criteria
|
||||
|
|
|
|||
Loading…
Reference in New Issue