Changeset 1169 for XIOS/trunk/src/distribution_server.cpp
- Timestamp:
- 06/15/17 16:17:01 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/distribution_server.cpp
r930 r1169 34 34 } 35 35 36 CDistributionServer::CDistributionServer(int rank, 37 const std::vector<CArray<int,1> >& globalIndexElements, 38 const CArray<int,1>& elementOrder, 39 const std::vector<int>& nZoomBeginServer, 40 const std::vector<int>& nZoomSizeServer, 41 const std::vector<int>& nZoomBeginGlobal, 42 const std::vector<int>& nGlobal) 43 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(nZoomBeginGlobal), 44 nZoomSize_(nZoomSizeServer), nZoomBegin_(nZoomBeginServer), globalLocalIndexMap_() 45 { 46 createGlobalIndex(globalIndexElements, elementOrder); 47 } 48 36 49 CDistributionServer::~CDistributionServer() 37 50 { … … 89 102 90 103 /*! 104 Create global index on server side 105 Like the similar function on client side, this function serves on creating global index 106 for data written by the server. The global index is used to calculating local index of data 107 written on each server 108 \param[in] globalIndexElement global index on server side of each element of grid (scalar, axis, domain) 109 \param[in] elementOrder the order of elements of grid (e.x: domain->axis or domain->scalar) 110 */ 111 void CDistributionServer::createGlobalIndex(const std::vector<CArray<int,1> >& globalIndexElements, 112 const CArray<int,1>& elementOrder) 113 { 114 int numElement = elementOrder.numElements(), elementIdx = 0; 115 std::vector<int> indexMap(numElement); 116 for (int i = 0; i < numElement; ++i) 117 { 118 indexMap[i] = elementIdx; 119 if (2 == elementOrder(i)) 120 { 121 elementIdx += 2; 122 } 123 else 124 ++elementIdx; 125 } 126 127 std::vector<size_t> elementGlobalSize(numElement); 128 size_t globalSize = 1; 129 for (int i = 0; i < numElement; ++i) 130 { 131 int elementType = elementOrder(i); 132 elementGlobalSize[i] = globalSize; 133 if (2 == elementType) // domain 134 { 135 globalSize *= nGlobal_[indexMap[i]+1] * nGlobal_[indexMap[i]]; 136 } 137 else // axis or scalar 138 { 139 globalSize *= nGlobal_[indexMap[i]]; 140 } 141 } 142 143 size_t ssize = 1; 144 for (int i = 0; i < globalIndexElements.size(); ++i) ssize *= globalIndexElements[i].numElements(); 145 this->globalIndex_.resize(ssize); 146 globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 147 148 std::vector<int> idxLoop(numElement,0); 149 std::vector<int> currentIndex(numElement); 150 int innerLoopSize = globalIndexElements[0].numElements(); 151 152 size_t idx = 0; 153 while (idx<ssize) 154 { 155 for (int i = 0; i < numElement-1; ++i) 156 { 157 if (idxLoop[i] == globalIndexElements[i].numElements()) 158 { 159 idxLoop[i] = 0; 160 ++idxLoop[i+1]; 161 } 162 } 163 164 for (int i = 1; i < numElement; ++i) currentIndex[i] = globalIndexElements[i](idxLoop[i]); 165 166 size_t mulDim, globalIndex; 167 for (int i = 0; i < innerLoopSize; ++i) 168 { 169 globalIndex = 0; 170 currentIndex[0] = globalIndexElements[0](i); 171 172 for (int k = 0; k < numElement; ++k) 173 { 174 globalIndex += (currentIndex[k])*elementGlobalSize[k]; 175 } 176 globalLocalIndexMap_[globalIndex] = idx; 177 this->globalIndex_(idx) = globalIndex; 178 ++idx; 179 } 180 idxLoop[0] += innerLoopSize; 181 } 182 } 183 184 /*! 91 185 Compute local index for writing data on server 92 186 \param [in] globalIndex global index received from client
Note: See TracChangeset
for help on using the changeset viewer.