/*****************************************************************//** * \file System.h * \brief Multibody system of parts, joints, forces. * * \author askoh * \date May 2023 *********************************************************************/ #pragma once #include #include #include #include "Item.h" //#include "Time.h" namespace MbD { class Part; class Joint; class SystemSolver; class Time; class Constraint; class ForceTorqueItem; class System : public Item { //ToDo: Needed members admSystem namedItems mbdTime parts jointsMotions forcesTorques sensors variables hasChanged mbdSystemSolver public: static System& getInstance() { //https://medium.com/@caglayandokme/further-enhancing-the-singleton-pattern-in-c-8278b02b1ac7 static System singleInstance; // Block-scoped static Singleton instance return singleInstance; }; void initialize() override; void initializeLocally() override; void initializeGlobally() override; void runKINEMATICS(); void outputInput(); void outputInitialConditions(); void outputTimeSeries(); std::shared_ptr> discontinuitiesAtIC(); void jointsMotionsDo(const std::function )>& f); void partsJointsMotionsDo(const std::function )>& f); void partsJointsMotionsForcesTorquesDo(const std::function )>& f); void logString(std::string& str) override; double mbdTimeValue(); void mbdTimeValue(double t); std::shared_ptr>> essentialConstraints2(); std::shared_ptr>> displacementConstraints(); std::shared_ptr>> perpendicularConstraints(); std::shared_ptr>> allRedundantConstraints(); std::shared_ptr>> allConstraints(); double maximumMass(); double maximumMomentOfInertia(); std::shared_ptr>> parts; std::shared_ptr>> jointsMotions; std::shared_ptr>> forcesTorques; bool hasChanged = false; std::shared_ptr systemSolver; void addPart(std::shared_ptr part); std::shared_ptr