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