ESyS-Particle  4.0.1
pi_storage_ne.hpp
1 
2 // //
3 // Copyright (c) 2003-2011 by The University of Queensland //
4 // Earth Systems Science Computational Centre (ESSCC) //
5 // http://www.uq.edu.au/esscc //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 template<typename P,typename I>
15 {
16  m_param=param;
17  m_exIG=NULL;
18  m_update_timestamp=0;
19 }
20 
21 template<typename P,typename InteractionType>
23 {
24  m_exIG=eg;
25 }
26 
30 template<typename T,typename InteractionType>
32 {
33  console.XDebug() << "ParallelInteractionStorage_NE::Update\n";
34  int count_l=0;
35  bool res=true;
36 
37  if(m_update_timestamp != this->m_ppa->getTimeStamp()){// m_ppa rebuild since last update
38  // clean out old interactions
39  this->m_interactions.clear();
40  m_set.erase(m_set.begin(),m_set.end());
41  // get list of pairs from m_ppa
42  typename ParallelParticleArray<T>::PairListHandle plh =
43  ((ParallelParticleArray<T>*)this->m_ppa)->getFullPairList();
44  // generate interactions from pairs
45  for(typename ParallelParticleArray<T>::PairListIterator iter=plh->begin();
46  iter!=plh->end();
47  iter++){
48  // check vs. ExIG
49  vector<int> tv;
50  tv.push_back(iter->first->getID());
51  tv.push_back(iter->second->getID());
52  if(m_exIG!=NULL){
53  if(!m_exIG->isIn(tv)){
54  this->m_interactions.push_back(InteractionType(iter->first,iter->second,m_param));
55  m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
56  count_l++;
57  }
58  } else {
59  this->m_interactions.push_back(InteractionType(iter->first,iter->second,m_param));
60  m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
61  count_l++;
62  }
63  }
64  } else { // m_ppa not rebuild since last update -> just get additional interactions
65  // get list of pairs from m_ppa
66  typename ParallelParticleArray<T>::PairListHandle plh =
67  ((ParallelParticleArray<T>*)this->m_ppa)->getNewPairList();
68  //cout << "got NewPairList: ";
69  for(typename ParallelParticleArray<T>::PairListIterator iter=plh->begin();
70  iter!=plh->end();
71  iter++){
72  // cout << iter->first->getID() << "-" << iter->second->getID() << endl;
73  // check vs. ExIG
74  vector<int> tv;
75  tv.push_back(iter->first->getID());
76  tv.push_back(iter->second->getID());
77  if(m_exIG!=NULL){
78  if(!m_exIG->isIn(tv)){
79  this->m_interactions.push_back(InteractionType(iter->first,iter->second,m_param));
80  m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
81  count_l++;
82  }
83  } else {
84  this->m_interactions.push_back(InteractionType(iter->first,iter->second,m_param));
85  m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
86  count_l++;
87  }
88  }
89  }
90  m_update_timestamp = this->m_ppa->getTimeStamp();
91 
92  console.XDebug() << "added " << count_l << " pairs to EIG\n";
93  console.XDebug() << "end ParallelInteractionStorage_NE::Update\n";
94 
95  return res;
96 }
97 
98 
102 template<typename P,typename InteractionType>
104 {
105  bool res;
106 
107  res=m_set.find(make_pair(pids[0],pids[1]))!=m_set.end();
108 
109  return res;
110 }
111 
115 template<typename P,typename InteractionType>
117 {
118  console.Debug()
119  << "calculating "
120  << this->m_interactions.size()
121  << " interaction forces\n";
122 
123  for(
124  typename list<InteractionType>::iterator it = this->m_interactions.begin();
125  it != this->m_interactions.end();
126  it++
127  ){
128  it->calcForces();
129  }
130 }
131 
132 template<typename P,typename InteractionType>
134 {
135  console.Debug()
136  << "calculating "
137  << this->m_interactions.size()
138  << " interaction heat transfers\n" ;
139 
140  for(
141  typename list<InteractionType>::iterator it = this->m_interactions.begin();
142  it != this->m_interactions.end();
143  it++
144  ){
145  it->calcHeatTrans();
146  }
147 }