ESyS-Particle
4.0.1
|
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 }