![]() |
TAPs 0.7.7.3
|
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----+----