00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
00047
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
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
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
00721
00722
00723
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
00734 boost::shared_ptr<Finley_Mesh> m_finleyMesh;
00735
00736
00737
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
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 }
00788
00789 #endif