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 #ifndef __RIPLEY_BRICK_H__ 00018 #define __RIPLEY_BRICK_H__ 00019 00020 #include <paso/Coupler.h> 00021 #include <ripley/RipleyDomain.h> 00022 00023 namespace ripley { 00024 00029 class RIPLEY_DLL_API Brick: public RipleyDomain 00030 { 00031 friend class DefaultAssembler3D; 00032 friend class WaveAssembler3D; 00033 friend class LameAssembler3D; 00034 public: 00035 00043 Brick(int n0, int n1, int n2, double x0, double y0, double z0, double x1, 00044 double y1, double z1, int d0=-1, int d1=-1, int d2=-1, 00045 const std::vector<double>& points = std::vector<double>(), 00046 const std::vector<int>& tags = std::vector<int>(), 00047 const simap_t& tagnamestonums = simap_t()); 00048 00053 ~Brick(); 00054 00059 virtual std::string getDescription() const; 00060 00064 virtual bool operator==(const escript::AbstractDomain& other) const; 00065 00071 void dump(const std::string& filename) const; 00072 00075 virtual void readNcGrid(escript::Data& out, std::string filename, 00076 std::string varname, const ReaderParameters& params) const; 00077 00080 virtual void readBinaryGrid(escript::Data& out, std::string filename, 00081 const ReaderParameters& params) const; 00082 00083 #ifdef USE_BOOSTIO 00084 virtual void readBinaryGridFromZipped(escript::Data& out, std::string filename, 00085 const ReaderParameters& params) const; 00086 #endif 00087 00090 virtual void writeBinaryGrid(const escript::Data& in, 00091 std::string filename, 00092 int byteOrder, int dataType) const; 00093 00099 const int* borrowSampleReferenceIDs(int fsType) const; 00100 00105 virtual bool ownSample(int fsType, index_t id) const; 00106 00113 virtual void setToNormal(escript::Data& out) const; 00114 00120 virtual void setToSize(escript::Data& out) const; 00121 00126 virtual int getNumDataPointsGlobal() const; 00127 00133 virtual void Print_Mesh_Info(const bool full=false) const; 00134 00139 virtual const int* getNumNodesPerDim() const { return m_NN; } 00140 00145 virtual const int* getNumElementsPerDim() const { return m_NE; } 00146 00152 virtual const int* getNumFacesPerBoundary() const { return m_faceCount; } 00153 00158 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; } 00159 00164 virtual const int* getNumSubdivisionsPerDim() const { return m_NX; } 00165 00170 virtual double getLocalCoordinate(int index, int dim) const; 00171 00176 virtual boost::python::tuple getGridParameters() const; 00177 00182 virtual escript::Data randomFill(const escript::DataTypes::ShapeType& shape, 00183 const escript::FunctionSpace& what, long seed, const boost::python::tuple& filter) const; 00184 00185 00186 protected: 00187 virtual dim_t getNumNodes() const; 00188 virtual dim_t getNumElements() const; 00189 virtual dim_t getNumFaceElements() const; 00190 virtual dim_t getNumDOF() const; 00191 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const; 00192 virtual void assembleCoordinates(escript::Data& arg) const; 00193 virtual void assembleGradient(escript::Data& out, const escript::Data& in) const; 00194 virtual void assembleIntegrate(DoubleVector& integrals, const escript::Data& arg) const; 00195 virtual paso::SystemMatrixPattern_ptr getPattern(bool reducedRowOrder, bool reducedColOrder) const; 00196 virtual void interpolateNodesOnElements(escript::Data& out, 00197 const escript::Data& in, bool reduced) const; 00198 virtual void interpolateNodesOnFaces(escript::Data& out, 00199 const escript::Data& in, 00200 bool reduced) const; 00201 virtual void nodesToDOF(escript::Data& out, const escript::Data& in) const; 00202 virtual void dofToNodes(escript::Data& out, const escript::Data& in) const; 00203 virtual int getDofOfNode(int node) const; 00204 void setAssembler(std::string type, std::map<std::string, 00205 escript::Data> constants); 00206 00207 private: 00208 void populateSampleIds(); 00209 void createPattern(); 00210 void addToMatrixAndRHS(paso::SystemMatrix_ptr S, escript::Data& F, 00211 const DoubleVector& EM_S, const DoubleVector& EM_F, 00212 bool addS, bool addF, int firstNode, int nEq=1, int nComp=1) const; 00213 00214 template<typename ValueType> 00215 void readBinaryGridImpl(escript::Data& out, const std::string& filename, 00216 const ReaderParameters& params) const; 00217 template<typename ValueType> 00218 void readBinaryGridZippedImpl(escript::Data& out, const std::string& filename, 00219 const ReaderParameters& params) const; 00220 template<typename ValueType> 00221 void writeBinaryGridImpl(const escript::Data& in, 00222 const std::string& filename, int byteOrder) const; 00223 00224 int findNode(const double *coords) const; 00225 00226 00227 virtual escript::Data randomFillWorker(const escript::DataTypes::ShapeType& shape, long seed, const boost::python::tuple& filter) const; 00228 00230 dim_t m_gNE[3]; 00231 00233 double m_origin[3]; 00234 00236 double m_length[3]; 00237 00239 double m_dx[3]; 00240 00242 int m_NX[3]; 00243 00245 dim_t m_NE[3]; 00246 00248 dim_t m_ownNE[3]; 00249 00251 dim_t m_NN[3]; 00252 00254 dim_t m_offset[3]; 00255 00257 int m_faceCount[6]; 00258 00262 IndexVector m_faceOffset; 00263 00265 IndexVector m_dofId; 00266 IndexVector m_nodeId; 00267 IndexVector m_elementId; 00268 IndexVector m_faceId; 00269 00270 // vector with first node id on each rank 00271 IndexVector m_nodeDistribution; 00272 00273 // vector that maps each node to a DOF index (used for the coupler) 00274 IndexVector m_dofMap; 00275 00276 // Paso connector used by the system matrix and to interpolate DOF to 00277 // nodes 00278 paso::Connector_ptr m_connector; 00279 00280 // the Paso System Matrix pattern 00281 paso::SystemMatrixPattern_ptr m_pattern; 00282 }; 00283 00285 inline int Brick::getDofOfNode(int node) const { 00286 return m_dofMap[node]; 00287 } 00288 00289 inline int Brick::getNumDataPointsGlobal() const 00290 { 00291 return (m_gNE[0]+1)*(m_gNE[1]+1)*(m_gNE[2]+1); 00292 } 00293 00294 inline double Brick::getLocalCoordinate(int index, int dim) const 00295 { 00296 EsysAssert((dim>=0 && dim<3), "'dim' out of bounds"); 00297 EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds"); 00298 return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index); 00299 } 00300 00301 inline boost::python::tuple Brick::getGridParameters() const 00302 { 00303 return boost::python::make_tuple( 00304 boost::python::make_tuple(m_origin[0], m_origin[1], m_origin[2]), 00305 boost::python::make_tuple(m_dx[0], m_dx[1], m_dx[2]), 00306 boost::python::make_tuple(m_gNE[0], m_gNE[1], m_gNE[2])); 00307 } 00308 00309 inline paso::SystemMatrixPattern_ptr Brick::getPattern(bool reducedRowOrder, 00310 bool reducedColOrder) const 00311 { 00312 // TODO: reduced 00313 return m_pattern; 00314 } 00315 00316 00317 //protected 00318 inline dim_t Brick::getNumDOF() const 00319 { 00320 return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1]*(m_gNE[2]+1)/m_NX[2]; 00321 } 00322 00323 //protected 00324 inline dim_t Brick::getNumNodes() const 00325 { 00326 return m_NN[0]*m_NN[1]*m_NN[2]; 00327 } 00328 00329 //protected 00330 inline dim_t Brick::getNumElements() const 00331 { 00332 return m_NE[0]*m_NE[1]*m_NE[2]; 00333 } 00334 00335 //protected 00336 inline dim_t Brick::getNumFaceElements() const 00337 { 00338 return m_faceCount[0] + m_faceCount[1] + m_faceCount[2] 00339 + m_faceCount[3] + m_faceCount[4] + m_faceCount[5]; 00340 } 00341 00342 } // end of namespace ripley 00343 00344 #endif // __RIPLEY_BRICK_H__ 00345