Changeset 384
- Timestamp:
- 10/25/12 10:12:20 (12 years ago)
- Location:
- XIOS/trunk/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/domain.cpp
r380 r384 412 412 void CDomain::completeLonLatClient(void) 413 413 { 414 CArray<double,1> lonvalue_temp ; 415 CArray<double,1> latvalue_temp ; 416 414 int i,j,k ; 415 CArray<double,1> lonvalue_temp(ni*nj) ; 416 CArray<double,1> latvalue_temp(ni*nj) ; 417 418 if ( lonvalue.numElements() == ni*nj && latvalue.numElements() == ni*nj ) isCurvilinear=true ; 419 else if ( lonvalue.numElements() == ni && latvalue.numElements() == nj ) isCurvilinear=false ; 420 else ERROR("void CDomain::completeLonLatClient(void)",<<"the grid is nor curvilinear, nor cartesian, because the size of longitude and latitude array is not coherent with the domain size"<<endl 421 <<"lonvalue size = " << lonvalue.numElements() << "different of ni or ni*nj"<<endl 422 <<"latvalue size = " << latvalue.numElements() << "different of nj or ni*nj" ) ; 423 if (isCurvilinear) 424 { 425 lonvalue_temp=lonvalue ; 426 latvalue_temp=latvalue ; 427 } 428 else 429 { 430 for(j=0;j<nj;j++) 431 for(i=0;i<ni;i++) 432 { 433 k=j*ni+i ; 434 lonvalue_temp(k)=lonvalue(i) ; 435 latvalue_temp(k)=latvalue(j) ; 436 } 437 } 438 439 417 440 const int zoom_ibegin_client = zoom_ibegin_loc.getValue(), 418 441 zoom_jbegin_client = zoom_jbegin_loc.getValue(), … … 420 443 zoom_nj_client = zoom_nj_loc.getValue(); 421 444 422 if (this->data_dim.getValue() == 2) 423 { 424 StdSize dm = zoom_ni_client * zoom_nj_client; 425 426 lonvalue_temp.resize(dm); 427 latvalue_temp.resize(dm); 428 429 for (int i = 0; i < zoom_ni_client; i++) 430 { 431 for (int j = 0; j < zoom_nj_client; j++) 432 { 433 lonvalue_temp(i + j * zoom_ni_client) = lonvalue( (i + zoom_ibegin_client -1) + (j + zoom_jbegin_client -1)*ni.getValue() ); 434 latvalue_temp(i + j * zoom_ni_client) = latvalue( (i + zoom_ibegin_client -1)+(j + zoom_jbegin_client -1)*ni.getValue() ); 435 } 436 } 437 lonvalue.reference(lonvalue_temp.copy()) ; 438 latvalue.reference(latvalue_temp.copy()) ; 439 } 440 else 441 { 442 lonvalue_temp.resize(zoom_ni_client); 443 latvalue_temp.resize(zoom_nj_client); 444 445 // Attention ici à revoir, probablement faux 446 for (int i = zoom_ibegin_client - 1; i < (zoom_ni_client - zoom_ibegin_client + 1); i++) 447 { 448 lonvalue_temp(i) = lonvalue(i); 449 } 450 451 for (int j = zoom_jbegin_client - 1; j < (zoom_nj_client - zoom_jbegin_client + 1); j++) 452 { 453 latvalue_temp(j) = latvalue(j); 454 } 455 456 lonvalue.reference(lonvalue_temp.copy()) ; 457 latvalue.reference(latvalue_temp.copy()) ; 458 } 445 StdSize dm = zoom_ni_client * zoom_nj_client; 446 447 lonvalue.resize(dm); 448 latvalue.resize(dm); 449 450 for (int i = 0; i < zoom_ni_client; i++) 451 { 452 for (int j = 0; j < zoom_nj_client; j++) 453 { 454 lonvalue(i + j * zoom_ni_client) = lonvalue_temp( (i + zoom_ibegin_client -1) + (j + zoom_jbegin_client -1)*ni.getValue() ); 455 latvalue(i + j * zoom_ni_client) = latvalue_temp( (i + zoom_ibegin_client -1)+(j + zoom_jbegin_client -1)*ni.getValue() ); 456 } 457 } 459 458 } 460 459 … … 539 538 !this->zoom_ibegin.isEmpty() || !this->zoom_jbegin.isEmpty()) 540 539 { 541 if (this->zoom_ni.isEmpty() && this->zoom_nj.isEmpty() &&542 this->zoom_ibegin.isEmpty() &&this->zoom_jbegin.isEmpty())540 if (this->zoom_ni.isEmpty() || this->zoom_nj.isEmpty() || 541 this->zoom_ibegin.isEmpty() || this->zoom_jbegin.isEmpty()) 543 542 { 544 543 ERROR("CDomain::checkZoom(void)", 545 <<" Les attributs définissant un zoom doivent tous être définis") ;544 <<"if one of zoom attributes is defined then all zoom attributes must be defined") ; 546 545 } 547 546 else … … 870 869 list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ; 871 870 872 *list_msg.back()<<this->getId() ;871 *list_msg.back()<<this->getId()<<isCurvilinear ; 873 872 *list_msg.back()<<*list_indi.back()<<*list_indj.back()<<*list_lon.back()<<*list_lat.back() ; 874 873 event.push(connectedServer[ns],nbSenders[ns],*list_msg.back()) ; … … 961 960 CArray<double,1> lat ; 962 961 963 buffer>>indi>>indj>>lon>>lat ; 962 buffer>>isCurvilinear>>indi>>indj>>lon>>lat ; 963 if (isCurvilinear) cout<<"Grid Curvilinear"<<endl ; 964 else cout<<"Grid Cartesian"<<endl ; 964 965 int i,j,ind_srv ; 965 966 -
XIOS/trunk/src/node/domain.hpp
r369 r384 145 145 146 146 CArray<int, 2> local_mask; 147 147 bool isCurvilinear ; 148 148 private : 149 149 -
XIOS/trunk/src/output/nc4_data_output.cpp
r379 r384 80 80 : latid; 81 81 82 bool isCurvilinear = true ; //for moment82 bool isCurvilinear = domain->isCurvilinear ; 83 83 84 84 switch (SuperClass::type) … … 152 152 153 153 SuperClassWriter::definition_end(); 154 SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0); 155 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0); 154 if (isCurvilinear) 155 { 156 157 SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0); 158 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0); 156 159 // supress mask if (server->intraCommSize > 1) SuperClassWriter::writeData(mask, maskid); 160 } 161 else 162 { 163 CArray<double,1> lat = domain->latvalue_srv(Range(fromStart,toEnd,domain->zoom_ni_srv)) ; 164 SuperClassWriter::writeData(CArray<double,1>(lat.copy()), latid, isCollective, 0); 165 CArray<double,1> lon=domain->lonvalue_srv(Range(0,domain->zoom_ni_srv-1)) ; 166 SuperClassWriter::writeData(CArray<double,1>(lon.copy()), lonid, isCollective, 0); 167 } 157 168 SuperClassWriter::definition_start(); 158 169 … … 187 198 188 199 SuperClassWriter::definition_end(); 189 std::vector<StdSize> start(2) ; 190 std::vector<StdSize> count(2) ; 191 if (domain->isEmpty()) 192 { 193 start[0]=0 ; start [1]=0 ; 194 count[0]=0 ; count[1]=0 ; 200 if (isCurvilinear) 201 { 202 std::vector<StdSize> start(2) ; 203 std::vector<StdSize> count(2) ; 204 if (domain->isEmpty()) 205 { 206 start[0]=0 ; start [1]=0 ; 207 count[0]=0 ; count[1]=0 ; 208 } 209 else 210 { 211 start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 212 count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ; 213 } 214 215 SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); 216 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); 195 217 } 196 218 else 197 219 { 198 start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 199 count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ; 200 } 201 202 SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); 203 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); 220 std::vector<StdSize> start(1) ; 221 std::vector<StdSize> count(1) ; 222 if (domain->isEmpty()) 223 { 224 start[0]=0 ; 225 count[0]=0 ; 226 SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); 227 SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); } 228 else 229 { 230 start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; 231 count[0]=domain->zoom_nj_srv ; 232 CArray<double,1> lat = domain->latvalue_srv(Range(fromStart,toEnd,domain->zoom_ni_srv)) ; 233 SuperClassWriter::writeData(CArray<double,1>(lat.copy()), latid, isCollective, 0,&start,&count); 234 235 start[0]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; 236 count[0]=domain->zoom_ni_srv ; 237 CArray<double,1> lon=domain->lonvalue_srv(Range(0,domain->zoom_ni_srv-1)) ; 238 SuperClassWriter::writeData(CArray<double,1>(lon.copy()), lonid, isCollective, 0,&start,&count); 239 } 240 } 204 241 SuperClassWriter::definition_start(); 205 206 242 break; 207 243 } … … 301 337 // unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue(); 302 338 // bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize); 303 bool isCurvilinear = true ; // for moment339 bool isCurvilinear = domain->isCurvilinear ; 304 340 305 341 nc_type type = (!field->prec.isEmpty() && … … 492 528 CAxis* axis = grid->axis ; 493 529 CArray<double,3> field_data3D(domain->zoom_ni_srv,domain->zoom_nj_srv,axis->zoom_size) ; 530 if (!field->default_value.isEmpty()) field_data3D = field->default_value ; 494 531 field->outputField(field_data3D); 495 532 switch (SuperClass::type) … … 526 563 { 527 564 CArray<double,2> field_data2D(domain->zoom_ni_srv,domain->zoom_nj_srv) ; 565 if (!field->default_value.isEmpty()) field_data2D = field->default_value ; 528 566 field->outputField(field_data2D); 529 567 switch (SuperClass::type) -
XIOS/trunk/src/test/test_cs.f90
r369 r384 10 10 CALL MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierr) 11 11 12 IF (rank< 7) THEN13 CALL client("client",rank, 7)12 IF (rank<11) THEN 13 CALL client("client",rank,11) 14 14 ELSE 15 15 CALL server … … 43 43 DOUBLE PRECISION,DIMENSION(ni_glo,nj_glo) :: lon_glo,lat_glo 44 44 DOUBLE PRECISION :: field_A_glo(ni_glo,nj_glo,llm) 45 DOUBLE PRECISION,ALLOCATABLE :: lon(:,:),lat(:,:),field_A(:,:,:), lonvalue(:) ; 46 INTEGER :: ni,ibegin,iend,nj,jbegin,jend 47 INTEGER :: i,j,l,ts,n 45 DOUBLE PRECISION,ALLOCATABLE :: lon(:),lat(:),field_A(:,:), lonvalue(:) ; 46 LOGICAL,ALLOCATABLE :: mask(:,:) 47 INTEGER :: ni,ibegin,iend,nj,jbegin,jend,data_ibegin,data_ni 48 INTEGER :: i,j,k,l,ts,n,nij_begin 49 48 50 49 51 CALL init_wait … … 61 63 ni=ni_glo ; ibegin=1 62 64 63 jbegin=1 65 66 nij_begin=1 64 67 DO n=0,size-1 65 nj=nj_glo/size 66 IF (n<MOD(nj_glo,size)) nj=nj+1 67 IF (n==rank) exit 68 jbegin=jbegin+nj 68 data_ni=(ni_glo*nj_glo)/size 69 IF (n < MOD (ni_glo*nj_glo,size)) data_ni=data_ni+1 70 IF (n==rank) THEN 71 ibegin=1 ; iend=ni_glo ; ni=iend-ibegin+1 72 jbegin=(nij_begin-1)/ni_glo +1 73 jend=MOD(nij_begin-1 + data_ni-1,ni_glo) +1 74 nj = jend-jbegin+1 75 data_ibegin=MOD(nij_begin-1,ni_glo) 76 exit 77 ELSE 78 nij_begin=nij_begin+data_ni 79 ENDIF 69 80 ENDDO 70 81 71 iend=ibegin+ni-1 ; jend=jbegin+nj-172 82 73 ALLOCATE(lon(ni,nj),lat(ni,nj),field_A(0:ni+1,-1:nj+2,llm),lonvalue(ni*nj)) 74 lon(:,:)=lon_glo(ibegin:iend,jbegin:jend) 75 lat(:,:)=lat_glo(ibegin:iend,jbegin:jend) 76 field_A(1:ni,1:nj,:)=field_A_glo(ibegin:iend,jbegin:jend,:) 83 ALLOCATE(lon(ni),lat(nj),field_A(data_ni,llm),lonvalue(ni*nj)) 84 ALLOCATE(mask(ni,nj)) 85 lon(:)=lon_glo(ibegin:iend,1) 86 lat(:)=lat_glo(1,jbegin:jend) 87 88 DO k=1,data_ni 89 n=k-1+(jbegin-1)*ni_glo+data_ibegin 90 i=MOD(n,ni_glo)+1 91 j=n/ni_glo+1 92 field_A(k,:)=field_A_glo(i,j,:) 93 ENDDO 94 95 mask(:,:)=.TRUE. 96 mask(1:ni,6)=.TRUE. 77 97 78 98 … … 89 109 CALL xios_set_context_attr("test",calendar_type="Gregorian") 90 110 CALL xios_set_axis_attr("axis_A",size=llm ,value=lval) ; 91 CALL xios_set_domain_attr("domain_A",ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, ni=ni,jbegin=jbegin,nj=nj) 92 ! CALL xios_set_domain_attr("domain_A",zoom_ni=10,zoom_ibegin=5,zoom_nj=20,zoom_jbegin=10) 93 CALL xios_set_domain_attr("domain_A",data_dim=2, data_ibegin=-1, data_ni=ni+2, data_jbegin=-2, data_nj=nj+4) 94 CALL xios_set_domain_attr("domain_A",lonvalue=RESHAPE(lon,(/ni*nj/)),latvalue=RESHAPE(lat,(/ni*nj/))) 111 CALL xios_set_domain_attr("domain_A",ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, iend=iend,jbegin=jbegin,jend=jend) 112 ! CALL xios_set_domain_attr("domain_A",zoom_ni=10,zoom_ibegin=5,zoom_nj=nj_glo,zoom_jbegin=1) 113 CALL xios_set_domain_attr("domain_A",data_dim=1, data_ibegin=data_ibegin, data_ni=data_ni) 114 CALL xios_set_domain_attr("domain_A",lonvalue=lon,latvalue=lat) 115 ! CALL xios_set_domain_attr("domain_A",mask=mask) 95 116 CALL xios_set_fieldgroup_attr("field_definition",enabled=.TRUE.) 96 117 … … 107 128 CALL xios_set_timestep(dtime) 108 129 109 ni=0 ; lonvalue(:)=0110 CALL xios_get_domain_attr("domain_A",ni=ni,lonvalue=lonvalue)130 ! ni=0 ; lonvalue(:)=0 131 ! CALL xios_get_domain_attr("domain_A",ni=ni,lonvalue=lonvalue) 111 132 112 print *,"ni",ni113 print *,"lonvalue",lonvalue ;133 ! print *,"ni",ni 134 ! print *,"lonvalue",lonvalue ; 114 135 115 136 CALL xios_close_context_definition()
Note: See TracChangeset
for help on using the changeset viewer.