Changeset 1025 for XIOS/dev/dev_olga/src/distribution_server.cpp
- Timestamp:
- 01/11/17 15:14:22 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/distribution_server.cpp
r930 r1025 13 13 14 14 CDistributionServer::CDistributionServer(int rank, int dims, const CArray<size_t,1>& globalIndex) 15 : CDistribution(rank, dims, globalIndex), nGlobal_(), nZoomSize_(), nZoomBegin_(), globalLocalIndexMap_() 15 : CDistribution(rank, dims, globalIndex), nGlobal_(), nZoomSize_(), nZoomBegin_(), globalLocalIndexMap_(), 16 globalIndexEachDimension_() 16 17 { 17 18 } … … 19 20 CDistributionServer::CDistributionServer(int rank, const std::vector<int>& nZoomBegin, 20 21 const std::vector<int>& nZoomSize, const std::vector<int>& nGlobal) 21 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_() 22 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_(), 23 globalIndexEachDimension_() 22 24 { 23 25 createGlobalIndex(); … … 29 31 const std::vector<int>& nGlobal) 30 32 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(nZoomBeginGlobal), 31 nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_() 33 nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_(), 34 globalIndexEachDimension_() 32 35 { 33 36 createGlobalIndex(); 37 } 38 39 CDistributionServer::CDistributionServer(int rank, 40 const std::vector<CArray<int,1> >& globalIndexEachDimension, 41 const std::vector<int>& nGlobal) 42 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(), 43 nZoomSize_(), nZoomBegin_(), globalLocalIndexMap_(), 44 globalIndexEachDimension_(globalIndexEachDimension) 45 { 46 createGlobalIndexFromIndex(globalIndexEachDimension, nGlobal); 34 47 } 35 48 … … 88 101 } 89 102 103 void CDistributionServer::createGlobalIndexFromIndex(const std::vector<CArray<int,1> >& globalIndexOnEachDimension, 104 const std::vector<int>& nbGlobal) 105 { 106 size_t idx = 0, ssize = 1; 107 for (int i = 0; i < globalIndexOnEachDimension.size(); ++i) ssize *= globalIndexOnEachDimension[i].numElements(); 108 109 this->globalIndex_.resize(ssize); 110 size_t nbDim = nbGlobal.size(); 111 std::vector<int> idxLoop(nbDim,0); 112 std::vector<int> currentIndex(nbDim); 113 int innerLoopSize = globalIndexOnEachDimension[0].numElements(); 114 115 globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 116 while (idx<ssize) 117 { 118 for (int i = 0; i < nbDim-1; ++i) 119 { 120 if (idxLoop[i] == globalIndexOnEachDimension[i].numElements()) 121 { 122 idxLoop[i] = 0; 123 ++idxLoop[i+1]; 124 } 125 } 126 127 for (int i = 1; i < nbDim; ++i) 128 currentIndex[i] = globalIndexOnEachDimension[i](idxLoop[i]); 129 130 size_t mulDim, globalIndex; 131 for (int i = 0; i < innerLoopSize; ++i) 132 { 133 mulDim = 1; 134 globalIndex = globalIndexOnEachDimension[0](i); 135 136 for (int k = 1; k < nbDim; ++k) 137 { 138 mulDim *= nbGlobal[k-1]; 139 globalIndex += (currentIndex[k])*mulDim; 140 } 141 globalLocalIndexMap_[globalIndex] = idx; 142 this->globalIndex_(idx) = globalIndex; 143 144 ++idx; 145 } 146 idxLoop[0] += innerLoopSize; 147 } 148 149 } 150 90 151 /*! 91 152 Compute local index for writing data on server
Note: See TracChangeset
for help on using the changeset viewer.