ESScript  Revision_4488
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 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 fsType, 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 
226 
228  dim_t m_gNE[3];
229 
231  double m_origin[3];
232 
234  double m_length[3];
235 
237  double m_dx[3];
238 
240  int m_NX[3];
241 
243  dim_t m_NE[3];
244 
246  dim_t m_ownNE[3];
247 
249  dim_t m_NN[3];
250 
252  dim_t m_offset[3];
253 
255  int m_faceCount[6];
256 
261 
267 
268  // vector with first node id on each rank
270 
271  // vector that maps each node to a DOF index (used for the coupler)
273 
274  // Paso connector used by the system matrix and to interpolate DOF to
275  // nodes
277 
278  // the Paso System Matrix pattern
280 };
281 
283 
285 {
286  return (m_gNE[0]+1)*(m_gNE[1]+1)*(m_gNE[2]+1);
287 }
288 
289 inline double Brick::getLocalCoordinate(int index, int dim) const
290 {
291  EsysAssert((dim>=0 && dim<3), "'dim' out of bounds");
292  EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
293  return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
294 }
295 
296 inline boost::python::tuple Brick::getGridParameters() const
297 {
298  return boost::python::make_tuple(
299  boost::python::make_tuple(m_origin[0], m_origin[1], m_origin[2]),
300  boost::python::make_tuple(m_dx[0], m_dx[1], m_dx[2]),
301  boost::python::make_tuple(m_gNE[0], m_gNE[1], m_gNE[2]));
302 }
303 
304 inline Paso_SystemMatrixPattern* Brick::getPattern(bool reducedRowOrder,
305  bool reducedColOrder) const
306 {
307  // TODO: reduced
308  return m_pattern;
309 }
310 
311 
312 //protected
313 inline dim_t Brick::getNumDOF() const
314 {
315  return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1]*(m_gNE[2]+1)/m_NX[2];
316 }
317 
318 //protected
319 inline dim_t Brick::getNumNodes() const
320 {
321  return m_NN[0]*m_NN[1]*m_NN[2];
322 }
323 
324 //protected
326 {
327  return m_NE[0]*m_NE[1]*m_NE[2];
328 }
329 
330 //protected
332 {
333  return m_faceCount[0] + m_faceCount[1] + m_faceCount[2]
334  + m_faceCount[3] + m_faceCount[4] + m_faceCount[5];
335 }
336 
337 } // end of namespace ripley
338 
339 #endif // __RIPLEY_BRICK_H__
340