29 |
#include "paso/Paso.h" |
#include "paso/Paso.h" |
30 |
} |
} |
31 |
|
|
32 |
|
#ifndef PASO_MPI |
33 |
|
#define MPI_Comm long |
34 |
|
#endif |
35 |
|
|
36 |
#include <string> |
#include <string> |
37 |
#include <algorithm> |
#include <algorithm> |
38 |
|
|
70 |
typedef double (*UnaryDFunPtr)(double); |
typedef double (*UnaryDFunPtr)(double); |
71 |
typedef double (*BinaryDFunPtr)(double,double); |
typedef double (*BinaryDFunPtr)(double,double); |
72 |
|
|
73 |
|
|
74 |
/** |
/** |
75 |
Constructors. |
Constructors. |
76 |
*/ |
*/ |
239 |
|
|
240 |
/** |
/** |
241 |
\brief |
\brief |
242 |
|
switches on update protection |
243 |
|
|
244 |
|
*/ |
245 |
|
ESCRIPT_DLL_API |
246 |
|
void |
247 |
|
setProtection(); |
248 |
|
|
249 |
|
/** |
250 |
|
\brief |
251 |
|
Returns trueif the data object is protected against update |
252 |
|
|
253 |
|
*/ |
254 |
|
ESCRIPT_DLL_API |
255 |
|
bool |
256 |
|
isProtected() const; |
257 |
|
/** |
258 |
|
\brief |
259 |
Return the values of all data-points as a single python numarray object. |
Return the values of all data-points as a single python numarray object. |
260 |
*/ |
*/ |
261 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
264 |
|
|
265 |
/** |
/** |
266 |
\brief |
\brief |
267 |
Return the values of all data-points for the given sample as a single python numarray object. |
Fills the expanded Data object from values of a python numarray object. |
268 |
*/ |
*/ |
269 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
270 |
const boost::python::numeric::array |
void |
271 |
convertToNumArrayFromSampleNo(int sampleNo); |
fillFromNumArray(const boost::python::numeric::array); |
272 |
|
|
273 |
/** |
/** |
274 |
\brief |
\brief |
275 |
Return the value of the specified data-point as a single python numarray object. |
Return the values of a data point on this process |
276 |
*/ |
*/ |
277 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
278 |
const boost::python::numeric::array |
const boost::python::numeric::array |
279 |
convertToNumArrayFromDPNo(int sampleNo, |
getValueOfDataPoint(int dataPointNo); |
|
int dataPointNo); |
|
280 |
|
|
281 |
/** |
/** |
282 |
\brief |
\brief |
283 |
Fills the expanded Data object from values of a python numarray object. |
sets the values of a data-point on this process |
284 |
*/ |
*/ |
285 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
286 |
void |
void |
287 |
fillFromNumArray(const boost::python::numeric::array); |
setValueOfDataPointToArray(int dataPointNo, const boost::python::numeric::array); |
288 |
|
|
289 |
|
/** |
290 |
|
\brief |
291 |
|
sets the values of a data-point on this process |
292 |
|
*/ |
293 |
|
ESCRIPT_DLL_API |
294 |
|
void |
295 |
|
setValueOfDataPoint(int dataPointNo, const double); |
296 |
|
|
297 |
|
/** |
298 |
|
\brief |
299 |
|
Return the value of the specified data-point across all processors |
300 |
|
*/ |
301 |
|
ESCRIPT_DLL_API |
302 |
|
const boost::python::numeric::array |
303 |
|
getValueOfGlobalDataPoint(int procNo, int dataPointNo); |
304 |
|
|
305 |
/** |
/** |
306 |
\brief |
\brief |
460 |
|
|
461 |
/** |
/** |
462 |
\brief |
\brief |
463 |
|
Return the number of data points |
464 |
|
*/ |
465 |
|
ESCRIPT_DLL_API |
466 |
|
inline |
467 |
|
int |
468 |
|
getNumDataPoints() const |
469 |
|
{ |
470 |
|
return getNumSamples() * getNumDataPointsPerSample(); |
471 |
|
} |
472 |
|
/** |
473 |
|
\brief |
474 |
Return the number of samples. |
Return the number of samples. |
475 |
*/ |
*/ |
476 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
492 |
{ |
{ |
493 |
return m_data->getNumDPPSample(); |
return m_data->getNumDPPSample(); |
494 |
} |
} |
495 |
|
/** |
496 |
|
\brief |
497 |
|
dumps the object into a netCDF file |
498 |
|
*/ |
499 |
|
ESCRIPT_DLL_API |
500 |
|
inline |
501 |
|
void |
502 |
|
dump(const std::string fileName) const |
503 |
|
{ |
504 |
|
return m_data->dump(fileName); |
505 |
|
} |
506 |
|
|
507 |
/** |
/** |
508 |
\brief |
\brief |
534 |
|
|
535 |
/** |
/** |
536 |
\brief |
\brief |
|
Assign the given value to the data-points referenced by the given |
|
|
reference number. |
|
|
|
|
|
The value supplied is a python numarray object. The data from this numarray |
|
|
is unpacked into a DataArray, and this is used to set the corresponding |
|
|
data-points in the underlying Data object. |
|
|
|
|
|
If the underlying Data object cannot be accessed via reference numbers, an |
|
|
exception will be thrown. |
|
|
|
|
|
\param ref - Input - reference number. |
|
|
\param value - Input - value to assign to data-points associated with |
|
|
the given reference number. |
|
|
*/ |
|
|
ESCRIPT_DLL_API |
|
|
void |
|
|
setRefValue(int ref, |
|
|
const boost::python::numeric::array& value); |
|
|
|
|
|
/** |
|
|
\brief |
|
|
Return the values associated with the data-points referenced by the given |
|
|
reference number. |
|
|
|
|
|
The value supplied is a python numarray object. The data from the corresponding |
|
|
data-points in this Data object are packed into the given numarray object. |
|
|
|
|
|
If the underlying Data object cannot be accessed via reference numbers, an |
|
|
exception will be thrown. |
|
|
|
|
|
\param ref - Input - reference number. |
|
|
\param value - Output - object to receive values from data-points |
|
|
associated with the given reference number. |
|
|
*/ |
|
|
ESCRIPT_DLL_API |
|
|
void |
|
|
getRefValue(int ref, |
|
|
boost::python::numeric::array& value); |
|
|
|
|
|
/** |
|
|
\brief |
|
537 |
Return a view into the data for the data point specified. |
Return a view into the data for the data point specified. |
538 |
NOTE: Construction of the DataArrayView is a relatively expensive |
NOTE: Construction of the DataArrayView is a relatively expensive |
539 |
operation. |
operation. |
546 |
getDataPoint(int sampleNo, |
getDataPoint(int sampleNo, |
547 |
int dataPointNo) |
int dataPointNo) |
548 |
{ |
{ |
549 |
return m_data->getDataPoint(sampleNo,dataPointNo); |
return m_data->getDataPoint(sampleNo,dataPointNo); |
550 |
} |
} |
551 |
|
|
552 |
/** |
/** |
658 |
|
|
659 |
/** |
/** |
660 |
\brief |
\brief |
661 |
|
Returns 1./ Data object |
662 |
|
* |
663 |
|
*/ |
664 |
|
ESCRIPT_DLL_API |
665 |
|
Data |
666 |
|
oneOver() const; |
667 |
|
/** |
668 |
|
\brief |
669 |
Return a Data with a 1 for +ive values and a 0 for 0 or -ive values. |
Return a Data with a 1 for +ive values and a 0 for 0 or -ive values. |
670 |
* |
* |
671 |
*/ |
*/ |
788 |
*/ |
*/ |
789 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
790 |
const boost::python::tuple |
const boost::python::tuple |
791 |
mindp() const; |
minGlobalDataPoint() const; |
792 |
|
|
793 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
794 |
void |
void |
795 |
#ifndef PASO_MPI |
calc_minGlobalDataPoint(int& ProcNo, int& DataPointNo) const; |
|
calc_mindp(int& SampleNo, |
|
|
int& DataPointNo) const; |
|
|
#else |
|
|
calc_mindp(int& ProcNo, |
|
|
int& SampleNo, |
|
|
int& DataPointNo) const; |
|
|
#endif |
|
796 |
/** |
/** |
797 |
\brief |
\brief |
798 |
Return the sign of each data point of this Data object. |
Return the sign of each data point of this Data object. |
828 |
*/ |
*/ |
829 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
830 |
Data |
Data |
831 |
matrixtrace(int axis_offset) const; |
trace(int axis_offset) const; |
832 |
|
|
833 |
/** |
/** |
834 |
\brief |
\brief |
864 |
|
|
865 |
/** |
/** |
866 |
\brief |
\brief |
867 |
Calculate the trace of each data point of this Data object. |
swaps the components axis0 and axis1 |
868 |
* |
* |
869 |
*/ |
*/ |
870 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
871 |
Data |
Data |
872 |
trace() const; |
swapaxes(const int axis0, const int axis1) const; |
873 |
|
|
874 |
|
/** |
875 |
|
\brief |
876 |
|
Return the error function erf of each data point of this Data object. |
877 |
|
* |
878 |
|
*/ |
879 |
|
ESCRIPT_DLL_API |
880 |
|
Data |
881 |
|
erf() const; |
882 |
|
|
883 |
/** |
/** |
884 |
\brief |
\brief |
1245 |
const FunctionSpace& fspace); |
const FunctionSpace& fspace); |
1246 |
|
|
1247 |
|
|
|
#ifdef PASO_MPI |
|
1248 |
/** |
/** |
1249 |
\brief |
\brief |
1250 |
print the data values to stdout. Used for debugging |
print the data values to stdout. Used for debugging |
1281 |
ESCRIPT_DLL_API |
ESCRIPT_DLL_API |
1282 |
MPI_Comm |
MPI_Comm |
1283 |
get_MPIComm(void) const; |
get_MPIComm(void) const; |
1284 |
#endif |
|
1285 |
|
/** |
1286 |
|
\brief |
1287 |
|
return the object produced by the factory, which is a DataConstant or DataExpanded |
1288 |
|
*/ |
1289 |
|
ESCRIPT_DLL_API |
1290 |
|
DataAbstract* |
1291 |
|
borrowData(void) const; |
1292 |
|
|
1293 |
protected: |
protected: |
1294 |
|
|
1295 |
private: |
private: |
1347 |
|
|
1348 |
/** |
/** |
1349 |
\brief |
\brief |
|
Perform the given binary operation on all of the data's elements. |
|
|
RHS is a boost::python object. |
|
|
*/ |
|
|
template <class BinaryFunction> |
|
|
inline |
|
|
void |
|
|
binaryOp(const boost::python::object& right, |
|
|
BinaryFunction operation); |
|
|
|
|
|
/** |
|
|
\brief |
|
1350 |
Convert the data type of the RHS to match this. |
Convert the data type of the RHS to match this. |
1351 |
\param right - Input - data type to match. |
\param right - Input - data type to match. |
1352 |
*/ |
*/ |
1371 |
const FunctionSpace& what, |
const FunctionSpace& what, |
1372 |
bool expanded); |
bool expanded); |
1373 |
|
|
1374 |
/** |
// |
1375 |
\brief |
// flag to protect the data object against any update |
1376 |
Reshape the data point if the data point is currently rank 0. |
bool m_protected; |
|
Will throw an exception if the data points are not rank 0. |
|
|
The original data point value is used for all values of the new |
|
|
data point. |
|
|
*/ |
|
|
void |
|
|
reshapeDataPoint(const DataArrayView::ShapeType& shape); |
|
1377 |
|
|
1378 |
// |
// |
1379 |
// pointer to the actual data object |
// pointer to the actual data object |
1410 |
/** |
/** |
1411 |
Binary Data object operators. |
Binary Data object operators. |
1412 |
*/ |
*/ |
1413 |
|
inline double rpow(double x,double y) |
1414 |
|
{ |
1415 |
|
return pow(y,x); |
1416 |
|
} |
1417 |
|
|
1418 |
/** |
/** |
1419 |
\brief |
\brief |
1515 |
|
|
1516 |
/** |
/** |
1517 |
\brief |
\brief |
1518 |
|
Compute a tensor product of two Data objects |
1519 |
|
\param arg0 - Input - Data object |
1520 |
|
\param arg1 - Input - Data object |
1521 |
|
\param axis_offset - Input - axis offset |
1522 |
|
\param transpose - Input - 0: transpose neither, 1: transpose arg0, 2: transpose arg1 |
1523 |
|
*/ |
1524 |
|
ESCRIPT_DLL_API |
1525 |
|
Data |
1526 |
|
C_GeneralTensorProduct(Data& arg0, |
1527 |
|
Data& arg1, |
1528 |
|
int axis_offset=0, |
1529 |
|
int transpose=0); |
1530 |
|
|
1531 |
|
/** |
1532 |
|
\brief |
1533 |
Return true if operands are equivalent, else return false. |
Return true if operands are equivalent, else return false. |
1534 |
NB: this operator does very little at this point, and isn't to |
NB: this operator does very little at this point, and isn't to |
1535 |
be relied on. Requires further implementation. |
be relied on. Requires further implementation. |
1550 |
// |
// |
1551 |
// if this has a rank of zero promote it to the rank of the RHS |
// if this has a rank of zero promote it to the rank of the RHS |
1552 |
if (getPointDataView().getRank()==0 && right.getPointDataView().getRank()!=0) { |
if (getPointDataView().getRank()==0 && right.getPointDataView().getRank()!=0) { |
1553 |
reshapeDataPoint(right.getPointDataView().getShape()); |
throw DataException("Error - attempt to update rank zero object with object with rank bigger than zero."); |
1554 |
} |
} |
1555 |
// |
// |
1556 |
// initially make the temporary a shallow copy |
// initially make the temporary a shallow copy |
1602 |
EsysAssert((leftC!=0 && rightC!=0), "Programming error - casting to DataConstant."); |
EsysAssert((leftC!=0 && rightC!=0), "Programming error - casting to DataConstant."); |
1603 |
escript::binaryOp(*leftC,*rightC,operation); |
escript::binaryOp(*leftC,*rightC,operation); |
1604 |
} |
} |
1605 |
} |
#if defined DOPROF |
1606 |
|
profData->binary++; |
1607 |
/** |
#endif |
|
\brief |
|
|
Perform the given binary operation with this and right as operands. |
|
|
Right is a boost::python object. |
|
|
*/ |
|
|
template <class BinaryFunction> |
|
|
inline |
|
|
void |
|
|
Data::binaryOp(const boost::python::object& right, |
|
|
BinaryFunction operation) |
|
|
{ |
|
|
DataArray temp(right); |
|
|
// |
|
|
// if this has a rank of zero promote it to the rank of the RHS. |
|
|
if (getPointDataView().getRank()==0 && temp.getView().getRank()!=0) { |
|
|
reshapeDataPoint(temp.getView().getShape()); |
|
|
} |
|
|
// |
|
|
// Always allow scalar values for the RHS but check other shapes |
|
|
if (temp.getView().getRank()!=0) { |
|
|
if (!getPointDataView().checkShape(temp.getView().getShape())) { |
|
|
throw DataException(getPointDataView().createShapeErrorMessage( |
|
|
"Error - RHS shape doesn't match LHS shape.",temp.getView().getShape())); |
|
|
} |
|
|
} |
|
|
if (isExpanded()) { |
|
|
DataExpanded* leftC=dynamic_cast<DataExpanded*>(m_data.get()); |
|
|
EsysAssert((leftC!=0),"Programming error - casting to DataExpanded."); |
|
|
escript::binaryOp(*leftC,temp.getView(),operation); |
|
|
} else if (isTagged()) { |
|
|
DataTagged* leftC=dynamic_cast<DataTagged*>(m_data.get()); |
|
|
EsysAssert((leftC!=0), "Programming error - casting to DataTagged."); |
|
|
escript::binaryOp(*leftC,temp.getView(),operation); |
|
|
} else if (isConstant()) { |
|
|
DataConstant* leftC=dynamic_cast<DataConstant*>(m_data.get()); |
|
|
EsysAssert((leftC!=0),"Programming error - casting to DataConstant."); |
|
|
escript::binaryOp(*leftC,temp.getView(),operation); |
|
|
} |
|
1608 |
} |
} |
1609 |
|
|
1610 |
/** |
/** |