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