ESyS-Particle  4.0.1
RotElasticInteractionGroup.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 
00013 
00014 #include "pis/pi_storage.h"
00015 
00016 //----------------------------------------------
00017 //       CElasticInteractionGroup functions
00018 //----------------------------------------------
00019 template<class T>
00020 CRotElasticInteractionGroup<T>::CRotElasticInteractionGroup()
00021 {
00022   m_exIG=NULL;
00023   this->m_update_timestamp=0;
00024 }
00025 
00026 template<class T>
00027 CRotElasticInteractionGroup<T>::CRotElasticInteractionGroup(const CRotElasticIGP* Param)
00028 {
00029   m_exIG=NULL;
00030   this->m_kr=Param->getNormalSpringConst(); 
00031   this->m_update_timestamp=0;
00032 }
00033 
00034 template<class T>
00035 void CRotElasticInteractionGroup<T>::setParam(const CRotElasticIGP* Param)
00036 {
00037   this->m_kr=Param->getNormalSpringConst();
00038 }
00039 
00040 template<class T>
00041 void CRotElasticInteractionGroup<T>::calcForces()
00042 {
00043 
00044   console.Debug() << "calculating " << m_interactions.size() << " elastic forces\n" ;
00045 
00046   for(vector<CRotElasticInteraction>::iterator it=m_interactions.begin();it!=m_interactions.end();it++){
00047     it->calcForces();
00048   }
00049 }
00050 
00056 template<class T>
00057 void CRotElasticInteractionGroup<T>::Update(ParallelParticleArray<T>* PPA)
00058 {
00059   console.XDebug() << "CElasticInteractionGroup::Update\n";
00060   int count_l=0;
00061 
00062   if(this->m_update_timestamp!=PPA->getTimeStamp()){// PPA rebuild since last update 
00063     // clean out old interactions
00064     m_interactions.erase(m_interactions.begin(),m_interactions.end());
00065     this->m_set.erase(this->m_set.begin(),this->m_set.end());
00066     // get list of pairs from PPA
00067     typename ParallelParticleArray<T>::PairListHandle plh=PPA->getFullPairList();
00068     // generate interactions from pairs
00069     for(typename ParallelParticleArray<T>::PairListIterator iter=plh->begin();iter!=plh->end();iter++){
00070       // check vs. ExIG
00071       vector<int> tv;
00072       tv.push_back(iter->first->getID());
00073       tv.push_back(iter->second->getID());
00074       if(m_exIG!=NULL){
00075         if(!m_exIG->isIn(tv)){
00076           m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
00077           this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
00078           console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
00079           count_l++;
00080         } else {
00081           console.XDebug() << "not adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
00082         }
00083       } else {
00084         m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
00085         this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
00086         console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
00087       }
00088     }
00089   } else { // PPA not rebuilt since last update -> just get additional interactions
00090     // get list of pairs from PPA
00091     typename ParallelParticleArray<T>::PairListHandle plh=PPA->getNewPairList();
00092     for(typename ParallelParticleArray<T>::PairListIterator iter=plh->begin();iter!=plh->end();iter++){
00093       // check vs. ExIG
00094       vector<int> tv;
00095       tv.push_back(iter->first->getID());
00096       tv.push_back(iter->second->getID());
00097       if(m_exIG!=NULL){
00098         if(!m_exIG->isIn(tv)){
00099           m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
00100           this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
00101           console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
00102           count_l++;
00103         } else {
00104           console.XDebug() << "not adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
00105         }
00106       } else {
00107         m_interactions.push_back(CRotElasticInteraction(iter->first,iter->second,m_kr));
00108         this->m_set.insert(pair<int,int>(iter->first->getID(),iter->second->getID()));
00109         console.XDebug() << "adding pair: " << iter->first->getID() << " - " << iter->second->getID() << "\n";
00110       }
00111     }
00112   }
00113 
00114   this->m_update_timestamp=PPA->getTimeStamp();
00115   console.XDebug() << "added " << count_l << " pairs to EIG\n";
00116   console.XDebug() << "end CElasticInteractionGroup::Update\n";
00117 }
00118 
00119 template<class T>
00120 ostream& operator<<(ostream& ost,const CRotElasticInteractionGroup<T>& E)
00121 {
00122   ost << "CElasticInteractionGroup : \n";
00123   for(vector<CRotElasticInteraction>::const_iterator it=E.m_interactions.begin();it!=E.m_interactions.end();it++){
00124     ost << *it << " , " ;
00125   }
00126   ost << "exchange list: \n";
00127   for(set<pair<int,int> >::const_iterator vit=E.m_exchg_list.begin();vit!=E.m_exchg_list.end();vit++){
00128     ost << "[ " << vit->first << " from " << vit->second << " ]  ,  ";
00129   }
00130   return ost;
00131 }