Changeset 1940 for XIOS


Ignore:
Timestamp:
09/24/20 12:12:53 (4 years ago)
Author:
ymipsl
Message:

Xios coupling branch

  • Update connectors mechanism for scalar, similarly for domain and axis
  • add mask attribute to scalar

YM

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/config/scalar_attribute.conf

    r1493 r1940  
    88 
    99/* LOCAL and GLOBAL*/ 
     10DECLARE_ATTRIBUTE(bool, mask, false) 
    1011DECLARE_ATTRIBUTE(double, value) 
    1112DECLARE_ATTRIBUTE(StdString, bounds_name) 
    1213DECLARE_ARRAY(double, 1 , bounds) 
     14 
    1315 
    1416DECLARE_ATTRIBUTE(StdString, scalar_ref) 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp

    r1938 r1940  
    32663266    std::vector<CDomain*> domainList = this->getDomains(); 
    32673267    std::vector<CAxis*> axisList = this->getAxis(); 
     3268    std::vector<CScalar*> scalarList = this->getScalars(); 
    32683269    auto domain=domainList.begin() ; 
    32693270    auto axis=axisList.begin() ; 
     3271    auto scalar=scalarList.begin() ; 
    32703272    vector<CLocalElement*> elements; 
    32713273    for(auto order : order_) 
     
    32833285      else if (order==0) 
    32843286      {  
     3287        elements.push_back((*scalar)->getLocalElement()); 
     3288        scalar++ ; 
    32853289      } 
    32863290    } 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp

    r1934 r1940  
    99#include "context.hpp" 
    1010 
    11 namespace xios { 
    12  
    13    /// ////////////////////// Définitions ////////////////////// /// 
    14  
    15    CScalar::CScalar(void) 
    16       : CObjectTemplate<CScalar>() 
    17       , CScalarAttributes() 
    18       , relFiles() 
    19    { /* Ne rien faire de plus */ } 
    20  
    21    CScalar::CScalar(const StdString & id) 
    22       : CObjectTemplate<CScalar>(id) 
    23       , CScalarAttributes() 
    24       , relFiles() 
    25    { /* Ne rien faire de plus */ } 
    26  
    27    CScalar::~CScalar(void) 
    28    { /* Ne rien faire de plus */ } 
    29  
    30    std::map<StdString, ETranformationType> CScalar::transformationMapList_ = std::map<StdString, ETranformationType>(); 
    31    bool CScalar::dummyTransformationMapList_ = CScalar::initializeTransformationMap(CScalar::transformationMapList_); 
    32    bool CScalar::initializeTransformationMap(std::map<StdString, ETranformationType>& m) 
    33    { 
    34      m["reduce_axis"]   = TRANS_REDUCE_AXIS_TO_SCALAR; 
    35      m["extract_axis"]  = TRANS_EXTRACT_AXIS_TO_SCALAR; 
    36      m["reduce_domain"] = TRANS_REDUCE_DOMAIN_TO_SCALAR; 
    37      m["reduce_scalar"] = TRANS_REDUCE_SCALAR_TO_SCALAR; 
    38    } 
    39  
    40    StdString CScalar::GetName(void)   { return (StdString("scalar")); } 
    41    StdString CScalar::GetDefName(void){ return (CScalar::GetName()); } 
    42    ENodeType CScalar::GetType(void)   { return (eScalar); } 
    43  
    44    CScalar* CScalar::createScalar() 
    45    { 
    46      CScalar* scalar = CScalarGroup::get("scalar_definition")->createChild(); 
    47      return scalar; 
    48    } 
    49  
    50    bool CScalar::IsWritten(const StdString & filename) const 
    51    { 
    52       return (this->relFiles.find(filename) != this->relFiles.end()); 
    53    } 
    54  
    55    void CScalar::addRelFile(const StdString& filename) 
    56    { 
     11namespace xios  
     12{ 
     13 
     14  /// ////////////////////// Définitions ////////////////////// /// 
     15 
     16  CScalar::CScalar(void) 
     17     : CObjectTemplate<CScalar>() 
     18     , CScalarAttributes() 
     19     , relFiles() 
     20  { /* Ne rien faire de plus */ } 
     21 
     22  CScalar::CScalar(const StdString & id) 
     23     : CObjectTemplate<CScalar>(id) 
     24     , CScalarAttributes() 
     25     , relFiles() 
     26  { /* Ne rien faire de plus */ } 
     27 
     28  CScalar::~CScalar(void) 
     29  { /* Ne rien faire de plus */ } 
     30 
     31  std::map<StdString, ETranformationType> CScalar::transformationMapList_ = std::map<StdString, ETranformationType>(); 
     32  bool CScalar::dummyTransformationMapList_ = CScalar::initializeTransformationMap(CScalar::transformationMapList_); 
     33  bool CScalar::initializeTransformationMap(std::map<StdString, ETranformationType>& m) 
     34  { 
     35    m["reduce_axis"]   = TRANS_REDUCE_AXIS_TO_SCALAR; 
     36    m["extract_axis"]  = TRANS_EXTRACT_AXIS_TO_SCALAR; 
     37    m["reduce_domain"] = TRANS_REDUCE_DOMAIN_TO_SCALAR; 
     38    m["reduce_scalar"] = TRANS_REDUCE_SCALAR_TO_SCALAR; 
     39  } 
     40 
     41  StdString CScalar::GetName(void)   { return (StdString("scalar")); } 
     42  StdString CScalar::GetDefName(void){ return (CScalar::GetName()); } 
     43  ENodeType CScalar::GetType(void)   { return (eScalar); } 
     44 
     45  CScalar* CScalar::createScalar() 
     46  { 
     47    CScalar* scalar = CScalarGroup::get("scalar_definition")->createChild(); 
     48    return scalar; 
     49  } 
     50 
     51  bool CScalar::IsWritten(const StdString & filename) const 
     52  { 
     53    return (this->relFiles.find(filename) != this->relFiles.end()); 
     54  } 
     55 
     56  void CScalar::addRelFile(const StdString& filename) 
     57  { 
    5758      this->relFiles.insert(filename); 
    58    } 
    59  
    60    void CScalar::checkAttributes(void) 
    61    { 
    62       if (checkAttributes_done_) return ; 
    63  
    64       checkAttributes_done_ = true ;  
    65    } 
     59  } 
     60 
     61  void CScalar::checkAttributes(void) 
     62  { 
     63    if (checkAttributes_done_) return ; 
     64    checkAttributes_done_ = true ;  
     65 
     66    if (mask.isEmpty()) mask=true ; 
     67 
     68    initializeLocalElement() ; 
     69    addFullView() ; 
     70    addWorkflowView() ; 
     71    addModelView() ; 
     72  } 
    6673 
    6774  void CScalar::checkAttributesOnClient() 
     
    243250      CArray<size_t,1> ind(1) ; 
    244251      ind(0)=0 ; 
    245  
    246252      localElement_ = new CLocalElement(rank, 1, ind) ; 
    247253   } 
     
    256262   void CScalar::addWorkflowView(void) 
    257263   { 
    258      CArray<int,1> index(1) ; 
    259      for(int i=0; i<1 ; i++) index(0)=0 ; 
    260      localElement_ -> addView(CElementView::WORKFLOW, index) ; 
     264      CArray<int,1> index ; 
     265      if (mask)  
     266      { 
     267        index.resize(1) ; 
     268        index(0)=0 ; 
     269      } 
     270      else index.resize(0) ; 
     271      localElement_ -> addView(CElementView::WORKFLOW, index) ; 
    261272   } 
    262273 
     
    277288 
    278289 
    279    void CScalar::computeRemoteElement(CContextClient* client, EDistributionType type) 
     290  void CScalar::computeRemoteElement(CContextClient* client, EDistributionType type) 
    280291  { 
    281292    CContext* context = CContext::getCurrent(); 
     
    284295    int nbServer = client->serverSize; 
    285296    size_t nglo=1 ; 
    286     CArray<size_t,1> indGlo ; 
     297    CArray<size_t,1> indGlo(nglo) ; 
    287298    for(size_t i=0;i<nglo;i++) indGlo(i) = i ; 
    288     for (auto& rankServer : client->getRanksServerLeader()) globalIndex[rankServer] = indGlo ;  
     299    for (auto& rankServer : client->getRanksServerLeader()) globalIndex[rankServer].reference(indGlo.copy()) ;  
    289300 
    290301    remoteElement_[client] = new CDistributedElement(nglo, globalIndex) ; 
     
    292303  } 
    293304  
    294   void CScalar::distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex) 
    295   { 
     305  void CScalar::distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex,  const string& scalarId) 
     306  { 
     307    
     308    string serverScalarId = scalarId.empty() ? this->getId() : scalarId ; 
    296309    CContext* context = CContext::getCurrent(); 
     310 
     311    this->sendAllAttributesToServer(client, serverScalarId)  ; 
     312 
    297313    CDistributedElement scatteredElement(1,globalIndex) ; 
    298     clientToServerConnector_[client] = new CScattererConnector(localElement_->getView(CElementView::FULL), scatteredElement.getView(CElementView::FULL),  
    299                                                                context->getIntraComm()) ; 
    300     clientToServerConnector_[client] ->computeConnector() ; 
    301  
    302 // need to be completed     
    303  
    304   } 
     314    scatteredElement.addFullView() ; 
     315    CScattererConnector scattererConnector(localElement_->getView(CElementView::FULL), scatteredElement.getView(CElementView::FULL), context->getIntraComm()) ; 
     316    scattererConnector.computeConnector() ; 
     317     
     318    // phase 0 
     319    // send remote element to construct the full view on server, ie without hole  
     320    CEventClient event0(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 
     321    CMessage message0 ; 
     322    message0<<serverScalarId<<0 ;  
     323    remoteElement_[client]->sendToServer(client,event0,message0) ;  
     324     
     325    // phase 1 
     326    // send the full view of element to construct the connector which connect distributed data coming from client to the full local view 
     327    CEventClient event1(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 
     328    CMessage message1 ; 
     329    message1<<serverScalarId<<1<<localElement_->getView(CElementView::FULL)->getGlobalSize() ;  
     330    scattererConnector.transfer(localElement_->getView(CElementView::FULL)->getGlobalIndex(),client,event1,message1) ; 
     331 
     332    sendDistributedAttributes(client, scattererConnector, scalarId) ; 
     333   
     334    // phase 2 send the mask : data index + mask2D 
     335    CArray<bool,1> maskIn(localElement_->getView(CElementView::WORKFLOW)->getSize()); 
     336    CArray<bool,1> maskOut ; 
     337    CLocalConnector workflowToFull(localElement_->getView(CElementView::WORKFLOW), localElement_->getView(CElementView::FULL)) ; 
     338    workflowToFull.computeConnector() ; 
     339    maskIn=true ; 
     340    workflowToFull.transfer(maskIn,maskOut,false) ; 
     341 
     342    // phase 3 : prepare grid scatterer connector to send data from client to server 
     343    map<int,CArray<size_t,1>> workflowGlobalIndex ; 
     344    map<int,CArray<bool,1>> maskOut2 ;  
     345    scattererConnector.transfer(maskOut, maskOut2) ; 
     346    scatteredElement.addView(CElementView::WORKFLOW, maskOut2) ; 
     347    scatteredElement.getView(CElementView::WORKFLOW)->getGlobalIndexView(workflowGlobalIndex) ; 
     348    // create new workflow view for scattered element 
     349    CDistributedElement clientToServerElement(scatteredElement.getGlobalSize(), workflowGlobalIndex) ; 
     350    clientToServerElement.addFullView() ; 
     351    CEventClient event2(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 
     352    CMessage message2 ; 
     353    message2<<serverScalarId<<2 ;  
     354    clientToServerElement.sendToServer(client, event2, message2) ;  
     355    clientToServerConnector_[client] = new CScattererConnector(localElement_->getView(CElementView::WORKFLOW), 
     356                                                              clientToServerElement.getView(CElementView::FULL), context->getIntraComm()) ; 
     357    clientToServerConnector_[client]->computeConnector() ; 
     358 
     359 
     360    CEventClient event3(getType(), EVENT_ID_SCALAR_DISTRIBUTION); 
     361    CMessage message3 ; 
     362    message3<<serverScalarId<<3 ;  
     363    clientToServerConnector_[client]->transfer(maskIn,client,event3,message3) ;  
     364 
     365    clientFromServerConnector_[client] = new CGathererConnector(clientToServerElement.getView(CElementView::FULL), localElement_->getView(CElementView::WORKFLOW)); 
     366    clientFromServerConnector_[client]->computeConnector() ; 
     367 
     368  } 
     369   
     370  void CScalar::recvScalarDistribution(CEventServer& event) 
     371  TRY 
     372  { 
     373    string scalarId; 
     374    int phasis ; 
     375    for (auto& subEvent : event.subEvents) (*subEvent.buffer) >> scalarId >> phasis ; 
     376    get(scalarId)->receivedScalarDistribution(event, phasis); 
     377  } 
     378  CATCH 
     379   
     380  void CScalar::receivedScalarDistribution(CEventServer& event, int phasis) 
     381  TRY 
     382  { 
     383    CContext* context = CContext::getCurrent(); 
     384    if (phasis==0) // receive the remote element to construct the full view 
     385    { 
     386      localElement_ = new  CLocalElement(context->getIntraCommRank(),event) ; 
     387      localElement_->addFullView() ; 
     388      // construct the local dimension and indexes 
     389      auto& globalIndex=localElement_->getGlobalIndex() ; 
     390      int nk=globalIndex.numElements() ; 
     391      // no distribution for scalar => nk ==1 or maybe 0 ? 
     392    } 
     393    else if (phasis==1) // receive the sent view from client to construct the full distributed full view on server 
     394    { 
     395      CContext* context = CContext::getCurrent(); 
     396      CDistributedElement* elementFrom = new  CDistributedElement(event) ; 
     397      elementFrom->addFullView() ; 
     398      gathererConnector_ = new CGathererConnector(elementFrom->getView(CElementView::FULL), localElement_->getView(CElementView::FULL)) ; 
     399      gathererConnector_->computeConnector() ;  
     400    } 
     401    else if (phasis==2) 
     402    { 
     403      delete gathererConnector_ ; 
     404      elementFrom_ = new  CDistributedElement(event) ; 
     405      elementFrom_->addFullView() ; 
     406      gathererConnector_ =  new CGathererConnector(elementFrom_->getView(CElementView::FULL), localElement_->getView(CElementView::FULL)) ; 
     407      gathererConnector_ -> computeConnector() ; 
     408    } 
     409    else if (phasis==3) 
     410    { 
     411      CArray<bool,1> localMask ; 
     412      gathererConnector_->transfer(event,localMask,false) ; 
     413      localElement_->addView(CElementView::WORKFLOW, localMask) ; 
     414      mask = localMask(0) ; 
     415        
     416      serverFromClientConnector_ = new CGathererConnector(elementFrom_->getView(CElementView::FULL), localElement_->getView(CElementView::WORKFLOW)) ; 
     417      serverFromClientConnector_->computeConnector() ; 
     418 
     419      serverToClientConnector_ = new CScattererConnector(localElement_->getView(CElementView::WORKFLOW), elementFrom_->getView(CElementView::FULL), 
     420                                                         context->getIntraComm()) ; 
     421      serverToClientConnector_->computeConnector() ; 
     422 
     423    } 
     424  } 
     425  CATCH 
     426 
     427  void CScalar::sendDistributedAttributes(CContextClient* client, CScattererConnector& scattererConnector, const string& scalarId) 
     428  { 
     429    string serverScalarId = scalarId.empty() ? this->getId() : scalarId ; 
     430    CContext* context = CContext::getCurrent(); 
     431 
     432    // nothing for now 
     433  } 
     434 
     435  void CScalar::recvDistributedAttributes(CEventServer& event) 
     436  TRY 
     437  { 
     438    string scalarId; 
     439    string type ; 
     440    for (auto& subEvent : event.subEvents) (*subEvent.buffer) >> scalarId >> type ; 
     441    get(scalarId)->recvDistributedAttributes(event, type); 
     442  } 
     443  CATCH 
     444 
     445  void CScalar::recvDistributedAttributes(CEventServer& event, const string& type) 
     446  TRY 
     447  { 
     448    // nothing for now 
     449  } 
     450  CATCH   
     451 
     452  bool CScalar::dispatchEvent(CEventServer& event) 
     453  TRY 
     454  { 
     455     if (SuperClass::dispatchEvent(event)) return true; 
     456     else 
     457     { 
     458       switch(event.type) 
     459       { 
     460          case EVENT_ID_SCALAR_DISTRIBUTION: 
     461            recvScalarDistribution(event); 
     462            return true; 
     463            break; 
     464          case EVENT_ID_SEND_DISTRIBUTED_ATTRIBUTE: 
     465            recvDistributedAttributes(event); 
     466            return true; 
     467            break; 
     468          default : 
     469            ERROR("bool CScalar::dispatchEvent(CEventServer& event)", 
     470                   << "Unknown Event"); 
     471          return false; 
     472        } 
     473     } 
     474  } 
     475  CATCH 
    305476 
    306477 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp

    r1934 r1940  
    4141         , public CScalarAttributes 
    4242      { 
     43           friend class CScalarGroup; 
     44 
    4345            /// typedef /// 
    4446            typedef CObjectTemplate<CScalar>   SuperClass; 
    4547            typedef CScalarAttributes SuperClassAttribute; 
    4648 
    47             friend class CScalarGroup; 
     49         public: 
     50           enum EEventId 
     51           { 
     52             EVENT_ID_SCALAR_DISTRIBUTION, 
     53             EVENT_ID_SEND_DISTRIBUTED_ATTRIBUTE, 
     54           } ; 
     55           static bool dispatchEvent(CEventServer& event);       
     56            
    4857 
    4958         public : 
     
    166175       public: 
    167176         void computeRemoteElement(CContextClient* client, EDistributionType) ; 
    168          void distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex) ; 
     177         void distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex, const string& scalarId="") ; 
     178         static void recvScalarDistribution(CEventServer& event) ; 
     179         void receivedScalarDistribution(CEventServer& event, int phasis) ; 
     180         void sendDistributedAttributes(CContextClient* client, CScattererConnector& scattererConnector, const string& scalarId) ; 
     181         static void recvDistributedAttributes(CEventServer& event) ; 
     182         void recvDistributedAttributes(CEventServer& event, const string& type) ; 
     183 
    169184       private: 
    170185         map<CContextClient*, CDistributedElement*> remoteElement_ ; 
     
    179194         CGathererConnector*  gathererConnector_ ; 
    180195         CGathererConnector* serverFromClientConnector_ ; 
     196         CDistributedElement* elementFrom_ ; 
    181197       public: 
    182198        CGathererConnector* getServerFromClientConnector(void) { return serverFromClientConnector_ ;} 
Note: See TracChangeset for help on using the changeset viewer.