ESYS13  Revision_
DataTagged.h
Go to the documentation of this file.
00001 
00002 /*******************************************************
00003 *
00004 * Copyright (c) 2003-2012 by University of Queensland
00005 * Earth Systems Science Computational Center (ESSCC)
00006 * http://www.uq.edu.au/esscc
00007 *
00008 * Primary Business: Queensland, Australia
00009 * Licensed under the Open Software License version 3.0
00010 * http://www.opensource.org/licenses/osl-3.0.php
00011 *
00012 *******************************************************/
00013 
00014 
00015 #if !defined escript_DataTagged_20040615_H
00016 #define escript_DataTagged_20040615_H
00017 #include "system_dep.h"
00018 
00019 #include "DataReady.h"
00020 #include "DataTypes.h"
00021 
00022 #include <vector>
00023 #include <map>
00024 
00025 namespace escript {
00026 
00027 class DataConstant;
00028 
00040 class DataTagged : public DataReady {
00041 typedef DataReady parent;
00042  public:
00043 
00044   //
00045   // Types for the lists of tags and values.
00046   typedef std::vector<int>           TagListType;
00047 //  typedef std::vector<DataArrayView> ValueListType;
00048   typedef DataTypes::ValueType   ValueType;
00049   typedef std::vector<ValueType::ElementType> ValueBatchType;
00050 
00051   //
00052   // Map from a tag to an offset into the data array. 
00053   typedef std::map<int, int> DataMapType;
00054 
00065   ESCRIPT_DLL_API
00066   DataTagged();
00067 
00080   ESCRIPT_DLL_API
00081   DataTagged(const FunctionSpace& what,
00082              const DataTypes::ShapeType &shape,
00083              const int tags[],
00084              const ValueType& data);
00085 
00098   ESCRIPT_DLL_API
00099   DataTagged(const FunctionSpace& what,
00100              const DataTypes::ShapeType &shape,
00101              const TagListType& tags,
00102              const ValueType& data);
00103 
00110   ESCRIPT_DLL_API
00111   DataTagged(const DataTagged& other);
00112 
00120   ESCRIPT_DLL_API
00121   DataTagged(const DataConstant& other);
00122 
00133   ESCRIPT_DLL_API
00134   DataTagged(const FunctionSpace& what,
00135              const DataTypes::ShapeType& shape,
00136          const DataTypes::ValueType& defaultvalue,
00137              const DataTagged* tagsource=0);
00138 
00143   ESCRIPT_DLL_API
00144   inline virtual
00145   ~DataTagged() {};
00146 
00147   ESCRIPT_DLL_API
00148   bool
00149   isTagged() const 
00150   {
00151     return true;
00152   };
00153 
00157   ESCRIPT_DLL_API
00158   bool
00159   hasNaN() const;
00160 
00164   ESCRIPT_DLL_API
00165   virtual
00166   DataAbstract*
00167   deepCopy();
00168 
00169 
00182   ESCRIPT_DLL_API
00183   virtual
00184   double*
00185   getSampleDataByTag(int tag);
00186 
00194   ESCRIPT_DLL_API
00195   virtual
00196   std::string
00197   toString() const;
00202   ESCRIPT_DLL_API
00203   virtual
00204   void
00205   dump(const std::string fileName) const;
00206 
00212   ESCRIPT_DLL_API
00213   virtual int
00214   matrixInverse(DataAbstract* out) const;
00215 
00220   ESCRIPT_DLL_API
00221   virtual
00222   void
00223   setToZero();
00224 
00231   ESCRIPT_DLL_API
00232   virtual
00233   int
00234   getTagNumber(int dpno);
00235 
00248   ESCRIPT_DLL_API
00249   virtual
00250   ValueType::size_type
00251   getPointOffset(int sampleNo,
00252                  int dataPointNo) const;
00253 
00254   ESCRIPT_DLL_API
00255   virtual
00256   ValueType::size_type
00257   getPointOffset(int sampleNo,
00258                  int dataPointNo);
00259 
00277   ESCRIPT_DLL_API
00278   void
00279   addTaggedValues(const TagListType& tagKeys,
00280                             const ValueBatchType& values,
00281                             const ShapeType& vShape);
00282 
00283 
00300   ESCRIPT_DLL_API
00301   void
00302   addTaggedValues(const TagListType& tagKeys,
00303                             const ValueType& values,
00304                             const ShapeType& vShape);
00305 
00306 
00307 
00308 
00321   ESCRIPT_DLL_API
00322   void
00323   addTaggedValue(int tagKey,
00324          const DataTypes::ShapeType& pointshape,
00325                  const ValueType& value,
00326          int dataOffset=0);
00327 
00338   ESCRIPT_DLL_API
00339   void
00340   addTag(int tagKey);
00341 
00354   ESCRIPT_DLL_API
00355   void
00356   setTaggedValue(int tagKey,
00357          const DataTypes::ShapeType& pointshape,
00358                  const ValueType& value,
00359          int dataOffset=0);
00360 
00371   ESCRIPT_DLL_API
00372   DataTypes::ValueType::reference
00373   getDataByTagRW(int tag, DataTypes::ValueType::size_type i);
00374 
00375   ESCRIPT_DLL_API
00376   DataTypes::ValueType::const_reference
00377   getDataByTagRO(int tag, DataTypes::ValueType::size_type i) const;
00378 
00379 
00380 
00390   ESCRIPT_DLL_API
00391   DataTypes::ValueType::size_type
00392   getOffsetForTag(int tag) const;
00393 
00394 
00400   ESCRIPT_DLL_API
00401   DataTypes::ValueType&
00402   getVectorRW();
00403 
00404   ESCRIPT_DLL_API
00405   const DataTypes::ValueType&
00406   getVectorRO() const;
00407 
00408 
00409 
00418   ESCRIPT_DLL_API
00419   const DataMapType&
00420   getTagLookup() const;
00421 
00433   ESCRIPT_DLL_API
00434   bool
00435   isCurrentTag(int tag) const;
00436 
00446   ESCRIPT_DLL_API
00447   DataTypes::ValueType::reference
00448   getDefaultValueRW(DataTypes::ValueType::size_type i);
00449 
00450   ESCRIPT_DLL_API
00451   DataTypes::ValueType::const_reference
00452   getDefaultValueRO(DataTypes::ValueType::size_type i) const;
00453 
00454 
00455 
00456 
00457 
00466   ESCRIPT_DLL_API
00467   virtual
00468   ValueType::size_type
00469   getLength() const;
00470 
00481   ESCRIPT_DLL_API
00482   virtual
00483   DataAbstract*
00484   getSlice(const DataTypes::RegionType& region) const;
00485 
00497   ESCRIPT_DLL_API
00498   DataTagged(const DataTagged& other, 
00499          const DataTypes::RegionType& region);
00500 
00511   ESCRIPT_DLL_API
00512   virtual
00513   void
00514   setSlice(const DataAbstract* other,
00515            const DataTypes::RegionType& region);
00516 
00517 
00525   ESCRIPT_DLL_API
00526   virtual void
00527   symmetric(DataAbstract* ev);
00528 
00536   ESCRIPT_DLL_API
00537   virtual void
00538   nonsymmetric(DataAbstract* ev);
00539 
00547   ESCRIPT_DLL_API
00548   virtual void
00549   trace(DataAbstract* ev, int axis_offset);
00550 
00559   ESCRIPT_DLL_API
00560   virtual void
00561   swapaxes(DataAbstract* ev, int axis0, int axis1);
00562 
00570   ESCRIPT_DLL_API
00571   virtual void
00572   transpose(DataAbstract* ev, int axis_offset);
00573 
00581   ESCRIPT_DLL_API
00582   virtual void
00583   eigenvalues(DataAbstract* ev);
00584 
00596   ESCRIPT_DLL_API
00597   virtual void
00598   eigenvalues_and_eigenvectors(DataAbstract* ev,DataAbstract* V,const double tol=1.e-13);
00599 
00600 
00604   ESCRIPT_DLL_API
00605   DataTypes::ValueType::size_type
00606   getDefaultOffset() const;
00607 
00608  protected:
00609 
00610  private:
00611 
00612   //
00613   // The offset lookup table
00614   DataMapType m_offsetLookup;
00615 
00616   //
00617   // the offset to the default value
00618   static const int m_defaultValueOffset = 0;
00619 
00620   //
00621   // The actual data
00622   ValueType m_data;
00623 
00624 };
00625 
00626 inline
00627 bool
00628 DataTagged::isCurrentTag(int tag) const
00629 {
00630   DataMapType::const_iterator pos(m_offsetLookup.find(tag));
00631   return (pos!=m_offsetLookup.end());
00632 }
00633 
00634 inline 
00635 DataTypes::ValueType::size_type
00636 DataTagged::getDefaultOffset() const
00637 {
00638   return m_defaultValueOffset;  
00639 }
00640 
00641 inline
00642 DataTypes::ValueType::reference
00643 DataTagged::getDefaultValueRW(DataTypes::ValueType::size_type i)
00644 {   
00645     return getVectorRW()[i];        // getVectorRW has exclusive write checks
00646 }
00647 
00648 inline
00649 DataTypes::ValueType::const_reference
00650 DataTagged::getDefaultValueRO(DataTypes::ValueType::size_type i) const
00651 {
00652     return getVectorRO()[i];
00653 }
00654 
00655 inline
00656 const DataTagged::DataMapType&
00657 DataTagged::getTagLookup() const
00658 {
00659   return m_offsetLookup;
00660 }
00661 
00662 inline
00663 DataTypes::ValueType::size_type
00664 DataTagged::getLength() const
00665 {
00666   return m_data.size();
00667 }
00668 
00669 } // end of namespace
00670 
00671 #endif