/[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 121 by jgs, Fri May 6 04:26:16 2005 UTC trunk/escript/src/DataVector.cpp revision 1811 by ksteube, Thu Sep 25 23:11:13 2008 UTC
# Line 1  Line 1 
1  /*  
2   ******************************************************************************  /*******************************************************
3   *                                                                            *  *
4   *       COPYRIGHT  ACcESS 2004 -  All Rights Reserved                        *  * Copyright (c) 2003-2008 by University of Queensland
5   *                                                                            *  * Earth Systems Science Computational Center (ESSCC)
6   * This software is the property of ACcESS. No part of this code              *  * http://www.uq.edu.au/esscc
7   * may be copied in any form or by any means without the expressed written    *  *
8   * consent of ACcESS.  Copying, use or modification of this software          *  * Primary Business: Queensland, Australia
9   * by any unauthorised person is illegal unless that person has a software    *  * Licensed under the Open Software License version 3.0
10   * license agreement with ACcESS.                                             *  * http://www.opensource.org/licenses/osl-3.0.php
11   *                                                                            *  *
12   ******************************************************************************  *******************************************************/
13  */  
14    
15  #include <iostream>  #include "DataVector.h"
16    
17  #include "escript/Data/DataVector.h"  #include "Taipan.h"
18  #include "escript/Data/Taipan.h"  #include "DataException.h"
19  #include "escript/Data/DataException.h"  #include <boost/python/extract.hpp>
20    #include "DataTypes.h"
21    
22    #include <cassert>
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 40  DataVector::DataVector(const DataVector& Line 50  DataVector::DataVector(const DataVector&
50    m_N(other.m_N)    m_N(other.m_N)
51  {  {
52    m_array_data = arrayManager.new_array(m_dim,m_N);    m_array_data = arrayManager.new_array(m_dim,m_N);
53    for (int i=0; i<m_size; i++) {    int i;
54      #pragma omp parallel for private(i) schedule(static)
55      for (i=0; i<m_size; i++) {
56      m_array_data[i] = other.m_array_data[i];      m_array_data[i] = other.m_array_data[i];
57    }    }
58  }  }
# Line 58  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 74  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;
105    m_N = newSize / newBlockSize;    m_N = newSize / newBlockSize;
106    m_array_data = arrayManager.new_array(m_dim,m_N);    m_array_data = arrayManager.new_array(m_dim,m_N);
107    
108    for (int i=0; i<m_size; i++) {    int i;
109      m_array_data[i]=newValue;    #pragma omp parallel for private(i) schedule(static)
110      for (i=0; i<m_size; i++) {
111        m_array_data[i] = newValue;
112    }    }
113  }  }
114    
# Line 95  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;
126    m_N = other.m_N;    m_N = other.m_N;
127    
128    m_array_data = arrayManager.new_array(m_dim,m_N);    m_array_data = arrayManager.new_array(m_dim,m_N);
129    for (int i=0; i<m_size; i++) {    int i;
130      #pragma omp parallel for private(i) schedule(static)
131      for (i=0; i<m_size; i++) {
132      m_array_data[i] = other.m_array_data[i];      m_array_data[i] = other.m_array_data[i];
133    }    }
134    
# Line 137  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.121  
changed lines
  Added in v.1811

  ViewVC Help
Powered by ViewVC 1.1.26