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

Annotation of /trunk/ripley/src/Brick.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3760 - (hide annotations)
Mon Jan 9 05:21:18 2012 UTC (7 years, 8 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Brick.h
File MIME type: text/plain
File size: 7185 byte(s)
-implemented addPDEToRHS() and setToSize()
-added a few missing calls to requireWrite()
-added assemblePDESystem() to Rectangle but haven't tested yet

1 caltinay 3691
2     /*******************************************************
3     *
4     * Copyright (c) 2003-2011 by University of Queensland
5     * Earth Systems Science Computational Center (ESSCC)
6     * http://www.uq.edu.au/esscc
7     *
8     * Primary Business: Queensland, Australia
9     * Licensed under the Open Software License version 3.0
10     * http://www.opensource.org/licenses/osl-3.0.php
11     *
12     *******************************************************/
13    
14     #ifndef __RIPLEY_BRICK_H__
15     #define __RIPLEY_BRICK_H__
16    
17     #include <ripley/RipleyDomain.h>
18    
19 caltinay 3756 struct Paso_Connector;
20    
21 caltinay 3691 namespace ripley {
22    
23     /**
24     \brief
25     Brick is the 3-dimensional implementation of a RipleyDomain.
26     */
27     class Brick: public RipleyDomain
28     {
29     public:
30    
31     /**
32     \brief creates a hexagonal mesh with n0 x n1 x n2 elements over the
33     brick [0,l0] x [0,l1] x [0,l2].
34     \param n0,n1,n2 number of elements in each dimension
35     \param l0,l1,l2 length of each side of brick
36     \param d0,d1,d2 number of subdivisions in each dimension
37     */
38     RIPLEY_DLL_API
39     Brick(int n0, int n1, int n2, double l0, double l1, double l2, int d0,
40     int d1, int d2);
41    
42     /**
43     \brief
44     Destructor.
45     */
46     RIPLEY_DLL_API
47     ~Brick();
48    
49     /**
50     \brief
51     returns a description for this domain
52     */
53     RIPLEY_DLL_API
54     virtual std::string getDescription() const;
55    
56     /**
57     \brief equality operator
58     */
59     RIPLEY_DLL_API
60     virtual bool operator==(const escript::AbstractDomain& other) const;
61    
62     /**
63     \brief
64     dumps the mesh to a file with the given name
65     \param filename The name of the output file
66     */
67     RIPLEY_DLL_API
68     void dump(const std::string& filename) const;
69    
70     /**
71     \brief
72     returns the reference number of the given sample number
73     \param fsType The function space type
74     */
75     RIPLEY_DLL_API
76     const int* borrowSampleReferenceIDs(int fsType) const;
77    
78     /**
79     \brief
80     returns true if this rank owns the sample id.
81     */
82     RIPLEY_DLL_API
83 caltinay 3757 virtual bool ownSample(int fsType, index_t id) const;
84 caltinay 3691
85     /**
86     \brief
87 caltinay 3703 copies the gradient of 'in' into 'out'. The actual function space to be
88     considered for the gradient is defined by 'in'. Both arguments have to
89     be defined on this domain.
90     */
91     RIPLEY_DLL_API
92     virtual void setToGradient(escript::Data& out, const escript::Data& in) const;
93    
94     /**
95     \brief
96 caltinay 3713 copies the integrals of the function defined by arg into integrals.
97     arg has to be defined on this domain.
98     */
99     RIPLEY_DLL_API
100     virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
101    
102     /**
103     \brief
104 caltinay 3722 copies the surface normals at data points into out. The actual function
105     space to be considered is defined by out. out has to be defined on this
106     domain.
107     */
108     RIPLEY_DLL_API
109     virtual void setToNormal(escript::Data& out) const;
110    
111     /**
112     \brief
113 caltinay 3760 copies the size of samples into out. The actual function space to be
114     considered is defined by out. out has to be defined on this domain.
115     */
116     RIPLEY_DLL_API
117     virtual void setToSize(escript::Data& out) const;
118    
119     /**
120     \brief
121 caltinay 3691 returns the number of data points summed across all MPI processes
122     */
123     RIPLEY_DLL_API
124     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
125    
126     /**
127     \brief
128     writes information about the mesh to standard output
129     \param full whether to print additional data
130     */
131     RIPLEY_DLL_API
132     virtual void Print_Mesh_Info(const bool full=false) const;
133    
134 caltinay 3698 /**
135     \brief
136     returns the number of nodes per MPI rank in each dimension
137     */
138     RIPLEY_DLL_API
139     virtual IndexVector getNumNodesPerDim() const;
140    
141     /**
142     \brief
143     returns the number of elements per MPI rank in each dimension
144     */
145     RIPLEY_DLL_API
146     virtual IndexVector getNumElementsPerDim() const;
147    
148     /**
149     \brief
150     returns the number of face elements in the order
151     (left,right,bottom,top,[front,back]) on current MPI rank
152     */
153     RIPLEY_DLL_API
154     virtual IndexVector getNumFacesPerBoundary() const;
155    
156     /**
157     \brief
158     returns the node distribution vector
159     */
160     RIPLEY_DLL_API
161     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
162    
163     /**
164     \brief
165     returns the first coordinate value and the node spacing along given
166     dimension as a pair
167     */
168     RIPLEY_DLL_API
169     virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
170    
171 caltinay 3691 protected:
172     virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
173     virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
174     virtual dim_t getNumFaceElements() const;
175 caltinay 3750 virtual dim_t getNumDOF() const;
176 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
177 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
178 caltinay 3754 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
179     const escript::Data& A, const escript::Data& B,
180     const escript::Data& C, const escript::Data& D,
181     const escript::Data& X, const escript::Data& Y,
182     const escript::Data& d, const escript::Data& y) const;
183 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
184 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
185     escript::Data& in, bool reduced) const;
186     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
187     bool reduced) const;
188 caltinay 3753 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
189 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
190 caltinay 3691
191     private:
192     void populateSampleIds();
193 caltinay 3756 void createPattern();
194 caltinay 3691
195     /// total number of elements in each dimension
196     dim_t m_gNE0, m_gNE1, m_gNE2;
197    
198     /// side lengths of domain
199     double m_l0, m_l1, m_l2;
200    
201     /// number of spatial subdivisions
202     int m_NX, m_NY, m_NZ;
203    
204     /// number of elements for this rank in each dimension
205     dim_t m_NE0, m_NE1, m_NE2;
206    
207     /// number of nodes for this rank in each dimension
208     dim_t m_N0, m_N1, m_N2;
209    
210     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
211     dim_t m_offset0, m_offset1, m_offset2;
212    
213 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
214     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
215     /// 4=front, 5=back)
216     IndexVector m_faceOffset;
217    
218 caltinay 3691 /// vector of sample reference identifiers
219 caltinay 3753 IndexVector m_dofId;
220 caltinay 3691 IndexVector m_nodeId;
221     IndexVector m_elementId;
222     IndexVector m_faceId;
223 caltinay 3698
224     // vector with first node id on each rank
225     IndexVector m_nodeDistribution;
226 caltinay 3754
227 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
228     IndexVector m_dofMap;
229    
230     // Paso connector used by the system matrix and to interpolate DOF to
231     // nodes
232     Paso_Connector* m_connector;
233    
234     // the Paso System Matrix pattern
235     Paso_SystemMatrixPattern* m_pattern;
236 caltinay 3691 };
237    
238     } // end of namespace ripley
239    
240     #endif // __RIPLEY_BRICK_H__
241    

  ViewVC Help
Powered by ViewVC 1.1.26