ESyS-Particle  4.0.1
mesh2d_pis_ne.hpp
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