source: XIOS/dev/XIOS_DEV_CMIP6/src/server_distribution_description.hpp @ 1258

Last change on this file since 1258 was 1258, checked in by ymipsl, 7 years ago

Fix problem of axis distribution. When a grid is composed of a distributed axis and an non distributed axis on client side , on server side the first axis will be non distributed and second axis will be distributed. In this case, attributes (value, bounds, etc) was not sent in correct distribution.

YM

File size: 3.4 KB
Line 
1/*!
2   \file server_distribution_description.hpp
3   \author Ha NGUYEN
4   \since 04 Jan 2015
5   \date 11 Jan 2016
6
7   \brief Description of index distribution on server(s).
8 */
9
10#ifndef __XIOS_SERVER_DISTRIBUTION_DESCRIPTION_HPP
11#define __XIOS_SERVER_DISTRIBUTION_DESCRIPTION_HPP
12
13#include "xios_spl.hpp"
14#include "array_new.hpp"
15#include <boost/unordered_map.hpp>
16
17namespace xios
18{
19/*!
20   \class CServerDistributionDescription
21   This class contains information that describe distribution of servers.
22*/
23class CServerDistributionDescription
24{
25  public:
26    enum ServerDistributionType
27    {
28      BAND_DISTRIBUTION, PLAN_DISTRIBUTION, ROOT_DISTRIBUTION
29    };
30
31    /** Default constructor */
32    CServerDistributionDescription(const std::vector<int>& globalDimensionSize,
33                                   int nServer,
34                                   ServerDistributionType serType=BAND_DISTRIBUTION);
35
36    /** Default destructor */
37    virtual ~CServerDistributionDescription();
38
39    void computeServerDistribution(bool doComputeGlobalIndex = false, int positionDimensionDistributed = 1);
40    std::vector<int> computeServerGlobalIndexInRange(const std::pair<size_t, size_t>& indexBeginEnd, int positionDimensionDistributed = 1);
41    std::vector<int> computeServerGlobalByElement(std::vector<boost::unordered_map<size_t,std::vector<int> > >& indexServerOnElement,
42                                                  int rank,
43                                                  int clientSize,
44                                                  const CArray<int,1>& axisDomainOrder,
45                                                  int positionDimensionDistributed = 1);
46
47    std::vector<std::vector<int> > getServerIndexBegin() const;
48    std::vector<std::vector<int> > getServerDimensionSizes() const;
49    const std::vector<CArray<size_t,1> >& getGlobalIndex() const;
50    const boost::unordered_map<size_t,int>& getGlobalIndexRange() const;
51    int getDimensionDistributed();
52
53    static int defaultDistributedDimension(int gridDimension,                                   
54                                           ServerDistributionType serType=BAND_DISTRIBUTION);
55
56  protected:
57    int computeBandDistribution(int nServer, int positionDimensionDistributed = 1);
58    int computeRootDistribution(int nServer, int positionDimensionDistributed = 1);
59    void computePlanDistribution(int nServer);
60    void computeRangeProcIndex(int clientRank,
61                               int clientSize,
62                               int rangeProcSize,
63                               int& rangeBegin,
64                               int& rangeSize);
65
66  private:
67    std::vector<std::vector<int> > indexBegin_;     //!< Begin index of each dimension
68    std::vector<std::vector<int> > dimensionSizes_; //!< Size of each dimension
69    std::vector<int> nGlobal_; //!< Global size of each dimension
70
71    //!< General case, index describes distribution of each server (rarely use)
72    std::vector<CArray<size_t,1> > vecGlobalIndex_;
73
74    //!< In case we need only global index of one server with specific rank
75    boost::unordered_map<size_t,int> globalIndex_;
76
77    //!< Type of distribution on server side
78    ServerDistributionType serverType_;
79
80    //!< Number of server
81    int nServer_;
82
83    //!< Position of dimension distributed on server side (by default, the second dimension)
84    int positionDimensionDistributed_;
85};
86
87} // namespace xios
88#endif // __XIOS_SERVER_DISTRIBUTION_DESCRIPTION_HPP
Note: See TracBrowser for help on using the repository browser.