Subsystem.h
Go to the documentation of this file.00001 #ifndef SimTK_SimTKCOMMON_SUBSYSTEM_H_
00002 #define SimTK_SimTKCOMMON_SUBSYSTEM_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "SimTKcommon/basics.h"
00036 #include "SimTKcommon/Simmatrix.h"
00037 #include "SimTKcommon/internal/State.h"
00038 #include "SimTKcommon/internal/System.h"
00039
00040 #include <cassert>
00041
00042 namespace SimTK {
00043
00044 class System;
00045 class DecorativeGeometry;
00046 class DefaultSystemSubsystemGuts;
00047 class ScheduledEventHandler;
00048 class ScheduledEventReporter;
00049 class TriggeredEventHandler;
00050 class TriggeredEventReporter;
00051
00074 class SimTK_SimTKCOMMON_EXPORT Subsystem {
00075 public:
00076 class Guts;
00077 friend class Guts;
00078 private:
00079
00080
00081 Guts* guts;
00082 public:
00083 Subsystem() : guts(0) { }
00084 Subsystem(const Subsystem&);
00085 Subsystem& operator=(const Subsystem&);
00086 ~Subsystem();
00087
00088 const String& getName() const;
00089 const String& getVersion() const;
00090
00091
00092
00093
00094
00095
00096
00097
00098 const Vector& getQ(const State&) const;
00099 const Vector& getU(const State&) const;
00100 const Vector& getZ(const State&) const;
00101 const Vector& getQDot(const State&) const;
00102 const Vector& getUDot(const State&) const;
00103 const Vector& getZDot(const State&) const;
00104 const Vector& getQDotDot(const State&) const;
00105 const Vector& getQErr(const State&) const;
00106 const Vector& getUErr(const State&) const;
00107 const Vector& getUDotErr(const State&) const;
00108 const Vector& getMultipliers(const State&) const;
00109
00110
00111
00112
00113
00114 Vector& updQ(State&) const;
00115 Vector& updU(State&) const;
00116 Vector& updZ(State&) const;
00117
00118
00119 void setQ(State& s, const Vector& q) const {
00120 assert(q.size() == getNQ(s));
00121 updQ(s) = q;
00122 }
00123 void setU(State& s, const Vector& u) const {
00124 assert(u.size() == getNU(s));
00125 updU(s) = u;
00126 }
00127 void setZ(State& s, const Vector& z) const {
00128 assert(z.size() == getNZ(s));
00129 updZ(s) = z;
00130 }
00131
00132
00133
00134
00135
00136 Vector& updQDot(const State&) const;
00137 Vector& updUDot(const State&) const;
00138 Vector& updZDot(const State&) const;
00139 Vector& updQDotDot(const State&) const;
00140 Vector& updQErr(const State&) const;
00141 Vector& updUErr(const State&) const;
00142 Vector& updUDotErr(const State&) const;
00143 Vector& updMultipliers(const State&) const;
00144
00145
00146
00147
00148 Stage getStage(const State&) const;
00149 const AbstractValue& getDiscreteVariable(const State&, int index) const;
00150
00151 AbstractValue& updDiscreteVariable(State&, int index) const;
00152 const AbstractValue& getCacheEntry(const State&, int index) const;
00153
00154 AbstractValue& updCacheEntry(const State&, int index) const;
00155
00156
00157
00158
00159
00160 int getQStart (const State&) const;
00161 int getNQ (const State&) const;
00162 int getUStart (const State&) const;
00163 int getNU (const State&) const;
00164 int getZStart (const State&) const;
00165 int getNZ (const State&) const;
00166 int getQErrStart (const State&) const;
00167 int getNQErr (const State&) const;
00168 int getUErrStart (const State&) const;
00169 int getNUErr (const State&) const;
00170 int getUDotErrStart(const State&) const;
00171 int getNUDotErr (const State&) const;
00172 int getMultipliersStart(const State&) const;
00173 int getNMultipliers (const State&) const;
00174
00175 bool isInSystem() const;
00176 bool isInSameSystem(const Subsystem& otherSubsystem) const;
00177
00178 const System& getSystem() const;
00179 System& updSystem();
00180
00181 SubsystemIndex getMySubsystemIndex() const;
00182
00183
00184
00185 bool isOwnerHandle() const;
00186 bool isEmptyHandle() const;
00187
00188
00189 bool isSameSubsystem(const Subsystem& otherSubsystem) const;
00190
00191 bool subsystemTopologyHasBeenRealized() const;
00192 void invalidateSubsystemTopologyCache() const;
00193
00194
00195
00196 const Subsystem::Guts& getSubsystemGuts() const {assert(guts); return *guts;}
00197 Subsystem::Guts& updSubsystemGuts() {assert(guts); return *guts;}
00198
00199
00200
00201
00202 void adoptSubsystemGuts(Subsystem::Guts* g);
00203 void setSystem(System&, SubsystemIndex);
00204
00205 explicit Subsystem(Subsystem::Guts* g) : guts(g) { }
00206 bool hasGuts() const {return guts!=0;}
00207 };
00208
00209
00216 class SimTK_SimTKCOMMON_EXPORT DefaultSystemSubsystem : public Subsystem {
00217 public:
00218 DefaultSystemSubsystem(System& sys);
00219 void addEventHandler(ScheduledEventHandler* handler);
00220 void addEventHandler(TriggeredEventHandler* handler);
00221 void addEventReporter(ScheduledEventReporter* handler) const;
00222 void addEventReporter(TriggeredEventReporter* handler) const;
00223 EventId createEventId(SubsystemIndex subsys, const State& state) const;
00224 void findSubsystemEventIds(SubsystemIndex subsys, const State& state, const std::vector<EventId>& allEvents, std::vector<EventId>& eventsForSubsystem) const;
00225 private:
00226 const DefaultSystemSubsystemGuts& getGuts() const;
00227 DefaultSystemSubsystemGuts& updGuts();
00228 };
00229
00230
00231 }
00232
00233 #endif // SimTK_SimTKCOMMON_SUBSYSTEM_H_