Changeset 887 for XIOS/trunk/src/distribution_client.cpp
- Timestamp:
- 07/05/16 15:59:02 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/distribution_client.cpp
r874 r887 56 56 std::vector<CDomain*> domList = grid->getDomains(); 57 57 std::vector<CAxis*> axisList = grid->getAxis(); 58 CArray<bool,1> axisDomainOrder = grid->axis_domain_order; 59 60 std::vector<CDomain*>::iterator itbDom, iteDom, itDom; 61 std::vector<CAxis*>::iterator itbAxis, iteAxis, itAxis; 62 63 itbDom = itDom = domList.begin(); iteDom = domList.end(); 64 itbAxis = itAxis = axisList.begin(); iteAxis = axisList.end(); 65 66 readDistributionInfo(domList, axisList, axisDomainOrder); 58 std::vector<CScalar*> scalarList = grid->getScalars(); 59 CArray<int,1> axisDomainOrder = grid->axis_domain_order; 60 61 readDistributionInfo(domList, axisList, scalarList, axisDomainOrder); 67 62 68 63 // Then check mask of grid … … 92 87 \param [in] domList List of domains of grid 93 88 \param [in] axisList List of axis of grid 94 \param [in] axisDomainOrder order of axis and domain inside a grid. True if domain, false if axis 89 \param [in] scalarList List of scalar of grid 90 \param [in] axisDomainOrder order of axis and domain inside a grid. 2 if domain, 1 if axis and zero if scalar 95 91 // \param [in] gridMask Mask of grid, for now, keep it 3 dimension, but it needs changing 96 92 */ 97 93 void CDistributionClient::readDistributionInfo(const std::vector<CDomain*>& domList, 98 94 const std::vector<CAxis*>& axisList, 99 const CArray<bool,1>& axisDomainOrder) 95 const std::vector<CScalar*>& scalarList, 96 const CArray<int,1>& axisDomainOrder) 100 97 { 101 98 domainNum_ = domList.size(); … … 129 126 { 130 127 indexMap_[i] = idx; 131 if ( true== axisDomainOrder(i))128 if (2 == axisDomainOrder(i)) 132 129 { 133 130 ++(this->dims_); … … 155 152 156 153 // A trick to determine position of each domain in domainList 157 int domIndex = 0, axisIndex = 0 ;154 int domIndex = 0, axisIndex = 0, scalarIndex = 0; 158 155 idx = 0; 159 156 … … 172 169 for (idx = 0; idx < numElement_; ++idx) 173 170 { 174 bool isDomain= axisDomainOrder(idx);171 int eleDim = axisDomainOrder(idx); 175 172 elementNLocal_[idx] = localSize; 176 173 elementNGlobal_[idx] = globalSize; 177 174 178 175 // If this is a domain 179 if ( isDomain)176 if (2 == eleDim) 180 177 { 181 178 // On the j axis … … 188 185 189 186 dataBegin_.at(indexMap_[idx]+1) = domList[domIndex]->data_jbegin.getValue(); //(2 == domList[domIndex]->data_dim) ? domList[domIndex]->data_jbegin.getValue() : -1; 190 dataIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->data_j_index); 191 infoIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->j_index); 187 // dataIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->data_j_index); 188 // infoIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->j_index); 189 dataIndex_.at(indexMap_[idx]+1).reference(domList[domIndex]->data_j_index); 190 infoIndex_.at(indexMap_[idx]+1).reference(domList[domIndex]->j_index); 192 191 193 192 // On the i axis … … 200 199 201 200 dataBegin_.at(indexMap_[idx]) = domList[domIndex]->data_ibegin.getValue(); 202 dataIndex_.at(indexMap_[idx]) = &(domList[domIndex]->data_i_index); 203 infoIndex_.at(indexMap_[idx]) = &(domList[domIndex]->i_index); 201 // dataIndex_.at(indexMap_[idx]) = &(domList[domIndex]->data_i_index); 202 // infoIndex_.at(indexMap_[idx]) = &(domList[domIndex]->i_index); 203 dataIndex_.at(indexMap_[idx]).reference(domList[domIndex]->data_i_index); 204 infoIndex_.at(indexMap_[idx]).reference(domList[domIndex]->i_index); 204 205 205 206 dataNIndex_.at(idx) = domList[domIndex]->data_i_index.numElements(); … … 212 213 ++domIndex; 213 214 } 214 else // So it's an axis215 else if (1 == eleDim)// So it's an axis 215 216 { 216 217 nLocal_.at(indexMap_[idx]) = axisList[axisIndex]->n.getValue(); … … 222 223 223 224 dataBegin_.at(indexMap_[idx]) = axisList[axisIndex]->data_begin.getValue(); 224 dataIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->data_index); 225 infoIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->index); 225 // dataIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->data_index); 226 // infoIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->index); 227 dataIndex_.at(indexMap_[idx]).reference(axisList[axisIndex]->data_index); 228 infoIndex_.at(indexMap_[idx]).reference(axisList[axisIndex]->index); 226 229 dataNIndex_.at(idx) = axisList[axisIndex]->data_index.numElements(); 227 230 dataDims_.at(idx) = 1; … … 233 236 234 237 ++axisIndex; 238 } 239 else // scalar 240 { 241 nLocal_.at(indexMap_[idx]) = 1; 242 nGlob_.at(indexMap_[idx]) = 1; 243 nBeginLocal_.at(indexMap_[idx]) = 0; 244 nBeginGlobal_.at(indexMap_[idx]) = 1; 245 nZoomBegin_.at((indexMap_[idx])) = 0; 246 nZoomEnd_.at((indexMap_[idx])) = 0; 247 248 dataBegin_.at(indexMap_[idx]) = 0; 249 dataIndex_.at(indexMap_[idx]).resize(1); dataIndex_.at(indexMap_[idx])(0) = 0; 250 infoIndex_.at(indexMap_[idx]).resize(1); infoIndex_.at(indexMap_[idx])(0) = 0; 251 dataNIndex_.at(idx) = 1; 252 dataDims_.at(idx) = 1; 253 254 isDataDistributed_ |= false; 255 256 localSize *= nLocal_.at(indexMap_[idx]); 257 globalSize *= nGlob_.at(indexMap_[idx]); 258 259 ++scalarIndex; 235 260 } 236 261 } … … 248 273 for (int i = 0; i < axisDomainOrder_.numElements(); ++i) 249 274 { 250 if ( axisDomainOrder_(i))275 if (2 == axisDomainOrder_(i)) 251 276 { 252 277 elementIndexData_[i].resize(dataNIndex_[i]); … … 255 280 for (int j = 0; j < dataNIndex_[i]; ++j) 256 281 { 257 iIdx = getDomainIndex(( *dataIndex_[indexMap_[i]])(j), (*dataIndex_[indexMap_[i]+1])(j),282 iIdx = getDomainIndex((dataIndex_[indexMap_[i]])(j), (dataIndex_[indexMap_[i]+1])(j), 258 283 dataBegin_[indexMap_[i]], dataBegin_[indexMap_[i]+1], 259 284 dataDims_[i], nLocal_[indexMap_[i]], jIdx); … … 281 306 if (tmpIndexElementData(j)) 282 307 { 283 iIdx = getDomainIndex(( *dataIndex_[indexMap_[i]])(j), (*dataIndex_[indexMap_[i]+1])(j),308 iIdx = getDomainIndex((dataIndex_[indexMap_[i]])(j), (dataIndex_[indexMap_[i]+1])(j), 284 309 dataBegin_[indexMap_[i]], dataBegin_[indexMap_[i]+1], 285 310 dataDims_[i], nLocal_[indexMap_[i]], jIdx); 286 311 localIndex = tmpLocalElementIndex(count) = iIdx + jIdx * nLocal_[indexMap_[i]]; 287 tmpGlobalElementIndex(count) = ( *infoIndex_[indexMap_[i]])(localIndex) + ((*infoIndex_[indexMap_[i]+1])(localIndex))*nGlob_[indexMap_[i]];288 if (((( *infoIndex_[indexMap_[i]])(localIndex)) <= nZoomEnd_[indexMap_[i]])289 && (nZoomBegin_[indexMap_[i]] <= (( *infoIndex_[indexMap_[i]])(localIndex)))290 && ((( *infoIndex_[indexMap_[i]+1])(localIndex)) <= nZoomEnd_[indexMap_[i]+1])291 && (nZoomBegin_[indexMap_[i]+1] <= (( *infoIndex_[indexMap_[i]+1])(localIndex))))312 tmpGlobalElementIndex(count) = (infoIndex_[indexMap_[i]])(localIndex) + ((infoIndex_[indexMap_[i]+1])(localIndex))*nGlob_[indexMap_[i]]; 313 if ((((infoIndex_[indexMap_[i]])(localIndex)) <= nZoomEnd_[indexMap_[i]]) 314 && (nZoomBegin_[indexMap_[i]] <= ((infoIndex_[indexMap_[i]])(localIndex))) 315 && (((infoIndex_[indexMap_[i]+1])(localIndex)) <= nZoomEnd_[indexMap_[i]+1]) 316 && (nZoomBegin_[indexMap_[i]+1] <= ((infoIndex_[indexMap_[i]+1])(localIndex)))) 292 317 { 293 318 tmpZoomMaskElement(count) = true; … … 309 334 for (int i = 0; i < axisDomainOrder_.numElements(); ++i) 310 335 { 311 if ( !axisDomainOrder_(i))336 if (1 == axisDomainOrder_(i)) 312 337 { 313 338 elementIndexData_[i].resize(dataNIndex_[i]); … … 316 341 for (int j = 0; j < dataNIndex_[i]; ++j) 317 342 { 318 iIdx = getAxisIndex(( *dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]);343 iIdx = getAxisIndex((dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 319 344 if ((iIdx >= nBeginLocal_[indexMap_[i]]) && 320 345 (iIdx < nLocal_[indexMap_[i]]) && (axisMasks_[idxAxis](iIdx))) … … 338 363 if (tmpIndexElementData(j)) 339 364 { 340 iIdx = tmpLocalElementIndex(count) = getAxisIndex(( *dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]);341 tmpGlobalElementIndex(count) = ( *infoIndex_[indexMap_[i]])(iIdx);342 if (((( *infoIndex_[indexMap_[i]])(iIdx)) <= nZoomEnd_[indexMap_[i]])343 && (nZoomBegin_[indexMap_[i]] <= (( *infoIndex_[indexMap_[i]])(iIdx))))365 iIdx = tmpLocalElementIndex(count) = getAxisIndex((dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 366 tmpGlobalElementIndex(count) = (infoIndex_[indexMap_[i]])(iIdx); 367 if ((((infoIndex_[indexMap_[i]])(iIdx)) <= nZoomEnd_[indexMap_[i]]) 368 && (nZoomBegin_[indexMap_[i]] <= ((infoIndex_[indexMap_[i]])(iIdx)))) 344 369 { 345 370 tmpZoomMaskElement(count) = true; … … 349 374 } 350 375 ++idxAxis; 376 } 377 } 378 } 379 380 /*! 381 Create local index of scalar. 382 */ 383 void CDistributionClient::createLocalScalarDataIndex() 384 { 385 int idxAxis = 0; 386 for (int i = 0; i < axisDomainOrder_.numElements(); ++i) 387 { 388 if (0 == axisDomainOrder_(i)) 389 { 390 elementIndexData_[i].resize(dataNIndex_[i]); 391 elementIndexData_[i] = true; 392 int count = 1; 393 394 elementLocalIndex_[i].resize(count); 395 elementLocalIndex_[i] = 0; 396 elementGlobalIndex_[i].resize(count); 397 elementGlobalIndex_[i] = 0; 398 elementZoomMask_[i].resize(count); 399 elementZoomMask_[i] = true; 351 400 } 352 401 } … … 530 579 void CDistributionClient::createGlobalIndex() 531 580 { 532 size_t ssize = 1, idx = 0; 533 for (int i = 0; i < this->dims_; ++i) 534 ssize *= nLocal_[i]; 535 536 this->globalIndex_.resize(ssize); 537 std::vector<int> idxLoop(this->numElement_,0); 538 int innnerLoopSize = (*infoIndex_[0]).numElements(); 539 while (idx < ssize) 540 { 541 for (int i = 0; i < this->numElement_; ++i) 542 { 543 if (idxLoop[i] == (*infoIndex_[indexMap_[i]]).numElements()) 544 { 545 idxLoop[i] = 0; 546 ++idxLoop[i+1]; 547 } 548 } 549 550 for (int i = 0; i < innnerLoopSize; ++i) 551 { 552 size_t globalIndex = (*infoIndex_[0])(idxLoop[0]); 553 size_t mulDim = 1; 554 for (int idxElement = 0; idxElement < this->numElement_; ++idxElement) 555 { 556 if (axisDomainOrder_(idxElement)) 557 { 558 int jb = (0 == idxElement) ? 1 : 0; 559 for (int j = jb; j <= 1; ++j) 560 { 561 mulDim *= nGlob_[indexMap_[idxElement]+j-1]; 562 globalIndex += ((*infoIndex_[indexMap_[idxElement]+j])(idxLoop[idxElement]))*mulDim; 563 } 564 } 565 else 566 { 567 if (0 != idxElement) 568 { 569 mulDim *= nGlob_[indexMap_[idxElement]-1]; 570 globalIndex += ((*infoIndex_[indexMap_[idxElement]])(idxLoop[idxElement]))*mulDim; 571 } 572 } 573 } 574 575 this->globalIndex_(idx) = globalIndex; 576 ++idxLoop[0]; 577 ++idx; 578 } 579 } 580 581 // size_t ssize = 1, idx = 0; 582 // for (int i = 0; i < this->dims_; ++i) 583 // ssize *= nLocal_[i]; 584 // 585 // this->globalIndex_.resize(ssize); 586 // std::vector<int> idxLoop(this->numElement_,0); 587 // int innnerLoopSize = (infoIndex_[0]).numElements(); 588 // while (idx < ssize) 589 // { 590 // for (int i = 0; i < this->numElement_; ++i) 591 //// { 592 // if (idxLoop[i] == (infoIndex_[indexMap_[i]]).numElements()) 593 // { 594 // idxLoop[i] = 0; 595 // ++idxLoop[i+1]; 596 // } 597 // } 598 // 599 // for (int i = 0; i < innnerLoopSize; ++i) 600 // { 601 // size_t globalIndex = (infoIndex_[0])(idxLoop[0]); 602 // size_t mulDim = 1; 603 // for (int idxElement = 0; idxElement < this->numElement_; ++idxElement) 604 // { 605 // if (axisDomainOrder_(idxElement)) 606 // { 607 // int jb = (0 == idxElement) ? 1 : 0; 608 // for (int j = jb; j <= 1; ++j) 609 // { 610 // mulDim *= nGlob_[indexMap_[idxElement]+j-1]; 611 // globalIndex += ((infoIndex_[indexMap_[idxElement]+j])(idxLoop[idxElement]))*mulDim; 612 // } 613 // } 614 // else 615 // { 616 // if (0 != idxElement) 617 // { 618 // mulDim *= nGlob_[indexMap_[idxElement]-1]; 619 // globalIndex += ((infoIndex_[indexMap_[idxElement]])(idxLoop[idxElement]))*mulDim; 620 // } 621 // } 622 // } 623 // 624 // this->globalIndex_(idx) = globalIndex; 625 // ++idxLoop[0]; 626 // ++idx; 627 // } 628 // } 581 629 } 582 630
Note: See TracChangeset
for help on using the changeset viewer.