Changeset 5861


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

YM

Location:
CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src
Files:
5 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) ; 
  • CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/interface/c/oasis_cinterface.cpp

    r5501 r5861  
    11#include "oasis_cinterface.hpp" 
     2#include <oasis_c.h> 
    23#include <string> 
    34#include "mpi.hpp" 
     5#include <cstring> 
    46 
    57namespace xios 
     
    4446    comm_client_server=MPI_Comm_f2c(f_comm) ; 
    4547  } 
     48   
     49  void oasis_get_multi_intracomm(MPI_Comm& comm_clients_server,const std::vector<std::string>& codesId, std::vector<int> &rootRanks) 
     50  { 
     51    int size = codesId.size() ; 
     52    char** cdnam = new char*[size] ; 
     53    for(int i=0;i<size;i++) 
     54    { 
     55      cdnam[i]=new char[codesId[i].length()+1] ; 
     56      std::strcpy(cdnam[i], codesId[i].c_str()); 
     57    } 
     58    rootRanks.resize(size) ; 
     59    oasis_c_get_multi_intracomm(&comm_clients_server, size, cdnam, rootRanks.data()) ; 
     60  } 
     61 
    4662} 
  • CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/interface/c/oasis_cinterface.hpp

    r5501 r5861  
    22#define __OASIS_CINTERFACE__ 
    33#include <string> 
     4#include <vector> 
    45#include "mpi.hpp" 
    56 
     
    2324  void oasis_get_intracomm(MPI_Comm& comm_client_server,const std::string& server_id) ; 
    2425  void oasis_get_intercomm(MPI_Comm& comm_client_server,const std::string& server_id) ; 
     26  void oasis_get_multi_intracomm(MPI_Comm& comm_clients_server,const std::vector<std::string>& codesId, std::vector<int>& rootRanks) ; 
    2527} 
    2628#endif 
  • CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/io/nc4_data_output.cpp

    r5501 r5861  
    26342634                } 
    26352635 
    2636  
     2636                // suppose first dim is dedicated for ensemble 
     2637                double defaultValue=field->default_value ; 
     2638                size_t slice=1 ; 
     2639                for(int i=1 ; i<count.size() ; i++) slice=slice*count[i] ; 
     2640                 
     2641                size_t nEnsemble=count[0] ; 
     2642                size_t pos=0 ; 
     2643                start[0] = 0 ; 
     2644                count[0] = 0 ; 
     2645                for(size_t i=0 ; i<nEnsemble ; i++) 
     2646                { 
     2647                  bool allMissing=true ; 
     2648                  for (size_t j=0 ; j<slice ; j++,pos++) 
     2649                    if (fieldData(pos)!=defaultValue) { allMissing=false ; break;} 
     2650                  if (allMissing)  
     2651                  { 
     2652                    if (count[0]==0) start[0]++ ; 
     2653                    else break ; 
     2654                  } 
     2655                  else count[0]++ ;   
     2656                }   
     2657 
     2658                CArray<double,1> newData(fieldData.dataFirst()+start[0]*slice,shape(count[0]*slice),neverDeleteData) ; 
     2659                info(0)<<"write data parameter  "<<fieldid<<"  "<<field->getNStep()<<"  start : " ; 
     2660                for(auto it : start) info(0)<<" "<<it ; 
     2661                info(0)<<"  count : " ;  
     2662                for(auto it : count) info(0)<<"  "<<it ; 
     2663                info(0)<<endl ;  
     2664                  
    26372665                CTimer::get("Files : writing data").resume(); 
    2638                 SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep() - 1, &start, &count); 
     2666                SuperClassWriter::writeData(newData, fieldid, isCollective, field->getNStep() - 1, &start, &count); 
    26392667                CTimer::get("Files : writing data").suspend(); 
    26402668 
  • 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.