/[escript]/branches/ripleygmg_from_3668/ripley/src/Brick.h
ViewVC logotype

Contents of /branches/ripleygmg_from_3668/ripley/src/Brick.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3746 - (show annotations)
Thu Dec 15 00:02:22 2011 UTC (7 years, 10 months ago) by caltinay
File MIME type: text/plain
File size: 5966 byte(s)
In Ripley Solution==ContinuousFunction and ReducedSolution==ReducedCF now.
Removed a test in escript that relied on failure when trying to tag Data on
Solution/ReducedSolution.

1
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 copies the gradient of 'in' into 'out'. The actual function space to be
86 considered for the gradient is defined by 'in'. Both arguments have to
87 be defined on this domain.
88 */
89 RIPLEY_DLL_API
90 virtual void setToGradient(escript::Data& out, const escript::Data& in) const;
91
92 /**
93 \brief
94 copies the integrals of the function defined by arg into integrals.
95 arg has to be defined on this domain.
96 */
97 RIPLEY_DLL_API
98 virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
99
100 /**
101 \brief
102 copies the surface normals at data points into out. The actual function
103 space to be considered is defined by out. out has to be defined on this
104 domain.
105 */
106 RIPLEY_DLL_API
107 virtual void setToNormal(escript::Data& out) const;
108
109 /**
110 \brief
111 returns the number of data points summed across all MPI processes
112 */
113 RIPLEY_DLL_API
114 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
115
116 /**
117 \brief
118 writes information about the mesh to standard output
119 \param full whether to print additional data
120 */
121 RIPLEY_DLL_API
122 virtual void Print_Mesh_Info(const bool full=false) const;
123
124 /**
125 \brief
126 returns the number of nodes per MPI rank in each dimension
127 */
128 RIPLEY_DLL_API
129 virtual IndexVector getNumNodesPerDim() const;
130
131 /**
132 \brief
133 returns the number of elements per MPI rank in each dimension
134 */
135 RIPLEY_DLL_API
136 virtual IndexVector getNumElementsPerDim() const;
137
138 /**
139 \brief
140 returns the number of face elements in the order
141 (left,right,bottom,top,[front,back]) on current MPI rank
142 */
143 RIPLEY_DLL_API
144 virtual IndexVector getNumFacesPerBoundary() const;
145
146 /**
147 \brief
148 returns the node distribution vector
149 */
150 RIPLEY_DLL_API
151 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
152
153 /**
154 \brief
155 returns the first coordinate value and the node spacing along given
156 dimension as a pair
157 */
158 RIPLEY_DLL_API
159 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
160
161 protected:
162 virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
163 virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
164 virtual dim_t getNumFaceElements() const;
165 virtual void assembleCoordinates(escript::Data& arg) const;
166 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
167 virtual void interpolateNodesOnElements(escript::Data& out,
168 escript::Data& in, bool reduced) const;
169 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
170 bool reduced) const;
171
172 private:
173 void populateSampleIds();
174
175 /// total number of elements in each dimension
176 dim_t m_gNE0, m_gNE1, m_gNE2;
177
178 /// side lengths of domain
179 double m_l0, m_l1, m_l2;
180
181 /// number of spatial subdivisions
182 int m_NX, m_NY, m_NZ;
183
184 /// number of elements for this rank in each dimension
185 dim_t m_NE0, m_NE1, m_NE2;
186
187 /// number of nodes for this rank in each dimension
188 dim_t m_N0, m_N1, m_N2;
189
190 /// first node on this rank is at (offset0,offset1,offset2) in global mesh
191 dim_t m_offset0, m_offset1, m_offset2;
192
193 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
194 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
195 /// 4=front, 5=back)
196 IndexVector m_faceOffset;
197
198 /// vector of sample reference identifiers
199 IndexVector m_nodeId;
200 IndexVector m_elementId;
201 IndexVector m_faceId;
202
203 // vector with first node id on each rank
204 IndexVector m_nodeDistribution;
205 };
206
207 } // end of namespace ripley
208
209 #endif // __RIPLEY_BRICK_H__
210

  ViewVC Help
Powered by ViewVC 1.1.26