escript
Revision_
|
00001 00002 /***************************************************************************** 00003 * 00004 * Copyright (c) 2003-2014 by University of Queensland 00005 * http://www.uq.edu.au 00006 * 00007 * Primary Business: Queensland, Australia 00008 * Licensed under the Open Software License version 3.0 00009 * http://www.opensource.org/licenses/osl-3.0.php 00010 * 00011 * Development until 2012 by Earth Systems Science Computational Center (ESSCC) 00012 * Development 2012-2013 by School of Earth Sciences 00013 * Development from 2014 by Centre for Geoscience Computing (GeoComp) 00014 * 00015 *****************************************************************************/ 00016 00017 00018 #if !defined dudley_MeshAdapter_20040526_H 00019 #define dudley_MeshAdapter_20040526_H 00020 #include "system_dep.h" 00021 00022 #include "dudley/Mesh.h" 00023 #include "dudley/Dudley.h" 00024 #include "dudley/Assemble.h" 00025 #include "esysUtils/Esys_MPI.h" 00026 00027 #include "DudleyError.h" 00028 #include "DudleyAdapterException.h" 00029 00030 #include <pasowrap/SystemMatrixAdapter.h> 00031 #include <pasowrap/TransportProblemAdapter.h> 00032 #include "escript/AbstractContinuousDomain.h" 00033 #include "escript/FunctionSpace.h" 00034 #include "escript/FunctionSpaceFactory.h" 00035 00036 #include <boost/shared_ptr.hpp> 00037 #include <boost/python/dict.hpp> 00038 #include <boost/python/extract.hpp> 00039 00040 #include <map> 00041 #include <vector> 00042 #include <string> 00043 #include <sstream> 00044 00045 namespace dudley { 00046 00047 struct null_deleter 00048 { 00049 void operator()(void const *ptr) const 00050 { 00051 } 00052 }; 00053 00054 00065 class MeshAdapter : public escript::AbstractContinuousDomain { 00066 00067 public: 00068 00069 // 00070 // Codes for function space types supported 00071 static const int DegreesOfFreedom; 00072 static const int ReducedDegreesOfFreedom; 00073 static const int Nodes; 00074 static const int ReducedNodes; 00075 static const int Elements; 00076 static const int ReducedElements; 00077 static const int FaceElements; 00078 static const int ReducedFaceElements; 00079 static const int Points; 00080 static const int ContactElementsZero; 00081 static const int ReducedContactElementsZero; 00082 static const int ContactElementsOne; 00083 static const int ReducedContactElementsOne; 00084 00103 DUDLEY_DLL_API 00104 MeshAdapter(Dudley_Mesh* dudleyMesh=0); 00105 00110 DUDLEY_DLL_API 00111 MeshAdapter(const MeshAdapter& in); 00112 00119 DUDLEY_DLL_API 00120 ~MeshAdapter(); 00121 00126 DUDLEY_DLL_API 00127 virtual int getMPISize() const; 00133 DUDLEY_DLL_API 00134 virtual int getMPIRank() const; 00135 00141 DUDLEY_DLL_API 00142 virtual void MPIBarrier() const; 00143 00149 DUDLEY_DLL_API 00150 virtual bool onMasterProcessor() const; 00151 00152 DUDLEY_DLL_API 00153 #ifdef ESYS_MPI 00154 MPI_Comm 00155 #else 00156 unsigned int 00157 #endif 00158 getMPIComm() const; 00159 00160 00166 DUDLEY_DLL_API 00167 void write(const std::string& fileName) const; 00168 00173 DUDLEY_DLL_API 00174 void Print_Mesh_Info(const bool full=false) const; 00175 00181 DUDLEY_DLL_API 00182 void dump(const std::string& fileName) const; 00183 00188 DUDLEY_DLL_API 00189 Dudley_Mesh* getDudley_Mesh() const; 00190 00197 DUDLEY_DLL_API 00198 int getTagFromSampleNo(int functionSpaceType, int sampleNo) const; 00199 00205 DUDLEY_DLL_API 00206 const int* borrowSampleReferenceIDs(int functionSpaceType) const; 00207 00213 DUDLEY_DLL_API 00214 virtual bool isValidFunctionSpaceType(int functionSpaceType) const; 00215 00220 DUDLEY_DLL_API 00221 virtual std::string getDescription() const; 00222 00227 DUDLEY_DLL_API 00228 virtual std::string functionSpaceTypeAsString(int functionSpaceType) const; 00229 00234 DUDLEY_DLL_API 00235 void setFunctionSpaceTypeNames(); 00236 00241 DUDLEY_DLL_API 00242 virtual int getContinuousFunctionCode() const; 00243 00248 DUDLEY_DLL_API 00249 virtual int getReducedContinuousFunctionCode() const; 00250 00255 DUDLEY_DLL_API 00256 virtual int getFunctionCode() const; 00257 00262 DUDLEY_DLL_API 00263 virtual int getReducedFunctionCode() const; 00264 00269 DUDLEY_DLL_API 00270 virtual int getFunctionOnBoundaryCode() const; 00271 00276 DUDLEY_DLL_API 00277 virtual int getReducedFunctionOnBoundaryCode() const; 00278 00283 DUDLEY_DLL_API 00284 virtual int getFunctionOnContactZeroCode() const; 00285 00290 DUDLEY_DLL_API 00291 virtual int getReducedFunctionOnContactZeroCode() const; 00292 00297 DUDLEY_DLL_API 00298 virtual int getFunctionOnContactOneCode() const; 00299 00304 DUDLEY_DLL_API 00305 virtual int getReducedFunctionOnContactOneCode() const; 00306 00311 DUDLEY_DLL_API 00312 virtual int getSolutionCode() const; 00313 00318 DUDLEY_DLL_API 00319 virtual int getReducedSolutionCode() const; 00320 00325 DUDLEY_DLL_API 00326 virtual int getDiracDeltaFunctionsCode() const; 00327 00332 typedef std::map<int, std::string> FunctionSpaceNamesMapType; 00333 00337 DUDLEY_DLL_API 00338 virtual int getDim() const; 00339 00348 DUDLEY_DLL_API 00349 virtual StatusType getStatus() const; 00350 00351 00356 DUDLEY_DLL_API 00357 virtual int getNumDataPointsGlobal() const; 00358 00364 DUDLEY_DLL_API 00365 virtual std::pair<int,int> getDataShape(int functionSpaceCode) const; 00366 00372 DUDLEY_DLL_API 00373 virtual void setToX(escript::Data& arg) const; 00374 00381 DUDLEY_DLL_API 00382 virtual void setTagMap(const std::string& name, int tag); 00383 00389 DUDLEY_DLL_API 00390 virtual int getTag(const std::string& name) const; 00391 00397 DUDLEY_DLL_API 00398 virtual bool isValidTagName(const std::string& name) const; 00399 00404 DUDLEY_DLL_API 00405 virtual std::string showTagNames() const; 00406 00411 DUDLEY_DLL_API 00412 virtual void setNewX(const escript::Data& arg); 00413 00418 DUDLEY_DLL_API 00419 virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const; 00420 00421 00422 DUDLEY_DLL_API 00423 virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const; 00424 00425 DUDLEY_DLL_API 00426 virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const; 00427 00428 00433 DUDLEY_DLL_API 00434 bool 00435 commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const; 00436 00442 DUDLEY_DLL_API 00443 virtual void interpolateACross(escript::Data& target, const escript::Data& source) const; 00444 00449 DUDLEY_DLL_API 00450 virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const; 00451 00457 DUDLEY_DLL_API 00458 virtual void setToNormal(escript::Data& out) const; 00459 00465 DUDLEY_DLL_API 00466 virtual void setToSize(escript::Data& out) const; 00467 00473 DUDLEY_DLL_API 00474 virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const; 00475 00481 DUDLEY_DLL_API 00482 virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const; 00483 00493 DUDLEY_DLL_API 00494 virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const; 00495 00505 DUDLEY_DLL_API 00506 virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const; 00507 00513 DUDLEY_DLL_API 00514 virtual bool isCellOriented(int functionSpaceCode) const; 00515 00516 DUDLEY_DLL_API 00517 virtual bool ownSample(int fs_code, index_t id) const; 00518 00523 DUDLEY_DLL_API 00524 virtual void addPDEToSystem( 00525 escript::AbstractSystemMatrix& mat, escript::Data& rhs, 00526 const escript::Data& A, const escript::Data& B, const escript::Data& C, 00527 const escript::Data& D, const escript::Data& X, const escript::Data& Y, 00528 const escript::Data& d, const escript::Data& y, 00529 const escript::Data& d_contact, const escript::Data& y_contact, 00530 const escript::Data& d_dirac, const escript::Data& y_dirac) const; 00531 00532 00537 DUDLEY_DLL_API 00538 virtual void addPDEToLumpedSystem( 00539 escript::Data& mat, 00540 const escript::Data& D, 00541 const escript::Data& d, 00542 const escript::Data& d_dirac, 00543 const bool useHRZ) const; 00544 00549 DUDLEY_DLL_API 00550 virtual void addPDEToRHS(escript::Data& rhs, 00551 const escript::Data& X, const escript::Data& Y, 00552 const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const; 00558 DUDLEY_DLL_API 00559 virtual void addPDEToTransportProblem( 00560 escript::AbstractTransportProblem& tp, escript::Data& source, 00561 const escript::Data& M, 00562 const escript::Data& A, const escript::Data& B, const escript::Data& C,const escript::Data& D, 00563 const escript::Data& X,const escript::Data& Y, 00564 const escript::Data& d, const escript::Data& y, 00565 const escript::Data& d_contact,const escript::Data& y_contact, 00566 const escript::Data& d_dirac,const escript::Data& y_dirac) const; 00567 00568 00573 DUDLEY_DLL_API 00574 escript::ASM_ptr newSystemMatrix( 00575 const int row_blocksize, 00576 const escript::FunctionSpace& row_functionspace, 00577 const int column_blocksize, 00578 const escript::FunctionSpace& column_functionspace, 00579 const int type) const; 00586 DUDLEY_DLL_API 00587 escript::ATP_ptr newTransportProblem( 00588 const int blocksize, 00589 const escript::FunctionSpace& functionspace, 00590 const int type) const; 00591 00595 DUDLEY_DLL_API 00596 virtual escript::Data getX() const; 00597 00601 DUDLEY_DLL_API 00602 virtual escript::Data getNormal() const; 00603 00607 DUDLEY_DLL_API 00608 virtual escript::Data getSize() const; 00609 00613 DUDLEY_DLL_API 00614 virtual bool operator==(const escript::AbstractDomain& other) const; 00615 DUDLEY_DLL_API 00616 virtual bool operator!=(const escript::AbstractDomain& other) const; 00617 00623 DUDLEY_DLL_API 00624 virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const; 00625 00630 DUDLEY_DLL_API 00631 virtual int getNumberOfTagsInUse(int functionSpaceCode) const; 00632 00633 DUDLEY_DLL_API 00634 virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const; 00635 00636 00640 DUDLEY_DLL_API 00641 virtual 00642 bool canTag(int functionSpaceCode) const; 00643 00648 DUDLEY_DLL_API 00649 virtual 00650 int getApproximationOrder(const int functionSpaceCode) const; 00651 00652 00653 DUDLEY_DLL_API 00654 bool supportsContactElements() const; 00655 00656 00657 DUDLEY_DLL_API 00658 virtual escript::Data randomFill(const escript::DataTypes::ShapeType& shape, 00659 const escript::FunctionSpace& what, long seed, const boost::python::tuple& filter) const; 00660 00661 protected: 00662 00663 private: 00664 void extractArgsFromDict(const boost::python::dict& arg, int& numData, 00665 char**& names, escriptDataC*& data, 00666 escriptDataC**& dataPtr) const; 00667 00668 // 00669 // pointer to the externally created dudley mesh 00670 boost::shared_ptr<Dudley_Mesh> m_dudleyMesh; 00671 00672 static FunctionSpaceNamesMapType m_functionSpaceTypeNames; 00673 00674 }; 00675 00676 } // end of namespace 00677 00678 #endif