11#define DOCTEST_CONFIG_DISABLE
14#include <CGAL/draw_triangulation_3.h>
16#define DOCTEST_CONFIG_IMPLEMENT
18#include <doctest/doctest.h>
19#include <spdlog/spdlog.h>
21#include <boost/program_options.hpp>
26namespace po = boost::program_options;
28static auto constexpr USAGE =
29 R
"(Causal Dynamical Triangulations in C++ using CGAL.
31Copyright (c) 2022 Adam Getchell
33A program that views 3D triangulated spacetimes with a defined causal
34structure. Specify the filename of the triangulation to view.
37 cdt-viewer -f FILENAME
41auto main(
int const argc,
char*
const argv[]) ->
int
45 doctest::Context context;
46 context.setOption(
"no-breaks",
48 context.applyCommandLine(argc, argv);
50 int const res = context.run();
51 if (context.shouldExit())
56 context.clearFilters();
60 std::string
const intro{USAGE};
64 po::options_description description(intro);
65 description.add_options()(
"help,h",
"Show this message")(
66 "version,v",
"Show program version")(
"dry-run",
67 "Don't actually do anything")(
68 "filename,f", po::value<std::string>(&filename),
69 "Filename of triangulation to view");
71 po::variables_map args;
72 po::store(po::parse_command_line(argc, argv, description), args);
75 if (args.count(
"help"))
77 std::cout << description <<
"\n";
78 return res + EXIT_SUCCESS;
81 if (args.count(
"version"))
83 fmt::print(
"cdt-viewer 1.0\n");
84 return res + EXIT_SUCCESS;
87 if (args.count(
"dry-run"))
89 fmt::print(
"Dry run. Exiting.\n");
90 return res + EXIT_SUCCESS;
93 fmt::print(
"cdt-viewer started at {}\n", utilities::current_date_time());
94 fmt::print(
"Reading triangulation from file {}\n",
95 std::string_view(filename));
98 auto const dt_in = utilities::read_file<Delaunay_t<3>>(filename);
101 fmt::print(
"Drawing {}\n", filename);
104 return res + EXIT_SUCCESS;
107catch (std::exception
const& e)
109 spdlog::critical(
"Error: {}\n", e.what());
115 spdlog::critical(
"Something went wrong ... Exiting.\n");
119SCENARIO(
"Given a 3D Manifold, it can be written to file and read back in." *
120 doctest::test_suite(
"cdt-viewer"))
122 GIVEN(
"A 3D Manifold.")
124 auto constexpr simplices = 640;
125 auto constexpr timeslices = 4;
128 WHEN(
"It is written to file.")
133 THEN(
"It can be read back in.")
135 auto dt_in = utilities::read_file<Delaunay_t<3>>(filename);
136 REQUIRE(dt_in.is_valid(
true));
137 REQUIRE_EQ(dt_in.dimension(), manifold.dimensionality());
138 REQUIRE_EQ(dt_in.number_of_finite_cells(), manifold.N3());
139 REQUIRE_EQ(dt_in.number_of_finite_facets(), manifold.N2());
140 REQUIRE_EQ(dt_in.number_of_finite_edges(), manifold.N1());
141 REQUIRE_EQ(dt_in.number_of_vertices(), manifold.N0());
143 THEN(
"It can be drawn.")
145 auto const dt_in = utilities::read_file<Delaunay_t<3>>(filename);
148 REQUIRE_NOTHROW(std::filesystem::remove(filename));
152 GIVEN(
"A non-existent filename.")
154 WHEN(
"It is read back in.")
156 THEN(
"An exception is thrown.")
158 REQUIRE_THROWS_AS(utilities::read_file<Delaunay_t<3>>(
"unused.off"),
159 std::filesystem::filesystem_error);
Data structures for manifolds.
auto make_filename(topology_type const &t_topology, Int_precision t_dimension, Int_precision t_number_of_simplices, Int_precision t_number_of_timeslices, double t_initial_radius, double t_foliation_spacing) noexcept -> std::filesystem::path
Generate useful filenames.
void write_file(std::filesystem::path const &filename, TriangulationType triangulation)
Write triangulation to file.
SCENARIO("Perform bistellar flip on Delaunay triangulation" *doctest::test_suite("bistellar"))