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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3943 - (hide annotations)
Thu Aug 9 04:43:24 2012 UTC (7 years, 1 month ago) by caltinay
File MIME type: text/plain
File size: 8543 byte(s)
Added heuristics for number of domain subdivisions to ripley so ripley domains
can now be created without specifying the values manually (but a warning will
be printed).

1 caltinay 3691
2     /*******************************************************
3     *
4 caltinay 3764 * Copyright (c) 2003-2012 by University of Queensland
5 caltinay 3691 * 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 caltinay 3915 class RIPLEY_DLL_API Brick: public RipleyDomain
28 caltinay 3691 {
29     public:
30    
31     /**
32     \brief creates a hexagonal mesh with n0 x n1 x n2 elements over the
33 caltinay 3781 brick [x0,x1] x [y0,y1] x [z0,z1].
34 caltinay 3691 \param n0,n1,n2 number of elements in each dimension
35 caltinay 3781 \param x0,y0,z0,x1,y1,z1 coordinates of corner nodes of the brick
36 caltinay 3691 \param d0,d1,d2 number of subdivisions in each dimension
37     */
38 caltinay 3781 Brick(int n0, int n1, int n2, double x0, double y0, double z0, double x1,
39 caltinay 3943 double y1, double z1, int d0=-1, int d1=-1, int d2=-1);
40 caltinay 3691
41     /**
42     \brief
43     Destructor.
44     */
45     ~Brick();
46    
47     /**
48     \brief
49     returns a description for this domain
50     */
51     virtual std::string getDescription() const;
52    
53     /**
54     \brief equality operator
55     */
56     virtual bool operator==(const escript::AbstractDomain& other) const;
57    
58     /**
59     \brief
60     dumps the mesh to a file with the given name
61     \param filename The name of the output file
62     */
63     void dump(const std::string& filename) const;
64    
65     /**
66     \brief
67     returns the reference number of the given sample number
68     \param fsType The function space type
69     */
70     const int* borrowSampleReferenceIDs(int fsType) const;
71    
72     /**
73     \brief
74     returns true if this rank owns the sample id.
75     */
76 caltinay 3757 virtual bool ownSample(int fsType, index_t id) const;
77 caltinay 3691
78     /**
79     \brief
80 caltinay 3722 copies the surface normals at data points into out. The actual function
81     space to be considered is defined by out. out has to be defined on this
82     domain.
83     */
84     virtual void setToNormal(escript::Data& out) const;
85    
86     /**
87     \brief
88 caltinay 3760 copies the size of samples into out. The actual function space to be
89     considered is defined by out. out has to be defined on this domain.
90     */
91     virtual void setToSize(escript::Data& out) const;
92    
93     /**
94     \brief
95 caltinay 3691 returns the number of data points summed across all MPI processes
96     */
97     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
98    
99     /**
100     \brief
101     writes information about the mesh to standard output
102     \param full whether to print additional data
103     */
104     virtual void Print_Mesh_Info(const bool full=false) const;
105    
106 caltinay 3698 /**
107     \brief
108     returns the number of nodes per MPI rank in each dimension
109     */
110     virtual IndexVector getNumNodesPerDim() const;
111    
112     /**
113     \brief
114     returns the number of elements per MPI rank in each dimension
115     */
116     virtual IndexVector getNumElementsPerDim() const;
117    
118     /**
119     \brief
120     returns the number of face elements in the order
121     (left,right,bottom,top,[front,back]) on current MPI rank
122     */
123     virtual IndexVector getNumFacesPerBoundary() const;
124    
125     /**
126     \brief
127     returns the node distribution vector
128     */
129     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
130    
131     /**
132     \brief
133 caltinay 3766 returns the number of spatial subdivisions in each dimension
134     */
135     virtual IndexVector getNumSubdivisionsPerDim() const;
136    
137     /**
138     \brief
139 caltinay 3698 returns the first coordinate value and the node spacing along given
140     dimension as a pair
141     */
142     virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
143    
144 caltinay 3691 protected:
145     virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
146     virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
147     virtual dim_t getNumFaceElements() const;
148 caltinay 3750 virtual dim_t getNumDOF() const;
149 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
150 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
151 caltinay 3764 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
152     virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
153 caltinay 3754 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
154     const escript::Data& A, const escript::Data& B,
155     const escript::Data& C, const escript::Data& D,
156 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
157     virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
158     escript::Data& rhs, const escript::Data& d,
159     const escript::Data& y) const;
160 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
161     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
162     const escript::Data& C, const escript::Data& D,
163 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
164     virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
165     escript::Data& rhs, const escript::Data& d,
166     const escript::Data& y) const;
167 caltinay 3761 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
168     const escript::Data& A, const escript::Data& B,
169     const escript::Data& C, const escript::Data& D,
170 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
171     virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
172     escript::Data& rhs, const escript::Data& d,
173     const escript::Data& y) const;
174 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
175     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
176     const escript::Data& C, const escript::Data& D,
177 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
178     virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
179     escript::Data& rhs, const escript::Data& d,
180     const escript::Data& y) const;
181 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
182 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
183     escript::Data& in, bool reduced) const;
184     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
185     bool reduced) const;
186 caltinay 3753 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
187 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
188 caltinay 3691
189     private:
190     void populateSampleIds();
191 caltinay 3756 void createPattern();
192 caltinay 3777 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
193     const std::vector<double>& EM_S, const std::vector<double>& EM_F,
194     bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
195 caltinay 3691
196 caltinay 3777
197 caltinay 3691 /// total number of elements in each dimension
198     dim_t m_gNE0, m_gNE1, m_gNE2;
199    
200 caltinay 3781 /// location of domain
201     double m_x0, m_y0, m_z0;
202    
203 caltinay 3691 /// side lengths of domain
204     double m_l0, m_l1, m_l2;
205    
206     /// number of spatial subdivisions
207     int m_NX, m_NY, m_NZ;
208    
209 caltinay 3764 /// number of elements for this rank in each dimension including shared
210 caltinay 3691 dim_t m_NE0, m_NE1, m_NE2;
211    
212 caltinay 3764 /// number of own elements for this rank in each dimension
213     dim_t m_ownNE0, m_ownNE1, m_ownNE2;
214    
215 caltinay 3691 /// number of nodes for this rank in each dimension
216     dim_t m_N0, m_N1, m_N2;
217    
218     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
219     dim_t m_offset0, m_offset1, m_offset2;
220    
221 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
222     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
223     /// 4=front, 5=back)
224     IndexVector m_faceOffset;
225    
226 caltinay 3691 /// vector of sample reference identifiers
227 caltinay 3753 IndexVector m_dofId;
228 caltinay 3691 IndexVector m_nodeId;
229     IndexVector m_elementId;
230     IndexVector m_faceId;
231 caltinay 3698
232     // vector with first node id on each rank
233     IndexVector m_nodeDistribution;
234 caltinay 3754
235 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
236     IndexVector m_dofMap;
237    
238     // Paso connector used by the system matrix and to interpolate DOF to
239     // nodes
240     Paso_Connector* m_connector;
241    
242     // the Paso System Matrix pattern
243     Paso_SystemMatrixPattern* m_pattern;
244 caltinay 3691 };
245    
246     } // end of namespace ripley
247    
248     #endif // __RIPLEY_BRICK_H__
249    

  ViewVC Help
Powered by ViewVC 1.1.26