Ignore:
Timestamp:
03/10/15 10:49:13 (9 years ago)
Author:
mhnguyen
Message:

Correct some bugs on discovering server index and do some code cleanings

+) Add some checking functions to make sure mpi_isend and mpi_irecv work correctly
+) Add comments to code
+) Remove some redundant code and comments

Test
+) On Curie
+) The new functions are tested in test_new_features.f90. Test_client and test_complete work like before
+) Test cases:

  • 3 dimension grid with: 1 domain, 1 axis
  • 3 dimension grid with: 3 axis
  • Attached and connected

+) All pass and results are correct

TODO:
+) Fix zoom bug with grid composed of only one axis

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/domain.cpp

    r553 r569  
    1515#include "array_new.hpp" 
    1616#include "server_distribution_description.hpp" 
     17#include "client_server_mapping_distributed.hpp" 
    1718 
    1819namespace xios { 
     
    667668    int zoom_jend=zoom_jbegin+zoom_nj-1 ; 
    668669 
    669     std::vector<int> nGlobDomain(2); 
    670     nGlobDomain[0] = ni_glo.getValue(); 
    671     nGlobDomain[1] = nj_glo.getValue(); 
    672     CServerDistributionDescription serverDescription(nGlobDomain); 
    673     serverDescription.computeServerDistribution(nbServer, doComputeGlobalIndexServer); 
    674670 
    675671    // Precompute number of index 
     
    706702      } 
    707703 
    708     CClientServerMapping clientServerMap; 
    709     clientServerMap.computeServerIndexMapping(globalIndexDomain, serverDescription.getGlobalIndex()); 
    710     const std::map<int, std::vector<size_t> >& globalIndexDomainOnServer = clientServerMap.getGlobalIndexOnServer(); 
     704     std::vector<int> nGlobDomain(2); 
     705     nGlobDomain[0] = ni_glo.getValue(); 
     706     nGlobDomain[1] = nj_glo.getValue(); 
     707     size_t globalSizeIndex = 1, indexBegin, indexEnd; 
     708     int range, clientSize = client->clientSize; 
     709     for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 
     710     indexBegin = 0; 
     711     for (int i = 0; i < clientSize; ++i) 
     712     { 
     713       range = globalSizeIndex / clientSize; 
     714       if (i < (globalSizeIndex%clientSize)) ++range; 
     715       if (i == client->clientRank) break; 
     716       indexBegin += range; 
     717     } 
     718     indexEnd = indexBegin + range - 1; 
     719 
     720    CServerDistributionDescription serverDescription(nGlobDomain); 
     721    serverDescription.computeServerGlobalIndexInRange(nbServer, std::make_pair<size_t,size_t>(indexBegin, indexEnd)); 
     722    CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), 
     723                                                                                client->intraComm); 
     724    clientServerMap->computeServerIndexMapping(globalIndexDomain); 
     725    const std::map<int, std::vector<size_t> >& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 
    711726    std::vector<int> connectedServerRank; 
    712727    for (std::map<int, std::vector<size_t> >::const_iterator it = globalIndexDomainOnServer.begin(); it != globalIndexDomainOnServer.end(); ++it) { 
    713728      connectedServerRank.push_back(it->first); 
    714729    } 
    715     nbConnectedClients_ = clientServerMap.computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank); 
     730    nbConnectedClients_ = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank); 
    716731    indSrv_ = globalIndexDomainOnServer; 
     732 
     733    delete clientServerMap; 
    717734  } 
    718735 
Note: See TracChangeset for help on using the changeset viewer.