- Timestamp:
- 07/07/15 10:46:33 (9 years ago)
- Location:
- XIOS/trunk
- Files:
-
- 7 added
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/inputs/Version2/iodef.xml
r630 r631 54 54 </axis> 55 55 <axis id="axis_H" axis_ref="axis_C"> 56 <!-- <inverse_axis />-->57 <zoom_axis zoom_begin="0" zoom_size=" 3" />56 <inverse_axis /> 57 <zoom_axis zoom_begin="0" zoom_size="1" /> 58 58 </axis> 59 59 </axis_definition> … … 61 61 <domain_definition> 62 62 <domain id="domain_A" /> 63 <domain id="domain_A_zoom" domain_ref="domain_A"> 64 <zoom_domain zoom_ibegin="1" zoom_ni="3" zoom_jbegin="0" zoom_nj="4"/> 65 <zoom_domain zoom_ibegin="0" zoom_ni="2" zoom_jbegin="0" zoom_nj="2"/> 66 </domain> 63 67 </domain_definition> 64 68 … … 82 86 </grid> 83 87 <grid id="grid_Axis_tranformed"> 84 <domain domain_ref="domain_A" /> 85 <axis axis_ref="axis_H" /> 88 <!-- <domain domain_ref="domain_A" />--> 89 <domain domain_ref="domain_A_zoom" /> 90 <axis axis_ref="axis_H" /> 86 91 <!-- <axis axis_ref="axis_E" />--> 87 92 <!-- <axis axis_ref="axis_F" />--> -
XIOS/trunk/src/config/node_type.conf
r630 r631 43 43 #endif //__XIOS_CInterpolateAxis__ 44 44 45 #ifdef __XIOS_CZoomDomain__ 46 DECLARE_NODE(ZoomDomain, zoom_domain) 47 #endif //__XIOS_CZoomDomain__ 48 45 49 #ifdef __XIOS_CContext__ 46 50 DECLARE_NODE_PAR(Context, context) -
XIOS/trunk/src/distribution_client.cpp
r624 r631 200 200 nBeginLocal_.at(indexMap_[idx]+1) = 0; 201 201 nBeginGlobal_.at(indexMap_[idx]+1) = domList[domIndex]->jbegin; 202 nZoomBegin_.at((indexMap_[idx]+1)) = domList[domIndex]-> zoom_jbegin;203 nZoomEnd_.at((indexMap_[idx]+1)) = domList[domIndex]-> zoom_jbegin + domList[domIndex]->zoom_nj-1;202 nZoomBegin_.at((indexMap_[idx]+1)) = domList[domIndex]->global_zoom_jbegin; 203 nZoomEnd_.at((indexMap_[idx]+1)) = domList[domIndex]->global_zoom_jbegin + domList[domIndex]->global_zoom_nj-1; 204 204 205 205 dataBegin_.at(indexMap_[idx]+1) = (2 == domList[domIndex]->data_dim) ? domList[domIndex]->data_jbegin.getValue() : -1; … … 212 212 nBeginLocal_.at(indexMap_[idx]) = 0; 213 213 nBeginGlobal_.at(indexMap_[idx]) = domList[domIndex]->ibegin; 214 nZoomBegin_.at((indexMap_[idx])) = domList[domIndex]-> zoom_ibegin;215 nZoomEnd_.at((indexMap_[idx])) = domList[domIndex]-> zoom_ibegin + domList[domIndex]->zoom_ni-1;214 nZoomBegin_.at((indexMap_[idx])) = domList[domIndex]->global_zoom_ibegin; 215 nZoomEnd_.at((indexMap_[idx])) = domList[domIndex]->global_zoom_ibegin + domList[domIndex]->global_zoom_ni-1; 216 216 217 217 dataBegin_.at(indexMap_[idx]) = domList[domIndex]->data_ibegin.getValue(); -
XIOS/trunk/src/group_factory_decl.cpp
r630 r631 28 28 macro(CZoomAxisGroup) 29 29 macro(CInterpolateAxisGroup) 30 macro(CZoomDomainGroup) 30 31 } -
XIOS/trunk/src/group_template_decl.cpp
r630 r631 17 17 macro(ZoomAxis) 18 18 macro(InterpolateAxis) 19 macro(ZoomDomain) 19 20 20 21 } -
XIOS/trunk/src/node/axis.cpp
r630 r631 104 104 // << "The array \'value\' of axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] has a different size that the one defined by the \'size\' attribute"); 105 105 106 if (0 == global_zoom_size) global_zoom_size = size; 106 107 107 this->checkData(); 108 108 this->checkMask(); 109 //this->checkZoom();109 this->checkZoom(); 110 110 111 111 if (!bounds.isEmpty()) … … 138 138 } 139 139 140 // void CAxis::checkZoom(void) 141 // { 142 // StdSize zoom_begin,zoom_end, zoom_size, axisSize; 143 // 144 // zoom_begin = (this->zoom_begin.isEmpty()) ? 0 : this->zoom_begin.getValue() ; 145 // zoom_size = (this->zoom_size.isEmpty()) ? size.getValue() : this->zoom_size.getValue() ; 146 // zoom_end = (this->zoom_end.isEmpty()) ? (size.getValue() - 1) : this->zoom_end.getValue() ; 147 // 148 // if (this->zoom_begin.isEmpty()) zoom_begin=zoom_end-zoom_size+1 ; 149 // if (this->zoom_end.isEmpty()) zoom_end=zoom_begin+zoom_size-1 ; 150 // if (this->zoom_size.isEmpty()) zoom_size=zoom_end-zoom_begin+1 ; 151 // axisSize = size.getValue(); 152 // 153 // if ( (zoom_begin < 0) || (zoom_begin > axisSize-1) || (zoom_end<0) || (zoom_end>axisSize-1) || (zoom_size<1) || (zoom_size>axisSize) || (zoom_begin>zoom_end)) 154 // ERROR("CAxis::checkAttributes(void)", 155 // << "One or more attributes among <zoom_begin>, <zoom_end>, <zoom_size> of axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] are not well specified"); 156 // 157 // this->zoom_begin.setValue(zoom_begin) ; 158 // this->zoom_end.setValue(zoom_end) ; 159 // this->zoom_size.setValue(zoom_size) ; 160 // } 140 void CAxis::checkZoom(void) 141 { 142 if (0 == global_zoom_size) global_zoom_size = this->size.getValue(); 143 } 161 144 162 145 void CAxis::checkMask() -
XIOS/trunk/src/node/axis.hpp
r630 r631 105 105 void checkData(); 106 106 void checkMask(); 107 //void checkZoom();107 void checkZoom(); 108 108 void checkTransformations(); 109 109 void computeServerIndex(const std::vector<int>& globalDim, int orderPositionInGrid, -
XIOS/trunk/src/node/domain.cpp
r622 r631 16 16 #include "server_distribution_description.hpp" 17 17 #include "client_server_mapping_distributed.hpp" 18 #include "zoom_domain.hpp" 18 19 19 20 namespace xios { … … 547 548 548 549 // compute client zoom indices 549 550 int zoom_iend=zoom_ibegin+zoom_ni-1 ; 551 zoom_ibegin_client = ibegin_client > zoom_ibegin ? ibegin_client : zoom_ibegin ; 552 zoom_iend_client = iend_client < zoom_iend ? iend_client : zoom_iend ; 550 // compute client zoom indices 551 if (0 == global_zoom_ni) global_zoom_ni = ni_glo; 552 if (0 == global_zoom_nj) global_zoom_nj = nj_glo; 553 554 int global_zoom_iend=global_zoom_ibegin+global_zoom_ni-1 ; 555 zoom_ibegin_client = ibegin_client > global_zoom_ibegin ? ibegin_client : global_zoom_ibegin ; 556 zoom_iend_client = iend_client < global_zoom_iend ? iend_client : global_zoom_iend ; 553 557 zoom_ni_client=zoom_iend_client-zoom_ibegin_client+1 ; 554 558 if (zoom_ni_client<0) zoom_ni_client=0 ; 555 559 556 560 557 int zoom_jend=zoom_jbegin+zoom_nj-1 ;558 zoom_jbegin_client = jbegin_client > zoom_jbegin ? jbegin_client :zoom_jbegin ;559 zoom_jend_client = jend_client < zoom_jend ? jend_client :zoom_jend ;561 int global_zoom_jend=global_zoom_jbegin+global_zoom_nj-1 ; 562 zoom_jbegin_client = jbegin_client > global_zoom_jbegin ? jbegin_client : global_zoom_jbegin ; 563 zoom_jend_client = jend_client < global_zoom_jend ? jend_client : global_zoom_jend ; 560 564 zoom_nj_client=zoom_jend_client-zoom_jbegin_client+1 ; 561 565 if (zoom_nj_client<0) zoom_nj_client=0 ; 566 567 // int zoom_iend=zoom_ibegin+zoom_ni-1 ; 568 // zoom_ibegin_client = ibegin_client > zoom_ibegin ? ibegin_client : zoom_ibegin ; 569 // zoom_iend_client = iend_client < zoom_iend ? iend_client : zoom_iend ; 570 // zoom_ni_client=zoom_iend_client-zoom_ibegin_client+1 ; 571 // if (zoom_ni_client<0) zoom_ni_client=0 ; 572 // 573 // 574 // int zoom_jend=zoom_jbegin+zoom_nj-1 ; 575 // zoom_jbegin_client = jbegin_client > zoom_jbegin ? jbegin_client : zoom_jbegin ; 576 // zoom_jend_client = jend_client < zoom_jend ? jend_client : zoom_jend ; 577 // zoom_nj_client=zoom_jend_client-zoom_jbegin_client+1 ; 578 // if (zoom_nj_client<0) zoom_nj_client=0 ; 562 579 563 580 } … … 598 615 599 616 this->checkDomain(); 600 this->checkZoom();617 // this->checkZoom(); 601 618 this->checkBounds(); 602 619 this->checkArea(); … … 607 624 this->checkDomainData(); 608 625 this->checkCompression(); 609 this->completeLonLatClient();610 this->computeConnectedServer() ;626 // this->completeLonLatClient(); 627 // this->computeConnectedServer() ; 611 628 } 612 629 else … … 625 642 CContext* context=CContext::getCurrent() ; 626 643 644 this->checkZoom(); 627 645 if (this->isChecked) return; 628 646 if (context->hasClient) 629 647 { 648 this->computeConnectedServer(); 649 this->completeLonLatClient(); 650 630 651 sendServerAttribut() ; 631 652 sendLonLatArea() ; … … 703 724 msg << this->getId() ; 704 725 msg << ni_srv << ibegin_srv << iend_srv << nj_srv << jbegin_srv << jend_srv; 726 msg << global_zoom_ni << global_zoom_ibegin << global_zoom_nj << global_zoom_jbegin; 705 727 706 728 event.push(*itRank,1,msg); … … 722 744 723 745 int i,j,i_ind,j_ind ; 724 int zoom_iend= zoom_ibegin+zoom_ni-1 ;725 int zoom_jend= zoom_jbegin+zoom_nj-1 ;746 int zoom_iend=global_zoom_ibegin+global_zoom_ni-1 ; 747 int zoom_jend=global_zoom_jbegin+global_zoom_nj-1 ; 726 748 727 749 // Precompute number of index … … 733 755 j_ind=jbegin+j_index(i,j) ; 734 756 735 if (i_ind >= zoom_ibegin && i_ind <= zoom_iend && j_ind >=zoom_jbegin && j_ind <= zoom_jend)757 if (i_ind >= global_zoom_ibegin && i_ind <= zoom_iend && j_ind >= global_zoom_jbegin && j_ind <= zoom_jend) 736 758 { 737 759 ++globalIndexCountZoom; … … 755 777 globalIndexDomain(globalIndexCount) = globalIndex; 756 778 ++globalIndexCount; 757 if (i_ind >= zoom_ibegin && i_ind <= zoom_iend && j_ind >=zoom_jbegin && j_ind <= zoom_jend)779 if (i_ind >= global_zoom_ibegin && i_ind <= zoom_iend && j_ind >= global_zoom_jbegin && j_ind <= zoom_jend) 758 780 { 759 781 globalIndexDomainZoom(globalIndexCountZoom) = globalIndex; … … 976 998 void CDomain::recvServerAttribut(CBufferIn& buffer) 977 999 { 978 int zoom_iend = zoom_ibegin.getValue() + zoom_ni.getValue() - 1; 979 int zoom_jend = zoom_jbegin.getValue() + zoom_nj.getValue() - 1; 980 981 buffer >> ni_srv >> ibegin_srv >> iend_srv >> nj_srv >> jbegin_srv >> jend_srv; 982 983 zoom_ibegin_srv = zoom_ibegin.getValue() > ibegin_srv ? zoom_ibegin.getValue() : ibegin_srv ; 1000 buffer >> ni_srv >> ibegin_srv >> iend_srv >> nj_srv >> jbegin_srv >> jend_srv 1001 >> global_zoom_ni >> global_zoom_ibegin >> global_zoom_nj >> global_zoom_jbegin; 1002 1003 int zoom_iend = global_zoom_ibegin + global_zoom_ni - 1; 1004 int zoom_jend = global_zoom_jbegin + global_zoom_nj - 1; 1005 1006 zoom_ibegin_srv = global_zoom_ibegin > ibegin_srv ? global_zoom_ibegin : ibegin_srv ; 984 1007 zoom_iend_srv = zoom_iend < iend_srv ? zoom_iend : iend_srv ; 985 1008 zoom_ni_srv=zoom_iend_srv-zoom_ibegin_srv+1 ; 986 1009 987 zoom_jbegin_srv = zoom_jbegin.getValue() > jbegin_srv ? zoom_jbegin.getValue(): jbegin_srv ;1010 zoom_jbegin_srv = global_zoom_jbegin > jbegin_srv ? global_zoom_jbegin : jbegin_srv ; 988 1011 zoom_jend_srv = zoom_jend < jend_srv ? zoom_jend : jend_srv ; 989 1012 zoom_nj_srv=zoom_jend_srv-zoom_jbegin_srv+1 ; … … 1127 1150 } 1128 1151 1152 bool CDomain::hasTransformation() 1153 { 1154 return (!transformationMap_.empty()); 1155 } 1156 1157 void CDomain::setTransformations(const TransMapTypes& domTrans) 1158 { 1159 transformationMap_ = domTrans; 1160 } 1161 1162 CDomain::TransMapTypes CDomain::getAllTransformations(void) 1163 { 1164 return transformationMap_; 1165 } 1166 1167 /*! 1168 Check the validity of all transformations applied on domain 1169 This functions is called AFTER all inherited attributes are solved 1170 */ 1171 void CDomain::checkTransformations() 1172 { 1173 TransMapTypes::const_iterator itb = transformationMap_.begin(), it, 1174 ite = transformationMap_.end(); 1175 for (it = itb; it != ite; ++it) 1176 { 1177 (it->second)->checkValid(this); 1178 } 1179 } 1180 1181 void CDomain::solveInheritanceTransformation() 1182 { 1183 if (this->hasTransformation()) return; 1184 1185 std::vector<CDomain*> refDomain; 1186 CDomain* refer_sptr; 1187 CDomain* refer_ptr = this; 1188 while (refer_ptr->hasDirectDomainReference()) 1189 { 1190 refDomain.push_back(refer_ptr); 1191 refer_sptr = refer_ptr->getDirectDomainReference(); 1192 refer_ptr = refer_sptr; 1193 if (refer_ptr->hasTransformation()) break; 1194 } 1195 1196 if (refer_ptr->hasTransformation()) 1197 for (int idx = 0; idx < refDomain.size(); ++idx) 1198 refDomain[idx]->setTransformations(refer_ptr->getAllTransformations()); 1199 } 1200 1201 void CDomain::parse(xml::CXMLNode & node) 1202 { 1203 SuperClass::parse(node); 1204 1205 if (node.goToChildElement()) 1206 { 1207 StdString zoomDomainDefRoot("zoom_domain_definition"); 1208 StdString zoom("zoom_domain"); 1209 do 1210 { 1211 if (node.getElementName() == zoom) { 1212 CZoomDomain* tmp = (CZoomDomainGroup::get(zoomDomainDefRoot))->createChild(); 1213 tmp->parse(node); 1214 transformationMap_.push_back(std::make_pair(TRANS_ZOOM_DOMAIN,tmp)); 1215 } 1216 } while (node.goToNextElement()) ; 1217 node.goToParentElement(); 1218 } 1219 } 1129 1220 //---------------------------------------------------------------- 1130 1221 -
XIOS/trunk/src/node/domain.hpp
r622 r631 14 14 #include "attribute_array.hpp" 15 15 #include "attribute_enum.hpp" 16 #include "transformation.hpp" 17 #include "transformation_enum.hpp" 16 18 17 19 namespace xios { … … 49 51 typedef CDomainAttributes RelAttributes; 50 52 typedef CDomainGroup RelGroup; 53 typedef CTransformation<CDomain>::TransformationMapTypes TransMapTypes; 51 54 52 55 /// Constructeurs /// … … 59 62 void duplicateAttributes(CDomain* domain); 60 63 64 virtual void parse(xml::CXMLNode & node); 65 61 66 /// Vérifications /// 62 67 void checkAttributes(void); … … 65 70 66 71 void sendCheckedAttributes(); 72 73 bool hasTransformation(); 74 void solveInheritanceTransformation(); 75 TransMapTypes getAllTransformations(); 67 76 68 77 private : … … 122 131 CArray<int,2> mapConnectedServer ; // (ni,nj) => mapped to connected server number, -1 if no server is target 123 132 124 133 int global_zoom_ibegin, global_zoom_ni; 134 int global_zoom_jbegin, global_zoom_nj; 125 135 // vector<int> ib_srv, ie_srv, in_srv ; 126 136 // vector<int> jb_srv, je_srv, jn_srv ; … … 160 170 bool hasBounds ; 161 171 bool hasArea; 172 private: 173 void checkTransformations(); 174 void setTransformations(const TransMapTypes&); 175 162 176 private : 163 164 /// Proriétés protégées ///165 177 bool isChecked; 166 178 std::set<StdString> relFiles; … … 171 183 std::vector<int> connectedServerRank_; 172 184 bool isDistributed_; 185 TransMapTypes transformationMap_; 173 186 174 187 DECLARE_REF_FUNC(Domain,domain) -
XIOS/trunk/src/node/grid.cpp
r624 r631 862 862 nZoomBegin[indexMap[i]] = domainList[domainId]->zoom_ibegin_srv; 863 863 nZoomSize[indexMap[i]] = domainList[domainId]->zoom_ni_srv; 864 nZoomBeginGlobal[indexMap[i]] = domainList[domainId]-> zoom_ibegin;864 nZoomBeginGlobal[indexMap[i]] = domainList[domainId]->global_zoom_ibegin; 865 865 nGlob[indexMap[i]] = domainList[domainId]->ni_glo; 866 866 867 867 nZoomBegin[indexMap[i] + 1] = domainList[domainId]->zoom_jbegin_srv; 868 868 nZoomSize[indexMap[i] + 1] = domainList[domainId]->zoom_nj_srv; 869 nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]-> zoom_jbegin;869 nZoomBeginGlobal[indexMap[i] + 1] = domainList[domainId]->global_zoom_jbegin; 870 870 nGlob[indexMap[i] + 1] = domainList[domainId]->nj_glo; 871 871 ++domainId; … … 1124 1124 pDom->solveRefInheritance(apply); 1125 1125 pDom->solveBaseReference(); 1126 pDom->solveInheritanceTransformation(); 1126 1127 if ((!pDom->domain_ref.isEmpty()) && (pDom->name.isEmpty())) 1127 1128 pDom->name.setValue(pDom->getBaseDomainReference()->getId()); -
XIOS/trunk/src/node/node_enum.hpp
r630 r631 22 22 eInverseAxis, 23 23 eZoomAxis, 24 eInterpolateAxis 24 eInterpolateAxis, 25 eZoomDomain 25 26 26 27 } ENodeType; -
XIOS/trunk/src/node/node_type.hpp
r630 r631 13 13 #include "zoom_axis.hpp" 14 14 #include "interpolate_axis.hpp" 15 #include "zoom_domain.hpp" 15 16 16 17 #endif // __XIOS_NODE_TYPE__ -
XIOS/trunk/src/node/transformation_enum.hpp
r630 r631 9 9 TRANS_ZOOM_AXIS, 10 10 TRANS_INVERSE_AXIS, 11 TRANS_INTERPOLATE_AXIS 11 TRANS_INTERPOLATE_AXIS, 12 TRANS_ZOOM_DOMAIN 12 13 } ETranformationType; 13 14 -
XIOS/trunk/src/object_factory_decl.cpp
r630 r631 27 27 macro(CZoomAxis) 28 28 macro(CInterpolateAxis) 29 macro(CZoomDomain) 29 30 30 31 macro(CFieldGroup) … … 38 39 macro(CZoomAxisGroup) 39 40 macro(CInterpolateAxisGroup) 41 macro(CZoomDomainGroup) 40 42 } -
XIOS/trunk/src/object_template_decl.cpp
r630 r631 12 12 #include "zoom_axis.hpp" 13 13 #include "interpolate_axis.hpp" 14 #include "zoom_domain.hpp" 14 15 15 16 namespace xios … … 26 27 template class CObjectTemplate<CZoomAxis>; 27 28 template class CObjectTemplate<CInterpolateAxis>; 29 template class CObjectTemplate<CZoomDomain>; 28 30 29 31 template class CObjectTemplate<CContextGroup>; … … 37 39 template class CObjectTemplate<CZoomAxisGroup>; 38 40 template class CObjectTemplate<CInterpolateAxisGroup>; 41 template class CObjectTemplate<CZoomDomainGroup>; 39 42 } -
XIOS/trunk/src/output/nc4_data_output.cpp
r629 r631 250 250 case (ONE_FILE) : 251 251 { 252 SuperClassWriter::addDimension(dimXid, domain-> zoom_ni.getValue());253 SuperClassWriter::addDimension(dimYid, domain-> zoom_nj.getValue());252 SuperClassWriter::addDimension(dimXid, domain->global_zoom_ni); 253 SuperClassWriter::addDimension(dimYid, domain->global_zoom_nj); 254 254 255 255 if (domain->hasBounds) … … 322 322 else 323 323 { 324 start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 324 start[1]=domain->zoom_ibegin_srv-domain->global_zoom_ibegin; 325 start[0]=domain->zoom_jbegin_srv-domain->global_zoom_jbegin; 325 326 count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ; 326 327 } … … 339 340 count[0]=0 ; 340 341 SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); 341 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); } 342 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); 343 } 342 344 else 343 345 { 344 start[0]=domain->zoom_jbegin_srv-domain-> zoom_jbegin.getValue();346 start[0]=domain->zoom_jbegin_srv-domain->global_zoom_jbegin; 345 347 count[0]=domain->zoom_nj_srv ; 346 348 CArray<double,1> lat = domain->latvalue_srv(Range(fromStart,toEnd,domain->zoom_ni_srv)) ; 347 349 SuperClassWriter::writeData(CArray<double,1>(lat.copy()), latid, isCollective, 0,&start,&count); 348 350 349 start[0]=domain->zoom_ibegin_srv-domain-> zoom_ibegin.getValue();351 start[0]=domain->zoom_ibegin_srv-domain->global_zoom_ibegin; 350 352 count[0]=domain->zoom_ni_srv ; 351 353 CArray<double,1> lon=domain->lonvalue_srv(Range(0,domain->zoom_ni_srv-1)) ; … … 368 370 { 369 371 start[2] = 0; 370 start[1] = domain->zoom_ibegin_srv - domain-> zoom_ibegin.getValue();371 start[0] = domain->zoom_jbegin_srv - domain-> zoom_jbegin.getValue();372 start[1] = domain->zoom_ibegin_srv - domain->global_zoom_ibegin; 373 start[0] = domain->zoom_jbegin_srv - domain->global_zoom_jbegin; 372 374 count[2] = domain->nvertex; 373 375 count[1] = domain->zoom_ni_srv; … … 391 393 else 392 394 { 393 start[1] = domain->zoom_ibegin_srv - domain-> zoom_ibegin.getValue();394 start[0] = domain->zoom_jbegin_srv - domain-> zoom_jbegin.getValue();395 start[1] = domain->zoom_ibegin_srv - domain->global_zoom_ibegin; 396 start[0] = domain->zoom_jbegin_srv - domain->global_zoom_jbegin; 395 397 count[1] = domain->zoom_ni_srv; 396 398 count[0] = domain->zoom_nj_srv; … … 554 556 else 555 557 { 556 start[0]=domain->zoom_jbegin_srv-domain-> zoom_jbegin;558 start[0]=domain->zoom_jbegin_srv-domain->global_zoom_jbegin; 557 559 count[0]=domain->zoom_nj_srv ; 558 startBounds[0]=domain->zoom_jbegin_srv-domain-> zoom_jbegin;560 startBounds[0]=domain->zoom_jbegin_srv-domain->global_zoom_jbegin; 559 561 startBounds[1]=0 ; 560 562 countBounds[0]=domain->zoom_nj_srv ; -
XIOS/trunk/src/test/test_new_features.f90
r630 r631 124 124 ! CALL xios_add_child(file_hdl,field_hdl) 125 125 ! CALL xios_set_attr(field_hdl,field_ref="field_A",name="field_C") 126 !127 ! CALL xios_get_handle("output_All_Axis",file_hdl)128 ! CALL xios_add_child(file_hdl,field_hdl)129 ! CALL xios_set_attr(field_hdl,field_ref="field_All_Axis",name="field_C")130 126 131 127 dtime%second = 3600 -
XIOS/trunk/src/transformation/axis_algorithm_transformation.cpp
r630 r631 47 47 int axisPositionInGrid, 48 48 const std::vector<int>& gridDestGlobalDim, 49 const std::vector<int>& gridSrcGlobalDim, 49 50 const CArray<size_t,1>& globalIndexGridDestSendToServer, 50 51 CArray<size_t,1>& globalIndexDestGrid, -
XIOS/trunk/src/transformation/axis_algorithm_transformation.hpp
r630 r631 31 31 int axisPositionInGrid, 32 32 const std::vector<int>& gridDestGlobalDim, 33 const std::vector<int>& gridSrcGlobalDim, 33 34 const CArray<size_t,1>& globalIndexGridDestSendToServer, 34 35 CArray<size_t,1>& globalIndexDestGrid, -
XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp
r630 r631 21 21 then position of axis in grid is 2 (since a domain is considered to contain 2 elements (axis) 22 22 \param[in] gridDestGlobalDim global size of each dimension of grid source (all dimension must have the same size except of the one on which transformation is performed) 23 \param[in] gridSrcGlobalDim dimension size of source grid (it should share the same size for all dimension, maybe except the domain on which transformation is performed) 23 24 \param[in] globalIndexGridDestSendToServer global index of grid destination on the current client to send to server 24 25 \param[in/out] globaIndexWeightFromDestToSource mapping between transformed global index of grid destination … … 27 28 void CGenericAlgorithmTransformation::computeGlobalSourceIndex(int elementPositionInGrid, 28 29 const std::vector<int>& gridDestGlobalDim, 30 const std::vector<int>& gridSrcGlobalDim, 29 31 const CArray<size_t,1>& globalIndexGridDestSendToServer, 30 32 std::map<size_t, std::vector<std::pair<size_t,double> > >& globaIndexWeightFromDestToSource) … … 45 47 elementPositionInGrid, 46 48 gridDestGlobalDim, 49 gridSrcGlobalDim, 47 50 globalIndexGridDestSendToServer, 48 51 globalIndexDestGrid, -
XIOS/trunk/src/transformation/generic_algorithm_transformation.hpp
r630 r631 28 28 void computeGlobalSourceIndex(int elementPositionInGrid, 29 29 const std::vector<int>& gridDestGlobalDim, 30 const std::vector<int>& gridSrcGlobalDim, 30 31 const CArray<size_t,1>& globalIndexGridDestSendToServer, 31 32 std::map<size_t, std::vector<std::pair<size_t,double> > >& globaIndexWeightFromDestToSource); … … 51 52 int elementPositionInGrid, 52 53 const std::vector<int>& gridDestGlobalDim, 54 const std::vector<int>& gridSrcGlobalDim, 53 55 const CArray<size_t,1>& globalIndexGridDestSendToServer, 54 56 CArray<size_t,1>& globalIndexDestGrid, -
XIOS/trunk/src/transformation/grid_transformation.cpp
r630 r631 11 11 #include "axis_algorithm_zoom.hpp" 12 12 #include "axis_algorithm_interpolate.hpp" 13 #include "domain_algorithm_zoom.hpp" 13 14 #include "context.hpp" 14 15 #include "context_client.hpp" … … 19 20 CGridTransformation::CGridTransformation(CGrid* destination, CGrid* source) 20 21 : gridSource_(source), gridDestination_(destination), originalGridSource_(source), 21 globalIndexOfCurrentGridSource_(0), globalIndexOfOriginalGridSource_(0), weightOfGlobalIndexOfOriginalGridSource_(0) 22 globalIndexOfCurrentGridSource_(0), globalIndexOfOriginalGridSource_(0), weightOfGlobalIndexOfOriginalGridSource_(0), algoTypes_() 22 23 { 23 24 //Verify the compatibity between two grids … … 105 106 void CGridTransformation::initializeAlgorithms() 106 107 { 107 initializeAxisAlgorithms(); 108 initializeDomainAlgorithms(); 109 } 108 std::vector<int> axisPositionInGrid; 109 std::vector<int> domPositionInGrid; 110 std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 111 std::vector<CDomain*> domListDestP = gridDestination_->getDomains(); 112 113 int idx = 0; 114 for (int i = 0; i < gridDestination_->axis_domain_order.numElements(); ++i) 115 { 116 if (false == (gridDestination_->axis_domain_order)(i)) 117 { 118 axisPositionInGrid.push_back(idx); 119 ++idx; 120 } 121 else 122 { 123 ++idx; 124 domPositionInGrid.push_back(idx); 125 ++idx; 126 } 127 } 128 129 for (int i = 0; i < axisListDestP.size(); ++i) 130 { 131 elementPosition2AxisPositionInGrid_[axisPositionInGrid[i]] = i; 132 } 133 134 for (int i = 0; i < domListDestP.size(); ++i) 135 { 136 elementPosition2DomainPositionInGrid_[domPositionInGrid[i]] = i; 137 } 138 139 idx = 0; 140 for (int i = 0; i < gridDestination_->axis_domain_order.numElements(); ++i) 141 { 142 if (false == (gridDestination_->axis_domain_order)(i)) 143 { 144 initializeAxisAlgorithms(idx); 145 ++idx; 146 } 147 else 148 { 149 ++idx; 150 initializeDomainAlgorithms(idx); 151 ++idx; 152 } 153 } 154 } 155 156 110 157 111 158 /*! … … 114 161 In general, each axis can have several transformations performed on itself. However, should they be done seperately or combinely (of course in order)? 115 162 For now, one approach is to do these combinely but maybe this needs changing. 116 */ 117 void CGridTransformation::initializeAxisAlgorithms() 118 { 119 std::vector<int> axisPositionInGrid; 163 \param [in] axisPositionInGrid position of an axis in grid. (for example: a grid with one domain and one axis, position of domain is 1, position of axis is 2) 164 */ 165 void CGridTransformation::initializeAxisAlgorithms(int axisPositionInGrid) 166 { 120 167 std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 121 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis();122 168 if (!axisListDestP.empty()) 123 169 { 124 int idx = 0; 125 for (int i = 0; i < gridDestination_->axis_domain_order.numElements(); ++i) 126 { 127 if (false == (gridDestination_->axis_domain_order)(i)) 170 if (axisListDestP[elementPosition2AxisPositionInGrid_[axisPositionInGrid]]->hasTransformation()) 171 { 172 CAxis::TransMapTypes trans = axisListDestP[elementPosition2AxisPositionInGrid_[axisPositionInGrid]]->getAllTransformations(); 173 CAxis::TransMapTypes::const_iterator itb = trans.begin(), it, 174 ite = trans.end(); 175 int transformationOrder = 0; 176 for (it = itb; it != ite; ++it) 128 177 { 129 axisPositionInGrid.push_back(idx); 130 ++idx; 178 listAlgos_.push_back(std::make_pair(axisPositionInGrid, std::make_pair(it->first, transformationOrder))); 179 algoTypes_.push_back(false); 180 ++transformationOrder; 131 181 } 132 else idx += 2; 133 } 134 135 for (int i = 0; i < axisListDestP.size(); ++i) 136 { 137 elementPosition2AxisPositionInGrid_[axisPositionInGrid[i]] = i; 138 if (axisListDestP[i]->hasTransformation()) 182 } 183 } 184 } 185 186 /*! 187 Initialize the algorithms corresponding to transformation info contained in each domain. 188 If a domain has transformations, they will be represented in form of vector of CTransformation pointers 189 In general, each domain can have several transformations performed on itself. 190 \param [in] domPositionInGrid position of a domain in grid. (for example: a grid with one domain and one axis, position of domain is 1, position of axis is 2) 191 */ 192 void CGridTransformation::initializeDomainAlgorithms(int domPositionInGrid) 193 { 194 std::vector<CDomain*> domListDestP = gridDestination_->getDomains(); 195 if (!domListDestP.empty()) 196 { 197 if (domListDestP[elementPosition2DomainPositionInGrid_[domPositionInGrid]]->hasTransformation()) 198 { 199 CDomain::TransMapTypes trans = domListDestP[elementPosition2DomainPositionInGrid_[domPositionInGrid]]->getAllTransformations(); 200 CDomain::TransMapTypes::const_iterator itb = trans.begin(), it, 201 ite = trans.end(); 202 int transformationOrder = 0; 203 for (it = itb; it != ite; ++it) 139 204 { 140 CAxis::TransMapTypes trans = axisListDestP[i]->getAllTransformations(); 141 CAxis::TransMapTypes::const_iterator itb = trans.begin(), it, 142 ite = trans.end(); 143 int transformationOrder = 0; 144 for (it = itb; it != ite; ++it) 145 { 146 listAlgos_.push_back(std::make_pair(axisPositionInGrid[i], std::make_pair(it->first, transformationOrder))); 147 ++transformationOrder; 148 } 205 listAlgos_.push_back(std::make_pair(domPositionInGrid, std::make_pair(it->first, transformationOrder))); 206 algoTypes_.push_back(true); 207 ++transformationOrder; 149 208 } 150 209 } 151 210 } 152 }153 154 void CGridTransformation::initializeDomainAlgorithms()155 {156 211 157 212 } … … 163 218 \param [in] transType transformation type, for now we have Zoom_axis, inverse_axis 164 219 \param [in] transformationOrder position of the transformation in an element (an element can have several transformation) 165 */ 166 void CGridTransformation::selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 167 { 168 selectAxisAlgo(elementPositionInGrid, transType, transformationOrder); 220 \param [in] isDomainAlgo flag to specify type of algorithm (for domain or axis) 221 */ 222 void CGridTransformation::selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder, bool isDomainAlgo) 223 { 224 if (isDomainAlgo) selectDomainAlgo(elementPositionInGrid, transType, transformationOrder); 225 else selectAxisAlgo(elementPositionInGrid, transType, transformationOrder); 169 226 } 170 227 … … 219 276 void CGridTransformation::selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 220 277 { 278 std::vector<CDomain*> domainListDestP = gridDestination_->getDomains(); 279 std::vector<CDomain*> domainListSrcP = gridSource_->getDomains(); 280 281 int domainIndex = elementPosition2DomainPositionInGrid_[elementPositionInGrid]; 282 CDomain::TransMapTypes trans = domainListDestP[domainIndex]->getAllTransformations(); 283 CDomain::TransMapTypes::const_iterator it = trans.begin(); 284 285 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 286 287 CZoomDomain* zoomDomain = 0; 288 CGenericAlgorithmTransformation* algo = 0; 289 switch (transType) 290 { 291 case TRANS_ZOOM_DOMAIN: 292 zoomDomain = dynamic_cast<CZoomDomain*> (it->second); 293 algo = new CDomainAlgorithmZoom(domainListDestP[domainIndex], domainListSrcP[domainIndex], zoomDomain); 294 break; 295 default: 296 break; 297 } 298 algoTransformation_.push_back(algo); 221 299 } 222 300 … … 233 311 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(); 234 312 235 int axisIndex; 313 std::vector<CDomain*> domListDestP = gridDestination_->getDomains(); 314 std::vector<CDomain*> domListSrcP = gridSource_->getDomains(); 315 316 int axisIndex, domainIndex; 236 317 switch (transType) 237 318 { 319 case TRANS_ZOOM_DOMAIN: 320 domainIndex = elementPosition2DomainPositionInGrid_[elementPositionInGrid]; 321 domListSrcP[domainIndex]->duplicateAttributes(domListDestP[domainIndex]); 322 break; 323 238 324 case TRANS_INTERPOLATE_AXIS: 239 325 case TRANS_ZOOM_AXIS: … … 272 358 273 359 // First of all, select an algorithm 274 selectAlgo(elementPositionInGrid, transType, transformationOrder );360 selectAlgo(elementPositionInGrid, transType, transformationOrder, algoTypes_[std::distance(itb, it)]); 275 361 algo = algoTransformation_.back(); 276 362 … … 281 367 // ComputeTransformation of global index of each element 282 368 std::vector<int> gridDestinationDimensionSize = gridDestination_->getGlobalDimension(); 369 std::vector<int> gridSrcDimensionSize = gridSource_->getGlobalDimension(); 283 370 int elementPosition = it->first; 284 371 algo->computeGlobalSourceIndex(elementPosition, 285 372 gridDestinationDimensionSize, 373 gridSrcDimensionSize, 286 374 globalIndexGridDestSendToServer, 287 375 globaIndexWeightFromDestToSource); -
XIOS/trunk/src/transformation/grid_transformation.hpp
r630 r631 46 46 void computeTransformation(); 47 47 void initializeAlgorithms(); 48 void initializeAxisAlgorithms( );49 void initializeDomainAlgorithms( );48 void initializeAxisAlgorithms(int axisPositionInGrid); 49 void initializeDomainAlgorithms(int domPositionInGrid); 50 50 void initializeMappingOfOriginalGridSource(); 51 51 52 52 void selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder); 53 53 void selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder); 54 void selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder );54 void selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder, bool isDomainAlgo); 55 55 void setUpGrid(int elementPositionInGrid, ETranformationType transType); 56 56 void computeFinalTransformationMapping(); … … 78 78 //! List of algorithm types and their order 79 79 ListAlgoType listAlgos_; 80 // true if domain algorithm and false if axis algorithm (can be replaced by tuple with listAlgos_ 81 std::vector<bool> algoTypes_; 80 82 81 83 // Mapping between position of an element in grid and its transformation (if any) -
XIOS/trunk/src/type/type_util.hpp
r630 r631 26 26 class CInterpolateAxis; 27 27 class CInterpolateAxisGroup; 28 class CZoomDomain; 29 class CZoomDomainGroup; 28 30 29 31 template <typename T> inline string getStrType(void); … … 68 70 macro(CInterpolateAxis) 69 71 macro(CInterpolateAxisGroup) 72 macro(CZoomDomain) 73 macro(CZoomDomainGroup) 70 74 #undef macro 71 75 } -
XIOS/trunk/src/xml_parser_decl.cpp
r630 r631 7 7 #include "file.hpp" 8 8 #include "variable.hpp" 9 //#include "transformation.hpp"10 9 #include "inverse_axis.hpp" 11 10 #include "zoom_axis.hpp" 12 11 #include "interpolate_axis.hpp" 12 #include "zoom_domain.hpp" 13 13 14 14 namespace xios … … 31 31 macro( ZoomAxis ) 32 32 macro( InterpolateAxis ) 33 macro( ZoomDomain ) 33 34 } 34 35 }
Note: See TracChangeset
for help on using the changeset viewer.