ESYS13  Revision_
MeshAdapter.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 finley_MeshAdapter_20040526_H
00016 #define finley_MeshAdapter_20040526_H
00017 #include "system_dep.h"
00018 
00019 extern "C" {
00020 #include "finley/Mesh.h"
00021 #include "finley/Finley.h"
00022 #include "finley/Assemble.h"
00023 #include "esysUtils/Esys_MPI.h"
00024 }
00025 
00026 #include "FinleyError.h"
00027 #include "FinleyAdapterException.h"
00028 
00029 #include <pasowrap/SystemMatrixAdapter.h>
00030 #include <pasowrap/TransportProblemAdapter.h>
00031 #include "escript/AbstractContinuousDomain.h"
00032 #include "escript/FunctionSpace.h"
00033 #include "escript/FunctionSpaceFactory.h"
00034 
00035 #include <boost/shared_ptr.hpp>
00036 #include <boost/python/dict.hpp>
00037 #include <boost/python/extract.hpp>
00038 
00039 #include <map>
00040 #include <vector>
00041 #include <string>
00042 #include <sstream>
00043 
00044 namespace finley {
00045   
00046 // These are friends implemented in MeshAdapterFactory.cpp  
00047 // They are only fwd declared here so that vis.studio will accept the freind decls
00048 FINLEY_DLL_API
00049 escript::Domain_ptr brick(int n0,int n1,int n2,int order,
00050             double l0,double l1,double l2,
00051             int periodic0,int periodic1,
00052             int periodic2,
00053             int integrationOrder,
00054             int reducedIntegrationOrder,
00055             int useElementsOnFace,
00056                     int useFullElementOrder,
00057                      int optimize, 
00058             const std::vector<double>& points,
00059             const std::vector<int>& tags,
00060             const std::map<std::string, int>& tagnamestonums               
00061             );
00062             
00063 FINLEY_DLL_API          
00064 escript::Domain_ptr  rectangle(int n0,int n1,int order,
00065             double l0, double l1,
00066             int periodic0,int periodic1,
00067             int integrationOrder,
00068                         int reducedIntegrationOrder,
00069             int useElementsOnFace,
00070                 int useFullElementOrder,
00071                         int optimize,
00072             const std::vector<double>& points,
00073             const std::vector<int>& tags,
00074             const std::map<std::string, int>& tagnamestonums);    
00075   
00076 }
00077 
00078 
00079 
00080 namespace finley {
00081 
00082   const boost::python::list EmptyPythonList = boost::python::list();
00083 struct null_deleter
00084 {
00085   void operator()(void const *ptr) const
00086   {
00087   }
00088 };
00089 
00090 
00101 class MeshAdapter : public escript::AbstractContinuousDomain {
00102 
00103  public:
00104 
00105   //
00106   // Codes for function space types supported
00107   static const int DegreesOfFreedom;
00108   static const int ReducedDegreesOfFreedom;
00109   static const int Nodes;
00110   static const int ReducedNodes;
00111   static const int Elements;
00112   static const int ReducedElements;
00113   static const int FaceElements;
00114   static const int ReducedFaceElements;
00115   static const int Points;
00116   static const int ContactElementsZero;
00117   static const int ReducedContactElementsZero;
00118   static const int ContactElementsOne;
00119   static const int ReducedContactElementsOne;
00120 
00139   FINLEY_DLL_API
00140   MeshAdapter(Finley_Mesh* finleyMesh=0);
00141 
00146   FINLEY_DLL_API
00147   MeshAdapter(const MeshAdapter& in);
00148 
00155   FINLEY_DLL_API
00156   ~MeshAdapter();
00157 
00162   FINLEY_DLL_API
00163   virtual int getMPISize() const;
00169   FINLEY_DLL_API
00170   virtual int getMPIRank() const;
00171 
00177   FINLEY_DLL_API
00178   virtual void MPIBarrier() const;
00179 
00185   FINLEY_DLL_API
00186   virtual bool onMasterProcessor() const;
00187 
00188   FINLEY_DLL_API
00189 #ifdef ESYS_MPI
00190   MPI_Comm
00191 #else
00192   unsigned int
00193 #endif
00194   getMPIComm() const;
00195 
00201   FINLEY_DLL_API
00202   void write(const std::string& fileName) const;
00203 
00208   FINLEY_DLL_API
00209   void Print_Mesh_Info(const bool full=false) const;
00210 
00216   FINLEY_DLL_API
00217   void dump(const std::string& fileName) const;
00218 
00223   FINLEY_DLL_API
00224   Finley_Mesh* getFinley_Mesh() const;
00225 
00232   FINLEY_DLL_API
00233   int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
00234 
00240   FINLEY_DLL_API
00241   const int* borrowSampleReferenceIDs(int functionSpaceType) const;
00242 
00248   FINLEY_DLL_API
00249   virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
00250 
00255   FINLEY_DLL_API
00256   virtual std::string getDescription() const;
00257 
00262   FINLEY_DLL_API
00263   virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
00264 
00269   FINLEY_DLL_API
00270   void setFunctionSpaceTypeNames();
00271 
00276   FINLEY_DLL_API
00277   virtual int getContinuousFunctionCode() const;
00278 
00283   FINLEY_DLL_API
00284   virtual int getReducedContinuousFunctionCode() const;
00285 
00290   FINLEY_DLL_API
00291   virtual int getFunctionCode() const;
00292 
00297   FINLEY_DLL_API
00298   virtual int getReducedFunctionCode() const;
00299 
00304   FINLEY_DLL_API
00305   virtual int getFunctionOnBoundaryCode() const;
00306 
00311   FINLEY_DLL_API
00312   virtual int getReducedFunctionOnBoundaryCode() const;
00313 
00318   FINLEY_DLL_API
00319   virtual int getFunctionOnContactZeroCode() const;
00320 
00325   FINLEY_DLL_API
00326   virtual int getReducedFunctionOnContactZeroCode() const;
00327 
00332   FINLEY_DLL_API
00333   virtual int getFunctionOnContactOneCode() const;
00334 
00339   FINLEY_DLL_API
00340   virtual int getReducedFunctionOnContactOneCode() const;
00341 
00346   FINLEY_DLL_API
00347   virtual int getSolutionCode() const;
00348 
00353   FINLEY_DLL_API
00354   virtual int getReducedSolutionCode() const;
00355 
00360   FINLEY_DLL_API
00361   virtual int getDiracDeltaFunctionsCode() const;
00362 
00367   typedef std::map<int, std::string> FunctionSpaceNamesMapType;
00368 
00372   FINLEY_DLL_API
00373   virtual int getDim() const;
00374 
00383   FINLEY_DLL_API
00384   virtual StatusType getStatus() const;
00385 
00386 
00391   FINLEY_DLL_API
00392   virtual int getNumDataPointsGlobal() const;
00393 
00399   FINLEY_DLL_API
00400   virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
00401 
00407   FINLEY_DLL_API
00408   virtual void setToX(escript::Data& arg) const;
00409 
00416   FINLEY_DLL_API
00417   virtual void setTagMap(const std::string& name,  int tag);
00418 
00424   FINLEY_DLL_API
00425   virtual int getTag(const std::string& name) const;
00426 
00432   FINLEY_DLL_API
00433   virtual bool isValidTagName(const std::string& name) const;
00434 
00439   FINLEY_DLL_API
00440   virtual std::string showTagNames() const;
00441 
00446   FINLEY_DLL_API
00447   virtual void setNewX(const escript::Data& arg);
00448 
00453   FINLEY_DLL_API
00454   virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
00455 
00456 
00457   FINLEY_DLL_API
00458   virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00459 
00464   FINLEY_DLL_API
00465   bool
00466   commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
00467 
00473   FINLEY_DLL_API
00474   virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
00475 
00480   FINLEY_DLL_API
00481   virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
00482 
00488   FINLEY_DLL_API
00489   virtual void setToNormal(escript::Data& out) const;
00490 
00496   FINLEY_DLL_API
00497   virtual void setToSize(escript::Data& out) const;
00498 
00504   FINLEY_DLL_API
00505   virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
00506 
00512   FINLEY_DLL_API
00513   virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
00514 
00524   FINLEY_DLL_API
00525   virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00526 
00536   FINLEY_DLL_API
00537   virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00538 
00544   FINLEY_DLL_API
00545   virtual bool isCellOriented(int functionSpaceCode) const;
00546 
00553   FINLEY_DLL_API
00554   virtual void saveDX(const std::string& filename,const boost::python::dict& arg) const;
00555 
00556 
00563   FINLEY_DLL_API
00564   virtual void saveVTK(const std::string& filename,const boost::python::dict& arg,  const std::string& metadata, const std::string& metadata_schema) const;
00565 
00566   FINLEY_DLL_API
00567   virtual bool ownSample(int fs_code, index_t id) const;
00568 
00574   // vtkObject createVtkObject(int functionSpaceCode) const;
00575 
00580   FINLEY_DLL_API
00581   virtual void addPDEToSystem(
00582                      escript::AbstractSystemMatrix& mat, escript::Data& rhs,
00583                      const escript::Data& A, const escript::Data& B, const escript::Data& C, 
00584                      const escript::Data& D, const escript::Data& X, const escript::Data& Y,
00585                      const escript::Data& d, const escript::Data& y,
00586                      const escript::Data& d_contact, const escript::Data& y_contact,
00587                      const escript::Data& d_dirac, const escript::Data& y_dirac) const;
00592   FINLEY_DLL_API
00593   virtual void addPDEToLumpedSystem(
00594                      escript::Data& mat,
00595                      const escript::Data& D, 
00596                      const escript::Data& d,
00597                      const escript::Data& d_dirac,
00598              const bool useHRZ) const;
00599 
00604   FINLEY_DLL_API
00605   virtual void addPDEToRHS(escript::Data& rhs,
00606                      const escript::Data& X, const escript::Data& Y,
00607                      const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
00613   FINLEY_DLL_API
00614   virtual void addPDEToTransportProblem(
00615                      escript::AbstractTransportProblem& tp, escript::Data& source, 
00616                      const escript::Data& M,
00617                      const escript::Data& A, const escript::Data& B, const escript::Data& C,const  escript::Data& D,
00618                      const  escript::Data& X,const  escript::Data& Y,
00619                      const escript::Data& d, const escript::Data& y,
00620                      const escript::Data& d_contact,const escript::Data& y_contact, const escript::Data& d_dirac,const escript::Data& y_dirac) const;
00621 
00622 
00627   FINLEY_DLL_API
00628   escript::ASM_ptr newSystemMatrix(
00629                       const int row_blocksize,
00630                       const escript::FunctionSpace& row_functionspace,
00631                       const int column_blocksize,
00632                       const escript::FunctionSpace& column_functionspace,
00633                       const int type) const;
00640   FINLEY_DLL_API
00641   escript::ATP_ptr newTransportProblem(
00642                       const int blocksize,
00643                       const escript::FunctionSpace& functionspace,
00644                       const int type) const;
00645 
00649   FINLEY_DLL_API
00650   virtual escript::Data getX() const;
00651 
00655   FINLEY_DLL_API
00656   virtual escript::Data getNormal() const;
00657 
00661   FINLEY_DLL_API
00662   virtual escript::Data getSize() const;
00663 
00667   FINLEY_DLL_API
00668   virtual bool operator==(const escript::AbstractDomain& other) const;
00669   FINLEY_DLL_API
00670   virtual bool operator!=(const escript::AbstractDomain& other) const;
00671 
00677   FINLEY_DLL_API
00678   virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
00679 
00684   FINLEY_DLL_API
00685   virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
00686 
00687   FINLEY_DLL_API 
00688   virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
00689 
00690 
00694   FINLEY_DLL_API
00695   virtual
00696   bool canTag(int functionSpaceCode) const;
00697 
00702   FINLEY_DLL_API
00703   virtual 
00704   int getApproximationOrder(const int functionSpaceCode) const;
00705 
00706   FINLEY_DLL_API
00707   bool supportsContactElements() const;
00708   
00709   
00710   private:
00711   
00718   FINLEY_DLL_API
00719   void addDiracPoints( const std::vector<double>& points, const std::vector<int>& tags) const;
00720 //  FINLEY_DLL_API
00721 //  void addDiracPoint( const boost::python::list& points, const int tag=-1) const;
00722 //   FINLEY_DLL_API
00723 //   void addDiracPointWithTagName( const boost::python::list& points, const std::string& tag) const;
00724 
00725  protected:
00726 
00727  private:
00728   void extractArgsFromDict(const boost::python::dict& arg, int& numData,
00729                              char**& names, escriptDataC*& data,
00730                              escriptDataC**& dataPtr) const;
00731 
00732   //
00733   // pointer to the externally created finley mesh
00734   boost::shared_ptr<Finley_Mesh> m_finleyMesh;
00735   
00736   // This is only provided so that the friends below can add tags during construction
00737   // do not use for any other purpose
00738   boost::shared_ptr<Finley_Mesh> getMesh()
00739   {
00740       return m_finleyMesh;
00741   }
00742  
00743   static FunctionSpaceNamesMapType m_functionSpaceTypeNames;
00744 
00745   friend escript::Domain_ptr finley::brick(int n0,int n1,int n2,int order,
00746             double l0,double l1,double l2,
00747             int periodic0,int periodic1,
00748             int periodic2,
00749             int integrationOrder,
00750             int reducedIntegrationOrder,
00751             int useElementsOnFace,
00752                     int useFullElementOrder,
00753                      int optimize, 
00754             const std::vector<double>& points,
00755             const std::vector<int>& tags,
00756             const std::map<std::string, int>& tagnamestonums               
00757             );
00758             
00759             
00760 friend   escript::Domain_ptr  finley::rectangle(int n0,int n1,int order,
00761             double l0, double l1,
00762             int periodic0,int periodic1,
00763             int integrationOrder,
00764                         int reducedIntegrationOrder,
00765             int useElementsOnFace,
00766                 int useFullElementOrder,
00767                         int optimize,
00768             const std::vector<double>& points,
00769             const std::vector<int>& tags,
00770             const std::map<std::string, int>& tagnamestonums);                      
00771 };
00772 
00773 // Do not use this class. It is a convenience wrapper for the dataexporter.
00774 class FINLEY_DLL_API ReferenceElementSetWrapper {
00775  public:
00776   ReferenceElementSetWrapper(Finley_ElementTypeId id, index_t order,
00777                              index_t reducedOrder);
00778   ~ReferenceElementSetWrapper();
00779 
00780   Finley_ReferenceElementSet* getElementSet() const { return m_refSet; }
00781 
00782  private:
00783   Finley_ReferenceElementSet* m_refSet;
00784 };
00785 
00786 
00787 } // end of namespace
00788 
00789 #endif