escript  Revision_
MeshAdapter.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 dudley_MeshAdapter_20040526_H
00019 #define dudley_MeshAdapter_20040526_H
00020 #include "system_dep.h"
00021 
00022 #include "dudley/Mesh.h"
00023 #include "dudley/Dudley.h"
00024 #include "dudley/Assemble.h"
00025 #include "esysUtils/Esys_MPI.h"
00026 
00027 #include "DudleyError.h"
00028 #include "DudleyAdapterException.h"
00029 
00030 #include <pasowrap/SystemMatrixAdapter.h>
00031 #include <pasowrap/TransportProblemAdapter.h>
00032 #include "escript/AbstractContinuousDomain.h"
00033 #include "escript/FunctionSpace.h"
00034 #include "escript/FunctionSpaceFactory.h"
00035 
00036 #include <boost/shared_ptr.hpp>
00037 #include <boost/python/dict.hpp>
00038 #include <boost/python/extract.hpp>
00039 
00040 #include <map>
00041 #include <vector>
00042 #include <string>
00043 #include <sstream>
00044 
00045 namespace dudley {
00046 
00047 struct null_deleter
00048 {
00049   void operator()(void const *ptr) const
00050   {
00051   }
00052 };
00053 
00054 
00065 class MeshAdapter : public escript::AbstractContinuousDomain {
00066 
00067  public:
00068 
00069   //
00070   // Codes for function space types supported
00071   static const int DegreesOfFreedom;
00072   static const int ReducedDegreesOfFreedom;
00073   static const int Nodes;
00074   static const int ReducedNodes;
00075   static const int Elements;
00076   static const int ReducedElements;
00077   static const int FaceElements;
00078   static const int ReducedFaceElements;
00079   static const int Points;
00080   static const int ContactElementsZero;
00081   static const int ReducedContactElementsZero;
00082   static const int ContactElementsOne;
00083   static const int ReducedContactElementsOne;
00084 
00103   DUDLEY_DLL_API
00104   MeshAdapter(Dudley_Mesh* dudleyMesh=0);
00105 
00110   DUDLEY_DLL_API
00111   MeshAdapter(const MeshAdapter& in);
00112 
00119   DUDLEY_DLL_API
00120   ~MeshAdapter();
00121 
00126   DUDLEY_DLL_API
00127   virtual int getMPISize() const;
00133   DUDLEY_DLL_API
00134   virtual int getMPIRank() const;
00135 
00141   DUDLEY_DLL_API
00142   virtual void MPIBarrier() const;
00143 
00149   DUDLEY_DLL_API
00150   virtual bool onMasterProcessor() const;
00151 
00152   DUDLEY_DLL_API
00153 #ifdef ESYS_MPI
00154   MPI_Comm
00155 #else
00156   unsigned int
00157 #endif
00158   getMPIComm() const;
00159 
00160 
00166   DUDLEY_DLL_API
00167   void write(const std::string& fileName) const;
00168 
00173   DUDLEY_DLL_API
00174   void Print_Mesh_Info(const bool full=false) const;
00175 
00181   DUDLEY_DLL_API
00182   void dump(const std::string& fileName) const;
00183 
00188   DUDLEY_DLL_API
00189   Dudley_Mesh* getDudley_Mesh() const;
00190 
00197   DUDLEY_DLL_API
00198   int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
00199 
00205   DUDLEY_DLL_API
00206   const int* borrowSampleReferenceIDs(int functionSpaceType) const;
00207 
00213   DUDLEY_DLL_API
00214   virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
00215 
00220   DUDLEY_DLL_API
00221   virtual std::string getDescription() const;
00222 
00227   DUDLEY_DLL_API
00228   virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
00229 
00234   DUDLEY_DLL_API
00235   void setFunctionSpaceTypeNames();
00236 
00241   DUDLEY_DLL_API
00242   virtual int getContinuousFunctionCode() const;
00243 
00248   DUDLEY_DLL_API
00249   virtual int getReducedContinuousFunctionCode() const;
00250 
00255   DUDLEY_DLL_API
00256   virtual int getFunctionCode() const;
00257 
00262   DUDLEY_DLL_API
00263   virtual int getReducedFunctionCode() const;
00264 
00269   DUDLEY_DLL_API
00270   virtual int getFunctionOnBoundaryCode() const;
00271 
00276   DUDLEY_DLL_API
00277   virtual int getReducedFunctionOnBoundaryCode() const;
00278 
00283   DUDLEY_DLL_API
00284   virtual int getFunctionOnContactZeroCode() const;
00285 
00290   DUDLEY_DLL_API
00291   virtual int getReducedFunctionOnContactZeroCode() const;
00292 
00297   DUDLEY_DLL_API
00298   virtual int getFunctionOnContactOneCode() const;
00299 
00304   DUDLEY_DLL_API
00305   virtual int getReducedFunctionOnContactOneCode() const;
00306 
00311   DUDLEY_DLL_API
00312   virtual int getSolutionCode() const;
00313 
00318   DUDLEY_DLL_API
00319   virtual int getReducedSolutionCode() const;
00320 
00325   DUDLEY_DLL_API
00326   virtual int getDiracDeltaFunctionsCode() const;
00327 
00332   typedef std::map<int, std::string> FunctionSpaceNamesMapType;
00333 
00337   DUDLEY_DLL_API
00338   virtual int getDim() const;
00339 
00348   DUDLEY_DLL_API
00349   virtual StatusType getStatus() const;
00350 
00351 
00356   DUDLEY_DLL_API
00357   virtual int getNumDataPointsGlobal() const;
00358 
00364   DUDLEY_DLL_API
00365   virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
00366 
00372   DUDLEY_DLL_API
00373   virtual void setToX(escript::Data& arg) const;
00374 
00381   DUDLEY_DLL_API
00382   virtual void setTagMap(const std::string& name,  int tag);
00383 
00389   DUDLEY_DLL_API
00390   virtual int getTag(const std::string& name) const;
00391 
00397   DUDLEY_DLL_API
00398   virtual bool isValidTagName(const std::string& name) const;
00399 
00404   DUDLEY_DLL_API
00405   virtual std::string showTagNames() const;
00406 
00411   DUDLEY_DLL_API
00412   virtual void setNewX(const escript::Data& arg);
00413 
00418   DUDLEY_DLL_API
00419   virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
00420 
00421 
00422   DUDLEY_DLL_API
00423   virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00424 
00425   DUDLEY_DLL_API
00426   virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00427 
00428 
00433   DUDLEY_DLL_API
00434   bool
00435   commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
00436 
00442   DUDLEY_DLL_API
00443   virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
00444 
00449   DUDLEY_DLL_API
00450   virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
00451 
00457   DUDLEY_DLL_API
00458   virtual void setToNormal(escript::Data& out) const;
00459 
00465   DUDLEY_DLL_API
00466   virtual void setToSize(escript::Data& out) const;
00467 
00473   DUDLEY_DLL_API
00474   virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
00475 
00481   DUDLEY_DLL_API
00482   virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
00483 
00493   DUDLEY_DLL_API
00494   virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00495 
00505   DUDLEY_DLL_API
00506   virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00507 
00513   DUDLEY_DLL_API
00514   virtual bool isCellOriented(int functionSpaceCode) const;
00515 
00516   DUDLEY_DLL_API
00517   virtual bool ownSample(int fs_code, index_t id) const;
00518 
00523   DUDLEY_DLL_API
00524   virtual void addPDEToSystem(
00525                      escript::AbstractSystemMatrix& mat, escript::Data& rhs,
00526                      const escript::Data& A, const escript::Data& B, const escript::Data& C, 
00527                      const escript::Data& D, const escript::Data& X, const escript::Data& Y,
00528                      const escript::Data& d, const escript::Data& y, 
00529              const escript::Data& d_contact, const escript::Data& y_contact,
00530                      const escript::Data& d_dirac, const escript::Data& y_dirac) const;
00531 
00532 
00537   DUDLEY_DLL_API
00538   virtual void addPDEToLumpedSystem(
00539                      escript::Data& mat,
00540                      const escript::Data& D, 
00541                      const escript::Data& d,
00542                      const escript::Data& d_dirac,
00543                      const bool useHRZ) const;
00544 
00549   DUDLEY_DLL_API
00550   virtual void addPDEToRHS(escript::Data& rhs,
00551                      const escript::Data& X, const escript::Data& Y,
00552                      const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
00558   DUDLEY_DLL_API
00559   virtual void addPDEToTransportProblem(
00560                      escript::AbstractTransportProblem& tp, escript::Data& source, 
00561                      const escript::Data& M,
00562                      const escript::Data& A, const escript::Data& B, const escript::Data& C,const  escript::Data& D,
00563                      const  escript::Data& X,const  escript::Data& Y,
00564                      const escript::Data& d, const escript::Data& y,
00565                      const escript::Data& d_contact,const escript::Data& y_contact,
00566                      const escript::Data& d_dirac,const escript::Data& y_dirac) const;
00567 
00568 
00573   DUDLEY_DLL_API
00574   escript::ASM_ptr newSystemMatrix(
00575                       const int row_blocksize,
00576                       const escript::FunctionSpace& row_functionspace,
00577                       const int column_blocksize,
00578                       const escript::FunctionSpace& column_functionspace,
00579                       const int type) const;
00586   DUDLEY_DLL_API
00587   escript::ATP_ptr newTransportProblem(
00588                       const int blocksize,
00589                       const escript::FunctionSpace& functionspace,
00590                       const int type) const;
00591 
00595   DUDLEY_DLL_API
00596   virtual escript::Data getX() const;
00597 
00601   DUDLEY_DLL_API
00602   virtual escript::Data getNormal() const;
00603 
00607   DUDLEY_DLL_API
00608   virtual escript::Data getSize() const;
00609 
00613   DUDLEY_DLL_API
00614   virtual bool operator==(const escript::AbstractDomain& other) const;
00615   DUDLEY_DLL_API
00616   virtual bool operator!=(const escript::AbstractDomain& other) const;
00617 
00623   DUDLEY_DLL_API
00624   virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
00625 
00630   DUDLEY_DLL_API
00631   virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
00632 
00633   DUDLEY_DLL_API 
00634   virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
00635 
00636 
00640   DUDLEY_DLL_API
00641   virtual
00642   bool canTag(int functionSpaceCode) const;
00643 
00648   DUDLEY_DLL_API
00649   virtual 
00650   int getApproximationOrder(const int functionSpaceCode) const;
00651 
00652 
00653   DUDLEY_DLL_API
00654   bool supportsContactElements() const;
00655   
00656       
00657   DUDLEY_DLL_API
00658   virtual escript::Data randomFill(const escript::DataTypes::ShapeType& shape,
00659        const escript::FunctionSpace& what, long seed, const boost::python::tuple& filter) const;         
00660   
00661  protected:
00662 
00663  private:
00664   void extractArgsFromDict(const boost::python::dict& arg, int& numData,
00665                              char**& names, escriptDataC*& data,
00666                              escriptDataC**& dataPtr) const;
00667 
00668   //
00669   // pointer to the externally created dudley mesh
00670   boost::shared_ptr<Dudley_Mesh> m_dudleyMesh;
00671  
00672   static FunctionSpaceNamesMapType m_functionSpaceTypeNames;
00673 
00674 };
00675 
00676 } // end of namespace
00677 
00678 #endif