source: XIOS/trunk/src/client_server_mapping_distributed.cpp @ 860

Last change on this file since 860 was 860, checked in by mhnguyen, 5 years ago

Improvement of DHT: allow multiple values correspond to one key

+) If there are several returned values corresponding to one key,
all of them are returned by DHT in vector.

Test
+) Testing only very basic. This commit serves as temporary one.

File size: 1.9 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
16namespace xios
17{
18
19CClientServerMappingDistributed::CClientServerMappingDistributed(const boost::unordered_map<size_t,int>& globalIndexOfServer,
20                                                                 const MPI_Comm& clientIntraComm, bool isDataDistributed)
21  : CClientServerMapping(), ccDHT_(0)
22{
23  ccDHT_ = new CClientClientDHTInt(globalIndexOfServer,
24                                   clientIntraComm);
25}
26
27CClientServerMappingDistributed::~CClientServerMappingDistributed()
28{
29  if (0 != ccDHT_) delete ccDHT_;
30}
31
32/*!
33   Compute mapping global index of server which client sends to.
34   \param [in] globalIndexOnClient global index client has
35*/
36void CClientServerMappingDistributed::computeServerIndexMapping(const CArray<size_t,1>& globalIndexOnClient)
37{
38  ccDHT_->computeIndexInfoMapping(globalIndexOnClient);
39  const CClientClientDHTInt::Index2VectorInfoTypeMap& infoIndexMap = (ccDHT_->getInfoIndexMap());
40  CClientClientDHTInt::Index2VectorInfoTypeMap::const_iterator itb = infoIndexMap.begin(), ite = infoIndexMap.end(), it;
41  std::vector<size_t> nbInfoIndex(ccDHT_->getNbClient(),0);
42
43  for (it = itb; it != ite; ++it)
44  {
45    ++nbInfoIndex[it->second[0]];
46  }
47
48  for (int idx = 0; idx < nbInfoIndex.size(); ++idx)
49  {
50    if (0 != nbInfoIndex[idx])
51    {
52      indexGlobalOnServer_[idx].resize(nbInfoIndex[idx]);
53      nbInfoIndex[idx] = 0;
54    }
55  }
56
57  for (it = itb; it != ite; ++it)
58  {
59    indexGlobalOnServer_[it->second[0]][nbInfoIndex[it->second[0]]] = (it->first);
60    ++nbInfoIndex[it->second[0]];
61  }
62}
63
64}
Note: See TracBrowser for help on using the repository browser.