source: XIOS/dev/dev_trunk_omp/src/client_server_mapping_distributed.cpp @ 1670

Last change on this file since 1670 was 1646, checked in by yushan, 5 years ago

branch merged with trunk @1645. arch file (ep&mpi) added for ADA

File size: 2.0 KB
Line 
1/*!
2   \file client_server_mapping.hpp
3   \author Ha NGUYEN
4   \since 27 Feb 2015
5   \date 16 Mars 2016
6
7   \brief Mapping between index client and server.
8   Clients pre-calculate all information of server distribution.
9 */
10#include "client_server_mapping_distributed.hpp"
11#include <limits>
12#include <boost/functional/hash.hpp>
13#include "utils.hpp"
14#include "mpi_tag.hpp"
15#include "context.hpp"
16#include "context_client.hpp"
17#ifdef _usingEP
18using namespace ep_lib;
19#endif
20
21namespace xios
22{
23
24CClientServerMappingDistributed::CClientServerMappingDistributed(const std::unordered_map<size_t,int>& globalIndexOfServer,
25                                                                 const MPI_Comm& clientIntraComm, bool isDataDistributed)
26  : CClientServerMapping(), ccDHT_(0)
27{
28  ccDHT_ = new CClientClientDHTInt(globalIndexOfServer,
29                                   clientIntraComm);
30}
31
32CClientServerMappingDistributed::~CClientServerMappingDistributed()
33{
34  if (0 != ccDHT_) delete ccDHT_;
35}
36
37/*!
38   Compute mapping global index of server which client sends to.
39   \param [in] globalIndexOnClient global index client has
40   \param [in] nbServer size of server's intracomm
41*/
42void CClientServerMappingDistributed::computeServerIndexMapping(const CArray<size_t,1>& globalIndexOnClient, int nbServer)
43{
44
45  ccDHT_->computeIndexInfoMapping(globalIndexOnClient);
46  const CClientClientDHTInt::Index2VectorInfoTypeMap& infoIndexMap = (ccDHT_->getInfoIndexMap());
47  CClientClientDHTInt::Index2VectorInfoTypeMap::const_iterator itb = infoIndexMap.begin(), ite = infoIndexMap.end(), it;
48  std::vector<size_t> nbInfoIndex(std::max(ccDHT_->getNbClient(),nbServer),0);
49
50  for (it = itb; it != ite; ++it)
51  {
52    ++nbInfoIndex[it->second[0]];
53  }
54
55  for (int idx = 0; idx < nbInfoIndex.size(); ++idx)
56  {
57    if (0 != nbInfoIndex[idx])
58    {
59      indexGlobalOnServer_[idx].resize(nbInfoIndex[idx]);
60      nbInfoIndex[idx] = 0;
61    }
62  }
63
64  for (it = itb; it != ite; ++it)
65  {
66    indexGlobalOnServer_[it->second[0]][nbInfoIndex[it->second[0]]] = (it->first);
67    ++nbInfoIndex[it->second[0]];
68  }
69}
70
71}
Note: See TracBrowser for help on using the repository browser.