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