75 lines
2.8 KiB
C++
75 lines
2.8 KiB
C++
//
|
|
// Created by jholder on 22.10.21.
|
|
//
|
|
|
|
#include <iostream>
|
|
|
|
#include "Calculation.h"
|
|
#include "Integratoren2d_force.h"
|
|
#include "Integratoren2d_forceless.h"
|
|
|
|
int main() {
|
|
constexpr int numStep = 1000000;
|
|
constexpr double k = 0.01;
|
|
[[maybe_unused]] auto harmonic_Force =
|
|
[](const Eigen::Vector2d &pos,
|
|
const Eigen::Vector2d & /*torque*/) -> Eigen::Vector2d {
|
|
return -k * pos;
|
|
};
|
|
[[maybe_unused]] auto zero_Force =
|
|
[](const Eigen::Vector2d & /*pos*/,
|
|
const Eigen::Vector2d & /*torque*/) -> Eigen::Vector2d {
|
|
return {0.0, 0.0};
|
|
};
|
|
auto zero_Torque = [](const Eigen::Vector2d & /*pos*/,
|
|
const Eigen::Vector2d & /*torque*/) -> double {
|
|
return 0.0;
|
|
};
|
|
/* auto euler_Zero = [&](Rod2d &rod, Simulation &sim) {
|
|
return Integratoren2d_force::Set1_Euler(rod, sim, zero_Force,
|
|
zero_Torque);
|
|
};*/
|
|
auto heun_Zero = [&](Rod2d &rod, Simulation &sim) {
|
|
return Integratoren2d_force::Set1_Euler(rod, sim, harmonic_Force,
|
|
zero_Torque);
|
|
};
|
|
/*auto exact_Zero = [&](Rod2d &rod, Simulation &sim) {
|
|
return Integratoren2d_force::Set3_Exact(rod, sim, zero_Force,
|
|
zero_Torque);
|
|
};*/
|
|
/*
|
|
auto bdas_Zero = [&](Rod2d &rod, Simulation &sim) {
|
|
return Integratoren2d_force::Set4_BDAS(rod, sim, zero_Force, zero_Torque);
|
|
};*/
|
|
Calculation euler(heun_Zero,
|
|
{{Compute::Type::msd, 1},
|
|
{Compute::Type::msd, 2},
|
|
{Compute::Type::msd, 4},
|
|
{Compute::Type::msd, 8},
|
|
{Compute::Type::msd, 16},
|
|
{Compute::Type::msd, 32},
|
|
{Compute::Type::msd, 64},
|
|
{Compute::Type::msd, 128},
|
|
{Compute::Type::msd, 256},
|
|
{Compute::Type::msd, 512},
|
|
{Compute::Type::msd, 1024},
|
|
{Compute::Type::oaf, 1},
|
|
{Compute::Type::oaf, 2},
|
|
{Compute::Type::oaf, 4},
|
|
{Compute::Type::oaf, 8},
|
|
{Compute::Type::oaf, 16}},
|
|
0.01, 12345);
|
|
euler.run(numStep);
|
|
for (const auto &com : euler.getComputes()) {
|
|
if (com.getType() != Compute::Type::msd) continue;
|
|
std::cout << "MSD: " << com.getDifference() << " "
|
|
<< com.getAgg().getMean() << " <-> " << com.getTarget()
|
|
<< std::endl;
|
|
}
|
|
for (const auto &com : euler.getComputes()) {
|
|
if (com.getType() != Compute::Type::oaf) continue;
|
|
std::cout << "OAF: " << com.getDifference() << " "
|
|
<< com.getAgg().getMean() << " <-> " << com.getTarget()
|
|
<< std::endl;
|
|
}
|
|
} |