-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathmain.cpp
82 lines (70 loc) · 5.11 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "polyhedralGravity/Info.h"
#include "polyhedralGravity/input/ConfigSource.h"
#include "polyhedralGravity/input/YAMLConfigReader.h"
#include "polyhedralGravity/model/GravityModel.h"
#include "polyhedralGravity/model/PolyhedronDefinitions.h"
#include "polyhedralGravity/model/Polyhedron.h"
#include "polyhedralGravity/output/CSVWriter.h"
#include "polyhedralGravity/output/Logging.h"
#include <chrono>
#include <sstream>
int main(const int argc, char *argv[]) {
using namespace polyhedralGravity;
POLYHEDRAL_GRAVITY_LOG_INFO("####################################################################################");
POLYHEDRAL_GRAVITY_LOG_INFO("Polyhedral Gravity Model Version: {}", POLYHEDRAL_GRAVITY_VERSION);
POLYHEDRAL_GRAVITY_LOG_INFO("Polyhedral Gravity Commit Hash: {}", POLYHEDRAL_GRAVITY_COMMIT_HASH);
POLYHEDRAL_GRAVITY_LOG_INFO("Polyhedral Gravity Model Parallelization Backend: {}", POLYHEDRAL_GRAVITY_PARALLELIZATION);
POLYHEDRAL_GRAVITY_LOG_INFO("Polyhedral Gravity Logging Level: {}", POLYHEDRAL_GRAVITY_LOGGING_LEVEL);
POLYHEDRAL_GRAVITY_LOG_INFO("####################################################################################");
if (argc != 2) {
POLYHEDRAL_GRAVITY_LOG_ERROR("Wrong program call! Please use the program like this: ./polyhedralGravity [YAML-Configuration-File]");
return 0;
}
try {
const std::shared_ptr<ConfigSource> config = std::make_shared<YAMLConfigReader>(argv[1]);
const auto polyhedralSource = config->getPolyhedralSource();
const auto density = config->getDensity();
const auto computationPoints = config->getPointsOfInterest();
const auto outputFileName = config->getOutputFileName();
const auto metricUnit = config->getMeshUnit();
const PolyhedronIntegrity checkPolyhedralInput = config->getMeshInputCheckStatus() ? PolyhedronIntegrity::HEAL : PolyhedronIntegrity::DISABLE;
POLYHEDRAL_GRAVITY_LOG_INFO("Polyhedron creation and check (if enabled) started.");
const auto startPolyhedron = std::chrono::high_resolution_clock::now();
const Polyhedron polyhedron{polyhedralSource, density, NormalOrientation::OUTWARDS, checkPolyhedralInput, metricUnit};
const auto endPolyhedron = std::chrono::high_resolution_clock::now();
const auto durationPolyhedron = endPolyhedron - startPolyhedron;
const auto msPolyhedron = std::chrono::duration_cast<std::chrono::microseconds>(durationPolyhedron).count();
POLYHEDRAL_GRAVITY_LOG_INFO("Polyhedron instantiated and checked. It took {} microseconds.", msPolyhedron);
POLYHEDRAL_GRAVITY_LOG_INFO("####################################################################################");
POLYHEDRAL_GRAVITY_LOG_INFO("Number of Vertices: {}", polyhedron.countVertices());
POLYHEDRAL_GRAVITY_LOG_INFO("Number of Faces: {}", polyhedron.countFaces());
POLYHEDRAL_GRAVITY_LOG_INFO("Number of Computation Points: {}", computationPoints.size());
POLYHEDRAL_GRAVITY_LOG_INFO("Mesh Check Enabled: {}", config->getMeshInputCheckStatus());
POLYHEDRAL_GRAVITY_LOG_INFO("Mesh Unit: {}", polyhedron.getMeshUnitAsString());
POLYHEDRAL_GRAVITY_LOG_INFO("Density: {} {}", polyhedron.getDensity(), polyhedron.getDensityUnit());
POLYHEDRAL_GRAVITY_LOG_INFO("Output File: {}", outputFileName);
POLYHEDRAL_GRAVITY_LOG_INFO("####################################################################################");
POLYHEDRAL_GRAVITY_LOG_INFO("Gravity Evaluation has started!");
const auto startCalc = std::chrono::high_resolution_clock::now();
const auto result = GravityModel::evaluate(polyhedron, computationPoints, true);
const auto endCalc = std::chrono::high_resolution_clock::now();
const auto durationCalc = endCalc - startCalc;
const auto msCalc = std::chrono::duration_cast<std::chrono::microseconds>(durationCalc).count();
POLYHEDRAL_GRAVITY_LOG_INFO("The calculation of the Gravity Model has finished. It took {} microseconds or on average {} microseconds/point",
msCalc, static_cast<double>(msCalc) / static_cast<double>(computationPoints.size()));
POLYHEDRAL_GRAVITY_LOG_INFO("####################################################################################");
//The results
if (!outputFileName.empty()) {
POLYHEDRAL_GRAVITY_LOG_INFO("Writing results to specified output file {}", outputFileName);
const CSVWriter csvWriter{outputFileName};
csvWriter.printResult(computationPoints, result);
POLYHEDRAL_GRAVITY_LOG_INFO("Writing finished!");
} else {
POLYHEDRAL_GRAVITY_LOG_WARN("No output filename was specified!");
}
return 0;
} catch (const std::exception &e) {
POLYHEDRAL_GRAVITY_LOG_ERROR("{}", e.what());
return -1;
}
}