diff --git a/applications/test/rigidBodyDynamics/sphericalJoint/sphericalJoint.C b/applications/test/rigidBodyDynamics/sphericalJoint/sphericalJoint.C index d69fdb54cad4858c82fa624b3cfd0b76129447d6..91a59104ed471933c459d48b687bd3e9737be8be 100644 --- a/applications/test/rigidBodyDynamics/sphericalJoint/sphericalJoint.C +++ b/applications/test/rigidBodyDynamics/sphericalJoint/sphericalJoint.C @@ -61,7 +61,7 @@ int main(int argc, char *argv[]) Field<spatialVector> fx(sphericalJoint.nBodies(), Zero); // Set the angle of the pendulum to 0.3rad - sphericalJoint.joints()[1] + sphericalJoint.joints()[1].unitQuaternion ( quaternion(quaternion::ZYX, vector(0.3, 0, 0)), sphericalJoint.state().q() @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) // using 'gnuplot sphericalJoint.gnuplot' omegaFile << t << " " - << sphericalJoint.joints()[1] + << sphericalJoint.joints()[1].unitQuaternion ( sphericalJoint.state().q() ).eulerAngles(quaternion::ZYX).x() diff --git a/src/rigidBodyDynamics/joints/Rs/Rs.C b/src/rigidBodyDynamics/joints/Rs/Rs.C index e7b284ebedb3151be4986abcb91e56df72097e55..da4bd36183ee1a449d5c05a42a8627b59635eb04 100644 --- a/src/rigidBodyDynamics/joints/Rs/Rs.C +++ b/src/rigidBodyDynamics/joints/Rs/Rs.C @@ -84,9 +84,9 @@ Foam::RBD::joints::Rs::~Rs() // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // -Foam::label Foam::RBD::joints::Rs::nw() const +bool Foam::RBD::joints::Rs::unitQuaternion() const { - return 1; + return true; } @@ -97,7 +97,7 @@ void Foam::RBD::joints::Rs::jcalc const scalarField& qDot ) const { - J.X.E() = operator()(q).R().T(); + J.X.E() = joint::unitQuaternion(q).R().T(); J.X.r() = Zero; J.S = Zero; diff --git a/src/rigidBodyDynamics/joints/Rs/Rs.H b/src/rigidBodyDynamics/joints/Rs/Rs.H index 9672168e8f488afc871f78a026a1239a907b38cc..f689869056c224c29652693912ca4f747ef11b11 100644 --- a/src/rigidBodyDynamics/joints/Rs/Rs.H +++ b/src/rigidBodyDynamics/joints/Rs/Rs.H @@ -88,9 +88,8 @@ public: // Member Functions - //- Return the number of additional state variable for this joint - // For the quaternion this is 1 in addition to the 3 stored in q - virtual label nw() const; + //- Return true as this joint describes rotation using a quaternion + virtual bool unitQuaternion() const; //- Update the model state for this joint virtual void jcalc diff --git a/src/rigidBodyDynamics/joints/composite/compositeJoint.C b/src/rigidBodyDynamics/joints/composite/compositeJoint.C index 819d575962bccdd708da2f53d183f539bbe01ae3..a7d1fd887563ba401471323b05202352b9999547 100644 --- a/src/rigidBodyDynamics/joints/composite/compositeJoint.C +++ b/src/rigidBodyDynamics/joints/composite/compositeJoint.C @@ -86,12 +86,6 @@ Foam::RBD::joints::composite::~composite() // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // -Foam::label Foam::RBD::joints::composite::nw() const -{ - return last().nw(); -} - - void Foam::RBD::joints::composite::jcalc ( joint::XSvc& J, diff --git a/src/rigidBodyDynamics/joints/composite/compositeJoint.H b/src/rigidBodyDynamics/joints/composite/compositeJoint.H index 80f3496fa7e67d9615f4f93105f04aaf8cfec8f8..5d12bf5025d70be05943b4fdaa16d0d7a6b6f7c3 100644 --- a/src/rigidBodyDynamics/joints/composite/compositeJoint.H +++ b/src/rigidBodyDynamics/joints/composite/compositeJoint.H @@ -101,9 +101,6 @@ public: // Member Functions - //- Return the number of additional state variables need by this joint - virtual label nw() const; - //- Update the model state for this joint virtual void jcalc ( diff --git a/src/rigidBodyDynamics/joints/joint/joint.H b/src/rigidBodyDynamics/joints/joint/joint.H index eb06419e938e8449760b2a58949b05d457b13bb8..0ea00b678bcd0699eaa16bd109caabcfd7ce40c2 100644 --- a/src/rigidBodyDynamics/joints/joint/joint.H +++ b/src/rigidBodyDynamics/joints/joint/joint.H @@ -93,9 +93,6 @@ protected: //- Index of this joints data in the rigidBodyModel state label qIndex_; - //- Index of this joints quaternion data in the rigidBodyModel state - label wIndex_; - private: @@ -113,12 +110,6 @@ private: return qIndex_; } - //- Allow the rigidBodyModel to set the wIndex for this joint - label& wIndex() - { - return wIndex_; - } - public: @@ -213,8 +204,8 @@ public: //- Return the number of degrees of freedom in this joint inline label nDoF() const; - //- Return the number of additional state variables need by this joint - inline virtual label nw() const; + //- Return true if this joint describes rotation using a quaternion + inline virtual bool unitQuaternion() const; //- Return the index of this joint in the model inline label index() const; @@ -223,10 +214,6 @@ public: // in the rigidBodyModel state fields inline label qIndex() const; - //- Return start index for the additional state variables for this joint - // in the rigidBodyModel w state field - inline label wIndex() const; - //- Return the joint motion sub-space inline const List<spatialVector>& S() const; @@ -245,16 +232,16 @@ public: // Member Operators - //- Return the state quaternion for this joint + //- Return the unit quaternion for this joint // if it uses a quaternion representation for rotation - inline quaternion operator() + inline quaternion unitQuaternion ( const scalarField& q ) const; - //- Set the state quaternion for this joint + //- Set the unit quaternion for this joint // if it uses a quaternion representation for rotation - inline void operator() + inline void unitQuaternion ( const quaternion& quat, scalarField& q diff --git a/src/rigidBodyDynamics/joints/joint/jointI.H b/src/rigidBodyDynamics/joints/joint/jointI.H index 090adb18d285470cd873ced3512704e02f3ae204..eb6e36a2ca8408c1505eaad0a46f1a752cafa2bc 100644 --- a/src/rigidBodyDynamics/joints/joint/jointI.H +++ b/src/rigidBodyDynamics/joints/joint/jointI.H @@ -29,8 +29,7 @@ inline Foam::RBD::joint::joint(const label nDoF) : S_(nDoF), index_(0), - qIndex_(0), - wIndex_(0) + qIndex_(0) {} @@ -41,9 +40,9 @@ inline Foam::label Foam::RBD::joint::nDoF() const return S_.size(); } -inline Foam::label Foam::RBD::joint::nw() const +inline bool Foam::RBD::joint::unitQuaternion() const { - return 0; + return false; } inline Foam::label Foam::RBD::joint::index() const @@ -56,11 +55,6 @@ inline Foam::label Foam::RBD::joint::qIndex() const return qIndex_; } -inline Foam::label Foam::RBD::joint::wIndex() const -{ - return wIndex_; -} - inline const Foam::List<Foam::spatialVector>& Foam::RBD::joint::S() const { return S_; @@ -69,12 +63,12 @@ inline const Foam::List<Foam::spatialVector>& Foam::RBD::joint::S() const // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // -inline Foam::quaternion Foam::RBD::joint::operator() +inline Foam::quaternion Foam::RBD::joint::unitQuaternion ( const scalarField& q ) const { - if (nw() != 1) + if (!unitQuaternion()) { FatalErrorInFunction << "Attempt to get the quaternion for a non-spherical joint" @@ -85,13 +79,13 @@ inline Foam::quaternion Foam::RBD::joint::operator() } -inline void Foam::RBD::joint::operator() +inline void Foam::RBD::joint::unitQuaternion ( const quaternion& quat, scalarField& q ) const { - if (nw() != 1) + if (!unitQuaternion()) { FatalErrorInFunction << "Attempt to set quaternion for a non-spherical joint" diff --git a/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.C b/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.C index 9b2a32de71157eea4d6f15813e0ad269d1354bc9..aebfb762edcbea4e4b59df797da6c597ccee6b9a 100644 --- a/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.C +++ b/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.C @@ -52,7 +52,7 @@ void Foam::RBD::rigidBodyModel::initializeRootBody() XT_.append(spatialTransform()); nDoF_ = 0; - nw_ = 0; + unitQuaternions_ = false; resizeState(); } @@ -204,11 +204,10 @@ Foam::label Foam::RBD::rigidBodyModel::join_ joint& curJoint = joints_[joints_.size() - 1]; curJoint.index() = joints_.size() - 1; curJoint.qIndex() = prevJoint.qIndex() + prevJoint.nDoF(); - curJoint.wIndex() = prevJoint.wIndex() + prevJoint.nw(); // Increment the degrees of freedom nDoF_ += curJoint.nDoF(); - nw_ += curJoint.nw(); + unitQuaternions_ = unitQuaternions_ || curJoint.unitQuaternion(); resizeState(); diff --git a/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.H b/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.H index 6357458f36d46208c1653e215860645c258ffe2b..8d6c604ca02eaf18a1ddc6bb51810a4e2bc5a2e7 100644 --- a/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.H +++ b/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModel.H @@ -123,11 +123,8 @@ protected: // used to set the size of the of joint state fields q, qDot and qDdot. label nDoF_; - //- The number of additional state variable needed to describe the joint - // states. Typically this is the number of quaternion joints for which - // the 'w' element is additional to the 3-degrees of freedom of the - // joint. - label nw_; + //- True if any of the joints using quaternions + bool unitQuaternions_; //- Motion restraints PtrList<restraint> restraints_; @@ -242,11 +239,8 @@ public: // used to set the size of the of joint state fields q, qDot and qDdot. inline label nDoF() const; - //- Return the number of additional state variable needed to describe - // the joint states. Typically this is the number of quaternion - // joints for which the 'w' element is additional to the 3-degrees of - // freedom of the joint. - inline label nw() const; + //- Return true if any of the joints using quaternions + inline bool unitQuaternions() const; //- Return the acceleration due to gravity inline const vector& g() const; diff --git a/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModelI.H b/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModelI.H index 9cfab5e8cd959702b6ee072c130f5729c3beaa88..b2fc636ff5e090007db1979e11f8a837ecaa8878 100644 --- a/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModelI.H +++ b/src/rigidBodyDynamics/rigidBodyModel/rigidBodyModelI.H @@ -58,9 +58,9 @@ inline Foam::label Foam::RBD::rigidBodyModel::nDoF() const } -inline Foam::label Foam::RBD::rigidBodyModel::nw() const +inline bool Foam::RBD::rigidBodyModel::unitQuaternions() const { - return nw_; + return unitQuaternions_; } diff --git a/src/rigidBodyDynamics/rigidBodySolvers/rigidBodySolver/rigidBodySolver.C b/src/rigidBodyDynamics/rigidBodySolvers/rigidBodySolver/rigidBodySolver.C index 9156db842cded8b6a3b4edfbc27ab1864f8775db..d161e6f68110572ded89a812b5e2f38a024ce404 100644 --- a/src/rigidBodyDynamics/rigidBodySolvers/rigidBodySolver/rigidBodySolver.C +++ b/src/rigidBodyDynamics/rigidBodySolvers/rigidBodySolver/rigidBodySolver.C @@ -56,13 +56,13 @@ Foam::RBD::rigidBodySolver::~rigidBodySolver() void Foam::RBD::rigidBodySolver::correctQuaternionJoints() { - if (model_.nw()) + if (model_.unitQuaternions()) { forAll (model_.joints(), i) { const label qi = model_.joints()[i].qIndex(); - if (model_.joints()[i].nw() == 1) + if (model_.joints()[i].unitQuaternion()) { // Calculate the change in the normalized quaternion axis vector dv((q().block<vector>(qi) - q0().block<vector>(qi))); @@ -76,11 +76,11 @@ void Foam::RBD::rigidBodySolver::correctQuaternionJoints() // Transform the previous time quaternion quaternion quat ( - normalize(model_.joints()[i](q0())*dQuat) + normalize(model_.joints()[i].unitQuaternion(q0())*dQuat) ); // Update the joint state - model_.joints()[i](quat, q()); + model_.joints()[i].unitQuaternion(quat, q()); } } }