escript  Revision_
DataAbstract.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2020 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
14 * Development from 2019 by School of Earth and Environmental Sciences
15 **
16 *****************************************************************************/
17 
18 #ifndef __ESCRIPT_DATAABSTRACT_H__
19 #define __ESCRIPT_DATAABSTRACT_H__
20 
21 #include "system_dep.h"
22 #include "DataTypes.h"
23 #include "DataVector.h"
24 #include "FunctionSpace.h"
25 
26 #include <boost/scoped_ptr.hpp>
27 
28 #include "DataException.h"
29 
30 #include <string>
31 #include <fstream>
32 #include <vector>
33 
34 #include "Pointers.h"
35 
36 namespace escript {
37 
52 class DataAbstract;
53 
54 typedef POINTER_WRAPPER_CLASS(DataAbstract) DataAbstract_ptr;
55 typedef POINTER_WRAPPER_CLASS(const DataAbstract) const_DataAbstract_ptr;
56 
57 class DataReady;
58 
59 typedef POINTER_WRAPPER_CLASS(DataReady) DataReady_ptr;
60 typedef POINTER_WRAPPER_CLASS(const DataReady) const_DataReady_ptr;
61 
62 class ESCRIPT_DLL_API DataAbstract : public REFCOUNT_BASE_CLASS(DataAbstract)
63 {
64 
65  public:
66 
68 
83  DataAbstract_ptr getPtr();
84  const_DataAbstract_ptr getPtr() const;
85 
86 
87 
96  DataAbstract(const FunctionSpace& what, const ShapeType& shape, bool isDataEmpty=false,bool isCplx=false);
97 
102  virtual
103  ~DataAbstract();
104 
109  virtual
110  std::string
111  toString() const = 0;
112 
116  virtual
117  DataAbstract*
118  deepCopy() const =0 ;
119 
124  virtual
125  DataAbstract*
126  zeroedCopy() const =0 ;
127 
128 
129 
133  virtual
135  resolve()=0;
136 
141  virtual
142  void
143  dump(const std::string fileName) const;
144 
149  int
150  getNumDPPSample() const;
151 
156  int
157  getNumSamples() const;
158 
159  bool
160  hasNoSamples() const
161  {
162  return getNumSamples()==0;
163  }
164 
171  const DataTypes::ShapeType&
172  getShape() const;
173 
178  unsigned int
179  getRank() const;
180 
181 
182 
191  virtual
193  getPointOffset(int sampleNo,
194  int dataPointNo) const = 0;
195 
196 
197 
202  virtual
204  getLength() const = 0;
205 
211  virtual
213  getSampleDataByTag(int tag, DataTypes::real_t dummy=0);
214 
220  virtual
222  getSampleDataByTag(int tag, DataTypes::cplx_t dummy);
223 
230  virtual
231  size_t
232  getTagCount() const;
233 
241  void
242  operandCheck(const DataAbstract& right) const;
243 
248  bool
249  validSamplePointNo(int samplePointNo) const;
250 
255  bool
256  validSampleNo(int sampleNo) const;
257 
258 
263  const
264  FunctionSpace&
265  getFunctionSpace() const;
266 
273  virtual
274  DataAbstract*
275  getSlice(const DataTypes::RegionType& region) const = 0;
276 
277 
278 
296  virtual
297  void
298  setTaggedValue(int tagKey,
299  const DataTypes::ShapeType& pointshape,
300  const DataTypes::RealVectorType& value,
301  int dataOffset=0);
302 
303  virtual
304  void
305  setTaggedValue(int tagKey,
306  const DataTypes::ShapeType& pointshape,
307  const DataTypes::CplxVectorType& value,
308  int dataOffset=0);
309 
321  virtual void
322  copyToDataPoint(const int sampleNo, const int dataPointNo, const DataTypes::real_t value);
323 
324  virtual void
325  copyToDataPoint(const int sampleNo, const int dataPointNo, const DataTypes::cplx_t value);
326 
335  virtual void
336  copyToDataPoint(const int sampleNo, const int dataPointNo, const WrappedArray& value);
337 
338 
346  virtual
347  int
348  getTagNumber(int dpno);
349 
357  virtual void
358  symmetric(DataAbstract* ev);
359 
367  virtual void
368  antisymmetric(DataAbstract* ev);
369 
377  virtual void
378  hermitian(DataAbstract* ev);
379 
387  virtual void
388  antihermitian(DataAbstract* ev);
389 
397  virtual void
398  trace(DataAbstract* ev, int axis_offset);
399 
407  virtual void
408  transpose(DataAbstract* ev, int axis_offset);
409 
418  virtual void
419  swapaxes(DataAbstract* ev, int axis0, int axis1);
427  virtual void
428  eigenvalues(DataAbstract* ev);
429 
435  virtual int
436  matrixInverse(DataAbstract* out) const;
437 
443  virtual void
444  setToZero();
445 
457  virtual void
458  eigenvalues_and_eigenvectors(DataAbstract* ev,DataAbstract* V,const double tol=1.e-13);
459 
466  virtual void
467  reorderByReferenceIDs(DataTypes::dim_t *reference_ids);
468 
469 
470 
475  unsigned int
476  getNoValues() const;
477 
478 
479  bool isLazy() const; // a test to determine if this object is an instance of DataLazy
480 
481  virtual
482  bool
483  isConstant() const {return false;}
484 
485  virtual
486  bool
487  isExpanded() const {return false;}
488 
489 
495  virtual
496  bool
497  actsExpanded() const {return false;}
498 
499  virtual
500  bool
501  isTagged() const {return false;}
502 
503  bool isEmpty() const; // a fast test to determine if this object is an instance of DataEmpty
504 
508  bool isComplex() const;
509 
510 #ifdef SLOWSHARECHECK
511 
512  // For this to be threadsafe, we need to be sure that this is the
513  // only way shared-ness is tested.
517  bool
518  isShared() const
519  {
520  bool shared=false;
521  #pragma omp critical // because two treads could try
522  { // this check at the same time
523  try // and shared_from_this increments count
524  {
525  shared=shared_from_this().use_count()>2;
526  }
527  catch (...)
528  {
529  }
530  }
531  return shared;
532  }
533 #endif
534 
535 #ifdef EXWRITECHK
536  bool exclusivewritecalled; // used to check for some potential programming faults
537  // involving shared data.
538  // This flag only asserts that exclusive write has been called
539  // on this object, it does not definitively guarantee that
540  // sharing has not occurred since that call
541  // This flag is for internal use only may be removed without warning
542 #endif
543 
544 /*
545  * Make the object complex
546 */
547  virtual void complicate();
548 
549 protected:
550  friend class DataLazy;
551 
552  //
553  // The number of samples in this Data object.
554  // This is derived directly from the FunctionSpace.
555  int m_noSamples;
556 
557  //
558  // The number of data points per sample in this Data object.
559  // This is derived directly from the FunctionSpace.
560  int m_noDataPointsPerSample;
561 
562  //
563  // is the data made of complex components
564  bool m_iscompl;
565 private:
566 
567  //
568  // A FunctionSpace which provides a description of the data associated
569  // with this Data object.
570  FunctionSpace m_functionSpace;
571 
572  //
573  // The shape of the points stored in this view
575 
576  //
577  // The number of values in each point
578  unsigned int m_novalues;
579 
580  //
581  // The rank of the points stored in this view
582  unsigned int m_rank;
583 
584  //
585  // Is this an instance of DataEmpty?
586  bool m_isempty;
587 };
588 
589 inline
590 bool
591 DataAbstract::isEmpty() const
592 {
593  return m_isempty;
594 }
595 
596 inline
597 bool
598 DataAbstract::validSamplePointNo(int samplePointNo) const
599 {
600  return ((0 <= samplePointNo) && (samplePointNo < m_noDataPointsPerSample));
601 }
602 
603 inline
604 bool
605 DataAbstract::validSampleNo(int sampleNo) const
606 {
607  return ((0 <= sampleNo) && (sampleNo < m_noSamples));
608 }
609 
610 inline
611 int
613 {
614  if (isEmpty())
615  {
616  throw DataException("Error - Operations (getNumDPPSample) not permitted on instances of DataEmpty.");
617  }
619 }
620 
621 inline
622 int
624 {
625  if (isEmpty())
626  {
627  throw DataException("Error - Operations (getNumSamples) not permitted on instances of DataEmpty.");
628  }
629  return m_noSamples;
630 }
631 
632 inline
633 const
634 FunctionSpace&
636 {
638 }
639 
640 inline
643 {
644  if (isEmpty())
645  {
646  throw DataException("Error - Operations (getShape) not permitted on instances of DataEmpty.");
647  }
648  return m_shape;
649 }
650 
651 inline
652 unsigned int
653 DataAbstract::getRank() const
654 {
655  if (isEmpty())
656  {
657  throw DataException("Error - Operations (getRank) not permitted on instances of DataEmpty.");
658  }
659  return m_rank;
660 }
661 
662 inline
663 unsigned int
665 {
666  if (isEmpty())
667  {
668  throw DataException("Error - Operations (getNoValues) not permitted on instances of DataEmpty.");
669  }
670  return m_novalues;
671 }
672 
673 } // end of namespace
674 
675 #endif // __ESCRIPT_DATAABSTRACT_H__
676 
ESCRIPT_DLL_API
#define ESCRIPT_DLL_API
Definition: escriptcore/src/system_dep.h:30
escript::DataTypes::shapeToString
std::string shapeToString(const DataTypes::ShapeType &shape)
Return the given shape as a string.
Definition: DataTypes.cpp:117
escript::DataTypes::real_t
double real_t
type of all real-valued scalars in escript
Definition: DataTypes.h:79
escript::DataAbstract::matrixInverse
virtual int matrixInverse(DataAbstract *out) const
invert square matricies
Definition: DataAbstract.cpp:264
POINTER_WRAPPER_CLASS
#define POINTER_WRAPPER_CLASS(x)
Definition: Pointers.h:33
escript::DataAbstract::setToZero
virtual void setToZero()
sets values to zero
Definition: DataAbstract.cpp:270
escript::DataAbstract::m_shape
DataTypes::ShapeType m_shape
Definition: DataAbstract.h:588
escript::antihermitian
void antihermitian(const DataTypes::CplxVectorType &in, const DataTypes::ShapeType &inShape, typename DataTypes::CplxVectorType::size_type inOffset, DataTypes::CplxVectorType &ev, const DataTypes::ShapeType &evShape, typename DataTypes::CplxVectorType::size_type evOffset)
computes a antihermitian matrix from your square matrix A: (A - adjoint(A)) / 2
Definition: DataVectorOps.cpp:963
escript::DataAbstract::getSampleDataByTag
virtual DataTypes::real_t * getSampleDataByTag(int tag, DataTypes::real_t dummy=0)
Return the real sample data for the given tag key. NB: If the data isn't tagged an exception will be ...
Definition: DataAbstract.cpp:145
escript::DataAbstract::m_noDataPointsPerSample
int m_noDataPointsPerSample
Definition: DataAbstract.h:574
escript::DataAbstract::reorderByReferenceIDs
virtual void reorderByReferenceIDs(DataTypes::dim_t *reference_ids)
reorders data sample ordered by reference_ids to the ordering of the functions space
Definition: DataAbstract.cpp:276
escript::DataTypes::getRank
int getRank(const DataTypes::ShapeType &shape)
Return the rank (number of dimensions) of the given shape.
Definition: DataTypes.h:247
escript::DataAbstract::copyToDataPoint
virtual void copyToDataPoint(const int sampleNo, const int dataPointNo, const DataTypes::real_t value)
Copy a double value to the data point dataPointNo of sample sampleNo in this object.
Definition: DataAbstract.cpp:191
escript::DataAbstract_ptr
boost::shared_ptr< DataAbstract > DataAbstract_ptr
Definition: DataAbstract.h:66
escript::eigenvalues
void eigenvalues(const DataTypes::RealVectorType &in, const DataTypes::ShapeType &inShape, typename DataTypes::RealVectorType::size_type inOffset, DataTypes::RealVectorType &ev, const DataTypes::ShapeType &evShape, typename DataTypes::RealVectorType::size_type evOffset)
solves a local eigenvalue problem
Definition: DataVectorOps.h:639
escript::DataAbstract::eigenvalues_and_eigenvectors
virtual void eigenvalues_and_eigenvectors(DataAbstract *ev, DataAbstract *V, const double tol=1.e-13)
solves the eigenvalue problem this*V=ev*V for the eigenvalues ev and eigenvectors V
Definition: DataAbstract.cpp:257
escript::WrappedArray
Definition: WrappedArray.h:32
escript::DataTypes::DataVectorAlt< real_t >::size_type
DataTypes::vec_size_type size_type
Definition: DataVectorAlt.h:92
escript::symmetric
void symmetric(const VEC &in, const DataTypes::ShapeType &inShape, typename VEC::size_type inOffset, VEC &ev, const DataTypes::ShapeType &evShape, typename VEC::size_type evOffset)
computes a symmetric matrix from your square matrix A: (A + transpose(A)) / 2
Definition: DataVectorOps.h:103
escript::DataTypes::DataVectorAlt< real_t >
escript::DataAbstract::validSampleNo
bool validSampleNo(int sampleNo) const
Return true if a valid sample number.
Definition: DataAbstract.h:619
escript::transpose
void transpose(const VEC &in, const DataTypes::ShapeType &inShape, typename VEC::size_type inOffset, VEC &ev, const DataTypes::ShapeType &evShape, typename VEC::size_type evOffset, int axis_offset)
Transpose each data point of this Data object around the given axis.
Definition: DataVectorOps.h:343
escript::const_DataReady_ptr
boost::shared_ptr< const DataReady > const_DataReady_ptr
Definition: DataAbstract.h:74
escript::DataAbstract::getRank
unsigned int getRank() const
Return the rank information for the point data.
Definition: DataAbstract.h:667
escript::DataAbstract::trace
virtual void trace(DataAbstract *ev, int axis_offset)
Computes the trace of a matrix.
Definition: DataAbstract.cpp:235
ESCRIPT_MAX_DATA_RANK
#define ESCRIPT_MAX_DATA_RANK
Definition: Data.h:39
DataLazy.h
escript::const_DataAbstract_ptr
boost::shared_ptr< const DataAbstract > const_DataAbstract_ptr
Definition: DataAbstract.h:69
escript::DataAbstract::isEmpty
bool isEmpty() const
Definition: DataAbstract.h:605
escript::FunctionSpace
Definition: FunctionSpace.h:49
escript::DataAbstract::swapaxes
virtual void swapaxes(DataAbstract *ev, int axis0, int axis1)
swaps components axis0 and axis1
Definition: DataAbstract.cpp:241
REFCOUNT_BASE_CLASS
#define REFCOUNT_BASE_CLASS(x)
Definition: Pointers.h:31
system_dep.h
escript::DataAbstract::m_isempty
bool m_isempty
Definition: DataAbstract.h:600
Pointers.h
Typedefs and macros for reference counted storage.
escript::DataAbstract::getNumDPPSample
int getNumDPPSample() const
Return the number of data points per sample.
Definition: DataAbstract.h:626
escript::DataException
Definition: DataException.h:41
escript::DataAbstract::antisymmetric
virtual void antisymmetric(DataAbstract *ev)
Computes a antisymmetric matrix (A - AT) / 2.
Definition: DataAbstract.cpp:217
escript::hermitian
void hermitian(const DataTypes::CplxVectorType &in, const DataTypes::ShapeType &inShape, DataTypes::CplxVectorType::size_type inOffset, DataTypes::CplxVectorType &ev, const DataTypes::ShapeType &evShape, DataTypes::CplxVectorType::size_type evOffset)
computes an hermitian matrix from your square matrix A: (A + adjoint(A)) / 2
Definition: DataVectorOps.cpp:916
escript::DataTypes::dim_t
index_t dim_t
Definition: DataTypes.h:93
escript::DataAbstract::eigenvalues
virtual void eigenvalues(DataAbstract *ev)
solves the eigenvalue problem this*V=ev*V for the eigenvalues ev
Definition: DataAbstract.cpp:252
escript::DataTypes::ShapeType
std::vector< int > ShapeType
The shape of a single datapoint.
Definition: DataTypes.h:71
escript::DataAbstract::validSamplePointNo
bool validSamplePointNo(int samplePointNo) const
Return true if a valid sample point number.
Definition: DataAbstract.h:612
escript::DataAbstract::getTagCount
virtual size_t getTagCount() const
Return number of tagged values stored in the data object.
Definition: DataAbstract.cpp:158
escript::DataTypes::RegionType
std::vector< std::pair< int, int > > RegionType
Definition: DataTypes.h:72
DataAbstract.h
escript::DataAbstract::complicate
virtual void complicate()
Definition: DataAbstract.cpp:281
escript::DataTypes::noValues
int noValues(const ShapeType &shape)
Calculate the number of values in a datapoint with the given shape.
Definition: DataTypes.cpp:91
escript::DataAbstract::getShape
const DataTypes::ShapeType & getShape() const
Return the shape information for the point data.
Definition: DataAbstract.h:656
escript::DataAbstract::getNumSamples
int getNumSamples() const
Return the number of samples.
Definition: DataAbstract.h:637
escript::DataAbstract::symmetric
virtual void symmetric(DataAbstract *ev)
Computes a symmetric matrix (A + AT) / 2.
Definition: DataAbstract.cpp:211
escript::DataAbstract::~DataAbstract
virtual ~DataAbstract()
Destructor for DataAbstract.
Definition: DataAbstract.cpp:99
escript::swapaxes
void swapaxes(const VEC &in, const DataTypes::ShapeType &inShape, typename VEC::size_type inOffset, VEC &ev, const DataTypes::ShapeType &evShape, typename VEC::size_type evOffset, int axis0, int axis1)
swaps the components axis0 and axis1.
Definition: DataVectorOps.h:488
escript::DataAbstract::m_novalues
unsigned int m_novalues
Definition: DataAbstract.h:592
V
#define V(_K_, _I_)
Definition: ShapeFunctions.cpp:139
escript::DataTypes::RealVectorType
escript::DataTypes::DataVectorAlt< real_t > RealVectorType
Vector to store underlying data.
Definition: DataVector.h:44
escript::DataAbstract::transpose
virtual void transpose(DataAbstract *ev, int axis_offset)
Transpose each data point of this Data object around the given axis.
Definition: DataAbstract.cpp:246
escript::DataAbstract::m_noSamples
int m_noSamples
Definition: DataAbstract.h:569
escript
Definition: AbstractContinuousDomain.cpp:23
escript::DataAbstract::setTaggedValue
virtual void setTaggedValue(int tagKey, const DataTypes::ShapeType &pointshape, const DataTypes::RealVectorType &value, int dataOffset=0)
setTaggedValue
Definition: DataAbstract.cpp:166
DataVector.h
DataTypes.h
escript::DataAbstract
Definition: DataAbstract.h:76
escript::DataAbstract::operandCheck
void operandCheck(const DataAbstract &right) const
Check this and the given RHS operands are compatible. Throws an exception if they aren't.
Definition: DataAbstract.cpp:105
escript::DataAbstract::dump
virtual void dump(const std::string fileName) const
dumps the object into a netCDF file
Definition: DataAbstract.cpp:137
escript::FunctionSpace::toString
std::string toString() const
Returns a text description of the function space.
Definition: FunctionSpace.cpp:118
escript::DataAbstract::getNoValues
unsigned int getNoValues() const
Return the number of values in the shape for this object.
Definition: DataAbstract.h:678
escript::DataAbstract::m_functionSpace
FunctionSpace m_functionSpace
Definition: DataAbstract.h:584
Data.h
escript::antisymmetric
void antisymmetric(const VEC &in, const DataTypes::ShapeType &inShape, typename VEC::size_type inOffset, VEC &ev, const DataTypes::ShapeType &evShape, typename VEC::size_type evOffset)
computes a antisymmetric matrix from your square matrix A: (A - transpose(A)) / 2
Definition: DataVectorOps.h:152
escript::DataAbstract::getFunctionSpace
const FunctionSpace & getFunctionSpace() const
Return the function space associated with this Data object.
Definition: DataAbstract.h:649
escript::DataTypes::cplx_t
std::complex< real_t > cplx_t
complex data type
Definition: DataTypes.h:82
escript::DataReady_ptr
boost::shared_ptr< DataReady > DataReady_ptr
Definition: DataAbstract.h:71
escript::DataAbstract::ShapeType
DataTypes::ShapeType ShapeType
Definition: DataAbstract.h:81
escript::DataAbstract::getTagNumber
virtual int getTagNumber(int dpno)
Return the tag number associated with the given data-point number.
Definition: DataAbstract.cpp:184
escript::trace
void trace(const VEC &in, const DataTypes::ShapeType &inShape, typename VEC::size_type inOffset, VEC &ev, const DataTypes::ShapeType &evShape, typename VEC::size_type evOffset, int axis_offset)
computes the trace of a matrix
Definition: DataVectorOps.h:242
escript::DataAbstract::antihermitian
virtual void antihermitian(DataAbstract *ev)
Computes a antisymmetric matrix (A - A*) / 2.
Definition: DataAbstract.cpp:229
DataException.h
escript::DataAbstract::hermitian
virtual void hermitian(DataAbstract *ev)
Computes a symmetric matrix (A + A*) / 2.
Definition: DataAbstract.cpp:223
escript::DataTypes::CplxVectorType
escript::DataTypes::DataVectorAlt< cplx_t > CplxVectorType
Definition: DataVector.h:45
escript::DataAbstract::m_rank
unsigned int m_rank
Definition: DataAbstract.h:596
FunctionSpace.h
escript::eigenvalues_and_eigenvectors
void eigenvalues_and_eigenvectors(const DataTypes::RealVectorType &in, const DataTypes::ShapeType &inShape, DataTypes::RealVectorType::size_type inOffset, DataTypes::RealVectorType &ev, const DataTypes::ShapeType &evShape, DataTypes::RealVectorType::size_type evOffset, DataTypes::RealVectorType &V, const DataTypes::ShapeType &VShape, DataTypes::RealVectorType::size_type VOffset, const double tol=1.e-13)
solves a local eigenvalue problem
Definition: DataVectorOps.h:750
escript::DataLazy
Wraps an expression tree of other DataObjects. The data will be evaluated when required.
Definition: DataLazy.h:62