TAPs 0.7.7.3
TAPsElasticRodNode.hpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsElasticRodNode.hpp
00003 ******************************************************************************/
00012 /******************************************************************************
00013 SUKITTI PUNAK   (07/07/2009)
00014 UPDATE          (03/21/2011)
00015 ******************************************************************************/
00016 #ifndef TAPs_ELASTIC_ROD_NODE_HPP
00017 #define TAPs_ELASTIC_ROD_NODE_HPP
00018 
00019 #include "../../Physics/TAPsPointMassDynamic.hpp"
00020 #include <list>
00021 
00022 #ifdef  TAPs_ADVANCED_SIMULATION
00023 #include "../../DataStructure/TAPsSimulationFlags.hpp"
00024 #endif//TAPs_ADVANCED_SIMULATION
00025 
00026 BEGIN_NAMESPACE_TAPs
00027 //=============================================================================
00028 template <typename T>
00029 class ElasticRodNode {
00030 public:
00032     ElasticRodNode () : 
00033         CenterlineRestLength(T(0)),
00034         OrientationRestLength(T(0)),
00035         ID(0)
00036         ,EnforcedPosition()
00037         ,UseEnforcedPosition( false )
00038         ,EnforcedOrientation()
00039         ,UseEnforcedOrientation( false )
00040 
00041         //#ifdef    TAPs_ADD_KNOT_RECOGNITION
00042         //,StickPairNodeID( -1 )
00043         //#endif//TAPs_ADD_KNOT_RECOGNITION
00044 
00045         // DEBUG
00046         , IsCollide( false )
00047     {
00048         IntrinsicStrainRate[0] = IntrinsicStrainRate[1] = IntrinsicStrainRate[2] = T(0);
00049         IntrinsicStrainQ[0].SetR( 0 );
00050         IntrinsicStrainQ[1].SetR( 0 );
00051         IntrinsicStrainQ[2].SetR( 0 );
00052         IntrinsicStrainQn[0].SetR( 0 );
00053         IntrinsicStrainQn[1].SetR( 0 );
00054         IntrinsicStrainQn[2].SetR( 0 );
00055     }
00056 
00058     ElasticRodNode ( ElasticRodNode<T> const & orig )   { *this = orig; }
00059 
00061     ~ElasticRodNode ()  {}
00062 
00064     std::string StrInfo () const
00065     {
00066         std::stringstream ss;
00067         ss << "ElasticRodNode<"<<typeid(T).name()<<"> Class: ";
00068         ss << "\n\tCenterline[0]: " << Centerline[0];
00069         ss << "\n\tCenterline[1]: " << Centerline[1];
00070         ss << "\n\tOrientation[0]: " << Orientation[0];
00071         ss << "\n\tOrientation[1]: " << Orientation[1];
00072         ss << "\n\tCenterlineRestLength: " << CenterlineRestLength;
00073         ss << "\n\tOrientationRestLength: " << OrientationRestLength;
00074 
00075         ss << "\n\tIntrinsicStrainRate: <" << IntrinsicStrainRate[0] <<','<< IntrinsicStrainRate[1] <<','<< IntrinsicStrainRate[2] << ">";
00076         ss << "\n\tIntrinsicStrainQ: <" << IntrinsicStrainQ[0] <<','<< IntrinsicStrainQ[1] <<','<< IntrinsicStrainQ[2] << ">";
00077         ss << "\n\tIntrinsicStrainQn: <" << IntrinsicStrainQn[0] <<','<< IntrinsicStrainQn[1] <<','<< IntrinsicStrainQn[2] << ">";
00078 
00079         ss << "\n\tTorque: " << Torque;
00080         ss << "\n\tExternalForce: " << ExternalForce;
00081         ss << "\n\tExternalForce_Reserved: " << ExternalForce_Reserved;
00082         ss << "\n\tExternalForce_Constrained: " << ExternalForce_Constrained;
00083         ss << "\n\tExternalForce_ForAdvSimCtrl: " << ExternalForce_ForAdvSimCtrl;
00084         ss << "\n\tEnforcedPosition: " << EnforcedPosition;
00085         ss << "\n\tUseEnforcedPosition: " << UseEnforcedPosition;
00086         ss << "\n\tEnforcedOrientation: " << EnforcedOrientation;
00087         ss << "\n\tUseEnforcedOrientation: " << UseEnforcedOrientation;
00088         ss << "\n\tOldInternalForce: " << OldInternalForce;
00089         ss << "\n\tOldInternalTorque: " << OldInternalTorque;
00090 
00091             // DEBUG
00092         ss << "\n\tIsCollide: " << IsCollide;
00093 
00094         #ifdef  TAPs_ADVANCED_SIMULATION
00095         ss << "\n\tSimFlags : " << SimFlags;
00096         #endif//TAPs_ADVANCED_SIMULATION
00097 
00098         ss << "\n";
00099 
00100         return ss.str();
00101     }
00102 
00104     void Reset ()
00105     {
00106         IsCollide = false;  // DEBUG
00107 
00108         ExternalForce.Clear();
00109         ExternalForce_Reserved.Clear();
00110         ExternalForce_Constrained.Clear();
00111 
00112         UseEnforcedPosition = false;
00113         EnforcedPosition.Clear();
00114 
00115         ExternalForce_ForAdvSimCtrl.Clear();
00116 
00117         #ifdef  TAPs_ADVANCED_SIMULATION
00118         SimFlags.ClearAllFlags();
00119         #endif//TAPs_ADVANCED_SIMULATION
00120 
00121         //#ifdef    TAPs_ADD_KNOT_RECOGNITION
00122         //StickPairNodeID = -1;
00123         //#endif/TAPs_ADD_KNOT_RECOGNITION
00124     }
00125 
00127     inline ElasticRodNode<T> & operator= ( ElasticRodNode<T> const & orig )
00128     {
00129         if ( this != &orig ) {
00130             Centerline[0]   = orig.Centerline[0];
00131             Centerline[1]   = orig.Centerline[1];
00132             Orientation[0]  = orig.Orientation[0];
00133             Orientation[1]  = orig.Orientation[1];
00134             CenterlineRestLength    = orig.CenterlineRestLength;
00135             OrientationRestLength   = orig.OrientationRestLength;
00136             //u_k  = orig.u_k;
00137             //w_k  = orig.w_k;
00138             //w0_k = orig.w0_k;
00139 
00140             for ( int i = 0; i < 3; ++i ) {
00141                 IntrinsicStrainRate[i]  = orig.IntrinsicStrainRate[i];
00142                 IntrinsicStrainQ[i]     = orig.IntrinsicStrainQ[i];
00143                 IntrinsicStrainQn[i]    = orig.IntrinsicStrainQn[i];
00144             }
00145             Torque                  = orig.Torque;
00146             ExternalForce           = orig.ExternalForce;
00147             ExternalForce_Reserved  = orig.ExternalForce_Reserved;
00148             ExternalForce_Constrained = orig.ExternalForce_Constrained;
00149             ExternalForce_ForAdvSimCtrl = orig.ExternalForce_ForAdvSimCtrl;
00150             EnforcedPosition        = orig.EnforcedPosition;
00151             UseEnforcedPosition     = orig.UseEnforcedPosition;
00152             EnforcedOrientation     = orig.EnforcedOrientation;
00153             UseEnforcedOrientation  = orig.UseEnforcedOrientation;
00154             OldInternalForce        = orig.OldInternalForce;
00155             OldInternalTorque       = orig.OldInternalTorque;
00156 
00157             // DEBUG
00158             IsCollide = orig.IsCollide;
00159 
00160             #ifdef  TAPs_ADVANCED_SIMULATION
00161             SimFlags = orig.SimFlags;
00162             #endif//TAPs_ADVANCED_SIMULATION
00163         }
00164         return *this;
00165     }
00166     //-----------------------------------------------------------
00167     // Public data members
00168 
00169     void SetMass ( T m )
00170     {
00171         Centerline[0].SetMass( m );
00172         Centerline[1].SetMass( m );
00173     }
00174     T GetMass () const { return Centerline[0].GetMass(); };
00175 
00176     PointMassDynamic<T> Centerline[2];  
00177     Quaternion<T>       Orientation[2]; 
00178 
00179     T CenterlineRestLength;     
00180     T OrientationRestLength;    
00181 
00182     T   IntrinsicStrainRate[3]; 
00183     Quaternion<T>   IntrinsicStrainQ[3];    
00184     Quaternion<T>   IntrinsicStrainQn[3];   
00185 
00186     Quaternion<T>   Torque;     
00187 
00188     Vector3<T>  ExternalForce;      
00189     Vector3<T>  ExternalForce_Reserved; 
00190     Vector3<T>  ExternalForce_Constrained;  
00191 
00192     Vector3<T>  ExternalForce_ForAdvSimCtrl;    
00193 
00194     Vector3<T>      EnforcedPosition;       
00195     bool            UseEnforcedPosition;    
00196     Quaternion<T>   EnforcedOrientation;    
00197     bool            UseEnforcedOrientation; 
00198 
00199     Vector3<T>      OldInternalForce;   
00200     Quaternion<T>   OldInternalTorque;  
00201 
00202     // DEBUG
00203     bool IsCollide;         
00204 
00205     unsigned int ID;        
00206 
00208     //T u_k;    //!< $u_k = \frac{2}{\|\Quaternion\|} \mathbf{B}_k \Quaterion \cdot \Quaternion'$
00209 
00211     //T w_k;    //!< $\omega_k = \frac{2}{\|\Quaternion\|} \mathbf{B}_k \Quaterion \cdot \dot{\Quaternion}$
00212 
00214     //T w0_k;   //!< $\omega^0_k = \frac{2}{\|\Quaternion\|} \mathbf{B}^0_k \Quaterion \cdot \dot{\Quaternion}$
00215 
00216     #ifdef  TAPs_ADVANCED_SIMULATION
00217     DS::SimulationFlags     SimFlags;   
00218     #endif//TAPs_ADVANCED_SIMULATION
00219 
00220     //#ifdef    TAPs_ADD_KNOT_RECOGNITION
00221     //int       StickPairNodeID;    //!< for animating knot tying -- a pair node that will stick with this node -- less than or equal to zero means no a stick pair for this node exist
00222     //#endif//TAPs_ADD_KNOT_RECOGNITION
00223 
00224     //-----------------------------------------------------------
00225 
00226     // Below are Data Members for simulation per node
00227     // Remark: the computation is from the first node to the last node.
00228     // Hence, the orientation for the last node will not be used, since 
00229     // an orientation is formed from a pair of nodes.
00230 
00237     //Vector3<T>        SpatialDerivativeOfCenterline;      //!< $r'_i = \frac{cendiff_i}{cenlen_i}$
00238 
00239     //Vector3<T>    TimeDerivativeOfCenterline;
00243     //Quaternion<T> SpatialDerivativeOfOrientation;     //!< $q'_j = \frac{oridiff_j}{orilen_j}$
00244     
00245     //Quaternion<T> TimeDerivativeOfOrientation;
00246 
00247     // Potential Energies
00248     //T Vs;     //!< the stretch energy = $0.5 cenlen^0_i K_s \frac{cenlen_i}{cenlen^0_i} - 1)^2$
00249     //T Vb;     //!< the bend energy = $0.5 orilen^0_j { \sum_{k=1}^3 K_{kk} (B_k(oriadd_j) \cdot SpatialDerivativeOfOrientation ) - \hat{u}_k )^2 }$
00250 
00251     //-----------------------------------------------------------
00252     // Private data members
00253 private:
00254     //-----------------------------------------------------------
00255 //=============================================================================
00256 }; // CLASS END: ElasticRodNode
00257 //=============================================================================
00258 //The statement below generates error C2823: a typedef template is illegal.
00259 //template <typename T>
00260 //typedef std::vector< ElasticRodNode<T> >  SetOfElasticRodNodes;   //!< type definition for a list of elastic rod nodes
00261 //=============================================================================
00262 END_NAMESPACE_TAPs
00263 //-----------------------------------------------------------------------------
00264 //#include "TAPsElasticRodNode.cpp"
00265 //-----------------------------------------------------------------------------
00266 #endif
00267 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00268 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines