00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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
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
00676 boost::shared_ptr<Dudley_Mesh> m_dudleyMesh;
00677
00678 static FunctionSpaceNamesMapType m_functionSpaceTypeNames;
00679
00680 };
00681
00682 }
00683
00684 #endif