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/server.cpp

    r5501 r5861  
    352352        MPI_Comm_rank(CXios::globalComm,&globalRank); 
    353353 
     354// (1.5) check ensemble management 
     355        vector<string> baseOasisCodeId(oasisCodeId.size()) ; 
     356        vector<int> ensembleSize(oasisCodeId.size()) ; 
     357        vector<bool> ensembleManagement(oasisCodeId.size()) ; 
     358         
     359        for(int i=0 ; i<oasisCodeId.size() ;i++) 
     360        { 
     361          vector<string> splittedOasisCodeId = splitRegex(oasisCodeId[i],"\\s*:\\s*") ; 
     362          baseOasisCodeId[i]=splittedOasisCodeId[0] ; 
     363          if (splittedOasisCodeId.size()==1)  
     364          { 
     365            ensembleManagement[i]=false ; 
     366            ensembleSize[i]=1 ; 
     367          } 
     368          else if (splittedOasisCodeId.size()==2) 
     369          { 
     370             
     371            try  
     372            {  
     373              ensembleSize[i] = stoi(splittedOasisCodeId[1]) ; 
     374            } 
     375            catch(...)  
     376            {  
     377              ERROR("void CServer::initialize(void)",<<"OasisCodeId is badly formed "<<oasisCodeId[i]) ; 
     378            } 
     379             
     380            ensembleManagement[i] = true ; 
     381          } 
     382          else ERROR("void CServer::initialize(void)",<<"OasisCodeId is badly formed "<<oasisCodeId[i]) ; 
     383        } 
     384 
    354385//      (2) Create interComms with models 
    355         for(it=oasisCodeId.begin();it!=oasisCodeId.end();it++) 
    356         { 
    357           oasis_get_intercomm(newComm,*it) ; 
     386        for(int i=0; i<baseOasisCodeId.size();i++) 
     387        { 
     388          if (ensembleManagement[i]==false) oasis_get_intercomm(newComm,baseOasisCodeId[i]) ; 
     389          else 
     390          { 
     391            vector<string> intraCommStr(ensembleSize[i]+1) ; 
     392            vector<int>    rootRanks ; 
     393            for(int j=0;j<ensembleSize[i];j++) intraCommStr[j]=baseOasisCodeId[i]+":"+std::to_string(j) ; 
     394            intraCommStr[ensembleSize[i]] = CXios::xiosCodeId ; 
     395            oasis_get_multi_intracomm(localComm, intraCommStr, rootRanks) ; 
     396    
     397            int myColor= 1 ; // 0:client 1:server 
     398            int myrank ; 
     399            MPI_Comm splittedComm ; 
     400            MPI_Comm_rank(localComm,&myrank) ; 
     401            MPI_Comm_split(localComm,myColor,myrank, &splittedComm) ; 
     402            MPI_Intercomm_create(splittedComm,0,localComm,rootRanks[0],10,&newComm) ; 
     403          } 
     404           
    358405          if ( serverLevel == 0 || serverLevel == 1) 
    359406          { 
Note: See TracChangeset for help on using the changeset viewer.