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 "../Mesh.h"
00021 #include "../Finley.h"
00022 #include "../Assemble.h"
00023 #include "paso/SystemMatrix.h"
00024 #include "paso/SolverFCT.h"
00025 #include "paso/Paso_MPI.h"
00026 }
00027
00028 #include "FinleyError.h"
00029 #include "FinleyAdapterException.h"
00030
00031 #include "SystemMatrixAdapter.h"
00032 #include "TransportProblemAdapter.h"
00033 #include "escript/AbstractContinuousDomain.h"
00034 #include "escript/FunctionSpace.h"
00035 #include "escript/FunctionSpaceFactory.h"
00036
00037 #include <boost/shared_ptr.hpp>
00038 #include <boost/python/dict.hpp>
00039 #include <boost/python/extract.hpp>
00040
00041 #include <map>
00042 #include <vector>
00043 #include <string>
00044 #include <sstream>
00045
00046
00047
00048 class Data;
00049
00050
00051
00052 namespace finley {
00053
00054 struct null_deleter
00055 {
00056 void operator()(void const *ptr) const
00057 {
00058 }
00059 };
00060
00061
00072 class MeshAdapter : public escript::AbstractContinuousDomain {
00073
00074 public:
00075
00076
00077
00078 static const int DegreesOfFreedom;
00079 static const int ReducedDegreesOfFreedom;
00080 static const int Nodes;
00081 static const int ReducedNodes;
00082 static const int Elements;
00083 static const int ReducedElements;
00084 static const int FaceElements;
00085 static const int ReducedFaceElements;
00086 static const int Points;
00087 static const int ContactElementsZero;
00088 static const int ReducedContactElementsZero;
00089 static const int ContactElementsOne;
00090 static const int ReducedContactElementsOne;
00091
00110 FINLEY_DLL_API
00111 MeshAdapter(Finley_Mesh* finleyMesh=0);
00112
00117 FINLEY_DLL_API
00118 MeshAdapter(const MeshAdapter& in);
00119
00126 FINLEY_DLL_API
00127 ~MeshAdapter();
00128
00133 FINLEY_DLL_API
00134 virtual int getMPISize() const;
00140 FINLEY_DLL_API
00141 virtual int getMPIRank() const;
00142
00148 FINLEY_DLL_API
00149 virtual void MPIBarrier() const;
00150
00156 FINLEY_DLL_API
00157 virtual bool onMasterProcessor() const;
00158
00163 inline const AbstractContinuousDomain& asAbstractContinuousDomain() const
00164 {
00165 return *(static_cast<const AbstractContinuousDomain*>(this));
00166 }
00167
00172 inline const AbstractDomain& asAbstractDomain() const
00173 {
00174 return *(static_cast<const AbstractDomain*>(this));
00175 }
00176
00182 FINLEY_DLL_API
00183 void write(const std::string& fileName) const;
00184
00189 FINLEY_DLL_API
00190 void Print_Mesh_Info(const bool full=false) const;
00191
00197 FINLEY_DLL_API
00198 void dump(const std::string& fileName) const;
00199
00204 FINLEY_DLL_API
00205 Finley_Mesh* getFinley_Mesh() const;
00206
00213 FINLEY_DLL_API
00214 int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
00215
00221 FINLEY_DLL_API
00222 const int* borrowSampleReferenceIDs(int functionSpaceType) const;
00223
00229 FINLEY_DLL_API
00230 virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
00231
00236 FINLEY_DLL_API
00237 virtual std::string getDescription() const;
00238
00243 FINLEY_DLL_API
00244 virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
00245
00250 FINLEY_DLL_API
00251 void setFunctionSpaceTypeNames();
00252
00257 FINLEY_DLL_API
00258 virtual int getContinuousFunctionCode() const;
00259
00264 FINLEY_DLL_API
00265 virtual int getReducedContinuousFunctionCode() const;
00266
00271 FINLEY_DLL_API
00272 virtual int getFunctionCode() const;
00273
00278 FINLEY_DLL_API
00279 virtual int getReducedFunctionCode() const;
00280
00285 FINLEY_DLL_API
00286 virtual int getFunctionOnBoundaryCode() const;
00287
00292 FINLEY_DLL_API
00293 virtual int getReducedFunctionOnBoundaryCode() const;
00294
00299 FINLEY_DLL_API
00300 virtual int getFunctionOnContactZeroCode() const;
00301
00306 FINLEY_DLL_API
00307 virtual int getReducedFunctionOnContactZeroCode() const;
00308
00313 FINLEY_DLL_API
00314 virtual int getFunctionOnContactOneCode() const;
00315
00320 FINLEY_DLL_API
00321 virtual int getReducedFunctionOnContactOneCode() const;
00322
00327 FINLEY_DLL_API
00328 virtual int getSolutionCode() const;
00329
00334 FINLEY_DLL_API
00335 virtual int getReducedSolutionCode() const;
00336
00341 FINLEY_DLL_API
00342 virtual int getDiracDeltaFunctionCode() const;
00343
00348 typedef std::map<int, std::string> FunctionSpaceNamesMapType;
00349
00353 FINLEY_DLL_API
00354 virtual int getDim() const;
00355
00364 FINLEY_DLL_API
00365 virtual StatusType getStatus() const;
00366
00367
00372 FINLEY_DLL_API
00373 virtual int getNumDataPointsGlobal() const;
00374
00380 FINLEY_DLL_API
00381 virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
00382
00388 FINLEY_DLL_API
00389 virtual void setToX(escript::Data& arg) const;
00390
00397 FINLEY_DLL_API
00398 virtual void setTagMap(const std::string& name, int tag);
00399
00405 FINLEY_DLL_API
00406 virtual int getTag(const std::string& name) const;
00407
00413 FINLEY_DLL_API
00414 virtual bool isValidTagName(const std::string& name) const;
00415
00420 FINLEY_DLL_API
00421 virtual std::string showTagNames() const;
00422
00427 FINLEY_DLL_API
00428 virtual void setNewX(const escript::Data& arg);
00429
00434 FINLEY_DLL_API
00435 virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
00436
00437
00438 FINLEY_DLL_API
00439 virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
00440
00446 FINLEY_DLL_API
00447 virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
00448
00453 FINLEY_DLL_API
00454 virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
00455
00461 FINLEY_DLL_API
00462 virtual void setToNormal(escript::Data& out) const;
00463
00469 FINLEY_DLL_API
00470 virtual void setToSize(escript::Data& out) const;
00471
00477 FINLEY_DLL_API
00478 virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
00479
00485 FINLEY_DLL_API
00486 virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
00487
00497 FINLEY_DLL_API
00498 virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00499
00509 FINLEY_DLL_API
00510 virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
00511
00517 FINLEY_DLL_API
00518 virtual bool isCellOriented(int functionSpaceCode) const;
00519
00526 FINLEY_DLL_API
00527 virtual void saveDX(const std::string& filename,const boost::python::dict& arg) const;
00528
00529
00536 FINLEY_DLL_API
00537 virtual void saveVTK(const std::string& filename,const boost::python::dict& arg, const std::string& metadata, const std::string& metadata_schema) const;
00538
00544
00545
00550 FINLEY_DLL_API
00551 virtual void addPDEToSystem(
00552 SystemMatrixAdapter& mat, escript::Data& rhs,
00553 const escript::Data& A, const escript::Data& B, const escript::Data& C,
00554 const escript::Data& D, const escript::Data& X, const escript::Data& Y,
00555 const escript::Data& d, const escript::Data& y,
00556 const escript::Data& d_contact, const escript::Data& y_contact) const;
00561 FINLEY_DLL_API
00562 virtual void addPDEToLumpedSystem(
00563 escript::Data& mat,
00564 const escript::Data& D,
00565 const escript::Data& d) const;
00566
00571 FINLEY_DLL_API
00572 virtual void addPDEToRHS(escript::Data& rhs,
00573 const escript::Data& X, const escript::Data& Y,
00574 const escript::Data& y, const escript::Data& y_contact) const;
00580 FINLEY_DLL_API
00581 virtual void addPDEToTransportProblem(
00582 TransportProblemAdapter& tp, escript::Data& source,
00583 const escript::Data& M,
00584 const escript::Data& A, const escript::Data& B, const escript::Data& C,const escript::Data& D,
00585 const escript::Data& X,const escript::Data& Y,
00586 const escript::Data& d, const escript::Data& y,
00587 const escript::Data& d_contact,const escript::Data& y_contact) const;
00588
00589
00594 FINLEY_DLL_API
00595 SystemMatrixAdapter newSystemMatrix(
00596 const int row_blocksize,
00597 const escript::FunctionSpace& row_functionspace,
00598 const int column_blocksize,
00599 const escript::FunctionSpace& column_functionspace,
00600 const int type) const;
00607 FINLEY_DLL_API
00608 TransportProblemAdapter newTransportProblem(
00609 const double theta,
00610 const int blocksize,
00611 const escript::FunctionSpace& functionspace,
00612 const int type) const;
00613
00617 FINLEY_DLL_API
00618 virtual escript::Data getX() const;
00619
00623 FINLEY_DLL_API
00624 virtual escript::Data getNormal() const;
00625
00629 FINLEY_DLL_API
00630 virtual escript::Data getSize() const;
00631
00635 FINLEY_DLL_API
00636 virtual bool operator==(const escript::AbstractDomain& other) const;
00637 FINLEY_DLL_API
00638 virtual bool operator!=(const escript::AbstractDomain& other) const;
00639
00645 FINLEY_DLL_API
00646 virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
00647
00652 FINLEY_DLL_API
00653 virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
00654
00655 FINLEY_DLL_API
00656 virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
00657
00658
00662 FINLEY_DLL_API
00663 virtual
00664 bool canTag(int functionSpaceCode) const;
00665
00666
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
00676 boost::shared_ptr<Finley_Mesh> m_finleyMesh;
00677
00678 static FunctionSpaceNamesMapType m_functionSpaceTypeNames;
00679
00680 };
00681
00682 }
00683
00684 #endif