Changeset 5861 for CONFIG_DEVT
- Timestamp:
- 06/24/21 11:14:28 (3 years ago)
- 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 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) ; -
CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/interface/c/oasis_cinterface.cpp
r5501 r5861 1 1 #include "oasis_cinterface.hpp" 2 #include <oasis_c.h> 2 3 #include <string> 3 4 #include "mpi.hpp" 5 #include <cstring> 4 6 5 7 namespace xios … … 44 46 comm_client_server=MPI_Comm_f2c(f_comm) ; 45 47 } 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 46 62 } -
CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/interface/c/oasis_cinterface.hpp
r5501 r5861 2 2 #define __OASIS_CINTERFACE__ 3 3 #include <string> 4 #include <vector> 4 5 #include "mpi.hpp" 5 6 … … 23 24 void oasis_get_intracomm(MPI_Comm& comm_client_server,const std::string& server_id) ; 24 25 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) ; 25 27 } 26 28 #endif -
CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/io/nc4_data_output.cpp
r5501 r5861 2634 2634 } 2635 2635 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 2637 2665 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); 2639 2667 CTimer::get("Files : writing data").suspend(); 2640 2668 -
CONFIG_DEVT/IPSLCM6.5_work_ENSEMBLES/modeles/XIOS/src/server.cpp
r5501 r5861 352 352 MPI_Comm_rank(CXios::globalComm,&globalRank); 353 353 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 354 385 // (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 358 405 if ( serverLevel == 0 || serverLevel == 1) 359 406 {
Note: See TracChangeset
for help on using the changeset viewer.