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

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

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

revision 97 by jgs, Tue Dec 14 05:39:33 2004 UTC revision 123 by jgs, Fri Jul 8 04:08:13 2005 UTC
# Line 35  DataExpanded::DataExpanded(const boost:: Line 35  DataExpanded::DataExpanded(const boost::
35  {  {
36    DataArrayView::ShapeType tempShape;    DataArrayView::ShapeType tempShape;
37    //    //
38    // extract the shape from the python array    // extract the shape of the python numarray
39    for (int i=0; i<value.getrank(); ++i) {    for (int i=0; i<value.getrank(); i++) {
     //cout << extract<int>(value.getshape()[i]) << endl;  
40      tempShape.push_back(extract<int>(value.getshape()[i]));      tempShape.push_back(extract<int>(value.getshape()[i]));
41    }    }
42      //
43      // initialise the data array for this object
44    initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());    initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());
45    //    //
46    // copy the given value to every data point    // copy the given value to every data point
# Line 49  DataExpanded::DataExpanded(const boost:: Line 50  DataExpanded::DataExpanded(const boost::
50  DataExpanded::DataExpanded(const DataExpanded& other)  DataExpanded::DataExpanded(const DataExpanded& other)
51    : DataAbstract(other.getFunctionSpace()),    : DataAbstract(other.getFunctionSpace()),
52    m_data(other.m_data)    m_data(other.m_data)
53  {      {
54    //    //
55    // create the view for the data    // create the view for the data
56    DataArrayView temp(m_data.getData(),other.getPointDataView().getShape());    DataArrayView temp(m_data.getData(),other.getPointDataView().getShape());
# Line 58  DataExpanded::DataExpanded(const DataExp Line 59  DataExpanded::DataExpanded(const DataExp
59    
60  DataExpanded::DataExpanded(const DataConstant& other)  DataExpanded::DataExpanded(const DataConstant& other)
61    : DataAbstract(other.getFunctionSpace())    : DataAbstract(other.getFunctionSpace())
62  {      {
63      //
64      // initialise the data array for this object
65    initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());    initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());
66    //    //
67    // DataConstant only has one value    // DataConstant only has one value, copy this to every data point
68    copy(other.getPointDataView());    copy(other.getPointDataView());
69  }  }
70    
71  DataExpanded::DataExpanded(const DataTagged& other)  DataExpanded::DataExpanded(const DataTagged& other)
72    : DataAbstract(other.getFunctionSpace())    : DataAbstract(other.getFunctionSpace())
73  {      {
74      //
75      // initialise the data array for this object
76    initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());    initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());
77      //
78      // for each data point in this object, extract and copy the corresponding data
79      // value from the given DataTagged object
80    int i,j;    int i,j;
81    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
82    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
83  #pragma omp parallel for private(i,j) schedule(static)    #pragma omp parallel for private(i,j) schedule(static)
84    for (i=0;i<numRows;++i) {    for (i=0;i<numRows;i++) {
85      for (j=0;j<numCols;++j) {      for (j=0;j<numCols;j++) {
86        try {        try {
87          getPointDataView().copy(getPointOffset(i,j), other.getPointDataView(), other.getPointOffset(i,j));          getPointDataView().copy(getPointOffset(i,j),
88                                    other.getPointDataView(),
89                                    other.getPointOffset(i,j));
90        }        }
91        catch (std::exception& e) {        catch (std::exception& e) {
92          cout << e.what() << endl;          cout << e.what() << endl;
# Line 97  DataExpanded::DataExpanded(const DataExp Line 107  DataExpanded::DataExpanded(const DataExp
107    initialise(shape,other.getNumSamples(),other.getNumDPPSample());    initialise(shape,other.getNumSamples(),other.getNumDPPSample());
108    //    //
109    // copy the data    // copy the data
110      DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
111    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
112    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
113    int i,j;    int i,j;
114  #pragma omp parallel for private(i,j) schedule(static)    #pragma omp parallel for private(i,j) schedule(static)
115    for (i=0;i<numRows;++i) {    for (i=0;i<numRows;i++) {
116      for (j=0;j<numCols;++j) {      for (j=0;j<numCols;j++) {
117        try {        try {
118          getPointDataView().copySlice(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j),region);          getPointDataView().copySlice(getPointOffset(i,j),
119                                         other.getPointDataView(),
120                                         other.getPointOffset(i,j),
121                                         region_loop_range);
122        }        }
123        catch (std::exception& e) {        catch (std::exception& e) {
124          cout << e.what() << endl;          cout << e.what() << endl;
# Line 117  DataExpanded::DataExpanded(const DataArr Line 131  DataExpanded::DataExpanded(const DataArr
131                             const FunctionSpace& what)                             const FunctionSpace& what)
132    : DataAbstract(what)    : DataAbstract(what)
133  {  {
134      //
135      // get the shape of the given data value
136    DataArrayView::ShapeType tempShape=value.getShape();    DataArrayView::ShapeType tempShape=value.getShape();
137      //
138      // initialise this Data object to the shape of the given data value
139    initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());    initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());
140      //
141      // copy the given value to every data point
142    copy(value);    copy(value);
143  }  }
144    
145    DataExpanded::DataExpanded(const FunctionSpace& what,
146                               const DataArrayView::ShapeType &shape,
147                               const DataArrayView::ValueType &data)
148      : DataAbstract(what)
149    {
150      //
151      // copy the data in the correct format
152      m_data.getData()=data;
153      //
154      // create the view of the data
155      DataArrayView tempView(m_data.getData(),shape);
156      setPointDataView(tempView);
157    }
158    
159  DataExpanded::~DataExpanded()  DataExpanded::~DataExpanded()
160  {  {
161  }  }
# Line 129  DataExpanded::~DataExpanded() Line 163  DataExpanded::~DataExpanded()
163  void  void
164  DataExpanded::reshapeDataPoint(const DataArrayView::ShapeType& shape)  DataExpanded::reshapeDataPoint(const DataArrayView::ShapeType& shape)
165  {  {
   //  
   // reshape a rank zero data point  
166    if (getPointDataView().getRank()!=0) {    if (getPointDataView().getRank()!=0) {
167      stringstream temp;      stringstream temp;
168      temp << "Error - Can only reshape Data with data points of rank 0. "      temp << "Error - Can only reshape Data with data points of rank 0. "
# Line 138  DataExpanded::reshapeDataPoint(const Dat Line 170  DataExpanded::reshapeDataPoint(const Dat
170           << getPointDataView().getRank();           << getPointDataView().getRank();
171      throw DataException(temp.str());      throw DataException(temp.str());
172    }    }
173    DataBlocks2D newData(getNumSamples(),getNumDPPSample(), DataArrayView::noValues(shape));    //
174      // create the new DataBlocks2D data array, and a corresponding DataArrayView
175      DataBlocks2D newData(getNumSamples(),getNumDPPSample(),DataArrayView::noValues(shape));
176    DataArrayView newView(newData.getData(),shape);    DataArrayView newView(newData.getData(),shape);
177    //    //
178    // Copy the original data to every value for the new shape    // Copy the original data to every value for the new shape
179    int i,j;    int i,j;
180    int nRows=m_data.getNumRows();    int nRows=m_data.getNumRows();
181    int nCols=m_data.getNumCols();    int nCols=m_data.getNumCols();
182  #pragma omp parallel for private(i,j) schedule(static)    #pragma omp parallel for private(i,j) schedule(static)
183    for (i=0;i<nRows;++i) {    for (i=0;i<nRows;i++) {
184      for (j=0;j<nCols;++j) {      for (j=0;j<nCols;j++) {
       //  
       // Copy the data into the specified offset  
185        // NOTE: An exception may be thown from this call if        // NOTE: An exception may be thown from this call if
186        // DOASSERT is on which of course will play        // DOASSERT is on which of course will play
187        // havoc with the omp threads. Run single threaded        // havoc with the omp threads. Run single threaded
188        // if using DOASSERT.        // if using DOASSERT.
189        newView.copy(newData.index(i,j),m_data.getData()[m_data.index(i,j)]);        newView.copy(newData.index(i,j),m_data(i,j));
190      }      }
191    }    }
192      // swap the new data array for the original
193    m_data.Swap(newData);    m_data.Swap(newData);
194      // set the corresponding DataArrayView
195    DataArrayView temp(m_data.getData(),shape);    DataArrayView temp(m_data.getData(),shape);
196    setPointDataView(temp);    setPointDataView(temp);
197  }  }
# Line 176  DataExpanded::setSlice(const DataAbstrac Line 210  DataExpanded::setSlice(const DataAbstrac
210    if (tempDataExp==0) {    if (tempDataExp==0) {
211      throw DataException("Programming error - casting to DataExpanded.");      throw DataException("Programming error - casting to DataExpanded.");
212    }    }
213      //
214      // get shape of slice
215      DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
216      DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
217      //
218      // check shape
219    if (getPointDataView().getRank()!=region.size()) {    if (getPointDataView().getRank()!=region.size()) {
220      throw DataException("Error - Invalid slice region.");      throw DataException("Error - Invalid slice region.");
221    }    }
222    if (!value->getPointDataView().checkShape(DataArrayView::getResultSliceShape(region))) {    if (tempDataExp->getPointDataView().getRank()>0 and !value->getPointDataView().checkShape(shape)) {
223      throw DataException (value->getPointDataView().createShapeErrorMessage(      throw DataException (value->getPointDataView().createShapeErrorMessage(
224          "Error - Couldn't copy slice due to shape mismatch.",DataArrayView::getResultSliceShape(region)));          "Error - Couldn't copy slice due to shape mismatch.",shape));
225    }    }
226    //    //
227    // copy the data    // copy the data from the slice into this object
228    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
229    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
230    int i, j;    int i, j;
231  #pragma omp parallel for private(i,j) schedule(static)    #pragma omp parallel for private(i,j) schedule(static)
232    for (i=0;i<numRows;i++) {    for (i=0;i<numRows;i++) {
233      for (j=0;j<numCols;j++) {      for (j=0;j<numCols;j++) {
234        getPointDataView().copySliceFrom(getPointOffset(i,j),tempDataExp->getPointDataView(),tempDataExp->getPointOffset(i,j),region);        getPointDataView().copySliceFrom(getPointOffset(i,j),
235                                           tempDataExp->getPointDataView(),
236                                           tempDataExp->getPointOffset(i,j),
237                                           region_loop_range);
238      }      }
239    }    }
240  }  }
# Line 200  void Line 243  void
243  DataExpanded::copy(const DataArrayView& value)  DataExpanded::copy(const DataArrayView& value)
244  {  {
245    //    //
246    // Copy a single value to every data point    // copy a single value to every data point in this object
247    int nRows=m_data.getNumRows();    int nRows=m_data.getNumRows();
248    int nCols=m_data.getNumCols();    int nCols=m_data.getNumCols();
249    int i, j;    int i,j;
250  #pragma omp parallel for private(i,j) schedule(static)    #pragma omp parallel for private(i,j) schedule(static)
251    for (i=0;i<nRows;++i) {    for (i=0;i<nRows;i++) {
252      for (j=0;j<nCols;++j) {      for (j=0;j<nCols;j++) {
       //  
       // Copy the data into the specified offset  
253        // NOTE: An exception may be thown from this call if        // NOTE: An exception may be thown from this call if
254        // DOASSERT is on which of course will play        // DOASSERT is on which of course will play
255        // havoc with the omp threads. Run single threaded        // havoc with the omp threads. Run single threaded
# Line 222  void Line 263  void
263  DataExpanded::copy(const boost::python::numeric::array& value)  DataExpanded::copy(const boost::python::numeric::array& value)
264  {  {
265    //    //
266    // first convert the numarray into a DataArrayView format    // first convert the numarray into a DataArray object
267    DataArray temp(value);    DataArray temp(value);
268    //    //
269    // check the input shape matches this shape, this will throw an exception    // check the input shape matches this shape
270    if (!getPointDataView().checkShape(temp.getView().getShape())) {    if (!getPointDataView().checkShape(temp.getView().getShape())) {
271      throw DataException(getPointDataView().createShapeErrorMessage(      throw DataException(getPointDataView().createShapeErrorMessage(
272                          "Error - (DataExpanded) Cannot copy due to shape mismatch.",                          "Error - (DataExpanded) Cannot copy due to shape mismatch.",
273                          temp.getView().getShape()));                          temp.getView().getShape()));
274    }    }
275    //    //
276    // now copy over the entire data structure    // now copy over the data
277    copy(temp.getView());    copy(temp.getView());
278  }  }
279    
# Line 242  DataExpanded::initialise(const DataArray Line 283  DataExpanded::initialise(const DataArray
283                           int noDataPointsPerSample)                           int noDataPointsPerSample)
284  {  {
285    //    //
286    // resize data to the required size    // resize data array to the required size
287    m_data.resize(noSamples,noDataPointsPerSample,DataArrayView::noValues(shape));    m_data.resize(noSamples,noDataPointsPerSample,DataArrayView::noValues(shape));
288    //    //
289    // create a point data viewer of the data    // create the data view of the data array
290    DataArrayView temp(m_data.getData(),shape);    DataArrayView temp(m_data.getData(),shape);
291    setPointDataView(temp);    setPointDataView(temp);
292  }  }
# Line 257  DataExpanded::toString() const Line 298  DataExpanded::toString() const
298    //    //
299    // create a temporary view as the offset will be changed    // create a temporary view as the offset will be changed
300    DataArrayView tempView(getPointDataView().getData(),getPointDataView().getShape(),getPointDataView().getOffset());    DataArrayView tempView(getPointDataView().getData(),getPointDataView().getShape(),getPointDataView().getOffset());
301    for (int i=0;i<m_data.getNumRows();++i) {    for (int i=0;i<m_data.getNumRows();i++) {
302      for (int j=0;j<m_data.getNumCols();++j) {      for (int j=0;j<m_data.getNumCols();j++) {
303        tempView.setOffset(m_data.index(i,j));        tempView.setOffset(m_data.index(i,j));
304        stringstream suffix;        stringstream suffix;
305        suffix << "(" << i << "," << j << ")";        suffix << "(" << i << "," << j << ")";
# Line 289  DataExpanded::getDataPoint(int sampleNo, Line 330  DataExpanded::getDataPoint(int sampleNo,
330  DataArrayView::ValueType::size_type  DataArrayView::ValueType::size_type
331  DataExpanded::getLength() const  DataExpanded::getLength() const
332  {  {
333    return m_data.getData().size();    return m_data.size();
334    }
335    
336    void
337    DataExpanded::setRefValue(int ref,
338                              const DataArray& value)
339    {
340      //
341      // Get the number of samples and data-points per sample.
342      int numSamples = getNumSamples();
343      int numDPPSample = getNumDPPSample();
344    
345      //
346      // Determine the sample number which corresponds to this reference number.
347      int sampleNo = -1;
348      int tempRef = -1;
349      for (int n=0; n<numSamples; n++) {
350        tempRef = getFunctionSpace().getReferenceNoFromSampleNo(n);
351        if (tempRef == ref) {
352          sampleNo = n;
353          break;
354        }
355      }
356      if (sampleNo == -1) {
357        throw DataException("DataExpanded::setRefValue error: invalid ref number supplied.");
358      }
359    
360      for (int n=0; n<numDPPSample; n++) {
361        //
362        // Get each data-point in the sample in turn.
363        DataArrayView pointView = getDataPoint(sampleNo, n);
364        //
365        // Assign the values in the DataArray to this data-point.
366        pointView.copy(value.getView());
367      }
368    }
369    
370    void
371    DataExpanded::getRefValue(int ref,
372                              DataArray& value)
373    {
374      //
375      // Get the number of samples and data-points per sample.
376      int numSamples = getNumSamples();
377      int numDPPSample = getNumDPPSample();
378    
379      //
380      // Determine the sample number which corresponds to this reference number
381      int sampleNo = -1;
382      int tempRef = -1;
383      for (int n=0; n<numSamples; n++) {
384        tempRef = getFunctionSpace().getReferenceNoFromSampleNo(n);
385        if (tempRef == ref) {
386          sampleNo = n;
387          break;
388        }
389      }
390      if (sampleNo == -1) {
391        throw DataException("DataExpanded::getRefValue error: invalid ref number supplied.");
392      }
393    
394      //
395      // Get the first data-point associated with this sample number.
396      DataArrayView pointView = getDataPoint(sampleNo, 0);
397    
398      //
399      // Load the values from this data-point into the DataArray
400      value.getView().copy(pointView);
401    }
402    
403    int
404    DataExpanded::archiveData(ofstream& archiveFile,
405                              const DataArrayView::ValueType::size_type noValues) const
406    {
407      return(m_data.archiveData(archiveFile, noValues));
408    }
409    
410    int
411    DataExpanded::extractData(ifstream& archiveFile,
412                              const DataArrayView::ValueType::size_type noValues)
413    {
414      return(m_data.extractData(archiveFile, noValues));
415  }  }
416    
417  }  // end of namespace  }  // end of namespace

Legend:
Removed from v.97  
changed lines
  Added in v.123

  ViewVC Help
Powered by ViewVC 1.1.26