// // Created by jholder on 22.10.21. // #include "Compute.h" #include #include #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(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(every); } double Compute::getTarget() const { return target; } double Compute::getDifference() const { return abs(agg.getMean() -target); }