diff --git a/.gitignore b/.gitignore index d2475db..be6d867 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ build/ out/ cmake-build-*/ +data/ # IDE files .vs/ @@ -25,4 +26,4 @@ cmake-build-*/ $RECYCLE.BIN/ .TemporaryItems ehthumbs.db -Thumbs.db \ No newline at end of file +Thumbs.db diff --git a/Auswertung/README.md b/Auswertung/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Auswertung/main.py b/Auswertung/main.py new file mode 100644 index 0000000..4a1d53e --- /dev/null +++ b/Auswertung/main.py @@ -0,0 +1,54 @@ +import glob + +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sb + + +def make_figure(length_index, length, forces, integrators, computes): + sb.set_theme() + fig, axs = plt.subplots(nrows=len(forces), ncols=len(computes), figsize=(40, 24)) + fig.suptitle(length, fontsize=30) + for index_compute, compute in enumerate(computes): + for index_forces, force in enumerate(forces): + + legend = [] + plt.sca(axs[index_forces][index_compute]) + for index_integrator, integrator in enumerate(integrators): + for filename in glob.glob(f'data/out/*{force}*{integrator}*L{length_index}*_{compute}.dat'): + file = pd.read_csv(filename, delimiter=',') + sb.lineplot(x="time", y="val", data=file) + plt.ylabel(compute) + legend.append(integrator) + if index_integrator == 0: + sb.lineplot(x="time", y="target", data=file) + legend.append("analytisch") + + plt.legend(title='iterators', labels=legend) + # plt.title("OAF without a force") + pad = 5 # in points + + for ax, col in zip(axs[0], computes): + ax.annotate(col, xy=(0.5, 1), xytext=(0, pad), + xycoords='axes fraction', textcoords='offset points', + size='large', ha='center', va='baseline', fontsize=25) + + for ax, row in zip(axs[:, 0], forces): + ax.annotate(row, xy=(0, 0.5), xytext=(-ax.yaxis.labelpad - pad, 0), + xycoords=ax.yaxis.label, textcoords='offset points', + size='large', ha='right', va='center', fontsize=25) + + fig.tight_layout() + + +def main(): + forces = ["zero", "const", "harmonic"] + integrators = ["euler", "heun", "exact", "bdas", "mbd"] + computes = ["msd", "oaf", "empxx", "empyy", "x", "x_squared"] + for l_i, l in enumerate(["sphere", "L = 1.5", "L = 2.0"]): + make_figure(length=l, length_index=l_i, forces=forces, computes=computes, integrators=integrators) + plt.show() + + +if __name__ == "__main__": + main() diff --git a/Auswertung/requirements.txt b/Auswertung/requirements.txt new file mode 100644 index 0000000..c8628cc --- /dev/null +++ b/Auswertung/requirements.txt @@ -0,0 +1,4 @@ +numpy~=1.21.3 +seaborn~=0.11.2 +matplotlib~=3.4.3 +pandas~=1.3.4 \ No newline at end of file diff --git a/.clang-format b/C++/.clang-format similarity index 100% rename from .clang-format rename to C++/.clang-format diff --git a/.clang-tidy b/C++/.clang-tidy similarity index 100% rename from .clang-tidy rename to C++/.clang-tidy diff --git a/CMakeLists.txt b/C++/CMakeLists.txt similarity index 100% rename from CMakeLists.txt rename to C++/CMakeLists.txt diff --git a/README.md b/C++/README.md similarity index 100% rename from README.md rename to C++/README.md diff --git a/benchmark.81f4796.fourier b/C++/benchmark.81f4796.fourier similarity index 100% rename from benchmark.81f4796.fourier rename to C++/benchmark.81f4796.fourier diff --git a/benchmark/CMakeLists.txt b/C++/benchmark/CMakeLists.txt similarity index 100% rename from benchmark/CMakeLists.txt rename to C++/benchmark/CMakeLists.txt diff --git a/benchmark/bench.cpp b/C++/benchmark/bench.cpp similarity index 100% rename from benchmark/bench.cpp rename to C++/benchmark/bench.cpp diff --git a/benchmark/bench_euler.cpp b/C++/benchmark/bench_euler.cpp similarity index 100% rename from benchmark/bench_euler.cpp rename to C++/benchmark/bench_euler.cpp diff --git a/benchmark/bench_mbd.cpp b/C++/benchmark/bench_mbd.cpp similarity index 100% rename from benchmark/bench_mbd.cpp rename to C++/benchmark/bench_mbd.cpp diff --git a/cmake/Cache.cmake b/C++/cmake/Cache.cmake similarity index 100% rename from cmake/Cache.cmake rename to C++/cmake/Cache.cmake diff --git a/cmake/CompilerWarnings.cmake b/C++/cmake/CompilerWarnings.cmake similarity index 100% rename from cmake/CompilerWarnings.cmake rename to C++/cmake/CompilerWarnings.cmake diff --git a/cmake/Conan.cmake b/C++/cmake/Conan.cmake similarity index 100% rename from cmake/Conan.cmake rename to C++/cmake/Conan.cmake diff --git a/cmake/Doxygen.cmake b/C++/cmake/Doxygen.cmake similarity index 100% rename from cmake/Doxygen.cmake rename to C++/cmake/Doxygen.cmake diff --git a/cmake/Linker.cmake b/C++/cmake/Linker.cmake similarity index 100% rename from cmake/Linker.cmake rename to C++/cmake/Linker.cmake diff --git a/cmake/PreventInSourceBuilds.cmake b/C++/cmake/PreventInSourceBuilds.cmake similarity index 100% rename from cmake/PreventInSourceBuilds.cmake rename to C++/cmake/PreventInSourceBuilds.cmake diff --git a/cmake/Sanitizers.cmake b/C++/cmake/Sanitizers.cmake similarity index 100% rename from cmake/Sanitizers.cmake rename to C++/cmake/Sanitizers.cmake diff --git a/cmake/StandardProjectSettings.cmake b/C++/cmake/StandardProjectSettings.cmake similarity index 100% rename from cmake/StandardProjectSettings.cmake rename to C++/cmake/StandardProjectSettings.cmake diff --git a/cmake/StaticAnalyzers.cmake b/C++/cmake/StaticAnalyzers.cmake similarity index 100% rename from cmake/StaticAnalyzers.cmake rename to C++/cmake/StaticAnalyzers.cmake diff --git a/conanfile.py b/C++/conanfile.py similarity index 100% rename from conanfile.py rename to C++/conanfile.py diff --git a/src/CMakeLists.txt b/C++/src/CMakeLists.txt similarity index 100% rename from src/CMakeLists.txt rename to C++/src/CMakeLists.txt diff --git a/src/Calculation.cpp b/C++/src/Calculation.cpp similarity index 100% rename from src/Calculation.cpp rename to C++/src/Calculation.cpp diff --git a/src/Calculation.h b/C++/src/Calculation.h similarity index 100% rename from src/Calculation.h rename to C++/src/Calculation.h diff --git a/src/Compute.cpp b/C++/src/Compute.cpp similarity index 82% rename from src/Compute.cpp rename to C++/src/Compute.cpp index f2b17d1..5cf59b4 100644 --- a/src/Compute.cpp +++ b/C++/src/Compute.cpp @@ -70,10 +70,14 @@ void Compute::eval(const Rod2d &rod2D) { case Type::msd_const: break; case Type::x: - evalX(rod2D); + if (time_step == every) { + evalX(rod2D); + } break; case Type::x_squared: - evalMSD(rod2D); + if (time_step == every) { + evalMSD(rod2D); + } break; } if (resetting) { @@ -84,9 +88,11 @@ void Compute::eval(const Rod2d &rod2D) { } Compute::Compute(Rod2d rod, Type t_type, size_t t_every, Simulation &sim) - : start_rod(std::move(rod)), every(t_every), time_step(0), type(t_type), - time(sim.getMDeltaT() * static_cast(every)) { - + : start_rod(std::move(rod)), + every(t_every), + time_step(0), + type(t_type), + time(sim.getMDeltaT() * static_cast(every)) { switch (type) { case Type::msd: { resetting = true; @@ -106,46 +112,39 @@ Compute::Compute(Rod2d rod, Type t_type, size_t t_every, Simulation &sim) const double Dmean = 0.5 * (rod.getDiff().trace()); const double u = 4.0; const double deltaD = rod.getDiff()(1, 1) - rod.getDiff()(0, 0); - target = Dmean - deltaD / 2 * - (1 - exp(-u * rod.getDRot() * time)) / u / - rod.getDRot() / time; - } - break; + target = Dmean - deltaD / 2 * (1 - exp(-u * rod.getDRot() * time)) / + u / rod.getDRot() / time; + } break; case Type::empyy: { resetting = true; type_str = "empyy"; const double Dmean = 0.5 * (rod.getDiff().trace()); const double u = 4.0; const double deltaD = rod.getDiff()(1, 1) - rod.getDiff()(0, 0); - target = Dmean + deltaD / 2 * - (1 - exp(-u * rod.getDRot() * time)) / u / - rod.getDRot() / time; - } - break; + target = Dmean + deltaD / 2 * (1 - exp(-u * rod.getDRot() * time)) / + u / rod.getDRot() / time; + } break; case Type::msd_harmonic_k_1: { resetting = true; type_str = "msd_harmonic"; target = 2 * (1.0 - std::exp(-2 * time)); - } - break; + } break; case Type::msd_const: { resetting = true; type_str = "msd_const"; target = -1.0; - } - break; + } break; case Type::x: { resetting = false; type_str = ""; - target = -1.0; - } - break; + target = rod.getPos().norm()*exp(-1.0*time); + } break; case Type::x_squared: { resetting = false; type_str = ""; - target = -1.0; - } - break; + target = rod.getPos().squaredNorm()*exp(-2.0*time)+ + 2.0*(1-exp(-2.0*time)); + } break; } } diff --git a/src/Compute.h b/C++/src/Compute.h similarity index 100% rename from src/Compute.h rename to C++/src/Compute.h diff --git a/src/Integratoren2d.cpp b/C++/src/Integratoren2d.cpp similarity index 98% rename from src/Integratoren2d.cpp rename to C++/src/Integratoren2d.cpp index d0fdd3c..c664a34 100644 --- a/src/Integratoren2d.cpp +++ b/C++/src/Integratoren2d.cpp @@ -92,7 +92,7 @@ void Integratoren2d::Set2_Heun_f( pred_rod.setE(e_predictor); //integrate euler for future - Vector delta_e_future = rand_rot_euler(rod2D, sim) + torque_euler(rod2D, sim, torque); + Vector delta_e_future = rand_rot_euler(pred_rod, sim) + torque_euler(pred_rod, sim, torque); //Heun integration Vector e_integrated = diff --git a/src/Integratoren2d.h b/C++/src/Integratoren2d.h similarity index 100% rename from src/Integratoren2d.h rename to C++/src/Integratoren2d.h diff --git a/src/LiveAgg.cpp b/C++/src/LiveAgg.cpp similarity index 100% rename from src/LiveAgg.cpp rename to C++/src/LiveAgg.cpp diff --git a/src/LiveAgg.hpp b/C++/src/LiveAgg.hpp similarity index 100% rename from src/LiveAgg.hpp rename to C++/src/LiveAgg.hpp diff --git a/src/Rod2d.cpp b/C++/src/Rod2d.cpp similarity index 100% rename from src/Rod2d.cpp rename to C++/src/Rod2d.cpp diff --git a/src/Rod2d.hpp b/C++/src/Rod2d.hpp similarity index 100% rename from src/Rod2d.hpp rename to C++/src/Rod2d.hpp diff --git a/src/Simulation.cpp b/C++/src/Simulation.cpp similarity index 100% rename from src/Simulation.cpp rename to C++/src/Simulation.cpp diff --git a/src/Simulation.h b/C++/src/Simulation.h similarity index 100% rename from src/Simulation.h rename to C++/src/Simulation.h diff --git a/src/force_lambdas.h b/C++/src/force_lambdas.h similarity index 100% rename from src/force_lambdas.h rename to C++/src/force_lambdas.h diff --git a/src/legacy/Integratoren2d_force.cpp b/C++/src/legacy/Integratoren2d_force.cpp similarity index 100% rename from src/legacy/Integratoren2d_force.cpp rename to C++/src/legacy/Integratoren2d_force.cpp diff --git a/src/legacy/Integratoren2d_force.h b/C++/src/legacy/Integratoren2d_force.h similarity index 100% rename from src/legacy/Integratoren2d_force.h rename to C++/src/legacy/Integratoren2d_force.h diff --git a/src/legacy/Integratoren2d_forceless.cpp b/C++/src/legacy/Integratoren2d_forceless.cpp similarity index 100% rename from src/legacy/Integratoren2d_forceless.cpp rename to C++/src/legacy/Integratoren2d_forceless.cpp diff --git a/src/legacy/Integratoren2d_forceless.h b/C++/src/legacy/Integratoren2d_forceless.h similarity index 100% rename from src/legacy/Integratoren2d_forceless.h rename to C++/src/legacy/Integratoren2d_forceless.h diff --git a/C++/src/main.cpp b/C++/src/main.cpp new file mode 100644 index 0000000..1805a09 --- /dev/null +++ b/C++/src/main.cpp @@ -0,0 +1,132 @@ +// +// Created by jholder on 22.10.21. +// + +#include +#include + +#include +#include "Calculation.h" +#include "Integratoren2d.h" +#include "force_lambdas.h" +constexpr size_t SEED = 1234; +constexpr double stepSize = 0.001; +constexpr int n_computes = 100; +constexpr size_t num_runs = 5; +constexpr int numStep = 1000000; +constexpr int delta_compute = 4; +void run_no_force(size_t integrator_index, size_t force_index, + size_t length_index) { + using type = std::pair; + std::vector vec({type(Integratoren2d::Set1_Euler_f, "euler"), + type(Integratoren2d::Set2_Heun_f, "heun"), + type(Integratoren2d::Set3_Exact_f, "exact"), + type(Integratoren2d::Set4_BDAS_f, "bdas"), + type(Integratoren2d::Set5_MBD_f, "mbd")}); + auto [integrator, name] = vec[integrator_index]; + + auto force = std::vector< + std::function>( + {zero_Force, const_Force, harmonic_Force})[force_index]; + auto force_name = std::vector( + {"zero_force_", "const_force_", "harmonic_force_"})[force_index]; + + namespace fs = std::filesystem; + + std::string folder = "out/" + force_name + name + "_L"+std::to_string(length_index)+"_"; + fs::create_directories("out"); + double length = std::vector({1.0, 1.5, 2.0})[length_index]; + { + Compute::Type MSD_VARIANT; + if (force_index == 0) MSD_VARIANT = Compute::Type::msd; + if (force_index == 1) MSD_VARIANT = Compute::Type::msd_const; + if (force_index == 2) MSD_VARIANT = Compute::Type::msd_harmonic_k_1; + + std::vector> computes; + for (int i = 1; i < n_computes; ++i) { + computes.emplace_back(MSD_VARIANT, i * delta_compute); + computes.emplace_back(Compute::Type::oaf, i * delta_compute); + computes.emplace_back(Compute::Type::empxx, i * delta_compute); + computes.emplace_back(Compute::Type::empyy, i * delta_compute); + } + + Calculation euler(integrator, computes, stepSize, SEED, force, + zero_Torque, length); + + euler.run(numStep); + std::ofstream msdFile(folder + "msd.dat"); + std::ofstream oafFile(folder + "oaf.dat"); + std::ofstream empxxFile(folder + "empxx.dat"); + std::ofstream empyyFile(folder + "empyy.dat"); + + msdFile << "time,val,target\n"; + oafFile << "time,val,target\n"; + empxxFile << "time,val,target\n"; + empyyFile << "time,val,target\n"; + + for (const auto &com : euler.getComputes()) { + if (com.getType() == MSD_VARIANT) { + msdFile << com.getTime() << ", " << com.getAgg().getMean() + << ", " << com.getTarget() << std::endl; + } + if (com.getType() == Compute::Type::oaf) { + oafFile << com.getTime() << ", " << com.getAgg().getMean() + << ", " << com.getTarget() << std::endl; + } + if (com.getType() == Compute::Type::empxx) { + empxxFile << com.getTime() << ", " << com.getAgg().getMean() + << ", " << com.getTarget() << std::endl; + } + if (com.getType() == Compute::Type::empyy) { + empyyFile << com.getTime() << ", " << com.getAgg().getMean() + << ", " << com.getTarget() << std::endl; + } + if (com.getType() == Compute::Type::msd) { + msdFile << com.getTime() << ", " << com.getAgg().getMean() + << ", " << com.getTarget() << std::endl; + } + } + } + { + std::vector> repeating_computes; + for (int i = 1; i < n_computes; ++i) { + repeating_computes.emplace_back(Compute::Type::x, i * 1); + repeating_computes.emplace_back(Compute::Type::x_squared, i * 1); + } + Calculation calc_repeat(integrator, repeating_computes, stepSize, SEED, + force, zero_Torque, 1.0); + for (int i = 0; i < numStep / n_computes; ++i) { + calc_repeat.run(n_computes); + calc_repeat.reset(); + } + + std::ofstream xFile(folder + "x.dat"); + std::ofstream xsqFile(folder + "x_squared.dat"); + + xFile << "time,val,target\n"; + xsqFile << "time,val,target\n"; + + for (const auto &com : calc_repeat.getComputes()) { + if (com.getType() == Compute::Type::x) { + xFile << com.getTime() << ", " << com.getAgg().getMean() << ", " + << com.getTarget() << std::endl; + } + if (com.getType() == Compute::Type::x_squared) { + xsqFile << com.getTime() << ", " << com.getAgg().getMean() + << ", " << com.getTarget() << std::endl; + } + } + } + + std::cout << "Finished run " << folder << std::endl; +} + +int main() { + for (size_t j = 0; j < 3; ++j) { + for (size_t i = 0; i < num_runs; ++i) { + for (size_t k = 0; k < 1; ++k) { + run_no_force(i, j, k); + } + } + } +} \ No newline at end of file diff --git a/src/vec_trafos.h b/C++/src/vec_trafos.h similarity index 100% rename from src/vec_trafos.h rename to C++/src/vec_trafos.h diff --git a/test/.clang-tidy b/C++/test/.clang-tidy similarity index 100% rename from test/.clang-tidy rename to C++/test/.clang-tidy diff --git a/test/CMakeLists.txt b/C++/test/CMakeLists.txt similarity index 100% rename from test/CMakeLists.txt rename to C++/test/CMakeLists.txt diff --git a/test/catch_main.cpp b/C++/test/catch_main.cpp similarity index 100% rename from test/catch_main.cpp rename to C++/test/catch_main.cpp diff --git a/test/test_Compute.cpp b/C++/test/test_Compute.cpp similarity index 100% rename from test/test_Compute.cpp rename to C++/test/test_Compute.cpp diff --git a/test/test_Integratoren.cpp b/C++/test/test_Integratoren.cpp similarity index 100% rename from test/test_Integratoren.cpp rename to C++/test/test_Integratoren.cpp diff --git a/test/test_LiveAgg.cpp b/C++/test/test_LiveAgg.cpp similarity index 100% rename from test/test_LiveAgg.cpp rename to C++/test/test_LiveAgg.cpp diff --git a/test/test_Rod2d.cpp b/C++/test/test_Rod2d.cpp similarity index 100% rename from test/test_Rod2d.cpp rename to C++/test/test_Rod2d.cpp diff --git a/test/test_Simulation.cpp b/C++/test/test_Simulation.cpp similarity index 100% rename from test/test_Simulation.cpp rename to C++/test/test_Simulation.cpp diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 7dafd08..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// -// Created by jholder on 22.10.21. -// - -#include -#include - -#include "Calculation.h" -#include "Integratoren2d.h" -#include "force_lambdas.h" - -constexpr size_t SEED = 1234; -constexpr double stepSize = 0.01; -constexpr int n_computes = 100; -constexpr size_t num_runs = 5; -constexpr int numStep = 1000000; -void run_no_force(size_t integrator_index, size_t force_index) { - - - using type = std::pair; - std::vector vec({ - type(Integratoren2d::Set1_Euler_f, "euler"), - type(Integratoren2d::Set2_Heun_f, "heun"), - type(Integratoren2d::Set3_Exact_f, "exact"), - type(Integratoren2d::Set4_BDAS_f, "bdas"), - type(Integratoren2d::Set5_MBD_f, "mbd")}); - auto[integrator, name] = vec[integrator_index]; - - auto force = std::vector>({zero_Force, const_Force, - harmonic_Force})[force_index]; - auto force_name = std::vector({"zero_force_", "const_force_", "harmonic_force_"})[force_index]; - std::string folder = force_name + name + "_"; - { - Compute::Type MSD_VARIANT; - if(force_index == 0) - MSD_VARIANT = Compute::Type::msd; - if(force_index == 1) - MSD_VARIANT = Compute::Type::msd_const; - if(force_index == 2) - MSD_VARIANT = Compute::Type::msd_harmonic_k_1; - - - std::vector> computes; - for (int i = 1; i < n_computes; ++i) { - computes.emplace_back(MSD_VARIANT, i * 1); - computes.emplace_back(Compute::Type::oaf, i * 1); - computes.emplace_back(Compute::Type::empxx, i * 1); - computes.emplace_back(Compute::Type::empyy, i * 1); - } - - Calculation euler(integrator, - computes, stepSize, SEED, force, zero_Torque, 1.0); - - - - euler.run(numStep); - std::ofstream msdFile(folder + "msd.dat"); - std::ofstream msd(folder + "msd.dat"); - std::ofstream oafFile(folder + "oaf.dat"); - std::ofstream empxxFile(folder + "empxx.dat"); - std::ofstream empyyFile(folder + "empyy.dat"); - - for (const auto &com: euler.getComputes()) { - if (com.getType() == MSD_VARIANT) { - msdFile << com.getTime() << ", " << com.getAgg().getMean() << ", " << com.getTarget() << std::endl; - } - if (com.getType() == Compute::Type::oaf) { - oafFile << com.getTime() << ", " << com.getAgg().getMean() << ", " << com.getTarget() << std::endl; - } - if (com.getType() == Compute::Type::empxx) { - empxxFile << com.getTime() << ", " << com.getAgg().getMean() << ", " << com.getTarget() << std::endl; - } - if (com.getType() == Compute::Type::empyy) { - empyyFile << com.getTime() << ", " << com.getAgg().getMean() << ", " << com.getTarget() << std::endl; - } - if (com.getType() == Compute::Type::msd) { - msdFile<< com.getTime() << ", " << com.getAgg().getMean() << ", " << com.getTarget() << std::endl; - } - } - } - { - std::vector> repeating_computes; - for (int i = 1; i < n_computes; ++i) { - repeating_computes.emplace_back(Compute::Type::x, i * 1); - repeating_computes.emplace_back(Compute::Type::x_squared, i * 1); - - } - Calculation calc_repeat(integrator, - repeating_computes, stepSize, SEED, force, zero_Torque, 1.0); - for (int i = 0; i