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

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

  ViewVC Help
Powered by ViewVC 1.1.26