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