Added benchmark files for analysis

This commit is contained in:
Jacob Holder 2021-10-25 19:22:41 +02:00
parent 8af7eee267
commit 96227fe97a
Signed by: jacob
GPG Key ID: 2194FC747048A7FD
5 changed files with 53 additions and 15 deletions

View File

@ -2,14 +2,23 @@
find_package(Eigen3)
find_package(Catch2 REQUIRED)
add_executable(benchmark bench.cpp)
set(BENCH_SOURCES bench.cpp bench_euler.cpp bench_mbd.cpp)
foreach( benchsourcefile ${BENCH_SOURCES} )
# I used a simple string replace, to cut off .cpp.
string( REPLACE ".cpp" "" benchmarkname ${benchsourcefile} )
add_executable( ${benchmarkname} ${benchsourcefile} )
# Make sure YourLib is linked to each app
target_link_libraries(
${benchmarkname}
PRIVATE project_options
project_warnings
Eigen3::Eigen3
Catch2::Catch2
integratoren
)
endforeach( benchsourcefile ${BENCH_SOURCES} )
target_link_libraries(
benchmark
PRIVATE project_options
project_warnings
Eigen3::Eigen3
Catch2::Catch2
integratoren
)

14
benchmark/bench_euler.cpp Normal file
View File

@ -0,0 +1,14 @@
//
// Created by jholder on 10/25/21.
//
#include "Rod2d.hpp"
#include "Simulation.h"
#include "Integratoren2d_forceless.h"
int main(){
Rod2d rod(1.0);
Simulation sim(0.01, 1);
for (int i = 0; i < 10000000; ++i) {
Integratoren2d_forceless::Set1_Euler(rod, sim);
}
return EXIT_SUCCESS;
}

15
benchmark/bench_mbd.cpp Normal file
View File

@ -0,0 +1,15 @@
//
// Created by jholder on 10/25/21.
//
#include "Rod2d.hpp"
#include "Simulation.h"
#include "Integratoren2d_forceless.h"
int main(){
Rod2d rod(1.0);
Simulation sim(0.01, 1);
for (int i = 0; i < 10000000; ++i) {
Integratoren2d_forceless::Set5_MBD(rod, sim);
}
return EXIT_SUCCESS;
}

View File

@ -23,22 +23,22 @@ void Integratoren2d_force::Set1_Euler(
const std::function<Vector(Vector, Vector)> &force,
const std::function<double(Vector, Vector)> &torque) {
auto std = sim.getSTD(); // sqrt(2*delta_T)
auto e = rod2D.getE();
// translation
Vector rand = {sim.getNorm(std), sim.getNorm(std)}; // gaussian noise
Vector trans_part = rod2D.getDiff_Sqrt() * rand;
Vector trans_lab = rotation_Matrix(rod2D.getE()) * trans_part;
Vector trans_lab = rotation_Matrix(e) * trans_part;
// Force
Vector F_lab = force(rod2D.getPos(), rod2D.getE());
Vector F_part = rotation_Matrix(rod2D.getE()).inverse() * F_lab;
Vector F_lab = force(rod2D.getPos(), e);
Vector F_part = rotation_Matrix(e).inverse() * F_lab;
Vector F_trans = rod2D.getDiff_Sqrt() * F_part;
F_trans *= sim.getMDeltaT();
// rotation
double rot =
sim.getNorm(std) * rod2D.getDRot_Sqrt(); // rotationsmatrix verwenden.
Vector e = rod2D.getE();
double M_rot = torque(rod2D.getPos(), rod2D.getE()) * rod2D.getDRot() * sim.getMDeltaT();
double M_rot = torque(rod2D.getPos(), e) * rod2D.getDRot() * sim.getMDeltaT();
Vector new_e = e + (rot + M_rot) * ortho(e);
new_e.normalize();
// apply

View File

@ -17,7 +17,7 @@ class Simulation {
std::mt19937_64 m_generator;
std::normal_distribution<double> m_norm;
public:
public:
[[nodiscard]] double getMDeltaT() const;
[[nodiscard]] double getSTD() const;
};