Ignore:
Timestamp:
10/16/12 13:04:44 (12 years ago)
Author:
ymipsl
Message:

Major Update

  • redesign Type and attribute manipulation
  • add enumerate type and attribute
  • use blitz class array instead of boost class array

YM

File:
1 edited

Legend:

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

    r352 r369  
    1313#include "context.hpp" 
    1414#include "context_client.hpp" 
     15#include "array_new.hpp" 
    1516 
    1617namespace xios { 
     
    2021   CDomain::CDomain(void) 
    2122      : CObjectTemplate<CDomain>(), CDomainAttributes() 
    22       , isChecked(false), local_mask(new CArray<int, 2>(boost::extents[0][0])), relFiles() 
     23      , isChecked(false), relFiles() 
    2324      , ibegin_sub(), iend_sub(), jbegin_sub(), jend_sub() 
    2425      , ibegin_zoom_sub(), jbegin_zoom_sub(), ni_zoom_sub(), nj_zoom_sub() 
    25       , lonvalue_sub(), latvalue_sub(),lonvalue_srv(new CArray<double,1>()) 
    26       , latvalue_srv(new CArray<double,1>()) 
     26      , lonvalue_sub(), latvalue_sub() 
    2727   { /* Ne rien faire de plus */ } 
    2828 
    2929   CDomain::CDomain(const StdString & id) 
    3030      : CObjectTemplate<CDomain>(id), CDomainAttributes() 
    31       , isChecked(false), local_mask(new CArray<int, 2>(boost::extents[0][0])), relFiles() 
     31      , isChecked(false), relFiles() 
    3232      , ibegin_sub(), iend_sub(), jbegin_sub(), jend_sub() 
    3333      , ibegin_zoom_sub(), jbegin_zoom_sub(),ni_zoom_sub(), nj_zoom_sub() 
    34       , lonvalue_sub(), latvalue_sub(),lonvalue_srv(new CArray<double,1>()) 
    35       , latvalue_srv(new CArray<double,1>()) 
     34      , lonvalue_sub(), latvalue_sub() 
    3635   { /* Ne rien faire de plus */ } 
    3736 
    3837   CDomain::~CDomain(void) 
    3938   {  
    40       this->local_mask.reset(); 
    41       for (StdSize i = 0; i < this->lonvalue_sub.size(); i++) 
    42       { 
    43          this->lonvalue_sub[i].reset(); 
    44          this->latvalue_sub[i].reset(); 
    45       }      
     39     vector<CArray<double,1>* >::iterator it; 
     40     for(it=lonvalue_sub.begin();it<lonvalue_sub.end();it++) delete *it; 
     41     for(it=latvalue_sub.begin();it<latvalue_sub.end();it++) delete *it; 
    4642   } 
    4743 
     
    8480 
    8581   //---------------------------------------------------------------- 
    86  
     82/* 
    8783   void CDomain::fromBinary(StdIStream & is) 
    8884   { 
     
    112108       
    113109#define CLEAR_ATT(name_)\ 
    114       SuperClassAttribute::operator[](#name_)->clear() 
     110      SuperClassAttribute::operator[](#name_)->reset() 
    115111 
    116112         CLEAR_ATT(mask); 
     
    143139      } 
    144140   } 
    145  
     141*/ 
    146142   //---------------------------------------------------------------- 
    147143 
     
    265261      if (!mask.isEmpty()) 
    266262      { 
    267          ARRAY(bool, 2) mask_ = mask.getValue(); 
    268263         unsigned int niu = ni.getValue(), nju = nj.getValue(); 
    269          if ((mask_->shape()[0] != niu) || 
    270              (mask_->shape()[1] != nju)) 
     264         if ((mask.extent(0) != niu) || 
     265             (mask.extent(1) != nju)) 
    271266            ERROR("CDomain::checkAttributes(void)", 
    272267                  <<"Le masque n'a pas la même taille que le domaine local") ; 
     
    278273               if (i < ibegin_mask && i > iend_mask && 
    279274                   j < jbegin_mask && j > jend_mask ) 
    280                      (*mask_)[i][j] = false; 
     275                     mask(i,j) = false; 
    281276            } 
    282277         } 
     
    285280      { // Si aucun masque n'est défini, 
    286281        // on en crée un nouveau qui valide l'intégralité du domaine. 
    287          ARRAY_CREATE(__arr, bool, 2, [ni.getValue()][nj.getValue()]); 
     282         mask.resize(ni,nj) ; 
    288283         for (int i = 0; i < ni.getValue(); i++) 
    289284         { 
     
    292287               if (i >= ibegin_mask && i <= iend_mask && 
    293288                   j >= jbegin_mask && j <= jend_mask ) 
    294                      (*__arr)[i][j] = true; 
    295                else  (*__arr)[i][j] = false; 
     289                     mask(i,j) = true; 
     290               else  mask(i,j) = false; 
    296291            } 
    297292         } 
    298                 
    299          mask.setValue(__arr); 
    300          __arr.reset(); 
    301293      } 
    302294   } 
     
    355347      if (!data_i_index.isEmpty()) 
    356348      { 
    357          int ssize = data_i_index.getValue()->size(); 
     349         int ssize = data_i_index.numElements(); 
    358350         if (!data_n_index.isEmpty() && 
    359351            (data_n_index.getValue() != ssize)) 
     
    368360         { 
    369361            if (!data_j_index.isEmpty() && 
    370                (data_j_index.getValue()->size() != data_i_index.getValue()->size())) 
     362               (data_j_index.numElements() != data_i_index.numElements())) 
    371363            { 
    372364               ERROR("CDomain::checkAttributes(void)", 
     
    392384         { 
    393385            const int dni = data_ni.getValue(); 
    394             ARRAY_CREATE(__arri, int, 1, [dni]); 
     386            data_i_index.resize(dni) ; 
    395387            data_n_index.setValue(dni); 
    396             for (int i = 0; i < dni; i++) 
    397                (*__arri)[i] = i+1 ; 
    398             data_i_index.setValue(__arri) ; 
     388            for (int i = 0; i < dni; i++) data_i_index(i) = i+1 ; 
    399389         } 
    400390         else   // (data_dim == 2) 
    401391         { 
    402392            const int dni = data_ni.getValue() * data_nj.getValue(); 
     393            data_i_index.resize(dni) ; 
     394            data_j_index.resize(dni) ; 
    403395             
    404             ARRAY_CREATE(__arri, int, 1, [dni]); 
    405             ARRAY_CREATE(__arrj, int, 1, [dni]);                
    406396            data_n_index.setValue(dni); 
    407              
    408             //for(int count = 0, i = 0; i  < data_ni.getValue(); i++) 
    409             //for(int j = 0; j < data_nj.getValue(); j++, count++) 
    410397             
    411398            for(int count = 0, j = 0; j  < data_nj.getValue(); j++) 
     
    413400               for(int i = 0; i < data_ni.getValue(); i++, count++) 
    414401               { 
    415                   (*__arri)[count] = i+1 ; 
    416                   (*__arrj)[count] = j+1 ; 
     402                  data_i_index(count) = i+1 ; 
     403                  data_j_index(count) = j+1 ; 
    417404               } 
    418405            } 
    419             data_i_index.setValue(__arri) ; 
    420             data_j_index.setValue(__arrj) ;             
    421             __arri.reset(); 
    422             __arrj.reset(); 
    423406         } 
    424407      } 
     
    429412   void CDomain::completeLonLatClient(void) 
    430413   { 
    431       ARRAY_CREATE(lonvalue_temp, double, 1, [0]); 
    432       ARRAY_CREATE(latvalue_temp, double, 1, [0]); 
     414      CArray<double,1> lonvalue_temp ; 
     415      CArray<double,1> latvalue_temp ; 
    433416       
    434417      const int zoom_ibegin_client  = zoom_ibegin_loc.getValue(), 
     
    437420                zoom_nj_client      = zoom_nj_loc.getValue(); 
    438421                 
    439       ARRAY(double, 1) lonvalue_ = this->lonvalue.getValue(), 
    440                        latvalue_ = this->latvalue.getValue(); 
    441                  
    442422      if (this->data_dim.getValue() == 2) 
    443423      { 
    444424         StdSize dm = zoom_ni_client * zoom_nj_client; 
    445425 
    446          lonvalue_temp->resize(boost::extents[dm]); 
    447          latvalue_temp->resize(boost::extents[dm]); 
     426         lonvalue_temp.resize(dm); 
     427         latvalue_temp.resize(dm); 
    448428          
    449429         for (int i = 0; i < zoom_ni_client; i++) 
     
    451431            for (int j = 0; j < zoom_nj_client; j++) 
    452432            { 
    453                (*lonvalue_temp)[i + j * zoom_ni_client] = 
    454                (*lonvalue_)[(i + zoom_ibegin_client -1)+(j + zoom_jbegin_client -1)*ni.getValue()];               
    455                (*latvalue_temp)[i + j * zoom_ni_client] = 
    456                (*latvalue_)[(i + zoom_ibegin_client -1)+(j + zoom_jbegin_client -1)*ni.getValue()]; 
     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() ); 
    457435            } 
    458436         } 
    459          this->lonvalue.setValue(lonvalue_temp); 
    460          this->latvalue.setValue(latvalue_temp); 
     437         lonvalue.reference(lonvalue_temp.copy()) ; 
     438         latvalue.reference(latvalue_temp.copy()) ; 
     439         cout<<lonvalue<<endl ; 
     440         cout<<latvalue<<endl ; 
    461441      } 
    462442      else 
    463443      { 
    464          lonvalue_temp->resize(boost::extents[zoom_ni_client]); 
    465          latvalue_temp->resize(boost::extents[zoom_nj_client]); 
    466           
     444         lonvalue_temp.resize(zoom_ni_client); 
     445         latvalue_temp.resize(zoom_nj_client); 
     446 
     447// Attention ici à revoir, probablement faux          
    467448         for (int i = zoom_ibegin_client - 1; i < (zoom_ni_client - zoom_ibegin_client + 1); i++) 
    468449         { 
    469             (*lonvalue_temp)[i] = (*lonvalue_)[i];  
    470          } 
    471           
    472          for (int j = zoom_ibegin_client - 1; j < (zoom_nj_client - zoom_jbegin_client + 1); j++) 
    473          { 
    474             (*latvalue_temp)[j] = (*latvalue_)[j]; 
    475          } 
    476           
    477          this->lonvalue.setValue(lonvalue_temp); 
    478          this->latvalue.setValue(latvalue_temp); 
     450            lonvalue_temp(i) = lonvalue(i);  
     451         } 
     452          
     453         for (int j = zoom_jbegin_client - 1; j < (zoom_nj_client - zoom_jbegin_client + 1); j++) 
     454         { 
     455            latvalue_temp(j) = latvalue(j); 
     456         } 
     457          
     458         lonvalue.reference(lonvalue_temp.copy()) ; 
     459         latvalue.reference(latvalue_temp.copy()) ; 
    479460      }   
    480461   } 
     
    484465   void CDomain::completeLonLatServer(void) 
    485466   { 
    486       ARRAY_CREATE(lonvalue_temp, double, 1, [0]); 
    487       ARRAY_CREATE(latvalue_temp, double, 1, [0]); 
     467      CArray<double,1> lonvalue_temp ; 
     468      CArray<double,1> latvalue_temp ; 
    488469       
    489470      const int ibegin_serv     = ibegin.getValue(), 
     
    499480         StdSize dm = zoom_ni_serv * zoom_nj_serv;       
    500481          
    501          lonvalue_temp->resize(boost::extents[dm]); 
    502          latvalue_temp->resize(boost::extents[dm]); 
     482         lonvalue_temp.resize(dm); 
     483         latvalue_temp.resize(dm); 
    503484          
    504485         for (StdSize k = 0; k < lonvalue_sub.size(); k++) 
    505486         { 
    506             ARRAY(double, 1) lonvalue_loc = this->lonvalue_sub[k], 
    507                              latvalue_loc = this->latvalue_sub[k]; 
     487            CArray<double,1> lonvalue_loc(*(lonvalue_sub[k])) ; 
     488            CArray<double,1> latvalue_loc (*(latvalue_sub[k])); 
     489             
    508490            const int zoom_ibegin_cl = ibegin_zoom_sub[k], zoom_ni_cl = ni_zoom_sub[k], 
    509491                      zoom_jbegin_cl = jbegin_zoom_sub[k], zoom_nj_cl = nj_zoom_sub[k], 
     
    518500                  int ii = i + (ibegin_cl-1) - (ibegin_serv - 1) + (zoom_ibegin_cl - 1) - (ibegin_zoom_srv - 1); 
    519501                  int jj = j + (jbegin_cl-1) - (jbegin_serv - 1) + (zoom_jbegin_cl - 1) - (jbegin_zoom_srv - 1); 
    520                   (*lonvalue_temp)[ii + jj * zoom_ni_serv] = 
    521                   (*lonvalue_loc)[i + j * zoom_ni_cl]; 
    522                   (*latvalue_temp)[ii + jj * zoom_ni_serv] =  
    523                   (*latvalue_loc)[i + j * zoom_ni_cl]; 
     502                  lonvalue_temp(ii + jj * zoom_ni_serv) = lonvalue_loc(i + j * zoom_ni_cl); 
     503                  latvalue_temp(ii + jj * zoom_ni_serv) = latvalue_loc(i + j * zoom_ni_cl); 
    524504               } 
    525505            } 
    526506         } 
    527          this->lonvalue.setValue(lonvalue_temp); 
    528          this->latvalue.setValue(latvalue_temp); 
     507          
     508         lonvalue.reference(lonvalue_temp.copy()) ; 
     509         latvalue.reference(latvalue_temp.copy()) ; 
    529510      } 
    530511      else 
    531512      { 
    532          lonvalue_temp->resize(boost::extents[zoom_ni_serv]); 
    533          latvalue_temp->resize(boost::extents[zoom_nj_serv]); 
     513         lonvalue_temp.resize(zoom_ni_serv); 
     514         latvalue_temp.resize(zoom_nj_serv); 
    534515          
    535516         for (StdSize k = 0; k < lonvalue_sub.size(); k++) 
    536517         { 
    537             ARRAY(double, 1) lonvalue_loc = this->lonvalue_sub[k], 
    538                              latvalue_loc = this->latvalue_sub[k]; 
     518            CArray<double,1> lonvalue_loc(*(lonvalue_sub[k])); 
     519            CArray<double,1> latvalue_loc(*(latvalue_sub[k])); 
     520             
    539521            const int zoom_ibegin_cl = ibegin_zoom_sub[k], zoom_ni_cl = ni_zoom_sub[k], 
    540522                      zoom_jbegin_cl = jbegin_zoom_sub[k], zoom_nj_cl = nj_zoom_sub[k]; 
    541523                       
    542524            for (int i = 0; i < zoom_ni_cl; i++) 
    543                (*lonvalue_temp)[i /*- (ibegin_serv - 1)*/ + (zoom_ibegin_cl - 1) - (ibegin_zoom_srv - 1)] = 
    544                (*lonvalue_loc)[i]; 
     525              lonvalue_temp(i /*- (ibegin_serv - 1)*/ + (zoom_ibegin_cl - 1) - (ibegin_zoom_srv - 1)) = lonvalue_loc(i); 
    545526                
    546527            for (int j = 0; j < zoom_nj_cl; j++) 
    547                (*latvalue_temp)[j /*- (jbegin_serv - 1)*/ + (zoom_jbegin_cl - 1) - (jbegin_zoom_srv - 1)] = 
    548                (*latvalue_loc)[j]; 
     528              latvalue_temp(j /*- (jbegin_serv - 1)*/ + (zoom_jbegin_cl - 1) - (jbegin_zoom_srv - 1)) = latvalue_loc(j); 
    549529         }        
    550          this->lonvalue.setValue(lonvalue_temp); 
    551          this->latvalue.setValue(latvalue_temp); 
     530         lonvalue.reference(lonvalue_temp.copy()) ; 
     531         latvalue.reference(latvalue_temp.copy()) ; 
    552532      } 
    553533   } 
     
    662642         this->nj_zoom_sub.push_back(this->zoom_nj_loc.getValue()); 
    663643       
    664          this->latvalue_sub.push_back(this->latvalue.getValue()); 
    665          this->lonvalue_sub.push_back(this->lonvalue.getValue());   
     644         this->latvalue_sub.push_back(new CArray<double,1>(latvalue.copy())); 
     645         this->lonvalue_sub.push_back(new CArray<double,1>(lonvalue.copy()));   
    666646 
    667647 
     
    855835    CEventClient event(getType(),EVENT_ID_LON_LAT) ; 
    856836     
    857     ARRAY(double, 1) lonvalue_client = lonvalue.getValue(), 
    858                      latvalue_client = latvalue.getValue(); 
    859      
    860837    int ib,ie,in ; 
    861838    int jb,je,jn ; 
    862839   
    863840    list<shared_ptr<CMessage> > list_msg ;     
    864     list<ARRAY(double,1)> list_indi,list_indj,list_lon,list_lat ; 
     841    list<CArray<double,1>* > list_indi,list_indj,list_lon,list_lat ; 
    865842 
    866843    for(int ns=0;ns<connectedServer.size();ns++) 
     
    869846      jb=jb_srv[ns] ; je=je_srv[ns] ; jn=jn_srv[ns] ; 
    870847       
    871       ARRAY_CREATE(indi,double,1,[in*jn]) ; 
    872       ARRAY_CREATE(indj,double,1,[in*jn]) ; 
    873       ARRAY_CREATE(lon,double,1,[in*jn]) ; 
    874       ARRAY_CREATE(lat,double,1,[in*jn]) ; 
     848      CArray<double,1> indi(in*jn) ; 
     849      CArray<double,1> indj(in*jn) ; 
     850      CArray<double,1> lon(in*jn) ; 
     851      CArray<double,1> lat(in*jn) ; 
    875852 
    876853           
     
    882859          ind_client=(i-zoom_ibegin_client)+(j-zoom_jbegin_client)*zoom_ni_client ; 
    883860          ind_loc=(i-ib)+(j-jb)*in ; 
    884           (*lon)[ind_loc]=(*lonvalue_client)[ind_client] ; 
    885           (*lat)[ind_loc]=(*latvalue_client)[ind_client] ; 
    886           (*indi)[ind_loc]=i ; 
    887           (*indj)[ind_loc]=j ; 
     861          lon(ind_loc)=lonvalue(ind_client) ; 
     862          lat(ind_loc)=latvalue(ind_client) ; 
     863          indi(ind_loc)=i ; 
     864          indj(ind_loc)=j ; 
    888865        } 
    889866       
    890       list_indi.push_back(indi) ; list_indj.push_back(indj) ; 
    891       list_lon.push_back(lon) ; list_lat.push_back(lat) ; 
     867      list_indi.push_back(new CArray<double,1>(indi.copy())) ; 
     868      list_indj.push_back(new CArray<double,1>(indj.copy())) ; 
     869      list_lon.push_back(new CArray<double,1>(lon.copy())) ; 
     870      list_lat.push_back(new CArray<double,1>(lat.copy())) ; 
     871 
    892872      list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ; 
    893873 
    894874      *list_msg.back()<<this->getId() ; 
    895       *list_msg.back()<<list_indi.back()<<list_indj.back()<<list_lon.back()<<list_lat.back() ; 
     875      *list_msg.back()<<*list_indi.back()<<*list_indj.back()<<*list_lon.back()<<*list_lat.back() ; 
    896876      event.push(connectedServer[ns],nbSenders[ns],*list_msg.back()) ; 
    897877    } 
    898878 
    899879    client->sendEvent(event) ; 
     880     
     881    list<CArray<double,1>* >::iterator it; 
     882    for(it=list_indi.begin();it!=list_indi.end();it++) delete *it; 
     883    for(it=list_indj.begin();it!=list_indj.end();it++) delete *it; 
     884    for(it=list_lon.begin();it!=list_lon.end();it++)   delete *it; 
     885    for(it=list_lat.begin();it!=list_lat.end();it++)   delete *it; 
     886     
    900887  } 
    901888   
     
    953940    } 
    954941     
    955     lonvalue_srv->resize(extents[zoom_ni_srv*zoom_nj_srv]) ; 
    956     latvalue_srv->resize(extents[zoom_ni_srv*zoom_nj_srv]) ; 
     942    lonvalue_srv.resize(zoom_ni_srv*zoom_nj_srv) ; 
     943    latvalue_srv.resize(zoom_ni_srv*zoom_nj_srv) ; 
    957944  } 
    958945     
     
    971958  void CDomain::recvLonLat(CBufferIn& buffer) 
    972959  { 
    973     ARRAY_CREATE(indi,double,1,[0]) ; 
    974     ARRAY_CREATE(indj,double,1,[0]) ; 
    975     ARRAY_CREATE(lon,double,1,[0]) ; 
    976     ARRAY_CREATE(lat,double,1,[0]) ; 
    977      
     960    CArray<double,1> indi ; 
     961    CArray<double,1> indj ; 
     962    CArray<double,1> lon ; 
     963    CArray<double,1> lat ; 
     964      
    978965    buffer>>indi>>indj>>lon>>lat ; 
    979966    int i,j,ind_srv ; 
    980967 
    981     for(int ind=0;ind<indi->num_elements();ind++) 
     968    for(int ind=0;ind<indi.numElements();ind++) 
    982969    { 
    983       i=(*indi)[ind] ; j=(*indj)[ind] ; 
     970      i=indi(ind) ; j=indj(ind) ; 
    984971      ind_srv=(i-zoom_ibegin_srv)+(j-zoom_jbegin_srv)*zoom_ni_srv ; 
    985       (*lonvalue_srv)[ind_srv]=(*lon)[ind] ; 
    986       (*latvalue_srv)[ind_srv]=(*lat)[ind] ; 
     972      lonvalue_srv(ind_srv)=lon(ind) ; 
     973      latvalue_srv(ind_srv)=lat(ind) ; 
    987974    } 
    988975  } 
     
    991978   void CDomain::completeMask(void) 
    992979   { 
    993       this->local_mask->resize(boost::extents[zoom_ni_loc.getValue()][zoom_nj_loc.getValue()]); 
    994    } 
    995  
    996    //---------------------------------------------------------------- 
    997  
    998    ARRAY(int, 2) CDomain::getLocalMask(void) const 
     980      this->local_mask.resize(zoom_ni_loc,zoom_nj_loc); 
     981   } 
     982 
     983   //---------------------------------------------------------------- 
     984 
     985   CArray<int,2> CDomain::getLocalMask(void) const 
    999986   { 
    1000987      return (this->local_mask); 
     
    10561043   //---------------------------------------------------------------- 
    10571044    
    1058    const std::vector<ARRAY(double, 1)> & CDomain::getLonValueSub(void) const 
     1045   const std::vector<CArray<double, 1>* > & CDomain::getLonValueSub(void) const 
    10591046   { 
    10601047      return (this->lonvalue_sub); 
     
    10631050   //---------------------------------------------------------------- 
    10641051    
    1065    const std::vector<ARRAY(double, 1)> & CDomain::getLatValueSub(void) const 
     1052   const std::vector<CArray<double,1>*> & CDomain::getLatValueSub(void) const 
    10661053   { 
    10671054      return (this->latvalue_sub); 
Note: See TracChangeset for help on using the changeset viewer.