escript  Revision_
AbstractDomain.h
Go to the documentation of this file.
00001 
00002 /*****************************************************************************
00003 *
00004 * Copyright (c) 2003-2014 by University of Queensland
00005 * http://www.uq.edu.au
00006 *
00007 * Primary Business: Queensland, Australia
00008 * Licensed under the Open Software License version 3.0
00009 * http://www.opensource.org/licenses/osl-3.0.php
00010 *
00011 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
00012 * Development 2012-2013 by School of Earth Sciences
00013 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
00014 *
00015 *****************************************************************************/
00016 
00017 
00018 #if !defined escript_AbstractDomain_20040609_H
00019 #define escript_AbstractDomain_20040609_H
00020 
00021 #ifdef BADPYTHONMACROS
00022 // This hack is required for BSD/OSX builds with python 2.7
00023 // (and possibly others).  It must be the first include.
00024 // From bug reports online it seems that python redefines
00025 // some c macros that are functions in c++.
00026 // c++ doesn't like that!
00027 #include <Python.h>
00028 #undef BADPYTHONMACROS
00029 #endif
00030 
00031 
00032 #include "system_dep.h"
00033 
00034 #include <vector>
00035 #include <string>
00036 #include <map>
00037 #include <boost/python/dict.hpp>
00038 #include <boost/python/list.hpp>
00039 #include "esysUtils/Esys_MPI.h"
00040 
00041 
00042 #include "Pointers.h"
00043 #include "DataTypes.h"
00044 
00045 namespace escript {
00046 // class forward declarations
00047 class Data;
00048 class FunctionSpace;
00057 class AbstractDomain;
00058 
00059 typedef POINTER_WRAPPER_CLASS(AbstractDomain) Domain_ptr;
00060 typedef POINTER_WRAPPER_CLASS(const AbstractDomain) const_Domain_ptr;
00061 
00062 class AbstractDomain : public REFCOUNT_BASE_CLASS(AbstractDomain){
00063 
00064  public:
00065 
00072    ESCRIPT_DLL_API
00073    Domain_ptr getPtr();
00074    ESCRIPT_DLL_API
00075    const_Domain_ptr getPtr() const; 
00076 
00077    // structure holding values for X, size and normal
00078    typedef int StatusType;
00079    struct ValueBuffer
00080    {
00081        StatusType m_status;
00082        boost::shared_ptr<Data> m_data;
00083    };
00084    typedef struct ValueBuffer ValueBuffer;
00085 
00086    // 
00087    // map from function space type code to value buffer
00088    typedef std::map<int, ValueBuffer> BufferMapType;
00089 
00090 
00111   ESCRIPT_DLL_API
00112   AbstractDomain();
00113 
00121   ESCRIPT_DLL_API
00122   virtual ~AbstractDomain();
00123 
00128   ESCRIPT_DLL_API
00129   virtual int getMPISize() const;
00135   ESCRIPT_DLL_API
00136   virtual int getMPIRank() const;
00137 
00143   ESCRIPT_DLL_API
00144   virtual void MPIBarrier() const;
00150   ESCRIPT_DLL_API
00151   virtual bool onMasterProcessor() const;
00152 
00158   ESCRIPT_DLL_API
00159   virtual
00160 #ifdef ESYS_MPI
00161   MPI_Comm
00162 #else
00163   unsigned int
00164 #endif
00165   getMPIComm() const;
00166 
00172   ESCRIPT_DLL_API
00173   virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
00174 
00179   ESCRIPT_DLL_API
00180   virtual std::string getDescription() const;
00181 
00186   ESCRIPT_DLL_API
00187   virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
00188 
00195   ESCRIPT_DLL_API
00196   virtual int getDim() const;
00197 
00202   ESCRIPT_DLL_API
00203   virtual bool operator==(const AbstractDomain& other) const;
00204   ESCRIPT_DLL_API
00205   virtual bool operator!=(const AbstractDomain& other) const;
00206 
00213   ESCRIPT_DLL_API
00214   virtual void write(const std::string& filename) const;
00215 
00222   ESCRIPT_DLL_API
00223   virtual void dump(const std::string& filename) const;
00224 
00234   ESCRIPT_DLL_API
00235   virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
00236 
00243   ESCRIPT_DLL_API
00244   virtual int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
00245 
00252   ESCRIPT_DLL_API
00253   virtual void setTagMap(const std::string& name,  int tag);
00254 
00260   ESCRIPT_DLL_API
00261   virtual int getTag(const std::string& name) const;
00262 
00268   ESCRIPT_DLL_API
00269   virtual bool isValidTagName(const std::string& name) const;
00270 
00275   ESCRIPT_DLL_API
00276   virtual std::string showTagNames() const;
00277 
00283   ESCRIPT_DLL_API
00284   virtual const int* borrowSampleReferenceIDs(int functionSpaceType) const;
00285 
00292   ESCRIPT_DLL_API
00293   virtual void setNewX(const escript::Data& arg);
00294 
00301   ESCRIPT_DLL_API
00302   virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
00303 
00307   ESCRIPT_DLL_API
00308   virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00309 
00317   virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00318 
00324   ESCRIPT_DLL_API
00325   virtual
00326   bool
00327   commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
00328 
00335   ESCRIPT_DLL_API
00336   virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
00337   ESCRIPT_DLL_API
00338   virtual bool probeInterpolationACross(int functionSpaceType_source,const AbstractDomain& targetDomain, int functionSpaceType_target) const;
00339 
00344   ESCRIPT_DLL_API
00345   virtual escript::Data getX() const;
00346 
00351   ESCRIPT_DLL_API
00352   virtual escript::Data getNormal() const;
00353 
00358   ESCRIPT_DLL_API
00359   virtual escript::Data getSize() const;
00360   
00369   ESCRIPT_DLL_API
00370   virtual void setToX(escript::Data& out) const;
00371 
00380   ESCRIPT_DLL_API
00381   virtual void setToNormal(escript::Data& out) const;
00382 
00391   ESCRIPT_DLL_API
00392   virtual void setToSize(escript::Data& out) const;
00393 
00401   ESCRIPT_DLL_API
00402   virtual void setToGradient(escript::Data& grad, const escript::Data& arg) const;
00403 
00408   ESCRIPT_DLL_API
00409   virtual bool ownSample(int fs_code, index_t id) const;
00410 
00416   ESCRIPT_DLL_API
00417   virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
00418 
00426   ESCRIPT_DLL_API
00427   virtual bool isCellOriented(int functionSpaceCode) const;
00428 
00437   ESCRIPT_DLL_API
00438   virtual StatusType getStatus() const;
00439 
00445   ESCRIPT_DLL_API
00446   void throwStandardException(const std::string& functionName) const;
00447 
00452   ESCRIPT_DLL_API
00453   virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
00454 
00455   ESCRIPT_DLL_API
00456   virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
00457 
00461   ESCRIPT_DLL_API
00462   virtual bool canTag(int functionspacecode) const;
00463 
00468    ESCRIPT_DLL_API
00469    virtual int getApproximationOrder(const int functionSpaceCode) const;
00470 
00471    ESCRIPT_DLL_API
00472    virtual bool supportsContactElements() const;
00473 
00474    
00475 
00479   ESCRIPT_DLL_API
00480   virtual bool supportsFilter(const boost::python::tuple& t) const;
00481   
00485   ESCRIPT_DLL_API
00486   virtual escript::Data randomFill(const DataTypes::ShapeType& shape,
00487        const FunctionSpace& what, long seed, const boost::python::tuple& filter) const=0;   
00488    
00489  protected:
00490 
00491  private:
00492 
00493    // buffer for coordinates used by function spaces
00494    BufferMapType m_x_buffer;
00495 
00496    // buffer for normal vectors used by function spaces
00497    BufferMapType m_normal_buffer;
00498 
00499    // buffer for normal element size used by function spaces
00500    BufferMapType m_size_buffer;
00501 
00502 };
00503 
00504 } // end of namespace
00505 
00506 #endif