ESScript  Revision_
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 readNcGrid(escript::Data& out, std::string filename,
70  std::string varname, const std::vector<int>& first,
71  const std::vector<int>& numValues,
72  const std::vector<int>& multiplier) const;
73 
76  virtual void readBinaryGrid(escript::Data& out, std::string filename,
77  const std::vector<int>& first,
78  const std::vector<int>& numValues,
79  const std::vector<int>& multiplier,
80  int byteOrder, int dataType) const;
81 
84  virtual void writeBinaryGrid(const escript::Data& in,
85  std::string filename,
86  int byteOrder, int dataType) const;
87 
93  const int* borrowSampleReferenceIDs(int fsType) const;
94 
99  virtual bool ownSample(int fs_code, index_t id) const;
100 
107  virtual void setToNormal(escript::Data& out) const;
108 
114  virtual void setToSize(escript::Data& out) const;
115 
120  virtual int getNumDataPointsGlobal() const;
121 
127  virtual void Print_Mesh_Info(const bool full=false) const;
128 
133  virtual const int* getNumNodesPerDim() const { return m_NN; }
134 
139  virtual const int* getNumElementsPerDim() const { return m_NE; }
140 
146  virtual const int* getNumFacesPerBoundary() const { return m_faceCount; }
147 
152  virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
153 
158  virtual const int* getNumSubdivisionsPerDim() const { return m_NX; }
159 
164  virtual double getLocalCoordinate(int index, int dim) const;
165 
170  virtual boost::python::tuple getGridParameters() const;
171 
176  escript::Data randomFill(long seed, const boost::python::tuple& filter) const;
177 
178 
179 protected:
180  virtual dim_t getNumNodes() const;
181  virtual dim_t getNumElements() const;
182  virtual dim_t getNumFaceElements() const;
183  virtual dim_t getNumDOF() const;
184  virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
185  virtual void assembleCoordinates(escript::Data& arg) const;
186  virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
187  virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
188  virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
189  const escript::Data& A, const escript::Data& B,
190  const escript::Data& C, const escript::Data& D,
191  const escript::Data& X, const escript::Data& Y) const;
192  virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
193  escript::Data& rhs, const escript::Data& d,
194  const escript::Data& y) const;
195  virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
196  escript::Data& rhs, const escript::Data& A, const escript::Data& B,
197  const escript::Data& C, const escript::Data& D,
198  const escript::Data& X, const escript::Data& Y) const;
199  virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
200  escript::Data& rhs, const escript::Data& d,
201  const escript::Data& y) const;
202  virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
203  const escript::Data& A, const escript::Data& B,
204  const escript::Data& C, const escript::Data& D,
205  const escript::Data& X, const escript::Data& Y) const;
206  virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
207  escript::Data& rhs, const escript::Data& d,
208  const escript::Data& y) const;
209  virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
210  escript::Data& rhs, const escript::Data& A, const escript::Data& B,
211  const escript::Data& C, const escript::Data& D,
212  const escript::Data& X, const escript::Data& Y) const;
213  virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
214  escript::Data& rhs, const escript::Data& d,
215  const escript::Data& y) const;
216  virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
217  virtual void interpolateNodesOnElements(escript::Data& out,
218  escript::Data& in, bool reduced) const;
219  virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
220  bool reduced) const;
221  virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
222  virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
223 
224 private:
225  void populateSampleIds();
226  void createPattern();
227  void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
228  const DoubleVector& EM_S, const DoubleVector& EM_F,
229  bool addS, bool addF, int firstNode, int nEq=1, int nComp=1) const;
230 
231  template<typename ValueType>
232  void readBinaryGridImpl(escript::Data& out, const std::string& filename,
233  const std::vector<int>& first,
234  const std::vector<int>& numValues,
235  const std::vector<int>& multiplier,
236  int byteOrder) const;
237 
238  template<typename ValueType>
239  void writeBinaryGridImpl(const escript::Data& in,
240  const std::string& filename, int byteOrder) const;
241 
243  dim_t m_gNE[2];
244 
246  double m_origin[2];
247 
249  double m_length[2];
250 
252  double m_dx[2];
253 
255  dim_t m_NX[2];
256 
258  dim_t m_NE[2];
259 
261  dim_t m_ownNE[2];
262 
264  dim_t m_NN[2];
265 
267  dim_t m_offset[2];
268 
270  int m_faceCount[4];
271 
275 
281 
282  // vector with first node id on each rank
284 
285  // vector that maps each node to a DOF index (used for the coupler)
287 
288  // Paso connector used by the system matrix and to interpolate DOF to
289  // nodes
291 
292  // the Paso System Matrix pattern
294 };
295 
297 
299 {
300  return (m_gNE[0]+1)*(m_gNE[1]+1);
301 }
302 
303 inline double Rectangle::getLocalCoordinate(int index, int dim) const
304 {
305  EsysAssert((dim>=0 && dim<2), "'dim' out of bounds");
306  EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
307  return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
308 }
309 
310 inline boost::python::tuple Rectangle::getGridParameters() const
311 {
312  return boost::python::make_tuple(
313  boost::python::make_tuple(m_origin[0], m_origin[1]),
314  boost::python::make_tuple(m_dx[0], m_dx[1]),
315  boost::python::make_tuple(m_gNE[0], m_gNE[1]));
316 }
317 
318 inline Paso_SystemMatrixPattern* Rectangle::getPattern(bool reducedRowOrder,
319  bool reducedColOrder) const
320 {
321  // TODO: reduced
322  return m_pattern;
323 }
324 
325 
326 //protected
328 {
329  return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1];
330 }
331 
332 //protected
334 {
335  return m_NN[0]*m_NN[1];
336 }
337 
338 //protected
340 {
341  return m_NE[0]*m_NE[1];
342 }
343 
344 //protected
346 {
347  return m_faceCount[0] + m_faceCount[1] + m_faceCount[2] + m_faceCount[3];
348 }
349 
350 
351 } // end of namespace ripley
352 
353 #endif // __RIPLEY_RECTANGLE_H__
354