Changeset 1553
- Timestamp:
- 06/28/18 17:53:42 (6 years ago)
- Location:
- XIOS/trunk/src
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/config/domain_attribute.conf
r1549 r1553 62 62 DECLARE_ATTRIBUTE(StdString, domain_ref) 63 63 DECLARE_ATTRIBUTE(int, prec) 64 65 DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_ibegin)66 DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_ni)67 DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_jbegin)68 DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_nj) -
XIOS/trunk/src/config/domain_attribute_private.conf
r1549 r1553 25 25 DECLARE_ARRAY_PRIVATE(double, 2, bounds_lonvalue_unstructured_read_from_file) 26 26 DECLARE_ARRAY_PRIVATE(double, 2, bounds_latvalue_unstructured_read_from_file) 27 28 //DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_ibegin)29 //DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_ni)30 //DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_jbegin)31 //DECLARE_ATTRIBUTE_PRIVATE(int, global_zoom_nj)32 33 // Local zoom information34 DECLARE_ATTRIBUTE_PRIVATE(int, zoom_ibegin)35 DECLARE_ATTRIBUTE_PRIVATE(int, zoom_ni)36 DECLARE_ATTRIBUTE_PRIVATE(int, zoom_jbegin)37 DECLARE_ATTRIBUTE_PRIVATE(int, zoom_nj)38 39 40 DECLARE_ARRAY_PRIVATE(int , 1 , zoom_i_index, false)41 DECLARE_ARRAY_PRIVATE(int , 1 , zoom_j_index, false) -
XIOS/trunk/src/distribution_server.cpp
r1340 r1553 12 12 namespace xios { 13 13 14 CDistributionServer::CDistributionServer(int rank, const std::vector<int>& n ZoomBegin,15 const std::vector<int>& n ZoomSize,16 const std::vector<int>& n ZoomBeginGlobal,14 CDistributionServer::CDistributionServer(int rank, const std::vector<int>& nBegin, 15 const std::vector<int>& nSize, 16 const std::vector<int>& nBeginGlobal, 17 17 const std::vector<int>& nGlobal) 18 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), n ZoomBeginGlobal_(nZoomBeginGlobal),19 n ZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_()18 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nBeginGlobal_(nBeginGlobal), 19 nSize_(nSize), nBegin_(nBegin), globalLocalIndexMap_() 20 20 { 21 21 createGlobalIndex(); 22 22 } 23 23 24 CDistributionServer::CDistributionServer(int rank, 24 CDistributionServer::CDistributionServer(int rank, 25 25 const std::vector<CArray<int,1> >& globalIndexElements, 26 26 const CArray<int,1>& elementOrder, 27 const std::vector<int>& n ZoomBegin,28 const std::vector<int>& n ZoomSize,29 const std::vector<int>& n ZoomBeginGlobal,27 const std::vector<int>& nBegin, 28 const std::vector<int>& nSize, 29 const std::vector<int>& nBeginGlobal, 30 30 const std::vector<int>& nGlobal) 31 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), n ZoomBeginGlobal_(nZoomBeginGlobal),32 n ZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_()31 : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nBeginGlobal_(nBeginGlobal), 32 nSize_(nSize), nBegin_(nBegin), globalLocalIndexMap_() 33 33 { 34 34 createGlobalIndex(globalIndexElements, elementOrder); … … 48 48 { 49 49 size_t idx = 0, ssize = 1; 50 for (int i = 0; i < n ZoomSize_.size(); ++i) ssize *= nZoomSize_[i];50 for (int i = 0; i < nSize_.size(); ++i) ssize *= nSize_[i]; 51 51 52 52 this->globalIndex_.resize(ssize); 53 53 std::vector<int> idxLoop(this->getDims(),0); 54 54 std::vector<int> currentIndex(this->getDims()); 55 int innerLoopSize = n ZoomSize_[0];55 int innerLoopSize = nSize_[0]; 56 56 57 57 globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); … … 60 60 for (int i = 0; i < this->dims_-1; ++i) 61 61 { 62 if (idxLoop[i] == n ZoomSize_[i])62 if (idxLoop[i] == nSize_[i]) 63 63 { 64 64 idxLoop[i] = 0; … … 67 67 } 68 68 69 for (int i = 1; i < this->dims_; ++i) currentIndex[i] = idxLoop[i] + n ZoomBegin_[i];69 for (int i = 1; i < this->dims_; ++i) currentIndex[i] = idxLoop[i] + nBegin_[i]; 70 70 71 71 size_t mulDim, globalIndex; … … 73 73 { 74 74 mulDim = 1; 75 globalIndex = i + n ZoomBegin_[0];75 globalIndex = i + nBegin_[0]; 76 76 77 77 for (int k = 1; k < this->dims_; ++k) … … 215 215 } 216 216 217 const std::vector<int>& CDistributionServer::getZoomBeginGlobal() const218 {219 return nZoomBeginGlobal_;220 }221 222 const std::vector<int>& CDistributionServer::getZoomBeginServer() const223 {224 return nZoomBegin_;225 }226 227 const std::vector<int>& CDistributionServer::getZoomSizeServer() const228 {229 return nZoomSize_;230 }231 232 217 void CDistributionServer::partialClear(void) 233 218 { -
XIOS/trunk/src/distribution_server.hpp
r1340 r1553 24 24 /** Default constructor */ 25 25 CDistributionServer(int rank, int dims, const CArray<size_t,1>& globalIndex = CArray<size_t,1>()); 26 CDistributionServer(int rank, const std::vector<int>& n ZoomBeginServer,27 const std::vector<int>& n ZoomSizeServer, const std::vector<int>& nGlobal);28 CDistributionServer(int rank, const std::vector<int>& n ZoomBeginServer,29 const std::vector<int>& n ZoomSizeServer,30 const std::vector<int>& n ZoomBeginGlobal,26 CDistributionServer(int rank, const std::vector<int>& nBeginServer, 27 const std::vector<int>& nSizeServer, const std::vector<int>& nGlobal); 28 CDistributionServer(int rank, const std::vector<int>& nBeginServer, 29 const std::vector<int>& nSizeServer, 30 const std::vector<int>& nBeginGlobal, 31 31 const std::vector<int>& nGlobal); 32 32 33 CDistributionServer(int rank, 33 CDistributionServer(int rank, 34 34 const std::vector<CArray<int,1> >& globalIndexElements, 35 35 const CArray<int,1>& elementOrder, 36 const std::vector<int>& n ZoomBeginServer,37 const std::vector<int>& n ZoomSizeServer,38 const std::vector<int>& n ZoomBeginGlobal,36 const std::vector<int>& nBeginServer, 37 const std::vector<int>& nSizeServer, 38 const std::vector<int>& nBeginGlobal, 39 39 const std::vector<int>& nGlobal); 40 40 … … 42 42 virtual ~CDistributionServer(); 43 43 44 const std::vector<int>& getZoomBeginGlobal() const;45 const std::vector<int>& getZoomBeginServer() const;46 const std::vector<int>& getZoomSizeServer() const;47 44 const GlobalLocalMap& getGlobalLocalIndex() const { return globalLocalIndexMap_; } 48 45 int getGridSize() const; … … 62 59 private: 63 60 std::vector<int> nGlobal_; 64 std::vector<int> n ZoomBeginGlobal_;65 std::vector<int> n ZoomSize_;66 std::vector<int> n ZoomBegin_;61 std::vector<int> nBeginGlobal_; 62 std::vector<int> nSize_; 63 std::vector<int> nBegin_; 67 64 68 65 }; -
XIOS/trunk/src/io/nc4_data_input.cpp
r1486 r1553 63 63 case ONE_FILE: 64 64 { 65 /*66 std::vector<int> nZoomBeginGlobal = grid->getDistributionServer()->getZoomBeginGlobal();67 std::vector<int> nZoomBeginServer = grid->getDistributionServer()->getZoomBeginServer();68 std::vector<int> nZoomSizeServer = grid->getDistributionServer()->getZoomSizeServer();69 70 int ssize = nZoomBeginGlobal.size();71 72 std::vector<StdSize> start(ssize);73 std::vector<StdSize> count(ssize);74 75 for (int i = 0; i < ssize; ++i)76 {77 start[i] = nZoomBeginServer[ssize - i - 1] - nZoomBeginGlobal[ssize - i - 1];78 count[i] = nZoomSizeServer[ssize - i - 1];79 }80 */81 82 std::vector<int> nZoomBeginGlobal = grid->getDistributionServer()->getZoomBeginGlobal();83 std::vector<int> nZoomBeginServer = grid->getDistributionServer()->getZoomBeginServer();84 std::vector<int> nZoomSizeServer = grid->getDistributionServer()->getZoomSizeServer();85 86 65 std::vector<StdSize> start, count; 87 66 … … 91 70 int numElement = axisDomainOrder.numElements(); 92 71 int idxDomain = domainList.size() - 1, idxAxis = axisList.size() - 1; 93 int idx = nZoomBeginGlobal.size() - 1;94 95 start.reserve( nZoomBeginGlobal.size());96 count.reserve( nZoomBeginGlobal.size());72 int idx = domainList.size() * 2 + axisList.size() - 1; 73 74 start.reserve(idx+1); 75 count.reserve(idx+1); 97 76 98 77 for (int i = numElement - 1; i >= 0; --i) … … 103 82 if ((domain->type) != CDomain::type_attr::unstructured) 104 83 { 105 start.push_back( nZoomBeginServer[idx] - nZoomBeginGlobal[idx]);106 count.push_back( nZoomSizeServer[idx]);84 start.push_back(domain->jbegin); 85 count.push_back(domain->nj); 107 86 } 108 87 --idx ; 109 start.push_back(nZoomBeginServer[idx] - nZoomBeginGlobal[idx]); 110 count.push_back(nZoomSizeServer[idx]); 88 start.push_back(domain->ibegin); 89 count.push_back(domain->ni); 90 111 91 --idx ; 112 92 --idxDomain; … … 114 94 else if (1 == axisDomainOrder(i)) 115 95 { 116 start.push_back(nZoomBeginServer[idx] - nZoomBeginGlobal[idx]); 117 count.push_back(nZoomSizeServer[idx]); 96 CAxis* axis = CAxis::get(axisList[idxAxis]); 97 start.push_back(axis->begin); 98 count.push_back(axis->n); 118 99 --idx; 119 100 } -
XIOS/trunk/src/io/nc4_data_output.cpp
r1542 r1553 221 221 case (MULTI_FILE) : 222 222 { 223 // if (domain->isEmpty()) return;224 225 if (server->intraCommSize > 1)226 {227 // SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue());228 // SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue());229 }230 231 223 switch (domain->type) 232 224 { … … 248 240 else bounds_latid = "bounds_"+latName+appendDomid; 249 241 250 SuperClassWriter::addDimension(dimXid, domain-> zoom_ni);251 SuperClassWriter::addDimension(dimYid, domain-> zoom_nj);242 SuperClassWriter::addDimension(dimXid, domain->ni); 243 SuperClassWriter::addDimension(dimYid, domain->nj); 252 244 253 245 if (domain->hasBounds) … … 256 248 if (server->intraCommSize > 1) 257 249 { 258 this->writeLocalAttributes(domain-> zoom_ibegin,259 domain-> zoom_ni,260 domain-> zoom_jbegin,261 domain-> zoom_nj,250 this->writeLocalAttributes(domain->ibegin, 251 domain->ni, 252 domain->jbegin, 253 domain->nj, 262 254 appendDomid); 263 255 264 256 if (singleDomain) 265 257 this->writeLocalAttributes_IOIPSL(dimXid, dimYid, 266 domain-> zoom_ibegin,267 domain-> zoom_ni,268 domain-> zoom_jbegin,269 domain-> zoom_nj,258 domain->ibegin, 259 domain->ni, 260 domain->jbegin, 261 domain->nj, 270 262 domain->ni_glo,domain->nj_glo, 271 263 server->intraCommRank,server->intraCommSize); … … 340 332 break; 341 333 case CDomain::type_attr::rectilinear : 342 CArray<double,1> lat = writtenLat(Range(fromStart,toEnd,domain-> zoom_ni)) ;334 CArray<double,1> lat = writtenLat(Range(fromStart,toEnd,domain->ni)) ; 343 335 SuperClassWriter::writeData(CArray<double,1>(lat.copy()), latid, isCollective, 0); 344 CArray<double,1> lon = writtenLon(Range(0,domain-> zoom_ni-1)) ;336 CArray<double,1> lon = writtenLon(Range(0,domain->ni-1)) ; 345 337 SuperClassWriter::writeData(CArray<double,1>(lon.copy()), lonid, isCollective, 0); 346 338 break; … … 365 357 case (ONE_FILE) : 366 358 { 367 SuperClassWriter::addDimension(dimXid, domain->global_zoom_ni);368 SuperClassWriter::addDimension(dimYid, domain->global_zoom_nj);359 SuperClassWriter::addDimension(dimXid, domain->ni_glo); 360 SuperClassWriter::addDimension(dimYid, domain->nj_glo); 369 361 370 362 if (domain->hasBounds) … … 441 433 else 442 434 { 443 start[1]=domain-> zoom_ibegin-domain->global_zoom_ibegin;444 start[0]=domain-> zoom_jbegin-domain->global_zoom_jbegin;445 count[1]=domain-> zoom_ni ; count[0]=domain->zoom_nj ;435 start[1]=domain->ibegin; 436 start[0]=domain->jbegin; 437 count[1]=domain->ni ; count[0]=domain->nj ; 446 438 } 447 439 … … 468 460 else 469 461 { 470 start[0]=domain-> zoom_jbegin-domain->global_zoom_jbegin;471 count[0]=domain-> zoom_nj;472 CArray<double,1> lat = writtenLat(Range(fromStart,toEnd,domain-> zoom_ni));462 start[0]=domain->jbegin; 463 count[0]=domain->nj; 464 CArray<double,1> lat = writtenLat(Range(fromStart,toEnd,domain->ni)); 473 465 SuperClassWriter::writeData(CArray<double,1>(lat.copy()), latid, isCollective, 0,&start,&count); 474 466 475 start[0]=domain-> zoom_ibegin-domain->global_zoom_ibegin;476 count[0]=domain-> zoom_ni;477 CArray<double,1> lon = writtenLon(Range(0,domain-> zoom_ni-1));467 start[0]=domain->ibegin; 468 count[0]=domain->ni; 469 CArray<double,1> lon = writtenLon(Range(0,domain->ni-1)); 478 470 SuperClassWriter::writeData(CArray<double,1>(lon.copy()), lonid, isCollective, 0,&start,&count); 479 471 } … … 495 487 { 496 488 start[2] = 0; 497 start[1] = domain-> zoom_ibegin - domain->global_zoom_ibegin;498 start[0] = domain-> zoom_jbegin - domain->global_zoom_jbegin;489 start[1] = domain->ibegin; 490 start[0] = domain->jbegin; 499 491 count[2] = domain->nvertex; 500 count[1] = domain-> zoom_ni;501 count[0] = domain-> zoom_nj;492 count[1] = domain->ni; 493 count[0] = domain->nj; 502 494 } 503 495 … … 518 510 else 519 511 { 520 start[1] = domain-> zoom_ibegin - domain->global_zoom_ibegin;521 start[0] = domain-> zoom_jbegin - domain->global_zoom_jbegin;522 count[1] = domain-> zoom_ni;523 count[0] = domain-> zoom_nj;512 start[1] = domain->ibegin; 513 start[0] = domain->jbegin; 514 count[1] = domain->ni; 515 count[0] = domain->nj; 524 516 } 525 517 … … 786 778 else 787 779 { 788 startNodes[0] = domain-> zoom_ibegin-domain->global_zoom_ibegin;789 countNodes[0] = domain-> zoom_ni ;780 startNodes[0] = domain->ibegin; 781 countNodes[0] = domain->ni ; 790 782 } 791 783 … … 809 801 else 810 802 { 811 startEdges[0] = domain-> zoom_ibegin-domain->global_zoom_ibegin;812 countEdges[0] = domain-> zoom_ni;803 startEdges[0] = domain->ibegin; 804 countEdges[0] = domain->ni; 813 805 startNodes[0] = domain->mesh->node_start; 814 806 countNodes[0] = domain->mesh->node_count; 815 startEdgeNodes[0] = domain-> zoom_ibegin-domain->global_zoom_ibegin;807 startEdgeNodes[0] = domain->ibegin; 816 808 startEdgeNodes[1] = 0; 817 countEdgeNodes[0] = domain-> zoom_ni;809 countEdgeNodes[0] = domain->ni; 818 810 countEdgeNodes[1] = 2; 819 811 } … … 845 837 else 846 838 { 847 startFaces[0] = domain-> zoom_ibegin-domain->global_zoom_ibegin;848 countFaces[0] = domain-> zoom_ni ;839 startFaces[0] = domain->ibegin; 840 countFaces[0] = domain->ni ; 849 841 startNodes[0] = domain->mesh->node_start; 850 842 countNodes[0] = domain->mesh->node_count; … … 859 851 countEdgeFaces[0] = domain->mesh->edge_count; 860 852 countEdgeFaces[1]= 2; 861 startFaceConctv[0] = domain-> zoom_ibegin-domain->global_zoom_ibegin;853 startFaceConctv[0] = domain->ibegin; 862 854 startFaceConctv[1] = 0; 863 countFaceConctv[0] = domain-> zoom_ni;855 countFaceConctv[0] = domain->ni; 864 856 countFaceConctv[1] = domain->nvertex; 865 857 } … … 1017 1009 { 1018 1010 dim0.push_back(dimXid); 1019 SuperClassWriter::addDimension(dimXid, domain-> zoom_ni);1011 SuperClassWriter::addDimension(dimXid, domain->ni); 1020 1012 1021 1013 lonid = lonName+appendDomid; … … 1130 1122 else 1131 1123 { 1132 start[0]=domain-> zoom_ibegin - domain->global_zoom_ibegin;1133 count[0]=domain-> zoom_ni;1134 startBounds[0]=domain-> zoom_ibegin-domain->global_zoom_ibegin;1124 start[0]=domain->ibegin; 1125 count[0]=domain->ni; 1126 startBounds[0]=domain->ibegin; 1135 1127 startBounds[1]=0 ; 1136 countBounds[0]=domain-> zoom_ni;1128 countBounds[0]=domain->ni; 1137 1129 countBounds[1]=nvertex ; 1138 1130 } … … 1188 1180 int zoom_count = axis->zoom_n; 1189 1181 int zoom_begin = axis->zoom_begin; 1190 // int zoom_begin = (MULTI_FILE == SuperClass::type) ? axis->global_zoom_begin1191 // : axis->zoom_begin;1192 1182 1193 1183 if ((0 == axis->zoom_n) && (MULTI_FILE == SuperClass::type)) return; … … 2512 2502 if ( wtimeData) 2513 2503 { 2514 // SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep() - 1);2515 // SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1);2516 2504 SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot); 2517 2505 SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot); … … 2519 2507 if (wtimeCounter) 2520 2508 { 2521 // SuperClassWriter::writeData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1);2522 // if (timeCounterType!=record) SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1);2523 2509 SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1,isRoot); 2524 2510 if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot); … … 2530 2516 case (ONE_FILE) : 2531 2517 { 2532 const std::vector<int>& nZoomBeginGlobal = grid->getDistributionServer()->getZoomBeginGlobal();2533 const std::vector<int>& nZoomBeginServer = grid->getDistributionServer()->getZoomBeginServer();2534 const std::vector<int>& nZoomSizeServer = grid->getDistributionServer()->getZoomSizeServer();2535 2518 2536 2519 std::vector<StdSize> start, count; … … 2550 2533 int numElement = axisDomainOrder.numElements(); 2551 2534 int idxDomain = domainList.size() - 1, idxAxis = axisList.size() - 1; 2552 int idx = nZoomBeginGlobal.size() - 1; 2553 2554 start.reserve(nZoomBeginGlobal.size()); 2555 count.reserve(nZoomBeginGlobal.size()); 2556 2535 int idx = domainList.size() * 2 + axisList.size() - 1; 2536 2537 start.reserve(idx+1); 2538 count.reserve(idx+1); 2557 2539 2558 2540 for (int i = numElement - 1; i >= 0; --i) … … 2572 2554 if ((domain->type) != CDomain::type_attr::unstructured) 2573 2555 { 2574 start.push_back( nZoomBeginServer[idx] - nZoomBeginGlobal[idx]);2575 count.push_back( nZoomSizeServer[idx]);2556 start.push_back(domain->jbegin); 2557 count.push_back(domain->nj); 2576 2558 } 2577 2559 --idx; 2578 start.push_back( nZoomBeginServer[idx] - nZoomBeginGlobal[idx]);2579 count.push_back( nZoomSizeServer[idx]);2560 start.push_back(domain->ibegin); 2561 count.push_back(domain->ni); 2580 2562 --idx; 2581 2563 } … … 2593 2575 else 2594 2576 { 2595 start.push_back( nZoomBeginServer[idx] - nZoomBeginGlobal[idx]);2596 count.push_back( nZoomSizeServer[idx]);2577 start.push_back(axis->begin); 2578 count.push_back(axis->n); 2597 2579 } 2598 2599 2580 --idxAxis; 2600 2581 --idx; … … 2610 2591 int numElement = axisDomainOrder.numElements(); 2611 2592 int idxDomain = domainList.size() - 1, idxAxis = axisList.size() - 1; 2612 int idx = domainList.size() * 2 + axisList.size() - 1; // nZoomBeginGlobal.size() - 1;2613 2614 start.reserve( nZoomBeginGlobal.size());2615 count.reserve( nZoomBeginGlobal.size());2593 int idx = domainList.size() * 2 + axisList.size() - 1; 2594 2595 start.reserve(idx+1); 2596 count.reserve(idx+1); 2616 2597 2617 2598 for (int i = numElement - 1; i >= 0; --i) … … 2622 2603 if ((domain->type) != CDomain::type_attr::unstructured) 2623 2604 { 2624 start.push_back(domain-> zoom_jbegin - domain->global_zoom_jbegin);2625 count.push_back(domain-> zoom_nj);2605 start.push_back(domain->jbegin); 2606 count.push_back(domain->nj); 2626 2607 } 2627 2608 --idx ; 2628 2609 2629 start.push_back(domain-> zoom_ibegin - domain->global_zoom_ibegin);2630 count.push_back(domain-> zoom_ni);2610 start.push_back(domain->ibegin); 2611 count.push_back(domain->ni); 2631 2612 --idx ; 2632 2613 --idxDomain; … … 2662 2643 if ( wtimeData) 2663 2644 { 2664 // SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep() - 1);2665 // SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1);2666 2645 SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot); 2667 2646 SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot); … … 2669 2648 if (wtimeCounter) 2670 2649 { 2671 // SuperClassWriter::writeData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1);2672 // if (timeCounterType!=record) SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1);2673 2650 SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1,isRoot); 2674 2651 if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot); -
XIOS/trunk/src/node/domain.cpp
r1549 r1553 30 30 , hasBounds(false), hasArea(false), isCompressible_(false), isUnstructed_(false) 31 31 , isClientAfterTransformationChecked(false), hasLonLat(false) 32 , isRedistributed_(false), hasPole(false) , doZoomByIndex_(false)32 , isRedistributed_(false), hasPole(false) 33 33 , lonvalue(), latvalue(), bounds_lonvalue(), bounds_latvalue() 34 34 , globalLocalIndexMap_(), computedWrittenIndex_(false) 35 35 , clients() 36 36 { 37 37 } … … 42 42 , hasBounds(false), hasArea(false), isCompressible_(false), isUnstructed_(false) 43 43 , isClientAfterTransformationChecked(false), hasLonLat(false) 44 , isRedistributed_(false), hasPole(false) , doZoomByIndex_(false)44 , isRedistributed_(false), hasPole(false) 45 45 , lonvalue(), latvalue(), bounds_lonvalue(), bounds_latvalue() 46 46 , globalLocalIndexMap_(), computedWrittenIndex_(false) 47 47 , clients() 48 48 { 49 49 } … … 185 185 bool CDomain::isEmpty(void) const 186 186 { 187 return ((this->zoom_i_index.isEmpty()) || (0 == this->zoom_i_index.numElements())); 188 187 return ((this->i_index.isEmpty()) || (0 == this->i_index.numElements())); 189 188 } 190 189 … … 866 865 for (int i = 0; i < ni; ++i) j_index(i+j*ni) = j+jbegin; 867 866 } 868 869 checkZoom();870 }871 872 // Check global zoom of a domain873 // If there is no zoom defined for the domain, zoom will have value of global doamin874 void CDomain::checkZoom(void)875 {876 if (global_zoom_ibegin.isEmpty())877 global_zoom_ibegin.setValue(0);878 if (global_zoom_ni.isEmpty())879 global_zoom_ni.setValue(ni_glo);880 if (global_zoom_jbegin.isEmpty())881 global_zoom_jbegin.setValue(0);882 if (global_zoom_nj.isEmpty())883 global_zoom_nj.setValue(nj_glo);884 if (zoom_i_index.isEmpty()) zoom_i_index.setValue(i_index.getValue());885 if (zoom_j_index.isEmpty()) zoom_j_index.setValue(j_index.getValue());886 if (zoom_ibegin.isEmpty()) zoom_ibegin.setValue(ibegin);887 if (zoom_ni.isEmpty()) zoom_ni.setValue(ni);888 if (zoom_jbegin.isEmpty()) zoom_jbegin.setValue(jbegin);889 if (zoom_nj.isEmpty()) zoom_nj.setValue(nj);890 867 } 891 868 892 869 size_t CDomain::getGlobalWrittenSize(void) 893 870 { 894 return global_zoom_ni*global_zoom_nj;871 return ni_glo*nj_glo ; 895 872 } 896 873 //---------------------------------------------------------------- … … 1738 1715 if (indSrv_.find(nbServer) == indSrv_.end()) 1739 1716 { 1740 int i,j,i_ind,j_ind, nbIndex, nbIndexZoom; 1741 int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 1742 int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 1743 1744 // Precompute number of index 1745 int globalIndexCountZoom = 0; 1746 nbIndex = i_index.numElements(); 1747 1748 if (doZoomByIndex_) 1749 { 1750 globalIndexCountZoom = zoom_i_index.numElements(); 1751 } 1752 else 1753 { 1754 for (i = 0; i < nbIndex; ++i) 1755 { 1756 i_ind=i_index(i); 1757 j_ind=j_index(i); 1758 1759 if (i_ind >= global_zoom_ibegin && i_ind <= global_zoom_iend && j_ind >= global_zoom_jbegin && j_ind <= global_zoom_jend) 1760 { 1761 ++globalIndexCountZoom; 1762 } 1763 } 1764 } 1765 1766 // Fill in index 1767 CArray<size_t,1> globalIndexDomainZoom(globalIndexCountZoom); 1768 CArray<size_t,1> localIndexDomainZoom(globalIndexCountZoom); 1769 CArray<size_t,1> globalIndexDomain(nbIndex); 1770 size_t globalIndex; 1771 int globalIndexCount = 0; 1772 1773 for (i = 0; i < nbIndex; ++i) 1774 { 1775 i_ind=i_index(i); 1776 j_ind=j_index(i); 1777 globalIndex = i_ind + j_ind * ni_glo; 1778 globalIndexDomain(i) = globalIndex; 1779 } 1780 1781 if (globalLocalIndexMap_.empty()) 1782 { 1783 for (i = 0; i < nbIndex; ++i) 1784 globalLocalIndexMap_[globalIndexDomain(i)] = i; 1785 } 1786 1787 globalIndexCountZoom = 0; 1788 if (doZoomByIndex_) 1789 { 1790 int nbIndexZoom = zoom_i_index.numElements(); 1791 1792 for (i = 0; i < nbIndexZoom; ++i) 1793 { 1794 i_ind=zoom_i_index(i); 1795 j_ind=zoom_j_index(i); 1796 globalIndex = i_ind + j_ind * ni_glo; 1797 globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; 1798 ++globalIndexCountZoom; 1799 } 1800 } 1801 else 1802 { 1803 int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1; 1804 int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1; 1805 for (i = 0; i < nbIndex; ++i) 1806 { 1807 i_ind=i_index(i); 1808 j_ind=j_index(i); 1809 globalIndex = i_ind + j_ind * ni_glo; 1810 if (i_ind >= global_zoom_ibegin && i_ind <= global_zoom_iend && j_ind >= global_zoom_jbegin && j_ind <= global_zoom_jend) 1811 { 1812 globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; 1813 ++globalIndexCountZoom; 1814 } 1815 } 1816 1817 int iend = ibegin + ni -1; 1818 int jend = jbegin + nj -1; 1819 zoom_ibegin = global_zoom_ibegin > ibegin ? global_zoom_ibegin.getValue() : ibegin; 1820 int zoom_iend = global_zoom_iend < iend ? zoom_iend : iend ; 1821 zoom_ni = zoom_iend-zoom_ibegin+1 ; 1822 1823 zoom_jbegin = global_zoom_jbegin > jbegin ? global_zoom_jbegin.getValue() : jbegin ; 1824 int zoom_jend = global_zoom_jend < jend ? zoom_jend : jend; 1825 zoom_nj = zoom_jend-zoom_jbegin+1; 1826 } 1827 1828 size_t globalSizeIndex = 1, indexBegin, indexEnd; 1829 int range, clientSize = client->clientSize; 1830 std::vector<int> nGlobDomain(2); 1831 nGlobDomain[0] = this->ni_glo; 1832 nGlobDomain[1] = this->nj_glo; 1833 for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 1834 indexBegin = 0; 1835 if (globalSizeIndex <= clientSize) 1836 { 1837 indexBegin = rank%globalSizeIndex; 1838 indexEnd = indexBegin; 1839 } 1840 else 1841 { 1842 for (int i = 0; i < clientSize; ++i) 1843 { 1844 range = globalSizeIndex / clientSize; 1845 if (i < (globalSizeIndex%clientSize)) ++range; 1846 if (i == client->clientRank) break; 1847 indexBegin += range; 1848 } 1849 indexEnd = indexBegin + range - 1; 1850 } 1851 1852 // Even if servers have no index, they must received something from client 1853 // We only use several client to send "empty" message to these servers 1854 CServerDistributionDescription serverDescription(nGlobDomain, nbServer); 1855 std::vector<int> serverZeroIndex; 1856 if (isUnstructed_) serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 0); 1857 else serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 1); 1858 1859 std::list<int> serverZeroIndexLeader; 1860 std::list<int> serverZeroIndexNotLeader; 1861 CContextClient::computeLeader(client->clientRank, client->clientSize, serverZeroIndex.size(), serverZeroIndexLeader, serverZeroIndexNotLeader); 1862 for (std::list<int>::iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 1863 *it = serverZeroIndex[*it]; 1864 1865 CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), 1866 client->intraComm); 1867 clientServerMap->computeServerIndexMapping(globalIndexDomain, nbServer); 1868 CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 1869 1870 CClientServerMapping::GlobalIndexMap::const_iterator it = globalIndexDomainOnServer.begin(), 1717 int i,j,i_ind,j_ind, nbIndex=i_index.numElements(); 1718 int globalIndexCount = i_index.numElements(); 1719 // Fill in index 1720 CArray<size_t,1> globalIndexDomain(nbIndex); 1721 size_t globalIndex; 1722 1723 for (i = 0; i < nbIndex; ++i) 1724 { 1725 i_ind=i_index(i); 1726 j_ind=j_index(i); 1727 globalIndex = i_ind + j_ind * ni_glo; 1728 globalIndexDomain(i) = globalIndex; 1729 } 1730 1731 if (globalLocalIndexMap_.empty()) 1732 { 1733 for (i = 0; i < nbIndex; ++i) 1734 globalLocalIndexMap_[globalIndexDomain(i)] = i; 1735 } 1736 1737 size_t globalSizeIndex = 1, indexBegin, indexEnd; 1738 int range, clientSize = client->clientSize; 1739 std::vector<int> nGlobDomain(2); 1740 nGlobDomain[0] = this->ni_glo; 1741 nGlobDomain[1] = this->nj_glo; 1742 for (int i = 0; i < nGlobDomain.size(); ++i) globalSizeIndex *= nGlobDomain[i]; 1743 indexBegin = 0; 1744 if (globalSizeIndex <= clientSize) 1745 { 1746 indexBegin = rank%globalSizeIndex; 1747 indexEnd = indexBegin; 1748 } 1749 else 1750 { 1751 for (int i = 0; i < clientSize; ++i) 1752 { 1753 range = globalSizeIndex / clientSize; 1754 if (i < (globalSizeIndex%clientSize)) ++range; 1755 if (i == client->clientRank) break; 1756 indexBegin += range; 1757 } 1758 indexEnd = indexBegin + range - 1; 1759 } 1760 1761 // Even if servers have no index, they must received something from client 1762 // We only use several client to send "empty" message to these servers 1763 CServerDistributionDescription serverDescription(nGlobDomain, nbServer); 1764 std::vector<int> serverZeroIndex; 1765 if (isUnstructed_) serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 0); 1766 else serverZeroIndex = serverDescription.computeServerGlobalIndexInRange(std::make_pair<size_t&,size_t&>(indexBegin, indexEnd), 1); 1767 1768 std::list<int> serverZeroIndexLeader; 1769 std::list<int> serverZeroIndexNotLeader; 1770 CContextClient::computeLeader(client->clientRank, client->clientSize, serverZeroIndex.size(), serverZeroIndexLeader, serverZeroIndexNotLeader); 1771 for (std::list<int>::iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 1772 *it = serverZeroIndex[*it]; 1773 1774 CClientServerMapping* clientServerMap = new CClientServerMappingDistributed(serverDescription.getGlobalIndexRange(), client->intraComm); 1775 clientServerMap->computeServerIndexMapping(globalIndexDomain, nbServer); 1776 CClientServerMapping::GlobalIndexMap& globalIndexDomainOnServer = clientServerMap->getGlobalIndexOnServer(); 1777 1778 CClientServerMapping::GlobalIndexMap::const_iterator it = globalIndexDomainOnServer.begin(), 1871 1779 ite = globalIndexDomainOnServer.end(); 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1780 indSrv_[nbServer].swap(globalIndexDomainOnServer); 1781 connectedServerRank_[nbServer].clear(); 1782 for (it = indSrv_[nbServer].begin(); it != ite; ++it) 1783 connectedServerRank_[nbServer].push_back(it->first); 1784 1785 for (std::list<int>::const_iterator it = serverZeroIndexLeader.begin(); it != serverZeroIndexLeader.end(); ++it) 1786 connectedServerRank_[nbServer].push_back(*it); 1787 1788 // Even if a client has no index, it must connect to at least one server and 1789 // send an "empty" data to this server 1790 if (connectedServerRank_[nbServer].empty()) 1791 connectedServerRank_[nbServer].push_back(client->clientRank % client->serverSize); 1792 1793 nbSenders[nbServer] = clientServerMap->computeConnectedClients(client->serverSize, client->clientSize, client->intraComm, connectedServerRank_[nbServer]); 1794 delete clientServerMap; 1887 1795 } 1888 1796 } … … 1904 1812 1905 1813 std::vector<int> nBegin(2), nSize(2), nBeginGlobal(2), nGlob(2); 1906 nBegin[0] = zoom_ibegin; nBegin[1] = zoom_jbegin;1907 nSize[0] = zoom_ni; nSize[1] = zoom_nj;1814 nBegin[0] = ibegin; nBegin[1] = jbegin; 1815 nSize[0] = ni; nSize[1] = nj; 1908 1816 nBeginGlobal[0] = 0; nBeginGlobal[1] = 0; 1909 1817 nGlob[0] = ni_glo; nGlob[1] = nj_glo; … … 2005 1913 2006 1914 std::vector<int> nBegin(2), nSize(2), nBeginGlobal(2), nGlob(2); 2007 nBegin[0] = zoom_ibegin; nBegin[1] = zoom_jbegin;2008 nSize[0] = zoom_ni; nSize[1] = zoom_nj;1915 nBegin[0] = ibegin; nBegin[1] = jbegin; 1916 nSize[0] = ni; nSize[1] = nj; 2009 1917 nBeginGlobal[0] = 0; nBeginGlobal[1] = 0; 2010 1918 nGlob[0] = ni_glo; nGlob[1] = nj_glo; … … 2075 1983 2076 1984 /*! 2077 Send global index and zoom index from client to connected client(s) 2078 zoom index can be smaller than global index 1985 Send global index from client to connected client(s) 2079 1986 */ 2080 1987 void CDomain::sendIndex() … … 2090 1997 2091 1998 list<CMessage> list_msgsIndex; 2092 list<CArray<int,1> > list_ind Zoom, list_writtenInd, list_indGlob;1999 list<CArray<int,1> > list_indGlob; 2093 2000 2094 2001 std::unordered_map<int, vector<size_t> >::const_iterator itIndex, iteIndex; … … 2164 2071 msg << isUnstructed_; 2165 2072 msg << ni_srv << ibegin_srv << nj_srv << jbegin_srv; 2166 msg << global_zoom_ni.getValue() << global_zoom_ibegin.getValue() << global_zoom_nj.getValue() << global_zoom_jbegin.getValue();2073 msg << ni_glo.getValue() << nj_glo.getValue(); 2167 2074 msg << isCompressible_; 2168 2075 … … 2584 2491 2585 2492 /*! 2586 Receive attributes from client(s) : zoom info and begin and n of each server2493 Receive attributes from client(s) 2587 2494 \param[in] rank rank of client source 2588 2495 \param[in] buffer message containing attributes info … … 2591 2498 { 2592 2499 int ni_tmp, ibegin_tmp, nj_tmp, jbegin_tmp; 2593 int global_zoom_ni_tmp, global_zoom_ibegin_tmp, global_zoom_nj_tmp, global_zoom_jbegin_tmp;2500 int ni_glo_tmp, nj_glo_tmp; 2594 2501 buffer >> isUnstructed_ >> ni_tmp >> ibegin_tmp >> nj_tmp >> jbegin_tmp 2595 >> global_zoom_ni_tmp >> global_zoom_ibegin_tmp >> global_zoom_nj_tmp >> global_zoom_jbegin_tmp2502 >> ni_glo_tmp >> nj_glo_tmp 2596 2503 >> isCompressible_; 2504 2597 2505 ni.setValue(ni_tmp); 2598 2506 ibegin.setValue(ibegin_tmp); 2599 2507 nj.setValue(nj_tmp); 2600 2508 jbegin.setValue(jbegin_tmp); 2601 2602 global_zoom_ni.setValue(global_zoom_ni_tmp); 2603 global_zoom_ibegin.setValue(global_zoom_ibegin_tmp); 2604 global_zoom_nj.setValue(global_zoom_nj_tmp); 2605 global_zoom_jbegin.setValue(global_zoom_jbegin_tmp); 2606 2607 int iend = ibegin + ni - 1; 2608 int jend = jbegin + nj - 1; 2609 int zoom_iend_glob = global_zoom_ibegin + global_zoom_ni - 1; 2610 int zoom_jend_glob = global_zoom_jbegin + global_zoom_nj - 1; 2611 2612 zoom_ibegin.setValue(global_zoom_ibegin > ibegin ? global_zoom_ibegin.getValue() : ibegin); 2613 int zoom_iend = zoom_iend_glob < iend ? zoom_iend_glob : iend ; 2614 zoom_ni.setValue(zoom_iend-zoom_ibegin+1); 2615 2616 zoom_jbegin.setValue(global_zoom_jbegin > jbegin ? global_zoom_jbegin.getValue() : jbegin); 2617 int zoom_jend = zoom_jend_glob < jend ? zoom_jend_glob : jend ; 2618 zoom_nj.setValue(zoom_jend-zoom_jbegin+1); 2619 2620 if (zoom_ni<=0 || zoom_nj<=0) 2621 { 2622 zoom_ni=0 ; zoom_ibegin=global_zoom_ibegin ; //=0; zoom_iend=0 ; 2623 zoom_nj=0 ; zoom_jbegin=global_zoom_jbegin ; //=0; zoom_jend=0 ; 2624 } 2509 ni_glo.setValue(ni_glo_tmp); 2510 nj_glo.setValue(nj_glo_tmp); 2625 2511 2626 2512 } -
XIOS/trunk/src/node/domain.hpp
r1542 r1553 165 165 void checkArea(void); 166 166 void checkLonLat(); 167 void checkZoom(void);168 167 169 168 void setTransformations(const TransMapTypes&); … … 183 182 static void recvDistributionAttributes(CEventServer& event); 184 183 static void recvIndex(CEventServer& event); 185 static void recvIndexZoom(CEventServer& event);186 184 static void recvMask(CEventServer& event); 187 185 static void recvLon(CEventServer& event); … … 206 204 std::set<CContextClient*> clientsSet; 207 205 208 bool doZoomByIndex_;209 206 bool isChecked, computedWrittenIndex_; 210 207 std::set<StdString> relFiles, relFilesCompressed; -
XIOS/trunk/src/node/grid.cpp
r1542 r1553 1632 1632 std::vector<CAxis*> axisList = getAxis(); 1633 1633 std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize), nZoomBeginGlobal(ssize), nGlobElement(numElement); 1634 std::vector<CArray<int,1> > globalZoomIndex(numElement); 1634 std::vector<CArray<int,1> > globalZoomIndex(numElement); // RENAME INTO globalIndex 1635 1635 for (int i = 0; i < numElement; ++i) 1636 1636 { … … 1638 1638 if (2 == axis_domain_order(i)) //domain 1639 1639 { 1640 nZoomBegin[indexMap[i]] = domainList[domainId]-> zoom_ibegin;1641 nZoomSize[indexMap[i]] = domainList[domainId]-> zoom_ni;1642 nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->global_zoom_ibegin;1640 nZoomBegin[indexMap[i]] = domainList[domainId]->ibegin; 1641 nZoomSize[indexMap[i]] = domainList[domainId]->ni; 1642 nZoomBeginGlobal[indexMap[i]] = 0; 1643 1643 nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 1644 1644 1645 nZoomBegin[indexMap[i] + 1] = domainList[domainId]-> zoom_jbegin;1646 nZoomSize[indexMap[i] + 1] = domainList[domainId]-> zoom_nj;1647 nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]->global_zoom_jbegin;1645 nZoomBegin[indexMap[i] + 1] = domainList[domainId]->jbegin; 1646 nZoomSize[indexMap[i] + 1] = domainList[domainId]->nj; 1647 nZoomBeginGlobal[indexMap[i] + 1] = 0; 1648 1648 nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 1649 1649 -
XIOS/trunk/src/transformation/domain_algorithm_expand.cpp
r1311 r1553 228 228 domainDestination->ni.setValue(niDst); 229 229 domainDestination->nj.setValue(njDst); 230 domainDestination->global_zoom_ni.setValue(domainSource->global_zoom_ni+2);231 domainDestination->global_zoom_nj.setValue(domainSource->global_zoom_nj+2);232 230 233 231 CArray<bool,1>& mask_1d_dst = domainDestination->domainMask; -
XIOS/trunk/src/transformation/domain_algorithm_extract.cpp
r1549 r1553 140 140 } 141 141 if (domainSrc_->hasArea) domainDest_->area.resize(niDest,njDest); 142 143 domainDest_->global_zoom_ni.setValue(extractNi_);144 domainDest_->global_zoom_ibegin.setValue(0);145 domainDest_->global_zoom_nj.setValue(extractNj_);146 domainDest_->global_zoom_jbegin.setValue(0);147 142 148 143 this->transformationMapping_.resize(1); -
XIOS/trunk/src/transformation/domain_algorithm_zoom.cpp
r1281 r1553 1 /*!2 \file domain_algorithm_zoom.cpp3 \author Ha NGUYEN4 \since 02 Jul 20155 \date 02 Jul 20156 7 \brief Algorithm for zooming on an domain.8 */9 1 #include "domain_algorithm_zoom.hpp" 10 2 #include "zoom_domain.hpp" … … 12 4 #include "grid.hpp" 13 5 #include "grid_transformation_factory_impl.hpp" 6 #include "attribute_template.hpp" 14 7 15 8 namespace xios { … … 67 60 << "Zoom size is " << zoomNj_ ); 68 61 } 62 63 // Calculate the size of local domain 64 int ind, indLocSrc, indLocDest, iIdxSrc, jIdxSrc, destIBegin = -1, destJBegin = -1, niDest = 0, njDest = 0, ibeginDest, jbeginDest ; 65 int indGloDest, indGloSrc, niGloSrc = domainSrc_->ni_glo, iSrc, jSrc; 66 for (int j = 0; j < domainSrc_->nj.getValue(); j++) 67 { 68 for (int i = 0; i < domainSrc_->ni.getValue(); i++) 69 { 70 ind = j*domainSrc_->ni + i; 71 iIdxSrc = domainSrc_->i_index(ind); 72 if ((iIdxSrc >= zoomIBegin_) && (iIdxSrc <= zoomIEnd_)) 73 { 74 jIdxSrc = domainSrc_->j_index(ind); 75 if ((jIdxSrc >= zoomJBegin_) && (jIdxSrc <= zoomJEnd_)) 76 { 77 if ((niDest == 0) && (njDest == 0)) 78 { 79 destIBegin = i; 80 destJBegin = j; 81 } 82 if (i == destIBegin) ++njDest; 83 } 84 if (j == destJBegin) ++niDest; 85 86 } 87 } 88 } 89 ibeginDest = destIBegin + domainSrc_->ibegin - zoomIBegin_; 90 jbeginDest = destJBegin + domainSrc_->jbegin - zoomJBegin_; 91 domainDest_->ni_glo.setValue(zoomNi_); 92 domainDest_->nj_glo.setValue(zoomNj_); 93 domainDest_->ni.setValue(niDest); 94 domainDest_->nj.setValue(njDest); 95 domainDest_->ibegin.setValue(ibeginDest); 96 domainDest_->jbegin.setValue(jbeginDest); 97 domainDest_->i_index.resize(niDest*njDest); 98 domainDest_->j_index.resize(niDest*njDest); 99 100 domainDest_->data_ni.setValue(niDest); 101 domainDest_->data_nj.setValue(njDest); 102 domainDest_->data_ibegin.setValue(0); // local position 103 domainDest_->data_jbegin.setValue(0); // local position 104 domainDest_->data_i_index.resize(niDest*njDest); // local position 105 domainDest_->data_j_index.resize(niDest*njDest); // local position 106 107 domainDest_->domainMask.resize(niDest*njDest); 108 109 if (!domainSrc_->lonvalue_1d.isEmpty()) 110 { 111 if (domainDest_->type == CDomain::type_attr::rectilinear) 112 { 113 domainDest_->lonvalue_1d.resize(niDest); 114 domainDest_->latvalue_1d.resize(njDest); 115 } 116 else if (domainDest_->type == CDomain::type_attr::unstructured) 117 { 118 domainDest_->lonvalue_1d.resize(niDest); 119 domainDest_->latvalue_1d.resize(niDest); 120 } 121 } 122 else if (!domainSrc_->lonvalue_2d.isEmpty()) 123 { 124 domainDest_->lonvalue_2d.resize(niDest,njDest); 125 domainDest_->latvalue_2d.resize(niDest,njDest); 126 } 127 128 if (domainSrc_->hasBounds) 129 { 130 if (!domainSrc_->bounds_lon_2d.isEmpty()) 131 { 132 domainDest_->bounds_lon_2d.resize(domainDest_->nvertex, niDest, njDest); 133 domainDest_->bounds_lon_2d.resize(domainDest_->nvertex, niDest, njDest); 134 } 135 else if (!domainSrc_->bounds_lon_1d.isEmpty()) 136 { 137 domainDest_->bounds_lon_1d.resize(domainDest_->nvertex, niDest); 138 domainDest_->bounds_lon_1d.resize(domainDest_->nvertex, niDest); 139 } 140 } 141 if (domainSrc_->hasArea) domainDest_->area.resize(niDest,njDest); 142 143 this->transformationMapping_.resize(1); 144 this->transformationWeight_.resize(1); 145 TransformationIndexMap& transMap = this->transformationMapping_[0]; 146 TransformationWeightMap& transWeight = this->transformationWeight_[0]; 147 148 for (int iDest = 0; iDest < niDest; iDest++) 149 { 150 iSrc = iDest + destIBegin; 151 for (int jDest = 0; jDest < njDest; jDest++) 152 { 153 jSrc = jDest + destJBegin; 154 ind = jSrc * domainSrc_->ni + iSrc; 155 iIdxSrc = domainSrc_->i_index(ind); 156 jIdxSrc = domainSrc_->j_index(ind); 157 indLocDest = jDest*niDest + iDest; 158 indGloDest = (jDest + jbeginDest)*zoomNi_ + (iDest + ibeginDest); 159 indLocSrc = (jDest+destJBegin)*domainSrc_->ni + (iDest+destIBegin); 160 indGloSrc = (jIdxSrc )* niGloSrc + iIdxSrc; 161 domainDest_->i_index(indLocDest) = iDest + ibeginDest; // i_index contains global positions 162 domainDest_->j_index(indLocDest) = jDest + jbeginDest; // i_index contains global positions 163 domainDest_->data_i_index(indLocDest) = (domainSrc_->data_dim == 1) ? indLocDest : iDest; // data_i_index contains local positions 164 domainDest_->data_j_index(indLocDest) = (domainSrc_->data_dim == 1) ? 0 :jDest; // data_i_index contains local positions 165 domainDest_->domainMask(indLocDest) = domainSrc_->domainMask(indLocSrc); 166 167 if (domainSrc_->hasArea) 168 domainDest_->area(iDest,jDest) = domainSrc_->area(iSrc,jSrc); 169 170 if (domainSrc_->hasBounds) 171 { 172 if (!domainSrc_->bounds_lon_2d.isEmpty()) 173 { 174 for (int n = 0; n < domainSrc_->nvertex; ++n) 175 { 176 domainDest_->bounds_lon_2d(n,iDest,jDest) = domainSrc_->bounds_lon_2d(n,iSrc,jSrc); 177 domainDest_->bounds_lat_2d(n,iDest,jDest) = domainSrc_->bounds_lat_2d(n,iSrc,jSrc); 178 } 179 } 180 else if (!domainSrc_->bounds_lon_1d.isEmpty()) 181 { 182 for (int n = 0; n < domainSrc_->nvertex; ++n) 183 { 184 domainDest_->bounds_lon_1d(n,iDest) = domainSrc_->bounds_lon_1d(n,iSrc); 185 domainDest_->bounds_lat_1d(n,iDest) = domainSrc_->bounds_lat_1d(n,iSrc); 186 } 187 } 188 } 189 190 if (domainSrc_->hasLonLat) 191 { 192 if (domainDest_->type == CDomain::type_attr::rectilinear) 193 { 194 domainDest_->latvalue_1d(jDest) = domainSrc_->latvalue_1d(jSrc); 195 } 196 else if (domainDest_->type == CDomain::type_attr::curvilinear) 197 { 198 domainDest_->lonvalue_2d(iDest,jDest) = domainSrc_->lonvalue_2d(iSrc,jSrc); 199 domainDest_->latvalue_2d(iDest,jDest) = domainSrc_->latvalue_2d(iSrc,jSrc); 200 } 201 } 202 203 transMap[indGloDest].push_back(indGloSrc); 204 transWeight[indGloDest].push_back(1.0); 205 206 } 207 if (domainSrc_->hasLonLat) 208 { 209 if (domainDest_->type == CDomain::type_attr::unstructured) 210 { 211 domainDest_->lonvalue_1d(iDest) = domainSrc_->lonvalue_1d(iSrc); 212 domainDest_->latvalue_1d(iDest) = domainSrc_->latvalue_1d(iSrc); 213 } 214 else if (domainDest_->type == CDomain::type_attr::rectilinear) 215 { 216 domainDest_->lonvalue_1d(iDest) = domainSrc_->lonvalue_1d(iSrc); 217 } 218 } 219 } 220 69 221 } 70 222 … … 74 226 void CDomainAlgorithmZoom::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 75 227 { 76 77 int niGlob = domainSrc_->ni_glo.getValue(); 78 int njGlob = domainSrc_->nj_glo.getValue(); 79 80 this->transformationMapping_.resize(1); 81 this->transformationWeight_.resize(1); 82 83 TransformationIndexMap& transMap = this->transformationMapping_[0]; 84 TransformationWeightMap& transWeight = this->transformationWeight_[0]; 85 86 int domainGlobalIndex; 87 int iglob ; 88 int jglob ; 89 const CArray<int,1>& i_index = domainSrc_->i_index.getValue() ; 90 const CArray<int,1>& j_index = domainSrc_->j_index.getValue() ; 91 92 int nglo = i_index.numElements() ; 93 for (size_t i = 0; i < nglo ; ++i) 94 { 95 iglob=i_index(i) ; jglob=j_index(i) ; 96 if (iglob>=zoomIBegin_ && iglob<=zoomIEnd_ && jglob>=zoomJBegin_ && jglob<=zoomJEnd_) 97 { 98 domainGlobalIndex = jglob*niGlob + iglob; 99 transMap[domainGlobalIndex].push_back(domainGlobalIndex); 100 transWeight[domainGlobalIndex].push_back(1.0); 101 } 102 } 103 updateZoom(); 104 } 105 106 /*! 107 After a zoom on domain, it should be certain that (global) zoom begin and (global) zoom size are updated 108 */ 109 void CDomainAlgorithmZoom::updateZoom() 110 { 111 domainDest_->global_zoom_ibegin = zoomIBegin_; 112 domainDest_->global_zoom_jbegin = zoomJBegin_; 113 domainDest_->global_zoom_ni = zoomNi_; 114 domainDest_->global_zoom_nj = zoomNj_; 115 } 116 117 /*! 118 Update mask on domain 119 Because only zoomed region on domain is not masked, the remaining must be masked to make sure 120 correct index be extracted 121 */ 122 // void CDomainAlgorithmZoom::updateDomainDestinationMask() 123 // { 124 // int niMask = domainDest_->ni.getValue(); 125 // int iBeginMask = domainDest_->ibegin.getValue(); 126 // int njMask = domainDest_->nj.getValue(); 127 // int jBeginMask = domainDest_->jbegin.getValue(); 128 // int niGlob = domainDest_->ni_glo.getValue(); 129 // int globalIndexMask = 0; 130 131 // TransformationIndexMap& transMap = this->transformationMapping_[0]; 132 // TransformationIndexMap::const_iterator ite = (transMap).end(); 133 // for (int j = 0; j < njMask; ++j) 134 // { 135 // for (int i = 0; i < niMask; ++i) 136 // { 137 // globalIndexMask = (j+jBeginMask) * niGlob + (i + iBeginMask); 138 // if (transMap.find(globalIndexMask) == ite) 139 // (domainDest_->mask_1d)(i+j*niMask) = false; 140 // } 141 // } 142 // } 143 144 } 228 } 229 230 231 } -
XIOS/trunk/src/transformation/domain_algorithm_zoom.hpp
r1144 r1553 1 /*!2 \file domain_algorithm_zoom.hpp3 \author Ha NGUYEN4 \since 03 June 20155 \date 12 June 20156 1 7 \brief Algorithm for zooming on an domain.8 */9 2 #ifndef __XIOS_DOMAIN_ALGORITHM_ZOOM_HPP__ 10 3 #define __XIOS_DOMAIN_ALGORITHM_ZOOM_HPP__ … … 20 13 /*! 21 14 \class CDomainAlgorithmZoom 22 Implementing zoom on domain 23 A zoomed region can be considered as region that isnt masked. 24 Only this zoomed region is extracted to write on Netcdf. 15 Implementing zoom (alternative zoom) on domain 25 16 */ 26 17 class CDomainAlgorithmZoom : public CDomainAlgorithmTransformation … … 33 24 static bool registerTrans(); 34 25 protected: 26 void updateDomainAttributes(); 35 27 void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs); 36 28 37 29 private: 38 // void updateDomainDestinationMask();39 30 void updateZoom(); 40 31
Note: See TracChangeset
for help on using the changeset viewer.