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 //-- STL includes -- 00014 #include <vector> 00015 #include <utility> 00016 00017 using std::vector; 00018 using std::pair; 00019 00020 // -- IO includes -- 00021 #include <iostream> 00022 00023 using std::cout; 00024 using std::endl; 00025 00035 template <typename T> 00036 ScalarParticleFieldSlaveTagged<T>::ScalarParticleFieldSlaveTagged(TML_Comm* comm,ParallelParticleArray<T>* ppa,typename T::ScalarFieldFunction rdf,int tag,int mask):ScalarParticleFieldSlave<T>(comm,ppa,rdf) 00037 { 00038 m_tag=tag; 00039 m_mask=mask; 00040 } 00041 00045 template <typename T> 00046 void ScalarParticleFieldSlaveTagged<T>::SendDataFull() 00047 { 00048 vector<pair<int,double> > data_vec; 00049 vector<pair<int,double> > rad_vec; 00050 vector<pair<int,Vec3> > pos_vec; 00051 00052 data_vec = 00053 this->m_ppa->forAllInnerTaggedParticlesGetIndexed( 00054 this->m_rdf, 00055 m_tag, 00056 m_mask 00057 ); 00058 pos_vec = 00059 this->m_ppa->forAllInnerTaggedParticlesGetIndexed( 00060 typename T::VectorFieldFunction(&T::getPos), 00061 m_tag, 00062 m_mask 00063 ); 00064 rad_vec = 00065 this->m_ppa->forAllInnerTaggedParticlesGetIndexed( 00066 typename T::ScalarFieldFunction(&T::getRad), 00067 m_tag, 00068 m_mask 00069 ); 00070 00071 // send data to master 00072 this->m_comm->send_gather(data_vec,0); 00073 this->m_comm->send_gather(pos_vec,0); 00074 this->m_comm->send_gather(rad_vec,0); 00075 } 00076 00080 template <typename T> 00081 void ScalarParticleFieldSlaveTagged<T>::SendDataSum() 00082 { 00083 vector<double> data_vec; 00084 00085 // get data from particles 00086 this->m_ppa->forAllTaggedInnerParticlesGet(data_vec,this->m_rdf,m_tag,m_mask); 00087 00088 // sum data 00089 double sum=0.0; 00090 for(vector<double>::iterator iter=data_vec.begin(); 00091 iter!=data_vec.end(); 00092 iter++){ 00093 sum+=*iter; 00094 } 00095 00096 vector<double> sum_vec; 00097 sum_vec.push_back(sum); 00098 this->m_comm->send_gather(sum_vec,0); 00099 } 00100 00101 00105 template <typename T> 00106 void ScalarParticleFieldSlaveTagged<T>::SendDataMax() 00107 { 00108 vector<double> data_vec; 00109 00110 // get data from particles 00111 this->m_ppa->forAllTaggedInnerParticlesGet( 00112 data_vec, 00113 this->m_rdf, 00114 m_tag, 00115 m_mask 00116 ); 00117 00118 // sum data 00119 double max=*(data_vec.begin()); 00120 for(vector<double>::iterator iter=data_vec.begin(); 00121 iter!=data_vec.end(); 00122 iter++){ 00123 max=(*iter > max) ? *iter : max; 00124 } 00125 00126 vector<double> max_vec; 00127 max_vec.push_back(max); 00128 this->m_comm->send_gather(max_vec,0); 00129 }