escript  Revision_
Brick.h
Go to the documentation of this file.
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