/[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 102 by jgs, Wed Dec 15 07:08:39 2004 UTC revision 119 by jgs, Tue Apr 12 04:45:05 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),other.getPointDataView(),other.getPointOffset(i,j));
88        }        }
89        catch (std::exception& e) {        catch (std::exception& e) {
90          cout << e.what() << endl;          cout << e.what() << endl;
# Line 97  DataExpanded::DataExpanded(const DataExp Line 105  DataExpanded::DataExpanded(const DataExp
105    initialise(shape,other.getNumSamples(),other.getNumDPPSample());    initialise(shape,other.getNumSamples(),other.getNumDPPSample());
106    //    //
107    // copy the data    // copy the data
108      DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
109    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
110    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
111    int i,j;    int i,j;
112  #pragma omp parallel for private(i,j) schedule(static)  #pragma omp parallel for private(i,j) schedule(static)
113    for (i=0;i<numRows;++i) {    for (i=0;i<numRows;i++) {
114      for (j=0;j<numCols;++j) {      for (j=0;j<numCols;j++) {
115        try {        try {
116          getPointDataView().copySlice(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j),region);          getPointDataView().copySlice(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j),region_loop_range);
117        }        }
118        catch (std::exception& e) {        catch (std::exception& e) {
119          cout << e.what() << endl;          cout << e.what() << endl;
# Line 117  DataExpanded::DataExpanded(const DataArr Line 126  DataExpanded::DataExpanded(const DataArr
126                             const FunctionSpace& what)                             const FunctionSpace& what)
127    : DataAbstract(what)    : DataAbstract(what)
128  {  {
129      //
130      // get the shape of the given data value
131    DataArrayView::ShapeType tempShape=value.getShape();    DataArrayView::ShapeType tempShape=value.getShape();
132      //
133      // initialise this Data object to the shape of the given data value
134    initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());    initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());
135      //
136      // copy the given value to every data point
137    copy(value);    copy(value);
138  }  }
139    
140    DataExpanded::DataExpanded(const FunctionSpace& what,
141                               const DataArrayView::ShapeType &shape,
142                               const DataArrayView::ValueType &data)
143      : DataAbstract(what)
144    {
145      //
146      // copy the data in the correct format
147      m_data.getData()=data;
148      //
149      // create the view of the data
150      DataArrayView tempView(m_data.getData(),shape);
151      setPointDataView(tempView);
152    }
153    
154  DataExpanded::~DataExpanded()  DataExpanded::~DataExpanded()
155  {  {
156  }  }
# Line 129  DataExpanded::~DataExpanded() Line 158  DataExpanded::~DataExpanded()
158  void  void
159  DataExpanded::reshapeDataPoint(const DataArrayView::ShapeType& shape)  DataExpanded::reshapeDataPoint(const DataArrayView::ShapeType& shape)
160  {  {
   //  
   // reshape a rank zero data point  
161    if (getPointDataView().getRank()!=0) {    if (getPointDataView().getRank()!=0) {
162      stringstream temp;      stringstream temp;
163      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 165  DataExpanded::reshapeDataPoint(const Dat
165           << getPointDataView().getRank();           << getPointDataView().getRank();
166      throw DataException(temp.str());      throw DataException(temp.str());
167    }    }
168    DataBlocks2D newData(getNumSamples(),getNumDPPSample(), DataArrayView::noValues(shape));    //
169      // create the new DataBlocks2D data array, and a corresponding DataArrayView
170      DataBlocks2D newData(getNumSamples(),getNumDPPSample(),DataArrayView::noValues(shape));
171    DataArrayView newView(newData.getData(),shape);    DataArrayView newView(newData.getData(),shape);
172    //    //
173    // Copy the original data to every value for the new shape    // Copy the original data to every value for the new shape
# Line 146  DataExpanded::reshapeDataPoint(const Dat Line 175  DataExpanded::reshapeDataPoint(const Dat
175    int nRows=m_data.getNumRows();    int nRows=m_data.getNumRows();
176    int nCols=m_data.getNumCols();    int nCols=m_data.getNumCols();
177  #pragma omp parallel for private(i,j) schedule(static)  #pragma omp parallel for private(i,j) schedule(static)
178    for (i=0;i<nRows;++i) {    for (i=0;i<nRows;i++) {
179      for (j=0;j<nCols;++j) {      for (j=0;j<nCols;j++) {
       //  
       // Copy the data into the specified offset  
180        // NOTE: An exception may be thown from this call if        // NOTE: An exception may be thown from this call if
181        // DOASSERT is on which of course will play        // DOASSERT is on which of course will play
182        // havoc with the omp threads. Run single threaded        // havoc with the omp threads. Run single threaded
183        // if using DOASSERT.        // if using DOASSERT.
184        newView.copy(newData.index(i,j),m_data.getData()[m_data.index(i,j)]);        newView.copy(newData.index(i,j),m_data(i,j));
185      }      }
186    }    }
187      // swap the new data array for the original
188    m_data.Swap(newData);    m_data.Swap(newData);
189      // set the corresponding DataArrayView
190    DataArrayView temp(m_data.getData(),shape);    DataArrayView temp(m_data.getData(),shape);
191    setPointDataView(temp);    setPointDataView(temp);
192  }  }
# Line 176  DataExpanded::setSlice(const DataAbstrac Line 205  DataExpanded::setSlice(const DataAbstrac
205    if (tempDataExp==0) {    if (tempDataExp==0) {
206      throw DataException("Programming error - casting to DataExpanded.");      throw DataException("Programming error - casting to DataExpanded.");
207    }    }
208      //
209      // get shape of slice
210      DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
211      DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
212      //
213      // check shape
214    if (getPointDataView().getRank()!=region.size()) {    if (getPointDataView().getRank()!=region.size()) {
215      throw DataException("Error - Invalid slice region.");      throw DataException("Error - Invalid slice region.");
216    }    }
217    if (!value->getPointDataView().checkShape(DataArrayView::getResultSliceShape(region))) {    if (tempDataExp->getPointDataView().getRank()>0 and !value->getPointDataView().checkShape(shape)) {
218      throw DataException (value->getPointDataView().createShapeErrorMessage(      throw DataException (value->getPointDataView().createShapeErrorMessage(
219          "Error - Couldn't copy slice due to shape mismatch.",DataArrayView::getResultSliceShape(region)));          "Error - Couldn't copy slice due to shape mismatch.",shape));
220    }    }
221    //    //
222    // copy the data    // copy the data from the slice into this object
223    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();    DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
224    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();    DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
225    int i, j;    int i, j;
226  #pragma omp parallel for private(i,j) schedule(static)  #pragma omp parallel for private(i,j) schedule(static)
227    for (i=0;i<numRows;i++) {    for (i=0;i<numRows;i++) {
228      for (j=0;j<numCols;j++) {      for (j=0;j<numCols;j++) {
229        getPointDataView().copySliceFrom(getPointOffset(i,j),tempDataExp->getPointDataView(),tempDataExp->getPointOffset(i,j),region);        getPointDataView().copySliceFrom(getPointOffset(i,j),tempDataExp->getPointDataView(),tempDataExp->getPointOffset(i,j),region_loop_range);
230      }      }
231    }    }
232  }  }
# Line 200  void Line 235  void
235  DataExpanded::copy(const DataArrayView& value)  DataExpanded::copy(const DataArrayView& value)
236  {  {
237    //    //
238    // Copy a single value to every data point    // copy a single value to every data point in this object
239    int nRows=m_data.getNumRows();    int nRows=m_data.getNumRows();
240    int nCols=m_data.getNumCols();    int nCols=m_data.getNumCols();
241    int i, j;    int i,j;
242  #pragma omp parallel for private(i,j) schedule(static)  #pragma omp parallel for private(i,j) schedule(static)
243    for (i=0;i<nRows;++i) {    for (i=0;i<nRows;i++) {
244      for (j=0;j<nCols;++j) {      for (j=0;j<nCols;j++) {
       //  
       // Copy the data into the specified offset  
245        // NOTE: An exception may be thown from this call if        // NOTE: An exception may be thown from this call if
246        // DOASSERT is on which of course will play        // DOASSERT is on which of course will play
247        // havoc with the omp threads. Run single threaded        // havoc with the omp threads. Run single threaded
# Line 222  void Line 255  void
255  DataExpanded::copy(const boost::python::numeric::array& value)  DataExpanded::copy(const boost::python::numeric::array& value)
256  {  {
257    //    //
258    // first convert the numarray into a DataArrayView format    // first convert the numarray into a DataArray object
259    DataArray temp(value);    DataArray temp(value);
260    //    //
261    // check the input shape matches this shape, this will throw an exception    // check the input shape matches this shape
262    if (!getPointDataView().checkShape(temp.getView().getShape())) {    if (!getPointDataView().checkShape(temp.getView().getShape())) {
263      throw DataException(getPointDataView().createShapeErrorMessage(      throw DataException(getPointDataView().createShapeErrorMessage(
264                          "Error - (DataExpanded) Cannot copy due to shape mismatch.",                          "Error - (DataExpanded) Cannot copy due to shape mismatch.",
265                          temp.getView().getShape()));                          temp.getView().getShape()));
266    }    }
267    //    //
268    // now copy over the entire data structure    // now copy over the data
269    copy(temp.getView());    copy(temp.getView());
270  }  }
271    
# Line 242  DataExpanded::initialise(const DataArray Line 275  DataExpanded::initialise(const DataArray
275                           int noDataPointsPerSample)                           int noDataPointsPerSample)
276  {  {
277    //    //
278    // resize data to the required size    // resize data array to the required size
279    m_data.resize(noSamples,noDataPointsPerSample,DataArrayView::noValues(shape));    m_data.resize(noSamples,noDataPointsPerSample,DataArrayView::noValues(shape));
280    //    //
281    // create a point data viewer of the data    // create the data view of the data array
282    DataArrayView temp(m_data.getData(),shape);    DataArrayView temp(m_data.getData(),shape);
283    setPointDataView(temp);    setPointDataView(temp);
284  }  }
# Line 257  DataExpanded::toString() const Line 290  DataExpanded::toString() const
290    //    //
291    // create a temporary view as the offset will be changed    // create a temporary view as the offset will be changed
292    DataArrayView tempView(getPointDataView().getData(),getPointDataView().getShape(),getPointDataView().getOffset());    DataArrayView tempView(getPointDataView().getData(),getPointDataView().getShape(),getPointDataView().getOffset());
293    for (int i=0;i<m_data.getNumRows();++i) {    for (int i=0;i<m_data.getNumRows();i++) {
294      for (int j=0;j<m_data.getNumCols();++j) {      for (int j=0;j<m_data.getNumCols();j++) {
295        tempView.setOffset(m_data.index(i,j));        tempView.setOffset(m_data.index(i,j));
296        stringstream suffix;        stringstream suffix;
297        suffix << "(" << i << "," << j << ")";        suffix << "(" << i << "," << j << ")";
# Line 289  DataExpanded::getDataPoint(int sampleNo, Line 322  DataExpanded::getDataPoint(int sampleNo,
322  DataArrayView::ValueType::size_type  DataArrayView::ValueType::size_type
323  DataExpanded::getLength() const  DataExpanded::getLength() const
324  {  {
325    return m_data.getData().size();    return m_data.size();
326    }
327    
328    void
329    DataExpanded::setRefValue(int ref,
330                              const DataArray& value)
331    {
332      //
333      // Get the number of samples and data-points per sample.
334      int numSamples = getNumSamples();
335      int numDPPSample = getNumDPPSample();
336    
337      //
338      // Determine the sample number which corresponds to this reference number.
339      int sampleNo = -1;
340      int tempRef = -1;
341      for (int n=0; n<numSamples; n++) {
342        tempRef = getFunctionSpace().getReferenceNoFromSampleNo(n);
343        if (tempRef == ref) {
344          sampleNo = n;
345          break;
346        }
347      }
348      if (sampleNo == -1) {
349        throw DataException("DataExpanded::setRefValue error: invalid ref number supplied.");
350      }
351    
352      for (int n=0; n<numDPPSample; n++) {
353        //
354        // Get each data-point in the sample in turn.
355        DataArrayView pointView = getDataPoint(sampleNo, n);
356        //
357        // Assign the values in the DataArray to this data-point.
358        pointView.copy(value.getView());
359      }
360    }
361    
362    void
363    DataExpanded::getRefValue(int ref,
364                              DataArray& value)
365    {
366      //
367      // Get the number of samples and data-points per sample.
368      int numSamples = getNumSamples();
369      int numDPPSample = getNumDPPSample();
370    
371      //
372      // Determine the sample number which corresponds to this reference number
373      int sampleNo = -1;
374      int tempRef = -1;
375      for (int n=0; n<numSamples; n++) {
376        tempRef = getFunctionSpace().getReferenceNoFromSampleNo(n);
377        if (tempRef == ref) {
378          sampleNo = n;
379          break;
380        }
381      }
382      if (sampleNo == -1) {
383        throw DataException("DataExpanded::getRefValue error: invalid ref number supplied.");
384      }
385    
386      //
387      // Get the first data-point associated with this sample number.
388      DataArrayView pointView = getDataPoint(sampleNo, 0);
389    
390      //
391      // Load the values from this data-point into the DataArray
392      value.getView().copy(pointView);
393  }  }
394    
395  }  // end of namespace  }  // end of namespace

Legend:
Removed from v.102  
changed lines
  Added in v.119

  ViewVC Help
Powered by ViewVC 1.1.26