/[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 3981 by jfenwick, Fri Sep 21 02:47:54 2012 UTC
# Line 1  Line 1 
1    
2  /*******************************************************  /*****************************************************************************
3  *  *
4  * Copyright (c) 2003-2011 by University of Queensland  * Copyright (c) 2003-2012 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      /**      /**
68        */
69        virtual void readBinaryGrid(escript::Data& out, std::string filename,
70                                    const std::vector<int>& first,
71                                    const std::vector<int>& numValues) const;
72    
73        /**
74         \brief         \brief
75         returns the array of reference numbers for a function space type         returns the array of reference numbers for a function space type
76         \param fsType The function space type         \param fsType The function space type
77      */      */
     RIPLEY_DLL_API  
78      const int* borrowSampleReferenceIDs(int fsType) const;      const int* borrowSampleReferenceIDs(int fsType) const;
79    
80      /**      /**
81         \brief         \brief
82         returns true if this rank owns the sample id.         returns true if this rank owns the sample id.
83      */      */
     RIPLEY_DLL_API  
84      virtual bool ownSample(int fs_code, index_t id) const;      virtual bool ownSample(int fs_code, index_t id) const;
85    
86      /**      /**
87         \brief         \brief
        copies the gradient of 'in' into 'out'. The actual function space to be  
        considered for the gradient is defined by 'in'. Both arguments have to  
        be defined on this domain.  
     */  
     RIPLEY_DLL_API  
     virtual void setToGradient(escript::Data& out, const escript::Data& in) const;  
   
     /**  
        \brief  
        copies the integrals of the function defined by arg into integrals.  
        arg has to be defined on this domain.  
     */  
     RIPLEY_DLL_API  
     virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;  
   
     /**  
        \brief  
88         copies the surface normals at data points into out. The actual function         copies the surface normals at data points into out. The actual function
89         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
90         domain.         domain.
91      */      */
     RIPLEY_DLL_API  
92      virtual void setToNormal(escript::Data& out) const;      virtual void setToNormal(escript::Data& out) const;
93    
94      /**      /**
95         \brief         \brief
96           copies the size of samples into out. The actual function space to be
97           considered is defined by out. out has to be defined on this domain.
98        */
99        virtual void setToSize(escript::Data& out) const;
100    
101        /**
102           \brief
103         returns the number of data points summed across all MPI processes         returns the number of data points summed across all MPI processes
104      */      */
     RIPLEY_DLL_API  
105      virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }      virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
106    
107      /**      /**
# Line 119  public: Line 109  public:
109         writes information about the mesh to standard output         writes information about the mesh to standard output
110         \param full whether to print additional data         \param full whether to print additional data
111      */      */
     RIPLEY_DLL_API  
112      virtual void Print_Mesh_Info(const bool full=false) const;      virtual void Print_Mesh_Info(const bool full=false) const;
113    
114      /**      /**
115         \brief         \brief
116         returns the number of nodes per MPI rank in each dimension         returns the number of nodes per MPI rank in each dimension
117      */      */
     RIPLEY_DLL_API  
118      virtual IndexVector getNumNodesPerDim() const;      virtual IndexVector getNumNodesPerDim() const;
119    
120      /**      /**
121         \brief         \brief
122         returns the number of elements per MPI rank in each dimension         returns the number of elements per MPI rank in each dimension
123      */      */
     RIPLEY_DLL_API  
124      virtual IndexVector getNumElementsPerDim() const;      virtual IndexVector getNumElementsPerDim() const;
125    
126      /**      /**
# Line 141  public: Line 128  public:
128         returns the number of face elements in the order         returns the number of face elements in the order
129         (left,right,bottom,top,[front,back]) on current MPI rank         (left,right,bottom,top,[front,back]) on current MPI rank
130      */      */
     RIPLEY_DLL_API  
131      virtual IndexVector getNumFacesPerBoundary() const;      virtual IndexVector getNumFacesPerBoundary() const;
132    
133      /**      /**
134         \brief         \brief
135         returns the node distribution vector         returns the node distribution vector
136      */      */
     RIPLEY_DLL_API  
137      virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }      virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
138    
139      /**      /**
140         \brief         \brief
141           returns the number of spatial subdivisions in each dimension
142        */
143        virtual IndexVector getNumSubdivisionsPerDim() const;
144    
145        /**
146           \brief
147         returns the first coordinate value and the node spacing along given         returns the first coordinate value and the node spacing along given
148         dimension as a pair         dimension as a pair
149      */      */
     RIPLEY_DLL_API  
150      virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;      virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
151    
152  protected:  protected:
153      virtual dim_t getNumNodes() const { return m_N0*m_N1; }      virtual dim_t getNumNodes() const { return m_N0*m_N1; }
154      virtual dim_t getNumElements() const { return m_NE0*m_NE1; }      virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
155      virtual dim_t getNumFaceElements() const;      virtual dim_t getNumFaceElements() const;
156        virtual dim_t getNumDOF() const;
157        virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
158      virtual void assembleCoordinates(escript::Data& arg) const;      virtual void assembleCoordinates(escript::Data& arg) const;
159        virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
160        virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
161      virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,      virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
162              const escript::Data& A, const escript::Data& B,              const escript::Data& A, const escript::Data& B,
163              const escript::Data& C, const escript::Data& D,              const escript::Data& C, const escript::Data& D,
164              const escript::Data& X, const escript::Data& Y,              const escript::Data& X, const escript::Data& Y) const;
165              const escript::Data& d, const escript::Data& y) const;      virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
166      //virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,              escript::Data& rhs, const escript::Data& d,
167      //        const escript::Data& A, const escript::Data& B,              const escript::Data& y) const;
168      //        const escript::Data& C, const escript::Data& D,      virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
169      //        const escript::Data& X, const escript::Data& Y,              escript::Data& rhs, const escript::Data& A, const escript::Data& B,
170      //        const escript::Data& d, const escript::Data& y) const;              const escript::Data& C, const escript::Data& D,
171                const escript::Data& X, const escript::Data& Y) const;
172        virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
173                escript::Data& rhs, const escript::Data& d,
174                const escript::Data& y) const;
175        virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
176                const escript::Data& A, const escript::Data& B,
177                const escript::Data& C, const escript::Data& D,
178                const escript::Data& X, const escript::Data& Y) const;
179        virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
180                escript::Data& rhs, const escript::Data& d,
181                const escript::Data& y) const;
182        virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
183                escript::Data& rhs, const escript::Data& A, const escript::Data& B,
184                const escript::Data& C, const escript::Data& D,
185                const escript::Data& X, const escript::Data& Y) const;
186        virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
187                escript::Data& rhs, const escript::Data& d,
188                const escript::Data& y) const;
189      virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;      virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
190      virtual void interpolateNodesOnElements(escript::Data& out,      virtual void interpolateNodesOnElements(escript::Data& out,
191                                         escript::Data& in, bool reduced) const;                                         escript::Data& in, bool reduced) const;
192      virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,      virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
193                                           bool reduced) const;                                           bool reduced) const;
194        virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
195        virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
196    
197  private:  private:
198      void populateSampleIds();      void populateSampleIds();
199      int insertNeighbours(IndexVector& index, index_t node) const;      void createPattern();
200      void generateCouplePatterns(Paso_Pattern** colPattern,      void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
201                                  Paso_Pattern** rowPattern) const;             const std::vector<double>& EM_S, const std::vector<double>& EM_F,
202      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;  
203    
204      /// total number of elements in each dimension      /// total number of elements in each dimension
205      dim_t m_gNE0, m_gNE1;      dim_t m_gNE0, m_gNE1;
206    
207        /// location of domain
208        double m_x0, m_y0;
209    
210      /// side lengths of domain      /// side lengths of domain
211      double m_l0, m_l1;      double m_l0, m_l1;
212    
213      /// number of spatial subdivisions      /// number of spatial subdivisions
214      int m_NX, m_NY;      int m_NX, m_NY;
215    
216      /// number of elements for this rank in each dimension      /// number of elements for this rank in each dimension including shared
217      dim_t m_NE0, m_NE1;      dim_t m_NE0, m_NE1;
218    
219        /// number of own elements for this rank in each dimension
220        dim_t m_ownNE0, m_ownNE1;
221    
222      /// number of nodes for this rank in each dimension      /// number of nodes for this rank in each dimension
223      dim_t m_N0, m_N1;      dim_t m_N0, m_N1;
224    
# Line 214  private: Line 230  private:
230      IndexVector m_faceOffset;      IndexVector m_faceOffset;
231    
232      /// vector of sample reference identifiers      /// vector of sample reference identifiers
233        IndexVector m_dofId;
234      IndexVector m_nodeId;      IndexVector m_nodeId;
235      IndexVector m_elementId;      IndexVector m_elementId;
236      IndexVector m_faceId;      IndexVector m_faceId;
237    
238      // vector with first node id on each rank      // vector with first node id on each rank
239      IndexVector m_nodeDistribution;      IndexVector m_nodeDistribution;
240    
241        // vector that maps each node to a DOF index (used for the coupler)
242        IndexVector m_dofMap;
243    
244        // Paso connector used by the system matrix and to interpolate DOF to
245        // nodes
246        Paso_Connector* m_connector;
247    
248        // the Paso System Matrix pattern
249        Paso_SystemMatrixPattern* m_pattern;
250  };  };
251    
252  } // end of namespace ripley  } // end of namespace ripley

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

  ViewVC Help
Powered by ViewVC 1.1.26