Changeset 1129 for XIOS/dev/dev_olga/src/distribution_server.cpp
- Timestamp:
- 05/11/17 18:25:20 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/distribution_server.cpp
r1099 r1129 37 37 } 38 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);47 }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); 47 // } 48 48 49 49 CDistributionServer::~CDistributionServer() … … 101 101 } 102 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 = 0; k < nbDim; ++k)137 {138 mulDim *= nbGlobal[k];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 }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 = 0; k < nbDim; ++k) 137 // { 138 // mulDim *= nbGlobal[k]; 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 150 151 151 /*! … … 156 156 CArray<size_t,1> CDistributionServer::computeLocalIndex(const CArray<size_t,1>& globalIndex) 157 157 { 158 int ssize = globalIndex.numElements(); 159 CArray<size_t,1> localIndex(ssize); 158 size_t ssize = globalIndex.numElements(); 159 size_t localIndexSize = std::min(globalIndex_.numElements(), ssize); 160 CArray<size_t,1> localIndex(localIndexSize); 160 161 GlobalLocalMap::const_iterator ite = globalLocalIndexMap_.end(), it; 161 for (int idx = 0 ; idx < ssize; ++idx)162 for (int idx = 0, i = 0; idx < ssize; ++idx) 162 163 { 163 164 it = globalLocalIndexMap_.find(globalIndex(idx)); 164 165 if (ite != it) 166 { 165 167 localIndex(idx) = it->second; 168 ++i; 169 } 166 170 } 167 171
Note: See TracChangeset
for help on using the changeset viewer.