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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1141 - (hide annotations)
Tue May 15 04:24:51 2007 UTC (12 years, 5 months ago) by gross
File size: 11613 byte(s)
Some changes to make things run on windows. There is still a problem with netcdf an long file names on windows but there is the suspicion that this is a bigger problem related to boost (compiler options). In fact runs with large numbers of iteration/time steps tend to create seg faults. 
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 gross 1023 #ifdef USE_NETCDF
21 gross 1131 #include "netcdfcpp.h"
22 gross 1023 #endif
23 jgs 82
24     using namespace std;
25    
26     namespace escript {
27    
28 jgs 102 DataConstant::DataConstant(const boost::python::numeric::array& value,
29     const FunctionSpace& what)
30     : DataAbstract(what)
31     {
32     DataArray temp(value);
33     //
34     // copy the data in the correct format
35     m_data=temp.getData();
36 jgs 119 //
37     // create the view of the data
38 jgs 102 DataArrayView tempView(m_data,temp.getView().getShape());
39     setPointDataView(tempView);
40     }
41 jgs 82
42 jgs 102 DataConstant::DataConstant(const DataArrayView& value,
43     const FunctionSpace& what)
44     : DataAbstract(what)
45     {
46     //
47     // copy the data in the correct format
48     m_data=value.getData();
49 jgs 119 //
50     // create the view of the data
51 jgs 102 DataArrayView tempView(m_data,value.getShape());
52     setPointDataView(tempView);
53     }
54 jgs 82
55 jgs 102 DataConstant::DataConstant(const DataConstant& other)
56     : DataAbstract(other.getFunctionSpace())
57 gross 1141 { //
58 jgs 102 // copy the data in the correct format
59     m_data=other.m_data;
60 jgs 119 //
61     // create the view of the data
62 jgs 102 DataArrayView tempView(m_data,other.getPointDataView().getShape());
63     setPointDataView(tempView);
64     }
65 jgs 82
66 jgs 102 DataConstant::DataConstant(const DataConstant& other,
67     const DataArrayView::RegionType& region)
68     : DataAbstract(other.getFunctionSpace())
69     {
70     //
71     // get the shape of the slice to copy from
72     DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
73     //
74     // allocate space for this new DataConstant's data
75 jgs 151 int len = DataArrayView::noValues(shape);
76     m_data.resize(len,0.,len);
77 jgs 102 //
78     // create a view of the data with the correct shape
79     DataArrayView tempView(m_data,shape);
80 jgs 108 DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
81 jgs 119 //
82     // load the view with the data from the slice
83 jgs 108 tempView.copySlice(other.getPointDataView(),region_loop_range);
84 jgs 119 setPointDataView(tempView);
85     }
86    
87     DataConstant::DataConstant(const FunctionSpace& what,
88     const DataArrayView::ShapeType &shape,
89     const DataArrayView::ValueType &data)
90     : DataAbstract(what)
91     {
92 jgs 102 //
93 jgs 119 // copy the data in the correct format
94     m_data=data;
95     //
96     // create the view of the data
97     DataArrayView tempView(m_data,shape);
98 jgs 102 setPointDataView(tempView);
99     }
100 jgs 82
101 jgs 102 string
102     DataConstant::toString() const
103     {
104     return getPointDataView().toString("");
105     }
106 jgs 82
107 jgs 102 DataArrayView::ValueType::size_type
108     DataConstant::getPointOffset(int sampleNo,
109     int dataPointNo) const
110     {
111     EsysAssert((validSamplePointNo(dataPointNo) && validSampleNo(sampleNo)),
112     "Invalid index, sampleNo: " << sampleNo << " dataPointNo: " << dataPointNo);
113 jgs 122 //
114     // Whatever the coord's always return the same value as this is constant data.
115 jgs 102 return 0;
116     }
117 jgs 82
118 jgs 102 DataArrayView::ValueType::size_type
119     DataConstant::getLength() const
120     {
121     return m_data.size();
122     }
123 jgs 82
124 jgs 102 DataArrayView
125     DataConstant::getDataPoint(int sampleNo,
126     int dataPointNo)
127     {
128     EsysAssert((validSamplePointNo(dataPointNo) && validSampleNo(sampleNo)),
129     "Invalid index, sampleNo: " << sampleNo << " dataPointNo: " << dataPointNo);
130     //
131     // Whatever the coord's always return the same value as this is constant data.
132     return getPointDataView();
133     }
134 jgs 82
135 jgs 102 DataAbstract*
136     DataConstant::getSlice(const DataArrayView::RegionType& region) const
137     {
138     return new DataConstant(*this,region);
139     }
140 jgs 82
141 jgs 102 void
142     DataConstant::setSlice(const DataAbstract* value,
143     const DataArrayView::RegionType& region)
144     {
145     const DataConstant* tempDataConst=dynamic_cast<const DataConstant*>(value);
146     if (tempDataConst==0) {
147     throw DataException("Programming error - casting to DataConstant.");
148 jgs 82 }
149 jgs 108 //
150     DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region));
151     DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region);
152     //
153     // check shape:
154     if (getPointDataView().getRank()!=region.size()) {
155     throw DataException("Error - Invalid slice region.");
156     }
157 woo409 757 if (tempDataConst->getPointDataView().getRank()>0 && !value->getPointDataView().checkShape(shape)) {
158 jgs 108 throw DataException (value->getPointDataView().createShapeErrorMessage(
159     "Error - Couldn't copy slice due to shape mismatch.",shape));
160     }
161     //
162     getPointDataView().copySliceFrom(tempDataConst->getPointDataView(),region_loop_range);
163 jgs 102 }
164 jgs 82
165 jgs 123 int
166     DataConstant::archiveData(ofstream& archiveFile,
167     const DataArrayView::ValueType::size_type noValues) const
168     {
169     return(m_data.archiveData(archiveFile, noValues));
170     }
171    
172     int
173     DataConstant::extractData(ifstream& archiveFile,
174     const DataArrayView::ValueType::size_type noValues)
175     {
176     return(m_data.extractData(archiveFile, noValues));
177     }
178    
179 gross 580 void
180 ksteube 775 DataConstant::symmetric(DataAbstract* ev)
181     {
182     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
183     if (temp_ev==0) {
184     throw DataException("Error - DataConstant::symmetric: casting to DataConstant failed (propably a programming error).");
185     }
186     DataArrayView& thisView=getPointDataView();
187     DataArrayView& evView=ev->getPointDataView();
188     DataArrayView::symmetric(thisView,0,evView,0);
189     }
190    
191     void
192     DataConstant::nonsymmetric(DataAbstract* ev)
193     {
194     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
195     if (temp_ev==0) {
196     throw DataException("Error - DataConstant::nonsymmetric: casting to DataConstant failed (propably a programming error).");
197     }
198     DataArrayView& thisView=getPointDataView();
199     DataArrayView& evView=ev->getPointDataView();
200     DataArrayView::nonsymmetric(thisView,0,evView,0);
201     }
202    
203     void
204 gross 800 DataConstant::trace(DataAbstract* ev, int axis_offset)
205 ksteube 775 {
206     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
207     if (temp_ev==0) {
208 gross 800 throw DataException("Error - DataConstant::trace: casting to DataConstant failed (propably a programming error).");
209 ksteube 775 }
210     DataArrayView& thisView=getPointDataView();
211     DataArrayView& evView=ev->getPointDataView();
212 gross 800 DataArrayView::trace(thisView,0,evView,0,axis_offset);
213 ksteube 775 }
214    
215     void
216 gross 804 DataConstant::swapaxes(DataAbstract* ev, int axis0, int axis1)
217 gross 800 {
218     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
219     if (temp_ev==0) {
220 gross 804 throw DataException("Error - DataConstant::swapaxes: casting to DataConstant failed (propably a programming error).");
221 gross 800 }
222     DataArrayView& thisView=getPointDataView();
223     DataArrayView& evView=ev->getPointDataView();
224 gross 804 DataArrayView::swapaxes(thisView,0,evView,0,axis0,axis1);
225 gross 800 }
226    
227     void
228 ksteube 775 DataConstant::transpose(DataAbstract* ev, int axis_offset)
229     {
230     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
231     if (temp_ev==0) {
232     throw DataException("Error - DataConstant::transpose: casting to DataConstant failed (propably a programming error).");
233     }
234     DataArrayView& thisView=getPointDataView();
235     DataArrayView& evView=ev->getPointDataView();
236     DataArrayView::transpose(thisView,0,evView,0,axis_offset);
237     }
238    
239     void
240 gross 580 DataConstant::eigenvalues(DataAbstract* ev)
241     {
242     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
243     if (temp_ev==0) {
244     throw DataException("Error - DataConstant::eigenvalues: casting to DataConstant failed (propably a programming error).");
245     }
246     DataArrayView& thisView=getPointDataView();
247     DataArrayView& evView=ev->getPointDataView();
248     DataArrayView::eigenvalues(thisView,0,evView,0);
249     }
250     void
251     DataConstant::eigenvalues_and_eigenvectors(DataAbstract* ev,DataAbstract* V,const double tol)
252     {
253     DataConstant* temp_ev=dynamic_cast<DataConstant*>(ev);
254     if (temp_ev==0) {
255     throw DataException("Error - DataConstant::eigenvalues_and_eigenvectors: casting to DataConstant failed (propably a programming error).");
256     }
257     DataConstant* temp_V=dynamic_cast<DataConstant*>(V);
258     if (temp_V==0) {
259     throw DataException("Error - DataConstant::eigenvalues_and_eigenvectors: casting to DataConstant failed (propably a programming error).");
260     }
261     DataArrayView thisView=getPointDataView();
262     DataArrayView evView=ev->getPointDataView();
263     DataArrayView VView=V->getPointDataView();
264    
265 gross 1141 DataArrayView::eigenvalues_and_eigenvectors(thisView,0,evView,0,VView,0,tol);
266 gross 580 }
267    
268 gross 950 void
269 gross 1118 DataConstant::setToZero()
270     {
271     DataArrayView::ValueType::size_type n=m_data.size();
272     for (int i=0; i<n ;++i) m_data[i]=0.;
273     }
274    
275     void
276 gross 950 DataConstant::dump(const std::string fileName) const
277     {
278     #ifdef PASO_MPI
279     throw DataException("Error - DataConstant:: dump is not implemented for MPI yet.")
280     #endif
281 gross 1141 #ifdef USE_NETCD
282 gross 950 const NcDim* ncdims[DataArrayView::maxRank];
283     NcVar* var;
284     int rank = getPointDataView().getRank();
285     int type= getFunctionSpace().getTypeCode();
286     int ndims =0;
287     long dims[DataArrayView::maxRank];
288 gross 1141 const double* d_ptr=&(m_data[0]);
289 gross 950 DataArrayView::ShapeType shape = getPointDataView().getShape();
290    
291     // netCDF error handler
292     NcError err(NcError::verbose_nonfatal);
293     // Create the file.
294     NcFile dataFile(fileName.c_str(), NcFile::Replace);
295     // check if writing was successful
296     if (!dataFile.is_valid())
297     throw DataException("Error - DataConstant:: opening of netCDF file for output failed.");
298 gross 1141 if (!dataFile.add_att("type_id",0) )
299 gross 950 throw DataException("Error - DataConstant:: appending data type to netCDF file failed.");
300     if (!dataFile.add_att("rank",rank) )
301     throw DataException("Error - DataConstant:: appending rank attribute to netCDF file failed.");
302     if (!dataFile.add_att("function_space_type",type))
303     throw DataException("Error - DataConstant:: appending function space attribute to netCDF file failed.");
304 gross 580
305 gross 950 if (rank == 0) {
306     if( ! (ncdims[0] = dataFile.add_dim("l", 1)) )
307     throw DataException("Error - DataConstant:: appending ncdimsion 0 to netCDF file failed.");
308     dims[0]=1,
309     ndims=1;
310     } else {
311     ndims=rank;
312     dims[0]=shape[0];
313     if (! (ncdims[0] = dataFile.add_dim("d0",shape[0])) )
314     throw DataException("Error - DataConstant:: appending ncdimsion 0 to netCDF file failed.");
315     if ( rank >1 ) {
316     dims[1]=shape[1];
317     if (! (ncdims[1] = dataFile.add_dim("d1",shape[1])) )
318     throw DataException("Error - DataConstant:: appending ncdimsion 1 to netCDF file failed.");
319     }
320     if ( rank >2 ) {
321     dims[2]=shape[2];
322     if (! (ncdims[2] = dataFile.add_dim("d2", shape[2])) )
323     throw DataException("Error - DataConstant:: appending ncdimsion 2 to netCDF file failed.");
324     }
325     if ( rank >3 ) {
326     dims[3]=shape[3];
327     if (! (ncdims[3] = dataFile.add_dim("d3", shape[3])) )
328     throw DataException("Error - DataConstant:: appending ncdimsion 3 to netCDF file failed.");
329     }
330     }
331 gross 1141
332 gross 950 if (! ( var = dataFile.add_var("data", ncDouble, ndims, ncdims)) )
333     throw DataException("Error - DataConstant:: appending variable to netCDF file failed.");
334 gross 1141 if (! (var->put(d_ptr,dims)) )
335     throw DataException("Error - DataConstant:: copy data to netCDF buffer failed.");
336 gross 1023 #else
337     throw DataException("Error - DataConstant:: dump is not configured with netCDF. Please contact your installation manager.");
338     #endif
339 gross 950 }
340    
341 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