-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbenchmark.cpp
More file actions
65 lines (54 loc) · 2.28 KB
/
Copy pathbenchmark.cpp
File metadata and controls
65 lines (54 loc) · 2.28 KB
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
#include <array>
#include <cmath>
#include <fstream>
#include <iostream>
#include <vector>
#include "Planet.hpp"
#include "SceneLoader.hpp"
#include "physics.hpp"
#include "constants.hpp"
std::vector<Planet> defaultScene() {
return {
{80.f, 50, 5.972e24f, {0.f, 0.f, 0.f}, {0.f, 0.f, 0.0f}, {0.f, 0.f, 0.f}},
{20.f, 50, 7.348e22f, {-500.f, 0.f, 0.f}, {0.f, 75.f, 50.f}, {0.f, 0.f, 0.f}},
{20.f, 50, 7.348e22f, {600.f, 0.f, 0.f}, {0.f, -68.f, -30.f}, {0.f, 0.f, 0.f}},
{10.f, 50, 1e22f, {0.f, 500.f, 0.f}, {0.f, -60.f, 0.f}, {0.f, 0.f, 0.f}},
{15.f, 50, 2e22f, {800.f, -400.f, 200.f}, {-70.f, 55.f, -10.f},{0.f, 0.f, 0.f}},
{25.f, 50, 1e23f, {1500.f, 1500.f, -1500.f}, {0.f, 0.f, 0.f}, {0.f, 0.f, 0.f}},
{5.f, 50, 1e21f, {-300.f, -300.f, -300.f}, {45.f, 45.f, 45.f}, {0.f, 0.f, 0.f}},
{5.f, 50, 1e21f, {300.f, 300.f, 300.f}, {-45.f, -45.f, -45.f},{0.f, 0.f, 0.f}},
};
}
int main() {
const int N_STEPS = 2500;
const float DT = 1.0f / 60.0f;
std::vector<Planet> initial = loadScene("scene.json");
if (initial.empty()) {
std::cout << "Using default hardcoded scene.\n";
initial = defaultScene();
}
const char* names[] = { "explicit_euler", "semi_implicit_euler", "leapfrog", "rk4" };
std::array<std::vector<float>, 4> errors;
for (int integ = 0; integ < 4; ++integ) {
std::vector<Planet> planets = initial;
float E0 = totalEnergy(planets);
std::cout << "Running " << names[integ] << "...\n";
for (int step = 0; step < N_STEPS; ++step) {
calculateMovement(planets, DT, integ);
checkAllCollisions(planets);
float err = (E0 != 0.0f) ? std::abs((totalEnergy(planets) - E0) / E0) : 0.0f;
errors[integ].push_back(err);
}
}
std::ofstream csv("docs/energy_errors.csv");
csv << "time_s";
for (const char* name : names) csv << "," << name;
csv << "\n";
for (int s = 0; s < N_STEPS; ++s) {
csv << (s + 1) * DT;
for (int i = 0; i < 4; ++i) csv << "," << errors[i][s];
csv << "\n";
}
std::cout << "Written docs/energy_errors.csv (" << N_STEPS << " steps, dt=" << DT << ")\n";
return 0;
}