11#include <fmt/ostream.h>
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>
27namespace po = boost::program_options;
29static constexpr string_view USAGE{
30 R
"(Causal Dynamical Triangulations in C++ using CGAL.
32Copyright (c) 2014 Adam Getchell
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.
39Usage:./initialize (--spherical | --toroidal) -n SIMPLICES -t TIMESLICES
41 [--init INITIAL RADIUS]
42 [--foliate FOLIATION SPACING]
47Optional arguments are in square brackets.
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
55auto main(
int const argc,
char*
const argv[]) ->
int
58 std::string
const intro{USAGE};
60 long long simplices{};
61 long long timeslices{};
62 long long dimensions{};
63 double initial_radius{};
64 double foliation_spacing{};
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>(×lices),
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),
80 "foliate,f", po::value<double>(&foliation_spacing)->default_value(1.0),
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");
88 po::variables_map args;
89 po::store(po::parse_command_line(argc, argv, description), args);
91 if (args.count(
"help"))
93 fmt::print(
"{}\n", fmt::streamed(description));
97 if (args.count(
"version"))
99 fmt::print(
"CDT initializer version {}\n", cdt::VERSION);
105 if (!args.count(
"simplices"))
107 throw invalid_argument(
"Number of simplices not specified.");
109 if (!args.count(
"timeslices"))
111 throw invalid_argument(
"Number of timeslices not specified.");
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()};
125 auto const save_file = args.count(
"output") != 0;
126 auto initialization_random =
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());
139 if (save_file) { fmt::print(
"Output will be saved.\n"); }
142 initialization_random, config.initial_radius(),
143 config.foliation_spacing());
145 universe.print_volume_per_timeslice();
146 fmt::print(
"Final number of simplices: {}\n", universe.N3());
150 universe, config.seed(),
152 metadata.desired_simplices = config.simplices();
153 metadata.desired_timeslices = config.timeslices();
154 metadata.max_threads = config.threads();
159catch (invalid_argument
const& InvalidArgument)
161 spdlog::critical(
"{}\n", InvalidArgument.what());
162 spdlog::critical(
"Invalid parameter ... Exiting.\n");
165catch (std::exception
const& Exception)
167 spdlog::critical(
"{}\n", Exception.what());
172 spdlog::critical(
"Something went wrong ... Exiting.\n");
Data structures for manifolds.
Manifold< 3 > Manifold_3
Three-dimensional spherical CDT manifold.
constexpr RandomStream initialization
Stream reserved for initial triangulation generation.
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.
clang-15 does not support std::format