11#ifndef CDT_PLUSPLUS_MANIFOLD_HPP
12#define CDT_PLUSPLUS_MANIFOLD_HPP
16#include <unordered_set>
21namespace cdt::manifolds
28 template <
int dimension>
39 template <
int dimension>
44 class [[nodiscard(
"This contains data!")]]
Manifold<3>
49 static_assert(std::is_nothrow_swappable_v<Triangulation>,
50 "Manifold swap requires a non-throwing triangulation swap.");
51 static_assert(std::is_nothrow_swappable_v<Geometry>,
52 "Manifold swap requires a non-throwing geometry swap.");
54 std::is_nothrow_move_constructible_v<Triangulation> &&
55 std::is_nothrow_move_constructible_v<Geometry>,
56 "Manifold move construction requires non-throwing member moves.");
58 Triangulation m_triangulation;
95 if (
this != &other) {
swap(other, *
this); }
106 swap(swap_from.m_triangulation, swap_into.m_triangulation);
107 swap(swap_from.m_geometry, swap_into.m_geometry);
112 explicit Manifold(Triangulation t_foliated_triangulation)
113 : m_triangulation{std::move(t_foliated_triangulation)}
114 , m_geometry{m_triangulation}
134 Triangulation{t_desired_simplices, t_desired_timeslices,
135 generator, t_initial_radius, t_foliation_spacing}
153 :
Manifold{t_desired_simplices, t_desired_timeslices, generator,
154 t_initial_radius, t_foliation_spacing}
169 Triangulation{causal_vertices, t_initial_radius,
185 if (m_triangulation.number_of_vertices() == 0) {
return Manifold{}; }
187 Triangulation{m_triangulation.delaunay_snapshot(),
188 m_triangulation.initial_radius(),
189 m_triangulation.foliation_spacing()}
197 {
return m_triangulation.delaunay_snapshot(); }
200 [[nodiscard]]
auto geometry() const -> Geometry const&
201 {
return m_geometry; }
206 {
return m_triangulation.is_foliated(); }
211 {
return m_triangulation.is_delaunay(); }
216 {
return m_triangulation.is_tds_valid(); }
220 {
return m_triangulation.is_structurally_correct(); }
229 {
return m_triangulation.is_correct_with_diagnostics(); }
233 {
return m_triangulation.dimension(); }
237 {
return m_triangulation.initial_radius(); }
241 {
return m_triangulation.foliation_spacing(); }
244 [[nodiscard]]
auto N3()
const {
return m_geometry.N3; }
247 [[nodiscard]]
auto N3_31()
const {
return m_geometry.N3_31; }
250 [[nodiscard]]
auto N3_22()
const {
return m_geometry.N3_22; }
253 [[nodiscard]]
auto N3_13()
const {
return m_geometry.N3_13; }
256 [[nodiscard]]
auto N3_31_13()
const {
return m_geometry.N3_31_13; }
262 m_triangulation.number_of_finite_cells());
266 [[nodiscard]]
auto N2()
const {
return m_geometry.N2; }
272 {
return m_triangulation.spacelike_face_count(timevalue); }
278 m_triangulation.number_of_finite_facets());
282 [[nodiscard]]
auto N1()
const {
return m_geometry.N1; }
285 [[nodiscard]]
auto N1_SL()
const {
return m_triangulation.N1_SL(); }
288 [[nodiscard]]
auto N1_TL()
const {
return m_triangulation.N1_TL(); }
294 m_triangulation.number_of_finite_edges());
298 [[nodiscard]]
auto N0()
const {
return m_geometry.N0; }
303 return static_cast<Int_precision>(m_triangulation.number_of_vertices());
308 {
return m_triangulation.min_time(); }
312 {
return m_triangulation.max_time(); }
319 m_triangulation.check_all_cells();
324 {
return m_triangulation.check_all_vertices(); }
329 m_triangulation.print_volume_per_timeslice();
344 "Manifold has {} vertices and {} edges and {} faces and {} "
346 this->
N0(), this->
N1(), this->
N2(), this->
N3());
350 fmt::print(stderr,
"print() went wrong ...\n");
359 "There are {} (3,1) simplices and {} (2,2) simplices and {} (1,3) "
362 fmt::print(
"There are {} timelike edges and {} spacelike edges.\n",
367 fmt::print(stderr,
"print_details() went wrong ...\n");
Geometric scalars of the Manifold used to calculate the Regge action.
auto make_causal_vertices(std::span< Point_t< dimension > const > vertices, std::span< size_t const > const timevalues) -> Causal_vertices_t< dimension >
Create Causal vertices.
Manifold< 3 > Manifold_3
Three-dimensional spherical CDT manifold.
Run-owned random-number generation and reproducible stream splitting.
#define CDT_PRETTY_FUNCTION
Cross-platform spelling of the current function signature for diagnostics.
A run-owned PCG engine with a recorded seed and stream identifier.
auto operator=(Manifold &&other) noexcept -> Manifold &
Default move assignment.
Manifold(Int_precision const t_desired_simplices, Int_precision const t_desired_timeslices, cdt::Random &generator, double const t_initial_radius=INITIAL_RADIUS, double const t_foliation_spacing=FOLIATION_SPACING)
Construct a manifold with a caller-owned initialization stream.
void print_cells() const
Print timevalues of each vertex in the cell and the resulting cell->info().
Manifold(Manifold const &other)=default
Default copy ctor.
auto operator=(Manifold const &other) -> Manifold &=default
Default copy assignment.
auto dimensionality() const
auto updated() const -> Manifold
Return a manifold rebuilt from the current canonical topology.
void print_volume_per_timeslice() const
Print the codimension 1 volume of simplices (faces) per timeslice.
void print() const
Print manifold.
auto is_correct_with_diagnostics() const -> bool
auto is_valid() const -> bool
Forwarding to FoliatedTriangulation.is_tds_valid().
friend void swap(Manifold &swap_from, Manifold &swap_into) noexcept
Non-member swap function for Manifolds.
void print_details() const
Print details of the manifold.
auto spacelike_face_count(Int_precision const timevalue) const noexcept -> std::size_t
Manifold(Triangulation t_foliated_triangulation)
Construct manifold from a Foliated triangulation.
Manifold(Int_precision const t_desired_simplices, Int_precision const t_desired_timeslices, cdt::Random &&generator, double const t_initial_radius=INITIAL_RADIUS, double const t_foliation_spacing=FOLIATION_SPACING)
Construct from an explicit temporary initialization stream.
auto check_vertices() const -> bool
Manifold(Causal_vertices_t< 3 > const &causal_vertices, double const t_initial_radius=INITIAL_RADIUS, double const t_foliation_spacing=FOLIATION_SPACING)
Construct manifold from Causal_vertices.
void print_vertices() const
Print values of a vertex->info().
auto is_correct() const -> bool
~Manifold()=default
Default dtor.
auto is_structurally_correct() const -> bool
Manifold()=default
Default ctor.
auto check_simplices() const -> bool
auto geometry() const -> Geometry const &
static constexpr int dimension
Dimensionality of the manifold.
static constexpr Topology topology
Topology of the manifold.
auto initial_radius() const
Manifold(Manifold &&other) noexcept=default
Default move ctor.
auto is_delaunay() const -> bool
Forwarding to FoliatedTriangulation.is_delaunay().
auto is_foliated() const -> bool
Forwarding to FoliatedTriangulation_3.is_foliated().
auto delaunay_snapshot() const -> Delaunay_t< 3 >
auto foliation_spacing() const
auto make_causal_vertices(std::span< Point_t< dimension > const > vertices, std::span< size_t const > timevalues) -> Causal_vertices_t< dimension >
Create causal vertices from vertices and timevalues.
FoliatedTriangulation< 3 > FoliatedTriangulation_3
Three-dimensional foliated Delaunay triangulation.
typename detail::TriangulationTraits< dimension >::Point Point_t
Cartesian point type used by a triangulation dimension.
constexpr double INITIAL_RADIUS
Default initial radius for generated foliated triangulations.
constexpr double FOLIATION_SPACING
Default distance between successive foliated timeslices.
Topology
Spatial-topology label stored by configuration and persistence APIs.
@ SPHERICAL
Supported spherical spatial slices.
typename detail::TriangulationTraits< dimension >::Delaunay Delaunay_t
Delaunay triangulation type for dimension spatial dimensions.
std::vector< std::pair< Point_t< dimension >, Int_precision > > Causal_vertices_t
Point/time-label pairs used to build a causal triangulation.
std::int32_t Int_precision
Geometry< 3 > Geometry_3
Three-dimensional simplex-count geometry.