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 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 }