ESYS13  Revision_
DataTypes.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_DataTypes_20080811_H
00016 #define escript_DataTypes_20080811_H
00017 #include "system_dep.h"
00018 #include "DataVector.h"
00019 #include <vector>
00020 #include <string>
00021 #include <boost/python/object.hpp>
00022 #include <boost/python/extract.hpp>
00023 
00024 namespace escript {
00025 
00026 namespace DataTypes {
00027 
00032   //
00033   // Some basic types which define the data values and view shapes.
00034   typedef DataVector                        ValueType;
00035   typedef std::vector<int>                  ShapeType;
00036   typedef std::vector<std::pair<int, int> > RegionType;
00037   typedef std::vector<std::pair<int, int> > RegionLoopRangeType;
00038   static const int maxRank=4;
00039   static const ShapeType scalarShape;
00040 
00047   ESCRIPT_DLL_API
00048   int
00049   noValues(const DataTypes::ShapeType& shape);
00050 
00057   ESCRIPT_DLL_API
00058   int
00059   noValues(const DataTypes::RegionLoopRangeType& region);
00060 
00067   ESCRIPT_DLL_API
00068   std::string
00069   shapeToString(const DataTypes::ShapeType& shape);
00070 
00078   ESCRIPT_DLL_API
00079   DataTypes::ShapeType
00080   getResultSliceShape(const DataTypes::RegionType& region);
00081 
00082 
00140    ESCRIPT_DLL_API
00141    DataTypes::RegionType
00142    getSliceRegion(const DataTypes::ShapeType& shape, const boost::python::object& key);
00143 
00156   ESCRIPT_DLL_API
00157   DataTypes::RegionLoopRangeType
00158   getSliceRegionLoopRange(const DataTypes::RegionType& region);
00159 
00166   ESCRIPT_DLL_API
00167   inline
00168   int
00169   getRank(const DataTypes::ShapeType& shape)
00170   {
00171     return shape.size();
00172   }
00173 
00174 
00182   ESCRIPT_DLL_API
00183   inline
00184   DataTypes::ValueType::size_type
00185   getRelIndex(const DataTypes::ShapeType& shape, DataTypes::ValueType::size_type i)
00186   {
00187     EsysAssert((getRank(shape)==1),"Incorrect number of indices for the rank of this object.");
00188     EsysAssert((i < DataTypes::noValues(shape)), "Error - Invalid index.");
00189     return i;
00190   }
00191 
00200   ESCRIPT_DLL_API
00201   inline
00202   DataTypes::ValueType::size_type
00203   getRelIndex(const DataTypes::ShapeType& shape, DataTypes::ValueType::size_type i,
00204        DataTypes::ValueType::size_type j)
00205   {
00206     // Warning: This is not C ordering. Do not try to figure out the params by looking at the code
00207     EsysAssert((getRank(shape)==2),"Incorrect number of indices for the rank of this object.");
00208     DataTypes::ValueType::size_type temp=i+j*shape[0];
00209     EsysAssert((temp < DataTypes::noValues(shape)), "Error - Invalid index.");
00210     return temp;
00211   }
00212 
00220   ESCRIPT_DLL_API
00221   inline
00222   DataTypes::ValueType::size_type
00223   getRelIndex(const DataTypes::ShapeType& shape, DataTypes::ValueType::size_type i,
00224        DataTypes::ValueType::size_type j, DataTypes::ValueType::size_type k)
00225   {
00226     // Warning: This is not C ordering. Do not try to figure out the params by looking at the code
00227     EsysAssert((getRank(shape)==3),"Incorrect number of indices for the rank of this object.");
00228     DataTypes::ValueType::size_type temp=i+j*shape[0]+k*shape[1]*shape[0];
00229     EsysAssert((temp < DataTypes::noValues(shape)), "Error - Invalid index.");
00230     return temp;
00231   }
00232 
00240   ESCRIPT_DLL_API
00241   inline
00242   DataTypes::ValueType::size_type
00243   getRelIndex(const DataTypes::ShapeType& shape, DataTypes::ValueType::size_type i,
00244        DataTypes::ValueType::size_type j, DataTypes::ValueType::size_type k,
00245        DataTypes::ValueType::size_type m)
00246   {
00247     // Warning: This is not C ordering. Do not try to figure out the params by looking at the code
00248     EsysAssert((getRank(shape)==4),"Incorrect number of indices for the rank of this object.");
00249     DataTypes::ValueType::size_type temp=i+j*shape[0]+k*shape[1]*shape[0]+m*shape[2]*shape[1]*shape[0];
00250     EsysAssert((temp < DataTypes::noValues(shape)), "Error - Invalid index.");
00251     return temp;
00252   }
00253 
00257   ESCRIPT_DLL_API
00258   inline
00259   bool
00260   checkShape(const ShapeType& s1, const ShapeType& s2)
00261   {
00262     return s1==s2;
00263   }
00264 
00272    ESCRIPT_DLL_API
00273    std::string 
00274    createShapeErrorMessage(const std::string& messagePrefix,
00275                                           const DataTypes::ShapeType& other,
00276                       const DataTypes::ShapeType& thisShape);
00277 
00278 
00293    ESCRIPT_DLL_API
00294    void
00295    copySlice(ValueType& left,
00296                 const ShapeType& leftShape,
00297                 ValueType::size_type leftOffset,
00298                             const ValueType& other,
00299                 const ShapeType& otherShape,
00300                             ValueType::size_type otherOffset,
00301                             const RegionLoopRangeType& region);
00302 
00317    ESCRIPT_DLL_API
00318    void
00319    copySliceFrom(ValueType& left,
00320                 const ShapeType& leftShape,
00321                 ValueType::size_type leftOffset,
00322                                 const ValueType& other,
00323                 const ShapeType& otherShape,
00324                                 ValueType::size_type otherOffset,
00325                                 const RegionLoopRangeType& region);
00326 
00327 
00343    void
00344    pointToStream(std::ostream& os, const ValueType::ElementType* data,const ShapeType& shape, int offset, bool needsep=true, const std::string& sep=",");
00345 
00354    std::string
00355    pointToString(const ValueType& data,const ShapeType& shape, int offset, const std::string& prefix);
00356 
00357 
00367    void copyPoint(ValueType& dest, ValueType::size_type doffset, ValueType::size_type nvals, const ValueType& src, ValueType::size_type soffset);
00368 
00369  }   // End of namespace DataTypes
00370 
00371 
00372 } // End of namespace escript
00373 
00374 #endif
00375