- Timestamp:
- 06/24/21 11:14:28 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/client.cpp
r5501 r5861 42 42 else is_MPI_Initialized=false ; 43 43 int rank ; 44 bool ensembleManagement ; 45 int ensembleSize ; 44 46 45 47 // don't use OASIS … … 134 136 else 135 137 { 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 136 196 // localComm isn't given 137 197 if (localComm == MPI_COMM_NULL) 138 198 { 139 199 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) ; 141 208 } 142 209 MPI_Comm_dup(localComm,&intraComm) ; … … 149 216 MPI_Status status ; 150 217 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) ; 153 237 if (rank_==0) MPI_Recv(&serverLeader,1, MPI_INT, 0, 0, interComm, &status) ; 154 238 MPI_Bcast(&serverLeader,1,MPI_INT,0,intraComm) ;
Note: See TracChangeset
for help on using the changeset viewer.