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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4277 - (hide annotations)
Wed Mar 6 01:30:41 2013 UTC (6 years, 6 months ago) by caltinay
File MIME type: text/plain
File size: 9209 byte(s)
Implemented claimed support for mixing data with different resolutions.

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

  ViewVC Help
Powered by ViewVC 1.1.26