23 |
#include <netcdfcpp.h> |
#include <netcdfcpp.h> |
24 |
#endif |
#endif |
25 |
|
|
26 |
|
#include <boost/python/extract.hpp> |
27 |
|
|
28 |
using namespace std; |
using namespace std; |
29 |
|
using namespace boost::python; |
30 |
|
|
31 |
namespace escript { |
namespace escript { |
32 |
|
|
34 |
const FunctionSpace& what) |
const FunctionSpace& what) |
35 |
: DataAbstract(what) |
: DataAbstract(what) |
36 |
{ |
{ |
37 |
DataArray temp(value); |
// extract the shape of the numarray |
38 |
|
DataArrayView::ShapeType tempShape; |
39 |
|
for (int i=0; i < value.getrank(); i++) { |
40 |
|
tempShape.push_back(extract<int>(value.getshape()[i])); |
41 |
|
} |
42 |
|
|
43 |
|
// get the space for the data vector |
44 |
|
int len = DataArrayView::noValues(tempShape); |
45 |
|
DataVector temp_data(len, 0.0, len); |
46 |
|
DataArrayView temp_dataView(temp_data, tempShape); |
47 |
|
temp_dataView.copy(value); |
48 |
|
|
49 |
// |
// |
50 |
// copy the data in the correct format |
// copy the data in the correct format |
51 |
m_data=temp.getData(); |
m_data=temp_data; |
52 |
// |
// |
53 |
// create the view of the data |
// create the view of the data |
54 |
DataArrayView tempView(m_data,temp.getView().getShape()); |
DataArrayView tempView(m_data,temp_dataView.getShape()); |
55 |
setPointDataView(tempView); |
setPointDataView(tempView); |
56 |
} |
} |
57 |
|
|
70 |
|
|
71 |
DataConstant::DataConstant(const DataConstant& other) |
DataConstant::DataConstant(const DataConstant& other) |
72 |
: DataAbstract(other.getFunctionSpace()) |
: DataAbstract(other.getFunctionSpace()) |
73 |
{ // |
{ // |
74 |
// copy the data in the correct format |
// copy the data in the correct format |
75 |
m_data=other.m_data; |
m_data=other.m_data; |
76 |
// |
// |
147 |
// Whatever the coord's always return the same value as this is constant data. |
// Whatever the coord's always return the same value as this is constant data. |
148 |
return getPointDataView(); |
return getPointDataView(); |
149 |
} |
} |
150 |
|
|
151 |
DataAbstract* |
DataAbstract* |
152 |
DataConstant::getSlice(const DataArrayView::RegionType& region) const |
DataConstant::getSlice(const DataArrayView::RegionType& region) const |
153 |
{ |
{ |
156 |
|
|
157 |
void |
void |
158 |
DataConstant::setSlice(const DataAbstract* value, |
DataConstant::setSlice(const DataAbstract* value, |
159 |
const DataArrayView::RegionType& region) |
const DataArrayView::RegionType& region) |
160 |
{ |
{ |
161 |
const DataConstant* tempDataConst=dynamic_cast<const DataConstant*>(value); |
const DataConstant* tempDataConst=dynamic_cast<const DataConstant*>(value); |
162 |
if (tempDataConst==0) { |
if (tempDataConst==0) { |
163 |
throw DataException("Programming error - casting to DataConstant."); |
throw DataException("Programming error - casting to DataConstant."); |
164 |
} |
} |
165 |
// |
// |
166 |
DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region)); |
DataArrayView::ShapeType shape(DataArrayView::getResultSliceShape(region)); |
167 |
DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region); |
DataArrayView::RegionLoopRangeType region_loop_range=getSliceRegionLoopRange(region); |
168 |
// |
// |
303 |
long dims[DataArrayView::maxRank]; |
long dims[DataArrayView::maxRank]; |
304 |
const double* d_ptr=&(m_data[0]); |
const double* d_ptr=&(m_data[0]); |
305 |
DataArrayView::ShapeType shape = getPointDataView().getShape(); |
DataArrayView::ShapeType shape = getPointDataView().getShape(); |
306 |
|
|
307 |
// netCDF error handler |
// netCDF error handler |
308 |
NcError err(NcError::verbose_nonfatal); |
NcError err(NcError::verbose_nonfatal); |
309 |
// Create the file. |
// Create the file. |
310 |
NcFile dataFile(fileName.c_str(), NcFile::Replace); |
NcFile dataFile(fileName.c_str(), NcFile::Replace); |
311 |
// check if writing was successful |
// check if writing was successful |
312 |
if (!dataFile.is_valid()) |
if (!dataFile.is_valid()) |
313 |
throw DataException("Error - DataConstant:: opening of netCDF file for output failed."); |
throw DataException("Error - DataConstant:: opening of netCDF file for output failed."); |
314 |
if (!dataFile.add_att("type_id",0) ) |
if (!dataFile.add_att("type_id",0) ) |
315 |
throw DataException("Error - DataConstant:: appending data type to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending data type to netCDF file failed."); |
316 |
if (!dataFile.add_att("rank",rank) ) |
if (!dataFile.add_att("rank",rank) ) |
317 |
throw DataException("Error - DataConstant:: appending rank attribute to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending rank attribute to netCDF file failed."); |
318 |
if (!dataFile.add_att("function_space_type",type)) |
if (!dataFile.add_att("function_space_type",type)) |
319 |
throw DataException("Error - DataConstant:: appending function space attribute to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending function space attribute to netCDF file failed."); |
320 |
|
|
321 |
if (rank == 0) { |
if (rank == 0) { |
322 |
if( ! (ncdims[0] = dataFile.add_dim("l", 1)) ) |
if( ! (ncdims[0] = dataFile.add_dim("l", 1)) ) |
323 |
throw DataException("Error - DataConstant:: appending ncdimsion 0 to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending ncdimsion 0 to netCDF file failed."); |
324 |
dims[0]=1, |
dims[0]=1, |
325 |
ndims=1; |
ndims=1; |
326 |
} else { |
} else { |
327 |
ndims=rank; |
ndims=rank; |
328 |
dims[0]=shape[0]; |
dims[0]=shape[0]; |
329 |
if (! (ncdims[0] = dataFile.add_dim("d0",shape[0])) ) |
if (! (ncdims[0] = dataFile.add_dim("d0",shape[0])) ) |
330 |
throw DataException("Error - DataConstant:: appending ncdimsion 0 to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending ncdimsion 0 to netCDF file failed."); |
331 |
if ( rank >1 ) { |
if ( rank >1 ) { |
332 |
dims[1]=shape[1]; |
dims[1]=shape[1]; |
333 |
if (! (ncdims[1] = dataFile.add_dim("d1",shape[1])) ) |
if (! (ncdims[1] = dataFile.add_dim("d1",shape[1])) ) |
334 |
throw DataException("Error - DataConstant:: appending ncdimsion 1 to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending ncdimsion 1 to netCDF file failed."); |
335 |
} |
} |
336 |
if ( rank >2 ) { |
if ( rank >2 ) { |
337 |
dims[2]=shape[2]; |
dims[2]=shape[2]; |
338 |
if (! (ncdims[2] = dataFile.add_dim("d2", shape[2])) ) |
if (! (ncdims[2] = dataFile.add_dim("d2", shape[2])) ) |
339 |
throw DataException("Error - DataConstant:: appending ncdimsion 2 to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending ncdimsion 2 to netCDF file failed."); |
340 |
} |
} |
341 |
if ( rank >3 ) { |
if ( rank >3 ) { |
342 |
dims[3]=shape[3]; |
dims[3]=shape[3]; |
343 |
if (! (ncdims[3] = dataFile.add_dim("d3", shape[3])) ) |
if (! (ncdims[3] = dataFile.add_dim("d3", shape[3])) ) |
344 |
throw DataException("Error - DataConstant:: appending ncdimsion 3 to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending ncdimsion 3 to netCDF file failed."); |
345 |
} |
} |
346 |
} |
} |
347 |
|
|
348 |
if (! ( var = dataFile.add_var("data", ncDouble, ndims, ncdims)) ) |
if (! ( var = dataFile.add_var("data", ncDouble, ndims, ncdims)) ) |
349 |
throw DataException("Error - DataConstant:: appending variable to netCDF file failed."); |
throw DataException("Error - DataConstant:: appending variable to netCDF file failed."); |
350 |
if (! (var->put(d_ptr,dims)) ) |
if (! (var->put(d_ptr,dims)) ) |
351 |
throw DataException("Error - DataConstant:: copy data to netCDF buffer failed."); |
throw DataException("Error - DataConstant:: copy data to netCDF buffer failed."); |
352 |
#else |
#else |
353 |
throw DataException("Error - DataConstant:: dump is not configured with netCDF. Please contact your installation manager."); |
throw DataException("Error - DataConstant:: dump is not configured with netCDF. Please contact your installation manager."); |
354 |
#endif |
#endif |