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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3698 - (hide annotations)
Tue Nov 29 00:47:29 2011 UTC (7 years, 9 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Brick.h
File MIME type: text/plain
File size: 4872 byte(s)
[x] Rectangle...
[x] Brick node id's and weipa compatibility


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     namespace ripley {
20    
21     /**
22     \brief
23     Brick is the 3-dimensional implementation of a RipleyDomain.
24     */
25     class Brick: public RipleyDomain
26     {
27     public:
28    
29     /**
30     \brief creates a hexagonal mesh with n0 x n1 x n2 elements over the
31     brick [0,l0] x [0,l1] x [0,l2].
32     \param n0,n1,n2 number of elements in each dimension
33     \param l0,l1,l2 length of each side of brick
34     \param d0,d1,d2 number of subdivisions in each dimension
35     */
36     RIPLEY_DLL_API
37     Brick(int n0, int n1, int n2, double l0, double l1, double l2, int d0,
38     int d1, int d2);
39    
40     /**
41     \brief
42     Destructor.
43     */
44     RIPLEY_DLL_API
45     ~Brick();
46    
47     /**
48     \brief
49     returns a description for this domain
50     */
51     RIPLEY_DLL_API
52     virtual std::string getDescription() const;
53    
54     /**
55     \brief equality operator
56     */
57     RIPLEY_DLL_API
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     RIPLEY_DLL_API
66     void dump(const std::string& filename) const;
67    
68     /**
69     \brief
70     returns the reference number of the given sample number
71     \param fsType The function space type
72     */
73     RIPLEY_DLL_API
74     const int* borrowSampleReferenceIDs(int fsType) const;
75    
76     /**
77     \brief
78     returns true if this rank owns the sample id.
79     */
80     RIPLEY_DLL_API
81     virtual bool ownSample(int fs_code, index_t id) const;
82    
83     /**
84     \brief
85     returns the number of data points summed across all MPI processes
86     */
87     RIPLEY_DLL_API
88     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
89    
90     /**
91     \brief
92     interpolates data given on source onto target where source and target
93     have to be given on the same domain
94     */
95     RIPLEY_DLL_API
96     virtual void interpolateOnDomain(escript::Data& target, const escript::Data& source) const;
97    
98     /**
99     \brief
100     writes information about the mesh to standard output
101     \param full whether to print additional data
102     */
103     RIPLEY_DLL_API
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     RIPLEY_DLL_API
111     virtual IndexVector getNumNodesPerDim() const;
112    
113     /**
114     \brief
115     returns the number of elements per MPI rank in each dimension
116     */
117     RIPLEY_DLL_API
118     virtual IndexVector getNumElementsPerDim() const;
119    
120     /**
121     \brief
122     returns the number of face elements in the order
123     (left,right,bottom,top,[front,back]) on current MPI rank
124     */
125     RIPLEY_DLL_API
126     virtual IndexVector getNumFacesPerBoundary() const;
127    
128     /**
129     \brief
130     returns the node distribution vector
131     */
132     RIPLEY_DLL_API
133     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
134    
135     /**
136     \brief
137     returns the first coordinate value and the node spacing along given
138     dimension as a pair
139     */
140     RIPLEY_DLL_API
141     virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
142    
143 caltinay 3691 protected:
144     virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
145     virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
146     virtual dim_t getNumFaceElements() const;
147     virtual void assembleCoordinates(escript::Data& arg) const;
148     virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
149    
150     private:
151     void populateSampleIds();
152    
153     /// total number of elements in each dimension
154     dim_t m_gNE0, m_gNE1, m_gNE2;
155    
156     /// side lengths of domain
157     double m_l0, m_l1, m_l2;
158    
159     /// number of spatial subdivisions
160     int m_NX, m_NY, m_NZ;
161    
162     /// number of elements for this rank in each dimension
163     dim_t m_NE0, m_NE1, m_NE2;
164    
165     /// number of nodes for this rank in each dimension
166     dim_t m_N0, m_N1, m_N2;
167    
168     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
169     dim_t m_offset0, m_offset1, m_offset2;
170    
171     /// vector of sample reference identifiers
172     IndexVector m_nodeId;
173     IndexVector m_elementId;
174     IndexVector m_faceId;
175 caltinay 3698
176     // vector with first node id on each rank
177     IndexVector m_nodeDistribution;
178 caltinay 3691 };
179    
180     } // end of namespace ripley
181    
182     #endif // __RIPLEY_BRICK_H__
183    

  ViewVC Help
Powered by ViewVC 1.1.26