BD_Integratoren/src/Compute.cpp

93 lines
2.0 KiB
C++

//
// Created by jholder on 22.10.21.
//
#include "Compute.h"
#include <utility>
#include <iostream>
#include "Rod2d.hpp"
#include "Simulation.h"
void Compute::evalMSD(const Rod2d &rod2D) {
const auto &new_pos = rod2D.getPos();
auto old_pos = start_rod.getPos();
auto msd = (new_pos - old_pos).squaredNorm();
agg.feed(msd);
}
void Compute::evalOAF(const Rod2d &rod2D) {
const auto &new_e = rod2D.getE();
auto old_e = start_rod.getE();
auto oaf = old_e.dot(new_e);
agg.feed(oaf);
}
void Compute::eval_empXX(const Rod2d & /*rod2D*/) {
//TODO
}
void Compute::eval_empYY(const Rod2d & /*rod2D*/) {
//TODO
}
void Compute::eval(const Rod2d &rod2D) {
time_step++;
if (time_step % every == 0) {
switch (type) {
case Type::msd:
evalMSD(rod2D);
break;
case Type::oaf:
evalOAF(rod2D);
break;
case Type::empxx:
eval_empXX(rod2D);
break;
case Type::empyy:
eval_empYY(rod2D);
break;
}
start_rod = 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) {
auto time = sim.getMDeltaT() * static_cast<double>(every);
switch (type) {
case Type::msd:
target = 4.0 * 0.5 * (rod.getDiff().trace()) * time;
break;
case Type::oaf:
target = std::exp(-rod.getDRot() * time);
break;
case Type::empxx:
target = 0;
break;
case Type::empyy:
target = 0;
break;
}
}
const LiveAgg &Compute::getAgg() const {
return agg;
}
Compute::Type Compute::getType() const {
return type;
}
double Compute::getTime() const {
return static_cast<double>(every);
}
double Compute::getTarget() const {
return target;
}
double Compute::getDifference() const {
return abs(agg.getMean() -target);
}