/[escript]/trunk/escript/src/DataArrayView.cpp
ViewVC logotype

Diff of /trunk/escript/src/DataArrayView.cpp

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

revision 117 by jgs, Fri Apr 1 05:48:57 2005 UTC revision 122 by jgs, Thu Jun 9 05:38:05 2005 UTC
# Line 33  DataArrayView::DataArrayView(): Line 33  DataArrayView::DataArrayView():
33      m_offset(0),      m_offset(0),
34      m_noValues(0)      m_noValues(0)
35  {  {
36      m_data=0;    m_data=0;
37  }  }
38    
39  DataArrayView::DataArrayView(ValueType& data,  DataArrayView::DataArrayView(ValueType& data,
# Line 74  DataArrayView::DataArrayView(const DataA Line 74  DataArrayView::DataArrayView(const DataA
74  bool  bool
75  DataArrayView::isEmpty() const  DataArrayView::isEmpty() const
76  {  {
77      return (m_data==0);    return (m_data==0);
78  }  }
79    
80  void  void
# Line 91  DataArrayView::copy(const boost::python: Line 91  DataArrayView::copy(const boost::python:
91      if (value.getrank()==0) {      if (value.getrank()==0) {
92        (*this)()=extract<double>(value[value.getshape()]);        (*this)()=extract<double>(value[value.getshape()]);
93      } else if (value.getrank()==1) {      } else if (value.getrank()==1) {
94        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
95      (*this)(i)=extract<double>(value[i]);      (*this)(i)=extract<double>(value[i]);
96        }        }
97      } else if (value.getrank()==2) {      } else if (value.getrank()==2) {
98        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
99      for (ValueType::size_type j=0;j<tempShape[1];++j) {      for (ValueType::size_type j=0;j<tempShape[1];j++) {
100        (*this)(i,j)=extract<double>(value[i][j]);        (*this)(i,j)=extract<double>(value[i][j]);
101      }      }
102        }        }
103      } else if (value.getrank()==3) {      } else if (value.getrank()==3) {
104        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
105      for (ValueType::size_type j=0;j<tempShape[1];++j) {      for (ValueType::size_type j=0;j<tempShape[1];j++) {
106        for (ValueType::size_type k=0;k<tempShape[2];++k) {        for (ValueType::size_type k=0;k<tempShape[2];k++) {
107          (*this)(i,j,k)=extract<double>(value[i][j][k]);          (*this)(i,j,k)=extract<double>(value[i][j][k]);
108        }        }
109      }      }
110        }        }
111      } else if (value.getrank()==4) {      } else if (value.getrank()==4) {
112        for (ValueType::size_type i=0;i<tempShape[0];++i) {        for (ValueType::size_type i=0;i<tempShape[0];i++) {
113      for (ValueType::size_type j=0;j<tempShape[1];++j) {      for (ValueType::size_type j=0;j<tempShape[1];j++) {
114        for (ValueType::size_type k=0;k<tempShape[2];++k) {        for (ValueType::size_type k=0;k<tempShape[2];k++) {
115          for (ValueType::size_type m=0;m<tempShape[3];++m) {          for (ValueType::size_type l=0;l<tempShape[3];l++) {
116            (*this)(i,j,k,m)=extract<double>(value[i][j][k][m]);            (*this)(i,j,k,l)=extract<double>(value[i][j][k][l]);
117          }          }
118        }        }
119      }      }
# Line 124  DataArrayView::copy(const boost::python: Line 124  DataArrayView::copy(const boost::python:
124  void  void
125  DataArrayView::copy(const DataArrayView& other)  DataArrayView::copy(const DataArrayView& other)
126  {  {
127      copy(m_offset,other);    copy(m_offset,other);
128  }  }
129    
130  void  void
# Line 165  DataArrayView::copy(ValueType::size_type Line 165  DataArrayView::copy(ValueType::size_type
165      EsysAssert((!isEmpty()&&checkOffset(offset)),      EsysAssert((!isEmpty()&&checkOffset(offset)),
166             "Error - Couldn't copy due to insufficient storage.");             "Error - Couldn't copy due to insufficient storage.");
167      if (checkOffset(offset)) {      if (checkOffset(offset)) {
168        ValueType temp(noValues(),value);        vector<double> temp(noValues(),value);
169        memcpy(&(*m_data)[offset],&temp[0],sizeof(double)*noValues());        memcpy(&(*m_data)[offset],&temp[0],sizeof(double)*noValues());
170      } else {      } else {
171        throw DataException("Error - invalid offset specified.");        throw DataException("Error - invalid offset specified.");
# Line 175  DataArrayView::copy(ValueType::size_type Line 175  DataArrayView::copy(ValueType::size_type
175  int  int
176  DataArrayView::getRank() const  DataArrayView::getRank() const
177  {  {
178      return m_shape.size();    return m_shape.size();
179  }  }
180    
181  const  const
182  DataArrayView::ShapeType&  DataArrayView::ShapeType&
183  DataArrayView::getShape() const  DataArrayView::getShape() const
184  {  {
185      return m_shape;    return m_shape;
186  }  }
187    
188  int  int
189  DataArrayView::noValues(const ShapeType& shape)  DataArrayView::noValues(const ShapeType& shape)
190  {  {
191      ShapeType::const_iterator i;    ShapeType::const_iterator i;
192      //    //
193      // An empty shape vector means rank 0 which contains 1 value    // An empty shape vector means rank 0 which contains 1 value
194      int noValues=1;    int noValues=1;
195      for (i=shape.begin();i!=shape.end();i++) {    for (i=shape.begin();i!=shape.end();i++) {
196        noValues*=(*i);      noValues*=(*i);
197      }    }
198      return noValues;    return noValues;
199  }  }
200    
201  int  int
202  DataArrayView::noValues(const RegionLoopRangeType& region)  DataArrayView::noValues(const RegionLoopRangeType& region)
203  {  {
204      //    //
205      // An empty region vector means rank 0 which contains 1 value    // An empty region vector means rank 0 which contains 1 value
206      int noValues=1;    int noValues=1;
207      for (int i=0; i<region.size(); i++) {    for (int i=0;i<region.size();i++) {
208        noValues*=region[i].second-region[i].first;      noValues*=region[i].second-region[i].first;
209      }    }
210      return noValues;    return noValues;
211  }  }
212    
213  int  int
214  DataArrayView::noValues() const  DataArrayView::noValues() const
215  {  {
216      return m_noValues;    return m_noValues;
217  }  }
218    
219  bool  bool
220  DataArrayView::checkShape(const DataArrayView::ShapeType& other) const  DataArrayView::checkShape(const DataArrayView::ShapeType& other) const
221  {  {
222      return (m_shape==other);    return (m_shape==other);
223  }  }
224    
225  string  string
226  DataArrayView::createShapeErrorMessage(const string& messagePrefix,  DataArrayView::createShapeErrorMessage(const string& messagePrefix,
227                                         const DataArrayView::ShapeType& other) const                                         const DataArrayView::ShapeType& other) const
228  {  {
229      stringstream temp;    stringstream temp;
230      temp << messagePrefix    temp << messagePrefix
231       << " This shape: " << shapeToString(m_shape)         << " This shape: " << shapeToString(m_shape)
232       << " Other shape: " << shapeToString(other);         << " Other shape: " << shapeToString(other);
233      return temp.str();    return temp.str();
234  }  }
235    
236  DataArrayView::ValueType::size_type  DataArrayView::ValueType::size_type
# Line 242  DataArrayView::getOffset() const Line 242  DataArrayView::getOffset() const
242  void  void
243  DataArrayView::setOffset(ValueType::size_type offset)  DataArrayView::setOffset(ValueType::size_type offset)
244  {  {
245      EsysAssert((checkOffset(offset)), "Error - Invalid offset.");    EsysAssert((checkOffset(offset)), "Error - Invalid offset.");
246      if (checkOffset(offset)) {    if (checkOffset(offset)) {
247        m_offset=offset;      m_offset=offset;
248      } else {    } else {
249        throw DataException("Error - invalid offset specified.");      throw DataException("Error - invalid offset specified.");
250      }    }
251  }  }
252    
253  void  void
254  DataArrayView::incrOffset()  DataArrayView::incrOffset()
255  {  {
256      EsysAssert((checkOffset(m_offset+noValues())), "Error - Cannot increment offset.");    EsysAssert((checkOffset(m_offset+noValues())), "Error - Cannot increment offset.");
257      if (checkOffset(m_offset+noValues())) {    if (checkOffset(m_offset+noValues())) {
258        m_offset=m_offset+noValues();      m_offset=m_offset+noValues();
259      } else {    } else {
260        throw DataException("Error - Cannot increment offset.");      throw DataException("Error - Cannot increment offset.");
261      }    }
262  }  }
263    
264  bool  bool
265  DataArrayView::checkOffset() const  DataArrayView::checkOffset() const
266  {  {
267      return checkOffset(m_offset);    return checkOffset(m_offset);
268  }  }
269    
270  bool  bool
271  DataArrayView::checkOffset(ValueType::size_type offset) const  DataArrayView::checkOffset(ValueType::size_type offset) const
272  {  {
273      return (m_data->size() >= (offset+noValues()));    return (m_data->size() >= (offset+noValues()));
274  }  }
275    
276  DataArrayView::ValueType&  DataArrayView::ValueType&
# Line 292  DataArrayView::getData(ValueType::size_t Line 292  DataArrayView::getData(ValueType::size_t
292  DataArrayView::ShapeType  DataArrayView::ShapeType
293  DataArrayView::getResultSliceShape(const RegionType& region)  DataArrayView::getResultSliceShape(const RegionType& region)
294  {  {
295      int dimSize;    int dimSize;
296      RegionType::const_iterator i;    RegionType::const_iterator i;
297      ShapeType result;    ShapeType result;
298      for (i=region.begin();i!=region.end();i++) {    for (i=region.begin();i!=region.end();i++) {
299        dimSize=((i->second)-(i->first));      dimSize=((i->second)-(i->first));
300        if (dimSize!=0) {      if (dimSize!=0) {
301      result.push_back(dimSize);        result.push_back(dimSize);
       }  
302      }      }
303      return result;    }
304      return result;
305  }  }
306    
307  DataArrayView::RegionType  DataArrayView::RegionType
# Line 401  void Line 401  void
401  DataArrayView::copySlice(const DataArrayView& other,  DataArrayView::copySlice(const DataArrayView& other,
402                           const RegionLoopRangeType& region)                           const RegionLoopRangeType& region)
403  {  {
404      //    //
405      // version of copySlice that uses the default offsets    // version of copySlice that uses the default offsets
406      copySlice(m_offset,other,other.m_offset,region);    copySlice(m_offset,other,other.m_offset,region);
407  }  }
408    
409  void  void
# Line 439  DataArrayView::copySlice(ValueType::size Line 439  DataArrayView::copySlice(ValueType::size
439      //      //
440      // copy the values in the specified region of the other view into this view      // copy the values in the specified region of the other view into this view
441    
442        // the following loops cannot be parallelised due to the numCopy counter
443      int numCopy=0;      int numCopy=0;
444    
445      switch (region.size()) {      switch (region.size()) {
# Line 537  DataArrayView::copySliceFrom(ValueType:: Line 538  DataArrayView::copySliceFrom(ValueType::
538      // allow for case where other view is a scalar      // allow for case where other view is a scalar
539      if (other.getRank()==0) {      if (other.getRank()==0) {
540    
541            // the following loops cannot be parallelised due to the numCopy counter
542          int numCopy=0;          int numCopy=0;
543    
544          switch (region.size()) {          switch (region.size()) {
# Line 591  DataArrayView::copySliceFrom(ValueType:: Line 593  DataArrayView::copySliceFrom(ValueType::
593    
594      } else {      } else {
595    
596            // the following loops cannot be parallelised due to the numCopy counter
597          int numCopy=0;          int numCopy=0;
598    
599          switch (region.size()) {          switch (region.size()) {

Legend:
Removed from v.117  
changed lines
  Added in v.122

  ViewVC Help
Powered by ViewVC 1.1.26