ESyS-Particle  4.0.1
ScalarParticleFieldSlave.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 
00033 template <typename T>
00034 ScalarParticleFieldSlave<T>::ScalarParticleFieldSlave(TML_Comm* comm,ParallelParticleArray<T>* ppa,typename T::ScalarFieldFunction rdf):AFieldSlave(comm)
00035 {
00036   m_ppa=ppa;
00037   m_rdf=rdf;
00038 } 
00039 
00040 
00041 
00045 template <typename T>
00046 void ScalarParticleFieldSlave<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=m_ppa->forAllInnerParticlesGetIndexed(m_rdf);
00053   pos_vec=m_ppa->forAllInnerParticlesGetIndexed(typename T::VectorFieldFunction(&T::getPos));
00054   rad_vec=m_ppa->forAllInnerParticlesGetIndexed(typename T::ScalarFieldFunction(&T::getRad));
00055 
00056   // send data to master
00057   m_comm->send_gather(data_vec,0);
00058   m_comm->send_gather(pos_vec,0);
00059   m_comm->send_gather(rad_vec,0);
00060 }
00061 
00065 template <typename T>
00066 void ScalarParticleFieldSlave<T>::SendDataSum()
00067 {
00068   vector<double> data_vec;
00069   
00070   // get data from particles
00071   m_ppa->forAllInnerParticlesGet(data_vec,m_rdf);
00072 
00073   // sum data
00074   double sum=0.0;
00075   for(vector<double>::iterator iter=data_vec.begin();
00076       iter!=data_vec.end();
00077       iter++){
00078     sum+=*iter;
00079   }
00080   
00081   vector<double> sum_vec;
00082   sum_vec.push_back(sum);
00083   m_comm->send_gather(sum_vec,0);
00084 }
00085 
00089 template <typename T>
00090 void ScalarParticleFieldSlave<T>::SendDataMax()
00091 {
00092   vector<double> data_vec;
00093   
00094   // get data from particles
00095   m_ppa->forAllInnerParticlesGet(data_vec,m_rdf);
00096 
00097   // sum data
00098   double max=*(data_vec.begin());
00099   for(vector<double>::iterator iter=data_vec.begin();
00100       iter!=data_vec.end();
00101       iter++){
00102     max=(*iter > max) ? *iter : max;
00103   }
00104   
00105   vector<double> max_vec;
00106   max_vec.push_back(max);
00107   m_comm->send_gather(max_vec,0);
00108 }
00109 
00113 template <typename T>
00114 void ScalarParticleFieldSlave<T>::sendData()
00115 {
00116   int coll_type;
00117   m_comm->recv_broadcast(coll_type,0);
00118 
00119   switch(coll_type){
00120   case 1: SendDataFull();break;
00121   case 2: SendDataSum();break;
00122   case 3: SendDataMax();break;
00123   default: std::cerr << "unknown collection type" << std::endl;
00124   }
00125 }