1
#include "Foundation/console.h"
6
\param mesh_p pointer to the 2d mesh
7
\param ppa_p pointer to the particle array
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)
15
this->m_update_timestamp=0;
21
template<class ParticleType,class IType>
22
Mesh2D_PIS_NE<ParticleType,IType>::~Mesh2D_PIS_NE()
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.
31
\param v vector of particle ids
34
template <class ParticleType,class IType>
35
bool Mesh2D_PIS_NE<ParticleType,IType>::isIn(const std::vector<int>& v)
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;
53
calculate all the forces
55
template<class ParticleType,class IType>
56
void Mesh2D_PIS_NE<ParticleType,IType>::calcForces()
58
console.XDebug() << "Mesh2D_PIS_NE calculating " << m_edge_interactions.size() << " line forces , "
59
<< m_corner_interactions.size() << "corner forces\n";
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();
65
tri_iter->calcForces();
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();
71
corner_iter->calcForces();
76
update the interactions
78
template<class ParticleType,class IType>
79
bool Mesh2D_PIS_NE<ParticleType,IType>::update()
81
console.XDebug() << "Mesh2D_PIS_NE::update\n";
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
96
Mesh2D::edge_iterator ed_iter = this->m_mesh->edges_begin();
97
ed_iter != this->m_mesh->edges_end();
100
typename ParallelParticleArray<ParticleType>::ParticleListHandle plh =
101
((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearEdge(&(*ed_iter));
103
typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
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());
112
// --- get corner interactions
114
Mesh2D::corner_iterator co_iter = this->m_mesh->corners_begin();
115
co_iter != this->m_mesh->corners_end();
118
typename ParallelParticleArray<ParticleType>::ParticleListHandle plh=
119
((ParallelParticleArray<ParticleType>*)(this->m_ppa))->getParticlesNearPoint(co_iter->getPos());
121
typename ParallelParticleArray<ParticleType>::ParticleListIterator p_iter=plh->begin();
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());
131
this->m_update_timestamp = this->m_ppa->getTimeStamp();
133
console.XDebug() << "end ElasticMesh2DIG<T>::Update\n";