Ignore:
Timestamp:
05/11/17 18:25:20 (7 years ago)
Author:
mhnguyen
Message:

Updating two-level server.
Each client now can play the role of server: It can forward data to other clients or write data like a server.
Each client must combine all data received from other client(s) before forward them or write them on files

+) Correct some bugs of exchange data_index in domain and axis
+) Reorder some functions in context.cpp to make sure that all necessary attributes are available before computing index
+) Add the mapping index for client to write data.

Test
+) On Curie
+) test_client and test_complete
+) Mode:

  • Only one level: Correct
  • Two levels: Work if using ddt (bug)

+) Only zoom is tested but other transformations should work
+) No reading test

File:
1 edited

Legend:

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

    r1099 r1129  
    3535      , nstep(0), nstepMax(0) 
    3636      , hasOutputFile(false) 
    37       , domAxisScalarIds_(vector<StdString>(3,"")), areAllReferenceSolved(false), isReferenceSolved(false) 
     37      , domAxisScalarIds_(vector<StdString>(3,"")) 
     38      , areAllReferenceSolved(false), isReferenceSolved(false), isReferenceSolvedAndTransformed(false) 
    3839      , useCompressedOutput(false) 
    3940      , wasDataAlreadyReceivedFromServer(false) 
     
    4647      , nstep(0), nstepMax(0) 
    4748      , hasOutputFile(false) 
    48       , domAxisScalarIds_(vector<StdString>(3,"")), areAllReferenceSolved(false), isReferenceSolved(false) 
     49      , domAxisScalarIds_(vector<StdString>(3,"")) 
     50      , areAllReferenceSolved(false), isReferenceSolved(false), isReferenceSolvedAndTransformed(false) 
    4951      , useCompressedOutput(false) 
    5052      , wasDataAlreadyReceivedFromServer(false) 
     
    257259    size_t sizeData = 0; 
    258260    if (0 == recvDataSrv.numElements()) 
    259     {       
    260       for (map<int, CArray<size_t, 1> >::iterator it = grid->outIndexFromClient.begin(); it != grid->outIndexFromClient.end(); ++it) 
    261       { 
    262         sizeData += it->second.numElements(); 
    263         data_srv.insert(std::make_pair(it->first, CArray<double,1>(it->second.numElements()))); 
    264       } 
     261    {             
     262      CArray<int,1>& storeClient = grid->storeIndex_client; 
     263      // for (map<int, CArray<size_t, 1> >::iterator it = grid->outIndexFromClient.begin(); it != grid->outIndexFromClient.end(); ++it) 
     264      // { 
     265      //   // sizeData += it->second.numElements(); 
     266      //   data_srv.insert(std::make_pair(it->first, CArray<double,1>(it->second.numElements()))); 
     267      // } 
     268 
     269      // for (map<int, CArray<size_t, 1> >::iterator it = grid->outLocalIndexStoreOnClient.begin(); it != grid->outLocalIndexStoreOnClient.end(); ++it) 
     270      // { 
     271      //   // sizeData += it->second.numElements(); 
     272      //   data_srv.insert(std::make_pair(it->first, CArray<double,1>(it->second.numElements()))); 
     273      // } 
    265274 
    266275      // Gather all data from different clients 
    267       recvDataSrv.resize(sizeData); 
     276      // recvDataSrv.resize(sizeData); 
     277      recvDataSrv.resize(storeClient.numElements()); 
    268278      recvFoperationSrv = boost::shared_ptr<func::CFunctor>(new func::CInstant(recvDataSrv)); 
    269279    } 
     
    276286    if (opeDate <= currDate) 
    277287    { 
    278       for (map<int, CArray<size_t, 1> >::iterator it = grid->outIndexFromClient.begin(); it != grid->outIndexFromClient.end(); ++it) 
    279       {         
     288       for (map<int, CArray<size_t, 1> >::iterator it = grid->outLocalIndexStoreOnClient.begin(); it != grid->outLocalIndexStoreOnClient.end(); ++it) 
     289      { 
    280290        CArray<double,1> tmp; 
    281291        CArray<size_t,1>& indexTmp = it->second; 
     
    288298        // sizeData += it->second.numElements();       
    289299      } 
     300 
     301      // for (map<int, CArray<size_t, 1> >::iterator it = grid->outIndexFromClient.begin(); it != grid->outIndexFromClient.end(); ++it) 
     302      // {         
     303      //   CArray<double,1> tmp; 
     304      //   CArray<size_t,1>& indexTmp = it->second; 
     305      //   *(rankBuffers[it->first]) >> tmp; 
     306      //   for (int idx = 0; idx < indexTmp.numElements(); ++idx) 
     307      //   { 
     308      //     recv_data_tmp(indexTmp(idx)) = tmp(idx); 
     309      //   } 
     310      //   // recv_data_tmp(Range(sizeData,sizeData+it->second.numElements()-1)) = tmp;   
     311      //   // sizeData += it->second.numElements();       
     312      // } 
    290313    } 
    291314 
     
    316339      recvFoperationSrv->final(); 
    317340      last_Write_srv = writeDate; 
     341      grid->computeWrittenIndex(); 
    318342      writeField(); 
    319343      lastlast_Write_srv = last_Write_srv; 
     
    813837   } 
    814838    
    815    void CField::solveAllEnabledFields() 
     839   /*! 
     840     Solve reference of all enabled fields even the source fields . 
     841     In this step, we do transformations. 
     842   */ 
     843   void CField::solveAllEnabledFieldsAndTransform() 
    816844   { 
    817845     CContext* context = CContext::getCurrent(); 
     
    819847     bool hasServer = context->hasServer; 
    820848 
    821      if (!isReferenceSolved) 
    822      { 
    823         isReferenceSolved = true; 
     849     if (!isReferenceSolvedAndTransformed) 
     850     { 
     851        isReferenceSolvedAndTransformed = true; 
    824852 
    825853        if (hasClient && !hasServer) 
    826854        { 
    827855          solveRefInheritance(true); 
    828           if (hasDirectFieldReference()) getDirectFieldReference()->solveAllEnabledFields(); 
     856          if (hasDirectFieldReference()) getDirectFieldReference()->solveAllEnabledFieldsAndTransform(); 
    829857        } 
    830858 
     
    9921020   { 
    9931021     // if (!areAllReferenceSolved) solveAllReferenceEnabledField(false); 
    994     if (!isReferenceSolved) solveAllEnabledFields(); 
     1022    if (!isReferenceSolvedAndTransformed) solveAllEnabledFieldsAndTransform(); 
    9951023     CContext* context = CContext::getCurrent(); 
    9961024     bool hasWriterServer = context->hasServer && !context->hasClient; 
     
    14281456   void CField::outputField(CArray<double,1>& fieldOut) 
    14291457   { 
    1430       map<int, CArray<double,1> >::iterator it; 
    1431        
    1432       fieldOut = recvDataSrv; 
    1433        
     1458      map<int, CArray<double,1> >::iterator it;       
     1459      
     1460      CArray<size_t,1>& outIndexClient = grid->localIndexToWriteOnClient; 
     1461      CArray<size_t,1>& outIndexServer = grid->localIndexToWriteOnServer; 
     1462      for (size_t idx = 0; idx < outIndexServer.numElements(); ++idx) 
     1463      { 
     1464        fieldOut(outIndexServer(idx)) = recvDataSrv(outIndexClient(idx)); 
     1465      } 
     1466 
    14341467      // for (it = data_srv.begin(); it != data_srv.end(); it++) 
    14351468      // { 
Note: See TracChangeset for help on using the changeset viewer.