Changeset 384 for XIOS


Ignore:
Timestamp:
10/25/12 10:12:20 (12 years ago)
Author:
ymipsl
Message:

Cartesian/Regular? grid are now working correctly.

YM

Location:
XIOS/trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/domain.cpp

    r380 r384  
    412412   void CDomain::completeLonLatClient(void) 
    413413   { 
    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         
    417440      const int zoom_ibegin_client  = zoom_ibegin_loc.getValue(), 
    418441                zoom_jbegin_client  = zoom_jbegin_loc.getValue(), 
     
    420443                zoom_nj_client      = zoom_nj_loc.getValue(); 
    421444                 
    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      } 
    459458   } 
    460459  
     
    539538          !this->zoom_ibegin.isEmpty() || !this->zoom_jbegin.isEmpty()) 
    540539      { 
    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()) 
    543542         { 
    544543            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") ; 
    546545         } 
    547546         else 
     
    870869      list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ; 
    871870 
    872       *list_msg.back()<<this->getId() ; 
     871      *list_msg.back()<<this->getId()<<isCurvilinear ; 
    873872      *list_msg.back()<<*list_indi.back()<<*list_indj.back()<<*list_lon.back()<<*list_lat.back() ; 
    874873      event.push(connectedServer[ns],nbSenders[ns],*list_msg.back()) ; 
     
    961960    CArray<double,1> lat ; 
    962961      
    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 ; 
    964965    int i,j,ind_srv ; 
    965966 
  • XIOS/trunk/src/node/domain.hpp

    r369 r384  
    145145 
    146146         CArray<int, 2> local_mask; 
    147  
     147         bool isCurvilinear ; 
    148148       private : 
    149149 
  • XIOS/trunk/src/output/nc4_data_output.cpp

    r379 r384  
    8080                             : latid; 
    8181 
    82          bool isCurvilinear = true ; //for moment 
     82         bool isCurvilinear = domain->isCurvilinear ; 
    8383 
    8484         switch (SuperClass::type) 
     
    152152 
    153153               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); 
    156159// 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               } 
    157168               SuperClassWriter::definition_start(); 
    158169 
     
    187198 
    188199               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); 
    195217               } 
    196218               else 
    197219               { 
    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               } 
    204241               SuperClassWriter::definition_start(); 
    205  
    206242               break; 
    207243            }            
     
    301337//         unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue(); 
    302338//         bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize); 
    303           bool isCurvilinear = true ; // for moment  
     339          bool isCurvilinear = domain->isCurvilinear ;  
    304340           
    305341         nc_type type = (!field->prec.isEmpty() && 
     
    492528            CAxis* axis = grid->axis ; 
    493529            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 ; 
    494531            field->outputField(field_data3D); 
    495532            switch (SuperClass::type) 
     
    526563         { 
    527564            CArray<double,2> field_data2D(domain->zoom_ni_srv,domain->zoom_nj_srv) ; 
     565            if (!field->default_value.isEmpty()) field_data2D = field->default_value ; 
    528566            field->outputField(field_data2D); 
    529567            switch (SuperClass::type) 
  • XIOS/trunk/src/test/test_cs.f90

    r369 r384  
    1010  CALL MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierr) 
    1111   
    12   IF (rank<7) THEN 
    13    CALL client("client",rank,7) 
     12  IF (rank<11) THEN 
     13   CALL client("client",rank,11) 
    1414  ELSE  
    1515    CALL server 
     
    4343  DOUBLE PRECISION,DIMENSION(ni_glo,nj_glo) :: lon_glo,lat_glo 
    4444  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   
    4850   
    4951  CALL init_wait 
     
    6163  ni=ni_glo ; ibegin=1 
    6264 
    63   jbegin=1 
     65   
     66  nij_begin=1 
    6467  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 
    6980  ENDDO 
    7081   
    71   iend=ibegin+ni-1 ; jend=jbegin+nj-1 
    7282 
    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. 
    7797   
    7898 
     
    89109  CALL xios_set_context_attr("test",calendar_type="Gregorian")  
    90110  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) 
    95116  CALL xios_set_fieldgroup_attr("field_definition",enabled=.TRUE.) 
    96117   
     
    107128    CALL xios_set_timestep(dtime)  
    108129     
    109     ni=0 ; lonvalue(:)=0 
    110     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) 
    111132     
    112     print *,"ni",ni 
    113     print *,"lonvalue",lonvalue ; 
     133!    print *,"ni",ni 
     134!    print *,"lonvalue",lonvalue ; 
    114135 
    115136    CALL xios_close_context_definition() 
Note: See TracChangeset for help on using the changeset viewer.