Dune Core Modules (unstable)

coordinates.hh
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file LICENSE.md in module root
2 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
3 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
4 // vi: set et ts=4 sw=2 sts=2:
5 #ifndef DUNE_GRID_YASPGRID_COORDINATES_HH
6 #define DUNE_GRID_YASPGRID_COORDINATES_HH
7 
8 #include <array>
9 #include <bitset>
10 #include <vector>
11 
12 #include <dune/common/fvector.hh>
13 
21 namespace Dune
22 {
27  template<class ct, int dim>
29  {
30  public:
32  typedef ct ctype;
34  static const int dimension = dim;
35 
38 
45  EquidistantCoordinates(const Dune::FieldVector<ct,dim>& upperRight, const std::array<int,dim>& s)
46  : _s(s)
47  {
48  for (int i=0; i<dim; i++)
49  _h[i] = upperRight[i] / _s[i];
50  }
51 
56  inline ct meshsize(int d, [[maybe_unused]] int i) const
57  {
58  return _h[d];
59  }
60 
65  inline ct coordinate(int d, int i) const
66  {
67  return i*_h[d];
68  }
69 
73  inline int size(int d) const
74  {
75  return _s[d];
76  }
77 
84  EquidistantCoordinates<ct,dim> refine(std::bitset<dim> ovlp_low, std::bitset<dim> ovlp_up, int overlap, bool keep_ovlp) const
85  {
86  //determine new size and meshsize
87  std::array<int,dim> news;
88  Dune::FieldVector<ct,dim> newUpperRight;
89 
90  for (int i=0; i<dim; i++)
91  {
92  news[i] = 2 * _s[i];
93  if (!keep_ovlp)
94  {
95  if (ovlp_low[i])
96  news[i] -= overlap;
97  if (ovlp_up[i])
98  news[i] -= overlap;
99  }
100 
101  newUpperRight[i] = (_h[i] / ct(2.)) * news[i];
102  }
103  return EquidistantCoordinates<ct,dim>(newUpperRight,news);
104  }
105 
107  void print(std::ostream& s) const
108  {
109  s << "Printing equidistant coordinate information:" << std::endl;
110  s << "Meshsize: " << _h << std::endl << "Size: " << _s << std::endl;
111  }
112 
113  private:
115  std::array<int,dim> _s;
116  };
117 
118  template<class ct, int dim>
119  inline std::ostream& operator<< (std::ostream& s, EquidistantCoordinates<ct,dim>& c)
120  {
121  c.print(s);
122  return s;
123  }
124 
129  template<class ct, int dim>
131  {
132  public:
134  typedef ct ctype;
136  static const int dimension = dim;
137 
140 
149  EquidistantOffsetCoordinates(const Dune::FieldVector<ct,dim>& lowerLeft, const Dune::FieldVector<ct,dim>& upperRight, const std::array<int,dim>& s)
150  : _origin(lowerLeft), _s(s)
151  {
152  for (int i=0; i<dim; i++)
153  _h[i] = (upperRight[i] - lowerLeft[i]) / s[i];
154  }
155 
160  inline ct meshsize(int d, [[maybe_unused]] int i) const
161  {
162  return _h[d];
163  }
164 
169  inline ct coordinate(int d, int i) const
170  {
171  return _origin[d] + i*_h[d];
172  }
173 
177  inline int size(int d) const
178  {
179  return _s[d];
180  }
181 
185  inline ct origin(int d) const
186  {
187  return _origin[d];
188  }
189 
196  EquidistantOffsetCoordinates<ct,dim> refine(std::bitset<dim> ovlp_low, std::bitset<dim> ovlp_up, int overlap, bool keep_ovlp) const
197  {
198  //determine new size and meshsize
199  std::array<int,dim> news;
200  Dune::FieldVector<ct,dim> newUpperRight;
201 
202  for (int i=0; i<dim; i++)
203  {
204  news[i] = 2 * _s[i];
205  if (!keep_ovlp)
206  {
207  if (ovlp_low[i])
208  news[i] -= overlap;
209  if (ovlp_up[i])
210  news[i] -= overlap;
211  }
212 
213  newUpperRight[i] = _origin[i] + (_h[i] / ct(2.)) * news[i];
214  }
215  return EquidistantOffsetCoordinates<ct,dim>(_origin,newUpperRight,news);
216  }
217 
219  void print(std::ostream& s) const
220  {
221  s << "Printing equidistant coordinate information:" << std::endl;
222  s << "Meshsize: " << _h << std::endl << "Size: " << _s << std::endl;
223  s << "Offset to origin: " << _origin << std::endl;
224  }
225 
226  private:
229  std::array<int,dim> _s;
230  };
231 
232  template<class ct, int dim>
233  inline std::ostream& operator<< (std::ostream& s, EquidistantOffsetCoordinates<ct,dim>& c)
234  {
235  c.print(s);
236  return s;
237  }
238 
243  template<class ct, int dim>
245  {
246  public:
248  typedef ct ctype;
250  static const int dimension = dim;
251 
254 
261  TensorProductCoordinates(const std::array<std::vector<ct>,dim>& c, const std::array<int,dim>& offset)
262  : _c(c),_offset(offset)
263  {}
264 
269  inline ct meshsize(int d, int i) const
270  {
271  return _c[d][i+1-_offset[d]] - _c[d][i-_offset[d]];
272  }
273 
278  inline ct coordinate(int d, int i) const
279  {
280  return _c[d][i-_offset[d]];
281  }
282 
286  inline int size(int d) const
287  {
288  return _c[d].size() - 1;
289  }
290 
297  TensorProductCoordinates<ct,dim> refine(std::bitset<dim> ovlp_low, std::bitset<dim> ovlp_up, int overlap, bool keep_ovlp) const
298  {
299  std::array<std::vector<ct>,dim> newcoords;
300  std::array<int,dim> newoffset(_offset);
301  for (int i=0; i<dim; i++)
302  {
303  newoffset[i] *= 2;
304 
305  //determine new size
306  int newsize = 2 * _c[i].size() - 1;
307  if (!keep_ovlp)
308  {
309  if (ovlp_low[i])
310  {
311  newoffset[i] += overlap;
312  newsize -= overlap;
313  }
314  if (ovlp_up[i])
315  newsize -= overlap;
316  }
317  newcoords[i].resize(newsize);
318 
319  typename std::vector<ct>::const_iterator it = _c[i].begin();
320  typename std::vector<ct>::const_iterator end = _c[i].end()-1;
321  typename std::vector<ct>::iterator iit = newcoords[i].begin() - 1;
322  if (!keep_ovlp)
323  {
324  if (ovlp_low[i])
325  {
326  it += overlap/2;
327  if (overlap%2)
328  *(++iit) = (*it + *(++it)) / ct(2.);
329  }
330  if (ovlp_up[i])
331  end -= overlap/2;
332  }
333 
334  for (;it!=end;)
335  {
336  *(++iit) = *it;
337  *(++iit) = (*it + *(++it)) / ct(2.);
338  }
339 
340  if (++iit != newcoords[i].end())
341  *iit = *it;
342  }
343  return TensorProductCoordinates<ct,dim>(newcoords, newoffset);
344  }
345 
347  void print(std::ostream& s) const
348  {
349  s << "Printing TensorProduct Coordinate information:" << std::endl;
350  for (int i=0; i<dim; i++)
351  {
352  s << "Direction " << i << ": " << _c[i].size() << " coordinates" << std::endl;
353  for (std::size_t j=0; j<_c[i].size(); j++)
354  s << _c[i][j] << std::endl;
355  }
356  }
357 
358  private:
359  std::array<std::vector<ct>,dim> _c;
360  std::array<int,dim> _offset;
361  };
362 
363  template<class ct, int dim>
364  inline std::ostream& operator<< (std::ostream& s, TensorProductCoordinates<ct,dim>& c)
365  {
366  c.print(s);
367  return s;
368  }
369 
370  namespace Yasp {
371  template<class ctype, std::size_t dim>
372  bool checkIfMonotonous(const std::array<std::vector<ctype>, dim>& coords)
373  {
374  for (std::size_t i=0; i<dim; i++)
375  {
376  if (coords[i].size() <= 1)
377  return false;
378  for (std::size_t j=1; j<coords[i].size(); j++)
379  if (coords[i][j] < coords[i][j-1])
380  return false;
381  }
382  return true;
383  }
384  } // namespace Yasp
385 } // namespace Dune
386 
387 #endif
Container for equidistant coordinates in a YaspGrid.
Definition: coordinates.hh:29
EquidistantCoordinates< ct, dim > refine(std::bitset< dim > ovlp_low, std::bitset< dim > ovlp_up, int overlap, bool keep_ovlp) const
Definition: coordinates.hh:84
ct coordinate(int d, int i) const
Definition: coordinates.hh:65
int size(int d) const
Definition: coordinates.hh:73
static const int dimension
export dimension
Definition: coordinates.hh:34
void print(std::ostream &s) const
print information on this container
Definition: coordinates.hh:107
EquidistantCoordinates()
default constructor
Definition: coordinates.hh:37
ct ctype
export the coordinate type
Definition: coordinates.hh:32
EquidistantCoordinates(const Dune::FieldVector< ct, dim > &upperRight, const std::array< int, dim > &s)
construct a container with all necessary information
Definition: coordinates.hh:45
ct meshsize(int d, [[maybe_unused]] int i) const
Definition: coordinates.hh:56
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition: coordinates.hh:131
EquidistantOffsetCoordinates()
default constructor
Definition: coordinates.hh:139
EquidistantOffsetCoordinates(const Dune::FieldVector< ct, dim > &lowerLeft, const Dune::FieldVector< ct, dim > &upperRight, const std::array< int, dim > &s)
construct a container with all necessary information
Definition: coordinates.hh:149
void print(std::ostream &s) const
print information on this container
Definition: coordinates.hh:219
ct origin(int d) const
Definition: coordinates.hh:185
int size(int d) const
Definition: coordinates.hh:177
ct ctype
export the coordinate type
Definition: coordinates.hh:134
static const int dimension
export dimension
Definition: coordinates.hh:136
ct meshsize(int d, [[maybe_unused]] int i) const
Definition: coordinates.hh:160
ct coordinate(int d, int i) const
Definition: coordinates.hh:169
EquidistantOffsetCoordinates< ct, dim > refine(std::bitset< dim > ovlp_low, std::bitset< dim > ovlp_up, int overlap, bool keep_ovlp) const
Definition: coordinates.hh:196
Coordinate container for a tensor product YaspGrid.
Definition: coordinates.hh:245
void print(std::ostream &s) const
print information on this container
Definition: coordinates.hh:347
ct meshsize(int d, int i) const
Definition: coordinates.hh:269
ct coordinate(int d, int i) const
Definition: coordinates.hh:278
static const int dimension
export dimension
Definition: coordinates.hh:250
TensorProductCoordinates< ct, dim > refine(std::bitset< dim > ovlp_low, std::bitset< dim > ovlp_up, int overlap, bool keep_ovlp) const
Definition: coordinates.hh:297
TensorProductCoordinates(const std::array< std::vector< ct >, dim > &c, const std::array< int, dim > &offset)
construct a container with all necessary information
Definition: coordinates.hh:261
TensorProductCoordinates()
the default constructor
Definition: coordinates.hh:253
ct ctype
export the coordinate type
Definition: coordinates.hh:248
int size(int d) const
Definition: coordinates.hh:286
Implements a vector constructed from a given type representing a field and a compile-time given size.
Dune namespace.
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 26, 22:29, 2024)