boundarygrid.hh
Go to the documentation of this file.
1 //==============================================================================
11 //==============================================================================
12 #ifndef BOUNDARYGRID_HH_
13 #define BOUNDARYGRID_HH_
14 
15 #include <dune/common/version.hh>
16 #include <dune/common/fvector.hh>
17 #include <dune/common/fmatrix.hh>
18 #include <dune/geometry/referenceelements.hh>
19 #include <dune/geometry/genericgeometry/matrixhelper.hh>
20 #include <dune/grid/common/mcmgmapper.hh>
21 
22 #include <vector>
23 
24 namespace Opm {
25 namespace Elasticity {
26 
28 class BoundaryGrid {
29  public:
31  typedef Dune::FieldVector<double,3> GlobalCoordinate;
33  typedef Dune::FieldVector<double,2> FaceCoord;
34 
42  // in natural order along the first direction
43  static BoundaryGrid uniform(const FaceCoord& min, const FaceCoord& max,
44  int k1, int k2, bool dc=false);
45 
48 
50  virtual ~BoundaryGrid() {}
51 
53  // on a boundary
54  class Quad;
55 
57  class Vertex {
58  public:
60  Vertex() : i(-1), c(0), q(0), fixed(false) {}
61 
63  int i;
64 
66  FaceCoord c;
67 
69  Quad* q;
70 
72  bool fixed;
73 
75  bool operator==(const Vertex& v2)
76  {
77  return hypot(v2.c[0]-c[0],v2.c[1]-c[1]) < 1.e-8;
78  }
79  };
81  class Quad {
82  public:
84  Quad()
85  {
86  v[0].i = v[1].i = v[2].i = v[3].i = 0;
87  v[0].c = v[1].c = v[2].c = v[3].c = 0.f;
88  }
93  FaceCoord pos(double xi, double eta) const;
94 
98  std::vector<double> evalBasis(double xi, double eta) const;
99 
101  Vertex v[4];
103  FaceCoord bb[2];
104  protected:
106  friend std::ostream& operator <<(std::ostream& os, const Quad& q)
107  {
108  os << "Nodes: " << q.v[0].i << "," << q.v[1].i << "," << q.v[2].i << "," << q.v[3].i << std::endl;
109  os << "(" << q.v[0].c << ")(" << q.v[1].c << ")(" << q.v[2].c << ")(" << q.v[3].c << ")";
110  return os;
111  }
112  };
113 
116  void add(const Quad& quad);
117 
118  void addToColumn(size_t col, const Quad& quad)
119  {
120  if (col >= colGrids.size())
121  colGrids.resize(col+1);
122  colGrids[col].push_back(quad);
123  }
124 
128  Quad& operator[](int index)
129  {
130  return grid[index];
131  }
132 
136  const Quad& operator[](int index) const
137  {
138  return grid[index];
139  }
140 
141  const Quad& getQuad(int col, int index) const
142  {
143  return colGrids[col][index];
144  }
145 
147  size_t size() const
148  {
149  return grid.size();
150  }
151 
152  size_t colSize(int i) const
153  {
154  return colGrids[i].size();
155  }
156 
159  size_t totalNodes() const
160  {
161  return nodes;
162  }
163 
167  bool isFixed(int node) const
168  {
169  return fixNodes[node];
170  }
171 
175  bool find(Vertex& res, const Vertex& coord) const;
176 
181  static void extract(FaceCoord& res,
182  const GlobalCoordinate& coord, int dir);
183 
188  static void extract(Vertex& res,
189  const Dune::FieldVector<double,3>& coord, int dir);
190 
192  struct VertexLess {
195  VertexLess(int comp) : dir(comp) {}
196 
198  bool operator()(const Vertex& q1, const Vertex& q2)
199  {
200  if (dir >= 0)
201  return q1.c[dir] < q2.c[dir];
202  return q1.i < q2.i;
203  }
204 
206  int dir;
207  };
208 
213  BoundedPredicate(const FaceCoord& coord_) : coord(coord_) {}
214 
216  bool operator()(const Quad& q)
217  {
218  double eps = 1.e-8;
219  return (coord[0] >= q.bb[0][0]-eps &&
220  coord[0] <= q.bb[1][0]+eps &&
221  coord[1] >= q.bb[0][1]-eps &&
222  coord[1] <= q.bb[1][1]+eps);
223  }
224 
226  FaceCoord coord;
227  };
228  protected:
230  std::vector<Quad> grid;
231  std::vector<std::vector<Quad> > colGrids;
232 
234  std::vector<bool> fixNodes;
235 
237  size_t nodes;
238 
240  friend std::ostream& operator <<(std::ostream& os, const BoundaryGrid& g)
241  {
242  for (size_t i=0;i<g.size();++i)
243  os << g[i] << std::endl;
244  return os;
245  }
246 
256  bool bilinearSolve(double epsilon, double order,
257  const double* A, const double* B,
258  std::vector<double>& X,
259  std::vector<double>& Y) const;
260 
268  bool cubicSolve(double eps, double A, double B, double C,
269  double D, std::vector<double>& X) const;
270 
277  int Q4inv(FaceCoord& res, const Quad& q, const FaceCoord& coord,
278  double epsZero, double epsOut) const;
279 };
280 
282  template<int mydim, int cdim, class GridImp>
284 {
285 };
286 
288  template<int cdim, class GridImp>
289 class HexGeometry<2, cdim, GridImp>
290 {
291  public:
293  enum { dimension = 2};
294 
296  enum { mydimension = 2};
297 
299  enum { coorddimension = cdim };
300 
302  enum {dimensionworld = 2 };
303 
305  typedef double ctype;
306 
308  typedef Dune::FieldVector<ctype,mydimension> LocalCoordinate;
309 
311  typedef Dune::FieldVector<ctype,coorddimension> GlobalCoordinate;
312 
314  typedef Dune::FieldMatrix<ctype,coorddimension,mydimension> Jacobian;
315 
317  typedef Dune::FieldMatrix<ctype,mydimension,coorddimension> JacobianTransposed;
318 
323  HexGeometry(const BoundaryGrid::Quad& q, const GridImp& gv, int dir)
324  {
325  Dune::LeafMultipleCodimMultipleGeomTypeMapper<GridImp,
326  Dune::MCMGVertexLayout> mapper(gv);
327  typename GridImp::LeafGridView::template Codim<3>::Iterator start=gv.leafGridView().template begin<3>();
328  const typename GridImp::LeafGridView::template Codim<3>::Iterator itend = gv.leafGridView().template end<3>();
329  for (int i=0;i<4;++i) {
330  typename GridImp::LeafGridView::template Codim<3>::Iterator it=start;
331  for (; it != itend; ++it) {
332  if (mapper.map(*it) == q.v[i].i)
333  break;
334  }
335  BoundaryGrid::extract(c[i],it->geometry().corner(0),dir);
336  }
337 
338  m_volume = (c[1][0]-c[0][0])*(c[2][1]-c[0][1]);
339  }
340 
344  {
345  for (int i=0;i<4;++i)
346  c[i] = q.v[i].c;
347  m_volume = (c[1][0]-c[0][0])*(c[2][1]-c[0][1]);
348  }
349 
351  Dune::GeometryType type() const
352  {
353  Dune::GeometryType t;
354  t.makeCube(mydimension);
355  return t;
356  }
357 
359  int corners() const
360  {
361  return 4;
362  }
363 
365  ctype volume() const
366  {
367  return m_volume;
368  }
369 
371  GlobalCoordinate center() const
372  {
373  LocalCoordinate local;
374  local = .5f;
375  return Global(local);
376  }
377 
380  GlobalCoordinate corner(int cor) const
381  {
382  return c[cor];
383  }
384 
387  GlobalCoordinate global(const LocalCoordinate& local) const
388  {
389  // uvw = { (1-u, 1-v, 1-w), (u, v, w) }
390  LocalCoordinate uvw[2] = { LocalCoordinate(1.0), local };
391  uvw[0] -= local;
392  // Access pattern for uvw matching ordering of corners.
393  const int pat[4][2] = {{ 0, 0 },
394  { 1, 0 },
395  { 0, 1 },
396  { 1, 1 }};
397  GlobalCoordinate xyz(0.0);
398  for (int i = 0; i < 4; ++i) {
399  GlobalCoordinate corner_contrib = corner(i);
400  double factor = 1.0;
401  for (int j = 0; j < 2; ++j) {
402  factor *= uvw[pat[i][j]][j];
403  }
404  corner_contrib *= factor;
405  xyz += corner_contrib;
406  }
407  return xyz;
408  }
409 
412  LocalCoordinate local(const GlobalCoordinate& y) const
413  {
414  const ctype epsilon = 1e-10;
415  const Dune::ReferenceElement< ctype , 2 > & refElement =
416  Dune::ReferenceElements< ctype, 2 >::general(type());
417  LocalCoordinate x = refElement.position(0,0);
418  LocalCoordinate dx;
419  do {
420  using namespace Dune::GenericGeometry;
421  // DF^n dx^n = F^n, x^{n+1} -= dx^n
422  JacobianTransposed JT = jacobianTransposed(x);
423  GlobalCoordinate z = global(x);
424  z -= y;
425  MatrixHelper<DuneCoordTraits<double> >::template xTRightInvA<2, 2>(JT, z, dx );
426  x -= dx;
427  } while (dx.two_norm2() > epsilon*epsilon);
428  return x;
429  }
430 
433  const Dune::FieldMatrix<ctype, mydimension, coorddimension>
434  jacobianTransposed(const LocalCoordinate& local) const
435  {
436  // uvw = { (1-u, 1-v, (u, v) }
437  LocalCoordinate uvw[2] = { LocalCoordinate(1.0), local };
438  uvw[0] -= local;
439  // Access pattern for uvw matching ordering of corners.
440  const int pat[4][3] = {{ 0, 0 },
441  { 1, 0 },
442  { 0, 1 },
443  { 1, 1 }};
444  Dune::FieldMatrix<ctype, mydimension, coorddimension> Jt(0.0);
445  for (int i = 0; i < 4; ++i) {
446  for (int deriv = 0; deriv < 2; ++deriv) {
447  // This part contributing to dg/du_{deriv}
448  double factor = 1.0;
449  for (int j = 0; j < 2; ++j) {
450  factor *= (j != deriv) ? uvw[pat[i][j]][j]
451  : (pat[i][j] == 0 ? -1.0 : 1.0);
452  }
453  GlobalCoordinate corner_contrib = corner(i);
454  corner_contrib *= factor;
455  Jt[deriv] += corner_contrib; // using FieldMatrix row access.
456  }
457  }
458  return Jt;
459  }
460 
463  const Dune::FieldMatrix<ctype, coorddimension, mydimension>
464  jacobianInverseTransposed(const LocalCoordinate& local) const
465  {
466  Dune::FieldMatrix<ctype, coorddimension, mydimension> Jti = jacobianTransposed(local);
467  Jti.invert();
468  return Jti;
469  }
470 
473  ctype integrationElement(const LocalCoordinate& local) const
474  {
475  Dune::FieldMatrix<ctype, coorddimension, mydimension> Jt = jacobianTransposed(local);
476  using namespace Dune::GenericGeometry;
477  return MatrixHelper<DuneCoordTraits<double> >::template sqrtDetAAT<2, 2>(Jt);
478  }
479  private:
481  GlobalCoordinate c[4];
482 
484  ctype m_volume;
485 };
486 
489 BoundaryGrid::Vertex minXminY(std::vector<BoundaryGrid::Vertex>& in);
490 
493 BoundaryGrid::Vertex maxXminY(std::vector<BoundaryGrid::Vertex>& in);
494 
497 BoundaryGrid::Vertex maxXmaxY(std::vector<BoundaryGrid::Vertex>& in);
498 
501 BoundaryGrid::Vertex minXmaxY(std::vector<BoundaryGrid::Vertex>& in);
502 
503 }
504 }
505 
506 #endif
LeafVertexIterator start
Definition: elasticity_upscale_impl.hpp:148
bool bilinearSolve(double epsilon, double order, const double *A, const double *B, std::vector< double > &X, std::vector< double > &Y) const
Solves a bi-linear set of equations in x and y. A1 * x*y + A2 * x + A3 * y = A4 B1 * x*y + B2 * x + B...
VertexLess(int comp)
Default constructor.
Definition: boundarygrid.hh:195
A class describing a linear, quadrilateral element.
Definition: boundarygrid.hh:81
static void extract(FaceCoord &res, const GlobalCoordinate &coord, int dir)
Helper function for extracting given 2D coordinates from a 3D coordinate.
Vertex()
Default constructor.
Definition: boundarygrid.hh:60
friend std::ostream & operator<<(std::ostream &os, const Quad &q)
Print to a stream.
Definition: boundarygrid.hh:106
FaceCoord c
Coordinates of the vertex (2D)
Definition: boundarygrid.hh:66
Definition: applier.hpp:18
Dune::FieldVector< double, 3 > GlobalCoordinate
A coordinate on the underlying 3D grid.
Definition: boundarygrid.hh:31
ctype volume() const
Returns volume (area) of quadrilateral.
Definition: boundarygrid.hh:365
friend std::ostream & operator<<(std::ostream &os, const BoundaryGrid &g)
Print to a stream.
Definition: boundarygrid.hh:240
std::vector< double > evalBasis(double xi, double eta) const
Evaluate the basis functions.
BoundaryGrid::Vertex minXmaxY(std::vector< BoundaryGrid::Vertex > &in)
Find the vertex in the vector with minimum X and maximum Y.
GlobalCoordinate center() const
Returns center of quadrilateral.
Definition: boundarygrid.hh:371
virtual ~BoundaryGrid()
Default (empty) destructor.
Definition: boundarygrid.hh:50
Dune::FieldVector< ctype, coorddimension > GlobalCoordinate
Range type.
Definition: boundarygrid.hh:311
void addToColumn(size_t col, const Quad &quad)
Definition: boundarygrid.hh:118
const Quad & getQuad(int col, int index) const
Definition: boundarygrid.hh:141
int corners() const
Returns number of corners.
Definition: boundarygrid.hh:359
bool fixed
Whether or not this node is fixed.
Definition: boundarygrid.hh:72
Vertex v[4]
Vertices.
Definition: boundarygrid.hh:101
FaceCoord pos(double xi, double eta) const
Return the physical coordinates corresponding to the given local coordinates.
bool operator()(const Vertex &q1, const Vertex &q2)
The comparison operator.
Definition: boundarygrid.hh:198
void add(const Quad &quad)
Add a quad to the grid.
int dir
Compare using this direction, if -1 compare using index values.
Definition: boundarygrid.hh:206
int Q4inv(FaceCoord &res, const Quad &q, const FaceCoord &coord, double epsZero, double epsOut) const
Find the local coordinates of a given point within a given quad.
size_t totalNodes() const
Return the total number of nodes on the grid when known.
Definition: boundarygrid.hh:159
bool find(Vertex &res, const Vertex &coord) const
Locate the position of a vertex on the grid.
GlobalCoordinate corner(int cor) const
Returns coordinates to requested corner.
Definition: boundarygrid.hh:380
int i
Index of the vertex.
Definition: boundarygrid.hh:63
size_t nodes
Total number of nodes on grid.
Definition: boundarygrid.hh:237
A class describing a 2D vertex.
Definition: boundarygrid.hh:57
std::vector< Quad > grid
Our quadrilateral elements.
Definition: boundarygrid.hh:230
Dune::GeometryType type() const
Returns entity type (a 2D cube)
Definition: boundarygrid.hh:351
min[0]
Definition: elasticity_upscale_impl.hpp:144
bool operator()(const Quad &q)
The comparison operator.
Definition: boundarygrid.hh:216
Dune::FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
Type of transposed Jacobian matrix.
Definition: boundarygrid.hh:317
Geometry class for general hexagons.
Definition: boundarygrid.hh:283
Quad & operator[](int index)
Obtain a reference to a quad.
Definition: boundarygrid.hh:128
Predicate for sorting vertices.
Definition: boundarygrid.hh:192
size_t size() const
Obtain the number of quads in the grid.
Definition: boundarygrid.hh:147
const Dune::FieldMatrix< ctype, coorddimension, mydimension > jacobianInverseTransposed(const LocalCoordinate &local) const
Returns the inverse, transposed Jacobian.
Definition: boundarygrid.hh:464
const Quad & operator[](int index) const
Obtain a const reference to a quad.
Definition: boundarygrid.hh:136
Definition: mpc.hh:24
GlobalCoordinate global(const LocalCoordinate &local) const
Map from local coordinates to global coordinates.
Definition: boundarygrid.hh:387
A class describing a quad grid.
Definition: boundarygrid.hh:28
Dune::FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type of Jacobian matrix.
Definition: boundarygrid.hh:314
BoundaryGrid::Vertex maxXminY(std::vector< BoundaryGrid::Vertex > &in)
Find the vertex in the vector with maximum X and minimum Y.
Quad()
Default constructor.
Definition: boundarygrid.hh:84
static BoundaryGrid uniform(const FaceCoord &min, const FaceCoord &max, int k1, int k2, bool dc=false)
Establish an uniform quad grid.
Definition: mpc.hh:24
FaceCoord bb[2]
Bounding box.
Definition: boundarygrid.hh:103
Dune::FieldVector< ctype, mydimension > LocalCoordinate
Domain type.
Definition: boundarygrid.hh:308
BoundaryGrid()
Default (empty) constructor.
Definition: boundarygrid.hh:47
bool isFixed(int node) const
Check if a given node is marked as fixed.
Definition: boundarygrid.hh:167
std::vector< bool > fixNodes
Whether or not a given node is marked as fixed.
Definition: boundarygrid.hh:234
Predicate for checking if a vertex falls within a quads bounding box.
Definition: boundarygrid.hh:210
BoundedPredicate(const FaceCoord &coord_)
Default constructor.
Definition: boundarygrid.hh:213
size_t colSize(int i) const
Definition: boundarygrid.hh:152
BoundaryGrid::Vertex maxXmaxY(std::vector< BoundaryGrid::Vertex > &in)
Find the vertex in the vector with maximum X and maximum Y.
std::vector< std::vector< Quad > > colGrids
Definition: boundarygrid.hh:231
HexGeometry(const BoundaryGrid::Quad &q)
Construct integration element.
Definition: boundarygrid.hh:343
const LeafVertexIterator itend
Definition: elasticity_upscale_impl.hpp:145
Quad * q
The quad containing the vertex (if search has been done)
Definition: boundarygrid.hh:69
double ctype
Coordinate element type.
Definition: boundarygrid.hh:305
FaceCoord coord
The coordinates to check.
Definition: boundarygrid.hh:226
const Dune::FieldMatrix< ctype, mydimension, coorddimension > jacobianTransposed(const LocalCoordinate &local) const
Return the transposed jacobian.
Definition: boundarygrid.hh:434
bool operator==(const Vertex &v2)
Comparison operator.
Definition: boundarygrid.hh:75
ctype integrationElement(const LocalCoordinate &local) const
Returns the integration element (|J'*J|)^(1/2)
Definition: boundarygrid.hh:473
int j
Definition: elasticity_upscale_impl.hpp:658
LocalCoordinate local(const GlobalCoordinate &y) const
Map from global coordinates to local coordinates.
Definition: boundarygrid.hh:412
HexGeometry(const BoundaryGrid::Quad &q, const GridImp &gv, int dir)
Construct integration element extracted from a 3D grid.
Definition: boundarygrid.hh:323
BoundaryGrid::Vertex minXminY(std::vector< BoundaryGrid::Vertex > &in)
Find the vertex in the vector with minimum X and minimum Y.
bool cubicSolve(double eps, double A, double B, double C, double D, std::vector< double > &X) const
Solves the cubic equation A*x^3+B*x^2+C*x+D=0.
Dune::FieldVector< double, 2 > FaceCoord
A coordinate on the quad grid.
Definition: boundarygrid.hh:33