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

Annotation of /trunk/escript/src/DataConstant.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 775 - (hide annotations)
Mon Jul 10 04:00:08 2006 UTC (13 years, 3 months ago) by ksteube
File size: 8745 byte(s)
Modified the following python methods in escript/py_src/util.py to
call faster C++ methods:
	escript_trace
	escript_transpose
	escript_symmetric
	escript_nonsymmetric

1 jgs 102 //$Id$
2 jgs 82 /*
3 elspeth 615 ************************************************************
4     * Copyright 2006 by ACcESS MNRF *
5     * *
6     * http://www.access.edu.au *
7     * Primary Business: Queensland, Australia *
8     * Licensed under the Open Software License version 3.0 *
9     * http://www.opensource.org/licenses/osl-3.0.php *
10     * *
11     ************************************************************
12 jgs 82 */
13    
14 jgs 474 #include "DataConstant.h"
15     #include "DataException.h"
16 robwdcock 682 #include "esysUtils/EsysAssert.h"
17 jgs 82
18     #include <iostream>
19     #include <boost/python/extract.hpp>
20    
21     using namespace std;
22    
23     namespace escript {
24    
25 jgs 102 DataConstant::DataConstant(const boost::python::numeric::array& value,
26     const FunctionSpace& what)
27     : DataAbstract(what)
28     {
29     DataArray temp(value);
30     //
31     // copy the data in the correct format
32     m_data=temp.getData();
33 jgs 119 //
34     // create the view of the data
35 jgs 102 DataArrayView tempView(m_data,temp.getView().getShape());
36     setPointDataView(tempView);
37     }
38 jgs 82
39 jgs 102 DataConstant::DataConstant(const DataArrayView& value,
40     const FunctionSpace& what)
41     : DataAbstract(what)
42     {
43     //
44     // copy the data in the correct format
45     m_data=value.getData();
46 jgs 119 //
47     // create the view of the data
48 jgs 102 DataArrayView tempView(m_data,value.getShape());
49     setPointDataView(tempView);
50     }
51 jgs 82
52 jgs 102 DataConstant::DataConstant(const DataConstant& other)
53     : DataAbstract(other.getFunctionSpace())
54     {
55     //
56     // copy the data in the correct format
57     m_data=other.m_data;
58 jgs 119 //
59     // create the view of the data
60 jgs 102 DataArrayView tempView(m_data,other.getPointDataView().getShape());
61     setPointDataView(tempView);
62     }
63 jgs 82
64 jgs 102 DataConstant::DataConstant(const DataConstant& other,
65     const DataArrayView::RegionType& region)
66     : DataAbstract(other.getFunctionSpace())
67     {
68     //
69     // get the shape of the slice to copy from
70     DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
71     //
72     // allocate space for this new DataConstant's data
73 jgs 151 int len = DataArrayView::noValues(shape);
74     m_data.resize(len,0.,len);
75 jgs 102 //
76     // create a view of the data with the correct shape
77     DataArrayView tempView(m_data,shape);
78 jgs 108 DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
79 jgs 119 //
80     // load the view with the data from the slice
81 jgs 108 tempView.copySlice(other.getPointDataView(),region_loop_range);
82 jgs 119 setPointDataView(tempView);
83     }
84    
85     DataConstant::DataConstant(const FunctionSpace& what,
86     const DataArrayView::ShapeType &shape,
87     const DataArrayView::ValueType &data)
88     : DataAbstract(what)
89     {
90 jgs 102 //
91 jgs 119 // copy the data in the correct format
92     m_data=data;
93     //
94     // create the view of the data
95     DataArrayView tempView(m_data,shape);
96 jgs 102 setPointDataView(tempView);
97     }
98 jgs 82
99 jgs 102 string
100     DataConstant::toString() const
101     {
102     return getPointDataView().toString("");
103     }
104 jgs 82
105 jgs 102 DataArrayView::ValueType::size_type
106     DataConstant::getPointOffset(int sampleNo,
107     int dataPointNo) const
108     {
109     EsysAssert((validSamplePointNo(dataPointNo) && validSampleNo(sampleNo)),
110     "Invalid index, sampleNo: " << sampleNo << " dataPointNo: " << dataPointNo);
111 jgs 122 //
112     // Whatever the coord's always return the same value as this is constant data.
113 jgs 102 return 0;
114     }
115 jgs 82
116 jgs 102 DataArrayView::ValueType::size_type
117     DataConstant::getLength() const
118     {
119     return m_data.size();
120     }
121 jgs 82
122 jgs 102 DataArrayView
123     DataConstant::getDataPoint(int sampleNo,
124     int dataPointNo)
125     {
126     EsysAssert((validSamplePointNo(dataPointNo) && validSampleNo(sampleNo)),
127     "Invalid index, sampleNo: " << sampleNo << " dataPointNo: " << dataPointNo);
128     //
129     // Whatever the coord's always return the same value as this is constant data.
130     return getPointDataView();
131     }
132 jgs 82
133 jgs 102 DataAbstract*
134     DataConstant::getSlice(const DataArrayView::RegionType& region) const
135     {
136     return new DataConstant(*this,region);
137     }
138 jgs 82
139 jgs 102 void
140     DataConstant::setSlice(const DataAbstract* value,
141     const DataArrayView::RegionType& region)
142     {
143     const DataConstant* tempDataConst=dynamic_cast<const DataConstant*>(value);
144     if (tempDataConst==0) {
145     throw DataException("Programming error - casting to DataConstant.");
146 jgs 82 }
147 jgs 108 //
148     DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
149     DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
150     //
151     // check shape:
152     if (getPointDataView().getRank()!=region.size()) {
153     throw DataException("Error - Invalid slice region.");
154     }
155 woo409 757 if (tempDataConst->getPointDataView().getRank()>0 && !value->getPointDataView().checkShape(shape)) {
156 jgs 108 throw DataException (value->getPointDataView().createShapeErrorMessage(
157     "Error - Couldn't copy slice due to shape mismatch.",shape));
158     }
159     //
160     getPointDataView().copySliceFrom(tempDataConst->getPointDataView(),region_loop_range);
161 jgs 102 }
162 jgs 82
163 jgs 102 void
164     DataConstant::reshapeDataPoint(const DataArrayView::ShapeType& shape)
165     {
166     if (getPointDataView().getRank()!=0) {
167     stringstream temp;
168     temp << "Error - Can only reshape Data with data points of rank 0. "
169     << "This Data has data points with rank: " << getPointDataView().getRank();
170     throw DataException(temp.str());
171 jgs 82 }
172 jgs 151 int len = DataArrayView::noValues(shape);
173     m_data.resize(len,getPointDataView()(),len);
174 jgs 102 DataArrayView newView(m_data,shape);
175     setPointDataView(newView);
176     }
177 jgs 82
178 jgs 123 int
179     DataConstant::archiveData(ofstream& archiveFile,
180     const DataArrayView::ValueType::size_type noValues) const
181     {
182     return(m_data.archiveData(archiveFile, noValues));
183     }
184    
185     int
186     DataConstant::extractData(ifstream& archiveFile,
187     const DataArrayView::ValueType::size_type noValues)
188     {
189     return(m_data.extractData(archiveFile, noValues));
190     }
191    
192 gross 580 void
193 ksteube 775 DataConstant::symmetric(DataAbstract* ev)
194     {
195     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
196     if (temp_ev==0) {
197     throw DataException("Error - DataConstant::symmetric: casting to DataConstant failed (propably a programming error).");
198     }
199     DataArrayView& thisView=getPointDataView();
200     DataArrayView& evView=ev->getPointDataView();
201     DataArrayView::symmetric(thisView,0,evView,0);
202     }
203    
204     void
205     DataConstant::nonsymmetric(DataAbstract* ev)
206     {
207     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
208     if (temp_ev==0) {
209     throw DataException("Error - DataConstant::nonsymmetric: casting to DataConstant failed (propably a programming error).");
210     }
211     DataArrayView& thisView=getPointDataView();
212     DataArrayView& evView=ev->getPointDataView();
213     DataArrayView::nonsymmetric(thisView,0,evView,0);
214     }
215    
216     void
217     DataConstant::matrixtrace(DataAbstract* ev, int axis_offset)
218     {
219     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
220     if (temp_ev==0) {
221     throw DataException("Error - DataConstant::matrixtrace: casting to DataConstant failed (propably a programming error).");
222     }
223     DataArrayView& thisView=getPointDataView();
224     DataArrayView& evView=ev->getPointDataView();
225     DataArrayView::matrixtrace(thisView,0,evView,0,axis_offset);
226     }
227    
228     void
229     DataConstant::transpose(DataAbstract* ev, int axis_offset)
230     {
231     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
232     if (temp_ev==0) {
233     throw DataException("Error - DataConstant::transpose: casting to DataConstant failed (propably a programming error).");
234     }
235     DataArrayView& thisView=getPointDataView();
236     DataArrayView& evView=ev->getPointDataView();
237     DataArrayView::transpose(thisView,0,evView,0,axis_offset);
238     }
239    
240     void
241 gross 580 DataConstant::eigenvalues(DataAbstract* ev)
242     {
243     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
244     if (temp_ev==0) {
245     throw DataException("Error - DataConstant::eigenvalues: casting to DataConstant failed (propably a programming error).");
246     }
247     DataArrayView& thisView=getPointDataView();
248     DataArrayView& evView=ev->getPointDataView();
249     DataArrayView::eigenvalues(thisView,0,evView,0);
250     }
251     void
252     DataConstant::eigenvalues_and_eigenvectors(DataAbstract* ev,DataAbstract* V,const double tol)
253     {
254     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
255     if (temp_ev==0) {
256     throw DataException("Error - DataConstant::eigenvalues_and_eigenvectors: casting to DataConstant failed (propably a programming error).");
257     }
258     DataConstant* temp_V=dynamic_cast<DataConstant*>(V);
259     if (temp_V==0) {
260     throw DataException("Error - DataConstant::eigenvalues_and_eigenvectors: casting to DataConstant failed (propably a programming error).");
261     }
262     DataArrayView thisView=getPointDataView();
263     DataArrayView evView=ev->getPointDataView();
264     DataArrayView VView=V->getPointDataView();
265    
266     DataArrayView::eigenvalues_and_eigenvectors(thisView,0,evView,0,VView,tol);
267     }
268    
269    
270 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