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