ESyS-Particle  4.0.1
RotElasticInteractionGroup.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 
14 #include "pis/pi_storage.h"
15 
16 //----------------------------------------------
17 // CElasticInteractionGroup functions
18 //----------------------------------------------
19 template<class T>
21 {
22  m_exIG=NULL;
23  this->m_update_timestamp=0;
24 }
25 
26 template<class T>
28 {
29  m_exIG=NULL;
30  this->m_kr=Param->getNormalSpringConst();
31  this->m_update_timestamp=0;
32 }
33 
34 template<class T>
36 {
37  this->m_kr=Param->getNormalSpringConst();
38 }
39 
40 template<class T>
42 {
43 
44  console.Debug() << "calculating " << m_interactions.size() << " elastic forces\n" ;
45 
46  for(vector<CRotElasticInteraction>::iterator it=m_interactions.begin();it!=m_interactions.end();it++){
47  it->calcForces();
48  }
49 }
50 
56 template<class T>
58 {
59  console.XDebug() << "CElasticInteractionGroup::Update\n";
60  int count_l=0;
61 
62  if(this->m_update_timestamp!=PPA->getTimeStamp()){// PPA rebuild since last update
63  // clean out old interactions
64  m_interactions.erase(m_interactions.begin(),m_interactions.end());
65  this->m_set.erase(this->m_set.begin(),this->m_set.end());
66  // get list of pairs from PPA
67  typename ParallelParticleArray<T>::PairListHandle plh=PPA->getFullPairList();
68  // generate interactions from pairs
69  for(typename ParallelParticleArray<T>::PairListIterator iter=plh->begin();iter!=plh->end();iter++){
70  // check vs. ExIG
71  vector<int> tv;
72  tv.push_back(iter->first->getID());
73  tv.push_back(iter->second->getID());
74  if(m_exIG!=NULL){
75  if(!m_exIG->isIn(tv)){
76  m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
77  this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
78  console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
79  count_l++;
80  } else {
81  console.XDebug() << "not adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
82  }
83  } else {
84  m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
85  this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
86  console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
87  }
88  }
89  } else { // PPA not rebuilt since last update -> just get additional interactions
90  // get list of pairs from PPA
91  typename ParallelParticleArray<T>::PairListHandle plh=PPA->getNewPairList();
92  for(typename ParallelParticleArray<T>::PairListIterator iter=plh->begin();iter!=plh->end();iter++){
93  // check vs. ExIG
94  vector<int> tv;
95  tv.push_back(iter->first->getID());
96  tv.push_back(iter->second->getID());
97  if(m_exIG!=NULL){
98  if(!m_exIG->isIn(tv)){
99  m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
100  this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
101  console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
102  count_l++;
103  } else {
104  console.XDebug() << "not adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
105  }
106  } else {
107  m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
108  this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
109  console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
110  }
111  }
112  }
113 
114  this->m_update_timestamp=PPA->getTimeStamp();
115  console.XDebug() << "added " << count_l << " pairs to EIG\n";
116  console.XDebug() << "end CElasticInteractionGroup::Update\n";
117 }
118 
119 template<class T>
120 ostream& operator<<(ostream& ost,const CRotElasticInteractionGroup<T>& E)
121 {
122  ost << "CElasticInteractionGroup : \n";
123  for(vector<CRotElasticInteraction>::const_iterator it=E.m_interactions.begin();it!=E.m_interactions.end();it++){
124  ost << *it << " , " ;
125  }
126  ost << "exchange list: \n";
127  for(set<pair<int,int> >::const_iterator vit=E.m_exchg_list.begin();vit!=E.m_exchg_list.end();vit++){
128  ost << "[ " << vit->first << " from " << vit->second << " ] , ";
129  }
130  return ost;
131 }