Simbody  3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
SubsystemGuts.h
Go to the documentation of this file.
1 #ifndef SimTK_SimTKCOMMON_SUBSYSTEM_GUTS_H_
2 #define SimTK_SimTKCOMMON_SUBSYSTEM_GUTS_H_
3 
4 /* -------------------------------------------------------------------------- *
5  * Simbody(tm): SimTKcommon *
6  * -------------------------------------------------------------------------- *
7  * This is part of the SimTK biosimulation toolkit originating from *
8  * Simbios, the NIH National Center for Physics-Based Simulation of *
9  * Biological Structures at Stanford, funded under the NIH Roadmap for *
10  * Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
11  * *
12  * Portions copyright (c) 2006-14 Stanford University and the Authors. *
13  * Authors: Michael Sherman *
14  * Contributors: *
15  * *
16  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
17  * not use this file except in compliance with the License. You may obtain a *
18  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
19  * *
20  * Unless required by applicable law or agreed to in writing, software *
21  * distributed under the License is distributed on an "AS IS" BASIS, *
22  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
23  * See the License for the specific language governing permissions and *
24  * limitations under the License. *
25  * -------------------------------------------------------------------------- */
26 
27 #include "SimTKcommon/basics.h"
28 #include "SimTKcommon/Simmatrix.h"
30 
31 #include <cassert>
32 
33 namespace SimTK {
34 
35 class System;
36 class DecorativeGeometry;
37 
38 //==============================================================================
39 // SUBSYSTEM :: GUTS
40 //==============================================================================
48 public:
49 
54 explicit Guts(const String& name="<NONAME>", const String& version="0.0.0");
55 
57 virtual ~Guts();
58 
61 Guts(const Guts&);
62 
65 const String& getName() const {return m_subsystemName;}
68 const String& getVersion() const {return m_subsystemVersion;}
69 
83 QIndex allocateQ(State& s, const Vector& qInit) const
84 { return s.allocateQ(getMySubsystemIndex(), qInit); }
85 UIndex allocateU(State& s, const Vector& uInit) const
86 { return s.allocateU(getMySubsystemIndex(), uInit); }
87 ZIndex allocateZ(State& s, const Vector& zInit) const
88 { return s.allocateZ(getMySubsystemIndex(), zInit); }
89 
92 { return s.allocateDiscreteVariable(getMySubsystemIndex(), g, v); }
93 DiscreteVariableIndex allocateAutoUpdateDiscreteVariable
94  (State& s, Stage invalidates, AbstractValue* v, Stage updateDependsOn) const
96  (getMySubsystemIndex(),invalidates,v,updateDependsOn); }
97 CacheEntryIndex allocateCacheEntry
98  (const State& s, Stage dependsOn, Stage computedBy, AbstractValue* v) const
99 { return s.allocateCacheEntry
100  (getMySubsystemIndex(), dependsOn, computedBy, v); }
101 
102 CacheEntryIndex allocateCacheEntry
103  (const State& state, Stage g, AbstractValue* v) const
104 { return allocateCacheEntry(state, g, g, v); }
105 CacheEntryIndex allocateLazyCacheEntry
106  (const State& state, Stage earliest, AbstractValue* v) const
107 { return allocateCacheEntry(state, earliest, Stage::Infinity, v); }
108 
109 QErrIndex allocateQErr(const State& s, int nqerr) const
110 { return s.allocateQErr(getMySubsystemIndex(), nqerr); }
111 UErrIndex allocateUErr(const State& s, int nuerr) const
112 { return s.allocateUErr(getMySubsystemIndex(), nuerr); }
113 UDotErrIndex allocateUDotErr(const State& s, int nudoterr) const
114 { return s.allocateUDotErr(getMySubsystemIndex(), nudoterr); }
116 allocateEventTriggersByStage(const State& s, Stage g, int ntriggers) const
117 { return s.allocateEventTrigger(getMySubsystemIndex(),g,ntriggers); }
118 
119 const Vector& getQ(const State& s) const
120 { return s.getQ(getMySubsystemIndex()); }
121 const Vector& getU(const State& s) const
122 { return s.getU(getMySubsystemIndex()); }
123 const Vector& getZ(const State& s) const
124 { return s.getZ(getMySubsystemIndex()); }
125 const Vector& getUWeights(const State& s) const
126 { return s.getUWeights(getMySubsystemIndex()); }
127 const Vector& getZWeights(const State& s) const
128 { return s.getZWeights(getMySubsystemIndex()); }
129 
130 Vector& updQ(State& s) const {return s.updQ(getMySubsystemIndex());}
131 Vector& updU(State& s) const {return s.updU(getMySubsystemIndex());}
132 Vector& updZ(State& s) const {return s.updZ(getMySubsystemIndex());}
133 
134 const Vector& getQDot (const State& s) const
135 { return s.getQDot(getMySubsystemIndex()); }
136 const Vector& getUDot (const State& s) const
137 { return s.getUDot(getMySubsystemIndex()); }
138 const Vector& getZDot (const State& s) const
139 { return s.getZDot(getMySubsystemIndex()); }
140 const Vector& getQDotDot(const State& s) const
141 { return s.getQDotDot(getMySubsystemIndex()); }
142 
143 Vector& updQDot (const State& s) const
144 { return s.updQDot(getMySubsystemIndex()); }
145 Vector& updUDot (const State& s) const
146 { return s.updUDot(getMySubsystemIndex()); }
147 Vector& updZDot (const State& s) const
148 { return s.updZDot(getMySubsystemIndex()); }
149 Vector& updQDotDot(const State& s) const
150 { return s.updQDotDot(getMySubsystemIndex()); }
151 
152 const Vector& getQErr(const State& s) const
153 { return s.getQErr(getMySubsystemIndex()); }
154 const Vector& getUErr(const State& s) const
155 { return s.getUErr(getMySubsystemIndex()); }
156 const Vector& getQErrWeights(const State& s) const
157 { return s.getQErrWeights(getMySubsystemIndex()); }
158 const Vector& getUErrWeights(const State& s) const
159 { return s.getUErrWeights(getMySubsystemIndex()); }
160 
161 const Vector& getUDotErr(const State& s) const
162 { return s.getUDotErr(getMySubsystemIndex()); }
163 const Vector& getMultipliers(const State& s) const
164 { return s.getMultipliers(getMySubsystemIndex()); }
165 const Vector& getEventTriggersByStage(const State& s, Stage g) const
166 { return s.getEventTriggersByStage(getMySubsystemIndex(),g); }
167 
168 Vector& updQErr(const State& s) const
169 { return s.updQErr(getMySubsystemIndex()); }
170 Vector& updUErr(const State& s) const
171 { return s.updUErr(getMySubsystemIndex()); }
172 Vector& updUDotErr(const State& s) const
173 { return s.updUDotErr(getMySubsystemIndex()); }
174 Vector& updMultipliers(const State& s) const
175 { return s.updMultipliers(getMySubsystemIndex()); }
177 { return s.updEventTriggersByStage(getMySubsystemIndex(),g); }
178 
179 SystemQIndex getQStart(const State& s) const
180 { return s.getQStart(getMySubsystemIndex()); }
181 int getNQ(const State& s) const
182 { return s.getNQ(getMySubsystemIndex()); }
183 
184 SystemUIndex getUStart(const State& s) const
185 { return s.getUStart(getMySubsystemIndex()); }
186 int getNU(const State& s) const
187 { return s.getNU(getMySubsystemIndex()); }
188 
189 SystemZIndex getZStart(const State& s) const
190 { return s.getZStart(getMySubsystemIndex()); }
191 int getNZ(const State& s) const
192 { return s.getNZ(getMySubsystemIndex()); }
193 
195 { return s.getQErrStart(getMySubsystemIndex()); }
196 int getNQErr(const State& s) const
197 { return s.getNQErr(getMySubsystemIndex()); }
198 
200 { return s.getUErrStart(getMySubsystemIndex()); }
201 int getNUErr(const State& s) const
202 { return s.getNUErr(getMySubsystemIndex()); }
203 
205 { return s.getUDotErrStart(getMySubsystemIndex()); }
206 int getNUDotErr(const State& s) const
207 { return s.getNUDotErr(getMySubsystemIndex()); }
208 
210 { return s.getMultipliersStart(getMySubsystemIndex()); }
211 int getNMultipliers(const State& s) const
212 { return s.getNMultipliers(getMySubsystemIndex()); }
213 
215 { return s.getEventTriggerStartByStage(getMySubsystemIndex(),g); }
216 int getNEventTriggersByStage (const State& s, Stage g) const
217 { return s.getNEventTriggersByStage(getMySubsystemIndex(),g); }
218 
219 
220 // For convenience.
221 void setQ(State& s, const Vector& q) const {
222  SimTK_ASSERT(q.size() == getNQ(s), "Subsystem::Guts::setQ()");
223  updQ(s) = q;
224 }
225 void setU(State& s, const Vector& u) const {
226  SimTK_ASSERT(u.size() == getNU(s), "Subsystem::Guts::setU()");
227  updU(s) = u;
228 }
229 void setZ(State& s, const Vector& z) const {
230  SimTK_ASSERT(z.size() == getNZ(s), "Subsystem::Guts::setZ()");
231  updZ(s) = z;
232 }
233 
234 Stage getStage(const State& s) const
235 { return s.getSubsystemStage(getMySubsystemIndex()); }
236 void advanceToStage(const State& s, Stage g) const
237 { s.advanceSubsystemToStage(getMySubsystemIndex(), g); }
238 
239 const AbstractValue&
241 { return s.getDiscreteVariable(getMySubsystemIndex(), index); }
243 { return s.updDiscreteVariable(getMySubsystemIndex(), index); }
244 const AbstractValue& getCacheEntry(const State& s, CacheEntryIndex index) const
245 { return s.getCacheEntry(getMySubsystemIndex(), index); }
247 { return s.updCacheEntry(getMySubsystemIndex(), index); }
249 { return s.getDiscreteVarLastUpdateTime(getMySubsystemIndex(),dx); }
252 { return s.getDiscreteVarUpdateIndex(getMySubsystemIndex(),dx); }
253 const AbstractValue&
255 { return s.getDiscreteVarUpdateValue(getMySubsystemIndex(),dx); }
258 { return s.updDiscreteVarUpdateValue(getMySubsystemIndex(),dx); }
259 bool isDiscreteVarUpdateValueRealized
260  (const State& s, DiscreteVariableIndex dx) const
261 { return s.isDiscreteVarUpdateValueRealized(getMySubsystemIndex(),dx); }
262 void markDiscreteVarUpdateValueRealized
263  (const State& s, DiscreteVariableIndex dx) const
264 { return s.markDiscreteVarUpdateValueRealized(getMySubsystemIndex(),dx); }
265 
266 bool isCacheValueRealized(const State& s, CacheEntryIndex cx) const
267 { return s.isCacheValueRealized(getMySubsystemIndex(), cx); }
269 { s.markCacheValueRealized(getMySubsystemIndex(), cx); }
271 { s.markCacheValueNotRealized(getMySubsystemIndex(), cx); }
276 MeasureIndex adoptMeasure(AbstractMeasure& m);
277 
284 template <class T> Measure_<T> getMeasure_(MeasureIndex mx) const
285 { return Measure_<T>::getAs(getMeasure(mx)); }
286 
291 AbstractMeasure getMeasure(MeasureIndex mx) const {
292  SimTK_ASSERT(0 <= mx && mx < m_measures.size(),
293  "Subsystem::Guts::getMeasure()");
294  return AbstractMeasure(m_measures[mx]);
295 }
296 
297 bool isInSystem() const {return m_mySystem != 0;}
298 bool isInSameSystem(const Subsystem& otherSubsystem) const;
299 
300 const System& getSystem() const {
301  SimTK_ASSERT(isInSystem(), "Subsystem::getSystem()");
302  return *m_mySystem;
303 }
305  SimTK_ASSERT(isInSystem(), "Subsystem::updSystem()");
306  return *m_mySystem;
307 }
309  SimTK_ASSERT(!isInSystem(), "Subsystem::setSystem()");
310  SimTK_ASSERT(id.isValid(), "Subsystem::setSystem()");
311  m_mySystem = &sys;
312  m_mySubsystemIndex = id;
313 }
315  SimTK_ASSERT(isInSystem(), "Subsystem::getMySubsystemIndex()");
316  return m_mySubsystemIndex;
317 }
318 
319 
324 { return m_subsystemTopologyRealized; }
325 
334 void invalidateSubsystemTopologyCache() const;
335 
336 // These are wrappers for the virtual methods defined below. They
337 // are used to ensure good behavior. Most of them deal automatically with
338 // the Subsystem's Measures, as well as invoking the corresponding virtual
339 // for the Subsystem's own processing.
340 
341 Subsystem::Guts* clone() const;
342 
343 // Realize this subsystem's part of the State from Stage-1 to Stage
344 // for the indicated stage. After doing some checking, these routines
345 // call the concrete subsystem's corresponding virtual method, and
346 // on return they make sure the stage has been properly updated.
347 // Note that these will do nothing if the Subsystem stage is already
348 // at or greater than the indicated stage.
349 void realizeSubsystemTopology (State&) const;
350 void realizeSubsystemModel (State&) const;
351 void realizeSubsystemInstance (const State&) const;
352 void realizeSubsystemTime (const State&) const;
353 void realizeSubsystemPosition (const State&) const;
354 void realizeSubsystemVelocity (const State&) const;
355 void realizeSubsystemDynamics (const State&) const;
356 void realizeSubsystemAcceleration(const State&) const;
357 void realizeSubsystemReport (const State&) const;
358 
359 // Generate decorative geometry computable at a specific stage. This will
360 // throw an exception if this subsystem's state hasn't already been realized
361 // to that stage. Note that the list is not inclusive -- you have to
362 // request geometry from each stage to get all of it.
363 // The generated geometry will be *appended* to the supplied output vector.
364 void calcDecorativeGeometryAndAppend
365  (const State&, Stage, Array_<DecorativeGeometry>&) const;
366 
367 void createScheduledEvent(const State& state, EventId& eventId) const;
368 void createTriggeredEvent(const State& state, EventId& eventId,
369  EventTriggerByStageIndex& triggerFunctionIndex,
370  Stage stage) const;
371 
372 // These methods are called by the corresponding methods of System.
373 // Each subsystem is responsible for defining its own events, and
374 // System then combines the information from them, and dispatches events
375 // to the appropriate subsystems for handling when they occur.
376 void calcEventTriggerInfo
377  (const State&, Array_<EventTriggerInfo>&) const;
378 void calcTimeOfNextScheduledEvent
379  (const State&, Real& tNextEvent, Array_<EventId>& eventIds,
380  bool includeCurrentTime) const;
381 void calcTimeOfNextScheduledReport
382  (const State&, Real& tNextEvent, Array_<EventId>& eventIds,
383  bool includeCurrentTime) const;
384 void handleEvents
385  (State&, Event::Cause, const Array_<EventId>& eventIds,
386  const HandleEventsOptions& options, HandleEventsResults& results) const;
387 void reportEvents
388  (const State&, Event::Cause, const Array_<EventId>& eventIds) const;
389 
390 protected:
391 // These virtual methods should be overridden in concrete Subsystems as
392 // necessary. They should never be called directly; instead call the
393 // wrapper routines above, which have the same name but without the "Impl"
394 // (implementation) at the end.
395 
396 // The "realize..." wrappers will call the "realize...Impl" methods below
397 // only when the current stage for the Subsystem is the one just prior
398 // to the stage being realized. For example, realizeSubsystemVelocityImpl()
399 // is called by realizeSubsystemVelocity() only when the passed-in State
400 // shows this subsystem's stage to be exactly Stage::Position.
401 //
402 // The default implementations provided here do nothing. That means the
403 // wrappers will simply check that the current stage is correct and
404 // advance it if necessary.
405 
406 // The destructor is already virtual; see above.
407 
408 virtual Subsystem::Guts* cloneImpl() const = 0;
409 
410 virtual int realizeSubsystemTopologyImpl(State& s) const {return 0;}
411 virtual int realizeSubsystemModelImpl (State& s) const {return 0;}
412 virtual int realizeSubsystemInstanceImpl(const State& s) const {return 0;}
413 virtual int realizeSubsystemTimeImpl (const State& s) const {return 0;}
414 virtual int realizeSubsystemPositionImpl(const State& s) const {return 0;}
415 virtual int realizeSubsystemVelocityImpl(const State& s) const {return 0;}
416 virtual int realizeSubsystemDynamicsImpl(const State& s) const {return 0;}
417 virtual int realizeSubsystemAccelerationImpl(const State& s)const{return 0;}
418 virtual int realizeSubsystemReportImpl (const State& s) const {return 0;}
419 
420 virtual int calcDecorativeGeometryAndAppendImpl
421  (const State&, Stage, Array_<DecorativeGeometry>&) const {return 0;}
422 
423 virtual void calcEventTriggerInfoImpl
424  (const State&, Array_<EventTriggerInfo>&) const {}
425 virtual void calcTimeOfNextScheduledEventImpl
426  (const State&, Real& tNextEvent, Array_<EventId>& eventIds,
427  bool includeCurrentTime) const {}
428 virtual void calcTimeOfNextScheduledReportImpl
429  (const State&, Real& tNextEvent, Array_<EventId>& eventIds,
430  bool includeCurrentTime) const {}
431 virtual void handleEventsImpl
432  (State&, Event::Cause, const Array_<EventId>& eventIds,
433  const HandleEventsOptions& options,
434  HandleEventsResults& results) const {}
435 virtual void reportEventsImpl
436  (const State&, Event::Cause, const Array_<EventId>& eventIds) const {}
437 
438 
439 public:
443  SimTK_ASSERT(m_myHandle, "Subsystem::getOwnerSubsystemHandle()");
444  return *m_myHandle;
445 }
449  SimTK_ASSERT(m_myHandle, "Subsystem::getOwnerSubsystemHandle()");
450  return *m_myHandle;
451 }
452 
457 void setOwnerSubsystemHandle(Subsystem& subsys) {m_myHandle=&subsys;}
458 
461 bool hasOwnerSubsystemHandle() const {return m_myHandle != 0;}
462 
463 private:
464 // Suppressed.
465 Guts& operator=(const Guts&);
466 
467 //------------------------------------------------------------------------------
468  private:
469 
470  // TOPOLOGY STATE INFORMATION
471 String m_subsystemName;
472 String m_subsystemVersion;
473 System* m_mySystem; // the System to which this Subsystem belongs
474 SubsystemIndex m_mySubsystemIndex; // Subsystem # within System
475 
476 friend class Subsystem;
477 Subsystem* m_myHandle; // the owner handle of this Guts object
478 
479 // This is the list of Measures belonging to this Subsystem.
481  m_measures;
482 
483  // TOPOLOGY CACHE INFORMATION
484 mutable bool m_subsystemTopologyRealized;
485 };
486 
487 
488 //==============================================================================
489 // SUBSYSTEM INLINES
490 //==============================================================================
491 // These had to wait for Subsystem::Guts to be defined.
492 
495 
496 inline const String& Subsystem::getName() const {return getSubsystemGuts().getName();}
497 inline const String& Subsystem::getVersion() const {return getSubsystemGuts().getVersion();}
498 
501 }
502 
505 }
506 
508 { return updSubsystemGuts().adoptMeasure(m); }
509 inline AbstractMeasure Subsystem::getMeasure(MeasureIndex mx) const
510 { return getSubsystemGuts().getMeasure(mx); }
511 
512 
513 inline bool Subsystem::isInSystem() const
514 { return getSubsystemGuts().isInSystem(); }
515 inline bool Subsystem::isInSameSystem(const Subsystem& otherSubsystem) const
516 { return getSubsystemGuts().isInSameSystem(otherSubsystem); }
517 
518 inline const System& Subsystem::getSystem() const
519 { return getSubsystemGuts().getSystem(); }
521 { return updSubsystemGuts().updSystem(); }
523 { updSubsystemGuts().setSystem(sys,id); }
524 
525 inline bool Subsystem::isOwnerHandle() const
526 { return guts==0 || &guts->getOwnerSubsystemHandle()==this; }
527 
528 } // namespace SimTK
529 
530 #endif // SimTK_SimTKCOMMON_SUBSYSTEM_GUTS_H_
const Vector & getZWeights(SubsystemIndex) const
AbstractValue & updDiscreteVarUpdateValue(SubsystemIndex, DiscreteVariableIndex) const
For an auto-updating discrete variable, return a writable reference to the value of its associated up...
Vector & updUErr(SubsystemIndex) const
bool isInSystem() const
Return true if this Subsystem is contained in a System.
Definition: SubsystemGuts.h:513
A Subsystem is expected to be part of a larger System and to have interdependencies with other subsys...
Definition: Subsystem.h:55
const Vector & getQDotDot(SubsystemIndex) const
Vector & updQ(SubsystemIndex)
Vector & updQDot(const State &s) const
Definition: SubsystemGuts.h:143
MeasureIndex adoptMeasure(AbstractMeasure &m)
Add a new Measure to this Subsystem.
AbstractMeasure getMeasure(MeasureIndex) const
Obtain the Subsystem name if one was given on construction of the concrete Subsystem.
Definition: SubsystemGuts.h:509
const String & getVersion() const
Obtain the Subsystem version string if one was given on construction.
Definition: SubsystemGuts.h:497
SystemYErrIndex getUErrStart() const
Returns the yErr index at which the uErr's begin. Callable at Instance stage.
#define SimTK_SimTKCOMMON_EXPORT
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:202
const Vector & getZDot(SubsystemIndex) const
void invalidateSubsystemTopologyCache() const
Always call this method when a topological change is made to this Subsystem to indicate that any Stag...
Definition: SubsystemGuts.h:503
const Vector & getQErr(SubsystemIndex) const
const Vector & getZ(SubsystemIndex) const
const Vector & getUDot(const State &s) const
Definition: SubsystemGuts.h:136
Unique integer type for Subsystem-local uDotErr indexing.
SubsystemIndex getMySubsystemIndex() const
Return the SubsystemIndex within the containing System.
Definition: SubsystemGuts.h:493
Vector & updMultipliers(SubsystemIndex) const
Vector & updQErr(SubsystemIndex) const
bool isDiscreteVarUpdateValueRealized(SubsystemIndex, DiscreteVariableIndex) const
Check whether the update value for this auto-update discrete variable has already been computed since...
const Stage & getSubsystemStage(SubsystemIndex) const
int getNU() const
Get total number of shared u's (generalized speeds; mobilities).
int getNUErr(const State &s) const
Definition: SubsystemGuts.h:201
MeasureIndex adoptMeasure(AbstractMeasure &)
Obtain the Subsystem name if one was given on construction of the concrete Subsystem.
Definition: SubsystemGuts.h:507
AbstractValue & updCacheEntry(const State &s, CacheEntryIndex index) const
Definition: SubsystemGuts.h:246
AbstractValue & updCacheEntry(SubsystemIndex, CacheEntryIndex) const
Retrieve a writable reference to the value contained in a particular cache entry. ...
void markCacheValueNotRealized(SubsystemIndex, CacheEntryIndex) const
Normally cache entries are invalidated automatically, however this method allows manual invalidation ...
void advanceSubsystemToStage(SubsystemIndex, Stage) const
Advance a particular Subsystem's current stage by one to the indicated stage.
QErrIndex allocateQErr(SubsystemIndex, int nqerr) const
Allocate nqerr cache slots to hold the current error for position-level (holonomic) constraint equati...
Unique integer type for Subsystem-local u indexing.
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
CacheEntryIndex allocateCacheEntry(SubsystemIndex, Stage earliest, Stage latest, AbstractValue *) const
There are two Stages supplied explicitly as arguments to this method: earliest and latest...
virtual int realizeSubsystemModelImpl(State &s) const
Definition: SubsystemGuts.h:411
Measure_< T > getMeasure_(MeasureIndex mx) const
Return the Measure whose index within this Subsystem is given.
Definition: SubsystemGuts.h:284
Unique integer type for Subsystem-local uErr indexing.
Real getDiscreteVarLastUpdateTime(SubsystemIndex, DiscreteVariableIndex) const
Return the time of last update for this discrete variable.
int size() const
Definition: VectorBase.h:396
DiscreteVariableIndex allocateDiscreteVariable(State &s, Stage g, AbstractValue *v) const
Definition: SubsystemGuts.h:91
Unique integer type for Subsystem-local qErr indexing.
This class is basically a glorified enumerated type, type-safe and range checked but permitting conve...
Definition: Stage.h:50
SystemEventTriggerIndex getEventTriggerStartByStage(Stage) const
Return the index within the global event trigger array at which the first of the event triggers assoc...
int getNQErr() const
Return the total number nqerr=mp+nQuaternions of cache entries for position-level constraint errors...
Vector & updUErr(const State &s) const
Definition: SubsystemGuts.h:170
SystemMultiplierIndex getMultipliersStart(const State &s) const
Definition: SubsystemGuts.h:209
const AbstractValue & getDiscreteVariable(SubsystemIndex, DiscreteVariableIndex) const
Get the current value of the indicated discrete variable.
UDotErrIndex allocateUDotErr(SubsystemIndex, int nudoterr) const
Allocate nudoterr cache slots to hold the current error for acceleration-level (acceleration-only, nonholonomic first derivative, and holonomic second derivative) constraint equations.
SystemYIndex getUStart() const
Returns the y index at which the u's begin. Callable at Model stage.
CacheEntryIndex getDiscreteVarUpdateIndex(SubsystemIndex, DiscreteVariableIndex) const
For an auto-updating discrete variable, return the CacheEntryIndex for its associated update cache en...
#define SimTK_ASSERT(cond, msg)
Definition: ExceptionMacros.h:374
SystemUDotErrIndex getUDotErrStart(SubsystemIndex) const
UDotErrIndex allocateUDotErr(const State &s, int nudoterr) const
Definition: SubsystemGuts.h:113
Vector & updUDot(const State &s) const
Definition: SubsystemGuts.h:145
bool isCacheValueRealized(SubsystemIndex, CacheEntryIndex) const
Check whether the value in a particular cache entry has been recalculated since the last change to th...
virtual int realizeSubsystemPositionImpl(const State &s) const
Definition: SubsystemGuts.h:414
void advanceToStage(const State &s, Stage g) const
Definition: SubsystemGuts.h:236
int getNMultipliers() const
Return the total number of constraint multipliers; necessarily the same as the number of acceleration...
The SimTK::Array_ container class is a plug-compatible replacement for the C++ standard template l...
Definition: Array.h:50
bool subsystemTopologyHasBeenRealized() const
Returns true if this subsystem's realizeTopology() method has been called since the last topological ...
Definition: SubsystemGuts.h:323
This is the base class for all Measure handle classes.
Definition: Measure.h:151
const Vector & getZDot(const State &s) const
Definition: SubsystemGuts.h:138
SimTK_Real Real
This is the default compiled-in floating point type for SimTK, either float or double.
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:577
EventTriggerByStageIndex allocateEventTriggersByStage(const State &s, Stage g, int ntriggers) const
Definition: SubsystemGuts.h:116
int getNUErr() const
Return the total number nuerr=mp+mv of cache entries for velocity-level constraint errors (including ...
Vector & updUDotErr(SubsystemIndex) const
This unique integer type is for indexing global "multiplier-like" arrays, that is, arrays that inherently have the same dimension as the total number of Lagrange multipliers in the full System-level view of the State.
const Subsystem & getOwnerSubsystemHandle() const
Return a const reference to the Subsystem handle object that is the unique owner of this Subsystem::G...
Definition: SubsystemGuts.h:442
QIndex allocateQ(State &s, const Vector &qInit) const
Definition: SubsystemGuts.h:83
This object is intended to contain all state information for a SimTK::System, except topological info...
Definition: State.h:276
const Subsystem::Guts & getSubsystemGuts() const
Obtain the Subsystem name if one was given on construction of the concrete Subsystem.
Definition: Subsystem.h:353
const Vector & getQDotDot(const State &s) const
Definition: SubsystemGuts.h:140
const Vector & getUWeights(const State &s) const
Definition: SubsystemGuts.h:125
int getNQ() const
Get total number of shared q's (generalized coordinates; second order state variables).
void setU(State &s, const Vector &u) const
Definition: SubsystemGuts.h:225
const Vector & getUErr(const State &s) const
Definition: SubsystemGuts.h:154
const Vector & getQErrWeights(SubsystemIndex) const
const AbstractValue & getDiscreteVariable(const State &s, DiscreteVariableIndex index) const
Definition: SubsystemGuts.h:240
AbstractValue & updDiscreteVariable(State &s, DiscreteVariableIndex index) const
Definition: SubsystemGuts.h:242
void setSystem(System &sys, SubsystemIndex id)
Definition: SubsystemGuts.h:308
const Vector & getUDotErr(const State &s) const
Definition: SubsystemGuts.h:161
const Vector & getUWeights(SubsystemIndex) const
AbstractValue & updDiscreteVariable(SubsystemIndex, DiscreteVariableIndex)
Get a writable reference to the value stored in the indicated discrete state variable dv...
Vector & updQ(State &s) const
Definition: SubsystemGuts.h:130
UIndex allocateU(State &s, const Vector &uInit) const
Definition: SubsystemGuts.h:85
Vector & updU(SubsystemIndex)
These are all the possible causes for events.
Definition: Event.h:123
const AbstractValue & getDiscreteVarUpdateValue(const State &s, DiscreteVariableIndex dx) const
Definition: SubsystemGuts.h:254
const Vector & getMultipliers(const State &s) const
Definition: SubsystemGuts.h:163
DiscreteVariableIndex allocateAutoUpdateDiscreteVariable(SubsystemIndex, Stage invalidates, AbstractValue *, Stage updateDependsOn)
This method allocates a DiscreteVariable whose value should be updated automatically after each time ...
SystemQErrIndex getQErrStart(const State &s) const
Definition: SubsystemGuts.h:194
Subsystem::Guts & updSubsystemGuts()
Obtain the Subsystem name if one was given on construction of the concrete Subsystem.
Definition: Subsystem.h:354
SystemQIndex getQStart(const State &s) const
Definition: SubsystemGuts.h:179
bool isCacheValueRealized(const State &s, CacheEntryIndex cx) const
Definition: SubsystemGuts.h:266
Vector & updEventTriggersByStage(const State &s, Stage g) const
Definition: SubsystemGuts.h:176
virtual int realizeSubsystemDynamicsImpl(const State &s) const
Definition: SubsystemGuts.h:416
Vector & updZ(State &s) const
Definition: SubsystemGuts.h:132
Vector & updQErr(const State &s) const
Definition: SubsystemGuts.h:168
const Vector & getUDotErr(SubsystemIndex) const
ZIndex allocateZ(State &s, const Vector &zInit) const
Definition: SubsystemGuts.h:87
QErrIndex allocateQErr(const State &s, int nqerr) const
Definition: SubsystemGuts.h:109
This unique integer type is for indexing global "q-like" arrays, that is, arrays that inherently have...
This unique integer type is for indexing global "qErr-like" arrays, that is, arrays that inherently h...
Unique integer type for Subsystem-local z indexing.
Subsystem & updOwnerSubsystemHandle()
Return a writable reference to the Subsystem handle object that is the unique owner of this Subsystem...
Definition: SubsystemGuts.h:448
int getNQ(const State &s) const
Definition: SubsystemGuts.h:181
bool isInSameSystem(const Subsystem &otherSubsystem) const
Return true if this Subsystem is contained in the same System as contains the given otherSubsystem...
Definition: SubsystemGuts.h:515
This unique integer type is for indexing global "uErr-like" arrays, that is, arrays that inherently h...
const Vector & getZWeights(const State &s) const
Definition: SubsystemGuts.h:127
AbstractValue & updDiscreteVarUpdateValue(const State &s, DiscreteVariableIndex dx) const
Definition: SubsystemGuts.h:257
void setZ(State &s, const Vector &z) const
Definition: SubsystemGuts.h:229
System & updSystem()
Return a writable reference to the System that contains this Subsystem.
Definition: SubsystemGuts.h:520
SystemUDotErrIndex getUDotErrStart(const State &s) const
Definition: SubsystemGuts.h:204
const Vector & getEventTriggersByStage(const State &s, Stage g) const
Definition: SubsystemGuts.h:165
Vector & updU(State &s) const
Definition: SubsystemGuts.h:131
SystemYIndex getQStart() const
Returns the y index at which the q's begin. Callable at Model stage.
DiscreteVariableIndex allocateDiscreteVariable(SubsystemIndex, Stage invalidates, AbstractValue *)
The Stage supplied here in the call is the earliest subsystem stage which is invalidated by a change ...
Unique integer type for Subsystem-local q indexing.
int getNUDotErr(const State &s) const
Definition: SubsystemGuts.h:206
The abstract parent of all Subsystem implementation classes.
Definition: SubsystemGuts.h:47
void invalidateSubsystemTopologyCache() const
Always call this method when a topological change is made to this Subsystem to indicate that any Stag...
void setOwnerSubsystemHandle(Subsystem &subsys)
Provide a reference to the Subsystem handle object that is the unique owner of this Subsystem::Guts o...
Definition: SubsystemGuts.h:457
virtual int realizeSubsystemTimeImpl(const State &s) const
Definition: SubsystemGuts.h:413
Higher than any legitimate Stage.
Definition: Stage.h:63
virtual int realizeSubsystemReportImpl(const State &s) const
Definition: SubsystemGuts.h:418
int getNMultipliers(const State &s) const
Definition: SubsystemGuts.h:211
void markCacheValueRealized(const State &s, CacheEntryIndex cx) const
Definition: SubsystemGuts.h:268
const System & getSystem() const
Return a const reference to the System that contains this Subsystem.
Definition: SubsystemGuts.h:518
This unique integer type is for identifying a triggered event within a particular Stage of the full S...
int getNZ(const State &s) const
Definition: SubsystemGuts.h:191
const String & getName() const
Report back the name supplied on construction; this is not interpreted in any way by Simbody...
Definition: SubsystemGuts.h:65
bool isInSameSystem(const Subsystem &otherSubsystem) const
Stage getStage(const State &s) const
Definition: SubsystemGuts.h:234
void markCacheValueNotRealized(const State &s, CacheEntryIndex cx) const
Definition: SubsystemGuts.h:270
const Vector & getEventTriggersByStage(Stage) const
int getNQErr(const State &s) const
Definition: SubsystemGuts.h:196
virtual int realizeSubsystemTopologyImpl(State &s) const
Definition: SubsystemGuts.h:410
int getNUDotErr() const
Return the total number nudotErr=mp+mv+ma of cache entries for acceleration-level constraint errors (...
virtual int realizeSubsystemVelocityImpl(const State &s) const
Definition: SubsystemGuts.h:415
Vector & updQDot(SubsystemIndex) const
const Vector & getQDot(const State &s) const
Definition: SubsystemGuts.h:134
SimTK::String is a plug-compatible std::string replacement (plus some additional functionality) inten...
Definition: String.h:62
virtual int realizeSubsystemInstanceImpl(const State &s) const
Definition: SubsystemGuts.h:412
SystemUErrIndex getUErrStart(const State &s) const
Definition: SubsystemGuts.h:199
Vector & updZDot(const State &s) const
Definition: SubsystemGuts.h:147
Declares the user-visible part of a SimTK::State, the implementation is done in a separate internal c...
const AbstractValue & getCacheEntry(SubsystemIndex, CacheEntryIndex) const
Retrieve a const reference to the value contained in a particular cache entry.
void setQ(State &s, const Vector &q) const
Definition: SubsystemGuts.h:221
Abstract base class representing an arbitrary value of self-describing type.
Definition: Value.h:41
This unique integer type is for indexing global "uDotErr-like" arrays, that is, arrays that inherentl...
UErrIndex allocateUErr(SubsystemIndex, int nuerr) const
Allocate nuerr cache slots to hold the current error for velocity-level (nonholonomic and holonomic f...
Vector & updQDotDot(SubsystemIndex) const
SystemYIndex getZStart() const
Returns the y index at which the z's begin. Callable at Model stage.
void setSystem(System &system, SubsystemIndex subx)
Inform this Subsystem of the System that contains it, as well as the SubsystemIndex which the System ...
Definition: SubsystemGuts.h:522
This unique integer type is for selecting discrete variables.
const Vector & getQErrWeights(const State &s) const
Definition: SubsystemGuts.h:156
This unique integer type is for indexing global "z-like" arrays, that is, arrays that inherently have...
const String & getVersion() const
Report back the version string supplied on construction; this i not interpreted in any way by Simbody...
Definition: SubsystemGuts.h:68
Vector & updQDotDot(const State &s) const
Definition: SubsystemGuts.h:149
const Vector & getZ(const State &s) const
Definition: SubsystemGuts.h:123
const AbstractValue & getCacheEntry(const State &s, CacheEntryIndex index) const
Definition: SubsystemGuts.h:244
QIndex allocateQ(SubsystemIndex, const Vector &qInit)
Allocate generalized coordinates q, which are second order continuous state variables.
const AbstractValue & getDiscreteVarUpdateValue(SubsystemIndex, DiscreteVariableIndex) const
For an auto-updating discrete variable, return the current value of its associated update cache entry...
SystemMultiplierIndex getMultipliersStart(SubsystemIndex) const
const Vector & getQ(SubsystemIndex) const
Per-subsystem access to the global shared variables.
bool subsystemTopologyHasBeenRealized() const
Returns true if this Subsystem's realizeTopology() method has been called since the last topological ...
Definition: SubsystemGuts.h:499
bool isInSystem() const
Definition: SubsystemGuts.h:297
This is the base class that serves as the parent of all SimTK System objects; most commonly Simbody's...
Definition: System.h:97
bool hasOwnerSubsystemHandle() const
Check whether this Subsystem::Guts object is currently owned by some Subsystem handle object...
Definition: SubsystemGuts.h:461
const Vector & getMultipliers(SubsystemIndex) const
UIndex allocateU(SubsystemIndex, const Vector &uInit)
Allocate generalized speeds u, which are first order continuous state variables related to the deriva...
const Vector & getUErrWeights(SubsystemIndex) const
int getNU(const State &s) const
Definition: SubsystemGuts.h:186
CacheEntryIndex getDiscreteVarUpdateIndex(const State &s, DiscreteVariableIndex dx) const
Definition: SubsystemGuts.h:251
SystemZIndex getZStart(const State &s) const
Definition: SubsystemGuts.h:189
Provide a unique integer type for identifying Subsystems.
UErrIndex allocateUErr(const State &s, int nuerr) const
Definition: SubsystemGuts.h:111
const Vector & getUDot(SubsystemIndex) const
ZIndex allocateZ(SubsystemIndex, const Vector &zInit)
Allocate auxiliary first order continuous state variables z.
SystemEventTriggerByStageIndex getEventTriggerStartByStage(const State &s, Stage g) const
Definition: SubsystemGuts.h:214
This unique integer type is for selecting non-shared cache entries.
Real getDiscreteVarLastUpdateTime(const State &s, DiscreteVariableIndex dx) const
Definition: SubsystemGuts.h:248
Vector & updZ(SubsystemIndex)
Results returned by the handleEvent() method.
Definition: Event.h:342
const Vector & getUErr(SubsystemIndex) const
This is the header which should be included in user programs that would like to make use of all the S...
virtual int realizeSubsystemAccelerationImpl(const State &s) const
Definition: SubsystemGuts.h:417
const Vector & getU(const State &s) const
Definition: SubsystemGuts.h:121
Unique integer type for Subsystem-local, per-stage event indexing.
const Vector & getU(SubsystemIndex) const
const Vector & getQ(const State &s) const
Definition: SubsystemGuts.h:119
This unique integer type is for indexing global "u-like" arrays, that is, arrays that inherently have...
void markDiscreteVarUpdateValueRealized(SubsystemIndex, DiscreteVariableIndex) const
Mark the update value for this auto-update discrete variable as up-to-date with respect to the state ...
Vector & updMultipliers(const State &s) const
Definition: SubsystemGuts.h:174
Includes internal headers providing declarations for the basic SimTK Core classes.
Vector & updUDot(SubsystemIndex) const
SystemYErrIndex getQErrStart() const
Returns the yErr index at which the qErr's begin. Callable at Instance stage.
bool isOwnerHandle() const
Is this Subsystem handle the owner of the Subsystem::Guts object it points to? This is true if the ha...
Definition: SubsystemGuts.h:525
EventTriggerByStageIndex allocateEventTrigger(SubsystemIndex, Stage stage, int nevent) const
Allocate room for nevent witness function values that will be available at the indicated stage...
const System & getSystem() const
Definition: SubsystemGuts.h:300
Vector & updUDotErr(const State &s) const
Definition: SubsystemGuts.h:172
const Vector & getQDot(SubsystemIndex) const
Per-subsystem access to the shared cache entries.
SystemUIndex getUStart(const State &s) const
Definition: SubsystemGuts.h:184
Vector & updZDot(SubsystemIndex) const
const Vector & getUErrWeights(const State &s) const
Definition: SubsystemGuts.h:158
AbstractMeasure getMeasure(MeasureIndex mx) const
Return the Measure whose index within this Subsystem is given, as an AbstractMeasure (that is...
Definition: SubsystemGuts.h:291
Vector & updEventTriggersByStage(Stage) const
SubsystemIndex getMySubsystemIndex() const
Definition: SubsystemGuts.h:314
int getNEventTriggersByStage(const State &s, Stage g) const
Definition: SubsystemGuts.h:216
Options for the handleEvent() method.
Definition: Event.h:266
const String & getName() const
Obtain the Subsystem name if one was given on construction of the concrete Subsystem.
Definition: SubsystemGuts.h:496
This is the base handle class for all Measures whose value type is known, including all the Simbody b...
Definition: Measure.h:261
int getNZ() const
Get total number of shared z's (auxiliary state variables).
System & updSystem()
Definition: SubsystemGuts.h:304
int getNEventTriggersByStage(Stage) const
Return the size of the partition of event trigger functions which are evaluated at a given Stage...
void markCacheValueRealized(SubsystemIndex, CacheEntryIndex) const
Mark the value of a particular cache entry as up to date after it has been recalculated.
const Vector & getQErr(const State &s) const
Definition: SubsystemGuts.h:152
This is a class to represent unique IDs for events in a type-safe way.