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 dudley_MeshAdapter_20040526_H
00016 #define dudley_MeshAdapter_20040526_H
00017 #include "system_dep.h"
00018 
00019 extern "C" {
00020 #include "dudley/Mesh.h"
00021 #include "dudley/Dudley.h"
00022 #include "dudley/Assemble.h"
00023 #include "esysUtils/Esys_MPI.h"
00024 }
00025 
00026 #include "DudleyError.h"
00027 #include "DudleyAdapterException.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 dudley {
00045 
00046 struct null_deleter
00047 {
00048   void operator()(void const *ptr) const
00049   {
00050   }
00051 };
00052 
00053 
00064 class MeshAdapter : public escript::AbstractContinuousDomain {
00065 
00066  public:
00067 
00068   //
00069   // Codes for function space types supported
00070   static const int DegreesOfFreedom;
00071   static const int ReducedDegreesOfFreedom;
00072   static const int Nodes;
00073   static const int ReducedNodes;
00074   static const int Elements;
00075   static const int ReducedElements;
00076   static const int FaceElements;
00077   static const int ReducedFaceElements;
00078   static const int Points;
00079   static const int ContactElementsZero;
00080   static const int ReducedContactElementsZero;
00081   static const int ContactElementsOne;
00082   static const int ReducedContactElementsOne;
00083 
00102   DUDLEY_DLL_API
00103   MeshAdapter(Dudley_Mesh* dudleyMesh=0);
00104 
00109   DUDLEY_DLL_API
00110   MeshAdapter(const MeshAdapter& in);
00111 
00118   DUDLEY_DLL_API
00119   ~MeshAdapter();
00120 
00125   DUDLEY_DLL_API
00126   virtual int getMPISize() const;
00132   DUDLEY_DLL_API
00133   virtual int getMPIRank() const;
00134 
00140   DUDLEY_DLL_API
00141   virtual void MPIBarrier() const;
00142 
00148   DUDLEY_DLL_API
00149   virtual bool onMasterProcessor() const;
00150 
00151   DUDLEY_DLL_API
00152 #ifdef ESYS_MPI
00153   MPI_Comm
00154 #else
00155   unsigned int
00156 #endif
00157   getMPIComm() const;
00158 
00159 
00165   DUDLEY_DLL_API
00166   void write(const std::string& fileName) const;
00167 
00172   DUDLEY_DLL_API
00173   void Print_Mesh_Info(const bool full=false) const;
00174 
00180   DUDLEY_DLL_API
00181   void dump(const std::string& fileName) const;
00182 
00187   DUDLEY_DLL_API
00188   Dudley_Mesh* getDudley_Mesh() const;
00189 
00196   DUDLEY_DLL_API
00197   int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
00198 
00204   DUDLEY_DLL_API
00205   const int* borrowSampleReferenceIDs(int functionSpaceType) const;
00206 
00212   DUDLEY_DLL_API
00213   virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
00214 
00219   DUDLEY_DLL_API
00220   virtual std::string getDescription() const;
00221 
00226   DUDLEY_DLL_API
00227   virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
00228 
00233   DUDLEY_DLL_API
00234   void setFunctionSpaceTypeNames();
00235 
00240   DUDLEY_DLL_API
00241   virtual int getContinuousFunctionCode() const;
00242 
00247   DUDLEY_DLL_API
00248   virtual int getReducedContinuousFunctionCode() const;
00249 
00254   DUDLEY_DLL_API
00255   virtual int getFunctionCode() const;
00256 
00261   DUDLEY_DLL_API
00262   virtual int getReducedFunctionCode() const;
00263 
00268   DUDLEY_DLL_API
00269   virtual int getFunctionOnBoundaryCode() const;
00270 
00275   DUDLEY_DLL_API
00276   virtual int getReducedFunctionOnBoundaryCode() const;
00277 
00282   DUDLEY_DLL_API
00283   virtual int getFunctionOnContactZeroCode() const;
00284 
00289   DUDLEY_DLL_API
00290   virtual int getReducedFunctionOnContactZeroCode() const;
00291 
00296   DUDLEY_DLL_API
00297   virtual int getFunctionOnContactOneCode() const;
00298 
00303   DUDLEY_DLL_API
00304   virtual int getReducedFunctionOnContactOneCode() const;
00305 
00310   DUDLEY_DLL_API
00311   virtual int getSolutionCode() const;
00312 
00317   DUDLEY_DLL_API
00318   virtual int getReducedSolutionCode() const;
00319 
00324   DUDLEY_DLL_API
00325   virtual int getDiracDeltaFunctionsCode() const;
00326 
00331   typedef std::map<int, std::string> FunctionSpaceNamesMapType;
00332 
00336   DUDLEY_DLL_API
00337   virtual int getDim() const;
00338 
00347   DUDLEY_DLL_API
00348   virtual StatusType getStatus() const;
00349 
00350 
00355   DUDLEY_DLL_API
00356   virtual int getNumDataPointsGlobal() const;
00357 
00363   DUDLEY_DLL_API
00364   virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
00365 
00371   DUDLEY_DLL_API
00372   virtual void setToX(escript::Data& arg) const;
00373 
00380   DUDLEY_DLL_API
00381   virtual void setTagMap(const std::string& name,  int tag);
00382 
00388   DUDLEY_DLL_API
00389   virtual int getTag(const std::string& name) const;
00390 
00396   DUDLEY_DLL_API
00397   virtual bool isValidTagName(const std::string& name) const;
00398 
00403   DUDLEY_DLL_API
00404   virtual std::string showTagNames() const;
00405 
00410   DUDLEY_DLL_API
00411   virtual void setNewX(const escript::Data& arg);
00412 
00417   DUDLEY_DLL_API
00418   virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
00419 
00420 
00421   DUDLEY_DLL_API
00422   virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00423 
00428   DUDLEY_DLL_API
00429   bool
00430   commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
00431 
00437   DUDLEY_DLL_API
00438   virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
00439 
00444   DUDLEY_DLL_API
00445   virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
00446 
00452   DUDLEY_DLL_API
00453   virtual void setToNormal(escript::Data& out) const;
00454 
00460   DUDLEY_DLL_API
00461   virtual void setToSize(escript::Data& out) const;
00462 
00468   DUDLEY_DLL_API
00469   virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
00470 
00476   DUDLEY_DLL_API
00477   virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
00478 
00488   DUDLEY_DLL_API
00489   virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00490 
00500   DUDLEY_DLL_API
00501   virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00502 
00508   DUDLEY_DLL_API
00509   virtual bool isCellOriented(int functionSpaceCode) const;
00510 
00517   DUDLEY_DLL_API
00518   virtual void saveDX(const std::string& filename,const boost::python::dict& arg) const;
00519 
00520 
00521   DUDLEY_DLL_API
00522   virtual bool ownSample(int fs_code, index_t id) const;
00523 
00529   // vtkObject createVtkObject(int functionSpaceCode) const;
00530 
00535   DUDLEY_DLL_API
00536   virtual void addPDEToSystem(
00537                      escript::AbstractSystemMatrix& mat, escript::Data& rhs,
00538                      const escript::Data& A, const escript::Data& B, const escript::Data& C, 
00539                      const escript::Data& D, const escript::Data& X, const escript::Data& Y,
00540                      const escript::Data& d, const escript::Data& y, 
00541              const escript::Data& d_contact, const escript::Data& y_contact,
00542                      const escript::Data& d_dirac, const escript::Data& y_dirac) const;
00543 
00544 
00549   DUDLEY_DLL_API
00550   virtual void addPDEToLumpedSystem(
00551                      escript::Data& mat,
00552                      const escript::Data& D, 
00553                      const escript::Data& d,
00554                      const escript::Data& d_dirac,
00555                      const bool useHRZ) const;
00556 
00561   DUDLEY_DLL_API
00562   virtual void addPDEToRHS(escript::Data& rhs,
00563                      const escript::Data& X, const escript::Data& Y,
00564                      const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
00570   DUDLEY_DLL_API
00571   virtual void addPDEToTransportProblem(
00572                      escript::AbstractTransportProblem& tp, escript::Data& source, 
00573                      const escript::Data& M,
00574                      const escript::Data& A, const escript::Data& B, const escript::Data& C,const  escript::Data& D,
00575                      const  escript::Data& X,const  escript::Data& Y,
00576                      const escript::Data& d, const escript::Data& y,
00577                      const escript::Data& d_contact,const escript::Data& y_contact,
00578                      const escript::Data& d_dirac,const escript::Data& y_dirac) const;
00579 
00580 
00585   DUDLEY_DLL_API
00586   escript::ASM_ptr newSystemMatrix(
00587                       const int row_blocksize,
00588                       const escript::FunctionSpace& row_functionspace,
00589                       const int column_blocksize,
00590                       const escript::FunctionSpace& column_functionspace,
00591                       const int type) const;
00598   DUDLEY_DLL_API
00599   escript::ATP_ptr newTransportProblem(
00600                       const int blocksize,
00601                       const escript::FunctionSpace& functionspace,
00602                       const int type) const;
00603 
00607   DUDLEY_DLL_API
00608   virtual escript::Data getX() const;
00609 
00613   DUDLEY_DLL_API
00614   virtual escript::Data getNormal() const;
00615 
00619   DUDLEY_DLL_API
00620   virtual escript::Data getSize() const;
00621 
00625   DUDLEY_DLL_API
00626   virtual bool operator==(const escript::AbstractDomain& other) const;
00627   DUDLEY_DLL_API
00628   virtual bool operator!=(const escript::AbstractDomain& other) const;
00629 
00635   DUDLEY_DLL_API
00636   virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
00637 
00642   DUDLEY_DLL_API
00643   virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
00644 
00645   DUDLEY_DLL_API 
00646   virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
00647 
00648 
00652   DUDLEY_DLL_API
00653   virtual
00654   bool canTag(int functionSpaceCode) const;
00655 
00660   DUDLEY_DLL_API
00661   virtual 
00662   int getApproximationOrder(const int functionSpaceCode) const;
00663 
00664 
00665   DUDLEY_DLL_API
00666   bool supportsContactElements() const;
00667  protected:
00668 
00669  private:
00670   void extractArgsFromDict(const boost::python::dict& arg, int& numData,
00671                              char**& names, escriptDataC*& data,
00672                              escriptDataC**& dataPtr) const;
00673 
00674   //
00675   // pointer to the externally created dudley mesh
00676   boost::shared_ptr<Dudley_Mesh> m_dudleyMesh;
00677  
00678   static FunctionSpaceNamesMapType m_functionSpaceTypeNames;
00679 
00680 };
00681 
00682 } // end of namespace
00683 
00684 #endif