Changeset 1027 for XIOS/dev/dev_olga/src/node/grid.cpp
- Timestamp:
- 01/11/17 16:50:27 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/node/grid.cpp
r1023 r1027 273 273 { 274 274 CContext* context = CContext::getCurrent(); 275 CContextClient* client= context->hasServer ? context->clientPrimServer : context->client;276 277 275 int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1; 276 278 277 for (int i = 0; i < nbSrvPools; ++i) 279 278 { 280 if (isScalarGrid()) 281 { 282 // if (context->hasClient && !context->hasServer) 283 if (context->hasClient) 284 if (this->isChecked && doSendingIndex && !isIndexSent) { sendIndexScalarGrid(); this->isIndexSent = true; } 285 286 if (this->isChecked) return; 287 // if (context->hasClient && !context->hasServer) 288 if (context->hasClient) 289 { 290 this->computeIndexScalarGrid(); 291 } 292 293 // this->isChecked = true; 279 CContextClient* client= context->hasServer ? context->clientPrimServer[i] : context->client; 280 if (isScalarGrid()) 281 { 282 // if (context->hasClient && !context->hasServer) 283 if (context->hasClient) 284 if (this->isChecked && doSendingIndex && !isIndexSent) { sendIndexScalarGrid(); this->isIndexSent = true; } 285 286 if (this->isChecked) return; 287 // if (context->hasClient && !context->hasServer) 288 if (context->hasClient) 289 { 290 this->computeIndexScalarGrid(); 291 } 292 293 // this->isChecked = true; 294 if (!(this->hasTransform() && !this->isTransformed())) 295 this->isChecked = true; 296 return; 297 } 298 299 // if (context->hasClient && !context->hasServer) 300 // if (context->hasClient) 301 // if (doSendingIndex && !isIndexSent) 302 { 303 if (context->hasClient) 304 { 305 if (this->isChecked && doSendingIndex && !isIndexSent) 306 {sendIndex(); this->isIndexSent = true;} 307 } 308 309 if (this->isChecked) return; 310 this->checkAttributesAfterTransformation(); 311 this->checkMask(); 312 this->computeIndex(); 313 // this->isChecked = true; 294 314 if (!(this->hasTransform() && !this->isTransformed())) 295 315 this->isChecked = true; 296 return; 297 } 298 299 // if (context->hasClient && !context->hasServer) 300 // if (context->hasClient) 301 // if (doSendingIndex && !isIndexSent) 302 { 303 if (context->hasClient) 304 { 305 if (this->isChecked && doSendingIndex && !isIndexSent) 306 {sendIndex(); this->isIndexSent = true;} 307 } 308 309 if (this->isChecked) return; 310 this->checkAttributesAfterTransformation(); 311 this->checkMask(); 312 this->computeIndex(); 313 // this->isChecked = true; 314 if (!(this->hasTransform() && !this->isTransformed())) 315 this->isChecked = true; 316 317 if (!(this->hasTransform() && (!this->isGenerated()))) 318 this->isChecked = true; 319 320 321 } 322 323 // if (this->isChecked) return; 324 325 // // if (context->hasClient && !context->hasServer) 326 // // if (context->hasClient) 327 // { 328 // this->checkAttributesAfterTransformation(); 329 // this->checkMask(); 330 // this->computeIndex(); 331 // } 332 // this->isChecked = true; 333 } 316 317 if (!(this->hasTransform() && (!this->isGenerated()))) 318 this->isChecked = true; 319 320 321 } 322 323 // if (this->isChecked) return; 324 325 // // if (context->hasClient && !context->hasServer) 326 // // if (context->hasClient) 327 // { 328 // this->checkAttributesAfterTransformation(); 329 // this->checkMask(); 330 // this->computeIndex(); 331 // } 332 // this->isChecked = true; 333 } 334 334 } 335 335 … … 521 521 CContext* context = CContext::getCurrent(); 522 522 523 CContextClient* client = (context->hasServer) ? context->clientPrimServer : context->client; 524 CContextServer* server = (context->hasServer) ? context->server : 0 ; 525 int rank = (server && !client) ? server->intraCommRank : client->clientRank; 526 527 // First of all, compute distribution on client side 528 if (0 != serverDistribution_) 529 clientDistribution_ = new CDistributionClient(rank, this, serverDistribution_->getGlobalLocalIndex()); 530 else 531 clientDistribution_ = new CDistributionClient(rank, this); 532 533 // Get local data index on client 534 storeIndex_client.resize(clientDistribution_->getLocalDataIndexOnClient().size()); 535 int nbStoreIndex = storeIndex_client.numElements(); 536 for (int idx = 0; idx < nbStoreIndex; ++idx) storeIndex_client(idx) = (clientDistribution_->getLocalDataIndexOnClient())[idx]; 537 isDataDistributed_= clientDistribution_->isDataDistributed(); 523 int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1; 524 for (int i = 0; i < nbSrvPools; ++i) 525 { 526 CContextClient* client = (context->hasServer) ? context->clientPrimServer[i] : context->client; 527 CContextServer* server = (context->hasServer) ? context->server : 0 ; 528 int rank = (server && !client) ? server->intraCommRank : client->clientRank; 529 530 // First of all, compute distribution on client side 531 if (0 != serverDistribution_) 532 clientDistribution_ = new CDistributionClient(rank, this, serverDistribution_->getGlobalLocalIndex()); 533 else 534 clientDistribution_ = new CDistributionClient(rank, this); 535 536 // Get local data index on client 537 storeIndex_client.resize(clientDistribution_->getLocalDataIndexOnClient().size()); 538 int nbStoreIndex = storeIndex_client.numElements(); 539 for (int idx = 0; idx < nbStoreIndex; ++idx) storeIndex_client(idx) = (clientDistribution_->getLocalDataIndexOnClient())[idx]; 540 isDataDistributed_= clientDistribution_->isDataDistributed(); 541 } 538 542 } 539 543 … … 541 545 { 542 546 CContext* context = CContext::getCurrent(); 543 CContextClient* client = (context->hasServer) ? context->clientPrimServer : context->client; 544 545 connectedServerRank_.clear(); 546 547 if (!doGridHaveDataDistributed()) 547 int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1; 548 for (int i = 0; i < nbSrvPools; ++i) 548 549 { 549 if (client->isServerLeader()) 550 { 551 size_t ssize = clientDistribution_->getLocalDataIndexOnClient().size(); 552 const std::list<int>& ranks = client->getRanksServerLeader(); 553 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 550 CContextClient* client = (context->hasServer) ? context->clientPrimServer[i] : context->client; 551 552 connectedServerRank_.clear(); 553 554 if (!doGridHaveDataDistributed()) 555 { 556 if (client->isServerLeader()) 554 557 { 555 connectedServerRank_.push_back(*itRank); 556 connectedDataSize_[*itRank] = ssize; 558 size_t ssize = clientDistribution_->getLocalDataIndexOnClient().size(); 559 const std::list<int>& ranks = client->getRanksServerLeader(); 560 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 561 { 562 connectedServerRank_.push_back(*itRank); 563 connectedDataSize_[*itRank] = ssize; 564 } 557 565 } 558 } 559 return; 566 return; 567 } 568 569 // Compute mapping between client and server 570 std::vector<boost::unordered_map<size_t,std::vector<int> > > indexServerOnElement; 571 CServerDistributionDescription serverDistributionDescription(globalDim_, client->serverSize); 572 serverDistributionDescription.computeServerGlobalByElement(indexServerOnElement, 573 client->clientRank, 574 client->clientSize, 575 axis_domain_order, 576 positionDimensionDistributed_); 577 computeIndexByElement(indexServerOnElement, globalIndexOnServer_); 578 579 const CDistributionClient::GlobalLocalDataMap& globalLocalIndexSendToServer = clientDistribution_->getGlobalLocalDataSendToServer(); 580 CDistributionClient::GlobalLocalDataMap::const_iterator iteGlobalLocalIndexMap = globalLocalIndexSendToServer.end(), itGlobalLocalIndexMap; 581 CClientServerMapping::GlobalIndexMap::const_iterator iteGlobalMap, itbGlobalMap, itGlobalMap; 582 itGlobalMap = itbGlobalMap = globalIndexOnServer_.begin(); 583 iteGlobalMap = globalIndexOnServer_.end(); 584 585 for (; itGlobalMap != iteGlobalMap; ++itGlobalMap) 586 { 587 int serverRank = itGlobalMap->first; 588 int indexSize = itGlobalMap->second.size(); 589 const std::vector<size_t>& indexVec = itGlobalMap->second; 590 for (int idx = 0; idx < indexSize; ++idx) 591 { 592 itGlobalLocalIndexMap = globalLocalIndexSendToServer.find(indexVec[idx]); 593 if (iteGlobalLocalIndexMap != itGlobalLocalIndexMap) 594 { 595 if (connectedDataSize_.end() == connectedDataSize_.find(serverRank)) 596 connectedDataSize_[serverRank] = 1; 597 else 598 ++connectedDataSize_[serverRank]; 599 } 600 } 601 } 602 603 for (itGlobalMap = itbGlobalMap; itGlobalMap != iteGlobalMap; ++itGlobalMap) { 604 connectedServerRank_.push_back(itGlobalMap->first); 605 } 606 607 nbSenders = clientServerMap_->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_); 560 608 } 561 562 // Compute mapping between client and server563 std::vector<boost::unordered_map<size_t,std::vector<int> > > indexServerOnElement;564 CServerDistributionDescription serverDistributionDescription(globalDim_, client->serverSize);565 serverDistributionDescription.computeServerGlobalByElement(indexServerOnElement,566 client->clientRank,567 client->clientSize,568 axis_domain_order,569 positionDimensionDistributed_);570 computeIndexByElement(indexServerOnElement, globalIndexOnServer_);571 572 const CDistributionClient::GlobalLocalDataMap& globalLocalIndexSendToServer = clientDistribution_->getGlobalLocalDataSendToServer();573 CDistributionClient::GlobalLocalDataMap::const_iterator iteGlobalLocalIndexMap = globalLocalIndexSendToServer.end(), itGlobalLocalIndexMap;574 CClientServerMapping::GlobalIndexMap::const_iterator iteGlobalMap, itbGlobalMap, itGlobalMap;575 itGlobalMap = itbGlobalMap = globalIndexOnServer_.begin();576 iteGlobalMap = globalIndexOnServer_.end();577 578 for (; itGlobalMap != iteGlobalMap; ++itGlobalMap)579 {580 int serverRank = itGlobalMap->first;581 int indexSize = itGlobalMap->second.size();582 const std::vector<size_t>& indexVec = itGlobalMap->second;583 for (int idx = 0; idx < indexSize; ++idx)584 {585 itGlobalLocalIndexMap = globalLocalIndexSendToServer.find(indexVec[idx]);586 if (iteGlobalLocalIndexMap != itGlobalLocalIndexMap)587 {588 if (connectedDataSize_.end() == connectedDataSize_.find(serverRank))589 connectedDataSize_[serverRank] = 1;590 else591 ++connectedDataSize_[serverRank];592 }593 }594 }595 596 for (itGlobalMap = itbGlobalMap; itGlobalMap != iteGlobalMap; ++itGlobalMap) {597 connectedServerRank_.push_back(itGlobalMap->first);598 }599 600 nbSenders = clientServerMap_->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_);601 609 } 602 610 … … 1365 1373 { 1366 1374 CContext* context = CContext::getCurrent(); 1367 CContextServer* server = (context->hasServer) ? context->server : context->serverPrimServer;1368 CContextClient* client = (context->hasServer) ? context->client : context->clientPrimServer;1369 numberWrittenIndexes_ = totalNumberWrittenIndexes_ = offsetWrittenIndexes_ = 0;1370 connectedServerRank_ = ranks;1371 1372 for (int n = 0; n < ranks.size(); n++)1373 {1374 int rank = ranks[n]; 1375 CBufferIn& buffer = *buffers[n];1376 1377 buffer >> isDataDistributed_ >> isCompressible_;1378 size_t dataSize = 0;1379 1380 if (0 == serverDistribution_)1381 {1382 int idx = 0, numElement = axis_domain_order.numElements(); 1383 i nt ssize = numElement;1384 std::vector<int> indexMap(numElement);1385 for (int i = 0; i < numElement; ++i)1386 {1387 indexMap[i] = idx;1388 if (2 == axis_domain_order(i))1375 int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1; 1376 for (int i = 0; i < nbSrvPools; ++i) 1377 { 1378 CContextServer* server = (context->hasServer) ? context->server : context->serverPrimServer[i]; 1379 CContextClient* client = (context->hasServer) ? context->client : context->clientPrimServer[i]; 1380 numberWrittenIndexes_ = totalNumberWrittenIndexes_ = offsetWrittenIndexes_ = 0; 1381 connectedServerRank_ = ranks; 1382 1383 for (int n = 0; n < ranks.size(); n++) 1384 { 1385 int rank = ranks[n]; 1386 CBufferIn& buffer = *buffers[n]; 1387 1388 buffer >> isDataDistributed_ >> isCompressible_; 1389 size_t dataSize = 0; 1390 1391 if (0 == serverDistribution_) 1392 { 1393 int idx = 0, numElement = axis_domain_order.numElements(); 1394 int ssize = numElement; 1395 std::vector<int> indexMap(numElement); 1396 for (int i = 0; i < numElement; ++i) 1389 1397 { 1390 ++ssize; 1391 idx += 2; 1398 indexMap[i] = idx; 1399 if (2 == axis_domain_order(i)) 1400 { 1401 ++ssize; 1402 idx += 2; 1403 } 1404 else 1405 ++idx; 1392 1406 } 1393 else 1394 ++idx; 1395 } 1396 1397 int axisId = 0, domainId = 0, scalarId = 0, globalSize = 1; 1398 std::vector<CDomain*> domainList = getDomains(); 1399 std::vector<CAxis*> axisList = getAxis(); 1400 std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize), nGlobElement(numElement); 1401 std::vector<CArray<int,1> > zoomIndex; 1402 for (int i = 0; i < numElement; ++i) 1403 { 1404 nGlobElement[i] = globalSize; 1405 if (2 == axis_domain_order(i)) //domain 1407 1408 int axisId = 0, domainId = 0, scalarId = 0, globalSize = 1; 1409 std::vector<CDomain*> domainList = getDomains(); 1410 std::vector<CAxis*> axisList = getAxis(); 1411 std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize), nGlobElement(numElement); 1412 std::vector<CArray<int,1> > zoomIndex; 1413 for (int i = 0; i < numElement; ++i) 1406 1414 { 1407 // nZoomBegin[indexMap[i]] = domainList[domainId]->zoom_ibegin_srv; 1408 // nZoomSize[indexMap[i]] = domainList[domainId]->zoom_ni_srv; 1409 // nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->global_zoom_ibegin; 1410 // zoomIndex.push_back(domainList[domainId]->zoom_i_index); 1411 // nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 1412 1413 // nZoomBegin[indexMap[i] + 1] = domainList[domainId]->zoom_jbegin_srv; 1414 // nZoomSize[indexMap[i] + 1] = domainList[domainId]->zoom_nj_srv; 1415 // nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]->global_zoom_jbegin; 1416 // zoomIndex.push_back(domainList[domainId]->zoom_j_index); 1417 // nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 1418 1419 int nbZoom = domainList[domainId]->zoom_i_index.numElements(); 1420 zoomIndex.push_back(CArray<int,1>(nbZoom)); 1421 CArray<int,1>& zoomDomain = zoomIndex.back(); 1422 for (int ind = 0; ind < nbZoom; ++ind) 1415 nGlobElement[i] = globalSize; 1416 if (2 == axis_domain_order(i)) //domain 1423 1417 { 1424 zoomDomain(ind) = domainList[domainId]->zoom_i_index(ind) + domainList[domainId]->zoom_j_index(ind) * domainList[domainId]->ni_glo; 1418 // nZoomBegin[indexMap[i]] = domainList[domainId]->zoom_ibegin_srv; 1419 // nZoomSize[indexMap[i]] = domainList[domainId]->zoom_ni_srv; 1420 // nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->global_zoom_ibegin; 1421 // zoomIndex.push_back(domainList[domainId]->zoom_i_index); 1422 // nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 1423 1424 // nZoomBegin[indexMap[i] + 1] = domainList[domainId]->zoom_jbegin_srv; 1425 // nZoomSize[indexMap[i] + 1] = domainList[domainId]->zoom_nj_srv; 1426 // nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]->global_zoom_jbegin; 1427 // zoomIndex.push_back(domainList[domainId]->zoom_j_index); 1428 // nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 1429 1430 int nbZoom = domainList[domainId]->zoom_i_index.numElements(); 1431 zoomIndex.push_back(CArray<int,1>(nbZoom)); 1432 CArray<int,1>& zoomDomain = zoomIndex.back(); 1433 for (int ind = 0; ind < nbZoom; ++ind) 1434 { 1435 zoomDomain(ind) = domainList[domainId]->zoom_i_index(ind) + domainList[domainId]->zoom_j_index(ind) * domainList[domainId]->ni_glo; 1436 } 1437 1438 globalSize *= domainList[domainId]->ni_glo * domainList[domainId]->nj_glo; 1439 ++domainId; 1425 1440 } 1426 1427 globalSize *= domainList[domainId]->ni_glo * domainList[domainId]->nj_glo; 1428 ++domainId; 1441 else if (1 == axis_domain_order(i)) // axis 1442 { 1443 // nZoomBegin[indexMap[i]] = axisList[axisId]->zoom_begin_srv; 1444 // nZoomSize[indexMap[i]] = axisList[axisId]->zoom_size_srv; 1445 // nZoomBeginGlobal[indexMap[i]] = axisList[axisId]->global_zoom_begin; 1446 zoomIndex.push_back(axisList[axisId]->zoom_index); 1447 // nGlob[indexMap[i]] = axisList[axisId]->n_glo; 1448 globalSize *= axisList[axisId]->n_glo; 1449 ++axisId; 1450 } 1451 else // scalar 1452 { 1453 CArray<int,1> zoomScalar(1); 1454 zoomScalar(0) = 0; 1455 // nZoomBegin[indexMap[i]] = 0; 1456 // nZoomSize[indexMap[i]] = 1; 1457 // nZoomBeginGlobal[indexMap[i]] = 0; 1458 zoomIndex.push_back(zoomScalar); 1459 // nGlob[indexMap[i]] = 1; 1460 ++scalarId; 1461 } 1429 1462 } 1430 else if (1 == axis_domain_order(i)) // axis 1463 dataSize = 1; 1464 1465 // for (int i = 0; i < nZoomSize.size(); ++i) 1466 // dataSize *= nZoomSize[i]; 1467 // serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 1468 // nZoomBeginGlobal, nGlob); 1469 for (int i = 0; i < zoomIndex.size(); ++i) 1431 1470 { 1432 // nZoomBegin[indexMap[i]] = axisList[axisId]->zoom_begin_srv; 1433 // nZoomSize[indexMap[i]] = axisList[axisId]->zoom_size_srv; 1434 // nZoomBeginGlobal[indexMap[i]] = axisList[axisId]->global_zoom_begin; 1435 zoomIndex.push_back(axisList[axisId]->zoom_index); 1436 // nGlob[indexMap[i]] = axisList[axisId]->n_glo; 1437 globalSize *= axisList[axisId]->n_glo; 1438 ++axisId; 1471 dataSize *= zoomIndex[i].numElements(); 1439 1472 } 1440 else // scalar 1441 { 1442 CArray<int,1> zoomScalar(1); 1443 zoomScalar(0) = 0; 1444 // nZoomBegin[indexMap[i]] = 0; 1445 // nZoomSize[indexMap[i]] = 1; 1446 // nZoomBeginGlobal[indexMap[i]] = 0; 1447 zoomIndex.push_back(zoomScalar); 1448 // nGlob[indexMap[i]] = 1; 1449 ++scalarId; 1450 } 1451 } 1452 dataSize = 1; 1453 1454 // for (int i = 0; i < nZoomSize.size(); ++i) 1455 // dataSize *= nZoomSize[i]; 1456 // serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 1457 // nZoomBeginGlobal, nGlob); 1458 for (int i = 0; i < zoomIndex.size(); ++i) 1459 { 1460 dataSize *= zoomIndex[i].numElements(); 1461 } 1462 serverDistribution_ = new CDistributionServer(server->intraCommRank, zoomIndex, nGlobElement); 1463 } 1464 1465 CArray<size_t,1> outIndex; 1466 buffer >> outIndex; 1473 serverDistribution_ = new CDistributionServer(server->intraCommRank, zoomIndex, nGlobElement); 1474 } 1475 1476 CArray<size_t,1> outIndex; 1477 buffer >> outIndex; 1478 if (isDataDistributed_) 1479 serverDistribution_->computeLocalIndex(outIndex); 1480 else 1481 { 1482 dataSize = outIndex.numElements(); 1483 for (int i = 0; i < outIndex.numElements(); ++i) outIndex(i) = i; 1484 } 1485 writtenDataSize_ += dataSize; 1486 1487 outIndexFromClient.insert(std::make_pair(rank, outIndex)); 1488 connectedDataSize_[rank] = outIndex.numElements(); 1489 numberWrittenIndexes_ += outIndex.numElements(); 1490 } 1491 1492 int sizeData = 0; 1493 for (map<int, CArray<size_t, 1> >::iterator it = outIndexFromClient.begin(); it != outIndexFromClient.end(); ++it) 1494 { 1495 sizeData += it->second.numElements(); 1496 } 1497 indexFromClients.resize(sizeData); 1498 sizeData = 0; 1499 for (map<int, CArray<size_t, 1> >::iterator it = outIndexFromClient.begin(); it != outIndexFromClient.end(); ++it) 1500 { 1501 CArray<size_t, 1>& tmp0 = it->second; 1502 CArray<size_t, 1> tmp1 = indexFromClients(Range(sizeData, sizeData + tmp0.numElements() - 1)); 1503 tmp1 = tmp0; 1504 sizeData += tmp0.numElements(); 1505 } 1506 1507 // if (isScalarGrid()) return; 1508 1467 1509 if (isDataDistributed_) 1468 serverDistribution_->computeLocalIndex(outIndex); 1510 { 1511 MPI_Allreduce(&numberWrittenIndexes_, &totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 1512 MPI_Scan(&numberWrittenIndexes_, &offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 1513 offsetWrittenIndexes_ -= numberWrittenIndexes_; 1514 } 1469 1515 else 1470 { 1471 dataSize = outIndex.numElements(); 1472 for (int i = 0; i < outIndex.numElements(); ++i) outIndex(i) = i; 1473 } 1474 writtenDataSize_ += dataSize; 1475 1476 outIndexFromClient.insert(std::make_pair(rank, outIndex)); 1477 connectedDataSize_[rank] = outIndex.numElements(); 1478 numberWrittenIndexes_ += outIndex.numElements(); 1479 } 1480 1481 int sizeData = 0; 1482 for (map<int, CArray<size_t, 1> >::iterator it = outIndexFromClient.begin(); it != outIndexFromClient.end(); ++it) 1483 { 1484 sizeData += it->second.numElements(); 1485 } 1486 indexFromClients.resize(sizeData); 1487 sizeData = 0; 1488 for (map<int, CArray<size_t, 1> >::iterator it = outIndexFromClient.begin(); it != outIndexFromClient.end(); ++it) 1489 { 1490 CArray<size_t, 1>& tmp0 = it->second; 1491 CArray<size_t, 1> tmp1 = indexFromClients(Range(sizeData, sizeData + tmp0.numElements() - 1)); 1492 tmp1 = tmp0; 1493 sizeData += tmp0.numElements(); 1494 } 1495 1496 // if (isScalarGrid()) return; 1497 1498 if (isDataDistributed_) 1499 { 1500 MPI_Allreduce(&numberWrittenIndexes_, &totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 1501 MPI_Scan(&numberWrittenIndexes_, &offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 1502 offsetWrittenIndexes_ -= numberWrittenIndexes_; 1503 } 1504 else 1505 totalNumberWrittenIndexes_ = numberWrittenIndexes_; 1506 1507 nbSenders = CClientServerMappingDistributed::computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, ranks); 1516 totalNumberWrittenIndexes_ = numberWrittenIndexes_; 1517 1518 nbSenders = CClientServerMappingDistributed::computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, ranks); 1519 } 1508 1520 } 1509 1521
Note: See TracChangeset
for help on using the changeset viewer.