ESyS-Particle
4.0.1
|
00001 00002 // // 00003 // Copyright (c) 2003-2011 by The University of Queensland // 00004 // Earth Systems Science Computational Centre (ESSCC) // 00005 // http://www.uq.edu.au/esscc // 00006 // // 00007 // Primary Business: Brisbane, Queensland, Australia // 00008 // Licensed under the Open Software License version 3.0 // 00009 // http://www.opensource.org/licenses/osl-3.0.php // 00010 // // 00012 #include "Foundation/console.h" 00013 00021 template<class ParticleType,class IType> 00022 Mesh2D_PIS_NE<ParticleType,IType>::Mesh2D_PIS_NE(Mesh2D* mesh_p,ParallelParticleArray<ParticleType>* ppa_p,typename IType::ParameterType param) 00023 :Mesh2D_PIS<ParticleType>(mesh_p,ppa_p) 00024 { 00025 m_param=param; 00026 this->m_update_timestamp=0; 00027 } 00028 00032 template<class ParticleType,class IType> 00033 Mesh2D_PIS_NE<ParticleType,IType>::~Mesh2D_PIS_NE() 00034 {} 00035 00045 template <class ParticleType,class IType> 00046 bool Mesh2D_PIS_NE<ParticleType,IType>::isIn(const std::vector<int>& v) 00047 { 00048 bool res=false; 00049 00050 if(v.size()<3){ 00051 res=false; 00052 } else { 00053 switch (v[2]){ 00054 case 0: res=m_edge_int_set.find(make_pair(v[0],v[1]))!=m_edge_int_set.end(); break; 00055 case 1: res=m_corner_int_set.find(make_pair(v[0],v[1]))!=m_corner_int_set.end(); break; 00056 default: console.Error() << "wrong value in argument of Mesh2D_PIS::isIn !!\n"; break; 00057 } 00058 } 00059 00060 return res; 00061 } 00062 00066 template<class ParticleType,class IType> 00067 void Mesh2D_PIS_NE<ParticleType,IType>::calcForces() 00068 { 00069 console.XDebug() << "Mesh2D_PIS_NE calculating " << m_edge_interactions.size() << " line forces , " 00070 << m_corner_interactions.size() << "corner forces\n"; 00071 00072 // calculate forces for edge interactions 00073 for(typename std::vector<typename IType::EdgeIntType>::iterator tri_iter=m_edge_interactions.begin(); 00074 tri_iter!=m_edge_interactions.end(); 00075 tri_iter++){ 00076 tri_iter->calcForces(); 00077 } 00078 // calculate forces for corner interactions 00079 for(typename std::vector<typename IType::CornerIntType>::iterator corner_iter=m_corner_interactions.begin(); 00080 corner_iter!=m_corner_interactions.end(); 00081 corner_iter++){ 00082 corner_iter->calcForces(); 00083 } 00084 } 00085 00089 template<class ParticleType,class IType> 00090 bool Mesh2D_PIS_NE<ParticleType,IType>::update() 00091 { 00092 console.XDebug() << "Mesh2D_PIS_NE::update\n"; 00093 bool res=false; 00094 //int count_edge=0; 00095 //int count_tri=0; 00096 00097 if(this->m_update_timestamp != this->m_ppa->getTimeStamp()){// m_ppa rebuild since last update 00098 console.XDebug() << "Mesh2D_PIS_NE doing update\n"; 00099 // clean out old interactions 00100 m_edge_interactions.clear(); 00101 m_corner_interactions.clear(); 00102 m_edge_int_set.clear(); 00103 m_corner_int_set.clear(); 00104 // -- get edge interactions 00105 // for all edges 00106 for( 00107 Mesh2D::edge_iterator ed_iter = this->m_mesh->edges_begin(); 00108 ed_iter != this->m_mesh->edges_end(); 00109 ed_iter++ 00110 ){ 00111 typename ParallelParticleArray<ParticleType>::ParticleListHandle plh = 00112 ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearEdge(&(*ed_iter)); 00113 for ( 00114 typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin(); 00115 p_iter!=plh->end(); 00116 p_iter++ 00117 ){ 00118 bool iflag = this->m_ppa->isInInner((*p_iter)->getPos()); 00119 m_edge_interactions.push_back(typename IType::EdgeIntType(*p_iter,&(*ed_iter),m_param,iflag)); 00120 //m_particle_id_set.insert((*p_iter)->getID()); 00121 } 00122 } 00123 // --- get corner interactions 00124 for ( 00125 Mesh2D::corner_iterator co_iter = this->m_mesh->corners_begin(); 00126 co_iter != this->m_mesh->corners_end(); 00127 co_iter++ 00128 ){ 00129 typename ParallelParticleArray<ParticleType>::ParticleListHandle plh= 00130 ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearPoint(co_iter->getPos()); 00131 for ( 00132 typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin(); 00133 p_iter!=plh->end(); 00134 p_iter++ 00135 ){ 00136 bool iflag = this->m_ppa->isInInner((*p_iter)->getPos()); 00137 m_corner_interactions.push_back(typename IType::CornerIntType(*p_iter,&(*co_iter),m_param,iflag)); 00138 //m_particle_id_set.insert((*p_iter)->getID()); 00139 } 00140 } 00141 // set timestamp 00142 this->m_update_timestamp = this->m_ppa->getTimeStamp(); 00143 } 00144 console.XDebug() << "end ElasticMesh2DIG<T>::Update\n"; 00145 00146 return res; 00147 } 00148