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

trunk/esys2/escript/src/Data/DataVector.cpp revision 122 by jgs, Thu Jun 9 05:38:05 2005 UTC branches/arrexp_2137_win/escript/src/DataVector.cpp revision 2202 by jfenwick, Fri Jan 9 01:28:32 2009 UTC
# Line 1  Line 1 
 /*  
  ******************************************************************************  
  *                                                                            *  
  *       COPYRIGHT  ACcESS 2004 -  All Rights Reserved                        *  
  *                                                                            *  
  * This software is the property of ACcESS. No part of this code              *  
  * may be copied in any form or by any means without the expressed written    *  
  * consent of ACcESS.  Copying, use or modification of this software          *  
  * by any unauthorised person is illegal unless that person has a software    *  
  * license agreement with ACcESS.                                             *  
  *                                                                            *  
  ******************************************************************************  
 */  
1    
2  #include <iostream>  /*******************************************************
3  #include <cassert>  *
4    * Copyright (c) 2003-2008 by University of Queensland
5    * Earth Systems Science Computational Center (ESSCC)
6    * http://www.uq.edu.au/esscc
7    *
8    * Primary Business: Queensland, Australia
9    * Licensed under the Open Software License version 3.0
10    * http://www.opensource.org/licenses/osl-3.0.php
11    *
12    *******************************************************/
13    
14    
15    #include "DataVector.h"
16    
17    #include "Taipan.h"
18    #include "DataException.h"
19    #include <boost/python/extract.hpp>
20    #include "DataTypes.h"
21    #include "WrappedArray.h"
22    
23  #include "escript/Data/DataVector.h"  #include <cassert>
 #include "escript/Data/Taipan.h"  
 #include "escript/Data/DataException.h"  
24    
25  using namespace std;  using namespace std;
26  using namespace escript;  using namespace escript;
27    using namespace boost::python;
28    
29  namespace escript {  namespace escript {
30    
31  Taipan arrayManager;  Taipan arrayManager;
32    
33    void releaseUnusedMemory()
34    {
35       arrayManager.release_unused_arrays();
36    }
37    
38    
39  DataVector::DataVector() :  DataVector::DataVector() :
   m_array_data(0),  
40    m_size(0),    m_size(0),
41    m_dim(0),    m_dim(0),
42    m_N(0)    m_N(0),
43      m_array_data(0)
44  {  {
45  }  }
46    
47  DataVector::DataVector(const DataVector& other) :  DataVector::DataVector(const DataVector& other) :
   m_array_data(0),  
48    m_size(other.m_size),    m_size(other.m_size),
49    m_dim(other.m_dim),    m_dim(other.m_dim),
50    m_N(other.m_N)    m_N(other.m_N),
51      m_array_data(0)
52  {  {
53    m_array_data = arrayManager.new_array(m_dim,m_N);    m_array_data = arrayManager.new_array(m_dim,m_N);
54    int i;    int i;
# Line 51  DataVector::DataVector(const DataVector& Line 61  DataVector::DataVector(const DataVector&
61  DataVector::DataVector(const DataVector::size_type size,  DataVector::DataVector(const DataVector::size_type size,
62                         const DataVector::value_type val,                         const DataVector::value_type val,
63                         const DataVector::size_type blockSize) :                         const DataVector::size_type blockSize) :
   m_array_data(0),  
64    m_size(size),    m_size(size),
65    m_dim(blockSize)    m_dim(blockSize),
66      m_array_data(0)
67  {  {
68    resize(size, val, blockSize);    resize(size, val, blockSize);
69  }  }
# Line 61  DataVector::DataVector(const DataVector: Line 71  DataVector::DataVector(const DataVector:
71  DataVector::~DataVector()  DataVector::~DataVector()
72  {  {
73    // dispose of data array    // dispose of data array
74    arrayManager.delete_array(m_array_data);    if (m_array_data!=0) {
75        arrayManager.delete_array(m_array_data);
76      }
77    
78    // clear data members    // clear data members
79    m_size = -1;    m_size = -1;
# Line 77  DataVector::resize(const DataVector::siz Line 89  DataVector::resize(const DataVector::siz
89  {  {
90    assert(m_size >= 0);    assert(m_size >= 0);
91    
92      if ( newBlockSize == 0) {
93        throw DataException("DataVector: invalid blockSize specified (newBlockSize)");
94      }
95    
96    if ( (newSize % newBlockSize) != 0) {    if ( (newSize % newBlockSize) != 0) {
97      throw DataException("DataVector: invalid blockSize specified");      throw DataException("DataVector: invalid blockSize specified");
98    }    }
99    
100    arrayManager.delete_array(m_array_data);    if (m_array_data!=0) {
101        arrayManager.delete_array(m_array_data);
102      }
103    
104    m_size = newSize;    m_size = newSize;
105    m_dim = newBlockSize;    m_dim = newBlockSize;
# Line 100  DataVector::operator=(const DataVector& Line 118  DataVector::operator=(const DataVector&
118  {  {
119    assert(m_size >= 0);    assert(m_size >= 0);
120    
121    arrayManager.delete_array(m_array_data);    if (m_array_data!=0) {
122        arrayManager.delete_array(m_array_data);
123      }
124    
125    m_size = other.m_size;    m_size = other.m_size;
126    m_dim = other.m_dim;    m_dim = other.m_dim;
# Line 144  DataVector::operator!=(const DataVector& Line 164  DataVector::operator!=(const DataVector&
164    return !(*this==other);    return !(*this==other);
165  }  }
166    
167    void
168    DataVector::copyFromArrayToOffset(const WrappedArray& value, size_type offset)
169    {
170      using DataTypes::ValueType;
171      const DataTypes::ShapeType& tempShape=value.getShape();
172      size_type len=DataTypes::noValues(tempShape);
173      if (offset+len>size())
174      {
175    cerr << "offset=" << offset << " len=" << len << " >= " << size() << endl;
176         throw DataException("Error - not enough room for that DataPoint at that offset.");
177      }
178      size_t si=0,sj=0,sk=0,sl=0;
179      switch (value.getRank())
180      {
181      case 0:
182        m_array_data[offset]=value.getElt();
183        break;
184      case 1:
185        for (size_t i=0;i<tempShape[0];++i)
186        {
187          m_array_data[offset+i]=value.getElt(i);
188        }
189        break;
190      case 2:
191        si=tempShape[0];
192        sj=tempShape[1];
193            for (ValueType::size_type i=0;i<si;i++) {
194               for (ValueType::size_type j=0;j<sj;j++) {
195                  m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j)]=value.getElt(i,j);
196               }
197            }
198        break;
199      case 3:
200        si=tempShape[0];
201        sj=tempShape[1];
202        sk=tempShape[2];
203            for (ValueType::size_type i=0;i<si;i++) {
204               for (ValueType::size_type j=0;j<sj;j++) {
205                  for (ValueType::size_type k=0;k<sk;k++) {
206                     m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j,k)]=value.getElt(i,j,k);
207                  }
208               }
209            }
210        break;
211      case 4:
212        si=tempShape[0];
213        sj=tempShape[1];
214        sk=tempShape[2];
215        sl=tempShape[3];
216            for (ValueType::size_type i=0;i<si;i++) {
217               for (ValueType::size_type j=0;j<sj;j++) {
218                  for (ValueType::size_type k=0;k<sk;k++) {
219                     for (ValueType::size_type l=0;l<sl;l++) {
220                        m_array_data[offset+DataTypes::getRelIndex(tempShape,i,j,k,l)]=value.getElt(i,j,k,l);
221                     }
222                  }
223               }
224            }
225        break;
226      default:
227        ostringstream oss;
228        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.122  
changed lines
  Added in v.2202

  ViewVC Help
Powered by ViewVC 1.1.26