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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

1 // $Id$
2 /*
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 DataExpanded::DataExpanded(const boost::python::numeric::array& value,
33 const FunctionSpace& what)
34 : DataAbstract(what)
35 {
36 DataArrayView::ShapeType tempShape;
37 //
38 // extract the shape of the python numarray
39 for (int i=0; i<value.getrank(); i++) {
40 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());
45 //
46 // copy the given value to every data point
47 copy(value);
48 }
49
50 DataExpanded::DataExpanded(const DataExpanded& other)
51 : DataAbstract(other.getFunctionSpace()),
52 m_data(other.m_data)
53 {
54 //
55 // create the view for the data
56 DataArrayView temp(m_data.getData(),other.getPointDataView().getShape());
57 setPointDataView(temp);
58 }
59
60 DataExpanded::DataExpanded(const DataConstant& other)
61 : DataAbstract(other.getFunctionSpace())
62 {
63 //
64 // initialise the data array for this object
65 initialise(other.getPointDataView().getShape(),other.getNumSamples(),other.getNumDPPSample());
66 //
67 // DataConstant only has one value, copy this to every data point
68 copy(other.getPointDataView());
69 }
70
71 DataExpanded::DataExpanded(const DataTagged& other)
72 : DataAbstract(other.getFunctionSpace())
73 {
74 //
75 // initialise the data for this object
76 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;
81 DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
82 DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
83 #pragma omp parallel for private(i,j) schedule(static)
84 for (i=0;i<numRows;i++) {
85 for (j=0;j<numCols;j++) {
86 try {
87 getPointDataView().copy(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j));
88 }
89 catch (std::exception& e) {
90 cout << e.what() << endl;
91 }
92 }
93 }
94 }
95
96 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 // copy the data
108 DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
109 DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
110 DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
111 int i,j;
112 #pragma omp parallel for private(i,j) schedule(static)
113 for (i=0;i<numRows;i++) {
114 for (j=0;j<numCols;j++) {
115 try {
116 getPointDataView().copySlice(getPointOffset(i,j),other.getPointDataView(),other.getPointOffset(i,j),region_loop_range);
117 }
118 catch (std::exception& e) {
119 cout << e.what() << endl;
120 }
121 }
122 }
123 }
124
125 DataExpanded::DataExpanded(const DataArrayView& value,
126 const FunctionSpace& what)
127 : DataAbstract(what)
128 {
129 //
130 // get the shape of the given data value
131 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());
135 //
136 // copy the given value to every data point
137 copy(value);
138 }
139
140 DataExpanded::~DataExpanded()
141 {
142 }
143
144 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 }
154 //
155 // create the new DataBlocks2D data array, and a corresponding DataArrayView
156 DataBlocks2D newData(getNumSamples(),getNumDPPSample(),DataArrayView::noValues(shape));
157 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 for (i=0;i<nRows;i++) {
165 for (j=0;j<nCols;j++) {
166 // 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 newView.copy(newData.index(i,j),m_data(i,j));
171 }
172 }
173 // swap the new data array for the original
174 m_data.Swap(newData);
175 // set the corresponding DataArrayView
176 DataArrayView temp(m_data.getData(),shape);
177 setPointDataView(temp);
178 }
179
180 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 //
195 // get shape of slice
196 DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
197 DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
198 //
199 // check shape
200 if (getPointDataView().getRank()!=region.size()) {
201 throw DataException("Error - Invalid slice region.");
202 }
203 if (tempDataExp->getPointDataView().getRank()>0 and !value->getPointDataView().checkShape(shape)) {
204 throw DataException (value->getPointDataView().createShapeErrorMessage(
205 "Error - Couldn't copy slice due to shape mismatch.",shape));
206 }
207 //
208 // copy the data from the slice into this object
209 DataArrayView::ValueType::size_type numRows=m_data.getNumRows();
210 DataArrayView::ValueType::size_type numCols=m_data.getNumCols();
211 int i, j;
212 #pragma omp parallel for private(i,j) schedule(static)
213 for (i=0;i<numRows;i++) {
214 for (j=0;j<numCols;j++) {
215 getPointDataView().copySliceFrom(getPointOffset(i,j),tempDataExp->getPointDataView(),tempDataExp->getPointOffset(i,j),region_loop_range);
216 }
217 }
218 }
219
220 void
221 DataExpanded::copy(const DataArrayView& value)
222 {
223 //
224 // copy a single value to every data point in this object
225 int nRows=m_data.getNumRows();
226 int nCols=m_data.getNumCols();
227 int i,j;
228 #pragma omp parallel for private(i,j) schedule(static)
229 for (i=0;i<nRows;i++) {
230 for (j=0;j<nCols;j++) {
231 // 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 }
237 }
238 }
239
240 void
241 DataExpanded::copy(const boost::python::numeric::array& value)
242 {
243 //
244 // first convert the numarray into a DataArray object
245 DataArray temp(value);
246 //
247 // check the input shape matches this shape
248 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 }
253 //
254 // now copy over the data
255 copy(temp.getView());
256 }
257
258 void
259 DataExpanded::initialise(const DataArrayView::ShapeType& shape,
260 int noSamples,
261 int noDataPointsPerSample)
262 {
263 //
264 // resize data array to the required size
265 m_data.resize(noSamples,noDataPointsPerSample,DataArrayView::noValues(shape));
266 //
267 // create the data view of the data array
268 DataArrayView temp(m_data.getData(),shape);
269 setPointDataView(temp);
270 }
271
272 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 for (int i=0;i<m_data.getNumRows();i++) {
280 for (int j=0;j<m_data.getNumCols();j++) {
281 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 }
288 }
289 }
290 return temp.str();
291 }
292
293 DataArrayView::ValueType::size_type
294 DataExpanded::getPointOffset(int sampleNo,
295 int dataPointNo) const
296 {
297 return m_data.index(sampleNo,dataPointNo);
298 }
299
300 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
308 DataArrayView::ValueType::size_type
309 DataExpanded::getLength() const
310 {
311 return m_data.size();
312 }
313
314 void
315 DataExpanded::setRefValue(int ref,
316 const DataArray& value)
317 {
318 //
319 // Get the number of samples and data-points per sample.
320 int numSamples = getNumSamples();
321 int numDPPSample = getNumDPPSample();
322
323 //
324 // Determine the sample number which corresponds to this reference number.
325 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 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 }
347
348 void
349 DataExpanded::getRefValue(int ref,
350 DataArray& value)
351 {
352 //
353 // Get the number of samples and data-points per sample.
354 int numSamples = getNumSamples();
355 int numDPPSample = getNumDPPSample();
356
357 //
358 // Determine the sample number which corresponds to this reference number
359 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 //
373 // Get the first data-point associated with this sample number.
374 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 } // end of namespace

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.26