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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4013 - (hide annotations)
Thu Oct 4 03:13:27 2012 UTC (6 years, 11 months ago) by caltinay
File MIME type: text/plain
File size: 8965 byte(s)
Implemented netCDF grid reader analogous to binary grid reader in ripley.

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

  ViewVC Help
Powered by ViewVC 1.1.26