- Timestamp:
- 07/11/17 11:34:53 (6 years ago)
- Location:
- XIOS/dev/dev_olga/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/node/context.cpp
r1201 r1208 526 526 checkGridEnabledFields(); 527 527 528 // Distribute files between secondary servers according to the data size 529 distributeFiles(); 530 528 531 // Buffer for primary server for connection to client will be allocated by default (to min size) 529 532 if (CServer::serverLevel != 1) … … 815 818 << getId() << "\" !"); 816 819 817 // Assigning contextClient to each enabled file 818 if (hasClient) 819 { 820 for (int i = 0; i < enabledFiles.size(); ++i) 821 { 822 if (hasServer) 823 { 824 int srvId = i % clientPrimServer.size(); 825 enabledFiles[i]->setContextClient(clientPrimServer[srvId]); 826 } 827 else 828 enabledFiles[i]->setContextClient(client); 829 } 830 } 820 } 821 822 void CContext::distributeFiles(void) 823 { 824 // If primary server 825 if (hasServer && hasClient) 826 { 827 // (1) Find all enabled files in write mode 828 for (int i = 0; i < this->enabledFiles.size(); ++i) 829 { 830 if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 831 enabledWriteModeFiles.push_back(enabledFiles[i]); 832 } 833 834 // (2) Estimate the data volume for each file 835 int size = this->enabledWriteModeFiles.size(); 836 std::vector<std::pair<StdSize, CFile*> > dataSizeMap; 837 for (size_t i = 0; i < size; ++i) 838 { 839 CFile* file = this->enabledWriteModeFiles[i]; 840 StdSize dataSize; 841 std::vector<CField*> enabledFields = file->getEnabledFields(); 842 size_t numEnabledFields = enabledFields.size(); 843 for (size_t j = 0; j < numEnabledFields; ++j) 844 { 845 const std::vector<std::map<int, StdSize> > mapSize = enabledFields[j]->getGridDataBufferSize(); 846 for (size_t c = 0; c < mapSize.size(); ++c) 847 { 848 std::map<int, StdSize>::const_iterator it = mapSize[c].begin(), itE = mapSize[c].end(); 849 for (; it != itE; ++it) 850 { 851 dataSize += it->second; 852 } 853 } 854 } 855 CDuration outFreq = file->output_freq.getValue(); 856 if (outFreq.timestep != 0.0) 857 { 858 outFreq = calendar->getTimeStep(); 859 } 860 double outFreqSec = outFreq.second + 60.*(outFreq.minute + 60.*(outFreq.hour + 24.*(outFreq.day + outFreq.year*365.25) ) ); 861 dataSize /= outFreqSec; 862 dataSizeMap.push_back(make_pair(dataSize,file)); 863 } 864 865 // (3) Sort enabledWriteModeFiles 866 std::sort(dataSizeMap.begin(), dataSizeMap.end()); 867 for (int i = 0; i < size; ++i) 868 { 869 enabledWriteModeFiles[i] = dataSizeMap[i].second; 870 } 871 872 // (4) Assign contextClient to each enabled file 873 int i,j; 874 for (i = 0, j=0; i < enabledFiles.size(); ++i) 875 { 876 if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 877 { 878 int n = j / clientPrimServer.size(); 879 int mod = j % clientPrimServer.size(); 880 int poolId; 881 if (n % 2 == 0) 882 poolId =mod; 883 else 884 poolId = clientPrimServer.size()-1-mod; 885 enabledWriteModeFiles[j]->setContextClient(clientPrimServer[poolId]); 886 ++j; 887 } 888 else 889 { 890 enabledFiles[i]->setContextClient(client); 891 } 892 } 893 } 894 else 895 { 896 for (int i = 0; i < this->enabledFiles.size(); ++i) 897 enabledFiles[i]->setContextClient(client); 898 } 831 899 } 832 900 -
XIOS/dev/dev_olga/src/node/context.hpp
r1194 r1208 136 136 void setClientServerBuffer(CContextClient* contextClient); 137 137 138 // Estimate data size for each enabled file in write mode 139 void distributeFiles(void); 140 138 141 // Send context close definition 139 142 void sendCloseDefinition(void); … … 223 226 // List of all enabled files in read mode (files on which fields are read) 224 227 std::vector<CFile*> enabledReadModeFiles; 228 // List of all enabled files in write mode 229 std::vector<CFile*> enabledWriteModeFiles; 225 230 226 231 // List of all enabled fields whose instant data is accessible from the public API -
XIOS/dev/dev_olga/src/server.cpp
r1201 r1208 100 100 for (i=0; i<srvRanks.size(); i++) 101 101 { 102 if (i > = srvRanks.size()*CXios::ratioServer2/100)102 if (i > srvRanks.size()*(100-CXios::ratioServer2)/100) 103 103 { 104 104 sndServerGlobalRanks.push_back(srvRanks[i]);
Note: See TracChangeset
for help on using the changeset viewer.