Ignore:
Timestamp:
09/10/20 13:51:02 (4 years ago)
Author:
ymipsl
Message:

Big update on on going work related to data distribution and transfer between clients and servers.
Revisite of the source and store filter using "connectors".

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/scatterer_connector.hpp

    r1918 r1930  
    3434    void computeConnector(void) ; 
    3535     
    36     template<typename T> 
    37     void transfer(const CArray<T,1>& dataIn, map<int, CArray<T,1>>& dataOut) 
     36    template<typename T, int n> 
     37    void transfer(const CArray<T,n>& dataIn, map<int, CArray<T,1>>& dataOut) 
    3838    { 
     39      transfer(1, dataIn, dataOut) ; 
     40    } 
     41 
     42    template<typename T, int n> 
     43    void transfer(const CArray<T,n>& dataIn, map<int, CArray<T,1>>& dataOut, T missingValue) 
     44    { 
     45      transfer(1, dataIn, dataOut, missingValue) ; 
     46    } 
     47 
     48    template<typename T, int n> 
     49    void transfer(int sizeT, const CArray<T,n>& dataIn, map<int, CArray<T,1>>& dataOut) 
     50    { 
     51      // for future, make a specific transfer function for sizeT=1 to avoid multiplication (increasing performance) 
    3952      for(auto& rankConnector : connector_) 
    4053      { 
     
    4457        int dstSize = mask.size() ; 
    4558        auto& data = dataOut[rank] ; 
    46         data.resize(dstSize) ; 
     59        data.resize(dstSize * sizeT) ; 
    4760        T* dstData = data.dataFirst() ; 
    4861        const T* srcData = dataIn.dataFirst() ; 
     
    5063          if (mask[i])  
    5164          { 
    52             dstData[i] = srcData[connector[j]] ; 
     65            for(int k=0;k<sizeT;k++) dstData[i*sizeT+k] = srcData[connector[j]*sizeT+k] ; 
     66            j++ ; 
     67          } 
     68      } 
     69    } 
     70 
     71    template<typename T, int n> 
     72    void transfer(int sizeT, const CArray<T,n>& dataIn, map<int, CArray<T,1>>& dataOut, T missingValue) 
     73    { 
     74      // for future, make a specific transfer function for sizeT=1 to avoid multiplication (increasing performance) 
     75      for(auto& rankConnector : connector_) 
     76      { 
     77        int rank = rankConnector.first ; 
     78        auto& connector = rankConnector.second ; 
     79        auto& mask = mask_[rank] ; 
     80        int dstSize = mask.size() ; 
     81        auto& data = dataOut[rank] ; 
     82        data.resize(dstSize * sizeT) ; 
     83        T* dstData = data.dataFirst() ; 
     84        const T* srcData = dataIn.dataFirst() ; 
     85        for(int i=0, j=0; i<dstSize; i++) 
     86          if (mask[i])  
     87          { 
     88            for(int k=0;k<sizeT;k++) dstData[i*sizeT+k] = srcData[connector[j]*sizeT+k] ; 
     89            j++ ; 
     90          } 
     91          else  
     92          { 
     93            for(int k=0;k<sizeT;k++) dstData[i*sizeT+k] = missingValue ; 
    5394            j++ ; 
    5495          } 
     
    5697    } 
    5798     
    58     template<typename T> 
    59     void transfer(const CArray<T,1>& dataIn, CContextClient* client, CEventClient& event, const CMessage& messageHeader) 
     99    template<typename T,int n> 
     100    void transfer(const CArray<T,n>& dataIn, CContextClient* client, CEventClient& event, const CMessage& messageHeader) 
     101    { 
     102      transfer(1, dataIn, client, event, messageHeader) ; 
     103    } 
     104 
     105    template<typename T,int n> 
     106    void transfer(const CArray<T,n>& dataIn, T missingValue, CContextClient* client, CEventClient& event, const CMessage& messageHeader) 
     107    { 
     108      transfer(1, dataIn, missingValue, client, event, messageHeader) ; 
     109    } 
     110 
     111    template<typename T, int n> 
     112    void transfer(int sizeT, const CArray<T,n>& dataIn, CContextClient* client, CEventClient& event, const CMessage& messageHeader) 
    60113    { 
    61114      map<int, CArray<T,1>> dataOut ; 
    62       transfer(dataIn, dataOut) ; 
     115      transfer(sizeT, dataIn, dataOut) ; 
     116      sendToServer(dataOut, client, event, messageHeader) ; 
     117    } 
     118 
     119    template<typename T, int n> 
     120    void transfer(int sizeT, const CArray<T,n>& dataIn, T missingValue, CContextClient* client, CEventClient& event, const CMessage& messageHeader) 
     121    { 
     122      map<int, CArray<T,1>> dataOut ; 
     123      transfer(sizeT, dataIn, dataOut, missingValue) ; 
    63124      sendToServer(dataOut, client, event, messageHeader) ; 
    64125    } 
Note: See TracChangeset for help on using the changeset viewer.