ESScript  Revision_
Brick.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_BRICK_H__
17 #define __RIPLEY_BRICK_H__
18 
19 #include <ripley/RipleyDomain.h>
20 
21 struct Paso_Connector;
22 
23 namespace ripley {
24 
30 {
31 public:
32 
40  Brick(int n0, int n1, int n2, double x0, double y0, double z0, double x1,
41  double y1, double z1, int d0=-1, int d1=-1, int d2=-1);
42 
47  ~Brick();
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 fsType, 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 
172 protected:
173  virtual dim_t getNumNodes() const;
174  virtual dim_t getNumElements() const;
175  virtual dim_t getNumFaceElements() const;
176  virtual dim_t getNumDOF() const;
177  virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
178  virtual void assembleCoordinates(escript::Data& arg) const;
179  virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
180  virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
181  virtual void assemblePDESingle(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  const escript::Data& X, const escript::Data& Y) const;
185  virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
186  escript::Data& rhs, const escript::Data& d,
187  const escript::Data& y) const;
188  virtual void assemblePDESingleReduced(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  const escript::Data& X, const escript::Data& Y) const;
192  virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
193  escript::Data& rhs, const escript::Data& d,
194  const escript::Data& y) const;
195  virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
196  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 assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
200  escript::Data& rhs, const escript::Data& d,
201  const escript::Data& y) const;
202  virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
203  escript::Data& rhs, 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 assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
207  escript::Data& rhs, const escript::Data& d,
208  const escript::Data& y) const;
209  virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
210  virtual void interpolateNodesOnElements(escript::Data& out,
211  escript::Data& in, bool reduced) const;
212  virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
213  bool reduced) const;
214  virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
215  virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
216 
217 private:
218  void populateSampleIds();
219  void createPattern();
220  void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
221  const DoubleVector& EM_S, const DoubleVector& EM_F,
222  bool addS, bool addF, int firstNode, int nEq=1, int nComp=1) const;
223 
224  template<typename ValueType>
225  void readBinaryGridImpl(escript::Data& out, const std::string& filename,
226  const std::vector<int>& first,
227  const std::vector<int>& numValues,
228  const std::vector<int>& multiplier,
229  int byteOrder) const;
230 
231  template<typename ValueType>
232  void writeBinaryGridImpl(const escript::Data& in,
233  const std::string& filename, int byteOrder) const;
234 
235 
237  dim_t m_gNE[3];
238 
240  double m_origin[3];
241 
243  double m_length[3];
244 
246  double m_dx[3];
247 
249  int m_NX[3];
250 
252  dim_t m_NE[3];
253 
255  dim_t m_ownNE[3];
256 
258  dim_t m_NN[3];
259 
261  dim_t m_offset[3];
262 
264  int m_faceCount[6];
265 
270 
276 
277  // vector with first node id on each rank
279 
280  // vector that maps each node to a DOF index (used for the coupler)
282 
283  // Paso connector used by the system matrix and to interpolate DOF to
284  // nodes
286 
287  // the Paso System Matrix pattern
289 };
290 
292 
294 {
295  return (m_gNE[0]+1)*(m_gNE[1]+1)*(m_gNE[2]+1);
296 }
297 
298 inline double Brick::getLocalCoordinate(int index, int dim) const
299 {
300  EsysAssert((dim>=0 && dim<3), "'dim' out of bounds");
301  EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
302  return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
303 }
304 
305 inline boost::python::tuple Brick::getGridParameters() const
306 {
307  return boost::python::make_tuple(
308  boost::python::make_tuple(m_origin[0], m_origin[1], m_origin[2]),
309  boost::python::make_tuple(m_dx[0], m_dx[1], m_dx[2]),
310  boost::python::make_tuple(m_gNE[0], m_gNE[1], m_gNE[2]));
311 }
312 
313 inline Paso_SystemMatrixPattern* Brick::getPattern(bool reducedRowOrder,
314  bool reducedColOrder) const
315 {
316  // TODO: reduced
317  return m_pattern;
318 }
319 
320 
321 //protected
322 inline dim_t Brick::getNumDOF() const
323 {
324  return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1]*(m_gNE[2]+1)/m_NX[2];
325 }
326 
327 //protected
328 inline dim_t Brick::getNumNodes() const
329 {
330  return m_NN[0]*m_NN[1]*m_NN[2];
331 }
332 
333 //protected
335 {
336  return m_NE[0]*m_NE[1]*m_NE[2];
337 }
338 
339 //protected
341 {
342  return m_faceCount[0] + m_faceCount[1] + m_faceCount[2]
343  + m_faceCount[3] + m_faceCount[4] + m_faceCount[5];
344 }
345 
346 } // end of namespace ripley
347 
348 #endif // __RIPLEY_BRICK_H__
349