AGX Dynamics 2.41.3.0
Loading...
Searching...
No Matches
ConstraintImplementation.h
Go to the documentation of this file.
1/*
2Copyright 2007-2025. Algoryx Simulation AB.
3
4All AGX source code, intellectual property, documentation, sample code,
5tutorials, scene files and technical white papers, are copyrighted, proprietary
6and confidential material of Algoryx Simulation AB. You may not download, read,
7store, distribute, publish, copy or otherwise disseminate, use or expose this
8material unless having a written signed agreement with Algoryx Simulation AB, or having been
9advised so by Algoryx Simulation AB for a time limited evaluation, or having purchased a
10valid commercial license from Algoryx Simulation AB.
11
12Algoryx Simulation AB disclaims all responsibilities for loss or damage caused
13from using this software, unless otherwise stated in written agreements with
14Algoryx Simulation AB.
15*/
16
17#ifndef AGX_CONSTRAINT_IMPLEMENTATION_H
18#define AGX_CONSTRAINT_IMPLEMENTATION_H
19
21
23#include <agx/Constraint.h>
24
25#include <agx/agx_hash_types.h>
27
29
31
32#ifdef _MSC_VER
33# pragma warning(push)
34# pragma warning( disable : 4251 ) // class X needs to have dll-interface to be used by clients of class Y
35#endif
36
37#define DEFAULT_COMPLIANCE 1.0E-8
38
39#define CONSTRAINT_SUCCESS( success ) \
40 if ( !(success) ) { \
41 LOGGER_WARNING() << "Unable to create constraint. Constraint cleared." << std::endl << LOGGER_END(); \
42 m_bodies.clear(); \
43 m_localState.remove( VALID ); \
44 return; \
45 }
46
47#define CONSTRAINT_SUCCESS_RETURN_BOOL( success ) \
48 if ( !(success) ) { \
49 LOGGER_WARNING() << "Unable to create constraint. Constraint cleared." << std::endl << LOGGER_END(); \
50 m_bodies.clear(); \
51 m_localState.remove( VALID ); \
52 return false; \
53 }
54
55namespace agx
56{
57 // Forward declaration
58 class ElementaryConstraint;
59 class Constraint;
60 class RegularizationParameters;
61 class SparseRangeReal;
62 class LSquareComplianceMatrix;
63 struct NlmcpCallbackSolverData;
64
66 typedef std::pair< Real, Real > RealPair;
67
69 {
70 public:
73 : m_numBlocks( 0 ), m_numRows( 0 ), m_numDynBlocks( 0 ) {}
74
75 AGX_FORCE_INLINE void setNumBlocks( BlockType numBlocks ) { m_numBlocks = numBlocks; }
76 AGX_FORCE_INLINE void setNumRows( BlockType numRows ) { m_numRows = numRows; }
77
78 AGX_FORCE_INLINE BlockType getNumBlocks() const { return m_numBlocks; }
79 AGX_FORCE_INLINE BlockType getNumRows() const { return m_numRows; }
80
81 AGX_FORCE_INLINE BlockType& blocks() { return m_numBlocks; }
82 AGX_FORCE_INLINE BlockType& rows() { return m_numRows; }
83 AGX_FORCE_INLINE BlockType blocks() const { return m_numBlocks; }
84 AGX_FORCE_INLINE BlockType rows() const { return m_numRows; }
85
86 AGX_FORCE_INLINE BlockType& dynBlocks() { return m_numDynBlocks; }
87 AGX_FORCE_INLINE BlockType dynBlocks() const { return m_numDynBlocks; }
88 AGX_FORCE_INLINE BlockType kinBlocks() const { return (BlockType)(m_numBlocks - m_numDynBlocks); }
89
90 AGX_FORCE_INLINE void reset() { m_numBlocks = m_numRows = m_numDynBlocks = 0; }
91
92 private:
93 BlockType m_numBlocks;
94 BlockType m_numRows;
95 BlockType m_numDynBlocks;
96 };
97
99 {
100 public:
101 enum Tags
102 {
103 NONE = 0,
104 MANY_BODY = (1<<0),
105 DEFAULT_BINARY_TAG = NONE,
106 DEFAULT_MANY_BODY_TAG = MANY_BODY
107 };
108
113 {
114 public:
119 {
120 public:
122
126 agx::UInt& numDynamicBodies();
127
131 agx::UInt numDynamicBodies() const;
132
136 agx::UInt& numNonStaticBodies();
137
141 agx::UInt numNonStaticBodies() const;
142
143 private:
144 agx::UInt m_numDynamicBodies;
145 agx::UInt m_numNonStaticBodies;
146 };
147
148 public:
153
158 void reset( agx::UInt numBodies );
159
165
171
175 const BodiesInfo& getOriginalInfo() const;
176
180 const BodiesInfo& getSolverInfo() const;
181
185 const agx::Int32Vector& getPermutation() const;
186
190 agx::Int32Vector& getPermutation();
191
195 const agx::Int32Vector& getBodyIndices() const;
196
200 agx::Int32Vector& getBodyIndices();
201
205 const agx::ConstraintRigidBodyContainer& getSolverBodies() const;
206
215
216 private:
217 BodiesInfo m_originalInfo;
218 BodiesInfo m_solverInfo;
220 Int32Vector m_permutation;
221 Int32Vector m_bodyIndices;
222 UInt m_numRecurrentMergedBodies;
223 };
224
229 #if !defined(SWIGPYTHON)
231 {
232 public:
238
242 BodyView( const BodyView& other );
243
247 agx::UInt getNumDynamicBodies() const;
248
252 agx::UInt getNumNonStaticBodies() const;
253
257 agx::UInt getNumBodies() const;
258
262 agx::RigidBody* getBodyAt( agx::UInt i );
263
267 const agx::RigidBody* getBodyAt( agx::UInt i ) const;
268
272 const ConstraintRigidBodyContainer& getBodies() const;
273
277 BodyView& operator = ( const BodyView& ) = delete;
278
279 private:
281 const ConstraintRigidBodyContainer& m_bodies;
282 };
283
285 {
286 public:
292
296 SolverBodyView( const SolverBodyView& other );
297
301 const ConstrainedBodiesState& getState() const;
302
306 ConstrainedBodiesState& getState();
307
311 agx::RigidBody* getPermutedBodyAt( agx::UInt i );
312
316 const agx::RigidBody* getPermutedBodyAt( agx::UInt i ) const;
317
318 private:
322 inline SolverBodyView& operator = ( const SolverBodyView& ) { agxAbort(); return *this; }
323
324 private:
325 ConstrainedBodiesState& m_state;
326 };
327 #endif
328
329 public:
335
340
344 #if !defined(SWIGPYTHON)
346
351 #endif
352
353 // ****************************************************************************
354 // Callbacks from solvers *****************************************************
355 // ****************************************************************************
356
364 virtual bool updateValid();
365
372 virtual void prepare();
373
380 virtual size_t updateJacobian( agx::Jacobian6DOFElement* jacobians );
381
388 virtual int getViolation( agx::Real* g, int row );
389
396
404
410 virtual void getEpsilon( agx::Real* epsilon, agx::Real h );
411
415 virtual void getParameters( agx::Real* violation,
416 agx::Real* epsilon,
417 agx::Real* damping,
418 bool* holonomic,
419 agx::Real* velocity,
420 agx::RangeReal* bounds,
421 int8_t* indexSetState,
422 agx::Real h,
423 agx::Real minPerturbation = agx::Real( 1E-10 ) );
424
432 virtual int getConstraintVelocity( agx::Real* v, int row );
433
441 virtual void getBounds( agx::RangeReal* bounds, agx::Real dt ) const;
442
452
456 void onDirectComplianceMatrix( Real* data, unsigned int ld ) const;
457
464 virtual void postSolveCallback( const agx::Jacobian6DOFElement* jacobians, const agx::Real* solution, agx::Real dt );
465
470 void postSolveIndexSetCallback( const int8_t* state );
471
478 virtual void preSystemCallback( DynamicsSystem* system );
479
485 virtual void postSystemCallback( DynamicsSystem* system );
486
492 void sort();
493
497 void reset();
498
502 virtual void addNlCallbacks( agx::SparseRangeReal& sparseRangeReal, const NlmcpCallbackSolverData& solverData ) const;
503
504 // ****************************************************************************
505
506 // ****************************************************************************
507 // Methods used by the solvers ************************************************
508 // ****************************************************************************
509
513 AGX_FORCE_INLINE agx::UInt getJacobianRowUsage() const { return m_numRows; }
514
518 AGX_FORCE_INLINE const BlockStructure& getBlockStructure() const { return m_blockStructure; }
519
524 AGX_FORCE_INLINE void setBlockRowIndex( agx::UInt blockRowIndex ) { m_blockRowIndex = blockRowIndex; }
525
529 AGX_FORCE_INLINE agx::UInt getBlockRowIndex() const { return m_blockRowIndex; }
530
535 AGX_FORCE_INLINE bool getSolveIterative() const { return m_solveType == Constraint::ITERATIVE; }
536
540 AGX_FORCE_INLINE bool getSolveBoth() const { return m_solveType == Constraint::DIRECT_AND_ITERATIVE; }
541
545 AGX_FORCE_INLINE void setSolveType( Constraint::SolveType type ) { m_solveType = type; }
546
551
555 AGX_FORCE_INLINE bool isImpacting() const { return m_localState.Is( IMPACTING ); }
556
561 AGX_FORCE_INLINE void incrementConstraintCount( RigidBody* rb ) const { agxAssert( rb ); if (rb) rb->incrementNumConstraints(); }
562
566 AGX_FORCE_INLINE int getTag() const { return m_tag; }
567
568#ifndef SWIG
570#endif
571
572 // ****************************************************************************
573
574 // ****************************************************************************
575 // Callbacks from the simulation during add and remove of this constraint *****
576 // ****************************************************************************
577
581 virtual void addNotification() {}
582
586 virtual void removeNotification() {}
587
588 // ****************************************************************************
589
590 // ****************************************************************************
591 // Methods used by non-implementation constraints but not the 'end user' ******
592 // ****************************************************************************
593
599
605
610 AGX_FORCE_INLINE const ConstraintImplPtrVector& getSubConstraints() const { return m_subConstraints; }
611
612 // ****************************************************************************
613 // Methods used by 'the user' *************************************************
614 // ****************************************************************************
615
623 virtual bool rebind() { return false; }
624
629 virtual AGX_FORCE_INLINE bool getEnable() const { return m_enable; }
630
635 virtual void setEnable(bool enable);
636
640 AGX_FORCE_INLINE bool getActive() const { return m_enable && m_localState.Is( VALID ); }
641
645 AGX_FORCE_INLINE bool isValid() const { return m_localState.Is( VALID ); }
646
647 // ****************************************************************************
648
649 // ****************************************************************************
650 // Methods for user API, these should not be used internally ******************
651 // ****************************************************************************
652
659 virtual void setEnableComputeForces( agx::Bool enable );
660
665
685 virtual agx::Bool getLastForce( agx::UInt bodyIndex, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const;
686
705 virtual agx::Bool getLastForce( const agx::RigidBody* rb, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const;
706
725 virtual agx::Bool getLastLocalForce( agx::UInt bodyIndex, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const;
726
744 virtual agx::Bool getLastLocalForce( const agx::RigidBody* rb, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const;
745
752 void setEnableLinearization(bool enable);
753
758
762 virtual agx::Attachment* userAPIgetAttachment( const agx::RigidBody* /*rb*/ ) const { return nullptr; }
763
767 virtual agx::Attachment* userAPIgetAttachment( agx::UInt /*index*/ ) const { return nullptr; }
768
772 virtual agx::AttachmentPair* getAttachmentPair() const { return nullptr; }
773
780 virtual bool addElementaryConstraint( const agx::String& name, agx::ElementaryConstraint* elementaryConstraint );
781
788 virtual bool addSecondaryConstraint( const agx::String& name, agx::ElementaryConstraint* secondaryConstraint );
789
795 virtual bool removeElementaryConstraint( agx::ElementaryConstraint* elementaryConstraint );
796
802 virtual bool removeSecondaryConstraint( agx::ElementaryConstraint* secondaryConstraint );
803
809 virtual bool removeElementaryConstraint( const agx::String& name );
810
816 virtual bool removeSecondaryConstraint( const agx::String& name );
817
823
829
835
841
845 template< typename T >
846 T* findSecondaryConstraintGivenType( const agx::UInt count = 0 ) const;
847
851 agx::Motor1D* getMotor1D( agx::UInt number = 0 ) const;
852
856 agx::Lock1D* getLock1D( agx::UInt number = 0 ) const;
857
861 agx::Range1D* getRange1D( agx::UInt number = 0 ) const;
862
867
872 virtual agx::Real getAngle( agx::UInt /*dof*/ = 0 ) const { return 0; }
873
879 virtual agx::Real getCurrentSpeed( agx::UInt /*dof*/ = 0 ) const { return 0; }
880
889
894
900 void userAPIsetCompliance( agx::Real compliance, int dof );
901
906
912 void userAPIsetDamping( agx::Real damping, int dof );
913
921
929
938
946
947
948 // **************************************************************************
949
951
952
957 agx::RealValarray getCompliance() const;
958
962 agx::Referenced* getInternalData() const;
963
967 void setInternalData( agx::Referenced* data );
968
972 AGX_FORCE_INLINE agxSDK::SimulationProxy* getSimulationProxy() { return m_simulationProxy; }
973 AGX_FORCE_INLINE const agxSDK::SimulationProxy* getSimulationProxy() const { return m_simulationProxy; }
974
976 void setForceData(agx::Physics::ConstraintForcesPtr forceData);
977
978 virtual void storeLightData( agxStream::StorageStream& ) const {}
979 virtual void restoreLightData( agxStream::StorageStream& ) {}
980
982
983 protected:
985 {
986 VALID = 1 << 0, // Replaces m_valid.
987 IMPACTING = 1 << 1, // Replaces m_impactState.
988 SUPPORTS_COMPLIANCE_MATRIX = 1 << 2 // Set if this constraint supports write access to the compliance matrix
989 // allocated in the system matrix.
990 };
991
992 using LocalState = agx::BitState<State, Int32>;
993
994 protected:
995 friend class Constraint;
1001
1008 void setSupportsComplianceMatrix( Bool supportsComplianceMatrix );
1009
1010 protected:
1020 int m_tag;
1022 private:
1023 agxSDK::SimulationProxyRef m_simulationProxy;
1024 Physics::ConstraintForcesPtr m_forceData;
1025 ref_ptr<Referenced> m_internalData;
1026
1027 protected:
1032 };
1033
1035 {
1036 public:
1039
1047 virtual bool updateValid() override;
1048
1055 virtual void prepare() override;
1056
1062 virtual size_t updateJacobian( agx::Jacobian6DOFElement* jacobians ) override;
1063
1070 virtual void postSolveCallback( const agx::Jacobian6DOFElement* jacobians, const agx::Real* solution, agx::Real dt ) override;
1071
1079 virtual bool rebind() override;
1080
1085 virtual void computeForces( const agx::Jacobian6DOFElement* jacobians );
1086
1097 virtual agx::Bool computeForces( const agx::Jacobian6DOFElement* jacobians, agx::Vec3Vector& result ) const;
1098
1105 virtual void setEnableComputeForces( agx::Bool enable ) override;
1106
1110 virtual agx::Bool getEnableComputeForces() const override;
1111
1131 virtual agx::Bool getLastForce( agx::UInt bodyIndex, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const override;
1132
1151 virtual agx::Bool getLastForce( const RigidBody* rb, Vec3& retForce, Vec3& retTorque, agx::Bool giveForceAtCm = false ) const override;
1152
1171 virtual agx::Bool getLastLocalForce( agx::UInt bodyIndex, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const override;
1172
1190 virtual agx::Bool getLastLocalForce( const agx::RigidBody* rb, agx::Vec3& retForce, agx::Vec3& retTorque, agx::Bool giveForceAtCm = false ) const override;
1191
1192 // **************************************************************************
1193 // Internal utility methods for one or two body constraints *****************
1194 // **************************************************************************
1195
1196 typedef agx::Bool (*CreateElementaryConstraintsFunction)( HighLevelConstraintImplementation* );
1197
1198 bool construct( RigidBody* rb1, Frame* rb1AttachmentFrame, RigidBody* rb2, Frame* rb2AttachmentFrame, CreateElementaryConstraintsFunction = nullptr );
1200 bool validateRigidBodiesAndAttachments( RigidBody* rb1, Frame* rb1AttachmentFrame, RigidBody* rb2, Frame* rb2AttachmentFrame );
1201
1205 virtual agx::Attachment* userAPIgetAttachment( const agx::RigidBody* rb ) const override;
1206
1210 virtual agx::Attachment* userAPIgetAttachment( agx::UInt index ) const override;
1211
1215 virtual agx::AttachmentPair* getAttachmentPair() const override;
1216
1221 virtual agx::Real getAngle( agx::UInt dof = 0 ) const override;
1222
1226 bool bodiesValid() const;
1227
1231 template< typename T >
1232 T* getAttachment( agx::UInt index );
1233
1237 template< typename T >
1238 const T* getAttachment( agx::UInt index ) const;
1239
1241
1242 virtual void restore( agxStream::InputArchive& in ) override;
1243 virtual void store( agxStream::OutputArchive& out ) const override;
1244
1245 virtual void storeLightData( agxStream::StorageStream& str ) const override;
1246 virtual void restoreLightData( agxStream::StorageStream& str ) override;
1247
1248 protected:
1251 };
1252
1254 {
1255 return m_numDynamicBodies;
1256 }
1257
1259 {
1260 return m_numDynamicBodies;
1261 }
1262
1264 {
1265 return m_numNonStaticBodies;
1266 }
1267
1269 {
1270 return m_numNonStaticBodies;
1271 }
1272
1274 {
1275 return m_originalInfo;
1276 }
1277
1279 {
1280 return m_solverInfo;
1281 }
1282
1284 {
1285 return m_permutation;
1286 }
1287
1289 {
1290 return m_permutation;
1291 }
1292
1294 {
1295 return m_bodyIndices;
1296 }
1297
1299 {
1300 return m_bodyIndices;
1301 }
1302
1304 {
1305 return m_bodies;
1306 }
1307#if !defined(SWIGPYTHON)
1309 {
1310 }
1311
1313 {
1314 }
1315
1317 {
1318 return m_info.numDynamicBodies();
1319 }
1320
1322 {
1323 return m_info.numNonStaticBodies();
1324 }
1325
1327 {
1328 return m_bodies.size();
1329 }
1331 {
1332 agxAssert( i < getNumBodies() ); return m_bodies[ i ];
1333 }
1334
1336 {
1337 agxAssert( i < getNumBodies() ); return m_bodies[ i ];
1338 }
1339
1341 {
1342 return m_bodies;
1343 }
1344
1346 : BodyView( state.getSolverInfo(), state.getSolverBodies() ), m_state( state )
1347 {
1348 }
1349
1351 : BodyView( other.m_state.getSolverInfo(), other.m_state.getSolverBodies() ), m_state( other.m_state )
1352 {
1353 }
1354
1356 {
1357 return m_state;
1358 }
1359
1361 {
1362 return m_state;
1363 }
1364
1366 {
1367 agxAssert( i < m_state.getPermutation().size() );
1368 UInt permutedIndex = (UInt)m_state.getPermutation()[ i ];
1369 agxAssert( permutedIndex < getNumBodies() );
1370 return getBodyAt( permutedIndex );
1371 }
1372
1374 {
1375 agxAssert( i < m_state.getPermutation().size() );
1376 UInt permutedIndex = (UInt)m_state.getPermutation()[ i ];
1377 agxAssert( permutedIndex < getNumBodies() );
1378 return getBodyAt( permutedIndex );
1379 }
1380#endif
1381 template< typename T >
1383 {
1384 UInt currentNumber = 0;
1385 for ( UInt i = 0, num = m_sc.size(); i < num; ++i ) {
1386 T* ec = dynamic_cast< T* >( m_sc[ i ].get() );
1387 if ( ec != nullptr && currentNumber == count )
1388 return ec;
1389 currentNumber += ec != nullptr;
1390 }
1391
1392 return nullptr;
1393 }
1394
1396
1398
1400 {
1401 return const_cast< AttachmentPair* >( &m_attachmentPair );
1402 }
1403
1404 template< typename T >
1406 {
1407 return m_attachmentPair[ index ] != nullptr ? m_attachmentPair[ index ]->as< T >() : nullptr;
1408 }
1409
1410 template< typename T >
1412 {
1413 return m_attachmentPair[ index ] != nullptr ? m_attachmentPair[ index ]->as< T >() : nullptr;
1414 }
1415
1417 {
1418 return m_attachmentPair[ 0 ] != nullptr && !m_attachmentPair[ 0 ]->objectDeleted() &&
1419 m_attachmentPair[ 1 ] != nullptr && !m_attachmentPair[ 1 ]->objectDeleted();
1420 }
1421
1425 AGX_FORCE_INLINE Real getAngle( const Vec3& a, const Vec3& b, const Vec3& c )
1426 {
1427 return std::atan2( c * b, c * a );
1428 }
1429
1434
1439} // namespace agx
1440
1441#ifdef _MSC_VER
1442# pragma warning(pop)
1443#endif
1444
1445
1446#endif /* _CONSTRAINTIMPLEMENTATION_H_ */
#define AGXPHYSICS_EXPORT
Interface class used by internal objects running in parallel.
Simulation is a class that bridges the collision space agxCollide::Space and the dynamic simulation s...
Definition: Simulation.h:131
Class for reading a binary stream of serialized data.
Definition: InputArchive.h:51
Class for writing serialized data in binary format to a stream.
Definition: OutputArchive.h:57
This class is an abstract base class for all classes that can be stored and retrieved from an Archive...
Definition: Serializable.h:45
Abstract base class for storing/restoring a line/drums with version control.
Definition: StorageStream.h:49
Constraint angle class.
Constraint attachment pair class.
Constraint attachment base class for any type of frame.
void setNumRows(BlockType numRows)
BlockType getNumBlocks() const
BlockType getNumRows() const
void setNumBlocks(BlockType numBlocks)
Interface to the bodies, either user or solver, since these bodies can differ when e....
const ConstraintRigidBodyContainer & getBodies() const
BodyView(const ConstrainedBodiesState::BodiesInfo &info, const ConstraintRigidBodyContainer &bodies)
Internal, use ConstriantImplementation::getUserView().
Info with number of dynamic and non-static body counters.
Object that holds the state seen from the user and from the solver.
const agx::ConstraintRigidBodyContainer & getSolverBodies() const
agx::Bool finalize(agx::Bool valid)
Finalize given state of constraint.
void reset(agx::UInt numBodies)
Resets all data and allocates for a maximum of numBodies.
agx::Bool increment(agx::RigidBody *rb)
Increments data given a rigid body.
agx::UInt getNumRecurrentMergedBodies() const
Counter that increments each time a merged body already has been registered and comes back.
const ConstrainedBodiesState & getState() const
SolverBodyView(ConstrainedBodiesState &state)
Internal, use ConstriantImplementation::getSolverView().
void reset()
Reset the solution vectors of the primary and secondary elementary constraints in the implementation.
virtual agx::ElementaryConstraint * getElementaryConstraint(const agx::String &name) const
Constraint::SolveType m_solveType
Only for supported solvers.
virtual int getViolation(agx::Real *g, int row)
Calculates and pushes the constraint values into array given current row.
virtual bool addElementaryConstraint(const agx::String &name, agx::ElementaryConstraint *elementaryConstraint)
Add elementary constraint (like Spherical, Dot1, Dot2 etc) given name.
agx::ElementaryConstraint::RefContainer & getElementaryConstraints()
virtual agx::Real getAngle(agx::UInt=0) const
If the constraint supports angle calculations and 'dof' is in range, this method returns the angle of...
virtual void postSystemCallback(DynamicsSystem *system)
Last in the dynamics system step forward loop, this constraint gets a call with the main system.
bool m_enable
User controlled enable flag, constraint ignored by solver if false.
BlockStructure m_blockStructure
The block structure; number of block, rows, dynamic blocks etc.
void setSupportsComplianceMatrix(Bool supportsComplianceMatrix)
Enable/disable compliance matrix callbacks from the direct solver where read/write access to the comp...
virtual void setEnableComputeForces(agx::Bool enable)
Enable (or disable) computation of the forces applied to the dynamic bodies in this constraint.
virtual agx::ElementaryConstraint * getSecondaryConstraint(const agx::String &name) const
virtual bool removeSecondaryConstraint(agx::ElementaryConstraint *secondaryConstraint)
Remove secondary constraint.
agx::UInt calculateNumActiveRows() const
Calculates the current number of active rows, including both elementary and secondary constraints.
void sort()
This method will sort this constraint by global indexing of the bodies.
virtual agx::Attachment * userAPIgetAttachment(const agx::RigidBody *) const
const agx::ElementaryConstraint::RefContainer & getSecondaryConstraints() const
void * customData
Custom data for the solvers to store data into.
virtual bool removeSecondaryConstraint(const agx::String &name)
Remove secondary constraint.
virtual void addNotification()
Callback when this constraint is added to Simulation.
virtual ~ConstraintImplementation()
Destructor.
int m_tag
Tag for this constraint.
ElementaryConstraint::RefContainer m_sc
Vector of secondary constraints.
const BlockStructure & getBlockStructure() const
agx::FrictionController * getFrictionController(agx::UInt number=0) const
virtual size_t updateJacobian(agx::Jacobian6DOFElement *jacobians)
Updated storing of Jacobian matrices.
virtual void getBounds(agx::RangeReal *bounds, agx::Real dt) const
Calculates and pushes the bounds into a sparse range data structure.
UInt m_numRows
Number of rows used by this constraint.
virtual agx::ElementaryConstraint * getElementaryConstraint(const agx::UInt index) const
const agx::ElementaryConstraint::RefContainer & getElementaryConstraints() const
virtual CALLABLE_IGNORE void updateComplianceMatrix(LSquareComplianceMatrix matrix) const
Callback with read/write access to the compliance matrix of this constraint in the direct solver.
void incrementConstraintCount(RigidBody *rb) const
Increment the number of constraints connection to rb.
RealVector calculateCurrentViolation() const
Calculates the current violation of the ordinary degrees of freedom of this constraint,...
agx::Motor1D * getMotor1D(agx::UInt number=0) const
virtual agx::Attachment * userAPIgetAttachment(agx::UInt) const
void onDirectComplianceMatrix(Real *data, unsigned int ld) const
Internal callback from the direct solver with perturbation matrix data.
void setSimulation(agxSDK::Simulation *simulation)
Set the Simulation this constraint belongs to.
void userAPIsetDamping(agx::Real damping, int dof)
Set the damping for constraint row i of this constraint.
void postSolveIndexSetCallback(const int8_t *state)
Callback after the solver is done about the state of each equation in the constraint.
ConstraintImplPtrVector m_subConstraints
Vector with sub-constraints.
virtual void removeNotification()
Callback when this constraint is removed from Simulation.
ConstraintRigidBodyContainer m_bodies
Vector with observer pointers to bodies.
virtual void postSolveCallback(const agx::Jacobian6DOFElement *jacobians, const agx::Real *solution, agx::Real dt)
Peak at the solution after the solver is done.
void setSolveType(Constraint::SolveType type)
Set solve type, either DIRECT, ITERATIVE or DIRECT_AND_ITERATIVE.
virtual agx::Bool getLastForce(agx::UInt bodyIndex, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
virtual bool removeElementaryConstraint(agx::ElementaryConstraint *elementaryConstraint)
Remove elementary constraint.
void setBlockRowIndex(agx::UInt blockRowIndex)
Sets the global start index for this constraint in the global, non-permuted matrix.
virtual agx::Real getCurrentSpeed(agx::UInt=0) const
If this method is implemented, a call to this method will return the current speed of the angle.
BodyView getUserView() const
Bodies as viewed from the user.
Constraint::SolveType getSolveType() const
virtual void setEnable(bool enable)
Sets the enable flag.
ConstraintImplPtrVector & getSubConstraints()
void userAPIsetForceRange(agx::RangeReal forceRange, agx::Int dof)
Assign force range, of an elementary constraint, for a given DOF.
virtual agx::Bool getLastForce(const agx::RigidBody *rb, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
agx::Real userAPIgetCompliance(agx::UInt dof) const
ConstraintImplementation()
Default constructor.
agx::ElementaryConstraint::RefContainer & getSecondaryConstraints()
agx::Real userAPIgetCurrentForce(agx::UInt dof) const
Consider using getLastForce instead.
agx::Lock1D * getLock1D(agx::UInt number=0) const
SolverBodyView getSolverView() const
Bodies as viewed from the solver.
virtual void preSystemCallback(DynamicsSystem *system)
Before prepare, and before the system writes to the data buffers, this constraint gets a call with th...
virtual bool removeElementaryConstraint(const agx::String &name)
Remove elementary constraint.
UInt m_blockRowIndex
Start block row for this constraint in the global matrix.
virtual void getEpsilon(agx::Real *epsilon, agx::Real h)
Writes regularization parameters for all active rows into epsilon.
virtual void addNlCallbacks(agx::SparseRangeReal &sparseRangeReal, const NlmcpCallbackSolverData &solverData) const
Interface for non-linear callback from solver.
ConstrainedBodiesState m_constrainedBodiesState
State of the included bodies, updated in updateValid.
virtual agx::ElementaryConstraint * getSecondaryConstraint(const agx::UInt index) const
agx::RegularizationParameters * userAPIgetRegularizationParameters(agx::UInt i)
Get the regularization parameter i, i.e., the regularization parameter for equation i which is constr...
bool m_enableLinearization
When necessary, tweak the values sent to the solver to make violation depend linearly on force or tor...
virtual void getParameters(agx::Real *violation, agx::Real *epsilon, agx::Real *damping, bool *holonomic, agx::Real *velocity, agx::RangeReal *bounds, int8_t *indexSetState, agx::Real h, agx::Real minPerturbation=agx::Real(1E-10))
Writes solver parameters such as damping and holonomic.
virtual int getConstraintVelocity(agx::Real *v, int row)
Calculates and pushes the constraint velocities into array given current row.
const agx::RegularizationParameters * userAPIgetRegularizationParameters(agx::UInt i) const
virtual agx::Bool getEnableComputeForces() const
virtual void prepare()
Prepares this constraint.
virtual agx::Bool getLastLocalForce(agx::UInt bodyIndex, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
virtual bool updateValid()
Updates the valid conditions for this constraint.
agx::BitState< State, Int32 > LocalState
const ConstraintImplPtrVector & getSubConstraints() const
agx::Real userAPIgetDamping(agx::UInt dof) const
void userAPIsetCompliance(agx::Real compliance, int dof)
Set the compliance for constraint row i of this constraint.
virtual bool addSecondaryConstraint(const agx::String &name, agx::ElementaryConstraint *secondaryConstraint)
Add secondary constraint (like motor, range and/or lock etc) given name.
virtual bool rebind()
The general version of rebind takes the first attachment frame and moves the other attachment frame s...
agx::Real calculateViolationVectorAverageSize()
Gets the average size of the elements in getViolation() by calculating the magnitude and dividing by ...
virtual agx::Bool getLastLocalForce(const agx::RigidBody *rb, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
agx::Range1D * getRange1D(agx::UInt number=0) const
virtual agx::AttachmentPair * getAttachmentPair() const
ElementaryConstraint::RefContainer m_ec
Vector of elementary constraints.
agx::RangeReal userAPIgetForceRange(agx::UInt dof) const
Get the force range for DOF dof.
LocalState m_localState
Current local state, updated all the time, not serialized.
void setEnableLinearization(bool enable)
Control whether or not linearization should be performed on the ElementaryConstraints that require it...
T * findSecondaryConstraintGivenType(const agx::UInt count=0) const
The base class for a constraint.
Definition: Constraint.h:89
SolveType
Specifies in what solvers the constraint will be solved.
Definition: Constraint.h:93
size_t size() const
Definition: Container.h:134
The complete physical system with bodies, interactions, data layout, time stepper,...
Elementary constraint base class with interface and global constraint functionality.
The object defining a frame of reference and providing transformations operations.
Definition: agx/Frame.h:68
Translational or rotational friction controller for Hinge, Prismatic and CylindricalJoint.
virtual void postSolveCallback(const agx::Jacobian6DOFElement *jacobians, const agx::Real *solution, agx::Real dt) override
Peak at the solution after the solver is done.
bool setupOneOrTwoBodySystem(RigidBodyAttachment *a1, RigidBodyAttachment *a2)
virtual void restore(agxStream::InputArchive &in) override
virtual agx::Bool getLastForce(const RigidBody *rb, Vec3 &retForce, Vec3 &retTorque, agx::Bool giveForceAtCm=false) const override
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
bool construct(RigidBody *rb1, Frame *rb1AttachmentFrame, RigidBody *rb2, Frame *rb2AttachmentFrame, CreateElementaryConstraintsFunction=nullptr)
virtual agx::Bool getLastForce(agx::UInt bodyIndex, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const override
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
virtual agx::Real getAngle(agx::UInt dof=0) const override
If the constraint supports angle calculations and 'dof' is in range, this method returns the angle of...
virtual size_t updateJacobian(agx::Jacobian6DOFElement *jacobians) override
Updates the Jacobian matrices.
virtual void storeLightData(agxStream::StorageStream &str) const override
virtual agx::Bool computeForces(const agx::Jacobian6DOFElement *jacobians, agx::Vec3Vector &result) const
Computes forces on rb1 and rb2 given this constraint has been solved and all the elementary constrain...
virtual bool rebind() override
The general version of rebind takes the first attachment frame and moves the other attachment frame s...
virtual void computeForces(const agx::Jacobian6DOFElement *jacobians)
Computes the forces, if valid and enabled.
virtual agx::Attachment * userAPIgetAttachment(agx::UInt index) const override
virtual void restoreLightData(agxStream::StorageStream &str) override
virtual void prepare() override
Prepares this constraint.
virtual agx::Bool getLastLocalForce(agx::UInt bodyIndex, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const override
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
virtual agx::Attachment * userAPIgetAttachment(const agx::RigidBody *rb) const override
virtual agx::Bool getLastLocalForce(const agx::RigidBody *rb, agx::Vec3 &retForce, agx::Vec3 &retTorque, agx::Bool giveForceAtCm=false) const override
If 'compute forces' is enabled, returns the last force and torque applied by this constraint on the b...
virtual agx::AttachmentPair * getAttachmentPair() const override
virtual void store(agxStream::OutputArchive &out) const override
virtual void setEnableComputeForces(agx::Bool enable) override
Enable (or disable) computation of the forces applied to the dynamic bodies in this constraint.
bool validateRigidBodiesAndAttachments(RigidBody *rb1, Frame *rb1AttachmentFrame, RigidBody *rb2, Frame *rb2AttachmentFrame)
virtual bool updateValid() override
Updates the valid conditions for this constraint.
AGXSTREAM_DECLARE_ABSTRACT_SERIALIZABLE(agx::HighLevelConstraintImplementation)
virtual agx::Bool getEnableComputeForces() const override
Interface to the lower triangle of the compliance matrix block in the system matrix.
Elementary secondary constraint to keep constraint angle at a given target position.
Pointer to a entity instance of type Physics.ConstraintForces.
Elementary secondary constraint to keep constraint angle within two given values.
Base class providing referencing counted objects.
Definition: Referenced.h:120
All ghost variables have compliance and damping attributes.
Constraint attachment class for agx::RigidBody.
The rigid body class, combining a geometric model and a frame of reference.
Definition: RigidBody.h:52
Implementation of constraint angle ABOUT an axis.
Implementation of constraint angle ALONG an axis.
Essentially a sparse array of bounds.
Definition: SparseTypes.h:74
Elementary secondary constraint to drive something given target speed (translational or rotational).
Templated vector class.
Definition: agx/Vector.h:53
#define agxAbort()
Definition: debug.h:164
#define agxAssert(expr)
Definition: debug.h:143
#define DOXYGEN_END_INTERNAL_BLOCK()
Definition: macros.h:89
#define CALLABLE
Definition: macros.h:72
#define DOXYGEN_START_INTERNAL_BLOCK()
Definition: macros.h:88
#define CALLABLE_IGNORE
Definition: macros.h:74
#define AGX_FORCE_INLINE
Definition: macros.h:58
The agxSDK namespace contain classes to bridge the collision detection system and the dynamical simul...
Definition: Constraint.h:31
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
uint16_t UInt16
Definition: Integer.h:31
int32_t Int32
Definition: Integer.h:37
AGXPHYSICS_EXPORT void addSecondaryConstraints1DOF(agx::HighLevelConstraintImplementation *constraint, agx::Angle *angle)
Add secondary controllers with default name to the constraint.
bool Bool
Definition: Integer.h:40
Vector< RigidBody * > ConstraintRigidBodyContainer
uint64_t UInt
Definition: Integer.h:27
double Real
Definition: Real.h:42
std::pair< Real, Real > RealPair
AGXPHYSICS_EXPORT void addSecondaryConstraints2DOF(agx::HighLevelConstraintImplementation *constraint, agx::SeparationAngle *sepAngle, agx::RotationalAngle *rotAngle)
Add secondary controllers with default name to the constraint.
std::valarray< agx::Real > RealValarray
For this module, vectors are defined using valarray.
int64_t Int
Definition: Integer.h:28
Data from the solver the ConstraintNlmcpCallback is part of.