ESScript  Revision_4488
Rectangle.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2013 by University of Queensland
5 * http://www.uq.edu.au
6 *
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 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development since 2012 by School of Earth Sciences
13 *
14 *****************************************************************************/
15 
16 #ifndef __RIPLEY_RECTANGLE_H__
17 #define __RIPLEY_RECTANGLE_H__
18 
19 #include <ripley/RipleyDomain.h>
20 
21 struct Paso_Connector;
22 
23 namespace ripley {
24 
30 {
31 public:
32 
40  Rectangle(int n0, int n1, double x0, double y0, double x1, double y1,
41  int d0=-1, int d1=-1);
42 
47  ~Rectangle();
48 
53  virtual std::string getDescription() const;
54 
58  virtual bool operator==(const escript::AbstractDomain& other) const;
59 
65  void dump(const std::string& filename) const;
66 
69  virtual void readBinaryGrid(escript::Data& out, std::string filename,
70  const std::vector<int>& first,
71  const std::vector<int>& numValues,
72  const std::vector<int>& multiplier) const;
73 
76  virtual void readNcGrid(escript::Data& out, std::string filename,
77  std::string varname, const std::vector<int>& first,
78  const std::vector<int>& numValues,
79  const std::vector<int>& multiplier) const;
80 
83  virtual void writeBinaryGrid(const escript::Data& in,
84  std::string filename,
85  int byteOrder, int dataType) const;
86 
92  const int* borrowSampleReferenceIDs(int fsType) const;
93 
98  virtual bool ownSample(int fs_code, index_t id) const;
99 
106  virtual void setToNormal(escript::Data& out) const;
107 
113  virtual void setToSize(escript::Data& out) const;
114 
119  virtual int getNumDataPointsGlobal() const;
120 
126  virtual void Print_Mesh_Info(const bool full=false) const;
127 
132  virtual const int* getNumNodesPerDim() const { return m_NN; }
133 
138  virtual const int* getNumElementsPerDim() const { return m_NE; }
139 
145  virtual const int* getNumFacesPerBoundary() const { return m_faceCount; }
146 
151  virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
152 
157  virtual const int* getNumSubdivisionsPerDim() const { return m_NX; }
158 
163  virtual double getLocalCoordinate(int index, int dim) const;
164 
169  virtual boost::python::tuple getGridParameters() const;
170 
171 protected:
172  virtual dim_t getNumNodes() const;
173  virtual dim_t getNumElements() const;
174  virtual dim_t getNumFaceElements() const;
175  virtual dim_t getNumDOF() const;
176  virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
177  virtual void assembleCoordinates(escript::Data& arg) const;
178  virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
179  virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
180  virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
181  const escript::Data& A, const escript::Data& B,
182  const escript::Data& C, const escript::Data& D,
183  const escript::Data& X, const escript::Data& Y) const;
184  virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
185  escript::Data& rhs, const escript::Data& d,
186  const escript::Data& y) const;
187  virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
188  escript::Data& rhs, const escript::Data& A, const escript::Data& B,
189  const escript::Data& C, const escript::Data& D,
190  const escript::Data& X, const escript::Data& Y) const;
191  virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
192  escript::Data& rhs, const escript::Data& d,
193  const escript::Data& y) const;
194  virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
195  const escript::Data& A, const escript::Data& B,
196  const escript::Data& C, const escript::Data& D,
197  const escript::Data& X, const escript::Data& Y) const;
198  virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
199  escript::Data& rhs, const escript::Data& d,
200  const escript::Data& y) const;
201  virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
202  escript::Data& rhs, const escript::Data& A, const escript::Data& B,
203  const escript::Data& C, const escript::Data& D,
204  const escript::Data& X, const escript::Data& Y) const;
205  virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
206  escript::Data& rhs, const escript::Data& d,
207  const escript::Data& y) const;
208  virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
209  virtual void interpolateNodesOnElements(escript::Data& out,
210  escript::Data& in, bool reduced) const;
211  virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
212  bool reduced) const;
213  virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
214  virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
215 
216 private:
217  void populateSampleIds();
218  void createPattern();
219  void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
220  const DoubleVector& EM_S, const DoubleVector& EM_F,
221  bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
222  template<typename ValueType>
223  void writeBinaryGridImpl(const escript::Data& in,
224  const std::string& filename, int byteOrder) const;
225 
227  dim_t m_gNE[2];
228 
230  double m_origin[2];
231 
233  double m_length[2];
234 
236  double m_dx[2];
237 
239  int m_NX[2];
240 
242  dim_t m_NE[2];
243 
245  dim_t m_ownNE[2];
246 
248  dim_t m_NN[2];
249 
251  dim_t m_offset[2];
252 
254  int m_faceCount[4];
255 
259 
265 
266  // vector with first node id on each rank
268 
269  // vector that maps each node to a DOF index (used for the coupler)
271 
272  // Paso connector used by the system matrix and to interpolate DOF to
273  // nodes
275 
276  // the Paso System Matrix pattern
278 };
279 
281 
283 {
284  return (m_gNE[0]+1)*(m_gNE[1]+1);
285 }
286 
287 inline double Rectangle::getLocalCoordinate(int index, int dim) const
288 {
289  EsysAssert((dim>=0 && dim<2), "'dim' out of bounds");
290  EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
291  return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
292 }
293 
294 inline boost::python::tuple Rectangle::getGridParameters() const
295 {
296  return boost::python::make_tuple(
297  boost::python::make_tuple(m_origin[0], m_origin[1]),
298  boost::python::make_tuple(m_dx[0], m_dx[1]),
299  boost::python::make_tuple(m_gNE[0], m_gNE[1]));
300 }
301 
302 inline Paso_SystemMatrixPattern* Rectangle::getPattern(bool reducedRowOrder,
303  bool reducedColOrder) const
304 {
305  // TODO: reduced
306  return m_pattern;
307 }
308 
309 
310 //protected
312 {
313  return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1];
314 }
315 
316 //protected
318 {
319  return m_NN[0]*m_NN[1];
320 }
321 
322 //protected
324 {
325  return m_NE[0]*m_NE[1];
326 }
327 
328 //protected
330 {
331  return m_faceCount[0] + m_faceCount[1] + m_faceCount[2] + m_faceCount[3];
332 }
333 
334 
335 } // end of namespace ripley
336 
337 #endif // __RIPLEY_RECTANGLE_H__
338