Ignore:
Timestamp:
01/11/17 16:50:27 (7 years ago)
Author:
oabramkina
Message:

Minor modifications in the merged version of dev.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/node/grid.cpp

    r1023 r1027  
    273273   { 
    274274     CContext* context = CContext::getCurrent(); 
    275      CContextClient* client= context->hasServer ? context->clientPrimServer : context->client; 
    276  
    277275     int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1; 
     276 
    278277     for (int i = 0; i < nbSrvPools; ++i) 
    279278     { 
    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; 
    294314         if (!(this->hasTransform() && !this->isTransformed())) 
    295315          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      } 
    334334   } 
    335335 
     
    521521     CContext* context = CContext::getCurrent(); 
    522522 
    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     } 
    538542   } 
    539543 
     
    541545   { 
    542546     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) 
    548549     { 
    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()) 
    554557          { 
    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            } 
    557565          } 
    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_); 
    560608     } 
    561  
    562      // Compute mapping between client and server 
    563      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              else 
    591                ++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_); 
    601609   } 
    602610 
     
    13651373  { 
    13661374    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         int 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) 
    13891397          { 
    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; 
    13921406          } 
    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) 
    14061414          { 
    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 
    14231417            { 
    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; 
    14251440            } 
    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            } 
    14291462          } 
    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) 
    14311470          { 
    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(); 
    14391472          } 
    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 
    14671509      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      } 
    14691515      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    } 
    15081520  } 
    15091521 
Note: See TracChangeset for help on using the changeset viewer.