/[escript]/branches/arrexp_2137_win_merge/escript/src/DataVector.cpp
ViewVC logotype

Diff of /branches/arrexp_2137_win_merge/escript/src/DataVector.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

branches/arrexp_trunk2098/escript/src/DataVector.cpp revision 2111 by jfenwick, Mon Dec 1 01:16:18 2008 UTC branches/arrexp_2137_win_merge/escript/src/DataVector.cpp revision 2219 by jfenwick, Wed Jan 14 04:31:34 2009 UTC
# Line 18  Line 18 
18  #include "DataException.h"  #include "DataException.h"
19  #include <boost/python/extract.hpp>  #include <boost/python/extract.hpp>
20  #include "DataTypes.h"  #include "DataTypes.h"
21    #include "WrappedArray.h"
22    
23  #include <cassert>  #include <cassert>
24    
# Line 163  DataVector::operator!=(const DataVector& Line 164  DataVector::operator!=(const DataVector&
164    return !(*this==other);    return !(*this==other);
165  }  }
166    
167    void
168  void  DataVector::copyFromArrayToOffset(const WrappedArray& value, size_type offset, size_type copies)
 DataVector::copyFromNumArray(const boost::python::numeric::array& value)  
169  {  {
170    using DataTypes::ValueType;    using DataTypes::ValueType;
171    if (m_array_data!=0) {    const DataTypes::ShapeType& tempShape=value.getShape();
172      arrayManager.delete_array(m_array_data);    size_type len=DataTypes::noValues(tempShape);
173    }    if (offset+len*copies>size())
174      {
175         ostringstream ss;
176    m_array_data = arrayManager.new_array(1,value.nelements());       ss << "Error - not enough room for that DataPoint at that offset. (";
177         ss << "offset=" << offset << " + " << " len=" << len << " >= " << size();
178    int si=0,sj=0,sk=0,sl=0;      // bounds for each dimension of the shape       throw DataException(ss.str());
179    DataTypes::ShapeType tempShape;        }
180    for (int i=0; i<value.getrank(); i++) {    size_t si=0,sj=0,sk=0,sl=0;
181       tempShape.push_back(extract<int>(value.getshape()[i]));    switch (value.getRank())
182    }    {
183      case 0:  
184    if (value.getrank()==0) {      for (size_type z=0;z<copies;++z)
185       m_array_data[0]=extract<double>(value[value.getshape()]);      {
186    } else if (value.getrank()==1) {         m_array_data[offset]=value.getElt();
187       si=tempShape[0];      }
188       for (ValueType::size_type i=0;i<si;i++) {      break;
189          m_array_data[i]=extract<double>(value[i]);    case 1:
190       }      for (size_type z=0;z<copies;++z)
191    } else if (value.getrank()==2) {      {
192           for (size_t i=0;i<tempShape[0];++i)
193           {
194              m_array_data[offset+i]=value.getElt(i);
195           }
196           offset+=z*len;
197        }
198        break;
199      case 2:
200      si=tempShape[0];      si=tempShape[0];
201      sj=tempShape[1];      sj=tempShape[1];
202          for (ValueType::size_type i=0;i<si;i++) {      for (size_type z=0;z<copies;++z)
203             for (ValueType::size_type j=0;j<sj;j++) {      {
204                m_array_data[DataTypes::getRelIndex(tempShape,i,j)]=extract<double>(value[i][j]);             for (ValueType::size_type i=0;i<si;i++)
205           {
206                  for (ValueType::size_type j=0;j<sj;j++)
207              {
208                     m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j)]=value.getElt(i,j);
209                  }
210             }             }
211          }         offset+=z*len;
212    } else if (value.getrank()==3) {      }
213        break;
214      case 3:
215      si=tempShape[0];      si=tempShape[0];
216      sj=tempShape[1];      sj=tempShape[1];
217      sk=tempShape[2];      sk=tempShape[2];
218          for (ValueType::size_type i=0;i<si;i++) {      for (size_type z=0;z<copies;++z)
219             for (ValueType::size_type j=0;j<sj;j++) {      {
220                for (ValueType::size_type k=0;k<sk;k++) {            for (ValueType::size_type i=0;i<si;i++)
221                   m_array_data[DataTypes::getRelIndex(tempShape,i,j,k)]=extract<double>(value[i][j][k]);        {
222                for (ValueType::size_type j=0;j<sj;j++)
223            {
224                  for (ValueType::size_type k=0;k<sk;k++)
225              {
226                     m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j,k)]=value.getElt(i,j,k);
227                }                }
228             }              }
229          }            }
230    } else if (value.getrank()==4) {        offset+=len;
231        }
232        break;
233      case 4:
234      si=tempShape[0];      si=tempShape[0];
235      sj=tempShape[1];      sj=tempShape[1];
236      sk=tempShape[2];      sk=tempShape[2];
237      sl=tempShape[3];      sl=tempShape[3];
238          for (ValueType::size_type i=0;i<si;i++) {      for (size_type z=0;z<copies;++z)
239             for (ValueType::size_type j=0;j<sj;j++) {      {
240                for (ValueType::size_type k=0;k<sk;k++) {            for (ValueType::size_type i=0;i<si;i++)
241                   for (ValueType::size_type l=0;l<sl;l++) {        {
242                      m_array_data[DataTypes::getRelIndex(tempShape,i,j,k,l)]=extract<double>(value[i][j][k][l]);              for (ValueType::size_type j=0;j<sj;j++)
243            {
244                  for (ValueType::size_type k=0;k<sk;k++)
245              {
246                     for (ValueType::size_type l=0;l<sl;l++)
247             {
248                        m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j,k,l)]=value.getElt(i,j,k,l);
249                   }                   }
250                }                }
251             }              }
252          }            }
253     }        offset+=len;
254     m_size=value.nelements();    // total amount of elements      }
255     m_dim=m_size;        // elements per sample      break;
256     m_N=1;           // number of samples    default:
257        ostringstream oss;
258        oss << "Error - unknown rank. Rank=" << value.getRank();
259        throw DataException(oss.str());
260      }
261  }  }
   
262    
263    
264    void
265    DataVector::copyFromArray(const WrappedArray& value, size_type copies)
266    {
267      using DataTypes::ValueType;
268      if (m_array_data!=0) {
269        arrayManager.delete_array(m_array_data);
270      }
271      DataTypes::ShapeType tempShape=value.getShape();
272      DataVector::size_type nelements=DataTypes::noValues(tempShape)*copies;
273      m_array_data = arrayManager.new_array(1,nelements);
274      m_size=nelements; // total amount of elements
275      m_dim=m_size;     // elements per sample
276      m_N=1;            // number of samples
277      copyFromArrayToOffset(value,0,copies);
278    }
279    
280  } // end of namespace  } // end of namespace

Legend:
Removed from v.2111  
changed lines
  Added in v.2219

  ViewVC Help
Powered by ViewVC 1.1.26