/[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

revision 2111 by jfenwick, Mon Dec 1 01:16:18 2008 UTC revision 2133 by jfenwick, Fri Dec 5 00:20:46 2008 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)
 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>size())
174      {
175    cerr << "offset=" << offset << " len=" << len << " >= " << size() << endl;
176    m_array_data = arrayManager.new_array(1,value.nelements());       throw DataException("Error - not enough room for that DataPoint at that offset.");
177      }
178    int si=0,sj=0,sk=0,sl=0;      // bounds for each dimension of the shape    size_t si=0,sj=0,sk=0,sl=0;
179    DataTypes::ShapeType tempShape;        switch (value.getRank())
180    for (int i=0; i<value.getrank(); i++) {    {
181       tempShape.push_back(extract<int>(value.getshape()[i]));    case 0:
182    }      m_array_data[offset]=value.getElt();
183        break;
184    if (value.getrank()==0) {    case 1:
185       m_array_data[0]=extract<double>(value[value.getshape()]);      for (size_t i=0;i<tempShape[0];++i)
186    } else if (value.getrank()==1) {      {
187       si=tempShape[0];        m_array_data[offset+i]=value.getElt(i);
188       for (ValueType::size_type i=0;i<si;i++) {      }
189          m_array_data[i]=extract<double>(value[i]);      break;
190       }    case 2:
   } else if (value.getrank()==2) {  
191      si=tempShape[0];      si=tempShape[0];
192      sj=tempShape[1];      sj=tempShape[1];
193          for (ValueType::size_type i=0;i<si;i++) {          for (ValueType::size_type i=0;i<si;i++) {
194             for (ValueType::size_type j=0;j<sj;j++) {             for (ValueType::size_type j=0;j<sj;j++) {
195                m_array_data[DataTypes::getRelIndex(tempShape,i,j)]=extract<double>(value[i][j]);                m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j)]=value.getElt(i,j);
196             }             }
197          }          }
198    } else if (value.getrank()==3) {      break;
199      case 3:
200      si=tempShape[0];      si=tempShape[0];
201      sj=tempShape[1];      sj=tempShape[1];
202      sk=tempShape[2];      sk=tempShape[2];
203          for (ValueType::size_type i=0;i<si;i++) {          for (ValueType::size_type i=0;i<si;i++) {
204             for (ValueType::size_type j=0;j<sj;j++) {             for (ValueType::size_type j=0;j<sj;j++) {
205                for (ValueType::size_type k=0;k<sk;k++) {                for (ValueType::size_type k=0;k<sk;k++) {
206                   m_array_data[DataTypes::getRelIndex(tempShape,i,j,k)]=extract<double>(value[i][j][k]);                   m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j,k)]=value.getElt(i,j,k);
207                }                }
208             }             }
209          }          }
210    } else if (value.getrank()==4) {      break;
211      case 4:
212      si=tempShape[0];      si=tempShape[0];
213      sj=tempShape[1];      sj=tempShape[1];
214      sk=tempShape[2];      sk=tempShape[2];
# Line 216  DataVector::copyFromNumArray(const boost Line 217  DataVector::copyFromNumArray(const boost
217             for (ValueType::size_type j=0;j<sj;j++) {             for (ValueType::size_type j=0;j<sj;j++) {
218                for (ValueType::size_type k=0;k<sk;k++) {                for (ValueType::size_type k=0;k<sk;k++) {
219                   for (ValueType::size_type l=0;l<sl;l++) {                   for (ValueType::size_type l=0;l<sl;l++) {
220                      m_array_data[DataTypes::getRelIndex(tempShape,i,j,k,l)]=extract<double>(value[i][j][k][l]);                      m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j,k,l)]=value.getElt(i,j,k,l);
221                   }                   }
222                }                }
223             }             }
224          }          }
225     }      break;
226     m_size=value.nelements();    // total amount of elements    default:
227     m_dim=m_size;        // elements per sample      ostringstream oss;
228     m_N=1;           // number of samples      oss << "Error - unknown rank. Rank=" << value.getRank();
229        throw DataException(oss.str());
230      }
231  }  }
   
232    
233    
234    void
235    DataVector::copyFromArray(const WrappedArray& value)
236    {
237      using DataTypes::ValueType;
238      if (m_array_data!=0) {
239        arrayManager.delete_array(m_array_data);
240      }
241      DataTypes::ShapeType tempShape=value.getShape();
242      DataVector::size_type nelements=DataTypes::noValues(tempShape);
243      m_array_data = arrayManager.new_array(1,nelements);
244      m_size=nelements; // total amount of elements
245      m_dim=m_size;     // elements per sample
246      m_N=1;            // number of samples
247      copyFromArrayToOffset(value,0);
248    }
249    
250  } // end of namespace  } // end of namespace

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

  ViewVC Help
Powered by ViewVC 1.1.26