Ignore:
Timestamp:
06/24/21 11:14:28 (3 years ago)
Author:
ymipsl
Message:
  • Adapt XIOS sources to manage ensemble runs, using new version of oasis

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/client.cpp

    r5501 r5861  
    4242      else is_MPI_Initialized=false ; 
    4343      int rank ; 
     44      bool ensembleManagement ; 
     45      int ensembleSize ; 
    4446 
    4547// don't use OASIS 
     
    134136      else 
    135137      { 
     138 
     139        // manage ensemble with oasis 
     140        // code id is splitted follow the base code Id and the num number using the ":" separator 
     141        // codeId == baseCodeId:member 
     142        // member must integer convertible 
     143        vector<string> splittedCodeId=splitRegex(codeId,"\\s*:\\s*") ; 
     144        if (splittedCodeId.size()>2) ERROR("void CClient::initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)", 
     145                                            <<"CodeId is badly formed "<<codeId) ; 
     146        string baseCodeId=splittedCodeId[0] ; 
     147        int member ; 
     148        if (splittedCodeId.size()==2) 
     149        { 
     150          try 
     151          { 
     152            member = stoi(splittedCodeId[1]) ; 
     153          }  
     154          catch(...) 
     155          { 
     156            ERROR("void CClient::initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)", 
     157                                            <<"CodeId is badly formed "<<codeId) ; 
     158          } 
     159          ensembleManagement=true ; 
     160        } 
     161        else ensembleManagement=false ; 
     162 
     163        string codesId=CXios::getin<string>("oasis_codes_id") ; 
     164        vector<string> oasisCodesId=splitRegex(codesId,"\\s*,\\s*") ; 
     165        for(auto& oasisCodeId : oasisCodesId) 
     166        { 
     167          info(10)<<"oasisCodeId "<<oasisCodeId<<endl ; 
     168          vector<string> splittedOasisCodeId = splitRegex(oasisCodeId,"\\s*:\\s*") ; 
     169          string baseOasisCodeId=splittedOasisCodeId[0] ; 
     170          info(10)<<"baseOasisCodeId "<<baseOasisCodeId<<"  baseCodeId "<<baseCodeId<<endl ; 
     171          if (baseOasisCodeId==baseCodeId) 
     172          { 
     173            if (splittedOasisCodeId.size()==2) 
     174            { 
     175              try 
     176              { 
     177                ensembleSize = stoi(splittedOasisCodeId[1]) ; 
     178                info(10)<<"ensembleSize "<<ensembleSize<<endl ; 
     179              }  
     180              catch(...) 
     181              { 
     182                ERROR("void CClient::initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)", 
     183                                                <<"CodeId is badly formed "<<codeId) ; 
     184              } 
     185              if (ensembleManagement==false)  ERROR("void CClient::initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)", 
     186                                                <<"inconsistancy for ensemble management between local codeId and OASIS codes Id  : " 
     187                                                <<codeId<<"  "<< codesId);  
     188            } 
     189            else if (ensembleManagement==true)  ERROR("void CClient::initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm)", 
     190                                                <<"inconsistancy for ensemble management between local codeId and OASIS codes Id " 
     191                                                <<codeId<<"  "<< codesId);  
     192          } 
     193        } 
     194         
     195         
    136196        // localComm isn't given 
    137197        if (localComm == MPI_COMM_NULL) 
    138198        { 
    139199          if (!is_MPI_Initialized) oasis_init(codeId) ; 
    140           oasis_get_localcomm(localComm) ; 
     200          if(ensembleManagement)  
     201          { 
     202            vector<string> intraCommStr(ensembleSize) ; 
     203            vector<int>    rootRanks ; 
     204            for(int i=0;i<ensembleSize;i++) intraCommStr[i]=baseCodeId+":"+std::to_string(i) ; 
     205            oasis_get_multi_intracomm(localComm, intraCommStr, rootRanks) ; 
     206          } 
     207          else oasis_get_localcomm(localComm) ; 
    141208        } 
    142209        MPI_Comm_dup(localComm,&intraComm) ; 
     
    149216          MPI_Status status ; 
    150217          MPI_Comm_rank(intraComm,&rank_) ; 
    151  
    152           oasis_get_intercomm(interComm,CXios::xiosCodeId) ; 
     218           
     219          if(ensembleManagement)  
     220          { 
     221            vector<string> intraCommStr(ensembleSize+1) ; 
     222            vector<int>    rootRanks ; 
     223            for(int i=0;i<ensembleSize;i++) intraCommStr[i]=baseCodeId+":"+std::to_string(i) ; 
     224            intraCommStr[ensembleSize] = CXios::xiosCodeId ; 
     225             
     226            oasis_get_multi_intracomm(localComm, intraCommStr, rootRanks) ; 
     227    
     228            int myColor= 0 ; // 0:client 1:server 
     229            int myrank ; 
     230            MPI_Comm splittedComm ; 
     231            MPI_Comm_rank(localComm,&myrank) ; 
     232            MPI_Comm_split(localComm,myColor,myrank, &splittedComm) ; 
     233            MPI_Intercomm_create(splittedComm,0,localComm,rootRanks[ensembleSize],10,&interComm) ; 
     234           
     235          } 
     236          else oasis_get_intercomm(interComm,CXios::xiosCodeId) ; 
    153237          if (rank_==0) MPI_Recv(&serverLeader,1, MPI_INT, 0, 0, interComm, &status) ; 
    154238          MPI_Bcast(&serverLeader,1,MPI_INT,0,intraComm) ; 
Note: See TracChangeset for help on using the changeset viewer.