Ignore:
Timestamp:
05/26/15 16:13:47 (9 years ago)
Author:
rlacroix
Message:

Add the infrastructure to request fields from the server.

This will be used to read input files so add a new file attribute mode to define whether data is written or read from a file.

Currently the data is not actually read and random data is transfered for those fields in read mode.

File:
1 edited

Legend:

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

    r595 r598  
    669669  void CGrid::recvIndex(CEventServer& event) 
    670670  { 
    671     list<CEventServer::SSubEvent>::iterator it ; 
     671    string gridId; 
     672    vector<int> ranks; 
     673    vector<CBufferIn*> buffers; 
     674 
     675    list<CEventServer::SSubEvent>::iterator it; 
    672676    for (it=event.subEvents.begin();it!=event.subEvents.end();++it) 
    673677    { 
    674       int rank=it->rank; 
    675       CBufferIn* buffer=it->buffer; 
    676       string gridId ; 
    677       *buffer>>gridId ; 
    678       get(gridId)->recvIndex(rank,*buffer) ; 
    679     } 
     678      ranks.push_back(it->rank); 
     679      CBufferIn* buffer = it->buffer; 
     680      *buffer >> gridId; 
     681      buffers.push_back(buffer); 
     682    } 
     683    get(gridId)->recvIndex(ranks, buffers) ; 
    680684  } 
    681685 
     
    748752  } 
    749753 
    750   void CGrid::recvIndex(int rank, CBufferIn& buffer) 
    751   { 
    752     CContext* context = CContext::getCurrent() ; 
    753     CContextServer* server=context->server ; 
    754     buffer>>isDataDistributed_; 
    755     size_t dataSize = 0; 
    756  
    757     if (true == scalar_grid) 
    758     { 
    759        writtenDataSize_ = 1; 
    760        CArray<size_t,1> outIndex; 
    761        buffer>>outIndex; 
    762        outIndexFromClient.insert(std::pair<int, CArray<size_t,1>* >(rank, new CArray<size_t,1>(outIndex))); 
    763        std::vector<int> nZoomBegin(1,0), nZoomSize(1,1), nGlob(1,1), nZoomBeginGlobal(1,0); 
    764        serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 
    765                                                      nZoomBeginGlobal, nGlob); 
    766        return; 
    767     } 
    768  
    769  
    770      if (0 == serverDistribution_) 
    771      { 
    772        int idx = 0, numElement = axis_domain_order.numElements(); 
    773        int ssize = numElement; 
    774        std::vector<int> indexMap(numElement); 
    775        for (int i = 0; i < numElement; ++i) 
    776        { 
    777          indexMap[i] = idx; 
    778          if (true == axis_domain_order(i)) 
    779          { 
     754  void CGrid::recvIndex(vector<int> ranks, vector<CBufferIn*> buffers) 
     755  { 
     756    CContext* context = CContext::getCurrent(); 
     757    CContextServer* server = context->server; 
     758 
     759    for (int n = 0; n < ranks.size(); n++) 
     760    { 
     761      int rank = ranks[n]; 
     762      CBufferIn& buffer = *buffers[n]; 
     763 
     764      buffer >> isDataDistributed_; 
     765      size_t dataSize = 0; 
     766 
     767      if (true == scalar_grid) 
     768      { 
     769        writtenDataSize_ = 1; 
     770        CArray<size_t,1> outIndex; 
     771        buffer >> outIndex; 
     772        outIndexFromClient.insert(std::pair<int, CArray<size_t,1>* >(rank, new CArray<size_t,1>(outIndex))); 
     773        std::vector<int> nZoomBegin(1,0), nZoomSize(1,1), nGlob(1,1), nZoomBeginGlobal(1,0); 
     774        serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 
     775                                                      nZoomBeginGlobal, nGlob); 
     776        return; 
     777      } 
     778 
     779      if (0 == serverDistribution_) 
     780      { 
     781        int idx = 0, numElement = axis_domain_order.numElements(); 
     782        int ssize = numElement; 
     783        std::vector<int> indexMap(numElement); 
     784        for (int i = 0; i < numElement; ++i) 
     785        { 
     786          indexMap[i] = idx; 
     787          if (true == axis_domain_order(i)) 
     788          { 
    780789            ++ssize; 
    781790            idx += 2; 
    782          } 
    783          else 
    784           ++idx; 
    785        } 
    786  
    787        int axisId = 0, domainId = 0; 
    788        std::vector<CDomain*> domainList = getDomains(); 
    789        std::vector<CAxis*> axisList = getAxis(); 
    790        std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize); 
    791        for (int i = 0; i < numElement; ++i) 
    792        { 
    793          if (axis_domain_order(i)) 
    794          { 
    795             nZoomBegin[indexMap[i]]   = domainList[domainId]->zoom_ibegin_srv; 
    796             nZoomSize[indexMap[i]]    = domainList[domainId]->zoom_ni_srv; 
     791          } 
     792          else 
     793            ++idx; 
     794        } 
     795 
     796        int axisId = 0, domainId = 0; 
     797        std::vector<CDomain*> domainList = getDomains(); 
     798        std::vector<CAxis*> axisList = getAxis(); 
     799        std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize); 
     800        for (int i = 0; i < numElement; ++i) 
     801        { 
     802          if (axis_domain_order(i)) 
     803          { 
     804            nZoomBegin[indexMap[i]] = domainList[domainId]->zoom_ibegin_srv; 
     805            nZoomSize[indexMap[i]]  = domainList[domainId]->zoom_ni_srv; 
    797806            nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->zoom_ibegin; 
    798             nGlob[indexMap[i]]    = domainList[domainId]->ni_glo; 
    799  
    800             nZoomBegin[indexMap[i]+1] = domainList[domainId]->zoom_jbegin_srv; 
    801             nZoomSize[indexMap[i]+1] = domainList[domainId]->zoom_nj_srv; 
    802             nZoomBeginGlobal[indexMap[i]+1] = domainList[domainId]->zoom_jbegin; 
    803             nGlob[indexMap[i]+1]    = domainList[domainId]->nj_glo; 
     807            nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 
     808 
     809            nZoomBegin[indexMap[i] + 1] = domainList[domainId]->zoom_jbegin_srv; 
     810            nZoomSize[indexMap[i] + 1] = domainList[domainId]->zoom_nj_srv; 
     811            nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]->zoom_jbegin; 
     812            nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 
    804813            ++domainId; 
    805          } 
    806          else 
    807          { 
     814          } 
     815          else 
     816          { 
    808817            nZoomBegin[indexMap[i]] = axisList[axisId]->zoom_begin_srv; 
    809818            nZoomSize[indexMap[i]]  = axisList[axisId]->zoom_size_srv; 
    810819            nZoomBeginGlobal[indexMap[i]] = axisList[axisId]->zoom_begin; 
    811             nGlob[indexMap[i]]      = axisList[axisId]->size; 
     820            nGlob[indexMap[i]] = axisList[axisId]->size; 
    812821            ++axisId; 
    813          } 
    814        } 
    815        dataSize = 1; 
    816        for (int i = 0; i < nZoomSize.size(); ++i) 
    817         dataSize *= nZoomSize[i]; 
    818  
    819        serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 
    820                                                      nZoomBeginGlobal, nGlob); 
    821      } 
    822  
    823      CArray<size_t,1> outIndex; 
    824      buffer>>outIndex; 
    825      if (isDataDistributed_) 
    826       serverDistribution_->computeLocalIndex(outIndex); 
    827      else 
    828      { 
    829        dataSize = outIndex.numElements(); 
    830        for (int i = 0; i < outIndex.numElements(); ++i) outIndex(i) = i; 
    831      } 
    832      writtenDataSize_ += dataSize; 
    833  
    834      outIndexFromClient.insert(std::pair<int, CArray<size_t,1>* >(rank, new CArray<size_t,1>(outIndex))); 
     822          } 
     823        } 
     824        dataSize = 1; 
     825        for (int i = 0; i < nZoomSize.size(); ++i) 
     826          dataSize *= nZoomSize[i]; 
     827 
     828        serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, 
     829                                                      nZoomBeginGlobal, nGlob); 
     830      } 
     831 
     832      CArray<size_t,1> outIndex; 
     833      buffer >> outIndex; 
     834      if (isDataDistributed_) 
     835        serverDistribution_->computeLocalIndex(outIndex); 
     836      else 
     837      { 
     838        dataSize = outIndex.numElements(); 
     839        for (int i = 0; i < outIndex.numElements(); ++i) outIndex(i) = i; 
     840      } 
     841      writtenDataSize_ += dataSize; 
     842 
     843      outIndexFromClient.insert(std::pair<int, CArray<size_t,1>* >(rank, new CArray<size_t,1>(outIndex))); 
     844      connectedDataSize_[rank] = outIndex.numElements(); 
     845    } 
     846 
     847    nbSenders = CClientServerMappingDistributed::computeConnectedClients(context->client->serverSize, context->client->clientSize, context->client->intraComm, ranks); 
    835848  } 
    836849 
Note: See TracChangeset for help on using the changeset viewer.