Changeset 1202 for XIOS/dev/dev_olga/src/distribution_server.cpp
- Timestamp:
- 07/10/17 15:16:17 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/distribution_server.cpp
r1144 r1202 22 22 } 23 23 24 CDistributionServer::CDistributionServer(int rank, 25 const std::vector<CArray<int,1> >& globalIndexElements, 26 const CArray<int,1>& elementOrder, 27 const std::vector<int>& nZoomBegin, 28 const std::vector<int>& nZoomSize, 29 const std::vector<int>& nZoomBeginGlobal, 30 const std::vector<int>& nGlobal) 31 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(nZoomBeginGlobal), 32 nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_() 33 { 34 createGlobalIndex(globalIndexElements, elementOrder); 35 } 36 24 37 CDistributionServer::~CDistributionServer() 25 38 { … … 70 83 this->globalIndex_(idx) = globalIndex; 71 84 85 ++idx; 86 } 87 idxLoop[0] += innerLoopSize; 88 } 89 } 90 91 /*! 92 Create global index on server side 93 Like the similar function on client side, this function serves on creating global index 94 for data written by the server. The global index is used to calculating local index of data 95 written on each server 96 \param[in] globalIndexElement global index on server side of each element of grid (scalar, axis, domain) 97 \param[in] elementOrder the order of elements of grid (e.x: domain->axis or domain->scalar) 98 */ 99 void CDistributionServer::createGlobalIndex(const std::vector<CArray<int,1> >& globalIndexElements, 100 const CArray<int,1>& elementOrder) 101 { 102 int numElement = elementOrder.numElements(), elementIdx = 0; 103 std::vector<int> indexMap(numElement); 104 for (int i = 0; i < numElement; ++i) 105 { 106 indexMap[i] = elementIdx; 107 if (2 == elementOrder(i)) 108 { 109 elementIdx += 2; 110 } 111 else 112 ++elementIdx; 113 } 114 115 std::vector<size_t> elementGlobalSize(numElement); 116 size_t globalSize = 1; 117 for (int i = 0; i < numElement; ++i) 118 { 119 int elementType = elementOrder(i); 120 elementGlobalSize[i] = globalSize; 121 if (2 == elementType) // domain 122 { 123 globalSize *= nGlobal_[indexMap[i]+1] * nGlobal_[indexMap[i]]; 124 } 125 else // axis or scalar 126 { 127 globalSize *= nGlobal_[indexMap[i]]; 128 } 129 } 130 131 size_t ssize = 1; 132 for (int i = 0; i < globalIndexElements.size(); ++i) ssize *= globalIndexElements[i].numElements(); 133 this->globalIndex_.resize(ssize); 134 globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 135 136 std::vector<int> idxLoop(numElement,0); 137 std::vector<int> currentIndex(numElement); 138 int innerLoopSize = globalIndexElements[0].numElements(); 139 140 size_t idx = 0; 141 while (idx<ssize) 142 { 143 for (int i = 0; i < numElement-1; ++i) 144 { 145 if (idxLoop[i] == globalIndexElements[i].numElements()) 146 { 147 idxLoop[i] = 0; 148 ++idxLoop[i+1]; 149 } 150 } 151 152 for (int i = 1; i < numElement; ++i) currentIndex[i] = globalIndexElements[i](idxLoop[i]); 153 154 size_t mulDim, globalIndex; 155 for (int i = 0; i < innerLoopSize; ++i) 156 { 157 globalIndex = 0; 158 currentIndex[0] = globalIndexElements[0](i); 159 160 for (int k = 0; k < numElement; ++k) 161 { 162 globalIndex += (currentIndex[k])*elementGlobalSize[k]; 163 } 164 globalLocalIndexMap_[globalIndex] = idx; 165 this->globalIndex_(idx) = globalIndex; 72 166 ++idx; 73 167 }
Note: See TracChangeset
for help on using the changeset viewer.