/[escript]/trunk/ripley/src/Rectangle.h
ViewVC logotype

Diff of /trunk/ripley/src/Rectangle.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

branches/ripleygmg_from_3668/ripley/src/Rectangle.h revision 3748 by caltinay, Thu Dec 15 07:36:19 2011 UTC trunk/ripley/src/Rectangle.h revision 4340 by caltinay, Fri Mar 22 04:38:36 2013 UTC
# Line 1  Line 1 
1    
2  /*******************************************************  /*****************************************************************************
3  *  *
4  * Copyright (c) 2003-2011 by University of Queensland  * Copyright (c) 2003-2013 by University of Queensland
5  * Earth Systems Science Computational Center (ESSCC)  * http://www.uq.edu.au
 * http://www.uq.edu.au/esscc  
6  *  *
7  * Primary Business: Queensland, Australia  * Primary Business: Queensland, Australia
8  * Licensed under the Open Software License version 3.0  * Licensed under the Open Software License version 3.0
9  * http://www.opensource.org/licenses/osl-3.0.php  * http://www.opensource.org/licenses/osl-3.0.php
10  *  *
11  *******************************************************/  * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12    * Development since 2012 by School of Earth Sciences
13    *
14    *****************************************************************************/
15    
16  #ifndef __RIPLEY_RECTANGLE_H__  #ifndef __RIPLEY_RECTANGLE_H__
17  #define __RIPLEY_RECTANGLE_H__  #define __RIPLEY_RECTANGLE_H__
18    
19  #include <ripley/RipleyDomain.h>  #include <ripley/RipleyDomain.h>
20    
21  struct Paso_Pattern;  struct Paso_Connector;
22    
23  namespace ripley {  namespace ripley {
24    
# Line 24  namespace ripley { Line 26  namespace ripley {
26     \brief     \brief
27     Rectangle is the 2-dimensional implementation of a RipleyDomain.     Rectangle is the 2-dimensional implementation of a RipleyDomain.
28  */  */
29  class Rectangle: public RipleyDomain  class RIPLEY_DLL_API Rectangle: public RipleyDomain
30  {  {
31  public:  public:
32    
33      /**      /**
34         \brief creates a rectangular mesh with n0 x n1 elements over the         \brief creates a rectangular mesh with n0 x n1 elements over the
35                rectangle [0,l0] x [0,l1].                rectangle [x0,x1] x [y0,y1].
36         \param n0,n1 number of elements in each dimension         \param n0,n1 number of elements in each dimension
37         \param l0,l1 length of each side of rectangle         \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
38         \param d0,d1 number of subdivisions in each dimension         \param d0,d1 number of subdivisions in each dimension
39      */      */
40      RIPLEY_DLL_API      Rectangle(int n0, int n1, double x0, double y0, double x1, double y1,
41      Rectangle(int n0, int n1, double l0, double l1, int d0, int d1);                int d0=-1, int d1=-1);
42    
43      /**      /**
44         \brief         \brief
45         Destructor.         Destructor.
46      */      */
     RIPLEY_DLL_API  
47      ~Rectangle();      ~Rectangle();
48    
49      /**      /**
50         \brief         \brief
51         returns a description for this domain         returns a description for this domain
52      */      */
     RIPLEY_DLL_API  
53      virtual std::string getDescription() const;      virtual std::string getDescription() const;
54    
55      /**      /**
56         \brief equality operator         \brief equality operator
57      */      */
     RIPLEY_DLL_API  
58      virtual bool operator==(const escript::AbstractDomain& other) const;      virtual bool operator==(const escript::AbstractDomain& other) const;
59    
60      /**      /**
# Line 63  public: Line 62  public:
62         dumps the mesh to a file with the given name         dumps the mesh to a file with the given name
63         \param filename The name of the output file         \param filename The name of the output file
64      */      */
     RIPLEY_DLL_API  
65      void dump(const std::string& filename) const;      void dump(const std::string& filename) const;
66    
67      /**      /**
        \brief  
        returns the array of reference numbers for a function space type  
        \param fsType The function space type  
68      */      */
69      RIPLEY_DLL_API      virtual void readBinaryGrid(escript::Data& out, std::string filename,
70      const int* borrowSampleReferenceIDs(int fsType) const;                                  const std::vector<int>& first,
71                                    const std::vector<int>& numValues,
72                                    const std::vector<int>& multiplier) const;
73    
74      /**      /**
        \brief  
        returns true if this rank owns the sample id.  
75      */      */
76      RIPLEY_DLL_API      virtual void readNcGrid(escript::Data& out, std::string filename,
77      virtual bool ownSample(int fs_code, index_t id) const;              std::string varname, const std::vector<int>& first,
78                const std::vector<int>& numValues,
79                const std::vector<int>& multiplier) const;
80    
81        /**
82        */
83        virtual void writeBinaryGrid(const escript::Data& in,
84                                     std::string filename, int byteOrder) const;
85    
86      /**      /**
87         \brief         \brief
88         copies the gradient of 'in' into 'out'. The actual function space to be         returns the array of reference numbers for a function space type
89         considered for the gradient is defined by 'in'. Both arguments have to         \param fsType The function space type
        be defined on this domain.  
90      */      */
91      RIPLEY_DLL_API      const int* borrowSampleReferenceIDs(int fsType) const;
     virtual void setToGradient(escript::Data& out, const escript::Data& in) const;  
92    
93      /**      /**
94         \brief         \brief
95         copies the integrals of the function defined by arg into integrals.         returns true if this rank owns the sample id.
        arg has to be defined on this domain.  
96      */      */
97      RIPLEY_DLL_API      virtual bool ownSample(int fs_code, index_t id) const;
     virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;  
98    
99      /**      /**
100         \brief         \brief
# Line 104  public: Line 102  public:
102         space to be considered is defined by out. out has to be defined on this         space to be considered is defined by out. out has to be defined on this
103         domain.         domain.
104      */      */
     RIPLEY_DLL_API  
105      virtual void setToNormal(escript::Data& out) const;      virtual void setToNormal(escript::Data& out) const;
106    
107      /**      /**
108         \brief         \brief
109           copies the size of samples into out. The actual function space to be
110           considered is defined by out. out has to be defined on this domain.
111        */
112        virtual void setToSize(escript::Data& out) const;
113    
114        /**
115           \brief
116         returns the number of data points summed across all MPI processes         returns the number of data points summed across all MPI processes
117      */      */
118      RIPLEY_DLL_API      virtual int getNumDataPointsGlobal() const;
     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }  
119    
120      /**      /**
121         \brief         \brief
122         writes information about the mesh to standard output         writes information about the mesh to standard output
123         \param full whether to print additional data         \param full whether to print additional data
124      */      */
     RIPLEY_DLL_API  
125      virtual void Print_Mesh_Info(const bool full=false) const;      virtual void Print_Mesh_Info(const bool full=false) const;
126    
127      /**      /**
128         \brief         \brief
129         returns the number of nodes per MPI rank in each dimension         returns the number of nodes per MPI rank in each dimension
130      */      */
131      RIPLEY_DLL_API      virtual const int* getNumNodesPerDim() const { return m_NN; }
     virtual IndexVector getNumNodesPerDim() const;  
132    
133      /**      /**
134         \brief         \brief
135         returns the number of elements per MPI rank in each dimension         returns the number of elements per MPI rank in each dimension
136      */      */
137      RIPLEY_DLL_API      virtual const int* getNumElementsPerDim() const { return m_NE; }
     virtual IndexVector getNumElementsPerDim() const;  
138    
139      /**      /**
140         \brief         \brief
141         returns the number of face elements in the order         returns the number of face elements in the order
142         (left,right,bottom,top,[front,back]) on current MPI rank         (left,right,bottom,top) on current MPI rank
143      */      */
144      RIPLEY_DLL_API      virtual const int* getNumFacesPerBoundary() const { return m_faceCount; }
     virtual IndexVector getNumFacesPerBoundary() const;  
145    
146      /**      /**
147         \brief         \brief
148         returns the node distribution vector         returns the node distribution vector
149      */      */
     RIPLEY_DLL_API  
150      virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }      virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
151    
152      /**      /**
153         \brief         \brief
154         returns the first coordinate value and the node spacing along given         returns the number of spatial subdivisions in each dimension
        dimension as a pair  
155      */      */
156      RIPLEY_DLL_API      virtual const int* getNumSubdivisionsPerDim() const { return m_NX; }
157      virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;  
158        /**
159           \brief
160           returns the index'th coordinate value in given dimension for this rank
161        */
162        virtual double getLocalCoordinate(int index, int dim) const;
163    
164        /**
165           \brief
166           returns the tuple (origin, spacing, number_of_elements)
167        */
168        virtual boost::python::tuple getGridParameters() const;
169    
170  protected:  protected:
171      virtual dim_t getNumNodes() const { return m_N0*m_N1; }      virtual dim_t getNumNodes() const;
172      virtual dim_t getNumElements() const { return m_NE0*m_NE1; }      virtual dim_t getNumElements() const;
173      virtual dim_t getNumFaceElements() const;      virtual dim_t getNumFaceElements() const;
174        virtual dim_t getNumDOF() const;
175        virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
176      virtual void assembleCoordinates(escript::Data& arg) const;      virtual void assembleCoordinates(escript::Data& arg) const;
177        virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
178        virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
179      virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,      virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
180              const escript::Data& A, const escript::Data& B,              const escript::Data& A, const escript::Data& B,
181              const escript::Data& C, const escript::Data& D,              const escript::Data& C, const escript::Data& D,
182              const escript::Data& X, const escript::Data& Y,              const escript::Data& X, const escript::Data& Y) const;
183              const escript::Data& d, const escript::Data& y) const;      virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
184      //virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,              escript::Data& rhs, const escript::Data& d,
185      //        const escript::Data& A, const escript::Data& B,              const escript::Data& y) const;
186      //        const escript::Data& C, const escript::Data& D,      virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
187      //        const escript::Data& X, const escript::Data& Y,              escript::Data& rhs, const escript::Data& A, const escript::Data& B,
188      //        const escript::Data& d, const escript::Data& y) const;              const escript::Data& C, const escript::Data& D,
189                const escript::Data& X, const escript::Data& Y) const;
190        virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
191                escript::Data& rhs, const escript::Data& d,
192                const escript::Data& y) const;
193        virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
194                const escript::Data& A, const escript::Data& B,
195                const escript::Data& C, const escript::Data& D,
196                const escript::Data& X, const escript::Data& Y) const;
197        virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
198                escript::Data& rhs, const escript::Data& d,
199                const escript::Data& y) const;
200        virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
201                escript::Data& rhs, const escript::Data& A, const escript::Data& B,
202                const escript::Data& C, const escript::Data& D,
203                const escript::Data& X, const escript::Data& Y) const;
204        virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
205                escript::Data& rhs, const escript::Data& d,
206                const escript::Data& y) const;
207      virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;      virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
208      virtual void interpolateNodesOnElements(escript::Data& out,      virtual void interpolateNodesOnElements(escript::Data& out,
209                                         escript::Data& in, bool reduced) const;                                         escript::Data& in, bool reduced) const;
210      virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,      virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
211                                           bool reduced) const;                                           bool reduced) const;
212        virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
213        virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
214    
215  private:  private:
216      void populateSampleIds();      void populateSampleIds();
217      int insertNeighbours(IndexVector& index, index_t node) const;      void createPattern();
218      void generateCouplePatterns(Paso_Pattern** colPattern,      void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
219                                  Paso_Pattern** rowPattern) const;             const DoubleVector& EM_S, const DoubleVector& EM_F,
220      void addToSystemMatrix(Paso_SystemMatrix* in, dim_t NN_Equa,             bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
             const IndexVector& Nodes_Equa, dim_t num_Equa, dim_t NN_Sol,  
             const IndexVector& Nodes_Sol, dim_t num_Sol,  
             const std::vector<double>& array) const;  
221    
222      /// total number of elements in each dimension      /// total number of elements in each dimension
223      dim_t m_gNE0, m_gNE1;      dim_t m_gNE[2];
224    
225        /// origin of domain
226        double m_origin[2];
227    
228      /// side lengths of domain      /// side lengths of domain
229      double m_l0, m_l1;      double m_length[2];
230    
231        /// grid spacings / cell sizes of domain
232        double m_dx[2];
233    
234      /// number of spatial subdivisions      /// number of spatial subdivisions
235      int m_NX, m_NY;      int m_NX[2];
236    
237        /// number of elements for this rank in each dimension including shared
238        dim_t m_NE[2];
239    
240      /// number of elements for this rank in each dimension      /// number of own elements for this rank in each dimension
241      dim_t m_NE0, m_NE1;      dim_t m_ownNE[2];
242    
243      /// number of nodes for this rank in each dimension      /// number of nodes for this rank in each dimension
244      dim_t m_N0, m_N1;      dim_t m_NN[2];
245    
246      /// first node on this rank is at (offset0,offset1) in global mesh      /// first node on this rank is at (offset0,offset1) in global mesh
247      dim_t m_offset0, m_offset1;      dim_t m_offset[2];
248    
249        /// number of face elements per edge (left, right, bottom, top)
250        int m_faceCount[4];
251    
252      /// faceOffset[i]=-1 if face i is not an external face, otherwise it is      /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
253      /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)      /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
254      IndexVector m_faceOffset;      IndexVector m_faceOffset;
255    
256      /// vector of sample reference identifiers      /// vector of sample reference identifiers
257        IndexVector m_dofId;
258      IndexVector m_nodeId;      IndexVector m_nodeId;
259      IndexVector m_elementId;      IndexVector m_elementId;
260      IndexVector m_faceId;      IndexVector m_faceId;
261    
262      // vector with first node id on each rank      // vector with first node id on each rank
263      IndexVector m_nodeDistribution;      IndexVector m_nodeDistribution;
264    
265        // vector that maps each node to a DOF index (used for the coupler)
266        IndexVector m_dofMap;
267    
268        // Paso connector used by the system matrix and to interpolate DOF to
269        // nodes
270        Paso_Connector* m_connector;
271    
272        // the Paso System Matrix pattern
273        Paso_SystemMatrixPattern* m_pattern;
274  };  };
275    
276    ////////////////////////////// inline methods ////////////////////////////////
277    
278    inline int Rectangle::getNumDataPointsGlobal() const
279    {
280        return (m_gNE[0]+1)*(m_gNE[1]+1);
281    }
282    
283    inline double Rectangle::getLocalCoordinate(int index, int dim) const
284    {
285        EsysAssert((dim>=0 && dim<2), "'dim' out of bounds");
286        EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
287        return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
288    }
289    
290    inline boost::python::tuple Rectangle::getGridParameters() const
291    {
292        return boost::python::make_tuple(
293                boost::python::make_tuple(m_origin[0], m_origin[1]),
294                boost::python::make_tuple(m_dx[0], m_dx[1]),
295                boost::python::make_tuple(m_gNE[0], m_gNE[1]));
296    }
297    
298    inline Paso_SystemMatrixPattern* Rectangle::getPattern(bool reducedRowOrder,
299                                                       bool reducedColOrder) const
300    {
301        // TODO: reduced
302        return m_pattern;
303    }
304    
305    
306    //protected
307    inline dim_t Rectangle::getNumDOF() const
308    {
309        return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1];
310    }
311    
312    //protected
313    inline dim_t Rectangle::getNumNodes() const
314    {
315        return m_NN[0]*m_NN[1];
316    }
317    
318    //protected
319    inline dim_t Rectangle::getNumElements() const
320    {
321        return m_NE[0]*m_NE[1];
322    }
323    
324    //protected
325    inline dim_t Rectangle::getNumFaceElements() const
326    {
327        return m_faceCount[0] + m_faceCount[1] + m_faceCount[2] + m_faceCount[3];
328    }
329    
330    
331  } // end of namespace ripley  } // end of namespace ripley
332    
333  #endif // __RIPLEY_RECTANGLE_H__  #endif // __RIPLEY_RECTANGLE_H__

Legend:
Removed from v.3748  
changed lines
  Added in v.4340

  ViewVC Help
Powered by ViewVC 1.1.26