source: XIOS/trunk/src/node/grid.cpp @ 421

Last change on this file since 421 was 421, checked in by ymipsl, 11 years ago

suppress warning due to french accents -> english traduction of error messages

YM

File size: 17.6 KB
RevLine 
[266]1
[219]2#include "grid.hpp"
3
[352]4#include "attribute_template.hpp"
5#include "object_template.hpp"
6#include "group_template.hpp"
7#include "message.hpp"
[286]8#include <iostream>
[352]9#include "xmlioserver_spl.hpp"
10#include "type.hpp"
11#include "context.hpp"
12#include "context_client.hpp"
[369]13#include "array_new.hpp"
[219]14
[335]15namespace xios {
[219]16
17   /// ////////////////////// Définitions ////////////////////// ///
18
19   CGrid::CGrid(void)
20      : CObjectTemplate<CGrid>(), CGridAttributes()
21      , withAxis(false), isChecked(false), axis(), domain()
22      , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1)
23   { /* Ne rien faire de plus */ }
24
25   CGrid::CGrid(const StdString & id)
26      : CObjectTemplate<CGrid>(id), CGridAttributes()
27      , withAxis(false), isChecked(false), axis(), domain()
28      , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1)
29   { /* Ne rien faire de plus */ }
30
31   CGrid::~CGrid(void)
32   { 
[347]33 //     this->axis.reset() ;
34//      this->domain.reset() ;
[369]35    deque< CArray<int, 1>* >::iterator it ;
36   
37    for(deque< CArray<int,1>* >::iterator it=storeIndex.begin(); it!=storeIndex.end();it++)  delete *it ;
38    for(deque< CArray<int,1>* >::iterator it=out_i_index.begin();it!=out_i_index.end();it++) delete *it ;
39    for(deque< CArray<int,1>* >::iterator it=out_j_index.begin();it!=out_j_index.end();it++) delete *it ;
40    for(deque< CArray<int,1>* >::iterator it=out_l_index.begin();it!=out_l_index.end();it++) delete *it ;
41
42    for(map<int,CArray<int,1>* >::iterator it=out_i_fromClient.begin();it!=out_i_fromClient.end();it++) delete it->second ;
43    for(map<int,CArray<int,1>* >::iterator it=out_j_fromClient.begin();it!=out_j_fromClient.end();it++) delete it->second ;
44    for(map<int,CArray<int,1>* >::iterator it=out_l_fromClient.begin();it!=out_l_fromClient.end();it++) delete it->second ;
45
[219]46   }
47
48   ///---------------------------------------------------------------
49
50   StdString CGrid::GetName(void)    { return (StdString("grid")); }
51   StdString CGrid::GetDefName(void) { return (CGrid::GetName()); }
52   ENodeType CGrid::GetType(void)    { return (eGrid); }
53
54   //----------------------------------------------------------------
55
[369]56   const std::deque< CArray<int,1>* > & CGrid::getStoreIndex(void) const
[219]57   { 
58      return (this->storeIndex );
59   }
60
61   //---------------------------------------------------------------
62
[369]63   const std::deque< CArray<int,1>* > & CGrid::getOutIIndex(void)  const
[219]64   { 
65      return (this->out_i_index ); 
66   }
67
68   //---------------------------------------------------------------
69
[369]70   const std::deque< CArray<int,1>* > & CGrid::getOutJIndex(void)  const
[219]71   { 
72      return (this->out_j_index ); 
73   }
74
75   //---------------------------------------------------------------
76
[369]77   const std::deque< CArray<int,1>* > & CGrid::getOutLIndex(void)  const
[219]78   { 
79      return (this->out_l_index ); 
80   }
81
82   //---------------------------------------------------------------
83
[347]84   const CAxis*   CGrid::getRelAxis  (void) const
[219]85   { 
86      return (this->axis ); 
87   }
88
89   //---------------------------------------------------------------
90
[347]91   const CDomain* CGrid::getRelDomain(void) const
[219]92   { 
93      return (this->domain ); 
94   }
95
96   //---------------------------------------------------------------
97
98   bool CGrid::hasAxis(void) const 
99   { 
100      return (this->withAxis); 
101   }
102
103   //---------------------------------------------------------------
104
105   StdSize CGrid::getDimension(void) const
106   {
107      return ((this->withAxis)?3:2);
108   }
109
110   //---------------------------------------------------------------
111
[351]112/*
[266]113   std::vector<StdSize> CGrid::getLocalShape(void) const
[219]114   {
115      std::vector<StdSize> retvalue;
[266]116      retvalue.push_back(domain->zoom_ni_loc.getValue());
117      retvalue.push_back(domain->zoom_nj_loc.getValue());
[219]118      if (this->withAxis)
[351]119         retvalue.push_back(this->axis->zoom_size.getValue());
[219]120      return (retvalue);
121   }
[351]122*/
[219]123   //---------------------------------------------------------------
124   
[351]125/*
[266]126   StdSize CGrid::getLocalSize(void) const
[219]127   {
128      StdSize retvalue = 1;
[266]129      std::vector<StdSize> shape_ = this->getLocalShape();
[219]130      for (StdSize s = 0; s < shape_.size(); s++)
131         retvalue *= shape_[s];
132      return (retvalue);
133   }
[351]134*/
[266]135   //---------------------------------------------------------------
[351]136/*
[266]137   std::vector<StdSize> CGrid::getGlobalShape(void) const
138   {
139      std::vector<StdSize> retvalue;
140      retvalue.push_back(domain->ni.getValue());
141      retvalue.push_back(domain->nj.getValue());
142      if (this->withAxis)
143         retvalue.push_back(this->axis->size.getValue());
144      return (retvalue);
145   }
[351]146*/
[219]147   //---------------------------------------------------------------
[351]148
149/*   
[266]150   StdSize CGrid::getGlobalSize(void) const
151   {
152      StdSize retvalue = 1;
153      std::vector<StdSize> shape_ = this->getGlobalShape();
154      for (StdSize s = 0; s < shape_.size(); s++)
155         retvalue *= shape_[s];
156      return (retvalue);
157   }
[351]158*/
[286]159   StdSize CGrid::getDataSize(void) const
160   {
[369]161      StdSize retvalue=domain->data_ni.getValue() ;
[286]162      if (domain->data_dim.getValue()==2) retvalue*=domain->data_nj.getValue() ;
163      if (this->withAxis) retvalue*=this->axis->size.getValue() ;
164
165      return (retvalue);
166   }
167
[266]168   //---------------------------------------------------------------
169
[219]170   void CGrid::solveReference(void)
171   {
172      if (this->isChecked) return;
[347]173      CContext* context = CContext::getCurrent() ;
[300]174      CContextClient* client=context->client ;
175     
[219]176      this->solveDomainRef() ;
177      this->solveAxisRef() ;
[415]178       
[300]179      if (context->hasClient)
[219]180      {
[415]181         checkMask() ;
[219]182         this->computeIndex() ;
[369]183
184         this->storeIndex.push_front(new CArray<int,1>() );
185         this->out_i_index.push_front(new CArray<int,1>());
186         this->out_j_index.push_front(new CArray<int,1>());
187         this->out_l_index.push_front(new CArray<int,1>());
[219]188      }
[300]189//      this->computeIndexServer();
[219]190      this->isChecked = true;
191   }
192
[415]193
194   void CGrid::checkMask(void)
195   {
196      using namespace std;
197
198      unsigned int niu = domain->ni, nju = domain->nj;
199      unsigned int nlu = 1 ;
200      if (hasAxis()) nlu=axis->size ;
201
202      if (!mask.isEmpty())
203      {
204         if ((mask.extent(0) != niu) ||
205             (mask.extent(1) != nju) ||
206             (mask.extent(2) != nlu))
207             ERROR("CGrid::checkAttributes(void)",
[421]208                  <<"The mask has not the same size than the local grid") ;
[415]209      }
210      else 
211      {
212        mask.resize(niu,nju,nlu) ;
213        mask=true  ;
214      }
215     
216      CArray<bool,2>& domainMask = domain->mask ;
217      for (int l=0; l < nlu ; l++)
218        for (int j=0; j < nju ; j++)
219          for(int i=0; i<niu ; i++) mask(i,j,l) = mask(i,j,l) && domainMask(i,j) ;
220       
221     
222   }
223   
[219]224   //---------------------------------------------------------------
225
226   void CGrid::solveDomainRef(void)
227   {
228      if (!domain_ref.isEmpty())
229      {
[346]230         if (CDomain::has(domain_ref.getValue()))
[219]231         {
[346]232            this->domain = CDomain::get(domain_ref.getValue()) ;
[219]233            domain->checkAttributes() ;
234         }
235         else ERROR("CGrid::solveDomainRef(void)",
[421]236                     << "Wrong domain reference") ;
[219]237      }
238      else ERROR("CGrid::solveDomainRef(void)",
[421]239                  << "Domain reference is not defined") ;
[219]240   }
241
242   //---------------------------------------------------------------
243
244   void CGrid::solveAxisRef(void)
245   {
246      if (!axis_ref.isEmpty())
247      {
248         this->withAxis = true ;
[346]249         if (CAxis::get(axis_ref.getValue()))
[219]250         {
[346]251            this->axis = CAxis::get(axis_ref.getValue()) ;
[219]252            axis->checkAttributes() ;
253         }
254         else ERROR("CGrid::solveAxisRef(void)",
[421]255                    << "Wrong axis reference") ;
[219]256      }
257      else withAxis = false ;
258   }
259
260   //---------------------------------------------------------------
261
262   void CGrid::computeIndex(void)
[266]263   {   
264   
[219]265      const int ni   = domain->ni.getValue() ,
266                nj   = domain->nj.getValue() ,
[351]267                size = (this->hasAxis()) ? axis->size.getValue() : 1 ,
268                lbegin = (this->hasAxis()) ? axis->zoom_begin.getValue()-1 : 0 ,
269                lend = (this->hasAxis()) ? axis->zoom_end.getValue()-1 : 0 ;
[219]270
271
272      const int data_dim     = domain->data_dim.getValue() ,
273                data_n_index = domain->data_n_index.getValue() ,
274                data_ibegin  = domain->data_ibegin.getValue() ,
275                data_jbegin  = (data_dim == 2)
276                             ? domain->data_jbegin.getValue() : -1;
277
[369]278      CArray<int,1> data_i_index = domain->data_i_index ;
279      CArray<int,1> data_j_index = domain->data_j_index ;
280     
[219]281
282      int indexCount = 0;
283
284      for(int l = 0; l < size ; l++)
285      {
286         for(int n = 0, i = 0, j = 0; n < data_n_index; n++)
287         {
[369]288            int temp_i = data_i_index(n) + data_ibegin,
[219]289                temp_j = (data_dim == 1) ? -1
[369]290                       : data_j_index(n) + data_jbegin;
[266]291            i = (data_dim == 1) ? (temp_i - 1) % ni
[219]292                                : (temp_i - 1) ;
[266]293            j = (data_dim == 1) ? (temp_i - 1) / ni
[219]294                                : (temp_j - 1) ;
295
[351]296            if ((l >=lbegin && l<= lend) &&
297                (i >= 0 && i < ni) &&
[415]298                (j >= 0 && j < nj) && mask(i,j,l))
[219]299               indexCount++ ;
300         }
301      }
302     
[369]303      storeIndex[0]  = new CArray<int,1>(indexCount) ;
304      out_i_index[0] = new CArray<int,1>(indexCount) ;
305      out_j_index[0] = new CArray<int,1>(indexCount) ;
306      out_l_index[0] = new CArray<int,1>(indexCount) ;
[266]307     
[369]308      storeIndex_client.resize(indexCount) ;
309      out_i_client.resize(indexCount) ;
310      out_j_client.resize(indexCount) ;
311      out_l_client.resize(indexCount) ;
[266]312     
[300]313     
[219]314      for(int count = 0, indexCount = 0,  l = 0; l < size; l++)
315      {
316         for(int n = 0, i = 0, j = 0; n < data_n_index; n++, count++)
317         {
[369]318            int temp_i = data_i_index(n) + data_ibegin,
[219]319                temp_j = (data_dim == 1) ? -1
[369]320                       : data_j_index(n) + data_jbegin;
[266]321            i = (data_dim == 1) ? (temp_i - 1) % ni
[219]322                                : (temp_i - 1) ;
[266]323            j = (data_dim == 1) ? (temp_i - 1) / ni
[219]324                                : (temp_j - 1) ;
325
[351]326            if ((l >= lbegin && l <= lend) &&
327                (i >= 0 && i < ni) &&
[415]328                (j >= 0 && j < nj) && mask(i,j,l))
[219]329            {
[369]330               (*storeIndex[0])(indexCount) = count ;
331               (*out_l_index[0])(indexCount) = l ;
332               (*out_i_index[0])(indexCount) = i ;
333               (*out_j_index[0])(indexCount) = j ;
[300]334               
[369]335               storeIndex_client(indexCount) = count ;
336               out_i_client(indexCount)=i+domain->ibegin_client-1 ;
337               out_j_client(indexCount)=j+domain->jbegin_client-1 ;
338               out_l_client(indexCount)=l-lbegin ;
[219]339               indexCount++ ;
340            }
341         }
342      }
[300]343      sendIndex() ;
[266]344
345
[219]346   }
347
348   //----------------------------------------------------------------
349
[347]350   CGrid* CGrid::createGrid(CDomain* domain)
[219]351   {
352      StdString new_id = StdString("__") + domain->getId() + StdString("__") ;
[347]353      CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ;
[219]354      grid->domain_ref.setValue(domain->getId());
355      return (grid);
356   }
357
[347]358   CGrid* CGrid::createGrid(CDomain* domain, CAxis* axis)
[219]359   {
360      StdString new_id = StdString("__") + domain->getId() +
361                         StdString("_") + axis->getId() + StdString("__") ;
[347]362      CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ;
[219]363      grid->domain_ref.setValue(domain->getId());
364      grid->axis_ref.setValue(axis->getId());
365      return (grid);
366   }
367
368   //----------------------------------------------------------------
369
[369]370   void CGrid::outputField(int rank, const CArray<double, 1>& stored,  CArray<double, 3>& field) 
[219]371   {
[369]372      CArray<int,1>& out_i=*out_i_fromClient[rank] ;
373      CArray<int,1>& out_j=*out_j_fromClient[rank] ;
374      CArray<int,1>& out_l=*out_l_fromClient[rank] ;
[300]375     
[369]376      for(StdSize n = 0; n < stored.numElements(); n++)
377         field(out_i(n), out_j(n), out_l(n)) = stored(n) ;
[219]378   }
379
[369]380   void CGrid::outputField(int rank, const CArray<double, 1>& stored,  CArray<double, 2>& field) 
[300]381   {
[369]382      CArray<int,1>& out_i=*out_i_fromClient[rank] ;
383      CArray<int,1>& out_j=*out_j_fromClient[rank] ;
384     
385      for(StdSize n = 0; n < stored.numElements(); n++)
386         field(out_i(n), out_j(n)) = stored(n) ;   }
[219]387
388   //---------------------------------------------------------------
389
[369]390   void CGrid::outputField(int rank,const CArray<double, 1>& stored,  CArray<double, 1>& field)
[219]391   {
[369]392      CArray<int,1>& out_i=*out_i_fromClient[rank] ;
393 
394      for(StdSize n = 0; n < stored.numElements(); n++)
395         field(out_i(n)) = stored(n) ;
[219]396   }
397
398   //----------------------------------------------------------------
[300]399 
[219]400
401   void CGrid::storeField_arr
[369]402      (const double * const data, CArray<double, 1>& stored) const
[219]403   {
[369]404      const StdSize size = storeIndex_client.numElements() ;
[300]405
[369]406      stored.resize(size) ;
407      for(StdSize i = 0; i < size; i++) stored(i) = data[storeIndex_client(i)] ;
[219]408   }
409   
410   //---------------------------------------------------------------
411
[300]412  void CGrid::sendIndex(void)
413  {
[347]414    CContext* context = CContext::getCurrent() ;
[300]415    CContextClient* client=context->client ;
416   
417    CEventClient event(getType(),EVENT_ID_INDEX) ;
418    int rank ;
419    list<shared_ptr<CMessage> > list_msg ;
[369]420    list< CArray<int,1>* > list_out_i,list_out_j,list_out_l ;
[300]421     
422    for(int ns=0;ns<domain->connectedServer.size();ns++)
423    {
424       rank=domain->connectedServer[ns] ;
425       int ib=domain->ib_srv[ns] ;
426       int ie=domain->ie_srv[ns] ;
427       int jb=domain->jb_srv[ns] ;
428       int je=domain->je_srv[ns] ;
429       
430       int i,j ;
431       int nb=0 ;
[369]432       for(int k=0;k<storeIndex_client.numElements();k++)
[300]433       {
[369]434         i=out_i_client(k) ;
435         j=out_j_client(k) ;
[300]436         if (i>=ib-1 && i<=ie-1 && j>=jb-1 && j<=je-1) nb++ ; 
437       }
438       
[369]439       CArray<int,1> storeIndex(nb) ;
440       CArray<int,1> out_i(nb) ;
441       CArray<int,1> out_j(nb) ;
442       CArray<int,1> out_l(nb) ;
443 
[300]444       
445       nb=0 ;
[369]446       for(int k=0;k<storeIndex_client.numElements();k++)
[300]447       {
[369]448         i=out_i_client(k) ;
449         j=out_j_client(k) ;
[300]450         if (i>=ib-1 && i<=ie-1 && j>=jb-1 && j<=je-1) 
451         {
[369]452            storeIndex(nb)=k ;
453            out_i(nb)=out_i_client(k) ;
454            out_j(nb)=out_j_client(k) ;
455            out_l(nb)=out_l_client(k) ;
[300]456            nb++ ;
457         }
458       }
459       
[369]460       storeIndex_toSrv.insert( pair<int,CArray<int,1>* >(rank,new CArray<int,1>(storeIndex) )) ;
[300]461       nbSenders.insert(pair<int,int>(rank,domain->nbSenders[ns])) ;
462       list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ;
[369]463       list_out_i.push_back(new CArray<int,1>(out_i)) ;
464       list_out_j.push_back(new CArray<int,1>(out_j)) ;
465       list_out_l.push_back(new CArray<int,1>(out_l)) ;
[300]466
[369]467       *list_msg.back()<<getId()<<*list_out_i.back()<<*list_out_j.back()<<*list_out_l.back() ;
[300]468       event.push(rank,domain->nbSenders[ns],*list_msg.back()) ;
469    }
470    client->sendEvent(event) ;
[369]471
472    for(list<CArray<int,1>* >::iterator it=list_out_i.begin();it!=list_out_i.end();it++) delete *it ;
473    for(list<CArray<int,1>* >::iterator it=list_out_j.begin();it!=list_out_j.end();it++) delete *it ;
474    for(list<CArray<int,1>* >::iterator it=list_out_l.begin();it!=list_out_l.end();it++) delete *it ;
475   
[300]476  }
477 
478  void CGrid::recvIndex(CEventServer& event)
479  {
480    list<CEventServer::SSubEvent>::iterator it ;
481    for (it=event.subEvents.begin();it!=event.subEvents.end();++it)
482    {
483      int rank=it->rank;
484      CBufferIn* buffer=it->buffer;
485      string domainId ;
486      *buffer>>domainId ;
487      get(domainId)->recvIndex(rank,*buffer) ;
488    }
489  }
490 
491  void CGrid::recvIndex(int rank, CBufferIn& buffer)
492  {
[369]493    CArray<int,1> out_i ;
494    CArray<int,1> out_j ;
495    CArray<int,1> out_l ;
[300]496   
497    buffer>>out_i>>out_j>>out_l ;
498   
[369]499    out_i -= domain->zoom_ibegin_srv-1 ;
500    out_j -= domain->zoom_jbegin_srv-1 ;
[300]501   
[369]502    out_i_fromClient.insert(pair< int,CArray<int,1>* >(rank,new CArray<int,1>(out_i) )) ;
503    out_j_fromClient.insert(pair< int,CArray<int,1>* >(rank,new CArray<int,1>(out_j) )) ;
504    out_l_fromClient.insert(pair< int,CArray<int,1>* >(rank,new CArray<int,1>(out_l) )) ;
[300]505  }
506
507  bool CGrid::dispatchEvent(CEventServer& event)
508  {
509     
510    if (SuperClass::dispatchEvent(event)) return true ;
511    else
512    {
513      switch(event.type)
514      {
515        case EVENT_ID_INDEX :
516          recvIndex(event) ;
517          return true ;
518          break ;
519 
520        default :
521          ERROR("bool CDomain::dispatchEvent(CEventServer& event)",
522                <<"Unknown Event") ;
523          return false ;
524      }
525    }
526  }
527
[369]528   void CGrid::inputFieldServer(const std::deque< CArray<double, 1>* > storedClient, CArray<double, 1>&  storedServer) const
[219]529   {
530      if ((this->storeIndex.size()-1 ) != storedClient.size())
[369]531         ERROR("void CGrid::inputFieldServer(const std::deque< CArray<double, 1>* > storedClient, CArray<double, 1>&  storedServer) const",
[421]532                << "[ Expected received field = " << (this->storeIndex.size()-1) << ", "
533                << "[ received fiedl = "    << storedClient.size() << "] "
534                << "Data from clients are missing!") ;
[369]535      storedServer.resize(storeIndex[0]->numElements());
[219]536         
537      for (StdSize i = 0, n = 0; i < storedClient.size(); i++)
[369]538         for (StdSize j = 0; j < storedClient[i]->numElements(); j++)
539            storedServer(n++) = (*storedClient[i])(j);
[219]540   }
541
[369]542   void CGrid::outputFieldToServer(CArray<double,1>& fieldIn, int rank, CArray<double,1>& fieldOut)
[300]543   {
[369]544     CArray<int,1>& index = *storeIndex_toSrv[rank] ;
545     int nb=index.numElements() ;
546     fieldOut.resize(nb) ;
[300]547     
[369]548     for(int k=0;k<nb;k++) fieldOut(k)=fieldIn(index(k)) ;
[300]549    }
[219]550   ///---------------------------------------------------------------
551
[335]552} // namespace xios
Note: See TracBrowser for help on using the repository browser.