- Timestamp:
- 09/06/18 18:55:44 (6 years ago)
- Location:
- XIOS/dev/dev_olga/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/io/nc4_data_output.cpp
r1559 r1571 56 56 { 57 57 StdString lonName,latName ; 58 58 59 59 domain->computeWrittenIndex(); 60 60 domain->computeWrittenCompressedIndex(comm_file); … … 154 154 */ 155 155 156 CArray< size_t, 1>& indexToWrite = domain->localIndexToWriteOnServer;156 CArray<int, 1>& indexToWrite = domain->localIndexToWriteOnServer; 157 157 int nbWritten = indexToWrite.numElements(); 158 158 CArray<double,1> writtenLat, writtenLon; … … 166 166 for (int idx = 0; idx < nbWritten; ++idx) 167 167 { 168 if (i dx < domain->latvalue.numElements())168 if (indexToWrite(idx) < 0) 169 169 { 170 writtenLat(idx) = domain->latvalue(indexToWrite(idx));171 writtenLon(idx) = domain->lonvalue(indexToWrite(idx));170 writtenLat(idx) = -1.; // hole 171 writtenLon(idx) = -1.; 172 172 } 173 173 else 174 174 { 175 writtenLat(idx) = 0.;176 writtenLon(idx) = 0.;175 writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 176 writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 177 177 } 178 178 } … … 189 189 for (int nv = 0; nv < nvertex; ++nv) 190 190 { 191 if (idx < boundslat.columns()) 192 { 191 if (indexToWrite(idx) < 0) 192 { 193 writtenBndsLat(nv, idx) = -1.; // hole 194 writtenBndsLon(nv, idx) = -1.; 195 } 196 else 197 { 193 198 writtenBndsLat(nv, idx) = boundslat(nv, int(indexToWrite(idx))); 194 199 writtenBndsLon(nv, idx) = boundslon(nv, int(indexToWrite(idx))); 195 } 196 else 197 { 198 writtenBndsLat(nv, idx) = 0.; 199 writtenBndsLon(nv, idx) = 0.; 200 } 200 } 201 201 } 202 202 } … … 208 208 for (int idx = 0; idx < nbWritten; ++idx) 209 209 { 210 if (i dx < domain->areavalue.numElements())211 writtenArea(idx) = domain->areavalue(indexToWrite(idx));210 if (indexToWrite(idx) < 0) 211 writtenArea(idx) = -1.; 212 212 else 213 writtenArea(idx) = 0.;213 writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 214 214 } 215 215 } … … 426 426 std::vector<StdSize> start(2) ; 427 427 std::vector<StdSize> count(2) ; 428 if (domain->isEmpty()) 429 { 430 start[0]=0 ; start[1]=0 ; 431 count[0]=0 ; count[1]=0 ; 432 } 433 else 428 // Comment out for a moment because it is not working for a hole 429 // if (domain->isEmpty()) 430 // { 431 // start[0]=0 ; start[1]=0 ; 432 // count[0]=0 ; count[1]=0 ; 433 // } 434 // else 434 435 { 435 436 start[1]=domain->ibegin; … … 875 876 case (MULTI_FILE) : 876 877 { 878 ERROR("CNc4DataOutput::writeDomain(domain)", 879 << "[ type = multiple_file ]" 880 << " is not yet implemented for UGRID files !"); 877 881 break; 878 882 } … … 940 944 int nvertex = (domain->nvertex.isEmpty()) ? 0 : domain->nvertex; 941 945 942 CArray< size_t, 1>& indexToWrite = domain->localIndexToWriteOnServer;946 CArray<int, 1>& indexToWrite = domain->localIndexToWriteOnServer; 943 947 int nbWritten = indexToWrite.numElements(); 944 948 CArray<double,1> writtenLat, writtenLon; … … 952 956 for (int idx = 0; idx < nbWritten; ++idx) 953 957 { 954 if (i dx < domain->latvalue.numElements())955 {956 writtenLat(idx) = domain->latvalue(indexToWrite(idx));957 writtenLon(idx) = domain->lonvalue(indexToWrite(idx));958 }959 else960 {961 writtenLat(idx) = 0.;962 writtenLon(idx) = 0.;963 }958 if (indexToWrite(idx) < 0) 959 { 960 writtenLat(idx) = -1.; 961 writtenLon(idx) = -1.; 962 } 963 else 964 { 965 writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 966 writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 967 } 964 968 } 965 969 } … … 976 980 for (int nv = 0; nv < nvertex; ++nv) 977 981 { 978 if (idx < boundslat.columns()) 982 if (indexToWrite(idx) < 0) 983 { 984 writtenBndsLat(nv, idx) = -1.; 985 writtenBndsLon(nv, idx) = -1.; 986 } 987 else 979 988 { 980 989 writtenBndsLat(nv, idx) = boundslat(nv, int(indexToWrite(idx))); 981 990 writtenBndsLon(nv, idx) = boundslon(nv, int(indexToWrite(idx))); 982 }983 else984 {985 writtenBndsLat(nv, idx) = 0.;986 writtenBndsLon(nv, idx) = 0.;987 991 } 988 992 } … … 995 999 for (int idx = 0; idx < nbWritten; ++idx) 996 1000 { 997 if (i dx < domain->areavalue.numElements())998 writtenArea(idx) = domain->areavalue(indexToWrite(idx));1001 if (indexToWrite(idx) < 0) 1002 writtenArea(idx) = -1.; 999 1003 else 1000 writtenArea(idx) = 0.;1004 writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 1001 1005 } 1002 1006 } … … 1275 1279 SuperClassWriter::definition_end(); 1276 1280 1277 CArray< size_t, 1>& indexToWrite = axis->localIndexToWriteOnServer;1281 CArray<int, 1>& indexToWrite = axis->localIndexToWriteOnServer; 1278 1282 int nbWritten = indexToWrite.numElements(); 1279 1283 CArray<double,1> axis_value(indexToWrite.numElements()); … … 1282 1286 for (int i = 0; i < nbWritten; i++) 1283 1287 { 1284 if (i < axis->value.numElements()) 1288 if (indexToWrite(i) < 0) 1289 axis_value(i) = -1; // Some value in case of a hole 1290 else 1285 1291 axis_value(i) = axis->value(indexToWrite(i)); 1286 else1287 axis_value(i) = 0.;1288 1292 } 1289 1293 } … … 1295 1299 for (int i = 0; i < nbWritten; i++) 1296 1300 { 1297 if (i < axis->label.numElements()) 1301 if (indexToWrite(i) < 0) 1302 axis_label(i) = boost::lexical_cast<string>(-1); // Some value in case of a hole 1303 else 1298 1304 axis_label(i) = axis->label(indexToWrite(i)); 1299 else1300 axis_label(i) = boost::lexical_cast<string>(0); // Write 0 as a label1301 1305 } 1302 1306 } … … 1316 1320 for (int i = 0; i < nbWritten; ++i) 1317 1321 { 1318 if (i < axis->bounds.columns()) 1322 if (indexToWrite(i) < 0) 1323 { 1324 axis_bounds(0, i) = -1.; // Some value in case of a hole 1325 axis_bounds(1, i) = -1.; 1326 } 1327 else 1319 1328 { 1320 1329 axis_bounds(0, i) = axis->bounds(0, int(indexToWrite(i))); 1321 1330 axis_bounds(1, i) = axis->bounds(1, int(indexToWrite(i))); 1322 }1323 else1324 {1325 axis_bounds(0, i) = 0.;1326 axis_bounds(1, i) = 0.;1327 1331 1328 1332 } … … 1356 1360 for (int i = 0; i < nbWritten; ++i) 1357 1361 { 1358 if (i < axis->bounds.columns()) 1362 if (indexToWrite(i) < 0) 1363 { 1364 axis_bounds(0, i) = -1.; 1365 axis_bounds(1, i) = -1.; 1366 } 1367 else 1359 1368 { 1360 1369 axis_bounds(0, i) = axis->bounds(0, int(indexToWrite(i))); 1361 1370 axis_bounds(1, i) = axis->bounds(1, int(indexToWrite(i))); 1362 }1363 else1364 {1365 axis_bounds(0, i) = 0.;1366 axis_bounds(1, i) = 0.;1367 1371 } 1368 1372 } -
XIOS/dev/dev_olga/src/node/axis.cpp
r1570 r1571 245 245 void CAxis::checkAttributes(void) 246 246 { 247 if (this->n_glo.isEmpty()) 247 CContext* context=CContext::getCurrent(); 248 249 if (this->n_glo.isEmpty()) 248 250 ERROR("CAxis::checkAttributes(void)", 249 251 << "[ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] " … … 287 289 if (!this->value.isEmpty()) 288 290 { 289 StdSize true_size = value.numElements(); 290 if (this->n.getValue() != true_size) 291 ERROR("CAxis::checkAttributes(void)", 291 // Avoid this check at writing because it fails in case of a hole 292 if (context->hasClient) 293 { 294 StdSize true_size = value.numElements(); 295 if (this->n.getValue() != true_size) 296 ERROR("CAxis::checkAttributes(void)", 292 297 << "[ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] " 293 << "The axis is wrongly defined, attribute 'value' has a different size (" << true_size << ") than the one defined by the \'size\' attribute (" << n.getValue() << ")."); 298 << "The axis is wrongly defined, attribute 'value' has a different size (" << true_size 299 << ") than the one defined by the \'size\' attribute (" << n.getValue() << ")."); 300 } 294 301 this->hasValue = true; 295 302 } … … 297 304 this->checkBounds(); 298 305 299 CContext* context=CContext::getCurrent();300 306 if (context->hasClient) 301 307 { … … 651 657 // Even if a client has no index, it must connect to at least one server and 652 658 // send an "empty" data to this server 653 if (connectedServerRank_[nbServer].empty()) 654 connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 659 // if (connectedServerRank_[nbServer].empty()) 660 // connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 661 // Send empty data to all servers 662 if (connectedServerRank_[nbServer].empty()) 663 for (int i=0; i<nbServer; ++i) 664 connectedServerRank_[nbServer].push_back(i); 665 655 666 656 667 nbSenders[nbServer] = CClientServerMapping::computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); … … 690 701 CArray<size_t,1>::const_iterator itSrvb = writtenGlobalIndex.begin(), 691 702 itSrve = writtenGlobalIndex.end(), itSrv; 703 // for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 704 // { 705 // indGlo = *itSrv; 706 // if (ite != globalLocalIndexMap_.find(indGlo)) 707 // { 708 // ++nbWritten; 709 // } 710 // } 711 712 localIndexToWriteOnServer.resize(writtenGlobalIndex.numElements()); 713 // localIndexToWriteOnServer.resize(nbWritten); 714 715 nbWritten = 0; 692 716 for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 693 717 { … … 695 719 if (ite != globalLocalIndexMap_.find(indGlo)) 696 720 { 697 ++nbWritten;698 }699 }700 701 localIndexToWriteOnServer.resize(writtenGlobalIndex.numElements());702 // localIndexToWriteOnServer.resize(nbWritten);703 704 nbWritten = 0;705 for (itSrv = itSrvb; itSrv != itSrve; ++itSrv)706 {707 indGlo = *itSrv;708 if (ite != globalLocalIndexMap_.find(indGlo))709 {710 721 localIndexToWriteOnServer(nbWritten) = globalLocalIndexMap_[indGlo]; 711 ++nbWritten; 712 } 713 } 722 } 723 else 724 { 725 localIndexToWriteOnServer(nbWritten) = -1; 726 } 727 ++nbWritten; 728 } 729 714 730 } 715 731 … … 1194 1210 if (0 == globalLocalIndexMap_.count(gloInd)) 1195 1211 { 1196 index(nbIndLoc) = gloInd % n_glo; 1197 globalLocalIndexMap_[gloInd] = nbIndLoc; 1212 // index(nbIndLoc) = gloInd % n_glo; 1213 // globalLocalIndexMap_[gloInd] = nbIndLoc; 1214 // ++nbIndexGlob; 1215 index(nbIndexGlob) = gloInd % n_glo; 1216 globalLocalIndexMap_[gloInd] = nbIndexGlob; 1198 1217 ++nbIndexGlob; 1199 1218 } … … 1271 1290 } 1272 1291 1273 1274 1292 /*! 1275 1293 Compare two axis objects. -
XIOS/dev/dev_olga/src/node/axis.hpp
r1568 r1571 114 114 void computeWrittenIndex(); 115 115 void computeWrittenCompressedIndex(MPI_Comm); 116 117 template <class T> void outputAxis(CArray<T,1>& valueIn, CArray<T,1>& valueOut); 118 116 119 bool hasTransformation(); 117 120 void solveInheritanceTransformation(); … … 126 129 bool hasLabel; 127 130 128 CArray<size_t,1> localIndexToWriteOnServer; 131 // CArray<size_t,1> localIndexToWriteOnServer; 132 CArray<int,1> localIndexToWriteOnServer; 133 CArray<size_t,1> localIndexToWriteOnClient; 129 134 130 135 private: … … 185 190 ///-------------------------------------------------------------- 186 191 192 template <class T> void CAxis::outputAxis(CArray<T,1>& valueIn, CArray<T,1>& valueOut) 193 { 194 int sizeServer = localIndexToWriteOnServer.numElements(); 195 int sizeClient = localIndexToWriteOnClient.numElements(); 196 valueOut.resize(sizeClient); 197 198 if (sizeServer == sizeClient) 199 { 200 valueOut = valueIn; 201 } 202 else 203 // a hole 204 { 205 valueOut = valueIn; 206 //valueOut = -1; initialize here to some value ???? 207 } 208 // CArray<size_t,1>& outIndexClient = grid->localIndexToWriteOnClient; 209 // CArray<size_t,1>& outIndexServer = grid->localIndexToWriteOnServer; 210 // for (size_t idx = 0; idx < outIndexServer.numElements(); ++idx) 211 // { 212 // fieldOut(outIndexServer(idx)) = recvDataSrv(outIndexClient(idx)); 213 // } 214 } 215 187 216 // Declare/Define CAxisGroup and CAxisDefinition 188 217 DECLARE_GROUP(CAxis); -
XIOS/dev/dev_olga/src/node/domain.cpp
r1570 r1571 1848 1848 // Even if a client has no index, it must connect to at least one server and 1849 1849 // send an "empty" data to this server 1850 // if (connectedServerRank_[nbServer].empty()) 1851 // connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 1852 1853 // Trying instead: send empty data to all servers 1850 1854 if (connectedServerRank_[nbServer].empty()) 1851 connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 1855 for (int i = 0; i < client->serverSize; ++i) 1856 connectedServerRank_[nbServer].push_back(i); 1857 1852 1858 1853 1859 nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); … … 1904 1910 { 1905 1911 localIndexToWriteOnServer(nbWritten) = globalLocalIndexMap_[indGlo]; 1906 ++nbWritten;1907 1912 } 1908 1913 else 1909 1914 { 1910 localIndexToWriteOnServer(nbWritten) = 0;1911 ++nbWritten;1912 }1915 localIndexToWriteOnServer(nbWritten) = -1; 1916 } 1917 ++nbWritten; 1913 1918 } 1914 1919 … … 2512 2517 nbIndLoc = iIndex + ni * jIndex; 2513 2518 // if (nbIndLoc < nbIndexGlobMax) // THIS CONDITION IMPEDES THE CASE OF A HOLE 2514 {2515 i_index(nbIndLoc) = index % ni_glo;2516 j_index(nbIndLoc) = index / ni_glo;2517 globalLocalIndexMap_[index] = nbIndLoc; 2518 ++nbIndGlob;2519 }2520 //i_index(nbIndGlob) = index % ni_glo;2521 //j_index(nbIndGlob) = index / ni_glo;2522 // globalLocalIndexMap_[index] = nbIndGlob;2523 //++nbIndGlob;2519 // { 2520 // i_index(nbIndLoc) = index % ni_glo; 2521 // j_index(nbIndLoc) = index / ni_glo; 2522 // globalLocalIndexMap_[index] = nbIndLoc; 2523 // ++nbIndGlob; 2524 // } 2525 i_index(nbIndGlob) = index % ni_glo; 2526 j_index(nbIndGlob) = index / ni_glo; 2527 globalLocalIndexMap_[index] = nbIndGlob; 2528 ++nbIndGlob; 2524 2529 } 2525 2530 } -
XIOS/dev/dev_olga/src/node/domain.hpp
r1553 r1571 142 142 CArray<double, 1> areavalue; 143 143 144 CArray< size_t,1> localIndexToWriteOnServer;144 CArray<int,1> localIndexToWriteOnServer; 145 145 146 146 CArray<bool, 1> domainMask; // mask_1d, mask_2d -> domainMask -
XIOS/dev/dev_olga/src/node/grid.cpp
r1570 r1571 841 841 // Even if a client has no index, it must connect to at least one server and 842 842 // send an "empty" data to this server 843 // if (connectedServerRank_[receiverSize].empty()) 844 // connectedServerRank_[receiverSize].push_back(client->clientRank % client->serverSize); 845 846 // Trying instead: send empty data to all servers 843 847 if (connectedServerRank_[receiverSize].empty()) 844 connectedServerRank_[receiverSize].push_back(client->clientRank % client->serverSize); 848 for (int i = 0; i < client->serverSize; ++i) 849 connectedServerRank_[receiverSize].push_back(i); 845 850 846 851 nbSenders[receiverSize] = clientServerMap_->computeConnectedClients(receiverSize, client->clientSize, client->intraComm, connectedServerRank_[receiverSize]);
Note: See TracChangeset
for help on using the changeset viewer.