~esys-p-dev/esys-particle/trunk

« back to all changes in this revision

Viewing changes to pis/mesh2d_pis_ne.hpp

  • Committer: steffen
  • Date: 2007-12-04 08:40:31 UTC
  • Revision ID: svn-v4:1ddc92f8-1f06-0410-a909-b11019f1b28a:lsm/branches/Dublin2005-11-22:999
- added setParticleDensity (only NRot so far)
- added elastic interactions with 2DLattice

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "Foundation/console.h"
 
2
 
 
3
/*!
 
4
  constructor
 
5
 
 
6
  \param mesh_p pointer to the 2d mesh
 
7
  \param ppa_p pointer to the particle array
 
8
  \param param 
 
9
*/
 
10
template<class ParticleType,class IType>
 
11
Mesh2D_PIS_NE<ParticleType,IType>::Mesh2D_PIS_NE(Mesh2D* mesh_p,ParallelParticleArray<ParticleType>* ppa_p,typename IType::ParameterType param)
 
12
  :Mesh2D_PIS<ParticleType>(mesh_p,ppa_p)
 
13
{
 
14
  m_param=param;
 
15
  this->m_update_timestamp=0;
 
16
}
 
17
 
 
18
/*!
 
19
  destructor
 
20
*/
 
21
template<class ParticleType,class IType>
 
22
Mesh2D_PIS_NE<ParticleType,IType>::~Mesh2D_PIS_NE()
 
23
{}
 
24
 
 
25
/*!
 
26
  Check if an interaction is in this PIS. The first 2 values in the vector
 
27
  are expected to be the edge/corner (v[0]) and particle (v[1]) ids, the 3rd 
 
28
  an indicator if edge (v[2]==0)or corner (v[2]==1) interaction. 
 
29
  If there is no 3rd value or it is not in [0,1], "false" is returned.
 
30
 
 
31
  \param v vector of particle ids
 
32
  \warning log(N)
 
33
*/
 
34
template <class ParticleType,class IType> 
 
35
bool Mesh2D_PIS_NE<ParticleType,IType>::isIn(const std::vector<int>& v)
 
36
{
 
37
  bool res=false;
 
38
  
 
39
  if(v.size()<3){
 
40
    res=false;
 
41
  } else {
 
42
    switch (v[2]){
 
43
    case 0: res=m_edge_int_set.find(make_pair(v[0],v[1]))!=m_edge_int_set.end(); break;
 
44
    case 1: res=m_corner_int_set.find(make_pair(v[0],v[1]))!=m_corner_int_set.end(); break;
 
45
    default: console.Error() << "wrong value in argument of Mesh2D_PIS::isIn !!\n"; break;
 
46
   }
 
47
  }
 
48
 
 
49
  return res;
 
50
}
 
51
 
 
52
/*!
 
53
  calculate all the forces
 
54
*/
 
55
template<class ParticleType,class IType>
 
56
void Mesh2D_PIS_NE<ParticleType,IType>::calcForces()
 
57
{
 
58
  console.XDebug() << "Mesh2D_PIS_NE calculating " << m_edge_interactions.size() << " line forces , " 
 
59
                   << m_corner_interactions.size() << "corner forces\n";
 
60
 
 
61
  // calculate forces for edge interactions
 
62
  for(typename std::vector<typename IType::EdgeIntType>::iterator tri_iter=m_edge_interactions.begin();
 
63
      tri_iter!=m_edge_interactions.end();
 
64
      tri_iter++){
 
65
    tri_iter->calcForces();
 
66
  }
 
67
  // calculate forces for corner interactions 
 
68
  for(typename std::vector<typename IType::CornerIntType>::iterator corner_iter=m_corner_interactions.begin();
 
69
      corner_iter!=m_corner_interactions.end();
 
70
      corner_iter++){
 
71
    corner_iter->calcForces();
 
72
  }
 
73
}
 
74
 
 
75
/*!
 
76
  update the interactions 
 
77
*/
 
78
template<class ParticleType,class IType>
 
79
bool Mesh2D_PIS_NE<ParticleType,IType>::update()
 
80
{
 
81
  console.XDebug() << "Mesh2D_PIS_NE::update\n";
 
82
  bool res=false;
 
83
  //int count_edge=0;
 
84
  //int count_tri=0;
 
85
 
 
86
  if(this->m_update_timestamp != this->m_ppa->getTimeStamp()){// m_ppa rebuild since last update 
 
87
    console.XDebug() << "Mesh2D_PIS_NE doing update\n";
 
88
    // clean out old interactions
 
89
    m_edge_interactions.clear();
 
90
    m_corner_interactions.clear();
 
91
    m_edge_int_set.clear();
 
92
    m_corner_int_set.clear();
 
93
    // -- get edge interactions
 
94
    // for all edges
 
95
    for(
 
96
      Mesh2D::edge_iterator ed_iter = this->m_mesh->edges_begin();
 
97
      ed_iter != this->m_mesh->edges_end();
 
98
      ed_iter++
 
99
    ){
 
100
      typename ParallelParticleArray<ParticleType>::ParticleListHandle plh =
 
101
        ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearEdge(&(*ed_iter));
 
102
      for (
 
103
        typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
 
104
        p_iter!=plh->end();
 
105
        p_iter++
 
106
      ){
 
107
        bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
 
108
        m_edge_interactions.push_back(typename IType::EdgeIntType(*p_iter,&(*ed_iter),m_param,iflag));
 
109
        //m_particle_id_set.insert((*p_iter)->getID());
 
110
      }
 
111
    }
 
112
    // --- get corner interactions
 
113
    for (
 
114
      Mesh2D::corner_iterator co_iter = this->m_mesh->corners_begin();
 
115
      co_iter != this->m_mesh->corners_end();
 
116
      co_iter++
 
117
    ){
 
118
      typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
 
119
        ((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearPoint(co_iter->getPos());
 
120
      for (
 
121
        typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
 
122
        p_iter!=plh->end();
 
123
        p_iter++
 
124
      ){
 
125
        bool iflag = this->m_ppa->isInInner((*p_iter)->getPos());
 
126
        m_corner_interactions.push_back(typename IType::CornerIntType(*p_iter,&(*co_iter),m_param,iflag));
 
127
        //m_particle_id_set.insert((*p_iter)->getID());
 
128
      }
 
129
    }
 
130
    // set timestamp
 
131
    this->m_update_timestamp = this->m_ppa->getTimeStamp();
 
132
  }
 
133
  console.XDebug() << "end  ElasticMesh2DIG<T>::Update\n";
 
134
 
 
135
  return res;
 
136
}
 
137