CDT++ 1.0.0
Causal Dynamical Triangulations in C++
Loading...
Searching...
No Matches
initialize.cpp
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#include <fmt/ostream.h>
12
13#include <boost/program_options.hpp>
14#if defined(CDT_ENABLE_PARALLEL_TRIANGULATION) && \
15 CDT_ENABLE_PARALLEL_TRIANGULATION
16#include <oneapi/tbb/global_control.h>
17#endif
18
19#include <cstdint>
20
21#include "Manifold.hpp"
22#include "Runtime_config.hpp"
23#include "Version.hpp"
24
25using namespace cdt;
26using namespace std;
27namespace po = boost::program_options;
28
29static constexpr string_view USAGE{
30 R"(Causal Dynamical Triangulations in C++ using CGAL.
31
32Copyright (c) 2014 Adam Getchell
33
34A program that generates d-dimensional triangulated spacetimes
35with a defined causal structure. Specify the topology of the triangulation
36(spherical or toroidal), the desired number of simplices, and the
37desired number of timeslices.
38
39Usage:./initialize (--spherical | --toroidal) -n SIMPLICES -t TIMESLICES
40 [-d DIM]
41 [--init INITIAL RADIUS]
42 [--foliate FOLIATION SPACING]
43 [--seed SEED]
44 [--threads THREADS]
45 [--output]
46
47Optional arguments are in square brackets.
48
49Examples:
50./initialize --spherical --simplices 32000 --timeslices 11 --init 1.0 --foliate 1.0 --output
51./initialize -s -n32000 -t11 -i1.0 -f1.0 -o --seed 92
52
53Options)"};
54
55auto main(int const argc, char* const argv[]) -> int
56try
57{
58 std::string const intro{USAGE};
59 // Parsed arguments
60 long long simplices{};
61 long long timeslices{};
62 long long dimensions{};
63 double initial_radius{};
64 double foliation_spacing{};
65 std::uint64_t seed{};
66 long long threads{};
67
68 po::options_description description(intro);
69 description.add_options()("help,h", "Show this message")(
70 "version,v", "Show program version")("spherical,s", "Spherical topology")(
71 "toroidal,e", "Toroidal topology")("simplices,n",
72 po::value<long long>(&simplices),
73 "Approximate number of simplices")(
74 "timeslices,t", po::value<long long>(&timeslices),
75 "Number of timeslices")(
76 "dimensions,d", po::value<long long>(&dimensions)->default_value(3),
77 "Dimensionality")("init,i",
78 po::value<double>(&initial_radius)->default_value(1.0),
79 "Initial radius")(
80 "foliate,f", po::value<double>(&foliation_spacing)->default_value(1.0),
81 "Foliation spacing")(
82 "seed", po::value<std::uint64_t>(&seed),
83 "Root random seed (default: operating-system entropy)")(
84 "threads", po::value<long long>(&threads)->default_value(1),
85 "Maximum worker threads for supported Delaunay operations")(
86 "output,o", "Save triangulation into OFF file");
87
88 po::variables_map args;
89 po::store(po::parse_command_line(argc, argv, description), args);
90
91 if (args.count("help"))
92 {
93 fmt::print("{}\n", fmt::streamed(description));
94 return EXIT_SUCCESS;
95 }
96
97 if (args.count("version"))
98 {
99 fmt::print("CDT initializer version {}\n", cdt::VERSION);
100 return EXIT_SUCCESS;
101 }
102
103 po::notify(args);
104
105 if (!args.count("simplices"))
106 {
107 throw invalid_argument("Number of simplices not specified.");
108 }
109 if (!args.count("timeslices"))
110 {
111 throw invalid_argument("Number of timeslices not specified.");
112 }
113
114 auto root_random =
115 args.count("seed") != 0 ? cdt::Random{seed} : cdt::Random{};
116 auto const config = runtime_config::make_triangulation(
117 args.count("spherical") != 0, args.count("toroidal") != 0, simplices,
118 timeslices, dimensions, initial_radius, foliation_spacing,
119 root_random.seed(), threads);
120#if defined(CDT_ENABLE_PARALLEL_TRIANGULATION) && \
121 CDT_ENABLE_PARALLEL_TRIANGULATION
122 [[maybe_unused]] oneapi::tbb::global_control thread_limit{
123 oneapi::tbb::global_control::max_allowed_parallelism, config.threads()};
124#endif
125 auto const save_file = args.count("output") != 0;
126 auto initialization_random =
127 root_random.split(cdt::random_streams::initialization);
128
129 // Display job parameters
130 fmt::print("Topology is {}\n", utilities::topology_to_str(config.topology()));
131 fmt::print("Number of dimensions = {}\n", config.dimensions());
132 fmt::print("Number of desired simplices = {}\n", config.simplices());
133 fmt::print("Number of desired timeslices = {}\n", config.timeslices());
134 fmt::print("Initial radius = {}\n", config.initial_radius());
135 fmt::print("Foliation spacing = {}\n", config.foliation_spacing());
136 fmt::print("Effective random seed: {}\n", root_random.seed());
137 fmt::print("Maximum Delaunay threads: {}\n", config.threads());
138
139 if (save_file) { fmt::print("Output will be saved.\n"); }
140
141 manifolds::Manifold_3 universe(config.simplices(), config.timeslices(),
142 initialization_random, config.initial_radius(),
143 config.foliation_spacing());
144 universe.print();
145 universe.print_volume_per_timeslice();
146 fmt::print("Final number of simplices: {}\n", universe.N3());
147 if (save_file)
148 {
150 universe, config.seed(),
152 metadata.desired_simplices = config.simplices();
153 metadata.desired_timeslices = config.timeslices();
154 metadata.max_threads = config.threads();
155 utilities::write_file(universe, metadata);
156 }
157 return EXIT_SUCCESS;
158}
159catch (invalid_argument const& InvalidArgument)
160{
161 spdlog::critical("{}\n", InvalidArgument.what());
162 spdlog::critical("Invalid parameter ... Exiting.\n");
163 return EXIT_FAILURE;
164}
165catch (std::exception const& Exception)
166{
167 spdlog::critical("{}\n", Exception.what());
168 return EXIT_FAILURE;
169}
170catch (...)
171{
172 spdlog::critical("Something went wrong ... Exiting.\n");
173 return EXIT_FAILURE;
174}
Data structures for manifolds.
Manifold< 3 > Manifold_3
Three-dimensional spherical CDT manifold.
Definition Manifold.hpp:373
constexpr RandomStream initialization
Stream reserved for initial triangulation generation.
Definition Random.hpp:120
Validated runtime configuration for CDT++ command-line programs.
auto make_triangulation(bool const spherical, bool const toroidal, long long const simplices, long long const timeslices, long long const dimensions, double const initial_radius, double const foliation_spacing, cdt::RandomSeed const seed=cdt::RandomSeed{}, long long const threads=1) -> Triangulation
Validate raw triangulation options and narrow them into project types.
@ INITIAL_TRIANGULATION
Initial state before stochastic transitions.
void write_file(std::filesystem::path const &filename, TriangulationType const &triangulation)
Write triangulation to file.
auto make_reproducibility_metadata(ManifoldType const &manifold, cdt::RandomSeed const seed, ArtifactKind const artifact) -> Reproducibility_metadata
Build provenance from a canonical manifold state.
auto topology_to_str(Topology const &t_topology) -> std::string
Convert a topology to a string using it's << operator.
A run-owned PCG engine with a recorded seed and stream identifier.
Definition Random.hpp:137
clang-15 does not support std::format