/[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 trunk/escript/src/DataVector.cpp revision 1811 by ksteube, Thu Sep 25 23:11:13 2008 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    
22  #include "escript/Data/DataVector.h"  #include <cassert>
 #include "escript/Data/Taipan.h"  
 #include "escript/Data/DataException.h"  
23    
24  using namespace std;  using namespace std;
25  using namespace escript;  using namespace escript;
26    using namespace boost::python;
27    
28  namespace escript {  namespace escript {
29    
30  Taipan arrayManager;  Taipan arrayManager;
31    
32    void releaseUnusedMemory()
33    {
34       arrayManager.release_unused_arrays();
35    }
36    
37    
38  DataVector::DataVector() :  DataVector::DataVector() :
39    m_array_data(0),    m_array_data(0),
40    m_size(0),    m_size(0),
# Line 61  DataVector::DataVector(const DataVector: Line 70  DataVector::DataVector(const DataVector:
70  DataVector::~DataVector()  DataVector::~DataVector()
71  {  {
72    // dispose of data array    // dispose of data array
73    arrayManager.delete_array(m_array_data);    if (m_array_data!=0) {
74        arrayManager.delete_array(m_array_data);
75      }
76    
77    // clear data members    // clear data members
78    m_size = -1;    m_size = -1;
# Line 77  DataVector::resize(const DataVector::siz Line 88  DataVector::resize(const DataVector::siz
88  {  {
89    assert(m_size >= 0);    assert(m_size >= 0);
90    
91      if ( newBlockSize == 0) {
92        throw DataException("DataVector: invalid blockSize specified (newBlockSize)");
93      }
94    
95    if ( (newSize % newBlockSize) != 0) {    if ( (newSize % newBlockSize) != 0) {
96      throw DataException("DataVector: invalid blockSize specified");      throw DataException("DataVector: invalid blockSize specified");
97    }    }
98    
99    arrayManager.delete_array(m_array_data);    if (m_array_data!=0) {
100        arrayManager.delete_array(m_array_data);
101      }
102    
103    m_size = newSize;    m_size = newSize;
104    m_dim = newBlockSize;    m_dim = newBlockSize;
# Line 100  DataVector::operator=(const DataVector& Line 117  DataVector::operator=(const DataVector&
117  {  {
118    assert(m_size >= 0);    assert(m_size >= 0);
119    
120    arrayManager.delete_array(m_array_data);    if (m_array_data!=0) {
121        arrayManager.delete_array(m_array_data);
122      }
123    
124    m_size = other.m_size;    m_size = other.m_size;
125    m_dim = other.m_dim;    m_dim = other.m_dim;
# Line 144  DataVector::operator!=(const DataVector& Line 163  DataVector::operator!=(const DataVector&
163    return !(*this==other);    return !(*this==other);
164  }  }
165    
166    
167    void
168    DataVector::copyFromNumArray(const boost::python::numeric::array& value)
169    {
170      using DataTypes::ValueType;
171      if (m_array_data!=0) {
172        arrayManager.delete_array(m_array_data);
173      }
174    
175    
176      m_array_data = arrayManager.new_array(1,value.nelements());
177    
178      int si=0,sj=0,sk=0,sl=0;      // bounds for each dimension of the shape
179      DataTypes::ShapeType tempShape;    
180      for (int i=0; i<value.getrank(); i++) {
181         tempShape.push_back(extract<int>(value.getshape()[i]));
182      }
183    
184      if (value.getrank()==0) {
185         m_array_data[0]=extract<double>(value[value.getshape()]);
186      } else if (value.getrank()==1) {
187         si=tempShape[0];
188         for (ValueType::size_type i=0;i<si;i++) {
189            m_array_data[i]=extract<double>(value[i]);
190         }
191      } else if (value.getrank()==2) {
192        si=tempShape[0];
193        sj=tempShape[1];
194            for (ValueType::size_type i=0;i<si;i++) {
195               for (ValueType::size_type j=0;j<sj;j++) {
196                  m_array_data[DataTypes::getRelIndex(tempShape,i,j)]=extract<double>(value[i][j]);
197               }
198            }
199      } else if (value.getrank()==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[DataTypes::getRelIndex(tempShape,i,j,k)]=extract<double>(value[i][j][k]);
207                  }
208               }
209            }
210      } else if (value.getrank()==4) {
211        si=tempShape[0];
212        sj=tempShape[1];
213        sk=tempShape[2];
214        sl=tempShape[3];
215            for (ValueType::size_type i=0;i<si;i++) {
216               for (ValueType::size_type j=0;j<sj;j++) {
217                  for (ValueType::size_type k=0;k<sk;k++) {
218                     for (ValueType::size_type l=0;l<sl;l++) {
219                        m_array_data[DataTypes::getRelIndex(tempShape,i,j,k,l)]=extract<double>(value[i][j][k][l]);
220                     }
221                  }
222               }
223            }
224       }
225       m_size=value.nelements();    // total amount of elements
226       m_dim=m_size;        // elements per sample
227       m_N=1;           // number of samples
228    }
229    
230    
231    
232  } // end of namespace  } // end of namespace

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

  ViewVC Help
Powered by ViewVC 1.1.26