// // Created by dominik on 8/12/24. // #include #include #include "base.h" #include #include #include "coordinates.h" #include "bimodalangle.h" #include "isosmallangle.h" #include "random.h" #include "tetrahedral.h" Motion::Motion(std::string name, const double delta, const double eta, std::mt19937_64& rng) : m_name(std::move(name)), m_delta(delta), m_eta(eta), m_rng(rng) { m_uni_dist = std::uniform_real_distribution(0., 1.); } Motion::Motion(std::string name, std::mt19937_64& rng) : m_name(std::move(name)), m_rng(rng) { m_uni_dist = std::uniform_real_distribution(0., 1.); } double Motion::omega_q(const double cos_theta, const double phi) const { const double cos_theta_square = cos_theta * cos_theta; const double sin_theta_square = 1. - cos_theta_square; return M_PI * m_delta * (3. * cos_theta_square - 1. - m_eta * sin_theta_square * std::cos(2.*phi)); } double Motion::omega_q(const SphericalPos& pos) const { auto [cos_theta, phi] = pos; return omega_q(cos_theta, phi); } SphericalPos Motion::draw_position() { const double cos_theta = 1 - 2 * m_uni_dist(m_rng); const double phi = 2.0 * M_PI * m_uni_dist(m_rng); return {cos_theta, phi}; } Motion* Motion::createFromInput(const std::string& input, std::mt19937_64& rng) { if (input == "TetrahedralJump") return new TetrahedralJump(rng); if (input == "IsotropicAngle") return new SmallAngle(rng); if (input == "RandomJump") return new RandomJump(rng); if (input == "BimodalAngle") return new BimodalAngle(rng); throw std::invalid_argument("Invalid input " + input); } void Motion::setParameters(const std::unordered_map ¶meters) { m_delta = parameters.at("delta"); m_eta = parameters.at("eta"); } std::ostream& operator<<(std::ostream& os, const Motion& m) { os << m.getName(); return os; }