Skip to content

File ForceModel.hpp

File List > astrea > astro > astro > propagation > force_models > ForceModel.hpp

Go to the documentation of this file

#pragma once

#include <functional>
#include <memory>
#include <string>
#include <unordered_map>

#include <units/units.hpp>

#include <astro/astro.fwd.hpp>
#include <astro/propagation/force_models/Force.hpp>

namespace astrea {
namespace astro {

class ForceModel {
  public:
    ForceModel() = default;

    ~ForceModel() = default;

    std::size_t size() const { return forces.size(); }

    template <typename T, typename... Args>
    const std::unique_ptr<Force>& add(Args&&... args)
    {
        static const std::string name = typeid(T).name();
        if (forces.count(name) == 0) { forces.emplace(name, std::make_unique<T>(std::forward<Args>(args)...)); }
        return forces.at(name);
    }

    CartesianVector<Acceleration, frames::earth::icrf> compute_forces(const State& state, const Vehicle& vehicle) const;

    const std::unique_ptr<Force>& at(const std::string& name) const;

    template <typename T>
    const std::unique_ptr<Force>& get() const
    {
        static const std::string name = typeid(T).name();
        return forces.at(name);
    }

  private:
    std::unordered_map<std::string, std::unique_ptr<Force>> forces; 
};

} // namespace astro
} // namespace astrea