/[escript]/branches/subworld2/escriptcore/src/DataExpanded.cpp
ViewVC logotype

Annotation of /branches/subworld2/escriptcore/src/DataExpanded.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 117 - (hide annotations)
Fri Apr 1 05:48:57 2005 UTC (14 years, 1 month ago) by jgs
Original Path: trunk/esys2/escript/src/Data/DataExpanded.cpp
File size: 11975 byte(s)
*** empty log message ***

1 jgs 102 // $Id$
2 jgs 82 /*
3     ******************************************************************************
4     * *
5     * COPYRIGHT ACcESS 2004 - All Rights Reserved *
6     * *
7     * This software is the property of ACcESS. No part of this code *
8     * may be copied in any form or by any means without the expressed written *
9     * consent of ACcESS. Copying, use or modification of this software *
10     * by any unauthorised person is illegal unless that person has a software *
11     * license agreement with ACcESS. *
12     * *
13     ******************************************************************************
14     */
15    
16     #include "escript/Data/DataException.h"
17     #include "escript/Data/DataExpanded.h"
18     #include "escript/Data/DataConstant.h"
19     #include "escript/Data/DataTagged.h"
20     #include "escript/Data/DataArrayView.h"
21    
22     #include <boost/python/extract.hpp>
23    
24     #include <iostream>
25    
26     using namespace std;
27     using namespace boost::python;
28     using namespace boost;
29    
30     namespace escript {
31    
32 jgs 102 DataExpanded::DataExpanded(const boost::python::numeric::array& value,
33     const FunctionSpace& what)
34     : DataAbstract(what)
35     {
36     DataArrayView::ShapeType tempShape;
37     //
38 jgs 117 // extract the shape of the python numarray
39     for (int i=0; i<value.getrank(); i++) {
40 jgs 102 tempShape.push_back(extract<int>(value.getshape()[i]));
41 jgs 82 }
42 jgs 117 //
43     // initialise the data array for this object
44 jgs 102 initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());
45     //
46     // copy the given value to every data point
47     copy(value);
48     }
49 jgs 82
50 jgs 102 DataExpanded::DataExpanded(const DataExpanded& other)
51     : DataAbstract(other.getFunctionSpace()),
52     m_data(other.m_data)
53 jgs 117 {
54 jgs 102 //
55     // create the view for the data
56     DataArrayView temp(m_data.getData(),other.getPointDataView().getShape());
57     setPointDataView(temp);
58     }
59 jgs 82
60 jgs 102 DataExpanded::DataExpanded(const DataConstant& other)
61     : DataAbstract(other.getFunctionSpace())
62 jgs 117 {
63     //
64     // initialise the data array for this object
65 jgs 102 initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());
66     //
67 jgs 117 // DataConstant only has one value, copy this to every data point
68 jgs 102 copy(other.getPointDataView());
69     }
70 jgs 82
71 jgs 102 DataExpanded::DataExpanded(const DataTagged& other)
72     : DataAbstract(other.getFunctionSpace())
73 jgs 117 {
74     //
75     // initialise the data for this object
76 jgs 102 initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());
77 jgs 117 //
78     // for each data point in this object, extract and copy the corresponding data
79     // value from the given DataTagged object
80 jgs 102 int i,j;
81     DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
82     DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
83 jgs 82 #pragma omp parallel for private(i,j) schedule(static)
84 jgs 117 for (i=0;i<numRows;i++) {
85     for (j=0;j<numCols;j++) {
86 jgs 102 try {
87 jgs 117 getPointDataView().copy(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j));
88 jgs 82 }
89 jgs 102 catch (std::exception& e) {
90     cout << e.what() << endl;
91     }
92 jgs 82 }
93     }
94 jgs 102 }
95 jgs 82
96 jgs 102 DataExpanded::DataExpanded(const DataExpanded& other,
97     const DataArrayView::RegionType& region)
98     : DataAbstract(other.getFunctionSpace())
99     {
100     //
101     // get the shape of the slice
102     DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
103     //
104     // initialise this Data object to the shape of the slice
105     initialise(shape,other.getNumSamples(),other.getNumDPPSample());
106     //
107 jgs 117 // copy the data
108 jgs 108 DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
109 jgs 102 DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
110     DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
111     int i,j;
112 jgs 82 #pragma omp parallel for private(i,j) schedule(static)
113 jgs 117 for (i=0;i<numRows;i++) {
114     for (j=0;j<numCols;j++) {
115 jgs 102 try {
116 jgs 108 getPointDataView().copySlice(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j),region_loop_range);
117 jgs 82 }
118 jgs 102 catch (std::exception& e) {
119     cout << e.what() << endl;
120     }
121 jgs 82 }
122     }
123 jgs 102 }
124 jgs 82
125 jgs 102 DataExpanded::DataExpanded(const DataArrayView& value,
126     const FunctionSpace& what)
127     : DataAbstract(what)
128     {
129 jgs 117 //
130     // get the shape of the given data value
131 jgs 102 DataArrayView::ShapeType tempShape=value.getShape();
132 jgs 117 //
133     // initialise this Data object to the shape of the given data value
134 jgs 102 initialise(tempShape,what.getNumSamples(),what.getNumDPPSample());
135 jgs 117 //
136     // copy the given value to every data point
137 jgs 102 copy(value);
138     }
139 jgs 82
140 jgs 102 DataExpanded::~DataExpanded()
141     {
142     }
143 jgs 82
144 jgs 102 void
145     DataExpanded::reshapeDataPoint(const DataArrayView::ShapeType& shape)
146     {
147     if (getPointDataView().getRank()!=0) {
148     stringstream temp;
149     temp << "Error - Can only reshape Data with data points of rank 0. "
150     << "This Data has data points with rank: "
151     << getPointDataView().getRank();
152     throw DataException(temp.str());
153 jgs 82 }
154 jgs 117 //
155     // create the new DataBlocks2D data array, and a corresponding DataArrayView
156     DataBlocks2D newData(getNumSamples(),getNumDPPSample(),DataArrayView::noValues(shape));
157 jgs 102 DataArrayView newView(newData.getData(),shape);
158     //
159     // Copy the original data to every value for the new shape
160     int i,j;
161     int nRows=m_data.getNumRows();
162     int nCols=m_data.getNumCols();
163     #pragma omp parallel for private(i,j) schedule(static)
164 jgs 117 for (i=0;i<nRows;i++) {
165     for (j=0;j<nCols;j++) {
166 jgs 102 // NOTE: An exception may be thown from this call if
167     // DOASSERT is on which of course will play
168     // havoc with the omp threads. Run single threaded
169     // if using DOASSERT.
170 jgs 117 newView.copy(newData.index(i,j),m_data(i,j));
171 jgs 82 }
172     }
173 jgs 117 // swap the new data array for the original
174 jgs 102 m_data.Swap(newData);
175 jgs 117 // set the corresponding DataArrayView
176 jgs 102 DataArrayView temp(m_data.getData(),shape);
177     setPointDataView(temp);
178     }
179 jgs 82
180 jgs 102 DataAbstract*
181     DataExpanded::getSlice(const DataArrayView::RegionType& region) const
182     {
183     return new DataExpanded(*this,region);
184     }
185    
186     void
187     DataExpanded::setSlice(const DataAbstract* value,
188     const DataArrayView::RegionType& region)
189     {
190     const DataExpanded* tempDataExp=dynamic_cast<const DataExpanded*>(value);
191     if (tempDataExp==0) {
192     throw DataException("Programming error - casting to DataExpanded.");
193     }
194 jgs 108 //
195 jgs 117 // get shape of slice
196 jgs 108 DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
197     DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
198     //
199 jgs 117 // check shape
200 jgs 102 if (getPointDataView().getRank()!=region.size()) {
201     throw DataException("Error - Invalid slice region.");
202     }
203 jgs 108 if (tempDataExp->getPointDataView().getRank()>0 and !value->getPointDataView().checkShape(shape)) {
204 jgs 102 throw DataException (value->getPointDataView().createShapeErrorMessage(
205 jgs 108 "Error - Couldn't copy slice due to shape mismatch.",shape));
206 jgs 102 }
207     //
208 jgs 117 // copy the data from the slice into this object
209 jgs 102 DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
210     DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
211     int i, j;
212 jgs 82 #pragma omp parallel for private(i,j) schedule(static)
213 jgs 102 for (i=0;i<numRows;i++) {
214     for (j=0;j<numCols;j++) {
215 jgs 108 getPointDataView().copySliceFrom(getPointOffset(i,j),tempDataExp->getPointDataView(),tempDataExp->getPointOffset(i,j),region_loop_range);
216 jgs 82 }
217     }
218 jgs 102 }
219 jgs 82
220 jgs 102 void
221     DataExpanded::copy(const DataArrayView& value)
222     {
223     //
224 jgs 117 // copy a single value to every data point in this object
225 jgs 102 int nRows=m_data.getNumRows();
226     int nCols=m_data.getNumCols();
227 jgs 117 int i,j;
228 jgs 102 #pragma omp parallel for private(i,j) schedule(static)
229 jgs 117 for (i=0;i<nRows;i++) {
230     for (j=0;j<nCols;j++) {
231 jgs 102 // NOTE: An exception may be thown from this call if
232     // DOASSERT is on which of course will play
233     // havoc with the omp threads. Run single threaded
234     // if using DOASSERT.
235     getPointDataView().copy(m_data.index(i,j),value);
236 jgs 82 }
237     }
238 jgs 102 }
239 jgs 82
240 jgs 102 void
241     DataExpanded::copy(const boost::python::numeric::array& value)
242     {
243     //
244 jgs 117 // first convert the numarray into a DataArray object
245 jgs 102 DataArray temp(value);
246     //
247 jgs 117 // check the input shape matches this shape
248 jgs 102 if (!getPointDataView().checkShape(temp.getView().getShape())) {
249     throw DataException(getPointDataView().createShapeErrorMessage(
250     "Error - (DataExpanded) Cannot copy due to shape mismatch.",
251     temp.getView().getShape()));
252 jgs 82 }
253 jgs 102 //
254 jgs 117 // now copy over the data
255 jgs 102 copy(temp.getView());
256     }
257 jgs 82
258 jgs 102 void
259     DataExpanded::initialise(const DataArrayView::ShapeType& shape,
260     int noSamples,
261     int noDataPointsPerSample)
262     {
263     //
264 jgs 117 // resize data array to the required size
265 jgs 102 m_data.resize(noSamples,noDataPointsPerSample,DataArrayView::noValues(shape));
266     //
267 jgs 117 // create the data view of the data array
268 jgs 102 DataArrayView temp(m_data.getData(),shape);
269     setPointDataView(temp);
270     }
271 jgs 82
272 jgs 102 string
273     DataExpanded::toString() const
274     {
275     stringstream temp;
276     //
277     // create a temporary view as the offset will be changed
278     DataArrayView tempView(getPointDataView().getData(),getPointDataView().getShape(),getPointDataView().getOffset());
279 jgs 117 for (int i=0;i<m_data.getNumRows();i++) {
280     for (int j=0;j<m_data.getNumCols();j++) {
281 jgs 102 tempView.setOffset(m_data.index(i,j));
282     stringstream suffix;
283     suffix << "(" << i << "," << j << ")";
284     temp << tempView.toString(suffix.str());
285     if (!(i==(m_data.getNumRows()-1) && j==(m_data.getNumCols()-1))) {
286     temp << endl;
287 jgs 82 }
288     }
289     }
290 jgs 102 return temp.str();
291     }
292 jgs 82
293 jgs 102 DataArrayView::ValueType::size_type
294     DataExpanded::getPointOffset(int sampleNo,
295     int dataPointNo) const
296     {
297     return m_data.index(sampleNo,dataPointNo);
298     }
299 jgs 82
300 jgs 102 DataArrayView
301     DataExpanded::getDataPoint(int sampleNo,
302     int dataPointNo)
303     {
304     DataArrayView temp(m_data.getData(),getPointDataView().getShape(),m_data.index(sampleNo,dataPointNo));
305     return temp;
306     }
307 jgs 82
308 jgs 102 DataArrayView::ValueType::size_type
309     DataExpanded::getLength() const
310     {
311 jgs 117 return m_data.size();
312 jgs 102 }
313 jgs 82
314 jgs 110 void
315     DataExpanded::setRefValue(int ref,
316     const DataArray& value)
317     {
318     //
319 jgs 113 // Get the number of samples and data-points per sample.
320 jgs 110 int numSamples = getNumSamples();
321     int numDPPSample = getNumDPPSample();
322    
323     //
324 jgs 113 // Determine the sample number which corresponds to this reference number.
325 jgs 110 int sampleNo = -1;
326     int tempRef = -1;
327     for (int n=0; n<numSamples; n++) {
328     tempRef = getFunctionSpace().getReferenceNoFromSampleNo(n);
329     if (tempRef == ref) {
330     sampleNo = n;
331     break;
332     }
333     }
334     if (sampleNo == -1) {
335     throw DataException("DataExpanded::setRefValue error: invalid ref number supplied.");
336     }
337    
338 jgs 113 for (int n=0; n<numDPPSample; n++) {
339     //
340     // Get each data-point in the sample in turn.
341     DataArrayView pointView = getDataPoint(sampleNo, n);
342     //
343     // Assign the values in the DataArray to this data-point.
344     pointView.copy(value.getView());
345     }
346 jgs 110 }
347    
348     void
349     DataExpanded::getRefValue(int ref,
350     DataArray& value)
351     {
352     //
353 jgs 113 // Get the number of samples and data-points per sample.
354 jgs 110 int numSamples = getNumSamples();
355     int numDPPSample = getNumDPPSample();
356    
357     //
358 jgs 113 // Determine the sample number which corresponds to this reference number
359 jgs 110 int sampleNo = -1;
360     int tempRef = -1;
361     for (int n=0; n<numSamples; n++) {
362     tempRef = getFunctionSpace().getReferenceNoFromSampleNo(n);
363     if (tempRef == ref) {
364     sampleNo = n;
365     break;
366     }
367     }
368     if (sampleNo == -1) {
369     throw DataException("DataExpanded::getRefValue error: invalid ref number supplied.");
370     }
371    
372 jgs 113 //
373     // Get the first data-point associated with this sample number.
374 jgs 110 DataArrayView pointView = getDataPoint(sampleNo, 0);
375    
376     //
377     // Load the values from this data-point into the DataArray
378     value.getView().copy(pointView);
379     }
380    
381 jgs 82 } // end of namespace

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.26