escript
Revision_
|
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