CDT++ 1.0.0
Causal Dynamical Triangulations in C++
Loading...
Searching...
No Matches
Manifold.hpp
Go to the documentation of this file.
1/*******************************************************************************
2 Causal Dynamical Triangulations in C++ using CGAL
3
4 Copyright © 2018 Adam Getchell
5 ******************************************************************************/
6
10
11#ifndef CDT_PLUSPLUS_MANIFOLD_HPP
12#define CDT_PLUSPLUS_MANIFOLD_HPP
13
14#include <cstddef>
15#include <type_traits>
16#include <unordered_set>
17
18#include "Geometry.hpp"
19#include "Random.hpp"
20
21namespace cdt::manifolds
22{
28 template <int dimension>
29 [[nodiscard]] auto make_causal_vertices(
30 std::span<Point_t<dimension> const> vertices,
31 std::span<size_t const> const timevalues) -> Causal_vertices_t<dimension>
32 {
34 timevalues);
35 }
36
39 template <int dimension>
40 class Manifold;
41
43 template <>
44 class [[nodiscard("This contains data!")]] Manifold<3>
45 {
47 using Geometry = Geometry_3;
48
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.");
53 static_assert(
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;
59
61 Geometry m_geometry;
62
63 public:
66 static constexpr int dimension = 3;
67
70
72 ~Manifold() = default;
73
75 Manifold() = default;
76
79 Manifold(Manifold const& other) = default;
80
84 auto operator=(Manifold const& other) -> Manifold& = default;
85
88 Manifold(Manifold&& other) noexcept = default;
89
93 auto operator=(Manifold&& other) noexcept -> Manifold&
94 {
95 if (this != &other) { swap(other, *this); }
96 return *this;
97 }
98
103 friend void swap(Manifold& swap_from, Manifold& swap_into) noexcept
104 {
105 using std::swap;
106 swap(swap_from.m_triangulation, swap_into.m_triangulation);
107 swap(swap_from.m_geometry, swap_into.m_geometry);
108 } // swap
109
112 explicit Manifold(Triangulation t_foliated_triangulation)
113 : m_triangulation{std::move(t_foliated_triangulation)}
114 , m_geometry{m_triangulation}
115 {}
116
129 Manifold(Int_precision const t_desired_simplices,
130 Int_precision const t_desired_timeslices, cdt::Random& generator,
131 double const t_initial_radius = INITIAL_RADIUS,
132 double const t_foliation_spacing = FOLIATION_SPACING)
133 : Manifold{
134 Triangulation{t_desired_simplices, t_desired_timeslices,
135 generator, t_initial_radius, t_foliation_spacing}
136 }
137 {}
138
149 Manifold(Int_precision const t_desired_simplices,
150 Int_precision const t_desired_timeslices, cdt::Random&& generator,
151 double const t_initial_radius = INITIAL_RADIUS,
152 double const t_foliation_spacing = FOLIATION_SPACING)
153 : Manifold{t_desired_simplices, t_desired_timeslices, generator,
154 t_initial_radius, t_foliation_spacing}
155 {}
156
165 explicit Manifold(Causal_vertices_t<3> const& causal_vertices,
166 double const t_initial_radius = INITIAL_RADIUS,
167 double const t_foliation_spacing = FOLIATION_SPACING)
168 : Manifold{
169 Triangulation{causal_vertices, t_initial_radius,
170 t_foliation_spacing}
171 }
172 {}
173
180 [[nodiscard]] auto updated() const -> Manifold
181 {
182#ifndef NDEBUG
183 spdlog::debug("{} called.\n", CDT_PRETTY_FUNCTION);
184#endif
185 if (m_triangulation.number_of_vertices() == 0) { return Manifold{}; }
186 return Manifold{
187 Triangulation{m_triangulation.delaunay_snapshot(),
188 m_triangulation.initial_radius(),
189 m_triangulation.foliation_spacing()}
190 };
191 } // updated
192
196 [[nodiscard]] auto delaunay_snapshot() const -> Delaunay_t<3>
197 { return m_triangulation.delaunay_snapshot(); }
198
200 [[nodiscard]] auto geometry() const -> Geometry const&
201 { return m_geometry; } // geometry
202
205 [[nodiscard]] auto is_foliated() const -> bool
206 { return m_triangulation.is_foliated(); } // is_foliated
207
210 [[nodiscard]] auto is_delaunay() const -> bool
211 { return m_triangulation.is_delaunay(); } // is_delaunay
212
215 [[nodiscard]] auto is_valid() const -> bool
216 { return m_triangulation.is_tds_valid(); } // is_valid
217
219 [[nodiscard]] auto is_structurally_correct() const -> bool
220 { return m_triangulation.is_structurally_correct(); }
221
223 [[nodiscard]] auto is_correct() const -> bool
224 { return is_structurally_correct(); } // is_correct
225
228 [[nodiscard]] auto is_correct_with_diagnostics() const -> bool
229 { return m_triangulation.is_correct_with_diagnostics(); }
230
232 [[nodiscard]] auto dimensionality() const
233 { return m_triangulation.dimension(); }
234
236 [[nodiscard]] auto initial_radius() const
237 { return m_triangulation.initial_radius(); }
238
240 [[nodiscard]] auto foliation_spacing() const
241 { return m_triangulation.foliation_spacing(); }
242
244 [[nodiscard]] auto N3() const { return m_geometry.N3; }
245
247 [[nodiscard]] auto N3_31() const { return m_geometry.N3_31; }
248
250 [[nodiscard]] auto N3_22() const { return m_geometry.N3_22; }
251
253 [[nodiscard]] auto N3_13() const { return m_geometry.N3_13; }
254
256 [[nodiscard]] auto N3_31_13() const { return m_geometry.N3_31_13; }
257
259 [[nodiscard]] auto simplices() const
260 {
261 return static_cast<Int_precision>(
262 m_triangulation.number_of_finite_cells());
263 } // number_of_simplices
264
266 [[nodiscard]] auto N2() const { return m_geometry.N2; }
267
270 [[nodiscard]] auto spacelike_face_count(
271 Int_precision const timevalue) const noexcept -> std::size_t
272 { return m_triangulation.spacelike_face_count(timevalue); }
273
275 [[nodiscard]] auto faces() const
276 {
277 return static_cast<Int_precision>(
278 m_triangulation.number_of_finite_facets());
279 } // faces
280
282 [[nodiscard]] auto N1() const { return m_geometry.N1; }
283
285 [[nodiscard]] auto N1_SL() const { return m_triangulation.N1_SL(); }
286
288 [[nodiscard]] auto N1_TL() const { return m_triangulation.N1_TL(); }
289
291 [[nodiscard]] auto edges() const
292 {
293 return static_cast<Int_precision>(
294 m_triangulation.number_of_finite_edges());
295 } // edges
296
298 [[nodiscard]] auto N0() const { return m_geometry.N0; }
299
301 [[nodiscard]] auto vertices() const
302 {
303 return static_cast<Int_precision>(m_triangulation.number_of_vertices());
304 } // vertices
305
307 [[nodiscard]] auto min_time() const
308 { return m_triangulation.min_time(); } // min_time
309
311 [[nodiscard]] auto max_time() const
312 { return m_triangulation.max_time(); } // max_time
313
316 [[nodiscard]] auto check_simplices() const -> bool
317 {
318 return this->simplices() == this->N3() &&
319 m_triangulation.check_all_cells();
320 } // check_simplices
321
323 [[nodiscard]] auto check_vertices() const -> bool
324 { return m_triangulation.check_all_vertices(); }
325
328 {
329 m_triangulation.print_volume_per_timeslice();
330 } // print_volume_per_timeslice
331
333 void print_vertices() const { m_triangulation.print_vertices(); }
334
337 void print_cells() const { m_triangulation.print_cells(); }
338
340 void print() const
341 try
342 {
343 fmt::print(
344 "Manifold has {} vertices and {} edges and {} faces and {} "
345 "simplices.\n",
346 this->N0(), this->N1(), this->N2(), this->N3());
347 }
348 catch (...)
349 {
350 fmt::print(stderr, "print() went wrong ...\n");
351 throw;
352 } // print
353
355 void print_details() const
356 try
357 {
358 fmt::print(
359 "There are {} (3,1) simplices and {} (2,2) simplices and {} (1,3) "
360 "simplices.\n",
361 this->N3_31(), this->N3_22(), this->N3_13());
362 fmt::print("There are {} timelike edges and {} spacelike edges.\n",
363 this->N1_TL(), this->N1_SL());
364 }
365 catch (...)
366 {
367 fmt::print(stderr, "print_details() went wrong ...\n");
368 throw;
369 } // print_details
370 };
371
374
375} // namespace cdt::manifolds
376
377#endif // CDT_PLUSPLUS_MANIFOLD_HPP
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.
Definition Manifold.hpp:29
Manifold< 3 > Manifold_3
Three-dimensional spherical CDT manifold.
Definition Manifold.hpp:373
Run-owned random-number generation and reproducible stream splitting.
#define CDT_PRETTY_FUNCTION
Cross-platform spelling of the current function signature for diagnostics.
Definition Settings.hpp:37
A run-owned PCG engine with a recorded seed and stream identifier.
Definition Random.hpp:137
auto operator=(Manifold &&other) noexcept -> Manifold &
Default move assignment.
Definition Manifold.hpp:93
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.
Definition Manifold.hpp:129
void print_cells() const
Print timevalues of each vertex in the cell and the resulting cell->info().
Definition Manifold.hpp:337
Manifold(Manifold const &other)=default
Default copy ctor.
auto operator=(Manifold const &other) -> Manifold &=default
Default copy assignment.
auto updated() const -> Manifold
Return a manifold rebuilt from the current canonical topology.
Definition Manifold.hpp:180
void print_volume_per_timeslice() const
Print the codimension 1 volume of simplices (faces) per timeslice.
Definition Manifold.hpp:327
void print() const
Print manifold.
Definition Manifold.hpp:340
auto is_correct_with_diagnostics() const -> bool
Definition Manifold.hpp:228
auto is_valid() const -> bool
Forwarding to FoliatedTriangulation.is_tds_valid().
Definition Manifold.hpp:215
friend void swap(Manifold &swap_from, Manifold &swap_into) noexcept
Non-member swap function for Manifolds.
Definition Manifold.hpp:103
void print_details() const
Print details of the manifold.
Definition Manifold.hpp:355
auto spacelike_face_count(Int_precision const timevalue) const noexcept -> std::size_t
Definition Manifold.hpp:270
Manifold(Triangulation t_foliated_triangulation)
Construct manifold from a Foliated triangulation.
Definition Manifold.hpp:112
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.
Definition Manifold.hpp:149
auto check_vertices() const -> bool
Definition Manifold.hpp:323
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.
Definition Manifold.hpp:165
void print_vertices() const
Print values of a vertex->info().
Definition Manifold.hpp:333
auto is_correct() const -> bool
Definition Manifold.hpp:223
~Manifold()=default
Default dtor.
auto is_structurally_correct() const -> bool
Definition Manifold.hpp:219
Manifold()=default
Default ctor.
auto check_simplices() const -> bool
Definition Manifold.hpp:316
auto geometry() const -> Geometry const &
Definition Manifold.hpp:200
static constexpr int dimension
Dimensionality of the manifold.
Definition Manifold.hpp:66
static constexpr Topology topology
Topology of the manifold.
Definition Manifold.hpp:69
Manifold(Manifold &&other) noexcept=default
Default move ctor.
auto is_delaunay() const -> bool
Forwarding to FoliatedTriangulation.is_delaunay().
Definition Manifold.hpp:210
auto is_foliated() const -> bool
Forwarding to FoliatedTriangulation_3.is_foliated().
Definition Manifold.hpp:205
auto delaunay_snapshot() const -> Delaunay_t< 3 >
Definition Manifold.hpp:196
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.
Definition Settings.hpp:47
constexpr double FOLIATION_SPACING
Default distance between successive foliated timeslices.
Definition Settings.hpp:49
Topology
Spatial-topology label stored by configuration and persistence APIs.
Definition Utilities.hpp:74
@ SPHERICAL
Supported spherical spatial slices.
Definition Utilities.hpp:76
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
Definition Settings.hpp:30
Geometry< 3 > Geometry_3
Three-dimensional simplex-count geometry.
Definition Geometry.hpp:113