00001 #ifndef SimTK_SimTKCOMMON_SUBSYSTEM_GUTS_H_
00002 #define SimTK_SimTKCOMMON_SUBSYSTEM_GUTS_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
00050 class SimTK_SimTKCOMMON_EXPORT Subsystem::Guts {
00051 public:
00052 Guts(const Guts&);
00053 Guts& operator=(const Guts&);
00054
00055
00056
00057 explicit Guts(const String& name="<NONAME>",
00058 const String& version="0.0.0");
00059 virtual ~Guts();
00060
00061 const String& getName() const;
00062 const String& getVersion() const;
00063
00064
00065
00066
00067
00068 QIndex allocateQ(State& s, const Vector& qInit) const;
00069
00070 UIndex allocateU(State& s, const Vector& uInit) const;
00071
00072 ZIndex allocateZ(State& s, const Vector& zInit) const;
00073
00074 DiscreteVariableIndex allocateDiscreteVariable(State& s, Stage g, AbstractValue* v) const;
00075 DiscreteVariableIndex allocateAutoUpdateDiscreteVariable
00076 (State&, Stage invalidates, AbstractValue* v, Stage updateDependsOn) const;
00077
00078
00079 CacheEntryIndex allocateCacheEntry
00080 (const State&, Stage dependsOn, Stage computedBy, AbstractValue* v) const;
00081 CacheEntryIndex allocateCacheEntry
00082 (const State& state, Stage g, AbstractValue* v) const
00083 { return allocateCacheEntry(state, g, g, v); }
00084 CacheEntryIndex allocateLazyCacheEntry
00085 (const State& state, Stage earliest, AbstractValue* v) const
00086 { return allocateCacheEntry(state, earliest, Stage::Infinity, v); }
00087
00088
00089
00090 QErrIndex allocateQErr(const State& s, int nqerr) const;
00091 UErrIndex allocateUErr(const State& s, int nuerr) const;
00092 UDotErrIndex allocateUDotErr(const State& s, int nudoterr) const;
00093 EventTriggerByStageIndex allocateEventTriggersByStage(const State&, Stage, int ntriggers) const;
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 const Vector& getQ(const State&) const;
00104 const Vector& getU(const State&) const;
00105 const Vector& getZ(const State&) const;
00106 const Vector& getQDot(const State&) const;
00107 const Vector& getUDot(const State&) const;
00108 const Vector& getZDot(const State&) const;
00109 const Vector& getQDotDot(const State&) const;
00110 const Vector& getQErr(const State&) const;
00111 const Vector& getUErr(const State&) const;
00112 const Vector& getUDotErr(const State&) const;
00113 const Vector& getMultipliers(const State&) const;
00114 const Vector& getEventTriggersByStage(const State&, Stage) const;
00115
00116
00117
00118
00119
00120 Vector& updQ(State&) const;
00121 Vector& updU(State&) const;
00122 Vector& updZ(State&) const;
00123
00124
00125 void setQ(State& s, const Vector& q) const {
00126 assert(q.size() == getNQ(s));
00127 updQ(s) = q;
00128 }
00129 void setU(State& s, const Vector& u) const {
00130 assert(u.size() == getNU(s));
00131 updU(s) = u;
00132 }
00133 void setZ(State& s, const Vector& z) const {
00134 assert(z.size() == getNZ(s));
00135 updZ(s) = z;
00136 }
00137
00138
00139
00140
00141
00142 Vector& updQDot(const State&) const;
00143 Vector& updUDot(const State&) const;
00144 Vector& updZDot(const State&) const;
00145 Vector& updQDotDot(const State&) const;
00146 Vector& updQErr(const State&) const;
00147 Vector& updUErr(const State&) const;
00148 Vector& updUDotErr(const State&) const;
00149 Vector& updMultipliers(const State&) const;
00150 Vector& updEventTriggersByStage(const State&, Stage) const;
00151
00152
00153
00154
00155 Stage getStage(const State&) const;
00156 const AbstractValue& getDiscreteVariable(const State&, DiscreteVariableIndex) const;
00157
00158 Real getDiscreteVarLastUpdateTime(const State& s, DiscreteVariableIndex dx) const
00159 { return s.getDiscreteVarLastUpdateTime(getMySubsystemIndex(),dx); }
00160 CacheEntryIndex getDiscreteVarUpdateIndex(const State& s, DiscreteVariableIndex dx) const
00161 { return s.getDiscreteVarUpdateIndex(getMySubsystemIndex(),dx); }
00162 const AbstractValue& getDiscreteVarUpdateValue(const State& s, DiscreteVariableIndex dx) const
00163 { return s.getDiscreteVarUpdateValue(getMySubsystemIndex(),dx); }
00164 AbstractValue& updDiscreteVarUpdateValue(const State& s, DiscreteVariableIndex dx) const
00165 { return s.updDiscreteVarUpdateValue(getMySubsystemIndex(),dx); }
00166 bool isDiscreteVarUpdateValueRealized(const State& s, DiscreteVariableIndex dx) const
00167 { return s.isDiscreteVarUpdateValueRealized(getMySubsystemIndex(),dx); }
00168 void markDiscreteVarUpdateValueRealized(const State& s, DiscreteVariableIndex dx) const
00169 { return s.markDiscreteVarUpdateValueRealized(getMySubsystemIndex(),dx); }
00170
00171
00172 AbstractValue& updDiscreteVariable(State&, DiscreteVariableIndex) const;
00173 const AbstractValue& getCacheEntry(const State&, CacheEntryIndex) const;
00174
00175 AbstractValue& updCacheEntry(const State&, CacheEntryIndex) const;
00176
00177 bool isCacheValueRealized(const State&, CacheEntryIndex) const;
00178 void markCacheValueRealized(const State&, CacheEntryIndex) const;
00179
00180
00181
00182
00183
00184 SystemQIndex getQStart (const State&) const;
00185 int getNQ (const State&) const;
00186 SystemUIndex getUStart (const State&) const;
00187 int getNU (const State&) const;
00188 SystemZIndex getZStart (const State&) const;
00189 int getNZ (const State&) const;
00190 SystemQErrIndex getQErrStart (const State&) const;
00191 int getNQErr (const State&) const;
00192 SystemUErrIndex getUErrStart (const State&) const;
00193 int getNUErr (const State&) const;
00194 SystemUDotErrIndex getUDotErrStart(const State&) const;
00195 int getNUDotErr (const State&) const;
00196 SystemMultiplierIndex getMultipliersStart(const State&) const;
00197 int getNMultipliers(const State&) const;
00198 SystemEventTriggerByStageIndex getEventTriggerStartByStage(const State&, Stage) const;
00199 int getNEventTriggersByStage(const State&, Stage) const;
00200
00201 MeasureIndex adoptMeasure(AbstractMeasure& m);
00202 AbstractMeasure getMeasure(MeasureIndex) const;
00203 template <class T> Measure_<T> getMeasure_(MeasureIndex mx) const
00204 { return Measure_<T>::getAs(getMeasure(mx));}
00205
00206 bool isInSystem() const;
00207 bool isInSameSystem(const Subsystem& otherSubsystem) const;
00208
00209 const System& getSystem() const;
00210 System& updSystem();
00211
00212 SubsystemIndex getMySubsystemIndex() const;
00213
00214
00215 const Subsystem& getOwnerSubsystemHandle() const;
00216 Subsystem& updOwnerSubsystemHandle();
00217 void setOwnerSubsystemHandle(Subsystem&);
00218 bool hasOwnerSubsystemHandle() const;
00219
00220 void setSystem(System&, SubsystemIndex);
00221
00222 class GutsRep;
00223 explicit Guts(GutsRep* r) : rep(r) { }
00224 bool hasRep() const {return rep!=0;}
00225 const GutsRep& getRep() const {assert(rep); return *rep;}
00226 GutsRep& updRep() const {assert(rep); return *rep;}
00227 void setRep(GutsRep& r) {assert(!rep); rep = &r;}
00228
00229 bool subsystemTopologyHasBeenRealized() const;
00230 void invalidateSubsystemTopologyCache() const;
00231
00232
00233
00234
00235 Subsystem::Guts* clone() const;
00236
00237
00238
00239
00240
00241
00242
00243 void realizeSubsystemTopology (State&) const;
00244 void realizeSubsystemModel (State&) const;
00245 void realizeSubsystemInstance (const State&) const;
00246 void realizeSubsystemTime (const State&) const;
00247 void realizeSubsystemPosition (const State&) const;
00248 void realizeSubsystemVelocity (const State&) const;
00249 void realizeSubsystemDynamics (const State&) const;
00250 void realizeSubsystemAcceleration(const State&) const;
00251 void realizeSubsystemReport (const State&) const;
00252
00253
00254
00255
00256
00257
00258
00259
00260 void calcQUnitWeights(const State&, Vector& weights) const;
00261
00262
00263
00264
00265
00266
00267 void calcUUnitWeights(const State&, Vector& weights) const;
00268
00269
00270
00271
00272
00273
00274 void calcZUnitWeights(const State&, Vector& weights) const;
00275
00276
00277
00278
00279
00280
00281
00282
00283 void calcQErrUnitTolerances(const State&, Vector& tolerances) const;
00284
00285
00286
00287
00288
00289
00290
00291
00292 void calcUErrUnitTolerances(const State&, Vector& tolerances) const;
00293
00294
00295
00296
00297
00298
00299 void calcDecorativeGeometryAndAppend
00300 (const State&, Stage, Array_<DecorativeGeometry>&) const;
00301
00302 void createScheduledEvent(const State& state, EventId& eventId) const;
00303 void createTriggeredEvent(const State& state, EventId& eventId, EventTriggerByStageIndex& triggerFunctionIndex, Stage stage) const;
00304
00305
00306
00307
00308
00309 virtual void calcEventTriggerInfo
00310 (const State&, Array_<System::EventTriggerInfo>&) const;
00311 virtual void calcTimeOfNextScheduledEvent
00312 (const State&, Real& tNextEvent, Array_<EventId>& eventIds,
00313 bool includeCurrentTime) const;
00314 virtual void calcTimeOfNextScheduledReport
00315 (const State&, Real& tNextEvent, Array_<EventId>& eventIds,
00316 bool includeCurrentTime) const;
00317 virtual void handleEvents
00318 (State&, Event::Cause, const Array_<EventId>& eventIds,
00319 Real accuracy, const Vector& yWeights, const Vector& ooConstraintTols,
00320 Stage& lowestModified, bool& shouldTerminate) const;
00321 virtual void reportEvents
00322 (const State&, Event::Cause, const Array_<EventId>& eventIds) const;
00323
00324 protected:
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 virtual Subsystem::Guts* cloneImpl() const = 0;
00343
00344 virtual int realizeSubsystemTopologyImpl(State& s) const;
00345 virtual int realizeSubsystemModelImpl(State& s) const;
00346 virtual int realizeSubsystemInstanceImpl(const State& s) const;
00347 virtual int realizeSubsystemTimeImpl(const State& s) const;
00348 virtual int realizeSubsystemPositionImpl(const State& s) const;
00349 virtual int realizeSubsystemVelocityImpl(const State& s) const;
00350 virtual int realizeSubsystemDynamicsImpl(const State& s) const;
00351 virtual int realizeSubsystemAccelerationImpl(const State& s) const;
00352 virtual int realizeSubsystemReportImpl(const State& s) const;
00353
00354 virtual int calcQUnitWeightsImpl(const State& s, Vector& weights) const;
00355 virtual int calcUUnitWeightsImpl(const State& s, Vector& weights) const;
00356 virtual int calcZUnitWeightsImpl(const State& s, Vector& weights) const;
00357 virtual int calcQErrUnitTolerancesImpl(const State& s, Vector& tolerances) const;
00358 virtual int calcUErrUnitTolerancesImpl(const State& s, Vector& tolerances) const;
00359 virtual int calcDecorativeGeometryAndAppendImpl
00360 (const State&, Stage, Array_<DecorativeGeometry>&) const;
00361
00362 void advanceToStage(const State& s, Stage g) const;
00363
00364 private:
00365
00366 GutsRep* rep;
00367
00368 friend class GutsRep;
00369 };
00370
00371 }
00372
00373 #endif // SimTK_SimTKCOMMON_SUBSYSTEM_GUTS_H_