TAPs 0.7.7.3
TAPsFEMMesh.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsFEMMesh.cpp
00003 ******************************************************************************/
00007 /******************************************************************************
00008 SUKITTI PUNAK   (12/15/2009)
00009 UPDATE          (10/27/2010)
00010 ******************************************************************************/
00011 #include "TAPsFEMMesh.hpp"
00012 // Using Inclusion Model (i.e. definitions are included in declarations)
00013 //                       (this name.cpp is included in name.hpp)
00014 // Each friend is defined directly inside its declaration.
00015 
00016 #include "TAPsFEMMesh_withSparseMatrix.cpp"
00017 
00018 BEGIN_NAMESPACE_TAPs__FEM
00019 //=============================================================================
00020 // Constructors
00021 //-----------------------------------------------------------------------------
00022 template <typename T>
00023 Mesh<T>::Mesh ()
00024     : m_iIterationLimit( 20 ), m_tErrorThreshold( 1E-6 )
00025 {}
00026 //-----------------------------------------------------------------------------
00027 //template <typename T>
00028 //Mesh<T>::Mesh ( Mesh<T> const &orig )
00029 //{}
00030 //-----------------------------------------------------------------------------
00031 template <typename T>
00032 Mesh<T>::~Mesh ()
00033 {}  
00034 //-----------------------------------------------------------------------------
00035 //template <typename T>
00036 //std::string Mesh<T>::StrInfo () const
00037 //{}
00038 //-----------------------------------------------------------------------------
00039 //=============================================================================
00040 // Assignment Operator
00041 //-----------------------------------------------------------------------------
00042 //template <typename T>
00043 //Mesh<T> & Mesh<T>::operator= ( Mesh<T> const &orig )
00044 //{}
00045 
00046 //=============================================================================
00047 // Operations
00048 //-----------------------------------------------------------------------------
00049 template <typename T>
00050 void Mesh<T>::SetSizeOfStiffnessMatrix ()
00051 {
00052     Mstiff.ChangeNumOfRows( GetNumOfNodes() );
00053 }
00054 //-----------------------------------------------------------------------------
00055 //=============================================================================
00056 
00057 
00058 
00059 
00060 //=============================================================================
00061 // Get/Set
00062 //-----------------------------------------------------------------------------
00063 template <typename T>
00064 unsigned int Mesh<T>::GetNumOfNodes () const
00065 {
00066     return m_vDeformedMeshNodes.size();
00067 }
00068 
00069 template <typename T>
00070 Vector3<T> const & Mesh<T>::ForceAtNode ( unsigned int node ) const
00071 {
00072     assert( node < GetNumOfNodes() );
00073     return m_Forces[node];
00074 }
00075 
00076 template <typename T>
00077 Vector3<T> & Mesh<T>::ForceAtNode ( unsigned int node )
00078 {
00079     assert( node < GetNumOfNodes() );
00080     return m_Forces[node];
00081 }
00082 
00083 template <typename T>
00084 Vector3<T> const & Mesh<T>::FilterAtNode ( unsigned int node ) const
00085 {
00086     assert( node < GetNumOfNodes() );
00087     return m_Filters[node];
00088 }
00089 
00090 template <typename T>
00091 Vector3<T> & Mesh<T>::FilterAtNode ( unsigned int node )
00092 {
00093     assert( node < GetNumOfNodes() );
00094     return m_Filters[node];
00095 }
00096 
00097 template <typename T>
00098 Vector3<T> const & Mesh<T>::OrigPositionOfNode ( unsigned int node ) const
00099 {
00100     assert( node < GetNumOfNodes() );
00101     return m_vUndeformedMeshNodes[node];
00102 }
00103 
00104 template <typename T>
00105 Vector3<T> & Mesh<T>::OrigPositionOfNode ( unsigned int node )
00106 {
00107     assert( node < GetNumOfNodes() );
00108     return m_vUndeformedMeshNodes[node];
00109 }
00110 
00111 template <typename T>
00112 Vector3<T> const & Mesh<T>::CurrPositionOfNode ( unsigned int node ) const
00113 {
00114     assert( node < GetNumOfNodes() );
00115     return m_vDeformedMeshNodes[node];
00116 }
00117 
00118 template <typename T>
00119 Vector3<T> & Mesh<T>::CurrPositionOfNode ( unsigned int node )
00120 {
00121     assert( node < GetNumOfNodes() );
00122     return m_vDeformedMeshNodes[node];
00123 }
00124 
00125 template <typename T>
00126 void Mesh<T>::FixNode ( unsigned int node, bool b )
00127 {
00128     assert( node < GetNumOfNodes() );
00129     m_FixedNodes[ node ] = b;
00130     //m_Filters[ node ].Clear();
00131 }
00132 
00133 template <typename T>
00134 void Mesh<T>::FixNode ( unsigned int node )
00135 {
00136     assert( node < GetNumOfNodes() );
00137     m_FixedNodes[ node ] = true;
00138     //m_Filters[ node ].Clear();
00139 }
00140 
00141 template <typename T>
00142 void Mesh<T>::UnfixNode ( unsigned int node )
00143 {
00144     assert( node < GetNumOfNodes() );
00145     m_FixedNodes[ node ] = false;
00146     //m_Filters[ node ].SetXYZ(1,1,1);
00147 }
00148 
00149 template <typename T>
00150 void Mesh<T>::ToggleFixUnfixOfNode ( unsigned int node )
00151 {
00152     assert( node < GetNumOfNodes() );
00153     m_FixedNodes[ node ] = !m_FixedNodes[ node ];
00154 }
00155 
00156 template <typename T>
00157 bool Mesh<T>::IsFixedNode ( unsigned int node )
00158 {
00159     assert( node < GetNumOfNodes() );
00160     return m_FixedNodes[ node ];
00161 }
00162 
00163 template <typename T>
00164 void Mesh<T>::SetFixedDisplacementOfNode ( unsigned int node, Vector3<T> const & u )
00165 {
00166     assert( node < GetNumOfNodes() );
00167     m_FixedDisplacements[ node ] = u;
00168 }
00169 
00170 template <typename T>
00171 void Mesh<T>::SetFixedDisplacementOfNode ( unsigned int node, T x, T y, T z )
00172 {
00173     assert( node < GetNumOfNodes() );
00174     m_FixedDisplacements[ node ].SetXYZ( x, y, z );
00175 }
00176 
00177 
00178 #ifdef  TAPs_SIM_DYNAMIC_SYSTEM
00179     template <typename T>
00180     T Mesh<T>::GetTimeStep () const
00181     {
00182         return m_tTimeStep;
00183     }
00184     template <typename T>
00185     void Mesh<T>::SetTimeStep ( T timestep )
00186     {
00187         m_tTimeStep = timestep;
00188     }
00189 
00190     template <typename T>
00191     Vector3<T> const & Mesh<T>::MassOfNode ( unsigned int node ) const
00192     {
00193         assert( node < GetNumOfNodes() );
00194         return m_vNodeMass[node];
00195     }
00196     template <typename T>
00197     Vector3<T> & Mesh<T>::MassOfNode ( unsigned int node )
00198     {
00199         assert( node < GetNumOfNodes() );
00200         return m_vNodeMass[node];
00201     }
00202 
00203     template <typename T>
00204     Vector3<T> const & Mesh<T>::CurrentVelocityOfNode ( unsigned int node ) const
00205     {
00206         assert( node < GetNumOfNodes() );
00207         return m_vNodeVelocities_curr[node];
00208     }
00209     template <typename T>
00210     Vector3<T> & Mesh<T>::CurrentVelocityOfNode ( unsigned int node )
00211     {
00212         assert( node < GetNumOfNodes() );
00213         return m_vNodeVelocities_curr[node];
00214     }
00215 
00216     template <typename T>
00217     Vector3<T> const & Mesh<T>::NextVelocityOfNode ( unsigned int node ) const
00218     {
00219         assert( node < GetNumOfNodes() );
00220         return m_vNodeVelocities_next[node];
00221     }
00222     template <typename T>
00223     Vector3<T> & Mesh<T>::NextVelocityOfNode ( unsigned int node )
00224     {
00225         assert( node < GetNumOfNodes() );
00226         return m_vNodeVelocities_next[node];
00227     }
00228 
00229     template <typename T>
00230     T Mesh<T>::GetDampingMass () const
00231     {
00232         return m_tNodeDamping_Alpha;
00233     }
00234     template <typename T>
00235     void Mesh<T>::SetDampingMass ( T d )
00236     {
00237         m_tNodeDamping_Alpha = d;
00238     }
00239 
00240     template <typename T>
00241     T Mesh<T>::GetDampingStiffness () const
00242     {
00243         return m_tNodeDamping_Beta;
00244     }
00245     template <typename T>
00246     void Mesh<T>::SetDampingStiffness ( T d )
00247     {
00248         m_tNodeDamping_Beta = d;
00249     }
00250 
00251     template <typename T>
00252     void Mesh<T>::ResetCurrentVelocities ()
00253     {
00254         for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00255             m_vNodeVelocities[m_currVelIdx][i].Clear();
00256         }
00257     }
00258 
00259 #endif//TAPs_SIM_DYNAMIC_SYSTEM
00260 //-----------------------------------------------------------------------------
00261 //=============================================================================
00262 
00263 
00264 //-----------------------------------------------------------------------------
00265 template <typename T>
00266 void Mesh<T>::UpdateDisplacementVector ()
00267 {
00268     for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00269         m_u[i] = m_vDeformedMeshNodes[i] - m_vUndeformedMeshNodes[i];
00270     }
00271 }
00272 
00273 //-----------------------------------------------------------------------------
00274 template <typename T>
00275 void Mesh<T>::UpdateDisplacementVector_wFixedDisplacementNodes ()
00276 {
00277     for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00278         // Update with fixed displacements
00279         if ( m_FixedNodes[i] ) {
00280             m_u_out[i] = m_u[i] = m_FixedDisplacements[i];
00281         }
00282         // Update with displacements from simulations
00283         else {
00284             m_u[i] = m_vDeformedMeshNodes[i] - m_vUndeformedMeshNodes[i];
00285         }
00286     }
00287 }
00288 
00289 //-----------------------------------------------------------------------------
00290 template <typename T>
00291 void Mesh<T>::UpdateDeformedMeshNodes ()
00292 {
00293     for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00294         m_vDeformedMeshNodes[i] = m_vUndeformedMeshNodes[i] + m_u_out[i];
00295     }
00296 }
00297 
00298 //-------------------------------------------------------------------
00299 template <typename T>
00300 void Mesh<T>::AllocateDataForSimulation ( T mass )
00301 {
00302     unsigned int size = GetNumOfNodes();
00303 
00304     // Set pointer to a transformation support object
00305     m_pTrx = NULL;
00306 
00307     // Temps for MPCGSolver
00308     v.resize( size );
00309     Pinv.resize( size );
00310     r.resize( size );
00311     s.resize( size );
00312     c.resize( size );
00313     q.resize( size );
00314 
00315     // For prescribed fixed displacements
00316     m_FixedNodes.resize( size );
00317     m_FixedDisplacements.resize( size );
00318 
00319     // The data are for SparseMatrix_Matrix3x3<T>::MPCGSolverSpecificForFEM function.
00320     m_Filters.clear();
00321     m_Filters.resize( size );
00322     m_Forces.clear();
00323     m_Forces.resize( size );
00324     m_u.clear();
00325     m_u.resize( size );
00326     m_u_out.clear();
00327     m_u_out.resize( size );
00328     m_Precond.clear();
00329     m_Precond.resize( size );
00330 
00331     // Initialize
00332     for ( unsigned int i = 0; i < size; ++i ) {
00333         m_FixedNodes[i] = false;
00334         m_Filters[i].SetXYZ(1,1,1);
00335         m_Precond[i].SetXYZ( 1,1,1 );
00336         
00337     }
00338 
00339 #ifdef  TAPs_SIM_DYNAMIC_SYSTEM
00340     m_tTimeStep = T(0.001); // 1 ms
00341     m_vNodeMass.clear();
00342     m_vNodeMass.resize( size );
00343     m_currVelIdx = 0;
00344     m_nextVelIdx = 1;
00345     m_vNodeVelocities[m_currVelIdx].clear();
00346     m_vNodeVelocities[m_currVelIdx].resize( size );
00347     m_vNodeVelocities[m_nextVelIdx].clear();
00348     m_vNodeVelocities[m_nextVelIdx].resize( size );
00349 
00350     // Initialize
00351     T m = mass / size;
00352     for ( unsigned int i = 0; i < size; ++i ) {
00353         m_vNodeMass[i].SetXYZ(m,m,m);
00354     }
00355 
00356     m_tNodeDamping_Alpha = 0.1;
00357     m_tNodeDamping_Beta  = 0.1;
00358 
00359     // Copy stiffness matrix
00360     Mstiff_2 = Mstiff;
00361     m_A = Mstiff;
00362 
00363     m_b.clear();
00364     m_b.resize( size );
00365 #endif//TAPs_SIM_DYNAMIC_SYSTEM
00366 
00367 #ifdef  TAPs_ADD_INTERACTIONS
00368     m_ForceLists.ClearAllForces();
00369 #endif//TAPs_ADD_INTERACTIONS
00370 
00371 }
00372 
00373 //-------------------------------------------------------------------
00374 template <typename T>
00375 void Mesh<T>::ClearAllNodeForces ()
00376 {
00377     for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00378         m_Forces[i].Clear();
00379     }
00380 }
00381 
00382 //-----------------------------------------------------------------------------
00383 //=============================================================================
00384 
00385 
00386 
00387 
00388 //=============================================================================
00389 // For interactions
00390 #ifdef  TAPs_ADD_INTERACTIONS
00391 
00392     //---------------------------------------------------------------
00393     template <typename T>
00394     void Mesh<T>::AddPointForce ( PointForce<T> * const ptrPtForce )
00395     {
00396         ptrPtForce->RefToForce() = m_pTrx->GetInverseMatrixTransform() * ptrPtForce->RefToForce();
00397         m_ForceLists.PointForces.push_back( ptrPtForce );
00398     }
00399     //---------------------------------------------------------------
00400     template <typename T>
00401     void Mesh<T>::AddPointForceInLocalCoordinates ( PointForce<T> * const ptrPtForce )
00402     {
00403         m_ForceLists.PointForces.push_back( ptrPtForce );
00404     }
00405     //---------------------------------------------------------------
00406     template <typename T>
00407     void Mesh<T>::RemovePointForce ( PointForce<T> * const ptrPtForce )
00408     {
00409         m_ForceLists.PointForces.remove( ptrPtForce );
00410     }
00411 
00412     //---------------------------------------------------------------
00413     template <typename T>
00414     void Mesh<T>::AddCDForce ( PointForce<T> * const ptrCDForce )
00415     {
00416         ptrCDForce->RefToForce() = m_pTrx->GetInverseMatrixTransform() * ptrCDForce->RefToForce();
00417         m_ForceLists.CDForces.push_back( ptrCDForce );
00418     }
00419     //---------------------------------------------------------------
00420     template <typename T>
00421     void Mesh<T>::AddCDForceInLocalCoordinates ( PointForce<T> * const ptrCDForce )
00422     {
00423         m_ForceLists.CDForces.push_back( ptrCDForce );
00424     }
00425     //---------------------------------------------------------------
00426     template <typename T>
00427     void Mesh<T>::RemoveCDForce ( PointForce<T> * const ptrCDForce )
00428     {
00429         m_ForceLists.CDForces.remove( ptrCDForce );
00430     }
00431 
00432     //---------------------------------------------------------------
00433     template <typename T>
00434     void Mesh<T>::AddConnectionForce ( PointForce<T> * const ptrConnectionForce )
00435     {
00436         ptrConnectionForce->RefToForce() = m_pTrx->GetInverseMatrixTransform() * ptrConnectionForce->RefToForce();
00437         m_ForceLists.ConnectionForces.push_back( ptrConnectionForce );
00438     }
00439     //---------------------------------------------------------------
00440     template <typename T>
00441     void Mesh<T>::AddConnectionForceInLocalCoordinates ( PointForce<T> * const ptrConnectionForce )
00442     {
00443         m_ForceLists.ConnectionForces.push_back( ptrConnectionForce );
00444     }
00445     //---------------------------------------------------------------
00446     template <typename T>
00447     void Mesh<T>::RemoveConnectionForce ( PointForce<T> * const ptrConnectionForce )
00448     {
00449         m_ForceLists.ConnectionForces.remove( ptrConnectionForce );
00450     }
00451 
00452     //---------------------------------------------------------------
00453     template <typename T>
00454     void Mesh<T>::ClearAllPointLoads ()
00455     {
00456         m_ForceLists.ClearAllPointForces();
00457     }
00458     //---------------------------------------------------------------
00459     template <typename T>
00460     void Mesh<T>::ClearAllCDLoads ()
00461     {
00462         m_ForceLists.ClearAllCDForces();
00463     }
00464     //---------------------------------------------------------------
00465     template <typename T>
00466     void Mesh<T>::ClearAllConnectionLoads ()
00467     {
00468         m_ForceLists.ClearAllConnectionForces();
00469     }
00470     //---------------------------------------------------------------
00471     template <typename T>
00472     void Mesh<T>::ClearAllAppliedLoads ()
00473     {
00474         m_ForceLists.ClearAllForces();
00475     }
00476 
00477     //---------------------------------------------------------------
00478     template <typename T>
00479     void Mesh<T>::ApplyAllLoads ()
00480     {
00481         for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00482             m_Forces[i].Clear();
00483         }
00484         // Point forces
00485         ForceListsPtr<T>::TypeDef_PointForces::iterator af = m_ForceLists.PointForces.begin();
00486         while ( af != m_ForceLists.PointForces.end() ) {
00487             ApplyPointLoad( *af );
00488             ++af;
00489         }
00490         // CD forces
00491         af = m_ForceLists.CDForces.begin();
00492         while ( af != m_ForceLists.CDForces.end() ) {
00493             ApplyPointLoad( *af );
00494             ++af;
00495         }
00496         // Connection forces
00497         af = m_ForceLists.ConnectionForces.begin();
00498         while ( af != m_ForceLists.ConnectionForces.end() ) {
00499             ApplyPointLoad( *af );
00500             ++af;
00501         }
00502     }
00503 //-----------------------------------------------------------------------------
00504 #endif//TAPs_ADD_INTERACTIONS
00505 //=============================================================================
00506 
00507     
00508     
00509     
00510 //=============================================================================
00511 // OpenGL
00512 #if defined(__gl_h_) || defined(__GL_H__)
00513 //-----------------------------------------------------------------------------
00514     template <typename T>
00515     void Mesh<T>::DrawFixedNodes ()
00516     {
00517         if ( m_pTrx ) {
00518             glPushMatrix();
00519             m_pTrx->TransformByOpenGLForDrawing();
00520         }
00521 
00522         glPushAttrib( GL_ALL_ATTRIB_BITS );
00523         glDisable( GL_LIGHTING );
00524         glPointSize( 5 );
00525         glColor3f( 0, 1, 0 );
00526         glBegin( GL_POINTS );
00527         for ( unsigned int i = 0; i < GetNumOfNodes(); ++i ) {
00528             if ( m_FixedNodes[i] ) {
00529                 glColor3f( 1, 0, 0 );
00530                 glVertex3f( m_vDeformedMeshNodes[i][0], m_vDeformedMeshNodes[i][1], m_vDeformedMeshNodes[i][2] );
00531             }
00532             else if ( m_Filters[i][0] == 0 && m_Filters[i][1] == 0 && m_Filters[i][2] == 0 ) {
00533                 //glPushMatrix();
00534                 //glScalef( 5, 5, 5 );
00535                 //glTranslatef( m_vUndeformedMeshNodes[i][0], m_vUndeformedMeshNodes[i][1], m_vUndeformedMeshNodes[i][2] );
00536                 //OpenGL::OpenGLUsefulObj<T>::DrawWorldCoordinateAxes();
00537                 //glPopMatrix();
00538                 glColor3f( 0, 1, 0 );
00539                 glVertex3f( m_vDeformedMeshNodes[i][0], m_vDeformedMeshNodes[i][1], m_vDeformedMeshNodes[i][2] );
00540             }
00541         }
00542         glEnd();
00543         glEnd();
00544         glPopAttrib();
00545 
00546         if ( m_pTrx ) {
00547             glPopMatrix();
00548         }
00549     }
00550 //-----------------------------------------------------------------------------
00551 #endif // OpenGL
00552 //=============================================================================
00553 END_NAMESPACE_TAPs__FEM
00554 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00555 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines